Merge branch 'seeddms-6.0.x' into seeddms-6.1.x

This commit is contained in:
Uwe Steinmann 2023-01-17 08:39:20 +01:00
commit 531cf570cc
365 changed files with 4285 additions and 1201 deletions

View File

@ -8,7 +8,7 @@ Header set X-Content-Type-Options: "nosniff"
RewriteEngine On RewriteEngine On
#RewriteRule "^favicon\.ico$" "-" [L] #RewriteRule "^favicon\.ico$" "-" [L]
#RewriteRule "^(favicon\.ico)$" %{HTTP_HOST}/views/bootstrap/images/favicon.svg [L,NC] #RewriteRule "^(favicon\.ico)$" %{HTTP_HOST}/views/bootstrap/images/favicon.svg [L,NC]
RewriteRule "(favicon\.ico)" /views/bootstrap/images/favicon.svg [L,NC] RewriteRule "^(favicon\.ico)" /views/bootstrap/images/favicon.svg [L,NC]
# Store the current location in an environment variable CWD to use # Store the current location in an environment variable CWD to use
# mod_rewrite in .htaccess files without knowing the RewriteBase # mod_rewrite in .htaccess files without knowing the RewriteBase
@ -32,7 +32,7 @@ RewriteRule ^ext/[^/]+/icon.(?:png|svg)$ - [L]
RewriteCond %{REQUEST_URI} "ext/[^/]+/" RewriteCond %{REQUEST_URI} "ext/[^/]+/"
RewriteRule !^ext/[^/]+/.*(?:op|out|res|node_modules) - [F] RewriteRule !^ext/[^/]+/.*(?:op|out|res|node_modules) - [F]
RewriteCond %{REQUEST_URI} "ext/[^/]+/res/.*$" [NC] RewriteCond %{REQUEST_URI} "ext/[^/]+/res/.*$" [NC]
RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|html|woff) - [F] RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|ico|html|woff) - [F]
RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ext/.*$ - [L] RewriteRule ^ext/.*$ - [L]

View File

@ -7,9 +7,16 @@
- do not use md5 password hashing anymore, hashes will be updated automatically - do not use md5 password hashing anymore, hashes will be updated automatically
when passwords are reset when passwords are reset
--------------------------------------------------------------------------------
Changes in version 6.0.22
--------------------------------------------------------------------------------
- merge changes up to 5.1.28
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Changes in version 6.0.21 Changes in version 6.0.21
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
- merge changes up to 5.1.27
- add new check for documents with identical sequence numbers in a folder
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Changes in version 6.0.20 Changes in version 6.0.20
@ -245,6 +252,19 @@
- add document list which can be exported as an archive - add document list which can be exported as an archive
- search results can be exported - search results can be exported
--------------------------------------------------------------------------------
Changes in version 5.1.29
--------------------------------------------------------------------------------
- fix php errors in restapi
- fix 'maximum size' error when uploading a file with drag&drop
- update jquery to 3.6.1 (only bootstrap4 theme)
- introduce authentication service
- new hook in restapi to add middleware
- previews for png, txt, pdf in different directories
- various improvements of fulltext service
- show number of documents per category in category manager
- show number of keywords per category in keyword manager
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Changes in version 5.1.28 Changes in version 5.1.28
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -252,6 +272,21 @@
with 0 bytes was created by the user with 0 bytes was created by the user
- fix repair of wrong file extension - fix repair of wrong file extension
- fix regression in password forgotten function - fix regression in password forgotten function
- fix security issue when creating hash in password forgotten operation
- add initial support for logging and notifications in rest api
- add rest api calls to get attributes of a document version and to set
attributes of folders, documents, and document versions
- fixed various errors in swagger.yaml
- use methods in inc/inc.ClassNotificationService.php for webdav
- clear login failures when login by webdav succeeds
- output log of restapi in LogManagement
- new hook to add more tabs for sections in LogManagement
- rest api returns version attributes as 'version_attributes' (was
'version-attributes'), each attribute also contains the name
- new hook in rest api to add more routes in extensions
- uploaded several documents at once by fast upload will assign random
sequence number to allow manually sorting the documents afterwards
- fix counting of login failures if both ldap and db authentication is done
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Changes in version 5.1.27 Changes in version 5.1.27

View File

@ -62,7 +62,9 @@ repository:
doc: doc:
$(PHPDOC) -d SeedDMS_Core --ignore 'getusers.php,getfoldertree.php,config.php,reverselookup.php' --force -t html $(PHPDOC) -d SeedDMS_Core --ignore 'getusers.php,getfoldertree.php,config.php,reverselookup.php' --force -t html
# Download apigen with
# composer create-project --no-dev apigen/apigen:^7.0@alpha tools/apigen
apidoc: apidoc:
apigen generate -s SeedDMS_Core --exclude tests -d html tools/apigen/bin/apigen SeedDMS_Core/Core --exclude "tests/*" --output html
.PHONY: doc webdav webapp repository .PHONY: doc webdav webapp repository

View File

