When the ownership of a user share is transfered to the receiver the
share is removed, as the receiver now owns the original file. However,
due to a missing condition, any share with a group, link or remote with
the same id as the user was removed, not only the user shares.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Some bad databases don't respect the default null apprently.
Now even if they cast it to 0 it should work just fine.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
If a PUT request comes in that is not JSON or from encoded. Then we can
only read it (exactly) once. If that is the case we must assume no
shared secret is set.
If we don't then we either are the first to read it, thus causing the
real read of the data to fail.
Or we are later and then it throws an exception (also failing the
request).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When using fake servers with Sinon.JS, the JavaScript test framework,
the XHR objects are also fake. In Sinon 5.0.8 the "setRequestHeader" of
XMLHttpRequest was modified to normalize the header values (as requested
by the spec), but since then only string values are accepted; null or
integer values can no longer be passed to "setRequestHeader", as it
expects the "replace" function to be available in the object. However,
in the tests null and integer values are passed to "setRequestHeader",
which causes them to fail.
Both Firefox and Chromium accept passing non-string values to their
"setRequestHeader" implementation, and it is done, for example, in
davclient.js; it is not clear yet whether Sinon got too restrictive or
the code calling "setRequestHeader" was too loose. Given that
davclient.js is an external dependency, as a temporary measure Sinon
version is forced to be 5.0.7 at most until either Sinon or davclient.js
are updated.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
However due to the nature of what we store in the token (encrypted
passwords etc). We can't just delete the tokens because that would make
the oauth refresh useless.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Nextcloud 13RC4, error in logfile, triggered by "occ config:list":
Invalid argument supplied for foreach() at lib/private/AppConfig.php#297
PHP Undefined index: workflowengine at lib/private/AppConfig.php#297
Fix: Check if index exists in array before using it.
The "FileListContext" provides steps to interact with and check the
behaviour of a file list. However, the "FileListContext" does not know
the right file list ancestor that has to be used by the file list steps,
so until now the file list steps were explicitly wired to the Files app
and they could be used only in that case.
Instead of duplicating the steps with a slightly different name (for
example, "I rename :fileName1 to :fileName2 in the public shared folder"
instead of "I rename :fileName1 to :fileName2") the steps were
generalized; now contexts that "know" that certain file list ancestor
has to be used by the FileListContext steps performed by certain actor
from that point on (until changed again) set it explicitly. For example,
when the current page is the Files app then the ancestor of the file
list is the main view of the current section of the Files app, but when
the current page is a shared link then the ancestor is set to null
(because there will be just one file list, and thus its ancestor is not
relevant to differentiate between instances)
A helper trait, "FileListAncestorSetter", was introduced to reduce the
boilerplate needed to set the file list ancestor from other contexts.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The file list is used in other places besides the Files app (for
example, the File sharing app); in those cases the locators for the file
list elements are the same, but not for the ancestor of the file list.
To make possible to reuse the file list locators in those cases too now
they receive the ancestor to use.
Note that the locators for the file actions menu were not using an
ancestor locator because it is expected that there is only one file
actions menu at a time in the whole page; that may change in the future,
but for the time being it is a valid assumption and thus the ancestor
was not added to those locators in this commit.
Although the locators were generalized the steps themselves still use
the "FilesAppContext::currentSectionMainView" locator as ancestor; the
steps will be generalized in a following commit.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Besides the extraction some minor adjustments (moving parametrized
locators like "fileActionsMenuItemFor" above the locators that use them
and placing "descendantOf" calls always in a new line) were made too.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
NoSuchElement exceptions are sometimes thrown instead of
StaleElementReference exceptions. This can happen when the Selenium2
driver for Mink performs an action on an element through the WebDriver
session instead of directly through the WebDriver element. In that case,
if the element with the given ID does not exist, a NoSuchElement
exception would be thrown instead of a StaleElementReference exception,
so those cases are handled like StaleElementReference exceptions.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
MoveTargetOutOfBounds exceptions are sometimes thrown instead of
ElementNotVisible exceptions. This can happen when the Selenium2 driver
for Mink moves the cursor on an element using the "moveto" method of the
Webdriver session, for example, before clicking on an element. In that
case, if the element is not visible, "moveto" would throw a
MoveTargetOutOfBounds exception instead of an ElementNotVisible
exception, so those cases are handled like ElementNotVisible exceptions.
Note that MoveTargetOutOfBounds exceptions could be thrown too if the
element was visible but "out of reach"; there is no problem in handling
those cases as if the element was not visible, as the exception will be
thrown again anyway once it is verified that the element is indeed
visible.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
MySQL databases with the ANSI_QUOTES mode enabled treat " as an identifier
quote (see https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_ansi_quotes).
So for such databases the 'occ upgrade' fails with an error message like this:
... unknown column 'oc_*' in where clause.
This fix replaces the doulbe quotes with single quotes that should be always
used in MySQL queries to quote literal strings.
Signed-off-by: Robin Müller <robin.mueller@1und1.de>
test creating comments with numeric user ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix creating comments when file is accessible to users with numeric ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
tests for systemtags related to numeric user ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix systemtags event with numeric user ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Currently, the theming app assumes it's in the serverroot. However, with
Nextcloud's flexibility regarding configurable app paths, this is not a
safe assumption to make. If it happens to be an incorrect assumption,
the theming app fails to work.
Instead of relying on the serverroot, just use the path from the
AppManager and utilize relative paths for assets from there.
Fix#8462
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
* adds a 107 error code together with the hint of the exception
* logs the exception as warning
* fixes#7946
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Just to avoid users from trying this with a to new (untested) php version
* Moved the check logic to 1 place
* All directly callable scripts just require this on top
* exit hard (-1) so we know scripts won't continue
* Return status 500 so no sync clients will try fancy stuff
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#8047
If we can't find the file by id there we should just return null instead
of trying to get the jailed path of null.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The avatar endpoint returns the avatar image or, if the user has no
avatar, the display name. In that later case the avatar is generated on
the browser based on the display name. The avatar endpoint response is
cached, so when the display name changes and the avatar is got again the
browser could use the cached value, in which case it would use the same
display name as before and the avatar would not change.
When the avatar is an image the cache is invalidated with the use of
the "version" parameter, which is increased when the image changes. When
the avatar cache was first introduced only the image avatars were
cached, but it was later changed to cache all avatar responses to limit
the requests made to the server. Thus, now the cache of the display name
is invalidated too by increasing the version of the avatar if the
display name changes and there is no explicit avatar set.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This fixes a regression caused by 9b668d0, where the css filters to
preview color inversion of the app menu was applied by default. This
commit makes the css filters sensitive on what the current state of the
app menu is.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
To show the password in plain text "showPassword" adds a text input
after the password input and swaps their visibility depending on whether
the password has to be shown in plain text or not. In a similar way,
"strengthify" by default adds the strength bar after the input element
it was called on. Due to this, if "showPassword" is called before
"strengthify" on the same password input then the strength bar ends
between the password input and the text input, and when the text input
is shown it appears below the strength bar.
To fix this now the strength bar is added after the text input in those
places in which "strengthify" was called after "showPassword" on the
same element.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When finishing the setup of Nextcloud through the WebUI (setting admin
user and database) Firefox offers to save the username and password.
However, the password was shown in both the username and password fields
of the Firefox password manager dialog.
The problem was that the password input element (in the HTML form) is
cloned in a text input element, which is used to show the password in
plain text when clicking on the "Show password" button. As it was a text
input immediately followed by a password input Firefox seemed to assume
that it had to be the username and ignored the real username field, no
matter the value set for the "autocomplete" attribute. Now the cloned
text input is added after the password input, so Firefox no longer
thinks that the cloned text input is the username field and the password
manager dialog shows the proper username instead.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
"FileList._updateDetailsView" expects either a file name (as a string)
or a file model (as an "OCA.File.FileInfoModel"), but when called
through "updateInList" an "OC.Files.FileInfo" object was given instead.
As the given attribute was not a model "_updateDetailsView" treated it
as a file name and tried to get the model for that file, which failed
and caused the details view to be emptied.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
All the tests in the "Renaming files" section added the test files,
although those calling "doRename()" added them by setting a path for the
file too. However, the path is ignored in the other tests, so adding the
files can be unified and moved to "beforeEach()".
This would be needed, for example, to show the details view for a file
before calling "doRename()".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When clicking on "Share link" in the "Sharing" tab of the Files app an
input field with the link appears. That input field already exists in
the DOM, although empty, before clicking on "Share link", and when that
is done the proper value is set and then the input field is shown.
In the acceptance tests "getValue()" can return the value of hidden
elements too, so as long as an element exists its value is returned
without waiting for the field to be visible. Due to this if the test
code runs too fast the "I write down the shared link" step could be
executed before the proper value was set, so the shared link got in that
case would be an empty value, and this would lead to failures when the
following steps were executed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Throw proper exception if we can't get the mimetype for a preview. Catch
it later on so we can just return a not found for the preview.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
For legacy reasons we stored all the previews with a png extention.
However we did not put png data in them all the time.
This caused the preview endpoints to always report that a preview is a
png file. Which was a lie.
Since we abstract away from the storage etc in the previewmanager. There
is no need anymore to store them as .png files and instead we can use
the actual file extention.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When the favourite icon in the details view is clicked the "Favorite"
action is triggered. However, if the action name given to
"triggerAction" is not found then the "Download" action is triggered
instead. As the "Favorite" action is not available in some file lists
(like "Recents") the "Download" action was executed instead in those
cases, which was a strange behaviour. Now the favourite icon is
hidden if its action is not available.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
- With root installation
- Core css
- App inside server root
- Secondary apps directory outside server root
- With an installation in a sub directory
- Core css
- App inside server root
- Secondary apps directory outside server root
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
Fixes#7184
The SyncJob can be very resource intensive. Since it requests all users
on the system to create the system addressbook. In order to do this it
creates a vcard for every user and updates the addressbook.
There is no need for this job since the proper signals are emitted and
handled in the carddav backend to update the addressbook live.
Worst comes to worst there is always the occ command to bring the
address book in sync again.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When a file from the file list is dragged a drag shadow (a copy of the
file row that follows the cursor position) is created. The drag shadow
element is created as a direct child of the body element, so it needs a
higher "z-index" than the one used for the file list to be visible.
In narrow screens the "#app-content" uses a "z-index" of 1000 in order
to be visible over the "#navigation-bar" when they overlap, so the
"z-index" of the drag shadow must be at least 1000 to be visible over
the file list.
Instead of updating the hardcoded "z-index" it was removed and replaced
by CSS rules for ".dragshadow" elements to ease theming.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
On a remembered login session, we create a new session token
in the database with the values of the old one. As we actually
don't need the old session token anymore, we can delete it right
away.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Case: email is set to null, but the avatar is set. In the old case the
email would set $emptyValue but $noImage would still be false. This we
would set the empty string as email.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When a constructor is spied using Sinon it is wrapped by a proxy
function, which calls the original constructor when invoked. When "new
Foo()" is executed a "Foo" object is created, "Foo" is invoked with the
object as "this", and the object is returned as the result of the whole
"new" expression.
Before Sinon 4.1.3 the proxy called the original constructor directly
using the "thisValue" of the spied call; "thisValue" was the object
created by the "new" operator that called the proxy. The proxy assigned
"thisValue" to "returnValue", so it was also the value returned by the
proxy and, in turn, the value returned by the whole "new" expression.
Since Sinon 4.1.3 (see pull request 1626) the proxy calls the original
constructor using "new" instead of directly. The "thisValue" created by
the outermost "new" (the one that called the proxy) is no longer used by
the original constructor; the internal "new" creates a new object, which
is the one passed to the original constructor and returned by the
internal "new" expression. This object is also the value returned by the
proxy ("returnValue") and, in turn, the value returned by the whole
outermost "new" expression.
Thus, now "returnValue" should be used instead of "thisValue" to get the
object created by the spied constructor.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
We have to double check. Since getting the info of the root returns a
generic entry. But actually the stroage is not available. Else we get
very weird sync and web behavior.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* l10n in Nextcloud works by extracting the values only passed on their location and not based on the first parameter
* we need to change the translation pool from `core` to `settings` then
* fixes#7345
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Otherwise its a normal string[] with the user ids, in that
case the array_merge did it's job just fine, apart from it
not being deduplicated.
The array+array is only needed when the user id is the key,
so integer only user ids are kept as they are instead of being
reindexed.
Regression from 3820d6883d
Signed-off-by: Joas Schilling <coding@schilljs.com>
the contacts popovermenu is also present and is being replaces, ending
up in two permission popupmenus with checkboxes duplicating the id,
breaking further permission changes.
plus, fixing a selector
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Currently static CSS files work fine in apps outside of the root.
However, as soon as an app uses SCSS, Nextcloud starts being unable to
find the web root.
Fix this problem by backporting select snippets from master
specifically targeting this issue, and add a test to ensure it doesn't
regress.
Fix#5289
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
Currently, if the app path includes a symlink, the calculated webDir
will be incorrect when generating CSS and URLs will be pointing to the
wrong place, breaking CSS.
Use realpath when retrieving app path, and these issues go away.
Fix#6028
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
core/js/setup.js has logic to show the spinner upon form submission, but
ever since v12 was released the spinner was never hidden in the first
place.
Modify core/css/guest.css to hide it, which allows core/js/setup.js to
do its thing.
Fix#5532
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
Seeking is not needed if the $from is 0, because then the pointer is already at the correct position. Additionally another fallback is added, that if the fseek fails it just uses an fread to skip the beginning of the file until it is at the correct position. This skipping is done with a chunked fread.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Object storage instances always fall back to the content based mimetype detection, because the file name for object storage was always random due to the fact that it was temporarily storage in a generated temp file. This patch adds a check before that to make sure to use the original file name for this purpose and also remove possible other extensions like the versioning or part file extension.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
IE11 triggers an 'input' event whenever an input is focussed
or loses focus. Thus this causes an endless loading loop as soon
as the view is re-rendered. To prevent this, this remembers the
previous search term and ignores events where the term has not
changed.
Fixes https://github.com/nextcloud/server/issues/5281
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
fix LDAP User deletion (cleanup)
discovered a bug in the integration test which lead to following a
different code path and giving a false-positive success feedback.
Also listens now to the evendispatcher instead of old hook system
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix test
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This adjusts the contacts menu to also support searching by email address which is relevant in scenarios where no UID is known such as LDAP, etc.
Furthermore, if `shareapi_allow_share_dialog_user_enumeration` is disabled only results are shown that match the full user ID or email address.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
- Groups, which are excluded from sharing should not see local users at all
- If sharing is restricted to users own groups, he should only see contacts from his groups:
Signed-off-by: Tobia De Koninck <tobia@ledfan.be>
homesToKill was not set in runtime since some changes some place else. It
required deleteUser() to be called first. The method acts independent of it
now.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
The CSP nonce is based on the CSRF token. This token does not change,
unless you log in (or out). In case of the session data being lost,
e.g. because php gets rid of old sessions, a new CSRF token is gen-
erated. While this is fine in theory, it actually caused some annoying
problems where the browser restored a tab and Nextcloud js was blocked
due to an outdated nonce.
The main problem here is that, while processing the request, we write
out security headers relatively early. At that point the CSRF token
is known/generated and transformed into a CSP nonce. During this request,
however, we also log the user in because the session information was
lost. At that point we also refresh the CSRF token, which eventually
causes the browser to block any scripts as the nonce in the header
does not match the one which is used to include scripts.
This patch adds a flag to indicate whether the CSRF token should be
refreshed or not. It is assumed that refreshing is only necessary
if we want to re-generate the session id too. To my knowledge, this
case only happens on fresh logins, not when we recover from a deleted
session file.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
In some not yet completely determined configurations, the following error could occur while writing a file:
Error: Call to a member function getUsers() on null
/var/www/nextcloud/lib/private/Share20/Manager.php - line 1277: OC\Share20\DefaultShareProvider->getAccessList(Array, true)
/var/www/nextcloud/lib/private/Share20/ShareHelper.php - line 51: OC\Share20\Manager->getAccessList(Object(OC\Files\Node\Folder), true, true)
/var/www/nextcloud/apps/activity/lib/FilesHooks.php - line 616: OC\Share20\ShareHelper->getPathsForAccessList(Object(OC\Files\Node\File))
/var/www/nextcloud/apps/activity/lib/FilesHooks.php - line 196: OCA\Activity\FilesHooks->getUserPathsFromPath('/path/to/file', 'user')
/var/www/nextcloud/apps/activity/lib/FilesHooks.php - line 157: OCA\Activity\FilesHooks->addNotificationsForFileAction('/path/to/file', 'file_changed', 'changed_self', 'changed_by')
/var/www/nextcloud/apps/activity/lib/FilesHooksStatic.php - line 55: OCA\Activity\FilesHooks->fileUpdate('/path/to/file')
/var/www/nextcloud/lib/private/legacy/hook.php - line 106: OCA\Activity\FilesHooksStatic fileUpdate(Array)
/var/www/nextcloud/lib/private/Files/View.php - line 1245: OC_Hook emit('OC_Filesystem', 'post_update', Array)
/var/www/nextcloud/lib/private/Files/View.php - line 1173: OC\Files\View->runHooks(Array, '/path/to/file', true)
/var/www/nextcloud/lib/private/Files/View.php - line 679: OC\Files\View->basicOperation('file_put_conten...', '/path/to/file', Array, '<?xml version="...')
/var/www/nextcloud/lib/private/Files/Node/File.php - line 64: OC\Files\View->file_put_contents('/path/to/file', '<?xml version="...')
[...]
Signed-off-by: Jan-Philipp Litza <janphilipp@litza.de>
The helper funtion did not handle the response correctly and basically
only returned the last share with tags.
This is a simple rewrite. That is still understandable. Loops maybe more
than strictly required. But preformance is not the issue here.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* Store the auth state in the session so we don't have to query it every
time.
* Added some tests
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Any `\OCP\Authentication\IApacheBackend` previously had to implement `getLogoutAttribute` which returns a string.
This string is directly injected into the logout `<a>` tag, so returning something like `href="foo"` would result
in `<a href="foo">`.
This is rather error prone and also in Nextcloud 12 broken as the logout entry has been moved with
054e161eb5 inside the navigation manager where one cannot simply inject attributes.
Thus this feature is broken in Nextcloud 12 which effectively leads to the bug described at nextcloud/user_saml#112,
people cannot logout anymore when using SAML using SLO. Basically in case of SAML you have a SLO url which redirects
you to the IdP and properly logs you out there as well.
Instead of monkey patching the Navigation manager I decided to instead change `\OCP\Authentication\IApacheBackend` to
use `\OCP\Authentication\IApacheBackend::getLogoutUrl` instead where it can return a string with the appropriate logout
URL. Since this functionality is only prominently used in the SAML plugin. Any custom app would need a small change but
I'm not aware of any and there's simply no way to fix this properly otherwise.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
As "singleFileUpload" is used the "add" callback (which in turn calls
"addFileToUpload") will always be called with a single file. Therefore
there is no need to iterate over the files (and it is not done in the
other callbacks either, so this aligns the code with the rest of the
callbacks).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
There is no need to store the file name, as the "data" parameter given to
all the callbacks provides a "files" attribute with all the files that
the callback refers to; moreover, it will always be a single file due to
the use of "singleFileUploads" in the jQuery File Upload plugin.
This also fixes the loading icon not disappearing when several files were
uploaded at once. "singleFileUploads" causes the "add" callback to be
called once for each file to be uploaded, so "fileName" was overwritten
with the name of each new file in the upload set; when "fileName" was
later used in the "done" callback to find the file in the list whose
loading icon replace with the MIME type icon "fileName" always had the
name of the last file, and thus its icon was the only one replaced.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "done" and "fail" callbacks both update the item for the uploaded
file using "setFileIcon". "setFileIcon" updates the contents of the
"<li>" element for the file, but the "fail" callback was giving
"setFileIcon" an element generated by the template, so the resulting
HTML contained a "<li>" element nested in another "<li>" element.
However, generating the HTML is better done through a template, so the
template now receives the icon to show in order to be used by a
successful upload and a failed one, and "setFileIcon" was changed to
"updateFileItem".
Note that the mimeTypeUrl does no longer need to be escaped, as
Handlebars templates escape the needed characters automatically.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When the "fail" callback is called, "errorThrown" is a property of the
data object instead of a parameter.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
If the estimated upload time is bigger than 4 hours it shows the text
"Uploading..." because the time then doesn't give any good hint to the
user anyways.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
PHP's json_encode only accept proper UTF-8 strings, loop over all
elements to ensure that they are properly UTF-8 compliant or convert
them manually.
Without this somebody passing an invalid User Agent may make json_encode
return false which will get logged as empty newline.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
If the share input field is unfocused, the autocomplete list is closed. Once
the field was focused again it was not properly opened again. This adds a
trigger to redo the search and show the results again.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Pull request #5584 made cached SCSS files depend on a hash of the base
URL, so the "/css/core/server.css" file does no longer exist; as the
file can not be loaded the "Loading preview" message is never removed
and the "Saved" message is never shown.
As it now depends on the hash of the base URL the file to be reloaded
can no longer be hardcoded, so the full URL to the "server.css" file
that has to be reloaded (if any) is now got from the DataResponse
provided by the controller.
Fixes#5975
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This is a preparatory step for a following change in which
reloadStylesheets will have to be able to receive absolute URLs.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Pull request #5584 made cached SCSS files depend on a hash of the base
URL, so the "/css/core/server.css" file does no longer exist. The
"server.css" URL must be known by the Theming app in order to update the
stylesheets when previewing the changes to the theme, so the
DataResponse from the controller now provides the full URL to the
"server.css" file that has to be reloaded (if any).
The "server.css" URL provided by the response will be taken into account
by the JavaScript front-end in a following commit.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This is a preparatory step for a following commit in which the
properties present in the response will change depending on whether the
request was successful or not.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
In some cases the acceptance tests have to explicitly wait for something
to happen without using the "find" method from the actor; in those cases
the timeout multiplier needs to be taken into account too, so the test
cases must be able to retrieve it from the actor.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
If we have a jailed storage we must also fix the internal path on copy.
Else we pass in the wrong path.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
As both elements are inline/inline-block and belong to the same line
they can be aligned vertically using "vertical-align: middle".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When an image is being uploaded the upload icon is replaced by a loading
icon, so the loading icon and the upload icon have to share their CSS
rules, but only in that specific case; in general the loading icon is
used in a totally different way than the upload icon and thus it should
not share its CSS rules.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The removed rules were either always overriden by other rules or never
used due to not matching any element.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes - Wrong or no sizes of files/folders #5031 for 32-bit systems a direct cast to integer causes problems.
Backport from #5744
Signed-off-by: Sebastian Kostka <sebastian.kostka@gmail.com>
* fix the show password button on the personal page
* before: if the password change failed the show password icon was not shown again
* after: show password icon is visible
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
In order to decide if a recovery key needs to be added we always
need to check the files owner settings and not the settings of
the currently logged in user.
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
Running the acceptance tests on Drone relied on the pod-style networking
used by services (service containers were available at 127.0.0.1 from
the build containers). However, in Drone 0.7 service and build
containers must be accessed from each other using their domain name
instead. Thus, acceptance tests had to be disabled on Drone.
Now that the acceptance test system supports setting a different domain
for the Selenium server and for the Nextcloud test server the acceptance
tests can be enabled again on Drone.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
By default "127.0.0.1:4444" is used, so nothing needs to be set when the
acceptance tests and the Selenium server share the same network (like
when called by "run.sh").
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
By default "127.0.0.1" is used, so nothing needs to be set when the
Selenium server and the Nextcloud test server share the same network
(like when called by "run.sh").
Besides passing the domain to the acceptance tests the Nextcloud test
server configuration must be modified to see the given domain as a
trusted domain; otherwise the access would be forbidden.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The NextcloudTestServerLocalHelper started the PHP built-in web server
for the Nextcloud test server at 127.0.0.1; as the Selenium server has
to access the Nextcloud test server they were forced to share the same
network. Now, the domain at which the PHP built-in web server is started
can be specified when the NextcloudTestServerLocalHelper is created,
which removes the need of sharing the same network, as the Selenium
server now can access the Nextcloud test server at an arbitrary domain.
However, by default "127.0.0.1" is still used if no domain is given.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
in case a user is already logged in on the same server from
which the public link comes from, we need to setup the owners
file system in order to show the preview
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
- When a file was unshared, the legacy hook pre_unshare fired twice and the hook post_unshare did not fire at all. This was obviously a copy-paste error.
Signed-off-by: Pauli Järvinen <pauli.jarvinen@gmail.com>
Fix service container host name
check current folder
fix redis for integration test
Fix more hostnames
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
The toggleSelect extension for Select2 makes possible to unselect items
in a multi-select dropdown by clicking on them; this behaviour should be
enabled in all the multi-select dropdowns used in the server.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
"select2-toggleselect.js" provides an extension to Select2 that makes
possible to unselect items in a multi-select dropdown by clicking on
them. It seems that its load slipped through when moving things around
in commit 6a470e59356b8c52115fe2790666027f38977604; this commit adds it
to the JavaScript files to be loaded in the same position that it should
have had in that commit (based on how the other declarations were
moved).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The app navigation is not exclusive to the Files app but a generic
component used by other apps too, so its locators and steps should be in
its own context.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Most of the time, when people have multiple backends or add a
custom backend, they want to create the users there and not in
the default backend. But since that is registered first, users
were always created there.
Signed-off-by: Joas Schilling <coding@schilljs.com>
1. The upload remaining time is always 'a few second' whatever a big or a
small file uploading.
This commit fixes it. The `new Date().getMilliseconds()` only return a
three digits number. When time arrived the next second, the millisecond
start from ZERO again. So `new Date().getTime()` is the righe choice.
And remaining time variables shoule be initialized when the file starts
uploading, otherwise the remaining time of a new upload will always be
'Infinity years' until you refresh the page.
2. The unit of `data.bitrate` is bit, but the argument unit of
`humanFileSize` function is byte, so it should be divided by 8.
Signed-off-by: Yaojin Qian <i@ume.ink>
Allow to find local users by their email address
Signed-off-by: Joas Schilling <coding@schilljs.com>
Make sure to only add system users once
Signed-off-by: Joas Schilling <coding@schilljs.com>
Add unit test
Signed-off-by: Joas Schilling <coding@schilljs.com>
Treat PHP Errors on User session regenerate
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
remove unnecessary lines…
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
change PHP errors to ErrorException in the session (PHP >=7)
Otherwise it might be that authentication apps are being disabled on
during operation while in fact the session handler has hiccup.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Overrides \Sabre\DAV\Auth\Backend\AbstractBearer::challenge to prevent sending a second WWW-Authenticate header which is standard-compliant but most DAV clients simply fail hard.
Fixes https://github.com/nextcloud/server/issues/5088
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
The SystemTagsInfoViewToggleView is a basic view that renders a label
that, when clicked, toggles the visibility of an associated
SystemTagsInfoView.
In order to keep the view parent agnostic its attachment and detachment
to/from the MainfFileInfoView is done in the FilesPlugin.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
SystemTagsInfoView now provides public methods related to its visibility
in preparation to be used by external objects.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The toggle element was added to the MainFileInfoView element when
SystemTagsInfoView was rendered. However, if the MainFileInfoView was
rendered again after that the toggle element was removed. Therefore,
instead of adding it when SystemTagsInfoView is rendered, the toggle
element has to be added when MainFileInfoView triggers its "post-render"
event.
Note, however, that when MainFileInfoView is rendered all the events are
removed from its child elements. As the toggle uses a "click" event
either the event has to be added back or the element has to be detached
before the MainFileInfoView is rendered.
Fixes#4944
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The post-render event makes possible to modify the
MainFileInfoDetailsView element once it has been rendered, which is
needed by OCA.SystemTags.FilesPlugin to add the "Tags" label to the file
details, while the pre-render event makes possible to detach added
elements if needed before the MainFileInfoDetailsView is rendered again,
as that removes the events from the child DOM elements even if they
belong to other views.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
In some cases, an app may need to act on a detail view registered by
another app or the core, for example, to add extra elements to the
element of the detail view.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixed typo and removed doclink symbol.
Reported at transifex
Update util.php
Another l10n improvement from transifex.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
add missing INotificationManager when creating User backend, LDAP
UserManager
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Make IDE happy
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
add convenience script to run all tests at once
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
* password form overlaps upload button and doesn't allow to click it
* regression from #5259
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
make sure that we always clear all floating rules after the user settings parts
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
Acceptance tests opened the details view by clicking on the middle of
the file row, but due to the changes made in issue #4921 that now opens
the file instead; this commit updates the acceptance tests to open the
details view through the "Details" item in the file actions menu.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Else when an upgrade happens we will recompile all the SCSS files all
the time (until the cache expires).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Apparently scan leads to some issues sometimes on cluster. So just use
the get function to fetch the keys.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#4886
Caching on first read leads to the bug that if the files are updated we
will never cache again. Since we will always fetch from the memcache
(which works) and then see that the files are newer.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The encryption app relies on the post_login hook to initialize its keys.
Since we do not emit it on a remembered login, the keys were always un-
initialized and the user was asked to log out and in again.
This patch *translates* the postRememberedLogin hook to a post_login
hook.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
* adds a disclaimer that an update via web UI is on own risk
* allows to skip the warning
* fixes#4353
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* followup to #3978 because with the proper setup of
appdata we now are using the same data on all nodes
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
(Possibly) fixes#3470
When updating the main file /files_external/rootcerts.crt we should not
read from /files_external/rootcerts.crt at the same time.
For 2 reasons: writing to a file and reading from it at the same time
can have non deterministic results
And we don't want all the certificates to appear 2 times in there.
This isn't caught by our standard file locking (that does not allow this
actually) because it is in a non locked path....
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The contactsMenu plugin was called on avatar elements from
_postRenderItem, which is called when a new comment is added to the
collection. Due to this contactsMenu was not called when messages were
edited; when a new comment is posted _postRenderItem is called, but at
that time the "mentions" attribute is not filled yet, so "@username" is
not replaced by avatars in the message and thus contactsMenu has no
avatars to be called on.
Calling contactsMenu was moved to a new method, _postRenderMessage,
which is called from _postRenderItem and from the success callback when
fetching the model in _onSubmitSuccess (which replaces "@username" by
avatars in the message after posting or editing a comment).
Fixes#4555
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Commands executed on Mink elements may fail for several reasons.
ElementWrapper is introduced to automatically handle some of those
situations, like StaleElementReference exceptions and ElementNotVisible
exceptions.
StaleElementReference exceptions are thrown when the command is executed
on an element that is no longer attached to the DOM. When that happens
the ElementWrapper finds again the element and executes the command
again on the new element.
ElementNotVisible exceptions are thrown when the command requires the
element to be visible but the element is not. When that happens the
ElementWrapper waits for the element to be visible before executing the
command again.
These changes are totally compatible with the current acceptance tests.
They just make the tests more robust, but they do not change their
behaviour. In fact, this should minimize some of the sporadic failures
in the acceptance tests caused by their concurrent nature with respect
to the web browser executing the commands.
However, the ElementWrapper is not a silver bullet; it handles the most
common situations, but it does not handle every possible scenario. For
example, the acceptance tests would still fail sporadically if an
element can become staled several times in a row (uncommon) or if it
does not become visible before the timeout expires (which could still
happen in a loaded system even if the components under test work right,
but obviously it is not possible to wait indefinitely for them).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes: #4644
Without this patch the filelist would always reload. However since not
all the correct data was set yet it would often:
1. fireoff a propfind to ../webdav/
2. fireoff a propfind to ../webdav/<PATH>
When just opening the file list those are the same so the result is just
fine. However if opening a direct link it means that there is a race
condition on which finishes first.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
A moveable mount point (What a SharedStorage is) always has DELETE +
UPDATE permissions. Since you can either delete (unshare) or update
(rename) it.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Sometimes, acceptance tests run by Drone fail due to a timeout when
starting the web browser sessions. Increasing the timeout should
minimize the possibility of the failure happening, although it can not
guarantee that it will not happen. A timeout multiplier of 10 was set
just because it looks like a reasonable margin of time, although it is
not based on any hard data.
The timeout multiplier affects too the timeout used when finding
elements. Like when starting a session, increasing the find timeout
simply gives the acceptance tests more time to find the objects before
giving up, so it does not change their behaviour when successful and can
also prevent failures due to default timeouts being too low for a
strained system.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Starting a session for an Actor can fail, typically, due to a timeout
connecting with the web browser. Now if the session fails to start it
will be tried again up to "actorTimeoutMultiplier" times in total before
giving up.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The timeout passed to the "find" method was multiplied by the
"findTimeoutMultiplier" attribute. However, as "find" used
"findAncestor" and "findAncestor", in turn, used "find" itself the
timeout was increased exponentially for ancestor elements. Now "find"
was split in "find" and "findInternal"; the first method is the public
one and modifies the given parameters as needed and then calls the
second method, private, that performs the find itself.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "named" Mink selector first tries to find an exact match for its
locator and then, if not found, tries to find a partial match. Besides
other harder to track problems (see comment in the commit in which the
"content" locator was removed), this could cause, for example, finding
an action link titled "Favorited" when looking for the action link
titled "Favorite" (that is, one that conveys the opposite state to the
one found).
Although currently all the acceptance tests are compatible with both the
"named" and the "named_exact" Mink selectors the predefined locators are
modified to use the "named_exact" Mink selector to make them more
future-proof; the "named" Mink selector can still be used if needed
through the "customSelector" method in the builder object.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "content" locator uses the "named" Mink selector and the "content"
Mink locator to find the element. The "named" Mink first tries to find
the elements whose content match exactly the given content but, if none
is found, then it tries to find elements that just contain the given
content.
This behaviour can lead to hard to track issues. Finding the exact match
and, if not found, finding the partial match is done in quick
succession. In most cases, when looking for an exact match the element
is already there, it is returned, and everything works as expected. Or
it may not be there, but then it is not there either when finding the
partial match, so no element is returned, and everything works as
expected (that is, the actor tries to find again the element after some
time).
However, it can also happen that when looking for an exact match there
is no element yet, but it appears after trying to find the exact match
but before trying to find the partial match. In that situation the
desired element would be returned along with its ancestors. However, as
only the first found element is taken into account and the ancestors
would appear first the find action would be successful, but the returned
element would not be the expected one. This is highly unlikely, yet
possible, and can cause sporadic failures in acceptance tests that,
apparently, work as expected.
Using a "named_exact" Mink selector instead of the "named" Mink selector
does not provide the desired behaviour in most cases either. As it finds
any element whose content matches exactly the given content, looking for
"Hello world" in "<div><p><a>Hello world</a></p></div>" would match the
"div", "p" and "a" elements; in that situation the "div" element would
be the one returned, when typically the "a" element would be the
expected one.
As it is error prone and easily replaceable by more robust locators the
"content" locator was removed from the predefined ones (although it can
still be used if needed through the "customSelector" method in the
builder object).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Since we now heavily use this endpoint for the contacts menu we better
set proper caching on the images. Else this gets reload over and over
again leading to slow loading menu and unneded bytes transfered.
* cache for 1 hour by default
* added ETag for validation
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When in the upgrade process the version in the config is still the old
version. (Since we only upgrade it after the upgrade is complete).
However the app list fetched from the appstore must be the new list.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* share a file/fodler by public link and click the
copy to clipboard icon and watch the tooltip
* before: it said "Copy"
* after: it now says "Copied" after clicking the button
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Currently, when disabling the brute force protection no new brute force attempts are logged. However, the ones logged within the last 24 hours will still be used for throttling.
This is quite an unexpected behaviour and caused some support issues. With this change when the brute force protection is disabled also the existing attempts within the last 24 hours will be disregarded.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Apps that are in shipped.json follow some more requirements such as having a valid code integrity check. This is not something that we require when they come from the appstore as there we verify the download integrity via the signature.
Also the updater treats apps that are shipped differently. We should however handle the apps like any other app from the appstore.
Fixes https://github.com/nextcloud/server/issues/4605
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* they do calls against core/ajax/share.php which doesn't exist anymore
* also the methods are not called in any of our apps or any of the apps in the appstore
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Implemented visuals for enabling/disabling user from admin user list.
Added the controller functions for enabling/disabling a user.
Added the route for changing user status (enabled/disabled) and added an additional route handler in the user controller.
Finished the visuals to reflect current user status and changed user status respectively.
Changed the single icon for enabling/disabling a user into a menu where deletion and state toggling of a user is selectable.
Added displaying of disabled user count.
Improved style of user action menu.
Added proper counting of disabled users.
Removed visual indicator for disabled users.
Moved pseudo-group detection for disabled users from frontend to the controller.
Changed units for newly introduced css values from em to px.
Removed unnecessary png and optimized svg with scour.
Changed the userlist template to display the user action menu with correct width.
Style fixes for better readability and coding style conformity.
Changed the icons for enabling, disabling and deleting a user in the action menu.
Sabre usually deletes the target node on MOVE before proceeding with the
actual move operation. This fix prevents this to happen in case the
source node is a FutureFile.
Whenever a file list is already initialized and was hidden when
switching to another file list in the navigation bar, if the user comes
back to this list it gets redisplayed. At this point the list needs to
be refreshed to be able to reflect any potential file changes done from
the other lists.
We do not want to have sensitive information in the URL and
therefore also not in the access log. Thus the GET request is
replaced by a POST request.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
When we test wheter action menus in the contacts menu close
when clicking other ones, we have to provide test data
that actually causes the view to render the menu.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
This implements the basics for the new app-password based authentication flow for our clients.
The current implementation tries to keep it as simple as possible and works the following way:
1. Unauthenticated client opens `/index.php/login/flow`
2. User will be asked whether they want to grant access to the client
3. If accepted the user has the chance to do so using existing App Token or automatically generate an app password.
If the user chooses to use an existing app token then that one will simply be redirected to the `nc://` protocol handler.
While we can improve on that in the future, I think keeping this smaller at the moment has its advantages. Also, in the
near future we have to think about an automatic migration endpoint so there's that anyways :-)
If the user chooses to use the regular login the following happens:
1. A session state token is written to the session
2. User is redirected to the login page
3. If successfully authenticated they will be redirected to a page redirecting to the POST controller
4. The POST controller will check if the CSRF token as well as the state token is correct, if yes the user will be redirected to the `nc://` protocol handler.
This approach is quite simple but also allows to be extended in the future. One could for example allow external websites to consume this authentication endpoint as well.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
The Files app active view is set to "files" in silent mode to avoid an
unneeded load of the "/" directory. However, this also prevents the
details view from being automatically closed, so it has to be explicitly
closed by the Goto plugin; the approach used is the same that would have
been used by OCA.Files.App._onNavigationChanged if not silenced.
Fixes#1448
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Need to fetch the node earlier because cancelling from within the
handler is not possible. Well, it is but it prevents other node types
using the same property names to run because the failure marks the
property with status 403.
If getShareType() returns "email" it can not also return "user", "group"
nor "link", so the if block can be added to the preceding if chain.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Before, the icon appeared below the text input for the password. Now, it
appears inside the text input, to the right end.
The CSS was adjusted based on other icons shown in that position for
other text inputs in the Share tab view, like the information icon or
the clipboard icon.
Fixes#4135
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The plain text password for a shared links was hashed and, then, the
hashed password was hashed again and set as the final password. Due to
this the password introduced in the "Authenticate" page for the shared
link was always a wrong password, and thus the file could not be
accessed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a request to set the password of a shared link is sent a working
icon is shown. However, as there was no "success" callback, the icon was
never hidden again after successfully setting the password (it worked
fine if there was an error, though).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The data storage (the "notebook") is shared between all the actors, so
the data can be stored and retrieved between different steps by any
actor in the same scenario.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Calls to `sinon.stub(obj, 'meth', fn)` are deprecated and therefore
replaced by `sinon.stub(obj, 'meth).callsFake(fn)` as instructed by
the deprecation warning.
This makes the js unit testing output readable again.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
As requested by Morris Jobke, the passwords in the acceptance tests were
modified to make them valid both for a clean Nextcloud server and one
with the password_policy app enabled.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
As the script modifies the Git repository a safety parameter was added
to prevent running it by mistake and messing with the local copy of the
repository.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When run through "run.sh" the acceptance tests were executed in the same
system in which the script was called and they started and stopped the
Nextcloud server using Docker containers that provided real web servers.
For consistency now they use the same approach used when run through
Drone: the acceptance tests are run in a Docker container and they start
and stop the Nextcloud server directly using the PHP built-in web server.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Instead of running an additional Drone service with the Nextcloud server
now the Nextcloud server is run in the same Drone step as the acceptance
tests themselves using the PHP built-in web server.
Thanks to this, the Nextcloud server control is no longer needed, as the
acceptance tests can now directly reset, start and stop the Nextcloud
server. Also, the "nextcloudci/php7.0:php7.0-7" image provides
everything needed to run and manage the Nextcloud server (including the
Git command used to restore the directory to a saved state), so the
custom image is no longer needed either.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Instead of downloading the Selenium server and requiring a specific
Firefox version to be installed in the system now the Selenium server is
run using one of the official Selenium Docker images, which provides
both the Selenium server and the appropriate version of Firefox.
Moreover, as it is run inside the Docker container, the web browser is
now run in headless mode; however, if needed, it can still be viewed
through VNC.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When getting/requesting a shared secret there is no need to log the full
exception when an unexpected status code is returned since this won't
really tell us anything as the bad stuff happened on a remote server
Fixes#3380
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When it renames the temporary file, it tests if the file is already present. If so, it moves to trash the previous version to avoid duplicate files with the same name (message log: "Ignoring duplicate file name: ... on Google Drive for Google user: ...").
It doesn't handle duplicate files in Google Drive, it tries to avoid them.
You'll watch #4279 issue.
PHP Warning: Declaration of PublicCalendarTest::testPrivateClassification()
should be compatible with CalendarTest::testPrivateClassification($expectedChildren, $isShared)
in apps/dav/tests/unit/CalDAV/PublicCalendarTest.php on line 29
Signed-off-by: Joas Schilling <coding@schilljs.com>
Trying to configure method "shouldReplaceIcons" which cannot be configured
because it does not exist, has not been specified, is final, or is static
Signed-off-by: Joas Schilling <coding@schilljs.com>
Trying to configure method "getRemember" which cannot be configured
because it does not exist, has not been specified, is final, or is
static
Signed-off-by: Joas Schilling <coding@schilljs.com>
Otherwise group members can remove the share for the complete group,
remove edit permissions and even single user shares for other users.
Signed-off-by: Joas Schilling <coding@schilljs.com>
* fix mess with menus and actions in the files app
* reduces amount of !important usages
* keeps the behaviour on mobile as well as on desktop
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Fixes#4393
It is far from efficient code. But then again it is easy to understand
and I doubt admins will browse it 24/7
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Each acceptance test feature is run in its own Drone step. The container
of the step runs the acceptance tests themselves, but they require two
additional Drone services. One service provides the Selenium server that
performs the web browser actions specified by the tests, and the other
service provides the Nextcloud server that the tests will be run
against (due to security concerns the acceptance tests themselves can
not create Docker containers for the Nextcloud server as done when
running them in a local system, as if Drone containers had access to
Docker a malicious pull request could be used to take over the Drone
server).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Although the timeouts specified in the acceptance tests are enough in
most cases they may not be when running them in a slow system or
environment. For those situations a general multiplier for find
timeouts is added. It can be set in the "behat.yml" configuration file
to increase the timeout used in every find call (except those that used
a timeout of 0, as in those cases the element had to be already present
when finding it and whether the system is slow or not does not change
that).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Due to security concerns, the public Nextcloud server repository is not
set as "trusted" in Drone (otherwise a malicious pull request could be
used to take over the server), so it is not possible to create Docker
containers from the containers started by Drone. Therefore, the
Nextcloud server must be started as a service by Drone itself.
The NextcloudTestServerDroneHelper is added to manage from the
acceptance tests a Nextcloud test server running in a Drone service; to
be able to control the remote Nextcloud server the Drone service must
provide the Nextcloud server control server.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The installation and configuration of the Nextcloud server as expected
by the acceptance tests is extracted to its own script so it can be used
from any element that launches the acceptance tests.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Instead of depending on a Nextcloud test server created through Docker,
NextcloudTestServerContext now uses the NextcloudTestServerHelper
interface. This makes possible to provide other implementations of the
interface for those cases in which using a Docker container is not a
valid approach, like in the continuous integration system of the public
repository due to security concerns.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The NextcloudTestServerHelper interface provides the needed methods to
manage the Nextcloud server used in acceptance tests.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
For consistency with the rest of private methods in the class,
"isContainerRegistered" is moved below the only public method in which
it is used ("cleanUp").
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The acceptance tests require several elements to be set up in order to
be run. Besides those PHP packages that it depends on, like Behat or
Mink, it requires a running Selenium server and a Docker image with the
Nextcloud server to be tested available in the system. The "run.sh"
script takes care of preparing all the needed elements and then run the
acceptance tests; once finished, either normally or due to an error, it
also cleans up the temporal elements created/started by the script and
the acceptance tests.
The Docker image with the Nextcloud server to be tested is created from
the Nextcloud code in the greatparent directory each time "run.sh" is
executed; the code is copied inside the image, so once the acceptance
tests are started the code in the greatparent directory can be modified
without affecting them. As it is based on the current code at the time
of the launch that image is created and destroyed each time the
acceptance tests are run. However, the image that it is based on, which
is created using "docker/nextcloud-local-parent/Dockerfile", does not
change between runs, so it is kept built in the system to speed up the
launch of acceptance tests.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Mink elements (including the document element) provide a
"find(selector, locator)" method to look for child elements in their web
browser session. The Locator class is added to be able to store the
selector and locator in a single object; it also provides a fluent API
to ease the definition of Mink locators, specially those using the
"named" selector.
The method "find(locator, timeout, timeoutStep)" is added to Actor
objects; it is simply a wrapper over Mink's "find(selector, locator)"
method, although it throws an exception if the element can not be found
instead of returning null, and it also makes possible to automatically
retry to find the element for certain amount of time.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
An actor plays the role of an end-user in the test scenario. As such,
each actor has its own web browser session used to perform the actions
specified by the steps of the scenario. Only one actor is active at a
time in a test scenario, and the current actor can be set through the "I
act as XXX" step; from then on, all the steps are performed by that
actor, until a different actor is set by calling "I act as XXX" again.
If no actor was explicitly set in a scenario then the default actor,
unsurprisingly named "default", is the one used.
The ActorContext class is added to provide automatic support for all
that. To use the ActorContext, besides adding it to the context list in
"behat.yml", a Mink session for each actor used in the features must be
specified in "behat.yml". Once done other Contexts just need to
implement the ActorAwareInterface (which can be done simply by using the
ActorAware trait) to have access to the current Actor object of the test
scenario; as the Actor object provides its own session other Contexts do
not need to extend from RawMinkContext. The ActorContext is itself a
RawMinkContext, so it automatically receives the base URL of the
Nextcloud test server run by NextcloudTestServerContext and propagates
that base URL to all the actors.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Scenarios in acceptance tests must be independent one of each other.
That is, the execution of one scenario can not affect the execution of
another scenario, nor it can depend on the result of the execution of a
different scenario. Each scenario must be isolated and self-contained.
As the acceptance tests are run against a Nextcloud server the server
must be in a known and predefined initial state each time a scenario
begins.
The NextcloudTestServerContext is introduced to automatically set up the
Nextcloud test server for each scenario.
This can be achieved using Docker containers. Before an scenario begins
a new Docker container with a Nextcloud server is run; the scenario is
then run against the server provided by the container. When the scenario
ends the container is destroyed. As long as the Nextcloud server uses
local data storage each scenario is thus isolated from the rest.
The NextcloudTestServerContext also notifies its sibling RawMinkContexts
about the base URL of the Nextcloud test server being used in each
scenario.
Although it uses the Behat context system, NextcloudTestServerContext is
not really part of the acceptance tests, but a provider of core features
needed by them; it can be seen as part of a Nextcloud acceptance test
library. Therefore, those classes are stored in the "core" directory
instead of the "bootstrap" directory. Besides its own (quite limited)
autoload configuration, Behat also uses the Composer autoloader, so the
"core" directory has to be added there for its classes to be found by
Behat.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The acceptance tests verify that a Nextcloud server works as expected
from the point of view of an end-user. They are specified as user
stories using Behat paired with Mink, which provides web browser
automation.
Mink supports several browser emulators, but the system is set up to use
Selenium, as it is FOSS and the one that better reflects the use of a
web browser by an end-user (as, in fact, it controls real web browsers).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Otherwise your mail program shows "foo@mail.com" instead of "Nextcloud" or whatever your instance name is.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
While the risk is actually quite low because one would already have the user session and could potentially do other havoc it makes sense to throttle here in case of invalid previous password attempts.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
This makes the new `@BruteForceProtection` annotation more clever and moves the relevant code into it's own middleware.
Basically you can now set `@BruteForceProtection(action=$key)` as annotation and that will make the controller bruteforce protected. However, the difference to before is that you need to call `$responmse->throttle()` to increase the counter. Before the counter was increased every time which leads to all kind of unexpected problems.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
The local link is a clever thing and the clients should support this imho but it might not be clear to all users. For one, the term 'local link' is a bit odd. Local with respect to what? It links directly to the file or folder, so direct link seems to make more sense to me. And we should explain the difference with a public link. So this PR:
* renames local link to direct link
* adds a short explanation, noting it only works for users who have access to this file/folder.
As other links are called public link you could also consider calling this 'private link', I suppose. But the links we sent by mail to ppl could also be called 'private link' (they are for one user, who git it by email) so I think it might be confusing. What do @nextcloud/designers think?
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Each provider just returns what they have so adding an element won't
require changing everything
* Added tests
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* This allows for effective queries.
* Introduce currentAccess parameter to speciy if the users needs to have
currently acces (deleted incomming group share). (For notifications)
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This allows adding rate limiting via annotations to controllers, as one example:
```
@UserRateThrottle(limit=5, period=100)
@AnonRateThrottle(limit=1, period=100)
```
Would mean that logged-in users can access the page 5 times within 100 seconds, and anonymous users 1 time within 100 seconds. If only an AnonRateThrottle is specified that one will also be applied to logged-in users.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Add test for basic deletion.
Add test when deleting from shared folder as recipient.
Add test to check that metadata stays when moving out of shared folder
as recipient.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Also adds `\OCP\Mail\IMailer::createEMailTemplate` as helper so the functionality can easily be used within apps.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Fixes#1330
userA shares a file to userB
userB shares that file to userC
userA can see both userB and userC.
Now they can also see that userB shared it to user C
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#4248
The magic introduced in #3686 caused the shared views not to be updated
properly. Thus we just overwrite the _onUrlChange method in the
sharedfilelist.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The `/remote.php/dav/` endpoint was not implementing the MaintenancePlugin. Thus when the instance was put into maintenance mode the endpoints were still accessible and delivered empty content. Sync clients really do love this.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* currently there are two ways to access default values:
OCP\Defaults or OC_Defaults (which is extended by
OCA\Theming\ThemingDefaults)
* our code used a mixture of both of them, which made
it hard to work on theme values
* this extended the public interface with the missing
methods and uses them everywhere to only rely on the
public interface
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* thanks to @espina2 for make this nice design
* the button says "Set password" if the admin didn't specified a password
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
This is not intended anymore, since it falls back to force english
when the header is not set. Also 0228bc6e66
makes clear that the order should be:
1. User setting
2. Accept language
3. Admin default
This is the case since the commit from above, unless via OCS and DAV.
Both forced to accept-language falling back to english.
By removing the force, it now also matches the w3 priority list:
https://www.w3.org/International/questions/qa-lang-priorities
Signed-off-by: Joas Schilling <coding@schilljs.com>
* added functionality to override config.php values with 'OC_' prefixed environment variables
* use getenv to read environment variables since apache does not set $_ENV variables, fixed test
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Fixes#2954
Before we could match on <prefix>/{id} however if the id contains a /
this would not match properly. But since we define the resource routes
internally we now make sure that we match all chars (up until the ?).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#3890
If we do a put request without a body the current code still tries to
read the body. This patch makes sure that we do not try to read the body
if the content length is 0.
See RFC 2616 Section 4.3
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Apps like 'rainloop' use \OCP\Util::isLoggedIn() to check whether the
current request is authenticated. Since we redirected to the index
page before, it resulted in an infinite redirection loop. This change
sets the redirection URL to the 2FA selection page, which is the only
allowed page in that authentication state.
Fixes https://github.com/nextcloud/server/issues/3702
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
works like "enforce password protection", but let the
user optionally remove the password protection after the
password is set.
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
works like "enforce password protection", but let the
user optionally remove the password protection after the
password is set. by Timo Benk
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
This adds the bruteforce settings app that allows to configure (for now)
subnets that are to be ignored when doing brute force analysis. This can
for example be the LAN since we trust people from there.
* Add app
* Add php tests
* Add js tests
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
fixes#4125
If there is no encryption module enabled it makes no sense to setup the
encryption wrapper (because we can't do anything anyway).
This saves reading the header of files.
Especialy on external storage/objectstore this should improve
performance
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#4087
Because of fancy javascript if a full numeric uid was used javascript
would convert this to an int. Now we just convert everything to a string
first.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* fixes following log output, because there was empty string
stored in the cache
Invalid argument supplied for foreach() at lib/private/Template/JSCombiner.php#108
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Since in production the SCSS files are compiled once and the javascript
files are combined once we can just as well gzip them aggresively.
This means that once they are requested and the browser supports gzip we
can just serve the gzipped file saving precious bandwidth.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The public calendar view should be embeddable and we can't do that if the .htaccess sets a global X-Frame-Options.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
When the instance is not installed don't run the JSCombiner as the appdata folder does not yet exist.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
This helps massively reduce the numerous useless 401 exceptions that
appears in the test log. These appear only because Sabre first connects
without any auth type to receive the challenge and then sends the
authentication data.
With this change it will directly use basic auth.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
added quit option in notif in app.js
added quit option in notif in file-upload.js
added quit option in notif in fileinfomodel.js
added quit option in notif in filelist.js
added quit option in notif in filelist.js
added quit option in notif in tagsplugin.js
added quit option in notif in statusmanager.js
added quit option in notif in external.js
added quit option in notif in versionstabview.js
added quit option in notif in notification.js
changes according to the latest review.
timeout removed since there is a button to close it
translation capability added
typo fixed
test files updated
small errors fixed
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
There is a bunch of javascript we always load from vendors. This
combines this into 1 javascript file. Which reduces the number of
request by ~10.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The reason for updating these messages, is that grammatically they're
not quite correct. They showed a combination of:
- Related phrases, which could be either separated or joined better
- Related sentences, but which should be expressed as separate ones
They were also missing full-stops to end the them.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Since reading a file from disks can be costly. Lets store the dependency
json also in memcache.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
There is a bunch of javascript we always load from vendors. This
combines this into 1 javascript file. Which reduces the number of
request by ~10.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* success on SQLite and Postgres
* failure on MySQL due to the limited charset that only supports up to 3 bytes
Add config option to update charset of mysql to utf8mb4
* fully optional
* requires additional options set in the database
only disable unicode test on mysql
Fixing ctor call
Adding docker based unit test execution for mysql utf8mb4
Add mysqlmb4 test configuration to Jenkinsfile
fix collation on utf8mb4
Properly setup charset and collation in the doctrine connection
Allow files containing 4-byte chars in case the database supports it
During setup of a mysql database we try to detect if charset 'utf8mb4' can be used
Fix mysql settings
Add console command to migrate the charset
Set ROW_FORMAT before setting collation to mb4
Also select tables with wrong collation
Faster MySQL docker
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Moved some interface definitions to Server.php (more to come)
* Build/Query only for existing classes in the AppContainer
* Build/Query only for classes of the App in the AppContainer
* Offload other stuff to the servercontainer
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This will help user to selectively move the folders
specified using --path option, instead of moving
entire folder under files directory.
Signed-off-by: Sujith H <sharidasan@owncloud.com>
Update the integration test for transfer-ownership
Update the integration test for transfer-ownership
as the new option --path is introduced in the command.
Signed-off-by: Sujith H <sharidasan@owncloud.com>
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
test files against ignore_files list on upload
fix typo and indentation
Move blacklist declaration to lib/public/Files/FileInfo.php,
Rename *ignored to *blacklisted
Mocked blacklist_files for testing
Mocked blacklist_files for testing
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Add postLogout hook to finish sessions from external session managers like CAS
* Add postLogout hook to finish sessions from external session managers like CAS
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Write method overriding extension
Add a list of unknowns while inputting a search term
Rename OCA.Share extension point
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Add percentage to user's quota info
Fixes https://github.com/owncloud/core/issues/24011
* Do not show percentage if the quota is Unlimited
* translate quota
* correct condition and remove print_unescaped
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
If you request a preview of X by Y. And after calculating X and Y are
equal to maxWidth and maxHeight then there is no reason to create a
preview of that size.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* Avatar image was not vertcially aligned
* The caret was below the avatar
* The surrounding <div> exceeded the title bar
Signed-off-by: Michael Letzgus <michaelletzgus@users.noreply.github.com>
Use a helper class to listen to the eventDispatcher calls from the share
manager to emit the old \OC_Hooks
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
cleanup files, address review
Fix CleanupRemoteStoragesTest tests
Fix test expectation.
Added files count to check filecache deletion.
Sort by numeric id for deterministic test results
Removed precise order test and added storage check
Remove inaccurate removal message check which has a different order on
Oracle.
Added more checks to confirm that existing storages still exist.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Fixed failing test which was ignoring a required (not null) column
* restored test to original, catching DriverException which also catches ConstraintViolationException
* catch ConstraintViolationException again
* removed unnecessary field from this test
* clobfield should be nullable
* clobfield now is nullable
* removed autoincrement since whenever this strategy is enabled, oracle would not throw constraint violation exceptions (needed for setValues), which mysql still does
* this field does not auto increment anymore
* mark integerfield as primary, since it is not getting marked as such through auto increment anymore,
integerfield default always has been 0 instead of null
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Usually Backbone collections cannot be created and just simply exists.
But in the Webdav world they need to be creatable.
This enhancement makes it possible to use a Backbone Model to represent
such collections and when creating it, it will use MKCOL instead of PUT.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Whenever a user was deleted for encryption where the keys are stored in
the home, we can ignore user existence exceptions because it means the
keys are already gone.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Skip null groups in group manager (#26871)
* Skip null groups in group manager
* Also skip null groups in group manager's search function
* Add more group null checks in sharing code
* Add unit tests for null group safety in group manager
* Add unit tests for sharing code null group checks
* Added tests for null groups handling in sharing code
* Ignore moveShare optional repair in mount provider
In some cases, data is inconsistent in the oc_share table due to legacy
data. The mount provider might attempt to make it consistent but if the
target group does not exist any more it cannot work. In such case we
simply ignore the exception as it is not critical. Keeping the
exception would break user accounts as they would be unable to use
their filesystem.
* Adjust null group handing + tests
* Fix new group manager tests
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
The background job that scans storages must skip failed storages to
avoid potential exceptions, especially when the failed storage comes
from a shared storage where the source is not accessible.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Add test for basic deletion.
Add test when deleting from shared folder as recipient.
Add test to check that metadata stays when moving out of shared folder
as recipient.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Many API callers will call unlink even for directories and it can mess
up with some wrappers like the encryption wrapper
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Disable execution of eval in jQuery. We do require an allowed eval CSP
configuration at the moment for handlebars et al. But for jQuery there is
not much of a reason to execute JavaScript directly via eval.
This thus mitigates some unexpected XSS vectors. As example try to insert
`$('.fileinfo').html('<a href="asd"><script>alert(1)</script></a>');`
with and without this patch in your browsers JS console when the file list
is opened.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
The constructor is iniitiated already very early in base.php, thus requiring this here will break the setup and some more. For now we probably have to live with a static function call here thus.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
This mitigates issues where developers pass untrusted user-input through t() which may lead to XSS issues.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
In base.php the apps are already checked for an update. No need to
repeat this during loading of the app.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
This is a hacky way to allow the use case of #1303.
What happens is
1. User tries to login
2. PreLoginHook kicks in and figures out that the user need to change
their LDAP password or whatever => redirects user
3. While loading the redirect some logic of ours kicks in and logouts
the user (thus clearing the session).
4. We render the new page but now the session and the page disagree
about the CSRF token
This is kind of hacky but I don't think it introduces new attack
vectors.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* Properly expire ext storage versions
System-wide external storages have no real owner so the current user is
used as owner. However when running cron.php there is no current user,
so no expiry can be done.
This fix adds an user argument to the expire() function to tell for
which user to expire files. This information is anyway always available
now through the expire command job.
* Move version expire setupFS into the expire function
* Add comment about not tearing down in version Storage::expire()
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* Fixes#2739
It tries to create an image from an SVG file. Which we don't support. So
this fails and prints an log line. Then we fall back anyways to the 404
and fetch the default icon.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This allows us to combine multiple sass files that we have to always
load together anyway.
Fixes#3389
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
While using the object store, the shares, that are moved to trashbin were still detected as accessible and cause broken shares to be shown in file/folder listing.
During preview generation if we provide an invalid JPG file the system
errors out with a PHP Fatal Error. Now we can't catch Fatal Errors (in
5.6). I suspect that exif_imagetype to fall back to the extention.
However a valid jpg file has a size. So we request the size of the image
and just drop out if that returns false.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The current check does not trigger if $request->getRequestUri() does not return index.php as a prefix
(on my config this was occuring using nginx to serve Nextcloud)
Signed-off-by: Vincent Vanackere <vincent.vanackere@trustelem.com>
* If there are social sharing buttons move them and the copy action to a
menu
* If there are no social sharing buttons just leave the copy action
where it is directly
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* on Windows : is not allowed as filename and doesn't get synced then
* uses 2017-03-02 22-00-00 instead of 2017-03-02T22:00:00+00:00 as format
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
check introduced at another method
comment added to explain one check
comment added to explain one check
unit tests added
small fixes in unit tests
missing semicolon added
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* then the language is not that specific and get also matched for fi
* fallback from fi_FI to fi is supported - the other way around not
* contains repair script
* contains tests for repair script
* fixes#869
Order results to make postgres happy
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Replace deprecated getMock with createMock
* Use createMock consistently
* Use php's ::class references
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
It's 'getRemember' instead of 'getRememberMe', hence some warnings
were generated by phpunit.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
this fixes#3634
1. fixed computerFileSize to be more picky about incorrect values
2. more tests for computerFileSize
3. use computerFileSize to validate user quota
Signed-off-by: Artur Neumann <info@individual-it.net>
If a group contains a slash the principal URI becomes
principals/groups/foo/bar. Now the URI is plit on '/' so this creates
issues ;)
Fixes#2957
* Add tests for groups with /
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
during the process of disabling an App the button would show "Enabling
app …"
This is corrected by this patch
Signed-off-by: Artur Neumann <info@individual-it.net>
Single user mode basically disables WebDAV, OCS and cron execution. Since
we heavily rely on WebDAV and OCS also in the web UI it's basically useless.
An admin only sees a broken interface and can't even change any settings nor
sees any files. Also sharing is not possible.
As this is at least the case since Nextcloud 9 and we haven't received any
reports for this it seems that this feature is not used at all so I removed it.
The encryption commands now rely on the well tested maintenance mode.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
We don't really care when the path info can not be gathered correctly.
we will simply not use SCSS then but the CSS fallback.
Signed-off-by: Joas Schilling <coding@schilljs.com>
* shows a info when list is potentially truncated
* shows a warning when characters length is not enough
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
`\OC_User::loginWithApache` is used in combination with backend mechanisms like our SSO / SAML integration. Those can optionally already provide a displayname using other means. For example by mapping SAML attributes.
The current approach makes it however impossible for backends using `\OCP\Authentication\IApacheBackend` to set a displayname on their own. Because the display name will simply be overwritten with the loginname.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* we introduced this setting in the begining because our
avatar support caused some performance issues, but we
fixed them and should only provide one way how Nextcloud
looks
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* remove obsolete hack
> // file_get_contents() has a memory leak: https://bugs.php.net/bug.php?id=61961
was closed 4 years ago. we could also use the Common implementation
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* checks if the user is on the login page or not instead of check if the user is logged in
* fixes#3207
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Prevent PHP request to get killed when using fclose callback
* Add ignore_user_abort everywhere where the time limit is set to 0
Signed-off-by: Robin Appelman <robin@icewind.nl>
The user needs to be a subadmin of the group,
otherwise they are not allowed to remove anyone from the group
Signed-off-by: Joas Schilling <coding@schilljs.com>
based on a source code analysis (looking for getSystemValue() function) I added the default values of the prameters
Update config.sample.php
replaced three backticks by two.
applied various fixes
- removed default value for 'objectstore' because it has not default value.
- removed default value for 'tempdirectory' because it is unset.
- changed default value for 'theme' to "Defaults to the theming app which is shipped since Nextcloud 9"
- fixed typo in default value of 'minimum.supported.desktop.version', after double-checking the version
number in /apps/dav/lib/Connector/Sabre/BlockLegacyClientPlugin.php:71.
Signed-off-by: Juergen Edner <juergen@eisfair.org>
Whenever a rename or copy operation failed on the view, we must throw
an exception instead of just ignoring.
Signed-off-by: Vincent Petry <pvince81@owncloud.com>
The provider might need DB access and therefore depenedency
resolution fails on the setup page where we cannot inject
the db implementation.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
A Two Factor third party App may throw a TwoFactorException()
with a more detailed error message in case the authentication fails.
The 2FA Controller will then display the message of this Exception
to the user.
Working on #26593
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Local shares should only be scanned when doing it for the owner to
avoid repeatedly rescanning the same shared storage over and over again
for every recipient.
- Switched to setup.css
- Disable scss when displaying the update page
- Improved setup css
- Fixed loading failure of other styles on setup & update page
- Improved scss compiler with an ignore scss compilation option
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
For guest users on every request executes query:
SELECT `uid`, `displayname` FROM `users` WHERE LOWER(`uid`) = LOWER(null)
as I see, uid can't be equal to null by design.
The webroot is already provided, otherwise this links to stuff like "/nextcloud/nextcloud/index.php" instead of "/nextcloud/index.php"
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* If the ETag if present store it
* If a stored ETag is present then pass it along (with the original
response) to get
* Add tests
* Added files to classmap
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
404 errors were not properly cached due to catching the wrong
exception. Now catching ClientHttpException and checking the error
code. In case of 404, adjust the stat cache accordingly.
* CaldavBackend is now endpoint aware (use old style principals on old
endpoint and new onces on new).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Since the tests to quite hugely rely on sync tokens being present I also included those in the legacy backend.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This adds a simple integration test that ensures that remembered
login works when the session cookies vanish.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
* fixed size issues on main detail view and disappearing of share recipients
* Changes due to code comments
* Moved reloadProperties() to FileInfoModel
* Solved Scrutinizer issues
* Bugfix: undefined value used on error
* check if options are set for FileInfoModel.initialize()
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
After the deletion getHome() will fail because the user doesn't exist
any more, so we need to fetch that value earlier.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* Read navigation information from info.xml
* Load files navigation elements from info.xml
* Add comment about ignoring the exception
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* Allow clearing default user backends in config.php
When specifying "user_backends" in config.php, a new option "default"
when set to false will prevent the default user backend to be
registered. The default one is the database backend.
This makes it possible to select exclusive user backends from apps.
* Testing app provides test user backend for alternative homes
The backend provide md5 result to getHome()
* Only md5 the user home when it's not the admin
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
When creating link shares from external storage, the filesystem cannot
find an owner in some scenarios (ex: system-wide mounts). In such
cases, fall back to using the current user's trashbin which happens to
also be the user who created the link share.
Fixes an issue where this scenario made deletion impossible due to
missing user information.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Otherwise disabling sharing does prevent access to the view controllers but one can still access the shares using the public preview route or the public WebDAV endpoint.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* Style modifications of favorite star on main detail view
* Removed unused opacity change on mouse over
* favorite star title fixed
* favorite star opacity should always be .7
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Seems broken. But also if link shares are not allowed, the link shares
will continue to exist but will be denied.
A future cleanup could be done through a background job.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
When PHP in a version higher than 7.0.0 is used we catch fatal exceptions in app.php and gracefully already disable the app. There is thus no need to also disable the apps on updates.
This has been requested by Jan to fix because that is "the most annoying thing ever" :TM:. – I'd say we give it a try and if that causes problems in the future we can consider alternative approaches.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
With 10.0.1 CSPv3 is broken in Safari if it doesn't run from a local IP. Awesome.
=> Let's remove this for Safari and keep chrome and Firefox in the whitelist.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
"{author} commented":"{outeur} het kommentaar gelewer",
"You commented on %1$s":"U het op %1$s kommentaar gelewer",
"You commented on {file}":"U het op {lêer} kommentaar gelewer",
"%1$s commented on %2$s":"%1$s het op %2$s kommentaar gelewer",
"{author} commented on {file}":"{outeur} het op {lêer} kommentaar gelewer",
"<strong>Comments</strong> for files":"<strong>Kommentare</strong> vir lêers",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Jy was genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s het u in ’n kommentaar op “%2$s” genoem",
"{user} mentioned you in a comment on “{file}”":"{gebruiker} het u in ’n kommentaar oor “{lêer}” genoem",
"Unknown user":"Onbekende gebruiker",
"A (now) deleted user mentioned you in a comment on “%s”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “%s” genoem",
"A (now) deleted user mentioned you in a comment on “{file}”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “{lêer}” genoem"
"{author} commented":"{outeur} het kommentaar gelewer",
"You commented on %1$s":"U het op %1$s kommentaar gelewer",
"You commented on {file}":"U het op {lêer} kommentaar gelewer",
"%1$s commented on %2$s":"%1$s het op %2$s kommentaar gelewer",
"{author} commented on {file}":"{outeur} het op {lêer} kommentaar gelewer",
"<strong>Comments</strong> for files":"<strong>Kommentare</strong> vir lêers",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Jy was genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s het u in ’n kommentaar op “%2$s” genoem",
"{user} mentioned you in a comment on “{file}”":"{gebruiker} het u in ’n kommentaar oor “{lêer}” genoem",
"Unknown user":"Onbekende gebruiker",
"A (now) deleted user mentioned you in a comment on “%s”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “%s” genoem",
"A (now) deleted user mentioned you in a comment on “{file}”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “{lêer}” genoem"
"You commented on {file}":"Ти коментира за {file}",
"%1$s commented on %2$s":"%1$s коментиран за %2$s",
"{author} commented on {file}":"{author} коментира за {file}",
"<strong>Comments</strong> for files":"<strong>Коментари</strong> за файлове",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Бяхте споменат/а към “{file}”, в коментар от потребител, който вече е изтрит",
"%1$s mentioned you in a comment on “%2$s”":"%1$s те спомена в коментар за “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} те спомена в коментар за “{file}”",
"Unknown user":"Непознат потребител",
"A (now) deleted user mentioned you in a comment on “%s”":"(Токущо) изтрит потребител те коментира в “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"(Токущо) изтрит потребител те спомена в коментар за “{file}”"
"You commented on {file}":"Ти коментира за {file}",
"%1$s commented on %2$s":"%1$s коментиран за %2$s",
"{author} commented on {file}":"{author} коментира за {file}",
"<strong>Comments</strong> for files":"<strong>Коментари</strong> за файлове",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Бяхте споменат/а към “{file}”, в коментар от потребител, който вече е изтрит",
"%1$s mentioned you in a comment on “%2$s”":"%1$s те спомена в коментар за “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} те спомена в коментар за “{file}”",
"Unknown user":"Непознат потребител",
"A (now) deleted user mentioned you in a comment on “%s”":"(Токущо) изтрит потребител те коментира в “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"(Токущо) изтрит потребител те спомена в коментар за “{file}”"
"Type in a new comment...":"Escriu en un nou comentari...",
"Edit comment":"Editar comentari",
"Delete comment":"Esborrar comentari",
"New comment …":"Nou comentari...",
"Post":"Publica",
"Cancel":"Cancel·la",
"Edit comment":"Editar comentari",
"[Deleted user]":"[usuari Esborrat]",
"Comments":"Comentaris",
"No other comments available":"No hi han altres comentaris disponibles",
"More comments...":"Més comentaris",
"No comments yet, start the conversation!":"Encara no hi ha comentaris. Comenceu la conversa!",
"More comments …":"Més comentaris...",
"Save":"Desa",
"Allowed characters {count} of {max}":"caracters Permessos {count} de {max}",
"{count} unread comments":"{count} comentaris no llegits",
"Allowed characters {count} of {max}":"{count} caràcters permesos de {max}",
"Error occurred while updating comment with id {id}":"Hi ha hagut un error en actualitzar el comentari amb id {id}",
"Error occurred while posting comment":"Hi ha hagut un error en publicar el comentari",
"_%n unread comment_::_%n unread comments_":["%n comentari no llegit","%n comentaris no llegits"],
"Comment":"Comentari",
"<strong>Comments</strong> for files <em>(always listed in stream)</em>":"<strong>Comentaris</strong> per arxius <em>(sempre llistat en corrent)",
"You commented":"Has comentat",
"%1$s commented":"%1$s comentat",
"You commented on %2$s":"Has comentat a %2$s",
"%1$s commented on %2$s":"%1$s ha comentat a %2$s"
"You commented":"Heu comentat",
"%1$s commented":"%1$s ha comentat",
"{author} commented":"{author} ha comentat",
"You commented on %1$s":"Heu comentat a %1$s",
"You commented on {file}":"Heu comentat a {file}",
"%1$s commented on %2$s":"%1$s ha comentat a %2$s",
"{author} commented on {file}":"{author} ha comentat a {file}",
"<strong>Comments</strong> for files":"<strong>Comentaris</strong> per arxius",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Has estat mencionat a \"{file}\" en un comentari d'un usuari que ja no existeix",
"%1$s mentioned you in a comment on “%2$s”":"%1$s us ha nomenat en un comentari a “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} us ha nomenat en un comentari de “{file}”",
"Unknown user":"Usuari desconegut",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuari (ara) esborrat us ha nomenat en un comentari a “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuari (ara) esborrat us ha nomenat en un comentari de “{file}”"
"Type in a new comment...":"Escriu en un nou comentari...",
"Edit comment":"Editar comentari",
"Delete comment":"Esborrar comentari",
"New comment …":"Nou comentari...",
"Post":"Publica",
"Cancel":"Cancel·la",
"Edit comment":"Editar comentari",
"[Deleted user]":"[usuari Esborrat]",
"Comments":"Comentaris",
"No other comments available":"No hi han altres comentaris disponibles",
"More comments...":"Més comentaris",
"No comments yet, start the conversation!":"Encara no hi ha comentaris. Comenceu la conversa!",
"More comments …":"Més comentaris...",
"Save":"Desa",
"Allowed characters {count} of {max}":"caracters Permessos {count} de {max}",
"{count} unread comments":"{count} comentaris no llegits",
"Allowed characters {count} of {max}":"{count} caràcters permesos de {max}",
"Error occurred while updating comment with id {id}":"Hi ha hagut un error en actualitzar el comentari amb id {id}",
"Error occurred while posting comment":"Hi ha hagut un error en publicar el comentari",
"_%n unread comment_::_%n unread comments_":["%n comentari no llegit","%n comentaris no llegits"],
"Comment":"Comentari",
"<strong>Comments</strong> for files <em>(always listed in stream)</em>":"<strong>Comentaris</strong> per arxius <em>(sempre llistat en corrent)",
"You commented":"Has comentat",
"%1$s commented":"%1$s comentat",
"You commented on %2$s":"Has comentat a %2$s",
"%1$s commented on %2$s":"%1$s ha comentat a %2$s"
"You commented":"Heu comentat",
"%1$s commented":"%1$s ha comentat",
"{author} commented":"{author} ha comentat",
"You commented on %1$s":"Heu comentat a %1$s",
"You commented on {file}":"Heu comentat a {file}",
"%1$s commented on %2$s":"%1$s ha comentat a %2$s",
"{author} commented on {file}":"{author} ha comentat a {file}",
"<strong>Comments</strong> for files":"<strong>Comentaris</strong> per arxius",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Has estat mencionat a \"{file}\" en un comentari d'un usuari que ja no existeix",
"%1$s mentioned you in a comment on “%2$s”":"%1$s us ha nomenat en un comentari a “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} us ha nomenat en un comentari de “{file}”",
"Unknown user":"Usuari desconegut",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuari (ara) esborrat us ha nomenat en un comentari a “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuari (ara) esborrat us ha nomenat en un comentari de “{file}”"
"You commented on %1$s":"Okomentoval(a) jste %1$s",
"You commented on {file}":"Okomentoval(a) jste {file}",
"%1$s commented on %2$s":"%1$s okomentoval %2$s",
"{author} commented on {file}":"{author} okomentoval(a) {file}",
"<strong>Comments</strong> for files":"<strong>Komentáře</strong> souborů",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Byli jste zmíněni v “%s”, v komentáři od uživatele, který byl později smazán",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Byli jste zmíněni v souboru “{file}”, v komentáři od uživatele, který byl později smazán",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vás zmínil(a) v komentáři u %2$s",
"{user} mentioned you in a comment on “{file}”":"{user} vás zmínil v komentáři u “{file}”",
"Unknown user":"Neznámý uživatel",
"A (now) deleted user mentioned you in a comment on “%s”":"A (now) deleted user mentioned you in a comment on “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Nyní již smazaný uživatel vás zmínil v komentáři u \"{file}\""
"You commented on %1$s":"Okomentoval(a) jste %1$s",
"You commented on {file}":"Okomentoval(a) jste {file}",
"%1$s commented on %2$s":"%1$s okomentoval %2$s",
"{author} commented on {file}":"{author} okomentoval(a) {file}",
"<strong>Comments</strong> for files":"<strong>Komentáře</strong> souborů",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Byli jste zmíněni v “%s”, v komentáři od uživatele, který byl později smazán",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Byli jste zmíněni v souboru “{file}”, v komentáři od uživatele, který byl později smazán",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vás zmínil(a) v komentáři u %2$s",
"{user} mentioned you in a comment on “{file}”":"{user} vás zmínil v komentáři u “{file}”",
"Unknown user":"Neznámý uživatel",
"A (now) deleted user mentioned you in a comment on “%s”":"A (now) deleted user mentioned you in a comment on “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Nyní již smazaný uživatel vás zmínil v komentáři u \"{file}\""
"{author} commented on {file}":"{author} kommenterede {file}",
"<strong>Comments</strong> for files":"<strong>Kommentarer</strong> for filer",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du blev nævnt i \"{file}”, I en kommentar af en bruger der siden er blevet slettet",
"%1$s mentioned you in a comment on “%2$s”":"%1$s nævnte dig i en kommentarer på “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} nævnte dig i en kommentarer på \"{file}\"",
"Unknown user":"Ukendt bruger",
"A (now) deleted user mentioned you in a comment on “%s”":"En (nu) slettet bruger nævnte dig i en kommentarer på “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"En (nu) slettet bruger nævnte dig i en kommentarer på \"{file}\""
"{author} commented on {file}":"{author} kommenterede {file}",
"<strong>Comments</strong> for files":"<strong>Kommentarer</strong> for filer",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du blev nævnt i \"{file}”, I en kommentar af en bruger der siden er blevet slettet",
"%1$s mentioned you in a comment on “%2$s”":"%1$s nævnte dig i en kommentarer på “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} nævnte dig i en kommentarer på \"{file}\"",
"Unknown user":"Ukendt bruger",
"A (now) deleted user mentioned you in a comment on “%s”":"En (nu) slettet bruger nævnte dig i en kommentarer på “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"En (nu) slettet bruger nævnte dig i en kommentarer på \"{file}\""
"You commented on %2$s":"Du hast %2$s kommentiert"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt",
"{user} mentioned you in a comment on “{file}”":"{user} hat Dich in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu “{file}” erwähnt"
"You commented on %2$s":"Du hast %2$s kommentiert"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt",
"{user} mentioned you in a comment on “{file}”":"{user} hat Dich in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu “{file}” erwähnt"
"You commented on %2$s":"Sie haben %2$s kommentiert"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt.",
"{user} mentioned you in a comment on “{file}”":"{user} hat Sie in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu “{file}” erwähnt"
"You commented on %2$s":"Sie haben %2$s kommentiert"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt.",
"{user} mentioned you in a comment on “{file}”":"{user} hat Sie in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu “{file}” erwähnt"
"%1$s commented on %2$s":"%1$s commented on %2$s",
"{author} commented on {file}":"{author} commented on {file}",
"<strong>Comments</strong> for files":"<strong>Comments</strong> for files",
"A (now) deleted user mentioned you in a comment on “%s”":"A (now) deleted user mentioned you in a comment on “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"A (now) deleted user mentioned you in a comment on “{file}”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"You were mentioned on “%s”, in a comment by a user that has since been deleted",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"You were mentioned on “{file}”, in a comment by a user that has since been deleted",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mentioned you in a comment on “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} mentioned you in a comment on “{file}”",
"Type in a new comment...":"Type a new comment...",
"No other comments available":"No other comments available",
"%1$s commented on %2$s":"%1$s commented on %2$s",
"{author} commented on {file}":"{author} commented on {file}",
"<strong>Comments</strong> for files":"<strong>Comments</strong> for files",
"A (now) deleted user mentioned you in a comment on “%s”":"A (now) deleted user mentioned you in a comment on “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"A (now) deleted user mentioned you in a comment on “{file}”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"You were mentioned on “%s”, in a comment by a user that has since been deleted",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"You were mentioned on “{file}”, in a comment by a user that has since been deleted",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mentioned you in a comment on “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} mentioned you in a comment on “{file}”",
"Type in a new comment...":"Type a new comment...",
"No other comments available":"No other comments available",
"No comments yet, start the conversation!":"¡No hay comentarios, empieza la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with id {id}":"Se ha producido un error al recuperar el comentario con ID {id}",
"Error occurred while retrieving comment with ID {id}":"Se ha producido un error al obtener el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se ha producido un error al actualizar el comentario con ID {id}",
"Error occurred while posting comment":"Se ha producido un error al enviar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentario sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"_%n unread comment_::_%n unread comments_":["%n comentario sin leer","%nComentarios no leídos"],
"Comment":"Comentar",
"You commented":"Has comentado",
"%1$s commented":"%1$s comentados",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Has comentado en %1$s",
"You commented on {file}":"Usted comentó Has comentado en {file}",
"You commented on {file}":"Has comentado en {file}",
"%1$s commented on %2$s":"%1$s comentados en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> para archivos",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “{file}”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te han mencionado en \"{file}\", en un comentario de un usuario que después ha sido eliminado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Type in a new comment...":"Escribe un nuevo comentario...",
"No other comments available":"No hay otros comentarios disponibles",
"More comments...":"Más comentarios...",
"{count} unread comments":"{count} comentarios no leídos",
"You commented on %2$s":"Has comentado en %2$s"
"Files app plugin to add comments to files":"Plugin de la app de Archivos para añadir comentarios a archivos.",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “{file}”"
"No comments yet, start the conversation!":"¡No hay comentarios, empieza la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with id {id}":"Se ha producido un error al recuperar el comentario con ID {id}",
"Error occurred while retrieving comment with ID {id}":"Se ha producido un error al obtener el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se ha producido un error al actualizar el comentario con ID {id}",
"Error occurred while posting comment":"Se ha producido un error al enviar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentario sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"_%n unread comment_::_%n unread comments_":["%n comentario sin leer","%nComentarios no leídos"],
"Comment":"Comentar",
"You commented":"Has comentado",
"%1$s commented":"%1$s comentados",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Has comentado en %1$s",
"You commented on {file}":"Usted comentó Has comentado en {file}",
"You commented on {file}":"Has comentado en {file}",
"%1$s commented on %2$s":"%1$s comentados en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> para archivos",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “{file}”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te han mencionado en \"{file}\", en un comentario de un usuario que después ha sido eliminado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Type in a new comment...":"Escribe un nuevo comentario...",
"No other comments available":"No hay otros comentarios disponibles",
"More comments...":"Más comentarios...",
"{count} unread comments":"{count} comentarios no leídos",
"You commented on %2$s":"Has comentado en %2$s"
"Files app plugin to add comments to files":"Plugin de la app de Archivos para añadir comentarios a archivos.",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with id {id}":"Se produjo error al recuperar comentario con id {id}",
"Error occurred while updating comment with id {id}":"Se produjo error al actualizar comentario con id {id}",
"Error occurred while posting comment":"Se produjo error al publicar comentario",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Has comentado",
"%1$s commented":"%1$s comentado",
"You commented on %2$s":"Has comentado en %2$s",
"%1$s commented on %2$s":"%1$s comentado en %2$s",
"Type in a new comment...":"Escribir un nuevo comentario",
"No other comments available":"No hay mas comentarios",
"More comments...":"Mas comentarios...",
"{count} unread comments":"{count} comentarios no leídos"
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with id {id}":"Se produjo error al recuperar comentario con id {id}",
"Error occurred while updating comment with id {id}":"Se produjo error al actualizar comentario con id {id}",
"Error occurred while posting comment":"Se produjo error al publicar comentario",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Has comentado",
"%1$s commented":"%1$s comentado",
"You commented on %2$s":"Has comentado en %2$s",
"%1$s commented on %2$s":"%1$s comentado en %2$s",
"Type in a new comment...":"Escribir un nuevo comentario",
"No other comments available":"No hay mas comentarios",
"More comments...":"Mas comentarios...",
"{count} unread comments":"{count} comentarios no leídos"
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Comment":"Comentario"
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Comment":"Comentario"
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while retrieving comment with ID {id}":"Se presentó un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"No comments yet, start the conversation!":"¡Aún no hay comentarios, inicia la conversación!",
"More comments …":"Más comentarios ...",
"Save":"Guardar",
"Allowed characters {count} of {max}":"Caracteres permitidos {count} de {max}",
"Error occurred while updating comment with id {id}":"Se presentó un error al actualizar el comentario con Id {id}",
"Error occurred while posting comment":"Se presentó un error al publicar el comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
"Comment":"Comentario",
"You commented":"Comentaste",
"%1$s commented":"%1$s comentó",
"{author} commented":"{author} comentó",
"You commented on %1$s":"Usted comentó en %1$s",
"You commented on {file}":"Hiciste un comentario de {file}",
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”"
"You commented on %1$s":"Sa kommmenteerisid %1$s",
"You commented on {file}":"Sa kommenteerisid faili {file}",
"%1$s commented on %2$s":"%1$s kommenteeris %2$s",
"{author} commented on {file}":"{author} kommenteeris faili {file}",
"<strong>Comments</strong> for files":"<strong>Kommentaarid</strong> failidele",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sind mainiti \"%s\", kommentaaris kasutataja poolt, mis on praeguseks kustutatud",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sind mainiti \"{file}\", kommentaaris kasutataja poolt, mis on praeguseks kustutatud",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mainis sind \"%2$s\" kommentaaris",
"{user} mentioned you in a comment on “{file}”":"{user} mainis sind faili “{file}” kommentaaris",
"Unknown user":"Tundmatu kasutaja",
"A (now) deleted user mentioned you in a comment on “%s”":"Kustutatud kasutaja mainis sind \"%s\" kommentaaris",
"A (now) deleted user mentioned you in a comment on “{file}”":"Kustutatud kasutaja mainis sind faili \"{file}\" kommentaaris"
"You commented on %1$s":"Sa kommmenteerisid %1$s",
"You commented on {file}":"Sa kommenteerisid faili {file}",
"%1$s commented on %2$s":"%1$s kommenteeris %2$s",
"{author} commented on {file}":"{author} kommenteeris faili {file}",
"<strong>Comments</strong> for files":"<strong>Kommentaarid</strong> failidele",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sind mainiti \"%s\", kommentaaris kasutataja poolt, mis on praeguseks kustutatud",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sind mainiti \"{file}\", kommentaaris kasutataja poolt, mis on praeguseks kustutatud",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mainis sind \"%2$s\" kommentaaris",
"{user} mentioned you in a comment on “{file}”":"{user} mainis sind faili “{file}” kommentaaris",
"Unknown user":"Tundmatu kasutaja",
"A (now) deleted user mentioned you in a comment on “%s”":"Kustutatud kasutaja mainis sind \"%s\" kommentaaris",
"A (now) deleted user mentioned you in a comment on “{file}”":"Kustutatud kasutaja mainis sind faili \"{file}\" kommentaaris"
"You commented on {file}":"Kommentoit tiedostoa{file}",
"%1$s commented on %2$s":"%1$s kommentoi kohdetta %2$s",
"{author} commented on {file}":"{author} kommentoi tiedostoa{file}",
"<strong>Comments</strong> for files":"Tiedostojen <strong>kommentit</strong>",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sinut mainittiin tiedoston “{file}” kommentissa käyttäjän toimesta, joka on sittemmin poistettu",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mainitsi sinut kommentissa “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} mainitsi sinut tiedoston\"{file}\" kommentissa",
"Unknown user":"Tuntematon käyttäjä",
"A (now) deleted user mentioned you in a comment on “%s”":"Poistettu käyttäjä mainitsi sinut kommentissa \"%s\"",
"A (now) deleted user mentioned you in a comment on “{file}”":"Poistettu käyttäjä mainitsi sinut tiedoston\"{file}\" kommentissa"
"You commented on {file}":"Kommentoit tiedostoa{file}",
"%1$s commented on %2$s":"%1$s kommentoi kohdetta %2$s",
"{author} commented on {file}":"{author} kommentoi tiedostoa{file}",
"<strong>Comments</strong> for files":"Tiedostojen <strong>kommentit</strong>",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sinut mainittiin tiedoston “{file}” kommentissa käyttäjän toimesta, joka on sittemmin poistettu",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mainitsi sinut kommentissa “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} mainitsi sinut tiedoston\"{file}\" kommentissa",
"Unknown user":"Tuntematon käyttäjä",
"A (now) deleted user mentioned you in a comment on “%s”":"Poistettu käyttäjä mainitsi sinut kommentissa \"%s\"",
"A (now) deleted user mentioned you in a comment on “{file}”":"Poistettu käyttäjä mainitsi sinut tiedoston\"{file}\" kommentissa"
"No comments yet, start the conversation!":"Il n'y a aucun commentaire, démarrer la conversation!",
"Comments":"Commentaires",
"No comments yet, start the conversation!":"Il n'y a aucun commentaire, démarrez la conversation !",
"More comments …":"Plus de commentaires ...",
"Save":"Enregistrer",
"Allowed characters {count} of {max}":"{count} sur {max} caractères autorisés",
"Error occurred while retrieving comment with id {id}":"Une erreur est survenue lors de la récupération du commentaire avec l'id {id}",
"Error occurred while retrieving comment with ID {id}":"Une erreur est survenue lors de la récupération du commentaire avec l'ID {id}",
"Error occurred while updating comment with id {id}":"Une erreur est survenue lors de la mise à jour du commentaire avec l'id {id}",
"Error occurred while posting comment":"Une erreur est survenue lors de l'envoi du commentaire",
"_%n unread comment_::_%n unread comments_":["%n commentaire non lu","%n commentaires non lus"],
@@ -22,18 +21,17 @@ OC.L10N.register(
"%1$s commented":"%1$s a commenté",
"{author} commented":"{author} a commenté",
"You commented on %1$s":"Vous avez commenté %1$s",
"You commented on {file}":"Vous avez commenté sur {file}",
"You commented on {file}":"Vous avez commenté {file}",
"%1$s commented on %2$s":"%1$s a commenté %2$s",
"{author} commented on {file}":"{author} a commenté sur {file}",
"<strong>Comments</strong> for files":"<strong>Commentaires</strong> pour les fichiers",
"A (now) deleted user mentioned you in a comment on “%s”":"Un utilisateur (maintenant supprimé) vous a mentionné dans un commentaire sur “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un utilisateur (maintenant supprimé) vous a mentionné dans un commentaire sur “{file}”",
"<strong>Comments</strong> for files":"<strong>Commentaires</strong> sur les fichiers",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Vous avez été mentionné sur \"%s\", dans un commentaire par un utilisateur qui a été supprimé depuis lors.",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Vous avez été mentionné sur \"{file}\", dans un commentaire par un utilisateur qui a été supprimé depuis lors.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vous a mentionné⋅e dans un commentaire sur “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} vous a mentionné⋅e dans un commentaire sur “{file}”",
"Type in a new comment...":"Écrire un nouveau commentaire...",
"No other comments available":"Aucun autre commentaire",
"More comments...":"Plus de commentaires...",
"{count} unread comments":"{count} commentaires non lus",
"You commented on %2$s":"Vous avez commenté %2$s"
"Files app plugin to add comments to files":"Plugin Fichiers app pour ajouter des commentaires aux fichiers",
"Unknown user":"Utilisateur·trice inconnu·e",
"A (now) deleted user mentioned you in a comment on “%s”":"Un·e utilisateur·trice (maintenant supprimé·e) vous a mentionné·e dans un commentaire sur “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un·e utilisateur·trice (maintenant supprimé·e) vous a mentionné·e dans un commentaire sur “{file}”"
"No comments yet, start the conversation!":"Il n'y a aucun commentaire, démarrer la conversation!",
"Comments":"Commentaires",
"No comments yet, start the conversation!":"Il n'y a aucun commentaire, démarrez la conversation !",
"More comments …":"Plus de commentaires ...",
"Save":"Enregistrer",
"Allowed characters {count} of {max}":"{count} sur {max} caractères autorisés",
"Error occurred while retrieving comment with id {id}":"Une erreur est survenue lors de la récupération du commentaire avec l'id {id}",
"Error occurred while retrieving comment with ID {id}":"Une erreur est survenue lors de la récupération du commentaire avec l'ID {id}",
"Error occurred while updating comment with id {id}":"Une erreur est survenue lors de la mise à jour du commentaire avec l'id {id}",
"Error occurred while posting comment":"Une erreur est survenue lors de l'envoi du commentaire",
"_%n unread comment_::_%n unread comments_":["%n commentaire non lu","%n commentaires non lus"],
@@ -20,18 +19,17 @@
"%1$s commented":"%1$s a commenté",
"{author} commented":"{author} a commenté",
"You commented on %1$s":"Vous avez commenté %1$s",
"You commented on {file}":"Vous avez commenté sur {file}",
"You commented on {file}":"Vous avez commenté {file}",
"%1$s commented on %2$s":"%1$s a commenté %2$s",
"{author} commented on {file}":"{author} a commenté sur {file}",
"<strong>Comments</strong> for files":"<strong>Commentaires</strong> pour les fichiers",
"A (now) deleted user mentioned you in a comment on “%s”":"Un utilisateur (maintenant supprimé) vous a mentionné dans un commentaire sur “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un utilisateur (maintenant supprimé) vous a mentionné dans un commentaire sur “{file}”",
"<strong>Comments</strong> for files":"<strong>Commentaires</strong> sur les fichiers",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Vous avez été mentionné sur \"%s\", dans un commentaire par un utilisateur qui a été supprimé depuis lors.",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Vous avez été mentionné sur \"{file}\", dans un commentaire par un utilisateur qui a été supprimé depuis lors.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vous a mentionné⋅e dans un commentaire sur “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} vous a mentionné⋅e dans un commentaire sur “{file}”",
"Type in a new comment...":"Écrire un nouveau commentaire...",
"No other comments available":"Aucun autre commentaire",
"More comments...":"Plus de commentaires...",
"{count} unread comments":"{count} commentaires non lus",
"You commented on %2$s":"Vous avez commenté %2$s"
"Files app plugin to add comments to files":"Plugin Fichiers app pour ajouter des commentaires aux fichiers",
"Unknown user":"Utilisateur·trice inconnu·e",
"A (now) deleted user mentioned you in a comment on “%s”":"Un·e utilisateur·trice (maintenant supprimé·e) vous a mentionné·e dans un commentaire sur “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un·e utilisateur·trice (maintenant supprimé·e) vous a mentionné·e dans un commentaire sur “{file}”"
"You commented on %1$s":"Hozzászoltál ehhez: %1$s",
"You commented on {file}":"Hozzászóltál ehhez: {file}",
"%1$s commented on %2$s":"%1$s hozzászólt ehhez: %2$s",
"{author} commented on {file}":"{author} hozzászólt ehhez: {file}",
"<strong>Comments</strong> for files":"<strong>Hozzászólások</strong> fájlokhoz",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Megemlítettek ezen: “%s”, egy már törölt felhasználó hozzászólásában",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Megemlítettek ezen: “{file}”, egy már törölt felhasználó hozzászólásában",
"%1$s mentioned you in a comment on “%2$s”":"%1$s megemlített egy hozzászólásban itt: “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} megemlített egy hozzászólásban itt: “{file}”",
"Unknown user":"Ismeretlen felhasználó",
"A (now) deleted user mentioned you in a comment on “%s”":"Egy (most) törölt felhasználó megemlített egy hozzászólásban itt: “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Egy (most) törölt felhasználó megemlített egy hozzászólásban itt: “{file}”"
"You commented on %1$s":"Hozzászoltál ehhez: %1$s",
"You commented on {file}":"Hozzászóltál ehhez: {file}",
"%1$s commented on %2$s":"%1$s hozzászólt ehhez: %2$s",
"{author} commented on {file}":"{author} hozzászólt ehhez: {file}",
"<strong>Comments</strong> for files":"<strong>Hozzászólások</strong> fájlokhoz",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Megemlítettek ezen: “%s”, egy már törölt felhasználó hozzászólásában",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Megemlítettek ezen: “{file}”, egy már törölt felhasználó hozzászólásában",
"%1$s mentioned you in a comment on “%2$s”":"%1$s megemlített egy hozzászólásban itt: “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} megemlített egy hozzászólásban itt: “{file}”",
"Unknown user":"Ismeretlen felhasználó",
"A (now) deleted user mentioned you in a comment on “%s”":"Egy (most) törölt felhasználó megemlített egy hozzászólásban itt: “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Egy (most) törölt felhasználó megemlített egy hozzászólásban itt: “{file}”"
"You commented on %2$s":"Þú settir inn athugasemd við %2$s"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Minnst var á þig í “%s”, í athugasemd frá notanda sem síðan þá hefur verið eytt",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Minnst var á þig í “{file}”, í athugasemd frá notanda sem síðan þá hefur verið eytt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s minntist á þig í athugasemd við “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} minntist á þig í athugasemd við “{file}”",
"Unknown user":"Óþekktur notandi",
"A (now) deleted user mentioned you in a comment on “%s”":"Notandi (sem nú er búið að eyða) minntist á þig í athugasemd við “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Notandi (sem nú er búið að eyða) minntist á þig í athugasemd við “{file}”"
"You commented on %2$s":"Þú settir inn athugasemd við %2$s"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Minnst var á þig í “%s”, í athugasemd frá notanda sem síðan þá hefur verið eytt",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Minnst var á þig í “{file}”, í athugasemd frá notanda sem síðan þá hefur verið eytt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s minntist á þig í athugasemd við “%2$s”",
"{user} mentioned you in a comment on “{file}”":"{user} minntist á þig í athugasemd við “{file}”",
"Unknown user":"Óþekktur notandi",
"A (now) deleted user mentioned you in a comment on “%s”":"Notandi (sem nú er búið að eyða) minntist á þig í athugasemd við “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Notandi (sem nú er búið að eyða) minntist á þig í athugasemd við “{file}”"
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.