diff --git a/README.md b/README.md
index c029e40d3a4..0d0dfb29a60 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+[![Build Status](https://travis-ci.org/vufind-org/vufind.svg?branch=master)](https://travis-ci.org/vufind-org/vufind)
VuFind
======
diff --git a/build.xml b/build.xml
index e1d324548eb..5fb120c3602 100644
--- a/build.xml
+++ b/build.xml
@@ -23,7 +23,7 @@
-
+
@@ -90,10 +90,10 @@
-
+
-
+
@@ -169,14 +169,14 @@
-
+
-
+
-
+
diff --git a/composer.json b/composer.json
index 22a8a2b5c6e..91b984b96a0 100644
--- a/composer.json
+++ b/composer.json
@@ -61,13 +61,13 @@
"symfony/yaml": "*",
"vufind-org/vufindcode": "*",
"vufind-org/vufindhttp": "*",
- "zendframework/zendframework": "2.3.7",
+ "zendframework/zendframework": "2.4.6",
"zendframework/zendrest": "2.*",
"zendframework/zendservice-amazon": "2.*",
"zf-commons/zfc-rbac": "~2.4"
},
"require-dev": {
- "behat/mink": "1.6.*",
+ "behat/mink": "1.7.*",
"behat/mink-zombie-driver": "*"
}
}
diff --git a/composer.lock b/composer.lock
index b40b3097792..b7c4a4a59da 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "17e060af5c8424a9e99315284a8a3632",
+ "hash": "9b1e17327dcdad44d8172432e9ba45f1",
"packages": [
{
"name": "aferrandini/phpqrcode",
@@ -197,16 +197,16 @@
},
{
"name": "ocramius/proxy-manager",
- "version": "1.0.0",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/Ocramius/ProxyManager.git",
- "reference": "a80a39fac4fbd771aea7d3871929933a3a1bbf3e"
+ "reference": "57e9272ec0e8deccf09421596e0e2252df440e11"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/a80a39fac4fbd771aea7d3871929933a3a1bbf3e",
- "reference": "a80a39fac4fbd771aea7d3871929933a3a1bbf3e",
+ "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11",
+ "reference": "57e9272ec0e8deccf09421596e0e2252df440e11",
"shasum": ""
},
"require": {
@@ -256,24 +256,24 @@
"proxy pattern",
"service proxies"
],
- "time": "2014-12-12 10:59:05"
+ "time": "2015-08-09 04:28:19"
},
{
"name": "oyejorge/less.php",
- "version": "v1.7.0.4",
+ "version": "v1.7.0.9",
"source": {
"type": "git",
"url": "https://github.com/oyejorge/less.php.git",
- "reference": "fc971e6d3eb54dff3d3eba4734ff207d37cb4e0e"
+ "reference": "fb64e2f6ef647a229c50e9fa0f2076240a3484c6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/oyejorge/less.php/zipball/fc971e6d3eb54dff3d3eba4734ff207d37cb4e0e",
- "reference": "fc971e6d3eb54dff3d3eba4734ff207d37cb4e0e",
+ "url": "https://api.github.com/repos/oyejorge/less.php/zipball/fb64e2f6ef647a229c50e9fa0f2076240a3484c6",
+ "reference": "fb64e2f6ef647a229c50e9fa0f2076240a3484c6",
"shasum": ""
},
"require": {
- "php": ">=5.2"
+ "php": ">=5.3"
},
"bin": [
"bin/lessc"
@@ -315,22 +315,22 @@
"php",
"stylesheet"
],
- "time": "2015-05-27 17:50:32"
+ "time": "2015-09-28 01:11:47"
},
{
"name": "pear-pear.php.net/Archive_Tar",
- "version": "1.3.16",
+ "version": "1.4.0",
"dist": {
"type": "file",
- "url": "http://pear.php.net/get/Archive_Tar-1.3.16.tgz",
+ "url": "http://pear.php.net/get/Archive_Tar-1.4.0.tgz",
"reference": null,
"shasum": null
},
"require": {
- "php": ">=4.3.0.0"
+ "php": ">=5.2.0.0"
},
"replace": {
- "pear-pear/archive_tar": "== 1.3.16.0"
+ "pear-pear/archive_tar": "== 1.4.0.0"
},
"type": "pear-library",
"autoload": {
@@ -342,16 +342,16 @@
"/"
],
"license": [
- "New BSD\n License"
+ "New BSD License"
],
"description": "This class provides handling of tar files in PHP.\nIt supports creating, listing, extracting and adding to tar files.\nGzip support is available if PHP has the zlib extension built-in or\nloaded. Bz2 compression is also supported with the bz2 extension loaded."
},
{
"name": "pear-pear.php.net/Console_Getopt",
- "version": "1.4.0",
+ "version": "1.4.1",
"dist": {
"type": "file",
- "url": "http://pear.php.net/get/Console_Getopt-1.4.0.tgz",
+ "url": "http://pear.php.net/get/Console_Getopt-1.4.1.tgz",
"reference": null,
"shasum": null
},
@@ -359,7 +359,7 @@
"php": ">=5.4.0.0"
},
"replace": {
- "pear-pear/console_getopt": "== 1.4.0.0"
+ "pear-pear/console_getopt": "== 1.4.1.0"
},
"type": "pear-library",
"autoload": {
@@ -371,16 +371,16 @@
"/"
],
"license": [
- "PHP License"
+ "BSD-2-Clause"
],
- "description": "This is a PHP implementation of "getopt" supporting both\nshort and long options."
+ "description": "This is a PHP implementation of \"getopt\" supporting both\nshort and long options."
},
{
"name": "pear-pear.php.net/File_MARC",
- "version": "1.1.1",
+ "version": "1.1.2",
"dist": {
"type": "file",
- "url": "http://pear.php.net/get/File_MARC-1.1.1.tgz",
+ "url": "http://pear.php.net/get/File_MARC-1.1.2.tgz",
"reference": null,
"shasum": null
},
@@ -388,7 +388,7 @@
"php": ">=5.3.0.0"
},
"replace": {
- "pear-pear/file_marc": "== 1.1.1.0"
+ "pear-pear/file_marc": "== 1.1.2.0"
},
"type": "pear-library",
"autoload": {
@@ -445,10 +445,10 @@
},
{
"name": "pear-pear.php.net/Structures_Graph",
- "version": "1.1.0",
+ "version": "1.1.1",
"dist": {
"type": "file",
- "url": "http://pear.php.net/get/Structures_Graph-1.1.0.tgz",
+ "url": "http://pear.php.net/get/Structures_Graph-1.1.1.tgz",
"reference": null,
"shasum": null
},
@@ -456,7 +456,7 @@
"php": ">=5.3.0.0"
},
"replace": {
- "pear-pear/structures_graph": "== 1.1.0.0"
+ "pear-pear/structures_graph": "== 1.1.1.0"
},
"type": "pear-library",
"autoload": {
@@ -468,7 +468,7 @@
"/"
],
"license": [
- "LGPL License"
+ "LGPL-3.0+"
],
"description": "Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed\nand undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing\nas well as for characteristic extraction from the graph topology."
},
@@ -596,16 +596,16 @@
},
{
"name": "symfony/yaml",
- "version": "v2.7.1",
+ "version": "v2.7.5",
"source": {
"type": "git",
- "url": "https://github.com/symfony/Yaml.git",
- "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160"
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160",
- "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
+ "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
"shasum": ""
},
"require": {
@@ -641,7 +641,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2015-06-10 15:30:22"
+ "time": "2015-09-14 14:14:09"
},
{
"name": "vufind-org/vufindcode",
@@ -681,16 +681,16 @@
},
{
"name": "vufind-org/vufindhttp",
- "version": "v1.0.4",
+ "version": "v2.0.0",
"source": {
"type": "git",
"url": "https://github.com/vufind-org/vufindhttp.git",
- "reference": "1b03d31c914faa6e50b6fe811fe609328d1d287b"
+ "reference": "781a14b4daccbf699eefaa22311de0b6307c20bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vufind-org/vufindhttp/zipball/1b03d31c914faa6e50b6fe811fe609328d1d287b",
- "reference": "1b03d31c914faa6e50b6fe811fe609328d1d287b",
+ "url": "https://api.github.com/repos/vufind-org/vufindhttp/zipball/781a14b4daccbf699eefaa22311de0b6307c20bd",
+ "reference": "781a14b4daccbf699eefaa22311de0b6307c20bd",
"shasum": ""
},
"require": {
@@ -723,25 +723,25 @@
],
"description": "VuFind 2.x HTTP service library",
"homepage": "http://vufind.org/",
- "time": "2015-03-10 16:22:47"
+ "time": "2015-08-28 14:44:20"
},
{
"name": "zendframework/zendframework",
- "version": "2.3.7",
+ "version": "2.4.6",
"source": {
"type": "git",
"url": "https://github.com/zendframework/zf2.git",
- "reference": "a1aae5fdd27a422beb32c56ddf5a197654a0f94a"
+ "reference": "828119961c68fa50bf42baa60d63c3c06a0b58e7"
},
"dist": {
"type": "zip",
- "url": "https://packages.zendframework.com/composer/zendframework-zendframework-a1aae5fdd27a422beb32c56ddf5a197654a0f94a-zip-06d4c7.zip",
- "reference": "a1aae5fdd27a422beb32c56ddf5a197654a0f94a",
- "shasum": "7033dd58d94b0c75fae8a00001f8a7275c218209"
+ "url": "https://packages.zendframework.com/composer/zendframework-zendframework-2.4.6-61d420.zip",
+ "reference": "828119961c68fa50bf42baa60d63c3c06a0b58e7",
+ "shasum": "0585b917cb419511e073f9b0771a7e6dd08c315b"
},
"require": {
"php": ">=5.3.23",
- "zendframework/zendxml": "~1.0-dev"
+ "zendframework/zendxml": "^1.0.1"
},
"replace": {
"zendframework/zend-authentication": "self.version",
@@ -797,14 +797,13 @@
"zendframework/zend-xmlrpc": "self.version"
},
"require-dev": {
- "doctrine/annotations": ">=1.0",
- "fabpot/php-cs-fixer": "1.*",
- "ircmaxell/random-lib": "dev-master",
- "ircmaxell/security-lib": "dev-master",
- "mikey179/vfsstream": "1.2.*",
- "phpunit/phpunit": "3.7.*",
- "satooshi/php-coveralls": "dev-master",
- "sebastianbergmann/phpcov": "1.1.0"
+ "doctrine/annotations": "~1.0",
+ "fabpot/php-cs-fixer": "~1.0",
+ "ircmaxell/random-lib": "~1.1",
+ "mikey179/vfsstream": "~1.2",
+ "phpunit/phpcov": "~2.0",
+ "phpunit/phpunit": "~4.6",
+ "satooshi/php-coveralls": "dev-master"
},
"suggest": {
"doctrine/annotations": "Doctrine Annotations >=1.0 for annotation features",
@@ -822,13 +821,13 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3-dev",
- "dev-develop": "2.4-dev"
+ "dev-master": "2.4-dev",
+ "dev-develop": "2.5-dev"
}
},
"autoload": {
- "psr-0": {
- "Zend\\": "library/"
+ "psr-4": {
+ "Zend\\": "library/Zend/"
}
},
"autoload-dev": {
@@ -845,11 +844,7 @@
"framework",
"zf2"
],
- "support": {
- "source": "https://github.com/zendframework/zf2/tree/release-2.3.7",
- "issues": "https://github.com/zendframework/zf2/issues"
- },
- "time": "2015-03-12 16:55:53"
+ "time": "2015-08-03 15:03:22"
},
{
"name": "zendframework/zendrest",
@@ -955,24 +950,24 @@
},
{
"name": "zendframework/zendxml",
- "version": "1.0.0",
+ "version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/zendframework/ZendXml.git",
- "reference": "559b34f426d33a11c3db118e00ce14bb8dc64e5f"
+ "reference": "d8b34286c7c0f3a19fbad05ceec82ceb9dcb8257"
},
"dist": {
"type": "zip",
- "url": "https://packages.zendframework.com/composer/zendframework-zendxml-559b34f426d33a11c3db118e00ce14bb8dc64e5f-zip-6cf7a2.zip",
- "reference": "559b34f426d33a11c3db118e00ce14bb8dc64e5f",
- "shasum": "39abc614b5c26bcbf8102e203c52dee73c4460a8"
+ "url": "https://packages.zendframework.com/composer/zendframework-zendxml-1.0.1-88b0f5.zip",
+ "reference": "d8b34286c7c0f3a19fbad05ceec82ceb9dcb8257",
+ "shasum": "f532a500c86c8d811f1a2e0ee43022685367e15a"
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
- "fabpot/php-cs-fixer": "*@dev",
- "phpunit/phpunit": "~3.7"
+ "phpunit/phpunit": "~3.7",
+ "squizlabs/php_codesniffer": "~1.5"
},
"type": "library",
"extra": {
@@ -982,7 +977,12 @@
},
"autoload": {
"psr-0": {
- "ZendXml": "library/"
+ "ZendXml\\": "library/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "ZendTest\\Xml\\": "tests/ZendXmlTest/"
}
},
"license": [
@@ -995,11 +995,7 @@
"xml",
"zf2"
],
- "support": {
- "source": "https://github.com/zendframework/ZendXml/tree/master",
- "issues": "https://github.com/zendframework/ZendXml/issues"
- },
- "time": "2014-03-05 22:25:44"
+ "time": "2015-08-03 14:50:10"
},
{
"name": "zf-commons/zfc-rbac",
@@ -1131,21 +1127,24 @@
"packages-dev": [
{
"name": "behat/mink",
- "version": "v1.6.1",
+ "version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/minkphp/Mink.git",
- "reference": "8b68523a339ec991bcd638b39dc8f04f808da88a"
+ "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/minkphp/Mink/zipball/8b68523a339ec991bcd638b39dc8f04f808da88a",
- "reference": "8b68523a339ec991bcd638b39dc8f04f808da88a",
+ "url": "https://api.github.com/repos/minkphp/Mink/zipball/6c129030ec2cc029905cf969a56ca8f087b2dfdf",
+ "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf",
"shasum": ""
},
"require": {
"php": ">=5.3.1",
- "symfony/css-selector": "~2.0"
+ "symfony/css-selector": "~2.1"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
},
"suggest": {
"behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
@@ -1156,7 +1155,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6.x-dev"
+ "dev-master": "1.7.x-dev"
}
},
"autoload": {
@@ -1182,36 +1181,40 @@
"testing",
"web"
],
- "time": "2015-02-04 17:02:06"
+ "time": "2015-09-20 20:24:03"
},
{
"name": "behat/mink-zombie-driver",
- "version": "v1.2.0",
+ "version": "v1.3.0",
"source": {
"type": "git",
"url": "https://github.com/minkphp/MinkZombieDriver.git",
- "reference": "cf15a3a0cc4865bb55253cd033a03a20cee6d2d1"
+ "reference": "257a2d46ffdc8cba28d107c2f1368fc1e5637d1b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/minkphp/MinkZombieDriver/zipball/cf15a3a0cc4865bb55253cd033a03a20cee6d2d1",
- "reference": "cf15a3a0cc4865bb55253cd033a03a20cee6d2d1",
+ "url": "https://api.github.com/repos/minkphp/MinkZombieDriver/zipball/257a2d46ffdc8cba28d107c2f1368fc1e5637d1b",
+ "reference": "257a2d46ffdc8cba28d107c2f1368fc1e5637d1b",
"shasum": ""
},
"require": {
- "behat/mink": "~1.6@dev",
+ "behat/mink": "~1.7@dev",
+ "ext-sockets": "*",
"php": ">=5.3.1",
"symfony/process": "~2.1"
},
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
"type": "mink-driver",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Behat\\Mink\\Driver": "src/"
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1240,20 +1243,20 @@
"testing",
"zombie"
],
- "time": "2014-09-26 12:26:25"
+ "time": "2015-09-21 21:07:53"
},
{
"name": "symfony/css-selector",
- "version": "v2.7.1",
+ "version": "v2.7.5",
"source": {
"type": "git",
- "url": "https://github.com/symfony/CssSelector.git",
- "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092"
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "abe19cc0429a06be0c133056d1f9859854860970"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/CssSelector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092",
- "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/abe19cc0429a06be0c133056d1f9859854860970",
+ "reference": "abe19cc0429a06be0c133056d1f9859854860970",
"shasum": ""
},
"require": {
@@ -1293,20 +1296,20 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2015-05-15 13:33:16"
+ "time": "2015-09-22 13:49:29"
},
{
"name": "symfony/process",
- "version": "v2.7.1",
+ "version": "v2.7.5",
"source": {
"type": "git",
- "url": "https://github.com/symfony/Process.git",
- "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1"
+ "url": "https://github.com/symfony/process.git",
+ "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Process/zipball/552d8efdc80980cbcca50b28d626ac8e36e3cdd1",
- "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1",
+ "url": "https://api.github.com/repos/symfony/process/zipball/b27c8e317922cd3cdd3600850273cf6b82b2e8e9",
+ "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9",
"shasum": ""
},
"require": {
@@ -1342,7 +1345,7 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2015-06-08 09:37:21"
+ "time": "2015-09-19 19:59:23"
}
],
"aliases": [],
diff --git a/config/vufind/DAIA.ini b/config/vufind/DAIA.ini
index 20861f3794f..b4e5c56e6f4 100644
--- a/config/vufind/DAIA.ini
+++ b/config/vufind/DAIA.ini
@@ -2,16 +2,7 @@
; http://gbv.github.io/daiaspec/daia.html#query-api
;
; The settings in the [DAIA] section will be used for all DAIA requests.
-; The name of this section got refactored with VuFind 2.4, although the old
-; configuration using the [Global] section still works, it should be replaced
-; with the new [DAIA] section.
-; Note: Settings for daiaResponseFormat and daiaIdPrefix are not supported if
-; a pre VuFind 2.4 configuration with the [Global] section is used.
-; i.e.:
-; [Global]
-; baseUrl = [your DAIA server base url]
-; daiaIdPrefix = [this setting will have no effect]
-; daiaResponseFormat = [this setting will have no effect]
+; The name of this section got refactored with VuFind 2.4.
;
; A default DAIA call looks like this:
; https://daia.myuniversity.edu/?id=ppn:12345678&format=json
@@ -38,4 +29,18 @@ baseUrl = [your DAIA server base url]
; Set multiQuery to true if your DAIA webservice supports queries with multiple
; ids (cf. http://gbv.github.io/daiaspec/daia.html#query-api).
; Default is false.
-;multiQuery = false
\ No newline at end of file
+;multiQuery = false
+
+; If daiaContentTypes are set, the DAIA driver checks the Content-Type
+; line in the DAIA response HTTP header for the configured values. If
+; daiaContentTypes is not set, Content-Type HTTP header is NOT checked.
+;
+; expected Content-Types for DAIA XML format:
+; (separate multiple values by commas, for example:
+; daiaContentTypes['xml'] = "application/xml, text/xml"
+daiaContentTypes['xml'] = "application/xml"
+
+; expected Content-Types for DAIA JSON format:
+; (separate multiple values by commas, for example:
+; daiaContentTypes['json'] = "application/json, application/javascript"
+daiaContentTypes['json'] = "application/json"
diff --git a/config/vufind/EDS.ini b/config/vufind/EDS.ini
index 45c640fcf02..12a28071db1 100644
--- a/config/vufind/EDS.ini
+++ b/config/vufind/EDS.ini
@@ -132,9 +132,11 @@ facet_limit = 100 ; how many values should we show for each facet?
orFacets = *
; Any facets named in the list below will have their values run through the
-; translation code; unlisted facets will displayed as-is without translation. For
+; translation code; unlisted facets will displayed as-is without translation. For
; translated facets, be sure that all of the necessary strings are included in the
-; language files found in the web/lang directory. By default, no facets are
+; language files found in the languages directory. You may add a colon and the
+; name of a text domain after the field name to specify translations in a specific
+; text domain (subdirectory of the languages folder). By default, no facets are
; translated -- uncomment or add lines below to turn on this feature.
;translated_facets[] = SourceType
diff --git a/config/vufind/PICA.ini b/config/vufind/PICA.ini
deleted file mode 100644
index 3b4e9532692..00000000000
--- a/config/vufind/PICA.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[Global]
-baseUrl = [your DAIA server base url]
-
-[Catalog]
-Host = "[your OPC Host]"
-DB = 1 ; You may need to change this to the ID of your OPC DB
-renewalsScript = "[URI of the script to get the number of renewals. This must be on the PICA catalog host]"
\ No newline at end of file
diff --git a/config/vufind/Primo.ini b/config/vufind/Primo.ini
index afd0d6dfa2c..b99a3566ed1 100644
--- a/config/vufind/Primo.ini
+++ b/config/vufind/Primo.ini
@@ -88,6 +88,12 @@ domain = Source
; Top facets (not used by default)
[FacetsTop]
+; Checkbox facets are facets, which are getting displayed as checkboxes
+; pcAvailability is a special facet. It's used to show all records found in
+; PrimoCentral without checking the local availability against a holdingsfile.
+[CheckboxFacets]
+;pcAvailability = "add_other_libraries" ; pcAvailability is special; see above
+
; Facet display settings
[Results_Settings]
; Rows and columns for table used by top facets
@@ -109,9 +115,11 @@ facet_limit = 30 ; how many values should we show for each facet?
special_facets = daterange
; Any facets named in the list below will have their values run through the
-; translation code; unlisted facets will displayed as-is without translation. For
+; translation code; unlisted facets will displayed as-is without translation. For
; translated facets, be sure that all of the necessary strings are included in the
-; language files found in the web/lang directory. By default, no facets are
+; language files found in the languages directory. You may add a colon and the
+; name of a text domain after the field name to specify translations in a specific
+; text domain (subdirectory of the languages folder). By default, no facets are
; translated -- uncomment or add lines below to turn on this feature.
translated_facets[] = tlevel
diff --git a/config/vufind/Summon.ini b/config/vufind/Summon.ini
index 9dc2c7bbc36..43dae0de7bc 100644
--- a/config/vufind/Summon.ini
+++ b/config/vufind/Summon.ini
@@ -196,10 +196,12 @@ special_facets = "daterange,checkboxes:Summon"
; to false or omit to disable ORed facets.
orFacets = *
-; Any facets named in the list below will have their values run through the
-; translation code; unlisted facets will displayed as-is without translation. For
+; Any facets named in the list below will have their values run through the
+; translation code; unlisted facets will displayed as-is without translation. For
; translated facets, be sure that all of the necessary strings are included in the
-; language files found in the web/lang directory. By default, no facets are
+; language files found in the languages directory. You may add a colon and the
+; name of a text domain after the field name to specify translations in a specific
+; text domain (subdirectory of the languages folder). By default, no facets are
; translated -- uncomment or add lines below to turn on this feature.
;translated_facets[] = ContentType
diff --git a/config/vufind/Virtua.ini b/config/vufind/Virtua.ini
index d5ec6a38dfd..6af4bdca538 100644
--- a/config/vufind/Virtua.ini
+++ b/config/vufind/Virtua.ini
@@ -3,6 +3,10 @@
host = virtuadb.your.library.server
; Your iportal server
webhost = virtuaweb.your.library.server
+; Your iportal cgi token string
+; Example, from "http://webvirtua.libexample.edu/cgi-bin/gw/chameleon"
+; you get "cgi-bin/gw", default is "cgi-bin"
+cgi_token = "cgi-bin"
; The iportal host string
host_string = virtuaweb.your.library.server+9002+DEFAULT
; The iportal patron string
@@ -14,3 +18,5 @@ service = VTLS01
; Login details
user = username
password = password
+; System language (en -> English, pt -> Portuguese, fr -> French; default = en)
+language = en
\ No newline at end of file
diff --git a/config/vufind/VoyagerRestful.ini b/config/vufind/VoyagerRestful.ini
index d1e6f322f2e..261246515ee 100644
--- a/config/vufind/VoyagerRestful.ini
+++ b/config/vufind/VoyagerRestful.ini
@@ -107,6 +107,11 @@ extraHoldFields = comments:requiredByDate:pickUpLocation
; 3) a value within the Location IDs returned by getPickUpLocations()
defaultPickUpLocation = ""
+; By default the pick up location list is sorted alphabetically. This setting can be
+; used to manually set the order by entering location IDs as a colon-separated list.
+; You can also disable sorting by setting this to false.
+;pickUpLocationOrder = 158:155
+
; The maximum number of holding items to generate request links for. The process of
; checking the API for a valid hold is intensive. Any hold items above this this
; limit will have their hold status checked via ajax or when a user clicks on the
diff --git a/config/vufind/config.ini b/config/vufind/config.ini
index 07a0805418a..5b2973bb4f9 100644
--- a/config/vufind/config.ini
+++ b/config/vufind/config.ini
@@ -13,6 +13,10 @@ available = true
debug = false
; This setting should be set to false after auto-configuration is complete
autoConfigure = true
+; This setting specifies a health check file location. If a health check file exists,
+; the getServerStatus AJAX call will return an error regardless of actual status
+; allowing the server to be disabled from a load-balancer.
+;healthCheckFile = /tmp/disable_vufind
; This section will need to be customized for your installation
[Site]
@@ -23,10 +27,10 @@ email = support@myuniversity.edu
title = "Library Catalog"
; This is the default theme for non-mobile devices (or all devices if mobile_theme
; is disabled below). Available standard themes:
-; blueprint = XHTML theme using Blueprint + jQuery libraries [deprecated]
; bootstrap3 = HTML5 theme using Bootstrap 3 + jQuery libraries, with minimal
; styling
-; bootprint3 = bootstrap3 theme styled to resemble old blueprint theme
+; bootprint3 = bootstrap3 theme with more attractive default styling applied
+; (named after the earlier, now-deprecated blueprint theme)
theme = bootprint3
; Uncomment the following line to use a different default theme for mobile devices.
; You may not wish to use this setting if you are using one of the Bootstrap-based
@@ -82,6 +86,8 @@ defaultAccountPage = Favorites
admin_enabled = false
; Show sidebar on the left side instead of right
sidebarOnLeft = false
+; Invert the sidebarOnLeft setting for right-to-left languages?
+mirrorSidebarInRTL = true
; Handle menu as an offcanvas slider at mobile sizes (in bootstrap3-based themes)
offcanvas = false
; Show (true) / Hide (false) Book Bag - Default is Hide.
@@ -91,7 +97,7 @@ bookBagMaxSize = 100
; Display bulk items (export, save, etc.) and checkboxes on search result screens?
showBulkOptions = false
; Generator value to display in an HTML header tag:
-generator = "VuFind 2.4.1"
+generator = "VuFind 2.5"
; This section allows you to configure the mechanism used for storing user
; sessions. Available types: File, Memcache, Database.
@@ -341,6 +347,9 @@ recordsBySource = false
; This section defines the location/behavior of the Solr index and requires no
; changes for most installations
[Index]
+; url can also be an array of servers. If so, VuFind will try the servers one by one
+; until one can be reached. This is only useful for advanced fault-tolerant Solr
+; installations.
url = http://localhost:8080/solr
default_core = biblio
; This setting needs to match the setting in your solrconfig.xml
@@ -742,9 +751,18 @@ window_settings = "toolbar=no,location=no,directories=no,buttons=no,status=no,me
; If you want to display a graphical link to your link resolver, uncomment the
; settings below. graphic should be a URL; graphic_width and graphic_height
; should be sizes in pixels.
-; graphic = "http://myuniversity.edu/images/findIt.gif"
-; graphic_width = 50
-; graphic_height = 20
+;graphic = "http://myuniversity.edu/images/findIt.gif"
+;graphic_width = 50
+;graphic_height = 20
+
+; If your link resolver can render an image in response to an OpenURL, you can
+; specify the base URL for image generation here:
+;dynamic_graphic = "http://my-link-resolver/image"
+
+; If dynamic_graphic is set above, the dynamic image can be used instead of the
+; standard text or static-image-based OpenURL link (true), it can be disabled
+; (false), or it can be displayed in addition to the regular link ("both").
+;image_based_linking_mode = both
; The following settings control where OpenURL links are displayed:
show_in_results = true ; include in search results
@@ -823,12 +841,17 @@ url = https://www.myendnoteweb.com/EndNoteWeb.html
;host = your.proxy.server
;port = 8000
+; Uncomment following line to set proxy type to SOCKS 5
+;type = socks5
+
; Default HTTP settings can be loaded here. These values will be passed to
; the \Zend\Http\Client's setOptions method.
[Http]
;sslcapath = "/etc/ssl/certs" ; e.g. for Debian systems
;sslcafile = "/etc/pki/tls/cert.pem" ; e.g. for CentOS systems
+;timeout = 30 ; default timeout if not overridden by more specific code/settings
+
; Using a curl Adapter instead of the the defaultAdapter (Socket)
; adapter = 'Zend\Http\Client\Adapter\Curl'
@@ -953,6 +976,11 @@ da = "Danish"
sl = "Slovene"
ar = "Arabic"
+; This section contains special cases for languages such as right-to-left support
+[LanguageSettings]
+; Comma-separated list of languages to display in right-to-left mode
+rtl_langs = "ar,he"
+
; This section controls the behavior of the Browse module. The result_limit
; setting controls the maximum number of results that may display in any given
; result box on the Browse screen. You can set to -1 for no limit; however,
@@ -975,26 +1003,35 @@ era = true ; allow browsing of era subdivisions
; most popular entries -- it only affects display order.
;alphabetical_order = true
-; This section controls which record export methods are displayed on the Record
-; view screen. Note that some options may be disabled for records that do not
-; support them, regardless of the setting chosen here. You can edit the separate
-; export.ini file to add new export formats and change the behavior of existing ones.
+; This section controls the availability of export methods.
+;
+; Each entry may be a comma-separated list of contexts in which the export
+; option will be presented. Valid options:
+;
+; bulk - Included in batch export contexts
+; record - Included in single-record export contexts
+;
+; If you simply set a field to true, only "record" mode will be enabled.
+; If you set a field to false, all export contexts will be disabled.
+;
+; Note that some options may be disabled for records that do not support them,
+; regardless of the setting chosen here. You can edit the separate export.ini
+; file to add new export formats and change the behavior of existing ones.
[Export]
-RefWorks = true
-EndNote = true
-EndNoteWeb = true
+RefWorks = "record,bulk"
+EndNote = "record,bulk"
+EndNoteWeb = "record,bulk"
MARC = false
MARCXML = false
RDF = false
BibTeX = false
RIS = false
-; This section controls whether or not display the bulk export options and which
-; options to display. Valid methods are EndNote and MARC - The method must also
-; be enabled in Export (above) or it will not be displayed.
[BulkExport]
-enabled = true
-options = MARC:MARCXML:EndNote:EndNoteWeb:RefWorks:BibTeX:RIS
+; Export behavior to use when no bulkExportType setting is found in the matching
+; format section of export.ini; default is 'link' if not overridden below. See
+; export.ini for more details on available options.
+;defaultType = download
;AddThis is optional. It uses the Add This tool available from www.addthis.com
; and requires the username generated when an analytics account is registered.
@@ -1107,7 +1144,10 @@ HMACkey = mySuperSecretValue
;ttl = 0
; This setting can be used to force caching in a specific location other than the
; default location inside the local settings directory. This directory must exist
-; and be writable by the web server.
+; and be writable by the web server. Do not share this directory between multiple
+; instances of VuFind or you may encounter unexpected side effects -- while this
+; directory may be outside of the local settings directory, there should be exactly
+; one separate cache location per local settings directory.
;cache_dir = "local/cache/"
; Override umask for cache directories and files.
;umask = 022
diff --git a/config/vufind/export.ini b/config/vufind/export.ini
index 6866fa07358..04a4702aac5 100644
--- a/config/vufind/export.ini
+++ b/config/vufind/export.ini
@@ -25,6 +25,12 @@
; {config...} setting above, except result will be URL-encoded.
; requiredMethods[] - a repeatable field indicating methods which must be available
; on the record driver object in order to allow export in this format.
+; bulkExportType - [ "link" | "download" ] - link renders a download link in the UI,
+; download offers to save the export-file directly; overrides the defaultType
+; setting found in the [BulkExport] section of config.ini. This distinction
+; currently only affects users with Javascript enabled; the 'download' option
+; cannot be implemented in a user-friendly way when Javascript is disabled.
+
[RefWorks]
requiredMethods[] = getTitle
redirectUrl = "{config|RefWorks|url|http://www.refworks.com}/express/expressimport.asp?vendor={encodedConfig|RefWorks|vendor|VuFind}&filter=RefWorks%20Tagged%20Format&url={encodedCallback}"
diff --git a/config/vufind/facets.ini b/config/vufind/facets.ini
index a25bf67a45c..cb7db4278fa 100644
--- a/config/vufind/facets.ini
+++ b/config/vufind/facets.ini
@@ -141,9 +141,11 @@ orFacets = *
special_facets = "illustrated,daterange"
; Any facets named in the list below will have their values run through the
-; translation code; unlisted facets will displayed as-is without translation. For
+; translation code; unlisted facets will displayed as-is without translation. For
; translated facets, be sure that all of the necessary strings are included in the
-; language files found in the web/lang directory. By default, no facets are
+; language files found in the languages directory. You may add a colon and the
+; name of a text domain after the field name to specify translations in a specific
+; text domain (subdirectory of the languages folder). By default, no facets are
; translated -- uncomment or add lines below to turn on this feature.
;translated_facets[] = institution
;translated_facets[] = building
diff --git a/config/vufind/permissions.ini b/config/vufind/permissions.ini
index b7e68bdf34f..04f20ea0d22 100644
--- a/config/vufind/permissions.ini
+++ b/config/vufind/permissions.ini
@@ -20,7 +20,9 @@
;
; ipRange - Grant the permission to the single IP adresse or to the range.
; Accepts a single IP adresse or a range with a minus character without
-; blanks as seperator.
+; blanks as separator. Also partial addresses can be used (e.g. 192.168
+; denotes 192.168.0.0-192.168.255.255) and IPv6 addresses are also
+; supported (unless PHP is compiled with IPv6 disabled).
; ipRegEx - Grant the permission to IP addresses matching the provided regular
; expression(s). Accepts a string or an array; if an array is passed,
; permission will be granted if ANY one of the expressions matches.
diff --git a/config/vufind/searches.ini b/config/vufind/searches.ini
index edd90ee5f4c..98ea375c46f 100644
--- a/config/vufind/searches.ini
+++ b/config/vufind/searches.ini
@@ -56,7 +56,7 @@ default_top_recommend[] = SpellingSuggestions
;default_top_recommend[] = VisualFacets:Visual_Settings
default_side_recommend[] = SideFacets:Results:CheckboxFacets
default_noresults_recommend[] = SwitchType
-default_noresults_recommend[] = SwitchQuery
+default_noresults_recommend[] = SwitchQuery:::fuzzy
default_noresults_recommend[] = SpellingSuggestions
; Set this to true in order to highlight keywords from the search query when they
@@ -351,14 +351,16 @@ CallNumber = callnumber-sort
;
; AlphaBrowseLink:index
; Use the query to generate a link to the specified alphabrowse index
-; SwitchQuery:[backend]:[checks to skip]:[transforms to add]
+; SwitchQuery:[backend]:[opt-out checks to skip]:[opt-in checks to add]
; This module analyzes the user's query and offers suggestions for ways to
; improve it. [backend] is the name of the search backend currently in use,
-; which will help with accurate analysis (default = Solr). [checks to skip]
-; is a comma-separated list of checks to disable; see the check*() methods
-; in the module's code for a complete list of available checks.
-; [transforms to add] is a comma-separated list of transforms to enable;
-; currently there is only one: truncatechar
+; which will help with accurate analysis (default = Solr). [opt-out checks
+; to skip] is a comma-separated list of checks which are on by default but
+; which you wish to disable. [opt-in checks to add] is a comma-separated
+; list of transforms that are off by default but which you wish to enable.
+; See the check*() methods in the module's code for a complete list of
+; available checks. The $optInMethods property specifies which checks are
+; turned off by default.
; SwitchType:[field]:[field description]
; If the current search type is not the same as [field], display a link
; suggesting that the user try switching to [field]. [field description]
diff --git a/import/browse-indexing.jar b/import/browse-indexing.jar
index 5a4c3492fb9..bd3d047060a 100644
Binary files a/import/browse-indexing.jar and b/import/browse-indexing.jar differ
diff --git a/import/translation_maps/language_map.properties b/import/translation_maps/language_map.properties
index 7c2c3cbaf26..1d20a51b236 100644
--- a/import/translation_maps/language_map.properties
+++ b/import/translation_maps/language_map.properties
@@ -1,5 +1,4 @@
aar = Afar
-aar = Afar
abk = Abkhazian
ace = Achinese
ach = Acoli
diff --git a/languages/ar.ini b/languages/ar.ini
index c98b7e4445c..f5d28142548 100644
--- a/languages/ar.ini
+++ b/languages/ar.ini
@@ -7,6 +7,7 @@ Access URL = "URL الوصول"
Accession Number = "رقم الأكسشن"
Account = "حساب"
Add = "إضافة"
+Add a Library Card = "أضف بطاقة مكتبة"
Add a Note = "إضافة ملاحظة"
Add Tag = "إضافة وسم"
Add Tags = "إضافة وسوم"
@@ -46,17 +47,20 @@ Advanced Search = "بحث متقدم"
advSearchError_noRights = "عذراً، لكنك لا تملك صلاحية تحرير هذا البحث. ربما انتهت جلسة متصفحك ؟"
advSearchError_notAdvanced = "البحث الذي طلبت تحريره ليس بحثا متقدماً."
advSearchError_notFound = "لم يتم العثور على البحث الذي طلبته."
+ajaxview_label_information = "نعلومات"
+ajaxview_label_tools = "أدوات"
All = "الكل"
All Fields = "كل الحقول"
All Pages Loaded = "تم تحميل كل الصفحات"
All Text = "كل النص"
alphabrowse_matches = "النتائج"
+alphabrowselink_html = "استعرض المداخل حسب %%index%% ابتداءً بـ %%from%%."
An error has occurred = "لقد حدث خطأ"
An error occurred during execution; please try again later. = "لقد حدث خطأ أثناء التنفيذ؛ يرجى إعادة المحاولة لاحقا."
AND = "و"
anonymous_tags = "وسوم مجهولة"
APA Citation = "APA استشهاد"
-Article = "المقال"
+Article = "مقال"
Ask a Librarian = "إسأل أخصائي مكتبات"
Audience = "جمهور"
Audio = "سمعي"
@@ -70,7 +74,7 @@ authentication_error_technical = "لا يمكننا تسجيل دخولك في
Author = "المؤلف"
Author Browse = "استعراض المؤلف"
Author Notes = "ملاحظات المؤلف"
-Author Results for = "نتائج المؤلف لـ"
+Author Results for = "نتائج البحث عن المؤلف"
Author Search Results = "نتائج بحث المؤلف"
Authors = "المؤلفون"
Authors Related to Your Search = "المؤلفون المتعلقون ببحثك"
@@ -167,7 +171,7 @@ Change Password = "تغيير كلمة المرور"
Check Hold = "تحديد الحجز"
Check Recall = "تحديد الاستدعاء"
Checked Out = "معار"
-Checked Out Items = "المواد المعارة"
+Checked Out Items = "مواد معارة"
Checkedout = "معار"
Chicago Citation = "استشهاد بنمط شيكاغو"
child_record_count = "%%count%% تسجيلات"
@@ -182,6 +186,7 @@ citation_singlepage_abbrev = "صفحة"
citation_volume_abbrev = "المجلد"
Cite this = "استشهد بهذا"
City = "المدينة"
+Clear = "مسح"
clear_tag_filter = "مسح المرشح"
close = "إغلاق"
Code = "الرمز"
@@ -199,6 +204,8 @@ Company/Entity = "الشركة/الكيان"
Configuration = "التهيئة"
confirm_delete = "هل أنت متأكد من انك تريد حذف هذا؟"
confirm_delete_brief = "حذف المادة؟"
+confirm_delete_library_card_brief = "أحذف بطاقة المكتبة؟"
+confirm_delete_library_card_text = "هل انت متأكد من حذف بطاقة المكتبة هذه؟"
confirm_delete_list_brief = "حذف القائمة؟"
confirm_delete_list_text = "هل أنت متأكد من أنك ترغب في حذف هذه القائمة؟"
confirm_delete_tags_brief = "حذف الوسوم"
@@ -262,6 +269,7 @@ Due Date = "تاريخ الاستحقاق"
DVD = "قرص فيديو رقمي"
eBook = "كتاب الكتروني"
Edit = "تحرير"
+Edit Library Card = "حرّر بطاةق المكتبة"
Edit this Advanced Search = "تحرير هذا البحث المتقدم"
edit_list = "تحرير القائمة"
edit_list_fail = "عذرا، ليس لديك صلاحية تحرير هذه القائمة"
@@ -351,10 +359,10 @@ File Description = "وصف الملف"
Filter = "المرشح"
filter_tags = "ترشيح الوسوم"
filter_wildcard = "أي"
-Find = "أبحث"
-Find More = "أبحث عن المزيد"
-Find New Items = "أبحث عن مواد جديدة"
-Finding Aid = "أبحث عن Aid"
+Find = "ابحث"
+Find More = "ابحث عن المزيد"
+Find New Items = "ابحث عن مواد جديدة"
+Finding Aid = "ابحث عن Aid"
Fine = "غرامة"
fine_limit_patron = "لقد وصلت للحد الأقصى للغرامات ولا يمكن تجديد المواد"
Fines = "الغرامات"
@@ -373,8 +381,8 @@ fulltext_limit = "قصر على المقالات ذات النص الكامل م
Genre = "نوع المادة"
Geographic Terms = "مصطلحات جغرافية"
Geography = "المنطقة"
-Get full text = "النص الكامل"
-Get RSS Feed = "الحصول على تغذية RSS"
+Get full text = "احصل على النص الكامل"
+Get RSS Feed = "أحصل على تغذية RSS"
Globe = "عالم"
Go = "اذهب"
Go to Standard View = "اذهب إلى العرض القياسي"
@@ -383,7 +391,7 @@ google_map_cluster_points = "نقاط التجمع"
Grid = "شبكة"
Group = "مجموعة"
group_AND = "كل المجموعات"
-group_OR = "أي مجموعات"
+group_OR = "أي مجموعة"
Has Illustrations = "به رسومات توضيحية"
Help = "المساعدة"
Help with Advanced Search = "إرشادات حول البحث المتقدم"
@@ -510,6 +518,7 @@ Journal Info = "بيانات الدورية"
Journal Title = "عنوان الدورية"
Journals = "الدوريات"
Jump to = "انتقل إلى"
+just_cataloged = "تمت الفهرسة على التو"
Keyword = "كلمة مفتاحية"
Keyword Filter = "مرشح الكلمة المفتاحية"
Kit = "عدة"
@@ -519,7 +528,19 @@ Last = "آخر"
Last Modified = "آخر تعديل"
Last Name = "الاسم الأخير"
less = "أقل"
+libphonenumber_invalid = "رقم التلفون غير صحيح"
+libphonenumber_invalidcountry = "رمز البلد في المكالمة غير صحيح"
+libphonenumber_invalidregion = "رقم المنطقة غير صحيح:"
+libphonenumber_notanumber = "رقم التلفون الذي تم تزويده لا يبدو انه صحيح"
+libphonenumber_toolong = "رقم التلفون الذي تم تزويده يبدو انه أطول من المتوقع"
+libphonenumber_tooshort = "رقم التلفون الذي تم تزويده يبدو أنه أقصر من المتوقع"
+libphonenumber_tooshortidd = "رقم التلفون أقصر من المتوقع بعد IDD"
Library = "المكتبة"
+Library Card = "كرت المكتبة"
+Library Card Deleted = "تم حذف بطاقة المكتبة"
+Library Card Name = "اسم بطاقة المكتبة"
+Library Cards = "بطاقات المكتبة"
+Library Cards Disabled = "تم تعطيل بطاقات المكتبة"
Library Catalog Password = "كلمة مرور فهرس المكتبة"
Library Catalog Profile = "ملف فهرس المكتبة"
Library Catalog Record = "تسجيلة فهرس المكتبة"
@@ -595,7 +616,7 @@ No Cover Image = "لا توجد صورة غلاف"
No dependency problems found = "لم يتم العثور على مشكلات تبعية"
No excerpts were found for this record. = " لم يتم العثور على مقتطفات لهذه التسجيلة."
No library account = "لا يوجد حساب مكتبي"
-No new item information is currently available. = "لا تتوافر معلومات عن مادة جديدة حاليا"
+No new item information is currently available. = "لا تتوفر معلومات حول مواد جديدة حالياً"
No Preference = "لا يوجد تفضيل"
No reviews were found for this record = "لم يتم العثور على مراجعات لهذه التسجيلة"
No Tags = "لا توجد وسوم"
@@ -611,7 +632,7 @@ nohit_suffix = "لم يطابق أي من المصادر."
nohit_suggest = "يمكنك مراجعة عبارة بحثك عن طريق حذف بعض الكلمات أو مراجعة الهجاء."
NOT = "غير"
Not Illustrated = "غير موضح"
-Not On Reserve = "ليس في الاحتياطي"
+Not On Reserve = "ليس في الحجز"
not_applicable = "غير معروف"
Note = "ملاحظة"
note_760 = "السلسة الرئيسية"
@@ -649,9 +670,9 @@ number_thousands_separator = ","
OAI Server = "OAI خادم"
of = "من"
old_password = "كلمة المرور القديمة"
-On Reserve = "في الاحتياطي"
-On Reserve - Ask at Circulation Desk = "في الاحتياطي - اسأل في مكتب الإعارة"
-on_reserve = "الاحتياطي - اسأل في الإعارة"
+On Reserve = "في الحجز"
+On Reserve - Ask at Circulation Desk = "في الحجز - اسأل في مكتب الإعارة"
+on_reserve = "الحجز - اسأل في الإعارة"
on_topic = "%%count%% مواد حول الموضوع"
Online Access = "الوصول للمادة أونلاين"
online_resources = "نص كامل"
@@ -668,6 +689,7 @@ Page not found. = "لم يتم العثور على الصفحة."
Password = "كلمة المرور"
Password Again = "كلمة المرور مرة أخرى"
Password cannot be blank = "لا يمكن أن تكون كلمة المرور خالية"
+password_error_invalid = "كلمة المرور الجديدة غير صحيحة (يبدو تحوي على حروف غير مقبولة)"
password_error_not_unique = "لم يتم تغيير كلمة المرور"
password_maximum_length = "الحد الأقصى لطول كلمة المرور هو %%maxlength%% أحرف"
password_minimum_length = "الحد الأدنى لطول كلمة المرور هو%%minlength%% أحرف"
@@ -712,7 +734,7 @@ Publication Type = "نوع المنشور"
Publication Year = "سنة النشر"
Publication_Place = "مكان النشر"
Published = "منشور في"
-Published in = "حاوية النشر"
+Published in = "الحاوية / القاعدة"
Publisher = "الناشر"
Publisher Information = "بيانات النشر"
Publisher Permissions = "تصاريح الناشر"
@@ -724,7 +746,7 @@ random_recommendation_title = "مواد عشوائية من نتائجك"
Range = "نطاق"
Range slider = "تمرير النطاق"
Read the full review online... = "قراءة المراجعة الكاملة أونلاين..."
-Recall This = "تذكر هذا"
+Recall This = "إستدعي هذه النسخة"
recaptcha_not_passed = "CAPTCHA لم تمر"
Record Citations = "استشهادات التسجيلة"
Record Count = "عد التسجيلة"
@@ -768,9 +790,9 @@ Request full text = "نص الطلب الكامل"
request_place_text = "وضع طلب"
request_submit_text = "تقديم طلب"
Requests = "طلبات"
-Reserves = "احتياطي"
-Reserves Search = "بحث الاحتياطي"
-Reserves Search Results = "نتائج بحث الاحتياطي"
+Reserves = "الحجز الأكاديمي"
+Reserves Search = "لحث الحجز الأكاديمي"
+Reserves Search Results = "نتائج البحث في الحجز الأكاديمي"
Results = "نتائج"
results = "نتائج"
Results for = "نتائج لـ"
@@ -787,21 +809,21 @@ scholarly_limit = "تحديد إلى المقالات من الدوريات ال
Scroll to Load More = "تمرير لتحميل المزيد"
Search = "بحث عن"
Search For = "بحث عن"
-Search For Items on Reserve = "بحث عن الموتد في الاحتياطي"
+Search For Items on Reserve = "بحث عن المواد في الحجز الأكاديمي"
Search History = "سجل البحث"
Search Home = "صفحة البحث الرئيسية"
Search Mode = "طريقة البحث"
Search Options = "خيارات البحث"
Search Results = "نتائج البحث"
search results of = "نتائج البجث لـ"
-Search Tips = "إرشادات البحث"
+Search Tips = "إرشادات حول معاملات البحث"
Search Tools = "أدوات البحث"
Search Type = "نوع البحث"
search_AND = "كل المصطلحات"
search_groups = "مجموعات البحث"
search_match = "مطابقة"
search_NOT = "لا توجد مصطلحات"
-search_OR = "أي مصطلحات"
+search_OR = "أي مصطلح"
search_save_success = "تم حفظ البحث بنجاح."
search_unsave_success = "تم حذف البحث المحفوظ بنجاح."
seconds_abbrev = "s"
@@ -964,6 +986,7 @@ Use instead = "استخدم بدلا من"
User Account = "حساب المستخدم"
Username = "اسم المستخدم"
Username cannot be blank = "لا يمكن أن يكون اسم المستخدم خاليا"
+Username is already in use in another library card = "الاسم مستخدم في بطاقة مكتبة أخرى"
VHS = "VHS"
Video = "الفيديو"
Video Clips = "مقاطع الفيديو"
@@ -972,7 +995,7 @@ view already selected = "عرض المحدد بالفعل"
View Book Bag = "عرض سلة الكتب"
View Full Collection = "عرض المجموعة كاملة"
View Full Record = "عرض التسجيلة الكاملة"
-View in EDS = "عرض في EDS"
+View in EDS = "أعرض في EDS"
View online: Full view Book Preview from the Hathi Trust = "عرض على أونلاين أونلاين: معاينة كاملة لعرض الكتاب من Hathi Trust"
View Record = "عرض التسجيلة"
View Records = "عرض التسجيلات"
@@ -1001,6 +1024,7 @@ You do not have any fines = "لا توجد لديك أي غرامات"
You do not have any holds or recalls placed = "لا يوجد لديك أي حجوزات أو استدعاءات"
You do not have any interlibrary loan requests placed = "لا توجد لديك أي طلبات استعارة ما بين المكتبات"
You do not have any items checked out = "لا توجد لديك أي مواد معارة"
+You do not have any library cards = "ليس لديك أي بطاقة مكتبة"
You do not have any saved resources = "لا توجد لديك أي مصادر محفوظة. قم بإجراء بحث واستخدام زر أضف إلى المفضلة لحفظ المواد."
You do not have any storage retrieval requests placed = "لا يوجد لديك أي طلبات استعادة تخزين "
You must be logged in first = "يجب تسجيل دخولك أولا"
@@ -1017,4 +1041,4 @@ Your search terms = "مصطلحات بحثك"
Your Tags = "وسومك"
your_match_would_be_here = "قد تكون مضاهاتك هنا."
Zip = "الرمز البريدي"
-zoom = "تقريب"
\ No newline at end of file
+zoom = "تقريب"
diff --git a/languages/ca.ini b/languages/ca.ini
index c285cefc18e..f5b366bec94 100644
--- a/languages/ca.ini
+++ b/languages/ca.ini
@@ -14,8 +14,11 @@
;Portuguese = "Portuguès"
Abstract = "Resum"
Access = "Accés"
+Access URL = "URL d'accés"
+Accession Number = "Número de registre"
Account = "Compte"
Add = "Afegir"
+Add a Library Card = "Afegir un nou carnet"
Add a Note = "Afegir una nota"
Add Tag = "Afegir etiqueta"
Add Tags = "Afegir etiquetes"
@@ -55,11 +58,14 @@ Advanced Search = "Cerca avançada"
advSearchError_noRights = "Ho sentim, no teniu permisos per editar aquesta cerca. Potser la vostra sessió del navegador ha caducat?"
advSearchError_notAdvanced = "La cerca que voleu editar no és una cerca avançada."
advSearchError_notFound = "La cerca sol·licitada no s’ha trobat."
+ajaxview_label_information = "Informació"
+ajaxview_label_tools = "Utilitats"
All = "All"
All Fields = "Tots els camps"
All Pages Loaded = "S'han carregat totes les pàgines"
All Text = "Tot el text"
alphabrowse_matches = "Resultats"
+alphabrowselink_html = "Revisar registres per %%index%% desde fins %%from%%."
An error has occurred = "S'ha produït un error"
An error occurred during execution; please try again later. = "S'ha produït un error durant el procés; si us plau espera una estona i torna a provar-ho."
AND = "i"
@@ -87,6 +93,7 @@ Auto configuration is currently disabled = "Auto configuració deactivate"
auto_configure_description = "Si aquesta es una instalació nova, pot corregir les incidències amb el Vufins's Auto Configure tool."
auto_configure_disabled = "Autoconfiguració desactivada."
auto_configure_title = "Autoconfigurar"
+Availability = "Disponibilitat"
Available = "Disponible"
Available Functionality = "Funcionalitat disposable"
Awards = "Compensacions"
@@ -207,6 +214,8 @@ Company/Entity = "Societat/Institutció"
Configuration = "Configuració"
confirm_delete = "Esteu segurs que el voleu eliminar?"
confirm_delete_brief = "Borrar exemplar?"
+confirm_delete_library_card_brief = "Esborrar carnet?"
+confirm_delete_library_card_text = "Estàs segur de que vols esborrar el carnet?"
confirm_delete_list_brief = "Borrar llista?"
confirm_delete_list_text = "Esteu segurs que voleu eliminar aquesta llista?"
confirm_delete_tags_brief = "Esborrar etiquetes"
@@ -221,9 +230,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Vols cancelar les teves pet
confirm_storage_retrieval_request_cancel_selected_text = "Vols canceler la teva selecció de peticions?"
conjunction_or = "O"
Contents = "Continguts"
+Contributing Source = "Contributing Source"
Contributors = "Col·laboradors"
Copies = "Còpies"
Copy = "Còpia"
+Copyright = "Copyright"
Corporate Author = "Autor corporatiu"
Country = "Pais"
Course = "Curs"
@@ -261,12 +272,14 @@ Detailed View = "Vista completa"
Details = "Visualització interna"
Displaying the top = "Visualitzant la part superior"
Document Inspector = "Document Inspector"
+Document Type = "Tipus de document"
DOI = "DOI"
Due = "Venciment"
Due Date = "Data de venciment"
DVD = "DVD"
eBook = "eBook"
Edit = "Editar"
+Edit Library Card = "Editar el carnet de la biblioteca"
Edit this Advanced Search = "Editar aquesta cerca avançada"
edit_list = "Editar llista"
edit_list_fail = "Disculpeu, no podeu editar aquesta llista"
@@ -352,6 +365,7 @@ Fee = "Quota"
Feedback = "Feedback"
Feedback Email = "Correu de suggerències"
feedback_name = "Nom"
+File Description = "Descripció del fitxer"
Filter = "Filtre"
filter_tags = "Filtre d'etiquetes"
filter_wildcard = "Qualsevol"
@@ -484,6 +498,7 @@ in = "a"
In This Collection = "En aquesta col·lecció"
in_collection_label = "En la col·lecció:"
include_synonyms = "Ampliar resultats amb sinònims"
+Index Terms = "Indexs"
Indexes = "Indexos"
information = "Informació"
Institution = "Institution"
@@ -509,9 +524,11 @@ items_added_to_bookbag = "ítem(s) afegit a la cistella de llibres"
items_already_in_bookbag = "ítem(s) ja estan a la vostra cistella de llibres o no es poden afegir"
Journal = "Revista"
Journal Articles = "Articles de revista"
+Journal Info = "Informació de la publicació"
Journal Title = "Títol de la revista"
Journals = "Revistes"
Jump to = "Anar a"
+just_cataloged = "Nou registre afegit"
Keyword = "Paraula clau"
Keyword Filter = "Keyword Filter"
Kit = "Paquet"
@@ -521,7 +538,19 @@ Last = "Últim"
Last Modified = "Última modicació"
Last Name = "Cognom"
less = "menys"
+libphonenumber_invalid = "Telèfon invàlid"
+libphonenumber_invalidcountry = "Prefixe de país invàlid"
+libphonenumber_invalidregion = "Codi de regió invàlid:"
+libphonenumber_notanumber = "El text no sembla un número de telèfon"
+libphonenumber_toolong = "El text es massa llarg per a ser un número de telèfon"
+libphonenumber_tooshort = "El text es massa curt per a ser un número de telèfon"
+libphonenumber_tooshortidd = "Número de telèfon massa curt després del IDD"
Library = "Biblioteca"
+Library Card = "Carnet de la biblioteca"
+Library Card Deleted = "Carnet de la biblioteca esborrat"
+Library Card Name = "Nom del carnet de la biblioteca"
+Library Cards = "Carnets de la biblioteca"
+Library Cards Disabled = "Carnet de la biblioteca deshabilitat"
Library Catalog Password = "Contrasenya del Catàleg de la Biblioteca"
Library Catalog Profile = "Perfil del Catàleg de la Biblioteca"
Library Catalog Record = "Registre del Catàleg de la Biblioteca"
@@ -557,6 +586,7 @@ map_results_label = "En aquesta localització:"
Maps = "Mapes"
Media Format = "Format Media"
medium = "Mig"
+MeSH Terms = "Terms MeSH"
Message = "Missatge"
Message From Sender = "Missatge del remitent"
Metadata Prefix = "Metadata Prefix"
@@ -669,6 +699,7 @@ Page not found. = "Pàgina no trobada."
Password = "Contrasenya"
Password Again = "Contrasenya un altre cop"
Password cannot be blank = "La contrasenya no pot estar en blanc"
+password_error_invalid = "Nova contrassenya no vàlida (ex. conté caracters no vàlids)"
password_error_not_unique = "La constrasenya no s'ha canviat"
password_maximum_length = "Longitut màxima de la contrasenya %%maxlength%% caracters"
password_minimum_length = "El password ha tenor almenys %%minlength%% caracters"
@@ -706,13 +737,17 @@ pronounced = "pronunciat"
Provider = "Proveïdor"
Public = "Públic"
Publication = "Publicació"
+Publication Date = "Data de publicació"
Publication Frequency = "Periodicitat de publicació"
Publication Information = "Informació de la publicació"
Publication Type = "Tipologia de la publicació"
+Publication Year = "Any de publicacio"
Publication_Place = "Lloc de publicació"
Published = "Publicat"
Published in = "Publicat a"
Publisher = "Editor"
+Publisher Information = "Informació de l'editor"
+Publisher Permissions = "Permisos dels editors"
QR Code = "Codi QR"
qrcode_hide = "Amagar codi QR"
qrcode_show = "Mostrar codi QR"
@@ -841,6 +876,7 @@ sort_title = "Títol"
sort_year = "Data Descendent"
sort_year asc = "Data Ascendent"
Source = "Font"
+Source Title = "Títol font"
spell_expand_alt = "Ampliar cerca"
spell_suggest = "Alternatives de cerca"
Staff View = "Visualització del personal"
@@ -850,20 +886,29 @@ Start Page = "Pàgina d’inici"
starting from = "començant des de"
Status = "Estat"
status_unknown_message = "Comprovació en temps real no disponible"
+Storage Retrieval Requests = "Peticions al magatzem"
storage_retrieval_request_available = "Disponible per recollir"
+storage_retrieval_request_cancel = "Cancelar peticions al magatzem"
+storage_retrieval_request_cancel_all = "Cancelar totes les peticions al magatzem"
storage_retrieval_request_cancel_fail = "La petició no es pot cancel·lar. Si us plau, contacteu amb el taulell de préstec."
+storage_retrieval_request_cancel_selected = "Cancelar les peticions seleccionades al magatzem"
storage_retrieval_request_cancel_success = "La vostra petició s’ha cancel·lat correctament"
storage_retrieval_request_cancel_success_items = "petició(ns) s’han cancel·lat correctament"
storage_retrieval_request_canceled = "Cancelat"
+storage_retrieval_request_check_text = "Comprovar peticions al magatzem"
storage_retrieval_request_comments = "Comentaris"
storage_retrieval_request_date_invalid = "Introduïu una data vàlida"
storage_retrieval_request_date_past = "Introduïu una data futura"
+storage_retrieval_request_empty_selection = "No s' han seleccionat peticions al magatzem"
+storage_retrieval_request_error_blocked = "No tens permís per demanar aquest exemplar al magatzem"
storage_retrieval_request_error_fail = "Ha fallat la vostra petició. Contacteu amb el taulell de préstec per sol·licitar ajuda"
storage_retrieval_request_invalid_pickup = "Heu introduït una localització de recollida no vàlida. Torneu-ho a intentar"
storage_retrieval_request_issue = "Data"
storage_retrieval_request_place_fail_missing = "Ha fallat la vostra petició. Algunes dades s’han perdut. Contacteu amb el taulell de circulació per sol·licitar ajuda."
storage_retrieval_request_place_success = "Petició correcta"
+storage_retrieval_request_place_text = "Solicitar una petició al magatzem"
storage_retrieval_request_processed = "Processat"
+storage_retrieval_request_profile_html = "Per fer una petició al magatzem, demani el carnet de la biblioteca."
storage_retrieval_request_reference = "Referència"
storage_retrieval_request_selected_item = "Registres seleccionas"
storage_retrieval_request_submit_text = "Solicitar lloc"
@@ -872,6 +917,7 @@ storage_retrieval_request_year = "Any"
Subcollection = "Subcol·lecció"
Subject = "Matèria"
Subject Area = "Àrea temàtica"
+Subject Geographic = "Matèria geogràfica"
Subject Recommendations = "Recomanacions de matèria"
Subject Terms = "Matèria"
Subject(s) = "Matèria(es)"
@@ -936,6 +982,7 @@ total_resources = "Recursos total"
total_saved_items = "Registres total guardats"
total_tags = "Etiquetes totals"
total_users = "Usuaris totals"
+Transliterated Title = "Títol transliterat"
tree_search_limit_reached_html = "La seva cerca ha retornat massa registres per veure'ls a l'arbre de col·leccions. Veure els primers %%limit%% exemplars. Per una cerca completa cliqueu aquí."
unique_tags = "Etiquetes úniques"
University Library = "Biblioteca universitària"
@@ -949,6 +996,7 @@ Use instead = "Utilitzeu enlloc de"
User Account = "Compte de l’usuari"
Username = "Nom d’usuari"
Username cannot be blank = "El nom d’usuari no pot estar en blanc"
+Username is already in use in another library card = "L' usuari ja està en ús."
VHS = "VHS"
Video = "Video"
Video Clips = "Video Clips"
@@ -986,6 +1034,7 @@ You do not have any fines = "No teniu cap sanció"
You do not have any holds or recalls placed = "No teniu cap reserva o reclamació"
You do not have any interlibrary loan requests placed = "No has fet cap petició de prèstec interbibliotecari"
You do not have any items checked out = "No teniu cap exemplar prestat"
+You do not have any library cards = "No té carnet de la biblioteca"
You do not have any saved resources = "No teniu cap recurs guardat"
You do not have any storage retrieval requests placed = "You do not have any storage retrieval requests placed"
You must be logged in first = "Abans heu d’iniciar sessió"
@@ -1002,4 +1051,4 @@ Your search terms = "Termes de cerca"
Your Tags = "Etiquetes"
your_match_would_be_here = "La teva cerca hauria d'estar aquí."
Zip = "Zip"
-zoom = "Ampliar"
\ No newline at end of file
+zoom = "Ampliar"
diff --git a/languages/cs.ini b/languages/cs.ini
index cd5b258c1e3..3a48f5478eb 100644
--- a/languages/cs.ini
+++ b/languages/cs.ini
@@ -1,8 +1,11 @@
; Translation: opensource.knihovna.cz, Michal Denár, Josef Moravec, last updated 18.12.2012
Abstract = "Abstrakt"
Access = "Přístup"
+Access URL = "Pøístupová URL adresa"
+Accession Number = "Pøístupové èíslo"
Account = "Účet"
Add = "Přidat"
+Add a Library Card = "Pøipojit další úèet"
Add a Note = "Přidat poznámku"
Add Tag = "Přidat tag"
Add Tags = "Přidat tagy"
@@ -42,11 +45,14 @@ Advanced Search = "Pokročilé vyhledávání"
advSearchError_noRights = "Bohužel nemáte oprávnění upravovat toto vyhledávání. Možná došlo k automatickému odhlášení po delší nečinnosti."
advSearchError_notAdvanced = "Vyhledávání, které chcete upravit, není pokročilé vyhledávání."
advSearchError_notFound = "Požadované vyhledávání nebylo nalezeno."
+ajaxview_label_information = "Informace"
+ajaxview_label_tools = "Nástroje"
All = "Vše"
All Fields = "Vše"
All Pages Loaded = "Všechny stránky nahrány"
All Text = "Vše"
alphabrowse_matches = "Výsledky"
+alphabrowselink_html = "Procházet záznamy podle %%index%% od %%from%%."
An error has occurred = "Došlo k chybě"
An error occurred during execution; please try again later. = "Vyskytla se chyba, zkuste to znovu později."
AND = "AND"
@@ -74,6 +80,7 @@ Auto configuration is currently disabled = "Automatická konfigurace je nyní vy
auto_configure_description = "Pokud je toto nová instalace, můžete se pokusit odstranit tento problém použitím automatické konfigurace VuFindu."
auto_configure_disabled = "Automatická konfigurace je vypnutá."
auto_configure_title = "Automatická konfigurace"
+Availability = "Dostupnost"
Available = "Dostupné"
Available Functionality = "Dostupné funkce"
Awards = "Ocenění"
@@ -194,11 +201,13 @@ Company/Entity = "Korporace"
Configuration = "Nastavení"
confirm_delete = "Chcete je smazat?"
confirm_delete_brief = "Smazat položku?"
+confirm_delete_library_card_brief = "Odpojit úèet?"
+confirm_delete_library_card_text = "Opravdu chcete odpojit tento úèet?"
confirm_delete_list_brief = "Smazat seznam?"
confirm_delete_list_text = "Opravdu chcete smazat tento seznam?"
confirm_delete_tags_brief = "Odstranit tagy"
-confirm_dialog_no = "Zrušit"
-confirm_dialog_yes = "Potvrdit"
+confirm_dialog_no = "Ne"
+confirm_dialog_yes = "Ano"
confirm_hold_cancel_all_text = "Chcete zrušit všechny vaše požadavky?"
confirm_hold_cancel_selected_text = "Chcete zrušit vybrané požadavky?"
confirm_ill_request_cancel_all_text = "Opravdu chcete zrušit všechny požadavky na meziknihovní výpůjčky?"
@@ -208,9 +217,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Opravdu chcete zrušit vše
confirm_storage_retrieval_request_cancel_selected_text = "Opravdu chcete zrušit vybrané požadavky na dokumenty ze skladu?"
conjunction_or = "nebo"
Contents = "Obsah"
+Contributing Source = "Pøispívající zdroj"
Contributors = "Přispěvatelé"
Copies = "Jednotky"
Copy = "Jednotka"
+Copyright = "Copyright"
Corporate Author = "Korporativní autor"
Country = "Země"
Course = "Kurz"
@@ -248,12 +259,14 @@ Detailed View = "Podrobnosti"
Details = "Detaily"
Displaying the top = "Zobrazuji nejrelevantnější výsledky"
Document Inspector = "Inspekce dokumentu"
+Document Type = "Druh dokumentu"
DOI = "DOI"
Due = "do"
Due Date = "Půjčeno do"
DVD = "DVD"
eBook = "E-kniha"
Edit = "Upravit"
+Edit Library Card = "Úpravit úèet"
Edit this Advanced Search = "Upravit toto pokročilé vyhledávání"
edit_list = "Upravit seznam"
edit_list_fail = "Nemáte oprávnění upravovat seznam."
@@ -339,6 +352,7 @@ Fee = "Poplatek"
Feedback = "Váš názor"
Feedback Email = "E-mail"
feedback_name = "Jméno"
+File Description = "Popis souboru"
Filter = "Filtr"
filter_tags = "Filtrovat tagy"
filter_wildcard = "Libovolný"
@@ -471,6 +485,7 @@ in = "v poli"
In This Collection = "Zúžit v rámci této sbírky"
in_collection_label = "Sbírka:"
include_synonyms = "Rozšířit výsledky pomocí synonym"
+Index Terms = "Témata"
Indexes = "Rejstříky"
information = "Informace"
Institution = "Instituce"
@@ -496,9 +511,11 @@ items_added_to_bookbag = "položek vloženo do košíku"
items_already_in_bookbag = "položka(y) již máte v košíku nebo je nelze z nějakého jiného důvodu vložit."
Journal = "Časopis"
Journal Articles = "Články z časopisů"
+Journal Info = "Info o èasopise"
Journal Title = "Název časopisu"
Journals = "Časopisy"
Jump to = "Přejít na"
+just_cataloged = "Novì pøidané"
Keyword = "Klíčové slovo"
Keyword Filter = "Upřesnit podle"
Kit = "Souprava"
@@ -508,7 +525,19 @@ Last = "Poslední"
Last Modified = "Naposledy změněno"
Last Name = "Příjmení"
less = "méně"
+libphonenumber_invalid = "Telefonní èíslo je zadáno chybnì"
+libphonenumber_invalidcountry = "Chybné pøedèíslí zemì"
+libphonenumber_invalidregion = "Chybný kód oblasti:"
+libphonenumber_notanumber = "Vložený øetìzec nemá podobu telefonního èísla"
+libphonenumber_toolong = "Vložený øetìzec je pøíliš dlouhý na telefonní èíslo"
+libphonenumber_tooshort = "Vložený øetìzec je pøíliš krátky na telefonní èíslo"
+libphonenumber_tooshortidd = "Telefonní èíslo je pøíliš krátké"
Library = "Knihovna"
+Library Card = "Ètenáøský úèet"
+Library Card Deleted = "Propojení bylo odstranìno"
+Library Card Name = "Název úètu"
+Library Cards = "Ètenáøské úèty"
+Library Cards Disabled = "Propojování více ètenáøských úètù není povoleno"
Library Catalog Password = "Heslo pro katalog knihovny"
Library Catalog Profile = "Profil v katalogu knihovny"
Library Catalog Record = "Záznam z katalogu"
@@ -544,6 +573,7 @@ map_results_label = "Zde:"
Maps = "Mapy"
Media Format = "Formát média"
medium = "Médium"
+MeSH Terms = "Výrazy ze slovníku MeSH"
Message = "Zpráva"
Message From Sender = "Zpráva od odesílatele"
Metadata Prefix = "Prefix metadat"
@@ -563,9 +593,9 @@ Multiple Call Numbers = "Více signatur"
Multiple Locations = "Více umístění"
Musical Score = "Hodnocení"
My Favorites = "Oblíbené"
-My Fines = "Vaše upomínky"
-My Holds = "Vaše rezervace"
-My Profile = "Váš profil"
+My Fines = "Poplatky"
+My Holds = "Rezervace"
+My Profile = "Profil"
Narrow Search = "Upřesnit hledání"
navigate_back = "Zpět"
Need Help? = "Hledáte pomoc?"
@@ -656,6 +686,7 @@ Page not found. = "Stránka nenalezena"
Password = "Heslo"
Password Again = "Heslo (pro kontrolu)"
Password cannot be blank = "Heslo nesmí být prázdné"
+password_error_invalid = "Nové heslo není platné (napø. obsahuje nepovolené znaky)"
password_error_not_unique = "Heslo nebylo změněno"
password_maximum_length = "Heslo může být dlouhé maximálně %%maxlength%% znaků"
password_minimum_length = "Heslo musí být dlouhé alespoň %%minlength%% znaků"
@@ -693,13 +724,17 @@ pronounced = "výslovnost:"
Provider = "Poskytovatel"
Public = "Veřejný"
Publication = "Publikace"
+Publication Date = "Datum vydání"
Publication Frequency = "Četnost vydávání"
Publication Information = "Informace o vydání"
Publication Type = "Způsob vydávání"
+Publication Year = "Rok vydání"
Publication_Place = "Místo vydání"
Published = "Vydáno"
Published in = "Vydáno v"
Publisher = "Vydavatel"
+Publisher Information = "Informace o vydavateli"
+Publisher Permissions = "Vydavatelská práva"
QR Code = "QR kód"
qrcode_hide = "Skrýt QR kód"
qrcode_show = "Zobrazit QR kód"
@@ -828,6 +863,7 @@ sort_title = "Název"
sort_year = "Podle data sestupně"
sort_year asc = "Podle data vzestupně"
Source = "Zdroj"
+Source Title = "Název zdroje"
spell_expand_alt = "Rozšířit vyhledávání"
spell_suggest = "Alternativní vyhledávání"
Staff View = "UNIMARC/MARC"
@@ -868,6 +904,7 @@ storage_retrieval_request_year = "Rok"
Subcollection = "Část sbírky"
Subject = "Téma"
Subject Area = "Předmětová oblast"
+Subject Geographic = "Geografické téma"
Subject Recommendations = "Doporučená témata"
Subject Terms = "Témata"
Subject(s) = "Témata"
@@ -932,6 +969,7 @@ total_resources = "Celkem zdrojů"
total_saved_items = "Celkem uložených položek"
total_tags = "Celkem tagů"
total_users = "Celkem uživatelů"
+Transliterated Title = "Transliterovaný název"
tree_search_limit_reached_html = "Na váš dotaz bylo nalezeno příliš mnoho výsledků, proto je nebylo možné všechny zobrazit ve stromové struktuře. Bylo zobrazeno pouze prvních %%limit%% položek. Pro zobrazení všech výsledků klikněte zde."
unique_tags = "Unikátní tagy"
University Library = "Univerzitní knihovna"
@@ -945,6 +983,7 @@ Use instead = "Použít místo"
User Account = "Uživatelský účet"
Username = "Uživatelské jméno"
Username cannot be blank = "Uživatelské jméno musí být vyplněno"
+Username is already in use in another library card = "Uživatelské jméno již je použito u jiného ètenáøského úètu"
VHS = "VHS"
Video = "Video"
Video Clips = "Video klipy"
@@ -982,6 +1021,7 @@ You do not have any fines = "Nemáte žádné upomínky"
You do not have any holds or recalls placed = "Nemáte žádné rezervace ani objednávky"
You do not have any interlibrary loan requests placed = "Nemáte žádné nevyřízené požadavky na meziknihovní výpůjčky"
You do not have any items checked out = "Nemáte žádné výpůjčky"
+You do not have any library cards = "Nemáte žádné propojené ètenáøské úèty"
You do not have any saved resources = "Nemáte uloženy žádné zdroje."
You do not have any storage retrieval requests placed = "Nemáte žádné nevyřízené požadavky na vyzvednutí ze skladu"
You must be logged in first = "Nejprve se musíte přihlásit."
@@ -998,4 +1038,4 @@ Your search terms = "Vyhledávané termíny"
Your Tags = "Vaše tagy"
your_match_would_be_here = "Zadaný výraz by se nacházel zde, pokud by v databázi existoval."
Zip = "PSČ"
-zoom = "Přiblížit"
\ No newline at end of file
+zoom = "Přiblížit"
diff --git a/languages/cy.ini b/languages/cy.ini
index fcc1fa02665..916aea09b87 100644
--- a/languages/cy.ini
+++ b/languages/cy.ini
@@ -3,8 +3,11 @@
;Welsh = "Cymraeg"
Abstract = "Crynodeb"
Access = "Mynediad"
+Access URL = "URL mynediad"
+Accession Number = "Cyfeirnod"
Account = "Cyfrif"
Add = "Ychwanegu"
+Add a Library Card = "Ychwanegu Cerdyn Llyfrgell"
Add a Note = "Ychwanegu Nodyn"
Add Tag = "Ychwanegu Tag"
Add Tags = "Ychwanegu Tagiau"
@@ -44,11 +47,14 @@ Advanced Search = "Chwiliad Uwch"
advSearchError_noRights = "Mae'n ddrwg gennym, ond nid oes hawl gennych olygu'r chwiliad hwnnw. Efallai bod eich sesiwn pori wedi dod i ben?"
advSearchError_notAdvanced = "Nid yw'r chwiliad yr ydych wedi ceisio ei olygu'n chwiliad uwch"
advSearchError_notFound = "Ni ddaethpwyd o hyd i'r chwiliad a geisiwyd"
+ajaxview_label_information = "Gwybodaeth"
+ajaxview_label_tools = "Offer"
All = "Popeth"
All Fields = "Pob Maes"
All Pages Loaded = "Llwythwyd yr holl dudalennau"
All Text = "Yr holl destun"
alphabrowse_matches = "Canlyniadau"
+alphabrowselink_html = "Pori cofnodion ar sail %%index%% gan ddechrau o"
An error has occurred = "Mae gwall wedi digwydd"
An error occurred during execution; please try again later. = "Bu gwall wrth gyflawni'r weithred; ceisiwch eto nes ymlaen."
AND = "AND"
@@ -76,6 +82,7 @@ Auto configuration is currently disabled = "Ar hyn o bryd, mae awto-osod wedi'i
auto_configure_description = "Os yw hyn newydd ei osod, mae'n bosibl y byddwch yn gallu trwsio'r broblem trwy ddefnyddio arf Awto-osod VuFind"
auto_configure_disabled = "Mae awto-osod wedi'i analluogi"
auto_configure_title = "Awto-osod"
+Availability = "Argaeledd"
Available = "Ar gael"
Available Functionality = "Swyddogaethau sydd ar Gael"
Awards = "Dyfarniadau"
@@ -196,6 +203,8 @@ Company/Entity = "Cwmni/Endid"
Configuration = "Gosodiadau"
confirm_delete = "Ydych chi'n siŵr eich bod am ddileu hwn?"
confirm_delete_brief = "Dileu Eitem?"
+confirm_delete_library_card_brief = "Dileu Cerdyn Llyfrgell?"
+confirm_delete_library_card_text = "Ydych chi'n sicr eich bod am ddileu'r cerdyn llyfrgell hwn?"
confirm_delete_list_brief = "Dileu Rhestr?"
confirm_delete_list_text = "Ydych chi'n siŵr eich bod am ddileu hwn?"
confirm_delete_tags_brief = "Dileu Tagiau"
@@ -210,9 +219,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Ydych chi'n dymuno canslo'c
confirm_storage_retrieval_request_cancel_selected_text = "Ydych chi'n dymuno canslo'r ceisiadau ar gyfer tynnu eitemau o'r storfa sydd wedi'u dewis?"
conjunction_or = "neu"
Contents = "Cynnwys"
+Contributing Source = "Ffynhonnell"
Contributors = "Cyfranwyr"
Copies = "Copïau"
Copy = "Copi"
+Copyright = "Hawlfraint"
Corporate Author = "Awdur Corfforaethol"
Country = "Gwlad"
Course = "Cwrs"
@@ -250,12 +261,14 @@ Detailed View = "Golwg Fanwl"
Details = "Golygfa Marc"
Displaying the top = "Arddangos y brig"
Document Inspector = "Archwilydd Dogfen"
+Document Type = "Math o Ddogfen"
DOI = "DOI"
Due = "Erbyn"
Due Date = "Dyddiad Cau"
DVD = "DVD"
eBook = "eLyfr"
Edit = "Golygu"
+Edit Library Card = "Golygu Cerdyn Llyfrgell"
Edit this Advanced Search = "Golygu'r Chwiliad Uwch hwn"
edit_list = "Golygu'r Rhestr"
edit_list_fail = "Mae'n ddrwg gennym, nid oes hawl gennych olygu'r rhestr hon"
@@ -341,6 +354,7 @@ Fee = "Fee"
Feedback = "Adborth"
Feedback Email = "E-bost Adborth"
feedback_name = "Enw"
+File Description = "Disgrifiad Ffeil"
Filter = "Hidlo"
filter_tags = "Hidlo Tagiau"
filter_wildcard = "Unrhyw Un"
@@ -473,6 +487,7 @@ in = "mewn"
In This Collection = "Yn y Casgliad Hwn"
in_collection_label = "Yng Nghasgliad:"
include_synonyms = "Ehangu'r canlyniadau gan ddefnyddio cyfystyron"
+Index Terms = "Termau Mynegeio"
Indexes = "Mynegeion"
information = "Gwybodaeth"
Institution = "Sefydliad"
@@ -498,9 +513,11 @@ items_added_to_bookbag = "eitem(au) wedi ei/eu hychwanegu i'ch Bag Llyfrau"
items_already_in_bookbag = "Eitem(au) naill ai yn eich Bag Llyfrau yn barod neu ni fedrwyd ei/eu hychwanegu"
Journal = "Cylchgrawn"
Journal Articles = "Erthyglau Cylchgrawn"
+Journal Info = "Gwybodaeth am Gyfnodolyn"
Journal Title = "Teitl y Cylchgrawn"
Journals = "Cylchgronau"
Jump to = "Ewch i"
+just_cataloged = "Newdd ei gatalogeiddio"
Keyword = "Allweddair"
Keyword Filter = "Hidlwr Allweddair"
Kit = "Cit"
@@ -510,7 +527,19 @@ Last = "Olaf"
Last Modified = "Dyddiad y Newid Diwethaf"
Last Name = "Cyfenw"
less = "llai"
+libphonenumber_invalid = "Rhif ffôn annilys"
+libphonenumber_invalidcountry = "Côd deialu gwlad annilys"
+libphonenumber_invalidregion = "Côd rhanbarth annilys"
+libphonenumber_notanumber = "Nid yw'n ymddangos bod y llinyn a nodwyd yn rhif ffôn"
+libphonenumber_toolong = "Mae'r llinyn a nodwyd yn rhy hir i fod yn rhif ffôn"
+libphonenumber_tooshort = "Mae'r llinyn a nodwyd yn rhy fyr i fod yn rhif ffôn"
+libphonenumber_tooshortidd = "Mae'r rhif ffôn ar ôl y rhif deialu rhyngwladol yn rhy fyr"
Library = "Llyfrgell"
+Library Card = "Cerdyn Llyfrgell"
+Library Card Deleted = "Cerdyn Llyfrgell Wedi'i Ddileu"
+Library Card Name = "Enw ar y Cerdyn Llyfrgell"
+Library Cards = "Cardiau Llyfrgell"
+Library Cards Disabled = "Cardiau Llyfrgell Wedi'u Hanalluogi"
Library Catalog Password = "Cyfrinair Catalog y Llyfrgell"
Library Catalog Profile = "Proffil Catalog y Llyfrgell"
Library Catalog Record = "Cofnod Catalog y Llyfrgell"
@@ -546,6 +575,7 @@ map_results_label = "Yn y lleoliad hwn:"
Maps = "Mapiau"
Media Format = "Fformat y Cyfrwng"
medium = "Canolig"
+MeSH Terms = "Termau MeSH"
Message = "Neges"
Message From Sender = "Neges gan yr Anfonwr"
Metadata Prefix = "Rhagddodiad Metadata"
@@ -658,6 +688,7 @@ Page not found. = "Ni ellir dod o hyd i'r dudalen."
Password = "Cyfrinair"
Password Again = "Cyfrinair Eto"
Password cannot be blank = "Ni all y cyfrinair fod yn wag"
+password_error_invalid = "Mae'r cyfrinair newydd yn annilys (e.e. mae'n cynnwys nodau annilys)"
password_error_not_unique = "Ni newidiwyd y cyfrinair"
password_maximum_length = "Ni all y cyfrinair fod yn hirach na %%maxlength%% nod"
password_minimum_length = "Rhaid i'r cyfrinair gynnwys o leiaf %%minlength%% nod"
@@ -695,13 +726,17 @@ pronounced = "ynganiad"
Provider = "Darparwr"
Public = "Cyhoeddus"
Publication = "Cyhoeddiad"
+Publication Date = "Dyddiad Cyhoeddi"
Publication Frequency = "Publication Frequency"
Publication Information = "Gwybodaeth cyhoeddi"
Publication Type = "Math o gyhoeddiad"
+Publication Year = "Blwyddyn Cyhoeddi"
Publication_Place = "Man cyhoeddi"
Published = "Cyhoeddwyd"
Published in = "Cyhoeddwyd yn"
Publisher = "Cyhoeddwr"
+Publisher Information = "Gwybodaeth am y Cyhoeddwr"
+Publisher Permissions = "Caniatâd y Cyhoeddwr"
QR Code = "Côd QR"
qrcode_hide = "Cuddio Cod QR"
qrcode_show = "Dangos Cod QR"
@@ -830,6 +865,7 @@ sort_title = "Teitl"
sort_year = "Dyddiad Trefn Ddisgynnol"
sort_year asc = "Dyddiad Trefn Esgynnol"
Source = "Ffynhonnell"
+Source Title = "Teitl y Ffynhonnell"
spell_expand_alt = "Ehangu'r Chwiliad"
spell_suggest = "Chwilio eraill"
Staff View = "Dangos Staff"
@@ -870,6 +906,7 @@ storage_retrieval_request_year = "Blwyddyn"
Subcollection = "Is-gasgliad"
Subject = "Pwnc"
Subject Area = "Maes Pwnc"
+Subject Geographic = "Pwnc Daearyddol"
Subject Recommendations = "Awgrymiadau Pwnc"
Subject Terms = "Termau Pwnc"
Subject(s) = "Pwnc / Pynciau"
@@ -934,6 +971,7 @@ total_resources = "Cyfanswm Adnoddau"
total_saved_items = "Cyfanswm Eitemau wedi'u Cadw"
total_tags = "Cyfanswm Tagiau"
total_users = "Cyfanswm Defnyddwyr"
+Transliterated Title = "Teitl Wedi'i Drawslythrennu"
tree_search_limit_reached_html = "Roedd gormod o ganlyniadau i'w dangos yn y goeden. Ond yn dangos y %%limit%% eitem gyntaf. I chwilio'r cyfan, cliciwch yma.""
unique_tags = "Tagiau Unigryw"
University Library = "Llyfrgell y Brifysgol"
@@ -947,6 +985,7 @@ Use instead = "Defnyddio yn lle"
User Account = "Cyfrif Defnyddiwr"
Username = "Enw Defnyddiwr"
Username cannot be blank = "Ni all Enw Defnyddiwr fod yn wag"
+Username is already in use in another library card = "Mae cerdyn llyfrgell arall eisoes yn defnyddio'r enw defnyddiwr hwnnw"
VHS = "VHS"
Video = "Fideo"
Video Clips = "Clipiau Fideo"
@@ -984,6 +1023,7 @@ You do not have any fines = "Nid oes gennych unrhyw ddirwyon"
You do not have any holds or recalls placed = "Nid ydych wedi gosod unrhyw ddaliadau neu adalwadau"
You do not have any interlibrary loan requests placed = "Nid oes gennych yr un cais am Fenthyciad Rhwnglyfrgellol"
You do not have any items checked out = "Nid oes gennych unrhyw eitemau ar fenthyg"
+You do not have any library cards = "Nid oes gennych unrhyw gardiau llyfrgell"
You do not have any saved resources = "Nid oes gennych unrhyw adnoddau wedi'u cadw"
You do not have any storage retrieval requests placed = "Nid oes gennych yr un cais am Dynnu Eitem o'r Storfa"
You must be logged in first = "Rhaid i chi fewngofnodi yn gyntaf"
@@ -1000,4 +1040,4 @@ Your search terms = "Fy Eitemau Chwilio"
Your Tags = "Tagiau"
your_match_would_be_here = "Byddai'r gair yma."
Zip = "Zip"
-zoom = "Chwyddo"
\ No newline at end of file
+zoom = "Chwyddo"
diff --git a/languages/da.ini b/languages/da.ini
index 7ba3bcd0b52..00e6d462af5 100644
--- a/languages/da.ini
+++ b/languages/da.ini
@@ -678,4 +678,4 @@ Your Lists = "Dine lister"
Your Profile = "Din profil"
Your search terms = "Dine søgeord"
Your Tags = "Dine Tags"
-Zip = "Zip ø"
\ No newline at end of file
+Zip = "Zip ø"
diff --git a/languages/de.ini b/languages/de.ini
index f3d54509217..e53ebbf1ee4 100644
--- a/languages/de.ini
+++ b/languages/de.ini
@@ -2,8 +2,11 @@
;German = Deutsch
Abstract = "Abstract"
Access = "Zugangseinschränkungen"
+Access URL = "Zugangs-URL"
+Accession Number = "Dokumentencode"
Account = "Konto"
Add = "Hinzufügen"
+Add a Library Card = "Bibliotheksausweis hinzufügen"
Add a Note = "Bemerkung hinzufügen"
Add Tag = "Tag hinzufügen"
Add Tags = "Tags hinzufügen"
@@ -19,7 +22,7 @@ add_favorite_suffix = "zu den Favoriten hinzufügen"
add_list_fail = "Fehler: Liste wurde nicht erstellt"
add_other_libraries = "Datensätze anderer Bibliotheken berücksichtigen"
add_search = "Suchfeld hinzufügen"
-add_search_group = "Suchkriterium hinzufügen"
+add_search_group = "Suchgruppe hinzufügen"
add_tag_error = "Fehler: Tags wurden nicht gespeichert"
add_tag_note = "Leerschläge bewirken einen neuen Tag. Verwenden Sie Anführungszeichen für Begriffe mit mehreren Wörtern."
add_tag_success = "Tags gespeichert"
@@ -43,11 +46,14 @@ Advanced Search = "Erweiterte Suche"
advSearchError_noRights = "Tut mir Leid, aber Sie dürfen die Suche nicht ändern. Vielleicht ist Ihre Sitzung abgelaufen?"
advSearchError_notAdvanced = "Die angeforderte Suche ist keine erweiterte Suche und kann nicht editiert werden."
advSearchError_notFound = "Die angeforderte Suche wurde nicht gefunden."
+ajaxview_label_information = "Information"
+ajaxview_label_tools = "Werkzeuge"
All = "Alles"
All Fields = "Alle Felder"
All Pages Loaded = "Alle Seiten geladen"
All Text = "Alle Textfelder und Volltext"
alphabrowse_matches = "Ergebnis"
+alphabrowselink_html = "Einträge nach %%index%% ansehen ab %%from%%."
An error has occurred = "Es ist ein Fehler aufgetreten"
An error occurred during execution; please try again later. = "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal."
AND = "UND"
@@ -75,6 +81,7 @@ Auto configuration is currently disabled = "Autokonfiguration ist momentan nicht
auto_configure_description = "Falls das eine Neuinstallation ist, können Sie den Fehler ev. beheben indem Sie das Autokonfigurations-Tool von VuFind benutzen."
auto_configure_disabled = "Autokonfiguration ist deaktiviert."
auto_configure_title = "Autokonfiguration"
+Availability = "Verfügbarkeit"
Available = "Verfügbar"
Available Functionality = "Verfügbare Operationen"
Awards = "Auszeichnungen"
@@ -195,6 +202,8 @@ Company/Entity = "Firma/Körperschaft"
Configuration = "Konfiguration"
confirm_delete = "Wollen Sie wirklich löschen?"
confirm_delete_brief = "Löschen?"
+confirm_delete_library_card_brief = "Bibliotheksausweis löschen?"
+confirm_delete_library_card_text = "Wollen Sie den Bibliotheksausweis wirklich löschen?"
confirm_delete_list_brief = "Liste löschen?"
confirm_delete_list_text = "Wollen Sie diese Liste wirklich löschen?"
confirm_delete_tags_brief = "Tags löschen"
@@ -209,9 +218,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Möchten Sie alle ihre Maga
confirm_storage_retrieval_request_cancel_selected_text = "Möchten Sie die ausgewählten Magazinbestellungen widerrufen?"
conjunction_or = "oder"
Contents = "Inhalte"
+Contributing Source = "Originalquelle"
Contributors = "Weitere Verfasser"
Copies = "Exemplare"
Copy = "Exemplar"
+Copyright = "Copyright"
Corporate Author = "Körperschaft"
Country = "Land"
Course = "Semester"
@@ -231,7 +242,7 @@ date_to = "Bis"
date_year_placeholder = "J"
Days = "Tagen"
Debug Information = "Debug Information"
-del_search = "Suchkriterium entfernen"
+del_search = "Suchgruppe entfernen"
Delete = "Löschen"
delete_all = "Alles löschen"
delete_comment_failure = "Der Kommentar konnte nicht gelöscht werden."
@@ -249,12 +260,14 @@ Detailed View = "Detailansicht"
Details = "Details"
Displaying the top = "Angezeigt werden die ersten"
Document Inspector = "Dokumentprüfer"
+Document Type = "Publikationsart"
DOI = "DOI"
Due = "Rückgabe bis"
Due Date = "Rückgabedatum"
DVD = "DVD"
eBook = "E-Book"
Edit = "Bearbeiten"
+Edit Library Card = "Bibliotheksausweis bearbeiten"
Edit this Advanced Search = "Erweiterte Suche bearbeiten"
edit_list = "Liste bearbeiten"
edit_list_fail = "Sie sind leider nicht berechtigt, diese Liste zu bearbeiten"
@@ -340,6 +353,7 @@ Fee = "Gebühr"
Feedback = "Feedback"
Feedback Email = "E-Mail Feedback"
feedback_name = "Name"
+File Description = "Dateibeschreibung"
Filter = "Filter"
filter_tags = "Tags filtern"
filter_wildcard = "alles"
@@ -472,6 +486,7 @@ in = "in"
In This Collection = "In diesem Bestand"
in_collection_label = "In Bestand:"
include_synonyms = "Ergebnisse erweitern mittels Synonymen"
+Index Terms = "Index Begriffe"
Indexes = "Inhaltsverzeichnis"
information = "Information"
Institution = "Institution"
@@ -497,9 +512,11 @@ items_added_to_bookbag = "Datensatz/Datensätze der Zwischenablage hinzugefügt"
items_already_in_bookbag = "Datensatz/Datensätze bereits in der Zwischenablage vorhanden und/oder konnte(n) nicht hinzugefügt werden"
Journal = "Zeitschrift"
Journal Articles = "Zeitschriftenartikel"
+Journal Info = "Info zur Zeitschrift"
Journal Title = "Zeitschriftentitel"
Journals = "Zeitschriften"
Jump to = "Springe nach"
+just_cataloged = "Soeben neu katalogisiert"
Keyword = "Stichwort"
Keyword Filter = "Stichwortfilter"
Kit = "Paket"
@@ -509,7 +526,19 @@ Last = "Letzte"
Last Modified = "Letzte Änderung"
Last Name = "Nachname"
less = "weniger"
+libphonenumber_invalid = "Ungültige Telefonnummer"
+libphonenumber_invalidcountry = "Ungültige Landesvorwahl"
+libphonenumber_invalidregion = "Ungültige Vorwahl:"
+libphonenumber_notanumber = "Die Eingabe scheint keine Telefonnummer zu sein"
+libphonenumber_toolong = "Die Eingabe ist zu lang für eine Telefonnummer"
+libphonenumber_tooshort = "Die Eingabe ist zu kurz für eine Telefonnumer"
+libphonenumber_tooshortidd = "Die Telefonnumer nach der internationalen Direktwahl ist zu kurz"
Library = "Bibliothek"
+Library Card = "Bibliotheksausweis"
+Library Card Deleted = "Bibliotheksausweis gelöscht"
+Library Card Name = "Name des Bibliotheksausweises"
+Library Cards = "Bibliotheksausweise"
+Library Cards Disabled = "Bibliotheksausweis inaktiviert"
Library Catalog Password = "Passwort Bibliothekskatalog"
Library Catalog Profile = "Benutzerangaben Bibliothekskatalog"
Library Catalog Record = "Datensatz Bibliothekskatalog"
@@ -545,6 +574,7 @@ map_results_label = "An diesem Standort:"
Maps = "Karten2"
Media Format = "Medienformat"
medium = "Medium"
+MeSH Terms = "MeSH Schlagworte"
Message = "Nachricht"
Message From Sender = "Nachricht vom Sender"
Metadata Prefix = "Metadaten Präfix"
@@ -657,6 +687,7 @@ Page not found. = "Seite nicht gefunden."
Password = "Passwort"
Password Again = "Passwort wiederholen"
Password cannot be blank = "Das Passwort darf nicht leer sein"
+password_error_invalid = "Ungültiges neues Passwort (enthält z.B. ungültige Zeichen)"
password_error_not_unique = "Das Passwort wurde nicht geändert"
password_maximum_length = "Die maximale Länge des Passowrts beträgt %%maxlength%% Zeichen"
password_minimum_length = "Die minimale Länge des Passowrts beträgt %%minlength%% Zeichen"
@@ -694,13 +725,17 @@ pronounced = "Aussprache"
Provider = "Provider"
Public = "Öffentlich"
Publication = "Verlag"
+Publication Date = "Publikationsdatum"
Publication Frequency = "Erscheinungshäufigkeit"
Publication Information = "Publikationsangaben"
Publication Type = "Publikationsart"
+Publication Year = "Publikationsjahr"
Publication_Place = "Erscheinungsort"
Published = "Veröffentlicht"
Published in = "Veröffentlicht in"
Publisher = "Verlag"
+Publisher Information = "Verlagsinformationen"
+Publisher Permissions = "Verlagsgenehmigungen"
QR Code = "QR-Code"
qrcode_hide = "QR-Code ausblenden"
qrcode_show = "QR-Code einblenden"
@@ -783,7 +818,7 @@ Search Tips = "Suchtipps"
Search Tools = "Suchwerkzeuge"
Search Type = "Suchmodus"
search_AND = "Mit ALLEN Wörtern"
-search_groups = "Suchkriterium"
+search_groups = "Suchgruppe"
search_match = "Suchbedingung"
search_NOT = "OHNE die Wörter"
search_OR = "Mit IRGENDEINEM der Wörter"
@@ -829,6 +864,7 @@ sort_title = "Titel"
sort_year = "Nach Datum, absteigend"
sort_year asc = "Nach Datum, aufsteigend"
Source = "Quelle"
+Source Title = "Name der Quelle"
spell_expand_alt = "Erweiterte Suche"
spell_suggest = "Andere Suchmöglichkeiten"
Staff View = "Internformat"
@@ -869,6 +905,7 @@ storage_retrieval_request_year = "Jahr"
Subcollection = "Teilbestand"
Subject = "Schlagwort"
Subject Area = "Schlagwortumfeld"
+Subject Geographic = "Geographisches Schlagwort"
Subject Recommendations = "Schlagwortempfehlung"
Subject Terms = "Schlagwörter"
Subject(s) = "Schlagwörter"
@@ -933,6 +970,7 @@ total_resources = "Total Datensätze"
total_saved_items = "Total gespeicherter Objekte"
total_tags = "Total Tags"
total_users = "Total Benutzer"
+Transliterated Title = "Transliterierter Titel"
tree_search_limit_reached_html = "Ihr Suche ergab zuviele Treffer, um die gesamte Hierarchie anzeigen zu können. Es werden nur the ersten %%limit%% Treffer angezeigt. Für eine vollständige Suche klicken Sie hier."
unique_tags = "Einmalige Tags"
University Library = "Universitätsbibliothek"
@@ -946,6 +984,7 @@ Use instead = "Siehe unter"
User Account = "Persönliches Konto"
Username = "Benutzername"
Username cannot be blank = "Der Benutzername darf nicht leer sein"
+Username is already in use in another library card = "Der Benutzername ist bereits für einen anderen Bibliotheksausweis vergeben"
VHS = "VHS"
Video = "Video"
Video Clips = "Videoclips"
@@ -983,6 +1022,7 @@ You do not have any fines = "Es sind keine Gebühren auf Ihrem Bibliothekskonto"
You do not have any holds or recalls placed = "Es liegen keine Vormerkungen oder Bestellungen vor"
You do not have any interlibrary loan requests placed = "Sie haben keine offenen Fernleihanfragen"
You do not have any items checked out = "Sie haben nichts von uns ausgeliehen"
+You do not have any library cards = "Sie haben keine Bibliotheksausweise"
You do not have any saved resources = "Sie haben noch keine Daten gespeichert"
You do not have any storage retrieval requests placed = "Sie haben keine offenen Magazinbestellungen"
You must be logged in first = "Bitte loggen Sie sich zuerst ein"
@@ -999,4 +1039,4 @@ Your search terms = "Ihre Suchbegriffe"
Your Tags = "Ihre Tags"
your_match_would_be_here = "Ihr Treffer würde hier aufgelistet."
Zip = "PLZ, Ort"
-zoom = "Zoom"
\ No newline at end of file
+zoom = "Zoom"
diff --git a/languages/el.ini b/languages/el.ini
index 9dd0dbadf2a..c785c4f14da 100644
--- a/languages/el.ini
+++ b/languages/el.ini
@@ -3,8 +3,11 @@
;note_785_7 = "Συγχωνευμένο με" ; incomplete translation (en.ini was later revised)
Abstract = "Περίληψη"
Access = "Πρόσβαση"
+Access URL = "Σύνδεσμος πρόσβασης"
+Accession Number = "Αριθμός Καταχώρησης"
Account = "Λογαριασμός"
Add = "Προσθήκη"
+Add a Library Card = "Προσθήκη κάρτας βιβλιοθήκης"
Add a Note = "Προσθήκη σημείωσης"
Add Tag = "Προσθήκη ετικέτας"
Add Tags = "Προσθήκη ετικετών"
@@ -44,11 +47,14 @@ Advanced Search = "Σύνθετη αναζήτηση"
advSearchError_noRights = "Δεν μπορείτε να τροποποιήσετε την αναζήτηση (υπέρβαση χρόνου αναμονής;)"
advSearchError_notAdvanced = "Η αναζήτηση που προσπαθείτε να τροποποιήσετε δεν είναι σύνθετη"
advSearchError_notFound = "Δεν βρέθηκαν αποτελέσματα για την αναζήτησή σας"
+ajaxview_label_information = "Πληροφορίες"
+ajaxview_label_tools = "Εργαλεία"
All = "Όλα"
All Fields = "Όλα τα πεδία"
All Pages Loaded = "Η φόρτωση σελίδων ολοκληρώθηκε"
All Text = "Οπουδήποτε στο κείμενο"
alphabrowse_matches = "Αποτελέσματα"
+alphabrowselink_html = "Περιήγηση σε %%index%% ξεκινώντας από %%from%%."
An error has occurred = "Παρουσιάστηκε σφάλμα"
An error occurred during execution; please try again later. = "Παρουσιάστηκε σφάλμα κατά την εκτέλεση. Ξαναδοκιμάστε αργότερα."
AND = "AND"
@@ -76,6 +82,7 @@ Auto configuration is currently disabled = "Η αυτόματη παραμετρ
auto_configure_description = "Αν πρόκειται για νέα εγκατάσταση, ίσως μπορέστε να διορθώσετε αυτό το σφάλμα χρησιμοποιώντας το εργαλείο της αυτόματης παραμετροποίησης του VuFind."
auto_configure_disabled = "Η αυτόματη παραμετροποίηση απενεργοποιήθηκε."
auto_configure_title = "Αυτόματη παραμετροποίηση"
+Availability = "Διαθεσιμότητα"
Available = "Στη βιβλιοθήκη"
Available Functionality = "Διαθέσιμη λειτουργικότητα"
Awards = "Βραβεία"
@@ -196,6 +203,8 @@ Company/Entity = "Εταιρία/Οντότητα"
Configuration = "Παραμετροποίηση"
confirm_delete = "Σίγουρα θέλετε να διαγράψετε;"
confirm_delete_brief = "Να διαγραφεί το τεκμήριο;"
+confirm_delete_library_card_brief = "Διαγραφή κάρτας βιβλιοθήκης;"
+confirm_delete_library_card_text = "Θέλετε σίγουρα να διαγράψετε αυτή την κάρτα βιβλιοθήκης;"
confirm_delete_list_brief = "Να διαγραφεί η λίστα;"
confirm_delete_list_text = "Σίγουρα θέλετε να διαγράψετε αυτή τη λίστα;"
confirm_delete_tags_brief = "Διαγραφή ετικετών"
@@ -210,9 +219,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Θέλετε να ακυρ
confirm_storage_retrieval_request_cancel_selected_text = "Θέλετε να ακυρώσετε τα επιλεγμένα τρέχοντα αιτήματα ανάκτησης από αποθήκη;"
conjunction_or = "ή"
Contents = "Περιεχόμενα"
+Contributing Source = "Πηγή συνεισφοράς"
Contributors = "Συνεισφορές"
Copies = "Αντίγραφα"
Copy = "Αντίγραφο"
+Copyright = "Copyright"
Corporate Author = "Corporate συγγραφέας"
Country = "Χώρα"
Course = "Μάθημα"
@@ -250,12 +261,14 @@ Detailed View = "Λεπτομερής προβολή"
Details = "Λεπτομέρειες"
Displaying the top = "Εμφανίζονται τα πρώτα"
Document Inspector = "Επισκόπηση εγγράφου"
+Document Type = "Τύπος εγγράφου"
DOI = "DOI"
Due = "Επιστροφή"
Due Date = "Ημερομηνία επιστροφής"
DVD = "DVD"
eBook = "Ηλ. βιβλίο"
Edit = "Επεξεργασία"
+Edit Library Card = "Επεξεργασία κάρτας βιβλιοθήκης"
Edit this Advanced Search = "Τροποποίηση σύνθετης αναζήτησης"
edit_list = "Επεξεργασία λίστας"
edit_list_fail = "Δεν έχετε δικαίωμα να τροποποιήσετε τη λίστα"
@@ -341,6 +354,7 @@ Fee = "Χρέωση"
Feedback = "σχόλιά"
Feedback Email = "Email"
feedback_name = "Όνομα"
+File Description = "Περιγραφή αρχείου"
Filter = "Φίλτρο"
filter_tags = "Φιλτράρισμα ετικετών"
filter_wildcard = "Οτιδήποτε"
@@ -473,6 +487,7 @@ in = "σε"
In This Collection = "Σε αυτή τη συλλογή"
in_collection_label = "Στη συλλογή:"
include_synonyms = "Συμπερίληψη αποτελεσμάτων από συνώνυμα"
+Index Terms = "Όροι ευρετηρίου"
Indexes = "Ευρετήρια"
information = "Πληροφορίες"
Institution = "Πηγή"
@@ -498,9 +513,11 @@ items_added_to_bookbag = "τεκμήρια προστέθηκαν στο καλ
items_already_in_bookbag = "τεκμήρια ήδη περιέχονται στο καλάθι σας ή δεν είναι δυνατό να προστεθούν"
Journal = "Επιστημονικό περιοδικό"
Journal Articles = "Άρθρα περιοδικού"
+Journal Info = "Στοιχεία περιοδικού"
Journal Title = "Τίτλος περιοδικού"
Journals = "Επιστημονικά περιοδικά"
Jump to = "Μετάβαση σε"
+just_cataloged = "Μόλις καταλογογραφήθηκε"
Keyword = " λέξη-κλειδί "
Keyword Filter = "Περιορισμός με λέξη-κλειδί"
Kit = "Κιτ"
@@ -510,7 +527,19 @@ Last = "Τελευταία"
Last Modified = "Τελευταία τροποποίηση"
Last Name = "Επώνυμο"
less = "λιγότερα"
+libphonenumber_invalid = "Άκυρος τηλφεωνικός αριθμός"
+libphonenumber_invalidcountry = "Άκυρο πρόθεμα χώρας"
+libphonenumber_invalidregion = "Άκυρο πρόθεμα περιοχής"
+libphonenumber_notanumber = "Τηλεφωνικός αριθμός με ακατάλληλους χαρακτήρες"
+libphonenumber_toolong = "Τηλεφωνικός αριθμός με πάρα πολλά ψηφία"
+libphonenumber_tooshort = "Τηλεφωνικός αριθμός με πολύ λίγα ψηφία"
+libphonenumber_tooshortidd = "Τηλεφωνικός αριθμός με πολύ λίγα ψηφία μετά το πρόθεμα χώρας"
Library = "Βιβλιοθήκη"
+Library Card = "Κάρτα βιβλιοθήκης"
+Library Card Deleted = "Η κάρτα βιβλιοθήκης διαγράφηκε"
+Library Card Name = "Όνομα κάρτας βιβλιοθήκης"
+Library Cards = "Κάρτες βιβλιοθήκης"
+Library Cards Disabled = "Οι κάρτες βιβλιοθήκης απενεργοποιήθηκαν"
Library Catalog Password = "Κωδικός καταλόγου βιβλιοθήκης"
Library Catalog Profile = "Λογαριασμός καταλόγου βιβλιοθήκης"
Library Catalog Record = "Εγγραφή καταλόγου βιβλιοθήκης"
@@ -546,6 +575,7 @@ map_results_label = "Σε αυτή την τοποθεσία:"
Maps = "Χάρτες"
Media Format = "Μορφή μέσου"
medium = " Μέτριο μέγεθος "
+MeSH Terms = "Ιατρικοί όροι (MeSH)"
Message = "Μήνυμα"
Message From Sender = "Μήνυμα από αποστολέα"
Metadata Prefix = "Πρόθεμα μεταδεδομένων"
@@ -658,6 +688,7 @@ Page not found. = "Η σελίδα δεν βρέθηκε."
Password = "Κωδικός"
Password Again = "Κωδικός ξανά"
Password cannot be blank = "Ο κωδικός δεν μπορεί να είναι κενός"
+password_error_invalid = "Ο νέος κωδικός πρόσβασης δεν είναι έγκυρος (πχ περιέχει μή έγκυρους χαρακτήρες)"
password_error_not_unique = "Ο κωδικός δεν άλλαξε"
password_maximum_length = "Ο μέγιστος αριθμός χαρακτήρων για τον κωδικό είναι %%maxlength%%"
password_minimum_length = "Ο ελάχιστος αριθμός χαρακτήρων για τον κωδικό είναι %%minlength%%"
@@ -695,13 +726,17 @@ pronounced = "προφέρεται"
Provider = "Πάροχος"
Public = "Δημόσιο"
Publication = "Δημοσίευση"
+Publication Date = "Ημερομηνία έκδοσης"
Publication Frequency = "Συχνότητα δημοσίευσης"
Publication Information = "Πληροφορίες έκδοσης"
Publication Type = "Τύπος έκδοσης"
+Publication Year = "Έτος έκδοσης"
Publication_Place = "Τόπος έκδοσης"
Published = "Έκδοση"
Published in = "Τόπος έκδοσης"
Publisher = "εκδότη"
+Publisher Information = "Στοιχεία εκδότη"
+Publisher Permissions = "Άδειες εκδότη"
QR Code = "Κώδικας QR"
qrcode_hide = "Απόκρυψη κώδικα QR"
qrcode_show = "Εμφάνιση κώδικα QR"
@@ -830,6 +865,7 @@ sort_title = "Με τίτλο"
sort_year = "Με ημερομηνία (φθ.)"
sort_year asc = "Με ημερομηνία (αυξ.)"
Source = "Πηγή"
+Source Title = "Τίτλος πηγής"
spell_expand_alt = "Επέκταση αναζήτησης"
spell_suggest = "Εναλλακτικές αναζητήσεις"
Staff View = "Λεπτομερής προβολή"
@@ -870,6 +906,7 @@ storage_retrieval_request_year = "Έτος"
Subcollection = "Υποομάδα Συλλογής"
Subject = "Θέμα"
Subject Area = "Περιοχή θεμάτων"
+Subject Geographic = "Θέμα γεωγραφικό"
Subject Recommendations = "Προτάσεις θεμάτων"
Subject Terms = "Θεματικοί όροι"
Subject(s) = "Θέμα(τα)"
@@ -934,6 +971,7 @@ total_resources = "Σύνολο στοιχείων"
total_saved_items = "Σύνολο αποθηκευμένων"
total_tags = "Σύνολο ετικετών"
total_users = "Σύνολο χρηστών"
+Transliterated Title = "Μεταγραφείς τίτλος"
tree_search_limit_reached_html = "Η αναζήτηση επέστρεψε πάρα πολλά αποτελέσματα. Εμφανίζονται μόνο τα πρώτα %%limit%%. Δείτε όλα τα αποτελέσματα Library Catalogue Profile."
too_many_favorites = "This list is too large to display all at once. Try rearranging your favourites into more lists or limiting using tags."
You do not have any saved resources = "You do not have any saved resources. Perform a search and use the Add to Favourites button to save items."
-Your Favorites = "Your Favourites"
\ No newline at end of file
+Your Favorites = "Your Favourites"
diff --git a/languages/en.ini b/languages/en.ini
index dcea85e54d6..942426857bf 100644
--- a/languages/en.ini
+++ b/languages/en.ini
@@ -46,6 +46,8 @@ Advanced Search = "Advanced Search"
advSearchError_noRights = "I'm sorry, but you don't have permission to edit that search. Perhaps your browser session has expired?"
advSearchError_notAdvanced = "The search you have requested to edit is not an advanced search."
advSearchError_notFound = "The search you have requested was not found."
+ajaxview_label_information = "Information"
+ajaxview_label_tools = "Tools"
All = "All"
All Fields = "All Fields"
All Pages Loaded = "All Pages Loaded"
@@ -183,6 +185,7 @@ citation_singlepage_abbrev = "p."
citation_volume_abbrev = "Vol."
Cite this = "Cite this"
City = "City"
+Clear = "Clear"
clear_tag_filter = "Clear Filter"
close = "close"
Code = "Code"
@@ -572,7 +575,7 @@ map_results_label = "At this location:"
Maps = "Maps"
Media Format = "Media Format"
medium = "Medium"
-MeSH Terms = "MeSH TermsH"
+MeSH Terms = "MeSH Terms"
Message = "Message"
Message From Sender = "Message From Sender"
Metadata Prefix = "Metadata Prefix"
@@ -917,6 +920,7 @@ summon_database_recommendations = "You may find additional resources here:"
Supplements = "Supplements"
Supplied by Amazon = "Supplied by Amazon"
Switch view to = "Switch view to"
+switchquery_fuzzy = "Performing a fuzzy search may retrieve terms with similar spellings"
switchquery_intro = "You may be able to get more results by adjusting your search query."
switchquery_lowercasebools = "If you are trying to use Boolean operators, they must be ALL CAPS"
switchquery_truncatechar = "Shorten your search query to broaden your results"
@@ -1037,4 +1041,4 @@ Your search terms = "Your search terms"
Your Tags = "Your Tags"
your_match_would_be_here = "Your match would be here."
Zip = "Zip"
-zoom = "Zoom"
\ No newline at end of file
+zoom = "Zoom"
diff --git a/languages/es.ini b/languages/es.ini
index d5563bf7552..6d2246e30dd 100644
--- a/languages/es.ini
+++ b/languages/es.ini
@@ -3,8 +3,11 @@
;Spanish = Español
Abstract = "Resumen"
Access = "Acceso"
+Access URL = "URL de Acceso"
+Accession Number = "Número de Acceso"
Account = "Cuenta"
Add = "Agregar"
+Add a Library Card = "Agregar una Tarjeta de la Biblioteca"
Add a Note = "Agregar Nota"
Add Tag = "Agregar Etiqueta"
Add Tags = "Agregar Etiquetas"
@@ -44,11 +47,14 @@ Advanced Search = "Búsqueda Avanzada"
advSearchError_noRights = "Lo sentimos, no tiene permisos para editar la búsqueda. Tal vez ha expirado la sesión en su navegador."
advSearchError_notAdvanced = "La búsqueda solicitada para editar no es Avanzada."
advSearchError_notFound = "No se ha encontrado la búsqueda solicitada."
+ajaxview_label_information = "Información"
+ajaxview_label_tools = "Herramientas"
All = "Todo"
All Fields = "Todos los Campos"
All Pages Loaded = "Todas las páginas cargadas"
All Text = "Todo el Texto"
alphabrowse_matches = "Resultados"
+alphabrowselink_html = "Navegar por las entradas %%index%% iniciando desde %%from%%."
An error has occurred = "Ha ocurrido un error"
An error occurred during execution; please try again later. = "Un error ha ocurrido durante la ejecución; por favor intente más tarde"
AND = "Y"
@@ -76,6 +82,7 @@ Auto configuration is currently disabled = "Configuración automática deshabili
auto_configure_description = "Si es una nueva instalación, utilice Configuración Automática de VuFind para resolver el error."
auto_configure_disabled = "Configuración Automática deshabilitada."
auto_configure_title = "Configuración Automática"
+Availability = "Disponibilidad"
Available = "Disponible"
Available Functionality = "Funcionalidad disponible"
Awards = "Premios"
@@ -179,6 +186,7 @@ citation_singlepage_abbrev = "p."
citation_volume_abbrev = "Vol."
Cite this = "Citar"
City = "Ciudad"
+Clear = "Limpiar"
clear_tag_filter = "Limpiar filtro"
close = "cerrar"
Code = "Código"
@@ -196,6 +204,8 @@ Company/Entity = "Empresa/Entidad"
Configuration = "Configuración"
confirm_delete = "¿Seguro que desea borrar esto?"
confirm_delete_brief = "¿Borrar elemento?"
+confirm_delete_library_card_brief = "Borrar la Tarjeta de la Biblioteca?"
+confirm_delete_library_card_text = "Está seguro de querer borrar ésta tarjeta de la biblioteca?"
confirm_delete_list_brief = "¿Borrar lista?"
confirm_delete_list_text = "¿Seguro que desea borrar esta lista?"
confirm_delete_tags_brief = "Borrar Etiquetas"
@@ -210,9 +220,11 @@ confirm_storage_retrieval_request_cancel_all_text = "¿Desea cancelar todas sus
confirm_storage_retrieval_request_cancel_selected_text = "¿Desea cancelar sus solicitudes de recuperación de almacenamiento seleccionado?"
conjunction_or = "o"
Contents = "Contenido"
+Contributing Source = "Fuente de Contibución"
Contributors = "Colaboradores"
Copies = "Copias"
Copy = "Copia"
+Copyright = "Derechos de autor"
Corporate Author = "Autor Corporativo"
Country = "País"
Course = "Curso"
@@ -250,12 +262,14 @@ Detailed View = "Vista Detallada"
Details = "Vista Staff"
Displaying the top = "Mostrando la parte superior"
Document Inspector = "Inspector de documentos"
+Document Type = "Tipo de Documento"
DOI = "DOI"
Due = "Vencimiento"
Due Date = "Fecha de Vencimiento"
DVD = "DVD"
eBook = "eBook"
Edit = "Editar"
+Edit Library Card = "Editar Tarjeta de la Biblioteca"
Edit this Advanced Search = "Editar esta Búsqueda Avanzada"
edit_list = "Editar Lista"
edit_list_fail = "Lo sentimos, no está autorizado para editar esta lista"
@@ -341,6 +355,7 @@ Fee = "Cuota"
Feedback = "Comentarios"
Feedback Email = "Correo Electrónico"
feedback_name = "Nombre"
+File Description = "Descripción del Archivo"
Filter = "Filtro"
filter_tags = "Filtro de Etiquetas"
filter_wildcard = "Cualquier"
@@ -473,6 +488,7 @@ in = "en"
In This Collection = "En esta colección"
in_collection_label = "En colección:"
include_synonyms = "Expandir resultados usando sinónimos"
+Index Terms = "Términos del Indice"
Indexes = "Indexados"
information = "Información"
Institution = "Institución"
@@ -498,9 +514,11 @@ items_added_to_bookbag = "Elementos agregados a su Mochila"
items_already_in_bookbag = "Elementos están en su Mochila o podrían no estar añadidos."
Journal = "Revista"
Journal Articles = "Artículos de Revistas"
+Journal Info = "Información de la Revista"
Journal Title = "Título de Revista"
Journals = "Revistas"
Jump to = "pasar a"
+just_cataloged = "Recién Catalogado"
Keyword = "Palabra clave"
Keyword Filter = "Filtro de palabra clave"
Kit = "Conjunto"
@@ -510,7 +528,19 @@ Last = "Ultimo"
Last Modified = "Ultima modificación"
Last Name = "Apellido"
less = "menos"
+libphonenumber_invalid = "Número de teléfono no válido"
+libphonenumber_invalidcountry = "Código de país no válido"
+libphonenumber_invalidregion = "Código de región no válido"
+libphonenumber_notanumber = "La numeración suministrada no parece ser un número de teléfono"
+libphonenumber_toolong = "La numeración suministrada es demasiado larga para ser un número de teléfono"
+libphonenumber_tooshort = "La numeración suministrada es demasiada corta para ser un número de teléfono"
+libphonenumber_tooshortidd = "Número de teléfono demasiado corto después del Marcado Directo Internacional"
Library = "Biblioteca"
+Library Card = "Tarjeta de la Biblioteca"
+Library Card Deleted = "Tarjeta de la Biblioteca eliminada"
+Library Card Name = "Nombre de la Tarjeta de la Biblioteca"
+Library Cards = "Tarjetas de Biblioteca"
+Library Cards Disabled = "Tarjetas de la Biblioteca Desabilitadas"
Library Catalog Password = "Contraseña del Catálogo de la Biblioteca"
Library Catalog Profile = "Perfíl del Catálogo de la Biblioteca"
Library Catalog Record = "Registro del Catálogo de la Biblioteca"
@@ -546,6 +576,7 @@ map_results_label = "En esta ubicación:"
Maps = "Mapas"
Media Format = "Formato del medio"
medium = "Medio"
+MeSH Terms = "Términos MeSH"
Message = "Mensaje"
Message From Sender = "Mensaje del Remitente"
Metadata Prefix = "Prefijo de metadatos"
@@ -658,6 +689,7 @@ Page not found. = "Página no encontrada"
Password = "Contraseña"
Password Again = "Nuevamente contraseña"
Password cannot be blank = "La contraseña no puede quedar en blanco"
+password_error_invalid = "Nueva contraseña es inválida (p.e. contiene caracteres no válidos)"
password_error_not_unique = "La contraseña no se ha cambiado"
password_maximum_length = "Longitud máxima de la contraeña son %%maxlength%% caracteres"
password_minimum_length = "Longitud mínima de la contraeña son %%minlength%% caracteres"
@@ -695,13 +727,17 @@ pronounced = "pronunciado"
Provider = "Proveedor"
Public = "Público"
Publication = "Publicación"
+Publication Date = "Fecha de Publicación"
Publication Frequency = "Frecuencia de Publicación"
Publication Information = "Información de Publicación"
Publication Type = "Tipo de publicación"
+Publication Year = "Año de Publicación"
Publication_Place = "Lugar de publicación"
Published = "Publicado"
Published in = "Publicado en"
Publisher = "Editor"
+Publisher Information = "Información del Publicador"
+Publisher Permissions = "Permisos del Publicador"
QR Code = "Código QR"
qrcode_hide = "Ocultar Código QR"
qrcode_show = "Mostrar Código QR"
@@ -830,6 +866,7 @@ sort_title = "Título"
sort_year = "Fecha Descendente"
sort_year asc = "Fecha Ascendente"
Source = "Fuente"
+Source Title = "Fuente del Título"
spell_expand_alt = "Expander búsqueda"
spell_suggest = "Buscar alternativas"
Staff View = "Vista Equipo"
@@ -870,6 +907,7 @@ storage_retrieval_request_year = "Año"
Subcollection = "Subcolección"
Subject = "Materia"
Subject Area = "Areas Temáticas"
+Subject Geographic = "Materia Geográfica"
Subject Recommendations = "Temas recomendados"
Subject Terms = "Términos de Temas"
Subject(s) = "Tema(s)"
@@ -934,6 +972,7 @@ total_resources = "total de Recursos"
total_saved_items = "Total de elementos guardados"
total_tags = "Total de etiquetas"
total_users = "Total de usuarios"
+Transliterated Title = "Título Transliterado"
tree_search_limit_reached_html = "Su búsqueda tiene muchos resultados para desplegar en el árbol. Mostrando solo los primeros %%limit%% elementos. Para una búsqueda completa clic aquí."
unique_tags = "Etiquetas únicas"
University Library = "Biblioteca Universitaria"
@@ -947,6 +986,7 @@ Use instead = "Usar en vez"
User Account = "Cuenta de usuario"
Username = "Usuario"
Username cannot be blank = "Nombre de usuario no puede estar vacío"
+Username is already in use in another library card = "El nombre de usuario ya está usado por otra trajeta de la biblioteca"
VHS = "VHS"
Video = "Video"
Video Clips = "Video Clips"
@@ -984,6 +1024,7 @@ You do not have any fines = "Usted no tiene multas"
You do not have any holds or recalls placed = "No tiene reservas ni reclamos"
You do not have any interlibrary loan requests placed = "No tiene ninguna solicitud de préstamo interbibliotecario colocada"
You do not have any items checked out = "No tiene copias en préstamo"
+You do not have any library cards = "Usted no tiene ninguna tarjeta de la biblioteca"
You do not have any saved resources = "No ha guardado ningún recurso"
You do not have any storage retrieval requests placed = "No tiene ninguna solicitud de almacenamiento y recuperación colocada"
You must be logged in first = "Primero debe ingresar al sistema"
@@ -1000,4 +1041,4 @@ Your search terms = "Sus términos de búsqueda"
Your Tags = "Sus Etiquetas"
your_match_would_be_here = "Su coincidencia estaría aquí"
Zip = "Código Postal"
-zoom = "Enfocar"
\ No newline at end of file
+zoom = "Enfocar"
diff --git a/languages/eu.ini b/languages/eu.ini
index 2463fdcad7e..5660bc6d8f8 100644
--- a/languages/eu.ini
+++ b/languages/eu.ini
@@ -1588,4 +1588,4 @@ Your Profile = "Zure profila"
Your search terms = "Bilatu dituzun hitzak"
Your Tags = "Zure etiketak"
Zip = "Posta kodea"
-zoom = "Zoom"
\ No newline at end of file
+zoom = "Zoom"
diff --git a/languages/fi.ini b/languages/fi.ini
index 4373ef939a6..8d79caae227 100644
--- a/languages/fi.ini
+++ b/languages/fi.ini
@@ -1,6 +1,8 @@
;note_785_7 = "Yhdistynyt julkaisuun" ; incomplete translation (en.ini was later revised)
Abstract = "Abstrakti"
Access = "Pääsy"
+Access URL = "Linkki aineistoon"
+Accession Number = "Hankintanumero"
Account = "Tili"
Add = "Lisää"
Add a Library Card = "Lisää kirjastokortti"
@@ -43,11 +45,14 @@ Advanced Search = "Tarkennettu haku"
advSearchError_noRights = "Haun muokkaus epäonnistui. Epäonnistuminen voi johtua vanhentuneesta selainistunnosta."
advSearchError_notAdvanced = "Muokkaamasi haku ei ole tarkennettu haku."
advSearchError_notFound = "Hakua ei löydy."
+ajaxview_label_information = "Tietoa"
+ajaxview_label_tools = "Työkalut"
All = "Kaikki"
All Fields = "Kaikki kentät"
All Pages Loaded = "Kaikki sivut ladattu"
All Text = "Kaikki teksti"
alphabrowse_matches = "Tulokset"
+alphabrowselink_html = "Selaa %%index%%-indeksiä alkaen kohdasta %%from%%."
An error has occurred = "Tapahtui virhe"
An error occurred during execution; please try again later. = "Virhe toimintoa suoritettaessa. Yritä myöhemmin uudelleen."
AND = "JA"
@@ -75,12 +80,13 @@ Auto configuration is currently disabled = "Automaattinen asennus on pois pääl
auto_configure_description = "If this is a new installation, you may be able to fix the error using VuFind's Auto Configure tool."
auto_configure_disabled = "Auto configuration is disabled."
auto_configure_title = "Auto Configure"
+Availability = "Saatavuus"
Available = "Saatavissa"
Available Functionality = "Käytettävissä oleva toiminnallisuus"
Awards = "Palkinnot"
Back to Record = "Takaisin tietueeseen"
Back to Search Results = "Takaisin hakutuloksiin"
-Backtrace = "Paluupolku"
+Backtrace = "Kutsupino"
Bag = "Kori"
Balance = "Maksettavaa"
basic_search_keep_filters = "Säilytä käytössä oleva rajaus"
@@ -211,9 +217,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Haluatko perua kaikki tilau
confirm_storage_retrieval_request_cancel_selected_text = "Haluatko perua valitsemasi tilaukset?"
conjunction_or = "tai"
Contents = "Sisältö"
+Contributing Source = "Osallistuva lähde"
Contributors = "Muut tekijät"
Copies = "Niteet"
Copy = "Nide"
+Copyright = "Copyright"
Corporate Author = "Yhteisötekijä"
Country = "Maa"
Course = "Kurssi"
@@ -251,6 +259,7 @@ Detailed View = "Tarkat tiedot"
Details = "Henkilökuntanäyttö"
Displaying the top = "Näytetään ensimmäiset"
Document Inspector = "Dokumentin tutkija"
+Document Type = "Dokumentin tyyppi"
DOI = "DOI"
Due = "Eräpäivä"
Due Date = "Eräpäivä"
@@ -343,6 +352,7 @@ Fee = "Maksu"
Feedback = "Palaute"
Feedback Email = "Sähköpostiosoite palautteelle"
feedback_name = "Nimi"
+File Description = "Tiedoston kuvaus"
Filter = "Suodatin"
filter_tags = "Suodata tageja"
filter_wildcard = "Mikä tahansa"
@@ -475,6 +485,7 @@ in = "kentästä"
In This Collection = "Tässä kokoelmassa"
in_collection_label = "Kokoelmassa:"
include_synonyms = "Lisää tuloksia synonyymien avulla"
+Index Terms = "Indeksitermit"
Indexes = "Hakemistot"
information = "Tietoa"
Institution = "Organisaatio"
@@ -500,9 +511,11 @@ items_added_to_bookbag = "tietue(et) lisätty kirjakoriin"
items_already_in_bookbag = "tietue(et) ovat jo kirjakorissa tai lisäys koriin epäonnistui"
Journal = "Aikakauslehti"
Journal Articles = "Lehtiartikkelit"
+Journal Info = "Lehden tiedot"
Journal Title = "Lehden nimi"
Journals = "Aikakauslehdet"
Jump to = "Siirry kohtaan"
+just_cataloged = "Juuri luetteloitu"
Keyword = "Sanahaku"
Keyword Filter = "Asiasanarajaus"
Kit = "Kokoelma"
@@ -512,6 +525,13 @@ Last = "Viimeinen"
Last Modified = "Viimeksi muokattu"
Last Name = "Sukunimi"
less = "vähemmän"
+libphonenumber_invalid = "Virheellinen puhelinnumero"
+libphonenumber_invalidcountry = "Virheellinen maakoodi"
+libphonenumber_invalidregion = "Virheellinen aluekoodi:"
+libphonenumber_notanumber = "Annettu arvo ei näyttänyt puhelinnumerolta"
+libphonenumber_toolong = "Annettu arvo on liian pitkä ollakseen puhelinnumero"
+libphonenumber_tooshort = "Annettu arvo on liian lyhyt ollakseen puhelinnumero"
+libphonenumber_tooshortidd = "Liian lyhyt puhelinnumero maakoodin jälkeen"
Library = "Kirjasto"
Library Card = "Kirjastokortti"
Library Card Deleted = "Kirjastokortti poistettu"
@@ -553,6 +573,7 @@ map_results_label = "Tässä paikassa:"
Maps = "Kartat"
Media Format = "Median formaatti"
medium = "Keskikokoinen"
+MeSH Terms = "MeSH-termit"
Message = "Viesti"
Message From Sender = "Viesti lähettäjältä"
Metadata Prefix = "Metadatan etuliite"
@@ -703,13 +724,17 @@ pronounced = "äännetään"
Provider = "Tuottaja"
Public = "Julkinen"
Publication = "Julkaisu"
+Publication Date = "Julkaisupäivä"
Publication Frequency = "Julkaisutiheys"
Publication Information = "Julkaisutiedot"
Publication Type = "Julkaisutyyppi"
+Publication Year = "Julkaisuvuosi"
Publication_Place = "Julkaisupaikka"
Published = "Julkaistu"
Published in = "Julkaisussa"
Publisher = "Julkaisija"
+Publisher Information = "Julkaisutiedot"
+Publisher Permissions = "Julkaisuoikeudet"
QR Code = "QR-koodi"
qrcode_hide = "Piilota QR-koodi"
qrcode_show = "Näytä QR-koodi"
@@ -838,6 +863,7 @@ sort_title = "Nimeke"
sort_year = "Aika (uusimmat ensin)"
sort_year asc = "Aika (vanhimmat ensin)"
Source = "Lähde"
+Source Title = "Lähdenimeke"
spell_expand_alt = "Laajenna hakua"
spell_suggest = "Tarkoititko"
Staff View = "Henkilökuntanäyttö"
@@ -878,6 +904,7 @@ storage_retrieval_request_year = "Vuosi"
Subcollection = "Alakokoelma"
Subject = "Aihe"
Subject Area = "Aihealue"
+Subject Geographic = "Maantieteellinen aihe"
Subject Recommendations = "Aihe-ehdotuksia"
Subject Terms = "Asiasanat"
Subject(s) = "Aihe(et)"
@@ -942,6 +969,7 @@ total_resources = "Resursseja yhteensä"
total_saved_items = "Tallennettuja tietueita yhteensä"
total_tags = "Tageja yhteensä"
total_users = "Käyttäjiä yhteensä"
+Transliterated Title = "Translitteroitu nimeke"
tree_search_limit_reached_html = "Hakusi tuotti liikaa tuloksia puussa näytettäväksi. Näytetään vain ensimmäiset %%limit%% kohdetta. Klikkaa tästä nähdäksesi koko hakutuloksen."
unique_tags = "Yksilöllisiä tageja yhteensä"
University Library = "Yliopiston kirjasto"
@@ -1010,4 +1038,4 @@ Your search terms = "Hakuehdot"
Your Tags = "Tagit"
your_match_would_be_here = "Osuma olisi tässä."
Zip = "Postitoimipaikka"
-zoom = "Zoomaa"
\ No newline at end of file
+zoom = "Zoomaa"
diff --git a/languages/fr.ini b/languages/fr.ini
index 231e5e31c31..01c6a00e86c 100644
--- a/languages/fr.ini
+++ b/languages/fr.ini
@@ -999,4 +999,4 @@ Your search terms = "Vos termes de recherche"
Your Tags = "Vos tags"
your_match_would_be_here = "Votre correspondance devrait être ici."
Zip = "Zip"
-zoom = "Zoom"
\ No newline at end of file
+zoom = "Zoom"
diff --git a/languages/ga.ini b/languages/ga.ini
index 97c21ba6c3f..baf218ce44d 100644
--- a/languages/ga.ini
+++ b/languages/ga.ini
@@ -665,4 +665,4 @@ Your Lists = "Do Liostaí"
Your Profile = "Do Phróifíl"
Your search terms = "Do Théarmaí Cuardaigh"
Your Tags = "Do Chlibeanna"
-Zip = "Cód Post"
\ No newline at end of file
+Zip = "Cód Post"
diff --git a/languages/he.ini b/languages/he.ini
index f00daa285ed..054280b6f0e 100644
--- a/languages/he.ini
+++ b/languages/he.ini
@@ -777,4 +777,4 @@ Your Profile = "הפרופיל שלך"
Your search terms = "מילות החיפוש שלך"
Your Tags = "התגים שלך"
Zip = "מיקוד"
-zoom = "זום"
\ No newline at end of file
+zoom = "זום"
diff --git a/languages/it.ini b/languages/it.ini
index 5f66a4e140b..a4aa27af74d 100644
--- a/languages/it.ini
+++ b/languages/it.ini
@@ -2,14 +2,17 @@
;Italian = Italiano
Abstract = "Abstract"
Access = "Accesso"
+Access URL = "URL di accesso"
+Accession Number = "Accession Number"
Account = "Account"
Add = "Aggiungi"
+Add a Library Card = "Aggiungi una tessera di biblioteca"
Add a Note = "Aggiungi una nota"
Add Tag = "Aggiungi Tag"
Add Tags = "Aggiungi Tag"
Add to another list = "Aggiungi a un'altra lista"
Add to Book Bag = "Aggiungi al carrello"
-Add to favorites = "Aggiungi ai preferiti"
+Add to favorites = "Aggiungi alla lista"
Add your comment = "Aggiungi un commento"
add_comment_fail_blank = "Un commento non può essere vuoto."
add_comment_success = "Commento aggiunto."
@@ -43,11 +46,14 @@ Advanced Search = "Ricerca avanzata"
advSearchError_noRights = "Mi spiace ma non hai il permesso di modificare la ricerca. Forse è terminata la tua sessione?"
advSearchError_notAdvanced = "La ricerca che hai chiesto di modificare non è una ricerca avnzata."
advSearchError_notFound = "La ricerca richiesta non è stata trovata."
+ajaxview_label_information = "Informazioni"
+ajaxview_label_tools = "Strumenti"
All = "All"
All Fields = "Tutti i Campi"
All Pages Loaded = "Tutte le pagine caricate"
All Text = "Tutto il testo"
alphabrowse_matches = "Risultati"
+alphabrowselink_html = "Naviga il catalogo per %%index%% partendo da %%from%%."
An error has occurred = "Si è verificato un errore"
An error occurred during execution; please try again later. = "Errore durante l'esecuzione; riprova più tardi."
AND = "AND"
@@ -75,6 +81,7 @@ Auto configuration is currently disabled = "L'auto-configurazione attualmente è
auto_configure_description = "Se questa è una nuova installazione, puoi correggere gli errorim usando lo strumento di auto-configuazione di VuFind."
auto_configure_disabled = "L'auto-configurazione non è abilitatata."
auto_configure_title = "Auto-configurazione"
+Availability = "Disponibilità"
Available = "Disponibile"
Available Functionality = "Funzionalità disponibile"
Awards = "Premi"
@@ -195,11 +202,13 @@ Company/Entity = "Società/Entità"
Configuration = "Configurazione"
confirm_delete = "Sei sicuro di voler procedere con l'eliminazione?"
confirm_delete_brief = "Cancellare questo elemento?"
+confirm_delete_library_card_brief = "Cancellare la tessera della biblioteca?"
+confirm_delete_library_card_text = "Sei sicuro di cancellare questa tessera della biblioteca?"
confirm_delete_list_brief = "Cancellare la lista?"
confirm_delete_list_text = "Sei sicuro di voler eliminare questa lista?"
confirm_delete_tags_brief = "Cancella i tag"
-confirm_dialog_no = "Cancella"
-confirm_dialog_yes = "Conferma"
+confirm_dialog_no = "No"
+confirm_dialog_yes = "Si"
confirm_hold_cancel_all_text = "Vuoi cancellare tutte le tue prenotazioni?"
confirm_hold_cancel_selected_text = "Vuoi cancellare le prenotazioni selezionate?"
confirm_ill_request_cancel_all_text = "Vuoi cancellare tutte le tue richieste di prestito interbibliotecario?"
@@ -209,9 +218,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Vuoi cancellare tutte le tu
confirm_storage_retrieval_request_cancel_selected_text = "Vuoi cancellare le richiestte di volumi da magazzino selezionate?"
conjunction_or = "o"
Contents = "Contenuti"
+Contributing Source = "Fonte del contributo"
Contributors = "Nomi associati"
Copies = "Copie"
Copy = "Copia"
+Copyright = "Copyright"
Corporate Author = "Ente Autore"
Country = "Stato"
Course = "Corso"
@@ -249,12 +260,14 @@ Detailed View = "Visualizzazione analitica"
Details = "Dettagli"
Displaying the top = "Displaying the top"
Document Inspector = "Analizzatore documentale"
+Document Type = "Tipo di documento"
DOI = "DOI"
Due = "Scadere"
Due Date = "Data di scadenza"
DVD = "DVD"
eBook = "eBook"
Edit = "Modifica"
+Edit Library Card = "Modifica la tessera della biblioteca"
Edit this Advanced Search = "Modifica questa ricerca avanzata"
edit_list = "Modifica la lista"
edit_list_fail = "Ops, non sei autorizzato a modificare questa lista"
@@ -335,11 +348,12 @@ fav_export = "Esporta i preferiti"
fav_list_delete = "la lista dei tuoi preferiti è stata eliminata"
fav_list_delete_cancel = "Questa lista non è stata eliminata"
fav_list_delete_fail = "Ops, si è verificato un errore. La tua lista non è stata eliminata."
-Favorites = "Preferiti"
+Favorites = "Elementi salvati"
Fee = "Tariffa"
Feedback = "Feedback"
Feedback Email = "Email"
feedback_name = "Nome"
+File Description = "Descrizione del file"
Filter = "Filtra"
filter_tags = "Filtra i tag"
filter_wildcard = "Qualsiasi"
@@ -393,11 +407,11 @@ history_empty_search = "Nessun risultato (campo ricerca vuoto)"
history_limits = "Limita"
history_no_searches = "Attualmente non ci sono ricerche nella tua history."
history_purge = "Cancella le ricerche non salvate"
-history_recent_searches = "Le tue ultime ricerche"
+history_recent_searches = "Ultime ricerche"
history_results = "Risultati"
history_save = "Salva"
history_save_link = "Salva"
-history_saved_searches = "Le tue ricerche"
+history_saved_searches = "Ricerche salvate"
history_search = "Ricerca"
history_time = "Tempo"
hold_available = "Pronto per il ritiro"
@@ -472,6 +486,7 @@ in = "in"
In This Collection = "In questa collezione"
in_collection_label = "Nella collezione:"
include_synonyms = "Espandi i risultati usando i sinonimi"
+Index Terms = "Termini di indice"
Indexes = "Indici"
information = "Informazione"
Institution = "Istituzione"
@@ -497,9 +512,11 @@ items_added_to_bookbag = "oggetto(i) aggiunto(i) al carrello"
items_already_in_bookbag = "oggetto(i) già nel carrello o che non può essere aggiunto"
Journal = "Periodico"
Journal Articles = "Articoli del periodico"
+Journal Info = "Informazioni sulla rivista"
Journal Title = "Titolo del periodico"
Journals = "Periodici"
Jump to = "Salta a"
+just_cataloged = "Appena catalogato"
Keyword = "Keyword"
Keyword Filter = "Filtra Keyword"
Kit = "Multimedia"
@@ -509,7 +526,19 @@ Last = "Ultimo"
Last Modified = "Ultima modifica"
Last Name = "Cognome"
less = "riduci"
+libphonenumber_invalid = "Numero di telefono non valido"
+libphonenumber_invalidcountry = "Prefisso internazionale non valido"
+libphonenumber_invalidregion = "Prefisso non valido:"
+libphonenumber_notanumber = "I caratteri immessi non sembrano essere un numero di telefono"
+libphonenumber_toolong = "I caratteri immessi sono troppi per essere un numero di telefono"
+libphonenumber_tooshort = "I caratteri immessi sono troppo pochi per essere un numero di telefono"
+libphonenumber_tooshortidd = "Numero di telefono troppo breve dopo il prefisso internazionale"
Library = "Biblioteca"
+Library Card = "Tessera della biblioteca"
+Library Card Deleted = "Tessera della biblioteca cancellata"
+Library Card Name = "Nome della tessera della biblioteca"
+Library Cards = "Tessere della biblioteca"
+Library Cards Disabled = "Tessera della disabilitata"
Library Catalog Password = "Password utente nel catalgo di biblioteca"
Library Catalog Profile = "Profilo utente nel catalogo di biblioteca"
Library Catalog Record = "Record del catalogo di biblioteca"
@@ -545,6 +574,7 @@ map_results_label = "In questo luogo:"
Maps = "Mappe"
Media Format = "Formato"
medium = "Medium"
+MeSH Terms = "Termini MeSH"
Message = "Messaggio"
Message From Sender = "Messaggio: "
Metadata Prefix = "Metadata Prefix"
@@ -563,10 +593,10 @@ Most Recent Received Issues = "Ultimi fascicoli ricevuti"
Multiple Call Numbers = "È presente più di una copia"
Multiple Locations = "Localizzazioni multiple"
Musical Score = "Musica a stampa"
-My Favorites = "I miei preferiti"
-My Fines = "Le mie multe"
-My Holds = "Le mie prenotazioni"
-My Profile = "Il mio profilo"
+My Favorites = "Preferiti"
+My Fines = "Multe"
+My Holds = "Prenotazioni"
+My Profile = "Profilo"
Narrow Search = "Restringi la ricerca"
navigate_back = "Indietro"
Need Help? = "Serve aiuto?"
@@ -657,6 +687,7 @@ Page not found. = "Pagina non trovata."
Password = "Password"
Password Again = "Ripeti password"
Password cannot be blank = "Il campo password non può essere vuoto"
+password_error_invalid = "La nuova password non è valida (contiene caratteri non validi)"
password_error_not_unique = "La password non è stata cambiata"
password_maximum_length = "La lunghezza massima della password è di %%maxlength%% caratteri"
password_minimum_length = "La lunghezza minima della password è di %%maxlength%% caratteri"
@@ -694,13 +725,17 @@ pronounced = "pronuncia"
Provider = "Provider"
Public = "Pubblico"
Publication = "Pubblicazione"
+Publication Date = "Data di pubblicazione"
Publication Frequency = "Periodicità"
Publication Information = "Informazioni sulla pubblicazione"
Publication Type = "Tipo di pubblicazione"
+Publication Year = "Anno di pubblicazione"
Publication_Place = "Luogo di pubblicazione"
Published = "Pubblicazione"
Published in = "Pubblicato in"
Publisher = "Editore"
+Publisher Information = "Informazioni sull'editore"
+Publisher Permissions = "Autorizzazioni dell'editore"
QR Code = "Codice QR"
qrcode_hide = "Nascondi Codice QR"
qrcode_show = "Mostra Codice QR"
@@ -829,6 +864,7 @@ sort_title = "Titolo"
sort_year = "Data (discendente)"
sort_year asc = "Data (ascendente)"
Source = "Fonte"
+Source Title = "Titolo della fonte"
spell_expand_alt = "Espandi la ricerca"
spell_suggest = "Cerca anche"
Staff View = "MARC21"
@@ -869,6 +905,7 @@ storage_retrieval_request_year = "Anno"
Subcollection = "Sottocollezione"
Subject = "Soggetto"
Subject Area = "Area del soggetto"
+Subject Geographic = "Soggetto geografico"
Subject Recommendations = "Suggerimenti (Soggetto)"
Subject Terms = "Soggetti"
Subject(s) = "Soggetto(i)"
@@ -933,6 +970,7 @@ total_resources = "Totale risorse"
total_saved_items = "Totale oggetti salvati"
total_tags = "Totale tag"
total_users = "Totale utenti"
+Transliterated Title = "Titolo translitterato"
tree_search_limit_reached_html = "La tua ricerca restituisce troppi risultati per permetterti di visualizzarne l'albero. Questi sono i primi %%limit%% risultati. Per una ricerca completa clicca qui."
unique_tags = "Tag unici"
University Library = "Biblioteca Universitaria"
@@ -946,6 +984,7 @@ Use instead = "Usa invece"
User Account = "Account utente"
Username = "Username"
Username cannot be blank = "Il campo username non può essere lasciato vuoto"
+Username is already in use in another library card = "Il nome utente è già usato in un'altra tessera della biblioteca"
VHS = "VHS"
Video = "Video"
Video Clips = "Video"
@@ -983,6 +1022,7 @@ You do not have any fines = "Non hai alcuna sanzione"
You do not have any holds or recalls placed = "Non hai prenotazioni o richieste in atto"
You do not have any interlibrary loan requests placed = "Non hai alcuna richiesta di prestito interbibliotecario in corso"
You do not have any items checked out = "Non hai documenti in presito"
+You do not have any library cards = "Non hai ancora una tessera della biblioteca"
You do not have any saved resources = "Non hai nessuna risorsa salvata"
You do not have any storage retrieval requests placed = "Non hai alcuna richiesta di volumi da magazzino in corso"
You must be logged in first = "Entra"
@@ -990,7 +1030,7 @@ Your Account = "Il tuo account"
Your book bag is empty = "Il tuo carrello è vuoto"
Your Checked Out Items = "I tuoi documenti in prestito"
Your Comment = "Il tuo commento"
-Your Favorites = "I tuoi preferiti"
+Your Favorites = "Elementi salvati"
Your Fines = "Le tue multe"
Your Holds and Recalls = "Le tue prenotazioni e richieste"
Your Lists = "Le tue liste"
@@ -999,4 +1039,4 @@ Your search terms = "I tuoi termini di ricerca"
Your Tags = "I tuoi tag"
your_match_would_be_here = "L'oggetto della tua ricerca starebbe qui."
Zip = "CAP"
-zoom = "Zoom"
\ No newline at end of file
+zoom = "Zoom"
diff --git a/languages/ja.ini b/languages/ja.ini
index bfea27bf93e..071d1a3082c 100644
--- a/languages/ja.ini
+++ b/languages/ja.ini
@@ -3,8 +3,11 @@
;note_785_7 = "吸収前誌" ; incomplete translation (en.ini was later revised)
Abstract = "抄録"
Access = "アクセス"
+Access URL = "アクセスURL"
+Accession Number = "受入番号"
Account = "アカウント"
Add = "追加"
+Add a Library Card = "図書館カードの追加"
Add a Note = "注記追加"
Add Tag = "タグ追加"
Add Tags = "タグ追加"
@@ -44,11 +47,14 @@ Advanced Search = "詳細検索"
advSearchError_noRights = "この検索を編集する権限がありません。セッションが切れていませんか。"
advSearchError_notAdvanced = "編集指定した検索は詳細検索ではありません。"
advSearchError_notFound = "指定した検索はありません。"
+ajaxview_label_information = "情報"
+ajaxview_label_tools = "ツール"
All = "すべて"
All Fields = "全フィールド"
All Pages Loaded = "全ページロードされました"
All Text = "すべてのテキスト"
alphabrowse_matches = "結果"
+alphabrowselink_html = "%%index%%を%%from%%からブラウズ"
An error has occurred = "エラーが発生しました"
An error occurred during execution; please try again later. = "処理中にエラーが発生しました。時間をおいて再度実行してください。"
AND = "AND"
@@ -76,6 +82,7 @@ Auto configuration is currently disabled = "自動設定機能は無効です"
auto_configure_description = "新規インストールの場合は、VuFindの自動設定ツールを使うことによりエラーを修正出来る場合があります。"
auto_configure_disabled = "自動設定機能が無効です。"
auto_configure_title = "自動設定機能"
+Availability = "利用の可否"
Available = "利用可"
Available Functionality = "利用可能な機能"
Awards = "賞"
@@ -196,11 +203,13 @@ Company/Entity = "会社/法人"
Configuration = "設定"
confirm_delete = "これを本当に削除しても良いですか?"
confirm_delete_brief = "アイテムを削除しますか?"
+confirm_delete_library_card_brief = "図書館カードを削除しますか?"
+confirm_delete_library_card_text = "この図書館カードを本当に削除してもよろしいですか?"
confirm_delete_list_brief = "リストを削除しますか?"
confirm_delete_list_text = "このリストを本当に削除しても良いですか?"
confirm_delete_tags_brief = "タグの削除"
-confirm_dialog_no = "キャンセル"
-confirm_dialog_yes = "確認"
+confirm_dialog_no = "いいえ"
+confirm_dialog_yes = "はい"
confirm_hold_cancel_all_text = "すべての資料の予約をキャンセルしても良いですか?"
confirm_hold_cancel_selected_text = "選択した資料の予約をキャンセルしても良いですか?"
confirm_ill_request_cancel_all_text = "すべてのILLリクエストをキャンセルしますか?"
@@ -210,9 +219,11 @@ confirm_storage_retrieval_request_cancel_all_text = "すべての所蔵検索リ
confirm_storage_retrieval_request_cancel_selected_text = "選択した所蔵検索リクエストをキャンセルしますか?"
conjunction_or = "OR"
Contents = "コンテンツ"
+Contributing Source = "貢献者情報源"
Contributors = "貢献者"
Copies = "部数"
Copy = "所蔵"
+Copyright = "著作権"
Corporate Author = "団体著者"
Country = "国"
Course = "講義"
@@ -250,12 +261,14 @@ Detailed View = "詳細表示"
Details = "MARC表示"
Displaying the top = "先頭に表示"
Document Inspector = "ドキュメント検査機能"
+Document Type = "文書タイプ"
DOI = "DOI"
Due = "返却日"
Due Date = "返却日"
DVD = "DVD"
eBook = "eBook"
Edit = "編集"
+Edit Library Card = "図書館カードの編集"
Edit this Advanced Search = "詳細検索を編集"
edit_list = "リストの編集"
edit_list_fail = "このリストを編集する権限がありません"
@@ -341,6 +354,7 @@ Fee = "料金"
Feedback = "ご意見"
Feedback Email = "メールアドレス"
feedback_name = "お名前"
+File Description = "ファイル記述"
Filter = "フィルター"
filter_tags = "タグのフィルタリング"
filter_wildcard = "任意"
@@ -473,6 +487,7 @@ in = ":"
In This Collection = "このコレクション"
in_collection_label = "コレクション:"
include_synonyms = "類義語を使って対象を広げる"
+Index Terms = "索引語"
Indexes = "索引"
information = "情報"
Institution = "機関"
@@ -498,9 +513,11 @@ items_added_to_bookbag = "図書バッグに追加した資料"
items_already_in_bookbag = "指定した資料は既に図書バッグにあるか、追加できませんでした。"
Journal = "雑誌"
Journal Articles = "雑誌論文"
+Journal Info = "雑誌情報"
Journal Title = "雑誌名"
Journals = "雑誌"
Jump to = "移動"
+just_cataloged = "目録済"
Keyword = "キーワード"
Keyword Filter = "キーワードフィルター"
Kit = "キット"
@@ -510,7 +527,19 @@ Last = "最後"
Last Modified = "最終更新日"
Last Name = "姓"
less = "隠す"
+libphonenumber_invalid = "不正な電話番号"
+libphonenumber_invalidcountry = "不正な国番号"
+libphonenumber_invalidregion = "不正な局番:"
+libphonenumber_notanumber = "指定された文字列は電話番号ではありません"
+libphonenumber_toolong = "指定された文字列は電話番号としては長すぎます"
+libphonenumber_tooshort = "指定された文字列は電話番号としては短すぎます"
+libphonenumber_tooshortidd = "IDD後の電話番号が短すぎます"
Library = "図書館"
+Library Card = "図書館カード"
+Library Card Deleted = "図書館カードは削除されました"
+Library Card Name = "図書館カード名"
+Library Cards = "マルチ図書館カード"
+Library Cards Disabled = "マルチ図書館カード機能は無効です"
Library Catalog Password = "パスワード"
Library Catalog Profile = "図書館目録システムのプロフィール"
Library Catalog Record = "レコードID"
@@ -546,6 +575,7 @@ map_results_label = "この場所で:"
Maps = "地図"
Media Format = "メディアフォーマット"
medium = "中"
+MeSH Terms = "MeSH用語"
Message = "メッセージ"
Message From Sender = "送信者からのメッセージ"
Metadata Prefix = "メタデータプリフィクス"
@@ -564,10 +594,10 @@ Most Recent Received Issues = "最新受領資料"
Multiple Call Numbers = "請求記号"
Multiple Locations = "配置場所"
Musical Score = "楽譜"
-My Favorites = "私のお気に入り"
-My Fines = "私の延滞金"
-My Holds = "私の予約"
-My Profile = "私のプロフィール"
+My Favorites = "お気に入り"
+My Fines = "延滞金"
+My Holds = "予約"
+My Profile = "プロフィール"
Narrow Search = "絞込み検索"
navigate_back = "戻る"
Need Help? = "ヘルプ"
@@ -658,6 +688,7 @@ Page not found. = "ページが存在しません。"
Password = "パスワード"
Password Again = "もう一度パスワード"
Password cannot be blank = "パスワードを入力してください"
+password_error_invalid = "新パスワードは不正です(不正な文字が含まれているなど)"
password_error_not_unique = "パスワードは変更されませんでした"
password_maximum_length = "パスワードは最大%%maxlength%%文字までです。"
password_minimum_length = "パスワードは最低%%minlength%%文字必要です。"
@@ -695,13 +726,17 @@ pronounced = "発音"
Provider = "プロバイダ"
Public = "パブリック"
Publication = "出版者"
+Publication Date = "出版日付"
Publication Frequency = "出版頻度"
Publication Information = "出版情報"
Publication Type = "出版種別"
+Publication Year = "出版年"
Publication_Place = "出版地"
Published = "出版事項"
Published in = "出版年"
Publisher = "出版者"
+Publisher Information = "出版者情報"
+Publisher Permissions = "出版者の許可"
QR Code = "QRコード"
qrcode_hide = "QRコードを隠す"
qrcode_show = "QRコードを表示する"
@@ -830,6 +865,7 @@ sort_title = "タイトル順"
sort_year = "出版年降順"
sort_year asc = "出版年昇順"
Source = "ソース"
+Source Title = "情報源タイトル"
spell_expand_alt = "検索語の拡大"
spell_suggest = "提案スペルによる検索"
Staff View = "MARC表示"
@@ -870,6 +906,7 @@ storage_retrieval_request_year = "年"
Subcollection = "サブコレクション"
Subject = "主題"
Subject Area = "主題分野"
+Subject Geographic = "地理件名"
Subject Recommendations = "お勧めの主題"
Subject Terms = "件名"
Subject(s) = "件名"
@@ -934,6 +971,7 @@ total_resources = "リソース総数"
total_saved_items = "保存アイテム総数"
total_tags = "タグ総数"
total_users = "利用者総数"
+Transliterated Title = "翻字タイトル"
tree_search_limit_reached_html = "検索結果が表示可能件数を超過しました。最初の%%limit%%件を表示しています。検索結果を絞り込むには、詳細検索をご利用ください。"
unique_tags = "ユニークタグ"
University Library = "大学図書館"
@@ -947,6 +985,7 @@ Use instead = "を見よ"
User Account = "アカウント"
Username = "ユーザ名"
Username cannot be blank = "ユーザ名を入力してください"
+Username is already in use in another library card = "このユーザ名は別の図書カードで使用されています"
VHS = "VHS"
Video = "ビデオ"
Video Clips = "ビデオクリップ"
@@ -984,6 +1023,7 @@ You do not have any fines = "延滞金はありません"
You do not have any holds or recalls placed = "予約または返却請求された資料はありません"
You do not have any interlibrary loan requests placed = "ILLリクエストはありません。"
You do not have any items checked out = "貸出中の資料はありません"
+You do not have any library cards = "図書館カードを1枚も持っていません"
You do not have any saved resources = "保存した事項はありません"
You do not have any storage retrieval requests placed = "所蔵検索リクエストはありませn。"
You must be logged in first = "この操作にはログインが必要です"
@@ -1000,4 +1040,4 @@ Your search terms = "指定した検索語"
Your Tags = "指定タグ"
your_match_would_be_here = "指定した語はこの位置にマッチします"
Zip = "郵便番号"
-zoom = "ズーム"
\ No newline at end of file
+zoom = "ズーム"
diff --git a/languages/native.ini b/languages/native.ini
index 45d014c8bb1..bd4aba0e23c 100644
--- a/languages/native.ini
+++ b/languages/native.ini
@@ -24,4 +24,4 @@ Slovene = "slovenščina"
Spanish = "Español"
Swedish = "Svenska"
Turkish = "Türkçe"
-Welsh = "Cymraeg"
\ No newline at end of file
+Welsh = "Cymraeg"
diff --git a/languages/nl.ini b/languages/nl.ini
index 5aeb54e8f73..82dbd69af8a 100644
--- a/languages/nl.ini
+++ b/languages/nl.ini
@@ -3,6 +3,8 @@
;note_785_7 = "Samengegaan met" ; incomplete translation (en.ini was later revised)
Abstract = "Samenvatting"
Access = "Toegang"
+Access URL = "URL naar item"
+Accession Number = "Archiefnummer"
Account = "Account"
Add = "Toevoegen"
Add a Library Card = "Voeg een bibliotheekkaart toe"
@@ -45,6 +47,8 @@ Advanced Search = "Uitgebreid zoeken"
advSearchError_noRights = "Helaas, je hebt geen toestemming om die zoekopdracht te veranderen. Misschien is je browser sessie afgelopen?"
advSearchError_notAdvanced = "De zoekopdracht die je wil aanpassen is geen uitgebreide zoekopdracht."
advSearchError_notFound = "De zoekopdracht die je vraagt, werd niet gevonden."
+ajaxview_label_information = "Informatie"
+ajaxview_label_tools = "Tools"
All = "Alle"
All Fields = "Alle velden"
All Pages Loaded = "Alle pagina's zijn ingeladen"
@@ -78,6 +82,7 @@ Auto configuration is currently disabled = "Automatische configuratie is momente
auto_configure_description = "Als dit een nieuwe installatie is, kan het gebruik van VuFind's Auto Configure Tool het probleem misschien oplossen"
auto_configure_disabled = "Automatische configuratie is uitgeschakeld."
auto_configure_title = "Automatische configuratie"
+Availability = "Beschikbaarheid"
Available = "Beschikbaar"
Available Functionality = "Beschikbare functionaliteit"
Awards = "Prijzen"
@@ -156,13 +161,13 @@ Cannot find record = "Record niet gevonden"
Cannot find similar records = "Geen gelijkaardige records gevonden"
Cassette = "Cassette"
cat_establish_account = "Geef alsjeblieft de volgende gegevens in om je profiel aan te maken your account profile:"
-cat_password_abbrev = "Catalogus Paswoord"
+cat_password_abbrev = "Catalogus Wachtwoord"
cat_username_abbrev = "Catalogus Gebruikersnaam"
Catalog Login = "Catalogus aanmelding"
Catalog Results = "Resultaten in de catalogus"
catalog_login_desc = "Voer je bibliotheekcatalogusgegevens in"
CD = "CD"
-Change Password = "Verander je paswoord"
+Change Password = "Verander je wachtwoord"
Check Hold = "Controleer de reservering"
Check Recall = "Controleer de terugroeping"
Checked Out = "Uitgeleend"
@@ -181,6 +186,7 @@ citation_singlepage_abbrev = "p."
citation_volume_abbrev = "Vol."
Cite this = "Citeren"
City = "Stad"
+Clear = "Wissen"
clear_tag_filter = "Wis Filter"
close = "Sluiten"
Code = "Code"
@@ -209,14 +215,16 @@ confirm_hold_cancel_all_text = "Wil je al je huidige reserveringen annuleren?"
confirm_hold_cancel_selected_text = "Wil je alle geselecteerde reserveringen annuleren?"
confirm_ill_request_cancel_all_text = "Wil je al je huidige IBL aanvragen ongedaan maken?"
confirm_ill_request_cancel_selected_text = "Wil je al de geselecteerde IBL aanvragen ongedaan maken?"
-confirm_new_password = "Bevestig Nieuw Paswoord"
+confirm_new_password = "Bevestig Nieuw wachtwoord"
confirm_storage_retrieval_request_cancel_all_text = "Wil je zeker al je aanvragen annuleren?"
confirm_storage_retrieval_request_cancel_selected_text = "Wil je zeker je geselecteerde aanvragen annuleren?"
conjunction_or = "of"
Contents = "Inhoud"
+Contributing Source = "Meewerkende bron"
Contributors = "Medewerkers"
Copies = "Kopieën"
Copy = "Kopie"
+Copyright = "Auteursrecht"
Corporate Author = "Corporatie"
Country = "Land"
Course = "College"
@@ -225,7 +233,7 @@ course_reserves_empty_list = "Er werden geen corresponderende Collegereservering
Cover Image = "Beeld op de omslag"
Create a List = "Maak een lijst"
Create New Account = "Maak een nieuw account aan"
-Create New Password = "Maak Nieuw Paswoord Aan"
+Create New Password = "Maak Nieuw Wachtwoord Aan"
Created = "Aangemaakt"
Database = "Databank"
Date = "Datum"
@@ -254,6 +262,7 @@ Detailed View = "Gedetailleerde beschrijving"
Details = "[Versie] voor personeel"
Displaying the top = "De bovenkant wordt afgebeeld"
Document Inspector = "Document Controleur"
+Document Type = "Document Type"
DOI = "DOI"
Due = "Inleverdatum"
Due Date = "Inleverdatum"
@@ -346,6 +355,7 @@ Fee = "Bijdrage"
Feedback = "Feedback"
Feedback Email = "Feedback e-mail"
feedback_name = "Naam"
+File Description = "Bestandsbeschrijving"
Filter = "Filter"
filter_tags = "Filter tags"
filter_wildcard = "Welke ook"
@@ -360,7 +370,7 @@ First = "Eerst(e)"
First Name = "Voornaam"
fix_metadata = "Ja, repareer de metadata, ik wacht wel"
for search = "Voor zoekopdracht"
-Forgot Password = "Paswoord vergeten"
+Forgot Password = "Wachtwoord vergeten"
Form Submitted! = "Formulier ingediend!"
Format = "Formaat"
found = "gevonden"
@@ -478,11 +488,12 @@ in = "in"
In This Collection = "In deze collectie"
in_collection_label = "In de collectie:"
include_synonyms = "Verbreed de resultaten d.m.v. synoniemen"
+Index Terms = "Index Termen"
Indexes = "Indexen"
information = "Informatie"
Institution = "Instelling"
Institutional Login = "Institutionele login"
-institutional_login_desc = "Vul je Gebruikersnaam en Paswoord in."
+institutional_login_desc = "Vul je Gebruikersnaam en Wachtwoord in."
Instructor = "Instructeur"
Interlibrary Loan Requests = "IBL aanvraag"
Internet = "Internet"
@@ -503,6 +514,7 @@ items_added_to_bookbag = "Item(s) in je boekentas gestopt"
items_already_in_bookbag = "Item(s) zat(en) al in je boekentas of kon(den) niet toegevoegd worden"
Journal = "Tijdschrift"
Journal Articles = "Tijdschriftenartikels"
+Journal Info = "Info Tijdschrift"
Journal Title = "Titel tijdschrift"
Journals = "Tijdschriften"
Jump to = "Spring naar"
@@ -529,7 +541,7 @@ Library Card Deleted = "Bibliotheekkaart Verwijderd"
Library Card Name = "Bibliotheekkaart Naam"
Library Cards = "Bibliotheekkaarten"
Library Cards Disabled = "Bibliotheekkaarten Onbruikbaar"
-Library Catalog Password = "Paswoord voor de catalogus"
+Library Catalog Password = "Wachtwoord voor de catalogus"
Library Catalog Profile = "Profiel van de catalogus"
Library Catalog Record = "Record van de catalogus"
Library Catalog Search = "Zoekopdracht catalogus"
@@ -545,7 +557,7 @@ list_edit_name_required = "Lijstnaam moet worden ingegeven."
load_tag_error = "Foutmelding: de Tags konden niet worden niet opgehaald"
Loading = "Wordt geladen"
Local Login = "Plaatselijke login"
-local_login_desc = "voer je gebruikersnaam en paswoord voor deze site in."
+local_login_desc = "voer je gebruikersnaam en wachtwoord voor deze site in."
Located = "Locatie"
Location = "Plaats"
Log Out = "Uitloggen"
@@ -563,6 +575,8 @@ Map View = "Kaart"
map_results_label = "Op deze locatie:"
Maps = "Kaarten"
Media Format = "Materiaal omschrijving"
+medium = "Drager"
+MeSH Terms = "MeSH Termen"
Message = "Bericht"
Message From Sender = "Bericht van zender"
Metadata Prefix = "Metadata Prefix"
@@ -593,8 +607,8 @@ New Item Search = "Zoeken naar nieuw item"
New Item Search Results = "Resultaten voor nieuwe items"
New Items = "Nieuwe items"
New Title = "Nieuwe titel"
-new_password = "Nieuw paswoord"
-new_password_success = "Succes! Je paswoord is aangepast."
+new_password = "Nieuw wachtwoord"
+new_password_success = "Succes! Je wachtwoord is aangepast."
Newspaper = "Dagblad"
Next = "Volgende"
No citations are available for this record = "Er zijn geen citaties beschikbaar voor dit record."
@@ -655,7 +669,7 @@ number_decimal_point = ","
number_thousands_separator = "."
OAI Server = "OAI Server"
of = "van"
-old_password = "Oude paswoord"
+old_password = "Oude wachtwoord"
On Reserve = "Gereserveerd"
On Reserve - Ask at Circulation Desk = "Gereserveerd - Vraag aan de uitleenbalie"
on_reserve = "Vraag aan de uitleenbalie"
@@ -673,12 +687,13 @@ Other Libraries = "Andere bibliotheken"
Other Sources = "Andere bronnen"
Page not found. = "De pagina werd niet gevonden"
Password = "Wachtwoord"
-Password Again = "Nog eens je paswoord"
-Password cannot be blank = "paswoord kan niet blanco zijn"
-password_error_not_unique = "Het paswoord werd niet aangepast"
-password_maximum_length = "Het paswoord bevat maximaal %%maxlength%% karakters"
-password_minimum_length = "Het paswoord bevat minimaal %%minlength%% karakters"
-Passwords do not match = "Paswoorden komen niet overeen"
+Password Again = "Nog eens je wachtwoord"
+Password cannot be blank = "Wachtwoord kan niet blanco zijn"
+password_error_invalid = "Het wachtwoord is ongeldig (bv. bevat ongeldige karakters)"
+password_error_not_unique = "Het wachtwoord werd niet aangepast"
+password_maximum_length = "Het wachtwoord bevat maximaal %%maxlength%% karakters"
+password_minimum_length = "Het wachtwoord bevat minimaal %%minlength%% karakters"
+Passwords do not match = "Wachtwoorden komen niet overeen"
Past = "Vorige"
PDF Full Text = "PDF Full text"
peer_reviewed = "peer reviewed"
@@ -712,13 +727,17 @@ pronounced = "Uitgesproken"
Provider = "Leverancier"
Public = "Publiek"
Publication = "Publicatie"
+Publication Date = "Publicatiedatum"
Publication Frequency = "Periodiciteit"
Publication Information = "Publicatie info"
Publication Type = "Publicatie type"
+Publication Year = "Publicatiejaar"
Publication_Place = "Plaats van publicatie"
Published = "Gepubliceerd in"
Published in = "Gepubliceerd in"
Publisher = "Uitgever"
+Publisher Information = "Uitgeversinformatie"
+Publisher Permissions = "Uitgever Machtigingen"
QR Code = "QR code"
qrcode_hide = "Verberg QR code"
qrcode_show = "Toon QR code"
@@ -734,15 +753,15 @@ Record Count = "Aantal records"
Recover Account = "Herstel je account"
recovery_by_email = "Herstel met behulp van je e-mail"
recovery_by_username = "Herstel met behulp van je gebruikersnaam"
-recovery_disabled = "Paswoord herstellen niet geactiveerd"
-recovery_email_notification = "Er werd zonet verzocht het paswoord voor account van %%bibliotheek%% te herstellen."
-recovery_email_sent = "Instructies voor het herstellen van het paswoord voor deze account werden verzonden."
+recovery_disabled = "Wachtwoord herstellen niet geactiveerd"
+recovery_email_notification = "Er werd zonet verzocht het wachtwoord voor account van %%bibliotheek%% te herstellen."
+recovery_email_sent = "Instructies voor het herstellen van het wachtwoord voor deze account werden verzonden."
recovery_email_subject = "VuFind Account Herstel"
-recovery_email_url_pretext = "Je kan je paswoord herstellen via deze URL: %%url%%"
+recovery_email_url_pretext = "Je kan je wachtwoord herstellen via deze URL: %%url%%"
recovery_expired_hash = "Deze herstellink is verlopen"
recovery_invalid_hash = "Herstelling niet herkend"
-recovery_new_disabled = "Je kan je paswoord op dit ogenblik niet wijzigen"
-recovery_title = "Paswoord herstellen"
+recovery_new_disabled = "Je kan je wachtwoord op dit ogenblik niet wijzigen"
+recovery_title = "Wachtwoord herstellen"
recovery_too_soon = "Teveel herstelvragen werden verzonden, probeer later opnieuw"
recovery_user_not_found = "We vinden je account niet"
Refine Results = "Verfijn je resultaten"
@@ -847,6 +866,7 @@ sort_title = "Titel"
sort_year = "Datum Aflopend"
sort_year asc = "Datum Oplopend"
Source = "Bron"
+Source Title = "Bron Titel"
spell_expand_alt = "Zoekopdracht uitbreiden"
spell_suggest = "Alternatieven"
Staff View = "Personeel"
@@ -887,6 +907,7 @@ storage_retrieval_request_year = "Jaar"
Subcollection = "Subcollectie"
Subject = "Onderwerp"
Subject Area = "Vakgebied"
+Subject Geographic = "Onderwerpslocatie"
Subject Recommendations = "Onderwerp aanbevelingen"
Subject Terms = "Onderwerpstermen"
Subject(s) = "Onderwerp(en)"
@@ -951,6 +972,7 @@ total_resources = "Totaal aantal middelen"
total_saved_items = "Totaal aantal bewaarde items"
total_tags = "Totaal want. Tags"
total_users = "Totaal aant. gebruikers"
+Transliterated Title = "Omgezette Titel"
tree_search_limit_reached_html = "Je zoekopdracht leverde teveel resultaten op om weer te geven in de boomstructuur. De eerste %%limit%% items worden getoond. Voor de volledige lijst klik hier."
unique_tags = "Unieke tags"
University Library = "Universiteitsbibliotheek"
@@ -1019,4 +1041,4 @@ Your search terms = "Jouw zoektermen"
Your Tags = "Jouw tags"
your_match_would_be_here = "Hier zou je resultaat gestaan hebben."
Zip = "Zip"
-zoom = "Zoom"
\ No newline at end of file
+zoom = "Zoom"
diff --git a/languages/pl.ini b/languages/pl.ini
index 30153d2ec22..36cea31202d 100644
--- a/languages/pl.ini
+++ b/languages/pl.ini
@@ -16,7 +16,7 @@
;Change Profile Email Text = "Następujący czytelnik zaktualizował dane osobowe"
;Change Profile Heading = "Zaktualizuj swoje dane osobowe"
;Change Profile Text = "Sprawdź dane osobowe i zaktualizuj tylko zmienione pozycje."
-;Change Profile Your Data = "Twoje dotychczasowe dane osobowe"
+;Change Profile Your Data = "Dotychczasowe dane osobowe"
;Change Profile Your New Data = "Zaktualizowane dane osobowe"
;Changed Profile = "Nowe dane osobowe"
;Deadline = "Termin zwrotu"
@@ -27,14 +27,14 @@
;feedback_duplicate = "Podwójny feedback. Spróbuj jeszcze raz."
;feedback_duplicate_issue = "Feedback z tym tytułem już istnieje"
;feedback_email_title = "Feedback dostarczony"
-;feedback_error = "Wystąpił błąd przy wysyłaniu Twojego feedbacku. Spróbuj ponownie."
+;feedback_error = "Wystąpił błąd przy wysyłaniu feedbacku. Spróbuj ponownie."
;feedback_missing = "Wypełnij wszystkie pola."
-;feedback_thanks = "Dziekujemy za Twój feedback."
-;feedback_update_error = "Wystąpił błąd przy wysyłaniu Twojego feedbacku."
+;feedback_thanks = "Dziekujemy za feedback."
+;feedback_update_error = "Wystąpił błąd przy wysyłaniu feedbacku."
;feedback_update_success = "Feedback został zaktualizowany."
;feedback_url = "Feedback URL"
;In process = "w opracowaniu"
-;In transit to sublibrary= "Transfer do filii"
+;In transit to sublibrary= "Transfer do filiali"
;Name = Nazwisko
;New Data = "Nowe dane osobiste czytelnika"
;no_feedback = "Nie ma feedbacku"
@@ -64,8 +64,11 @@
;note_785_7 = "Połączone z" ; incomplete translation (en.ini was later revised)
Abstract = "Streszczenie"
Access = "Ograniczenie dostępu"
+Access URL = "URL dostępu"
+Accession Number = "Numer dostępu"
Account = "Konto czytelnika"
Add = "Dołączyć"
+Add a Library Card = "Dołącz kartę biblioteczną"
Add a Note = "Dodaj adnotację"
Add Tag = "Dodaj etykietę"
Add Tags = "Dodaj etykiety"
@@ -102,14 +105,17 @@ adv_search_toc = "Streszczenie"
adv_search_year = "Rok wydania"
Advanced = "Wyszukiwanie zaawansowane"
Advanced Search = "Wyszukiwanie zaawansowane"
-advSearchError_noRights = "Nie możesz zmienić wyszukiwania, skończyła się twoja sesja."
+advSearchError_noRights = "Nie możesz zmienić wyszukiwania, skończyła się sesja."
advSearchError_notAdvanced = "Nie możesz edytować wyszukiwania. Nie używasz wyszukiwania zaawansowanego."
advSearchError_notFound = "Nie znaleziono żądanego wyszukiwania."
+ajaxview_label_information = "Informacja"
+ajaxview_label_tools = "Narzędzia"
All = "wszystko"
All Fields = "Wszystkie pola"
All Pages Loaded = "Wszystkie strony są załadowane."
All Text = "Cały tekst"
alphabrowse_matches = "Rezultat"
+alphabrowselink_html = "Przeglądaj zapisy według %%index%% zaczynając od %%from%%."
An error has occurred = "Wystąpił błąd."
An error occurred during execution; please try again later. = "Wystąpił błąd. Spróbuj później."
AND = "I"
@@ -132,11 +138,12 @@ Author Notes = "Dane autora"
Author Results for = "Znalezieni autorzy"
Author Search Results = "Rezultaty wyszukiwania według autorów"
Authors = "Autorzy"
-Authors Related to Your Search = "Autorzy zrelacjonowani z twoim wyszukiwaniem."
+Authors Related to Your Search = "Autorzy zrelacjonowani z wyszukiwaniem."
Auto configuration is currently disabled = "Autokonfiguracja jest nieaktywna."
auto_configure_description = "W razie świeżej instalacji, możesz użyć narzędzie autokonfiguracji aby usunąć ten błąd."
auto_configure_disabled = "Autokonfiguracja jest nieaktywna."
auto_configure_title = "Autokonfiguracja"
+Availability = "Dostępność"
Available = "Dostępne"
Available Functionality = "Operacje dostępne"
Awards = "Nagrody"
@@ -162,8 +169,8 @@ bookbag_email_selected = "Wyślij zaznaczone książki e-mailem"
bookbag_export = "Eksportuj zaznaczone książki z listy podręcznej"
bookbag_export_selected = "Eksportuj zaznaczone książki"
bookbag_full = "Pełny"
-bookbag_full_msg = "Twoja lista podręczna jest pełna"
-bookbag_is_empty = "Twoja lista podręczna jest pusta"
+bookbag_full_msg = "Lista podręczna jest pełna"
+bookbag_is_empty = "Lista podręczna jest pusta"
bookbag_print_selected = "Drukuj zaznaczone książki"
bookbag_save = "Zapisz zaznaczone książki z listy podręcznej"
bookbag_save_selected = "Zapisz zaznaczone książki"
@@ -192,8 +199,8 @@ bulk_error_missing = "Brak danych. Wyszukiwanie nieudane."
bulk_export_not_supported = "Zaznaczone zapisy nie stosują się do eksportu masowego."
bulk_fail = "Błąd: Spróbuj jeszcze raz."
bulk_noitems_advice = "Nic nie wybrałeś. Naciśnij przycisk wyboru obok zapisu i spróbuj jeszcze raz."
-bulk_save_error = "Brak danych. Nie udało się zapisać Twojego wyboru."
-bulk_save_success = "Twój wybór został zapisany."
+bulk_save_error = "Brak danych. Nie udało się zapisać wyboru."
+bulk_save_success = "Wybór został zapisany."
By = "od"
by = "od"
By Alphabetical = "Alfabetycznie"
@@ -257,6 +264,8 @@ Company/Entity = "Firma/jednostka"
Configuration = "Konfiguracja"
confirm_delete = "Czy chcesz to naprawdę usunąć?"
confirm_delete_brief = "Usunąć?"
+confirm_delete_library_card_brief = "Czy chcesz usunąć kartę biblioteczną?"
+confirm_delete_library_card_text = "Czy naprawdę chcesz usunąć kartę biblioteczną?"
confirm_delete_list_brief = "Usunąć listę?"
confirm_delete_list_text = "Czy chcesz usunąć tę listę?"
confirm_delete_tags_brief = "Usuń etykiety"
@@ -271,9 +280,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Czy chcesz usunąć wszystk
confirm_storage_retrieval_request_cancel_selected_text = "Czy chcesz usunąć zaznaczone zamówienia magazynowe?"
conjunction_or = "albo"
Contents = "Treść"
+Contributing Source = "Źródło przyczyniające"
Contributors = "Kolejni autorzy"
Copies = "Egzemplarze"
Copy = "Egzemplarz"
+Copyright = "Prawo autorskie"
Corporate Author = "Korporacja"
Country = "Kraj"
Course = "Semestr"
@@ -296,7 +307,7 @@ Debug Information = "Informacje Debug"
del_search = "Usunąć wyszukiwanie"
Delete = "Usuń"
delete_all = "Usuń wszystko"
-delete_comment_failure = "Błąd: Nie udało się usunąć Twojego kommentarza."
+delete_comment_failure = "Błąd: Nie udało się usunąć kommentarza."
delete_comment_success = "Kommentarz został usunięty."
delete_list = "Usunąć listę"
delete_page = "Usuń strone"
@@ -311,12 +322,14 @@ Detailed View = "Szczegółowy widok"
Details = "Szczegóły"
Displaying the top = "Widoczne są pierwsze rezultaty"
Document Inspector = "Kontroler dokumentów"
+Document Type = "Typ dokumentu"
DOI = "DOI"
Due = "do"
Due Date = "Termin zwrotu"
DVD = "DVD"
eBook = "E-book"
Edit = "Edytuj"
+Edit Library Card = "Edytuj kartę biblioteczną"
Edit this Advanced Search = "Edytuj wyszukiwanie zaawansowane"
edit_list = "Opracuj listę"
edit_list_fail = "Nie masz odpowiednich uprawnień do opracowania tej listy."
@@ -402,6 +415,7 @@ Fee = "Opłata"
Feedback = "Feedback"
Feedback Email = "E-mail nadawcy"
feedback_name = "Nazwisko"
+File Description = "Opis pliku"
Filter = "filtr"
filter_tags = "Filtruj etykiety"
filter_wildcard = "wszystko"
@@ -455,7 +469,7 @@ history_empty_search = "Cokolwiek (puste wyszukiwanie)"
history_limits = "Filtry"
history_no_searches = "Historia wyszukiwania jest pusta."
history_purge = "Usuń wyszukiwania, które nie są zapisane."
-history_recent_searches = "Twoje aktualne wyszukiwania"
+history_recent_searches = "Aktualne wyszukiwania"
history_results = "Rezultat"
history_save = "Zapisać?"
history_save_link = "Zapisz"
@@ -479,7 +493,7 @@ hold_invalid_request_group = "Została podana nieważna grupa zamówienia. Spró
hold_login = "Dla informacji o zamówieniu / rezerwacji"
hold_place = "Zamów / zarezerwuj"
hold_place_fail_missing = "Błąd: Brak danych - skontaktuj się z biblioteką."
-hold_place_success_html = "Zamówienie / rezerwacja została wykonana. Twoje zamówienia."
+hold_place_success_html = "Zamówienie / rezerwacja została wykonana. Zamówienia."
hold_profile_html = "Aby zamówić lub rezerwować książkę, utwórz konto czytelnika."
hold_queue_position = "Pozycja w kolejce"
hold_request_group = "Rezerwacja z"
@@ -534,11 +548,12 @@ in = "w"
In This Collection = "w tej kolekcji"
in_collection_label = "w kolekcji:"
include_synonyms = "Rozszerz wyniki stosując synonimy"
+Index Terms = "Hasło indexu"
Indexes = "Indeksy"
information = "Informacja"
Institution = "Instytucja"
Institutional Login = "Logowanie instytutycjonalne"
-institutional_login_desc = "Podaj twoją nazwę użytkownika i hasło."
+institutional_login_desc = "Podaj nazwę użytkownika i hasło."
Instructor = "Wykładowca"
Interlibrary Loan Requests = "Zamówienia międzybiblioteczne"
Internet = "Internet"
@@ -559,9 +574,11 @@ items_added_to_bookbag = "Zaznaczone książki zostały dołączone do listy pod
items_already_in_bookbag = "Zaznaczone książki już są w liście podręcznej"
Journal = "Czasopismo"
Journal Articles = "Artykuł"
+Journal Info = "Opis czasopisma"
Journal Title = "Tytuł czasopisma"
Journals = "Czasopisma"
Jump to = "Skocz do"
+just_cataloged = "Zapis świeżo skatalogowany"
Keyword = "Słowo kluczowe"
Keyword Filter = "Filtr słowa kluczowego"
Kit = "Różne nośniki"
@@ -571,7 +588,19 @@ Last = "Ostatnia"
Last Modified = "Ostatnia zmiana"
Last Name = "Nazwisko"
less = "Mniej"
+libphonenumber_invalid = "Numer telefonu nieważny"
+libphonenumber_invalidcountry = "Numer kierunkowy kraju nieważny"
+libphonenumber_invalidregion = "Numer kierunkowy nieważny"
+libphonenumber_notanumber = "Podany ciąg znaków nie wydaje się numerem telefonu"
+libphonenumber_toolong = "Podany ciąg znaków jest za długi aby być numerem telefonu"
+libphonenumber_tooshort = "Podany ciąg znaków jest za krótki aby być numerem telefonu"
+libphonenumber_tooshortidd = "Numer telefonu za kierunkowym kraju jest za krótki"
Library = "Biblioteka"
+Library Card = "Karta biblioteczna"
+Library Card Deleted = "Karta biblioteczna została usunięta"
+Library Card Name = "Nazwa karty bibliotecznej"
+Library Cards = "Karty biblioteczne"
+Library Cards Disabled = "Karty biblioteczne zostały wyłączone"
Library Catalog Password = "Hasło"
Library Catalog Profile = "Dane użytkownika"
Library Catalog Record = "Rekord"
@@ -607,6 +636,7 @@ map_results_label = "w tej filii:"
Maps = "Mapy"
Media Format = "Format medium"
medium = "Książka"
+MeSH Terms = "Hasło MeSH"
Message = "Wiadomość"
Message From Sender = "Wiadomość od nadajnika"
Metadata Prefix = "Prefiks opisu"
@@ -625,10 +655,10 @@ Most Recent Received Issues = "Najnowsze wydania"
Multiple Call Numbers = "Sygnatury złożone"
Multiple Locations = "Lokalizacje złożone"
Musical Score = "Partytura"
-My Favorites = "Moje listy ulubionych"
-My Fines = "Moje opłaty"
-My Holds = "Moje zamówienia i rezerwacje"
-My Profile = "Mój profil"
+My Favorites = "Listy ulubionych"
+My Fines = "Opłaty"
+My Holds = "Zamówienia i rezerwacje"
+My Profile = "Profil"
Narrow Search = "Redukuj rezultaty"
navigate_back = "z powrotem"
Need Help? = "Pomoc"
@@ -638,7 +668,7 @@ New Item Search Results = "Rezultaty nowych nabytków"
New Items = "Nowe nabytki"
New Title = "Nowy tytuł"
new_password = "Nowe hasło"
-new_password_success = "Twoje hasło zostało zmienione"
+new_password_success = "Hasło zostało zmienione"
Newspaper = "Gazeta"
Next = "Następna"
No citations are available for this record = "Dla tego zapisu nie można stworzyć cytatu."
@@ -656,7 +686,7 @@ nohit_filters = "Zastosowane filtry"
nohit_heading = "Nie ma rezultatów!"
nohit_no_filters = "W tym wyszukiwaniu nie zastosowałeś filtrów."
nohit_parse_error = "Wystąpił problem przy wyszukiwaniu - sprawdź składnię. Jeśli nie używasz kompleksowej składni wyszukiwania, napisz parametry w cudzysłowie."
-nohit_prefix = "Dla twojego wyszukiwania"
+nohit_prefix = "Dla wyszukiwania"
nohit_spelling = "Spróbuj zastosować inną pisownię."
nohit_suffix = "Nie znaleziono tożsamości."
nohit_suggest = "Możesz polepszyć wyszukiwanie usuwając słowa oraz sprawdzając ortografię."
@@ -719,6 +749,7 @@ Page not found. = "Strona nie istnieje."
Password = "Hasło"
Password Again = "Powtórz hasło"
Password cannot be blank = "Hasło nie może być spacją"
+password_error_invalid = "Nowe hasło jest nieważne (n.p. zawiera nieprawidłowe znaki)"
password_error_not_unique = "Hasło nie zostało zmienione"
password_maximum_length = "Maksymalna długość hasła to %%maxlength%% znaków"
password_minimum_length = "Minimalna długość hasła to %%minlength%% znaków"
@@ -751,18 +782,22 @@ print_selected = "Drukuj zaznaczone elementy"
Private = "Prywatne"
Production Credits = "Dane produkcji"
Profile = "Profil"
-profile_update = "Twoje dane osobiste zostały zmienione"
+profile_update = "Dane osobiste zostały zmienione"
pronounced = "Wymówiono"
Provider = "Dostawca"
Public = "Publiczne"
Publication = "Wydawnictwo"
+Publication Date = "Data wydania"
Publication Frequency = "Sposób wydania"
Publication Information = "Informacje bibliograficzne"
Publication Type = "Typ publikacji"
+Publication Year = "Rok wydania"
Publication_Place = "Miejsce wydania"
Published = "Wydane"
Published in = "Wydane w"
Publisher = "Wydawnictwo"
+Publisher Information = "Informacje o wydawnictwie"
+Publisher Permissions = "Pozwolenia wydawnictwa"
QR Code = "kod QR"
qrcode_hide = "schowaj kod QR"
qrcode_show = "pokaż kod QR"
@@ -788,7 +823,7 @@ recovery_invalid_hash = "Link do odzyskania hasła nie został rozpoznany"
recovery_new_disabled = "Nie możesz zmienić hasła w tym momencie"
recovery_title = "Odzyskanie hasła"
recovery_too_soon = "Wysłano za dużo żądań odzyskania. Spróbuj później"
-recovery_user_not_found = "Nie znaleźliśmy twojego konta"
+recovery_user_not_found = "Nie znaleźliśmy takiego konta"
Refine Results = "Redukuj rezultaty"
Region = "Region"
Related Author = "Podobni autorzy"
@@ -861,7 +896,7 @@ select_pickup_location = "Wybierz miejsce odebrania"
select_request_group = "Wybierz grupę zamówienia"
Selected = "Wybrane"
Send = "wyślij"
-Send us your feedback! = "Wyślij nam Twój feedback!"
+Send us your feedback! = "Wyślij nam feedback!"
send_an_email_copy = "Wyślij kopię na ten adres"
send_email_copy_to_me = "Wyślij kopię do mnie"
Sensor Image = "Czujnik obrazu"
@@ -891,6 +926,7 @@ sort_title = "Tytuł"
sort_year = "Według najnowszych"
sort_year asc = "Według najstarszych"
Source = "Źródło"
+Source Title = "Tytuł źródła"
spell_expand_alt = "Wyszukiwanie zaawansowane"
spell_suggest = "Inne możliwości wyszukiwania"
Staff View = "Wersja MARC"
@@ -931,6 +967,7 @@ storage_retrieval_request_year = "Rok"
Subcollection = "Część zbioru"
Subject = "Hasło przedmiotowe"
Subject Area = "Pole hasła przedmiotowego"
+Subject Geographic = "Hasło geograficzne"
Subject Recommendations = "Rekomendacja hasła przedmiotowego"
Subject Terms = "Hasła"
Subject(s) = "Hasło Subject(s)"
@@ -964,10 +1001,10 @@ test_fail = "Test się nie udał."
test_fix = "naprawione"
test_ok = "OK"
Text this = "Wyślij wiadomość"
-Thank you for your feedback. = "Dziękujemy za Twój feedback."
+Thank you for your feedback. = "Dziękujemy za feedback."
That email address is already used = "Ten e-Mail już jest w bazie"
That username is already taken = "Podana nazwa użytkownika jest już zajęta"
-The record you selected is not part of any of your lists. = "Wybrany zapis nie znajduje się na żadnej z twoich list."
+The record you selected is not part of any of your lists. = "Wybrany zapis nie znajduje się na żadnej liście."
The record you selected is not part of the selected list. = "Wybrany zapis nie znajduje się na tej liście."
The system is currently unavailable due to system maintenance = "Z powodu przeglądu technicznego system jest niedostępny."
Theme = "Layout"
@@ -995,19 +1032,21 @@ total_resources = "Suma zasobów"
total_saved_items = "Suma zapisanych pozycji"
total_tags = "Suma etykiet"
total_users = "Suma użytkowników"
-tree_search_limit_reached_html = "Twoje wyszukiwanie wykazało za dużo rezultatów aby pokazać całą hierarchię. Widoczne jest %%limit%% rezultatów. Aby zobaczyć wszystkie wyniki, kliknij tutaj."
+Transliterated Title = "Tytuł transliterowany"
+tree_search_limit_reached_html = "Wyszukiwanie wykazało za dużo rezultatów aby pokazać całą hierarchię. Widoczne jest %%limit%% rezultatów. Aby zobaczyć wszystkie wyniki, kliknij tutaj."
unique_tags = "Niepowtarzalne etykiety"
University Library = "Biblioteka Uniwersytecka"
Unknown = "Nieznany"
unrecognized_facet_label = "inne"
Upgrade VuFind = "Aktualizacja oprogramowania Vufind"
-upgrade_description = "Za pomocą tego narzędzia możesz utrzymać twoje ustawienia przy aktualizacji z wcześniejszej wersji Vufind."
+upgrade_description = "Za pomocą tego narzędzia możesz utrzymać ustawienia przy aktualizacji z wcześniejszej wersji Vufind."
URL = "URL"
Use for = "Użyj do"
Use instead = "Użyj zamiast"
User Account = "Konto czytelnika"
Username = "Nazwa użytkownika"
Username cannot be blank = "Nazwa użytkownika nie może być spacją"
+Username is already in use in another library card = "Nazwa użytkownika już istnieje"
VHS = "VHS"
Video = "Wideo"
Video Clips = "Wideoclips"
@@ -1045,20 +1084,21 @@ You do not have any fines = "Nie masz opłat na twoim koncie"
You do not have any holds or recalls placed = "Nie masz zamówień"
You do not have any interlibrary loan requests placed = "Nie masz zamówień międzybibliotecznych"
You do not have any items checked out = "Nie masz wypożyczonych książek"
+You do not have any library cards = "Nie posiadasz karty bibliotecznej"
You do not have any saved resources = "Nie masz zapisanych książek"
You do not have any storage retrieval requests placed = "Nie masz zamówień magazynowych"
You must be logged in first = "Najpierw się zaloguj"
-Your Account = "Twoje konto czytelnika"
-Your book bag is empty = "Twoja lista podręczna jest pusta"
-Your Checked Out Items = "Twoje wypożyczone książki"
-Your Comment = "Twoje komentarze"
-Your Favorites = "Twoje ulubione książki"
-Your Fines = "Twoje opłaty"
-Your Holds and Recalls = "Twoje zamówienia"
-Your Lists = "Twoje listy"
-Your Profile = "Twoje dane osobiste"
+Your Account = "Konto czytelnika"
+Your book bag is empty = "Lista podręczna jest pusta"
+Your Checked Out Items = "Wypożyczone książki"
+Your Comment = "Komentarze"
+Your Favorites = "Ulubione książki"
+Your Fines = "Opłaty"
+Your Holds and Recalls = "Zamówienia"
+Your Lists = "Listy"
+Your Profile = "Dane osobiste"
Your search terms = "Twoje hasła"
Your Tags = "Twoje etykiety"
-your_match_would_be_here = "Twoja tożsamość byłaby tutaj."
+your_match_would_be_here = "Tożsamość byłaby tutaj."
Zip = "Kod pocztowy"
-zoom = "Powiększ"
\ No newline at end of file
+zoom = "Powiększ"
diff --git a/languages/pt-br.ini b/languages/pt-br.ini
index 9400f502210..e05ab05a7c0 100644
--- a/languages/pt-br.ini
+++ b/languages/pt-br.ini
@@ -1,20 +1,22 @@
; For future reference:
;Brazilian Portugese = "Português (Brasil)"
-;note_785_7 = "Juntado com" ; incomplete translation (en.ini was later revised)
Abstract = "Resumo"
Access = "Acesso"
+Access URL = "Acessar a URL"
+Accession Number = "Número de chamada"
Account = "Conta"
Add = "Adicionar"
+Add a Library Card = "Adicionar Cartão de Biblioteca"
Add a Note = "Adicionar uma nota"
Add Tag = "Adicionar Tag"
Add Tags = "Adicionar Tags"
Add to another list = "Adicionar a outra lista"
Add to Book Bag = "Adicionar à cesta"
-Add to favorites = "Adic. favoritos"
+Add to favorites = "Salvar na lista"
Add your comment = "Adicionar comentário"
-add_comment_fail_blank = "O Comentário não pode estar em branco."
+add_comment_fail_blank = "O comentário não pode estar em branco."
add_comment_success = "Comentário adicionado."
-add_favorite_fail = "Erro: Registro não foi salvo"
+add_favorite_fail = "Erro: registro não foi salvo"
add_favorite_prefix = "Adicionar"
add_favorite_suffix = "aos favoritos"
add_list_fail = "Erro: Lista não criada"
@@ -22,7 +24,7 @@ add_other_libraries = "Inclua artigos em outras bibliotecas"
add_search = "Adicionar campo de busca"
add_search_group = "Adicionar Grupo de Busca"
add_tag_error = "Erro: Não foi possível salvar as Tags"
-add_tag_note = "Tags separadas por espaço. Use aspas para tags com várias palavras"."
+add_tag_note = "Tags separadas por espaço. Use aspas para tags com várias palavras."
add_tag_success = "Tags guardadas"
Address = "Endereço"
adv_search_all = "Todos os campos"
@@ -44,13 +46,16 @@ Advanced Search = "Busca Avançada"
advSearchError_noRights = "Desculpe, você não tem permissão para editar a busca. Talvez a sua sessão tenha expirado?"
advSearchError_notAdvanced = "A busca que solicitou a edição não é uma busca avançada."
advSearchError_notFound = "A busca que solicitou não foi encontrada."
+ajaxview_label_information = "Informação"
+ajaxview_label_tools = "Ferramentas"
All = "Todos"
All Fields = "Todos os campos"
All Pages Loaded = "Todas as páginas carregadas"
All Text = "TODO Texto"
-alphabrowse_matches = "Títulos"
+alphabrowse_matches = "Resultados"
+alphabrowselink_html = "Visualizar entradas pelo %%index%% iniciando com %%from%%."
An error has occurred = "Erro na aplicação"
-An error occurred during execution; please try again later. = "Um erro ocorreu durante a execução: por favor, tente mais tarde."
+An error occurred during execution; please try again later. = "Ocorreu um erro durante a execução; por favor, tente novamente mais tarde."
AND = "E"
anonymous_tags = "Tags anônimas"
APA Citation = "Citação norma APA"
@@ -73,19 +78,20 @@ Author Search Results = "Resultados da busca por Autor"
Authors = "Autores"
Authors Related to Your Search = "Autores relacionados com a sua busca"
Auto configuration is currently disabled = "A configuração automática está desativada"
-auto_configure_description = "Se esta é uma nova instalação, pode-se corrigir o erro usando a ferramenta de auto-configuração do VuFind"
+auto_configure_description = "Se esta é uma nova instalação, pode-se corrigir o erro usando a ferramenta de auto-configuração do VuFind."
auto_configure_disabled = "Configuração automática desativada."
auto_configure_title = "Auto-configuração"
+Availability = "Disponibilidade"
Available = "Disponível"
Available Functionality = "Funcionalidade disponível"
Awards = "Prémios"
Back to Record = "Voltar ao registro"
Back to Search Results = "Voltar à lista de resultados"
Backtrace = "Caminho"
-Bag = "Cesta"
+Bag = "Cesto"
Balance = "Balanço"
basic_search_keep_filters = "Restringir a busca atual / manter filtros"
-Be the first to leave a comment = "Seja o primeiro a compartilhar um comentário"
+Be the first to leave a comment = "Seja o primeiro a deixar um comentário"
Be the first to tag this record = "seja o primeiro a adicionar uma tag"
Bibliographic Details = "Detalhes bibliográficos"
Bibliography = "Bibliografia"
@@ -106,9 +112,9 @@ bookbag_is_empty = "a sua cesta está vazia"
bookbag_print_selected = "Imprimir os selecionados"
bookbag_save = "Gravar os registros da sua cesta numa lista de favoritos"
bookbag_save_selected = "Gravar os registros selecionados"
-Bookmark = "Salvar/Compartilhar"
+Bookmark = "Salvar/Partilhar"
Books = "Livros"
-Borrowing Location = "Local de Emprestimo"
+Borrowing Location = "Local Empréstimo"
Braille = "Braille"
Brief View = "Visão Breve"
Browse = "Navegar"
@@ -120,7 +126,7 @@ Browse the Collection = "Navegar a coleção"
Browse the Collection Alphabetically = "Navegar a coleção por ordem alfabética"
browse_author = "Autor"
browse_dewey = "CDU (Dewey)"
-browse_format = "Grau"
+browse_format = "Formato"
browse_lcc = "Call Number (LC)"
browse_publishDate = "Ano de Publicação"
browse_title = "Título"
@@ -134,7 +140,7 @@ bulk_noitems_advice = "Nenhum item foi selecionado. Por favor, clique na caixa d
bulk_save_error = "Alguns dados estavam faltando. Os seus registros não foram salvos."
bulk_save_success = "O(s) registro(s) foram salvos com sucesso"
By = "Por"
-by = "Por"
+by = "por"
By Alphabetical = "Por ordem alfabética"
By Author = "Autores"
By Call Number = "Por Área"
@@ -180,7 +186,7 @@ citation_volume_abbrev = "Vol."
Cite this = "Citar"
City = "Cidade"
clear_tag_filter = "Limpar filtro"
-close = "Fechar"
+close = "fechar"
Code = "Código"
Collection = "Coleção"
Collection Browse = "Navegar na Coleção"
@@ -196,11 +202,13 @@ Company/Entity = "Companhia/Entidade"
Configuration = "Configuração"
confirm_delete = "Tem certeza que quer apagar este usuário?"
confirm_delete_brief = "Apagar registro?"
+confirm_delete_library_card_brief = "Remover Cartão de Biblioteca Library Card?"
+confirm_delete_library_card_text = "Tem certeza que deseja remover este cartão de biblioteca?"
confirm_delete_list_brief = "Apagar a Lista?"
confirm_delete_list_text = "Tem certeza que quer apagar esta lista?"
confirm_delete_tags_brief = "Deletar tags"
-confirm_dialog_no = "Cancelar"
-confirm_dialog_yes = "Confirmar"
+confirm_dialog_no = "Não"
+confirm_dialog_yes = "Sim"
confirm_hold_cancel_all_text = "Deseja cancelar todas as suas reservas?"
confirm_hold_cancel_selected_text = "Deseja cancelar as reservas selecionadas?"
confirm_ill_request_cancel_all_text = "Deseja cancelar todas as requisições de débitos interbibliotecas?"
@@ -210,9 +218,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Deseja cancelar toda as req
confirm_storage_retrieval_request_cancel_selected_text = "Deseja cancelar as requisições de recuperação armazenadas selecionadas?"
conjunction_or = "ou"
Contents = "Conteúdos"
+Contributing Source = "Fonte contribuidora"
Contributors = "Colaboradores"
Copies = "Cópias"
-Copy = "Cód. Barras:"
+Copy = "Cópia"
+Copyright = "Copyright"
Corporate Author = "Autor Corporativo"
Country = "País"
Course = "Curso"
@@ -250,12 +260,14 @@ Detailed View = "Visão Detalhada"
Details = "Registro fonte"
Displaying the top = "Primeiros resultados"
Document Inspector = "Inspetor de documentos"
+Document Type = "Tipo de documento"
DOI = "DOI"
Due = "Fim do empréstimo"
Due Date = "Data fim do empréstimo"
DVD = "DVD"
-eBook = "livro electrônico"
+eBook = "livro eletrônico"
Edit = "Editar"
+Edit Library Card = "Editar Cartão de Biblioteca"
Edit this Advanced Search = "Editar a Busca Avançada"
edit_list = "Editar a Lista"
edit_list_fail = "Desculpe, você não tem permissão para editar esta lista"
@@ -271,7 +283,7 @@ eds_limiter_FT = "Texto Completo"
eds_limiter_FT1 = "Disponível no Catálogo da Biblioteca"
eds_limiter_RV = "Revisado pelos Pares"
eds_mode_all = "Encontrar todos os termos buscados"
-eds_mode_any = "Encontrat algum dos termos"
+eds_mode_any = "Encontrar algum dos termos"
eds_mode_bool = "Booleano/frase"
eds_mode_smart = "Busca com algorítmo SmartText"
eds_modes_and_expanders = "Modos de Busca e expansores"
@@ -293,12 +305,12 @@ email_subject = "Assunto"
email_success = "Mensagem Enviada"
Empty = "Esvaziar"
Empty Book Bag = "Esvaziar a cesta"
-Enable Auto Config = "Ativar Auto Config"
+Enable Auto Config = "Activar Auto Config"
End Page = "Última página"
Era = "Período"
-error_inconsistent_parameters = "Desculpe, ocorreu um erro. Identificamos alguns parâmetros inconsistentes."
+error_inconsistent_parameters = "Desculpe, ocorreu um erro. Detectados alguns parâmetros inconsistentes."
error_page_parameter_list_heading = "Parâmetros de pedido"
-Exception = "Exceção"
+Exception = "Excepção"
Excerpt = "Excerto"
exclude_facet = "[excluir]"
exclude_newspapers = "Excluir os artigos de jornal"
@@ -324,10 +336,10 @@ export_success = "Exportação concluída"
export_unsupported_format = "Formato de exportação não suportado"
FAQs = "FAQs"
fav_delete = "Apagar os Favoritos selecionados"
-fav_delete_deleting = "Os Favoritos selecionados serão apagados"."
+fav_delete_deleting = "Os Favoritos selecionados serão apagados."
fav_delete_fail = "Desculpe, ocorreu um erro. Os seu(s) favorito(s) não foram apagados."
fav_delete_missing = "Alguns dados foram perdidos. Os seu(s) favorito(s) não foram apagados."
-fav_delete_success = "Favorito)s) apagado(s)."
+fav_delete_success = "Favorito(s) apagado(s)."
fav_delete_warn = "Você está prestes a apagar os favoritos a partir de todas as suas listas - Se você quiser apagar favoritos a partir de uma lista específica, selecione a lista antes de clicar em apagar."
fav_email_fail = "Desculpe, ocorreu um erro. Favorito (s) não enviado(s) por e-mail."
fav_email_missing = "Alguns dados foram perdidos. Favorito (s) não enviado(s) por e-mail."
@@ -336,11 +348,12 @@ fav_export = "Exportar Favoritos"
fav_list_delete = "Lista de favoritos apagada"
fav_list_delete_cancel = "Lista não apagada"
fav_list_delete_fail = "Desculpe, ocorreu um erro. Lista não eliminada."
-Favorites = "Favoritos"
+Favorites = "Itens Guardados"
Fee = "Multas"
Feedback = "Comentário"
Feedback Email = "E-mail"
feedback_name = "Nome"
+File Description = "Descrição de arquivo"
Filter = "Filtro"
filter_tags = "Tags de filtro"
filter_wildcard = "Qualquer"
@@ -355,8 +368,8 @@ First = "Primeiro"
First Name = "Primeiro nome"
fix_metadata = "Sim, corrigir os metadados, eu espero"
for search = "para a busca"
-Forgot Password = "Esqueci a Senha"
-Form Submitted! = "Comentário enviada!"
+Forgot Password = "Esqueceu sua senha"
+Form Submitted! = "Comentário enviado!"
Format = "Formato"
found = "Encontrado"
From = "De"
@@ -381,7 +394,7 @@ Has Illustrations = "Possui ilustrações"
Help = "Ajuda"
Help with Advanced Search = "Ajuda com a Busca Avançada"
Help with Search Operators = "Ajuda com Operadores de busca"
-help_page_missing = "A página de ajuda requerinda não existe."
+help_page_missing = "A página de ajuda solicitada não existe."
hierarchy_hide_tree = "Ocultar toda a hierarquia"
hierarchy_show_tree = "Mostrar a Hierarquia completa"
hierarchy_tree = "Contexto"
@@ -405,7 +418,7 @@ hold_available = "Disponível para levantamento"
hold_cancel = "Cancelar a reserva"
hold_cancel_all = "Cancelar todas as reservas"
hold_cancel_fail = "A sua reserva não foi cancelada; por favor, contate o Balcão de Atendimento para ajuda adicional"
-hold_cancel_selected = "Cancelar as reservas selecionadas "
+hold_cancel_selected = "Cancelar as reservas selecionadas"
hold_cancel_success = "A sua reserva foi cancelada com sucesso"
hold_cancel_success_items = "reserva(s) foram canceladas com sucesso"
hold_date_invalid = "Por favor, introduza uma data válida"
@@ -419,7 +432,7 @@ hold_login = "para informação da reserva e levantamento"
hold_place = "Reservar"
hold_place_fail_missing = "O seu pedido não foi bem sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
hold_place_success_html = "O seu pedido foi salvo com sucesso. As suas Reservas e Pedidos."
-hold_profile_html = "Para reservas e devoluções, por favor estabelecer sua Perfil no Catálogo da Biblioteca."
hold_queue_position = "Posição na fila"
hold_request_group = "Pedido de"
hold_requested_group = "Requisitado por"
@@ -444,8 +457,8 @@ ill_request_cancel_success_items = "reserva(s) foram canceladas com sucesso"
ill_request_canceled = "Cancelado"
ill_request_check_text = "Checar Pedido de Débito Interbiblioteca"
ill_request_comments = "Comentários"
-ill_request_date_invalid = "Por favor, introduza uma data válida"
-ill_request_date_past = "Por favor, introduza uma data no futuro"
+ill_request_date_invalid = "Por favor, insira uma data válida"
+ill_request_date_past = "Por favor, insira uma data no futuro"
ill_request_empty_selection = "Nenhum pedido de débito interbiblioteca foi selecionado"
ill_request_error_blocked = "Não possui privilégios suficiente para colocar um pedido de débito interbiblioteca para este item"
ill_request_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
@@ -464,15 +477,16 @@ ill_request_submit_text = "Colocar Pedido"
Illustrated = "Ilustrado"
ils_offline_holdings_message = "A informação da disponibilidade do(s) exemplar(es) não está disponível de momento; por favor, aceite as nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter ajuda:"
ils_offline_home_message = "Os dados da sua conta e informação em tempo real de existências dos itens não estão disponíveis de momento; por favor, aceite as nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter assistência:"
-ils_offline_login_message = "Os dados da sua conta estarão indisponíveis durante este tempo Por favor, aceitem nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter assistência:."
+ils_offline_login_message = "Os dados da sua conta estarão indisponíveis durante este tempo Por favor, aceitem nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter assistência:"
ils_offline_status = "O sistema está em manutenção."
ils_offline_title = "Sistema em Manutenção"
Import Record = "Importar Registro"
Import to = "Importar para"
-in = "Em"
+in = "em"
In This Collection = "Nesta coleção"
in_collection_label = "Na coleção:"
include_synonyms = "Expandir resultados utilizando sinônimos"
+Index Terms = "Indexar termos"
Indexes = "Índices"
information = "Informações"
Institution = "Recursos"
@@ -498,9 +512,11 @@ items_added_to_bookbag = "registro(s) adicionado(s) à cesta"
items_already_in_bookbag = "registro(s) já estava(m) na cesta"
Journal = "Periódico"
Journal Articles = "Artigos de Periódicos"
+Journal Info = "Informação de periódico"
Journal Title = "Título do Periódico"
Journals = "Periódicos"
Jump to = "Ir para"
+just_cataloged = "Já Catalogado"
Keyword = "Palavra-chave"
Keyword Filter = "Filtrar por palavras-chave"
Kit = "Kit"
@@ -510,7 +526,19 @@ Last = "Último"
Last Modified = "Última modificação"
Last Name = "Sobrenome"
less = "menos"
+libphonenumber_invalid = "Número de telefone inválido"
+libphonenumber_invalidcountry = "Código telefônico de país inválido"
+libphonenumber_invalidregion = "Código de região inválido (DDD):"
+libphonenumber_notanumber = "A informação fornecida não se assemelha a um número telefônico"
+libphonenumber_toolong = "A informação fornecida é muito longa para ser um número telefônico"
+libphonenumber_tooshort = "A informação fornecida é muito curta para ser um número telefônico"
+libphonenumber_tooshortidd = "O número telefônico é muito curto depois do DDI"
Library = "Fonte"
+Library Card = "Cartão de Biblioteca"
+Library Card Deleted = "Cartão de Biblioteca Removido"
+Library Card Name = "Nome do Cartão de BibliotecaLibrary Card Name"
+Library Cards = "Cartões de Biblioteca"
+Library Cards Disabled = "Cartão de Biblioteca desativado"
Library Catalog Password = "Senha do Catálogo da Biblioteca"
Library Catalog Profile = "Perfil no Catálogo da Biblioteca"
Library Catalog Record = "Registro no Catálogo da Biblioteca"
@@ -528,7 +556,7 @@ load_tag_error = "Erro: não foi possível carregar as Tags"
Loading = "Carregando"
Local Login = "Login local"
local_login_desc = "Entre com o usuário e senha criado neste site."
-Located = "Localização"
+Located = "Localizado"
Location = "Localização"
Log Out = "Sair"
Login = "Entrar"
@@ -546,6 +574,7 @@ map_results_label = "Neste local:"
Maps = "Mapas"
Media Format = "Formato da Mídia"
medium = "Médio"
+MeSH Terms = "Termos DeCS"
Message = "Mensagem"
Message From Sender = "Remetente"
Metadata Prefix = "Prefixo de Metadados"
@@ -564,10 +593,10 @@ Most Recent Received Issues = "Números recebidos recentemente"
Multiple Call Numbers = "Vários números de telefone"
Multiple Locations = "Múltiplos locais"
Musical Score = "Partitura"
-My Favorites = "Os meus favoritos"
-My Fines = "As minha multas"
-My Holds = "As minhas reservas"
-My Profile = "O meu perfil"
+My Favorites = "Favoritos"
+My Fines = "Multas"
+My Holds = "Reservas"
+My Profile = "Perfil"
Narrow Search = "Refinar a Busca"
navigate_back = "Voltar"
Need Help? = "Precisa de ajuda?"
@@ -585,7 +614,7 @@ No Cover Image = "Imagem de Sem Capa"
No dependency problems found = "Não há problemas de dependência"
No excerpts were found for this record. = "Não foram encontrados excertos para este registro."
No library account = "Sem conta na Biblioteca"
-No new item information is currently available. = "Informação de novos registros não disponível de momento"."
+No new item information is currently available. = "Informação de novos registros não disponível de momento."
No Preference = "Sem preferência"
No reviews were found for this record = "Este registro não tem comentários inseridos"
No Tags = "Sem tags"
@@ -634,8 +663,8 @@ note_785_7 = "Mesclado com / Formulário"
note_785_8 = "Mudou de volta ao"
Notes = "Observações"
Number = "Número"
-number_decimal_point = ","
-number_thousands_separator = "."
+number_decimal_point = "."
+number_thousands_separator = ","
OAI Server = "Servidor OAI"
of = "de"
old_password = "Senha Antiga"
@@ -654,13 +683,14 @@ Other Authors = "Outros Autores"
Other Editions = "Outras Edições"
Other Libraries = "Outras Bibliotecas"
Other Sources = "Outras Fontes"
-Page not found. = "Págian não encontrada."
+Page not found. = "Página não encontrada."
Password = "Senha"
Password Again = "Senha, novamente"
Password cannot be blank = "A senha não pode estar em branco"
+password_error_invalid = "Nova senha é inválida (ex: contêm caracteres inválidos)"
password_error_not_unique = "Senha não foi alterada"
-password_maximum_length = "O tamnaho máximo da senha é de %%maxlength%% caracteres"
-password_minimum_length = "O tamanho mínomo da senha é de %%minlength%% caracteres"
+password_maximum_length = "O tamanho máximo da senha é %%maxlength%% caracteres"
+password_minimum_length = "O tamanho mínimo da senha é %%minlength%% caracteres"
Passwords do not match = "As senhas não coincidem."
Past = "Últimos"
PDF Full Text = "Texto Completo em Formato PDF"
@@ -669,7 +699,7 @@ peer_reviewed_limit = "Limitar a artigos de revistas e jornais"
Phone Number = "Número do Telefone"
Photo = "Foto"
Physical Description = "Descrição Física"
-Physical Object = "Objecto físico"
+Physical Object = "Objeto físico"
pick_up_location = "Local de levantamento"
Place a Hold = "Localização"
Playing Time = "Duração"
@@ -677,7 +707,7 @@ Please check back soon = "Por favor, volte em breve"
Please contact the Library Reference Department for assistance = "Por favor contate o Serviço de Referência da Biblioteca para mais ajuda"
Please enable JavaScript. = "Por favor ative o JavaScript no seu browser."
Please upgrade your browser. = "Por favor atualize seu browser."
-Posted by = "Compartilhado por"
+Posted by = "Postado por"
posted_on = "em"
Preferences = "Preferências"
Preferred Library = "Biblioteca Preferedida"
@@ -691,17 +721,21 @@ Private = "Privada"
Production Credits = "Créditos de produção"
Profile = "Descrição"
profile_update = "O seu perfil foi atualizado"
-pronounced = "declarado"
+pronounced = "pronunciado"
Provider = "Fornecedor"
Public = "Pública"
Publication = "Publicação"
+Publication Date = "Data de Publicação"
Publication Frequency = "Regularidade de publicação"
Publication Information = "Informação da Publicação"
Publication Type = "Tipo de Publicação"
+Publication Year = "Ano de Publicação"
Publication_Place = "Place of Publication"
Published = "Publicado em"
Published in = "Publicado no"
Publisher = "Editor"
+Publisher Information = "Informação da Editora"
+Publisher Permissions = "Permissão de Edição"
QR Code = "Código QR (código de barras bidimensional)"
qrcode_hide = "Esconder o código QR"
qrcode_show = "Mostrar o código QR"
@@ -714,7 +748,7 @@ Recall This = "Reservar"
recaptcha_not_passed = "Código CAPTCHA não coincidiu"
Record Citations = "Citações do registro"
Record Count = "Número de Registros"
-Recover Account = "Recuperar conta"
+Recover Account = "Recuperar Conta"
recovery_by_email = "Recuperar por email"
recovery_by_username = "Recuperar pela identificação do usuário"
recovery_disabled = "Recuperação de senha não disponível"
@@ -788,7 +822,7 @@ search_groups = "Grupos de Busca"
search_match = "correspondência da busca"
search_NOT = "NENHUM termo"
search_OR = "QUALQUER Termo"
-search_save_success = "Busca gurdada com sucesso."
+search_save_success = "Busca guardada com sucesso."
search_unsave_success = "Busca guardada apagada com sucesso."
seconds_abbrev = "s"
see all = "Ver todos"
@@ -809,8 +843,8 @@ Series = "coleção"
Set = "Definir"
Showing = "A mostrar"
Similar Items = "Registros relacionados"
-Skip to content = "Pular conteúdo"
-skip_confirm = "Tem certeza de que quer saltar esta etapa?"
+Skip to content = "Pular para o conteúdo"
+skip_confirm = "Tem certeza de que quer pular esta etapa?"
skip_fix_metadata = "Não corrigir os metadados no momento."
skip_step = "Saltar esta etapa"
Slide = "Slides"
@@ -830,6 +864,7 @@ sort_title = "Título"
sort_year = "Data Descendente"
sort_year asc = "Data Ascendente"
Source = "Fonte"
+Source Title = "Título Fonte"
spell_expand_alt = "Expandir a Busca"
spell_suggest = "Buscas alternativas"
Staff View = "Registro fonte"
@@ -850,10 +885,10 @@ storage_retrieval_request_cancel_success_items = "reserva(s) foram canceladas co
storage_retrieval_request_canceled = "Cancelado"
storage_retrieval_request_check_text = "Checar Pedido de Recuperação Armazenado"
storage_retrieval_request_comments = "Comentários"
-storage_retrieval_request_date_invalid = "Por favor, introduza uma data válida"
-storage_retrieval_request_date_past = "Por favor, introduza uma data no futuro"
+storage_retrieval_request_date_invalid = "Por favor, insira uma data válida"
+storage_retrieval_request_date_past = "Por favor, insira uma data no futuro"
storage_retrieval_request_empty_selection = "Nenhum pedido de recuperação armazenado foi selecionado"
-storage_retrieval_request_error_blocked = "Não possui privilégios suficientes para colocar um pedido de recuperação armazenada neste item"
+storage_retrieval_request_error_blocked = "Não possui privilégios suficientes para colocar um pedido de recuperação armazenamento neste item"
storage_retrieval_request_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
storage_retrieval_request_invalid_pickup = "Não introduziu um local de levantamento válido; por favor, tente novamente"
storage_retrieval_request_issue = "Data"
@@ -870,6 +905,7 @@ storage_retrieval_request_year = "Ano"
Subcollection = "Subcoleção"
Subject = "Assunto"
Subject Area = "Área / Assunto"
+Subject Geographic = "Informações Geograficas"
Subject Recommendations = "Recomendações de Assuntos"
Subject Terms = "Termos do Assunto"
Subject(s) = "Assunto(s)"
@@ -885,8 +921,8 @@ Supplied by Amazon = "Fornecido pela Amazon"
Switch view to = "Alterar a visualização para"
switchquery_intro = "Você pode obter mais resultados ajustando o argumento de busca."
switchquery_lowercasebools = "Caso esteja tentando utilizar os operadores booleanos, deve escrevê-los em Letras MAIÚSCULAS"
-switchquery_truncatechar = "Restinja sua busca para obter maiores resultados"
-switchquery_unwantedbools = "As palavras AND, OR e NOT pode ocasionar problemas na busca; tente utilizar as aspas"
+switchquery_truncatechar = "Reduza sua consulta de pesquisa para ampliar seus resultados"
+switchquery_unwantedbools = "As palabras AND, OR e NOT pode ocasionar problemas na busca; tente utilizar as aspas"
switchquery_unwantedquotes = "Remover as aspas pode possibilitar buscas mais amplas"
switchquery_wildcard = "Adicionar um caractere curinga pode recuperar variações da palavra buscada"
System Unavailable = "Sistema indisponível"
@@ -934,7 +970,8 @@ total_resources = "Total Resources"
total_saved_items = "Total de itens salvados"
total_tags = "Total de tags"
total_users = "Total de Usuários"
-tree_search_limit_reached_html = "A sua busca devolveu muitos resultados para mostrar em árvore. Mostrando apenas o primeiro %%limit%% registros. Para uma busca completa clique %%limit%% registros. Para uma busca completa clique aqui."
unique_tags = "Tags únicas"
University Library = "Biblioteca Universitária"
Unknown = "online"
@@ -947,6 +984,7 @@ Use instead = "Use"
User Account = "conta do usuário"
Username = "Login"
Username cannot be blank = "O login não pode estar em branco"
+Username is already in use in another library card = "Identificação já utilizada em outro cartão de biblioteca"
VHS = "VHS"
Video = "Vídeo"
Video Clips = "Video Clipes"
@@ -956,7 +994,7 @@ View Book Bag = "Ver cesta"
View Full Collection = "Ver Coleção Completa"
View Full Record = "Ver Registro Completo"
View in EDS = "Visualizar em EDS"
-View online: Full view Book Preview from the Hathi Trust = "Ver online: Full vista Reserve visualização da confiança Hathi"
+View online: Full view Book Preview from the Hathi Trust = "Veja online: Visualização completa livro prévia confiança Hathi"
View Record = "Ver Registro"
View Records = "Ver Registros"
View this record in EBSCOhost = "Visualizar este registro na base de dados BSCOhost"
@@ -974,7 +1012,7 @@ wcterms_exact = "Assuntos relacionados"
wcterms_narrower = "Assuntos mais específicos"
Web = "Web"
What am I looking at = "O que eu estou olhando?"
-widen_prefix = "Tente alargar a sua busca a"
+widen_prefix = "Tente ampliar a sua busca a"
wiki_link = "Fornecido pela Wikipedia"
with filters = "com os filtros"
with_selected = "selecionados"
@@ -982,8 +1020,9 @@ Year of Publication = "Ano de Publicação"
Yesterday = "Ontem"
You do not have any fines = "Você não tem quaisquer multas"
You do not have any holds or recalls placed = "Você não tem qualquer reserva ou pedidos colocados"
-You do not have any interlibrary loan requests placed = "Você não tem quaisquer pedidos de empréstimo entre bibliotecas colocados"
+You do not have any interlibrary loan requests placed = "Você não tem quaisquer pedidos de empréstimo entre interbibliotecas"
You do not have any items checked out = "Você não tem nenhum exemplar emprestado"
+You do not have any library cards = "Você não tem nenhum cartão de biblioteca"
You do not have any saved resources = "Você não possui recursos salvos"
You do not have any storage retrieval requests placed = "Você não tem quaisquer pedidos de recuperação armazenamento colocados"
You must be logged in first = "Deve entrar primeiro no seu login"
@@ -991,7 +1030,7 @@ Your Account = "A sua conta"
Your book bag is empty = "a sua cesta de livros está vazia"
Your Checked Out Items = "Empréstimos ativos"
Your Comment = "O seu comentário"
-Your Favorites = "Todos os Favoritos"
+Your Favorites = "Itens Guardados"
Your Fines = "As suas Multas"
Your Holds and Recalls = "As suas Reservas e Pedidos"
Your Lists = "As suas Listas"
@@ -1000,4 +1039,4 @@ Your search terms = "Termos de busca"
Your Tags = "As suas Tags"
your_match_would_be_here = "Sua correspondência pode estar aqui."
Zip = "Cód. Postal"
-zoom = "Ampliar"
\ No newline at end of file
+zoom = "Ampliar"
diff --git a/languages/pt.ini b/languages/pt.ini
index cbee5ce7bf1..cc75e8c2729 100644
--- a/languages/pt.ini
+++ b/languages/pt.ini
@@ -1000,4 +1000,4 @@ Your search terms = "Termos de pesquisa"
Your Tags = "As suas Tags"
your_match_would_be_here = "Os resultados encontrados estariam aqui."
Zip = "Cód. Postal"
-zoom = "Ampliar"
\ No newline at end of file
+zoom = "Ampliar"
diff --git a/languages/ru.ini b/languages/ru.ini
index f705a3f03af..5a57310d4da 100644
--- a/languages/ru.ini
+++ b/languages/ru.ini
@@ -19,8 +19,11 @@
;Welsh = "Уэльский"
Abstract = "Краткий обзор"
Access = "Доступ"
+Access URL = "Доступ через URL"
+Accession Number = "Номер доступа"
Account = "Акаунт"
Add = "Добавить"
+Add a Library Card = "Добавить карту библиотеки"
Add a Note = "Добавить примечание"
Add Tag = "Добавить метку"
Add Tags = "Добавить метки"
@@ -60,11 +63,14 @@ Advanced Search = "Расширенный поиск"
advSearchError_noRights = "Извините,но у Вас нет разрешений на редактирование этого поиска. Возможно, исчерпано время сеанса Вашего браузера?"
advSearchError_notAdvanced = "Запрошеный поиск для редактирования - не расширенный поиск."
advSearchError_notFound = "Не найден запрошенный поиск."
+ajaxview_label_information = "Информация"
+ajaxview_label_tools = "Инструменты"
All = "Все"
All Fields = "Все поля"
All Pages Loaded = "Загружены все страницы"
All Text = "Весь текст"
alphabrowse_matches = "Результаты"
+alphabrowselink_html = "Просмотр записей по индексу %%index%%, начиная с %%from%%."
An error has occurred = "Ошибка"
An error occurred during execution; please try again later. = "Ошибка при выполнении; повторите попытку позже."
AND = "И"
@@ -92,6 +98,7 @@ Auto configuration is currently disabled = "Сейчас выключена ав
auto_configure_description = "Если это - новая инсталляция, то можно исправлять ошибки с помощью инструмента VuFind's Auto Configure."
auto_configure_disabled = "Невозможна автоконфигурация."
auto_configure_title = "Автоконфигурация"
+Availability = "Доступность"
Available = "Доступно"
Available Functionality = "Доступная функциональность"
Awards = "Премия"
@@ -212,6 +219,8 @@ Company/Entity = "Компания/Сущность"
Configuration = "Конфигурация"
confirm_delete = "Нужно ли удалить это?"
confirm_delete_brief = "Удалить документ?"
+confirm_delete_library_card_brief = "Удалить карту библиотеки?"
+confirm_delete_library_card_text = "Нужно ли удалить эту карту библиотеки?"
confirm_delete_list_brief = "Удалить список?"
confirm_delete_list_text = "Нужно ли удалить этот список?"
confirm_delete_tags_brief = "Удалить метки"
@@ -226,9 +235,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Нужно ли отмен
confirm_storage_retrieval_request_cancel_selected_text = "Нужно ли отменить все Ваши выбранные запросы по выборке из хранилища?"
conjunction_or = "или"
Contents = "Контенты"
+Contributing Source = "Источник поступления"
Contributors = "Спонсоры"
Copies = "Копии"
Copy = "Копировать"
+Copyright = "Copyright"
Corporate Author = "Соавтор"
Country = "Страна"
Course = "Курс"
@@ -266,12 +277,14 @@ Detailed View = "Подробный просмотр"
Details = "Просмотр MARC-записи"
Displaying the top = "Просмотр верхней части"
Document Inspector = "Инспектор документов"
+Document Type = "Тип документа"
DOI = "DOI"
Due = "В течение"
Due Date = "Срок"
DVD = "DVD"
eBook = "eКнига"
Edit = "Редактировать"
+Edit Library Card = "Редактировать карту библиотеки"
Edit this Advanced Search = "Редактировать расширенный поиск"
edit_list = "Редактировать список"
edit_list_fail = "Вы не имеете права на редактирование этого файла"
@@ -357,6 +370,7 @@ Fee = "взнос"
Feedback = "обратной связи"
Feedback Email = "Email-обратной связи"
feedback_name = "Имя"
+File Description = "Описание файла"
Filter = "Фильтр"
filter_tags = "Метки фильтра"
filter_wildcard = "Любой"
@@ -489,6 +503,7 @@ in = "в"
In This Collection = "В этой коллекции"
in_collection_label = "В коллекции:"
include_synonyms = "Увеличить результаты, используя синонимы"
+Index Terms = "Термы индекса"
Indexes = "Индексы"
information = "Информация"
Institution = "Институт"
@@ -514,9 +529,11 @@ items_added_to_bookbag = "документы добавлены в книжну
items_already_in_bookbag = "документы либо в книжной сумке, либо их невозможно добавить"
Journal = "Журнал"
Journal Articles = "Статьи журнала"
+Journal Info = "Информация журнала"
Journal Title = "Заглавие журнала"
Journals = "Журналы"
Jump to = "Переход на"
+just_cataloged = "Только что скаталогицирован"
Keyword = "Ключевое слово"
Keyword Filter = "Фильтр ключевых слов"
Kit = "Набор"
@@ -526,7 +543,19 @@ Last = "Последний"
Last Modified = "Последняя модификация"
Last Name = "Фамилия"
less = "меньше"
+libphonenumber_invalid = "Неверный номер телефона"
+libphonenumber_invalidcountry = "Неверная страна вызывающего кода"
+libphonenumber_invalidregion = "Неверный код региона:"
+libphonenumber_notanumber = "Похоже, что поставленная строка не является номером телефона"
+libphonenumber_toolong = "Похоже, что поставленная строка слишком длинная и не является номером телефона"
+libphonenumber_tooshort = "Похоже, что поставленная строка слишком короткая и не является номером телефона"
+libphonenumber_tooshortidd = "Номер телефона слишком короток после IDD"
Library = "Библиотека"
+Library Card = "Карта библиотеки"
+Library Card Deleted = "Карта библиотеки удалена"
+Library Card Name = "Имя карты библиотеки"
+Library Cards = "Карты библиотек"
+Library Cards Disabled = "Карты библиотек выключены"
Library Catalog Password = "Пароль каталога библиотеки"
Library Catalog Profile = "Профиль каталога библиотеки"
Library Catalog Record = "Запись каталога библиотеки"
@@ -562,6 +591,7 @@ map_results_label = "В этом месте:"
Maps = "Карты"
Media Format = "Media-формат"
medium = "Средний"
+MeSH Terms = "MeSH-термы"
Message = "Сообщение"
Message From Sender = "Сообщение от отправителя"
Metadata Prefix = "Префикс метаданных"
@@ -674,6 +704,7 @@ Page not found. = "Не найдена страница."
Password = "Пароль"
Password Again = "Повторите пароль"
Password cannot be blank = "Пароль пуст"
+password_error_invalid = "Неверен новый пароль (т.е. содержит неверные символы)"
password_error_not_unique = "Не был изменен пародь"
password_maximum_length = "Максимальная длина пароля - %%maxlength%% символов"
password_minimum_length = "Минимальная длина пароля - %%minlength%% символов"
@@ -711,13 +742,17 @@ pronounced = "определен"
Provider = "Провайдер"
Public = "Публичный"
Publication = "Публикация"
+Publication Date = "Дата публикации"
Publication Frequency = "Частота публикаций"
Publication Information = "Информация публикации"
Publication Type = "Тип публикации"
+Publication Year = "Год публикации"
Publication_Place = "Поместить публикацию"
Published = "Опубликовано"
Published in = "Опубликовано в: "
Publisher = "Издатель"
+Publisher Information = "Издатель"
+Publisher Permissions = "Права издателя"
QR Code = "QR Code (код быстрого отклика)"
qrcode_hide = "Скрыть QR Code (код быстрого отклика)"
qrcode_show = "Показать QR Code (код быстрого отклика)"
@@ -846,6 +881,7 @@ sort_title = "Заглавие"
sort_year = "Нижняя дата"
sort_year asc = "Верхняя дата"
Source = "Источник"
+Source Title = "Заголовок источника"
spell_expand_alt = "Расширить поиск"
spell_suggest = "Альтернативы поиска"
Staff View = "Marc-запись"
@@ -886,6 +922,7 @@ storage_retrieval_request_year = "Год"
Subcollection = "Подколлекция"
Subject = "Предмет"
Subject Area = "Предметная область"
+Subject Geographic = "Тема география"
Subject Recommendations = "Рекомендации по предметам"
Subject Terms = "Термины предметов"
Subject(s) = "Предметы"
@@ -950,6 +987,7 @@ total_resources = "Всего ресурсов"
total_saved_items = "Всего сохраненных предпочтительных записей"
total_tags = "Всего меток"
total_users = "Всего пользователей"
+Transliterated Title = "Транслитеральный заголовок"
tree_search_limit_reached_html = "Поиск выдал слишком много данных для отображения в дереве. Показ только первых %%limit%% документов. Для полного поиска нажмите здесь."
unique_tags = "Уникальные метки"
University Library = "Университетская библиотека"
@@ -963,6 +1001,7 @@ Use instead = "Использовать вместо"
User Account = "Логин пользователя"
Username = "Имя пользователя"
Username cannot be blank = "Недопустимо пустое имя пользователя"
+Username is already in use in another library card = "Имя подьзователя уже используется другой биьлиотечной картой"
VHS = "VHS"
Video = "Видеозапись"
Video Clips = "Видеоклипы"
@@ -1000,6 +1039,7 @@ You do not have any fines = "У Вас нет штафов"
You do not have any holds or recalls placed = "У пользователя не должно быть никаких задолженностей или напоминаний"
You do not have any interlibrary loan requests placed = "Вы не задали ни один межбиблиотечный запрос"
You do not have any items checked out = "У пользователя не должно быть никаких недоступных документов."
+You do not have any library cards = "У вас нет никакой библиотечной карты"
You do not have any saved resources = "У пользователя не должно быть никаких сохраненных ресурсов."
You do not have any storage retrieval requests placed = "Вы не задали ни один запрос по выборке из хранилища"
You must be logged in first = "Сначала войдите в систему"
@@ -1016,4 +1056,4 @@ Your search terms = "Термины Вашего поиска"
Your Tags = "Ваши метки"
your_match_would_be_here = "Ваше соответствие было бы здесь."
Zip = "Zip"
-zoom = "Масштаб изображения"
\ No newline at end of file
+zoom = "Масштаб изображения"
diff --git a/languages/sl.ini b/languages/sl.ini
index 2ac47f8e024..06f77f87ad6 100644
--- a/languages/sl.ini
+++ b/languages/sl.ini
@@ -835,4 +835,4 @@ Your Profile = "Vaš profil"
Your search terms = "Vaši iskalni izrazi"
Your Tags = "Vaše oznake"
Zip = "Zip"
-zoom = "Povečaj"
\ No newline at end of file
+zoom = "Povečaj"
diff --git a/languages/sv.ini b/languages/sv.ini
index 0a4786eb531..d99808985a6 100644
--- a/languages/sv.ini
+++ b/languages/sv.ini
@@ -1,6 +1,8 @@
;note_785_7 = "Fortsättes efter sammanslagning med" ; incomplete translation (en.ini was later revised)
Abstract = "Abstrakt"
Access = "Tillgång"
+Access URL = "Länk till materialet"
+Accession Number = "Accessionsnummer"
Account = "Användarkonto"
Add = "Lägg till"
Add a Library Card = "Anslut bibliotekskort till mitt konto"
@@ -43,11 +45,14 @@ Advanced Search = "Utökad sökning"
advSearchError_noRights = "Sökningen kunde inte bearbetas. Orsaken kan vara att sessionen avbröts."
advSearchError_notAdvanced = "Sökningen, som du bearbetade, är inte en utökad sökning."
advSearchError_notFound = "Sökningen hittas inte."
+ajaxview_label_information = "Information"
+ajaxview_label_tools = "Verktyg"
All = "Alla"
All Fields = "Alla fält"
All Pages Loaded = "All Pages Loaded"
All Text = "All text"
alphabrowse_matches = "Resultat"
+alphabrowselink_html = "Bläddra efter %%index%% från %%from%%."
An error has occurred = "Det har uppstått ett fel"
An error occurred during execution; please try again later. = "Utförandet misslyckades. Försök på nytt efter en stund."
AND = "OCH"
@@ -75,12 +80,13 @@ Auto configuration is currently disabled = "Auto configuration is currently disa
auto_configure_description = "If this is a new installation, you may be able to fix the error using VuFind's Auto Configure tool."
auto_configure_disabled = "Auto configuration is disabled."
auto_configure_title = "Auto Configure"
+Availability = "Tillgänglighet"
Available = "Tillgänglig"
Available Functionality = "Available Functionality"
Awards = "Priser"
Back to Record = "Tillbaka till posten"
Back to Search Results = "Tillbaka till sökresultaten"
-Backtrace = "Sökväg"
+Backtrace = "Anropsstacken"
Bag = "Kundvagn"
Balance = "Saldo"
basic_search_keep_filters = "Spara filtreringen i bruk"
@@ -211,9 +217,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Är du säker du vill åter
confirm_storage_retrieval_request_cancel_selected_text = "Är du säker du vill återkalla utvalda beställningar?"
conjunction_or = "eller"
Contents = "Innehåll"
+Contributing Source = "Bidragande källa"
Contributors = "Medarbetare"
Copies = "Exemplar"
Copy = "Exemplar"
+Copyright = "Copyright"
Corporate Author = "Institutionell upphovsman"
Country = "Land"
Course = "Kurs"
@@ -251,6 +259,7 @@ Detailed View = "Detaljerad vy"
Details = "Detaljer"
Displaying the top = "Visar de första"
Document Inspector = "Document Inspector"
+Document Type = "Dokument typ"
DOI = "DOI"
Due = "Förfaller"
Due Date = "Förfallodag"
@@ -343,6 +352,7 @@ Fee = "Avgift"
Feedback = "Feedback"
Feedback Email = "Feedback Email"
feedback_name = "Ditt namn"
+File Description = "Filbeskrivning"
Filter = "Filter"
filter_tags = "Filtrera taggar"
filter_wildcard = "Any"
@@ -475,6 +485,7 @@ in = "i fältet"
In This Collection = "I denna samling"
in_collection_label = "I samling:"
include_synonyms = "Expandera resultat med hjälp av synonymer"
+Index Terms = "Indextermer"
Indexes = "Förteckningar"
information = "Information"
Institution = "Organisation"
@@ -500,9 +511,11 @@ items_added_to_bookbag = "posten/erna har lagts till i kundvagnen"
items_already_in_bookbag = "posten/erna finns redan i kundvagnen; eller tilläggning misslyckades"
Journal = "Tidskrift"
Journal Articles = "Tidskriftsartiklar"
+Journal Info = "Tidskrift info"
Journal Title = "Tidskriftstitel"
Journals = "Tidskrifter"
Jump to = "Jump to"
+just_cataloged = "Sist katalogiserade"
Keyword = "Keyword"
Keyword Filter = "Nyckelord filter"
Kit = "Materialpaket"
@@ -512,6 +525,13 @@ Last = "Sista"
Last Modified = "Last Modified"
Last Name = "Efternamn"
less = "färre"
+libphonenumber_invalid = "Telefonnummer ogiltigt"
+libphonenumber_invalidcountry = "Ogiltig landkod"
+libphonenumber_invalidregion = "Ogiltig regionskod:"
+libphonenumber_notanumber = "Indatan verkar inte vara ett telefonnummer"
+libphonenumber_toolong = "Indatan för lång för att vara ett telefonnummer"
+libphonenumber_tooshort = "Indatan för kort för att vara ett telefonnummer"
+libphonenumber_tooshortidd = "Telefonnumer för kort efter landkoden"
Library = "Bibliotek"
Library Card = "Bibliotekskort"
Library Card Deleted = "Bibliotekskortet har raderats"
@@ -553,6 +573,7 @@ map_results_label = "I denna belägenhet:"
Maps = "Kartor"
Media Format = "Mediaformat"
medium = "Medium"
+MeSH Terms = "MeSH-termer"
Message = "Meddelande"
Message From Sender = "Meddelande från"
Metadata Prefix = "Metadata Prefix"
@@ -703,13 +724,17 @@ pronounced = "uttalas"
Provider = "Leverantör"
Public = "Allmän"
Publication = "Publikation"
+Publication Date = "Utgivningstid"
Publication Frequency = "Utgivningstäthet"
Publication Information = "Utgivningsinformation"
Publication Type = "Utgivningstyp"
+Publication Year = "Utgivningsår"
Publication_Place = "Utgivningsort"
Published = "Publicerad"
Published in = "I publikationen"
Publisher = "Utgivare"
+Publisher Information = "Information om utgivare"
+Publisher Permissions = "Behörigheter av utgivaren"
QR Code = "QR-kod"
qrcode_hide = "Gömma QR-koden"
qrcode_show = "Visa QR-koden"
@@ -838,6 +863,7 @@ sort_title = "Titel"
sort_year = "Tid (nyaste först)"
sort_year asc = "Tid (äldsta först)"
Source = "Källa"
+Source Title = "Källa titel"
spell_expand_alt = "Vidga sökningen"
spell_suggest = "Menade du"
Staff View = "Personalens vy"
@@ -878,6 +904,7 @@ storage_retrieval_request_year = "År"
Subcollection = "Delsamling"
Subject = "Ämne"
Subject Area = "Ämnesområde"
+Subject Geographic = "Geografiskt ämne"
Subject Recommendations = "Rekommenderade ämnen"
Subject Terms = "Ämnestermer"
Subject(s) = "Ämne(n)"
@@ -942,6 +969,7 @@ total_resources = "Totalantal resurser"
total_saved_items = "Totalantal sparade resurser"
total_tags = "Totalantal taggar"
total_users = "Totalantar användare"
+Transliterated Title = "Translittererad titel"
tree_search_limit_reached_html = "Din sökning gav för många resultat att visa i trädet. Visar de första %%limit%% resultat. Klicka här för att se alla resultat."
unique_tags = "Unika taggar"
University Library = "Universitetsbibliotek"
@@ -1010,4 +1038,4 @@ Your search terms = "Sökvillkor"
Your Tags = "Taggar"
your_match_would_be_here = "Din träff skulle vara här."
Zip = "Postanstalt"
-zoom = "Zooma"
\ No newline at end of file
+zoom = "Zooma"
diff --git a/languages/tr.ini b/languages/tr.ini
index 3c22a6835ae..b6a153f0ec1 100644
--- a/languages/tr.ini
+++ b/languages/tr.ini
@@ -13,8 +13,11 @@
;Your Borroweds = "Ödünç Aldıklarım"
Abstract = "Özet"
Access = "Erişim"
+Access URL = "Erişim Adresi URL"
+Accession Number = "Aksesiyon No"
Account = "Hesap"
Add = "Ekle"
+Add a Library Card = "Kütüphane Kartı Ekle"
Add a Note = "Not Ekle"
Add Tag = "Etiketle"
Add Tags = "Etiket Ekle"
@@ -54,11 +57,14 @@ Advanced Search = "Gelişmiş Tarama"
advSearchError_noRights = "Bu taramayı değiştirmeye yetkiniz yoktur. Muhtemelen tarayıcınız sonlanmış olabilir?"
advSearchError_notAdvanced = "Düzeltmek için istemiş olduğunuz tarama, gelişmiş taramada mevcut değildir."
advSearchError_notFound = "İstemiş olduğunuz tarama bulunamadı."
+ajaxview_label_information = "Bilgi"
+ajaxview_label_tools = "Araçlar"
All = "Tümü"
All Fields = "Tüm Alanlar"
All Pages Loaded = "Bütün Sayfalar Yüklendi"
All Text = "Tüm Metin"
alphabrowse_matches = "Sonuçlar"
+alphabrowselink_html = "%%from%% başlayarak %%index%% tarafından oluşturulan girişleri listeleyin."
An error has occurred = "Bir Hata Oldu"
An error occurred during execution; please try again later. = "Yürütme sırasında bir hata oluştu; lütfen tekrar deneyin."
AND = "VE"
@@ -86,6 +92,7 @@ Auto configuration is currently disabled = "Otomatik yapılandırma şu anda dev
auto_configure_description = "Bu yeni bir kurulum ise, VuFind otomatik yapılandırma aracını kullanarak hatayı düzeltmek mümkün olabilir."
auto_configure_disabled = "Otomatik yapılandırma iptal edildi."
auto_configure_title = "Otomatik Yapılandırma"
+Availability = "Erişilebilirlik"
Available = "Kütüphanede"
Available Functionality = "Geçerli İşlevsellik"
Awards = "Ödüller"
@@ -206,6 +213,8 @@ Company/Entity = "Şirket/Varlık"
Configuration = "Konfigürasyon"
confirm_delete = "Bunu silmek istediğinizden emin misiniz?"
confirm_delete_brief = "Kayıt Silinsin mi?"
+confirm_delete_library_card_brief = "Kütüphane Kartını Sil?"
+confirm_delete_library_card_text = "Bu kütüphane kartını silmek istediğinizden emin misiniz?"
confirm_delete_list_brief = "Liste Silinsin mi?"
confirm_delete_list_text = "Listeyi silmek istediğinizden emin misiniz?"
confirm_delete_tags_brief = "Etiketleri Sil"
@@ -220,9 +229,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Tüm güncel depo alma iste
confirm_storage_retrieval_request_cancel_selected_text = "Seçmiş olduğunuz depo alam isteklerini iptal etmek istiyor musunuz?"
conjunction_or = "Veya"
Contents = "İçindekiler"
+Contributing Source = "Katkıda Bulunan Kaynak"
Contributors = "Diğer Yazarlar"
Copies = "Kopyalar"
Copy = "Kopya Bilgisi"
+Copyright = "Telif Hakkı"
Corporate Author = "Müşterek Yazar"
Country = "Ülke"
Course = "Kurs"
@@ -260,12 +271,14 @@ Detailed View = "Detaylı Görünüm"
Details = "Detaylı"
Displaying the top = "Üst gösteriliyor"
Document Inspector = "Doküman Denetcisi"
+Document Type = "Doküman Türü"
DOI = "DOI"
Due = "İade Tarihi"
Due Date = "İade tarihi"
DVD = "DVD"
eBook = "Ekitap"
Edit = "Düzenle"
+Edit Library Card = "Kütüphane Kartını Düzenle"
Edit this Advanced Search = "Bu Sorguyu Düzenle"
edit_list = "Listeyi düzenle"
edit_list_fail = "Bu listeyi düzenlemeye yetkiniz yoktur"
@@ -351,6 +364,7 @@ Fee = "Gecikme Cezası"
Feedback = "Görüsleriniz"
Feedback Email = "Görüsleriniz"
feedback_name = "Adiniz"
+File Description = "Dosya tanımı"
Filter = "Filtre"
filter_tags = "Etiketleri Flitrele"
filter_wildcard = "Herhangi"
@@ -483,6 +497,7 @@ in = "ile"
In This Collection = "Bu Koleksiyonda"
in_collection_label = "Koleksiyonda:"
include_synonyms = "Eþ anlamlýlarý kullanarak sonuçlarýnýzý geniþletin"
+Index Terms = "İndeks Terimleri"
Indexes = "İndeksler"
information = "Bilgi"
Institution = "Kurum"
@@ -508,9 +523,11 @@ items_added_to_bookbag = "Kayıt(lar) kitap sepetinize eklendi"
items_already_in_bookbag = "Kayıt(lar) zaten kitap sepetinizde veya eklenemedi."
Journal = "Dergi"
Journal Articles = "Dergi Makalesi"
+Journal Info = "Süreli Yayın Bilgisi"
Journal Title = "Dergi Başlığı"
Journals = "Dergiler"
Jump to = "Atla"
+just_cataloged = "Sadece Kataloglanan"
Keyword = "Anahtar Kelime"
Keyword Filter = "Anahtar Kelime"
Kit = "Set"
@@ -520,7 +537,19 @@ Last = "Son"
Last Modified = "Son Değişiklik"
Last Name = "Soyad"
less = "daha az"
+libphonenumber_invalid = "Telefon numarası hatalı"
+libphonenumber_invalidcountry = "Ülke kodu hatalı"
+libphonenumber_invalidregion = "Bölge kodu hatalı:"
+libphonenumber_notanumber = "Girilen numara bir telefon numarası olarak görünmüyor"
+libphonenumber_toolong = "Girilen numara bir telefon numarası olmak için çok uzun"
+libphonenumber_tooshort = "Girilen numara bir telefon numarası olmak için çok kısa"
+libphonenumber_tooshortidd = "Uluslararası Doğrudan Çevirme(IDD) den sonra gelen telefon numarası çok kısa"
Library = "Kütüphane"
+Library Card = "Kütüphane Kartı"
+Library Card Deleted = "Kütüphane Kartı Silindi"
+Library Card Name = "Kütüphane Kart Adı"
+Library Cards = "Kütüphane Kartları"
+Library Cards Disabled = "Kütüphane kartları iptal edildi"
Library Catalog Password = "Kütüphane Katalog Şifresi"
Library Catalog Profile = "Kütüphane Katalog Profili"
Library Catalog Record = "Kütüphane Katalog Kaydı"
@@ -556,6 +585,7 @@ map_results_label = "Bu Yerde:"
Maps = "Harita"
Media Format = "Medya Formatı"
medium = "Orta"
+MeSH Terms = "MeSH Terimleri"
Message = "Mesaj"
Message From Sender = "Gönderenin Mesajı"
Metadata Prefix = "Metadata Öneki"
@@ -668,6 +698,7 @@ Page not found. = "Sayfa bulunamadı."
Password = "Parola"
Password Again = "Şifrenizi tekrar girin"
Password cannot be blank = "Şifre boş olamaz"
+password_error_invalid = "Yeni Şifre geçersizi (geçersiz karakterler içeriyor olabilir)"
password_error_not_unique = "Şifre değişmedi"
password_maximum_length = "Maksimum şifre uzunluğu %%maxlength%% karakter"
password_minimum_length = "Minimum şifre uzunluğu %%minlength%% karakter"
@@ -705,13 +736,17 @@ pronounced = "belirgin"
Provider = "Tedarikçi"
Public = "Kamusal"
Publication = "Yayın"
+Publication Date = "Yayın Tarihi"
Publication Frequency = "Yayın Sıklığı"
Publication Information = "Yayın Bilgileri"
Publication Type = "Yayın Türü"
+Publication Year = "Yayın Yılı"
Publication_Place = "Yayın Yeri"
Published = "Baskı/Yayın Bilgisi"
Published in = "Yayımlandı"
Publisher = "Yayınevi"
+Publisher Information = "Yayıncı Bilgileri"
+Publisher Permissions = "Yayıncı İzinleri"
QR Code = "QR Kod"
qrcode_hide = "QR Kodu Sakla"
qrcode_show = "QR Kodu Göster"
@@ -840,6 +875,7 @@ sort_title = "Materyal Adı"
sort_year = "Tarih-Azalan"
sort_year asc = "Tarih-Artan"
Source = "Kaynak"
+Source Title = "Kaynak Başlığı"
spell_expand_alt = "Aramayı Genişlet"
spell_suggest = "Şunu mu demek istediniz"
Staff View = "MARC Görünümü"
@@ -880,6 +916,7 @@ storage_retrieval_request_year = "Yıl"
Subcollection = "Alt Koleksiyon"
Subject = "Konu"
Subject Area = "Konu Alanı"
+Subject Geographic = "Coğrafi Konu"
Subject Recommendations = "Tavsiye Edilen Konular"
Subject Terms = "Konu Terimleri"
Subject(s) = "Konu(lar)"
@@ -944,6 +981,7 @@ total_resources = "Toplam Kaynaklar"
total_saved_items = "Toplam Kayýtlý Öðeler"
total_tags = "Toplam Etiketler"
total_users = "Toplam Kullanýcalr"
+Transliterated Title = "Çeviri Başlığı"
tree_search_limit_reached_html = "Taramanız çok fazla sonuç verdi. Bu yapıda gösterilemiyor. Sadece ilk %%limit%% kayıt gösteriliyor. Tüm tarama için 'e tıklayın."
unique_tags = "Benzersiz Etiketler"
University Library = "Üniversite Kütüphanesi"
@@ -957,6 +995,7 @@ Use instead = "Yerine kullanın"
User Account = "Kullanıcı Hesabı"
Username = "Kullanıcı"
Username cannot be blank = "Kullanıcı adı boş olamaz"
+Username is already in use in another library card = "Kullanıcı adı başka kütüphane kartında zaten kullanılıyor"
VHS = "VHS"
Video = "Video"
Video Clips = "Video Klibi"
@@ -994,6 +1033,7 @@ You do not have any fines = "Geçikme cezanız yoktur"
You do not have any holds or recalls placed = "Rezerve etiğiniz kayıt bulunmamaktadır"
You do not have any interlibrary loan requests placed = "Herhangi bir kütüphaneler arası istekte bulunmadınız"
You do not have any items checked out = "Ödünç Aldığınız materyal yoktur"
+You do not have any library cards = "Herhangi bir kütüphane kartı yok"
You do not have any saved resources = "Kaydedilmiş bir materyaliniz bulunmamaktadır."
You do not have any storage retrieval requests placed = "YHerhangi bir depolama alma isteğinde bulunmadınız"
You must be logged in first = "İlk önce giriş yapmalısınız"
@@ -1010,4 +1050,4 @@ Your search terms = "Tarama Terimlerim"
Your Tags = "Etiketlerim"
your_match_would_be_here = "Eşleşmeleriniz burada olacak."
Zip = "Posta Kodu"
-zoom = "Yakınlaştır"
\ No newline at end of file
+zoom = "Yakınlaştır"
diff --git a/languages/zh-cn.ini b/languages/zh-cn.ini
index 62dee64aadf..c872f309948 100644
--- a/languages/zh-cn.ini
+++ b/languages/zh-cn.ini
@@ -665,4 +665,4 @@ Your Lists = "我的清单"
Your Profile = "您的个人资料"
Your search terms = "您的搜索字词"
Your Tags = "您的标签"
-Zip = "邮编"
\ No newline at end of file
+Zip = "邮编"
diff --git a/languages/zh.ini b/languages/zh.ini
index 493fae19c9e..dd7eaf22b78 100644
--- a/languages/zh.ini
+++ b/languages/zh.ini
@@ -665,4 +665,4 @@ Your Lists = "我的清單"
Your Profile = "您的個人資料"
Your search terms = "您的搜索字詞"
Your Tags = "您的標簽"
-Zip = "郵編"
\ No newline at end of file
+Zip = "郵編"
diff --git a/module/VuFind/config/module.config.php b/module/VuFind/config/module.config.php
index 113ab49fb91..d048bd0ce0a 100644
--- a/module/VuFind/config/module.config.php
+++ b/module/VuFind/config/module.config.php
@@ -160,6 +160,7 @@
'VuFind\ILSTitleHoldLogic' => 'VuFind\Service\Factory::getILSTitleHoldLogic',
'VuFind\Logger' => 'VuFind\Service\Factory::getLogger',
'VuFind\Mailer' => 'VuFind\Mailer\Factory',
+ 'VuFind\ProxyConfig' => 'VuFind\Service\Factory::getProxyConfig',
'VuFind\Recaptcha' => 'VuFind\Service\Factory::getRecaptcha',
'VuFind\RecommendPluginManager' => 'VuFind\Service\Factory::getRecommendPluginManager',
'VuFind\RecordDriverPluginManager' => 'VuFind\Service\Factory::getRecordDriverPluginManager',
@@ -186,9 +187,10 @@
'VuFind\WorldCatUtils' => 'VuFind\Service\Factory::getWorldCatUtils',
],
'invokables' => [
+ 'VuFind\HierarchicalFacetHelper' => 'VuFind\Search\Solr\HierarchicalFacetHelper',
+ 'VuFind\IpAddressUtils' => 'VuFind\Net\IpAddressUtils',
'VuFind\Search' => 'VuFindSearch\Service',
'VuFind\Search\Memory' => 'VuFind\Search\Memory',
- 'VuFind\HierarchicalFacetHelper' => 'VuFind\Search\Solr\HierarchicalFacetHelper'
],
'initializers' => [
'VuFind\ServiceManager\Initializer::initInstance',
@@ -374,6 +376,7 @@
'abstract_factories' => ['VuFind\ILS\Driver\PluginFactory'],
'factories' => [
'aleph' => 'VuFind\ILS\Driver\Factory::getAleph',
+ 'daia' => 'VuFind\ILS\Driver\Factory::getDAIA',
'demo' => 'VuFind\ILS\Driver\Factory::getDemo',
'horizon' => 'VuFind\ILS\Driver\Factory::getHorizon',
'horizonxmlapi' => 'VuFind\ILS\Driver\Factory::getHorizonXMLAPI',
@@ -386,13 +389,11 @@
'invokables' => [
'amicus' => 'VuFind\ILS\Driver\Amicus',
'claviussql' => 'VuFind\ILS\Driver\ClaviusSQL',
- 'daia' => 'VuFind\ILS\Driver\DAIA',
'evergreen' => 'VuFind\ILS\Driver\Evergreen',
'innovative' => 'VuFind\ILS\Driver\Innovative',
'koha' => 'VuFind\ILS\Driver\Koha',
'lbs4' => 'VuFind\ILS\Driver\LBS4',
'newgenlib' => 'VuFind\ILS\Driver\NewGenLib',
- 'pica' => 'VuFind\ILS\Driver\PICA',
'polaris' => 'VuFind\ILS\Driver\Polaris',
'sample' => 'VuFind\ILS\Driver\Sample',
'sierra' => 'VuFind\ILS\Driver\Sierra',
diff --git a/module/VuFind/src/VuFind/Auth/Factory.php b/module/VuFind/src/VuFind/Auth/Factory.php
index 3c0d1df9300..c3ac636c136 100644
--- a/module/VuFind/src/VuFind/Auth/Factory.php
+++ b/module/VuFind/src/VuFind/Auth/Factory.php
@@ -79,7 +79,8 @@ public static function getILSAuthenticator(ServiceManager $sm)
// Indicate that initialization is complete to avoid reinitialization:
$proxy->setProxyInitializer(null);
};
- $factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory();
+ $cfg = $sm->get('VuFind\ProxyConfig');
+ $factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($cfg);
return $factory->createProxy('VuFind\Auth\ILSAuthenticator', $callback);
}
diff --git a/module/VuFind/src/VuFind/Bootstrapper.php b/module/VuFind/src/VuFind/Bootstrapper.php
index 4c80683c42c..261c1ef3596 100644
--- a/module/VuFind/src/VuFind/Bootstrapper.php
+++ b/module/VuFind/src/VuFind/Bootstrapper.php
@@ -289,6 +289,30 @@ public function detectBrowserLanguage()
return false;
}
+ /**
+ * Support method for initLanguage() -- look up all text domains.
+ *
+ * @return array
+ */
+ protected function getTextDomains()
+ {
+ $base = APPLICATION_PATH;
+ $local = LOCAL_OVERRIDE_DIR;
+ $languagePathParts = ["$base/languages"];
+ if (!empty($local)) {
+ $languagePathParts[] = "$local/languages";
+ }
+ $languagePathParts[] = "$base/themes/*/languages";
+
+ $domains = [];
+ foreach ($languagePathParts as $current) {
+ $places = glob($current . '/*', GLOB_ONLYDIR | GLOB_NOSORT);
+ $domains = array_merge($domains, array_map('basename', $places));
+ }
+
+ return array_unique($domains);
+ }
+
/**
* Set up language handling.
*
@@ -325,11 +349,18 @@ protected function initLanguage()
if (!in_array($language, array_keys($config->Languages->toArray()))) {
$language = $config->Site->language;
}
-
try {
- $sm->get('VuFind\Translator')
- ->addTranslationFile('ExtendedIni', null, 'default', $language)
- ->setLocale($language);
+ $translator = $sm->get('VuFind\Translator');
+ $translator->setLocale($language)
+ ->addTranslationFile('ExtendedIni', null, 'default', $language);
+ foreach ($this->getTextDomains() as $domain) {
+ // Set up text domains using the domain name as the filename;
+ // this will help the ExtendedIni loader dynamically locate
+ // the appropriate files.
+ $translator->addTranslationFile(
+ 'ExtendedIni', $domain, $domain, $language
+ );
+ }
} catch (\Zend\Mvc\Exception\BadMethodCallException $e) {
if (!extension_loaded('intl')) {
throw new \Exception(
@@ -342,6 +373,11 @@ protected function initLanguage()
$viewModel = $sm->get('viewmanager')->getViewModel();
$viewModel->setVariable('userLang', $language);
$viewModel->setVariable('allLangs', $config->Languages);
+ $rtlLangs = isset($config->LanguageSettings->rtl_langs)
+ ? array_map(
+ 'trim', explode(',', $config->LanguageSettings->rtl_langs)
+ ) : [];
+ $viewModel->setVariable('rtl', in_array($language, $rtlLangs));
};
$this->events->attach('dispatch.error', $callback, 10000);
$this->events->attach('dispatch', $callback, 10000);
@@ -464,4 +500,4 @@ protected function initRenderErrorEvent()
};
$this->events->attach('render.error', $callback, 10000);
}
-}
\ No newline at end of file
+}
diff --git a/module/VuFind/src/VuFind/Config/Upgrade.php b/module/VuFind/src/VuFind/Config/Upgrade.php
index 32be637994f..558e1b37c1e 100644
--- a/module/VuFind/src/VuFind/Config/Upgrade.php
+++ b/module/VuFind/src/VuFind/Config/Upgrade.php
@@ -407,12 +407,14 @@ protected function saveUnmodifiedConfig($filename)
// Compare the source file against the raw file; if they happen to be the
// same, we don't need to copy anything!
- if (md5(file_get_contents($src)) == md5(file_get_contents($raw))) {
+ if (file_exists($src) && file_exists($raw)
+ && md5(file_get_contents($src)) == md5(file_get_contents($raw))
+ ) {
return;
}
// If we got this far, we need to copy the user's file into place:
- if (!copy($src, $dest)) {
+ if (file_exists($src) && !copy($src, $dest)) {
throw new FileAccessException(
"Error: Could not copy {$src} to {$dest}."
);
@@ -525,11 +527,19 @@ protected function upgradeConfig()
// Set up reference for convenience (and shorter lines):
$newConfig = & $this->newConfigs['config.ini'];
- // If the [BulkExport] options setting is an old default, update it to
- // reflect the fact that we now support more options.
- if ($this->isDefaultBulkExportOptions($newConfig['BulkExport']['options'])) {
- $newConfig['BulkExport']['options']
- = 'MARC:MARCXML:EndNote:EndNoteWeb:RefWorks:BibTeX:RIS';
+ // If the [BulkExport] options setting is present and non-default, warn
+ // the user about its deprecation.
+ if (isset($newConfig['BulkExport']['options'])) {
+ $default = $this->isDefaultBulkExportOptions(
+ $newConfig['BulkExport']['options']
+ );
+ if (!$default) {
+ $this->addWarning(
+ 'The [BulkExport] options setting is deprecated; please '
+ . 'customize the [Export] section instead.'
+ );
+ }
+ unset($newConfig['BulkExport']['options']);
}
// Warn the user about Amazon configuration issues:
@@ -959,7 +969,7 @@ protected function upgradeSummonPermissions()
unset($permissions['access.SummonExtendedResults']);
}
- // Remove any old settings remaining in config.ini:
+ // Remove any old settings remaining in Summon.ini:
unset($config['Auth']);
}
}
diff --git a/module/VuFind/src/VuFind/Config/Version.php b/module/VuFind/src/VuFind/Config/Version.php
new file mode 100644
index 00000000000..fb55b0b09fa
--- /dev/null
+++ b/module/VuFind/src/VuFind/Config/Version.php
@@ -0,0 +1,73 @@
+
+ * @author Ere Maijala
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link http://vufind.org Main Site
+ */
+namespace VuFind\Config;
+
+/**
+ * Version check utility
+ *
+ * @category VuFind2
+ * @package Controller
+ * @author Demian Katz
+ * @author Ere Maijala
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link http://vufind.org Main Site
+ */
+class Version
+{
+ /**
+ * Extract version number from the build.xml file of the running instance or
+ * another instance pointed to by $dir
+ *
+ * @param string $dir Optional directory containing build.xml
+ *
+ * @throws \Exception
+ * @return string
+ */
+ public static function getBuildVersion($dir = '')
+ {
+ static $cachedVersions = [];
+
+ if ($dir === '') {
+ $dir = realpath(APPLICATION_PATH);
+ }
+
+ if (!isset($cachedVersions[$dir])) {
+ $file = $dir . '/build.xml';
+ $xml = file_exists($file) ? simplexml_load_file($file) : false;
+ if (!$xml) {
+ throw new \Exception('Cannot load ' . $file . '.');
+ }
+ $parts = $xml->xpath('/project/property[@name="version"]/@value');
+ $cachedVersions[$dir] = (string)$parts[0];
+ }
+
+ return $cachedVersions[$dir];
+ }
+}
diff --git a/module/VuFind/src/VuFind/Config/Writer.php b/module/VuFind/src/VuFind/Config/Writer.php
index ea14c831886..769d9bb965f 100644
--- a/module/VuFind/src/VuFind/Config/Writer.php
+++ b/module/VuFind/src/VuFind/Config/Writer.php
@@ -207,11 +207,11 @@ protected function buildContentLine($key, $value, $tab = 17)
{
// Build a tab string so the equals signs line up attractively:
$tabStr = '';
- for ($i = strlen($key); $i < $tab; $i++) {
+ for ($i = strlen($key) + 1; $i < $tab; $i++) {
$tabStr .= ' ';
}
- return $key . $tabStr . "= " . $this->buildContentValue($value);
+ return $key . $tabStr . " = " . $this->buildContentValue($value);
}
/**
diff --git a/module/VuFind/src/VuFind/Controller/AbstractBase.php b/module/VuFind/src/VuFind/Controller/AbstractBase.php
index db3c3733d45..f5afe675596 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractBase.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractBase.php
@@ -385,7 +385,7 @@ protected function forceLogin($msg = null, $extras = [], $forward = true)
$this->followup()->store($extras, $url);
}
if (!empty($msg)) {
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
}
// Set a flag indicating that we are forcing login:
@@ -426,8 +426,7 @@ protected function catalogLogin()
// If login failed, store a warning message:
if (!$patron) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Invalid Patron Login');
+ $this->flashMessenger()->addMessage('Invalid Patron Login', 'error');
}
} else {
// If no credentials were provided, try the stored values:
diff --git a/module/VuFind/src/VuFind/Controller/AbstractRecord.php b/module/VuFind/src/VuFind/Controller/AbstractRecord.php
index f3cd99935d3..9954136bb8d 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractRecord.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractRecord.php
@@ -131,11 +131,9 @@ public function addcommentAction()
$driver->getUniqueId(), $driver->getResourceSource(), true, $driver
);
$resource->addComment($comment, $user);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('add_comment_success');
+ $this->flashMessenger()->addMessage('add_comment_success', 'success');
} else {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('add_comment_fail_blank');
+ $this->flashMessenger()->addMessage('add_comment_fail_blank', 'error');
}
return $this->redirectToRecord('', 'UserComments');
@@ -155,11 +153,9 @@ public function deletecommentAction()
$id = $this->params()->fromQuery('delete');
$table = $this->getTable('Comments');
if (!is_null($id) && $table->deleteIfOwnedByUser($id, $user)) {
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('delete_comment_success');
+ $this->flashMessenger()->addMessage('delete_comment_success', 'success');
} else {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('delete_comment_failure');
+ $this->flashMessenger()->addMessage('delete_comment_failure', 'error');
}
return $this->redirectToRecord('', 'UserComments');
}
@@ -188,8 +184,8 @@ public function addtagAction()
if ($tags = $this->params()->fromPost('tag')) {
$tagParser = $this->getServiceLocator()->get('VuFind\Tags');
$driver->addTags($user, $tagParser->parse($tags));
- $this->flashMessenger()->setNamespace('success')
- ->addMessage(['msg' => 'add_tag_success']);
+ $this->flashMessenger()
+ ->addMessage(['msg' => 'add_tag_success'], 'success');
return $this->redirectToRecord();
}
@@ -222,13 +218,12 @@ public function deletetagAction()
// Save tags, if any:
if ($tag = $this->params()->fromPost('tag')) {
$driver->deleteTags($user, [$tag]);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage(
- [
- 'msg' => 'tags_deleted',
- 'tokens' => ['%count%' => 1]
- ]
- );
+ $this->flashMessenger()->addMessage(
+ [
+ 'msg' => 'tags_deleted',
+ 'tokens' => ['%count%' => 1]
+ ], 'success'
+ );
}
return $this->redirectToRecord();
@@ -286,8 +281,7 @@ protected function processSave()
$driver->saveToFavorites($post, $user);
// Display a success status message:
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('bulk_save_success');
+ $this->flashMessenger()->addMessage('bulk_save_success', 'success');
// redirect to followup url saved in saveAction
if ($url = $this->getFollowupUrl()) {
@@ -412,12 +406,10 @@ public function emailAction()
$view->to, $view->from, $view->message, $driver,
$this->getViewRenderer(), $view->subject, $cc
);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('email_success');
+ $this->flashMessenger()->addMessage('email_success', 'success');
return $this->redirectToRecord();
} catch (MailException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
}
@@ -456,12 +448,10 @@ public function smsAction()
['driver' => $driver, 'to' => $view->to]
);
$sms->text($view->provider, $view->to, null, $body);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('sms_success');
+ $this->flashMessenger()->addMessage('sms_success', 'success');
return $this->redirectToRecord();
} catch (MailException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
}
@@ -497,8 +487,8 @@ public function exportAction()
$export = $this->getServiceLocator()->get('VuFind\Export');
if (empty($format) || !$export->recordSupportsFormat($driver, $format)) {
if (!empty($format)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('export_invalid_format');
+ $this->flashMessenger()
+ ->addMessage('export_invalid_format', 'error');
}
$view->setTemplate('record/export-menu');
return $view;
@@ -597,35 +587,6 @@ protected function getTabConfiguration()
return $cfg['vufind']['recorddriver_tabs'];
}
- /**
- * Get a default tab by looking up the provided record driver in the tab
- * configuration array.
- *
- * @param AbstractRecordDriver $driver Record driver
- *
- * @return string
- */
- protected function getDefaultTabForRecord(AbstractRecordDriver $driver)
- {
- // Load configuration:
- $config = $this->getTabConfiguration();
-
- // Get the current record driver's class name, then start a loop
- // in case we need to use a parent class' name to find the appropriate
- // setting.
- $className = get_class($driver);
- while (true) {
- if (isset($config[$className]['defaultTab'])) {
- return $config[$className]['defaultTab'];
- }
- $className = get_parent_class($className);
- if (empty($className)) {
- // No setting found...
- return null;
- }
- }
- }
-
/**
* Get default tab for a given driver
*
@@ -637,7 +598,9 @@ protected function getDefaultTab()
if (null === $this->defaultTab) {
// Load record driver tab configuration:
$driver = $this->loadRecord();
- $this->defaultTab = $this->getDefaultTabForRecord($driver);
+ $this->defaultTab = $this->getServiceLocator()
+ ->get('VuFind\RecordTabPluginManager')
+ ->getDefaultTabForRecord($driver, $this->getTabConfiguration());
// Missing/invalid record driver configuration? Fall back to configured
// default:
diff --git a/module/VuFind/src/VuFind/Controller/AbstractSearch.php b/module/VuFind/src/VuFind/Controller/AbstractSearch.php
index 955150fe9bb..85d166f3b7d 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractSearch.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractSearch.php
@@ -385,8 +385,7 @@ protected function restoreAdvancedSearch($searchId)
$searchTable = $this->getTable('Search');
$search = $searchTable->select(['id' => $searchId])->current();
if (empty($search)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('advSearchError_notFound');
+ $this->flashMessenger()->addMessage('advSearchError_notFound', 'error');
return false;
}
@@ -394,8 +393,7 @@ protected function restoreAdvancedSearch($searchId)
$user = $this->getUser();
$sessId = $this->getServiceLocator()->get('VuFind\SessionManager')->getId();
if ($search->session_id != $sessId && $search->user_id != $user->id) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('advSearchError_noRights');
+ $this->flashMessenger()->addMessage('advSearchError_noRights', 'error');
return false;
}
@@ -408,8 +406,8 @@ protected function restoreAdvancedSearch($searchId)
try {
$savedSearch->getParams()->convertToAdvancedSearch();
} catch (\Exception $ex) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('advSearchError_notAdvanced');
+ $this->flashMessenger()
+ ->addMessage('advSearchError_notAdvanced', 'error');
return false;
}
}
diff --git a/module/VuFind/src/VuFind/Controller/AjaxController.php b/module/VuFind/src/VuFind/Controller/AjaxController.php
index 7089d8e119c..d8ccc7db0f6 100644
--- a/module/VuFind/src/VuFind/Controller/AjaxController.php
+++ b/module/VuFind/src/VuFind/Controller/AjaxController.php
@@ -512,31 +512,34 @@ protected function getSaveStatusesAjax()
/**
* Send output data and exit.
*
- * @param mixed $data The response data
- * @param string $status Status of the request
+ * @param mixed $data The response data
+ * @param string $status Status of the request
+ * @param int $httpCode A custom HTTP Status Code
*
* @return \Zend\Http\Response
+ * @throws \Exception
*/
- protected function output($data, $status)
+ protected function output($data, $status, $httpCode = null)
{
+ $response = $this->getResponse();
+ $headers = $response->getHeaders();
+ $headers->addHeaderLine('Cache-Control', 'no-cache, must-revalidate');
+ $headers->addHeaderLine('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT');
+ if ($httpCode !== null) {
+ $response->setStatusCode($httpCode);
+ }
if ($this->outputMode == 'json') {
- $response = $this->getResponse();
- $headers = $response->getHeaders();
- $headers->addHeaderLine(
- 'Content-type', 'application/javascript'
- );
- $headers->addHeaderLine(
- 'Cache-Control', 'no-cache, must-revalidate'
- );
- $headers->addHeaderLine(
- 'Expires', 'Mon, 26 Jul 1997 05:00:00 GMT'
- );
- $output = ['data' => $data,'status' => $status];
+ $headers->addHeaderLine('Content-type', 'application/javascript');
+ $output = ['data' => $data, 'status' => $status];
if ('development' == APPLICATION_ENV && count(self::$php_errors) > 0) {
$output['php_errors'] = self::$php_errors;
}
$response->setContent(json_encode($output));
return $response;
+ } else if ($this->outputMode == 'plaintext') {
+ $headers->addHeaderLine('Content-type', 'text/plain');
+ $response->setContent($data ? $status . " $data" : $status);
+ return $response;
} else {
throw new \Exception('Unsupported output mode: ' . $this->outputMode);
}
@@ -854,108 +857,6 @@ protected function processFacetValues($fields, $results)
return $retVal;
}
- /**
- * Save a record to a list.
- *
- * @return \Zend\Http\Response
- */
- protected function saveRecordAjax()
- {
- $user = $this->getUser();
- if (!$user) {
- return $this->output(
- $this->translate('You must be logged in first'),
- self::STATUS_NEED_AUTH
- );
- }
-
- $driver = $this->getRecordLoader()->load(
- $this->params()->fromPost('id'),
- $this->params()->fromPost('source', 'VuFind')
- );
- $post = $this->getRequest()->getPost()->toArray();
- $tagParser = $this->getServiceLocator()->get('VuFind\Tags');
- $post['mytags'] = $tagParser->parse($post['mytags']);
- $driver->saveToFavorites($post, $user);
- return $this->output('Done', self::STATUS_OK);
- }
-
- /**
- * Saves records to a User's favorites
- *
- * @return \Zend\Http\Response
- */
- protected function bulkSaveAjax()
- {
- // Without IDs, we can't continue
- $ids = $this->params()->fromPost('ids', []);
- if (empty($ids)) {
- return $this->output(
- ['result' => $this->translate('bulk_error_missing')],
- self::STATUS_ERROR
- );
- }
-
- $user = $this->getUser();
- if (!$user) {
- return $this->output(
- $this->translate('You must be logged in first'),
- self::STATUS_NEED_AUTH
- );
- }
-
- try {
- $this->favorites()->saveBulk(
- $this->getRequest()->getPost()->toArray(), $user
- );
- return $this->output(
- [
- 'result' => ['list' => $this->params()->fromPost('list')],
- 'info' => $this->translate("bulk_save_success")
- ], self::STATUS_OK
- );
- } catch (\Exception $e) {
- return $this->output(
- ['info' => $this->translate('bulk_save_error')],
- self::STATUS_ERROR
- );
- }
- }
-
- /**
- * Add a list.
- *
- * @return \Zend\Http\Response
- */
- protected function addListAjax()
- {
- $user = $this->getUser();
-
- try {
- $table = $this->getTable('UserList');
- $list = $table->getNew($user);
- $id = $list->updateFromRequest($user, $this->getRequest()->getPost());
- } catch (\Exception $e) {
- switch(get_class($e)) {
- case 'VuFind\Exception\LoginRequired':
- return $this->output(
- $this->translate('You must be logged in first'),
- self::STATUS_NEED_AUTH
- );
- break;
- case 'VuFind\Exception\ListPermission':
- case 'VuFind\Exception\MissingField':
- return $this->output(
- $this->translate($e->getMessage()), self::STATUS_ERROR
- );
- default:
- throw $e;
- }
- }
-
- return $this->output(['id' => $id], self::STATUS_OK);
- }
-
/**
* Get Autocomplete suggestions.
*
@@ -972,159 +873,6 @@ protected function getACSuggestionsAjax()
);
}
- /**
- * Text a record.
- *
- * @return \Zend\Http\Response
- */
- protected function smsRecordAjax()
- {
- $this->writeSession(); // avoid session write timing bug
- // Attempt to send the email:
- try {
- // Check captcha
- $this->recaptcha()->setErrorMode('throw');
- $useRecaptcha = $this->recaptcha()->active('sms');
- // Process form submission:
- if (!$this->formWasSubmitted('id', $useRecaptcha)) {
- throw new \Exception('recaptcha_not_passed');
- }
- $record = $this->getRecordLoader()->load(
- $this->params()->fromPost('id'),
- $this->params()->fromPost('source', 'VuFind')
- );
- $to = $this->params()->fromPost('to');
- $body = $this->getViewRenderer()->partial(
- 'Email/record-sms.phtml', ['driver' => $record, 'to' => $to]
- );
- $this->getServiceLocator()->get('VuFind\SMS')->text(
- $this->params()->fromPost('provider'), $to, null, $body
- );
- return $this->output(
- $this->translate('sms_success'), self::STATUS_OK
- );
- } catch (\Exception $e) {
- return $this->output(
- $this->translate($e->getMessage()), self::STATUS_ERROR
- );
- }
- }
-
- /**
- * Email a record.
- *
- * @return \Zend\Http\Response
- */
- protected function emailRecordAjax()
- {
- $this->writeSession(); // avoid session write timing bug
-
- // Force login if necessary:
- $config = $this->getConfig();
- if ((!isset($config->Mail->require_login) || $config->Mail->require_login)
- && !$this->getUser()
- ) {
- return $this->output(
- $this->translate('You must be logged in first'),
- self::STATUS_NEED_AUTH
- );
- }
-
- // Attempt to send the email:
- try {
- // Check captcha
- $this->recaptcha()->setErrorMode('throw');
- $useRecaptcha = $this->recaptcha()->active('email');
- // Process form submission:
- if (!$this->formWasSubmitted('id', $useRecaptcha)) {
- throw new \Exception('recaptcha_not_passed');
- }
-
- $record = $this->getRecordLoader()->load(
- $this->params()->fromPost('id'),
- $this->params()->fromPost('source', 'VuFind')
- );
- $mailer = $this->getServiceLocator()->get('VuFind\Mailer');
- $view = $this->createEmailViewModel(
- null, $mailer->getDefaultRecordSubject($record)
- );
- $mailer->setMaxRecipients($view->maxRecipients);
- $cc = $this->params()->fromPost('ccself') && $view->from != $view->to
- ? $view->from : null;
- $mailer->sendRecord(
- $view->to, $view->from, $view->message, $record,
- $this->getViewRenderer(), $view->subject, $cc
- );
- return $this->output(
- $this->translate('email_success'), self::STATUS_OK
- );
- } catch (\Exception $e) {
- return $this->output(
- $this->translate($e->getMessage()), self::STATUS_ERROR
- );
- }
- }
-
- /**
- * Email a search.
- *
- * @return \Zend\Http\Response
- */
- protected function emailSearchAjax()
- {
- $this->writeSession(); // avoid session write timing bug
-
- // Force login if necessary:
- $config = $this->getConfig();
- if ((!isset($config->Mail->require_login) || $config->Mail->require_login)
- && !$this->getUser()
- ) {
- return $this->output(
- $this->translate('You must be logged in first'),
- self::STATUS_NEED_AUTH
- );
- }
-
- // Make sure URL is properly formatted -- if no protocol is specified, run it
- // through the serverurl helper:
- $url = $this->params()->fromPost('url');
- if (substr($url, 0, 4) != 'http') {
- $urlHelper = $this->getViewRenderer()->plugin('serverurl');
- $url = $urlHelper($url);
- }
-
- // Attempt to send the email:
- try {
- // Check captcha
- $this->recaptcha()->setErrorMode('throw');
- $useRecaptcha = $this->recaptcha()->active('email');
- // Process form submission:
- if (!$this->formWasSubmitted('url', $useRecaptcha)) {
- throw new \Exception('recaptcha_not_passed');
- }
-
- $mailer = $this->getServiceLocator()->get('VuFind\Mailer');
- $defaultSubject = $this->params()->fromQuery('cart')
- ? $this->translate('bulk_email_title')
- : $mailer->getDefaultLinkSubject();
- $view = $this->createEmailViewModel(null, $defaultSubject);
- $mailer->setMaxRecipients($view->maxRecipients);
- $cc = $this->params()->fromPost('ccself') && $view->from != $view->to
- ? $view->from : null;
- $mailer->sendLink(
- $view->to, $view->from, $view->message, $url,
- $this->getViewRenderer(), $view->subject, $cc
- );
- return $this->output(
- $this->translate('email_success'), self::STATUS_OK
- );
- } catch (\Exception $e) {
- return $this->output(
- $this->translate($e->getMessage()), self::STATUS_ERROR
- );
- }
- }
-
/**
* Check Request is Valid
*
@@ -1278,57 +1026,6 @@ protected function getRecordCommentsAsHTMLAjax()
return $this->output($html, self::STATUS_OK);
}
- /**
- * Delete multiple items from favorites or a list.
- *
- * @return \Zend\Http\Response
- */
- protected function deleteFavoritesAjax()
- {
- $user = $this->getUser();
- if ($user === false) {
- return $this->output(
- $this->translate('You must be logged in first'),
- self::STATUS_NEED_AUTH
- );
- }
-
- $listID = $this->params()->fromPost('listID');
- $ids = $this->params()->fromPost('ids');
-
- if (!is_array($ids)) {
- return $this->output(
- $this->translate('delete_missing'),
- self::STATUS_ERROR
- );
- }
-
- $this->favorites()->delete($ids, $listID, $user);
- return $this->output(
- ['result' => $this->translate('fav_delete_success')],
- self::STATUS_OK
- );
- }
-
- /**
- * Delete records from a User's cart
- *
- * @return \Zend\Http\Response
- */
- protected function removeItemsCartAjax()
- {
- // Without IDs, we can't continue
- $ids = $this->params()->fromPost('ids');
- if (empty($ids)) {
- return $this->output(
- ['result' => $this->translate('bulk_error_missing')],
- self::STATUS_ERROR
- );
- }
- $this->getServiceLocator()->get('VuFind\Cart')->removeItems($ids);
- return $this->output(['delete' => true], self::STATUS_OK);
- }
-
/**
* Process an export request
*
@@ -1351,6 +1048,7 @@ protected function exportFavoritesAjax()
'result' => $this->translate('Done'),
'result_additional' => $html,
'needs_redirect' => $export->needsRedirect($format),
+ 'export_type' => $export->getBulkExportType($format),
'result_url' => $url
], self::STATUS_OK
);
@@ -1597,6 +1295,55 @@ protected function getFacetDataAjax()
);
}
+ /**
+ * Check status and return a status message for e.g. a load balancer.
+ *
+ * A simple OK as text/plain is returned if everything works properly.
+ *
+ * @return \Zend\Http\Response
+ */
+ protected function systemStatusAction()
+ {
+ $this->outputMode = 'plaintext';
+
+ // Check system status
+ $config = $this->getConfig();
+ if (!empty($config->System->healthCheckFile)
+ && file_exists($config->System->healthCheckFile)
+ ) {
+ return $this->output(
+ 'Health check file exists', self::STATUS_ERROR, 503
+ );
+ }
+
+ // Test search index
+ try {
+ $results = $this->getResultsManager()->get('Solr');
+ $params = $results->getParams();
+ $params->setQueryIDs(['healthcheck']);
+ $results->performAndProcessSearch();
+ } catch (\Exception $e) {
+ return $this->output(
+ 'Search index error: ' . $e->getMessage(), self::STATUS_ERROR, 500
+ );
+ }
+
+ // Test database connection
+ try {
+ $sessionTable = $this->getTable('Session');
+ $sessionTable->getBySessionId('healthcheck', false);
+ } catch (\Exception $e) {
+ return $this->output(
+ 'Database error: ' . $e->getMessage(), self::STATUS_ERROR, 500
+ );
+ }
+
+ // This may be called frequently, don't leave sessions dangling
+ $this->getServiceLocator()->get('VuFind\SessionManager')->destroy();
+
+ return $this->output('', self::STATUS_OK);
+ }
+
/**
* Convenience method for accessing results
*
diff --git a/module/VuFind/src/VuFind/Controller/CartController.php b/module/VuFind/src/VuFind/Controller/CartController.php
index 5a6d9f653b1..a4b48af277a 100644
--- a/module/VuFind/src/VuFind/Controller/CartController.php
+++ b/module/VuFind/src/VuFind/Controller/CartController.php
@@ -128,8 +128,7 @@ public function cartAction()
$msg = $this->translate('bookbag_full_msg') . ". "
. $addItems['notAdded'] . " "
. $this->translate('items_already_in_bookbag') . ".";
- $this->flashMessenger()->setNamespace('info')
- ->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'info');
}
}
}
@@ -229,8 +228,7 @@ public function emailAction()
);
return $this->redirectToSource('success', 'email_success');
} catch (MailException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
}
@@ -312,8 +310,8 @@ public function exportAction()
// No legal export options? Display a warning:
if (empty($view->exportOptions)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('bulk_export_not_supported');
+ $this->flashMessenger()
+ ->addMessage('bulk_export_not_supported', 'error');
}
return $view;
}
@@ -387,8 +385,7 @@ public function saveAction()
if ($this->formWasSubmitted('submit')) {
$this->favorites()
->saveBulk($this->getRequest()->getPost()->toArray(), $user);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('bulk_save_success');
+ $this->flashMessenger()->addMessage('bulk_save_success', 'success');
$list = $this->params()->fromPost('list');
if (!empty($list)) {
return $this->redirect()->toRoute('userList', ['id' => $list]);
@@ -418,9 +415,8 @@ public function saveAction()
public function redirectToSource($flashNamespace = null, $flashMsg = null)
{
// Set flash message if requested:
- if (!is_null($flashNamespace) && !empty($flashMsg)) {
- $this->flashMessenger()->setNamespace($flashNamespace)
- ->addMessage($flashMsg);
+ if (null !== $flashNamespace && !empty($flashMsg)) {
+ $this->flashMessenger()->addMessage($flashMsg, $flashNamespace);
}
// If we entered the controller in the expected way (i.e. via the
diff --git a/module/VuFind/src/VuFind/Controller/ConfirmController.php b/module/VuFind/src/VuFind/Controller/ConfirmController.php
index c6b09e0c27a..4e856675f89 100644
--- a/module/VuFind/src/VuFind/Controller/ConfirmController.php
+++ b/module/VuFind/src/VuFind/Controller/ConfirmController.php
@@ -53,8 +53,6 @@ public function confirmAction()
// Assign Flash Messages
if (isset($data['messages'])) {
- $this->flashMessenger()->setNamespace('info');
-
foreach ($data['messages'] as $message) {
$flash = (true === is_array($message))
? [
@@ -62,7 +60,7 @@ public function confirmAction()
'tokens' => $message['tokens']
]
: $message;
- $this->flashMessenger()->addMessage($flash);
+ $this->flashMessenger()->addMessage($flash, 'info');
}
}
diff --git a/module/VuFind/src/VuFind/Controller/HoldsTrait.php b/module/VuFind/src/VuFind/Controller/HoldsTrait.php
index c48610e1719..f1cd573568e 100644
--- a/module/VuFind/src/VuFind/Controller/HoldsTrait.php
+++ b/module/VuFind/src/VuFind/Controller/HoldsTrait.php
@@ -45,8 +45,7 @@ trait HoldsTrait
*/
public function blockedholdAction()
{
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('hold_error_blocked');
+ $this->flashMessenger()->addMessage('hold_error_blocked', 'error');
return $this->redirectToRecord('#top');
}
@@ -107,13 +106,12 @@ public function holdAction()
$gatheredDetails, $extraHoldFields, $requestGroups
);
if (!$valid) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('hold_invalid_request_group');
+ $this->flashMessenger()
+ ->addMessage('hold_invalid_request_group', 'error');
} elseif (!$this->holds()->validatePickUpInput(
$gatheredDetails['pickUpLocation'], $extraHoldFields, $pickup
)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('hold_invalid_pickup');
+ $this->flashMessenger()->addMessage('hold_invalid_pickup', 'error');
} else {
// If we made it this far, we're ready to place the hold;
// if successful, we will redirect and can stop here.
@@ -134,19 +132,18 @@ public function holdAction()
'%%url%%' => $this->url()->fromRoute('myresearch-holds')
],
];
- $this->flashMessenger()->setNamespace('success')
- ->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'success');
return $this->redirectToRecord('#top');
} else {
// Failure: use flash messenger to display messages, stay on
// the current form.
if (isset($results['status'])) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($results['status']);
+ $this->flashMessenger()
+ ->addMessage($results['status'], 'error');
}
if (isset($results['sysMessage'])) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($results['sysMessage']);
+ $this->flashMessenger()
+ ->addMessage($results['sysMessage'], 'error');
}
}
}
diff --git a/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php b/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php
index 0436f4094dd..97720e3a934 100644
--- a/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php
+++ b/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php
@@ -45,8 +45,7 @@ trait ILLRequestsTrait
*/
public function blockedILLRequestAction()
{
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('ill_request_error_blocked');
+ $this->flashMessenger()->addMessage('ill_request_error_blocked', 'error');
return $this->redirectToRecord('#top');
}
@@ -112,8 +111,8 @@ public function illRequestAction()
// Success: Go to Display ILL Requests
if (isset($results['success']) && $results['success'] == true) {
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('ill_request_place_success');
+ $this->flashMessenger()
+ ->addMessage('ill_request_place_success', 'success');
if ($this->inLightbox()) {
return false;
}
@@ -124,12 +123,12 @@ public function illRequestAction()
// Failure: use flash messenger to display messages, stay on
// the current form.
if (isset($results['status'])) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($results['status']);
+ $this->flashMessenger()
+ ->addMessage($results['status'], 'error');
}
if (isset($results['sysMessage'])) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($results['sysMessage']);
+ $this->flashMessenger()
+ ->addMessage($results['sysMessage'], 'error');
}
}
}
diff --git a/module/VuFind/src/VuFind/Controller/InstallController.php b/module/VuFind/src/VuFind/Controller/InstallController.php
index 05fedd3a748..71ee2fb58c2 100644
--- a/module/VuFind/src/VuFind/Controller/InstallController.php
+++ b/module/VuFind/src/VuFind/Controller/InstallController.php
@@ -258,7 +258,7 @@ public function fixdependenciesAction()
if (!$this->phpVersionIsNewEnough()) {
$msg = "VuFind requires PHP version 5.3.3 or newer; you are running "
. phpversion() . ". Please upgrade.";
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
$problems++;
}
@@ -270,7 +270,7 @@ public function fixdependenciesAction()
. " this. For details on how to do this, see "
. "http://vufind.org/wiki/vufind2:installation_notes "
. "and look at the PHP installation instructions for your platform.";
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
$problems++;
}
@@ -282,7 +282,7 @@ public function fixdependenciesAction()
. " For details on how to do this, see "
. "http://vufind.org/wiki/vufind2:installation_notes "
. "and look at the PHP installation instructions for your platform.";
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
$problems++;
}
@@ -294,7 +294,7 @@ public function fixdependenciesAction()
. " this. For details on how to do this, see "
. "http://vufind.org/wiki/vufind2:installation_notes "
. "and look at the PHP installation instructions for your platform.";
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
$problems++;
}
@@ -305,7 +305,7 @@ public function fixdependenciesAction()
. " For details on how to do this, see "
. "http://vufind.org/wiki/vufind2:installation_notes "
. "and look at the PHP installation instructions for your platform.";
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
$problems++;
}
@@ -330,20 +330,20 @@ public function fixdatabaseAction()
$skip = $this->params()->fromPost('printsql', 'nope') == 'Skip';
if (!preg_match('/^\w*$/', $view->dbname)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Database name must be alphanumeric.');
+ $this->flashMessenger()
+ ->addMessage('Database name must be alphanumeric.', 'error');
} else if (!preg_match('/^\w*$/', $view->dbuser)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Database user must be alphanumeric.');
+ $this->flashMessenger()
+ ->addMessage('Database user must be alphanumeric.', 'error');
} else if ($skip || $this->formWasSubmitted('submit')) {
$newpass = $this->params()->fromPost('dbpass');
$newpassConf = $this->params()->fromPost('dbpassconfirm');
if ((empty($newpass) || empty($newpassConf))) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Password fields must not be blank.');
+ $this->flashMessenger()
+ ->addMessage('Password fields must not be blank.', 'error');
} else if ($newpass != $newpassConf) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Password fields must match.');
+ $this->flashMessenger()
+ ->addMessage('Password fields must match.', 'error');
} else {
// Connect to database:
$connection = $view->driver . '://' . $view->dbrootuser . ':'
@@ -355,11 +355,11 @@ public function fixdatabaseAction()
$db = $this->getServiceLocator()->get('VuFind\DbAdapterFactory')
->getAdapterFromConnectionString("{$connection}/{$dbName}");
} catch (\Exception $e) {
- $this->flashMessenger()->setNamespace('error')
+ $this->flashMessenger()
->addMessage(
'Problem initializing database adapter; '
. 'check for missing ' . $view->driver
- . ' library . Details: ' . $e->getMessage()
+ . ' library . Details: ' . $e->getMessage(), 'error'
);
return $view;
}
@@ -419,8 +419,7 @@ public function fixdatabaseAction()
}
return $this->redirect()->toRoute('install-home');
} catch (\Exception $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
}
}
@@ -729,7 +728,7 @@ public function fixsecurityAction()
$userConfirmation = $this->params()->fromPost('fix-user-table', 'Unset');
if ($userConfirmation == 'No') {
$msg = 'Security upgrade aborted.';
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
return $this->redirect()->toRoute('install-home');
}
@@ -788,7 +787,7 @@ public function performsecurityfixAction()
}
}
$msg = count($rows) . ' user row(s) encrypted.';
- $this->flashMessenger()->setNamespace('info')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'info');
}
return $this->redirect()->toRoute('install-home');
}
diff --git a/module/VuFind/src/VuFind/Controller/LibraryCardsController.php b/module/VuFind/src/VuFind/Controller/LibraryCardsController.php
index 5c99e5e1bc5..4b5ac6632d1 100644
--- a/module/VuFind/src/VuFind/Controller/LibraryCardsController.php
+++ b/module/VuFind/src/VuFind/Controller/LibraryCardsController.php
@@ -163,8 +163,7 @@ public function deleteCardAction()
$user->deleteLibraryCard($cardID);
// Success Message
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('Library Card Deleted');
+ $this->flashMessenger()->addMessage('Library Card Deleted', 'success');
// Redirect to MyResearch library cards
return $this->redirect()->toRoute('librarycards-home');
}
@@ -217,8 +216,8 @@ protected function processEditLibraryCard($user)
$password = $this->params()->fromPost('password', '');
if (!$username || !$password) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('authentication_error_blank');
+ $this->flashMessenger()
+ ->addMessage('authentication_error_blank', 'error');
return false;
}
@@ -230,8 +229,8 @@ protected function processEditLibraryCard($user)
$catalog = $this->getILS();
$patron = $catalog->patronLogin($username, $password);
if (!$patron) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('authentication_error_invalid');
+ $this->flashMessenger()
+ ->addMessage('authentication_error_invalid', 'error');
return false;
}
@@ -241,8 +240,7 @@ protected function processEditLibraryCard($user)
$id == 'NEW' ? null : $id, $cardName, $username, $password
);
} catch(\VuFind\Exception\LibraryCard $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
return false;
}
diff --git a/module/VuFind/src/VuFind/Controller/MissingrecordController.php b/module/VuFind/src/VuFind/Controller/MissingrecordController.php
index de95dddfab1..a2d746dd080 100644
--- a/module/VuFind/src/VuFind/Controller/MissingrecordController.php
+++ b/module/VuFind/src/VuFind/Controller/MissingrecordController.php
@@ -45,8 +45,7 @@ class MissingrecordController extends AbstractBase
*/
public function homeAction()
{
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Cannot find record');
+ $this->flashMessenger()->addMessage('Cannot find record', 'error');
return $this->createViewModel();
}
}
diff --git a/module/VuFind/src/VuFind/Controller/MyResearchController.php b/module/VuFind/src/VuFind/Controller/MyResearchController.php
index 4b11239b007..32b0fbaaefb 100644
--- a/module/VuFind/src/VuFind/Controller/MyResearchController.php
+++ b/module/VuFind/src/VuFind/Controller/MyResearchController.php
@@ -63,7 +63,7 @@ protected function processAuthenticationException(AuthException $e)
) {
$msg = 'authentication_error_loggedout';
}
- $this->flashMessenger()->setNamespace('error')->addMessage($msg);
+ $this->flashMessenger()->addMessage($msg, 'error');
}
/**
@@ -169,8 +169,7 @@ public function accountAction()
$this->getAuthManager()->create($this->getRequest());
return $this->forwardTo('MyResearch', 'Home');
} catch (AuthException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
} else {
// If we are not processing a submission, we need to simply display
@@ -285,12 +284,10 @@ public function savesearchAction()
$search = $this->getTable('Search');
if (($id = $this->params()->fromQuery('save', false)) !== false) {
$search->setSavedFlag($id, true, $user->id);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('search_save_success');
+ $this->flashMessenger()->addMessage('search_save_success', 'success');
} else if (($id = $this->params()->fromQuery('delete', false)) !== false) {
$search->setSavedFlag($id, false);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('search_unsave_success');
+ $this->flashMessenger()->addMessage('search_unsave_success', 'success');
} else {
throw new \Exception('Missing save and delete parameters.');
}
@@ -326,8 +323,7 @@ public function profileAction()
if (!empty($homeLibrary)) {
$user->changeHomeLibrary($homeLibrary);
$this->getAuthManager()->updateSession($user);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('profile_update');
+ $this->flashMessenger()->addMessage('profile_update', 'success');
}
// Begin building view object:
@@ -401,16 +397,14 @@ public function deleteAction()
? $this->params()->fromPost('ids')
: $this->params()->fromPost('idsAll');
if (!is_array($ids) || empty($ids)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('bulk_noitems_advice');
+ $this->flashMessenger()->addMessage('bulk_noitems_advice', 'error');
return $this->redirect()->toUrl($newUrl);
}
// Process the deletes if necessary:
if ($this->formWasSubmitted('submit')) {
$this->favorites()->delete($ids, $listID, $user);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('fav_delete_success');
+ $this->flashMessenger()->addMessage('fav_delete_success', 'success');
return $this->redirect()->toUrl($newUrl);
}
@@ -460,13 +454,12 @@ public function performDeleteFavorite($id, $source)
$table = $this->getTable('UserList');
$list = $table->getExisting($listID);
$list->removeResourcesById($user, [$id], $source);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('Item removed from list');
+ $this->flashMessenger()->addMessage('Item removed from list', 'success');
} else {
// ...My Favorites
$user->removeResourcesById([$id], $source);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('Item removed from favorites');
+ $this->flashMessenger()
+ ->addMessage('Item removed from favorites', 'success');
}
// All done -- return true to indicate success.
@@ -503,8 +496,7 @@ protected function processEditSubmit($user, $driver, $listID)
if ($addToList > -1) {
$driver->saveToFavorites(['list' => $addToList], $user);
}
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('edit_list_success');
+ $this->flashMessenger()->addMessage('edit_list_success', 'success');
$newUrl = is_null($listID)
? $this->url()->fromRoute('myresearch-favorites')
@@ -722,8 +714,7 @@ protected function processEditList($user, $list)
switch(get_class($e)) {
case 'VuFind\Exception\ListPermission':
case 'VuFind\Exception\MissingField':
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
return false;
case 'VuFind\Exception\LoginRequired':
return $this->forceLogin();
@@ -801,8 +792,7 @@ public function deletelistAction()
$list->delete($this->getUser());
// Success Message
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('fav_list_delete');
+ $this->flashMessenger()->addMessage('fav_list_delete', 'success');
} catch (\Exception $e) {
switch(get_class($e)) {
case 'VuFind\Exception\LoginRequired':
@@ -1167,8 +1157,7 @@ public function recoverAction()
// Make sure we're configured to do this
$this->setUpAuthenticationFromRequest();
if (!$this->getAuthManager()->supportsRecovery()) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_disabled');
+ $this->flashMessenger()->addMessage('recovery_disabled', 'error');
return $this->redirect()->toRoute('myresearch-home');
}
if ($this->getUser()) {
@@ -1191,8 +1180,8 @@ public function recoverAction()
if ($user) {
$this->sendRecoveryEmail($user, $this->getConfig());
} else {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_user_not_found');
+ $this->flashMessenger()
+ ->addMessage('recovery_user_not_found', 'error');
}
}
return $view;
@@ -1210,8 +1199,7 @@ protected function sendRecoveryEmail($user, $config)
{
// If we can't find a user
if (null == $user) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_user_not_found');
+ $this->flashMessenger()->addMessage('recovery_user_not_found', 'error');
} else {
// Make sure we've waiting long enough
$hashtime = $this->getHashAge($user->verify_hash);
@@ -1219,8 +1207,7 @@ protected function sendRecoveryEmail($user, $config)
? $config->Authentication->recover_interval
: 60;
if (time() - $hashtime < $recoveryInterval) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_too_soon');
+ $this->flashMessenger()->addMessage('recovery_too_soon', 'error');
} else {
// Attempt to send the email
try {
@@ -1245,11 +1232,10 @@ protected function sendRecoveryEmail($user, $config)
$this->translate('recovery_email_subject'),
$message
);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('recovery_email_sent');
+ $this->flashMessenger()
+ ->addMessage('recovery_email_sent', 'success');
} catch (MailException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
}
}
@@ -1271,8 +1257,8 @@ public function verifyAction()
? $config->Authentication->recover_hash_lifetime
: 1209600; // Two weeks
if (time() - $hashtime > $hashLifetime) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_expired_hash');
+ $this->flashMessenger()
+ ->addMessage('recovery_expired_hash', 'error');
return $this->forwardTo('MyResearch', 'Login');
} else {
$table = $this->getTable('User');
@@ -1292,8 +1278,7 @@ public function verifyAction()
}
}
}
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_invalid_hash');
+ $this->flashMessenger()->addMessage('recovery_invalid_hash', 'error');
return $this->forwardTo('MyResearch', 'Login');
}
@@ -1326,14 +1311,13 @@ public function newPasswordAction()
}
// Missing or invalid hash
if (false == $userFromHash) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_user_not_found');
+ $this->flashMessenger()->addMessage('recovery_user_not_found', 'error');
// Force login or restore hash
$post->username = false;
return $this->forwardTo('MyResearch', 'Recover');
} elseif ($userFromHash->username !== $post->username) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('authentication_error_invalid');
+ $this->flashMessenger()
+ ->addMessage('authentication_error_invalid', 'error');
$userFromHash->updateHash();
$view->username = $userFromHash->username;
$view->hash = $userFromHash->verify_hash;
@@ -1351,8 +1335,8 @@ public function newPasswordAction()
$valid = false;
}
if (!$valid) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('authentication_error_invalid');
+ $this->flashMessenger()
+ ->addMessage('authentication_error_invalid', 'error');
$view->verifyold = true;
return $view;
}
@@ -1361,8 +1345,7 @@ public function newPasswordAction()
try {
$user = $this->getAuthManager()->updatePassword($this->getRequest());
} catch (AuthException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
return $view;
}
// Update hash to prevent reusing hash
@@ -1370,8 +1353,7 @@ public function newPasswordAction()
// Login
$this->getAuthManager()->login($this->request);
// Go to favorites
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('new_password_success');
+ $this->flashMessenger()->addMessage('new_password_success', 'success');
return $this->redirect()->toRoute('myresearch-home');
}
@@ -1387,8 +1369,7 @@ public function changePasswordAction()
}
// If not submitted, are we logged in?
if (!$this->getAuthManager()->supportsPasswordChange()) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('recovery_new_disabled');
+ $this->flashMessenger()->addMessage('recovery_new_disabled', 'error');
return $this->redirect()->toRoute('home');
}
$view = $this->createViewModel($this->params()->fromPost());
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Holds.php b/module/VuFind/src/VuFind/Controller/Plugin/Holds.php
index d00b0928653..ecb2d1b2d95 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/Holds.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/Holds.php
@@ -129,8 +129,7 @@ public function cancelHolds($catalog, $patron)
// If the user input contains a value not found in the session
// whitelist, something has been tampered with -- abort the process.
if (!in_array($info, $this->getSession()->validIds)) {
- $flashMsg->setNamespace('error')
- ->addMessage('error_inconsistent_parameters');
+ $flashMsg->addMessage('error_inconsistent_parameters', 'error');
return [];
}
}
@@ -140,21 +139,21 @@ public function cancelHolds($catalog, $patron)
['details' => $details, 'patron' => $patron]
);
if ($cancelResults == false) {
- $flashMsg->setNamespace('error')->addMessage('hold_cancel_fail');
+ $flashMsg->addMessage('hold_cancel_fail', 'error');
} else {
if ($cancelResults['count'] > 0) {
// TODO : add a mechanism for inserting tokens into translated
// messages so we can avoid a double translation here.
$msg = $this->getController()
->translate('hold_cancel_success_items');
- $flashMsg->setNamespace('success')->addMessage(
- $cancelResults['count'] . ' ' . $msg
+ $flashMsg->addMessage(
+ $cancelResults['count'] . ' ' . $msg, 'success'
);
}
return $cancelResults;
}
} else {
- $flashMsg->setNamespace('error')->addMessage('hold_empty_selection');
+ $flashMsg->addMessage('hold_empty_selection', 'error');
}
return [];
}
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php b/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php
index ce4d69e5319..840581e3830 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php
@@ -143,8 +143,7 @@ public function cancelILLRequests($catalog, $patron)
// If the user input contains a value not found in the session
// whitelist, something has been tampered with -- abort the process.
if (!in_array($info, $this->getSession()->validIds)) {
- $flashMsg->setNamespace('error')
- ->addMessage('error_inconsistent_parameters');
+ $flashMsg->addMessage('error_inconsistent_parameters', 'error');
return [];
}
}
@@ -154,9 +153,7 @@ public function cancelILLRequests($catalog, $patron)
['details' => $details, 'patron' => $patron]
);
if ($cancelResults == false) {
- $flashMsg->setNamespace('error')->addMessage(
- 'ill_request_cancel_fail'
- );
+ $flashMsg->addMessage('ill_request_cancel_fail', 'error');
} else {
if ($cancelResults['count'] > 0) {
// TODO : add a mechanism for inserting tokens into translated
@@ -164,16 +161,14 @@ public function cancelILLRequests($catalog, $patron)
$msg = $this->getController()->translate(
'ill_request_cancel_success_items'
);
- $flashMsg->setNamespace('success')->addMessage(
- $cancelResults['count'] . ' ' . $msg
+ $flashMsg->addMessage(
+ $cancelResults['count'] . ' ' . $msg, 'success'
);
}
return $cancelResults;
}
} else {
- $flashMsg->setNamespace('error')->addMessage(
- 'ill_request_empty_selection'
- );
+ $flashMsg->addMessage('ill_request_empty_selection', 'error');
}
return [];
}
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php b/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php
index 2a48d529744..f76a2ea315a 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php
@@ -78,15 +78,17 @@ public function getBibIDsFromCatalog($catalog, $params, $range, $dept, $flash)
// Build a list of unique IDs
$bibIDs = [];
- for ($i = 0; $i < count($newItems['results']); $i++) {
- $bibIDs[] = $newItems['results'][$i]['id'];
+ if (isset($newItems['results'])) {
+ for ($i = 0; $i < count($newItems['results']); $i++) {
+ $bibIDs[] = $newItems['results'][$i]['id'];
+ }
}
// Truncate the list if it is too long:
$limit = $params->getQueryIDLimit();
if (count($bibIDs) > $limit) {
$bibIDs = array_slice($bibIDs, 0, $limit);
- $flash->setNamespace('info')->addMessage('too_many_new_items');
+ $flash->addMessage('too_many_new_items', 'info');
}
return $bibIDs;
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php b/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php
index 88d49b257a6..7aeb62f07c2 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php
@@ -127,8 +127,8 @@ public function validate()
$captchaPassed = $response && $response->isValid();
if (!$captchaPassed) {
if ($this->errorMode == 'flash') {
- $this->getController()->flashMessenger()->setNamespace('error')
- ->addMessage('recaptcha_not_passed');
+ $this->getController()->flashMessenger()
+ ->addMessage('recaptcha_not_passed', 'error');
} else {
throw new \Exception('recaptcha_not_passed');
}
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php b/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php
index d3ac6d9e6a4..d8761edcfe1 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php
@@ -105,7 +105,7 @@ public function processRenewals($request, $catalog, $patron)
&& is_array($renewResult['blocks'])
) {
foreach ($renewResult['blocks'] as $block) {
- $flashMsg->setNamespace('info')->addMessage($block);
+ $flashMsg->addMessage($block, 'info');
}
}
@@ -113,11 +113,11 @@ public function processRenewals($request, $catalog, $patron)
return $renewResult['details'];
} else {
// System failure:
- $flashMsg->setNamespace('error')->addMessage('renew_error');
+ $flashMsg->addMessage('renew_error', 'error');
}
} else if (!empty($all) || !empty($selected)) {
// Button was clicked but no items were selected:
- $flashMsg->setNamespace('error')->addMessage('renew_empty_selection');
+ $flashMsg->addMessage('renew_empty_selection', 'error');
}
return [];
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php b/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php
index 74326488b16..3db780ef50d 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php
@@ -143,8 +143,7 @@ public function cancelStorageRetrievalRequests($catalog, $patron)
// If the user input contains a value not found in the session
// whitelist, something has been tampered with -- abort the process.
if (!in_array($info, $this->getSession()->validIds)) {
- $flashMsg->setNamespace('error')
- ->addMessage('error_inconsistent_parameters');
+ $flashMsg->addMessage('error_inconsistent_parameters', 'error');
return [];
}
}
@@ -154,9 +153,8 @@ public function cancelStorageRetrievalRequests($catalog, $patron)
['details' => $details, 'patron' => $patron]
);
if ($cancelResults == false) {
- $flashMsg->setNamespace('error')->addMessage(
- 'storage_retrieval_request_cancel_fail'
- );
+ $flashMsg
+ ->addMessage('storage_retrieval_request_cancel_fail', 'error');
} else {
if ($cancelResults['count'] > 0) {
// TODO : add a mechanism for inserting tokens into translated
@@ -164,16 +162,15 @@ public function cancelStorageRetrievalRequests($catalog, $patron)
$msg = $this->getController()->translate(
'storage_retrieval_request_cancel_success_items'
);
- $flashMsg->setNamespace('success')->addMessage(
- $cancelResults['count'] . ' ' . $msg
+ $flashMsg->addMessage(
+ $cancelResults['count'] . ' ' . $msg, 'success'
);
}
return $cancelResults;
}
} else {
- $flashMsg->setNamespace('error')->addMessage(
- 'storage_retrieval_request_empty_selection'
- );
+ $flashMsg
+ ->addMessage('storage_retrieval_request_empty_selection', 'error');
}
return [];
}
diff --git a/module/VuFind/src/VuFind/Controller/SearchController.php b/module/VuFind/src/VuFind/Controller/SearchController.php
index 086f23b7c13..b06c7e07b9b 100644
--- a/module/VuFind/src/VuFind/Controller/SearchController.php
+++ b/module/VuFind/src/VuFind/Controller/SearchController.php
@@ -123,12 +123,10 @@ public function emailAction()
$view->to, $view->from, $view->message,
$view->url, $this->getViewRenderer(), $view->subject, $cc
);
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('email_success');
+ $this->flashMessenger()->addMessage('email_success', 'success');
return $this->redirect()->toUrl($view->url);
} catch (MailException $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($e->getMessage());
+ $this->flashMessenger()->addMessage($e->getMessage(), 'error');
}
}
return $view;
@@ -415,17 +413,17 @@ public function reservesAction()
*/
public function reservessearchAction()
{
- $results = $this->getResultsManager()->get('SolrReserves');
- $params = $results->getParams();
- $params->initFromRequest(
- new \Zend\Stdlib\Parameters(
- $this->getRequest()->getQuery()->toArray()
- + $this->getRequest()->getPost()->toArray()
- )
+ $request = new \Zend\Stdlib\Parameters(
+ $this->getRequest()->getQuery()->toArray()
+ + $this->getRequest()->getPost()->toArray()
);
- return $this->createViewModel(
- ['params' => $params, 'results' => $results]
+ $view = $this->createViewModel();
+ $runner = $this->getServiceLocator()->get('VuFind\SearchRunner');
+ $view->results = $runner->run(
+ $request, 'SolrReserves', $this->getSearchSetupCallback()
);
+ $view->params = $view->results->getParams();
+ return $view;
}
/**
@@ -452,8 +450,7 @@ public function reservesresultsAction()
->getQueryIDLimit();
if (count($bibIDs) > $limit) {
$bibIDs = array_slice($bibIDs, 0, $limit);
- $this->flashMessenger()->setNamespace('info')
- ->addMessage('too_many_reserves');
+ $this->flashMessenger()->addMessage('too_many_reserves', 'info');
}
// Use standard search action with override parameter to show results:
diff --git a/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php b/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php
index f24affa0853..28ca30f1631 100644
--- a/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php
+++ b/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php
@@ -45,8 +45,8 @@ trait StorageRetrievalRequestsTrait
*/
public function blockedStorageRetrievalRequestAction()
{
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('storage_retrieval_request_error_blocked');
+ $this->flashMessenger()
+ ->addMessage('storage_retrieval_request_error_blocked', 'error');
return $this->redirectToRecord('#top');
}
@@ -112,8 +112,9 @@ public function storageRetrievalRequestAction()
// Success: Go to Display Storage Retrieval Requests
if (isset($results['success']) && $results['success'] == true) {
- $this->flashMessenger()->setNamespace('success')
- ->addMessage('storage_retrieval_request_place_success');
+ $this->flashMessenger()->addMessage(
+ 'storage_retrieval_request_place_success', 'success'
+ );
if ($this->inLightbox()) {
return false;
}
@@ -124,12 +125,11 @@ public function storageRetrievalRequestAction()
// Failure: use flash messenger to display messages, stay on
// the current form.
if (isset($results['status'])) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($results['status']);
+ $this->flashMessenger()->addMessage($results['status'], 'error');
}
if (isset($results['sysMessage'])) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($results['sysMessage']);
+ $this->flashMessenger()
+ ->addMessage($results['sysMessage'], 'error');
}
}
}
diff --git a/module/VuFind/src/VuFind/Controller/UpgradeController.php b/module/VuFind/src/VuFind/Controller/UpgradeController.php
index 86cab730e63..989a818a008 100644
--- a/module/VuFind/src/VuFind/Controller/UpgradeController.php
+++ b/module/VuFind/src/VuFind/Controller/UpgradeController.php
@@ -122,24 +122,6 @@ protected function attachDefaultListeners()
$events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'preDispatch'], 1000);
}
- /**
- * Support method -- given a directory, extract a version number from the
- * build.xml file within that directory.
- *
- * @param string $dir Directory to search for build.xml
- *
- * @return string
- */
- protected function getVersion($dir)
- {
- $xml = simplexml_load_file($dir . '/build.xml');
- if (!$xml) {
- throw new \Exception('Cannot load ' . $dir . '/build.xml.');
- }
- $parts = $xml->xpath('/project/property[@name="version"]/@value');
- return (string)$parts[0];
- }
-
/**
* Display disabled message.
*
@@ -170,25 +152,27 @@ public function errorAction()
*/
public function establishversionsAction()
{
- $this->cookie->newVersion = $this->getVersion(realpath(APPLICATION_PATH));
- $this->cookie->oldVersion = $this->getVersion($this->cookie->sourceDir);
+ $this->cookie->newVersion = \VuFind\Config\Version::getBuildVersion();
+ $this->cookie->oldVersion = \VuFind\Config\Version::getBuildVersion(
+ $this->cookie->sourceDir
+ );
// Block upgrade when encountering common errors:
if (empty($this->cookie->oldVersion)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Cannot determine source version.');
+ $this->flashMessenger()
+ ->addMessage('Cannot determine source version.', 'error');
unset($this->cookie->oldVersion);
return $this->forwardTo('Upgrade', 'Error');
}
if (empty($this->cookie->newVersion)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Cannot determine destination version.');
+ $this->flashMessenger()
+ ->addMessage('Cannot determine destination version.', 'error');
unset($this->cookie->newVersion);
return $this->forwardTo('Upgrade', 'Error');
}
if ($this->cookie->newVersion == $this->cookie->oldVersion) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Cannot upgrade version to itself.');
+ $this->flashMessenger()
+ ->addMessage('Cannot upgrade version to itself.', 'error');
unset($this->cookie->newVersion);
return $this->forwardTo('Upgrade', 'Error');
}
@@ -221,8 +205,9 @@ public function fixconfigAction()
} catch (\Exception $e) {
$extra = is_a($e, 'VuFind\Exception\FileAccess')
? ' Check file permissions.' : '';
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Config upgrade failed: ' . $e->getMessage() . $extra);
+ $this->flashMessenger()->addMessage(
+ 'Config upgrade failed: ' . $e->getMessage() . $extra, 'error'
+ );
return $this->forwardTo('Upgrade', 'Error');
}
}
@@ -391,8 +376,9 @@ public function fixdatabaseAction()
return $this->forwardTo('Upgrade', 'FixDuplicateTags');
}
} catch (\Exception $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Database upgrade failed: ' . $e->getMessage());
+ $this->flashMessenger()->addMessage(
+ 'Database upgrade failed: ' . $e->getMessage(), 'error'
+ );
return $this->forwardTo('Upgrade', 'Error');
}
@@ -449,8 +435,9 @@ public function getdbcredentialsAction()
$this->session->dbRootPass = $pass;
return $this->forwardTo('Upgrade', 'FixDatabase');
} catch (\Exception $e) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Could not connect; please try again.');
+ $this->flashMessenger()->addMessage(
+ 'Could not connect; please try again.', 'error'
+ );
}
}
}
@@ -493,14 +480,14 @@ public function fixanonymoustagsAction()
if ($this->formWasSubmitted('submit')) {
$user = $this->params()->fromPost('username');
if (empty($user)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Username must not be empty.');
+ $this->flashMessenger()
+ ->addMessage('Username must not be empty.', 'error');
} else {
$userTable = $this->getTable('User');
$user = $userTable->getByUsername($user, false);
if (empty($user) || !is_object($user) || !isset($user->id)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage("User {$user} not found.");
+ $this->flashMessenger()
+ ->addMessage("User {$user} not found.", 'error');
} else {
$table = $this->getTable('ResourceTags');
$table->assignAnonymousTags($user->id);
@@ -598,12 +585,13 @@ public function getsourcedirAction()
$dir = $this->params()->fromPost('sourcedir');
if (!empty($dir)) {
if (!is_dir($dir)) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage($dir . ' does not exist.');
+ $this->flashMessenger()
+ ->addMessage($dir . ' does not exist.', 'error');
} else if (!file_exists($dir . '/build.xml')) {
- $this->flashMessenger()->setNamespace('error')->addMessage(
+ $this->flashMessenger()->addMessage(
'Could not find build.xml in source directory;'
- . ' upgrade does not support VuFind versions prior to 1.1.'
+ . ' upgrade does not support VuFind versions prior to 1.1.',
+ 'error'
);
} else {
$this->cookie->sourceDir = rtrim($dir, '\/');
@@ -626,14 +614,14 @@ public function getsourceversionAction()
// Process form submission:
$version = $this->params()->fromPost('sourceversion');
if (!empty($version)) {
- $this->cookie->newVersion
- = $this->getVersion(realpath(APPLICATION_PATH));
+ $this->cookie->newVersion = \VuFind\Config\Version::getBuildVersion();
if (floor($version) != 2) {
- $this->flashMessenger()->setNamespace('error')
- ->addMessage('Illegal version number.');
+ $this->flashMessenger()
+ ->addMessage('Illegal version number.', 'error');
} else if ($version >= $this->cookie->newVersion) {
- $this->flashMessenger()->setNamespace('error')->addMessage(
- "Source version must be less than {$this->cookie->newVersion}."
+ $this->flashMessenger()->addMessage(
+ "Source version must be less than {$this->cookie->newVersion}.",
+ 'error'
);
} else {
$this->cookie->oldVersion = $version;
@@ -700,8 +688,7 @@ public function homeAction()
(array)$this->session->warnings
);
foreach ($allWarnings as $warning) {
- $this->flashMessenger()->setNamespace('info')
- ->addMessage($warning);
+ $this->flashMessenger()->addMessage($warning, 'info');
}
return $this->createViewModel(
diff --git a/module/VuFind/src/VuFind/Cookie/CookieManager.php b/module/VuFind/src/VuFind/Cookie/CookieManager.php
index 20a5af45e9b..67357cbc867 100644
--- a/module/VuFind/src/VuFind/Cookie/CookieManager.php
+++ b/module/VuFind/src/VuFind/Cookie/CookieManager.php
@@ -117,7 +117,20 @@ public function isSecure()
}
/**
- * Set a cookie.
+ * Support method for setGlobalCookie -- proxy PHP's setcookie() function
+ * for compatibility with unit testing.
+ *
+ * @return bool
+ */
+ public function proxySetCookie()
+ {
+ // Special case: in test suite -- don't actually write headers!
+ return defined('VUFIND_PHPUNIT_RUNNING')
+ ? true : call_user_func_array('setcookie', func_get_args());
+ }
+
+ /**
+ * Support method for set() -- set the actual cookie in PHP.
*
* @param string $key Name of cookie to set
* @param mixed $value Value to set
@@ -125,25 +138,41 @@ public function isSecure()
*
* @return bool
*/
- public function set($key, $value, $expire = 0)
+ public function setGlobalCookie($key, $value, $expire)
{
- if (is_array($value)) {
- $success = true;
- foreach ($value as $i => $curr) {
- $lastSuccess = setcookie(
- $key . '[' . $i . ']', $curr, $expire,
- $this->path, $this->domain, $this->secure
- );
- if (!$lastSuccess) {
- $success = false;
- }
- }
- } else {
- $success = setcookie(
+ // Simple case: flat value.
+ if (!is_array($value)) {
+ return $this->proxySetCookie(
$key, $value, $expire, $this->path, $this->domain, $this->secure
);
}
- if ($success) {
+
+ // Complex case: array of values.
+ $success = true;
+ foreach ($value as $i => $curr) {
+ $lastSuccess = $this->proxySetCookie(
+ $key . '[' . $i . ']', $curr, $expire,
+ $this->path, $this->domain, $this->secure
+ );
+ if (!$lastSuccess) {
+ $success = false;
+ }
+ }
+ return $success;
+ }
+
+ /**
+ * Set a cookie.
+ *
+ * @param string $key Name of cookie to set
+ * @param mixed $value Value to set
+ * @param int $expire Cookie expiration time
+ *
+ * @return bool
+ */
+ public function set($key, $value, $expire = 0)
+ {
+ if ($success = $this->setGlobalCookie($key, $value, $expire)) {
$this->cookies[$key] = $value;
}
return $success;
diff --git a/module/VuFind/src/VuFind/Export.php b/module/VuFind/src/VuFind/Export.php
index a1a6d6e79ce..ac91cb8ccb5 100644
--- a/module/VuFind/src/VuFind/Export.php
+++ b/module/VuFind/src/VuFind/Export.php
@@ -54,11 +54,12 @@ class Export
protected $exportConfig;
/**
- * Bulk options (initialized to boolean false, populated later)
+ * Property to cache active formats
+ * (initialized to empty array , populated later)
*
- * @var array|bool
+ * @var array
*/
- protected $bulkOptions = false;
+ protected $activeFormats = [];
/**
* Constructor
@@ -75,28 +76,13 @@ public function __construct(Config $mainConfig, Config $exportConfig)
/**
* Get bulk export options.
*
+ * @deprecated use getActiveFormats($context) instead
+ *
* @return array
*/
public function getBulkOptions()
{
- if ($this->bulkOptions === false) {
- $this->bulkOptions = [];
- if (isset($this->mainConfig->BulkExport->enabled)
- && isset($this->mainConfig->BulkExport->options)
- && $this->mainConfig->BulkExport->enabled
- ) {
- $config = explode(':', $this->mainConfig->BulkExport->options);
- foreach ($config as $option) {
- if (isset($this->mainConfig->Export->$option)
- && $this->mainConfig->Export->$option == true
- ) {
- $this->bulkOptions[] = $option;
- }
- }
- }
- }
-
- return $this->bulkOptions;
+ return $this->getActiveFormats('bulk');
}
/**
@@ -271,14 +257,12 @@ public function getFormatsForRecord($driver)
{
// Get an array of enabled export formats (from config, or use defaults
// if nothing in config array).
- $active = isset($this->mainConfig->Export)
- ? $this->mainConfig->Export->toArray()
- : ['RefWorks' => true, 'EndNote' => true];
+ $active = $this->getActiveFormats('record');
// Loop through all possible formats:
$formats = [];
foreach (array_keys($this->exportConfig->toArray()) as $format) {
- if (isset($active[$format]) && $active[$format]
+ if (in_array($format, $active)
&& $this->recordSupportsFormat($driver, $format)
) {
$formats[] = $format;
@@ -299,7 +283,7 @@ public function getFormatsForRecord($driver)
*/
public function getFormatsForRecords($drivers)
{
- $formats = $this->getBulkOptions();
+ $formats = $this->getActiveFormats('bulk');
foreach ($drivers as $driver) {
// Filter out unsupported export formats:
$newFormats = [];
@@ -338,4 +322,66 @@ public function getLabelForFormat($format)
return isset($this->exportConfig->$format->label)
? $this->exportConfig->$format->label : $format;
}
+
+ /**
+ * Get the bulk export type for the specified export format.
+ *
+ * @param string $format Format identifier
+ *
+ * @return string
+ */
+ public function getBulkExportType($format)
+ {
+ // if exportType is set on per-format basis in export.ini then use it
+ if (isset($this->exportConfig->$format->bulkExportType)) {
+ return $this->exportConfig->$format->bulkExportType;
+ }
+
+ // else check if export type is set in config.ini
+ return isset($this->mainConfig->BulkExport->defaultType)
+ ? $this->mainConfig->BulkExport->defaultType : 'link';
+ }
+
+ /**
+ * Get active export formats for the given context.
+ *
+ * @param string $context Export context (i.e. record, bulk)
+ *
+ * @return array
+ */
+ public function getActiveFormats($context = 'record')
+ {
+ if (!isset($this->activeFormats[$context])) {
+ $formatSettings = isset($this->mainConfig->Export)
+ ? $this->mainConfig->Export->toArray()
+ : ['RefWorks' => 'record,bulk', 'EndNote' => 'record,bulk'];
+
+ $active = [];
+ foreach ($formatSettings as $format => $allowedContexts) {
+ if (strpos($allowedContexts, $context) !== false
+ || ($context == 'record' && $allowedContexts == 1)
+ ) {
+ $active[] = $format;
+ }
+ }
+
+ // for legacy settings [BulkExport]
+ if ($context == 'bulk'
+ && isset($this->mainConfig->BulkExport->enabled)
+ && $this->mainConfig->BulkExport->enabled
+ && isset($this->mainConfig->BulkExport->options)
+ ) {
+ $config = explode(':', $this->mainConfig->BulkExport->options);
+ foreach ($config as $option) {
+ if (isset($this->mainConfig->Export->$option)
+ && $this->mainConfig->Export->$option == true
+ ) {
+ $active[] = $option;
+ }
+ }
+ }
+ $this->activeFormats[$context] = array_unique($active);
+ }
+ return $this->activeFormats[$context];
+ }
}
diff --git a/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php b/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php
index 651276bb92e..4bc71559852 100644
--- a/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php
+++ b/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php
@@ -176,7 +176,7 @@ protected function buildNodeArray($node, $context, $hierarchyID)
'recordid' => $node->id
],
'a_attr' => [
- 'href' => $this->getContextualUrl($node, $context, $hierarchyID),
+ 'href' => $this->getContextualUrl($node, $context),
'title' => $node->title
],
'type' => $node->type
@@ -194,13 +194,12 @@ protected function buildNodeArray($node, $context, $hierarchyID)
/**
* Use the router to build the appropriate URL based on context
*
- * @param object $node JSON object of a node/top node
- * @param string $context Record or Collection
- * @param string $collectionID Collection ID
+ * @param object $node JSON object of a node/top node
+ * @param string $context Record or Collection
*
* @return string
*/
- protected function getContextualUrl($node, $context, $collectionID)
+ protected function getContextualUrl($node, $context)
{
if ($context == 'Collection') {
return $this->getUrlFromRouteCache('collection', $node->id)
@@ -257,7 +256,7 @@ protected function jsonToHTML($node, $context, $hierarchyID, $recordID = false)
$name = strlen($node->title) > 100
? substr($node->title, 0, 100) . '...'
: $node->title;
- $href = $this->getContextualUrl($node, $context, $hierarchyID);
+ $href = $this->getContextualUrl($node, $context);
$icon = $node->type == 'record' ? 'file-o' : 'folder-open';
$html = '
normalizeFile($dir . '/' . $file);
+ $full = $dir . '/' . $file;
+ if ($file != '.' && $file != '..' && is_dir($full)) {
+ $this->normalizeDirectory($full);
+ } else if (substr($file, -4) == '.ini') {
+ $this->normalizeFile($full);
}
}
closedir($handle);
@@ -127,7 +130,7 @@ public function formatAsString($input)
foreach ($input as $key => $value) {
$output .= "$key = \"$value\"\n";
}
- return trim($output);
+ return trim($output) . "\n";
}
/**
diff --git a/module/VuFind/src/VuFind/I18n/TranslatableString.php b/module/VuFind/src/VuFind/I18n/TranslatableString.php
index c0eab6cb04f..805d4254a90 100644
--- a/module/VuFind/src/VuFind/I18n/TranslatableString.php
+++ b/module/VuFind/src/VuFind/I18n/TranslatableString.php
@@ -60,7 +60,7 @@ class TranslatableString implements TranslatableStringInterface
*/
public function __construct($string, $displayString)
{
- $this->string = $string;
+ $this->string = (string)$string;
$this->displayString = $displayString;
}
diff --git a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php
index 83a6454b89c..629b5100f7f 100644
--- a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php
+++ b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php
@@ -107,12 +107,11 @@ public function addToPathStack($pathStack)
* Load method defined by FileLoaderInterface.
*
* @param string $locale Locale to read from language file
- * @param string $filename Language file to read (not used)
+ * @param string $filename Relative base path for language file (used for
+ * loading text domains; optional)
*
* @return TextDomain
* @throws InvalidArgumentException
- *
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function load($locale, $filename)
{
@@ -120,12 +119,12 @@ public function load($locale, $filename)
$this->resetLoadedFiles();
// Load base data:
- $data = $this->loadLanguageFile($locale . '.ini');
+ $data = $this->loadLanguageLocale($locale, $filename);
// Load fallback data, if any:
if (!empty($this->fallbackLocales)) {
foreach ($this->fallbackLocales as $fallbackLocale) {
- $newData = $this->loadLanguageFile($fallbackLocale . '.ini');
+ $newData = $this->loadLanguageLocale($fallbackLocale, $filename);
$newData->merge($data);
$data = $newData;
}
@@ -134,6 +133,21 @@ public function load($locale, $filename)
return $data;
}
+ /**
+ * Get the language file name for a language and domain
+ *
+ * @param string $locale Locale name
+ * @param string $domain Text domain (if any)
+ *
+ * @return string
+ */
+ public function getLanguageFilename($locale, $domain)
+ {
+ return empty($domain)
+ ? $locale . '.ini'
+ : $domain . '/' . $locale . '.ini';
+ }
+
/**
* Reset the loaded file list.
*
@@ -160,14 +174,33 @@ protected function checkAndMarkLoadedFile($filename)
return false;
}
+ /**
+ * Load the language file for a given locale and domain.
+ *
+ * @param string $locale Locale name
+ * @param string $domain Text domain (if any)
+ *
+ * @return TextDomain
+ */
+ protected function loadLanguageLocale($locale, $domain)
+ {
+ $filename = $this->getLanguageFilename($locale, $domain);
+ // Load the language file, and throw a fatal exception if it's missing
+ // and we're not dealing with text domains. A missing base file is an
+ // unexpected, fatal error; a missing domain-specific file is more likely
+ // due to the possibility of incomplete translations.
+ return $this->loadLanguageFile($filename, empty($domain));
+ }
+
/**
* Search the path stack for language files and merge them together.
*
- * @param string $filename Name of file to search path stack for.
+ * @param string $filename Name of file to search path stack for.
+ * @param bool $failOnError If true, throw an exception when file not found.
*
* @return TextDomain
*/
- protected function loadLanguageFile($filename)
+ protected function loadLanguageFile($filename, $failOnError = true)
{
// Don't load a file that has already been loaded:
if ($this->checkAndMarkLoadedFile($filename)) {
@@ -189,7 +222,13 @@ protected function loadLanguageFile($filename)
}
}
if ($data === false) {
- throw new InvalidArgumentException("Ini file '{$filename}' not found");
+ // Should we throw an exception? If not, return an empty result:
+ if ($failOnError) {
+ throw new InvalidArgumentException(
+ "Ini file '{$filename}' not found"
+ );
+ }
+ return new TextDomain();
}
return $data;
diff --git a/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php b/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php
index ee06acb90b4..e57a1260ad0 100644
--- a/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php
+++ b/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php
@@ -89,28 +89,35 @@ public function getTranslatorLocale($default = 'en')
/**
* Translate a string (or string-castable object)
*
- * @param string|object $str String to translate
- * @param array $tokens Tokens to inject into the translated string
- * @param string $default Default value to use if no translation is found
- * (null for no default).
+ * @param string|object|array $target String to translate or an array of text
+ * domain and string to translate
+ * @param array $tokens Tokens to inject into the translated
+ * string
+ * @param string $default Default value to use if no translation is
+ * found (null for no default).
*
* @return string
*/
- public function translate($str, $tokens = [], $default = null)
+ public function translate($target, $tokens = [], $default = null)
{
+ // Figure out the text domain for the string:
+ list($domain, $str) = $this->extractTextDomain($target);
+
// Special case: deal with objects with a designated display value:
if ($str instanceof \VuFind\I18n\TranslatableStringInterface) {
- $translated = $this->translateString((string)$str, $tokens, $default);
+ // On this pass, don't use the $default, since we want to fail over
+ // to getDisplayString before giving up:
+ $translated = $this
+ ->translateString((string)$str, $tokens, null, $domain);
if ($translated !== (string)$str) {
return $translated;
}
- return $this->translateString(
- $str->getDisplayString(), $tokens, $default
- );
+ // Override $domain/$str using getDisplayString() before proceeding:
+ list($domain, $str) = $this->extractTextDomain($str->getDisplayString());
}
// Default case: deal with ordinary strings (or string-castable objects):
- return $this->translateString((string)$str, $tokens, $default);
+ return $this->translateString((string)$str, $tokens, $default, $domain);
}
/**
@@ -118,15 +125,18 @@ public function translate($str, $tokens = [], $default = null)
*
* @param string $str String to translate
* @param array $tokens Tokens to inject into the translated string
- * @param string $default Default value to use if no translation is found (null
- * for no default).
+ * @param string $default Default value to use if no translation is found
+ * (null for no default).
+ * @param string $domain Text domain (omit for default)
*
* @return string
*/
- protected function translateString($str, $tokens = [], $default = null)
- {
- $msg = null === $this->translator
- ? $str : $this->translator->translate($str);
+ protected function translateString($str, $tokens = [], $default = null,
+ $domain = 'default'
+ ) {
+
+ $msg = (null === $this->translator)
+ ? $str : $this->translator->translate($str, $domain);
// Did the translation fail to change anything? If so, use default:
if (null !== $default && $msg == $str) {
@@ -145,4 +155,32 @@ protected function translateString($str, $tokens = [], $default = null)
return $msg;
}
+
+ /**
+ * Given a translation string with or without a text domain, return an
+ * array with the raw string and the text domain separated.
+ *
+ * @param string|object|array $target String to translate or an array of text
+ * domain and string to translate
+ *
+ * @return array
+ */
+ protected function extractTextDomain($target)
+ {
+ $parts = is_array($target) ? $target : explode('::', $target);
+ if (count($parts) < 1 || count($parts) > 2) {
+ throw new \Exception('Unexpected value sent to translator!');
+ }
+ if (count($parts) == 2) {
+ if (empty($parts[0])) {
+ $parts[0] = 'default';
+ }
+ if ($target instanceof \VuFind\I18n\TranslatableStringInterface) {
+ $class = get_class($target);
+ $parts[1] = new $class($parts[1], $target->getDisplayString());
+ }
+ return $parts;
+ }
+ return ['default', is_array($target) ? $parts[0] : $target];
+ }
}
diff --git a/module/VuFind/src/VuFind/ILS/Driver/DAIA.php b/module/VuFind/src/VuFind/ILS/Driver/DAIA.php
index 699f8e2c2f2..2f405ac8e2a 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/DAIA.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/DAIA.php
@@ -81,12 +81,38 @@ class DAIA extends AbstractBase implements
protected $multiQuery = false;
/**
- * DAIA legacySupport flag
+ * Acceptable ContentTypes delivered by DAIA server in HTTP header
*
- * @var boolean
- * @deprecated Will be removed in the next driver version
+ * @var array
*/
- protected $legacySupport = false;
+ protected $contentTypesResponse;
+
+ /**
+ * ContentTypes to use in DAIA HTTP requests in HTTP header
+ *
+ * @var array
+ */
+ protected $contentTypesRequest = [
+ 'xml' => 'application/xml',
+ 'json' => 'application/json',
+ ];
+
+ /**
+ * Date converter object
+ *
+ * @var \VuFind\Date\Converter
+ */
+ protected $dateConverter;
+
+ /**
+ * Constructor
+ *
+ * @param \VuFind\Date\Converter $converter Date converter
+ */
+ public function __construct(\VuFind\Date\Converter $converter)
+ {
+ $this->dateConverter = $converter;
+ }
/**
* Initialize the driver.
@@ -99,15 +125,13 @@ class DAIA extends AbstractBase implements
*/
public function init()
{
- // DAIA.ini sections changed, therefore move old [Global] section to
- // new [DAIA] section as fallback
- if (isset($this->config['Global']) && !isset($this->config['DAIA'])) {
- $this->config['DAIA'] = $this->config['Global'];
- $this->legacySupport = true;
- }
-
if (isset($this->config['DAIA']['baseUrl'])) {
$this->baseUrl = $this->config['DAIA']['baseUrl'];
+ } elseif (isset($this->config['Global']['baseUrl'])) {
+ throw new ILSException(
+ 'Deprecated [Global] section in DAIA.ini present, but no [DAIA] ' .
+ 'section found: please update DAIA.ini (cf. config/vufind/DAIA.ini).'
+ );
} else {
throw new ILSException('DAIA/baseUrl configuration needs to be set.');
}
@@ -116,19 +140,24 @@ public function init()
$this->config['DAIA']['daiaResponseFormat']
);
} else {
- $this->debug("No daiaResponseFormat setting found, using default: xml");
- $this->daiaResponseFormat = "xml";
+ $this->debug('No daiaResponseFormat setting found, using default: xml');
+ $this->daiaResponseFormat = 'xml';
}
if (isset($this->config['DAIA']['daiaIdPrefix'])) {
$this->daiaIdPrefix = $this->config['DAIA']['daiaIdPrefix'];
} else {
- $this->debug("No daiaIdPrefix setting found, using default: ppn:");
- $this->daiaIdPrefix = "ppn:";
+ $this->debug('No daiaIdPrefix setting found, using default: ppn:');
+ $this->daiaIdPrefix = 'ppn:';
}
if (isset($this->config['DAIA']['multiQuery'])) {
$this->multiQuery = $this->config['DAIA']['multiQuery'];
} else {
- $this->debug("No multiQuery setting found, using default: false");
+ $this->debug('No multiQuery setting found, using default: false');
+ }
+ if (isset($this->config['DAIA']['daiaContentTypes'])) {
+ $this->contentTypesResponse = $this->config['DAIA']['daiaContentTypes'];
+ } else {
+ $this->debug('No ContentTypes for response defined. Accepting any.');
}
}
@@ -177,12 +206,8 @@ public function getHoldLink($id, $details)
*/
public function getStatus($id)
{
- if ($this->legacySupport) {
- // we are in legacySupport mode, so use the deprecated
- // getXMLStatus() method
- return $this->getXMLStatus($id);
- } else {
- // let's retrieve the DAIA document by URI
+ // let's retrieve the DAIA document by URI
+ try {
$rawResult = $this->doHTTPRequest($this->generateURI($id));
// extract the DAIA document for the current id from the
// HTTPRequest's result
@@ -191,7 +216,10 @@ public function getStatus($id)
// parse the extracted DAIA document and return the status info
return $this->parseDaiaDoc($id, $doc);
}
+ } catch (ILSException $e) {
+ $this->debug($e->getMessage());
}
+
return [];
}
@@ -202,14 +230,12 @@ public function getStatus($id)
* collection of records.
* As the DAIA Query API supports querying multiple ids simultaneously
* (all ids divided by "|") getStatuses(ids) would call getStatus(id) only
- * once, id containing the list of ids to be retrieved. Apart from the
- * legacySupport this would cause some trouble as the list of ids does not
- * necessarily correspond to the VuFind Record-id. Therefore getStatuses(ids)
- * has its own logic for multiQuery-support and performs the HTTPRequest
- * itself, retrieving one DAIA response for all ids and uses helper
- * functions to split this one response into documents corresponding to the
- * queried ids.
- * If multiQueries are not supported, getStatus(id) is used.
+ * once, id containing the list of ids to be retrieved. This would cause some
+ * trouble as the list of ids does not necessarily correspond to the VuFind
+ * Record-id. Therefore getStatuses(ids) has its own logic for multiQuery-support
+ * and performs the HTTPRequest itself, retrieving one DAIA response for all ids
+ * and uses helper functions to split this one response into documents
+ * corresponding to the queried ids.
*
* @param array $ids The array of record ids to retrieve the status for
*
@@ -219,17 +245,11 @@ public function getStatuses($ids)
{
$status = [];
- if ($this->legacySupport) {
- // we are in legacySupport mode, so use the deprecated
- // getXMLStatus() method for each id
- foreach ($ids as $id) {
- $status[] = $this->getXMLShortStatus($id);
- }
- } else {
+ try {
if ($this->multiQuery) {
// perform one DAIA query with multiple URIs
- $rawResult = $this->doHTTPRequest($this->generateMultiURIs($ids));
- // now we need to reestablish the key-value pair id=>document as
+ $rawResult = $this
+ ->doHTTPRequest($this->generateMultiURIs($ids));
// the id used in VuFind can differ from the document-URI
// (depending on how the URI is generated)
foreach ($ids as $id) {
@@ -244,12 +264,22 @@ public function getStatuses($ids)
unset($doc);
}
} else {
- // multiQuery is not supported, so retrieve DAIA documents by
- // performing getStatus(id) for all ids
+ // multiQuery is not supported, so retrieve DAIA documents one by
+ // one
foreach ($ids as $id) {
- $status[] = $this->getStatus($id);
+ $rawResult = $this->doHTTPRequest($this->generateURI($id));
+ // extract the DAIA document for the current id from the
+ // HTTPRequest's result
+ $doc = $this->extractDaiaDoc($id, $rawResult);
+ if (!is_null($doc)) {
+ // parse the extracted DAIA document and save the status
+ // info
+ $status[] = $this->parseDaiaDoc($id, $doc);
+ }
}
}
+ } catch (ILSException $e) {
+ $this->debug($e->getMessage());
}
return $status;
}
@@ -288,6 +318,36 @@ public function getPurchaseHistory($id)
return [];
}
+ /**
+ * Support method to handle date uniformly
+ *
+ * @param string $date String representing a date
+ *
+ * @return string Formatted date
+ */
+ protected function convertDate($date)
+ {
+ try {
+ return $this->dateConverter
+ ->convertToDisplayDate('Y-m-d', $date);
+ } catch (\Exception $e) {
+ $this->debug('Date conversion failed: ' . $e->getMessage());
+ return '';
+ }
+ }
+
+ /**
+ * Support method to handle datetime uniformly
+ *
+ * @param string $datetime String representing a datetime
+ *
+ * @return string Formatted datetime
+ */
+ protected function convertDatetime($datetime)
+ {
+ return $this->convertDate($datetime);
+ }
+
/**
* Perform an HTTP request.
*
@@ -298,65 +358,64 @@ public function getPurchaseHistory($id)
*/
protected function doHTTPRequest($id)
{
- $contentTypes = [
- "xml" => "application/xml",
- "json" => "application/json",
- ];
-
$http_headers = [
- "Content-type: " . $contentTypes[$this->daiaResponseFormat],
- "Accept: " . $contentTypes[$this->daiaResponseFormat],
+ 'Content-type: ' . $this->contentTypesRequest[$this->daiaResponseFormat],
+ 'Accept: ' . $this->contentTypesRequest[$this->daiaResponseFormat],
];
$params = [
- "id" => $id,
- "format" => $this->daiaResponseFormat,
+ 'id' => $id,
+ 'format' => $this->daiaResponseFormat,
];
try {
- if ($this->legacySupport) {
- // HttpRequest for DAIA legacy support as all
- // the parameters are contained in the baseUrl
- $result = $this->httpService->get(
- $this->baseUrl . $id,
- [], null, $http_headers
- );
- } else {
- $result = $this->httpService->get(
- $this->baseUrl,
- $params, null, $http_headers
- );
- }
+ $result = $this->httpService->get(
+ $this->baseUrl,
+ $params, null, $http_headers
+ );
} catch (\Exception $e) {
- throw new ILSException($e->getMessage());
+ throw new ILSException(
+ 'HTTP request exited with Exception ' . $e->getMessage() .
+ ' for record: ' . $id
+ );
}
if (!$result->isSuccess()) {
- // throw ILSException disabled as this will be shown in VuFind-Frontend
- //throw new ILSException('HTTP error ' . $result->getStatusCode() .
- // ' retrieving status for record: ' . $id);
- // write to Debug instead
- $this->debug(
+ throw new ILSException(
'HTTP status ' . $result->getStatusCode() .
' received, retrieving availability information for record: ' . $id
);
- // return false as DAIA request failed
- return false;
}
// check if result matches daiaResponseFormat
- if (!preg_match(
- "/^" .
- str_replace("/", "\/", $contentTypes[$this->daiaResponseFormat]) .
- "(\s*)(\;.*)?/",
- strtolower($result->getHeaders()->get("ContentType")->getFieldValue())
- )) {
- throw new ILSException(
- "DAIA-ResponseFormat not supported. Received: " .
- $result->getHeaders()->get("ContentType")->getFieldValue() . " - " .
- "Expected: " . $contentTypes[$this->daiaResponseFormat]
- );
+ if ($this->contentTypesResponse != null) {
+ if ($this->contentTypesResponse[$this->daiaResponseFormat]) {
+ $contentTypesResponse = array_map(
+ 'trim',
+ explode(
+ ',',
+ $this->contentTypesResponse[$this->daiaResponseFormat]
+ )
+ );
+ list($responseMediaType) = array_pad(
+ explode(
+ ';',
+ $result->getHeaders()->get('ContentType')->getFieldValue(),
+ 2
+ ),
+ 2,
+ null
+ ); // workaround to avoid notices if encoding is not set in header
+ if (!in_array(trim($responseMediaType), $contentTypesResponse)) {
+ throw new ILSException(
+ 'DAIA-ResponseFormat not supported. Received: ' .
+ $responseMediaType . ' - ' .
+ 'Expected: ' .
+ $this->contentTypesResponse[$this->daiaResponseFormat]
+ );
+ }
+ }
}
return ($result->getBody());
@@ -373,11 +432,7 @@ protected function doHTTPRequest($id)
*/
protected function generateURI($id)
{
- if ($this->legacySupport) {
- return $id;
- } else {
- return $this->daiaIdPrefix . $id;
- }
+ return $this->daiaIdPrefix . $id;
}
/**
@@ -394,9 +449,9 @@ protected function generateMultiURIs($ids)
{
$multiURI = '';
foreach ($ids as $id) {
- $multiURI .= $this->generateURI($id) . "|";
+ $multiURI .= $this->generateURI($id) . '|';
}
- return rtrim($multiURI, "|");
+ return rtrim($multiURI, '|');
}
/**
@@ -406,11 +461,9 @@ protected function generateMultiURIs($ids)
* compatible array of status information.
* Supported types are:
* - array (for JSON results)
- * - DOMNode (for XML results)
*
* @param string $id Record Id corresponding to the DAIA document
- * @param mixed $daiaDoc The DAIA document, supported types are array and
- * DOMNode
+ * @param mixed $daiaDoc The DAIA document, only array is supported
*
* @return array An array with status information for the record
* @throws ILSException
@@ -419,8 +472,6 @@ protected function parseDaiaDoc($id, $daiaDoc)
{
if (is_array($daiaDoc)) {
return $this->parseDaiaArray($id, $daiaDoc);
- } elseif (is_subclass_of($daiaDoc, "DOMNode")) {
- return $this->parseDaiaDom($id, $daiaDoc);
} else {
throw new ILSException(
'Unsupported document type (did not match Array or DOMNode).'
@@ -444,54 +495,45 @@ protected function parseDaiaDoc($id, $daiaDoc)
*/
protected function extractDaiaDoc($id, $daiaResponse)
{
-
+ $docs = [];
if ($this->daiaResponseFormat == 'xml') {
try {
- $docs = new DOMDocument();
- $docs->loadXML($daiaResponse);
- // get all the DAIA documents
- $doc = $docs->getElementsByTagName("document");
- if (!is_null($doc) && $this->multiQuery) {
- // now loop through the found DAIA documents
- for ($i = 0; $i < $doc->length; $i++) {
- $attr = $doc->item($i)->attributes;
- // DAIA documents should use URIs as value for id
- $nodeValue = $attr->getNamedItem("id")->nodeValue;
- if ($nodeValue == $this->generateURI($id)) {
- // we've found the document element with the
- // matching URI
- return $doc->item($i);
- }
- }
- } elseif (!is_null($doc)) {
- // as multiQuery is not enabled we can be sure that the
- // DAIA response only contains one document.
- return $doc->item(0);
- }
- // no (id matching) document element found
- return null;
+ $docs = $this->convertDaiaXmlToJson($daiaResponse);
} catch (\Exception $e) {
throw new ILSException($e->getMessage());
}
-
} elseif ($this->daiaResponseFormat == 'json') {
$docs = json_decode($daiaResponse, true);
+ }
+
+ if (count($docs)) {
+ // check for error messages and write those to log
+ if (array_key_exists('message', $docs)) {
+ $this->logMessages($docs['message'], 'document');
+ }
+
// do DAIA documents exist?
- if (array_key_exists("document", $docs) && $this->multiQuery) {
+ if (array_key_exists('document', $docs) && $this->multiQuery) {
// now loop through the found DAIA documents
- foreach ($docs["document"] as $doc) {
+ foreach ($docs['document'] as $doc) {
// DAIA documents should use URIs as value for id
- if (isset($doc["id"])
- && $doc["id"] == $this->generateURI($id)
+ if (isset($doc['id'])
+ && $doc['id'] == $this->generateURI($id)
) {
// we've found the document element with the matching URI
- return $doc;
+ // if the document has an item, then we return it
+ if (isset($doc['item'])) {
+ return $doc;
+ }
}
}
- } elseif (array_key_exists("document", $docs)) {
+ } elseif (array_key_exists('document', $docs)) {
// since a document exists but multiQuery is disabled, the first
- // document is returned
- return array_shift($docs['document']);
+ // document is returned if it contains an item
+ $doc = array_shift($docs['document']);
+ if (isset($doc['item'])) {
+ return $doc;
+ }
}
// no (id matching) document element found
return null;
@@ -500,6 +542,90 @@ protected function extractDaiaDoc($id, $daiaResponse)
}
}
+ /**
+ * Converts a DAIA XML response to an array identical with a DAIA JSON response
+ * for the sent query.
+ *
+ * @param string $daiaResponse Response in XML format from DAIA service
+ *
+ * @return mixed
+ */
+ protected function convertDaiaXmlToJson($daiaResponse)
+ {
+ $dom = new DOMDocument();
+ $dom->loadXML($daiaResponse);
+
+ // prepare DOMDocument as json_encode does not support save attributes if
+ // elements have values (see http://stackoverflow.com/a/20506281/2115462)
+ $prepare = function ($domNode) use (&$prepare) {
+ foreach ($domNode->childNodes as $node) {
+ if ($node->hasChildNodes()) {
+ $prepare($node);
+ } else {
+ if (($domNode->hasAttributes() && strlen($domNode->nodeValue))
+ || (in_array(
+ $domNode->nodeName,
+ ['storage', 'limitation', 'department', 'institution']
+ ) && strlen($domNode->nodeValue))) {
+ if (trim($node->textContent)) {
+ $domNode->setAttribute('content', $node->textContent);
+ $node->nodeValue = '';
+ }
+ }
+ }
+ }
+ };
+ $prepare($dom);
+
+ // now let json_encode/decode convert XML into an array
+ $daiaArray = json_decode(
+ json_encode(simplexml_load_string($dom->saveXML())),
+ true
+ );
+
+ // merge @attributes fields in parent array
+ $merge = function ($array) use (&$merge) {
+ foreach ($array as $key => $value) {
+ if (is_array($value)) {
+ $value = $merge($value);
+ }
+ if ($key === '@attributes') {
+ $array = array_merge($array, $value);
+ unset($array[$key]);
+ } else {
+ $array[$key] = $value;
+ }
+ }
+ return $array;
+ };
+ $daiaArray = $merge($daiaArray);
+
+ // restructure the array, moving single elements to their parent's index [0]
+ $restructure = function ($array) use (&$restructure) {
+ $elements = [
+ 'document', 'item', 'available', 'unavailable', 'limitation',
+ 'message'
+ ];
+ foreach ($array as $key => $value) {
+ if (is_array($value)) {
+ $value = $restructure($value);
+ }
+ if (in_array($key, $elements, true)
+ && !isset($array[$key][0])
+ ) {
+ unset($array[$key]);
+ $array[$key][] = $value;
+ } else {
+ $array[$key] = $value;
+ }
+ }
+ return $array;
+ };
+ $daiaArray = $restructure($daiaArray);
+
+ return $daiaArray;
+ }
+
/**
* Parse an array with DAIA status information.
*
@@ -512,46 +638,42 @@ protected function parseDaiaArray($id, $daiaArray)
{
$doc_id = null;
$doc_href = null;
- $doc_message = null;
- if (array_key_exists("id", $daiaArray)) {
- $doc_id = $daiaArray["id"];
+ if (array_key_exists('id', $daiaArray)) {
+ $doc_id = $daiaArray['id'];
}
- if (array_key_exists("href", $daiaArray)) {
- // url of the document
- $doc_href = $daiaArray["href"];
+ if (array_key_exists('href', $daiaArray)) {
+ // url of the document (not needed for VuFind)
+ $doc_href = $daiaArray['href'];
}
- if (array_key_exists("message", $daiaArray)) {
- // array of messages with language code and content
- $doc_message = $daiaArray["message"];
+ if (array_key_exists('message', $daiaArray)) {
+ // log messages for debugging
+ $this->logMessages($daiaArray['message'], 'document');
}
// if one or more items exist, iterate and build result-item
- if (array_key_exists("item", $daiaArray)) {
+ if (array_key_exists('item', $daiaArray)) {
$number = 0;
- foreach ($daiaArray["item"] as $item) {
+ foreach ($daiaArray['item'] as $item) {
$result_item = [];
- $result_item["id"] = $id;
- $result_item["item_id"] = $item["id"];
- $result_item["ilslink"] = $doc_href;
- $number++; // count items
- $result_item["number"] = $number;
+ $result_item['id'] = $id;
+ $result_item['item_id'] = $item['id'];
+ // custom DAIA field used in getHoldLink()
+ $result_item['ilslink']
+ = (isset($item['href']) ? $item['href'] : $doc_href);
+ // count items
+ $number++;
+ $result_item['number'] = $this->getItemNumber($item, $number);
// set default value for barcode
- $result_item["barcode"] = "1";
+ $result_item['barcode'] = $this->getItemBarcode($item);
// set default value for reserve
- $result_item["reserve"] = "N";
+ $result_item['reserve'] = $this->getItemReserveStatus($item);
// get callnumber
- if (isset($item["label"])) {
- $result_item["callnumber"] = $item["label"];
- } else {
- $result_item["callnumber"] = "Unknown";
- }
+ $result_item['callnumber'] = $this->getItemCallnumber($item);
// get location
- if (isset($item["storage"]["content"])) {
- $result_item["location"] = $item["storage"]["content"];
- } else {
- $result_item["location"] = "Unknown";
- }
+ $result_item['location'] = $this->getItemLocation($item);
+ // get location link
+ $result_item['locationhref'] = $this->getItemLocationLink($item);
// status and availability will be calculated in own function
- $result_item = $this->calculateStatus($item) + $result_item;
+ $result_item = $this->getItemStatus($item) + $result_item;
// add result_item to the result array
$result[] = $result_item;
} // end iteration on item
@@ -561,756 +683,242 @@ protected function parseDaiaArray($id, $daiaArray)
}
/**
- * Parse a DOMNode Object with DAIA status information.
+ * Returns an array with status information for provided item.
*
- * @param string $id Record id for the DAIA array.
- * @param DOMNode $daiaDom DOMNode object with raw DAIA status information.
+ * @param array $item Array with DAIA item data
*
- * @return array Array with VuFind compatible status information.
+ * @return array
*/
- protected function parseDaiaDom($id, $daiaDom)
+ protected function getItemStatus($item)
{
- $itemlist = $daiaDom->getElementsByTagName('item');
- $ilslink = '';
- if ($daiaDom->attributes->getNamedItem('href') !== null) {
- $ilslink = $daiaDom->attributes
- ->getNamedItem('href')->nodeValue;
- }
- $emptyResult = [
- 'callnumber' => '-',
- 'availability' => '0',
- 'number' => 1,
- 'reserve' => 'No',
- 'duedate' => '',
- 'queue' => '',
- 'delay' => '',
- 'barcode' => 'No samples',
- 'status' => '',
- 'id' => $id,
- 'location' => '',
- 'ilslink' => $ilslink,
- 'label' => 'No samples'
- ];
- for ($c = 0; $itemlist->item($c) !== null; $c++) {
- $result = [
- 'callnumber' => '',
- 'availability' => '0',
- 'number' => ($c + 1),
- 'reserve' => 'No',
- 'duedate' => '',
- 'queue' => '',
- 'delay' => '',
- 'barcode' => 1,
- 'status' => '',
- 'id' => $id,
- 'item_id' => '',
- 'recallhref' => '',
- 'location' => '',
- 'location.id' => '',
- 'location.href' => '',
- 'label' => '',
- 'notes' => [],
- ];
- if ($itemlist->item($c)->attributes->getNamedItem('id') !== null) {
- $result['item_id'] = $itemlist->item($c)->attributes
- ->getNamedItem('id')->nodeValue;
- }
- if ($itemlist->item($c)->attributes->getNamedItem('href') !== null) {
- $result['recallhref'] = $itemlist->item($c)->attributes
- ->getNamedItem('href')->nodeValue;
- }
- $departmentElements = $itemlist->item($c)
- ->getElementsByTagName('department');
- if ($departmentElements->length > 0) {
- if ($departmentElements->item(0)->nodeValue) {
- $result['location']
- = $departmentElements->item(0)->nodeValue;
- $result['location.id'] = $departmentElements
- ->item(0)->attributes->getNamedItem('id')->nodeValue;
- $result['location.href'] = $departmentElements
- ->item(0)->attributes->getNamedItem('href')->nodeValue;
- }
- }
- $storageElements
- = $itemlist->item($c)->getElementsByTagName('storage');
- if ($storageElements->length > 0) {
- if ($storageElements->item(0)->nodeValue) {
- $result['location'] = $storageElements->item(0)->nodeValue;
- //$result['location.id'] = $storageElements->item(0)
- // ->attributes->getNamedItem('id')->nodeValue;
- $href = $storageElements->item(0)->attributes
- ->getNamedItem('href');
- if ($href !== null) {
- //href attribute is recommended but not mandatory
- $result['location.href'] = $storageElements->item(0)
- ->attributes->getNamedItem('href')->nodeValue;
- }
- //$result['barcode'] = $result['location.id'];
- }
- }
- $barcodeElements
- = $itemlist->item($c)->getElementsByTagName('identifier');
- if ($barcodeElements->length > 0) {
- if ($barcodeElements->item(0)->nodeValue) {
- $result['barcode'] = $barcodeElements->item(0)->nodeValue;
- }
- }
- $labelElements = $itemlist->item($c)->getElementsByTagName('label');
- if ($labelElements->length > 0) {
- if ($labelElements->item(0)->nodeValue) {
- $result['label'] = $labelElements->item(0)->nodeValue;
- $result['callnumber']
- = urldecode($labelElements->item(0)->nodeValue);
- }
- }
- $messageElements
- = $itemlist->item($c)->getElementsByTagName('message');
- if ($messageElements->length > 0) {
- for ($m = 0; $messageElements->item($m) !== null; $m++) {
- $errno = $messageElements->item($m)->attributes
- ->getNamedItem('errno')->nodeValue;
- if ($errno === '404') {
- $result['status'] = 'missing';
- } else if ($this->logger) {
- $lang = $messageElements->item($m)->attributes
- ->getNamedItem('lang')->nodeValue;
- $logString = "[DAIA] message for {$lang}: "
- . $messageElements->item($m)->nodeValue;
- $this->debug($logString);
- }
- }
- }
-
- //$loanAvail = 0;
- //$loanExp = 0;
- //$presAvail = 0;
- //$presExp = 0;
-
- $unavailableElements = $itemlist->item($c)
- ->getElementsByTagName('unavailable');
- if ($unavailableElements->item(0) !== null) {
- for ($n = 0; $unavailableElements->item($n) !== null; $n++) {
- $service = $unavailableElements->item($n)->attributes
- ->getNamedItem('service');
- $expectedNode = $unavailableElements->item($n)->attributes
- ->getNamedItem('expected');
- $queueNode = $unavailableElements->item($n)->attributes
- ->getNamedItem('queue');
- if ($service !== null) {
- $service = $service->nodeValue;
- if ($service === 'presentation') {
- $result['presentation.availability'] = '0';
- $result['presentation_availability'] = '0';
- if ($expectedNode !== null) {
- $result['presentation.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['presentation.queue']
- = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- } elseif ($service === 'loan') {
- $result['loan.availability'] = '0';
- $result['loan_availability'] = '0';
- if ($expectedNode !== null) {
- $result['loan.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['loan.queue'] = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- } elseif ($service === 'interloan') {
- $result['interloan.availability'] = '0';
- if ($expectedNode !== null) {
- $result['interloan.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['interloan.queue']
- = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- } elseif ($service === 'openaccess') {
- $result['openaccess.availability'] = '0';
- if ($expectedNode !== null) {
- $result['openaccess.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['openaccess.queue']
- = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
+ $availability = false;
+ $status = ''; // status cannot be null as this will crash the translator
+ $duedate = null;
+ $availableLink = '';
+ $queue = '';
+ if (array_key_exists('available', $item)) {
+ if (count($item['available']) === 1) {
+ $availability = true;
+ } else {
+ // check if item is loanable or presentation
+ foreach ($item['available'] as $available) {
+ // attribute service can be set once or not
+ if (isset($available['service'])
+ && in_array(
+ $available['service'],
+ ['loan', 'presentation', 'openaccess']
+ )
+ ) {
+ // set item available if service is loan, presentation or
+ // openaccess
+ $availability = true;
+ if ($available['service'] == 'loan'
+ && isset($available['service']['href'])
+ ) {
+ // save the link to the ils if we have a href for loan
+ // service
+ $availableLink = $available['service']['href'];
}
}
- // TODO: message/limitation
- if ($expectedNode !== null) {
- $result['duedate'] = $expectedNode->nodeValue;
+
+ // use limitation element for status string
+ if (isset($available['limitation'])) {
+ $status = $this->getItemLimitation($available['limitation']);
}
- if ($queueNode !== null) {
- $result['queue'] = $queueNode->nodeValue;
+
+ // log messages for debugging
+ if (isset($available['message'])) {
+ $this->logMessages($available['message'], 'item->available');
}
}
}
+ }
+ if (array_key_exists('unavailable', $item)) {
+ foreach ($item['unavailable'] as $unavailable) {
+ // attribute service can be set once or not
+ if (isset($unavailable['service'])
+ && in_array(
+ $unavailable['service'],
+ ['loan', 'presentation', 'openaccess']
+ )
+ ) {
+ if ($unavailable['service'] == 'loan'
+ && isset($unavailable['service']['href'])
+ ) {
+ //save the link to the ils if we have a href for loan service
+ }
- $availableElements = $itemlist->item($c)
- ->getElementsByTagName('available');
- if ($availableElements->item(0) !== null) {
- for ($n = 0; $availableElements->item($n) !== null; $n++) {
- $service = $availableElements->item($n)->attributes
- ->getNamedItem('service');
- $delayNode = $availableElements->item($n)->attributes
- ->getNamedItem('delay');
- if ($service !== null) {
- $service = $service->nodeValue;
- if ($service === 'presentation') {
- $result['presentation.availability'] = '1';
- $result['presentation_availability'] = '1';
- if ($delayNode !== null) {
- $result['presentation.delay']
- = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- } elseif ($service === 'loan') {
- $result['loan.availability'] = '1';
- $result['loan_availability'] = '1';
- if ($delayNode !== null) {
- $result['loan.delay'] = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- } elseif ($service === 'interloan') {
- $result['interloan.availability'] = '1';
- if ($delayNode !== null) {
- $result['interloan.delay']
- = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- } elseif ($service === 'openaccess') {
- $result['openaccess.availability'] = '1';
- if ($delayNode !== null) {
- $result['openaccess.delay']
- = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- }
+ // use limitation element for status string
+ if (isset($unavailable['limitation'])) {
+ $status = $this
+ ->getItemLimitation($unavailable['limitation']);
}
- // TODO: message/limitation
- if ($delayNode !== null) {
- $result['delay'] = $delayNode->nodeValue;
+ }
+ // attribute expected is mandatory for unavailable element
+ if (isset($unavailable['expected'])) {
+ try {
+ $duedate = $this->dateConverter
+ ->convertToDisplayDate(
+ 'Y-m-d', $unavailable['expected']
+ );
+ } catch (\Exception $e) {
+ $this->debug('Date conversion failed: ' . $e->getMessage());
+ $duedate = null;
}
}
+
+ // attribute queue can be set
+ if (isset($unavailable['queue'])) {
+ $queue = $unavailable['queue'];
+ }
+
+ // log messages for debugging
+ if (isset($unavailable['message'])) {
+ $this->logMessages($unavailable['message'], 'item->unavailable');
+ }
}
- // document has no availability elements, so set availability
- // and barcode to -1
- if ($availableElements->item(0) === null
- && $unavailableElements->item(0) === null
- ) {
- $result['availability'] = '-1';
- $result['barcode'] = '-1';
- }
- $result['ilslink'] = $ilslink;
- $status[] = $result;
- /* $status = "available";
- if (loanAvail) return 0;
- if (presAvail) {
- if (loanExp) return 1;
- return 2;
- }
- if (loanExp) return 3;
- if (presExp) return 4;
- return 5;
- */
}
- if (count($status) === 0) {
- $status[] = $emptyResult;
+
+ /*'availability' => '0',
+ 'status' => '', // string - needs to be computed from availability info
+ 'duedate' => '', // if checked_out else null
+ 'returnDate' => '', // false if not recently returned(?)
+ 'requests_placed' => '', // total number of placed holds
+ 'is_holdable' => false, // place holding possible?*/
+
+ if (!empty($availableLink)) {
+ $return['ilslink'] = $availableLink;
}
- return $status;
+ $return['status'] = $status;
+ $return['availability'] = $availability;
+ $return['duedate'] = $duedate;
+ $return['requests_placed'] = $queue;
+
+ return $return;
}
/**
- * Calculate Status and Availability of an item
+ * Returns the value for "number" in VuFind getStatus/getHolding array
*
- * If availability is false the string of status will be shown in vufind
+ * @param array $item Array with DAIA item data
+ * @param int $counter Integer counting items as alternative return value
+ *
+ * @return mixed
+ */
+ protected function getItemNumber($item, $counter)
+ {
+ return $counter;
+ }
+
+ /**
+ * Returns the value for "barcode" in VuFind getStatus/getHolding array
*
- * @param string $item json DAIA item
+ * @param array $item Array with DAIA item data
*
- * @return array("status"=>"only for VIPs" ... )
+ * @return string
*/
- protected function calculateStatus($item)
+ protected function getItemBarcode($item)
{
- $availability = false;
- $status = ''; // status cannot be null as this will crash the translator
- $duedate = null;
- if (array_key_exists("available", $item)) {
- // check if item is loanable or presentation
- foreach ($item["available"] as $available) {
- // attribute service can be set once or not
- if (isset($available["service"])) {
- if ($available["service"] == "loan") {
- $availability = true;
- }
- if ($available["service"] == "presentation") {
- $availability = true;
- }
- }
- }
- }
- if (array_key_exists("unavailable", $item)) {
- foreach ($item["unavailable"] as $unavailable) {
- // attribute service can be set once or not
- if (isset($unavailable["service"])) {
- if ($unavailable["service"] == "loan") {
- $status = "dummy text";
- }
- }
- // attribute expected is mandatory for unavailable element
- if (isset($unavailable["expected"])) {
- $duedate = $unavailable["expected"];
- }
- }
- }
- return (["status" => $status,
- "availability" => $availability,
- "duedate" => $duedate]);
+ return '1';
}
/**
- * Flatten a DAIA response to an array of holding information.
+ * Returns the value for "reserve" in VuFind getStatus/getHolding array
*
- * @param string $id Document to look up.
+ * @param array $item Array with DAIA item data
*
- * @return array
+ * @return string
+ */
+ protected function getItemReserveStatus($item)
+ {
+ return 'N';
+ }
+
+ /**
+ * Returns the value for "callnumber" in VuFind getStatus/getHolding array
+ *
+ * @param array $item Array with DAIA item data
*
- * @deprecated Only kept for legacySupport
+ * @return string
*/
- protected function getXMLStatus($id)
+ protected function getItemCallnumber($item)
{
- $daia = new DOMDocument();
- $response = $this->doHTTPRequest($id);
- if ($response) {
- $daia->loadXML($response);
- }
- // get Availability information from DAIA
- $documentlist = $daia->getElementsByTagName('document');
+ return array_key_exists('label', $item) && !empty($item['label'])
+ ? $item['label']
+ : 'Unknown';
+ }
- // handle empty DAIA response
- if ($documentlist->length == 0
- && $daia->getElementsByTagName("message") != null
+ /**
+ * Returns the value for "location" in VuFind getStatus/getHolding array
+ *
+ * @param array $item Array with DAIA item data
+ *
+ * @return string
+ */
+ protected function getItemLocation($item)
+ {
+ if (isset($item['storage'])
+ && array_key_exists('content', $item['storage'])
+ ) {
+ return $item['storage']['content'];
+ } elseif (isset($item['department'])
+ && array_key_exists('content', $item['department'])
) {
- // analyse the message for the error handling and debugging
+ return $item['department']['content'];
}
+ return 'Unknown';
+ }
- $status = [];
- for ($b = 0; $documentlist->item($b) !== null; $b++) {
- $itemlist = $documentlist->item($b)->getElementsByTagName('item');
- $ilslink = '';
- if ($documentlist->item($b)->attributes->getNamedItem('href') !== null) {
- $ilslink = $documentlist->item($b)->attributes
- ->getNamedItem('href')->nodeValue;
- }
- $emptyResult = [
- 'callnumber' => '-',
- 'availability' => '0',
- 'number' => 1,
- 'reserve' => 'No',
- 'duedate' => '',
- 'queue' => '',
- 'delay' => '',
- 'barcode' => 'No samples',
- 'status' => '',
- 'id' => $id,
- 'location' => '',
- 'ilslink' => $ilslink,
- 'label' => 'No samples'
- ];
- for ($c = 0; $itemlist->item($c) !== null; $c++) {
- $result = [
- 'callnumber' => '',
- 'availability' => '0',
- 'number' => ($c + 1),
- 'reserve' => 'No',
- 'duedate' => '',
- 'queue' => '',
- 'delay' => '',
- 'barcode' => 1,
- 'status' => '',
- 'id' => $id,
- 'item_id' => '',
- 'recallhref' => '',
- 'location' => '',
- 'location.id' => '',
- 'location.href' => '',
- 'label' => '',
- 'notes' => [],
- ];
- if ($itemlist->item($c)->attributes->getNamedItem('id') !== null) {
- $result['item_id'] = $itemlist->item($c)->attributes
- ->getNamedItem('id')->nodeValue;
- }
- if ($itemlist->item($c)->attributes->getNamedItem('href') !== null) {
- $result['recallhref'] = $itemlist->item($c)->attributes
- ->getNamedItem('href')->nodeValue;
- }
- $departmentElements = $itemlist->item($c)
- ->getElementsByTagName('department');
- if ($departmentElements->length > 0) {
- if ($departmentElements->item(0)->nodeValue) {
- $result['location']
- = $departmentElements->item(0)->nodeValue;
- $result['location.id'] = $departmentElements
- ->item(0)->attributes->getNamedItem('id')->nodeValue;
- $result['location.href'] = $departmentElements
- ->item(0)->attributes->getNamedItem('href')->nodeValue;
- }
- }
- $storageElements
- = $itemlist->item($c)->getElementsByTagName('storage');
- if ($storageElements->length > 0) {
- if ($storageElements->item(0)->nodeValue) {
- $result['location'] = $storageElements->item(0)->nodeValue;
- //$result['location.id'] = $storageElements->item(0)
- // ->attributes->getNamedItem('id')->nodeValue;
- $href = $storageElements->item(0)->attributes
- ->getNamedItem('href');
- if ($href !== null) {
- //href attribute is recommended but not mandatory
- $result['location.href'] = $storageElements->item(0)
- ->attributes->getNamedItem('href')->nodeValue;
- }
- //$result['barcode'] = $result['location.id'];
- }
- }
- $barcodeElements
- = $itemlist->item($c)->getElementsByTagName('identifier');
- if ($barcodeElements->length > 0) {
- if ($barcodeElements->item(0)->nodeValue) {
- $result['barcode'] = $barcodeElements->item(0)->nodeValue;
- }
- }
- $labelElements = $itemlist->item($c)->getElementsByTagName('label');
- if ($labelElements->length > 0) {
- if ($labelElements->item(0)->nodeValue) {
- $result['label'] = $labelElements->item(0)->nodeValue;
- $result['callnumber']
- = urldecode($labelElements->item(0)->nodeValue);
- }
- }
- $messageElements
- = $itemlist->item($c)->getElementsByTagName('message');
- if ($messageElements->length > 0) {
- for ($m = 0; $messageElements->item($m) !== null; $m++) {
- $errno = $messageElements->item($m)->attributes
- ->getNamedItem('errno')->nodeValue;
- if ($errno === '404') {
- $result['status'] = 'missing';
- } else if ($this->logger) {
- $lang = $messageElements->item($m)->attributes
- ->getNamedItem('lang')->nodeValue;
- $logString = "[DAIA] message for {$lang}: "
- . $messageElements->item($m)->nodeValue;
- $this->debug($logString);
- }
- }
- }
-
- //$loanAvail = 0;
- //$loanExp = 0;
- //$presAvail = 0;
- //$presExp = 0;
-
- $unavailableElements = $itemlist->item($c)
- ->getElementsByTagName('unavailable');
- if ($unavailableElements->item(0) !== null) {
- for ($n = 0; $unavailableElements->item($n) !== null; $n++) {
- $service = $unavailableElements->item($n)->attributes
- ->getNamedItem('service');
- $expectedNode = $unavailableElements->item($n)->attributes
- ->getNamedItem('expected');
- $queueNode = $unavailableElements->item($n)->attributes
- ->getNamedItem('queue');
- if ($service !== null) {
- $service = $service->nodeValue;
- if ($service === 'presentation') {
- $result['presentation.availability'] = '0';
- $result['presentation_availability'] = '0';
- if ($expectedNode !== null) {
- $result['presentation.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['presentation.queue']
- = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- } elseif ($service === 'loan') {
- $result['loan.availability'] = '0';
- $result['loan_availability'] = '0';
- if ($expectedNode !== null) {
- $result['loan.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['loan.queue'] = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- } elseif ($service === 'interloan') {
- $result['interloan.availability'] = '0';
- if ($expectedNode !== null) {
- $result['interloan.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['interloan.queue']
- = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- } elseif ($service === 'openaccess') {
- $result['openaccess.availability'] = '0';
- if ($expectedNode !== null) {
- $result['openaccess.duedate']
- = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['openaccess.queue']
- = $queueNode->nodeValue;
- }
- $result['availability'] = '0';
- }
- }
- // TODO: message/limitation
- if ($expectedNode !== null) {
- $result['duedate'] = $expectedNode->nodeValue;
- }
- if ($queueNode !== null) {
- $result['queue'] = $queueNode->nodeValue;
- }
- }
- }
+ /**
+ * Returns the value for "location" href in VuFind getStatus/getHolding array
+ *
+ * @param array $item Array with DAIA item data
+ *
+ * @return string
+ */
+ protected function getItemLocationLink($item)
+ {
+ return isset($item['storage']['href'])
+ ? $item['storage']['href'] : false;
+ }
- $availableElements = $itemlist->item($c)
- ->getElementsByTagName('available');
- if ($availableElements->item(0) !== null) {
- for ($n = 0; $availableElements->item($n) !== null; $n++) {
- $service = $availableElements->item($n)->attributes
- ->getNamedItem('service');
- $delayNode = $availableElements->item($n)->attributes
- ->getNamedItem('delay');
- if ($service !== null) {
- $service = $service->nodeValue;
- if ($service === 'presentation') {
- $result['presentation.availability'] = '1';
- $result['presentation_availability'] = '1';
- if ($delayNode !== null) {
- $result['presentation.delay']
- = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- } elseif ($service === 'loan') {
- $result['loan.availability'] = '1';
- $result['loan_availability'] = '1';
- if ($delayNode !== null) {
- $result['loan.delay'] = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- } elseif ($service === 'interloan') {
- $result['interloan.availability'] = '1';
- if ($delayNode !== null) {
- $result['interloan.delay']
- = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- } elseif ($service === 'openaccess') {
- $result['openaccess.availability'] = '1';
- if ($delayNode !== null) {
- $result['openaccess.delay']
- = $delayNode->nodeValue;
- }
- $result['availability'] = '1';
- }
- }
- // TODO: message/limitation
- if ($delayNode !== null) {
- $result['delay'] = $delayNode->nodeValue;
- }
- }
- }
- // document has no availability elements, so set availability
- // and barcode to -1
- if ($availableElements->item(0) === null
- && $unavailableElements->item(0) === null
- ) {
- $result['availability'] = '-1';
- $result['barcode'] = '-1';
- }
- $result['ilslink'] = $ilslink;
- $status[] = $result;
- /* $status = "available";
- if (loanAvail) return 0;
- if (presAvail) {
- if (loanExp) return 1;
- return 2;
- }
- if (loanExp) return 3;
- if (presExp) return 4;
- return 5;
- */
- }
- if (count($status) === 0) {
- $status[] = $emptyResult;
+ /**
+ * Returns the evaluated value of the provided limitation element
+ *
+ * @param array $limitations Array with DAIA limitation data
+ *
+ * @return string
+ */
+ protected function getItemLimitation($limitations)
+ {
+ foreach ($limitations as $limitation) {
+ // return the first limitation with content set
+ if (isset($limitation['content'])) {
+ return $limitation['content'];
}
}
- return $status;
+ return '';
+
}
/**
- * Return an abbreviated set of status information.
- *
- * @param string $id The record id to retrieve the status for
+ * Logs content of message elements in DAIA response for debugging
*
- * @return mixed On success, an associative array with the following keys:
- * id, availability (boolean), status, location, reserve, callnumber, duedate,
- * number
+ * @param array $messages Array with message elements to be logged
+ * @param string $context Description of current message context
*
- * @deprecated Only kept for legacySupport
+ * @return void
*/
- public function getXMLShortStatus($id)
+ protected function logMessages($messages, $context)
{
- $daia = new DOMDocument();
- $response = $this->doHTTPRequest($id);
- if ($response) {
- $daia->loadXML($response);
- }
- // get Availability information from DAIA
- $itemlist = $daia->getElementsByTagName('item');
- $label = "Unknown";
- $storage = "Unknown";
- $presenceOnly = '1';
- $holding = [];
- for ($c = 0; $itemlist->item($c) !== null; $c++) {
- $earliest_href = '';
- $storageElements = $itemlist->item($c)->getElementsByTagName('storage');
- if ($storageElements->item(0) && $storageElements->item(0)->nodeValue) {
- if ($storageElements->item(0)->nodeValue === 'Internet') {
- $href = $storageElements->item(0)->attributes
- ->getNamedItem('href')->nodeValue;
- $storage = '' . $href . '';
- } else {
- $storage = $storageElements->item(0)->nodeValue;
- }
- }
- $labelElements = $itemlist->item($c)->getElementsByTagName('label');
- if ($labelElements->item(0)->nodeValue) {
- $label = $labelElements->item(0)->nodeValue;
- }
- $availableElements = $itemlist->item($c)
- ->getElementsByTagName('available');
- if ($availableElements->item(0) !== null) {
- $availability = 1;
- $status = 'Available';
- $href = $availableElements->item(0)->attributes
- ->getNamedItem('href');
- if ($href !== null) {
- $earliest_href = $href->nodeValue;
- }
- for ($n = 0; $availableElements->item($n) !== null; $n++) {
- $svc = $availableElements->item($n)->getAttribute('service');
- if ($svc === 'loan') {
- $presenceOnly = '0';
- }
- // $status .= ' ' . $svc;
- }
- } else {
- $leanable = 1;
- $unavailableElements = $itemlist->item($c)
- ->getElementsByTagName('unavailable');
- if ($unavailableElements->item(0) !== null) {
- $earliest = [];
- $queue = [];
- $hrefs = [];
- for ($n = 0; $unavailableElements->item($n) !== null; $n++) {
- $unavailHref = $unavailableElements->item($n)->attributes
- ->getNamedItem('href');
- if ($unavailHref !== null) {
- $hrefs['item' . $n] = $unavailHref->nodeValue;
- }
- $expectedNode = $unavailableElements->item($n)->attributes
- ->getNamedItem('expected');
- if ($expectedNode !== null) {
- //$duedate = $expectedNode->nodeValue;
- //$duedate_arr = explode('-', $duedate);
- //$duedate_timestamp = mktime(
- // '0', '0', '0', $duedate_arr[1], $duedate_arr[2],
- // $duedate_arr[0]
- //);
- //array_push($earliest, array(
- // 'expected' => $expectedNode->nodeValue,
- // 'recall' => $unavailHref->nodeValue);
- //array_push($earliest, $expectedNode->nodeValue);
- $earliest['item' . $n] = $expectedNode->nodeValue;
- } else {
- array_push($earliest, "0");
- }
- $queueNode = $unavailableElements->item($n)->attributes
- ->getNamedItem('queue');
- if ($queueNode !== null) {
- $queue['item' . $n] = $queueNode->nodeValue;
- } else {
- array_push($queue, "0");
- }
- }
- }
- if (count($earliest) > 0) {
- arsort($earliest);
- $earliest_counter = 0;
- foreach ($earliest as $earliest_key => $earliest_value) {
- if ($earliest_counter === 0) {
- $earliest_duedate = $earliest_value;
- $earliest_href = isset($hrefs[$earliest_key])
- ? $hrefs[$earliest_key] : '';
- $earliest_queue = isset($queue[$earliest_key])
- ? $queue[$earliest_key] : '';
- }
- $earliest_counter = 1;
- }
- } else {
- $leanable = 0;
- }
- $messageElements = $itemlist->item($c)
- ->getElementsByTagName('message');
- if ($messageElements->length > 0) {
- $errno = $messageElements->item(0)->attributes
- ->getNamedItem('errno')->nodeValue;
- if ($errno === '404') {
- $status = 'missing';
- }
- }
- if (!isset($status)) {
- $status = 'Unavailable';
- }
- $availability = 0;
- }
- $reserve = 'N';
- if (isset($earliest_queue) && $earliest_queue > 0) {
- $reserve = 'Y';
+ foreach ($messages as $message) {
+ if (isset($message['content'])) {
+ $this->debug(
+ 'Message in DAIA response (' . (string) $context . '): ' .
+ $message['content']
+ );
}
- $holding[] = [
- 'availability' => $availability,
- 'id' => $id,
- 'status' => isset($status) ? "$status" : '',
- 'location' => isset($storage) ? "$storage" : '',
- 'reserve' => isset($reserve) ? $reserve : '',
- 'queue' => isset($earliest_queue) ? $earliest_queue : '',
- 'callnumber' => isset($label) ? "$label" : '',
- 'duedate' => isset($earliest_duedate) ? $earliest_duedate : '',
- 'leanable' => isset($leanable) ? $leanable : '',
- 'recallhref' => isset($earliest_href) ? $earliest_href : '',
- 'number' => ($c + 1),
- 'presenceOnly' => isset($presenceOnly) ? $presenceOnly : '',
- ];
}
- return $holding;
}
}
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Demo.php b/module/VuFind/src/VuFind/ILS/Driver/Demo.php
index 5819af091f7..c6219f89752 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Demo.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Demo.php
@@ -228,6 +228,8 @@ protected function getRecordSource()
protected function getRandomHolding($id, $number, array $patron = null)
{
$status = $this->getFakeStatus();
+ $location = $this->getFakeLoc();
+ $locationhref = ($location === 'Campus A') ? 'http://campus-a' : false;
return [
'id' => $id,
'source' => $this->getRecordSource(),
@@ -236,7 +238,8 @@ protected function getRandomHolding($id, $number, array $patron = null)
'barcode' => sprintf("%08d", rand() % 50000),
'availability' => $status == 'Available',
'status' => $status,
- 'location' => $this->getFakeLoc(),
+ 'location' => $location,
+ 'locationhref' => $locationhref,
'reserve' => (rand() % 100 > 49) ? 'Y' : 'N',
'callnumber' => $this->getFakeCallNum(),
'duedate' => '',
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Factory.php b/module/VuFind/src/VuFind/ILS/Driver/Factory.php
index 78b83c70376..ff3fa67e790 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Factory.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Factory.php
@@ -56,6 +56,20 @@ public static function getAleph(ServiceManager $sm)
);
}
+ /**
+ * Factory for DAIA driver.
+ *
+ * @param ServiceManager $sm Service manager.
+ *
+ * @return DAIA
+ */
+ public static function getDAIA(ServiceManager $sm)
+ {
+ return new DAIA(
+ $sm->getServiceLocator()->get('VuFind\DateConverter')
+ );
+ }
+
/**
* Factory for Demo driver.
*
diff --git a/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php b/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php
index 0a6e35349fb..89a1cef942e 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php
@@ -71,7 +71,7 @@ class MultiBackend extends AbstractBase
*
* @var object[]
*/
- protected $cache = [];
+ protected $cache = [];
/**
* The array of booleans letting us know if a
@@ -79,7 +79,7 @@ class MultiBackend extends AbstractBase
*
* @var boolean[]
*/
- protected $isInitialized = [];
+ protected $isInitialized = [];
/**
* The array of driver configuration options.
@@ -288,7 +288,60 @@ public function getNewItems($page, $limit, $daysOld, $fundId = null)
{
$driver = $this->getDriver($this->defaultDriver);
if ($driver) {
- return $driver->getNewItems($page, $limit, $daysOld, $fundId);
+ $result = $driver->getNewItems($page, $limit, $daysOld, $fundId);
+ if (isset($result['results'])) {
+ $result['results']
+ = $this->addIdPrefixes($result['results'], $this->defaultDriver);
+ }
+ return $result;
+ }
+ return [];
+ }
+
+ /**
+ * Get Departments
+ *
+ * Obtain a list of departments for use in limiting the reserves list.
+ *
+ * @return array An associative array with key = dept. ID, value = dept. name.
+ */
+ public function getDepartments()
+ {
+ $driver = $this->getDriver($this->defaultDriver);
+ if ($driver) {
+ return $driver->getDepartments();
+ }
+ return [];
+ }
+
+ /**
+ * Get Instructors
+ *
+ * Obtain a list of instructors for use in limiting the reserves list.
+ *
+ * @return array An associative array with key = ID, value = name.
+ */
+ public function getInstructors()
+ {
+ $driver = $this->getDriver($this->defaultDriver);
+ if ($driver) {
+ return $driver->getInstructors();
+ }
+ return [];
+ }
+
+ /**
+ * Get Courses
+ *
+ * Obtain a list of courses for use in limiting the reserves list.
+ *
+ * @return array An associative array with key = ID, value = name.
+ */
+ public function getCourses()
+ {
+ $driver = $this->getDriver($this->defaultDriver);
+ if ($driver) {
+ return $driver->getCourses();
}
return [];
}
@@ -308,7 +361,11 @@ public function findReserves($course, $inst, $dept)
{
$driver = $this->getDriver($this->defaultDriver);
if ($driver) {
- return $driver->findReserves($course, $inst, $dept);
+ return $this->addIdPrefixes(
+ $driver->findReserves($course, $inst, $dept),
+ $this->defaultDriver,
+ ['BIB_ID']
+ );
}
return [];
}
diff --git a/module/VuFind/src/VuFind/ILS/Driver/PICA.php b/module/VuFind/src/VuFind/ILS/Driver/PICA.php
deleted file mode 100644
index b0d349154ea..00000000000
--- a/module/VuFind/src/VuFind/ILS/Driver/PICA.php
+++ /dev/null
@@ -1,714 +0,0 @@
-
- * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link http://vufind.org/wiki/vufind2:building_an_ils_driver Wiki
- */
-namespace VuFind\ILS\Driver;
-use DOMDocument, VuFind\Exception\ILS as ILSException;
-
-/**
- * ILS Driver for VuFind to get information from PICA
- *
- * Holding information is obtained by DAIA, so it's not necessary to implement those
- * functions here; we just need to extend the DAIA driver.
- *
- * @category VuFind2
- * @package ILS_Drivers
- * @author Oliver Goldschmidt
- * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link http://vufind.org/wiki/vufind2:building_an_ils_driver Wiki
- */
-class PICA extends DAIA
-{
- protected $username;
- protected $password;
- protected $ldapConfigurationParameter;
-
- protected $catalogHost;
- protected $renewalsScript;
- protected $dbsid;
-
- /**
- * Initialize the driver.
- *
- * Validate configuration and perform all resource-intensive tasks needed to
- * make the driver active.
- *
- * @throws ILSException
- * @return void
- */
- public function init()
- {
- parent::init();
-
- $this->catalogHost = $this->config['Catalog']['Host'];
- $this->renewalsScript = $this->config['Catalog']['renewalsScript'];
- $this->dbsid = isset($this->config['Catalog']['DB'])
- ? $this->config['Catalog']['DB'] : 1;
- }
-
- // public functions implemented to satisfy Driver Interface
-
- /**
- * Patron Login
- *
- * This is responsible for authenticating a patron against the catalog.
- *
- * @param string $barcode The patron username
- * @param string $password The patron's password
- *
- * @throws ILSException
- * @return mixed Associative array of patron info on successful login,
- * null on unsuccessful login.
- */
- public function patronLogin($barcode, $password)
- {
- // Build request:
- $request = new \Zend\Http\Request();
- $request->getPost()
- ->set('username', $barcode)
- ->set('password', $password);
-
- // First try local database:
- $db = new \VuFind\Auth\Database();
- try {
- $user = $db->authenticate($request);
- } catch (\VuFind\Exception\Auth $e) {
- // Next try LDAP:
- $ldap = new \VuFind\Auth\LDAP();
- $user = $ldap->authenticate($request);
- }
-
- $_SESSION['picauser'] = $user;
- return [
- 'id' => $user->id,
- 'firstname' => $user->firstname,
- 'lastname' => $user->lastname,
- 'email' => $user->email,
- 'username' => $barcode,
- 'password' => $password,
- 'cat_username' => $barcode,
- 'cat_password' => $password
- ];
- }
-
- /**
- * Get Patron Profile
- *
- * This is responsible for retrieving the profile for a specific patron.
- *
- * @param array $user The patron array
- *
- * @throws ILSException
- * @return array Array of the patron's profile data on success.
- */
- public function getMyProfile($user)
- {
- // TODO: this object probably doesn't have enough fields; it may be necessary
- // to subclass VuFind\Auth\LDAP with a different processLDAPUser() method for
- // loading the additional required properties.
- $userinfo = & $_SESSION['picauser'];
- // firstname
- $recordList['firstname'] = $userinfo->firstname;
- // lastname
- $recordList['lastname'] = $userinfo->lastname;
- // email
- $recordList['email'] = $userinfo->email;
- //Street and Number $ City $ Zip
- if ($userinfo->address) {
- $address = explode("\$", $userinfo->address);
- // address1
- $recordList['address1'] = $address[1];
- // address2
- $recordList['address2'] = $address[2];
- // zip (Post Code)
- $recordList['zip'] = $address[3];
- } else if ($userinfo->homeaddress) {
- $address = explode("\$", $userinfo->homeaddress);
- $recordList['address2'] = $address[0];
- $recordList['zip'] = $address[1];
- }
- // phone
- $recordList['phone'] = $userinfo->phone;
- // group
- $recordList['group'] = $userinfo->group;
- if ($recordList['firstname'] === null) {
- $recordList = $user;
- // add a group
- $recordList['group'] = 'No library account';
- }
- $recordList['expiration'] = $userinfo->libExpire;
- $recordList['status'] = $userinfo->borrowerStatus;
- // Get the LOANS-Page to extract a message for the user
- $URL = "/loan/DB={$this->dbsid}/USERINFO";
- $POST = [
- "ACT" => "UI_DATA",
- "LNG" => "DU",
- "BOR_U" => $_SESSION['picauser']->username,
- "BOR_PW" => $_SESSION['picauser']->getCatPassword()
- ];
- $postit = $this->postit($URL, $POST);
- // How many messages are there?
- $messages = substr_count($postit, '');
- $position = 0;
- if ($messages === 2) {
- // ignore the first message (its only the message to close the window
- // after finishing)
- for ($n = 0; $n < 2; $n++) {
- $pos = strpos($postit, '', $position);
- $pos_close = strpos($postit, '', $pos);
- $value = substr($postit, $pos + 22, ($pos_close - $pos - 22));
- $position = $pos + 1;
- }
- $recordList['message'] = $value;
- }
- return $recordList;
- }
-
- /**
- * Get Patron Transactions
- *
- * This is responsible for retrieving all transactions (i.e. checked out items)
- * by a specific patron.
- *
- * @param array $patron The patron array from patronLogin
- *
- * @throws \VuFind\Exception\Date
- * @throws ILSException
- * @return array Array of the patron's transactions on success.
- *
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function getMyTransactions($patron)
- {
- $URL = "/loan/DB={$this->dbsid}/USERINFO";
- $POST = [
- "ACT" => "UI_LOL",
- "LNG" => "DU",
- "BOR_U" => $_SESSION['picauser']->username,
- "BOR_PW" => $_SESSION['picauser']->getCatPassword()
- ];
- $postit = $this->postit($URL, $POST);
- // How many items are there?
- $holds = substr_count($postit, 'input type="checkbox" name="VB"');
- $iframes = $holdsByIframe = substr_count($postit, '