@ -120,6 +120,27 @@ class SeedDMS_Core_Attribute { /* {{{ */
*/ */
function getValue() { return $this->_value; } function getValue() { return $this->_value; }
/**
* Return attribute value parsed into a php type or object
*
* This function will return the value of multi value attributes
* including the separator char.
*
* @return string the attribute value as it is stored in the database.
*/
function getParsedValue() { /* {{{ */
switch($this->_attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_float:
return (float) $this->_value;
case SeedDMS_Core_AttributeDefinition::type_boolean:
return (bool) $this->_value;
case SeedDMS_Core_AttributeDefinition::type_int:
return (int) $this->_value;
default:
return $this->_value;
}
} /* }}} */
/** /**
* Return attribute values as an array * Return attribute values as an array
* *
@ -247,7 +268,7 @@ class SeedDMS_Core_Attribute { /* {{{ */
break; break;
case $this->_dms->getClassname('folder'): case $this->_dms->getClassname('folder'):
if(trim($value) === '') if(trim($value) === '')
$queryStr = "DELETE FROM `tblFolderAttributes WHERE` `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); $queryStr = "DELETE FROM `tblFolderAttributes` WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId();
else else
$queryStr = "UPDATE `tblFolderAttributes` SET `value` = ".$db->qstr($value)." WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); $queryStr = "UPDATE `tblFolderAttributes` SET `value` = ".$db->qstr($value)." WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId();
break; break;
@ -1232,7 +1253,7 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */
* @param boolean $new set to true if the value is new value and not taken from * @param boolean $new set to true if the value is new value and not taken from
* an existing attribute * an existing attribute
* (this will only be passed to the onAttributeValidate callback) * (this will only be passed to the onAttributeValidate callback)
* @return boolean true if validation succeds, otherwise false * @return boolean true if validation succeeds, otherwise false
*/ */
function validate($attrvalue, $object=null, $new=false) { /* {{{ */ function validate($attrvalue, $object=null, $new=false) { /* {{{ */
/* Check if 'onAttributeValidate' callback is set */ /* Check if 'onAttributeValidate' callback is set */

View File

@ -451,6 +451,7 @@ class SeedDMS_Core_DMS {
$this->classnames['folder'] = 'SeedDMS_Core_Folder'; $this->classnames['folder'] = 'SeedDMS_Core_Folder';
$this->classnames['document'] = 'SeedDMS_Core_Document'; $this->classnames['document'] = 'SeedDMS_Core_Document';
$this->classnames['documentcontent'] = 'SeedDMS_Core_DocumentContent'; $this->classnames['documentcontent'] = 'SeedDMS_Core_DocumentContent';
$this->classnames['documentfile'] = 'SeedDMS_Core_DocumentFile';
$this->classnames['user'] = 'SeedDMS_Core_User'; $this->classnames['user'] = 'SeedDMS_Core_User';
$this->classnames['role'] = 'SeedDMS_Core_Role'; $this->classnames['role'] = 'SeedDMS_Core_Role';
$this->classnames['apikey'] = 'SeedDMS_Core_ApiKey'; $this->classnames['apikey'] = 'SeedDMS_Core_ApiKey';
@ -4131,6 +4132,41 @@ class SeedDMS_Core_DMS {
} /* }}} */ } /* }}} */
/**
* Returns folders which contain documents with none unique sequence number
*
* This method is for finding folders with documents not having a
* unique sequence number. Those documents cannot propperly be sorted
* by sequence and changing their position is impossible if more than
* two documents with the same sequence number exists, e.g.
* doc 1: 3
* doc 2: 5
* doc 3: 5
* doc 4: 5
* doc 5: 7
* If document 4 was to be moved between doc 1 and 2 it get sequence
* number 4 ((5+3)/2).
* But if document 4 was to be moved between doc 2 and 3 it will again
* have sequence number 5.
*
* @return array|bool
*/
function getDuplicateSequenceNo() { /* {{{ */
$queryStr = "SELECT DISTINCT `folder` FROM (SELECT `folder`, `sequence`, count(*) c FROM `tblDocuments` GROUP BY `folder`, `sequence` HAVING c > 1) a";
$resArr = $this->db->getResultArray($queryStr);
if ($resArr === false)
return false;
$folders = array();
foreach($resArr as $row) {
$folder = $this->getFolder($row['folder']);
if($folder)
$folders[] = $folder;
}
return $folders;
} /* }}} */
/** /**
* Returns a list of reviews, approvals, receipts, revisions which are not * Returns a list of reviews, approvals, receipts, revisions which are not
* linked to a user, group anymore * linked to a user, group anymore

View File

@ -124,7 +124,7 @@ define("S_LOG_SLEEPING", -3);
/** /**
* Class to represent a document in the document management system * Class to represent a document in the document management system
* *
* A document in SeedDMS is similar to files in a regular file system. * A document in SeedDMS is similar to a file in a regular file system.
* Documents may have any number of content elements * Documents may have any number of content elements
* ({@link SeedDMS_Core_DocumentContent}). These content elements are often * ({@link SeedDMS_Core_DocumentContent}). These content elements are often
* called versions ordered in a timely manner. The most recent content element * called versions ordered in a timely manner. The most recent content element
@ -139,7 +139,7 @@ define("S_LOG_SLEEPING", -3);
* @author Markus Westphal, Malcolm Cowe, Matteo Lucarelli, * @author Markus Westphal, Malcolm Cowe, Matteo Lucarelli,
* Uwe Steinmann <uwe@steinmann.cx> * Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe,
* 2010 Matteo Lucarelli, 2010 Uwe Steinmann * 2010 Matteo Lucarelli, 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
@ -1202,7 +1202,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
$db->rollbackTransaction(); $db->rollbackTransaction();
return false; return false;
} }
if(!SeedDMS_Core_File::removeFile($info['filename'])) { if(file_exists($info['filename']) && !SeedDMS_Core_File::removeFile($info['filename'])) {
$db->rollbackTransaction(); $db->rollbackTransaction();
return false; return false;
} }
@ -2325,7 +2325,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
} }
foreach($resArr as $res) { foreach($resArr as $res) {
$file = $this->_dms->contentDir . $this->getDir().'r'.$res['reviewLogID']; $file = $this->_dms->contentDir . $this->getDir().'r'.$res['reviewLogID'];
if(file_exists($file)) if(SeedDMS_Core_File::file_exists($file))
SeedDMS_Core_File::removeFile($file); SeedDMS_Core_File::removeFile($file);
} }
} }
@ -2354,7 +2354,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
} }
foreach($resArr as $res) { foreach($resArr as $res) {
$file = $this->_dms->contentDir . $this->getDir().'a'.$res['approveLogID']; $file = $this->_dms->contentDir . $this->getDir().'a'.$res['approveLogID'];
if(file_exists($file)) if(SeedDMS_Core_File::file_exists($file))
SeedDMS_Core_File::removeFile($file); SeedDMS_Core_File::removeFile($file);
} }
} }
@ -2458,7 +2458,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
return false; return false;
} }
if (file_exists( $this->_dms->contentDir.$version->getPath() )) if (SeedDMS_Core_File::file_exists( $this->_dms->contentDir.$version->getPath() ))
if (!SeedDMS_Core_File::removeFile( $this->_dms->contentDir.$version->getPath() )) { if (!SeedDMS_Core_File::removeFile( $this->_dms->contentDir.$version->getPath() )) {
$db->rollbackTransaction(); $db->rollbackTransaction();
return false; return false;
@ -2714,7 +2714,8 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
if ((is_bool($resArr) && !$resArr) || count($resArr)==0) return false; if ((is_bool($resArr) && !$resArr) || count($resArr)==0) return false;
$resArr = $resArr[0]; $resArr = $resArr[0];
$file = new SeedDMS_Core_DocumentFile($resArr["id"], $this, $resArr["userID"], $resArr["comment"], $resArr["date"], $resArr["dir"], $resArr["fileType"], $resArr["mimeType"], $resArr["orgFileName"], $resArr["name"],$resArr["version"],$resArr["public"]); $classname = $this->_dms->getClassname('documentfile');
$file = new $classname($resArr["id"], $this, $resArr["userID"], $resArr["comment"], $resArr["date"], $resArr["dir"], $resArr["fileType"], $resArr["mimeType"], $resArr["orgFileName"], $resArr["name"],$resArr["version"],$resArr["public"]);
$user = $this->_dms->getLoggedInUser(); $user = $this->_dms->getLoggedInUser();
if($file->getAccessMode($user) >= M_READ) if($file->getAccessMode($user) >= M_READ)
return $file; return $file;
@ -2755,8 +2756,9 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
$this->_documentFiles = array($hash=>array()); $this->_documentFiles = array($hash=>array());
$user = $this->_dms->getLoggedInUser(); $user = $this->_dms->getLoggedInUser();
$classname = $this->_dms->getClassname('documentfile');
foreach ($resArr as $row) { foreach ($resArr as $row) {
$file = new SeedDMS_Core_DocumentFile($row["id"], $this, $row["userID"], $row["comment"], $row["date"], $row["dir"], $row["fileType"], $row["mimeType"], $row["orgFileName"], $row["name"], $row["version"], $row["public"]); $file = new $classname($row["id"], $this, $row["userID"], $row["comment"], $row["date"], $row["dir"], $row["fileType"], $row["mimeType"], $row["orgFileName"], $row["name"], $row["version"], $row["public"]);
if($file->getAccessMode($user) >= M_READ) if($file->getAccessMode($user) >= M_READ)
array_push($this->_documentFiles[$hash], $file); array_push($this->_documentFiles[$hash], $file);
} }
@ -2820,7 +2822,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
return false; return false;
} }
if (file_exists( $this->_dms->contentDir . $file->getPath() )){ if (SeedDMS_Core_File::file_exists( $this->_dms->contentDir . $file->getPath() )){
if (!SeedDMS_Core_File::removeFile( $this->_dms->contentDir . $file->getPath() )) { if (!SeedDMS_Core_File::removeFile( $this->_dms->contentDir . $file->getPath() )) {
$db->rollbackTransaction(); $db->rollbackTransaction();
return false; return false;
@ -2887,7 +2889,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
// TODO: versioning file? // TODO: versioning file?
if (file_exists( $this->_dms->contentDir . $this->getDir() )) if (SeedDMS_Core_File::file_exists( $this->_dms->contentDir . $this->getDir() ))
if (!SeedDMS_Core_File::removeDir( $this->_dms->contentDir . $this->getDir() )) { if (!SeedDMS_Core_File::removeDir( $this->_dms->contentDir . $this->getDir() )) {
$db->rollbackTransaction(); $db->rollbackTransaction();
return false; return false;
@ -3293,7 +3295,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx> * Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, * @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann * 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
@ -3729,6 +3731,9 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
function setMimeType($newMimetype) { /* {{{ */ function setMimeType($newMimetype) { /* {{{ */
$db = $this->_document->getDMS()->getDB(); $db = $this->_document->getDMS()->getDB();
if(!$newMimetype)
return false;
$newMimetype = trim($newMimetype); $newMimetype = trim($newMimetype);
if(!$newMimetype) if(!$newMimetype)
@ -4177,7 +4182,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
} }
foreach($res as &$t) { foreach($res as &$t) {
$filename = $this->_dms->contentDir . $this->_document->getDir().'r'.$t['reviewLogID']; $filename = $this->_dms->contentDir . $this->_document->getDir().'r'.$t['reviewLogID'];
if(file_exists($filename)) if(SeedDMS_Core_File::file_exists($filename))
$t['file'] = $filename; $t['file'] = $filename;
else else
$t['file'] = ''; $t['file'] = '';
@ -4357,7 +4362,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
} }
foreach($res as &$t) { foreach($res as &$t) {
$filename = $this->_dms->contentDir . $this->_document->getDir().'a'.$t['approveLogID']; $filename = $this->_dms->contentDir . $this->_document->getDir().'a'.$t['approveLogID'];
if(file_exists($filename)) if(SeedDMS_Core_File::file_exists($filename))
$t['file'] = $filename; $t['file'] = $filename;
else else
$t['file'] = ''; $t['file'] = '';
@ -7043,7 +7048,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
$dms = $this->_document->getDMS(); $dms = $this->_document->getDMS();
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
if(file_exists($this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType)) { if(SeedDMS_Core_File::file_exists($this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType)) {
if(strlen($this->_fileType) < 2) { if(strlen($this->_fileType) < 2) {
switch($this->_mimeType) { switch($this->_mimeType) {
case "application/pdf": case "application/pdf":
@ -7068,7 +7073,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
break; break;
} }
} }
} elseif(file_exists($this->_document->getDir() . $this->_version . '.')) { } elseif(SeedDMS_Core_File::file_exists($this->_document->getDir() . $this->_version . '.')) {
echo "no file"; echo "no file";
} else { } else {
echo $this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType; echo $this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType;
@ -7094,7 +7099,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx> * Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, * @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann * 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_DocumentLink { /* {{{ */ class SeedDMS_Core_DocumentLink { /* {{{ */
@ -7226,7 +7231,7 @@ class SeedDMS_Core_DocumentLink { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx> * Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, * @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann * 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_DocumentFile { /* {{{ */ class SeedDMS_Core_DocumentFile { /* {{{ */
@ -7542,7 +7547,7 @@ class SeedDMS_Core_DocumentFile { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx> * Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, * @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann * 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_AddContentResultSet { /* {{{ */ class SeedDMS_Core_AddContentResultSet { /* {{{ */

View File

@ -778,21 +778,25 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
/** /**
* Returns a file system path * Returns a file system path
* *
* This path contains spaces around the slashes for better readability. * This path contains by default spaces around the slashes for better readability.
* Run str_replace(' / ', '/', $path) on it to get a valid unix * Run str_replace(' / ', '/', $path) on it or pass '/' as $sep to get a valid unix
* file system path. * file system path.
* *
* @param bool $skiproot skip the name of the root folder and start with $sep
* @param string $sep separator between path elements
* @return string path separated with ' / ' * @return string path separated with ' / '
*/ */
function getFolderPathPlain() { /* {{{ */ function getFolderPathPlain($skiproot = false, $sep = ' / ') { /* {{{ */
$path=""; $path="".$sep;
$folderPath = $this->getPath(); $folderPath = $this->getPath();
for ($i = 0; $i < count($folderPath); $i++) { for ($i = 0; $i < count($folderPath); $i++) {
$path .= $folderPath[$i]->getName(); if($i > 0 || !$skiproot) {
if ($i +1 < count($folderPath)) $path .= $folderPath[$i]->getName();
$path .= " / "; if ($i+1 < count($folderPath))
$path .= $sep;
}
} }
return $path; return trim($path);
} /* }}} */ } /* }}} */
/** /**
@ -1062,7 +1066,11 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
} }
if($categories) { if($categories) {
$document->setCategories($categories); if(!$document->setCategories($categories)) {
$document->remove();
$db->rollbackTransaction();
return false;
}
} }
if($attributes) { if($attributes) {
@ -2195,6 +2203,40 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
return $resArr[0]; return $resArr[0];
} /* }}} */ } /* }}} */
/**
* Reorder documents of folder
*
* Fix the sequence numbers of all documents in the folder, by assigning new
* numbers starting from 1 incrementing by 1. This can be necessary if sequence
* numbers are not unique which makes manual reordering for documents with
* identical sequence numbers impossible.
*
* @return bool false in case of an error, otherwise true
*/
function reorderDocuments() { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "SELECT `id` FROM `tblDocuments` WHERE `folder` = " . (int) $this->_id . " ORDER BY `sequence`";
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
$db->startTransaction();
$no = 1.0;
foreach($resArr as $doc) {
$queryStr = "UPDATE `tblDocuments` SET `sequence` = " . $no . " WHERE `id` = ". $doc['id'];
if (!$db->getResult($queryStr)) {
$db->rollbackTransaction();
return false;
}
$no += 1.0;
}
$db->commitTransaction();
return true;
} /* }}} */
} }
?> ?>

View File

@ -1,5 +1,5 @@
<?php <?php
namespace SeedDMS; namespace SeedDMS\Core;
/** /**
* Implementation of the document iterartor * Implementation of the document iterartor

View File

@ -8,7 +8,7 @@
* @version @version@ * @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx> * @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe,
* 2010 Uwe Steinmann * 2010-2023 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
@ -19,7 +19,7 @@
* @package SeedDMS_Core * @package SeedDMS_Core
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx> * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe,
* 2010 Uwe Steinmann * 2010-2023 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_KeywordCategory { class SeedDMS_Core_KeywordCategory {
@ -47,53 +47,53 @@ class SeedDMS_Core_KeywordCategory {
*/ */
protected $_dms; protected $_dms;
/** /**
* SeedDMS_Core_KeywordCategory constructor. * SeedDMS_Core_KeywordCategory constructor.
* @param $id * @param $id
* @param $ownerID * @param $ownerID
* @param $name * @param $name
*/ */
function __construct($id, $ownerID, $name) { function __construct($id, $ownerID, $name) { /* {{{ */
$this->_id = $id; $this->_id = $id;
$this->_name = $name; $this->_name = $name;
$this->_ownerID = $ownerID; $this->_ownerID = $ownerID;
$this->_dms = null; $this->_dms = null;
} } /* }}} */
/** /**
* @param SeedDMS_Core_DMS $dms * @param SeedDMS_Core_DMS $dms
*/ */
function setDMS($dms) { function setDMS($dms) { /* {{{ */
$this->_dms = $dms; $this->_dms = $dms;
} } /* }}} */
/** /**
* @return int * @return int
*/ */
function getID() { return $this->_id; } function getID() { return $this->_id; }
/** /**
* @return string * @return string
*/ */
function getName() { return $this->_name; } function getName() { return $this->_name; }
/** /**
* @return bool|SeedDMS_Core_User * @return bool|SeedDMS_Core_User
*/ */
function getOwner() { function getOwner() { /* {{{ */
if (!isset($this->_owner)) if (!isset($this->_owner))
$this->_owner = $this->_dms->getUser($this->_ownerID); $this->_owner = $this->_dms->getUser($this->_ownerID);
return $this->_owner; return $this->_owner;
} } /* }}} */
/** /**
* @param $newName * @param $newName
* @return bool * @return bool
*/ */
function setName($newName) { function setName($newName) { /* {{{ */
$newName = trim($newName); $newName = trim($newName);
if(!$newName) if(!$newName)
return false; return false;
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
@ -103,75 +103,89 @@ class SeedDMS_Core_KeywordCategory {
$this->_name = $newName; $this->_name = $newName;
return true; return true;
} } /* }}} */
/** /**
* @param SeedDMS_Core_User $user * @param SeedDMS_Core_User $user
* @return bool * @return bool
*/ */
function setOwner($user) { function setOwner($user) { /* {{{ */
if(!$user || !$user->isType('user')) if(!$user || !$user->isType('user'))
return false; return false;
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
$queryStr = "UPDATE `tblKeywordCategories` SET `owner` = " . $user->getID() . " WHERE `id` = " . $this->_id; $queryStr = "UPDATE `tblKeywordCategories` SET `owner` = " . $user->getID() . " WHERE `id` = " . $this->_id;
if (!$db->getResult($queryStr)) if (!$db->getResult($queryStr))
return false; return false;
$this->_ownerID = $user->getID(); $this->_ownerID = $user->getID();
$this->_owner = $user; $this->_owner = $user;
return true; return true;
} } /* }}} */
/** /**
* @return array * @return array keywords in this list
*/ */
function getKeywordLists() { function getKeywordLists() { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
$queryStr = "SELECT * FROM `tblKeywords` WHERE `category` = " . $this->_id . " order by `keywords`"; $queryStr = "SELECT * FROM `tblKeywords` WHERE `category` = " . $this->_id . " order by `keywords`";
return $db->getResultArray($queryStr); return $db->getResultArray($queryStr);
} }
/** /**
* @param $listID * @return integer number of keywords in this list
* @param $keywords */
* @return bool function countKeywordLists() { /* {{{ */
*/ $db = $this->_dms->getDB();
function editKeywordList($listID, $keywords) {
$queryStr = "SELECT COUNT(*) as `c` FROM `tblKeywords` where `category`=".$this->_id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && !$resArr)
return false;
return $resArr[0]['c'];
} /* }}} */
/**
* @param $listID
* @param $keywords
* @return bool
*/
function editKeywordList($listID, $keywords) { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
$queryStr = "UPDATE `tblKeywords` SET `keywords` = ".$db->qstr($keywords)." WHERE `id` = $listID"; $queryStr = "UPDATE `tblKeywords` SET `keywords` = ".$db->qstr($keywords)." WHERE `id` = $listID";
return $db->getResult($queryStr); return $db->getResult($queryStr);
} } /* }}} */
/** /**
* @param $keywords * @param $keywords
* @return bool * @return bool
*/ */
function addKeywordList($keywords) { function addKeywordList($keywords) { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
$queryStr = "INSERT INTO `tblKeywords` (`category`, `keywords`) VALUES (" . $this->_id . ", ".$db->qstr($keywords).")"; $queryStr = "INSERT INTO `tblKeywords` (`category`, `keywords`) VALUES (" . $this->_id . ", ".$db->qstr($keywords).")";
return $db->getResult($queryStr); return $db->getResult($queryStr);
} } /* }}} */
/** /**
* @param $listID * @param $listID
* @return bool * @return bool
*/ */
function removeKeywordList($listID) { function removeKeywordList($listID) { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
$queryStr = "DELETE FROM `tblKeywords` WHERE `id` = $listID"; $queryStr = "DELETE FROM `tblKeywords` WHERE `id` = $listID";
return $db->getResult($queryStr); return $db->getResult($queryStr);
} } /* }}} */
/** /**
* @return bool * @return bool
*/ */
function remove() { function remove() { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
$db->startTransaction(); $db->startTransaction();
@ -189,5 +203,5 @@ class SeedDMS_Core_KeywordCategory {
$db->commitTransaction(); $db->commitTransaction();
return true; return true;
} } /* }}} */
} }

View File

@ -38,10 +38,10 @@ class SeedDMS_Core_Object { /* {{{ */
*/ */
public $_dms; public $_dms;
/** /**
* SeedDMS_Core_Object constructor. * SeedDMS_Core_Object constructor.
* @param $id * @param $id
*/ */
function __construct($id) { /* {{{ */ function __construct($id) { /* {{{ */
$this->_id = $id; $this->_id = $id;
$this->_dms = null; $this->_dms = null;
@ -155,7 +155,7 @@ class SeedDMS_Core_Object { /* {{{ */
} }
if (isset($this->_attributes[$attrdef->getId()])) { if (isset($this->_attributes[$attrdef->getId()])) {
$value = $this->_attributes[$attrdef->getId()]->getValue(); $value = $this->_attributes[$attrdef->getId()]->getValue();
if($attrdef->getMultipleValues()) { if($attrdef->getMultipleValues()) {
$sep = substr($value, 0, 1); $sep = substr($value, 0, 1);
$vsep = $attrdef->getValueSetSeparator(); $vsep = $attrdef->getValueSetSeparator();
@ -169,7 +169,7 @@ class SeedDMS_Core_Object { /* {{{ */
else else
return(array($value)); return(array($value));
} else { } else {
return $value; return $this->_attributes[$attrdef->getId()]->getParsedValue();
} }
} else } else
return false; return false;

View File

@ -313,6 +313,7 @@ class SeedDMS_Core_DatabaseAccess {
switch($this->_driver) { switch($this->_driver) {
case 'mysql': case 'mysql':
$this->_conn->exec('SET NAMES utf8'); $this->_conn->exec('SET NAMES utf8');
// $this->_conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
/* Turn this on if you want strict checking of default values, etc. */ /* Turn this on if you want strict checking of default values, etc. */
/* $this->_conn->exec("SET SESSION sql_mode = 'STRICT_TRANS_TABLES'"); */ /* $this->_conn->exec("SET SESSION sql_mode = 'STRICT_TRANS_TABLES'"); */
/* The following is the default on Ubuntu 16.04 */ /* The following is the default on Ubuntu 16.04 */
@ -459,9 +460,15 @@ class SeedDMS_Core_DatabaseAccess {
$this->_conn->beginTransaction(); $this->_conn->beginTransaction();
} }
$this->_intransaction++; $this->_intransaction++;
if($this->_logfp) {
fwrite($this->_logfp, microtime()." START ".$htis->_intransaction."\n");
}
} /* }}} */ } /* }}} */
function rollbackTransaction() { /* {{{ */ function rollbackTransaction() { /* {{{ */
if($this->_logfp) {
fwrite($this->_logfp, microtime()." ROLLBACK ".$htis->_intransaction."\n");
}
if($this->_intransaction == 1) { if($this->_intransaction == 1) {
$this->_conn->rollBack(); $this->_conn->rollBack();
} }
@ -469,6 +476,9 @@ class SeedDMS_Core_DatabaseAccess {
} /* }}} */ } /* }}} */
function commitTransaction() { /* {{{ */ function commitTransaction() { /* {{{ */
if($this->_logfp) {
fwrite($this->_logfp, microtime()." COMMIT ".$htis->_intransaction."\n");
}
if($this->_intransaction == 1) { if($this->_intransaction == 1) {
$this->_conn->commit(); $this->_conn->commit();
} }

View File

@ -9,19 +9,21 @@
* @author Uwe Steinmann <uwe@steinmann.cx> * @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, * @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann * 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
/** /**
* Class to represent a user in the document management system * Class to file operation in the document management system
* Use the methods of this class only for files below the content
* directory but not for temporäry files, cache files or log files.
* *
* @category DMS * @category DMS
* @package SeedDMS_Core * @package SeedDMS_Core
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx> * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, * @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann * 2010-2022 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_Core_File { class SeedDMS_Core_File {
@ -78,8 +80,37 @@ class SeedDMS_Core_File {
} /* }}} */ } /* }}} */
/** /**
* @param $size * Return the mimetype of a given file
* @param array $sizes *
* This method uses finfo to determine the mimetype
* but will correct some mimetypes which are
* not propperly determined or could be more specific, e.g. text/plain
* when it is actually text/markdown. In thoses cases
* the file extension will be taken into account.
*
* @param string $filename name of file on disc
* @return string mimetype
*/
static function mimetype($filename) { /* {{{ */
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
switch($mimetype) {
case 'application/octet-stream':
case 'text/plain':
$lastDotIndex = strrpos($filename, ".");
if($lastDotIndex === false) $fileType = ".";
else $fileType = substr($filename, $lastDotIndex);
if($fileType == '.md')
$mimetype = 'text/markdown';
break;
}
return $mimetype;
} /* }}} */
/**
* @param integer $size
* @param array $sizes list of units for 10^0, 10^3, 10^6, ..., 10^(n*3) bytes
* @return string * @return string
*/ */
static function format_filesize($size, $sizes = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB')) { /* {{{ */ static function format_filesize($size, $sizes = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB')) { /* {{{ */
@ -90,18 +121,22 @@ class SeedDMS_Core_File {
} /* }}} */ } /* }}} */
/** /**
* Parses a string like '[0-9]+ *[BKMGT]*' into an integer
* B,K,M,G,T stand for byte, kilo byte, mega byte, giga byte, tera byte
* If the last character is omitted, bytes are assumed.
*
* @param $str * @param $str
* @return bool|int * @return bool|int
*/ */
static function parse_filesize($str) { /* {{{ */ static function parse_filesize($str) { /* {{{ */
preg_replace('/\s\s+/', '', $str); if(!preg_match('/^([0-9]+) *([BKMGT]*)$/', trim($str), $matches))
if(in_array(strtoupper(substr($str, -1)), array('B','K','M','G'))) { return false;
$value = (int) substr($str, 0, -1); $value = $matches[1];
$unit = substr($str, -1, 1); $unit = $matches[2] ? $matches[2] : 'B';
} else { switch($unit) {
return (int) $str; case 'T':
} return $value * 1024 * 1024 * 1024 *1024;
switch(strtoupper($unit)) { break;
case 'G': case 'G':
return $value * 1024 * 1024 * 1024; return $value * 1024 * 1024 * 1024;
break; break;
@ -112,13 +147,21 @@ class SeedDMS_Core_File {
return $value * 1024; return $value * 1024;
break; break;
default; default;
return $value; return (int) $value;
break; break;
} }
/** @noinspection PhpUnreachableStatementInspection */ /** @noinspection PhpUnreachableStatementInspection */
return false; return false;
} /* }}} */ } /* }}} */
/**
* @param $file
* @return string
*/
static function file_exists($file) { /* {{{ */
return file_exists($file);
} /* }}} */
/** /**
* @param $file * @param $file
* @return string * @return string
@ -129,7 +172,7 @@ class SeedDMS_Core_File {
/** /**
* @param $string mimetype * @param $string mimetype
* @return string * @return string file extension with the dot or an empty string
*/ */
static function fileExtension($mimetype) { /* {{{ */ static function fileExtension($mimetype) { /* {{{ */
switch($mimetype) { switch($mimetype) {
@ -224,6 +267,7 @@ class SeedDMS_Core_File {
'text/x-log' => 'log', 'text/x-log' => 'log',
'audio/x-m4a' => 'm4a', 'audio/x-m4a' => 'm4a',
'application/vnd.mpegurl' => 'm4u', 'application/vnd.mpegurl' => 'm4u',
'text/markdown' => 'md',
'audio/midi' => 'mid', 'audio/midi' => 'mid',
'application/vnd.mif' => 'mif', 'application/vnd.mif' => 'mif',
'video/quicktime' => 'mov', 'video/quicktime' => 'mov',
@ -405,7 +449,7 @@ class SeedDMS_Core_File {
continue; continue;
else if (is_dir($path . DIRECTORY_SEPARATOR . $entry)) else if (is_dir($path . DIRECTORY_SEPARATOR . $entry))
{ {
if (!self::removeDir($path . DIRECTORY_SEPARATOR . $entry . "/")) if (!self::removeDir($path . DIRECTORY_SEPARATOR . $entry ))
return false; return false;
} }
else else
@ -452,10 +496,10 @@ class SeedDMS_Core_File {
*/ */
static function moveDir($sourcePath, $targetPath) { /* {{{ */ static function moveDir($sourcePath, $targetPath) { /* {{{ */
/** @noinspection PhpUndefinedFunctionInspection */ /** @noinspection PhpUndefinedFunctionInspection */
if (!copyDir($sourcePath, $targetPath)) if (!self::copyDir($sourcePath, $targetPath))
return false; return false;
/** @noinspection PhpUndefinedFunctionInspection */ /** @noinspection PhpUndefinedFunctionInspection */
return removeDir($sourcePath); return self::removeDir($sourcePath);
} /* }}} */ } /* }}} */
// code by Kioob (php.net manual) // code by Kioob (php.net manual)

View File

@ -12,7 +12,7 @@
<email>uwe@steinmann.cx</email> <email>uwe@steinmann.cx</email>
<active>yes</active> <active>yes</active>
</lead> </lead>
<date>2022-10-10</date> <date>2022-12-10</date>
<time>13:44:55</time> <time>13:44:55</time>
<version> <version>
<release>6.1.0</release> <release>6.1.0</release>
@ -2012,6 +2012,49 @@ add method SeedDMS_Core_DatabaseAccess::setLogFp()
- pass an array as an attribute to search() will OR each element - pass an array as an attribute to search() will OR each element
</notes> </notes>
</release> </release>
<release>
<date>2022-11-07</date>
<time>13:44:55</time>
<version>
<release>5.1.28</release>
<api>5.1.28</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- fix SeedDMS_Core_User::getDocumentContents()
- fix SeedDMS_Core_File::fileExtension()
- SeedDMS_Core_DMS::createPasswordRequest() creates a cryptographically secure hash
- fix sql error when deleting a folder attribute
- add SeedDMS_Core_Attribute::getParsedValue() and use it in SeedDMS_Core_Object::getAttributeValue()
- add SeedDMS_Core_DMS::getDuplicateSequenceNo() and SeedDMS_Core_Folder::reorderDocuments()
- add SeedDMS_Core_File::mimetype(), fix SeedDMS_Core_File::moveDir()
- all file operations use methods of SeedDMS_Core_File
- change namespace of iterators from SeedDMS to SeedDMS\Core
</notes>
</release>
<release>
<date>2022-11-21</date>
<time>13:44:55</time>
<version>
<release>5.1.29</release>
<api>5.1.29</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- SeedDMS_Core_Folder::addDocument() does rollback transaction propperly when setting document categories fail
- add $skiproot and $sep parameter to SeedDMS_Core_Folder::getFolderPathPlain()
- add class name for 'documentfile'
- add method SeedDMS_Core_KeywordCategory::countKeywordLists()
</notes>
</release>
<release> <release>
<date>2017-02-28</date> <date>2017-02-28</date>
<time>06:34:50</time> <time>06:34:50</time>
@ -2429,7 +2472,7 @@ better error checking in SeedDMS_Core_Document::cancelCheckOut()
</notes> </notes>
</release> </release>
<release> <release>
<date>2022-09-18</date> <date>2022-11-18</date>
<time>13:44:55</time> <time>13:44:55</time>
<version> <version>
<release>6.0.21</release> <release>6.0.21</release>
@ -2446,5 +2489,21 @@ better error checking in SeedDMS_Core_Document::cancelCheckOut()
- SeedDMS_Core_DMS::createPasswordRequest() creates a cryptographically secure hash - SeedDMS_Core_DMS::createPasswordRequest() creates a cryptographically secure hash
</notes> </notes>
</release> </release>
<release>
<date>2023-l1-16</date>
<time>13:44:55</time>
<version>
<release>6.0.22</release>
<api>6.0.22</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- all changes from 5.1.29 merged
</notes>
</release>
</changelog> </changelog>
</package> </package>

View File

@ -145,12 +145,14 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document {
if($document->isType('document')) { if($document->isType('document')) {
$this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'D'.$document->getID())); $this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'D'.$document->getID()));
$this->addField(Zend_Search_Lucene_Field::Keyword('record_type', 'document'));
$version = $document->getLatestContent(); $version = $document->getLatestContent();
if($version) { if($version) {
$this->addField(Zend_Search_Lucene_Field::Keyword('mimetype', $version->getMimeType())); $this->addField(Zend_Search_Lucene_Field::Keyword('mimetype', $version->getMimeType()));
$this->addField(Zend_Search_Lucene_Field::Keyword('origfilename', $version->getOriginalFileName(), 'utf-8')); $this->addField(Zend_Search_Lucene_Field::Keyword('origfilename', $version->getOriginalFileName(), 'utf-8'));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $version->getDate()));
if(!$nocontent) if(!$nocontent)
$this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $version->getDate())); $this->addField(Zend_Search_Lucene_Field::UnIndexed('indexed', time()));
if($attributes = $version->getAttributes()) { if($attributes = $version->getAttributes()) {
foreach($attributes as $attribute) { foreach($attributes as $attribute) {
$attrdef = $attribute->getAttributeDefinition(); $attrdef = $attribute->getAttributeDefinition();
@ -181,7 +183,15 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document {
if(file_exists($path)) { if(file_exists($path)) {
$mimetype = $version->getMimeType(); $mimetype = $version->getMimeType();
$this->mimetype = $mimetype; $this->mimetype = $mimetype;
if(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) { if(is_callable($convcmd)) {
$result = $convcmd($document);
if($result['content']) {
self::setContent($result['content']);
} elseif($result['content'] === false) {
$this->errormsg = $result['errormsg'];
}
$this->cmd = $result['cmd'];
} elseif(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) {
if($service = $convcmd->getService($mimetype, 'text/plain')) { if($service = $convcmd->getService($mimetype, 'text/plain')) {
$content = $convcmd->convert($path, $mimetype, 'text/plain'); $content = $convcmd->convert($path, $mimetype, 'text/plain');
if($content) { if($content) {
@ -223,7 +233,9 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document {
} }
} elseif($document->isType('folder')) { } elseif($document->isType('folder')) {
$this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'F'.$document->getID())); $this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'F'.$document->getID()));
$this->addField(Zend_Search_Lucene_Field::Keyword('record_type', 'folder'));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $document->getDate())); $this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $document->getDate()));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('indexed', time()));
} }
} /* }}} */ } /* }}} */

View File

@ -29,10 +29,23 @@ class SeedDMS_Lucene_Indexer {
*/ */
protected $indexname; protected $indexname;
/**
* @var string $index lucene index
* @access protected
*/
protected $index;
public function __construct($index) {
$this->index = $index;
}
static function open($conf) { /* {{{ */ static function open($conf) { /* {{{ */
try { try {
$index = Zend_Search_Lucene::open($conf['indexdir']); $index = Zend_Search_Lucene::open($conf['indexdir']);
return($index); if($index)
return new self($index);
else
return null;
} catch (Exception $e) { } catch (Exception $e) {
return null; return null;
} }
@ -41,7 +54,10 @@ class SeedDMS_Lucene_Indexer {
static function create($conf) { /* {{{ */ static function create($conf) { /* {{{ */
try { try {
$index = Zend_Search_Lucene::create($conf['indexdir']); $index = Zend_Search_Lucene::create($conf['indexdir']);
return($index); if($index)
return new self($index);
else
return null;
} catch (Exception $e) { } catch (Exception $e) {
return null; return null;
} }
@ -51,7 +67,7 @@ class SeedDMS_Lucene_Indexer {
* Do some initialization * Do some initialization
* *
*/ */
static function init($stopWordsFile='') { /* {{{ */ public function init($stopWordsFile='') { /* {{{ */
$analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive(); $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive();
if($stopWordsFile && file_exists($stopWordsFile)) { if($stopWordsFile && file_exists($stopWordsFile)) {
$stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords(); $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords();
@ -62,6 +78,131 @@ class SeedDMS_Lucene_Indexer {
Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer); Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);
} /* }}} */ } /* }}} */
/**
* Add document to index
*
* @param object $doc indexed document of class
* SeedDMS_Lucene_IndexedDocument
* @return boolean false in case of an error, otherwise true
*/
function addDocument($doc) { /* {{{ */
if(!$this->index)
return false;
return $this->index->addDocument($doc);
} /* }}} */
/**
* Remove document from index
*
* @param object $id internal id of document
* @return boolean false in case of an error, otherwise true
*/
public function delete($id) { /* {{{ */
if(!$this->index)
return false;
return $this->index->delete($id);
} /* }}} */
/**
* Check if document was deleted
*
* @param object $id internal id of document
* @return boolean true if document was deleted
*/
public function isDeleted($id) { /* {{{ */
if(!$this->index)
return false;
return $this->index->isDeleted($id);
} /* }}} */
/**
* Search in index
*
* @param string $query
* @return array result
*/
public function find($query) { /* {{{ */
if(!$this->index)
return false;
return $this->index->find($query);
} /* }}} */
/**
* Get a single document from index
*
* @param string $id id of document
* @return boolean false in case of an error, otherwise true
*/
public function findById($id) { /* {{{ */
if(!$this->index)
return false;
return $this->index->findById($id);
} /* }}} */
/**
* Get a single document from index
*
* @param integer $id id of index record
* @return boolean false in case of an error, otherwise true
*/
public function getDocument($id, $content=true) { /* {{{ */
if(!$this->index)
return false;
return $this->index->getDocument($id);
} /* }}} */
/**
* Return list of terms in index
*
* @return array list of Zend_Lucene_Term
*/
public function terms($prefix='', $col='') { /* {{{ */
if(!$this->index)
return false;
return $this->index->terms();
} /* }}} */
/**
* Return number of documents in index
*
* @return interger number of documents
*/
public function count() { /* {{{ */
if(!$this->index)
return false;
return $this->index->count();
} /* }}} */
/**
* Commit changes
*
* This function does nothing!
*/
function commit() { /* {{{ */
if(!$this->index)
return false;
return $this->index->commit();
} /* }}} */
/**
* Optimize index
*
* This function does nothing!
*/
function optimize() { /* {{{ */
if(!$this->index)
return false;
return $this->index->optimize();
} /* }}} */
} }
?> ?>

View File

@ -77,10 +77,10 @@ class SeedDMS_Lucene_Search {
$querystr = substr($term, -1) != '*' ? $term.'*' : $term; $querystr = substr($term, -1) != '*' ? $term.'*' : $term;
} }
if(!empty($fields['owner'])) { if(!empty($fields['owner'])) {
if(is_string($owner)) { if(is_string($fields['owner'])) {
if($querystr) if($querystr)
$querystr .= ' && '; $querystr .= ' && ';
$querystr .= 'owner:'.$owner; $querystr .= 'owner:'.$fields['owner'];
} elseif(is_array($fields['owner'])) { } elseif(is_array($fields['owner'])) {
if($querystr) if($querystr)
$querystr .= ' && '; $querystr .= ' && ';
@ -89,6 +89,13 @@ class SeedDMS_Lucene_Search {
$querystr .= '")'; $querystr .= '")';
} }
} }
if(!empty($fields['record_type'])) {
if($querystr)
$querystr .= ' && ';
$querystr .= '(record_type:';
$querystr .= implode(' || record_type:', $fields['record_type']);
$querystr .= ')';
}
if(!empty($fields['category'])) { if(!empty($fields['category'])) {
if($querystr) if($querystr)
$querystr .= ' && '; $querystr .= ' && ';
@ -137,7 +144,7 @@ class SeedDMS_Lucene_Search {
$recs = array(); $recs = array();
$c = 0; $c = 0;
foreach($hits as $hit) { foreach($hits as $hit) {
if($c >= $limit['offset'] && ($c-$limit['offset'] < $limit)) if($c >= $limit['offset'] && ($c-$limit['offset'] < $limit['limit']))
$recs[] = array('id'=>$hit->id, 'document_id'=>$hit->document_id); $recs[] = array('id'=>$hit->id, 'document_id'=>$hit->document_id);
$c++; $c++;
} }

View File

@ -11,11 +11,11 @@
<email>uwe@steinmann.cx</email> <email>uwe@steinmann.cx</email>
<active>yes</active> <active>yes</active>
</lead> </lead>
<date>2021-05-10</date> <date>2023-01-09</date>
<time>08:55:43</time> <time>08:55:43</time>
<version> <version>
<release>1.1.17</release> <release>1.1.18</release>
<api>1.1.17</api> <api>1.1.18</api>
</version> </version>
<stability> <stability>
<release>stable</release> <release>stable</release>
@ -23,7 +23,8 @@
</stability> </stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license> <license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes> <notes>
- close pipes in execWithTimeout(), also return exit code of command - IndexedDocument() accepts a callable for conversion to text
- SeedDMS_Lucene_Search::open and create return itself but Zend_Search_Lucene
</notes> </notes>
<contents> <contents>
<dir baseinstalldir="SeedDMS" name="/"> <dir baseinstalldir="SeedDMS" name="/">
@ -368,5 +369,21 @@ Index users with at least read access on the document
- add indexing of folders - add indexing of folders
</notes> </notes>
</release> </release>
<release>
<date>2021-05-10</date>
<time>08:55:43</time>
<version>
<release>1.1.17</release>
<api>1.1.17</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- close pipes in execWithTimeout(), also return exit code of command
</notes>
</release>
</changelog> </changelog>
</package> </package>

View File

@ -31,4 +31,9 @@ require_once('Preview/Previewer.php');
*/ */
require_once('Preview/PdfPreviewer.php'); require_once('Preview/PdfPreviewer.php');
/**
* @uses Preview/PdfPreviewer.php
*/
require_once('Preview/TxtPreviewer.php');
?> ?>

View File

@ -136,6 +136,15 @@ class SeedDMS_Preview_Base {
} }
} /* }}} */ } /* }}} */
/**
* Get preview dir
*
* @return string name of preview directory on disc
*/
public function getPreviewDir() { /* {{{ */
return $this->previewDir;
} /* }}} */
/** /**
* Set a list of converters * Set a list of converters
* *

View File

@ -25,41 +25,30 @@
class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base { class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */ function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */
parent::__construct($previewDir, $timeout, $xsendfile); parent::__construct($previewDir.DIRECTORY_SEPARATOR.'pdf', $timeout, $xsendfile);
$this->converters = array( $this->converters = array(
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/vnd.oasis.opendocument.text' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'text/rtf' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/msword' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/vnd.ms-excel' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'text/plain' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/postscript' => "ps2pdf '%f' - > '%o'",
'image/jpeg' => "convert '%f' pdf:- > '%o'",
'image/png' => "convert '%f' pdf:- > '%o'",
'image/gif' => "convert '%f' pdf:- > '%o'",
'video/mp4' => "convert '%f[1-20]' pdf:- > '%o'",
); );
} /* }}} */ } /* }}} */
/** /**
* Return the physical filename of the preview image on disk * Return the physical filename of the preview image on disc
* including the path
* *
* @param object $object document content or document file * @param object $object document content or document file
* @return string file name of preview image * @return string file name of preview image
*/ */
protected function getFileName($object) { /* {{{ */ public function getFileName($object) { /* {{{ */
if(!$object) if(!$object)
return false; return false;
$document = $object->getDocument(); $document = $object->getDocument();
$dms = $document->_dms; $dms = $document->_dms;
$dir = $this->previewDir.'/'.$document->getDir(); $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
switch(get_class($object)) { switch(get_class($object)) {
case $dms->getClassname('documentcontent'): case $dms->getClassname('documentcontent'):
$target = $dir.'p'.$object->getVersion(); $target = $dir.'p'.$object->getVersion();
break; break;
case "SeedDMS_Core_DocumentFile": case $dms->getClassname('documentfile'):
$target = $dir.'f'.$object->getID(); $target = $dir.'f'.$object->getID();
break; break;
default: default:
@ -101,8 +90,8 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
if(!$this->previewDir) if(!$this->previewDir)
return false; return false;
if(!is_dir($this->previewDir.'/'.$dir)) { if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.'/'.$dir)) { if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
return false; return false;
} }
} }
@ -128,9 +117,11 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
} elseif(isset($this->converters['*'])) { } elseif(isset($this->converters['*'])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.pdf', $mimetype), $this->converters['*']); $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.pdf', $mimetype), $this->converters['*']);
} }
if($cmd) { if($cmd) {
try { try {
self::execWithTimeout($cmd, $this->timeout); self::execWithTimeout($cmd, $this->timeout);
$new = true;
} catch(Exception $e) { } catch(Exception $e) {
$this->lastpreviewfile = ''; $this->lastpreviewfile = '';
return false; return false;
@ -139,6 +130,7 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
} }
return true; return true;
} }
$new = false;
return true; return true;
} /* }}} */ } /* }}} */
@ -305,7 +297,7 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
if(!$this->previewDir) if(!$this->previewDir)
return false; return false;
$dir = $this->previewDir.'/'.$document->getDir(); $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
if(file_exists($dir) && is_dir($dir)) { if(file_exists($dir) && is_dir($dir)) {
return SeedDMS_Preview_Previewer::recurseRmdir($dir); return SeedDMS_Preview_Previewer::recurseRmdir($dir);
} else { } else {

View File

@ -29,41 +29,48 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
*/ */
protected $width; protected $width;
/**
* Create instance of image previewer
*
* @param string $previewDir path of base directory where all images are
* stored. This directory will have a subdirectory derived from the object id.
* @param integer $width default width of an image
* @param integer $timeout timeout for shell commands to create a preview image
* @param boolean $xsendfile if set to true the apache module xsendfile will
* be used.
*/
function __construct($previewDir, $width=40, $timeout=5, $xsendfile=true) { /* {{{ */ function __construct($previewDir, $width=40, $timeout=5, $xsendfile=true) { /* {{{ */
parent::__construct($previewDir, $timeout, $xsendfile); parent::__construct($previewDir.DIRECTORY_SEPARATOR.'png', $timeout, $xsendfile);
$this->converters = array( $this->converters = array(
'image/png' => "convert -resize %wx '%f' '%o'",
'image/gif' => "convert -resize %wx '%f' '%o'",
'image/jpg' => "convert -resize %wx '%f' '%o'",
'image/jpeg' => "convert -resize %wx '%f' '%o'",
'image/svg+xml' => "convert -resize %wx '%f' '%o'",
'text/plain' => "convert -resize %wx '%f' '%o'",
'application/pdf' => "convert -density 100 -resize %wx '%f[0]' '%o'",
'application/postscript' => "convert -density 100 -resize %wx '%f[0]' '%o'",
'application/x-compressed-tar' => "tar tzvf '%f' | convert -density 100 -resize %wx text:-[0] '%o'",
); );
$this->width = intval($width); $this->width = intval($width);
} /* }}} */ } /* }}} */
/** /**
* Return the physical filename of the preview image on disk * Return the physical filename of the preview image on disc
* including the path
* *
* @param object $object document content or document file * @param object $object document content or document file
* @param integer $width width of preview image * @param integer $width width of preview image
* @return string file name of preview image * @return string file name of preview image
*/ */
public function getFileName($object, $width) { /* {{{ */ public function getFileName($object, $width=0) { /* {{{ */
if(!$object) if(!$object)
return false; return false;
if($width == 0)
$width = $this->width;
else
$width = intval($width);
$document = $object->getDocument(); $document = $object->getDocument();
$dms = $document->_dms; $dms = $document->_dms;
$dir = $this->previewDir.'/'.$document->getDir(); $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
switch(get_class($object)) { switch(get_class($object)) {
case $dms->getClassname('documentcontent'): case $dms->getClassname('documentcontent'):
$target = $dir.'p'.$object->getVersion().'-'.$width; $target = $dir.'p'.$object->getVersion().'-'.$width;
break; break;
case "SeedDMS_Core_DocumentFile": case $dms->getClassname('documentfile'):
$target = $dir.'f'.$object->getID().'-'.$width; $target = $dir.'f'.$object->getID().'-'.$width;
break; break;
default: default:
@ -98,6 +105,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
* @param string $mimetype MimeType of input file * @param string $mimetype MimeType of input file
* @param integer $width width of generated preview image * @param integer $width width of generated preview image
* @param string $target optional name of preview image (without extension) * @param string $target optional name of preview image (without extension)
* @param boolean $new will be set to true if the preview images was created
* @return boolean true on success, false on failure * @return boolean true on success, false on failure
*/ */
public function createRawPreview($infile, $dir, $mimetype, $width=0, $target='', &$new=false) { /* {{{ */ public function createRawPreview($infile, $dir, $mimetype, $width=0, $target='', &$new=false) { /* {{{ */
@ -110,8 +118,8 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
$width = intval($width); $width = intval($width);
if(!$this->previewDir) if(!$this->previewDir)
return false; return false;
if(!is_dir($this->previewDir.'/'.$dir)) { if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.'/'.$dir)) { if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
return false; return false;
} }
} }
@ -166,6 +174,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
* @param object $object instance of SeedDMS_Core_DocumentContent * @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile * or SeedDMS_Core_DocumentFile
* @param integer $width desired width of preview image * @param integer $width desired width of preview image
* @param boolean $new will be set to true if the preview images was created
* @return boolean true on success, false on failure * @return boolean true on success, false on failure
*/ */
public function createPreview($object, $width=0, &$new=false) { /* {{{ */ public function createPreview($object, $width=0, &$new=false) { /* {{{ */
@ -350,7 +359,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
if(!$this->previewDir) if(!$this->previewDir)
return false; return false;
$dir = $this->previewDir.'/'.$document->getDir(); $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
if(file_exists($dir) && is_dir($dir)) { if(file_exists($dir) && is_dir($dir)) {
return SeedDMS_Preview_Previewer::recurseRmdir($dir); return SeedDMS_Preview_Previewer::recurseRmdir($dir);
} else { } else {

View File

@ -0,0 +1,306 @@
<?php
/**
* Implementation of text preview documents
*
* @category DMS
* @package SeedDMS_Preview
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010, Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class for managing creation of text preview for documents.
*
* @category DMS
* @package SeedDMS_Preview
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2011, Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Preview_TxtPreviewer extends SeedDMS_Preview_Base {
function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */
parent::__construct($previewDir.DIRECTORY_SEPARATOR.'txt', $timeout, $xsendfile);
$this->converters = array(
);
} /* }}} */
/**
* Return the physical filename of the preview image on disc
* including the path
*
* @param object $object document content or document file
* @return string file name of preview image
*/
public function getFileName($object) { /* {{{ */
if(!$object)
return false;
$document = $object->getDocument();
$dms = $document->_dms;
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
switch(get_class($object)) {
case $dms->getClassname('documentcontent'):
$target = $dir.'t'.$object->getVersion();
break;
default:
return false;
}
return $target;
} /* }}} */
/**
* Check if converter for a given mimetype is set
*
* @param string $mimetype from mimetype
*
* @return boolean true if converter exists, otherwise false
*/
function hasConverter($from, $to='') { /* {{{ */
return parent::hasConverter($from, 'text/plain');
} /* }}} */
/**
* Create a text preview for a given file
*
* This method creates a preview in text format for a regular file
* in the file system and stores the result in the directory $dir relative
* to the configured preview directory. The filename of the resulting preview
* image is either $target.text (if set) or md5($infile).text.
* The $mimetype is used to select the propper conversion programm.
* An already existing text preview is replaced.
*
* @param string $infile name of input file including full path
* @param string $dir directory relative to $this->previewDir
* @param string $mimetype MimeType of input file
* @param string $target optional name of preview image (without extension)
* @return boolean true on success, false on failure
*/
public function createRawPreview($infile, $dir, $mimetype, $target='') { /* {{{ */
if(!self::hasConverter($mimetype))
return true;
if(!$this->previewDir)
return false;
if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
return false;
}
}
if(!file_exists($infile))
return false;
if(!$target)
$target = $this->previewDir.$dir.md5($infile);
$this->lastpreviewfile = $target.'.txt';
if($target != '' && (!file_exists($target.'.txt') || filectime($target.'.txt') < filectime($infile))) {
if($this->conversionmgr) {
if(!$this->conversionmgr->convert($infile, $mimetype, 'text/plain', $target.'.txt')) {
$this->lastpreviewfile = '';
return false;
}
$new = true;
} else {
$cmd = '';
$mimeparts = explode('/', $mimetype, 2);
if(isset($this->converters[$mimetype])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters[$mimetype]);
} elseif(isset($this->converters[$mimeparts[0].'/*'])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters[$mimeparts[0].'/*']);
} elseif(isset($this->converters['*'])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters['*']);
}
if($cmd) {
try {
self::execWithTimeout($cmd, $this->timeout);
$new = true;
} catch(Exception $e) {
$this->lastpreviewfile = '';
return false;
}
}
}
return true;
}
$new = false;
return true;
} /* }}} */
/**
* Create preview image
*
* This function creates a preview image for the given document
* content or document file. It internally uses
* {@link SeedDMS_Preview::createRawPreview()}. The filename of the
* preview image is created by {@link SeedDMS_Preview_Previewer::getFileName()}
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean true on success, false on failure
*/
public function createPreview($object) { /* {{{ */
if(!$object)
return false;
$document = $object->getDocument();
$file = $document->_dms->contentDir.$object->getPath();
$target = $this->getFileName($object);
return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $target);
} /* }}} */
/**
* Check if a preview image already exists.
*
* This function is a companion to {@link SeedDMS_Preview_Previewer::createRawPreview()}.
*
* @param string $infile name of input file including full path
* @param string $dir directory relative to $this->previewDir
* @return boolean true if preview exists, otherwise false
*/
public function hasRawPreview($infile, $dir, $target='') { /* {{{ */
if(!$this->previewDir)
return false;
if(!$target)
$target = $this->previewDir.$dir.md5($infile);
if($target !== false && file_exists($target.'.txt') && filectime($target.'.txt') >= filectime($infile)) {
return true;
}
return false;
} /* }}} */
/**
* Check if a preview txt already exists.
*
* This function is a companion to {@link SeedDMS_Preview_Previewer::createPreview()}.
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean true if preview exists, otherwise false
*/
public function hasPreview($object) { /* {{{ */
if(!$object)
return false;
if(!$this->previewDir)
return false;
$target = $this->getFileName($object);
if($target !== false && file_exists($target.'.txt') && filectime($target.'.txt') >= $object->getDate()) {
return true;
}
return false;
} /* }}} */
/**
* Return a preview image.
*
* This function returns the content of a preview image if it exists..
*
* @param string $infile name of input file including full path
* @param string $dir directory relative to $this->previewDir
* @return boolean/string image content if preview exists, otherwise false
*/
public function getRawPreview($infile, $dir, $target='') { /* {{{ */
if(!$this->previewDir)
return false;
if(!$target)
$target = $this->previewDir.$dir.md5($infile);
if($target && file_exists($target.'.txt')) {
$this->sendFile($target.'.txt');
}
} /* }}} */
/**
* Return a preview image.
*
* This function returns the content of a preview image if it exists..
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean/string image content if preview exists, otherwise false
*/
public function getPreview($object) { /* {{{ */
if(!$this->previewDir)
return false;
$target = $this->getFileName($object);
if($target && file_exists($target.'.txt')) {
$this->sendFile($target.'.txt');
}
} /* }}} */
/**
* Return file size preview image.
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean/integer size of preview image or false if image
* does not exist
*/
public function getFilesize($object) { /* {{{ */
$target = $this->getFileName($object);
if($target && file_exists($target.'.txt')) {
return(filesize($target.'.txt'));
} else {
return false;
}
} /* }}} */
/**
* Delete preview image.
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean true if deletion succeded or false if file does not exist
*/
public function deletePreview($object) { /* {{{ */
if(!$this->previewDir)
return false;
$target = $this->getFileName($object);
if($target && file_exists($target.'.txt')) {
return(unlink($target.'.txt'));
} else {
return false;
}
} /* }}} */
static function recurseRmdir($dir) {
$files = array_diff(scandir($dir), array('.','..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? SeedDMS_Preview_Previewer::recurseRmdir("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
/**
* Delete all preview text belonging to a document
*
* This function removes the preview text of all versions and
* files of a document including the directory. It actually just
* removes the directory for the document in the cache.
*
* @param object $document instance of SeedDMS_Core_Document
* @return boolean true if deletion succeded or false if file does not exist
*/
public function deleteDocumentPreviews($document) { /* {{{ */
if(!$this->previewDir)
return false;
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
if(file_exists($dir) && is_dir($dir)) {
return SeedDMS_Preview_Previewer::recurseRmdir($dir);
} else {
return false;
}
} /* }}} */
}
?>

View File

@ -11,11 +11,11 @@
<email>uwe@steinmann.cx</email> <email>uwe@steinmann.cx</email>
<active>yes</active> <active>yes</active>
</lead> </lead>
<date>2021-10-16</date> <date>2023-01-09</date>
<time>09:49:39</time> <time>09:49:39</time>
<version> <version>
<release>1.4.0</release> <release>1.5.0</release>
<api>1.4.0</api> <api>1.5.0</api>
</version> </version>
<stability> <stability>
<release>stable</release> <release>stable</release>
@ -23,8 +23,7 @@
</stability> </stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license> <license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes> <notes>
- use new conversion service if available - add previewer which creates txt
- createRawPreview() checks early if a converter exists
</notes> </notes>
<contents> <contents>
<dir baseinstalldir="SeedDMS" name="/"> <dir baseinstalldir="SeedDMS" name="/">
@ -38,6 +37,9 @@
<file name="PdfPreviewer.php" role="php"> <file name="PdfPreviewer.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" /> <tasks:replace from="@package_version@" to="version" type="package-info" />
</file> </file>
<file name="TxtPreviewer.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
</dir> <!-- /Lucene --> </dir> <!-- /Lucene -->
<dir name="tests"> <dir name="tests">
</dir> <!-- /tests --> </dir> <!-- /tests -->
@ -49,7 +51,7 @@
<dependencies> <dependencies>
<required> <required>
<php> <php>
<min>4.3.0</min> <min>7.4.0</min>
</php> </php>
<pearinstaller> <pearinstaller>
<min>1.5.4</min> <min>1.5.4</min>
@ -488,5 +490,22 @@ update package description
preview image was actually created preview image was actually created
</notes> </notes>
</release> </release>
<release>
<date>2021-10-16</date>
<time>09:49:39</time>
<version>
<release>1.4.0</release>
<api>1.4.0</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- use new conversion service if available
- createRawPreview() checks early if a converter exists
</notes>
<release>
</changelog> </changelog>
</package> </package>

View File

@ -111,7 +111,7 @@ class SeedDMS_SQLiteFTS_Document {
* @return string * @return string
*/ */
public function getFieldValue($fieldName) { public function getFieldValue($fieldName) {
return $this->getField($fieldName)->value; return $this->getField($fieldName)->value;
} }
} }
?> ?>

View File

@ -151,8 +151,9 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
if($version) { if($version) {
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('mimetype', $version->getMimeType())); $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('mimetype', $version->getMimeType()));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $version->getOriginalFileName())); $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $version->getOriginalFileName()));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $version->getDate(), 'unindexed'));
if(!$nocontent) if(!$nocontent)
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $version->getDate(), 'unindexed')); $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', time(), 'unindexed'));
if($attributes = $version->getAttributes()) { if($attributes = $version->getAttributes()) {
foreach($attributes as $attribute) { foreach($attributes as $attribute) {
$attrdef = $attribute->getAttributeDefinition(); $attrdef = $attribute->getAttributeDefinition();
@ -168,7 +169,7 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
foreach($categories as $cat) { foreach($categories as $cat) {
$names[] = $cat->getName(); $names[] = $cat->getName();
} }
$this->addField(SeedDMS_SQLiteFTS_Field::Text('category', implode(' ', $names))); $this->addField(SeedDMS_SQLiteFTS_Field::Text('category', implode('#', $names)));
} }
if($keywords = $document->getKeywords()) { if($keywords = $document->getKeywords()) {
$this->addField(SeedDMS_SQLiteFTS_Field::Text('keywords', $keywords)); $this->addField(SeedDMS_SQLiteFTS_Field::Text('keywords', $keywords));
@ -182,7 +183,15 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
if(file_exists($path)) { if(file_exists($path)) {
$mimetype = $version->getMimeType(); $mimetype = $version->getMimeType();
$this->mimetype = $mimetype; $this->mimetype = $mimetype;
if(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) { if(is_callable($convcmd)) {
$result = $convcmd($document);
if($result['content']) {
self::setContent($result['content']);
} elseif($result['content'] === false) {
$this->errormsg = $result['errormsg'];
}
$this->cmd = $result['cmd'];
} elseif(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) {
if($service = $convcmd->getService($mimetype, 'text/plain')) { if($service = $convcmd->getService($mimetype, 'text/plain')) {
$content = $convcmd->convert($path, $mimetype, 'text/plain'); $content = $convcmd->convert($path, $mimetype, 'text/plain');
if($content) { if($content) {
@ -226,6 +235,7 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('document_id', 'F'.$document->getID())); $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('document_id', 'F'.$document->getID()));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('record_type', 'folder')); $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('record_type', 'folder'));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $document->getDate(), 'unindexed')); $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $document->getDate(), 'unindexed'));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', time(), 'unindexed'));
} }
} /* }}} */ } /* }}} */

View File

@ -25,18 +25,48 @@
class SeedDMS_SQLiteFTS_Indexer { class SeedDMS_SQLiteFTS_Indexer {
/** /**
* @var string $ftstype * @var string $_ftstype
* @access protected * @access protected
*/ */
protected $_ftstype; protected $_ftstype;
/** /**
* @var object $index sqlite index * @var object $_conn sqlite index
* @access protected * @access protected
*/ */
protected $_conn; protected $_conn;
/**
* @var array $_stop_words array of stop words
* @access protected
*/
protected $_stop_words;
const ftstype = 'fts5'; const ftstype = 'fts5';
/**
* Remove stopwords from string
*/
protected function strip_stopwords($str = "") { /* {{{ */
// 1.) break string into words
// [^-\w\'] matches characters, that are not [0-9a-zA-Z_-']
// if input is unicode/utf-8, the u flag is needed: /pattern/u
$words = preg_split('/[^-\w\']+/u', $str, -1, PREG_SPLIT_NO_EMPTY);
// 2.) if we have at least 2 words, remove stopwords
if(!empty($words)) {
$stopwords = $this->_stop_words;
$words = array_filter($words, function ($w) use (&$stopwords) {
return ((mb_strlen($w, 'utf-8') > 2) && !isset($stopwords[mb_strtolower($w, "utf-8")]));
});
}
// check if not too much was removed such as "the the" would return empty
if(!empty($words))
return implode(" ", $words);
return $str;
} /* }}} */
/** /**
* Constructor * Constructor
* *
@ -48,6 +78,7 @@ class SeedDMS_SQLiteFTS_Indexer {
$this->_rawid = 'rowid'; $this->_rawid = 'rowid';
else else
$this->_rawid = 'docid'; $this->_rawid = 'docid';
$this->_stop_words = [];
} /* }}} */ } /* }}} */
/** /**
@ -59,7 +90,7 @@ class SeedDMS_SQLiteFTS_Indexer {
if(file_exists($conf['indexdir'].'/index.db')) { if(file_exists($conf['indexdir'].'/index.db')) {
return new SeedDMS_SQLiteFTS_Indexer($conf['indexdir']); return new SeedDMS_SQLiteFTS_Indexer($conf['indexdir']);
} else } else
return self::create($conf); return static::create($conf);
} /* }}} */ } /* }}} */
/** /**
@ -77,9 +108,9 @@ class SeedDMS_SQLiteFTS_Indexer {
$version = SQLite3::version(); $version = SQLite3::version();
if(self::ftstype == 'fts4') { if(self::ftstype == 'fts4') {
if($version['versionNumber'] >= 3008000) if($version['versionNumber'] >= 3008000)
$sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, notindexed=created, matchinfo=fts3)'; $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, indexed, users, status, path, notindexed=created, notindexed=indexed, matchinfo=fts3)';
else else
$sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, matchinfo=fts3)'; $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, indexed, users, status, path, matchinfo=fts3)';
$res = $index->_conn->exec($sql); $res = $index->_conn->exec($sql);
if($res === false) { if($res === false) {
return null; return null;
@ -90,7 +121,7 @@ class SeedDMS_SQLiteFTS_Indexer {
return null; return null;
} }
} elseif(self::ftstype == 'fts5') { } elseif(self::ftstype == 'fts5') {
$sql = 'CREATE VIRTUAL TABLE docs USING fts5(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, users, status, path)'; $sql = 'CREATE VIRTUAL TABLE docs USING fts5(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, indexed unindexed, users, status, path)';
$res = $index->_conn->exec($sql); $res = $index->_conn->exec($sql);
if($res === false) { if($res === false) {
return null; return null;
@ -109,7 +140,9 @@ class SeedDMS_SQLiteFTS_Indexer {
* Do some initialization * Do some initialization
* *
*/ */
static function init($stopWordsFile='') { /* {{{ */ public function init($stopWordsFile='') { /* {{{ */
if($stopWordsFile)
$this->_stop_words = array_flip(preg_split("/[\s,]+/", file_get_contents($stopWordsFile)));
} /* }}} */ } /* }}} */
/** /**
@ -123,7 +156,7 @@ class SeedDMS_SQLiteFTS_Indexer {
if(!$this->_conn) if(!$this->_conn)
return false; return false;
foreach(array('comment', 'keywords', 'category', 'content', 'mimetype', 'origfilename', 'status', 'created') as $kk) { foreach(array('comment', 'keywords', 'category', 'content', 'mimetype', 'origfilename', 'status', 'created', 'indexed') as $kk) {
try { try {
${$kk} = $doc->getFieldValue($kk); ${$kk} = $doc->getFieldValue($kk);
} catch (Exception $e) { } catch (Exception $e) {
@ -135,7 +168,10 @@ class SeedDMS_SQLiteFTS_Indexer {
if($res === false) { if($res === false) {
return false; return false;
} }
$sql = "INSERT INTO docs (documentid, record_type, title, comment, keywords, category, owner, content, mimetype, origfilename, created, users, status, path) VALUES (".$this->_conn->quote($doc->getFieldValue('document_id')).", ".$this->_conn->quote($doc->getFieldValue('record_type')).", ".$this->_conn->quote($doc->getFieldValue('title')).", ".$this->_conn->quote($comment).", ".$this->_conn->quote($keywords).", ".$this->_conn->quote($category).", ".$this->_conn->quote($doc->getFieldValue('owner')).", ".$this->_conn->quote($content).", ".$this->_conn->quote($mimetype).", ".$this->_conn->quote($origfilename).", ".(int)$created.", ".$this->_conn->quote($doc->getFieldValue('users')).", ".$this->_conn->quote($status).", ".$this->_conn->quote($doc->getFieldValue('path'))/*time()*/.")"; if($this->_stop_words)
$content = $this->strip_stopwords($content);
$sql = "INSERT INTO docs (documentid, record_type, title, comment, keywords, category, owner, content, mimetype, origfilename, created, indexed, users, status, path) VALUES (".$this->_conn->quote($doc->getFieldValue('document_id')).", ".$this->_conn->quote($doc->getFieldValue('record_type')).", ".$this->_conn->quote($doc->getFieldValue('title')).", ".$this->_conn->quote($comment).", ".$this->_conn->quote($keywords).", ".$this->_conn->quote($category).", ".$this->_conn->quote($doc->getFieldValue('owner')).", ".$this->_conn->quote($content).", ".$this->_conn->quote($mimetype).", ".$this->_conn->quote($origfilename).", ".(int)$created.", ".(int)$indexed.", ".$this->_conn->quote($doc->getFieldValue('users')).", ".$this->_conn->quote($status).", ".$this->_conn->quote($doc->getFieldValue('path'))/*time()*/.")";
$res = $this->_conn->exec($sql); $res = $this->_conn->exec($sql);
if($res === false) { if($res === false) {
return false; return false;
@ -147,8 +183,7 @@ class SeedDMS_SQLiteFTS_Indexer {
/** /**
* Remove document from index * Remove document from index
* *
* @param object $doc indexed document of class * @param object $id internal id of document
* SeedDMS_SQLiteFTS_IndexedDocument
* @return boolean false in case of an error, otherwise true * @return boolean false in case of an error, otherwise true
*/ */
public function delete($id) { /* {{{ */ public function delete($id) { /* {{{ */
@ -179,15 +214,22 @@ class SeedDMS_SQLiteFTS_Indexer {
* @return boolean false in case of an error, otherwise array with elements * @return boolean false in case of an error, otherwise array with elements
* 'count', 'hits', 'facets'. 'hits' is an array of SeedDMS_SQLiteFTS_QueryHit * 'count', 'hits', 'facets'. 'hits' is an array of SeedDMS_SQLiteFTS_QueryHit
*/ */
public function find($query, $limit=array()) { /* {{{ */ public function find($query, $filter='', $limit=array(), $order=array()) { /* {{{ */
if(!$this->_conn) if(!$this->_conn)
return false; return false;
/* First count some records for facets */ /* First count some records for facets */
foreach(array('owner', 'mimetype', 'category') as $facetname) { foreach(array('owner', 'mimetype', 'category', 'status') as $facetname) {
$sql = "SELECT `".$facetname."`, count(*) AS `c` FROM `docs`"; $sql = "SELECT `".$facetname."`, count(*) AS `c` FROM `docs`";
if($query) if($query) {
$sql .= " WHERE docs MATCH ".$this->_conn->quote($query); $sql .= " WHERE docs MATCH ".$this->_conn->quote($query);
}
if($filter) {
if($query)
$sql .= " AND ".$filter;
else
$sql .= " WHERE ".$filter;
}
$res = $this->_conn->query($sql." GROUP BY `".$facetname."`"); $res = $this->_conn->query($sql." GROUP BY `".$facetname."`");
if(!$res) if(!$res)
throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"$facetname\" failed."); throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"$facetname\" failed.");
@ -196,7 +238,7 @@ class SeedDMS_SQLiteFTS_Indexer {
foreach($res as $row) { foreach($res as $row) {
if($row[$facetname] && $row['c']) { if($row[$facetname] && $row['c']) {
if($facetname == 'category') { if($facetname == 'category') {
$tmp = explode(' ', $row[$facetname]); $tmp = explode('#', $row[$facetname]);
if(count($tmp) > 1) { if(count($tmp) > 1) {
foreach($tmp as $t) { foreach($tmp as $t) {
if(!isset($facets[$facetname][$t])) if(!isset($facets[$facetname][$t]))
@ -210,6 +252,8 @@ class SeedDMS_SQLiteFTS_Indexer {
else else
$facets[$facetname][$row[$facetname]] += $row['c']; $facets[$facetname][$row[$facetname]] += $row['c'];
} }
} elseif($facetname == 'status') {
$facets[$facetname][($row[$facetname]-10).''] = $row['c'];
} else } else
$facets[$facetname][$row[$facetname]] = $row['c']; $facets[$facetname][$row[$facetname]] = $row['c'];
} }
@ -219,6 +263,12 @@ class SeedDMS_SQLiteFTS_Indexer {
$sql = "SELECT `record_type`, count(*) AS `c` FROM `docs`"; $sql = "SELECT `record_type`, count(*) AS `c` FROM `docs`";
if($query) if($query)
$sql .= " WHERE docs MATCH ".$this->_conn->quote($query); $sql .= " WHERE docs MATCH ".$this->_conn->quote($query);
if($filter) {
if($query)
$sql .= " AND ".$filter;
else
$sql .= " WHERE ".$filter;
}
$res = $this->_conn->query($sql." GROUP BY `record_type`"); $res = $this->_conn->query($sql." GROUP BY `record_type`");
if(!$res) if(!$res)
throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"record_type\" failed."); throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"record_type\" failed.");
@ -232,10 +282,32 @@ class SeedDMS_SQLiteFTS_Indexer {
$sql = "SELECT ".$this->_rawid.", documentid FROM docs"; $sql = "SELECT ".$this->_rawid.", documentid FROM docs";
if($query) if($query)
$sql .= " WHERE docs MATCH ".$this->_conn->quote($query); $sql .= " WHERE docs MATCH ".$this->_conn->quote($query);
if($this->_ftstype == 'fts5') if($filter) {
if($query)
$sql .= " AND ".$filter;
else
$sql .= " WHERE ".$filter;
}
if($this->_ftstype == 'fts5') {
//$sql .= " ORDER BY rank"; //$sql .= " ORDER BY rank";
// boost documentid, title and comment // boost documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, users, status, path
$sql .= " ORDER BY bm25(docs, 10.0, 10.0, 10.0)"; if(!empty($order['by'])) {
switch($order['by']) {
case "title":
$sql .= " ORDER BY title";
break;
case "created":
$sql .= " ORDER BY created";
break;
default:
$sql .= " ORDER BY bm25(docs, 10.0, 0.0, 10.0, 5.0, 5.0, 10.0)";
}
if(!empty($order['dir'])) {
if($order['dir'] == 'desc')
$sql .= " DESC";
}
}
}
if(!empty($limit['limit'])) if(!empty($limit['limit']))
$sql .= " LIMIT ".(int) $limit['limit']; $sql .= " LIMIT ".(int) $limit['limit'];
if(!empty($limit['offset'])) if(!empty($limit['offset']))
@ -289,7 +361,7 @@ class SeedDMS_SQLiteFTS_Indexer {
if(!$this->_conn) if(!$this->_conn)
return false; return false;
$sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, users, status, path".($content ? ", content" : "")." FROM docs WHERE ".$this->_rawid."='".$id."'"; $sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, indexed, users, status, path".($content ? ", content" : "")." FROM docs WHERE ".$this->_rawid."='".$id."'";
$res = $this->_conn->query($sql); $res = $this->_conn->query($sql);
$doc = false; $doc = false;
if($res) { if($res) {
@ -306,9 +378,10 @@ class SeedDMS_SQLiteFTS_Indexer {
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $rec['origfilename'])); $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $rec['origfilename']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Text('owner', $rec['owner'])); $doc->addField(SeedDMS_SQLiteFTS_Field::Text('owner', $rec['owner']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $rec['created'])); $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $rec['created']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', $rec['indexed']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Text('users', $rec['users'])); $doc->addField(SeedDMS_SQLiteFTS_Field::Text('users', $rec['users']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('status', $rec['status'])); $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('status', $rec['status']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('path', $rec['path'])); $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('path', explode('x', substr($rec['path'], 1, -1))));
if($content) if($content)
$doc->addField(SeedDMS_SQLiteFTS_Field::UnStored('content', $rec['content'])); $doc->addField(SeedDMS_SQLiteFTS_Field::UnStored('content', $rec['content']));
} }
@ -318,16 +391,33 @@ class SeedDMS_SQLiteFTS_Indexer {
/** /**
* Return list of terms in index * Return list of terms in index
* *
* This function does nothing! * @return array list of SeedDMS_SQLiteFTS_Term
*/ */
public function terms() { /* {{{ */ public function terms($prefix='', $col='') { /* {{{ */
if(!$this->_conn) if(!$this->_conn)
return false; return false;
if($this->_ftstype == 'fts5') if($this->_ftstype == 'fts5') {
$sql = "SELECT term, col, doc as occurrences FROM docs_terms WHERE col!='*' ORDER BY col"; $sql = "SELECT term, col, doc as occurrences FROM docs_terms";
else if($prefix || $col) {
$sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*' ORDER BY col"; $sql .= " WHERE";
if($prefix) {
$sql .= " term like '".$prefix."%'";
if($col)
$sql .= " AND";
}
if($col)
$sql .= " col = '".$col."'";
}
$sql .= " ORDER BY col, occurrences desc";
} else {
$sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*'";
if($prefix)
$sql .= " AND term like '".$prefix."%'";
if($col)
$sql .= " AND col = '".$col."'";
$sql .= " ORDER BY col, occurrences desc";
}
$res = $this->_conn->query($sql); $res = $this->_conn->query($sql);
$terms = array(); $terms = array();
if($res) { if($res) {
@ -340,8 +430,9 @@ class SeedDMS_SQLiteFTS_Indexer {
} /* }}} */ } /* }}} */
/** /**
* Return list of documents in index * Return number of documents in index
* *
* @return interger number of documents
*/ */
public function count() { /* {{{ */ public function count() { /* {{{ */
$sql = "SELECT count(*) c FROM docs"; $sql = "SELECT count(*) c FROM docs";

View File

@ -53,6 +53,7 @@ class SeedDMS_SQLiteFTS_QueryHit {
*/ */
public function __construct(SeedDMS_SQLiteFTS_Indexer $index) { /* {{{ */ public function __construct(SeedDMS_SQLiteFTS_Indexer $index) { /* {{{ */
$this->_index = $index; $this->_index = $index;
$this->_document = null;
} /* }}} */ } /* }}} */
/** /**

View File

@ -70,7 +70,7 @@ class SeedDMS_SQliteFTS_Search {
* @param object $index SQlite FTS index * @param object $index SQlite FTS index
* @return object instance of SeedDMS_Lucene_Search * @return object instance of SeedDMS_Lucene_Search
*/ */
function search($term, $fields=array(), $limit=array()) { /* {{{ */ function search($term, $fields=array(), $limit=array(), $order=array()) { /* {{{ */
$querystr = ''; $querystr = '';
$term = trim($term); $term = trim($term);
if($term) { if($term) {
@ -139,8 +139,20 @@ class SeedDMS_SQliteFTS_Search {
$querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':'); $querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':');
$querystr .= '*)'; $querystr .= '*)';
} }
$filterstr = '';
if(!empty($fields['created_start'])) {
if($filterstr)
$filterstr .= ' AND ';
$filterstr .= '(created>='.$fields['created_start'].')';
}
if(!empty($fields['created_end'])) {
if($filterstr)
$filterstr .= ' AND ';
$filterstr .= '(created<'.$fields['created_end'].')';
}
try { try {
$result = $this->index->find($querystr, $limit); $result = $this->index->find($querystr, $filterstr, $limit, $order);
$recs = array(); $recs = array();
foreach($result["hits"] as $hit) { foreach($result["hits"] as $hit) {
$recs[] = array('id'=>$hit->id, 'document_id'=>$hit->documentid); $recs[] = array('id'=>$hit->id, 'document_id'=>$hit->documentid);

View File

@ -60,7 +60,8 @@ class SeedDMS_SQLiteFTS_Term {
9 => 'created', 9 => 'created',
10 => 'user', 10 => 'user',
11 => 'status', 11 => 'status',
12 => 'path' 12 => 'path',
13 => 'indexed',
); );
/* fts5 pass the column name in $col, fts4 uses an integer */ /* fts5 pass the column name in $col, fts4 uses an integer */
if(is_int($col)) if(is_int($col))

View File

@ -11,11 +11,11 @@
<email>uwe@steinmann.cx</email> <email>uwe@steinmann.cx</email>
<active>yes</active> <active>yes</active>
</lead> </lead>
<date>2022-03-04</date> <date>2023-01-09</date>
<time>08:57:44</time> <time>08:57:44</time>
<version> <version>
<release>1.0.17</release> <release>1.0.18</release>
<api>1.0.17</api> <api>1.0.18</api>
</version> </version>
<stability> <stability>
<release>stable</release> <release>stable</release>
@ -23,8 +23,10 @@
</stability> </stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license> <license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes> <notes>
- throw exeption in find() instead of returning false - add optional parameter $order to SeedDMS_SQLiteFTS_Indexer::find()
- fix query if rootFolder or startFolder is set - add optional parameters $query and $col to SeedDMS_SQLiteFTS_Indexer::terms()
- IndexedDocument() accepts a callable for conversion to text
- remove stop words from content
</notes> </notes>
<contents> <contents>
<dir baseinstalldir="SeedDMS" name="/"> <dir baseinstalldir="SeedDMS" name="/">
@ -353,5 +355,22 @@ add user to list of terms
- add class SeedDMS_SQLiteFTS_Field - add class SeedDMS_SQLiteFTS_Field
</notes> </notes>
</release> </release>
<release>
<date>2022-03-04</date>
<time>08:57:44</time>
<version>
<release>1.0.17</release>
<api>1.0.17</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- throw exeption in find() instead of returning false
- fix query if rootFolder or startFolder is set
</notes>
</release>
</changelog> </changelog>
</package> </package>

View File

@ -29,8 +29,18 @@ class SeedDMS_Controller_ClearCache extends SeedDMS_Controller_Common {
$post = $this->params['post']; $post = $this->params['post'];
$ret = ''; $ret = '';
if(!empty($post['preview'])) { if(!empty($post['previewpng'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/[1-9]*'; $cmd = 'rm -rf '.$settings->_cacheDir.'/png/[1-9]*';
system($cmd, $ret);
}
if(!empty($post['previewpdf'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/pdf/[1-9]*';
system($cmd, $ret);
}
if(!empty($post['previewtxt'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/txt/[1-9]*';
system($cmd, $ret); system($cmd, $ret);
} }

View File

@ -26,6 +26,7 @@ class SeedDMS_Controller_Cron extends SeedDMS_Controller_Common {
$dms = $this->params['dms']; $dms = $this->params['dms'];
$user = $this->params['user']; $user = $this->params['user'];
$settings = $this->params['settings']; $settings = $this->params['settings'];
$logger = $this->params['logger'];
$mode = $this->params['mode']; $mode = $this->params['mode'];
$db = $dms->getDb(); $db = $dms->getDb();

View File

@ -35,9 +35,11 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
$dms = $this->params['dms']; $dms = $this->params['dms'];
$settings = $this->params['settings']; $settings = $this->params['settings'];
$session = $this->params['session']; $session = $this->params['session'];
$sesstheme = $this->params['sesstheme']; $authenticator = $this->params['authenticator'];
$referuri = $this->params['referuri']; $source = isset($this->params['source']) ? $this->params['source'] : '';
$lang = $this->params['lang']; $sesstheme = $this->getParam('sesstheme');
$referuri = $this->getParam('referuri');
$lang = $this->getParam('lang');
$login = $this->params['login']; $login = $this->params['login'];
if($user = $dms->getUserByLogin($login)) { if($user = $dms->getUserByLogin($login)) {
@ -133,73 +135,78 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
/* Clear login failures if login was successful */ /* Clear login failures if login was successful */
$user->clearLoginFailures(); $user->clearLoginFailures();
// Capture the user's language and theme settings. /* Setting the theme and language and all the cookie handling is
if ($lang) { * only done when authentication was requested from a weg page.
$user->setLanguage($lang); */
} else { if($source == 'web') {
$lang = $user->getLanguage(); // Capture the user's language and theme settings.
if (strlen($lang)==0) { if ($lang) {
$lang = $settings->_language;
$user->setLanguage($lang); $user->setLanguage($lang);
}
}
if ($sesstheme) {
$user->setTheme($sesstheme);
}
else {
$sesstheme = $user->getTheme();
/* Override the theme if the user doesn't have one or the default theme
* shall override it.
*/
if (strlen($sesstheme)==0 || !empty($settings->_overrideTheme)) {
$sesstheme = $settings->_theme;
// $user->setTheme($sesstheme);
}
}
// Delete all sessions that are more than 1 week or the configured
// cookie lifetime old. Probably not the most
// reliable place to put this check -- move to inc.Authentication.php?
if($settings->_cookieLifetime)
$lifetime = intval($settings->_cookieLifetime);
else
$lifetime = 7*86400;
if(!$session->deleteByTime($lifetime)) {
$this->setErrorMsg("error_occured");
return false;
}
if (isset($_COOKIE["mydms_session"])) {
/* This part will never be reached unless the session cookie is kept,
* but op.Logout.php deletes it. Keeping a session could be a good idea
* for retaining the clipboard data, but the user id in the session should
* be set to 0 which is not possible due to foreign key constraints.
* So for now op.Logout.php will delete the cookie as always
*/
/* Load session */
$dms_session = $_COOKIE["mydms_session"];
if(!$resArr = $session->load($dms_session)) {
/* Turn off http only cookies if jumploader is enabled */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot, null, false, true); //delete cookie
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$referuri);
exit;
} else { } else {
$session->updateAccess($dms_session); $lang = $user->getLanguage();
$session->setUser($userid); if (strlen($lang)==0) {
$lang = $settings->_language;
$user->setLanguage($lang);
}
} }
} else { if ($sesstheme) {
// Create new session in database $user->setTheme($sesstheme);
if(!$id = $session->create(array('userid'=>$userid, 'theme'=>$sesstheme, 'lang'=>$lang))) { }
else {
$sesstheme = $user->getTheme();
/* Override the theme if the user doesn't have one or the default theme
* shall override it.
*/
if (strlen($sesstheme)==0 || !empty($settings->_overrideTheme)) {
$sesstheme = $settings->_theme;
// $user->setTheme($sesstheme);
}
}
// Delete all sessions that are more than 1 week or the configured
// cookie lifetime old. Probably not the most
// reliable place to put this check -- move to inc.Authentication.php?
if($settings->_cookieLifetime)
$lifetime = intval($settings->_cookieLifetime);
else
$lifetime = 7*86400;
if(!$session->deleteByTime($lifetime)) {
$this->setErrorMsg("error_occured"); $this->setErrorMsg("error_occured");
return false; return false;
} }
// Set the session cookie. if (isset($_COOKIE["mydms_session"])) {
if($settings->_cookieLifetime) /* This part will never be reached unless the session cookie is kept,
$lifetime = time() + intval($settings->_cookieLifetime); * but op.Logout.php deletes it. Keeping a session could be a good idea
else * for retaining the clipboard data, but the user id in the session should
$lifetime = 0; * be set to 0 which is not possible due to foreign key constraints.
setcookie("mydms_session", $id, $lifetime, $settings->_httpRoot, null, false, true); * So for now op.Logout.php will delete the cookie as always
*/
/* Load session */
$dms_session = $_COOKIE["mydms_session"];
if(!$resArr = $session->load($dms_session)) {
/* Turn off http only cookies if jumploader is enabled */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot, null, false, true); //delete cookie
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$referuri);
exit;
} else {
$session->updateAccess($dms_session);
$session->setUser($userid);
}
} else {
// Create new session in database
if(!$id = $session->create(array('userid'=>$userid, 'theme'=>$sesstheme, 'lang'=>$lang))) {
$this->setErrorMsg("error_occured");
return false;
}
// Set the session cookie.
if($settings->_cookieLifetime)
$lifetime = time() + intval($settings->_cookieLifetime);
else
$lifetime = 0;
setcookie("mydms_session", $id, $lifetime, $settings->_httpRoot, null, false, true);
}
} }
if($this->callHook('postLogin', $user)) { if($this->callHook('postLogin', $user)) {
@ -275,6 +282,7 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
} }
} }
if(0) {
/* Authenticate against LDAP server {{{ */ /* Authenticate against LDAP server {{{ */
if (!is_object($user) && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) { if (!is_object($user) && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
require_once("../inc/inc.ClassLdapAuthentication.php"); require_once("../inc/inc.ClassLdapAuthentication.php");
@ -288,6 +296,7 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
$authobj = new SeedDMS_DbAuthentication($dms, $settings); $authobj = new SeedDMS_DbAuthentication($dms, $settings);
$user = $authobj->authenticate($login, $pwd); $user = $authobj->authenticate($login, $pwd);
} /* }}} */ } /* }}} */
}
/* If the user is still not authenticated, then exit with an error */ /* If the user is still not authenticated, then exit with an error */
if(!is_object($user)) { if(!is_object($user)) {

View File

@ -90,6 +90,9 @@ image/jpeg
image/png image/png
convert -resize %wx '%f' 'png:%o' convert -resize %wx '%f' 'png:%o'
text/plain
convert -density 100 -resize %wx 'text:%f[0]' 'png:%o'
application/pdf application/pdf
gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q '%f' | convert -resize %wx png:- '%o' gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q '%f' | convert -resize %wx png:- '%o'
@ -97,9 +100,15 @@ application/pdf
mutool draw -F png -w %w -q -N -o %o %f 1 mutool draw -F png -w %w -q -N -o %o %f 1
application/postscript
convert -density 100 -resize %wx '%f[0]' 'png:%o'
text/plain text/plain
a2ps -1 -a1 -R -B -o - '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- 'png:%o' a2ps -1 -a1 -R -B -o - '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- 'png:%o'
On Linux systems you will have to set the desired value in /etc/papersize for a2ps
e.g. a4, or letter
application/msword application/msword
application/vnd.oasis.opendocument.spreadsheet application/vnd.oasis.opendocument.spreadsheet
application/vnd.oasis.opendocument.text application/vnd.oasis.opendocument.text

26
doc/README.Scheduler.md Normal file
View File

@ -0,0 +1,26 @@
Scheduler
==========
The scheduler in SeedDMS manages frequently run tasks. It is very similar
to regular unix cron jobs. A task in SeedDMS is an instanciation of a task
class which itself is defined by an extension or SeedDMS itself.
SeedDMS has some predefined classes e.g. core::expireddocs.
In order for tasks to be runnalbe, a user `cli_scheduler` must exists in
SeedDMS.
All tasks are executed by a single cronjob in the directory `utils`
> */5 * * * * /home/www-data/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
Please keep in mind, that the php interpreter used for the cronjob may be
different from the php interpreter used für the web application. Hence, two
different php.ini files might be used. php and the php extensions may differ as
well. This can cause some extensions to be disabled and consequently some task
classes are not defined.
`utils/seeddms-schedulercli` can also be run on the command line. If you
do that, run it with the same system user used for the web server. On Debian
this is www-data. Hence run it like
sudo -u www-data utils/seeddms-schedulercli --mode=list

13
doc/README.Swagger Normal file
View File

@ -0,0 +1,13 @@
Swagger
========
Swagger is used to describe a rest api. SeedDMS ships a swagger.yaml file
in the restapi directory. You can load this file into a swagger editor, e.g.
http://petstore.swagger.io/ or http://editor.swagger.io/
You may as well set up your own swagger-ui installation as described at
https://medium.com/@tatianaensslin/how-to-add-swagger-ui-to-php-server-code-f1610c01dc03
Your apache needs to have the module 'header' enabled, because some HTTP headers
are set when the file swagger.yaml is accessed by the editor.
Currently, the swagger.yaml shipped with SeedDMS uses still swagger 2.0

View File

@ -1,5 +1,5 @@
WebDAV WebDAV
----------------------------------------------- ========
SeedDMS has support for WebDAV which allows to easily add, delete, SeedDMS has support for WebDAV which allows to easily add, delete,
move, copy and modify documents. All operating systems have support move, copy and modify documents. All operating systems have support
@ -29,7 +29,7 @@ the content of document or creating a new
version if a document is saved. version if a document is saved.
Configuring davfs2 Configuring davfs2
=================== -------------------
On Linux it is quite simple to mount the SeedDMS WebDAV server with On Linux it is quite simple to mount the SeedDMS WebDAV server with
davfs2. Just place a line like the following in your /etc/fstab davfs2. Just place a line like the following in your /etc/fstab
@ -51,15 +51,14 @@ and possibly add your login data to /etc/davfs2/secrets
/media/webdav admin secret /media/webdav admin secret
Making applications work with WebDAV Making applications work with WebDAV
===================================== -------------------------------------
Various programms have differnt strategies to save files to disc and Various programms have differnt strategies to save files to disc and
prevent data lost under all circumstances. Those strategies often don't prevent data lost under all circumstances. Those strategies often don't
work very well an a WebDAV-Server. The following will list some of those work very well an a WebDAV-Server. The following will list some of those
strategies. strategies.
VIM ### VIM
=========================
vim does a lot more than just reading and writing the file you want vim does a lot more than just reading and writing the file you want
to edit. It creates swap and backup files for data recovery if vim crashes to edit. It creates swap and backup files for data recovery if vim crashes
@ -69,7 +68,7 @@ swap file at all or create it outside the WebDAV server. A second problem
arises from how vim modifіes the file you are editing. Before a file arises from how vim modifіes the file you are editing. Before a file
is saved a backup is created by renaming the file to the same name with a is saved a backup is created by renaming the file to the same name with a
'~' at the end and writing the file content into a new '~' at the end and writing the file content into a new
file with the name of the original file. Afterwards vim deleteѕ the backup file with the name of the original file. Afterwards vim deletes the backup
file. On a regular file system you file. On a regular file system you
won't see a difference between the file before and after saving, though won't see a difference between the file before and after saving, though
it is actually a new one. In SeedDMS you won't notice a difference either it is actually a new one. In SeedDMS you won't notice a difference either
@ -88,12 +87,17 @@ set nobackup
set nowritebackup set nowritebackup
set noswapfile set noswapfile
If you want to restrict the settings to the directory where the dms
is mounted by webdav, e.g. /media/webdav, you can set an auto command
in .vimrc
autocmd BufNewFile,BufRead /media/webdav/* set nobackup nowritebackup noswapfile
Creating the backup file in a directory outside of WebDAV doesn't help in Creating the backup file in a directory outside of WebDAV doesn't help in
this case, because it still does the file renaming which is turned of by this case, because it still does the file renaming which is turned off by
'nowritebackup'. 'nowritebackup'.
cdaver ### cdaver
========
cadaver is a webdav client similar to classical command line based ftp clients. cadaver is a webdav client similar to classical command line based ftp clients.
It can be used to browse through the folders, downloads and uploads files, and It can be used to browse through the folders, downloads and uploads files, and

View File

@ -12,9 +12,6 @@
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
require_once("inc.Utils.php");
require_once("inc.ClassNotificationService.php");
require_once("inc.ClassEmailNotify.php");
require_once("inc.ClassSession.php"); require_once("inc.ClassSession.php");
require_once("inc.ClassAccessOperation.php"); require_once("inc.ClassAccessOperation.php");
@ -110,8 +107,6 @@ if($settings->_useHomeAsRootFolder && !$user->isAdmin() && $user->getHomeFolder(
$role = $user->getRole(); $role = $user->getRole();
$dms->noReadForStatus = $role->getNoAccess(); $dms->noReadForStatus = $role->getNoAccess();
require_once('inc/inc.Notification.php');
/* Include additional language file for view /* Include additional language file for view
* This file must set $LANG[xx][] * This file must set $LANG[xx][]
*/ */

View File

@ -0,0 +1,42 @@
<?php
/**
* Create authentication service
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
require_once('inc.ClassAuthenticationService.php');
require_once('inc.ClassDbAuthentication.php');
require_once('inc.ClassLdapAuthentication.php');
global $logger;
$authenticator = new SeedDMS_AuthenticationService($logger, $settings);
if(isset($GLOBALS['SEEDDMS_HOOKS']['authentication'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['authentication'] as $authenticationObj) {
if(method_exists($authenticationObj, 'preAddService')) {
$authenticationObj->preAddService($dms, $authenticator);
}
}
}
$authenticator->addService(new SeedDMS_DbAuthentication($dms, $settings), 'db');
if(isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
$authenticator->addService(new SeedDMS_LdapAuthentication($dms, $settings), 'ldap');
}
if(isset($GLOBALS['SEEDDMS_HOOKS']['authentication'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['authentication'] as $authenticationObj) {
if(method_exists($authenticationObj, 'postAddService')) {
$authenticationObj->postAddService($dms, $authenticator);
}
}
}

View File

@ -18,53 +18,13 @@ require_once("inc.ClassEmailNotify.php");
require_once("inc.ClassSession.php"); require_once("inc.ClassSession.php");
require_once("inc.ClassAccessOperation.php"); require_once("inc.ClassAccessOperation.php");
function __authenticate($username, $password) { /* {{{ */
global $dms, $settings;
$user = false;
/* Authenticate against LDAP server {{{ */
if (!$user && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
require_once("../inc/inc.ClassLdapAuthentication.php");
$authobj = new SeedDMS_LdapAuthentication($dms, $settings);
$user = $authobj->authenticate($username, $password);
} /* }}} */
/* Authenticate against SeedDMS database {{{ */
else {
require_once("../inc/inc.ClassDbAuthentication.php");
$authobj = new SeedDMS_DbAuthentication($dms, $settings);
$user = $authobj->authenticate($username, $password);
} /* }}} */
if (!$user) {
return false;
}
if (($user->getID() == $settings->_guestID) && (!$settings->_enableGuestLogin)) {
return false;
}
// Check if account is disabled
if($user->isDisabled()) {
return false;
}
// control admin IP address if required
if ($user->isAdmin() && ($_SERVER['REMOTE_ADDR'] != $settings->_adminIP ) && ( $settings->_adminIP != "") ){
return false;
}
return $user;
} /* }}} */
if (!isset($_SERVER['PHP_AUTH_USER'])) { if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"'); header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
echo getMLText('cancel_basic_authentication'); echo getMLText('cancel_basic_authentication');
exit; exit;
} else { } else {
if(!($user = __authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) { if(!($user = $authenticator->authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"'); header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
echo getMLText('cancel_basic_authentication'); echo getMLText('cancel_basic_authentication');

View File

@ -24,34 +24,6 @@
*/ */
abstract class SeedDMS_Authentication abstract class SeedDMS_Authentication
{ {
/**
* DMS object
*
* @var SeedDMS_Core_DMS
* @access protected
*/
protected $dms;
/**
* DMS settings
*
* @var Settings
* @access protected
*/
protected $settings;
/**
* Constructor
*
* @param SeedDMS_Core_DMS $dms DMS object
* @param Settings $settings DMS settings
*/
function __construct($dms, $settings) /* {{{ */
{
$this->dms = $dms;
$this->settings = $settings;
} /* }}} */
/** /**
* Do Authentication * Do Authentication
* *

View File

@ -0,0 +1,73 @@
<?php
/* Middleware for authentication based on session */
class SeedDMS_Auth_Middleware_Session { /* {{{ */
private $container;
public function __construct($container) {
$this->container = $container;
}
/**
* Example middleware invokable class
*
* @param \Psr\Http\Message\ServerRequestInterface $request PSR7 request
* @param \Psr\Http\Message\ResponseInterface $response PSR7 response
* @param callable $next Next middleware
*
* @return \Psr\Http\Message\ResponseInterface
*/
public function __invoke($request, $response, $next) {
// $this->container has the DI
$dms = $this->container->dms;
$settings = $this->container->config;
$logger = $this->container->logger;
$userobj = null;
if($this->container->has('userobj'))
$userobj = $this->container->userobj;
if($userobj) {
$response = $next($request, $response);
return $response;
}
$logger->log("Invoke middleware for method ".$request->getMethod()." on '".$request->getUri()->getPath()."'", PEAR_LOG_INFO);
require_once("inc/inc.ClassSession.php");
$session = new SeedDMS_Session($dms->getDb());
if (isset($_COOKIE["mydms_session"])) {
$dms_session = $_COOKIE["mydms_session"];
$logger->log("Session key: ".$dms_session, PEAR_LOG_DEBUG);
if(!$resArr = $session->load($dms_session)) {
/* Delete Cookie */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot);
$logger->log("Session for id '".$dms_session."' has gone", PEAR_LOG_ERR);
return $response->withStatus(403);
}
/* Load user data */
$userobj = $dms->getUser($resArr["userID"]);
if (!is_object($userobj)) {
/* Delete Cookie */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot);
if($settings->_enableGuestLogin) {
if(!($userobj = $dms->getUser($settings->_guestID)))
return $response->withStatus(403);
} else
return $response->withStatus(403);
}
if($userobj->isAdmin()) {
if($resArr["su"]) {
if(!($userobj = $dms->getUser($resArr["su"])))
return $response->withStatus(403);
}
}
$dms->setUser($userobj);
} else {
return $response->withStatus(403);
}
$this->container['userobj'] = $userobj;
$response = $next($request, $response);
return $response;
}
} /* }}} */

View File

@ -0,0 +1,88 @@
<?php
/**
* Implementation of authentication service
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Implementation of authentication service
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_AuthenticationService {
/**
* List of services for authenticating user
*/
protected $services;
/*
* List of servives with errors
*/
protected $errors;
/*
* Service for logging
*/
protected $logger;
/*
* Configuration
*/
protected $settings;
public function __construct($logger = null, $settings = null) { /* {{{ */
$this->services = array();
$this->errors = array();
$this->logger = $logger;
$this->settings = $settings;
} /* }}} */
public function addService($service, $name='') { /* {{{ */
if(!$name)
$name = md5(uniqid());
$this->services[$name] = $service;
$this->errors[$name] = true;
} /* }}} */
public function getServices() { /* {{{ */
return $this->services;
} /* }}} */
public function getErrors() { /* {{{ */
return $this->errors;
} /* }}} */
public function authenticate($username, $password) { /* {{{ */
$user = null;
foreach($this->services as $name => $service) {
$this->logger->log('Authentication service \''.$name.'\'', PEAR_LOG_INFO);
$user = $service->authenticate($username, $password);
if($user === false) {
$this->errors[$name] = false;
if($this->logger)
$this->logger->log('Authentication service \''.$name.'\': Authentication of user \''.$username.'\' failed.', PEAR_LOG_ERR);
return false;
} elseif($user === null) {
if($this->logger)
$this->logger->log('Authentication service \''.$name.'\': Authentication of user \''.$username.'\' disregarded.', PEAR_LOG_ERR);
} else {
if($this->logger)
$this->logger->log('Authentication service \''.$name.'\': Authentication of user \''.$username.'\' successful.', PEAR_LOG_INFO);
$this->errors[$name] = true;
return $user;
}
}
return $user;
} /* }}} */
}

View File

@ -16,6 +16,7 @@ require_once("inc/inc.ClassConversionServiceImageToImage.php");
require_once("inc/inc.ClassConversionServiceImageToText.php"); require_once("inc/inc.ClassConversionServiceImageToText.php");
require_once("inc/inc.ClassConversionServicePdfToImage.php"); require_once("inc/inc.ClassConversionServicePdfToImage.php");
require_once("inc/inc.ClassConversionServiceTextToText.php"); require_once("inc/inc.ClassConversionServiceTextToText.php");
require_once("inc/inc.ClassConversionServiceTextToImage.php");
/** /**
* Implementation of conversion manager * Implementation of conversion manager
@ -72,18 +73,25 @@ class SeedDMS_ConversionMgr {
* @param string $file name of file to convert * @param string $file name of file to convert
* @param string $from mimetype of input file * @param string $from mimetype of input file
* @param string $to mimetype of output file * @param string $to mimetype of output file
* @param string $target name of target file. If none is given the
* content of the converted document will be returned.
* @param array $params additional parameter needed for the conversion,
* e.g. the width of an image
* *
* @return boolean true on success, other false * @return boolean true on success, other false
*/ */
public function convert($file, $from, $to, $target=null, $params=array()) { public function convert($file, $from, $to, $target=null, $params=array()) { /* {{{ */
if(isset($this->services[$from][$to])) { if(isset($this->services[$from][$to])) {
$services = $this->services[$from][$to]; $services = $this->services[$from][$to];
for(end($services); key($services)!==null; prev($services)) { for(end($services); key($services)!==null; prev($services)) {
$service = current($services); $service = current($services);
$text = $service->convert($file, $target, $params); $text = $service->convert($file, $target, $params);
if($text !== false) if(!$service->wasSuccessful())
return false;
if($text)
return $text; return $text;
} }
} }
} return true;
} /* }}} */
} }

View File

@ -36,9 +36,15 @@ abstract class SeedDMS_ConversionServiceBase {
*/ */
protected $logger; protected $logger;
/**
* @var $success set to false if conversion failed
*/
protected $success;
public function __construct() { public function __construct() {
$this->from = null; $this->from = null;
$this->to = null; $this->to = null;
$this->success = true;
} }
public function setLogger($logger) { public function setLogger($logger) {
@ -53,6 +59,10 @@ abstract class SeedDMS_ConversionServiceBase {
return []; return [];
} /* }}} */ } /* }}} */
public function wasSuccessful() { /* {{{ */
return $this->success;
} /* }}} */
/** /**
* This method does the conversion * This method does the conversion
* *

View File

@ -91,11 +91,12 @@ class SeedDMS_ConversionServiceExec extends SeedDMS_ConversionServiceBase {
} }
} /* }}} */ } /* }}} */
public function __construct($from, $to, $cmd) { public function __construct($from, $to, $cmd, $timeout=5) {
parent::__construct();
$this->from = $from; $this->from = $from;
$this->to = $to; $this->to = $to;
$this->cmd = $cmd; $this->cmd = $cmd;
$this->timeout = 5; $this->timeout = ((int) $timeout) ? (int) $timeout : 5;
} }
public function getInfo() { public function getInfo() {
@ -167,6 +168,7 @@ class SeedDMS_ConversionServiceExec extends SeedDMS_ConversionServiceBase {
} catch(Exception $e) { } catch(Exception $e) {
if($hastempfile) if($hastempfile)
unlink($tmpfile); unlink($tmpfile);
$this->success = false;
return false; return false;
} }
$end = microtime(true); $end = microtime(true);

View File

@ -29,6 +29,7 @@ class SeedDMS_ConversionServiceImageToImage extends SeedDMS_ConversionServiceBas
public $timeout; public $timeout;
public function __construct($from, $to) { /* {{{ */ public function __construct($from, $to) { /* {{{ */
parent::__construct();
$this->from = $from; $this->from = $from;
$this->to = $to; $this->to = $to;
$this->timeout = 5; $this->timeout = 5;

View File

@ -29,6 +29,7 @@ class SeedDMS_ConversionServiceImageToText extends SeedDMS_ConversionServiceBase
public $timeout; public $timeout;
public function __construct($from, $to) { /* {{{ */ public function __construct($from, $to) { /* {{{ */
parent::__construct();
$this->from = $from; $this->from = $from;
$this->to = $to; $this->to = $to;
} /* }}} */ } /* }}} */
@ -50,25 +51,24 @@ class SeedDMS_ConversionServiceImageToText extends SeedDMS_ConversionServiceBase
public function convert($infile, $target = null, $params = array()) { /* {{{ */ public function convert($infile, $target = null, $params = array()) { /* {{{ */
$start = microtime(true); $start = microtime(true);
$imsize = getimagesize($infile, $moreinfo); $imsize = getimagesize($infile, $moreinfo);
$txt = '';
if(!empty($moreinfo['APP13'])) { if(!empty($moreinfo['APP13'])) {
$txt = '';
$iptcdata = iptcparse($moreinfo['APP13']); $iptcdata = iptcparse($moreinfo['APP13']);
foreach(['2#005', '2#015', '2#025', '2#105', '2#080', '2#115', '2#120'] as $key) { foreach(['2#005', '2#015', '2#025', '2#105', '2#080', '2#115', '2#120'] as $key) {
if(isset($iptcdata[$key])) if(isset($iptcdata[$key]))
$txt .= implode(' ', $iptcdata[$key])."\n"; $txt .= implode(' ', $iptcdata[$key])."\n";
} }
$end = microtime(true);
if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' by extracting iptc took '.($end-$start).' sec.', PEAR_LOG_INFO);
}
if($target) {
file_put_contents($target, $txt);
return true;
} else {
return $txt;
}
} }
return false; $end = microtime(true);
if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' by extracting iptc took '.($end-$start).' sec.', PEAR_LOG_INFO);
}
if($target) {
file_put_contents($target, $txt);
return true;
} else {
return $txt;
}
} /* }}} */ } /* }}} */
} }

View File

@ -29,6 +29,7 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
public $timeout; public $timeout;
public function __construct($from, $to) { public function __construct($from, $to) {
parent::__construct();
$this->from = $from; $this->from = $from;
$this->to = $to; $this->to = $to;
$this->timeout = 5; $this->timeout = 5;
@ -50,8 +51,12 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
$imagick = new Imagick(); $imagick = new Imagick();
/* Setting a smaller resolution will speed up the conversion /* Setting a smaller resolution will speed up the conversion
* A resolution of 72,72 will create a 596x842 image * A resolution of 72,72 will create a 596x842 image
* Setting it to 36,36 will create a 298x421 image which should
* be sufficient in most cases, but keep in mind that images are
* not scaled up. Hence, a width of 400px still results in a 298px
* wide image
*/ */
$imagick->setResolution(36,36); $imagick->setResolution(72,72);
$page = 0; $page = 0;
if(!empty($params['page']) && intval($params['page']) > 0) if(!empty($params['page']) && intval($params['page']) > 0)
$page = intval($params['page'])-1; $page = intval($params['page'])-1;
@ -71,6 +76,7 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
} }
} }
} catch (ImagickException $e) { } catch (ImagickException $e) {
$this->success = false;
return false; return false;
} }
return false; return false;

View File

@ -0,0 +1,144 @@
<?php
/**
* Implementation of conversion service class
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2023 Uwe Steinmann
* @version Release: @package_version@
*/
require_once("inc/inc.ClassConversionServiceBase.php");
/**
* Implementation of conversion service from text to image
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2023 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_ConversionServiceTextToImage extends SeedDMS_ConversionServiceBase {
public function __construct($from, $to) {
parent::__construct();
$this->from = $from;
$this->to = $to;
}
public function getInfo() {
return "Convert with imagick php functions";
}
public function getAdditionalParams() { /* {{{ */
return [
['name'=>'width', 'type'=>'number', 'description'=>'Width of converted image'],
['name'=>'page', 'type'=>'number', 'description'=>'Page of text document'],
];
} /* }}} */
private function wordWrapAnnotation($image, $draw, $text, $maxWidth) { /* {{{ */
$words = preg_split('%\s%', trim($text), -1, PREG_SPLIT_NO_EMPTY);
$lines = array();
$i = 0;
$lineHeight = 0;
while (count($words) > 0) {
$metrics = $image->queryFontMetrics($draw, implode(' ', array_slice($words, 0, ++$i)));
$lineHeight = max($metrics['textHeight'], $lineHeight);
// check if we have found the word that exceeds the line width
if ($metrics['textWidth'] > $maxWidth or count($words) < $i) {
// handle case where a single word is longer than the allowed line width (just add this as a word on its own line?)
if ($i == 1)
$i++;
$lines[] = implode(' ', array_slice($words, 0, --$i));
$words = array_slice($words, $i);
$i = 0;
}
}
return array($lines, $lineHeight);
} /* }}} */
public function convert($infile, $target = null, $params = array()) { /* {{{ */
$boxWidth = 596;
$boxHeight = 842;
$boxTop = 30;
$boxBottom = 30;
$boxLeft = 30;
$boxRight = 30;
$parSep = 10;
$fontSize = 10;
$start = microtime(true);
$imagick = new Imagick();
/* Setting a smaller resolution will speed up the conversion
* A resolution of 72,72 will create a 596x842 image
* Setting it to 36,36 will create a 298x421 image which should
* be sufficient in most cases, but keep in mind that images are
* not scaled up. Hence, a width of 400px still results in a 298px
* wide image
*/
$imagick->setResolution(72,72);
$page = 0;
if(!empty($params['page']) && intval($params['page']) > 0)
$page = intval($params['page'])-1;
try {
if($imagick->newImage($boxWidth, $boxHeight, "white")) {
$draw = new ImagickDraw();
$draw->setStrokeColor("none");
$draw->setFont("Courier");
$draw->setFontSize($fontSize);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$content = file_get_contents($infile);
$lines = preg_split('~\R~',$content);
$boxY = $boxTop;
$pagecount = 0;
foreach($lines as $line) {
if($line) {
$rlines = $this->wordWrapAnnotation($imagick, $draw, $line, $boxWidth-$boxLeft-$boxRight);
foreach($rlines[0] as $rline) {
if($pagecount == $page && $boxY < ($boxHeight-$boxBottom)) {
$imagick->annotateImage($draw, $boxLeft, $boxY, 0, $rline);
}
$boxY = $boxY + $rlines[1];
}
} else {
$boxY += $parSep;
}
if($boxY >= ($boxHeight-$boxBottom)) {
$pagecount++;
$boxY = $boxTop;
if($pagecount > $page)
break;
}
}
if(!empty($params['width']))
$imagick->scaleImage(min((int) $params['width'], $imagick->getImageWidth()), 0);
$imagick->setImageFormat('png');
$end = microtime(true);
if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with text service took '.($end-$start).' sec.', PEAR_LOG_INFO);
}
if($target) {
return $imagick->writeImage($target);
} else {
return $imagick->getImageBlob();
}
}
} catch (ImagickException $e) {
return false;
}
return false;
} /* }}} */
}

View File

@ -24,6 +24,7 @@ require_once("inc/inc.ClassConversionServiceBase.php");
*/ */
class SeedDMS_ConversionServiceTextToText extends SeedDMS_ConversionServiceBase { class SeedDMS_ConversionServiceTextToText extends SeedDMS_ConversionServiceBase {
public function __construct($from, $to) { public function __construct($from, $to) {
parent::__construct();
$this->from = $from; $this->from = $from;
$this->to = $to; $this->to = $to;
} }

View File

@ -24,6 +24,15 @@ require_once "inc.ClassAuthentication.php";
*/ */
class SeedDMS_DbAuthentication extends SeedDMS_Authentication { class SeedDMS_DbAuthentication extends SeedDMS_Authentication {
var $dms;
var $settings;
public function __construct($dms, $settings) { /* {{{ */
$this->dms = $dms;
$this->settings = $settings;
} /* }}} */
/** /**
* Do Authentication * Do Authentication
* *
@ -32,29 +41,15 @@ class SeedDMS_DbAuthentication extends SeedDMS_Authentication {
* @return object|boolean user object if authentication was successful otherwise false * @return object|boolean user object if authentication was successful otherwise false
*/ */
public function authenticate($username, $password) { /* {{{ */ public function authenticate($username, $password) { /* {{{ */
$settings = $this->settings;
$dms = $this->dms; $dms = $this->dms;
// Try to find user with given login. // Try to find user with given login.
if($user = $dms->getUserByLogin($username)) { if($user = $dms->getUserByLogin($username)) {
$userid = $user->getID(); $userid = $user->getID();
// Check if password matches (if not a guest user) // Check if password matches
// Assume that the password has been sent via HTTP POST. It would be careless
// (and dangerous) for passwords to be sent via GET.
if (!seed_pass_verify($password, $user->getPwd())) { if (!seed_pass_verify($password, $user->getPwd())) {
/* if counting of login failures is turned on, then increment its value */ $user = null;
$failures = $user->addLoginFailure();
if($settings->_loginFailure) {
if($failures >= $settings->_loginFailure)
$user->setDisabled(true);
}
if($settings->_loginDelay) {
if($failures > 1) {
$user->setDisabledUntil(($failures-1)*($failures-1)*3);
}
}
$user = false;
} }
} }

View File

@ -665,6 +665,7 @@ class SeedDMS_Extension_Mgr {
} }
file_put_contents($this->cachedir."/".self::repos_list_file, $file); file_put_contents($this->cachedir."/".self::repos_list_file, $file);
} else { } else {
$this->errmsgs[] = 'Could not fetch extension list';
return false; return false;
} }
} }

View File

@ -7,17 +7,27 @@
* @license GPL 2 * @license GPL 2
* @version @version@ * @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx> * @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann * @copyright Copyright (C) 2021-2023 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
/** /**
* Implementation of fulltext service * Implementation of fulltext service
* *
* The fulltext service is wrapper around single services for a full text
* search. Such a service can be based on Solr, SQlite, etc. It implements
* three major methods:
* IndexedDocument() for creating an instance of an indexed document
* Indexer() for creating an instance of the index
* Search() fro creating an instance of a search frontend
*
* Though this class can manage more than one service, it will only
* use the first one.
*
* @category DMS * @category DMS
* @package SeedDMS * @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx> * @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann * @copyright Copyright (C) 2021-2023 Uwe Steinmann
* @version Release: @package_version@ * @version Release: @package_version@
*/ */
class SeedDMS_FulltextService { class SeedDMS_FulltextService {
@ -54,6 +64,7 @@ class SeedDMS_FulltextService {
$this->services = array(); $this->services = array();
$this->converters = array(); $this->converters = array();
$this->conversionmgr = null; $this->conversionmgr = null;
$this->previewer = null;
$this->logger = null; $this->logger = null;
$this->maxsize = 0; $this->maxsize = 0;
$this->index = null; $this->index = null;
@ -93,8 +104,75 @@ class SeedDMS_FulltextService {
$this->cmdtimeout = $timeout; $this->cmdtimeout = $timeout;
} }
public function setPreviewer($previewer) {
$this->previewer = $previewer;
}
/** /**
* Return an indexable document from the given document or folder * Returns callback function to convert a document into plain text
*
* This variant just uses the conversion manager and does not
* cache the converted document
*/
public function getConversionCallback() { /* {{{ */
$conversionmgr = $this->conversionmgr;
return function($object) use ($conversionmgr) {
$result = ['content'=>false, 'cmd'=>'', 'errormsg'=>''];
if(!$conversionmgr)
return $result;
if($object->isType('document')) {
$dms = $object->getDMS();
$version = $object->getLatestContent();
$mimetype = $version->getMimeType();
$path = $dms->contentDir . $version->getPath();
if(file_exists($path)) {
if($service = $conversionmgr->getService($mimetype, 'text/plain')) {
$content = $conversionmgr->convert($path, $mimetype, 'text/plain');
if($content) {
$result['content'] = $content;
} elseif($content === false) {
$result['errormsg'] = 'Conversion failed';
}
$result['cmd'] = get_class($service);
} else {
$result['cmd'] = 'No service to convert '.$mimetype.' to text/plain';
}
}
}
return $result;
};
} /* }}} */
/**
* Returns callback function to convert a document into plain text
*
* This variant uses the text previewer which
* caches the converted document
*/
public function getConversionWithPreviewCallback() { /* {{{ */
$previewer = $this->previewer;
return function($object) use ($previewer) {
$result = ['content'=>false, 'cmd'=>'', 'errormsg'=>''];
if($object->isType('document')) {
$dms = $object->getDMS();
$version = $object->getLatestContent();
if($previewer->createPreview($version)) {
if($previewer->hasPreview($version)) {
$filename = $previewer->getFileName($version).'.txt';
$result['content'] = file_get_contents($filename);
$result['cmd'] = 'previewer '.$previewer->getFileSize($version);
}
} else {
$result['cmd'] = 'previewer';
$result['errormsg'] = 'Creating preview failed';
}
}
return $result;
};
} /* }}} */
/**
* Return an indexable document based on the given document or folder
* *
* @param SeedDMS_Core_Document|SeedDMS_Core_Folder $object document or folder * @param SeedDMS_Core_Document|SeedDMS_Core_Folder $object document or folder
* to be indexed * to be indexed
@ -108,13 +186,14 @@ class SeedDMS_FulltextService {
$nocontent = $object->getLatestContent()->getFileSize() > $this->maxsize && $this->maxsize && !$forceupdate; $nocontent = $object->getLatestContent()->getFileSize() > $this->maxsize && $this->maxsize && !$forceupdate;
else else
$nocontent = true; $nocontent = true;
return new $this->services[0]['IndexedDocument']($object->getDMS(), $object, $this->conversionmgr ? $this->conversionmgr : $this->converters, $nocontent, $this->cmdtimeout); $convcallback = $this->getConversionWithPreviewCallback();
return new $this->services[0]['IndexedDocument']($object->getDMS(), $object, $convcallback /*$this->conversionmgr ? $this->conversionmgr : $this->converters*/, $nocontent, $this->cmdtimeout);
} }
/** /**
* Returns an instance of the indexer * Returns an instance of the indexer
* *
* The indexer provides access to fulltext index. It allows to add and * The indexer provides access to the fulltext index. It allows to add and
* get documents. * get documents.
* *
* @return object instance of class specified in 'Indexer' * @return object instance of class specified in 'Indexer'

View File

@ -24,6 +24,15 @@ require_once "inc.ClassAuthentication.php";
*/ */
class SeedDMS_LdapAuthentication extends SeedDMS_Authentication { class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
var $dms;
var $settings;
public function __construct($dms, $settings) { /* {{{ */
$this->dms = $dms;
$this->settings = $settings;
} /* }}} */
/** /**
* Do ldap authentication * Do ldap authentication
* *
@ -84,7 +93,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
$bind = @ldap_bind($ds); $bind = @ldap_bind($ds);
} }
$dn = false; $dn = false;
/* If bind succeed, then get the dn of for the user */ /* If bind succeed, then get the dn of the user */
if ($bind) { if ($bind) {
if (isset($settings->_ldapFilter) && strlen($settings->_ldapFilter) > 0) { if (isset($settings->_ldapFilter) && strlen($settings->_ldapFilter) > 0) {
$search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")"); $search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")");
@ -106,7 +115,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
$dn = $tmpDN; $dn = $tmpDN;
} }
/* No do the actual authentication of the user */ /* Now do the actual authentication of the user */
$bind = @ldap_bind($ds, $dn, $password); $bind = @ldap_bind($ds, $dn, $password);
$user = $dms->getUserByLogin($username); $user = $dms->getUserByLogin($username);
if($user === false) { if($user === false) {
@ -134,17 +143,6 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
} }
} }
} elseif($user) { } elseif($user) {
$userid = $user->getID();
$failures = $user->addLoginFailure();
if($settings->_loginFailure) {
if($failures >= $settings->_loginFailure)
$user->setDisabled(true);
}
if($settings->_loginDelay) {
if($failures > 1) {
$user->setDisabledUntil(($failures-1)*($failures-1)*3);
}
}
$user = false; $user = false;
} }
ldap_close($ds); ldap_close($ds);

View File

@ -5,19 +5,19 @@ $conversionmgr = new SeedDMS_ConversionMgr();
if(!empty($settings->_converters['preview'])) { if(!empty($settings->_converters['preview'])) {
foreach($settings->_converters['preview'] as $mimetype=>$cmd) { foreach($settings->_converters['preview'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'image/png', $cmd))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'image/png', $cmd), $settings->_cmdTimeout)->setLogger($logger);
} }
} }
if(!empty($settings->_converters['pdf'])) { if(!empty($settings->_converters['pdf'])) {
foreach($settings->_converters['pdf'] as $mimetype=>$cmd) { foreach($settings->_converters['pdf'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'application/pdf', $cmd))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'application/pdf', $cmd, $settings->_cmdTimeout))->setLogger($logger);
} }
} }
if(!empty($settings->_converters['fulltext'])) { if(!empty($settings->_converters['fulltext'])) {
foreach($settings->_converters['fulltext'] as $mimetype=>$cmd) { foreach($settings->_converters['fulltext'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'text/plain', $cmd))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'text/plain', $cmd, $settings->_cmdTimeout))->setLogger($logger);
} }
} }
@ -34,6 +34,10 @@ if(extension_loaded('gd') || extension_loaded('imagick')) {
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToImage('image/gif', 'image/png'))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceImageToImage('image/gif', 'image/png'))->setLogger($logger);
} }
if(extension_loaded('imagick')) {
$conversionmgr->addService(new SeedDMS_ConversionServiceTextToImage('text/plain', 'image/png'))->setLogger($logger);
}
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToText('image/jpeg', 'text/plain'))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceImageToText('image/jpeg', 'text/plain'))->setLogger($logger);
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToText('image/jpg', 'text/plain'))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceImageToText('image/jpg', 'text/plain'))->setLogger($logger);

View File

@ -21,7 +21,7 @@
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) { if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDB'] as $hookObj) { foreach($GLOBALS['SEEDDMS_HOOKS']['initDB'] as $hookObj) {
if (method_exists($hookObj, 'pretInitDB')) { if (method_exists($hookObj, 'pretInitDB')) {
$hookObj->preInitDB(array('settings'=>$settings)); $hookObj->preInitDB(array('settings'=>$settings, 'logger'=>$logger));
} }
} }
} }
@ -32,7 +32,7 @@ $db->connect() or die ("Could not connect to db-server \"" . $settings->_dbHostn
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) { if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDB'] as $hookObj) { foreach($GLOBALS['SEEDDMS_HOOKS']['initDB'] as $hookObj) {
if (method_exists($hookObj, 'postInitDB')) { if (method_exists($hookObj, 'postInitDB')) {
$hookObj->postInitDB(array('db'=>$db, 'settings'=>$settings)); $hookObj->postInitDB(array('db'=>$db, 'settings'=>$settings, 'logger'=>$logger));
} }
} }
} }
@ -40,7 +40,7 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) {
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) { if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) { foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
if (method_exists($hookObj, 'pretInitDMS')) { if (method_exists($hookObj, 'pretInitDMS')) {
$hookObj->preInitDMS(array('db'=>$db, 'settings'=>$settings)); $hookObj->preInitDMS(array('db'=>$db, 'settings'=>$settings, 'logger'=>$logger));
} }
} }
} }
@ -61,7 +61,7 @@ $dms->setMaxDirID($settings->_maxDirID);
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) { if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) { foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
if (method_exists($hookObj, 'postInitDMS')) { if (method_exists($hookObj, 'postInitDMS')) {
$hookObj->postInitDMS(array('dms'=>$dms, 'settings'=>$settings)); $hookObj->postInitDMS(array('dms'=>$dms, 'settings'=>$settings, 'logger'=>$logger));
} }
} }
} }
@ -69,3 +69,8 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
require_once('inc/inc.Tasks.php'); require_once('inc/inc.Tasks.php');
require_once("inc.ConversionInit.php"); require_once("inc.ConversionInit.php");
require_once('inc.FulltextInit.php'); require_once('inc.FulltextInit.php');
require_once('inc.AuthenticationInit.php');
require_once("inc.ClassNotificationService.php");
require_once("inc.ClassEmailNotify.php");
require_once('inc.Notification.php');

