aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--apps/admin_audit/appinfo/info.xml4
-rw-r--r--apps/files/l10n/zh_CN.js132
-rw-r--r--apps/files/l10n/zh_CN.json132
-rw-r--r--apps/files_external/appinfo/info.xml6
-rw-r--r--apps/files_sharing/l10n/ru.js50
-rw-r--r--apps/files_sharing/l10n/ru.json50
-rw-r--r--apps/files_trashbin/l10n/zh_CN.js6
-rw-r--r--apps/files_trashbin/l10n/zh_CN.json6
-rw-r--r--bower.json1
-rw-r--r--core/Command/Config/ListConfigs.php19
-rw-r--r--core/css/apps.scss3
-rw-r--r--core/l10n/de.js1
-rw-r--r--core/l10n/de.json1
-rw-r--r--core/l10n/de_DE.js1
-rw-r--r--core/l10n/de_DE.json1
-rw-r--r--core/l10n/fr.js1
-rw-r--r--core/l10n/fr.json1
-rw-r--r--core/l10n/ru.js5
-rw-r--r--core/l10n/ru.json5
-rw-r--r--core/l10n/zh_CN.js281
-rw-r--r--core/l10n/zh_CN.json281
-rw-r--r--core/vendor/.gitignore16
-rw-r--r--core/vendor/DOMPurify/.bower.json42
-rw-r--r--core/vendor/DOMPurify/LICENSE378
-rw-r--r--core/vendor/DOMPurify/dist/purify.min.js2
-rw-r--r--core/vendor/marked/.bower.json33
-rw-r--r--core/vendor/marked/LICENSE19
-rw-r--r--core/vendor/marked/marked.min.js6
-rw-r--r--lib/l10n/sk_SK.js5
-rw-r--r--lib/l10n/sk_SK.json5
-rw-r--r--lib/private/AllConfig.php2
-rw-r--r--lib/private/AppConfig.php55
-rw-r--r--lib/private/SystemConfig.php1
-rw-r--r--lib/private/legacy/app.php40
-rw-r--r--lib/public/IAppConfig.php9
-rw-r--r--settings/css/settings.css23
-rw-r--r--settings/js/apps.js65
-rw-r--r--settings/templates/apps.php6
-rw-r--r--settings/tests/js/appsSpec.js10
-rw-r--r--tests/Core/Command/Config/ListConfigsTest.php6
-rw-r--r--tests/karma.config.js4
-rw-r--r--tests/lib/AppConfigTest.php23
-rw-r--r--tests/lib/AppTest.php20
-rw-r--r--themes/example/defaults.php6
45 files changed, 1225 insertions, 539 deletions
diff --git a/.gitignore b/.gitignore
index fa49588fad4..d8669fed074 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,6 +124,7 @@ Vagrantfile
# Tests - auto-generated files
/data-autotest
/tests/coverage*
+/tests/css
/tests/karma-coverage
/tests/autoconfig*
/tests/autotest*
diff --git a/apps/admin_audit/appinfo/info.xml b/apps/admin_audit/appinfo/info.xml
index 98862554090..e5ec9db0689 100644
--- a/apps/admin_audit/appinfo/info.xml
+++ b/apps/admin_audit/appinfo/info.xml
@@ -2,9 +2,7 @@
<info>
<id>admin_audit</id>
<name>Auditing / Logging</name>
- <description>Provides logging abilities for Nextcloud such as logging file
- accesses or otherwise sensitive actions.
- </description>
+ <description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
<licence>AGPL</licence>
<author>Nextcloud</author>
<version>1.2.0</version>
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 8f053b231d6..0a8e66d18c9 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -1,82 +1,82 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "存储器当前无法访问",
+ "Storage is temporarily not available" : "存储暂时不可用",
"Storage invalid" : "存储空间无效",
"Unknown error" : "未知错误",
"Files" : "文件",
"All files" : "全部文件",
"Recent" : "最近",
"File could not be found" : "文件未找到",
- "Home" : "家庭",
+ "Home" : "首页",
"Close" : "关闭",
"Favorites" : "收藏",
- "Could not create folder \"{dir}\"" : "不能创建文件夹 \"{dir}\"",
+ "Could not create folder \"{dir}\"" : "无法创建文件夹 \"{dir}\"",
"Upload cancelled." : "上传已取消",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。",
- "Target folder \"{dir}\" does not exist any more" : "目标目录\"{dir}\" 不存在",
- "Not enough free space" : "没有足够空间",
- "Uploading..." : "上传中...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传文件 {filename}, 因为其是一个目录或者长度为0字节",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足, 您上传的文件大小为 {size1}, 但可用空间仅剩 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
+ "Not enough free space" : "可用空间不足",
+ "Uploading..." : "正在上传...",
"..." : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Actions" : "动作",
+ "Actions" : "操作",
"Download" : "下载",
"Rename" : "重命名",
"Move" : "移动",
"Target folder" : "目标目录",
"Delete" : "删除",
- "Disconnect storage" : "断开储存连接",
+ "Disconnect storage" : "断开存储链接",
"Unshare" : "取消共享",
- "Could not load info for file \"{file}\"" : "无法载入\"{file}\"文件信息",
+ "Could not load info for file \"{file}\"" : "无法加载 \"{file}\" 文件信息",
"Details" : "详细信息",
"Select" : "选择",
"Pending" : "等待",
"Unable to determine date" : "无法确定日期",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。",
- "Could not move \"{file}\"" : "不能移动 \"{file}\"",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
+ "Could not move \"{file}\", target exists" : "无法移动 \"{file}\", 目标已存在",
+ "Could not move \"{file}\"" : "无法移动 \"{file}\"",
"{newName} already exists" : "{newname} 已经存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "不能重命名 \"{fileName}\",此文件已经不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。",
- "Could not rename \"{fileName}\"" : "不能重命名 \"{fileName}\"",
- "Could not create file \"{file}\"" : "不能创建文件 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "不能创建文件 \"{file}\" ,因为它已经存在",
- "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在",
- "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
- "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}'标签的结果",
+ "Could not rename \"{fileName}\", it does not exist any more" : "无法重命名 \"{fileName}\", 此文件已经不存在",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "文件夹 \"{dir}\" 中已经存在 \"{targetName}\". 请尝试其他的名称.",
+ "Could not rename \"{fileName}\"" : "无法重命名 \"{fileName}\"",
+ "Could not create file \"{file}\"" : "无法创建文件 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "无法创建文件 \"{file}\", 因为其已经存在",
+ "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹 \"{dir}\", 因为其已经存在",
+ "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错.",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}' 标签的结果",
"Name" : "名称",
"Size" : "大小",
"Modified" : "修改日期",
- "_%n folder_::_%n folders_" : ["%n 文件夹"],
+ "_%n folder_::_%n folders_" : ["%n 个文件夹"],
"_%n file_::_%n files_" : ["%n个文件"],
"{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 隐藏的"],
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
"You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件",
"_Uploading %n file_::_Uploading %n files_" : ["上传 %n 个文件"],
"New" : "新建",
- "\"{name}\" is an invalid file name." : "“{name}”是一个无效的文件名。",
- "File name cannot be empty." : "文件名不能为空。",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满,文件将无法更新或同步!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
+ "\"{name}\" is an invalid file name." : "\"{name}\" 是一个无效的文件名",
+ "File name cannot be empty." : "文件名不能为空.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满, 文件将无法更新或同步!",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满, 文件将无法更新或同步!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} 的存储空间即将用完 ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "您的存储空间即将用完 ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["匹配“{filter}”"],
- "View in folder" : "在文件夹里查看",
+ "_matches '{filter}'_::_match '{filter}'_" : ["匹配 '{filter}'"],
+ "View in folder" : "在文件夹中查看",
"Path" : "路径",
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
"Copy local link" : "复制本地链接",
"Folder" : "文件夹",
- "New folder" : "增加文件夹",
+ "New folder" : "新建文件夹",
"Upload" : "上传",
"An error occurred while trying to update the tags" : "更新标签时出错",
"Added to favorites" : "添加到收藏",
"Removed from favorites" : "取消收藏",
- "You added {file} to your favorites" : "您添加了 {file} 文件到您的收藏夹",
- "You removed {file} from your favorites" : "您从您的收藏夹删除了 {file} 文件",
+ "You added {file} to your favorites" : "您已经添加 {file} 到您的收藏夹",
+ "You removed {file} from your favorites" : "您已从收藏夹中删除 {file}",
"File changes" : "文件发生变化",
"Created by {user}" : "由 {user} 创建",
"Changed by {user}" : "由 {user} 更改",
@@ -97,29 +97,29 @@ OC.L10N.register(
"{user} renamed {oldfile} to {newfile}" : "{user} 将 {oldfile} 改名为 {newfile}",
"You moved {oldfile} to {newfile}" : "您移动 {oldfile} 到 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 移动 {oldfile} 到 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "一个文件从您的 <strong>收藏夹</strong> 添加或者删除",
- "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "一个文件或者文件夹被 <strong>更改</strong> 或者 <strong>重命名</strong>",
- "A new file or folder has been <strong>created</strong>" : "一个新的文件或文件夹已被<strong>创建</strong>",
- "A new file or folder has been <strong>deleted</strong>" : "一个新文件或者文件夹被 <strong>删除</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "针对<strong>已收藏文件</strong>的新建和修改发送有限的通知 <em>(仅流)</em>",
- "A new file or folder has been <strong>restored</strong>" : "一个新文件或者文件夹被<strong>恢复</strong>",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的 <strong>收藏夹</strong> 中",
+ "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "文件/文件夹已经 <strong>更改</strong> 或者 <strong>重命名</strong>",
+ "A new file or folder has been <strong>created</strong>" : "新的文件/文件夹已经 <strong>创建</strong>",
+ "A new file or folder has been <strong>deleted</strong>" : "新的文件/文件夹已经 <strong>删除</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "仅限 <strong>收藏文件</strong>的创建和更改通知 <em>(仅限流)</em>",
+ "A new file or folder has been <strong>restored</strong>" : "新的文件/文件夹已经<strong>恢复</strong>",
"Upload (max. %s)" : "上传 (最大 %s)",
"File handling" : "文件处理",
"Maximum upload size" : "最大上传大小",
"max. possible: " : "最大允许: ",
"Save" : "保存",
- "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。",
- "Missing permissions to edit from here." : "没有从这里进行编辑的权限",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
+ "Missing permissions to edit from here." : "没有权限编辑",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">通过 WebDAV 访问您的文件</a>",
"No files in here" : "无文件",
- "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
- "No entries found in this folder" : "此文件夹中无项目",
+ "Upload some content or sync with your devices!" : "上传或从您的设备中同步!",
+ "No entries found in this folder" : "文件夹中无项目",
"Select all" : "全部选择",
"Upload too large" : "上传文件过大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "正在上传的文件超过了此服务器允许上传的最大容量限制",
"No favorites" : "无收藏",
"Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
"Shared with you" : "与您分享",
@@ -130,43 +130,43 @@ OC.L10N.register(
"Text file" : "文本文件",
"New text file.txt" : "创建文本文件 .txt",
"Storage not available" : "存储空间不可用",
- "Unable to set upload directory." : "无法设置上传文件夹。",
+ "Unable to set upload directory." : "无法设置上传文件夹.",
"Invalid Token" : "无效密匙",
- "No file was uploaded. Unknown error" : "没有文件被上传。未知错误",
- "There is no error, the file uploaded with success" : "文件上传成功,没有错误发生",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件大小已超过php.ini中upload_max_filesize所规定的值",
+ "No file was uploaded. Unknown error" : "没有文件被上传. 未知错误",
+ "There is no error, the file uploaded with success" : "文件上传成功, 没有任何错误",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件的大小已超过 php.ini 中 upload_max_filesize 设置的值",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上传的文件长度超出了 HTML 表单中 MAX_FILE_SIZE 的限制",
- "The uploaded file was only partially uploaded" : "已上传文件只上传了部分(不完整)",
+ "The uploaded file was only partially uploaded" : "文件仅部分上传",
"No file was uploaded" : "没有文件被上传",
- "Missing a temporary folder" : "缺少临时目录",
+ "Missing a temporary folder" : "临时目录缺失",
"Failed to write to disk" : "写入磁盘失败",
"Not enough storage available" : "没有足够的存储空间",
- "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。",
- "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件",
- "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。",
- "Invalid directory." : "无效文件夹。",
+ "The target folder has been moved or deleted." : "目标文件夹已被移动或删除.",
+ "Upload failed. Could not find uploaded file" : "上传失败. 未发现上传的文件",
+ "Upload failed. Could not get file info." : "上传失败. 无法获取文件信息.",
+ "Invalid directory." : "无效文件夹.",
"Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}",
"Error uploading file \"{fileName}\": {message}" : "上传文件错误 \"{fileName}\": {message}",
- "Could not get result from server." : "不能从服务器得到结果",
- "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间:{hours}:{minutes}:{seconds} ",
+ "Could not get result from server." : "无法从服务器获取结果",
+ "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间: {hours}:{minutes}:{seconds} ",
"{hours}:{minutes}h" : "{hours}:{minutes}",
- "{minutes}:{seconds} minute{plural_s} left" : "剩余分钟:{minutes}:{seconds} ",
+ "{minutes}:{seconds} minute{plural_s} left" : "剩余 {minutes}:{seconds} 分钟",
"{minutes}:{seconds}m" : "{minutes}:{seconds}",
- "{seconds} second{plural_s} left" : "剩下{seconds} 秒",
- "{seconds}s" : "{seconds}秒",
+ "{seconds} second{plural_s} left" : "剩余 {seconds} 秒",
+ "{seconds}s" : "{seconds}s",
"Any moment now..." : "现在任何时候...",
"Soon..." : "很快...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
- "No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”",
+ "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中. 离开此页将会取消上传.",
+ "No entries in this folder match '{filter}'" : "文件夹中不存在 \"{filter}\"",
"Local link" : "本地链接",
"{newname} already exists" : "{newname} 已经存在",
- "A file or folder has been <strong>changed</strong>" : "一个文件或文件夹已被<strong>修改</strong>",
- "A file or folder has been <strong>deleted</strong>" : "一个文件或文件夹已被<strong>删除</strong>",
- "A file or folder has been <strong>restored</strong>" : "一个文件或文件夹已经被 <strong>恢复</strong>",
- "You created %1$s" : "您创建了%1$s",
+ "A file or folder has been <strong>changed</strong>" : "文件/文件夹已经 <strong>修改</strong>",
+ "A file or folder has been <strong>deleted</strong>" : "文件/文件夹已经 <strong>删除</strong>",
+ "A file or folder has been <strong>restored</strong>" : "文件/文件夹已经 <strong>恢复</strong>",
+ "You created %1$s" : "您创建了 %1$s",
"%2$s created %1$s" : "%2$s 创建了 %1$s",
"%1$s was created in a public folder" : "%1$s 被创建在公开文件夹中",
- "You changed %1$s" : "您修改了%1$s",
+ "You changed %1$s" : "您修改了 %1$s",
"%2$s changed %1$s" : "%2$s 修改了 %1$s",
"You deleted %1$s" : "您删除了 %1$s",
"%2$s deleted %1$s" : "%2$s 删除了 %1$s",
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 68e15813cdb..26ed83ac15c 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -1,80 +1,80 @@
{ "translations": {
- "Storage is temporarily not available" : "存储器当前无法访问",
+ "Storage is temporarily not available" : "存储暂时不可用",
"Storage invalid" : "存储空间无效",
"Unknown error" : "未知错误",
"Files" : "文件",
"All files" : "全部文件",
"Recent" : "最近",
"File could not be found" : "文件未找到",
- "Home" : "家庭",
+ "Home" : "首页",
"Close" : "关闭",
"Favorites" : "收藏",
- "Could not create folder \"{dir}\"" : "不能创建文件夹 \"{dir}\"",
+ "Could not create folder \"{dir}\"" : "无法创建文件夹 \"{dir}\"",
"Upload cancelled." : "上传已取消",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。",
- "Target folder \"{dir}\" does not exist any more" : "目标目录\"{dir}\" 不存在",
- "Not enough free space" : "没有足够空间",
- "Uploading..." : "上传中...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传文件 {filename}, 因为其是一个目录或者长度为0字节",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足, 您上传的文件大小为 {size1}, 但可用空间仅剩 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
+ "Not enough free space" : "可用空间不足",
+ "Uploading..." : "正在上传...",
"..." : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Actions" : "动作",
+ "Actions" : "操作",
"Download" : "下载",
"Rename" : "重命名",
"Move" : "移动",
"Target folder" : "目标目录",
"Delete" : "删除",
- "Disconnect storage" : "断开储存连接",
+ "Disconnect storage" : "断开存储链接",
"Unshare" : "取消共享",
- "Could not load info for file \"{file}\"" : "无法载入\"{file}\"文件信息",
+ "Could not load info for file \"{file}\"" : "无法加载 \"{file}\" 文件信息",
"Details" : "详细信息",
"Select" : "选择",
"Pending" : "等待",
"Unable to determine date" : "无法确定日期",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。",
- "Could not move \"{file}\"" : "不能移动 \"{file}\"",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
+ "Could not move \"{file}\", target exists" : "无法移动 \"{file}\", 目标已存在",
+ "Could not move \"{file}\"" : "无法移动 \"{file}\"",
"{newName} already exists" : "{newname} 已经存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "不能重命名 \"{fileName}\",此文件已经不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。",
- "Could not rename \"{fileName}\"" : "不能重命名 \"{fileName}\"",
- "Could not create file \"{file}\"" : "不能创建文件 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "不能创建文件 \"{file}\" ,因为它已经存在",
- "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在",
- "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
- "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}'标签的结果",
+ "Could not rename \"{fileName}\", it does not exist any more" : "无法重命名 \"{fileName}\", 此文件已经不存在",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "文件夹 \"{dir}\" 中已经存在 \"{targetName}\". 请尝试其他的名称.",
+ "Could not rename \"{fileName}\"" : "无法重命名 \"{fileName}\"",
+ "Could not create file \"{file}\"" : "无法创建文件 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "无法创建文件 \"{file}\", 因为其已经存在",
+ "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹 \"{dir}\", 因为其已经存在",
+ "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错.",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}' 标签的结果",
"Name" : "名称",
"Size" : "大小",
"Modified" : "修改日期",
- "_%n folder_::_%n folders_" : ["%n 文件夹"],
+ "_%n folder_::_%n folders_" : ["%n 个文件夹"],
"_%n file_::_%n files_" : ["%n个文件"],
"{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 隐藏的"],
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
"You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件",
"_Uploading %n file_::_Uploading %n files_" : ["上传 %n 个文件"],
"New" : "新建",
- "\"{name}\" is an invalid file name." : "“{name}”是一个无效的文件名。",
- "File name cannot be empty." : "文件名不能为空。",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满,文件将无法更新或同步!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
+ "\"{name}\" is an invalid file name." : "\"{name}\" 是一个无效的文件名",
+ "File name cannot be empty." : "文件名不能为空.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满, 文件将无法更新或同步!",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满, 文件将无法更新或同步!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} 的存储空间即将用完 ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "您的存储空间即将用完 ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["匹配“{filter}”"],
- "View in folder" : "在文件夹里查看",
+ "_matches '{filter}'_::_match '{filter}'_" : ["匹配 '{filter}'"],
+ "View in folder" : "在文件夹中查看",
"Path" : "路径",
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
"Copy local link" : "复制本地链接",
"Folder" : "文件夹",
- "New folder" : "增加文件夹",
+ "New folder" : "新建文件夹",
"Upload" : "上传",
"An error occurred while trying to update the tags" : "更新标签时出错",
"Added to favorites" : "添加到收藏",
"Removed from favorites" : "取消收藏",
- "You added {file} to your favorites" : "您添加了 {file} 文件到您的收藏夹",
- "You removed {file} from your favorites" : "您从您的收藏夹删除了 {file} 文件",
+ "You added {file} to your favorites" : "您已经添加 {file} 到您的收藏夹",
+ "You removed {file} from your favorites" : "您已从收藏夹中删除 {file}",
"File changes" : "文件发生变化",
"Created by {user}" : "由 {user} 创建",
"Changed by {user}" : "由 {user} 更改",
@@ -95,29 +95,29 @@
"{user} renamed {oldfile} to {newfile}" : "{user} 将 {oldfile} 改名为 {newfile}",
"You moved {oldfile} to {newfile}" : "您移动 {oldfile} 到 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 移动 {oldfile} 到 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "一个文件从您的 <strong>收藏夹</strong> 添加或者删除",
- "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "一个文件或者文件夹被 <strong>更改</strong> 或者 <strong>重命名</strong>",
- "A new file or folder has been <strong>created</strong>" : "一个新的文件或文件夹已被<strong>创建</strong>",
- "A new file or folder has been <strong>deleted</strong>" : "一个新文件或者文件夹被 <strong>删除</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "针对<strong>已收藏文件</strong>的新建和修改发送有限的通知 <em>(仅流)</em>",
- "A new file or folder has been <strong>restored</strong>" : "一个新文件或者文件夹被<strong>恢复</strong>",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的 <strong>收藏夹</strong> 中",
+ "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "文件/文件夹已经 <strong>更改</strong> 或者 <strong>重命名</strong>",
+ "A new file or folder has been <strong>created</strong>" : "新的文件/文件夹已经 <strong>创建</strong>",
+ "A new file or folder has been <strong>deleted</strong>" : "新的文件/文件夹已经 <strong>删除</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "仅限 <strong>收藏文件</strong>的创建和更改通知 <em>(仅限流)</em>",
+ "A new file or folder has been <strong>restored</strong>" : "新的文件/文件夹已经<strong>恢复</strong>",
"Upload (max. %s)" : "上传 (最大 %s)",
"File handling" : "文件处理",
"Maximum upload size" : "最大上传大小",
"max. possible: " : "最大允许: ",
"Save" : "保存",
- "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。",
- "Missing permissions to edit from here." : "没有从这里进行编辑的权限",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
+ "Missing permissions to edit from here." : "没有权限编辑",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">通过 WebDAV 访问您的文件</a>",
"No files in here" : "无文件",
- "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
- "No entries found in this folder" : "此文件夹中无项目",
+ "Upload some content or sync with your devices!" : "上传或从您的设备中同步!",
+ "No entries found in this folder" : "文件夹中无项目",
"Select all" : "全部选择",
"Upload too large" : "上传文件过大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "正在上传的文件超过了此服务器允许上传的最大容量限制",
"No favorites" : "无收藏",
"Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
"Shared with you" : "与您分享",
@@ -128,43 +128,43 @@
"Text file" : "文本文件",
"New text file.txt" : "创建文本文件 .txt",
"Storage not available" : "存储空间不可用",
- "Unable to set upload directory." : "无法设置上传文件夹。",
+ "Unable to set upload directory." : "无法设置上传文件夹.",
"Invalid Token" : "无效密匙",
- "No file was uploaded. Unknown error" : "没有文件被上传。未知错误",
- "There is no error, the file uploaded with success" : "文件上传成功,没有错误发生",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件大小已超过php.ini中upload_max_filesize所规定的值",
+ "No file was uploaded. Unknown error" : "没有文件被上传. 未知错误",
+ "There is no error, the file uploaded with success" : "文件上传成功, 没有任何错误",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件的大小已超过 php.ini 中 upload_max_filesize 设置的值",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上传的文件长度超出了 HTML 表单中 MAX_FILE_SIZE 的限制",
- "The uploaded file was only partially uploaded" : "已上传文件只上传了部分(不完整)",
+ "The uploaded file was only partially uploaded" : "文件仅部分上传",
"No file was uploaded" : "没有文件被上传",
- "Missing a temporary folder" : "缺少临时目录",
+ "Missing a temporary folder" : "临时目录缺失",
"Failed to write to disk" : "写入磁盘失败",
"Not enough storage available" : "没有足够的存储空间",
- "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。",
- "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件",
- "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。",
- "Invalid directory." : "无效文件夹。",
+ "The target folder has been moved or deleted." : "目标文件夹已被移动或删除.",
+ "Upload failed. Could not find uploaded file" : "上传失败. 未发现上传的文件",
+ "Upload failed. Could not get file info." : "上传失败. 无法获取文件信息.",
+ "Invalid directory." : "无效文件夹.",
"Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}",
"Error uploading file \"{fileName}\": {message}" : "上传文件错误 \"{fileName}\": {message}",
- "Could not get result from server." : "不能从服务器得到结果",
- "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间:{hours}:{minutes}:{seconds} ",
+ "Could not get result from server." : "无法从服务器获取结果",
+ "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间: {hours}:{minutes}:{seconds} ",
"{hours}:{minutes}h" : "{hours}:{minutes}",
- "{minutes}:{seconds} minute{plural_s} left" : "剩余分钟:{minutes}:{seconds} ",
+ "{minutes}:{seconds} minute{plural_s} left" : "剩余 {minutes}:{seconds} 分钟",
"{minutes}:{seconds}m" : "{minutes}:{seconds}",
- "{seconds} second{plural_s} left" : "剩下{seconds} 秒",
- "{seconds}s" : "{seconds}秒",
+ "{seconds} second{plural_s} left" : "剩余 {seconds} 秒",
+ "{seconds}s" : "{seconds}s",
"Any moment now..." : "现在任何时候...",
"Soon..." : "很快...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
- "No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”",
+ "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中. 离开此页将会取消上传.",
+ "No entries in this folder match '{filter}'" : "文件夹中不存在 \"{filter}\"",
"Local link" : "本地链接",
"{newname} already exists" : "{newname} 已经存在",
- "A file or folder has been <strong>changed</strong>" : "一个文件或文件夹已被<strong>修改</strong>",
- "A file or folder has been <strong>deleted</strong>" : "一个文件或文件夹已被<strong>删除</strong>",
- "A file or folder has been <strong>restored</strong>" : "一个文件或文件夹已经被 <strong>恢复</strong>",
- "You created %1$s" : "您创建了%1$s",
+ "A file or folder has been <strong>changed</strong>" : "文件/文件夹已经 <strong>修改</strong>",
+ "A file or folder has been <strong>deleted</strong>" : "文件/文件夹已经 <strong>删除</strong>",
+ "A file or folder has been <strong>restored</strong>" : "文件/文件夹已经 <strong>恢复</strong>",
+ "You created %1$s" : "您创建了 %1$s",
"%2$s created %1$s" : "%2$s 创建了 %1$s",
"%1$s was created in a public folder" : "%1$s 被创建在公开文件夹中",
- "You changed %1$s" : "您修改了%1$s",
+ "You changed %1$s" : "您修改了 %1$s",
"%2$s changed %1$s" : "%2$s 修改了 %1$s",
"You deleted %1$s" : "您删除了 %1$s",
"%2$s deleted %1$s" : "%2$s 删除了 %1$s",
diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml
index b2f73dce621..8482b8b25ed 100644
--- a/apps/files_external/appinfo/info.xml
+++ b/apps/files_external/appinfo/info.xml
@@ -3,9 +3,9 @@
<id>files_external</id>
<name>External storage support</name>
<description>
- This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, Google Drive, Dropbox, other ownCloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root ownCloud directory, which they can access and use like any other ownCloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.
-
- External storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation.
+This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, Google Drive, Dropbox, other ownCloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root ownCloud directory, which they can access and use like any other ownCloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.
+
+External storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation.
</description>
<licence>AGPL</licence>
<author>Robin Appelman, Michael Gapczynski, Vincent Petry</author>
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 88e750943d0..e12622cd00e 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -13,7 +13,7 @@ OC.L10N.register(
"You can upload into this folder" : "Вы можете загружать в этот каталог",
"No compatible server found at {remote}" : "Не найден совместимый сервер на {remote}",
"Invalid server URL" : "Неверный URL сервера",
- "Failed to add the public link to your Nextcloud" : "Не получилось добавить публичную ссылку на ваш Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Не получилось добавить общедоступную ссылку в ваш Nextcloud",
"Share" : "Поделиться",
"No expiration date set" : "Дата истечения не установлена",
"Shared by" : "Поделился",
@@ -22,8 +22,8 @@ OC.L10N.register(
"Downloaded via public link" : "Скачано по открытой ссылке",
"Downloaded by %1$s" : "Скачано %1$s",
"Downloaded by {email}" : "Скачано {email}",
- "%1$s downloaded via public link" : "%1$s скачано по публичной ссылке",
- "{file} downloaded via public link" : "{file} скачан по публичной ссылке",
+ "%1$s downloaded via public link" : "%1$s скачано по общедоступной ссылке",
+ "{file} downloaded via public link" : "{file} скачан по общедоступной ссылке",
"%1$s downloaded %2$s" : "%1$s скачан %2$s",
"{email} downloaded {file}" : "{email} скачал {file}",
"Shared with group %1$s" : "Поделился с группой %1$s",
@@ -42,20 +42,20 @@ OC.L10N.register(
"{actor} shared {file} with group {group}" : "{actor} поделился {file} с группой {group}",
"%3$s removed group %2$s from %1$s" : "%3$s удалил группу %2$s из %1$s",
"{actor} removed group {group} from {file}" : "{actor} удалил группу {group} из {file}",
- "Shared as public link" : "Поделился публичной ссылкой",
- "Removed public link" : "Удалена публичная ссылка",
- "%1$s shared as public link" : "%1$s поделился публичной ссылкой",
- "{actor} shared as public link" : "{actor} поделился публичной ссылкой",
- "%1$s removed public link" : "%1$s удалил публичную сслыку",
- "{actor} removed public link" : "{actor} удалил публичную ссылку",
- "You shared %1$s as public link" : "Вы поделись %1$s в виде публичной ссылки",
- "You shared {file} as public link" : "Вы поделись {file} в виде публичной ссылки",
- "You removed public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "You removed public link for {file}" : "Вы удалили публичную ссылку к {file}",
- "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде публичной ссылки",
- "{actor} shared {file} as public link" : "{actor} поделился {file} в виде публичной ссылки",
- "%2$s removed public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "{actor} removed public link for {file}" : "{actor} удалил публичную ссылку к {file}",
+ "Shared as public link" : "Поделился общедоступной ссылкой",
+ "Removed public link" : "Удалена общедоступная ссылка",
+ "%1$s shared as public link" : "%1$s поделился общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} поделился общедоступной ссылкой",
+ "%1$s removed public link" : "%1$s удалил общедоступной сслыку",
+ "{actor} removed public link" : "{actor} удалил общедоступной ссылку",
+ "You shared %1$s as public link" : "Вы поделись %1$s в виде общедоступной ссылки",
+ "You shared {file} as public link" : "Вы поделись {file} в виде общедоступной ссылки",
+ "You removed public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "You removed public link for {file}" : "Вы удалили общедоступную ссылку к {file}",
+ "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} поделился {file} в виде общедоступной ссылки",
+ "%2$s removed public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "{actor} removed public link for {file}" : "{actor} удалил общедоступную ссылку к {file}",
"%1$s accepted the remote share" : "%1$s принял удаленный общий ресурс",
"{user} accepted the remote share" : "{user} принял удаленный общий ресурс",
"%1$s declined the remote share" : "%1$s отклонил удаленный общий ресурс",
@@ -91,7 +91,7 @@ OC.L10N.register(
"{actor} shared {file} with you" : "{actor} поделился {file} с вами",
"%2$s removed you from %1$s" : "%2$s удалил вас из %1$s",
"{actor} removed you from {file}" : "{actor} удалил вас из {file}",
- "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или публичной ссылке, были <strong>скачаны</strong>",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Файлом или каталогом поделились с <strong>удаленного сервера</strong>",
"A file or folder has been <strong>shared</strong>" : "<strong>Опубликован</strong> файл или каталог",
"Wrong share ID, share doesn't exist" : "Неверный идентификатор публикации, публикация не существует",
@@ -154,10 +154,10 @@ OC.L10N.register(
"%2$s removed the share of group %3$s for %1$s" : "%2$s удалил общий доступ к группе %3$s для %1$s",
"%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке",
"You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки",
- "You removed the public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "%2$s removed the public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "Your public link for %1$s expired" : "Срок действия Вашей публичной ссылки к %1$s закончился",
- "The public link of %2$s for %1$s expired" : "Срок действия публичной ссылки к %2$s для %1$s закончился",
+ "You removed the public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "Your public link for %1$s expired" : "Срок действия Вашей общедоступной ссылки к %1$s закончился",
+ "The public link of %2$s for %1$s expired" : "Срок действия общедоступной ссылки к %2$s для %1$s закончился",
"%2$s removed the share for %1$s" : "%2$s удалил общий доступ к %1$s",
"Shared with %2$s" : "Поделился с %2$s",
"Shared with %3$s by %2$s" : "Поделился %2$s с %3$s",
@@ -169,9 +169,9 @@ OC.L10N.register(
"%2$s removed share of group %3$s" : "%2$s удалил общий доступ к группе %3$s",
"Shared via link by %2$s" : "Поделился ссылкой %2$s",
"Shared via public link" : "Поделился открытой ссылкой",
- "%2$s removed public link" : "%2$s удалил публичную ссылку",
- "Public link expired" : "Срок действия публичной ссылки закончился",
- "Public link of %2$s expired" : "Срок действия публичной ссылки к %2$s закончился",
+ "%2$s removed public link" : "%2$s удалил общедоступную ссылку",
+ "Public link expired" : "Срок действия общедоступнной ссылки закончился",
+ "Public link of %2$s expired" : "Срок действия общедоступной ссылки к %2$s закончился",
"Shared by %2$s" : "Поделился %2$s",
"Shares" : "События обмена файлами"
},
diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index 3f5a707ed7b..fe9b1660292 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -11,7 +11,7 @@
"You can upload into this folder" : "Вы можете загружать в этот каталог",
"No compatible server found at {remote}" : "Не найден совместимый сервер на {remote}",
"Invalid server URL" : "Неверный URL сервера",
- "Failed to add the public link to your Nextcloud" : "Не получилось добавить публичную ссылку на ваш Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Не получилось добавить общедоступную ссылку в ваш Nextcloud",
"Share" : "Поделиться",
"No expiration date set" : "Дата истечения не установлена",
"Shared by" : "Поделился",
@@ -20,8 +20,8 @@
"Downloaded via public link" : "Скачано по открытой ссылке",
"Downloaded by %1$s" : "Скачано %1$s",
"Downloaded by {email}" : "Скачано {email}",
- "%1$s downloaded via public link" : "%1$s скачано по публичной ссылке",
- "{file} downloaded via public link" : "{file} скачан по публичной ссылке",
+ "%1$s downloaded via public link" : "%1$s скачано по общедоступной ссылке",
+ "{file} downloaded via public link" : "{file} скачан по общедоступной ссылке",
"%1$s downloaded %2$s" : "%1$s скачан %2$s",
"{email} downloaded {file}" : "{email} скачал {file}",
"Shared with group %1$s" : "Поделился с группой %1$s",
@@ -40,20 +40,20 @@
"{actor} shared {file} with group {group}" : "{actor} поделился {file} с группой {group}",
"%3$s removed group %2$s from %1$s" : "%3$s удалил группу %2$s из %1$s",
"{actor} removed group {group} from {file}" : "{actor} удалил группу {group} из {file}",
- "Shared as public link" : "Поделился публичной ссылкой",
- "Removed public link" : "Удалена публичная ссылка",
- "%1$s shared as public link" : "%1$s поделился публичной ссылкой",
- "{actor} shared as public link" : "{actor} поделился публичной ссылкой",
- "%1$s removed public link" : "%1$s удалил публичную сслыку",
- "{actor} removed public link" : "{actor} удалил публичную ссылку",
- "You shared %1$s as public link" : "Вы поделись %1$s в виде публичной ссылки",
- "You shared {file} as public link" : "Вы поделись {file} в виде публичной ссылки",
- "You removed public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "You removed public link for {file}" : "Вы удалили публичную ссылку к {file}",
- "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде публичной ссылки",
- "{actor} shared {file} as public link" : "{actor} поделился {file} в виде публичной ссылки",
- "%2$s removed public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "{actor} removed public link for {file}" : "{actor} удалил публичную ссылку к {file}",
+ "Shared as public link" : "Поделился общедоступной ссылкой",
+ "Removed public link" : "Удалена общедоступная ссылка",
+ "%1$s shared as public link" : "%1$s поделился общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} поделился общедоступной ссылкой",
+ "%1$s removed public link" : "%1$s удалил общедоступной сслыку",
+ "{actor} removed public link" : "{actor} удалил общедоступной ссылку",
+ "You shared %1$s as public link" : "Вы поделись %1$s в виде общедоступной ссылки",
+ "You shared {file} as public link" : "Вы поделись {file} в виде общедоступной ссылки",
+ "You removed public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "You removed public link for {file}" : "Вы удалили общедоступную ссылку к {file}",
+ "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} поделился {file} в виде общедоступной ссылки",
+ "%2$s removed public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "{actor} removed public link for {file}" : "{actor} удалил общедоступную ссылку к {file}",
"%1$s accepted the remote share" : "%1$s принял удаленный общий ресурс",
"{user} accepted the remote share" : "{user} принял удаленный общий ресурс",
"%1$s declined the remote share" : "%1$s отклонил удаленный общий ресурс",
@@ -89,7 +89,7 @@
"{actor} shared {file} with you" : "{actor} поделился {file} с вами",
"%2$s removed you from %1$s" : "%2$s удалил вас из %1$s",
"{actor} removed you from {file}" : "{actor} удалил вас из {file}",
- "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или публичной ссылке, были <strong>скачаны</strong>",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Файлом или каталогом поделились с <strong>удаленного сервера</strong>",
"A file or folder has been <strong>shared</strong>" : "<strong>Опубликован</strong> файл или каталог",
"Wrong share ID, share doesn't exist" : "Неверный идентификатор публикации, публикация не существует",
@@ -152,10 +152,10 @@
"%2$s removed the share of group %3$s for %1$s" : "%2$s удалил общий доступ к группе %3$s для %1$s",
"%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке",
"You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки",
- "You removed the public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "%2$s removed the public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "Your public link for %1$s expired" : "Срок действия Вашей публичной ссылки к %1$s закончился",
- "The public link of %2$s for %1$s expired" : "Срок действия публичной ссылки к %2$s для %1$s закончился",
+ "You removed the public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "Your public link for %1$s expired" : "Срок действия Вашей общедоступной ссылки к %1$s закончился",
+ "The public link of %2$s for %1$s expired" : "Срок действия общедоступной ссылки к %2$s для %1$s закончился",
"%2$s removed the share for %1$s" : "%2$s удалил общий доступ к %1$s",
"Shared with %2$s" : "Поделился с %2$s",
"Shared with %3$s by %2$s" : "Поделился %2$s с %3$s",
@@ -167,9 +167,9 @@
"%2$s removed share of group %3$s" : "%2$s удалил общий доступ к группе %3$s",
"Shared via link by %2$s" : "Поделился ссылкой %2$s",
"Shared via public link" : "Поделился открытой ссылкой",
- "%2$s removed public link" : "%2$s удалил публичную ссылку",
- "Public link expired" : "Срок действия публичной ссылки закончился",
- "Public link of %2$s expired" : "Срок действия публичной ссылки к %2$s закончился",
+ "%2$s removed public link" : "%2$s удалил общедоступную ссылку",
+ "Public link expired" : "Срок действия общедоступнной ссылки закончился",
+ "Public link of %2$s expired" : "Срок действия общедоступной ссылки к %2$s закончился",
"Shared by %2$s" : "Поделился %2$s",
"Shares" : "События обмена файлами"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
diff --git a/apps/files_trashbin/l10n/zh_CN.js b/apps/files_trashbin/l10n/zh_CN.js
index be1eeab9348..8e1d4317ca4 100644
--- a/apps/files_trashbin/l10n/zh_CN.js
+++ b/apps/files_trashbin/l10n/zh_CN.js
@@ -1,15 +1,15 @@
OC.L10N.register(
"files_trashbin",
{
- "Couldn't delete %s permanently" : "无法彻底删除文件%s",
- "Couldn't restore %s" : "无法恢复%s",
+ "Couldn't delete %s permanently" : "无法彻底删除文件 %s",
+ "Couldn't restore %s" : "无法恢复 %s",
"Deleted files" : "已删除文件",
"Restore" : "恢复",
"Delete" : "删除",
"Delete permanently" : "永久删除",
"Error" : "错误",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
"restored" : "已恢复",
"No deleted files" : "无已删除文件",
"You will be able to recover deleted files from here" : "你可以在此处恢复已删除的文件",
diff --git a/apps/files_trashbin/l10n/zh_CN.json b/apps/files_trashbin/l10n/zh_CN.json
index 5d458254b87..b7d27ce5168 100644
--- a/apps/files_trashbin/l10n/zh_CN.json
+++ b/apps/files_trashbin/l10n/zh_CN.json
@@ -1,13 +1,13 @@
{ "translations": {
- "Couldn't delete %s permanently" : "无法彻底删除文件%s",
- "Couldn't restore %s" : "无法恢复%s",
+ "Couldn't delete %s permanently" : "无法彻底删除文件 %s",
+ "Couldn't restore %s" : "无法恢复 %s",
"Deleted files" : "已删除文件",
"Restore" : "恢复",
"Delete" : "删除",
"Delete permanently" : "永久删除",
"Error" : "错误",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
"restored" : "已恢复",
"No deleted files" : "无已删除文件",
"You will be able to recover deleted files from here" : "你可以在此处恢复已删除的文件",
diff --git a/bower.json b/bower.json
index b4256b0c7aa..0735f4eb5a0 100644
--- a/bower.json
+++ b/bower.json
@@ -20,6 +20,7 @@
"jquery-migrate": "~1.4.0",
"jquery-ui": "1.10.0",
"jsTimezoneDetect": "~1.0.5",
+ "marked": "^0.3.6",
"moment": "^2.15.0",
"select2": "~3.4.8",
"zxcvbn": "*",
diff --git a/core/Command/Config/ListConfigs.php b/core/Command/Config/ListConfigs.php
index 2737bc2cea4..94b493c9244 100644
--- a/core/Command/Config/ListConfigs.php
+++ b/core/Command/Config/ListConfigs.php
@@ -89,14 +89,14 @@ class ListConfigs extends Base {
'apps' => [],
];
foreach ($apps as $appName) {
- $configs['apps'][$appName] = $this->appConfig->getValues($appName, false);
+ $configs['apps'][$appName] = $this->getAppConfigs($appName, $noSensitiveValues);
}
break;
default:
$configs = [
'apps' => [
- $app => $this->appConfig->getValues($app, false),
+ $app => $this->getAppConfigs($app, $noSensitiveValues),
],
];
}
@@ -130,6 +130,21 @@ class ListConfigs extends Base {
}
/**
+ * Get the app configs
+ *
+ * @param string $app
+ * @param bool $noSensitiveValues
+ * @return array
+ */
+ protected function getAppConfigs($app, $noSensitiveValues) {
+ if ($noSensitiveValues) {
+ return $this->appConfig->getFilteredValues($app, false);
+ } else {
+ return $this->appConfig->getValues($app, false);
+ }
+ }
+
+ /**
* @param string $argumentName
* @param CompletionContext $context
* @return string[]
diff --git a/core/css/apps.scss b/core/css/apps.scss
index 6166a9b3326..88fd223ba64 100644
--- a/core/css/apps.scss
+++ b/core/css/apps.scss
@@ -603,7 +603,8 @@ em {
li {
display: flex;
> button,
- > a {
+ > a,
+ > .menuitem {
cursor: pointer;
line-height: 36px;
border: 0;
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 050ecd0bf2f..9c558ffd2a8 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -60,6 +60,7 @@ OC.L10N.register(
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen deines Passwortes ist an deine E-Mail-Adresse versandt worden. Solltest du in Kürze keine entsprechende E-Mail erhalten, überprüfe bitte deinen Spam-Ordner.<br>Ansonsten kannst du dich bei deinem lokalen Administrator melden.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Es gibt keinen Weg Deine Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Du Dir nicht sicher bist, kontaktiere Deinen Administrator.<br />Möchtest Du wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktiere deinen Administrator.",
"No" : "Nein",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index c7a8997926e..9491465ac37 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -58,6 +58,7 @@
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen deines Passwortes ist an deine E-Mail-Adresse versandt worden. Solltest du in Kürze keine entsprechende E-Mail erhalten, überprüfe bitte deinen Spam-Ordner.<br>Ansonsten kannst du dich bei deinem lokalen Administrator melden.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Es gibt keinen Weg Deine Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Du Dir nicht sicher bist, kontaktiere Deinen Administrator.<br />Möchtest Du wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktiere deinen Administrator.",
"No" : "Nein",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index bcb617ac595..c73bccbf0b2 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -60,6 +60,7 @@ OC.L10N.register(
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn nicht in Kürze erhalten, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn die E-Mail sich nicht darin befindet, wenden Sie sich bette an Ihrem lokalen Administrator.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Es gibt keinen Weg Ihre Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Sie sich nicht sicher sind, kontaktieren Sie Ihren Administrator.<br />Möchten Sie wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator.",
"No" : "Nein",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index 88dff7c9076..024fb770198 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -58,6 +58,7 @@
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn nicht in Kürze erhalten, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn die E-Mail sich nicht darin befindet, wenden Sie sich bette an Ihrem lokalen Administrator.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Es gibt keinen Weg Ihre Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Sie sich nicht sicher sind, kontaktieren Sie Ihren Administrator.<br />Möchten Sie wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator.",
"No" : "Nein",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index c3399bc074f..660cedc31a0 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -60,6 +60,7 @@ OC.L10N.register(
"seconds ago" : "à l'instant",
"Logging in …" : "Connexion…",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
"I know what I'm doing" : "Je sais ce que je fais",
"Password can not be changed. Please contact your administrator." : "Le mot de passe ne peut être modifié. Veuillez contacter votre administrateur.",
"No" : "Non",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index cbc85a6d585..e99e1adc9ad 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -58,6 +58,7 @@
"seconds ago" : "à l'instant",
"Logging in …" : "Connexion…",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
"I know what I'm doing" : "Je sais ce que je fais",
"Password can not be changed. Please contact your administrator." : "Le mot de passe ne peut être modifié. Veuillez contacter votre administrateur.",
"No" : "Non",
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 79365c0cdcf..a29beebb3c1 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -60,6 +60,7 @@ OC.L10N.register(
"seconds ago" : "несколько секунд назад",
"Logging in …" : "Вход в систему …",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ссылка для сброса пароля была отправлена на ваш email. Если вы не получили письмо в течении разумного промежутка времени, проверьте папку со спамом.<br>Если письма там нет, то обратитесь к вашему администратору.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваши файлы зашифрованы. После сброса пароля ваши данные будут недоступны. .<br />Если вы не уверены что делать дальше - обратитесь к вашему администратору.<br />Вы действительно хотите продолжить?",
"I know what I'm doing" : "Я понимаю, что делаю",
"Password can not be changed. Please contact your administrator." : "Пароль не может быть изменён. Пожалуйста, свяжитесь с вашим администратором.",
"No" : "Нет",
@@ -106,11 +107,11 @@ OC.L10N.register(
"Error while sharing" : "При попытке поделиться произошла ошибка",
"Error while unsharing" : "При закрытии доступа произошла ошибка",
"Error setting expiration date" : "Ошибка при установке срока доступа",
- "The public link will expire no later than {days} days after it is created" : "Срок действия публичной ссылки истекает не позже чем через {days} дней после её создания",
+ "The public link will expire no later than {days} days after it is created" : "Срок действия общедоступной ссылки истекает не позже чем через {days} дней после её создания",
"Set expiration date" : "Установить срок действия",
"Expiration" : "Срок действия",
"Expiration date" : "Дата окончания",
- "Choose a password for the public link" : "Укажите пароль для публичной ссылки",
+ "Choose a password for the public link" : "Укажите пароль для общедоступной ссылки",
"Copied!" : "Скопировано!",
"Copy" : "Копировать",
"Not supported!" : "Не поддерживается!",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index c49bd302c6f..48a498cd435 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -58,6 +58,7 @@
"seconds ago" : "несколько секунд назад",
"Logging in …" : "Вход в систему …",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ссылка для сброса пароля была отправлена на ваш email. Если вы не получили письмо в течении разумного промежутка времени, проверьте папку со спамом.<br>Если письма там нет, то обратитесь к вашему администратору.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваши файлы зашифрованы. После сброса пароля ваши данные будут недоступны. .<br />Если вы не уверены что делать дальше - обратитесь к вашему администратору.<br />Вы действительно хотите продолжить?",
"I know what I'm doing" : "Я понимаю, что делаю",
"Password can not be changed. Please contact your administrator." : "Пароль не может быть изменён. Пожалуйста, свяжитесь с вашим администратором.",
"No" : "Нет",
@@ -104,11 +105,11 @@
"Error while sharing" : "При попытке поделиться произошла ошибка",
"Error while unsharing" : "При закрытии доступа произошла ошибка",
"Error setting expiration date" : "Ошибка при установке срока доступа",
- "The public link will expire no later than {days} days after it is created" : "Срок действия публичной ссылки истекает не позже чем через {days} дней после её создания",
+ "The public link will expire no later than {days} days after it is created" : "Срок действия общедоступной ссылки истекает не позже чем через {days} дней после её создания",
"Set expiration date" : "Установить срок действия",
"Expiration" : "Срок действия",
"Expiration date" : "Дата окончания",
- "Choose a password for the public link" : "Укажите пароль для публичной ссылки",
+ "Choose a password for the public link" : "Укажите пароль для общедоступной ссылки",
"Copied!" : "Скопировано!",
"Copy" : "Копировать",
"Not supported!" : "Не поддерживается!",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index 306f5651d71..9018b26d645 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -3,39 +3,39 @@ OC.L10N.register(
{
"Please select a file." : "请选择一个文件",
"File is too big" : "文件太大",
- "The selected file is not an image." : "所选文件不是一张图片",
- "The selected file cannot be read." : "无法读取所选文件",
+ "The selected file is not an image." : "所选文件不是一张图片.",
+ "The selected file cannot be read." : "无法读取所选文件.",
"Invalid file provided" : "提供了无效文件",
"No image or file provided" : "没有提供图片或文件",
"Unknown filetype" : "未知的文件类型",
"Invalid image" : "无效的图像",
- "An error occurred. Please contact your admin." : "发生了一个错误,请联系管理员。",
- "No temporary profile picture available, try again" : "没有临时概览页图片可用,请重试",
- "No crop data provided" : "没有提供相应数据",
+ "An error occurred. Please contact your admin." : "发生了一个错误, 请联系管理员.",
+ "No temporary profile picture available, try again" : "没有临时个人页图片可用, 请重试",
+ "No crop data provided" : "没有提供剪裁数据",
"No valid crop data provided" : "没有提供有效的裁剪数据",
"Crop is not square" : "裁剪的不是正方形",
- "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码",
- "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期",
- "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "此用户名的电子邮件地址不存在导致无法发送重置邮件,请联系管理员。",
+ "Couldn't reset password because the token is invalid" : "令牌无效, 无法重置密码",
+ "Couldn't reset password because the token is expired" : "令牌已过期, 无法重置密码",
+ "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件, 请检查您的用户名是否正确.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "该用户没有设置电子邮件地址, 无发送重置邮件. 请联系管理员.",
"%s password reset" : "重置 %s 的密码",
- "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。",
+ "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件, 请联系管理员.",
"Preparing update" : "正在准备更新",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "修复警告:",
- "Repair error: " : "修复错误:",
- "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用,请使用命令行更新。",
+ "Repair warning: " : "修复警告:",
+ "Repair error: " : "修复错误:",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用, 请使用命令行更新.",
"[%d / %d]: Checking table %s" : "[%d / %d]: 检查数据表 %s",
"Turned on maintenance mode" : "启用维护模式",
"Turned off maintenance mode" : "关闭维护模式",
- "Maintenance mode is kept active" : "维护模式已被启用",
- "Updating database schema" : "正在更新数据库架构",
+ "Maintenance mode is kept active" : "维护模式已启用",
+ "Updating database schema" : "正在更新数据库结构",
"Updated database" : "数据库已更新",
- "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update" : "已经检查数据库架构更新",
+ "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update" : "已经检查数据库结构更新",
"Checking updates of apps" : "检查更新应用",
- "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update for apps" : "已经检查应用的数据库架构更新",
+ "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update for apps" : "已经检查应用的数据库结构更新",
"Updated \"%s\" to %s" : "更新 \"%s\" 为 %s",
"Set log level to debug" : "设置日志级别为 调试",
"Reset log level" : "重设日志级别",
@@ -43,12 +43,12 @@ OC.L10N.register(
"Finished code integrity check" : "代码完整性检查完成",
"%s (3rdparty)" : "%s (第三方)",
"%s (incompatible)" : "%s (不兼容)",
- "Following apps have been disabled: %s" : "下列应用已经被禁用:%s",
+ "Following apps have been disabled: %s" : "下列应用已经被禁用: %s",
"Already up to date" : "已经是最新",
- "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常,点击查看详细信息...</a>",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常, 点击查看详细信息...</a>",
"Settings" : "设置",
"Connection to server lost" : "与服务器的连接断开",
- "Problem loading page, reloading in 5 seconds" : "加载页面出现问题,在 5 秒内重新载入",
+ "Problem loading page, reloading in 5 seconds" : "加载页面出现问题, 在 5 秒内重新加载",
"Saving..." : "保存中...",
"Dismiss" : "忽略",
"This action requires you to confirm your password" : "请您确认您的密码",
@@ -56,83 +56,84 @@ OC.L10N.register(
"Password" : "密码",
"Cancel" : "取消",
"Confirm" : "确认",
- "Failed to authenticate, try again" : "授权失败,请重试",
+ "Failed to authenticate, try again" : "授权失败, 请重试",
"seconds ago" : "几秒前",
- "Logging in …" : "正在登陆...",
- "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<br>如果未能收到邮件请联系管理员。",
+ "Logging in …" : "正在登录...",
+ "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中. 如果您长时间没能收到邮件, 请检查您邮箱的垃圾/广告文件夹 <br>如果未能收到邮件请联系管理员.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已经加密. 当您的密码重置后没有任何方式能恢复您的数据. <br />如果您不确定, 请在继续前联系您的管理员.<br/>您是否真的要继续?",
"I know what I'm doing" : "我知道我在做什么",
- "Password can not be changed. Please contact your administrator." : "无法修改密码,请联系管理员。",
+ "Password can not be changed. Please contact your administrator." : "无法修改密码, 请联系管理员.",
"No" : "否",
"Yes" : "是",
"No files in here" : "未找到文件",
"Choose" : "选择",
- "Error loading file picker template: {error}" : "加载文件分拣模板出错: {error}",
+ "Error loading file picker template: {error}" : "加载文件选择模板出错: {error}",
"Ok" : "确定",
"Error loading message template: {error}" : "加载消息模板出错: {error}",
"read-only" : "只读",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} 个文件冲突"],
- "One file conflict" : "1个文件冲突",
+ "One file conflict" : "1 个文件冲突",
"New Files" : "新文件",
"Already existing files" : "已经存在的文件",
- "Which files do you want to keep?" : "想要保留哪一个文件呢?",
- "If you select both versions, the copied file will have a number added to its name." : "如果同时选择了两个版本,复制的文件名将会增加上一个数字。",
+ "Which files do you want to keep?" : "请选择需要保留的文件?",
+ "If you select both versions, the copied file will have a number added to its name." : "如果同时选择了两个版本, 副本的文件名中将会追加数字.",
"Continue" : "继续",
"(all selected)" : "(选中全部)",
- "({count} selected)" : "(选择了{count}个)",
+ "({count} selected)" : "(选择了 {count} 个)",
"Error loading file exists template" : "加载文件存在性模板失败",
- "Pending" : "挂起",
+ "Pending" : "等待",
"Very weak password" : "非常弱的密码",
"Weak password" : "弱密码",
"So-so password" : "一般强度的密码",
"Good password" : "较强的密码",
"Strong password" : "强密码",
- "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
- "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的web服务器未正确设置以解析 \"{url}\"。您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息。",
- "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有有效的英特网连接:无法访问多个节点。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a> 。",
- "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom 无法被 PHP 读取,出于安全原因,这是强烈不推荐的。请查看<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>了解详情。",
- "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "你的 PHP 版本 ({version}) 不再被 <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> PHP </a>支持。我们建议您升级您的PHP版本,以便获得 PHP 性能和安全提升。",
- "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "方向代理配置不正确,或者您正在通过可信的代理访问 Nextcloud 。如果您不是通过可信代理访问 Nextcloud ,这将会是一个安全问题,将允许攻击者通过伪装IP地址访问 Nextcloud。要获得更进一步的信息,请访问 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
- "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 配置为分布式缓存,但是已经安装的 PHP 模块是 \"memcache\" 。 \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\"。点击 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\"> memcached wiki 了解两个模块的不同</a>.",
- "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查。如何解决此问题的详细信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
- "Error occurred while checking server setup" : "当检查服务器启动时出错",
- "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
- "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 头部没有配置和 \"{expected}\" 的一样。这是一个潜在的安全或者隐私风险,我们调整这项设置。",
- "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 严格传输安全(Strict-Transport-Security)报头未配置到至少“{seconds}”秒。处于增强安全性考虑,我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>启用 HSTS。",
- "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点,我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>配置服务器强制使用 HTTPS。",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏, 因此你的 Web 服务器没有正确地设置允许文件同步。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的 Web 服务器未正确设置以解析 \"{url}\". 您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有可用的互联网连接: 多个节点无法访问. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置. 如果可用, 请配置 memcache 以增强性能. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP 无法访问 /dev/urandom, 由于安全原因, 这是强烈不推荐的. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "您当前的 PHP 版本 {version}. 我们建议您尽快升级您的 PHP 版本, 以便获得<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">来自 PHP 官方的性能和安全</a>的提升.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 Nextcloud. 如果您不是通过可信代理访问 Nextcloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 Nextcloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 当前配置为分布式缓存, 但是当前安装的 PHP 模块是 \"memcache\". \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\". 点击<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki</a>了解两者的不同.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查. 了解如何解决该问题请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效的文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
+ "Error occurred while checking server setup" : "检查服务器设置时出错",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "您的数据目录和文件可从互联网被访问. .htaccess 文件没有工作. 我们强烈建议您在 Web 服务器上配置不可以访问数据目录, 或者将数据目录移动到 Web 服务器根目录之外.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP 请求头 \"{header}\" 没有配置为 \"{expected}\". 这是一个潜在的安全或隐私风险, 我们建议您调整这项设置.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 请求头 \"Strict-Transport-Security\" 没有配置为至少 “{seconds}” 秒. 出于增强安全性考虑, 我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>中的说明启用 HSTS.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点, 我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>中的说明配置服务器强制使用 HTTPS.",
"Shared" : "已共享",
- "Shared with {recipients}" : "由{recipients}分享",
+ "Shared with {recipients}" : "由 {recipients} 分享",
"Error" : "错误",
"Error while sharing" : "共享时出错",
"Error while unsharing" : "取消共享时出错",
"Error setting expiration date" : "设置过期日期时出错",
- "The public link will expire no later than {days} days after it is created" : "这个共享链接将在创建后 {days} 天失效",
+ "The public link will expire no later than {days} days after it is created" : "该共享链接将在创建后 {days} 天失效",
"Set expiration date" : "设置过期日期",
"Expiration" : "过期",
"Expiration date" : "过期日期",
"Choose a password for the public link" : "为共享链接设置密码",
- "Copied!" : "已经复制!",
+ "Copied!" : "已经复制!",
"Copy" : "复制",
- "Not supported!" : "不被支持!",
- "Press ⌘-C to copy." : "按 ⌘ + C 进行复制。",
- "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制。",
+ "Not supported!" : "无法支持!",
+ "Press ⌘-C to copy." : "按 ⌘ + C 进行复制.",
+ "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制.",
"Resharing is not allowed" : "不允许二次共享",
"Share link" : "分享链接",
"Link" : "链接",
"Password protect" : "密码保护",
"Allow upload and editing" : "允许上传和编辑",
- "File drop (upload only)" : "文件访问(只允许上传)",
+ "File drop (upload only)" : "文件拖拽 (仅上传)",
"Email link to person" : "发送链接到个人",
"Send" : "发送",
- "Shared with you and the group {group} by {owner}" : "{owner} 共享给您及 {group} 组",
- "Shared with you by {owner}" : "{owner} 与您共享",
+ "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组",
+ "Shared with you by {owner}" : "{owner} 分享给您",
"{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 通过链接分享",
"group" : "群组",
- "remote" : "远程",
+ "remote" : "外部",
"email" : "邮件",
"Unshare" : "取消共享",
"can reshare" : "允许重新分享",
- "can edit" : "可以修改",
+ "can edit" : "允许修改",
"can create" : "允许创建",
"can change" : "允许改变",
"can delete" : "允许删除",
@@ -141,20 +142,20 @@ OC.L10N.register(
"Share details could not be loaded for this item." : "无法加载这个项目的分享详情",
"No users or groups found for {search}" : "{search} 条件下没有找到用户或用户组",
"No users found for {search}" : "没有找到 {search} 用户",
- "An error occurred. Please try again" : "发生错误。请重试。",
- "{sharee} (group)" : "{sharee} (组)",
- "{sharee} (remote)" : "{sharee} (远程)",
+ "An error occurred. Please try again" : "发生错误. 请重试.",
+ "{sharee} (group)" : "{sharee} (分组)",
+ "{sharee} (remote)" : "{sharee} (外部)",
"{sharee} (email)" : "{sharee} (邮件)",
"Share" : "分享",
- "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用云ID格式与其他服务器的用户分享,如 用户名@example.com/nextcloud",
+ "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用联合云ID与其他服务器的用户分享, 如 用户名@example.com/nextcloud",
"Share with users or by mail..." : "通过邮件分享...",
- "Share with users or remote users..." : "和用户或者远程用户分享...",
- "Share with users, remote users or by mail..." : "和用户或者远程用户通过邮件分享...",
- "Share with users or groups..." : "和用户或者组分享...",
- "Share with users, groups or by mail..." : "和用户或者组通过邮件分享...",
- "Share with users, groups or remote users..." : "和用户、组群或者远程用户分享...",
- "Share with users, groups, remote users or by mail..." : "和用户、组群或者远程用户通过邮件分享...",
- "Share with users..." : "和用户分享...",
+ "Share with users or remote users..." : "分享给其他用户或外部用户...",
+ "Share with users, remote users or by mail..." : "通过邮件分享给其他用户或外部用户...",
+ "Share with users or groups..." : "分享给其他用户或分组...",
+ "Share with users, groups or by mail..." : "通过邮件分享给其他用户或分组...",
+ "Share with users, groups or remote users..." : "分享给其他用户, 分组或外部用户...",
+ "Share with users, groups, remote users or by mail..." : "通过邮件分享给其他用户, 分组或外部用户...",
+ "Share with users..." : "分享给其他用户...",
"Error removing share" : "移除分享时出错",
"Non-existing tag #{tag}" : "标签 #{tag} 不存在",
"restricted" : "受限",
@@ -164,29 +165,29 @@ OC.L10N.register(
"Rename" : "重命名",
"Collaborative tags" : "协作标签",
"No tags found" : "标签未找到",
- "The object type is not specified." : "未指定对象类型。",
+ "The object type is not specified." : "未指定对象类型.",
"Enter new" : "输入新...",
"Add" : "增加",
"Edit tags" : "编辑标签",
"Error loading dialog template: {error}" : "加载对话框模板出错: {error}",
- "No tags selected for deletion." : "请选择要删除的标签。",
+ "No tags selected for deletion." : "没有选择删除的标签",
"unknown text" : "未知文字",
"Hello world!" : "Hello world!",
"sunny" : "晴",
- "Hello {name}, the weather is {weather}" : "您好 {name},今天天气是{weather}",
+ "Hello {name}, the weather is {weather}" : "您好 {name}, 今天天气是 {weather}",
"Hello {name}" : "你好 {name}",
"new" : "新建",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
- "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新升级,离开当前页面可能导致某些环境中断。",
+ "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新, 在某些环境下离开当前页面可能会中断.",
"Update to {version}" : "升级到 {version}",
- "An error occurred." : "发生了一个错误",
- "Please reload the page." : "请重新加载页面。",
- "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功。有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
- "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功。请此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
+ "An error occurred." : "发生错误",
+ "Please reload the page." : "请重新加载页面",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功. 有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
+ "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功. 请将此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
"Continue to Nextcloud" : "继续访问 Nextcloud",
- "The update was successful. Redirecting you to Nextcloud now." : "升级成功。将重新打开Nextcloud。",
- "Searching other places" : "搜索其他地方",
- "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}'的结果",
+ "The update was successful. Redirecting you to Nextcloud now." : "升级成功. 正在重新访问 Nextcloud.",
+ "Searching other places" : "搜索其他位置",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}' 的结果",
"_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"],
"Personal" : "个人",
"Users" : "用户",
@@ -195,96 +196,96 @@ OC.L10N.register(
"Help" : "帮助",
"Access forbidden" : "访问禁止",
"File not found" : "文件未找到",
- "The specified document has not been found on the server." : "在服务器上没找到指定的文件。",
- "You can click here to return to %s." : "你可以点击这里返回 %s。",
+ "The specified document has not been found on the server." : "在服务器上没找到指定的文件.",
+ "You can click here to return to %s." : "你可以点击这里返回 %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "嗨、你好,\n\n只想让你知道 %s 分享了 %s 给你。\n现在查看: %s\n",
- "The share will expire on %s." : "此分享将在 %s 过期。",
+ "The share will expire on %s." : "此分享将在 %s 过期.",
"Cheers!" : "干杯!",
"Internal Server Error" : "内部服务器错误",
- "The server encountered an internal error and was unable to complete your request." : "服务器发送一个内部错误并且无法完成你的请求。",
- "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "请联系服务器管理员,如果多次出现这个错误,请把下面的技术细节包含在您的报告里。",
- "More details can be found in the server log." : "更多细节能在服务器日志中找到。",
+ "The server encountered an internal error and was unable to complete your request." : "服务器发生一个内部错误并且无法完成你的请求.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "如果多次出现这个错误, 请联系服务器管理员, 请把下面的技术细节包含在您的报告中.",
+ "More details can be found in the server log." : "更多细节可以在服务器日志中找到.",
"Technical details" : "技术细节",
- "Remote Address: %s" : "远程地址: %s",
+ "Remote Address: %s" : "远程地址: %s",
"Request ID: %s" : "请求 ID: %s",
- "Type: %s" : "类型:%s",
+ "Type: %s" : "类型: %s",
"Code: %s" : "代码: %s",
"Message: %s" : "消息: %s",
"File: %s" : "文件: %s",
"Line: %s" : "行: %s",
"Trace" : "追踪",
"Security warning" : "安全警告",
- "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "您的数据目录和文件可能可以直接被互联网访问,因为 .htaccess 并未正常工作。",
- "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "关于如何正确配置服务器,请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">此文档</a>.。",
- "Create an <strong>admin account</strong>" : "创建<strong>管理员账号</strong>",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "因为 .htaccess 文件没有工作, 您的数据目录和文件可从互联网被访问. ",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "了解如何正确配置服务器, 请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">文档</a>.",
+ "Create an <strong>admin account</strong>" : "创建 <strong>管理员账号</strong>",
"Username" : "用户名",
"Storage & database" : "存储 & 数据库",
"Data folder" : "数据目录",
"Configure the database" : "配置数据库",
"Only %s is available." : "仅 %s 可用。",
- "Install and activate additional PHP modules to choose other database types." : "安装或激活额外的 PHP 模块以选择其他数据库类型。",
- "For more details check out the documentation." : "请查阅文档获得详细信息。",
+ "Install and activate additional PHP modules to choose other database types." : "安装并激活额外的 PHP 模块以选择其他数据库类型.",
+ "For more details check out the documentation." : "请查阅文档获得详细信息.",
"Database user" : "数据库用户",
"Database password" : "数据库密码",
"Database name" : "数据库名",
"Database tablespace" : "数据库表空间",
"Database host" : "数据库主机",
- "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号(示例, localhost:5432)。",
+ "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号 (示例, localhost:5432).",
"Performance warning" : "性能警告",
- "SQLite will be used as database." : "SQLite 将被作为数据库使用。",
- "For larger installations we recommend to choose a different database backend." : "对于更大的安装,我们建议选择一个不同的数据库后端。",
- "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。",
+ "SQLite will be used as database." : "SQLite 将被作为数据库使用.",
+ "For larger installations we recommend to choose a different database backend." : "在更大的环境下, 我们建议选择一个不同的数据库后端.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时, 不鼓励使用 SQLite.",
"Finish setup" : "安装完成",
- "Finishing …" : "正在结束 ...",
- "Need help?" : "需要帮助?",
+ "Finishing …" : "正在完成...",
+ "Need help?" : "需要帮助?",
"See the documentation" : "查看文档",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作,该应用要求 JavaScript 。请 {linkstart} 打开 JavaScript {linkend} ,然后重新载入页面。",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作, 该应用需要使用 JavaScript. 请 {linkstart}启用 JavaScript{linkend}, 并重新加载页面.",
"Log out" : "注销",
"Search" : "搜索",
- "This action requires you to confirm your password:" : "需要您确认您的密码:",
+ "This action requires you to confirm your password:" : "此操作需要确认您的密码:",
"Confirm your password" : "确认您的密码",
- "Server side authentication failed!" : "服务端验证失败!",
- "Please contact your administrator." : "请联系你的管理员。",
- "An internal error occurred." : "发生了内部错误。",
- "Please try again or contact your administrator." : "请重试或联系管理员。",
+ "Server side authentication failed!" : "服务端认证失败!",
+ "Please contact your administrator." : "请联系您的管理员.",
+ "An internal error occurred." : "发生了内部错误.",
+ "Please try again or contact your administrator." : "请重试或联系您的管理员.",
"Username or email" : "用户名或邮箱",
- "Wrong password. Reset it?" : "密码错误。要重置么?",
+ "Wrong password. Reset it?" : "密码错误. 是否要重置?",
"Wrong password." : "密码错误",
"Log in" : "登录",
"Stay logged in" : "保持登录",
"Alternative Logins" : "其他登录方式",
- "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}",
+ "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码: {link}",
"New password" : "新密码",
"New Password" : "新密码",
"Reset password" : "重置密码",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "嗨、你好,<br><br>只想让你知道 %s 分享了 <strong>%s</strong> 给你。<br><a href=\"%s\">现在查看!</a><br><br>",
- "This Nextcloud instance is currently in single user mode." : "当前Nextcloud实例运行在单用户模式下。",
- "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。",
- "Thank you for your patience." : "感谢让你久等了。",
- "Two-factor authentication" : "双项认证",
- "Enhanced security is enabled for your account. Please authenticate using a second factor." : "已为您的帐户启用增强的安全性。 请使用附加项目进行验证。",
- "Cancel log in" : "取消登陆",
- "Use backup code" : "使用备份口令",
+ "This Nextcloud instance is currently in single user mode." : "当前 Nextcloud 实例运行在单用户模式下.",
+ "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现, 请联系你的系统管理员.",
+ "Thank you for your patience." : "感谢您久等了.",
+ "Two-factor authentication" : "双重认证",
+ "Enhanced security is enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
+ "Cancel log in" : "取消登录",
+ "Use backup code" : "使用备用口令",
"Error while validating your second factor" : "验证您的第二项时出错",
- "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器。",
- "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系你的系统管理员。如果你是系统管理员,配置 config/config.php 文件中参数 \"trusted_domain\" 设置。可以在 config/config.sample.php 文件中找到例子。",
- "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于你的配置,作为系统管理员,你可能还能点击下面的按钮来信任这个域。",
- "Add \"%s\" as trusted domain" : "添加 \"%s\"为信任域",
+ "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系您的系统管理员. 如果您是系统管理员, 在 config/config.php 文件中设置 \"trusted_domain\". 可以在 config/config.sample.php 文件中找到例子.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于您的配置, 作为系统管理员, 您还可以点击下面的按钮来信任该域名. ",
+ "Add \"%s\" as trusted domain" : "添加 \"%s\" 为信任域名",
"App update required" : "必须的应用更新",
"%s will be updated to version %s" : "%s 将会更新至版本 %s",
- "These apps will be updated:" : "以下应用将被更新:",
- "These incompatible apps will be disabled:" : "这些不兼容的应用程序将被禁用:",
- "The theme %s has been disabled." : "%s 主题已被禁用。",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
+ "These apps will be updated:" : "以下应用将被更新:",
+ "These incompatible apps will be disabled:" : "下述不兼容的应用将被禁用:",
+ "The theme %s has been disabled." : "%s 主题已被禁用.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前, 请确认数据库、配置文件夹和数据文件夹已经备份.",
"Start update" : "开始更新",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为进行避免较大的安装时超时,你可以在你的安装目录下运行下面的命令:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为避免较大安装时的超时, 您可以在安装目录下执行下述的命令:",
"Detailed logs" : "详细日志",
"Update needed" : "需要更新",
- "Please use the command line updater because you have a big instance." : "请使用命令行更新。",
- "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助,请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
- "This %s instance is currently in maintenance mode, which may take a while." : "该 %s 实例当前处于维护模式,这将进行一些时间。",
- "This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时这个页面将刷新。",
+ "Please use the command line updater because you have a big instance." : "由于您的实例较大, 请使用命令行更新.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助, 请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
+ "This %s instance is currently in maintenance mode, which may take a while." : "该实例 %s 当前处于维护模式, 这将花费一些时间.",
+ "This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时此页面将刷新.",
"Error loading tags" : "加载标签出错",
"Tag already exists" : "标签已存在",
"Error deleting tag(s)" : "删除标签时出错",
@@ -338,9 +339,9 @@ OC.L10N.register(
"Oct." : "十月",
"Nov." : "十一月",
"Dec." : "十二月",
- "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已被加密。如果您没有启用恢复密钥,密码重置后您将无法取回您的文件。<br />在继续之前,如果有疑问请联系您的管理员。<br />确认继续?",
- "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有有效的英特网连接。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>。",
+ "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已经加密. 如果您没有启用恢复密钥, 当您的密码重置后没有任何方式能恢复您的数据. <br />如果您不确定, 请在继续前联系您的管理员.<br/>您是否真的要继续?",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有可用的互联网连接. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 ownCloud. 如果您不是通过可信代理访问 ownCloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 ownCloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
"Allow editing" : "允许编辑",
"Hide file listing" : "隐藏列出的文件",
"Sending ..." : "正在发送...",
@@ -352,20 +353,20 @@ OC.L10N.register(
"change" : "更改",
"delete" : "删除",
"{sharee} (at {server})" : "{sharee} (位于 {server})",
- "Share with users…" : "与用户分享...",
- "Share with users, groups or remote users…" : "与用户,组或远程用户分享...",
- "Share with users or groups…" : "与用户或组分享...",
- "Share with users or remote users…" : "与用户或远程用户分享...",
+ "Share with users…" : "分享给其他用户...",
+ "Share with users, groups or remote users…" : "分享给其他用户, 分组或外部用户...",
+ "Share with users or groups…" : "分享给其他用户或分组...",
+ "Share with users or remote users…" : "分享给其他用户或外部用户...",
"Warning" : "警告",
"Error while sending notification" : "发送通知时出现错误",
- "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在更新,如果离开当前页面可能会中断当前环境。",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在升级, 在某些环境下离开当前页面可能会中断.",
"Updating to {version}" : "升级到 {version}",
- "The update was successful. There were warnings." : "更新成功。更新过程中出现一些警告。",
- "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果",
+ "The update was successful. There were warnings." : "更新成功. 更新过程中出现一些警告.",
+ "No search results in other folders" : "在其他文件夹内未找到任何结果",
"Two-step verification" : "两步验证",
- "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。",
+ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
"Cancel login" : "取消登录",
- "Please authenticate using the selected factor." : "请使用所选择的因素验证。",
- "An error occured while verifying the token" : "在验证令牌时出错"
+ "Please authenticate using the selected factor." : "请使用所选择的方式验证.",
+ "An error occured while verifying the token" : "验证令牌时出错"
},
"nplurals=1; plural=0;");
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index dd85fbe122e..c6efd72710f 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -1,39 +1,39 @@
{ "translations": {
"Please select a file." : "请选择一个文件",
"File is too big" : "文件太大",
- "The selected file is not an image." : "所选文件不是一张图片",
- "The selected file cannot be read." : "无法读取所选文件",
+ "The selected file is not an image." : "所选文件不是一张图片.",
+ "The selected file cannot be read." : "无法读取所选文件.",
"Invalid file provided" : "提供了无效文件",
"No image or file provided" : "没有提供图片或文件",
"Unknown filetype" : "未知的文件类型",
"Invalid image" : "无效的图像",
- "An error occurred. Please contact your admin." : "发生了一个错误,请联系管理员。",
- "No temporary profile picture available, try again" : "没有临时概览页图片可用,请重试",
- "No crop data provided" : "没有提供相应数据",
+ "An error occurred. Please contact your admin." : "发生了一个错误, 请联系管理员.",
+ "No temporary profile picture available, try again" : "没有临时个人页图片可用, 请重试",
+ "No crop data provided" : "没有提供剪裁数据",
"No valid crop data provided" : "没有提供有效的裁剪数据",
"Crop is not square" : "裁剪的不是正方形",
- "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码",
- "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期",
- "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "此用户名的电子邮件地址不存在导致无法发送重置邮件,请联系管理员。",
+ "Couldn't reset password because the token is invalid" : "令牌无效, 无法重置密码",
+ "Couldn't reset password because the token is expired" : "令牌已过期, 无法重置密码",
+ "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件, 请检查您的用户名是否正确.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "该用户没有设置电子邮件地址, 无发送重置邮件. 请联系管理员.",
"%s password reset" : "重置 %s 的密码",
- "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。",
+ "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件, 请联系管理员.",
"Preparing update" : "正在准备更新",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "修复警告:",
- "Repair error: " : "修复错误:",
- "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用,请使用命令行更新。",
+ "Repair warning: " : "修复警告:",
+ "Repair error: " : "修复错误:",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用, 请使用命令行更新.",
"[%d / %d]: Checking table %s" : "[%d / %d]: 检查数据表 %s",
"Turned on maintenance mode" : "启用维护模式",
"Turned off maintenance mode" : "关闭维护模式",
- "Maintenance mode is kept active" : "维护模式已被启用",
- "Updating database schema" : "正在更新数据库架构",
+ "Maintenance mode is kept active" : "维护模式已启用",
+ "Updating database schema" : "正在更新数据库结构",
"Updated database" : "数据库已更新",
- "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update" : "已经检查数据库架构更新",
+ "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update" : "已经检查数据库结构更新",
"Checking updates of apps" : "检查更新应用",
- "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update for apps" : "已经检查应用的数据库架构更新",
+ "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update for apps" : "已经检查应用的数据库结构更新",
"Updated \"%s\" to %s" : "更新 \"%s\" 为 %s",
"Set log level to debug" : "设置日志级别为 调试",
"Reset log level" : "重设日志级别",
@@ -41,12 +41,12 @@
"Finished code integrity check" : "代码完整性检查完成",
"%s (3rdparty)" : "%s (第三方)",
"%s (incompatible)" : "%s (不兼容)",
- "Following apps have been disabled: %s" : "下列应用已经被禁用:%s",
+ "Following apps have been disabled: %s" : "下列应用已经被禁用: %s",
"Already up to date" : "已经是最新",
- "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常,点击查看详细信息...</a>",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常, 点击查看详细信息...</a>",
"Settings" : "设置",
"Connection to server lost" : "与服务器的连接断开",
- "Problem loading page, reloading in 5 seconds" : "加载页面出现问题,在 5 秒内重新载入",
+ "Problem loading page, reloading in 5 seconds" : "加载页面出现问题, 在 5 秒内重新加载",
"Saving..." : "保存中...",
"Dismiss" : "忽略",
"This action requires you to confirm your password" : "请您确认您的密码",
@@ -54,83 +54,84 @@
"Password" : "密码",
"Cancel" : "取消",
"Confirm" : "确认",
- "Failed to authenticate, try again" : "授权失败,请重试",
+ "Failed to authenticate, try again" : "授权失败, 请重试",
"seconds ago" : "几秒前",
- "Logging in …" : "正在登陆...",
- "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<br>如果未能收到邮件请联系管理员。",
+ "Logging in …" : "正在登录...",
+ "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中. 如果您长时间没能收到邮件, 请检查您邮箱的垃圾/广告文件夹 <br>如果未能收到邮件请联系管理员.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已经加密. 当您的密码重置后没有任何方式能恢复您的数据. <br />如果您不确定, 请在继续前联系您的管理员.<br/>您是否真的要继续?",
"I know what I'm doing" : "我知道我在做什么",
- "Password can not be changed. Please contact your administrator." : "无法修改密码,请联系管理员。",
+ "Password can not be changed. Please contact your administrator." : "无法修改密码, 请联系管理员.",
"No" : "否",
"Yes" : "是",
"No files in here" : "未找到文件",
"Choose" : "选择",
- "Error loading file picker template: {error}" : "加载文件分拣模板出错: {error}",
+ "Error loading file picker template: {error}" : "加载文件选择模板出错: {error}",
"Ok" : "确定",
"Error loading message template: {error}" : "加载消息模板出错: {error}",
"read-only" : "只读",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} 个文件冲突"],
- "One file conflict" : "1个文件冲突",
+ "One file conflict" : "1 个文件冲突",
"New Files" : "新文件",
"Already existing files" : "已经存在的文件",
- "Which files do you want to keep?" : "想要保留哪一个文件呢?",
- "If you select both versions, the copied file will have a number added to its name." : "如果同时选择了两个版本,复制的文件名将会增加上一个数字。",
+ "Which files do you want to keep?" : "请选择需要保留的文件?",
+ "If you select both versions, the copied file will have a number added to its name." : "如果同时选择了两个版本, 副本的文件名中将会追加数字.",
"Continue" : "继续",
"(all selected)" : "(选中全部)",
- "({count} selected)" : "(选择了{count}个)",
+ "({count} selected)" : "(选择了 {count} 个)",
"Error loading file exists template" : "加载文件存在性模板失败",
- "Pending" : "挂起",
+ "Pending" : "等待",
"Very weak password" : "非常弱的密码",
"Weak password" : "弱密码",
"So-so password" : "一般强度的密码",
"Good password" : "较强的密码",
"Strong password" : "强密码",
- "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
- "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的web服务器未正确设置以解析 \"{url}\"。您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息。",
- "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有有效的英特网连接:无法访问多个节点。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a> 。",
- "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom 无法被 PHP 读取,出于安全原因,这是强烈不推荐的。请查看<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>了解详情。",
- "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "你的 PHP 版本 ({version}) 不再被 <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> PHP </a>支持。我们建议您升级您的PHP版本,以便获得 PHP 性能和安全提升。",
- "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "方向代理配置不正确,或者您正在通过可信的代理访问 Nextcloud 。如果您不是通过可信代理访问 Nextcloud ,这将会是一个安全问题,将允许攻击者通过伪装IP地址访问 Nextcloud。要获得更进一步的信息,请访问 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
- "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 配置为分布式缓存,但是已经安装的 PHP 模块是 \"memcache\" 。 \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\"。点击 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\"> memcached wiki 了解两个模块的不同</a>.",
- "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查。如何解决此问题的详细信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
- "Error occurred while checking server setup" : "当检查服务器启动时出错",
- "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
- "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 头部没有配置和 \"{expected}\" 的一样。这是一个潜在的安全或者隐私风险,我们调整这项设置。",
- "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 严格传输安全(Strict-Transport-Security)报头未配置到至少“{seconds}”秒。处于增强安全性考虑,我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>启用 HSTS。",
- "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点,我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>配置服务器强制使用 HTTPS。",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏, 因此你的 Web 服务器没有正确地设置允许文件同步。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的 Web 服务器未正确设置以解析 \"{url}\". 您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有可用的互联网连接: 多个节点无法访问. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置. 如果可用, 请配置 memcache 以增强性能. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP 无法访问 /dev/urandom, 由于安全原因, 这是强烈不推荐的. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "您当前的 PHP 版本 {version}. 我们建议您尽快升级您的 PHP 版本, 以便获得<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">来自 PHP 官方的性能和安全</a>的提升.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 Nextcloud. 如果您不是通过可信代理访问 Nextcloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 Nextcloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 当前配置为分布式缓存, 但是当前安装的 PHP 模块是 \"memcache\". \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\". 点击<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki</a>了解两者的不同.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查. 了解如何解决该问题请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效的文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
+ "Error occurred while checking server setup" : "检查服务器设置时出错",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "您的数据目录和文件可从互联网被访问. .htaccess 文件没有工作. 我们强烈建议您在 Web 服务器上配置不可以访问数据目录, 或者将数据目录移动到 Web 服务器根目录之外.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP 请求头 \"{header}\" 没有配置为 \"{expected}\". 这是一个潜在的安全或隐私风险, 我们建议您调整这项设置.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 请求头 \"Strict-Transport-Security\" 没有配置为至少 “{seconds}” 秒. 出于增强安全性考虑, 我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>中的说明启用 HSTS.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点, 我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>中的说明配置服务器强制使用 HTTPS.",
"Shared" : "已共享",
- "Shared with {recipients}" : "由{recipients}分享",
+ "Shared with {recipients}" : "由 {recipients} 分享",
"Error" : "错误",
"Error while sharing" : "共享时出错",
"Error while unsharing" : "取消共享时出错",
"Error setting expiration date" : "设置过期日期时出错",
- "The public link will expire no later than {days} days after it is created" : "这个共享链接将在创建后 {days} 天失效",
+ "The public link will expire no later than {days} days after it is created" : "该共享链接将在创建后 {days} 天失效",
"Set expiration date" : "设置过期日期",
"Expiration" : "过期",
"Expiration date" : "过期日期",
"Choose a password for the public link" : "为共享链接设置密码",
- "Copied!" : "已经复制!",
+ "Copied!" : "已经复制!",
"Copy" : "复制",
- "Not supported!" : "不被支持!",
- "Press ⌘-C to copy." : "按 ⌘ + C 进行复制。",
- "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制。",
+ "Not supported!" : "无法支持!",
+ "Press ⌘-C to copy." : "按 ⌘ + C 进行复制.",
+ "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制.",
"Resharing is not allowed" : "不允许二次共享",
"Share link" : "分享链接",
"Link" : "链接",
"Password protect" : "密码保护",
"Allow upload and editing" : "允许上传和编辑",
- "File drop (upload only)" : "文件访问(只允许上传)",
+ "File drop (upload only)" : "文件拖拽 (仅上传)",
"Email link to person" : "发送链接到个人",
"Send" : "发送",
- "Shared with you and the group {group} by {owner}" : "{owner} 共享给您及 {group} 组",
- "Shared with you by {owner}" : "{owner} 与您共享",
+ "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组",
+ "Shared with you by {owner}" : "{owner} 分享给您",
"{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 通过链接分享",
"group" : "群组",
- "remote" : "远程",
+ "remote" : "外部",
"email" : "邮件",
"Unshare" : "取消共享",
"can reshare" : "允许重新分享",
- "can edit" : "可以修改",
+ "can edit" : "允许修改",
"can create" : "允许创建",
"can change" : "允许改变",
"can delete" : "允许删除",
@@ -139,20 +140,20 @@
"Share details could not be loaded for this item." : "无法加载这个项目的分享详情",
"No users or groups found for {search}" : "{search} 条件下没有找到用户或用户组",
"No users found for {search}" : "没有找到 {search} 用户",
- "An error occurred. Please try again" : "发生错误。请重试。",
- "{sharee} (group)" : "{sharee} (组)",
- "{sharee} (remote)" : "{sharee} (远程)",
+ "An error occurred. Please try again" : "发生错误. 请重试.",
+ "{sharee} (group)" : "{sharee} (分组)",
+ "{sharee} (remote)" : "{sharee} (外部)",
"{sharee} (email)" : "{sharee} (邮件)",
"Share" : "分享",
- "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用云ID格式与其他服务器的用户分享,如 用户名@example.com/nextcloud",
+ "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用联合云ID与其他服务器的用户分享, 如 用户名@example.com/nextcloud",
"Share with users or by mail..." : "通过邮件分享...",
- "Share with users or remote users..." : "和用户或者远程用户分享...",
- "Share with users, remote users or by mail..." : "和用户或者远程用户通过邮件分享...",
- "Share with users or groups..." : "和用户或者组分享...",
- "Share with users, groups or by mail..." : "和用户或者组通过邮件分享...",
- "Share with users, groups or remote users..." : "和用户、组群或者远程用户分享...",
- "Share with users, groups, remote users or by mail..." : "和用户、组群或者远程用户通过邮件分享...",
- "Share with users..." : "和用户分享...",
+ "Share with users or remote users..." : "分享给其他用户或外部用户...",
+ "Share with users, remote users or by mail..." : "通过邮件分享给其他用户或外部用户...",
+ "Share with users or groups..." : "分享给其他用户或分组...",
+ "Share with users, groups or by mail..." : "通过邮件分享给其他用户或分组...",
+ "Share with users, groups or remote users..." : "分享给其他用户, 分组或外部用户...",
+ "Share with users, groups, remote users or by mail..." : "通过邮件分享给其他用户, 分组或外部用户...",
+ "Share with users..." : "分享给其他用户...",
"Error removing share" : "移除分享时出错",
"Non-existing tag #{tag}" : "标签 #{tag} 不存在",
"restricted" : "受限",
@@ -162,29 +163,29 @@
"Rename" : "重命名",
"Collaborative tags" : "协作标签",
"No tags found" : "标签未找到",
- "The object type is not specified." : "未指定对象类型。",
+ "The object type is not specified." : "未指定对象类型.",
"Enter new" : "输入新...",
"Add" : "增加",
"Edit tags" : "编辑标签",
"Error loading dialog template: {error}" : "加载对话框模板出错: {error}",
- "No tags selected for deletion." : "请选择要删除的标签。",
+ "No tags selected for deletion." : "没有选择删除的标签",
"unknown text" : "未知文字",
"Hello world!" : "Hello world!",
"sunny" : "晴",
- "Hello {name}, the weather is {weather}" : "您好 {name},今天天气是{weather}",
+ "Hello {name}, the weather is {weather}" : "您好 {name}, 今天天气是 {weather}",
"Hello {name}" : "你好 {name}",
"new" : "新建",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
- "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新升级,离开当前页面可能导致某些环境中断。",
+ "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新, 在某些环境下离开当前页面可能会中断.",
"Update to {version}" : "升级到 {version}",
- "An error occurred." : "发生了一个错误",
- "Please reload the page." : "请重新加载页面。",
- "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功。有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
- "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功。请此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
+ "An error occurred." : "发生错误",
+ "Please reload the page." : "请重新加载页面",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功. 有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
+ "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功. 请将此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
"Continue to Nextcloud" : "继续访问 Nextcloud",
- "The update was successful. Redirecting you to Nextcloud now." : "升级成功。将重新打开Nextcloud。",
- "Searching other places" : "搜索其他地方",
- "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}'的结果",
+ "The update was successful. Redirecting you to Nextcloud now." : "升级成功. 正在重新访问 Nextcloud.",
+ "Searching other places" : "搜索其他位置",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}' 的结果",
"_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"],
"Personal" : "个人",
"Users" : "用户",
@@ -193,96 +194,96 @@
"Help" : "帮助",
"Access forbidden" : "访问禁止",
"File not found" : "文件未找到",
- "The specified document has not been found on the server." : "在服务器上没找到指定的文件。",
- "You can click here to return to %s." : "你可以点击这里返回 %s。",
+ "The specified document has not been found on the server." : "在服务器上没找到指定的文件.",
+ "You can click here to return to %s." : "你可以点击这里返回 %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "嗨、你好,\n\n只想让你知道 %s 分享了 %s 给你。\n现在查看: %s\n",
- "The share will expire on %s." : "此分享将在 %s 过期。",
+ "The share will expire on %s." : "此分享将在 %s 过期.",
"Cheers!" : "干杯!",
"Internal Server Error" : "内部服务器错误",
- "The server encountered an internal error and was unable to complete your request." : "服务器发送一个内部错误并且无法完成你的请求。",
- "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "请联系服务器管理员,如果多次出现这个错误,请把下面的技术细节包含在您的报告里。",
- "More details can be found in the server log." : "更多细节能在服务器日志中找到。",
+ "The server encountered an internal error and was unable to complete your request." : "服务器发生一个内部错误并且无法完成你的请求.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "如果多次出现这个错误, 请联系服务器管理员, 请把下面的技术细节包含在您的报告中.",
+ "More details can be found in the server log." : "更多细节可以在服务器日志中找到.",
"Technical details" : "技术细节",
- "Remote Address: %s" : "远程地址: %s",
+ "Remote Address: %s" : "远程地址: %s",
"Request ID: %s" : "请求 ID: %s",
- "Type: %s" : "类型:%s",
+ "Type: %s" : "类型: %s",
"Code: %s" : "代码: %s",
"Message: %s" : "消息: %s",
"File: %s" : "文件: %s",
"Line: %s" : "行: %s",
"Trace" : "追踪",
"Security warning" : "安全警告",
- "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "您的数据目录和文件可能可以直接被互联网访问,因为 .htaccess 并未正常工作。",
- "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "关于如何正确配置服务器,请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">此文档</a>.。",
- "Create an <strong>admin account</strong>" : "创建<strong>管理员账号</strong>",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "因为 .htaccess 文件没有工作, 您的数据目录和文件可从互联网被访问. ",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "了解如何正确配置服务器, 请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">文档</a>.",
+ "Create an <strong>admin account</strong>" : "创建 <strong>管理员账号</strong>",
"Username" : "用户名",
"Storage & database" : "存储 & 数据库",
"Data folder" : "数据目录",
"Configure the database" : "配置数据库",
"Only %s is available." : "仅 %s 可用。",
- "Install and activate additional PHP modules to choose other database types." : "安装或激活额外的 PHP 模块以选择其他数据库类型。",
- "For more details check out the documentation." : "请查阅文档获得详细信息。",
+ "Install and activate additional PHP modules to choose other database types." : "安装并激活额外的 PHP 模块以选择其他数据库类型.",
+ "For more details check out the documentation." : "请查阅文档获得详细信息.",
"Database user" : "数据库用户",
"Database password" : "数据库密码",
"Database name" : "数据库名",
"Database tablespace" : "数据库表空间",
"Database host" : "数据库主机",
- "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号(示例, localhost:5432)。",
+ "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号 (示例, localhost:5432).",
"Performance warning" : "性能警告",
- "SQLite will be used as database." : "SQLite 将被作为数据库使用。",
- "For larger installations we recommend to choose a different database backend." : "对于更大的安装,我们建议选择一个不同的数据库后端。",
- "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。",
+ "SQLite will be used as database." : "SQLite 将被作为数据库使用.",
+ "For larger installations we recommend to choose a different database backend." : "在更大的环境下, 我们建议选择一个不同的数据库后端.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时, 不鼓励使用 SQLite.",
"Finish setup" : "安装完成",
- "Finishing …" : "正在结束 ...",
- "Need help?" : "需要帮助?",
+ "Finishing …" : "正在完成...",
+ "Need help?" : "需要帮助?",
"See the documentation" : "查看文档",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作,该应用要求 JavaScript 。请 {linkstart} 打开 JavaScript {linkend} ,然后重新载入页面。",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作, 该应用需要使用 JavaScript. 请 {linkstart}启用 JavaScript{linkend}, 并重新加载页面.",
"Log out" : "注销",
"Search" : "搜索",
- "This action requires you to confirm your password:" : "需要您确认您的密码:",
+ "This action requires you to confirm your password:" : "此操作需要确认您的密码:",
"Confirm your password" : "确认您的密码",
- "Server side authentication failed!" : "服务端验证失败!",
- "Please contact your administrator." : "请联系你的管理员。",
- "An internal error occurred." : "发生了内部错误。",
- "Please try again or contact your administrator." : "请重试或联系管理员。",
+ "Server side authentication failed!" : "服务端认证失败!",
+ "Please contact your administrator." : "请联系您的管理员.",
+ "An internal error occurred." : "发生了内部错误.",
+ "Please try again or contact your administrator." : "请重试或联系您的管理员.",
"Username or email" : "用户名或邮箱",
- "Wrong password. Reset it?" : "密码错误。要重置么?",
+ "Wrong password. Reset it?" : "密码错误. 是否要重置?",
"Wrong password." : "密码错误",
"Log in" : "登录",
"Stay logged in" : "保持登录",
"Alternative Logins" : "其他登录方式",
- "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}",
+ "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码: {link}",
"New password" : "新密码",
"New Password" : "新密码",
"Reset password" : "重置密码",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "嗨、你好,<br><br>只想让你知道 %s 分享了 <strong>%s</strong> 给你。<br><a href=\"%s\">现在查看!</a><br><br>",
- "This Nextcloud instance is currently in single user mode." : "当前Nextcloud实例运行在单用户模式下。",
- "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。",
- "Thank you for your patience." : "感谢让你久等了。",
- "Two-factor authentication" : "双项认证",
- "Enhanced security is enabled for your account. Please authenticate using a second factor." : "已为您的帐户启用增强的安全性。 请使用附加项目进行验证。",
- "Cancel log in" : "取消登陆",
- "Use backup code" : "使用备份口令",
+ "This Nextcloud instance is currently in single user mode." : "当前 Nextcloud 实例运行在单用户模式下.",
+ "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现, 请联系你的系统管理员.",
+ "Thank you for your patience." : "感谢您久等了.",
+ "Two-factor authentication" : "双重认证",
+ "Enhanced security is enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
+ "Cancel log in" : "取消登录",
+ "Use backup code" : "使用备用口令",
"Error while validating your second factor" : "验证您的第二项时出错",
- "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器。",
- "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系你的系统管理员。如果你是系统管理员,配置 config/config.php 文件中参数 \"trusted_domain\" 设置。可以在 config/config.sample.php 文件中找到例子。",
- "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于你的配置,作为系统管理员,你可能还能点击下面的按钮来信任这个域。",
- "Add \"%s\" as trusted domain" : "添加 \"%s\"为信任域",
+ "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系您的系统管理员. 如果您是系统管理员, 在 config/config.php 文件中设置 \"trusted_domain\". 可以在 config/config.sample.php 文件中找到例子.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于您的配置, 作为系统管理员, 您还可以点击下面的按钮来信任该域名. ",
+ "Add \"%s\" as trusted domain" : "添加 \"%s\" 为信任域名",
"App update required" : "必须的应用更新",
"%s will be updated to version %s" : "%s 将会更新至版本 %s",
- "These apps will be updated:" : "以下应用将被更新:",
- "These incompatible apps will be disabled:" : "这些不兼容的应用程序将被禁用:",
- "The theme %s has been disabled." : "%s 主题已被禁用。",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
+ "These apps will be updated:" : "以下应用将被更新:",
+ "These incompatible apps will be disabled:" : "下述不兼容的应用将被禁用:",
+ "The theme %s has been disabled." : "%s 主题已被禁用.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前, 请确认数据库、配置文件夹和数据文件夹已经备份.",
"Start update" : "开始更新",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为进行避免较大的安装时超时,你可以在你的安装目录下运行下面的命令:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为避免较大安装时的超时, 您可以在安装目录下执行下述的命令:",
"Detailed logs" : "详细日志",
"Update needed" : "需要更新",
- "Please use the command line updater because you have a big instance." : "请使用命令行更新。",
- "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助,请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
- "This %s instance is currently in maintenance mode, which may take a while." : "该 %s 实例当前处于维护模式,这将进行一些时间。",
- "This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时这个页面将刷新。",
+ "Please use the command line updater because you have a big instance." : "由于您的实例较大, 请使用命令行更新.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助, 请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
+ "This %s instance is currently in maintenance mode, which may take a while." : "该实例 %s 当前处于维护模式, 这将花费一些时间.",
+ "This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时此页面将刷新.",
"Error loading tags" : "加载标签出错",
"Tag already exists" : "标签已存在",
"Error deleting tag(s)" : "删除标签时出错",
@@ -336,9 +337,9 @@
"Oct." : "十月",
"Nov." : "十一月",
"Dec." : "十二月",
- "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已被加密。如果您没有启用恢复密钥,密码重置后您将无法取回您的文件。<br />在继续之前,如果有疑问请联系您的管理员。<br />确认继续?",
- "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有有效的英特网连接。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>。",
+ "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已经加密. 如果您没有启用恢复密钥, 当您的密码重置后没有任何方式能恢复您的数据. <br />如果您不确定, 请在继续前联系您的管理员.<br/>您是否真的要继续?",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器没有可用的互联网连接. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 ownCloud. 如果您不是通过可信代理访问 ownCloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 ownCloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
"Allow editing" : "允许编辑",
"Hide file listing" : "隐藏列出的文件",
"Sending ..." : "正在发送...",
@@ -350,20 +351,20 @@
"change" : "更改",
"delete" : "删除",
"{sharee} (at {server})" : "{sharee} (位于 {server})",
- "Share with users…" : "与用户分享...",
- "Share with users, groups or remote users…" : "与用户,组或远程用户分享...",
- "Share with users or groups…" : "与用户或组分享...",
- "Share with users or remote users…" : "与用户或远程用户分享...",
+ "Share with users…" : "分享给其他用户...",
+ "Share with users, groups or remote users…" : "分享给其他用户, 分组或外部用户...",
+ "Share with users or groups…" : "分享给其他用户或分组...",
+ "Share with users or remote users…" : "分享给其他用户或外部用户...",
"Warning" : "警告",
"Error while sending notification" : "发送通知时出现错误",
- "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在更新,如果离开当前页面可能会中断当前环境。",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在升级, 在某些环境下离开当前页面可能会中断.",
"Updating to {version}" : "升级到 {version}",
- "The update was successful. There were warnings." : "更新成功。更新过程中出现一些警告。",
- "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果",
+ "The update was successful. There were warnings." : "更新成功. 更新过程中出现一些警告.",
+ "No search results in other folders" : "在其他文件夹内未找到任何结果",
"Two-step verification" : "两步验证",
- "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。",
+ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
"Cancel login" : "取消登录",
- "Please authenticate using the selected factor." : "请使用所选择的因素验证。",
- "An error occured while verifying the token" : "在验证令牌时出错"
+ "Please authenticate using the selected factor." : "请使用所选择的方式验证.",
+ "An error occured while verifying the token" : "验证令牌时出错"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/core/vendor/.gitignore b/core/vendor/.gitignore
index fe078fdd291..19bd084f76e 100644
--- a/core/vendor/.gitignore
+++ b/core/vendor/.gitignore
@@ -1,12 +1,14 @@
test/
src/
bower.json
+component.json
.jshintrc
.travis.yml
CHANGELOG*
Gemfile
gruntfile.js
Gruntfile.js
+Gulpfile.js
Makefile
package.json
README*
@@ -156,3 +158,17 @@ autosize/**
!autosize/dist/autosize.js
!autosize/.bower.json
!autosize/LICENCE.md
+
+#marked
+marked/bin
+marked/doc
+marked/index.js
+marked/lib
+marked/man
+
+# DOMPurity
+DOMPurify/**
+!DOMPurify/dist
+!DOMPurify/dist/purify.min.js
+!DOMPurify/.bower.json
+!DOMPurify/LICENSE \ No newline at end of file
diff --git a/core/vendor/DOMPurify/.bower.json b/core/vendor/DOMPurify/.bower.json
new file mode 100644
index 00000000000..45f4fa47258
--- /dev/null
+++ b/core/vendor/DOMPurify/.bower.json
@@ -0,0 +1,42 @@
+{
+ "name": "DOMPurify",
+ "version": "0.8.4",
+ "homepage": "https://github.com/cure53/DOMPurify",
+ "author": "Cure53 <info@cure53.de>",
+ "description": "A DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG",
+ "main": "src/purify.js",
+ "keywords": [
+ "dom",
+ "xss",
+ "cross site scripting",
+ "html",
+ "svg",
+ "mathml",
+ "sanitizer",
+ "filter",
+ "sanitize",
+ "security",
+ "secure"
+ ],
+ "license": [
+ "MPL-2.0",
+ "Apache-2.0"
+ ],
+ "ignore": [
+ "**/.*",
+ "demos",
+ "scripts",
+ "test",
+ "website"
+ ],
+ "_release": "0.8.4",
+ "_resolution": {
+ "type": "version",
+ "tag": "0.8.4",
+ "commit": "9be8f9def3124ccf2db71b7711027b55f9b90f48"
+ },
+ "_source": "https://github.com/cure53/DOMPurify.git",
+ "_target": "^0.8.4",
+ "_originalSource": "DOMPurify",
+ "_direct": true
+} \ No newline at end of file
diff --git a/core/vendor/DOMPurify/LICENSE b/core/vendor/DOMPurify/LICENSE
new file mode 100644
index 00000000000..e099aad0f09
--- /dev/null
+++ b/core/vendor/DOMPurify/LICENSE
@@ -0,0 +1,378 @@
+DOMPurify
+Copyright 2015 Mario Heiderich
+
+DOMPurify is free software; you can redistribute it and/or modify it under the
+terms of either:
+
+a) the Apache License Version 2.0, or
+b) the Mozilla Public License Version 2.0
+
+-----------------------------------------------------------------------------
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-----------------------------------------------------------------------------
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. “Contributor”
+
+ means each individual or legal entity that creates, contributes to the
+ creation of, or owns Covered Software.
+
+1.2. “Contributor Version”
+
+ means the combination of the Contributions of others (if any) used by a
+ Contributor and that particular Contributor’s Contribution.
+
+1.3. “Contribution”
+
+ means Covered Software of a particular Contributor.
+
+1.4. “Covered Software”
+
+ means Source Code Form to which the initial Contributor has attached the
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
+ Modifications of such Source Code Form, in each case including portions
+ thereof.
+
+1.5. “Incompatible With Secondary Licenses”
+ means
+
+ a. that the initial Contributor has attached the notice described in
+ Exhibit B to the Covered Software; or
+
+ b. that the Covered Software was made available under the terms of version
+ 1.1 or earlier of the License, but not also under the terms of a
+ Secondary License.
+
+1.6. “Executable Form”
+
+ means any form of the work other than Source Code Form.
+
+1.7. “Larger Work”
+
+ means a work that combines Covered Software with other material, in a separate
+ file or files, that is not Covered Software.
+
+1.8. “License”
+
+ means this document.
+
+1.9. “Licensable”
+
+ means having the right to grant, to the maximum extent possible, whether at the
+ time of the initial grant or subsequently, any and all of the rights conveyed by
+ this License.
+
+1.10. “Modifications”
+
+ means any of the following:
+
+ a. any file in Source Code Form that results from an addition to, deletion
+ from, or modification of the contents of Covered Software; or
+
+ b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. “Patent Claims” of a Contributor
+
+ means any patent claim(s), including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by such Contributor that
+ would be infringed, but for the grant of the License, by the making,
+ using, selling, offering for sale, having made, import, or transfer of
+ either its Contributions or its Contributor Version.
+
+1.12. “Secondary License”
+
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
+ General Public License, Version 2.1, the GNU Affero General Public
+ License, Version 3.0, or any later versions of those licenses.
+
+1.13. “Source Code Form”
+
+ means the form of the work preferred for making modifications.
+
+1.14. “You” (or “Your”)
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, “You” includes any entity that controls, is
+ controlled by, or is under common control with You. For purposes of this
+ definition, “control” means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+ Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ a. under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or as
+ part of a Larger Work; and
+
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
+ sale, have made, import, and otherwise transfer either its Contributions
+ or its Contributor Version.
+
+2.2. Effective Date
+
+ The licenses granted in Section 2.1 with respect to any Contribution become
+ effective for each Contribution on the date the Contributor first distributes
+ such Contribution.
+
+2.3. Limitations on Grant Scope
+
+ The licenses granted in this Section 2 are the only rights granted under this
+ License. No additional rights or licenses will be implied from the distribution
+ or licensing of Covered Software under this License. Notwithstanding Section
+ 2.1(b) above, no patent license is granted by a Contributor:
+
+ a. for any code that a Contributor has removed from Covered Software; or
+
+ b. for infringements caused by: (i) Your and any other third party’s
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ c. under Patent Claims infringed by Covered Software in the absence of its
+ Contributions.
+
+ This License does not grant any rights in the trademarks, service marks, or
+ logos of any Contributor (except as may be necessary to comply with the
+ notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+ No Contributor makes additional grants as a result of Your choice to
+ distribute the Covered Software under a subsequent version of this License
+ (see Section 10.2) or under the terms of a Secondary License (if permitted
+ under the terms of Section 3.3).
+
+2.5. Representation
+
+ Each Contributor represents that the Contributor believes its Contributions
+ are its original creation(s) or it has sufficient rights to grant the
+ rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+ This License is not intended to limit any rights You have under applicable
+ copyright doctrines of fair use, fair dealing, or other equivalents.
+
+2.7. Conditions
+
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+ Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+ All distribution of Covered Software in Source Code Form, including any
+ Modifications that You create or to which You contribute, must be under the
+ terms of this License. You must inform recipients that the Source Code Form
+ of the Covered Software is governed by the terms of this License, and how
+ they can obtain a copy of this License. You may not attempt to alter or
+ restrict the recipients’ rights in the Source Code Form.
+
+3.2. Distribution of Executable Form
+
+ If You distribute Covered Software in Executable Form then:
+
+ a. such Covered Software must also be made available in Source Code Form,
+ as described in Section 3.1, and You must inform recipients of the
+ Executable Form how they can obtain a copy of such Source Code Form by
+ reasonable means in a timely manner, at a charge no more than the cost
+ of distribution to the recipient; and
+
+ b. You may distribute such Executable Form under the terms of this License,
+ or sublicense it under different terms, provided that the license for
+ the Executable Form does not attempt to limit or alter the recipients’
+ rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+ You may create and distribute a Larger Work under terms of Your choice,
+ provided that You also comply with the requirements of this License for the
+ Covered Software. If the Larger Work is a combination of Covered Software
+ with a work governed by one or more Secondary Licenses, and the Covered
+ Software is not Incompatible With Secondary Licenses, this License permits
+ You to additionally distribute such Covered Software under the terms of
+ such Secondary License(s), so that the recipient of the Larger Work may, at
+ their option, further distribute the Covered Software under the terms of
+ either this License or such Secondary License(s).
+
+3.4. Notices
+
+ You may not remove or alter the substance of any license notices (including
+ copyright notices, patent notices, disclaimers of warranty, or limitations
+ of liability) contained within the Source Code Form of the Covered
+ Software, except that You may alter any license notices to the extent
+ required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+ You may choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of Covered
+ Software. However, You may do so only on Your own behalf, and not on behalf
+ of any Contributor. You must make it absolutely clear that any such
+ warranty, support, indemnity, or liability obligation is offered by You
+ alone, and You hereby agree to indemnify every Contributor for any
+ liability incurred by such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer. You may include additional
+ disclaimers of warranty and limitations of liability specific to any
+ jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+ If it is impossible for You to comply with any of the terms of this License
+ with respect to some or all of the Covered Software due to statute, judicial
+ order, or regulation then You must: (a) comply with the terms of this License
+ to the maximum extent possible; and (b) describe the limitations and the code
+ they affect. Such description must be placed in a text file included with all
+ distributions of the Covered Software under this License. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+ fail to comply with any of its terms. However, if You become compliant,
+ then the rights granted under this License from a particular Contributor
+ are reinstated (a) provisionally, unless and until such Contributor
+ explicitly and finally terminates Your grants, and (b) on an ongoing basis,
+ if such Contributor fails to notify You of the non-compliance by some
+ reasonable means prior to 60 days after You have come back into compliance.
+ Moreover, Your grants from a particular Contributor are reinstated on an
+ ongoing basis if such Contributor notifies You of the non-compliance by
+ some reasonable means, this is the first time You have received notice of
+ non-compliance with this License from such Contributor, and You become
+ compliant prior to 30 days after Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+ infringement claim (excluding declaratory judgment actions, counter-claims,
+ and cross-claims) alleging that a Contributor Version directly or
+ indirectly infringes any patent, then the rights granted to You by any and
+ all Contributors for the Covered Software under Section 2.1 of this License
+ shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+ license agreements (excluding distributors and resellers) which have been
+ validly granted by You or Your distributors under this License prior to
+ termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+ Covered Software is provided under this License on an “as is” basis, without
+ warranty of any kind, either expressed, implied, or statutory, including,
+ without limitation, warranties that the Covered Software is free of defects,
+ merchantable, fit for a particular purpose or non-infringing. The entire
+ risk as to the quality and performance of the Covered Software is with You.
+ Should any Covered Software prove defective in any respect, You (not any
+ Contributor) assume the cost of any necessary servicing, repair, or
+ correction. This disclaimer of warranty constitutes an essential part of this
+ License. No use of any Covered Software is authorized under this License
+ except under this disclaimer.
+
+7. Limitation of Liability
+
+ Under no circumstances and under no legal theory, whether tort (including
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
+ distributes Covered Software as permitted above, be liable to You for any
+ direct, indirect, special, incidental, or consequential damages of any
+ character including, without limitation, damages for lost profits, loss of
+ goodwill, work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses, even if such party shall have been
+ informed of the possibility of such damages. This limitation of liability
+ shall not apply to liability for death or personal injury resulting from such
+ party’s negligence to the extent applicable law prohibits such limitation.
+ Some jurisdictions do not allow the exclusion or limitation of incidental or
+ consequential damages, so this exclusion and limitation may not apply to You.
+
+8. Litigation
+
+ Any litigation relating to this License may be brought only in the courts of
+ a jurisdiction where the defendant maintains its principal place of business
+ and such litigation shall be governed by laws of that jurisdiction, without
+ reference to its conflict-of-law provisions. Nothing in this Section shall
+ prevent a party’s ability to bring cross-claims or counter-claims.
+
+9. Miscellaneous
+
+ This License represents the complete agreement concerning the subject matter
+ hereof. If any provision of this License is held to be unenforceable, such
+ provision shall be reformed only to the extent necessary to make it
+ enforceable. Any law or regulation which provides that the language of a
+ contract shall be construed against the drafter shall not be used to construe
+ this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+ Mozilla Foundation is the license steward. Except as provided in Section
+ 10.3, no one other than the license steward has the right to modify or
+ publish new versions of this License. Each version will be given a
+ distinguishing version number.
+
+10.2. Effect of New Versions
+
+ You may distribute the Covered Software under the terms of the version of
+ the License under which You originally received the Covered Software, or
+ under the terms of any subsequent version published by the license
+ steward.
+
+10.3. Modified Versions
+
+ If you create software not governed by this License, and you want to
+ create a new license for such software, you may create and use a modified
+ version of this License if you rename the license and remove any
+ references to the name of the license steward (except to note that such
+ modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+ If You choose to distribute Source Code Form that is Incompatible With
+ Secondary Licenses under the terms of this version of the License, the
+ notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the
+ terms of the Mozilla Public License, v.
+ 2.0. If a copy of the MPL was not
+ distributed with this file, You can
+ obtain one at
+ http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file, then
+You may include the notice in a location (such as a LICENSE file in a relevant
+directory) where a recipient would be likely to look for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+ This Source Code Form is “Incompatible
+ With Secondary Licenses”, as defined by
+ the Mozilla Public License, v. 2.0.
+
diff --git a/core/vendor/DOMPurify/dist/purify.min.js b/core/vendor/DOMPurify/dist/purify.min.js
new file mode 100644
index 00000000000..d95d80fc231
--- /dev/null
+++ b/core/vendor/DOMPurify/dist/purify.min.js
@@ -0,0 +1,2 @@
+(function(e){"use strict";var t=typeof window==="undefined"?null:window;if(typeof define==="function"&&define.amd){define(function(){return e(t)})}else if(typeof module!=="undefined"){module.exports=e(t)}else{t.DOMPurify=e(t)}})(function e(t){"use strict";var r=function(t){return e(t)};r.version="0.8.4";r.removed=[];if(!t||!t.document||t.document.nodeType!==9){r.isSupported=false;return r}var n=t.document;var a=n;var i=t.DocumentFragment;var o=t.HTMLTemplateElement;var l=t.NodeFilter;var s=t.NamedNodeMap||t.MozNamedAttrMap;var f=t.Text;var c=t.Comment;var u=t.DOMParser;if(typeof o==="function"){var d=n.createElement("template");if(d.content&&d.content.ownerDocument){n=d.content.ownerDocument}}var m=n.implementation;var p=n.createNodeIterator;var v=n.getElementsByTagName;var h=n.createDocumentFragment;var g=a.importNode;var y={};r.isSupported=typeof m.createHTMLDocument!=="undefined"&&n.documentMode!==9;var b=function(e,t){var r=t.length;while(r--){if(typeof t[r]==="string"){t[r]=t[r].toLowerCase()}e[t[r]]=true}return e};var T=function(e){var t={};var r;for(r in e){if(e.hasOwnProperty(r)){t[r]=e[r]}}return t};var x=null;var k=b({},["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr","svg","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","switch","symbol","text","textpath","title","tref","tspan","view","vkern","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmuliscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mpspace","msqrt","mystyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","#text"]);var A=null;var w=b({},["accept","action","align","alt","autocomplete","background","bgcolor","border","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","coords","datetime","default","dir","disabled","download","enctype","face","for","headers","height","hidden","high","href","hreflang","id","ismap","label","lang","list","loop","low","max","maxlength","media","method","min","multiple","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","rows","rowspan","spellcheck","scope","selected","shape","size","span","srclang","start","src","step","style","summary","tabindex","title","type","usemap","valign","value","width","xmlns","accent-height","accumulate","additivive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mode","min","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","surfacescale","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","u1","u2","unicode","values","viewbox","visibility","vert-adv-y","vert-origin-x","vert-origin-y","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","y","y1","y2","z","zoomandpan","accent","accentunder","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","display","displaystyle","fence","frame","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]);var E=null;var S=null;var M=true;var O=false;var N=false;var L=false;var D=/\{\{[\s\S]*|[\s\S]*\}\}/gm;var _=/<%[\s\S]*|[\s\S]*%>/gm;var C=false;var z=false;var R=false;var F=false;var H=true;var B=true;var W=b({},["audio","head","math","script","style","svg","video"]);var j=b({},["audio","video","img","source"]);var G=b({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]);var I=null;var q=n.createElement("form");var P=function(e){if(typeof e!=="object"){e={}}x="ALLOWED_TAGS"in e?b({},e.ALLOWED_TAGS):k;A="ALLOWED_ATTR"in e?b({},e.ALLOWED_ATTR):w;E="FORBID_TAGS"in e?b({},e.FORBID_TAGS):{};S="FORBID_ATTR"in e?b({},e.FORBID_ATTR):{};M=e.ALLOW_DATA_ATTR!==false;O=e.ALLOW_UNKNOWN_PROTOCOLS||false;N=e.SAFE_FOR_JQUERY||false;L=e.SAFE_FOR_TEMPLATES||false;C=e.WHOLE_DOCUMENT||false;z=e.RETURN_DOM||false;R=e.RETURN_DOM_FRAGMENT||false;F=e.RETURN_DOM_IMPORT||false;H=e.SANITIZE_DOM!==false;B=e.KEEP_CONTENT!==false;if(L){M=false}if(R){z=true}if(e.ADD_TAGS){if(x===k){x=T(x)}b(x,e.ADD_TAGS)}if(e.ADD_ATTR){if(A===w){A=T(A)}b(A,e.ADD_ATTR)}if(B){x["#text"]=true}if(Object&&"freeze"in Object){Object.freeze(e)}I=e};var U=function(e){r.removed.push({element:e});try{e.parentNode.removeChild(e)}catch(t){e.outerHTML=""}};var V=function(e,t){r.removed.push({attribute:t.getAttributeNode(e),from:t});t.removeAttribute(e)};var K=function(e){var t,r;try{t=(new u).parseFromString(e,"text/html")}catch(n){}if(!t||!t.documentElement){t=m.createHTMLDocument("");r=t.body;r.parentNode.removeChild(r.parentNode.firstElementChild);r.outerHTML=e}if(typeof t.getElementsByTagName==="function"){return t.getElementsByTagName(C?"html":"body")[0]}return v.call(t,C?"html":"body")[0]};var J=function(e){return p.call(e.ownerDocument||e,e,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT,function(){return l.FILTER_ACCEPT},false)};var Q=function(e){if(e instanceof f||e instanceof c){return false}if(typeof e.nodeName!=="string"||typeof e.textContent!=="string"||typeof e.removeChild!=="function"||!(e.attributes instanceof s)||typeof e.removeAttribute!=="function"||typeof e.setAttribute!=="function"){return true}return false};var X=function(e){var t,n;ne("beforeSanitizeElements",e,null);if(Q(e)){U(e);return true}t=e.nodeName.toLowerCase();ne("uponSanitizeElement",e,{tagName:t,allowedTags:x});if(!x[t]||E[t]){if(B&&!W[t]&&typeof e.insertAdjacentHTML==="function"){try{e.insertAdjacentHTML("AfterEnd",e.innerHTML)}catch(a){}}U(e);return true}if(N&&!e.firstElementChild&&(!e.content||!e.content.firstElementChild)&&/</g.test(e.textContent)){r.removed.push({element:e.cloneNode()});e.innerHTML=e.textContent.replace(/</g,"&lt;")}if(L&&e.nodeType===3){n=e.textContent;n=n.replace(D," ");n=n.replace(_," ");if(e.textContent!==n){r.removed.push({element:e.cloneNode()});e.textContent=n}}ne("afterSanitizeElements",e,null);return false};var Y=/^data-[\-\w.\u00B7-\uFFFF]/;var Z=/^(?:(?:(?:f|ht)tps?|mailto|tel):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;var $=/^(?:\w+script|data):/i;var ee=/[\x00-\x20\xA0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;var te=function(e){var a,i,o,l,s,f,c,u;ne("beforeSanitizeAttributes",e,null);f=e.attributes;if(!f){return}c={attrName:"",attrValue:"",keepAttr:true,allowedAttributes:A};u=f.length;while(u--){a=f[u];i=a.name;o=a.value;l=i.toLowerCase();c.attrName=l;c.attrValue=o;c.keepAttr=true;ne("uponSanitizeAttribute",e,c);o=c.attrValue;if(l==="name"&&e.nodeName==="IMG"&&f.id){s=f.id;f=Array.prototype.slice.apply(f);V("id",e);V(i,e);if(f.indexOf(s)>u){e.setAttribute("id",s.value)}}else{if(i==="id"){e.setAttribute(i,"")}V(i,e)}if(!c.keepAttr){continue}if(H&&(l==="id"||l==="name")&&(o in t||o in n||o in q)){continue}if(L){o=o.replace(D," ");o=o.replace(_," ")}if(M&&Y.test(l)){}else if(!A[l]||S[l]){continue}else if(G[l]){}else if(Z.test(o.replace(ee,""))){}else if(l==="src"&&o.indexOf("data:")===0&&j[e.nodeName.toLowerCase()]){}else if(O&&!$.test(o.replace(ee,""))){}else if(!o){}else{continue}try{e.setAttribute(i,o);r.removed.pop()}catch(d){}}ne("afterSanitizeAttributes",e,null)};var re=function(e){var t;var r=J(e);ne("beforeSanitizeShadowDOM",e,null);while(t=r.nextNode()){ne("uponSanitizeShadowNode",t,null);if(X(t)){continue}if(t.content instanceof i){re(t.content)}te(t)}ne("afterSanitizeShadowDOM",e,null)};var ne=function(e,t,n){if(!y[e]){return}y[e].forEach(function(e){e.call(r,t,n,I)})};r.sanitize=function(e,n){var o,l,s,f,c;if(!e){e=""}if(typeof e!=="string"){if(typeof e.toString!=="function"){throw new TypeError("toString is not a function")}else{e=e.toString()}}if(!r.isSupported){if(typeof t.toStaticHTML==="object"||typeof t.toStaticHTML==="function"){return t.toStaticHTML(e)}return e}P(n);r.removed=[];if(!z&&!C&&e.indexOf("<")===-1){return e}o=K(e);if(!o){return z?null:""}f=J(o);while(l=f.nextNode()){if(l.nodeType===3&&l===s){continue}if(X(l)){continue}if(l.content instanceof i){re(l.content)}te(l);s=l}if(z){if(R){c=h.call(o.ownerDocument);while(o.firstChild){c.appendChild(o.firstChild)}}else{c=o}if(F){c=g.call(a,c,true)}return c}return C?o.outerHTML:o.innerHTML};r.addHook=function(e,t){if(typeof t!=="function"){return}y[e]=y[e]||[];y[e].push(t)};r.removeHook=function(e){if(y[e]){y[e].pop()}};r.removeHooks=function(e){if(y[e]){y[e]=[]}};r.removeAllHooks=function(){y={}};return r});
+//# sourceMappingURL=./dist/purify.min.js.map \ No newline at end of file
diff --git a/core/vendor/marked/.bower.json b/core/vendor/marked/.bower.json
new file mode 100644
index 00000000000..058b951d4b7
--- /dev/null
+++ b/core/vendor/marked/.bower.json
@@ -0,0 +1,33 @@
+{
+ "name": "marked",
+ "version": "0.3.6",
+ "homepage": "https://github.com/chjj/marked",
+ "authors": [
+ "Christopher Jeffrey <chjjeffrey@gmail.com>"
+ ],
+ "description": "A markdown parser built for speed",
+ "keywords": [
+ "markdown",
+ "markup",
+ "html"
+ ],
+ "main": "lib/marked.js",
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "app/bower_components",
+ "test",
+ "tests"
+ ],
+ "_release": "0.3.6",
+ "_resolution": {
+ "type": "version",
+ "tag": "v0.3.6",
+ "commit": "eddec20467c2d10c7769061ee9074e268500966f"
+ },
+ "_source": "https://github.com/chjj/marked.git",
+ "_target": "0.3.6",
+ "_originalSource": "marked"
+} \ No newline at end of file
diff --git a/core/vendor/marked/LICENSE b/core/vendor/marked/LICENSE
new file mode 100644
index 00000000000..a7b812ed618
--- /dev/null
+++ b/core/vendor/marked/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/core/vendor/marked/marked.min.js b/core/vendor/marked/marked.min.js
new file mode 100644
index 00000000000..555c1dc1d9d
--- /dev/null
+++ b/core/vendor/marked/marked.min.js
@@ -0,0 +1,6 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
+(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1].charAt(cap[1].length-1)==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",text:cap[0]});continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"<pre><code>"+(escaped?code:escape(code,true))+"\n</code></pre>"}return'<pre><code class="'+this.options.langPrefix+escape(lang,true)+'">'+(escaped?code:escape(code,true))+"\n</code></pre>\n"};Renderer.prototype.blockquote=function(quote){return"<blockquote>\n"+quote+"</blockquote>\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"<h"+level+' id="'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\w]+/g,"-")+'">'+text+"</h"+level+">\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"</"+type+">\n"};Renderer.prototype.listitem=function(text){return"<li>"+text+"</li>\n"};Renderer.prototype.paragraph=function(text){return"<p>"+text+"</p>\n"};Renderer.prototype.table=function(header,body){return"<table>\n"+"<thead>\n"+header+"</thead>\n"+"<tbody>\n"+body+"</tbody>\n"+"</table>\n"};Renderer.prototype.tablerow=function(content){return"<tr>\n"+content+"</tr>\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"</"+type+">\n"};Renderer.prototype.strong=function(text){return"<strong>"+text+"</strong>"};Renderer.prototype.em=function(text){return"<em>"+text+"</em>"};Renderer.prototype.codespan=function(text){return"<code>"+text+"</code>"};Renderer.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"};Renderer.prototype.del=function(text){return"<del>"+text+"</del>"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='<a href="'+href+'"';if(title){out+=' title="'+title+'"'}out+=">"+text+"</a>";return out};Renderer.prototype.image=function(href,title,text){var out='<img src="'+href+'" alt="'+text+'"';if(title){out+=' title="'+title+'"'}out+=this.options.xhtml?"/>":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell="";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case"blockquote_start":{var body="";while(this.next().type!=="blockquote_end"){body+=this.tok()}return this.renderer.blockquote(body)}case"list_start":{var body="",ordered=this.token.ordered;while(this.next().type!=="list_end"){body+=this.tok()}return this.renderer.list(body,ordered)}case"list_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.token.type==="text"?this.parseText():this.tok()}return this.renderer.listitem(body)}case"loose_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.tok()}return this.renderer.listitem(body)}case"html":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case"paragraph":{return this.renderer.paragraph(this.inline.output(this.token.text))}case"text":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(err){if(err){opt.highlight=highlight;return callback(err)}var out;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!=="code"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(err)return done(err);if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";if((opt||marked.defaults).silent){return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); \ No newline at end of file
diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js
index 3fab4582a28..91bfe834f95 100644
--- a/lib/l10n/sk_SK.js
+++ b/lib/l10n/sk_SK.js
@@ -16,6 +16,8 @@ OC.L10N.register(
"Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.",
"Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
+ "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
+ "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
"today" : "dnes",
@@ -80,6 +82,7 @@ OC.L10N.register(
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend",
"Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený",
"Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený",
+ "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ",
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
"Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s",
@@ -134,8 +137,10 @@ OC.L10N.register(
"Dec." : "Dec.",
"Apps" : "Aplikácie",
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
+ "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
+ "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou",
"User disabled" : "Používateľ zakázaný",
"Help" : "Pomoc",
"Personal" : "Osobné",
diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json
index eb02b2ad93b..f67c99dd28c 100644
--- a/lib/l10n/sk_SK.json
+++ b/lib/l10n/sk_SK.json
@@ -14,6 +14,8 @@
"Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.",
"Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
+ "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
+ "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
"today" : "dnes",
@@ -78,6 +80,7 @@
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend",
"Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený",
"Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený",
+ "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ",
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
"Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s",
@@ -132,8 +135,10 @@
"Dec." : "Dec.",
"Apps" : "Aplikácie",
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
+ "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
+ "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou",
"User disabled" : "Používateľ zakázaný",
"Help" : "Pomoc",
"Personal" : "Osobné",
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index a58aec4aeea..1f59e677a54 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -68,7 +68,7 @@ class AllConfig implements \OCP\IConfig {
/**
* @param SystemConfig $systemConfig
*/
- function __construct(SystemConfig $systemConfig) {
+ public function __construct(SystemConfig $systemConfig) {
$this->userCache = new CappedMemoryCache();
$this->systemConfig = $systemConfig;
}
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index d92e8965b5c..06e760e86f6 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -29,7 +29,9 @@
namespace OC;
+use OC\DB\OracleConnection;
use OCP\IAppConfig;
+use OCP\IConfig;
use OCP\IDBConnection;
/**
@@ -37,12 +39,22 @@ use OCP\IDBConnection;
* database.
*/
class AppConfig implements IAppConfig {
- /**
- * @var \OCP\IDBConnection $conn
- */
+
+ /** @var array[] */
+ protected $sensitiveValues = [
+ 'user_ldap' => [
+ 'ldap_agent_password',
+ ],
+ ];
+
+ /** @var \OCP\IDBConnection */
protected $conn;
- private $cache = array();
+ /** @var array[] */
+ private $cache = [];
+
+ /** @var bool */
+ private $configLoaded = false;
/**
* @param IDBConnection $conn
@@ -85,6 +97,7 @@ class AppConfig implements IAppConfig {
*
* @param string $app the app we are looking for
* @return array an array of key names
+ * @deprecated 8.0.0 use method getAppKeys of \OCP\IConfig
*
* This function gets all keys of an app. Please note that the values are
* not returned.
@@ -112,6 +125,7 @@ class AppConfig implements IAppConfig {
* @param string $key key
* @param string $default = null, default value if the key does not exist
* @return string the value or $default
+ * @deprecated 8.0.0 use method getAppValue of \OCP\IConfig
*
* This function gets a value from the appconfig table. If the key does
* not exist the default value will be returned
@@ -146,6 +160,7 @@ class AppConfig implements IAppConfig {
* @param string $key key
* @param string|float|int $value value
* @return bool True if the value was inserted or updated, false if the value was the same
+ * @deprecated 8.0.0 use method setAppValue of \OCP\IConfig
*/
public function setValue($app, $key, $value) {
if (!$this->hasKey($app, $key)) {
@@ -182,7 +197,7 @@ class AppConfig implements IAppConfig {
* http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions002.htm#i1033286
* > Large objects (LOBs) are not supported in comparison conditions.
*/
- if (!($this->conn instanceof \OC\DB\OracleConnection)) {
+ if (!($this->conn instanceof OracleConnection)) {
// Only update the value when it is not the same
$sql->andWhere($sql->expr()->neq('configvalue', $sql->createParameter('configvalue')))
->setParameter('configvalue', $value);
@@ -200,7 +215,8 @@ class AppConfig implements IAppConfig {
*
* @param string $app app
* @param string $key key
- * @return boolean|null
+ * @return boolean
+ * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig
*/
public function deleteKey($app, $key) {
$this->loadConfigValues();
@@ -214,13 +230,15 @@ class AppConfig implements IAppConfig {
$sql->execute();
unset($this->cache[$app][$key]);
+ return false;
}
/**
* Remove app from appconfig
*
* @param string $app app
- * @return boolean|null
+ * @return boolean
+ * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig
*
* Removes all keys in appconfig belonging to the app.
*/
@@ -234,6 +252,7 @@ class AppConfig implements IAppConfig {
$sql->execute();
unset($this->cache[$app]);
+ return false;
}
/**
@@ -262,10 +281,30 @@ class AppConfig implements IAppConfig {
}
/**
+ * get all values of the app or and filters out sensitive data
+ *
+ * @param string $app
+ * @return array
+ */
+ public function getFilteredValues($app) {
+ $values = $this->getValues($app, false);
+
+ foreach ($this->sensitiveValues[$app] as $sensitiveKey) {
+ if (isset($values[$sensitiveKey])) {
+ $values[$sensitiveKey] = IConfig::SENSITIVE_VALUE;
+ }
+ }
+
+ return $values;
+ }
+
+ /**
* Load all the app config values
*/
protected function loadConfigValues() {
- if ($this->configLoaded) return;
+ if ($this->configLoaded) {
+ return;
+ }
$this->cache = [];
diff --git a/lib/private/SystemConfig.php b/lib/private/SystemConfig.php
index 1029a6619ff..e5f1adaf004 100644
--- a/lib/private/SystemConfig.php
+++ b/lib/private/SystemConfig.php
@@ -44,7 +44,6 @@ class SystemConfig {
'passwordsalt' => true,
'secret' => true,
'updater.secret' => true,
- 'ldap_agent_password' => true,
'proxyuserpwd' => true,
'log.condition' => [
'shared_secret' => true,
diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php
index 8ef7e08c733..a475b895d9f 100644
--- a/lib/private/legacy/app.php
+++ b/lib/private/legacy/app.php
@@ -1304,43 +1304,21 @@ class OC_App {
$data['summary'] = self::findBestL10NOption($data['summary'], $lang);
}
if ($lang && isset($data['description']) && is_array($data['description'])) {
- $data['description'] = self::findBestL10NOption($data['description'], $lang);
- }
-
- // just modify the description if it is available
- // otherwise this will create a $data element with an empty 'description'
- if (isset($data['description'])) {
- if (is_string($data['description'])) {
- // sometimes the description contains line breaks and they are then also
- // shown in this way in the app management which isn't wanted as HTML
- // manages line breaks itself
-
- // first of all we split on empty lines
- $paragraphs = preg_split("!\n[[:space:]]*\n!mu", $data['description']);
-
- $result = [];
- foreach ($paragraphs as $value) {
- // replace multiple whitespace (tabs, space, newlines) inside a paragraph
- // with a single space - also trims whitespace
- $result[] = trim(preg_replace('![[:space:]]+!mu', ' ', $value));
- }
-
- // join the single paragraphs with a empty line in between
- $data['description'] = implode("\n\n", $result);
-
- } else {
- $data['description'] = '';
- }
+ $data['description'] = trim(self::findBestL10NOption($data['description'], $lang));
+ } else if (isset($data['description']) && is_string($data['description'])) {
+ $data['description'] = trim($data['description']);
+ } else {
+ $data['description'] = '';
}
return $data;
}
/**
- * @param $config
- * @param $l
- * @param $info
- * @throws Exception
+ * @param \OCP\IConfig $config
+ * @param \OCP\IL10N $l
+ * @param array $info
+ * @throws \Exception
*/
protected static function checkAppDependencies($config, $l, $info) {
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php
index 01aca47ad81..4a92a224840 100644
--- a/lib/public/IAppConfig.php
+++ b/lib/public/IAppConfig.php
@@ -87,6 +87,15 @@ interface IAppConfig {
public function getValues($app, $key);
/**
+ * get all values of the app or and filters out sensitive data
+ *
+ * @param string $app
+ * @return array
+ * @since 12.0.0
+ */
+ public function getFilteredValues($app);
+
+ /**
* sets a value in the appconfig
* @param string $app app
* @param string $key key
diff --git a/settings/css/settings.css b/settings/css/settings.css
index 46394d3f03d..557395c5717 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -551,6 +551,26 @@ span.version {
flex-basis: 90%;
}
+#apps-list .app-description p {
+ margin: 10px 0;
+}
+#apps-list .app-description ul {
+ list-style: disc;
+}
+#apps-list .app-description ol {
+ list-style: decimal;
+}
+#apps-list .app-description > ul,
+#apps-list .app-description > ol {
+ margin-left: 19px;
+}
+#apps-list .app-description ol ol,
+#apps-list .app-description ol ul,
+#apps-list .app-description ul ol,
+#apps-list .app-description ul ul {
+ padding-left: 15px;
+}
+
@media (min-width: 1601px) {
#apps-list .section {
width: 22%;
@@ -634,9 +654,6 @@ form.section {
.app-description {
clear: both;
}
-.app-description pre {
- white-space: pre-line;
-}
#apps-list .groups-enable {
margin-top: 8px;
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 61d817e43e4..1538e71a491 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -19,6 +19,8 @@ Handlebars.registerHelper('level', function() {
OC.Settings = OC.Settings || {};
OC.Settings.Apps = OC.Settings.Apps || {
+ markedOptions: {},
+
setupGroupsSelect: function($elements) {
OC.Settings.setupGroupsSelect($elements, {
placeholder: t('core', 'All')
@@ -186,6 +188,25 @@ OC.Settings.Apps = OC.Settings.Apps || {
app.author = app.author['@value'];
}
+ // Parse markdown in app description
+ app.description = DOMPurify.sanitize(
+ marked(app.description.trim(), OC.Settings.Apps.markedOptions),
+ {
+ SAFE_FOR_JQUERY: true,
+ ALLOWED_TAGS: [
+ 'strong',
+ 'p',
+ 'a',
+ 'ul',
+ 'ol',
+ 'li',
+ 'em',
+ 'del',
+ 'blockquote'
+ ]
+ }
+ );
+
var html = template(app);
if (selector) {
selector.html(html);
@@ -633,6 +654,50 @@ OC.Settings.Apps = OC.Settings.Apps || {
* Initializes the apps list
*/
initialize: function($el) {
+
+ var renderer = new marked.Renderer();
+ renderer.link = function(href, title, text) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return '';
+ }
+
+ if (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) {
+ return '';
+ }
+
+ var out = '<a href="' + href + '" rel="noreferrer noopener"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += '>' + text + '</a>';
+ return out;
+ };
+ renderer.image = function(href, title, text) {
+ if (text) {
+ return text;
+ }
+ return title;
+ };
+ renderer.blockquote = function(quote) {
+ return quote;
+ };
+
+ OC.Settings.Apps.markedOptions = {
+ renderer: renderer,
+ gfm: false,
+ highlight: false,
+ tables: false,
+ breaks: false,
+ pedantic: false,
+ sanitize: true,
+ smartLists: true,
+ smartypants: false
+ };
+
OC.Plugins.register('OCA.Search', OC.Settings.Apps.Search);
OC.Settings.Apps.loadCategories();
OC.Util.History.addOnPopStateHandler(_.bind(this._onPopState, this));
diff --git a/settings/templates/apps.php b/settings/templates/apps.php
index 24f8061a530..a4b08f11693 100644
--- a/settings/templates/apps.php
+++ b/settings/templates/apps.php
@@ -3,7 +3,9 @@ style('settings', 'settings');
vendor_script(
'core',
[
- 'handlebars/handlebars'
+ 'handlebars/handlebars',
+ 'marked/marked.min',
+ 'DOMPurify/dist/purify.min',
]
);
script(
@@ -59,7 +61,7 @@ script(
<div class="app-detailpage"></div>
<div class="app-description-container hidden">
- <div class="app-description"><pre>{{description}}</pre></div>
+ <div class="app-description">{{{description}}}</div>
<!--<div class="app-changed">{{changed}}</div>-->
{{#if documentation}}
<p class="documentation">
diff --git a/settings/tests/js/appsSpec.js b/settings/tests/js/appsSpec.js
index aa785a6768e..4b917b425c1 100644
--- a/settings/tests/js/appsSpec.js
+++ b/settings/tests/js/appsSpec.js
@@ -185,23 +185,27 @@ describe('OC.Settings.Apps tests', function() {
{
id: 'foo',
name: 'Foo app',
+ description: 'Hello',
level: 0,
author: 'foo'
},
{
id: 'alpha',
name: 'Alpha app',
+ description: 'Hello',
level: 300,
author: ['alpha', 'beta']
},
{
id: 'nolevel',
name: 'No level',
+ description: 'Hello',
author: 'bar'
},
{
id: 'zork',
name: 'Some famous adventure game',
+ description: 'Hello',
level: 200,
author: 'baz'
@@ -209,6 +213,7 @@ describe('OC.Settings.Apps tests', function() {
{
id: 'delta',
name: 'Mathematical symbol',
+ description: 'Hello',
level: 200,
author: 'foobar'
}
@@ -223,29 +228,34 @@ describe('OC.Settings.Apps tests', function() {
'foo': {
id: 'foo',
name: 'Foo app',
+ description: 'Hello',
level: 0,
author: 'foo'
},
'alpha': {
id: 'alpha',
name: 'Alpha app',
+ description: 'Hello',
level: 300,
author: ['alpha', 'beta']
},
'nolevel': {
id: 'nolevel',
name: 'No level',
+ description: 'Hello',
author: 'bar'
},
'zork': {
id: 'zork',
name: 'Some famous adventure game',
+ description: 'Hello',
level: 200,
author: 'baz',
},
'delta': {
id: 'delta',
name: 'Mathematical symbol',
+ description: 'Hello',
level: 200,
author: 'foobar'
}
diff --git a/tests/Core/Command/Config/ListConfigsTest.php b/tests/Core/Command/Config/ListConfigsTest.php
index 0f170cee840..861c1f59d5e 100644
--- a/tests/Core/Command/Config/ListConfigsTest.php
+++ b/tests/Core/Command/Config/ListConfigsTest.php
@@ -285,10 +285,16 @@ class ListConfigsTest extends TestCase {
$this->systemConfig->expects($this->any())
->method('getValue')
->willReturnMap($systemConfigMap);
+ $this->appConfig->expects($this->any())
+ ->method('getValues')
+ ->willReturnMap($appConfig);
} else {
$this->systemConfig->expects($this->any())
->method('getFilteredValue')
->willReturnMap($systemConfigMap);
+ $this->appConfig->expects($this->any())
+ ->method('getFilteredValues')
+ ->willReturnMap($appConfig);
}
$this->appConfig->expects($this->any())
diff --git a/tests/karma.config.js b/tests/karma.config.js
index c499451c7dc..e9aa38dd66f 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -110,7 +110,9 @@ module.exports = function(config) {
name: 'settings',
srcFiles: [
'settings/js/apps.js',
- 'settings/js/users/deleteHandler.js'
+ 'settings/js/users/deleteHandler.js',
+ 'core/vendor/marked/marked.min.js',
+ 'core/vendor/DOMPurify/dist/purify.min.js'
],
testFiles: [
'settings/tests/js/appsSpec.js',
diff --git a/tests/lib/AppConfigTest.php b/tests/lib/AppConfigTest.php
index c4da7507752..fed929352d3 100644
--- a/tests/lib/AppConfigTest.php
+++ b/tests/lib/AppConfigTest.php
@@ -8,6 +8,7 @@
*/
namespace Test;
+use OCP\IConfig;
/**
* Class AppConfigTest
@@ -305,6 +306,28 @@ class AppConfigTest extends TestCase {
$this->assertEquals($expected, $values);
}
+ public function testGetFilteredValues() {
+ /** @var \OC\AppConfig|\PHPUnit_Framework_MockObject_MockObject $config */
+ $config = $this->getMockBuilder(\OC\AppConfig::class)
+ ->setConstructorArgs([\OC::$server->getDatabaseConnection()])
+ ->setMethods(['getValues'])
+ ->getMock();
+
+ $config->expects($this->once())
+ ->method('getValues')
+ ->with('user_ldap', false)
+ ->willReturn([
+ 'ldap_agent_password' => 'secret',
+ 'ldap_dn' => 'dn',
+ ]);
+
+ $values = $config->getFilteredValues('user_ldap');
+ $this->assertEquals([
+ 'ldap_agent_password' => IConfig::SENSITIVE_VALUE,
+ 'ldap_dn' => 'dn',
+ ], $values);
+ }
+
public function testSettingConfigParallel() {
$appConfig1 = new \OC\AppConfig(\OC::$server->getDatabaseConnection());
$appConfig2 = new \OC\AppConfig(\OC::$server->getDatabaseConnection());
diff --git a/tests/lib/AppTest.php b/tests/lib/AppTest.php
index 575e32dd60c..a60a03a07f5 100644
--- a/tests/lib/AppTest.php
+++ b/tests/lib/AppTest.php
@@ -8,6 +8,7 @@
*/
namespace Test;
+
use OC\AppConfig;
use OCP\IAppConfig;
@@ -24,7 +25,7 @@ class AppTest extends \Test\TestCase {
const TEST_GROUP1 = 'group1';
const TEST_GROUP2 = 'group2';
- function appVersionsProvider() {
+ public function appVersionsProvider() {
return array(
// exact match
array(
@@ -338,7 +339,7 @@ class AppTest extends \Test\TestCase {
/**
* Providers for the app config values
*/
- function appConfigValuesProvider() {
+ public function appConfigValuesProvider() {
return array(
// logged in user1
array(
@@ -561,27 +562,30 @@ class AppTest extends \Test\TestCase {
/**
* Providers for the app data values
*/
- function appDataProvider() {
+ public function appDataProvider() {
return [
[
['description' => " \t This is a multiline \n test with \n \t \n \n some new lines "],
- ['description' => "This is a multiline test with\n\nsome new lines"]
+ ['description' => "This is a multiline \n test with \n \t \n \n some new lines"],
],
[
['description' => " \t This is a multiline \n test with \n \t some new lines "],
- ['description' => "This is a multiline test with some new lines"]
+ ['description' => "This is a multiline \n test with \n \t some new lines"],
],
[
['description' => hex2bin('5065726d657420646520732761757468656e7469666965722064616e732070697769676f20646972656374656d656e74206176656320736573206964656e74696669616e7473206f776e636c6f75642073616e73206c65732072657461706572206574206d657420c3a0206a6f757273206365757820636920656e20636173206465206368616e67656d656e74206465206d6f742064652070617373652e0d0a0d')],
- ['description' => "Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe."]
+ ['description' => "Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe."],
],
[
['not-a-description' => " \t This is a multiline \n test with \n \t some new lines "],
- ['not-a-description' => " \t This is a multiline \n test with \n \t some new lines "]
+ [
+ 'not-a-description' => " \t This is a multiline \n test with \n \t some new lines ",
+ 'description' => '',
+ ],
],
[
['description' => [100, 'bla']],
- ['description' => ""]
+ ['description' => ''],
],
];
}
diff --git a/themes/example/defaults.php b/themes/example/defaults.php
index 25ec350ed1b..1a2389d0bc2 100644
--- a/themes/example/defaults.php
+++ b/themes/example/defaults.php
@@ -41,7 +41,7 @@ class OC_Theme {
* @return string URL
*/
public function getiOSClientUrl() {
- return 'https://itunes.apple.com/us/app/owncloud/id543672169?mt=8';
+ return 'https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8';
}
/**
@@ -49,7 +49,7 @@ class OC_Theme {
* @return string AppId
*/
public function getiTunesAppId() {
- return '543672169';
+ return '1125420102';
}
/**
@@ -65,7 +65,7 @@ class OC_Theme {
* @return string URL
*/
public function getDocBaseUrl() {
- return 'https://docs.nextcloud.org';
+ return 'https://docs.nextcloud.com';
}
/**