View File

@ -16,8 +16,6 @@ global $logger;
require "inc.ClassExtensionMgr.php"; require "inc.ClassExtensionMgr.php";
require_once "inc.ClassSchedulerTaskBase.php"; require_once "inc.ClassSchedulerTaskBase.php";
require_once "inc.ClassExtBase.php"; require_once "inc.ClassExtBase.php";
require_once "inc.Version.php";
require_once "inc.Utils.php";
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword); $extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);

View File

@ -33,8 +33,10 @@ if($settings->_enableFullSearch) {
$indexconf = null; $indexconf = null;
if(isset($GLOBALS['SEEDDMS_HOOKS']['initFulltext'])) { if(isset($GLOBALS['SEEDDMS_HOOKS']['initFulltext'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initFulltext'] as $hookObj) { foreach($GLOBALS['SEEDDMS_HOOKS']['initFulltext'] as $hookObj) {
if (method_exists($hookObj, 'initFulltextService')) { if (method_exists($hookObj, 'isFulltextService') && $hookObj->isFulltextService($settings->_fullSearchEngine)) {
$indexconf = $hookObj->initFulltextService(array('engine'=>$settings->_fullSearchEngine, 'dms'=>$dms, 'settings'=>$settings)); if (method_exists($hookObj, 'initFulltextService')) {
$indexconf = $hookObj->initFulltextService(array('engine'=>$settings->_fullSearchEngine, 'dms'=>$dms, 'settings'=>$settings));
}
} }
} }
} }
@ -42,9 +44,15 @@ if($settings->_enableFullSearch) {
$fulltextservice->addService($settings->_fullSearchEngine, $indexconf); $fulltextservice->addService($settings->_fullSearchEngine, $indexconf);
} }
} }
/* setConverters() is deprecated */
$fulltextservice->setConverters(isset($settings->_converters['fulltext']) ? $settings->_converters['fulltext'] : null); $fulltextservice->setConverters(isset($settings->_converters['fulltext']) ? $settings->_converters['fulltext'] : null);
$fulltextservice->setConversionMgr($conversionmgr); $fulltextservice->setConversionMgr($conversionmgr);
$fulltextservice->setMaxSize($settings->_maxSizeForFullText); $fulltextservice->setMaxSize($settings->_maxSizeForFullText);
$fulltextservice->setCmdTimeout($settings->_cmdTimeout); $fulltextservice->setCmdTimeout($settings->_cmdTimeout);
require_once("SeedDMS/Preview.php");
$txtpreviewer = new SeedDMS_Preview_TxtPreviewer($settings->_cacheDir, $settings->_cmdTimeout, $settings->_enableXsendfile);
if($conversionmgr)
$txtpreviewer->setConversionMgr($conversionmgr);
$fulltextservice->setPreviewer($txtpreviewer);
} }

View File

@ -19,18 +19,7 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("Log.php"); include("Log.php");
require_once("inc/inc.Utils.php");
if ($settings->_logFileEnable) { $logger = getLogger();
if ($settings->_logFileRotation=="h") $logname=date("YmdH", time());
else if ($settings->_logFileRotation=="d") $logname=date("Ymd", time());
else $logname=date("Ym", time());
if(!file_exists($settings->_contentDir.'log'))
@mkdir($settings->_contentDir.'log');
if(file_exists($settings->_contentDir.'log') && is_dir($settings->_contentDir.'log'))
$logger = Log::factory('file', $settings->_contentDir.'log/'.$logname.'.log');
else
$logger = null;
} else {
$logger = null;
}

View File

@ -83,3 +83,5 @@ ini_set('include_path', $settings->_rootDir.'../pear'. PATH_SEPARATOR .ini_get('
/* composer is installed in pear directory, but install tool does not need it */ /* composer is installed in pear directory, but install tool does not need it */
if(!defined("SEEDDMS_INSTALL")) if(!defined("SEEDDMS_INSTALL"))
require_once 'vendor/autoload.php'; require_once 'vendor/autoload.php';
require_once "inc.Version.php";

View File

@ -125,17 +125,33 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
protected $fulltextservice; protected $fulltextservice;
public function __construct($scheduler, $fulltextservice, $forceupdate) { /* {{{ */ protected $logger;
protected $dacount;
protected $facount;
protected $ducount;
protected $fucount;
public function __construct($scheduler, $fulltextservice, $forceupdate, $logger) { /* {{{ */
$this->scheduler = $scheduler; $this->scheduler = $scheduler;
$this->fulltextservice = $fulltextservice; $this->fulltextservice = $fulltextservice;
$this->logger = $logger;
$this->forceupdate = $forceupdate; $this->forceupdate = $forceupdate;
$this->numdocs = $this->fulltextservice->Indexer()->count(); $this->numdocs = $this->fulltextservice->Indexer()->count();
$this->dacount = 0;
$this->facount = 0;
$this->ducount = 0;
$this->fucount = 0;
} /* }}} */ } /* }}} */
public function process($folder, $depth=0) { /* {{{ */ public function process($folder, $depth=0) { /* {{{ */
$lucenesearch = $this->fulltextservice->Search(); $lucenesearch = $this->fulltextservice->Search();
$documents = $folder->getDocuments(); $documents = $folder->getDocuments();
echo str_repeat(' ', $depth+1).$folder->getId().":".$folder->getFolderPathPlain()." "; $logger = $this->logger;
// echo str_repeat(' ', $depth+1).$folder->getId().":".$folder->getFolderPathPlain()." ";
if(($this->numdocs == 0) || !($hit = $lucenesearch->getFolder($folder->getId()))) { if(($this->numdocs == 0) || !($hit = $lucenesearch->getFolder($folder->getId()))) {
try { try {
$idoc = $this->fulltextservice->IndexedDocument($folder, true); $idoc = $this->fulltextservice->IndexedDocument($folder, true);
@ -149,26 +165,30 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
} }
} }
$this->fulltextservice->Indexer()->addDocument($idoc); $this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_folder_added').")".PHP_EOL; // echo "(".getMLText('index_folder_added').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': folder '.$folder->getId().' added', PEAR_LOG_INFO);
$this->facount++;
} else { } else {
echo "(".$error.")".PHP_EOL; // echo "(".$error.")".PHP_EOL;
$logger->log('Task \'indexingdocs\': adding folder '.$folder->getId().' failed', PEAR_LOG_ERR);
} }
} catch(Exception $e) { } catch(Exception $e) {
echo "(Timeout)".PHP_EOL; // echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': adding folder '.$folder->getId().' failed', PEAR_LOG_ERR);
} }
} else { } else {
/* Check if the attribute created is set or has a value older /* Check if the attribute indexed is set or has a value older
* than the lastet content. Folders without such an attribute * than the lastet content. Folders without such an attribute
* where added when a new folder was added to the dms. In such * where added when a new folder was added to the dms. In such
* a case the folder content wasn't indexed. * a case the folder content wasn't indexed.
*/ */
try { try {
$created = (int) $hit->getDocument()->getFieldValue('created'); $indexed = (int) $hit->getDocument()->getFieldValue('indexed');
} catch (/* Zend_Search_Lucene_ */Exception $e) { } catch (/* Zend_Search_Lucene_ */Exception $e) {
$created = 0; $indexed = 0;
} }
if($created >= $folder->getDate() && !$this->forceupdate) { if($indexed >= $folder->getDate() && !$this->forceupdate) {
echo "(".getMLText('index_folder_unchanged').")".PHP_EOL; // echo "(".getMLText('index_folder_unchanged').")".PHP_EOL;
} else { } else {
$this->fulltextservice->Indexer()->delete($hit->id); $this->fulltextservice->Indexer()->delete($hit->id);
try { try {
@ -183,18 +203,22 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
} }
} }
$this->fulltextservice->Indexer()->addDocument($idoc); $this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_folder_updated').")".PHP_EOL; // echo "(".getMLText('index_folder_updated').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': folder '.$folder->getId().' updated', PEAR_LOG_INFO);
$this->fucount++;
} else { } else {
echo "(".$error.")".PHP_EOL; // echo "(".$error.")".PHP_EOL;
$logger->log('Task \'indexingdocs\': updating folder '.$folder->getId().' failed', PEAR_LOG_ERR);
} }
} catch(Exception $e) { } catch(Exception $e) {
echo "(Timeout)".PHP_EOL; // echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': updating folder '.$folder->getId().' failed. '.$e->getMessage(), PEAR_LOG_ERR);
} }
} }
} }
if($documents) { if($documents) {
foreach($documents as $document) { foreach($documents as $document) {
echo str_repeat(' ', $depth+2).$document->getId().":".$document->getName()." "; // echo str_repeat(' ', $depth+2).$document->getId().":".$document->getName()." ";
/* If the document wasn't indexed before then just add it */ /* If the document wasn't indexed before then just add it */
if(($this->numdocs == 0) || !($hit = $lucenesearch->getDocument($document->getId()))) { if(($this->numdocs == 0) || !($hit = $lucenesearch->getDocument($document->getId()))) {
try { try {
@ -206,46 +230,67 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
} }
} }
} }
$this->fulltextservice->Indexer()->addDocument($idoc); if($this->fulltextservice->Indexer()->addDocument($idoc)) {
echo "(".getMLText('index_document_added').")".PHP_EOL; // echo "(".getMLText('index_document_added').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': document '.$document->getId().' added', PEAR_LOG_INFO);
} else {
$logger->log('Task \'indexingdocs\': adding document '.$document->getId().' failed', PEAR_LOG_ERR);
}
$this->dacount++;
} catch(Exception $e) { } catch(Exception $e) {
echo "(Timeout)".PHP_EOL; // echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': adding document '.$document->getId().' failed. '.$e->getMessage(), PEAR_LOG_ERR);
} }
} else { } else {
/* Check if the attribute created is set or has a value older /* Check if the attribute indexed is set or has a value older
* than the lastet content. Documents without such an attribute * than the lastet content. Documents without such an attribute
* where added when a new document was added to the dms. In such * where added when a new document was added to the dms. In such
* a case the document content wasn't indexed. * a case the document content wasn't indexed.
*/ */
try { try {
$created = (int) $hit->getDocument()->getFieldValue('created'); $indexed = (int) $hit->getDocument()->getFieldValue('indexed');
} catch (/* Zend_Search_Lucene_ */Exception $e) { } catch (/* Zend_Search_Lucene_ */Exception $e) {
$created = 0; $indexed = 0;
} }
$content = $document->getLatestContent(); $content = $document->getLatestContent();
if($created >= $content->getDate() && !$this->forceupdate) { if($content) {
echo "(".getMLText('index_document_unchanged').")".PHP_EOL; if($indexed >= $content->getDate() && !$this->forceupdate) {
} else { // echo "(".getMLText('index_document_unchanged').")".PHP_EOL;
$this->fulltextservice->Indexer()->delete($hit->id); } else {
try { $this->fulltextservice->Indexer()->delete($hit->id);
$idoc = $this->fulltextservice->IndexedDocument($document, true); try {
if(isset($GLOBALS['SEEDDMS_HOOKS']['indexDocument'])) { $idoc = $this->fulltextservice->IndexedDocument($document, true);
foreach($GLOBALS['SEEDDMS_HOOKS']['indexDocument'] as $hookObj) { if(isset($GLOBALS['SEEDDMS_HOOKS']['indexDocument'])) {
if (method_exists($hookObj, 'preIndexDocument')) { foreach($GLOBALS['SEEDDMS_HOOKS']['indexDocument'] as $hookObj) {
$hookObj->preIndexDocument(null, $document, $idoc); if (method_exists($hookObj, 'preIndexDocument')) {
$hookObj->preIndexDocument(null, $document, $idoc);
}
} }
} }
if($this->fulltextservice->Indexer()->addDocument($idoc)) {
// echo "(".getMLText('index_document_updated').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': document '.$document->getId().' updated', PEAR_LOG_INFO);
} else {
$logger->log('Task \'indexingdocs\': updating document '.$document->getId().' failed', PEAR_LOG_ERR);
}
$this->ducount++;
} catch(Exception $e) {
// echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': updating document '.$document->getId().' failed', PEAR_LOG_ERR);
} }
$this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_document_updated').")".PHP_EOL;
} catch(Exception $e) {
echo "(Timeout)".PHP_EOL;
} }
} else {
// echo "(Missing content)".PHP_EOL;
$logger->log('Task \'indexingdocs\': document '.$document->getId().' misses content', PEAR_LOG_ERR);
} }
} }
} }
} }
} /* }}} */ } /* }}} */
public function statistics() {
return array('folder'=>array('add'=>$this->facount, 'update'=>$this->fucount), 'document'=>array('add'=>$this->dacount, 'update'=>$this->ducount));
}
} /* }}} */ } /* }}} */
/** /**
@ -287,9 +332,11 @@ class SeedDMS_IndexingDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ *
} }
} }
$folderprocess = new SeedDMS_Task_Indexer_Process_Folder($this, $fulltextservice, $recreate); $folderprocess = new SeedDMS_Task_Indexer_Process_Folder($this, $fulltextservice, $recreate, $logger);
call_user_func(array($folderprocess, 'process'), $folder, -1); call_user_func(array($folderprocess, 'process'), $folder, -1);
$tree = new SeedDMS_FolderTree($folder, array($folderprocess, 'process')); $tree = new SeedDMS_FolderTree($folder, array($folderprocess, 'process'));
$stat = $folderprocess->statistics();
$logger->log('Task \'indexingdocs\': '.$stat['folder']['add'].' folders added, '.$stat['folder']['update'].' folders updated, '.$stat['document']['add'].' documents added, '.$stat['document']['update'].' documents updated', PEAR_LOG_INFO);
} else { } else {
$logger->log('Task \'indexingdocs\': fulltext search is turned off', PEAR_LOG_WARNING); $logger->log('Task \'indexingdocs\': fulltext search is turned off', PEAR_LOG_WARNING);
} }

View File

@ -395,7 +395,7 @@ function getFilenameByDocname($content) { /* {{{ */
return mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $filename); return mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $filename);
} /* }}} */ } /* }}} */
function getLogger($prefix='') { /* {{{ */ function getLogger($prefix='', $mask=PEAR_LOG_INFO) { /* {{{ */
global $settings; global $settings;
if($settings->_logFileEnable) { if($settings->_logFileEnable) {
@ -407,7 +407,7 @@ function getLogger($prefix='') { /* {{{ */
@mkdir($settings->_contentDir.'log'); @mkdir($settings->_contentDir.'log');
if(file_exists($settings->_contentDir.'log') && is_dir($settings->_contentDir.'log')) { if(file_exists($settings->_contentDir.'log') && is_dir($settings->_contentDir.'log')) {
$logger = Log::factory('file', $logname); $logger = Log::factory('file', $logname);
$logger->setMask(Log::MAX(PEAR_LOG_DEBUG)); $logger->setMask(Log::MAX($mask));
} else } else
$logger = null; $logger = null;
} else { } else {
@ -1142,7 +1142,7 @@ class SeedDMS_JwtToken { /* {{{ */
class SeedDMS_FolderTree { /* {{{ */ class SeedDMS_FolderTree { /* {{{ */
public function __construct($folder, $callback) { /* {{{ */ public function __construct($folder, $callback) { /* {{{ */
$iter = new \SeedDMS\RecursiveFolderIterator($folder); $iter = new \SeedDMS\Core\RecursiveFolderIterator($folder);
$iter2 = new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST); $iter2 = new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST);
foreach($iter2 as $ff) { foreach($iter2 as $ff) {
call_user_func($callback, $ff, $iter2->getDepth()); call_user_func($callback, $ff, $iter2->getDepth());

View File

@ -20,12 +20,12 @@
include("inc/inc.Settings.php"); include("inc/inc.Settings.php");
if(true) { if(true) {
include("inc/inc.LogInit.php"); require_once("inc/inc.Utils.php");
include("inc/inc.Utils.php"); require_once("inc/inc.LogInit.php");
include("inc/inc.Language.php"); require_once("inc/inc.Language.php");
include("inc/inc.Init.php"); require_once("inc/inc.Init.php");
include("inc/inc.Extension.php"); require_once("inc/inc.Extension.php");
include("inc/inc.DBInit.php"); require_once("inc/inc.DBInit.php");
require "vendor/autoload.php"; require "vendor/autoload.php";
@ -53,11 +53,19 @@ if(true) {
}; };
}; };
$app = new \Slim\App($c); $app = new \Slim\App($c);
$container = $app->getContainer();
$container['dms'] = $dms;
$container['config'] = $settings;
$container['conversionmgr'] = $conversionmgr;
$container['logger'] = $logger;
$container['fulltextservice'] = $fulltextservice;
$container['notifier'] = $notifier;
$container['authenticator'] = $authenticator;
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) { if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) { foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
if (method_exists($hookObj, 'addRoute')) { if (method_exists($hookObj, 'addRoute')) {
$hookObj->addRoute(array('dms'=>$dms, 'app'=>$app, 'settings'=>$settings)); $hookObj->addRoute(array('dms'=>$dms, 'app'=>$app, 'settings'=>$settings, 'conversionmgr'=>$conversionmgr, 'authenticator'=>$authenticator, 'fulltextservice'=>$fulltextservice, 'logger'=>$logger));
// } else { // } else {
// include("inc/inc.Authentication.php"); // include("inc/inc.Authentication.php");
// if (method_exists($hookObj, 'addRouteAfterAuthentication')) { // if (method_exists($hookObj, 'addRouteAfterAuthentication')) {

View File

@ -514,6 +514,7 @@ URL: [url]',
'dump_remove' => 'ازالة الملف المستخرج', 'dump_remove' => 'ازالة الملف المستخرج',
'duplicates' => 'تكرارات', 'duplicates' => 'تكرارات',
'duplicate_content' => 'المحتوى متكرر', 'duplicate_content' => 'المحتوى متكرر',
'duplicate_sequences' => '',
'edit' => 'تعديل', 'edit' => 'تعديل',
'edit_attributes' => 'تعديل السمات', 'edit_attributes' => 'تعديل السمات',
'edit_comment' => 'تعديل تعليق', 'edit_comment' => 'تعديل تعليق',
@ -620,6 +621,7 @@ URL: [url]',
'extension_mgr_repository' => 'مستودع إدارة الإضافات', 'extension_mgr_repository' => 'مستودع إدارة الإضافات',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'لائحة الإضافات حسب الإصدار', 'extension_version_list' => 'لائحة الإضافات حسب الإصدار',
'february' => 'فبراير', 'february' => 'فبراير',
@ -753,6 +755,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'فهرسة بلا محتوى', 'index_no_content' => 'فهرسة بلا محتوى',
'index_pending' => 'الفهرسة قيد الإنتظار', 'index_pending' => 'الفهرسة قيد الإنتظار',
'index_processing' => '',
'index_waiting' => 'الفهرسة قيد الإنتظار', 'index_waiting' => 'الفهرسة قيد الإنتظار',
'individuals' => 'افراد', 'individuals' => 'افراد',
'individuals_in_groups' => 'أفراد في المجموعات', 'individuals_in_groups' => 'أفراد في المجموعات',
@ -903,6 +906,7 @@ URL: [url]',
'move_clipboard' => 'تحريك القصاصة', 'move_clipboard' => 'تحريك القصاصة',
'move_document' => 'تحريك مستند', 'move_document' => 'تحريك مستند',
'move_folder' => 'تحريك مجلد', 'move_folder' => 'تحريك مجلد',
'move_into_rootfolder' => '',
'my_account' => 'حسابي', 'my_account' => 'حسابي',
'my_documents' => 'مستنداتي', 'my_documents' => 'مستنداتي',
'my_transmittals' => 'الإحالات الخاصة بي', 'my_transmittals' => 'الإحالات الخاصة بي',
@ -1045,6 +1049,7 @@ Parent folder: [folder_path]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - تم تغيير المالك', 'ownership_changed_email_subject' => '[sitename]: [name] - تم تغيير المالك',
'parent_folder' => '',
'password' => 'كلمة السر', 'password' => 'كلمة السر',
'password_already_used' => 'كلمة السر بالفعل تم ارسالها', 'password_already_used' => 'كلمة السر بالفعل تم ارسالها',
'password_expiration' => 'انتهاء صلاحية كلمة السر', 'password_expiration' => 'انتهاء صلاحية كلمة السر',
@ -1082,6 +1087,7 @@ URL: [url]',
'preview' => 'معاينة', 'preview' => 'معاينة',
'preview_converters' => 'محول المعاينات', 'preview_converters' => 'محول المعاينات',
'preview_images' => 'معاينة الصور', 'preview_images' => 'معاينة الصور',
'preview_images_text' => '',
'preview_markdown' => 'معاينة التخفيضات', 'preview_markdown' => 'معاينة التخفيضات',
'preview_pdf' => 'معاينة ملف pdf', 'preview_pdf' => 'معاينة ملف pdf',
'preview_plain' => 'معاينة سطحية', 'preview_plain' => 'معاينة سطحية',
@ -1094,6 +1100,7 @@ URL: [url]',
'quota_exceeded' => 'لقد قمت بتعدي المساحة المخصصة لك بمقدار [bytes].', 'quota_exceeded' => 'لقد قمت بتعدي المساحة المخصصة لك بمقدار [bytes].',
'quota_is_disabled' => 'الغيت الكوتا', 'quota_is_disabled' => 'الغيت الكوتا',
'quota_warning' => 'اقصى مساحة للقرص الصلب تم تعديها بمقدار [bytes]. من فضلك قم بمسح بعض المستندات او اصدارات سابقة منها', 'quota_warning' => 'اقصى مساحة للقرص الصلب تم تعديها بمقدار [bytes]. من فضلك قم بمسح بعض المستندات او اصدارات سابقة منها',
'readme_loading' => '',
'receipts_accepted' => 'تم الموافقة على الوصول', 'receipts_accepted' => 'تم الموافقة على الوصول',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => 'الوصول غير ملموسة', 'receipts_not_touched' => 'الوصول غير ملموسة',
@ -1779,6 +1786,7 @@ URL: [url]',
'set_password' => 'تحديد كلمة السر', 'set_password' => 'تحديد كلمة السر',
'set_workflow' => 'تحديد مسار العمل', 'set_workflow' => 'تحديد مسار العمل',
'show_extension_changelog' => 'تغيير سجل', 'show_extension_changelog' => 'تغيير سجل',
'show_extension_readme' => '',
'show_extension_version_list' => 'لائحة الإصدارات', 'show_extension_version_list' => 'لائحة الإصدارات',
'signed_in_as' => 'تسجيل الدخول بإسم', 'signed_in_as' => 'تسجيل الدخول بإسم',
'sign_in' => 'تسجيل الدخول', 'sign_in' => 'تسجيل الدخول',
@ -2042,6 +2050,7 @@ URL: [url]',
'update_approvers' => 'تحديثة قائمة الموافقون', 'update_approvers' => 'تحديثة قائمة الموافقون',
'update_document' => 'تحديث المستند', 'update_document' => 'تحديث المستند',
'update_fulltext_index' => 'تحديث فهرس النص الكامل', 'update_fulltext_index' => 'تحديث فهرس النص الكامل',
'update_fulltext_messages' => '',
'update_info' => 'تحديث المعلومات', 'update_info' => 'تحديث المعلومات',
'update_locked_msg' => 'هذا المستند محمي من التعديل.', 'update_locked_msg' => 'هذا المستند محمي من التعديل.',
'update_recipients' => 'تطوير المستلم', 'update_recipients' => 'تطوير المستلم',

View File

@ -467,6 +467,7 @@ $text = array(
'dump_remove' => 'Изтрий дъмп', 'dump_remove' => 'Изтрий дъмп',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => '', 'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Редактирай', 'edit' => 'Редактирай',
'edit_attributes' => 'Редактирай атрибути', 'edit_attributes' => 'Редактирай атрибути',
'edit_comment' => 'Редактирай коментар', 'edit_comment' => 'Редактирай коментар',
@ -569,6 +570,7 @@ $text = array(
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => 'Февруари', 'february' => 'Февруари',
@ -682,6 +684,7 @@ $text = array(
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => '', 'index_waiting' => '',
'individuals' => 'Личности', 'individuals' => 'Личности',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -832,6 +835,7 @@ $text = array(
'move_clipboard' => '', 'move_clipboard' => '',
'move_document' => 'Премести документ', 'move_document' => 'Премести документ',
'move_folder' => 'Премести папка', 'move_folder' => 'Премести папка',
'move_into_rootfolder' => '',
'my_account' => 'Моя акаунт', 'my_account' => 'Моя акаунт',
'my_documents' => 'Моите документи', 'my_documents' => 'Моите документи',
'my_transmittals' => 'Моите предавания', 'my_transmittals' => 'Моите предавания',
@ -944,6 +948,7 @@ $text = array(
'ownership_changed_email_body' => '', 'ownership_changed_email_body' => '',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '', 'ownership_changed_email_subject' => '',
'parent_folder' => '',
'password' => 'Парола', 'password' => 'Парола',
'password_already_used' => 'Вече използвана парола', 'password_already_used' => 'Вече използвана парола',
'password_expiration' => 'Паролата изтича', 'password_expiration' => 'Паролата изтича',
@ -981,6 +986,7 @@ $text = array(
'preview' => 'Преглед', 'preview' => 'Преглед',
'preview_converters' => '', 'preview_converters' => '',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -993,6 +999,7 @@ $text = array(
'quota_exceeded' => 'Вашата дискова квота е превишена с [bytes].', 'quota_exceeded' => 'Вашата дискова квота е превишена с [bytes].',
'quota_is_disabled' => '', 'quota_is_disabled' => '',
'quota_warning' => 'Вашето max. използуване на диска е превишена с [bytes]. Please remove documents or previous versions.', 'quota_warning' => 'Вашето max. използуване на диска е превишена с [bytes]. Please remove documents or previous versions.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1642,6 +1649,7 @@ $text = array(
'set_password' => 'Установи парола', 'set_password' => 'Установи парола',
'set_workflow' => 'Установи процес', 'set_workflow' => 'Установи процес',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Вход като', 'signed_in_as' => 'Вход като',
'sign_in' => 'вход', 'sign_in' => 'вход',
@ -1896,6 +1904,7 @@ $text = array(
'update_approvers' => 'Обнови списъка с утвърждаващи', 'update_approvers' => 'Обнови списъка с утвърждаващи',
'update_document' => 'Обнови документ', 'update_document' => 'Обнови документ',
'update_fulltext_index' => 'Обнови пълнотекстовия индекс', 'update_fulltext_index' => 'Обнови пълнотекстовия индекс',
'update_fulltext_messages' => '',
'update_info' => 'Обнови информацията', 'update_info' => 'Обнови информацията',
'update_locked_msg' => 'Този документ е блокиран', 'update_locked_msg' => 'Този документ е блокиран',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -472,6 +472,7 @@ URL: [url]',
'dump_remove' => 'Eliminar fitxer de bolcat', 'dump_remove' => 'Eliminar fitxer de bolcat',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => '', 'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'editar', 'edit' => 'editar',
'edit_attributes' => 'Editar atributs', 'edit_attributes' => 'Editar atributs',
'edit_comment' => 'Editar comentari', 'edit_comment' => 'Editar comentari',
@ -574,6 +575,7 @@ URL: [url]',
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => 'Febrer', 'february' => 'Febrer',
@ -687,6 +689,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => '', 'index_waiting' => '',
'individuals' => 'Individuals', 'individuals' => 'Individuals',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -837,6 +840,7 @@ URL: [url]',
'move_clipboard' => '', 'move_clipboard' => '',
'move_document' => 'Moure document', 'move_document' => 'Moure document',
'move_folder' => 'Moure directori', 'move_folder' => 'Moure directori',
'move_into_rootfolder' => '',
'my_account' => 'El meu compte', 'my_account' => 'El meu compte',
'my_documents' => 'Els meus documents', 'my_documents' => 'Els meus documents',
'my_transmittals' => 'Documents enviats per mi', 'my_transmittals' => 'Documents enviats per mi',
@ -949,6 +953,7 @@ URL: [url]',
'ownership_changed_email_body' => '', 'ownership_changed_email_body' => '',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '', 'ownership_changed_email_subject' => '',
'parent_folder' => '',
'password' => 'Contrasenya', 'password' => 'Contrasenya',
'password_already_used' => '', 'password_already_used' => '',
'password_expiration' => '', 'password_expiration' => '',
@ -986,6 +991,7 @@ URL: [url]',
'preview' => 'Previsualitzar', 'preview' => 'Previsualitzar',
'preview_converters' => '', 'preview_converters' => '',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -998,6 +1004,7 @@ URL: [url]',
'quota_exceeded' => '', 'quota_exceeded' => '',
'quota_is_disabled' => '', 'quota_is_disabled' => '',
'quota_warning' => '', 'quota_warning' => '',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1647,6 +1654,7 @@ URL: [url]',
'set_password' => '', 'set_password' => '',
'set_workflow' => '', 'set_workflow' => '',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Connectat com', 'signed_in_as' => 'Connectat com',
'sign_in' => 'sign in', 'sign_in' => 'sign in',
@ -1901,6 +1909,7 @@ URL: [url]',
'update_approvers' => 'Actualitzar llista d\'aprovadors', 'update_approvers' => 'Actualitzar llista d\'aprovadors',
'update_document' => 'Actualitzar', 'update_document' => 'Actualitzar',
'update_fulltext_index' => 'Update fulltext index', 'update_fulltext_index' => 'Update fulltext index',
'update_fulltext_messages' => '',
'update_info' => 'Actualitzar informació', 'update_info' => 'Actualitzar informació',
'update_locked_msg' => 'Aquest document està bloquejat.', 'update_locked_msg' => 'Aquest document està bloquejat.',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Odstranit soubor zálohy', 'dump_remove' => 'Odstranit soubor zálohy',
'duplicates' => 'Duplikáty', 'duplicates' => 'Duplikáty',
'duplicate_content' => 'Duplicitní obsah', 'duplicate_content' => 'Duplicitní obsah',
'duplicate_sequences' => '',
'edit' => 'upravit', 'edit' => 'upravit',
'edit_attributes' => 'Editovat atributy', 'edit_attributes' => 'Editovat atributy',
'edit_comment' => 'Upravit komentář', 'edit_comment' => 'Upravit komentář',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Dostupný', 'extension_mgr_repository' => 'Dostupný',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Verze', 'extension_version_list' => 'Verze',
'february' => 'Únor', 'february' => 'Únor',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Nenaindexoval se obsah', 'index_no_content' => 'Nenaindexoval se obsah',
'index_pending' => 'Probíhá indexování', 'index_pending' => 'Probíhá indexování',
'index_processing' => '',
'index_waiting' => 'Čekání', 'index_waiting' => 'Čekání',
'individuals' => 'Jednotlivci', 'individuals' => 'Jednotlivci',
'individuals_in_groups' => 'Členové skupiny', 'individuals_in_groups' => 'Členové skupiny',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Přesun schránky', 'move_clipboard' => 'Přesun schránky',
'move_document' => 'Přesunout dokument', 'move_document' => 'Přesunout dokument',
'move_folder' => 'Přesun složky', 'move_folder' => 'Přesun složky',
'move_into_rootfolder' => '',
'my_account' => 'Můj účet', 'my_account' => 'Můj účet',
'my_documents' => 'Moje dokumenty', 'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'Moje přenosy', 'my_transmittals' => 'Moje přenosy',
@ -1076,6 +1080,7 @@ Uživatel: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Vlastník změněn', 'ownership_changed_email_subject' => '[sitename]: [name] - Vlastník změněn',
'parent_folder' => '',
'password' => 'Heslo', 'password' => 'Heslo',
'password_already_used' => 'Heslo již použité', 'password_already_used' => 'Heslo již použité',
'password_expiration' => 'Vypršení platnosti hesla', 'password_expiration' => 'Vypršení platnosti hesla',
@ -1117,6 +1122,7 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm
'preview' => 'Náhled', 'preview' => 'Náhled',
'preview_converters' => 'Náhled převodu dokumentu', 'preview_converters' => 'Náhled převodu dokumentu',
'preview_images' => 'Náhled obrázků', 'preview_images' => 'Náhled obrázků',
'preview_images_text' => '',
'preview_markdown' => 'Náhled úpravy textu Markdown', 'preview_markdown' => 'Náhled úpravy textu Markdown',
'preview_pdf' => 'Náhled jako PDF', 'preview_pdf' => 'Náhled jako PDF',
'preview_plain' => 'Náhled jako text', 'preview_plain' => 'Náhled jako text',
@ -1129,6 +1135,7 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm
'quota_exceeded' => 'Vaše kvóta disku je překročena o [bytes].', 'quota_exceeded' => 'Vaše kvóta disku je překročena o [bytes].',
'quota_is_disabled' => 'Podpora kvót je v současné době zakázána v nastavení. Nastavení uživatelských kvót nebude mít žádný vliv, dokud se znovu neaktivuje.', 'quota_is_disabled' => 'Podpora kvót je v současné době zakázána v nastavení. Nastavení uživatelských kvót nebude mít žádný vliv, dokud se znovu neaktivuje.',
'quota_warning' => 'Vaše maximální využití disku je překročeno o [bajtů]. Prosím, odstraňte dokumenty nebo předchozí verze.', 'quota_warning' => 'Vaše maximální využití disku je překročeno o [bajtů]. Prosím, odstraňte dokumenty nebo předchozí verze.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] potvrzení přijetí již přijato', 'receipts_accepted' => '[no_receipts] potvrzení přijetí již přijato',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '[no_receipts] potvrzení přijetí nebylo dotčeno', 'receipts_not_touched' => '[no_receipts] potvrzení přijetí nebylo dotčeno',
@ -1851,6 +1858,7 @@ Jméno: [username]
'set_password' => 'Nastavení hesla', 'set_password' => 'Nastavení hesla',
'set_workflow' => 'Nastavit workflow', 'set_workflow' => 'Nastavit workflow',
'show_extension_changelog' => 'Zobrazit Changelog', 'show_extension_changelog' => 'Zobrazit Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Zobrazit seznam verzí', 'show_extension_version_list' => 'Zobrazit seznam verzí',
'signed_in_as' => 'Přihlášen jako', 'signed_in_as' => 'Přihlášen jako',
'sign_in' => 'Přihlásit', 'sign_in' => 'Přihlásit',
@ -2114,6 +2122,7 @@ URL: [url]',
'update_approvers' => 'Aktualizovat seznam schvalovatelů', 'update_approvers' => 'Aktualizovat seznam schvalovatelů',
'update_document' => 'Aktualizovat', 'update_document' => 'Aktualizovat',
'update_fulltext_index' => 'Aktualizovat fulltext index', 'update_fulltext_index' => 'Aktualizovat fulltext index',
'update_fulltext_messages' => '',
'update_info' => 'Aktualizovat informace', 'update_info' => 'Aktualizovat informace',
'update_locked_msg' => 'Tento dokument je zamčený.', 'update_locked_msg' => 'Tento dokument je zamčený.',
'update_recipients' => 'Aktualizovat příjemce', 'update_recipients' => 'Aktualizovat příjemce',

View File

@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
// Translators: Admin (3143), dgrutsch (22) // Translators: Admin (3154), dgrutsch (22)
$text = array( $text = array(
'2_factor_auth' => '2-Faktor Authentifizierung', '2_factor_auth' => '2-Faktor Authentifizierung',
@ -632,13 +632,14 @@ URL: [url]</p>',
'dropfolder_metadata' => 'Metadaten der zu importierenen Dateien', 'dropfolder_metadata' => 'Metadaten der zu importierenen Dateien',
'dropupload' => 'Direkt Hochladen', 'dropupload' => 'Direkt Hochladen',
'drop_files_here' => 'Dateien hier hin ziehen!', 'drop_files_here' => 'Dateien hier hin ziehen!',
'drop_files_here_or_click' => 'Dateien hier hin ziehen oder Klicken!', 'drop_files_here_or_click' => 'Dateien hier hin ziehen oder Klicken zum Hochladen!',
'dump_creation' => 'DB dump erzeugen', 'dump_creation' => 'DB dump erzeugen',
'dump_creation_warning' => 'Mit dieser Operation können Sie einen Dump der Datenbank erzeugen. Nach der Erstellung wird der Dump im Datenordner Ihres Servers gespeichert.', 'dump_creation_warning' => 'Mit dieser Operation können Sie einen Dump der Datenbank erzeugen. Nach der Erstellung wird der Dump im Datenordner Ihres Servers gespeichert.',
'dump_list' => 'Vorhandene DB dumps', 'dump_list' => 'Vorhandene DB dumps',
'dump_remove' => 'DB dump löschen', 'dump_remove' => 'DB dump löschen',
'duplicates' => 'Duplikate', 'duplicates' => 'Duplikate',
'duplicate_content' => 'Doppelte Dateien', 'duplicate_content' => 'Doppelte Dateien',
'duplicate_sequences' => 'Doppelte Sequenznummer in einem Ordner',
'edit' => 'Bearbeiten', 'edit' => 'Bearbeiten',
'edit_attributes' => 'Attribute bearbeiten', 'edit_attributes' => 'Attribute bearbeiten',
'edit_comment' => 'Kommentar bearbeiten', 'edit_comment' => 'Kommentar bearbeiten',
@ -751,6 +752,7 @@ URL: [url]</p>',
'extension_mgr_repository' => 'Verfügbar', 'extension_mgr_repository' => 'Verfügbar',
'extension_mgr_upload_disabled' => 'Der Upload neuer Erweiterungen ist nicht möglich, weil dies in den Einstellungen ausgeschaltet ist.', 'extension_mgr_upload_disabled' => 'Der Upload neuer Erweiterungen ist nicht möglich, weil dies in den Einstellungen ausgeschaltet ist.',
'extension_missing_name' => 'Kein Erweiterungsname übergeben', 'extension_missing_name' => 'Kein Erweiterungsname übergeben',
'extension_readme' => 'Readme',
'extension_toggle_error' => 'Konnte Erweiterung nicht aus/einschalten', 'extension_toggle_error' => 'Konnte Erweiterung nicht aus/einschalten',
'extension_version_list' => 'Versionen', 'extension_version_list' => 'Versionen',
'february' => 'Februar', 'february' => 'Februar',
@ -852,7 +854,7 @@ Old name: [old_name]<br />
Benutzer: [username]<br /> Benutzer: [username]<br />
URL: [url]</p>', URL: [url]</p>',
'folder_renamed_email_subject' => '[sitename]: [name] - Ordner umbenannt', 'folder_renamed_email_subject' => '[sitename]: [name] - Ordner umbenannt',
'folder_title' => 'SeedDMS - Ordner: [foldername]', 'folder_title' => 'Ordner: [foldername]',
'foot_note' => '', 'foot_note' => '',
'force_update' => 'Aktualisieren', 'force_update' => 'Aktualisieren',
'friday' => 'Freitag', 'friday' => 'Freitag',
@ -927,6 +929,7 @@ URL: [url]</p>',
'index_folder_updated' => 'Ordner aktualisiert', 'index_folder_updated' => 'Ordner aktualisiert',
'index_no_content' => 'Inhalt nicht indiziert', 'index_no_content' => 'Inhalt nicht indiziert',
'index_pending' => 'Vorgemerkt', 'index_pending' => 'Vorgemerkt',
'index_processing' => 'Verarbeite ...',
'index_waiting' => 'Warte', 'index_waiting' => 'Warte',
'individuals' => 'Einzelpersonen', 'individuals' => 'Einzelpersonen',
'individuals_in_groups' => 'Mitglieder einer Gruppe', 'individuals_in_groups' => 'Mitglieder einer Gruppe',
@ -1077,6 +1080,7 @@ URL: [url]</p>',
'move_clipboard' => 'Zwischenablage in Ordner verschieben', 'move_clipboard' => 'Zwischenablage in Ordner verschieben',
'move_document' => 'Verschieben', 'move_document' => 'Verschieben',
'move_folder' => 'Verschieben', 'move_folder' => 'Verschieben',
'move_into_rootfolder' => 'In den Wurzelordner verschieben',
'my_account' => 'Mein Profil', 'my_account' => 'Mein Profil',
'my_documents' => 'Meine Dokumente', 'my_documents' => 'Meine Dokumente',
'my_transmittals' => 'Meine Dokumentenlisten', 'my_transmittals' => 'Meine Dokumentenlisten',
@ -1256,6 +1260,7 @@ Neuer Besitzer: [new_owner]<br />
Benutzer: [username]<br /> Benutzer: [username]<br />
URL: [url]</p>', URL: [url]</p>',
'ownership_changed_email_subject' => '[sitename]: [name] - Besitzer geändert', 'ownership_changed_email_subject' => '[sitename]: [name] - Besitzer geändert',
'parent_folder' => 'Elternordner',
'password' => 'Passwort', 'password' => 'Passwort',
'password_already_used' => 'Passwort schon einmal verwendet', 'password_already_used' => 'Passwort schon einmal verwendet',
'password_expiration' => 'Ablauf eines Passworts', 'password_expiration' => 'Ablauf eines Passworts',
@ -1309,6 +1314,7 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren
'preview' => 'Vorschau', 'preview' => 'Vorschau',
'preview_converters' => 'Vorschau Dokumentenumwandlung', 'preview_converters' => 'Vorschau Dokumentenumwandlung',
'preview_images' => 'Vorschaubilder', 'preview_images' => 'Vorschaubilder',
'preview_images_text' => 'Vorschaubilder und Textinhalt',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => 'Vorschau als PDF', 'preview_pdf' => 'Vorschau als PDF',
'preview_plain' => 'Text', 'preview_plain' => 'Text',
@ -1321,6 +1327,7 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren
'quota_exceeded' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten.', 'quota_exceeded' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten.',
'quota_is_disabled' => 'Quota-Unterstützung ist zur Zeit ausgeschaltet. Benutzer-Quota werden ignoriert bis Quota-Unterstützung in den Einstellungen eingeschaltet wird.', 'quota_is_disabled' => 'Quota-Unterstützung ist zur Zeit ausgeschaltet. Benutzer-Quota werden ignoriert bis Quota-Unterstützung in den Einstellungen eingeschaltet wird.',
'quota_warning' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten. Bitte löschen Sie Dokumente oder ältere Versionen.', 'quota_warning' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten. Bitte löschen Sie Dokumente oder ältere Versionen.',
'readme_loading' => 'Bitte warten, bis die Readme geladen ist ...',
'receipts_accepted' => '[no_receipts] Empfangsbestätigungen', 'receipts_accepted' => '[no_receipts] Empfangsbestätigungen',
'receipts_accepted_latest' => '(davon [no_receipts] in letzter Version)', 'receipts_accepted_latest' => '(davon [no_receipts] in letzter Version)',
'receipts_not_touched' => '[no_receipts] offene Empfangsbestätigungen', 'receipts_not_touched' => '[no_receipts] offene Empfangsbestätigungen',
@ -2183,6 +2190,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'set_password' => 'Passwort setzen', 'set_password' => 'Passwort setzen',
'set_workflow' => 'Workflow zuweisen', 'set_workflow' => 'Workflow zuweisen',
'show_extension_changelog' => 'Zeige Versionshistorie', 'show_extension_changelog' => 'Zeige Versionshistorie',
'show_extension_readme' => 'Readme anzeigen',
'show_extension_version_list' => 'Zeige Liste der Versionen', 'show_extension_version_list' => 'Zeige Liste der Versionen',
'signed_in_as' => 'Angemeldet als', 'signed_in_as' => 'Angemeldet als',
'sign_in' => 'Anmelden', 'sign_in' => 'Anmelden',
@ -2457,6 +2465,7 @@ URL: [url]</p>',
'update_approvers' => 'Liste der Freigebenden aktualisieren', 'update_approvers' => 'Liste der Freigebenden aktualisieren',
'update_document' => 'Aktualisieren', 'update_document' => 'Aktualisieren',
'update_fulltext_index' => 'Aktualisiere Volltext-Index', 'update_fulltext_index' => 'Aktualisiere Volltext-Index',
'update_fulltext_messages' => 'Nachrichten',
'update_info' => 'Informationen zur Aktualisierung', 'update_info' => 'Informationen zur Aktualisierung',
'update_locked_msg' => 'Dieses Dokument wurde gesperrt<p>Die Sperrung wurde von <a href="mailto:[email]">[username]</a> eingerichtet.<br>', 'update_locked_msg' => 'Dieses Dokument wurde gesperrt<p>Die Sperrung wurde von <a href="mailto:[email]">[username]</a> eingerichtet.<br>',
'update_recipients' => 'Liste der Empfänger aktualisieren', 'update_recipients' => 'Liste der Empfänger aktualisieren',

View File

@ -467,6 +467,7 @@ $text = array(
'dump_remove' => '', 'dump_remove' => '',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => '', 'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Επεξεργασία', 'edit' => 'Επεξεργασία',
'edit_attributes' => '', 'edit_attributes' => '',
'edit_comment' => 'Επεξερασία σχόλιου', 'edit_comment' => 'Επεξερασία σχόλιου',
@ -569,6 +570,7 @@ $text = array(
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => 'Φεβρουάριος', 'february' => 'Φεβρουάριος',
@ -682,6 +684,7 @@ $text = array(
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Αναμονή', 'index_waiting' => 'Αναμονή',
'individuals' => 'Άτομα', 'individuals' => 'Άτομα',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -832,6 +835,7 @@ $text = array(
'move_clipboard' => '', 'move_clipboard' => '',
'move_document' => 'Μετακίνηση εγγράφου', 'move_document' => 'Μετακίνηση εγγράφου',
'move_folder' => 'Μετακίνηση φακέλου', 'move_folder' => 'Μετακίνηση φακέλου',
'move_into_rootfolder' => '',
'my_account' => 'Ο Λογαριασμός μου', 'my_account' => 'Ο Λογαριασμός μου',
'my_documents' => 'Τα έγγραφα μου', 'my_documents' => 'Τα έγγραφα μου',
'my_transmittals' => 'Οι Διαβιβάσεις μου', 'my_transmittals' => 'Οι Διαβιβάσεις μου',
@ -955,6 +959,7 @@ URL: [url]',
'ownership_changed_email_body' => '', 'ownership_changed_email_body' => '',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '', 'ownership_changed_email_subject' => '',
'parent_folder' => '',
'password' => '', 'password' => '',
'password_already_used' => '', 'password_already_used' => '',
'password_expiration' => '', 'password_expiration' => '',
@ -992,6 +997,7 @@ URL: [url]',
'preview' => 'προεπισκόπηση', 'preview' => 'προεπισκόπηση',
'preview_converters' => '', 'preview_converters' => '',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -1004,6 +1010,7 @@ URL: [url]',
'quota_exceeded' => '', 'quota_exceeded' => '',
'quota_is_disabled' => '', 'quota_is_disabled' => '',
'quota_warning' => '', 'quota_warning' => '',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1653,6 +1660,7 @@ URL: [url]',
'set_password' => '', 'set_password' => '',
'set_workflow' => '', 'set_workflow' => '',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Σύνδεση σαν', 'signed_in_as' => 'Σύνδεση σαν',
'sign_in' => 'Σύνδεση', 'sign_in' => 'Σύνδεση',
@ -1907,6 +1915,7 @@ URL: [url]',
'update_approvers' => '', 'update_approvers' => '',
'update_document' => 'Ενημέρωση εγγράφου', 'update_document' => 'Ενημέρωση εγγράφου',
'update_fulltext_index' => 'Ενημέρωση της Αρίθμησης Κειμένων', 'update_fulltext_index' => 'Ενημέρωση της Αρίθμησης Κειμένων',
'update_fulltext_messages' => '',
'update_info' => '', 'update_info' => '',
'update_locked_msg' => '', 'update_locked_msg' => '',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
// Translators: Admin (2238), archonwang (3), dgrutsch (9), netixw (14) // Translators: Admin (2248), archonwang (3), dgrutsch (9), netixw (14)
$text = array( $text = array(
'2_factor_auth' => '2-factor authentication', '2_factor_auth' => '2-factor authentication',
@ -632,13 +632,14 @@ URL: [url]</p>',
'dropfolder_metadata' => 'Metadata of files to be imported', 'dropfolder_metadata' => 'Metadata of files to be imported',
'dropupload' => 'Fast upload', 'dropupload' => 'Fast upload',
'drop_files_here' => 'Drop files here!', 'drop_files_here' => 'Drop files here!',
'drop_files_here_or_click' => 'Drop files here or click!', 'drop_files_here_or_click' => 'Drop files here or click to upload!',
'dump_creation' => 'DB dump creation', 'dump_creation' => 'DB dump creation',
'dump_creation_warning' => 'With this operation you can create a dump file of your database content. After the creation the dump file will be saved in the data folder of your server.', 'dump_creation_warning' => 'With this operation you can create a dump file of your database content. After the creation the dump file will be saved in the data folder of your server.',
'dump_list' => 'Existings dump files', 'dump_list' => 'Existings dump files',
'dump_remove' => 'Remove dump file', 'dump_remove' => 'Remove dump file',
'duplicates' => 'Duplicates', 'duplicates' => 'Duplicates',
'duplicate_content' => 'Duplicate Content', 'duplicate_content' => 'Duplicate Content',
'duplicate_sequences' => 'Duplicate sequence numbers in a folder',
'edit' => 'Edit', 'edit' => 'Edit',
'edit_attributes' => 'Edit attributes', 'edit_attributes' => 'Edit attributes',
'edit_comment' => 'Edit comment', 'edit_comment' => 'Edit comment',
@ -751,6 +752,7 @@ URL: [url]</p>',
'extension_mgr_repository' => 'Available', 'extension_mgr_repository' => 'Available',
'extension_mgr_upload_disabled' => 'Uploading new extensions is not possible because it is disabled in the configuraton.', 'extension_mgr_upload_disabled' => 'Uploading new extensions is not possible because it is disabled in the configuraton.',
'extension_missing_name' => 'No extension name given', 'extension_missing_name' => 'No extension name given',
'extension_readme' => 'Readme',
'extension_toggle_error' => 'Could not toggle extension', 'extension_toggle_error' => 'Could not toggle extension',
'extension_version_list' => 'Versions', 'extension_version_list' => 'Versions',
'february' => 'February', 'february' => 'February',
@ -928,6 +930,7 @@ URL: [url]</p>',
'index_folder_updated' => 'Folder updated', 'index_folder_updated' => 'Folder updated',
'index_no_content' => 'Did not index content', 'index_no_content' => 'Did not index content',
'index_pending' => 'Pending', 'index_pending' => 'Pending',
'index_processing' => 'Processing ...',
'index_waiting' => 'Waiting', 'index_waiting' => 'Waiting',
'individuals' => 'Individuals', 'individuals' => 'Individuals',
'individuals_in_groups' => 'Members of a group', 'individuals_in_groups' => 'Members of a group',
@ -1078,6 +1081,7 @@ URL: [url]</p>',
'move_clipboard' => 'Move clipboard', 'move_clipboard' => 'Move clipboard',
'move_document' => 'Move document', 'move_document' => 'Move document',
'move_folder' => 'Move Folder', 'move_folder' => 'Move Folder',
'move_into_rootfolder' => 'Move into root folder',
'my_account' => 'My Account', 'my_account' => 'My Account',
'my_documents' => 'My Documents', 'my_documents' => 'My Documents',
'my_transmittals' => 'My Transmittals', 'my_transmittals' => 'My Transmittals',
@ -1259,6 +1263,7 @@ New owner: [new_owner]<br />
User: [username]<br /> User: [username]<br />
URL: [url]</p>', URL: [url]</p>',
'ownership_changed_email_subject' => '[sitename]: [name] - Owner changed', 'ownership_changed_email_subject' => '[sitename]: [name] - Owner changed',
'parent_folder' => 'Parent folder',
'password' => 'Password', 'password' => 'Password',
'password_already_used' => 'Password already used', 'password_already_used' => 'Password already used',
'password_expiration' => 'Password expiration', 'password_expiration' => 'Password expiration',
@ -1312,6 +1317,7 @@ If you still have problems to login, then please contact your administrator.',
'preview' => 'Preview', 'preview' => 'Preview',
'preview_converters' => 'Preview document conversion', 'preview_converters' => 'Preview document conversion',
'preview_images' => 'Preview images', 'preview_images' => 'Preview images',
'preview_images_text' => 'Preview images and text content',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => 'Preview as PDF', 'preview_pdf' => 'Preview as PDF',
'preview_plain' => 'Text', 'preview_plain' => 'Text',
@ -1324,6 +1330,7 @@ If you still have problems to login, then please contact your administrator.',
'quota_exceeded' => 'Your disk quota is exceeded by [bytes].', 'quota_exceeded' => 'Your disk quota is exceeded by [bytes].',
'quota_is_disabled' => 'Quota support is currently disabled in the settings. Setting a user quota will have no effect until it is enabled again.', 'quota_is_disabled' => 'Quota support is currently disabled in the settings. Setting a user quota will have no effect until it is enabled again.',
'quota_warning' => 'Your maximum disc usage is exceeded by [bytes]. Please remove documents or previous versions.', 'quota_warning' => 'Your maximum disc usage is exceeded by [bytes]. Please remove documents or previous versions.',
'readme_loading' => 'Pleae wait, until the Readme is loaded ...',
'receipts_accepted' => '[no_receipts] receipts already accepted', 'receipts_accepted' => '[no_receipts] receipts already accepted',
'receipts_accepted_latest' => '(being [no_receipts] in latest version)', 'receipts_accepted_latest' => '(being [no_receipts] in latest version)',
'receipts_not_touched' => '[no_receipts] receipts not being touched', 'receipts_not_touched' => '[no_receipts] receipts not being touched',
@ -2186,6 +2193,7 @@ If you did not receive a password, please use the password forgotten function on
'set_password' => 'Set Password', 'set_password' => 'Set Password',
'set_workflow' => 'Set Workflow', 'set_workflow' => 'Set Workflow',
'show_extension_changelog' => 'Show Changelog', 'show_extension_changelog' => 'Show Changelog',
'show_extension_readme' => 'Show Readme',
'show_extension_version_list' => 'Show list of versions', 'show_extension_version_list' => 'Show list of versions',
'signed_in_as' => 'Signed in as', 'signed_in_as' => 'Signed in as',
'sign_in' => 'Sign in', 'sign_in' => 'Sign in',
@ -2460,6 +2468,7 @@ URL: [url]</p>',
'update_approvers' => 'Update List of Approvers', 'update_approvers' => 'Update List of Approvers',
'update_document' => 'Update document', 'update_document' => 'Update document',
'update_fulltext_index' => 'Update fulltext index', 'update_fulltext_index' => 'Update fulltext index',
'update_fulltext_messages' => 'Messages',
'update_info' => 'Update Information', 'update_info' => 'Update Information',
'update_locked_msg' => 'This document is locked.', 'update_locked_msg' => 'This document is locked.',
'update_recipients' => 'Update list of recipients', 'update_recipients' => 'Update list of recipients',

View File

@ -527,6 +527,7 @@ URL: [url]',
'dump_remove' => 'Eliminar fichero de volcado', 'dump_remove' => 'Eliminar fichero de volcado',
'duplicates' => 'Duplicados', 'duplicates' => 'Duplicados',
'duplicate_content' => 'Contenido duplicado', 'duplicate_content' => 'Contenido duplicado',
'duplicate_sequences' => '',
'edit' => 'editar', 'edit' => 'editar',
'edit_attributes' => 'Editar atributos', 'edit_attributes' => 'Editar atributos',
'edit_comment' => 'Editar comentario', 'edit_comment' => 'Editar comentario',
@ -633,6 +634,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponible', 'extension_mgr_repository' => 'Disponible',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Versiones', 'extension_version_list' => 'Versiones',
'february' => 'Febrero', 'february' => 'Febrero',
@ -772,6 +774,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Esperando', 'index_waiting' => 'Esperando',
'individuals' => 'Individuales', 'individuals' => 'Individuales',
'individuals_in_groups' => 'Miembros del grupo', 'individuals_in_groups' => 'Miembros del grupo',
@ -922,6 +925,7 @@ URL: [url]',
'move_clipboard' => 'Mover portapaprles', 'move_clipboard' => 'Mover portapaprles',
'move_document' => 'Mover documento', 'move_document' => 'Mover documento',
'move_folder' => 'Mover carpeta', 'move_folder' => 'Mover carpeta',
'move_into_rootfolder' => '',
'my_account' => 'Mi cuenta', 'my_account' => 'Mi cuenta',
'my_documents' => 'Mis documentos', 'my_documents' => 'Mis documentos',
'my_transmittals' => 'Mi transmision', 'my_transmittals' => 'Mi transmision',
@ -1064,6 +1068,7 @@ Usuario: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Propietario modificado', 'ownership_changed_email_subject' => '[sitename]: [name] - Propietario modificado',
'parent_folder' => '',
'password' => 'Contraseña', 'password' => 'Contraseña',
'password_already_used' => 'La contraseña ya está en uso', 'password_already_used' => 'La contraseña ya está en uso',
'password_expiration' => 'Caducidad de la contraseña', 'password_expiration' => 'Caducidad de la contraseña',
@ -1109,6 +1114,7 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado
'preview' => 'anterior', 'preview' => 'anterior',
'preview_converters' => 'Vista previa del documento convertido', 'preview_converters' => 'Vista previa del documento convertido',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -1121,6 +1127,7 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado
'quota_exceeded' => 'Su cuota de disco se ha excedido en [bytes].', 'quota_exceeded' => 'Su cuota de disco se ha excedido en [bytes].',
'quota_is_disabled' => 'La cuota está actualmente deshabilitada en las opciones. Establecer una cuota de usuario no tendrá efecto hasta que sea habilitada de nuevo.', 'quota_is_disabled' => 'La cuota está actualmente deshabilitada en las opciones. Establecer una cuota de usuario no tendrá efecto hasta que sea habilitada de nuevo.',
'quota_warning' => 'El máximo de uso de disco se ha excedido en [bytes]. Por favor eliminar documentos o versiones anteriores.', 'quota_warning' => 'El máximo de uso de disco se ha excedido en [bytes]. Por favor eliminar documentos o versiones anteriores.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1806,6 +1813,7 @@ URL: [url]',
'set_password' => 'Establecer contraseña', 'set_password' => 'Establecer contraseña',
'set_workflow' => 'Establecer Flujo de Trabajo', 'set_workflow' => 'Establecer Flujo de Trabajo',
'show_extension_changelog' => 'Mostrar log de cambios', 'show_extension_changelog' => 'Mostrar log de cambios',
'show_extension_readme' => '',
'show_extension_version_list' => 'Lista corta de versiones', 'show_extension_version_list' => 'Lista corta de versiones',
'signed_in_as' => 'Conectado como', 'signed_in_as' => 'Conectado como',
'sign_in' => 'Conectar', 'sign_in' => 'Conectar',
@ -2069,6 +2077,7 @@ URL: [url]',
'update_approvers' => 'Actualizar lista de aprobadores', 'update_approvers' => 'Actualizar lista de aprobadores',
'update_document' => 'Actualizar documento', 'update_document' => 'Actualizar documento',
'update_fulltext_index' => 'Actualizar índice de texto completo', 'update_fulltext_index' => 'Actualizar índice de texto completo',
'update_fulltext_messages' => '',
'update_info' => 'Actualizar información', 'update_info' => 'Actualizar información',
'update_locked_msg' => 'Este documento está bloqueado.', 'update_locked_msg' => 'Este documento está bloqueado.',
'update_recipients' => 'Actualizaar lista de receptores', 'update_recipients' => 'Actualizaar lista de receptores',

View File

@ -625,6 +625,7 @@ URL : [url]</p>',
'dump_remove' => 'Supprimer fichier de sauvegarde', 'dump_remove' => 'Supprimer fichier de sauvegarde',
'duplicates' => 'Doublons', 'duplicates' => 'Doublons',
'duplicate_content' => 'Contenu en double', 'duplicate_content' => 'Contenu en double',
'duplicate_sequences' => '',
'edit' => 'Modifier', 'edit' => 'Modifier',
'edit_attributes' => 'Modifier les attributs', 'edit_attributes' => 'Modifier les attributs',
'edit_comment' => 'Modifier le commentaire', 'edit_comment' => 'Modifier le commentaire',
@ -737,6 +738,7 @@ URL : [url]</p>',
'extension_mgr_repository' => 'Disponibles', 'extension_mgr_repository' => 'Disponibles',
'extension_mgr_upload_disabled' => 'Le chargement d\'extension n\'est pas activé', 'extension_mgr_upload_disabled' => 'Le chargement d\'extension n\'est pas activé',
'extension_missing_name' => 'Nom dextension manquant', 'extension_missing_name' => 'Nom dextension manquant',
'extension_readme' => '',
'extension_toggle_error' => 'Impossible dactiver/désactiver lextension', 'extension_toggle_error' => 'Impossible dactiver/désactiver lextension',
'extension_version_list' => 'Versions', 'extension_version_list' => 'Versions',
'february' => 'Février', 'february' => 'Février',
@ -914,6 +916,7 @@ URL : [url]</p>',
'index_folder_updated' => 'Dossier mis à jour', 'index_folder_updated' => 'Dossier mis à jour',
'index_no_content' => 'Contenu non indexé', 'index_no_content' => 'Contenu non indexé',
'index_pending' => 'En attente', 'index_pending' => 'En attente',
'index_processing' => '',
'index_waiting' => 'Chargement…', 'index_waiting' => 'Chargement…',
'individuals' => 'Individuels', 'individuals' => 'Individuels',
'individuals_in_groups' => 'Membres dun groupe', 'individuals_in_groups' => 'Membres dun groupe',
@ -1064,6 +1067,7 @@ URL : [url]</p>',
'move_clipboard' => 'Déplacer le contenu du presse-papier', 'move_clipboard' => 'Déplacer le contenu du presse-papier',
'move_document' => 'Déplacer le document', 'move_document' => 'Déplacer le document',
'move_folder' => 'Déplacer le dossier', 'move_folder' => 'Déplacer le dossier',
'move_into_rootfolder' => '',
'my_account' => 'Mon compte', 'my_account' => 'Mon compte',
'my_documents' => 'Mes documents', 'my_documents' => 'Mes documents',
'my_transmittals' => 'Mes transmissions', 'my_transmittals' => 'Mes transmissions',
@ -1246,6 +1250,7 @@ Nouveau propriétaire : [new_owner]<br />
Utilisateur : [username]<br /> Utilisateur : [username]<br />
URL : [url]</p>', URL : [url]</p>',
'ownership_changed_email_subject' => '[sitename] : [name] - Propriétaire modifié', 'ownership_changed_email_subject' => '[sitename] : [name] - Propriétaire modifié',
'parent_folder' => '',
'password' => 'Mot de passe', 'password' => 'Mot de passe',
'password_already_used' => 'Mot de passe déjà utilisé', 'password_already_used' => 'Mot de passe déjà utilisé',
'password_expiration' => 'Expiration du mot de passe', 'password_expiration' => 'Expiration du mot de passe',
@ -1297,6 +1302,7 @@ En cas de problème persistant, veuillez contacter votre administrateur.',
'preview' => 'Aperçu', 'preview' => 'Aperçu',
'preview_converters' => 'Conversion des documents pour prévisualisation', 'preview_converters' => 'Conversion des documents pour prévisualisation',
'preview_images' => 'Miniatures', 'preview_images' => 'Miniatures',
'preview_images_text' => '',
'preview_markdown' => 'Prévisualisation', 'preview_markdown' => 'Prévisualisation',
'preview_pdf' => 'Prévisualisation en PDF', 'preview_pdf' => 'Prévisualisation en PDF',
'preview_plain' => 'Texte', 'preview_plain' => 'Texte',
@ -1309,6 +1315,7 @@ En cas de problème persistant, veuillez contacter votre administrateur.',
'quota_exceeded' => 'Votre quota de disque est dépassé de [bytes].', 'quota_exceeded' => 'Votre quota de disque est dépassé de [bytes].',
'quota_is_disabled' => 'La prise en charge des quotas est actuellement désactivée dans les réglages. Affecter un quota utilisateur naura pas deffet jusquà ce quil soit de nouveau activé.', 'quota_is_disabled' => 'La prise en charge des quotas est actuellement désactivée dans les réglages. Affecter un quota utilisateur naura pas deffet jusquà ce quil soit de nouveau activé.',
'quota_warning' => 'Votre quota despace disque est dépassé de [bytes]. Veuillez supprimer des documents ou d\'anciennes versions.', 'quota_warning' => 'Votre quota despace disque est dépassé de [bytes]. Veuillez supprimer des documents ou d\'anciennes versions.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] réceptions déjà confirmées', 'receipts_accepted' => '[no_receipts] réceptions déjà confirmées',
'receipts_accepted_latest' => '(dont [no_receipts] dans la dernière version)', 'receipts_accepted_latest' => '(dont [no_receipts] dans la dernière version)',
'receipts_not_touched' => '[no_receipts] réceptions non amorcées', 'receipts_not_touched' => '[no_receipts] réceptions non amorcées',
@ -2169,6 +2176,7 @@ Nom : [username]
'set_password' => 'Définir mot de passe', 'set_password' => 'Définir mot de passe',
'set_workflow' => 'Définir le Workflow', 'set_workflow' => 'Définir le Workflow',
'show_extension_changelog' => 'Afficher le journal des modifications', 'show_extension_changelog' => 'Afficher le journal des modifications',
'show_extension_readme' => '',
'show_extension_version_list' => 'Afficher la liste des versions', 'show_extension_version_list' => 'Afficher la liste des versions',
'signed_in_as' => 'Connecté en tant que', 'signed_in_as' => 'Connecté en tant que',
'sign_in' => 'Connexion', 'sign_in' => 'Connexion',
@ -2443,6 +2451,7 @@ URL : [url]</p>',
'update_approvers' => 'Mettre à jour la liste des approbateurs', 'update_approvers' => 'Mettre à jour la liste des approbateurs',
'update_document' => 'Mettre à jour', 'update_document' => 'Mettre à jour',
'update_fulltext_index' => 'Mettre à jour l\'index de recherche plein texte', 'update_fulltext_index' => 'Mettre à jour l\'index de recherche plein texte',
'update_fulltext_messages' => '',
'update_info' => 'Informations de mise à jour', 'update_info' => 'Informations de mise à jour',
'update_locked_msg' => 'Ce document est verrouillé.', 'update_locked_msg' => 'Ce document est verrouillé.',
'update_recipients' => 'Mettre à jour la liste des destinataires', 'update_recipients' => 'Mettre à jour la liste des destinataires',

View File

@ -19,10 +19,10 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
// Translators: Admin (1249), marbanas (16) // Translators: Admin (1250), marbanas (16)
$text = array( $text = array(
'2_factor_auth' => '', '2_factor_auth' => '2-faktorska autentikacija',
'2_factor_auth_info' => '', '2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '', '2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '', '2_fact_auth_new_secret' => '',
@ -526,6 +526,7 @@ Internet poveznica: [url]',
'dump_remove' => 'Ukloni datoteku za odlaganje', 'dump_remove' => 'Ukloni datoteku za odlaganje',
'duplicates' => 'duplikati', 'duplicates' => 'duplikati',
'duplicate_content' => 'Duplicirani sadržaj', 'duplicate_content' => 'Duplicirani sadržaj',
'duplicate_sequences' => '',
'edit' => 'Uredi', 'edit' => 'Uredi',
'edit_attributes' => 'Uredi atribute', 'edit_attributes' => 'Uredi atribute',
'edit_comment' => 'Uredi komentar', 'edit_comment' => 'Uredi komentar',
@ -632,6 +633,7 @@ Internet poveznica: [url]',
'extension_mgr_repository' => 'Dostupno', 'extension_mgr_repository' => 'Dostupno',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Inačice', 'extension_version_list' => 'Inačice',
'february' => 'Veljača', 'february' => 'Veljača',
@ -765,6 +767,7 @@ Internet poveznica: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => '', 'index_waiting' => '',
'individuals' => 'Pojedinci', 'individuals' => 'Pojedinci',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -915,6 +918,7 @@ Internet poveznica: [url]',
'move_clipboard' => 'Premjesti međuspremnik', 'move_clipboard' => 'Premjesti međuspremnik',
'move_document' => 'Premjesti dokument', 'move_document' => 'Premjesti dokument',
'move_folder' => 'Premjesti mapu', 'move_folder' => 'Premjesti mapu',
'move_into_rootfolder' => '',
'my_account' => 'Moj korisnički račun', 'my_account' => 'Moj korisnički račun',
'my_documents' => 'Moji dokumenti', 'my_documents' => 'Moji dokumenti',
'my_transmittals' => 'Moja proslijeđivanja', 'my_transmittals' => 'Moja proslijeđivanja',
@ -1056,6 +1060,7 @@ Korisnik: [username]
Internet poveznica: [url]', Internet poveznica: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Promijenjen vlasnik', 'ownership_changed_email_subject' => '[sitename]: [name] - Promijenjen vlasnik',
'parent_folder' => '',
'password' => 'Lozinka', 'password' => 'Lozinka',
'password_already_used' => 'Lozinka se već koristi', 'password_already_used' => 'Lozinka se već koristi',
'password_expiration' => 'Istek lozinke', 'password_expiration' => 'Istek lozinke',
@ -1101,6 +1106,7 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator
'preview' => 'Predpregled', 'preview' => 'Predpregled',
'preview_converters' => 'Pretpregled konverzije dokumenta', 'preview_converters' => 'Pretpregled konverzije dokumenta',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => 'Smanjenje', 'preview_markdown' => 'Smanjenje',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => 'Obični tekst', 'preview_plain' => 'Obični tekst',
@ -1113,6 +1119,7 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator
'quota_exceeded' => 'Vaša kvota na disku je premašena za [bytes].', 'quota_exceeded' => 'Vaša kvota na disku je premašena za [bytes].',
'quota_is_disabled' => 'Podrška kvoti je trenutno onemogućena u postavkama. Postavka korisničke kvote neće imati utjecaja dok se ponovno ne omogući.', 'quota_is_disabled' => 'Podrška kvoti je trenutno onemogućena u postavkama. Postavka korisničke kvote neće imati utjecaja dok se ponovno ne omogući.',
'quota_warning' => 'Vaš maksimalni prostor na disku je premašen za [bytes]. Molimo uklonite dokumente ili prethodne verzije.', 'quota_warning' => 'Vaš maksimalni prostor na disku je premašen za [bytes]. Molimo uklonite dokumente ili prethodne verzije.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1815,6 +1822,7 @@ Internet poveznica: [url]',
'set_password' => 'Postavi lozinku', 'set_password' => 'Postavi lozinku',
'set_workflow' => 'Postavi tok rada', 'set_workflow' => 'Postavi tok rada',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Prijavljen kao', 'signed_in_as' => 'Prijavljen kao',
'sign_in' => 'Prijava u sustav', 'sign_in' => 'Prijava u sustav',
@ -2078,6 +2086,7 @@ Internet poveznica: [url]',
'update_approvers' => 'Ažuriraj popis validatora', 'update_approvers' => 'Ažuriraj popis validatora',
'update_document' => 'Ažuriraj dokument', 'update_document' => 'Ažuriraj dokument',
'update_fulltext_index' => 'Ažuriraj indeksiranje cijelog teksta', 'update_fulltext_index' => 'Ažuriraj indeksiranje cijelog teksta',
'update_fulltext_messages' => '',
'update_info' => 'Info ažuriranje', 'update_info' => 'Info ažuriranje',
'update_locked_msg' => 'Ovaj dokument je zaključan.', 'update_locked_msg' => 'Ovaj dokument je zaključan.',
'update_recipients' => 'Izmjena liste primatelja', 'update_recipients' => 'Izmjena liste primatelja',

View File

@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
// Translators: Admin (648), Kalpy (113), ribaz (1036) // Translators: Admin (649), Kalpy (113), ribaz (1036)
$text = array( $text = array(
'2_factor_auth' => 'Kétfaktoros azonosítás', '2_factor_auth' => 'Kétfaktoros azonosítás',
@ -521,6 +521,7 @@ URL: [url]',
'dump_remove' => 'Adatbázis mentés eltávolítása', 'dump_remove' => 'Adatbázis mentés eltávolítása',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => 'Duplikált tartalom', 'duplicate_content' => 'Duplikált tartalom',
'duplicate_sequences' => '',
'edit' => 'Szerkesztés', 'edit' => 'Szerkesztés',
'edit_attributes' => 'Jellemzők szerkesztése', 'edit_attributes' => 'Jellemzők szerkesztése',
'edit_comment' => 'Megjegyzés szerkesztése', 'edit_comment' => 'Megjegyzés szerkesztése',
@ -627,6 +628,7 @@ URL: [url]',
'extension_mgr_repository' => 'Telepíthető', 'extension_mgr_repository' => 'Telepíthető',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Verziók', 'extension_version_list' => 'Verziók',
'february' => 'Február', 'february' => 'Február',
@ -735,7 +737,7 @@ URL: [url]',
'hu_HU' => 'Magyar', 'hu_HU' => 'Magyar',
'id' => 'ID', 'id' => 'ID',
'identical_version' => 'Az új verzió megegyezik az eredetivel.', 'identical_version' => 'Az új verzió megegyezik az eredetivel.',
'id_ID' => '', 'id_ID' => 'Indonéz',
'import' => 'Import', 'import' => 'Import',
'importfs' => '', 'importfs' => '',
'import_extension' => 'Kiterjesztés import', 'import_extension' => 'Kiterjesztés import',
@ -760,6 +762,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => '', 'index_waiting' => '',
'individuals' => 'Egyedek', 'individuals' => 'Egyedek',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -910,6 +913,7 @@ URL: [url]',
'move_clipboard' => 'Vágólapra helyez', 'move_clipboard' => 'Vágólapra helyez',
'move_document' => 'Dokumentum áthelyezése', 'move_document' => 'Dokumentum áthelyezése',
'move_folder' => 'Könyvtár áthelyezése', 'move_folder' => 'Könyvtár áthelyezése',
'move_into_rootfolder' => '',
'my_account' => 'Saját hozzáférés', 'my_account' => 'Saját hozzáférés',
'my_documents' => 'Saját dokumentumok', 'my_documents' => 'Saját dokumentumok',
'my_transmittals' => 'Átviteleim', 'my_transmittals' => 'Átviteleim',
@ -1052,6 +1056,7 @@ Felhasználó: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Tulajdonos megváltozott', 'ownership_changed_email_subject' => '[sitename]: [name] - Tulajdonos megváltozott',
'parent_folder' => '',
'password' => 'Jelszó', 'password' => 'Jelszó',
'password_already_used' => 'Jelszó korábban használva volt', 'password_already_used' => 'Jelszó korábban használva volt',
'password_expiration' => 'Jelszó lejárat', 'password_expiration' => 'Jelszó lejárat',
@ -1097,6 +1102,7 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a
'preview' => 'Előnézet', 'preview' => 'Előnézet',
'preview_converters' => 'A dokumentum átalakításának előnézete', 'preview_converters' => 'A dokumentum átalakításának előnézete',
'preview_images' => 'előnézeti képek', 'preview_images' => 'előnézeti képek',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -1109,6 +1115,7 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a
'quota_exceeded' => 'Túllépte a lemezterület korlátot [bytes].', 'quota_exceeded' => 'Túllépte a lemezterület korlátot [bytes].',
'quota_is_disabled' => 'Kvóta támogatás jelenleg le van tiltva a beállításoknál. Felhasználói korlát beállítások nem kerülnek érvényesítésre amíg nincs újra engedélyezve.', 'quota_is_disabled' => 'Kvóta támogatás jelenleg le van tiltva a beállításoknál. Felhasználói korlát beállítások nem kerülnek érvényesítésre amíg nincs újra engedélyezve.',
'quota_warning' => 'Túllépte lemez korlátot [bytes] bájttal. Kérjük távolítson el dokumentumokat vagy korábbi változatokat.', 'quota_warning' => 'Túllépte lemez korlátot [bytes] bájttal. Kérjük távolítson el dokumentumokat vagy korábbi változatokat.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1793,6 +1800,7 @@ URL: [url]',
'set_password' => 'Jelszó beállítása', 'set_password' => 'Jelszó beállítása',
'set_workflow' => 'Munkafolyamat beállítása', 'set_workflow' => 'Munkafolyamat beállítása',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Bejelentkezve mint', 'signed_in_as' => 'Bejelentkezve mint',
'sign_in' => 'Bejelentkezés', 'sign_in' => 'Bejelentkezés',
@ -2056,6 +2064,7 @@ URL: [url]',
'update_approvers' => 'Jóváhagyók listájának frissítése', 'update_approvers' => 'Jóváhagyók listájának frissítése',
'update_document' => 'Dokumentum frissítése', 'update_document' => 'Dokumentum frissítése',
'update_fulltext_index' => 'Teljes szöveg index frissítése', 'update_fulltext_index' => 'Teljes szöveg index frissítése',
'update_fulltext_messages' => '',
'update_info' => 'Információ frissítése', 'update_info' => 'Információ frissítése',
'update_locked_msg' => 'Ez a dokumentum zárolt.', 'update_locked_msg' => 'Ez a dokumentum zárolt.',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -565,6 +565,7 @@ URL: [url]</p>',
'dump_remove' => 'Hapus file sampah', 'dump_remove' => 'Hapus file sampah',
'duplicates' => 'Duplikasi', 'duplicates' => 'Duplikasi',
'duplicate_content' => '', 'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Ubah', 'edit' => 'Ubah',
'edit_attributes' => 'Ubah label', 'edit_attributes' => 'Ubah label',
'edit_comment' => 'Ubah komentar', 'edit_comment' => 'Ubah komentar',
@ -672,6 +673,7 @@ URL: [url]',
'extension_mgr_repository' => 'Tersedia', 'extension_mgr_repository' => 'Tersedia',
'extension_mgr_upload_disabled' => 'Mengunggah ekstensi baru tidak dimungkinkan karena dinonaktifkan di konfigurasi.', 'extension_mgr_upload_disabled' => 'Mengunggah ekstensi baru tidak dimungkinkan karena dinonaktifkan di konfigurasi.',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => 'Tidak dapat mengaktifkan ekstensi', 'extension_toggle_error' => 'Tidak dapat mengaktifkan ekstensi',
'extension_version_list' => 'Versi', 'extension_version_list' => 'Versi',
'february' => 'Februari', 'february' => 'Februari',
@ -816,6 +818,7 @@ URL: [url]</p>',
'index_folder_updated' => 'Folder diperbarui', 'index_folder_updated' => 'Folder diperbarui',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => 'Ditunda', 'index_pending' => 'Ditunda',
'index_processing' => '',
'index_waiting' => 'Mengunggu', 'index_waiting' => 'Mengunggu',
'individuals' => 'Perorangan', 'individuals' => 'Perorangan',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -966,6 +969,7 @@ URL: [url]</p>',
'move_clipboard' => 'Pindah clipboard', 'move_clipboard' => 'Pindah clipboard',
'move_document' => 'Pindah dokumen', 'move_document' => 'Pindah dokumen',
'move_folder' => 'Pindah Folder', 'move_folder' => 'Pindah Folder',
'move_into_rootfolder' => '',
'my_account' => 'Akun Saya', 'my_account' => 'Akun Saya',
'my_documents' => 'Dokumen Saya', 'my_documents' => 'Dokumen Saya',
'my_transmittals' => 'Transmisi Saya', 'my_transmittals' => 'Transmisi Saya',
@ -1129,6 +1133,7 @@ Pemilik baru: [new_owner]<br / >
Pengguna: [username]<br /> Pengguna: [username]<br />
URL: [url]</p>', URL: [url]</p>',
'ownership_changed_email_subject' => '[sitename]: [name] - Pemilik diterapkan', 'ownership_changed_email_subject' => '[sitename]: [name] - Pemilik diterapkan',
'parent_folder' => '',
'password' => 'Kata sandi', 'password' => 'Kata sandi',
'password_already_used' => 'Kata sandi telah digunakan', 'password_already_used' => 'Kata sandi telah digunakan',
'password_expiration' => 'Kata sandi telah kadaluwarsa', 'password_expiration' => 'Kata sandi telah kadaluwarsa',
@ -1182,6 +1187,7 @@ Jika Anda masih mengalami masalah untuk login, silakan hubungi administrator And
'preview' => 'Pratinjau', 'preview' => 'Pratinjau',
'preview_converters' => 'Pratinjau konversi dokumen', 'preview_converters' => 'Pratinjau konversi dokumen',
'preview_images' => 'Pratinjau gambar', 'preview_images' => 'Pratinjau gambar',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => 'Lihat sebagai PDF', 'preview_pdf' => 'Lihat sebagai PDF',
'preview_plain' => 'Text', 'preview_plain' => 'Text',
@ -1194,6 +1200,7 @@ Jika Anda masih mengalami masalah untuk login, silakan hubungi administrator And
'quota_exceeded' => '', 'quota_exceeded' => '',
'quota_is_disabled' => 'Dukungan kuota saat ini dinonaktifkan di pengaturan. Menetapkan kuota pengguna tidak akan berpengaruh hingga diaktifkan kembali.', 'quota_is_disabled' => 'Dukungan kuota saat ini dinonaktifkan di pengaturan. Menetapkan kuota pengguna tidak akan berpengaruh hingga diaktifkan kembali.',
'quota_warning' => '', 'quota_warning' => '',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] kuitansi sudah diterima', 'receipts_accepted' => '[no_receipts] kuitansi sudah diterima',
'receipts_accepted_latest' => '(menjadi [no_receipts] dalam versi terbaru)', 'receipts_accepted_latest' => '(menjadi [no_receipts] dalam versi terbaru)',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1867,6 +1874,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'set_password' => 'Setel Kata Sandi', 'set_password' => 'Setel Kata Sandi',
'set_workflow' => 'Setel Alur Kerja', 'set_workflow' => 'Setel Alur Kerja',
'show_extension_changelog' => 'Tampilkan Changelog', 'show_extension_changelog' => 'Tampilkan Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Tampilkan daftar versi', 'show_extension_version_list' => 'Tampilkan daftar versi',
'signed_in_as' => 'Masuk sebagai', 'signed_in_as' => 'Masuk sebagai',
'sign_in' => 'Masuk', 'sign_in' => 'Masuk',
@ -2121,6 +2129,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'update_approvers' => 'Perbarui Daftar Penyetuju', 'update_approvers' => 'Perbarui Daftar Penyetuju',
'update_document' => 'Perbarui dokumen', 'update_document' => 'Perbarui dokumen',
'update_fulltext_index' => 'Perbarui indek fulltext', 'update_fulltext_index' => 'Perbarui indek fulltext',
'update_fulltext_messages' => '',
'update_info' => 'Perbarui Informasi', 'update_info' => 'Perbarui Informasi',
'update_locked_msg' => 'Dokumen ini terkunci.', 'update_locked_msg' => 'Dokumen ini terkunci.',
'update_recipients' => 'Perbarui daftar penerima', 'update_recipients' => 'Perbarui daftar penerima',

View File

@ -19,7 +19,7 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
// Translators: Admin (2057), rickr (144), s.pnt (26) // Translators: Admin (2058), rickr (144), s.pnt (26)
$text = array( $text = array(
'2_factor_auth' => 'Autorizzazione a due fattori', '2_factor_auth' => 'Autorizzazione a due fattori',
@ -531,6 +531,7 @@ URL: [url]',
'dump_remove' => 'Cancella il file di dump', 'dump_remove' => 'Cancella il file di dump',
'duplicates' => 'Duplicati', 'duplicates' => 'Duplicati',
'duplicate_content' => 'Contenuto duplicato', 'duplicate_content' => 'Contenuto duplicato',
'duplicate_sequences' => '',
'edit' => 'Modifica', 'edit' => 'Modifica',
'edit_attributes' => 'Modifica gli attributi', 'edit_attributes' => 'Modifica gli attributi',
'edit_comment' => 'Modifica il commento', 'edit_comment' => 'Modifica il commento',
@ -637,6 +638,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponibile', 'extension_mgr_repository' => 'Disponibile',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Versioni', 'extension_version_list' => 'Versioni',
'february' => 'Febbraio', 'february' => 'Febbraio',
@ -770,6 +772,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Non indicizzare contenuti', 'index_no_content' => 'Non indicizzare contenuti',
'index_pending' => 'Indicizzazione pendente', 'index_pending' => 'Indicizzazione pendente',
'index_processing' => '',
'index_waiting' => 'Attendi', 'index_waiting' => 'Attendi',
'individuals' => 'Singoli', 'individuals' => 'Singoli',
'individuals_in_groups' => 'I membri de la gruppo', 'individuals_in_groups' => 'I membri de la gruppo',
@ -920,6 +923,7 @@ URL: [url]',
'move_clipboard' => 'Sposta appunti', 'move_clipboard' => 'Sposta appunti',
'move_document' => 'Sposta documento', 'move_document' => 'Sposta documento',
'move_folder' => 'Sposta cartella', 'move_folder' => 'Sposta cartella',
'move_into_rootfolder' => '',
'my_account' => 'Account personale', 'my_account' => 'Account personale',
'my_documents' => 'Documenti personali', 'my_documents' => 'Documenti personali',
'my_transmittals' => 'Mie trasmissioni', 'my_transmittals' => 'Mie trasmissioni',
@ -1062,6 +1066,7 @@ Utente: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Cambio di proprietario', 'ownership_changed_email_subject' => '[sitename]: [name] - Cambio di proprietario',
'parent_folder' => '',
'password' => 'Password', 'password' => 'Password',
'password_already_used' => 'Password già usata', 'password_already_used' => 'Password già usata',
'password_expiration' => 'Scadenza password', 'password_expiration' => 'Scadenza password',
@ -1107,6 +1112,7 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di
'preview' => 'Anteprima', 'preview' => 'Anteprima',
'preview_converters' => 'Anteprima convesione documento', 'preview_converters' => 'Anteprima convesione documento',
'preview_images' => 'Immagini di anteprima', 'preview_images' => 'Immagini di anteprima',
'preview_images_text' => '',
'preview_markdown' => 'Riduzione ribasso', 'preview_markdown' => 'Riduzione ribasso',
'preview_pdf' => 'Anteprima come PDF', 'preview_pdf' => 'Anteprima come PDF',
'preview_plain' => 'Testo', 'preview_plain' => 'Testo',
@ -1119,6 +1125,7 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di
'quota_exceeded' => 'La quota-disco è stata superata di [bytes].', 'quota_exceeded' => 'La quota-disco è stata superata di [bytes].',
'quota_is_disabled' => 'Il supporto per le quote è attualmente disattivato nelle impostazioni. L\'impostazione di una quota-utente non avrà alcun effetto finché tale funzionalità non verrà nuovamente attivata.', 'quota_is_disabled' => 'Il supporto per le quote è attualmente disattivato nelle impostazioni. L\'impostazione di una quota-utente non avrà alcun effetto finché tale funzionalità non verrà nuovamente attivata.',
'quota_warning' => 'Il vostro utilizzo massimo di spazio è stato superato di [bytes]. Si prega di rimuovere documenti o versioni obsolete.', 'quota_warning' => 'Il vostro utilizzo massimo di spazio è stato superato di [bytes]. Si prega di rimuovere documenti o versioni obsolete.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] ricevute già accettate', 'receipts_accepted' => '[no_receipts] ricevute già accettate',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '[no_receipts] ricevute non gestite', 'receipts_not_touched' => '[no_receipts] ricevute non gestite',
@ -1360,7 +1367,7 @@ URL: [url]',
'search' => 'Ricerca', 'search' => 'Ricerca',
'search_fulltext' => 'Ricerca fulltext', 'search_fulltext' => 'Ricerca fulltext',
'search_in' => 'Cerca in', 'search_in' => 'Cerca in',
'search_mode' => '', 'search_mode' => 'Modalità di ricerca',
'search_mode_and' => 'tutte le parole', 'search_mode_and' => 'tutte le parole',
'search_mode_documents' => 'Solo documenti', 'search_mode_documents' => 'Solo documenti',
'search_mode_folders' => 'Solo cartelle', 'search_mode_folders' => 'Solo cartelle',
@ -1842,6 +1849,7 @@ Name: [username]
'set_password' => 'Imposta password', 'set_password' => 'Imposta password',
'set_workflow' => 'Imposta il flusso di lavoro', 'set_workflow' => 'Imposta il flusso di lavoro',
'show_extension_changelog' => 'Registro delle modifiche dell\'estensione', 'show_extension_changelog' => 'Registro delle modifiche dell\'estensione',
'show_extension_readme' => '',
'show_extension_version_list' => 'Mostra lista delle versioni', 'show_extension_version_list' => 'Mostra lista delle versioni',
'signed_in_as' => 'Utente', 'signed_in_as' => 'Utente',
'sign_in' => 'Accesso', 'sign_in' => 'Accesso',
@ -2105,6 +2113,7 @@ URL: [url]',
'update_approvers' => 'Aggiornamento lista approvatori', 'update_approvers' => 'Aggiornamento lista approvatori',
'update_document' => 'Aggiorna documento', 'update_document' => 'Aggiorna documento',
'update_fulltext_index' => 'Aggiorna indice fulltext', 'update_fulltext_index' => 'Aggiorna indice fulltext',
'update_fulltext_messages' => '',
'update_info' => 'Aggiorna informazioni', 'update_info' => 'Aggiorna informazioni',
'update_locked_msg' => 'Questo documento è bloccato.', 'update_locked_msg' => 'Questo documento è bloccato.',
'update_recipients' => 'Aggiorna lista cartelle', 'update_recipients' => 'Aggiorna lista cartelle',

View File

@ -527,6 +527,7 @@ URL: [url]',
'dump_remove' => '덤프 파일 제거', 'dump_remove' => '덤프 파일 제거',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => '중복 내용', 'duplicate_content' => '중복 내용',
'duplicate_sequences' => '',
'edit' => '편집', 'edit' => '편집',
'edit_attributes' => '속성 편집', 'edit_attributes' => '속성 편집',
'edit_comment' => '주석 고치기', 'edit_comment' => '주석 고치기',
@ -633,6 +634,7 @@ URL: [url]',
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => '2월', 'february' => '2월',
@ -766,6 +768,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => '기다리는 중', 'index_waiting' => '기다리는 중',
'individuals' => '개인', 'individuals' => '개인',
'individuals_in_groups' => '개별 그룹', 'individuals_in_groups' => '개별 그룹',
@ -916,6 +919,7 @@ URL: [url]',
'move_clipboard' => '이동 클립 보드', 'move_clipboard' => '이동 클립 보드',
'move_document' => '문서 옮기기', 'move_document' => '문서 옮기기',
'move_folder' => '폴더 이동', 'move_folder' => '폴더 이동',
'move_into_rootfolder' => '',
'my_account' => '내 계정', 'my_account' => '내 계정',
'my_documents' => '내 문서', 'my_documents' => '내 문서',
'my_transmittals' => '내 송부', 'my_transmittals' => '내 송부',
@ -1058,6 +1062,7 @@ URL : [url]',
URL : [url]', URL : [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename] : [name] - 소유자 변경', 'ownership_changed_email_subject' => '[sitename] : [name] - 소유자 변경',
'parent_folder' => '',
'password' => '암호', 'password' => '암호',
'password_already_used' => '예전에 쓰인 암호', 'password_already_used' => '예전에 쓰인 암호',
'password_expiration' => '암호 만료', 'password_expiration' => '암호 만료',
@ -1095,6 +1100,7 @@ URL : [url]',
'preview' => '미리보기', 'preview' => '미리보기',
'preview_converters' => '문서 변환 미리보기', 'preview_converters' => '문서 변환 미리보기',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '마크다운', 'preview_markdown' => '마크다운',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '텍스트', 'preview_plain' => '텍스트',
@ -1107,6 +1113,7 @@ URL : [url]',
'quota_exceeded' => '당신은 디스크 할당량 [bytes]을 초과한다.', 'quota_exceeded' => '당신은 디스크 할당량 [bytes]을 초과한다.',
'quota_is_disabled' => '할당량 지원이 설정에서 비활성화되어 있습니다. 다시 활성화 될 때까지 사용자의 할당량 설정은 적용되지 않습니다.', 'quota_is_disabled' => '할당량 지원이 설정에서 비활성화되어 있습니다. 다시 활성화 될 때까지 사용자의 할당량 설정은 적용되지 않습니다.',
'quota_warning' => '당신의 최대 디스크 사용량 [bytes] 초과됩니다. 문서 또는 이전 버전을 제거하십시오.', 'quota_warning' => '당신의 최대 디스크 사용량 [bytes] 초과됩니다. 문서 또는 이전 버전을 제거하십시오.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1809,6 +1816,7 @@ URL : [url]',
'set_password' => '비밀번호 설정', 'set_password' => '비밀번호 설정',
'set_workflow' => '워크플로우 설정', 'set_workflow' => '워크플로우 설정',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => '로그인', 'signed_in_as' => '로그인',
'sign_in' => '로그인', 'sign_in' => '로그인',
@ -2072,6 +2080,7 @@ URL : [url]',
'update_approvers' => '승인자의 업데이트 목록', 'update_approvers' => '승인자의 업데이트 목록',
'update_document' => '문서 갱신하기', 'update_document' => '문서 갱신하기',
'update_fulltext_index' => '업데이트 전체 텍스트 색인', 'update_fulltext_index' => '업데이트 전체 텍스트 색인',
'update_fulltext_messages' => '',
'update_info' => '업데이트 정보', 'update_info' => '업데이트 정보',
'update_locked_msg' => '이 문서는 잠겨 있습니다.', 'update_locked_msg' => '이 문서는 잠겨 있습니다.',
'update_recipients' => '받는 사람 업데이트 목록', 'update_recipients' => '받는 사람 업데이트 목록',

View File

@ -524,6 +524,7 @@ URL: [url]',
'dump_remove' => 'ລົບແຟ້ມການຖ່າຍໂອນຂໍ້ມູນ', 'dump_remove' => 'ລົບແຟ້ມການຖ່າຍໂອນຂໍ້ມູນ',
'duplicates' => 'ລາຍການທີຊໍ້າກັນ', 'duplicates' => 'ລາຍການທີຊໍ້າກັນ',
'duplicate_content' => 'ເນື້ອຫາທີ່ຊໍ້າກັນ', 'duplicate_content' => 'ເນື້ອຫາທີ່ຊໍ້າກັນ',
'duplicate_sequences' => '',
'edit' => 'ແກ້ໄຂ', 'edit' => 'ແກ້ໄຂ',
'edit_attributes' => 'ແກ້ໄຂແອັດທີບິວ', 'edit_attributes' => 'ແກ້ໄຂແອັດທີບິວ',
'edit_comment' => 'ແກ້ໄຂຄວາມຄິດເຫັນ', 'edit_comment' => 'ແກ້ໄຂຄວາມຄິດເຫັນ',
@ -630,6 +631,7 @@ URL: [url]',
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => 'ເດືອນ ກຸມພາ', 'february' => 'ເດືອນ ກຸມພາ',
@ -763,6 +765,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => 'ລໍຖ້າດຳເນີນການ', 'index_pending' => 'ລໍຖ້າດຳເນີນການ',
'index_processing' => '',
'index_waiting' => 'ຖ້າ', 'index_waiting' => 'ຖ້າ',
'individuals' => 'ບຸກຄົນ', 'individuals' => 'ບຸກຄົນ',
'individuals_in_groups' => 'ສະມາຊິກຂອງກຸ່ມ', 'individuals_in_groups' => 'ສະມາຊິກຂອງກຸ່ມ',
@ -913,6 +916,7 @@ URL: [url]',
'move_clipboard' => 'ຍ້າຍຄິບບອດ', 'move_clipboard' => 'ຍ້າຍຄິບບອດ',
'move_document' => 'ຍ້າຍເອກະສານ', 'move_document' => 'ຍ້າຍເອກະສານ',
'move_folder' => 'ຍ້າຍໂຟລເດີ', 'move_folder' => 'ຍ້າຍໂຟລເດີ',
'move_into_rootfolder' => '',
'my_account' => 'ບັນຊີຂອງຂ້ອຍ', 'my_account' => 'ບັນຊີຂອງຂ້ອຍ',
'my_documents' => 'ເອກະສານຂອງຂ້ອຍ', 'my_documents' => 'ເອກະສານຂອງຂ້ອຍ',
'my_transmittals' => 'ການຂົນສົ່ງຂອງຂ້ອຍ', 'my_transmittals' => 'ການຂົນສົ່ງຂອງຂ້ອຍ',
@ -1055,6 +1059,7 @@ URL: [url]',
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]:[name] - ປ່ຽນເຈົ້າຂອງແລ້ວ', 'ownership_changed_email_subject' => '[sitename]:[name] - ປ່ຽນເຈົ້າຂອງແລ້ວ',
'parent_folder' => '',
'password' => 'ລະຫັດຜ່ານ', 'password' => 'ລະຫັດຜ່ານ',
'password_already_used' => 'ລະຫັດຜ່ານທີນຳໄຊ້ແລ້ວ', 'password_already_used' => 'ລະຫັດຜ່ານທີນຳໄຊ້ແລ້ວ',
'password_expiration' => 'ລະຫັດຜ່ານໝົດອາຍຸ', 'password_expiration' => 'ລະຫັດຜ່ານໝົດອາຍຸ',
@ -1100,6 +1105,7 @@ URL: [url]',
'preview' => 'ເບີ່ງຕົວຢ່າງ', 'preview' => 'ເບີ່ງຕົວຢ່າງ',
'preview_converters' => 'ເບີ່ງຕົວຢ່າງການແປງເອກະສານ', 'preview_converters' => 'ເບີ່ງຕົວຢ່າງການແປງເອກະສານ',
'preview_images' => 'ເບີ່ງຮູບຕົງຢ່າງ', 'preview_images' => 'ເບີ່ງຮູບຕົງຢ່າງ',
'preview_images_text' => '',
'preview_markdown' => 'ເຮັດເຄື່ອງຫມາຍລົງ', 'preview_markdown' => 'ເຮັດເຄື່ອງຫມາຍລົງ',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => 'ຂໍ້ຄວາມ', 'preview_plain' => 'ຂໍ້ຄວາມ',
@ -1112,6 +1118,7 @@ URL: [url]',
'quota_exceeded' => 'ໂຄຕ້າດິສຂອງເຈົ້າມີຂະໜາດເກີນ [ໄບ]', 'quota_exceeded' => 'ໂຄຕ້າດິສຂອງເຈົ້າມີຂະໜາດເກີນ [ໄບ]',
'quota_is_disabled' => 'ຂະນະນີ້ການສະນັບສະໜູນໂຄຕ້າຖືກປິດໄຊ້ງານໃນການຕັ້ງຄ່າແລ້ວການກຳນົດໂຄຕ້າຜູ້ໄຊ້ຈະບໍ່ມີຜົນໄດໆ ຈົນກວ່າຈະເປີດໄຊ້ງານອີກຄັ້ງ', 'quota_is_disabled' => 'ຂະນະນີ້ການສະນັບສະໜູນໂຄຕ້າຖືກປິດໄຊ້ງານໃນການຕັ້ງຄ່າແລ້ວການກຳນົດໂຄຕ້າຜູ້ໄຊ້ຈະບໍ່ມີຜົນໄດໆ ຈົນກວ່າຈະເປີດໄຊ້ງານອີກຄັ້ງ',
'quota_warning' => 'ການໄຊ້ດິສສູງສຸດຂອງເຈົ້າເກີນ [ໄບຣ] ໂປດລົບເອກະສານຫຼືເວີຊັນກ່ອນໜ້າ', 'quota_warning' => 'ການໄຊ້ດິສສູງສຸດຂອງເຈົ້າເກີນ [ໄບຣ] ໂປດລົບເອກະສານຫຼືເວີຊັນກ່ອນໜ້າ',
'readme_loading' => '',
'receipts_accepted' => 'ໃບບິນຮັບເງີນໄດ້ຮັບການຍອມຮັບແລ້ວ [ບໍມີໃບບິນຮັບເງິນ]', 'receipts_accepted' => 'ໃບບິນຮັບເງີນໄດ້ຮັບການຍອມຮັບແລ້ວ [ບໍມີໃບບິນຮັບເງິນ]',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => 'ບໍ່ມີໃບບິນຮັບເງິນ', 'receipts_not_touched' => 'ບໍ່ມີໃບບິນຮັບເງິນ',
@ -1835,6 +1842,7 @@ URL: [url]',
'set_password' => 'ຕັ້ງລະຫັດຜ່ານ', 'set_password' => 'ຕັ້ງລະຫັດຜ່ານ',
'set_workflow' => 'ຕັ້ງຄ່າການທຳງານ', 'set_workflow' => 'ຕັ້ງຄ່າການທຳງານ',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'ລົງຊື່ເຂົາໄຊ້ໂດຍ', 'signed_in_as' => 'ລົງຊື່ເຂົາໄຊ້ໂດຍ',
'sign_in' => 'ລົງຊື່ເຂົາໄຊ້', 'sign_in' => 'ລົງຊື່ເຂົາໄຊ້',
@ -2098,6 +2106,7 @@ URL: [url]',
'update_approvers' => 'ອັບເດດລາຍຊື່ຜູ້ອະນຸມັດ', 'update_approvers' => 'ອັບເດດລາຍຊື່ຜູ້ອະນຸມັດ',
'update_document' => 'ອັບເດດເອກະສານ', 'update_document' => 'ອັບເດດເອກະສານ',
'update_fulltext_index' => 'ອັບເດດດັດຊະນີຂໍ້ຄວາມແບບເຕັມຮູບແບບ', 'update_fulltext_index' => 'ອັບເດດດັດຊະນີຂໍ້ຄວາມແບບເຕັມຮູບແບບ',
'update_fulltext_messages' => '',
'update_info' => 'ອັບເດດຂໍ້ມູນ', 'update_info' => 'ອັບເດດຂໍ້ມູນ',
'update_locked_msg' => 'ເອກະສານນີ້ຖືກລັອກ', 'update_locked_msg' => 'ເອກະສານນີ້ຖືກລັອກ',
'update_recipients' => 'ອັບເດລາຍຊື່ຜູ້ຮັບ', 'update_recipients' => 'ອັບເດລາຍຊື່ຜູ້ຮັບ',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Ta bort dumpfil', 'dump_remove' => 'Ta bort dumpfil',
'duplicates' => 'Duplikater', 'duplicates' => 'Duplikater',
'duplicate_content' => 'Dubliser innehold', 'duplicate_content' => 'Dubliser innehold',
'duplicate_sequences' => '',
'edit' => 'Rediger', 'edit' => 'Rediger',
'edit_attributes' => 'Rediger egenskaper', 'edit_attributes' => 'Rediger egenskaper',
'edit_comment' => 'Rediger kommentar', 'edit_comment' => 'Rediger kommentar',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Tilgjengelig', 'extension_mgr_repository' => 'Tilgjengelig',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Versjon', 'extension_version_list' => 'Versjon',
'february' => 'Februar', 'february' => 'Februar',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Indekserte ikke innhold', 'index_no_content' => 'Indekserte ikke innhold',
'index_pending' => 'Avventer', 'index_pending' => 'Avventer',
'index_processing' => '',
'index_waiting' => 'Venter', 'index_waiting' => 'Venter',
'individuals' => 'Personer', 'individuals' => 'Personer',
'individuals_in_groups' => 'Medlemmer i en gruppe', 'individuals_in_groups' => 'Medlemmer i en gruppe',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Flytt utklippstavlen', 'move_clipboard' => 'Flytt utklippstavlen',
'move_document' => 'Flytte dokument', 'move_document' => 'Flytte dokument',
'move_folder' => 'Flytte mappe', 'move_folder' => 'Flytte mappe',
'move_into_rootfolder' => '',
'my_account' => 'Min side', 'my_account' => 'Min side',
'my_documents' => 'Mine dokumenter', 'my_documents' => 'Mine dokumenter',
'my_transmittals' => 'Mine sendinger', 'my_transmittals' => 'Mine sendinger',
@ -1076,6 +1080,7 @@ Bruker: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Eier endret', 'ownership_changed_email_subject' => '[sitename]: [name] - Eier endret',
'parent_folder' => '',
'password' => 'Passord', 'password' => 'Passord',
'password_already_used' => 'Passord allerede brukt', 'password_already_used' => 'Passord allerede brukt',
'password_expiration' => 'Passord utgått', 'password_expiration' => 'Passord utgått',
@ -1115,6 +1120,7 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.',
'preview' => 'Forhåndsvisning', 'preview' => 'Forhåndsvisning',
'preview_converters' => 'Forhåndsvis dokumentkonvertering', 'preview_converters' => 'Forhåndsvis dokumentkonvertering',
'preview_images' => 'Forhåndsvis bilder', 'preview_images' => 'Forhåndsvis bilder',
'preview_images_text' => '',
'preview_markdown' => 'Forminsking', 'preview_markdown' => 'Forminsking',
'preview_pdf' => 'Forhåndsvis som PDF', 'preview_pdf' => 'Forhåndsvis som PDF',
'preview_plain' => 'Tekst', 'preview_plain' => 'Tekst',
@ -1127,6 +1133,7 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.',
'quota_exceeded' => 'Diskkvoten din er overskridet med [bytes].', 'quota_exceeded' => 'Diskkvoten din er overskridet med [bytes].',
'quota_is_disabled' => 'Kvotestøtte er for øyeblikket deaktivert i innstillingene. Å sette en brukerkvote vil ikke ha noen effekt før den er aktivert igjen.', 'quota_is_disabled' => 'Kvotestøtte er for øyeblikket deaktivert i innstillingene. Å sette en brukerkvote vil ikke ha noen effekt før den er aktivert igjen.',
'quota_warning' => 'Din maksimale lagringskvote er overskredet med [bytes]. Ta bort dokumenter eller tidigere versjoner.', 'quota_warning' => 'Din maksimale lagringskvote er overskredet med [bytes]. Ta bort dokumenter eller tidigere versjoner.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] kvitteringer allerede akseptert', 'receipts_accepted' => '[no_receipts] kvitteringer allerede akseptert',
'receipts_accepted_latest' => '(er [no_receipts] i siste versjon)', 'receipts_accepted_latest' => '(er [no_receipts] i siste versjon)',
'receipts_not_touched' => '[no_receipts] kvitteringer ikke blir berørt', 'receipts_not_touched' => '[no_receipts] kvitteringer ikke blir berørt',
@ -1848,6 +1855,7 @@ Bruker: [username]
'set_password' => 'Angi passord', 'set_password' => 'Angi passord',
'set_workflow' => 'Velg arbeidsflyt', 'set_workflow' => 'Velg arbeidsflyt',
'show_extension_changelog' => 'Vis forandrings logg', 'show_extension_changelog' => 'Vis forandrings logg',
'show_extension_readme' => '',
'show_extension_version_list' => 'Vis liste over versjoner', 'show_extension_version_list' => 'Vis liste over versjoner',
'signed_in_as' => 'Innlogget som', 'signed_in_as' => 'Innlogget som',
'sign_in' => 'Logg inn', 'sign_in' => 'Logg inn',
@ -2111,6 +2119,7 @@ URL: [url]',
'update_approvers' => 'Oppdater liste over godkjennere', 'update_approvers' => 'Oppdater liste over godkjennere',
'update_document' => 'Oppdater dokumentet', 'update_document' => 'Oppdater dokumentet',
'update_fulltext_index' => 'Oppdater fulltekstindeksen', 'update_fulltext_index' => 'Oppdater fulltekstindeksen',
'update_fulltext_messages' => '',
'update_info' => 'Oppdater informasjon', 'update_info' => 'Oppdater informasjon',
'update_locked_msg' => 'Dette dokumentet er låst.', 'update_locked_msg' => 'Dette dokumentet er låst.',
'update_recipients' => 'Oppdater liste over mottakere', 'update_recipients' => 'Oppdater liste over mottakere',

View File

@ -531,6 +531,7 @@ URL: [url]',
'dump_remove' => 'Verwijder dump bestand', 'dump_remove' => 'Verwijder dump bestand',
'duplicates' => 'Doublures', 'duplicates' => 'Doublures',
'duplicate_content' => 'Dubbele inhoud', 'duplicate_content' => 'Dubbele inhoud',
'duplicate_sequences' => '',
'edit' => 'Wijzigen', 'edit' => 'Wijzigen',
'edit_attributes' => 'Bewerk attributen', 'edit_attributes' => 'Bewerk attributen',
'edit_comment' => 'Wijzig commentaar', 'edit_comment' => 'Wijzig commentaar',
@ -637,6 +638,7 @@ URL: [url]',
'extension_mgr_repository' => 'Beschikbaar', 'extension_mgr_repository' => 'Beschikbaar',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => 'Naam extensie ontbreekt', 'extension_missing_name' => 'Naam extensie ontbreekt',
'extension_readme' => '',
'extension_toggle_error' => 'Omschakelen mislukt', 'extension_toggle_error' => 'Omschakelen mislukt',
'extension_version_list' => 'Versies', 'extension_version_list' => 'Versies',
'february' => 'februari', 'february' => 'februari',
@ -777,6 +779,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Index heeft geen inhoud', 'index_no_content' => 'Index heeft geen inhoud',
'index_pending' => 'Indexering moet nog gebeuren', 'index_pending' => 'Indexering moet nog gebeuren',
'index_processing' => '',
'index_waiting' => 'Indexering wacht', 'index_waiting' => 'Indexering wacht',
'individuals' => 'Individuen', 'individuals' => 'Individuen',
'individuals_in_groups' => 'Individuen in groepen', 'individuals_in_groups' => 'Individuen in groepen',
@ -927,6 +930,7 @@ URL: [url]',
'move_clipboard' => 'Verplaats klembord', 'move_clipboard' => 'Verplaats klembord',
'move_document' => 'Verplaats document', 'move_document' => 'Verplaats document',
'move_folder' => 'Map verplaatsen', 'move_folder' => 'Map verplaatsen',
'move_into_rootfolder' => '',
'my_account' => 'Mijn Account', 'my_account' => 'Mijn Account',
'my_documents' => 'Mijn Documenten', 'my_documents' => 'Mijn Documenten',
'my_transmittals' => 'Mijn zendingen', 'my_transmittals' => 'Mijn zendingen',
@ -1068,6 +1072,7 @@ Gebruiker: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Eigenaar gewijzigd', 'ownership_changed_email_subject' => '[sitename]: [name] - Eigenaar gewijzigd',
'parent_folder' => '',
'password' => 'Wachtwoord', 'password' => 'Wachtwoord',
'password_already_used' => 'Wachtwoord al gebruikt', 'password_already_used' => 'Wachtwoord al gebruikt',
'password_expiration' => 'Wachtwoord vervaldatum', 'password_expiration' => 'Wachtwoord vervaldatum',
@ -1114,6 +1119,7 @@ Mocht u de komende minuten geen email ontvangen, probeer het dan nogmaals en con
'preview' => 'Voorbeeld', 'preview' => 'Voorbeeld',
'preview_converters' => 'Converters', 'preview_converters' => 'Converters',
'preview_images' => 'Voorbeelden', 'preview_images' => 'Voorbeelden',
'preview_images_text' => '',
'preview_markdown' => 'Voorbeeld in Markdown', 'preview_markdown' => 'Voorbeeld in Markdown',
'preview_pdf' => 'Inhoud van het document', 'preview_pdf' => 'Inhoud van het document',
'preview_plain' => 'Voorbeeld in platte tekst', 'preview_plain' => 'Voorbeeld in platte tekst',
@ -1126,6 +1132,7 @@ Mocht u de komende minuten geen email ontvangen, probeer het dan nogmaals en con
'quota_exceeded' => 'Uw data quotum is overschreden met [bytes].', 'quota_exceeded' => 'Uw data quotum is overschreden met [bytes].',
'quota_is_disabled' => 'Quota support is momenteel niet actief in de eigenschappen. Een user-quotum instellen zal geen effect hebben tot quota actief zijn', 'quota_is_disabled' => 'Quota support is momenteel niet actief in de eigenschappen. Een user-quotum instellen zal geen effect hebben tot quota actief zijn',
'quota_warning' => 'Uw maximale datagebruik is overschreden met [bytes]. Gelieve documenten of eerdere versies te verwijderen.', 'quota_warning' => 'Uw maximale datagebruik is overschreden met [bytes]. Gelieve documenten of eerdere versies te verwijderen.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] ontvangen en geaccepteerd', 'receipts_accepted' => '[no_receipts] ontvangen en geaccepteerd',
'receipts_accepted_latest' => '(er zijn [no_receipts] in de nieuwste versie)', 'receipts_accepted_latest' => '(er zijn [no_receipts] in de nieuwste versie)',
'receipts_not_touched' => '[no_receipts] ontvangen, nog niet behandeld', 'receipts_not_touched' => '[no_receipts] ontvangen, nog niet behandeld',
@ -1847,6 +1854,7 @@ Name: [username]
'set_password' => 'Stel wachtwoord in', 'set_password' => 'Stel wachtwoord in',
'set_workflow' => 'Stel workflow in', 'set_workflow' => 'Stel workflow in',
'show_extension_changelog' => 'Toon wijzigingslog', 'show_extension_changelog' => 'Toon wijzigingslog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Toon lijst met versies', 'show_extension_version_list' => 'Toon lijst met versies',
'signed_in_as' => 'Ingelogd als:', 'signed_in_as' => 'Ingelogd als:',
'sign_in' => 'Log in', 'sign_in' => 'Log in',
@ -2110,6 +2118,7 @@ URL: [url]',
'update_approvers' => 'Bijwerken lijst van [Goedkeurders]', 'update_approvers' => 'Bijwerken lijst van [Goedkeurders]',
'update_document' => 'Bijwerken', 'update_document' => 'Bijwerken',
'update_fulltext_index' => 'Index voor fulltext search bijwerken', 'update_fulltext_index' => 'Index voor fulltext search bijwerken',
'update_fulltext_messages' => '',
'update_info' => 'Update-informatie', 'update_info' => 'Update-informatie',
'update_locked_msg' => 'Dit document is geblokkeerd.', 'update_locked_msg' => 'Dit document is geblokkeerd.',
'update_recipients' => 'Update de lijst vanontvangers', 'update_recipients' => 'Update de lijst vanontvangers',

View File

@ -514,6 +514,7 @@ URL: [url]',
'dump_remove' => 'Usuń plik zrzutu', 'dump_remove' => 'Usuń plik zrzutu',
'duplicates' => 'Duplikaty', 'duplicates' => 'Duplikaty',
'duplicate_content' => 'Zduplikowana zawartość', 'duplicate_content' => 'Zduplikowana zawartość',
'duplicate_sequences' => '',
'edit' => 'Edytuj', 'edit' => 'Edytuj',
'edit_attributes' => 'Zmiana atrybutów', 'edit_attributes' => 'Zmiana atrybutów',
'edit_comment' => 'Edytuj komentarz', 'edit_comment' => 'Edytuj komentarz',
@ -620,6 +621,7 @@ URL: [url]',
'extension_mgr_repository' => 'Dostępne', 'extension_mgr_repository' => 'Dostępne',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Wersje', 'extension_version_list' => 'Wersje',
'february' => 'Luty', 'february' => 'Luty',
@ -753,6 +755,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Nie indeksuje zawartości', 'index_no_content' => 'Nie indeksuje zawartości',
'index_pending' => 'Oczekujące', 'index_pending' => 'Oczekujące',
'index_processing' => '',
'index_waiting' => 'Oczekiwanie', 'index_waiting' => 'Oczekiwanie',
'individuals' => 'Indywidualni', 'individuals' => 'Indywidualni',
'individuals_in_groups' => 'Członkowie grupy', 'individuals_in_groups' => 'Członkowie grupy',
@ -903,6 +906,7 @@ URL: [url]',
'move_clipboard' => 'Przenieś schowek', 'move_clipboard' => 'Przenieś schowek',
'move_document' => 'Przenieś dokument', 'move_document' => 'Przenieś dokument',
'move_folder' => 'Przenieś folder', 'move_folder' => 'Przenieś folder',
'move_into_rootfolder' => '',
'my_account' => 'Moje konto', 'my_account' => 'Moje konto',
'my_documents' => 'Moje dokumenty', 'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'Moi recenzenci', 'my_transmittals' => 'Moi recenzenci',
@ -1045,6 +1049,7 @@ Użytkownik: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Zmiana właściciela', 'ownership_changed_email_subject' => '[sitename]: [name] - Zmiana właściciela',
'parent_folder' => '',
'password' => 'Hasło', 'password' => 'Hasło',
'password_already_used' => 'Hasło jest aktualnie używane', 'password_already_used' => 'Hasło jest aktualnie używane',
'password_expiration' => 'Wygaśnięcie hasła', 'password_expiration' => 'Wygaśnięcie hasła',
@ -1090,6 +1095,7 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem
'preview' => 'Podgląd', 'preview' => 'Podgląd',
'preview_converters' => 'Podgląd konwersji dokumentu', 'preview_converters' => 'Podgląd konwersji dokumentu',
'preview_images' => 'Podgląd obrazu', 'preview_images' => 'Podgląd obrazu',
'preview_images_text' => '',
'preview_markdown' => 'Oznacz w dół', 'preview_markdown' => 'Oznacz w dół',
'preview_pdf' => 'Podgląd PDF', 'preview_pdf' => 'Podgląd PDF',
'preview_plain' => 'Zwykły podgląd', 'preview_plain' => 'Zwykły podgląd',
@ -1102,6 +1108,7 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem
'quota_exceeded' => 'Twój limit przydzielonej przestrzeni dyskowej został przekroczony o [bytes].', 'quota_exceeded' => 'Twój limit przydzielonej przestrzeni dyskowej został przekroczony o [bytes].',
'quota_is_disabled' => 'Wsparcie limitów dyskowych jest obecnie wyłączone w ustawieniach. Ustawiony limit dyskowy użytkownika nie będzie działał dopóki wparcie nie zostanie ponownie włączone.', 'quota_is_disabled' => 'Wsparcie limitów dyskowych jest obecnie wyłączone w ustawieniach. Ustawiony limit dyskowy użytkownika nie będzie działał dopóki wparcie nie zostanie ponownie włączone.',
'quota_warning' => 'Przekroczono użycie dysku o [bytes]. Usuń dokumenty lub poprzednie wersje.', 'quota_warning' => 'Przekroczono użycie dysku o [bytes]. Usuń dokumenty lub poprzednie wersje.',
'readme_loading' => '',
'receipts_accepted' => 'Potwierdzenia zaakceptowane', 'receipts_accepted' => 'Potwierdzenia zaakceptowane',
'receipts_accepted_latest' => '(istnieje [no_receipts] w ostatniej wersji)', 'receipts_accepted_latest' => '(istnieje [no_receipts] w ostatniej wersji)',
'receipts_not_touched' => 'Potwierdzenia nieoglądane', 'receipts_not_touched' => 'Potwierdzenia nieoglądane',
@ -1778,6 +1785,7 @@ Name: [username]
'set_password' => 'Zmień hasło', 'set_password' => 'Zmień hasło',
'set_workflow' => 'Ustaw proces', 'set_workflow' => 'Ustaw proces',
'show_extension_changelog' => 'Pokaż Changelog', 'show_extension_changelog' => 'Pokaż Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Pokaż listę wersji', 'show_extension_version_list' => 'Pokaż listę wersji',
'signed_in_as' => 'Zalogowany jako', 'signed_in_as' => 'Zalogowany jako',
'sign_in' => 'Zaloguj się', 'sign_in' => 'Zaloguj się',
@ -2041,6 +2049,7 @@ URL: [url]',
'update_approvers' => 'Aktualizuj listę osób zatwierdzających', 'update_approvers' => 'Aktualizuj listę osób zatwierdzających',
'update_document' => 'Aktualizuj dokument', 'update_document' => 'Aktualizuj dokument',
'update_fulltext_index' => 'Aktualizuj indeks pełnotekstowy', 'update_fulltext_index' => 'Aktualizuj indeks pełnotekstowy',
'update_fulltext_messages' => '',
'update_info' => 'Aktualizuj informacje', 'update_info' => 'Aktualizuj informacje',
'update_locked_msg' => 'Ten dokument jest zablokowany.', 'update_locked_msg' => 'Ten dokument jest zablokowany.',
'update_recipients' => 'Zaktualizuj listę odbiorców', 'update_recipients' => 'Zaktualizuj listę odbiorców',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Remover arquivo de despejo', 'dump_remove' => 'Remover arquivo de despejo',
'duplicates' => 'Duplicados', 'duplicates' => 'Duplicados',
'duplicate_content' => 'Conteúdo duplicado', 'duplicate_content' => 'Conteúdo duplicado',
'duplicate_sequences' => '',
'edit' => 'editar', 'edit' => 'editar',
'edit_attributes' => 'Editar atributos', 'edit_attributes' => 'Editar atributos',
'edit_comment' => 'Editar comentário', 'edit_comment' => 'Editar comentário',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponível', 'extension_mgr_repository' => 'Disponível',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Versões', 'extension_version_list' => 'Versões',
'february' => 'Fevereiro', 'february' => 'Fevereiro',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Não indexou o conteúdo', 'index_no_content' => 'Não indexou o conteúdo',
'index_pending' => 'Pendente', 'index_pending' => 'Pendente',
'index_processing' => '',
'index_waiting' => 'Aguarde...', 'index_waiting' => 'Aguarde...',
'individuals' => 'Indivíduos', 'individuals' => 'Indivíduos',
'individuals_in_groups' => 'Members of a group', 'individuals_in_groups' => 'Members of a group',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Mover para memória auxiliar', 'move_clipboard' => 'Mover para memória auxiliar',
'move_document' => 'Mover documento', 'move_document' => 'Mover documento',
'move_folder' => 'Mover Pasta', 'move_folder' => 'Mover Pasta',
'move_into_rootfolder' => '',
'my_account' => 'Minha Conta', 'my_account' => 'Minha Conta',
'my_documents' => 'Meus Documentos', 'my_documents' => 'Meus Documentos',
'my_transmittals' => 'Minhas Transmissões', 'my_transmittals' => 'Minhas Transmissões',
@ -1075,6 +1079,7 @@ Usuário: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Proprietário mudou', 'ownership_changed_email_subject' => '[sitename]: [name] - Proprietário mudou',
'parent_folder' => '',
'password' => 'Senha', 'password' => 'Senha',
'password_already_used' => 'Senha já usada', 'password_already_used' => 'Senha já usada',
'password_expiration' => 'Expiração de senha', 'password_expiration' => 'Expiração de senha',
@ -1120,6 +1125,7 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ
'preview' => 'visualizar', 'preview' => 'visualizar',
'preview_converters' => 'Visualizar a conversão do documento', 'preview_converters' => 'Visualizar a conversão do documento',
'preview_images' => 'Imagens de pré-visualização', 'preview_images' => 'Imagens de pré-visualização',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => 'Visualizar como PDF', 'preview_pdf' => 'Visualizar como PDF',
'preview_plain' => 'Texto', 'preview_plain' => 'Texto',
@ -1132,6 +1138,7 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ
'quota_exceeded' => 'Sua cota de disco foi ultrapassada em [bytes].', 'quota_exceeded' => 'Sua cota de disco foi ultrapassada em [bytes].',
'quota_is_disabled' => 'Suporte a cota está desativado nas configurações. A definição de cota do usuário não terá efeito até que seja habilitada novamente.', 'quota_is_disabled' => 'Suporte a cota está desativado nas configurações. A definição de cota do usuário não terá efeito até que seja habilitada novamente.',
'quota_warning' => 'Seu uso máximo do disco foi ultrapassado em [bytes]. Por favor, remova documentos ou versões anteriores.', 'quota_warning' => 'Seu uso máximo do disco foi ultrapassado em [bytes]. Por favor, remova documentos ou versões anteriores.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] recibos já aceitos', 'receipts_accepted' => '[no_receipts] recibos já aceitos',
'receipts_accepted_latest' => 'recibos aceites mais recentes', 'receipts_accepted_latest' => 'recibos aceites mais recentes',
'receipts_not_touched' => '[no_receipts] recibos não tocados', 'receipts_not_touched' => '[no_receipts] recibos não tocados',
@ -1854,6 +1861,7 @@ Nome: [username]
'set_password' => 'Definir Senha', 'set_password' => 'Definir Senha',
'set_workflow' => 'Definir fluxo de trabalho', 'set_workflow' => 'Definir fluxo de trabalho',
'show_extension_changelog' => 'Mostrar Changelog', 'show_extension_changelog' => 'Mostrar Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Exibir Lista de Versões', 'show_extension_version_list' => 'Exibir Lista de Versões',
'signed_in_as' => 'Logado', 'signed_in_as' => 'Logado',
'sign_in' => 'Entre com seu usuário e senha', 'sign_in' => 'Entre com seu usuário e senha',
@ -2117,6 +2125,7 @@ URL: [url]',
'update_approvers' => 'Atualizar lista de aprovadores', 'update_approvers' => 'Atualizar lista de aprovadores',
'update_document' => 'Atualizar', 'update_document' => 'Atualizar',
'update_fulltext_index' => 'Índice de atualização de texto completo', 'update_fulltext_index' => 'Índice de atualização de texto completo',
'update_fulltext_messages' => '',
'update_info' => 'Atualizar informação', 'update_info' => 'Atualizar informação',
'update_locked_msg' => 'Este documento está travado.', 'update_locked_msg' => 'Este documento está travado.',
'update_recipients' => 'Atualizar lista de destinatários', 'update_recipients' => 'Atualizar lista de destinatários',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => 'Sterge fișier imagine', 'dump_remove' => 'Sterge fișier imagine',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => '', 'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Editează', 'edit' => 'Editează',
'edit_attributes' => 'Editează atribute', 'edit_attributes' => 'Editează atribute',
'edit_comment' => 'Editează comentariu', 'edit_comment' => 'Editează comentariu',
@ -632,6 +633,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponibila', 'extension_mgr_repository' => 'Disponibila',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Versiuni', 'extension_version_list' => 'Versiuni',
'february' => 'Februarie', 'february' => 'Februarie',
@ -765,6 +767,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Așteptare', 'index_waiting' => 'Așteptare',
'individuals' => 'Individuals', 'individuals' => 'Individuals',
'individuals_in_groups' => '', 'individuals_in_groups' => '',
@ -915,6 +918,7 @@ URL: [url]',
'move_clipboard' => 'Mută clipboard', 'move_clipboard' => 'Mută clipboard',
'move_document' => 'Mută document', 'move_document' => 'Mută document',
'move_folder' => 'Mută Folder', 'move_folder' => 'Mută Folder',
'move_into_rootfolder' => '',
'my_account' => 'Contul Meu', 'my_account' => 'Contul Meu',
'my_documents' => 'Documentele Mele', 'my_documents' => 'Documentele Mele',
'my_transmittals' => 'Trimiterile mele', 'my_transmittals' => 'Trimiterile mele',
@ -1057,6 +1061,7 @@ Utilizator: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Proprietar schimbat', 'ownership_changed_email_subject' => '[sitename]: [name] - Proprietar schimbat',
'parent_folder' => '',
'password' => 'Parolă', 'password' => 'Parolă',
'password_already_used' => 'Parolă folosită deja', 'password_already_used' => 'Parolă folosită deja',
'password_expiration' => 'Expirare parolă', 'password_expiration' => 'Expirare parolă',
@ -1102,6 +1107,7 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț
'preview' => 'Previzualizare', 'preview' => 'Previzualizare',
'preview_converters' => '', 'preview_converters' => '',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -1114,6 +1120,7 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț
'quota_exceeded' => 'Spatiul tău alocat pe disc este depășit cu [bytes].', 'quota_exceeded' => 'Spatiul tău alocat pe disc este depășit cu [bytes].',
'quota_is_disabled' => 'Spatiu alocat este dezactivată în setări. Stabilirea unui spatiu alocat pentru utilizator nu va avea nici un efect până când setarea este reactivată din nou.', 'quota_is_disabled' => 'Spatiu alocat este dezactivată în setări. Stabilirea unui spatiu alocat pentru utilizator nu va avea nici un efect până când setarea este reactivată din nou.',
'quota_warning' => 'Dimensiunea dumneavoastră maximă este depasită cu [bytes]. Vă rugăm să eliminați documente sau versiuni anterioare.', 'quota_warning' => 'Dimensiunea dumneavoastră maximă este depasită cu [bytes]. Vă rugăm să eliminați documente sau versiuni anterioare.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1816,6 +1823,7 @@ URL: [url]',
'set_password' => 'Setare Parolă', 'set_password' => 'Setare Parolă',
'set_workflow' => 'Setare Workflow', 'set_workflow' => 'Setare Workflow',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => 'Arata o lista a versiunilor', 'show_extension_version_list' => 'Arata o lista a versiunilor',
'signed_in_as' => 'Autentificat ca', 'signed_in_as' => 'Autentificat ca',
'sign_in' => 'Sign in', 'sign_in' => 'Sign in',
@ -2079,6 +2087,7 @@ URL: [url]',
'update_approvers' => 'Actualizare Listă de aprobatori', 'update_approvers' => 'Actualizare Listă de aprobatori',
'update_document' => 'Actualizare document', 'update_document' => 'Actualizare document',
'update_fulltext_index' => 'Actualizare index pe tot textul (fulltext index)', 'update_fulltext_index' => 'Actualizare index pe tot textul (fulltext index)',
'update_fulltext_messages' => '',
'update_info' => 'Informații actualizare', 'update_info' => 'Informații actualizare',
'update_locked_msg' => 'Acest document este blocat.', 'update_locked_msg' => 'Acest document este blocat.',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => 'Удалить дамп', 'dump_remove' => 'Удалить дамп',
'duplicates' => 'Дубликаты', 'duplicates' => 'Дубликаты',
'duplicate_content' => 'Дублированное содержимое', 'duplicate_content' => 'Дублированное содержимое',
'duplicate_sequences' => '',
'edit' => 'Изменить', 'edit' => 'Изменить',
'edit_attributes' => 'Изменить атрибуты', 'edit_attributes' => 'Изменить атрибуты',
'edit_comment' => 'Изменить комментарий', 'edit_comment' => 'Изменить комментарий',
@ -632,6 +633,7 @@ URL: [url]',
'extension_mgr_repository' => 'Установленные', 'extension_mgr_repository' => 'Установленные',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Версии', 'extension_version_list' => 'Версии',
'february' => 'Февраль', 'february' => 'Февраль',
@ -765,6 +767,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Ожидание', 'index_waiting' => 'Ожидание',
'individuals' => 'Пользователи', 'individuals' => 'Пользователи',
'individuals_in_groups' => 'Пользователи группы', 'individuals_in_groups' => 'Пользователи группы',
@ -915,6 +918,7 @@ URL: [url]',
'move_clipboard' => 'Переместить буфер обмена', 'move_clipboard' => 'Переместить буфер обмена',
'move_document' => 'Переместить документ', 'move_document' => 'Переместить документ',
'move_folder' => 'Переместить каталог', 'move_folder' => 'Переместить каталог',
'move_into_rootfolder' => '',
'my_account' => 'Моя учётка', 'my_account' => 'Моя учётка',
'my_documents' => 'Мои документы', 'my_documents' => 'Мои документы',
'my_transmittals' => 'Мои пересылки', 'my_transmittals' => 'Мои пересылки',
@ -1056,6 +1060,7 @@ URL: [url]',
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: изменён владелец «[name]»', 'ownership_changed_email_subject' => '[sitename]: изменён владелец «[name]»',
'parent_folder' => '',
'password' => 'Пароль', 'password' => 'Пароль',
'password_already_used' => 'Пароль уже используется', 'password_already_used' => 'Пароль уже используется',
'password_expiration' => 'Срок действия пароля', 'password_expiration' => 'Срок действия пароля',
@ -1099,6 +1104,7 @@ URL: [url]',
'preview' => 'Предварительный просмотр', 'preview' => 'Предварительный просмотр',
'preview_converters' => 'Предварительный просмотр конвертации документа', 'preview_converters' => 'Предварительный просмотр конвертации документа',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => 'Текст', 'preview_plain' => 'Текст',
@ -1111,6 +1117,7 @@ URL: [url]',
'quota_exceeded' => 'Ваша дисковая квота превышена на [bytes].', 'quota_exceeded' => 'Ваша дисковая квота превышена на [bytes].',
'quota_is_disabled' => 'Поддержка квот в настоящее время отключена в настройках.', 'quota_is_disabled' => 'Поддержка квот в настоящее время отключена в настройках.',
'quota_warning' => 'Ваша дисковая квота превышена на [bytes]. Удалите ненужные документы или их предыдущие версии.', 'quota_warning' => 'Ваша дисковая квота превышена на [bytes]. Удалите ненужные документы или их предыдущие версии.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1823,6 +1830,7 @@ URL: [url]',
'set_password' => 'Установить пароль', 'set_password' => 'Установить пароль',
'set_workflow' => 'Установить процесс', 'set_workflow' => 'Установить процесс',
'show_extension_changelog' => 'Показать журнал изменений', 'show_extension_changelog' => 'Показать журнал изменений',
'show_extension_readme' => '',
'show_extension_version_list' => 'Показать список версий', 'show_extension_version_list' => 'Показать список версий',
'signed_in_as' => 'Пользователь', 'signed_in_as' => 'Пользователь',
'sign_in' => 'Войти', 'sign_in' => 'Войти',
@ -2086,6 +2094,7 @@ URL: [url]',
'update_approvers' => 'Обновить список утверждающих', 'update_approvers' => 'Обновить список утверждающих',
'update_document' => 'Обновить документ', 'update_document' => 'Обновить документ',
'update_fulltext_index' => 'Обновить полнотекстовый индекс', 'update_fulltext_index' => 'Обновить полнотекстовый индекс',
'update_fulltext_messages' => '',
'update_info' => 'Обновить информацию', 'update_info' => 'Обновить информацию',
'update_locked_msg' => 'Этот документ заблокирован', 'update_locked_msg' => 'Этот документ заблокирован',
'update_recipients' => 'Обновить список получателей', 'update_recipients' => 'Обновить список получателей',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Odstrániť vystup', 'dump_remove' => 'Odstrániť vystup',
'duplicates' => 'Duplikáty', 'duplicates' => 'Duplikáty',
'duplicate_content' => 'Duplicitný obsah', 'duplicate_content' => 'Duplicitný obsah',
'duplicate_sequences' => '',
'edit' => 'upraviť', 'edit' => 'upraviť',
'edit_attributes' => 'Uprav parametre', 'edit_attributes' => 'Uprav parametre',
'edit_comment' => 'Upraviť komentár', 'edit_comment' => 'Upraviť komentár',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Available', 'extension_mgr_repository' => 'Available',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Versions', 'extension_version_list' => 'Versions',
'february' => 'Február', 'february' => 'Február',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => 'Did not index content', 'index_no_content' => 'Did not index content',
'index_pending' => 'Pending', 'index_pending' => 'Pending',
'index_processing' => '',
'index_waiting' => 'Čakajte', 'index_waiting' => 'Čakajte',
'individuals' => 'Jednotlivci', 'individuals' => 'Jednotlivci',
'individuals_in_groups' => 'Členovia skupiny', 'individuals_in_groups' => 'Členovia skupiny',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Presunúť schránku', 'move_clipboard' => 'Presunúť schránku',
'move_document' => 'Presunúť dokument', 'move_document' => 'Presunúť dokument',
'move_folder' => 'Presunúť zložku', 'move_folder' => 'Presunúť zložku',
'move_into_rootfolder' => '',
'my_account' => 'Môj účet', 'my_account' => 'Môj účet',
'my_documents' => 'Moje dokumenty', 'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'My Transmittals', 'my_transmittals' => 'My Transmittals',
@ -1076,6 +1080,7 @@ Používateľ: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Vlastník zmenený', 'ownership_changed_email_subject' => '[sitename]: [name] - Vlastník zmenený',
'parent_folder' => '',
'password' => 'Heslo', 'password' => 'Heslo',
'password_already_used' => 'Heslo sa už používa', 'password_already_used' => 'Heslo sa už používa',
'password_expiration' => 'Vypršanie hesla', 'password_expiration' => 'Vypršanie hesla',
@ -1121,6 +1126,7 @@ If you have still problems to login, then please contact your administrator.',
'preview' => 'Náhľad', 'preview' => 'Náhľad',
'preview_converters' => 'Ukážka konverzie dokumentu', 'preview_converters' => 'Ukážka konverzie dokumentu',
'preview_images' => 'Náhľad obrázkov', 'preview_images' => 'Náhľad obrázkov',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => 'Preview as PDF', 'preview_pdf' => 'Preview as PDF',
'preview_plain' => 'Text', 'preview_plain' => 'Text',
@ -1133,6 +1139,7 @@ If you have still problems to login, then please contact your administrator.',
'quota_exceeded' => 'Vaša disková kvóta bola prekročená o [bytes].', 'quota_exceeded' => 'Vaša disková kvóta bola prekročená o [bytes].',
'quota_is_disabled' => 'Podpora kvót je momentálne zakázaná v nastaveniach. Nastavenie kvóty používateľa nebude mať žiadny účinok, kým nebude znovu aktivovaná.', 'quota_is_disabled' => 'Podpora kvót je momentálne zakázaná v nastaveniach. Nastavenie kvóty používateľa nebude mať žiadny účinok, kým nebude znovu aktivovaná.',
'quota_warning' => 'Maximálne využitie disku je prekročené o [bytes]. Odstráňte dokumenty alebo predchádzajúce verzie.', 'quota_warning' => 'Maximálne využitie disku je prekročené o [bytes]. Odstráňte dokumenty alebo predchádzajúce verzie.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] receipts already accepted', 'receipts_accepted' => '[no_receipts] receipts already accepted',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '[no_receipts] receipts not being touched', 'receipts_not_touched' => '[no_receipts] receipts not being touched',
@ -1856,6 +1863,7 @@ Meno: [username]
'set_password' => 'Nastaviť heslo', 'set_password' => 'Nastaviť heslo',
'set_workflow' => 'Set Workflow', 'set_workflow' => 'Set Workflow',
'show_extension_changelog' => 'Show Changelog', 'show_extension_changelog' => 'Show Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Show list of versions', 'show_extension_version_list' => 'Show list of versions',
'signed_in_as' => 'Prihlásený ako', 'signed_in_as' => 'Prihlásený ako',
'sign_in' => 'Prihlásiť sa', 'sign_in' => 'Prihlásiť sa',
@ -2119,6 +2127,7 @@ URL: [url]',
'update_approvers' => 'Aktualizovať zoznam schvaľovateľov', 'update_approvers' => 'Aktualizovať zoznam schvaľovateľov',
'update_document' => 'Aktualizovať', 'update_document' => 'Aktualizovať',
'update_fulltext_index' => 'Aktualizovať fulltext index', 'update_fulltext_index' => 'Aktualizovať fulltext index',
'update_fulltext_messages' => '',
'update_info' => 'Aktualizovať informácie', 'update_info' => 'Aktualizovať informácie',
'update_locked_msg' => 'Tento dokument je zamknutý.', 'update_locked_msg' => 'Tento dokument je zamknutý.',
'update_recipients' => 'Aktualizovať zoznam recipientov', 'update_recipients' => 'Aktualizovať zoznam recipientov',

View File

@ -532,6 +532,7 @@ URL: [url]',
'dump_remove' => 'Ta bort dumpfil', 'dump_remove' => 'Ta bort dumpfil',
'duplicates' => 'Dubletter', 'duplicates' => 'Dubletter',
'duplicate_content' => 'Duplicera innehåll', 'duplicate_content' => 'Duplicera innehåll',
'duplicate_sequences' => '',
'edit' => 'Ändra', 'edit' => 'Ändra',
'edit_attributes' => 'Ändra attribut', 'edit_attributes' => 'Ändra attribut',
'edit_comment' => 'Ändra kommentar', 'edit_comment' => 'Ändra kommentar',
@ -638,6 +639,7 @@ URL: [url]',
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => 'februari', 'february' => 'februari',
@ -771,6 +773,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => 'Förestående', 'index_pending' => 'Förestående',
'index_processing' => '',
'index_waiting' => 'Väntar', 'index_waiting' => 'Väntar',
'individuals' => 'Personer', 'individuals' => 'Personer',
'individuals_in_groups' => 'Medlemmar i en grupp', 'individuals_in_groups' => 'Medlemmar i en grupp',
@ -921,6 +924,7 @@ URL: [url]',
'move_clipboard' => 'Flytta urklipp', 'move_clipboard' => 'Flytta urklipp',
'move_document' => 'Flytta dokument', 'move_document' => 'Flytta dokument',
'move_folder' => 'Flytta katalog', 'move_folder' => 'Flytta katalog',
'move_into_rootfolder' => '',
'my_account' => 'Min Sida', 'my_account' => 'Min Sida',
'my_documents' => 'Mina dokument', 'my_documents' => 'Mina dokument',
'my_transmittals' => 'Mina överföringar', 'my_transmittals' => 'Mina överföringar',
@ -1063,6 +1067,7 @@ Användare: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Ägare har ändrats', 'ownership_changed_email_subject' => '[sitename]: [name] - Ägare har ändrats',
'parent_folder' => '',
'password' => 'Lösenord', 'password' => 'Lösenord',
'password_already_used' => 'Lösenordet används redan', 'password_already_used' => 'Lösenordet används redan',
'password_expiration' => 'Lösenord utgår', 'password_expiration' => 'Lösenord utgår',
@ -1105,6 +1110,7 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.',
'preview' => 'Förhandsgranskning', 'preview' => 'Förhandsgranskning',
'preview_converters' => 'Konvertering för förhandsgranskning', 'preview_converters' => 'Konvertering för förhandsgranskning',
'preview_images' => 'Förhandsgranska bilder', 'preview_images' => 'Förhandsgranska bilder',
'preview_images_text' => '',
'preview_markdown' => 'Förminskning', 'preview_markdown' => 'Förminskning',
'preview_pdf' => 'Förhandsgranska som PDF', 'preview_pdf' => 'Förhandsgranska som PDF',
'preview_plain' => 'Text', 'preview_plain' => 'Text',
@ -1117,6 +1123,7 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.',
'quota_exceeded' => 'Din minneskvot har överskridits med [bytes].', 'quota_exceeded' => 'Din minneskvot har överskridits med [bytes].',
'quota_is_disabled' => 'Kvotstöd är för närvarande inaktiverad i inställningarna. Ett värde för användarkvot kommer inte att ha någon effekt förrän den är aktiverad igen.', 'quota_is_disabled' => 'Kvotstöd är för närvarande inaktiverad i inställningarna. Ett värde för användarkvot kommer inte att ha någon effekt förrän den är aktiverad igen.',
'quota_warning' => 'Din maximala lagringskvot har överskridits med [bytes]. Ta bort dokument eller tidigare versioner.', 'quota_warning' => 'Din maximala lagringskvot har överskridits med [bytes]. Ta bort dokument eller tidigare versioner.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1829,6 +1836,7 @@ Kommentar: [comment]',
'set_password' => 'Ange lösenord', 'set_password' => 'Ange lösenord',
'set_workflow' => 'Välj arbetsflöde', 'set_workflow' => 'Välj arbetsflöde',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Inloggad som', 'signed_in_as' => 'Inloggad som',
'sign_in' => 'Logga in', 'sign_in' => 'Logga in',
@ -2092,6 +2100,7 @@ URL: [url]',
'update_approvers' => 'Uppdatera lista med personer som godkänner', 'update_approvers' => 'Uppdatera lista med personer som godkänner',
'update_document' => 'Uppdatera dokument', 'update_document' => 'Uppdatera dokument',
'update_fulltext_index' => 'Uppdatera fulltext-index', 'update_fulltext_index' => 'Uppdatera fulltext-index',
'update_fulltext_messages' => '',
'update_info' => 'Uppdatera information', 'update_info' => 'Uppdatera information',
'update_locked_msg' => 'Dokumentet är låst', 'update_locked_msg' => 'Dokumentet är låst',
'update_recipients' => 'Uppdatera lista med mottagare', 'update_recipients' => 'Uppdatera lista med mottagare',

View File

@ -520,6 +520,7 @@ URL: [url]',
'dump_remove' => 'Dump dosyasını sil', 'dump_remove' => 'Dump dosyasını sil',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => 'içeriği_klonla', 'duplicate_content' => 'içeriği_klonla',
'duplicate_sequences' => '',
'edit' => 'Düzenle', 'edit' => 'Düzenle',
'edit_attributes' => 'Nitelikleri düzenle', 'edit_attributes' => 'Nitelikleri düzenle',
'edit_comment' => 'Açıklamayı düzenle', 'edit_comment' => 'Açıklamayı düzenle',
@ -626,6 +627,7 @@ URL: [url]',
'extension_mgr_repository' => 'Mevcut', 'extension_mgr_repository' => 'Mevcut',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => 'Veysionlar', 'extension_version_list' => 'Veysionlar',
'february' => 'Şubat', 'february' => 'Şubat',
@ -759,6 +761,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Bekliyor', 'index_waiting' => 'Bekliyor',
'individuals' => 'Bireysel', 'individuals' => 'Bireysel',
'individuals_in_groups' => 'Ekip Üyeleri', 'individuals_in_groups' => 'Ekip Üyeleri',
@ -909,6 +912,7 @@ URL: [url]',
'move_clipboard' => 'Panoyu taşı', 'move_clipboard' => 'Panoyu taşı',
'move_document' => 'Dokümanı taşı', 'move_document' => 'Dokümanı taşı',
'move_folder' => 'Klasörü Taşı', 'move_folder' => 'Klasörü Taşı',
'move_into_rootfolder' => '',
'my_account' => 'Hesabım', 'my_account' => 'Hesabım',
'my_documents' => 'Dokümanlarım', 'my_documents' => 'Dokümanlarım',
'my_transmittals' => 'Çevirilerim', 'my_transmittals' => 'Çevirilerim',
@ -1051,6 +1055,7 @@ Kullanıcı: [username]
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Sahip değişti', 'ownership_changed_email_subject' => '[sitename]: [name] - Sahip değişti',
'parent_folder' => '',
'password' => 'Parola', 'password' => 'Parola',
'password_already_used' => 'Bu parola zaten kullanılmış', 'password_already_used' => 'Bu parola zaten kullanılmış',
'password_expiration' => 'Parola kullanım süresi', 'password_expiration' => 'Parola kullanım süresi',
@ -1098,6 +1103,7 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü
'preview' => 'Önizle', 'preview' => 'Önizle',
'preview_converters' => '', 'preview_converters' => '',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '', 'preview_markdown' => '',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => '', 'preview_plain' => '',
@ -1110,6 +1116,7 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü
'quota_exceeded' => 'Size ayrılan disk kotası [bytes] aşıldı.', 'quota_exceeded' => 'Size ayrılan disk kotası [bytes] aşıldı.',
'quota_is_disabled' => 'Kota desteği ayarlardan kapatılmış durumda. Açılana kadar kullanıcıya kota tanımlamanın bir etkisi olmaz.', 'quota_is_disabled' => 'Kota desteği ayarlardan kapatılmış durumda. Açılana kadar kullanıcıya kota tanımlamanın bir etkisi olmaz.',
'quota_warning' => 'Size ayrılan disk kotası [bytes] aşıldı. Lütfen gereksiz olduğunu düşündüğünüz dokümanları veya eski versiyonları silin.', 'quota_warning' => 'Size ayrılan disk kotası [bytes] aşıldı. Lütfen gereksiz olduğunu düşündüğünüz dokümanları veya eski versiyonları silin.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1795,6 +1802,7 @@ URL: [url]',
'set_password' => 'Parola Belirle', 'set_password' => 'Parola Belirle',
'set_workflow' => 'İş Akışı Tanımla', 'set_workflow' => 'İş Akışı Tanımla',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => 'Versiyonları görüntüle', 'show_extension_version_list' => 'Versiyonları görüntüle',
'signed_in_as' => 'Giriş yapan kullanıcı', 'signed_in_as' => 'Giriş yapan kullanıcı',
'sign_in' => 'Giriş', 'sign_in' => 'Giriş',
@ -2058,6 +2066,7 @@ URL: [url]',
'update_approvers' => 'Onaylayanlar listesini güncelle', 'update_approvers' => 'Onaylayanlar listesini güncelle',
'update_document' => 'Doküman güncelle', 'update_document' => 'Doküman güncelle',
'update_fulltext_index' => 'Tam metin indeksini güncelle', 'update_fulltext_index' => 'Tam metin indeksini güncelle',
'update_fulltext_messages' => '',
'update_info' => 'Bilgileri Güncelle', 'update_info' => 'Bilgileri Güncelle',
'update_locked_msg' => 'Bu doküman kilitli.', 'update_locked_msg' => 'Bu doküman kilitli.',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => 'Видалити дамп', 'dump_remove' => 'Видалити дамп',
'duplicates' => '', 'duplicates' => '',
'duplicate_content' => 'Дубльований вміст', 'duplicate_content' => 'Дубльований вміст',
'duplicate_sequences' => '',
'edit' => 'Змінити', 'edit' => 'Змінити',
'edit_attributes' => 'Змінити атрибути', 'edit_attributes' => 'Змінити атрибути',
'edit_comment' => 'Змінити коментар', 'edit_comment' => 'Змінити коментар',
@ -632,6 +633,7 @@ URL: [url]',
'extension_mgr_repository' => '', 'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '', 'extension_version_list' => '',
'february' => 'Лютий', 'february' => 'Лютий',
@ -765,6 +767,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '', 'index_no_content' => '',
'index_pending' => '', 'index_pending' => '',
'index_processing' => '',
'index_waiting' => '', 'index_waiting' => '',
'individuals' => 'Користувачі', 'individuals' => 'Користувачі',
'individuals_in_groups' => 'Користувачі групи', 'individuals_in_groups' => 'Користувачі групи',
@ -915,6 +918,7 @@ URL: [url]',
'move_clipboard' => 'Перемістити буфер обміну', 'move_clipboard' => 'Перемістити буфер обміну',
'move_document' => 'Перемістити документ', 'move_document' => 'Перемістити документ',
'move_folder' => 'Перемістити каталог', 'move_folder' => 'Перемістити каталог',
'move_into_rootfolder' => '',
'my_account' => 'Мій обліковий запис', 'my_account' => 'Мій обліковий запис',
'my_documents' => 'Мої документи', 'my_documents' => 'Мої документи',
'my_transmittals' => 'Мої перенесення', 'my_transmittals' => 'Мої перенесення',
@ -1056,6 +1060,7 @@ URL: [url]',
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: змінено власника «[name]»', 'ownership_changed_email_subject' => '[sitename]: змінено власника «[name]»',
'parent_folder' => '',
'password' => 'Пароль', 'password' => 'Пароль',
'password_already_used' => 'Пароль вже використовується', 'password_already_used' => 'Пароль вже використовується',
'password_expiration' => 'Термін використання паролю', 'password_expiration' => 'Термін використання паролю',
@ -1099,6 +1104,7 @@ URL: [url]',
'preview' => 'Попередній перегляд', 'preview' => 'Попередній перегляд',
'preview_converters' => 'Попередній перегляд перетворення документу', 'preview_converters' => 'Попередній перегляд перетворення документу',
'preview_images' => '', 'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => '', 'preview_pdf' => '',
'preview_plain' => 'Текст', 'preview_plain' => 'Текст',
@ -1111,6 +1117,7 @@ URL: [url]',
'quota_exceeded' => 'Ваша дискова квота перевищена на [bytes].', 'quota_exceeded' => 'Ваша дискова квота перевищена на [bytes].',
'quota_is_disabled' => 'Квотування відключено', 'quota_is_disabled' => 'Квотування відключено',
'quota_warning' => 'Ваша дискова квота перевищена на [bytes]. Видаліть непотрібні документи або їх попередні версії.', 'quota_warning' => 'Ваша дискова квота перевищена на [bytes]. Видаліть непотрібні документи або їх попередні версії.',
'readme_loading' => '',
'receipts_accepted' => '', 'receipts_accepted' => '',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '', 'receipts_not_touched' => '',
@ -1816,6 +1823,7 @@ URL: [url]',
'set_password' => 'Встановити пароль', 'set_password' => 'Встановити пароль',
'set_workflow' => 'Вказати процес', 'set_workflow' => 'Вказати процес',
'show_extension_changelog' => '', 'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '', 'show_extension_version_list' => '',
'signed_in_as' => 'Користувач', 'signed_in_as' => 'Користувач',
'sign_in' => 'Увійти', 'sign_in' => 'Увійти',
@ -2079,6 +2087,7 @@ URL: [url]',
'update_approvers' => 'Оновити список затверджувачів', 'update_approvers' => 'Оновити список затверджувачів',
'update_document' => 'Оновити документ', 'update_document' => 'Оновити документ',
'update_fulltext_index' => 'Оновити повнотекстовий пошук', 'update_fulltext_index' => 'Оновити повнотекстовий пошук',
'update_fulltext_messages' => '',
'update_info' => 'Оновити інформацію', 'update_info' => 'Оновити інформацію',
'update_locked_msg' => 'Цей документ заблоковано', 'update_locked_msg' => 'Цей документ заблоковано',
'update_recipients' => 'Оновити список отримувачів', 'update_recipients' => 'Оновити список отримувачів',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => '删除转储文件', 'dump_remove' => '删除转储文件',
'duplicates' => '复制', 'duplicates' => '复制',
'duplicate_content' => '重复的内容', 'duplicate_content' => '重复的内容',
'duplicate_sequences' => '',
'edit' => '编辑', 'edit' => '编辑',
'edit_attributes' => '编辑属性', 'edit_attributes' => '编辑属性',
'edit_comment' => '编辑说明', 'edit_comment' => '编辑说明',
@ -634,6 +635,7 @@ URL: [url]',
'extension_mgr_repository' => '可得到', 'extension_mgr_repository' => '可得到',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '版本列表', 'extension_version_list' => '版本列表',
'february' => '二 月', 'february' => '二 月',
@ -767,6 +769,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '没有索引内容', 'index_no_content' => '没有索引内容',
'index_pending' => '待处理', 'index_pending' => '待处理',
'index_processing' => '',
'index_waiting' => '等待', 'index_waiting' => '等待',
'individuals' => '个人', 'individuals' => '个人',
'individuals_in_groups' => '组成员', 'individuals_in_groups' => '组成员',
@ -917,6 +920,7 @@ URL: [url]',
'move_clipboard' => '移动剪切板', 'move_clipboard' => '移动剪切板',
'move_document' => '移动文档', 'move_document' => '移动文档',
'move_folder' => '移动文件夹', 'move_folder' => '移动文件夹',
'move_into_rootfolder' => '',
'my_account' => '我的账户', 'my_account' => '我的账户',
'my_documents' => '我的文档', 'my_documents' => '我的文档',
'my_transmittals' => '我的传送', 'my_transmittals' => '我的传送',
@ -1059,6 +1063,7 @@ URL: [url]',
URL: [url]', URL: [url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - 所有者已更新', 'ownership_changed_email_subject' => '[sitename]: [name] - 所有者已更新',
'parent_folder' => '',
'password' => '密码', 'password' => '密码',
'password_already_used' => '密码已被使用', 'password_already_used' => '密码已被使用',
'password_expiration' => '密码过期', 'password_expiration' => '密码过期',
@ -1104,6 +1109,7 @@ URL: [url]',
'preview' => '预览', 'preview' => '预览',
'preview_converters' => '预览文档', 'preview_converters' => '预览文档',
'preview_images' => '预览图片', 'preview_images' => '预览图片',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => '作为PDF预览', 'preview_pdf' => '作为PDF预览',
'preview_plain' => 'TEXT', 'preview_plain' => 'TEXT',
@ -1116,6 +1122,7 @@ URL: [url]',
'quota_exceeded' => '您的磁盘配额已超过 [bytes]。', 'quota_exceeded' => '您的磁盘配额已超过 [bytes]。',
'quota_is_disabled' => '配额的支持', 'quota_is_disabled' => '配额的支持',
'quota_warning' => '您的磁盘最大使用量已超过 [bytes]。请删除文档或以前的版本。', 'quota_warning' => '您的磁盘最大使用量已超过 [bytes]。请删除文档或以前的版本。',
'readme_loading' => '',
'receipts_accepted' => '已收到收据', 'receipts_accepted' => '已收到收据',
'receipts_accepted_latest' => '', 'receipts_accepted_latest' => '',
'receipts_not_touched' => '未获取收据[no_receipts]', 'receipts_not_touched' => '未获取收据[no_receipts]',
@ -1803,6 +1810,7 @@ URL: [url]',
'set_password' => '设定密码', 'set_password' => '设定密码',
'set_workflow' => '设置工作流', 'set_workflow' => '设置工作流',
'show_extension_changelog' => '显示更新记录', 'show_extension_changelog' => '显示更新记录',
'show_extension_readme' => '',
'show_extension_version_list' => '显示版本列表', 'show_extension_version_list' => '显示版本列表',
'signed_in_as' => '登录为', 'signed_in_as' => '登录为',
'sign_in' => '登录', 'sign_in' => '登录',
@ -2057,6 +2065,7 @@ URL: [url]',
'update_approvers' => '更新审核人名单', 'update_approvers' => '更新审核人名单',
'update_document' => '更新', 'update_document' => '更新',
'update_fulltext_index' => '更新全文索引', 'update_fulltext_index' => '更新全文索引',
'update_fulltext_messages' => '',
'update_info' => '更新信息', 'update_info' => '更新信息',
'update_locked_msg' => '该文档被锁定', 'update_locked_msg' => '该文档被锁定',
'update_recipients' => '更新收件人列表', 'update_recipients' => '更新收件人列表',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => '刪除轉儲檔', 'dump_remove' => '刪除轉儲檔',
'duplicates' => '重複項', 'duplicates' => '重複項',
'duplicate_content' => '重複內容', 'duplicate_content' => '重複內容',
'duplicate_sequences' => '',
'edit' => '編輯', 'edit' => '編輯',
'edit_attributes' => '編輯屬性', 'edit_attributes' => '編輯屬性',
'edit_comment' => '編輯說明', 'edit_comment' => '編輯說明',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => '可用', 'extension_mgr_repository' => '可用',
'extension_mgr_upload_disabled' => '', 'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '', 'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '', 'extension_toggle_error' => '',
'extension_version_list' => '版本', 'extension_version_list' => '版本',
'february' => '二 月', 'february' => '二 月',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '', 'index_folder_updated' => '',
'index_no_content' => '沒有索引內容', 'index_no_content' => '沒有索引內容',
'index_pending' => '待定', 'index_pending' => '待定',
'index_processing' => '',
'index_waiting' => '請稍後', 'index_waiting' => '請稍後',
'individuals' => '個人', 'individuals' => '個人',
'individuals_in_groups' => '小組成員', 'individuals_in_groups' => '小組成員',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => '移動剪貼簿', 'move_clipboard' => '移動剪貼簿',
'move_document' => '移動文件', 'move_document' => '移動文件',
'move_folder' => '移動資料夾', 'move_folder' => '移動資料夾',
'move_into_rootfolder' => '',
'my_account' => '我的帳戶', 'my_account' => '我的帳戶',
'my_documents' => '我的文件', 'my_documents' => '我的文件',
'my_transmittals' => '我的傳送', 'my_transmittals' => '我的傳送',
@ -1076,6 +1080,7 @@ URL: [url]',
網址:[url]', 網址:[url]',
'ownership_changed_email_body_html' => '', 'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - 擁有者已改變', 'ownership_changed_email_subject' => '[sitename]: [name] - 擁有者已改變',
'parent_folder' => '',
'password' => '密碼', 'password' => '密碼',
'password_already_used' => '密碼已使用', 'password_already_used' => '密碼已使用',
'password_expiration' => '密碼過期', 'password_expiration' => '密碼過期',
@ -1119,6 +1124,7 @@ URL: [url]',
'preview' => '預覽', 'preview' => '預覽',
'preview_converters' => '預覽文件轉換', 'preview_converters' => '預覽文件轉換',
'preview_images' => '預覽圖像', 'preview_images' => '預覽圖像',
'preview_images_text' => '',
'preview_markdown' => 'Markdown', 'preview_markdown' => 'Markdown',
'preview_pdf' => '預覽為PDF', 'preview_pdf' => '預覽為PDF',
'preview_plain' => '文本', 'preview_plain' => '文本',
@ -1131,6 +1137,7 @@ URL: [url]',
'quota_exceeded' => '您的磁盤配額超出了[bytes]。', 'quota_exceeded' => '您的磁盤配額超出了[bytes]。',
'quota_is_disabled' => '當前在設置中禁用了配額支持。除非再次啟用,否則設置使用者配額將無效。', 'quota_is_disabled' => '當前在設置中禁用了配額支持。除非再次啟用,否則設置使用者配額將無效。',
'quota_warning' => '您的最大光盤使用量超出了[bytes]。請刪除文檔或以前的版本。', 'quota_warning' => '您的最大光盤使用量超出了[bytes]。請刪除文檔或以前的版本。',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts]張收據已被接受', 'receipts_accepted' => '[no_receipts]張收據已被接受',
'receipts_accepted_latest' => '(最新版本為[no_receipts]', 'receipts_accepted_latest' => '(最新版本為[no_receipts]',
'receipts_not_touched' => '[no_receipts]收據未觸及', 'receipts_not_touched' => '[no_receipts]收據未觸及',
@ -1854,6 +1861,7 @@ URL: [url]',
'set_password' => '設定密碼', 'set_password' => '設定密碼',
'set_workflow' => '設定工作流程', 'set_workflow' => '設定工作流程',
'show_extension_changelog' => '顯示變更日誌', 'show_extension_changelog' => '顯示變更日誌',
'show_extension_readme' => '',
'show_extension_version_list' => '版本列表', 'show_extension_version_list' => '版本列表',
'signed_in_as' => '登錄為', 'signed_in_as' => '登錄為',
'sign_in' => '登入', 'sign_in' => '登入',
@ -2117,6 +2125,7 @@ URL: [url]',
'update_approvers' => '更新審核人名單', 'update_approvers' => '更新審核人名單',
'update_document' => '更新', 'update_document' => '更新',
'update_fulltext_index' => '更新全文索引', 'update_fulltext_index' => '更新全文索引',
'update_fulltext_messages' => '',
'update_info' => '更新資訊', 'update_info' => '更新資訊',
'update_locked_msg' => '該文件被鎖定', 'update_locked_msg' => '該文件被鎖定',
'update_recipients' => '', 'update_recipients' => '',

View File

@ -1,3 +1,4 @@
RewriteEngine on RewriteEngine on
RewriteCond %{REQUEST_URI} (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$ RewriteCond %{REQUEST_URI} (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$
RewriteRule (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$ $1op.ViewOnline.php?request=$2:$3 [PT] RewriteRule (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$ $1op.ViewOnline.php?request=$2:$3 [PT]
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require_once("../inc/inc.Settings.php"); require_once("../inc/inc.Settings.php");
require_once("../inc/inc.LogInit.php");
require_once("../inc/inc.Utils.php"); require_once("../inc/inc.Utils.php");
require_once("../inc/inc.LogInit.php");
require_once("../inc/inc.Language.php"); require_once("../inc/inc.Language.php");
require_once("../inc/inc.Init.php"); require_once("../inc/inc.Init.php");
require_once("../inc/inc.Extension.php"); require_once("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php"); include("../inc/inc.Language.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");
@ -508,7 +508,7 @@ foreach($file_ary as $file) {
} }
} }
} }
add_log_line("?name=".$name."&folderid=".$folderid); add_log_line("?name=".$name."&folderid=".$folderid);
} }

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php"); include("../inc/inc.Language.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php"); include("../inc/inc.DBInit.php");

View File

@ -18,8 +18,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php"); include("../inc/inc.Language.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");

View File

@ -18,8 +18,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php"); include("../inc/inc.Language.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php"); include("../inc/inc.Language.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php"); include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php"); include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php"); include("../inc/inc.Language.php");
include("../inc/inc.Init.php"); include("../inc/inc.Init.php");
include("../inc/inc.Extension.php"); include("../inc/inc.Extension.php");

Some files were not shown because too many files have changed in this diff Show More