Commit 1d1657e3 authored by wuzekai's avatar wuzekai

feat: 汉化 /libraries 文库路由页面

- 文库列表/文件夹/数据集/权限页面汉化
- 工具栏、导入历史、下载、集合创建等界面文本中文化
- 删除确认、进度、Toast 提示等交互文案中文化
parent d88c812b
<template> <template>
<div> <div>
<div class="form-inline d-flex align-items-center mb-2"> <div class="form-inline d-flex align-items-center mb-2">
<BButton class="mr-1" title="go to first page" @click="gotoFirstPage"> <BButton class="mr-1" title="转到第一页" @click="gotoFirstPage">
<FontAwesomeIcon :icon="faHome" /> <FontAwesomeIcon :icon="faHome" />
</BButton> </BButton>
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
v-if="currentUser && currentUser.is_admin" v-if="currentUser && currentUser.is_admin"
id="create-new-lib" id="create-new-lib"
v-b-toggle.collapse-2 v-b-toggle.collapse-2
title="Create new folder" title="创建新文库"
class="mr-1"> class="mr-1">
<FontAwesomeIcon :icon="faPlus" /> <FontAwesomeIcon :icon="faPlus" />
{{ titleLibrary }} {{ titleLibrary }}
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
<textarea <textarea
v-if="row.item.editMode" v-if="row.item.editMode"
v-model="row.item.name" v-model="row.item.name"
aria-label="Library name" aria-label="文库名称"
class="form-control input_library_name" class="form-control input_library_name"
rows="3" /> rows="3" />
<div v-else-if="row.item.deleted && includeDeleted" class="deleted-item"> <div v-else-if="row.item.deleted && includeDeleted" class="deleted-item">
...@@ -103,14 +103,14 @@ ...@@ -103,14 +103,14 @@
</template> </template>
<template v-slot:cell(is_unrestricted)="row"> <template v-slot:cell(is_unrestricted)="row">
<FontAwesomeIcon v-if="row.item.public && !row.item.deleted" title="Public library" :icon="faGlobe" /> <FontAwesomeIcon v-if="row.item.public && !row.item.deleted" title="公开文库" :icon="faGlobe" />
</template> </template>
<template v-slot:cell(buttons)="row"> <template v-slot:cell(buttons)="row">
<BButton <BButton
v-if="row.item.deleted" v-if="row.item.deleted"
size="sm" size="sm"
:title="'Undelete ' + row.item.name" :title="`取消删除 ${row.item.name}`"
@click="undelete(row.item)"> @click="undelete(row.item)">
<FontAwesomeIcon :icon="faUnlock" /> <FontAwesomeIcon :icon="faUnlock" />
{{ titleUndelete }} {{ titleUndelete }}
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
v-if="row.item.can_user_modify && row.item.editMode" v-if="row.item.can_user_modify && row.item.editMode"
size="sm" size="sm"
class="lib-btn save_changes_btn" class="lib-btn save_changes_btn"
:title="'Save changes to ' + row.item.name" :title="`保存对 ${row.item.name} 的更改`"
@click="saveChanges(row.item)"> @click="saveChanges(row.item)">
<FontAwesomeIcon :icon="faSave" /> <FontAwesomeIcon :icon="faSave" />
{{ titleSave }} {{ titleSave }}
...@@ -130,7 +130,7 @@ ...@@ -130,7 +130,7 @@
v-if="row.item.can_user_modify && !row.item.deleted" v-if="row.item.can_user_modify && !row.item.deleted"
size="sm" size="sm"
class="lib-btn edit_library_btn save_library_btn" class="lib-btn edit_library_btn save_library_btn"
:title="`Edit ${row.item.name}`" :title="`编辑 ${row.item.name}`"
@click="toggleEditMode(row.item)"> @click="toggleEditMode(row.item)">
<div v-if="!row.item.editMode"> <div v-if="!row.item.editMode">
<FontAwesomeIcon :icon="faPencilAlt" /> <FontAwesomeIcon :icon="faPencilAlt" />
...@@ -146,17 +146,17 @@ ...@@ -146,17 +146,17 @@
v-if="currentUser && currentUser.is_admin && !row.item.deleted" v-if="currentUser && currentUser.is_admin && !row.item.deleted"
size="sm" size="sm"
class="lib-btn permission_library_btn" class="lib-btn permission_library_btn"
:title="'Permissions of ' + row.item.name" :title="`${row.item.name} 的权限`"
:to="{ path: `/libraries/${row.item.id}/permissions` }"> :to="{ path: `/libraries/${row.item.id}/permissions` }">
<FontAwesomeIcon :icon="faUsers" /> <FontAwesomeIcon :icon="faUsers" />
Manage 管理
</BButton> </BButton>
<BButton <BButton
v-if="currentUser && currentUser.is_admin && row.item.editMode && !row.item.deleted" v-if="currentUser && currentUser.is_admin && row.item.editMode && !row.item.deleted"
size="sm" size="sm"
class="lib-btn delete-lib-btn" class="lib-btn delete-lib-btn"
:title="`Delete ${row.item.name}`" :title="`删除 ${row.item.name}`"
@click="deleteLibrary(row.item)"> @click="deleteLibrary(row.item)">
<FontAwesomeIcon :icon="faTrash" /> <FontAwesomeIcon :icon="faTrash" />
{{ titleDelete }} {{ titleDelete }}
...@@ -349,7 +349,7 @@ export default { ...@@ -349,7 +349,7 @@ export default {
this.services.saveChanges( this.services.saveChanges(
item, item,
() => { () => {
Toast.success("Changes to library saved"); Toast.success("对文库的更改已保存");
}, },
(error) => onError(error), (error) => onError(error),
); );
...@@ -359,7 +359,7 @@ export default { ...@@ -359,7 +359,7 @@ export default {
this.services.deleteLibrary( this.services.deleteLibrary(
deletedLib, deletedLib,
() => { () => {
Toast.success("Library has been marked deleted."); Toast.success("文库已被标记为已删除。");
deletedLib.deleted = true; deletedLib.deleted = true;
this.toggleEditMode(deletedLib); this.toggleEditMode(deletedLib);
if (!this.includeDeleted) { if (!this.includeDeleted) {
...@@ -393,7 +393,7 @@ export default { ...@@ -393,7 +393,7 @@ export default {
item, item,
() => { () => {
item.deleted = false; item.deleted = false;
Toast.success("Library has been undeleted."); Toast.success("文库已被取消删除。");
this.refreshTable(); this.refreshTable();
}, },
(error) => onError(error), (error) => onError(error),
...@@ -412,7 +412,7 @@ export default { ...@@ -412,7 +412,7 @@ export default {
this.newLibraryForm.description = ""; this.newLibraryForm.description = "";
this.newLibraryForm.synopsis = ""; this.newLibraryForm.synopsis = "";
this.isNewLibFormVisible = false; this.isNewLibFormVisible = false;
Toast.success("Library created."); Toast.success("文库已创建。");
}, },
(error) => onError(error), (error) => onError(error),
); );
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<!-- eslint-enable vue/no-v-html --> <!-- eslint-enable vue/no-v-html -->
<span :title="text">...</span> <span :title="text">...</span>
<a class="more-text-btn" href="javascript:void(0)" @click="toggleDescriptionExpand">(more) </a> <a class="more-text-btn" href="javascript:void(0)" @click="toggleDescriptionExpand">(更多) </a>
</div> </div>
<!-- Regular --> <!-- Regular -->
<div v-else> <div v-else>
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
class="more-text-btn" class="more-text-btn"
href="javascript:void(0)" href="javascript:void(0)"
@click="toggleDescriptionExpand"> @click="toggleDescriptionExpand">
(less) (收起)
</a> </a>
</div> </div>
</div> </div>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<BButton <BButton
v-b-modal.details-modal v-b-modal.details-modal
class="details-btn" class="details-btn"
title="Show location details" title="显示位置详情"
data-testid="loc-details-btn"> data-testid="loc-details-btn">
<FontAwesomeIcon :icon="faInfoCircle" /> <FontAwesomeIcon :icon="faInfoCircle" />
{{ detailsCaption }} {{ detailsCaption }}
......
<template> <template>
<b-breadcrumb> <b-breadcrumb>
<b-breadcrumb-item title="Return to the list of libraries" :to="{ path: `/libraries` }"> <b-breadcrumb-item title="返回文库列表" :to="{ path: `/libraries` }">
Libraries 文库
</b-breadcrumb-item> </b-breadcrumb-item>
<template v-for="path_item in full_path"> <template v-for="path_item in full_path">
<b-breadcrumb-item <b-breadcrumb-item
:key="path_item[0]" :key="path_item[0]"
:title="isCurrentId(path_item[0]) ? `You are here` : `Return to this folder`" :title="isCurrentId(path_item[0]) ? `您在此处` : `返回此文件夹`"
:active="isCurrentId(path_item[0])" :active="isCurrentId(path_item[0])"
:to="{ path: `/libraries/folders/${path_item[0]}` }" :to="{ path: `/libraries/folders/${path_item[0]}` }"
href="#" href="#"
......
...@@ -44,10 +44,9 @@ ...@@ -44,10 +44,9 @@
<strong>{{ localize("Loading...") }}</strong> <strong>{{ localize("Loading...") }}</strong>
</div> </div>
<div v-else class="empty-folder-message"> <div v-else class="empty-folder-message">
This folder is either empty or you do not have proper access permissions to see the contents. If you 此文件夹要么为空,要么您没有查看其内容的访问权限。如果您预期有内容显示,请查阅
expected something to show up please consult the
<a href="https://galaxyproject.org/data-libraries/#permissions" target="_blank"> <a href="https://galaxyproject.org/data-libraries/#permissions" target="_blank">
library security wikipage 文库安全维基页面
</a> </a>
</div> </div>
</template> </template>
...@@ -55,8 +54,8 @@ ...@@ -55,8 +54,8 @@
<!-- Name --> <!-- Name -->
<template v-slot:cell(name)="row"> <template v-slot:cell(name)="row">
<div class="d-flex flex-gapx-1 align-items-center"> <div class="d-flex flex-gapx-1 align-items-center">
<FontAwesomeIcon v-if="row.item.type === 'folder'" :icon="faFolder" title="Folder" fixed-width /> <FontAwesomeIcon v-if="row.item.type === 'folder'" :icon="faFolder" title="文件夹" fixed-width />
<FontAwesomeIcon v-else-if="row.item.type === 'file'" :icon="faFile" title="Dataset" fixed-width /> <FontAwesomeIcon v-else-if="row.item.type === 'file'" :icon="faFile" title="数据集" fixed-width />
<div v-if="row.item.editMode" @click="onRowClick"> <div v-if="row.item.editMode" @click="onRowClick">
<textarea <textarea
...@@ -130,7 +129,7 @@ ...@@ -130,7 +129,7 @@
<!-- eslint-enable vue/no-v-html --> <!-- eslint-enable vue/no-v-html -->
<span :title="getMessage(row.item)"> ...</span> <span :title="getMessage(row.item)"> ...</span>
<a class="more-text-btn" href="javascript:void(0)" @click="expandMessage(row.item)"> <a class="more-text-btn" href="javascript:void(0)" @click="expandMessage(row.item)">
(more) (更多)
</a> </a>
</div> </div>
<!-- eslint-disable-next-line vue/no-v-html --> <!-- eslint-disable-next-line vue/no-v-html -->
...@@ -159,12 +158,12 @@ ...@@ -159,12 +158,12 @@
</template> </template>
<template v-slot:cell(is_unrestricted)="row"> <template v-slot:cell(is_unrestricted)="row">
<FontAwesomeIcon v-if="row.item.is_unrestricted" title="Unrestricted dataset" :icon="faGlobe" /> <FontAwesomeIcon v-if="row.item.is_unrestricted" title="不受限制的数据集" :icon="faGlobe" />
<FontAwesomeIcon v-else-if="row.item.deleted" title="Marked deleted" :icon="faBan" /> <FontAwesomeIcon v-else-if="row.item.deleted" title="已标记删除" :icon="faBan" />
<FontAwesomeIcon v-else-if="row.item.is_private" title="Private dataset" :icon="faKey" /> <FontAwesomeIcon v-else-if="row.item.is_private" title="私有数据集" :icon="faKey" />
<FontAwesomeIcon <FontAwesomeIcon
v-else-if="row.item.is_private === false && row.item.is_unrestricted === false" v-else-if="row.item.is_private === false && row.item.is_unrestricted === false"
title="Restricted dataset" title="受限数据集"
:icon="faShieldAlt" /> :icon="faShieldAlt" />
</template> </template>
...@@ -172,18 +171,18 @@ ...@@ -172,18 +171,18 @@
<div v-if="row.item.editMode"> <div v-if="row.item.editMode">
<button <button
class="primary-button btn-sm permission_folder_btn save_folder_btn" class="primary-button btn-sm permission_folder_btn save_folder_btn"
:title="'save ' + row.item.name" :title="`保存 ${row.item.name}`"
@click.stop="row.item.isNewFolder ? createNewFolder(row.item) : saveChanges(row.item)"> @click.stop="row.item.isNewFolder ? createNewFolder(row.item) : saveChanges(row.item)">
<FontAwesomeIcon :icon="faSave" /> <FontAwesomeIcon :icon="faSave" />
Save 保存
</button> </button>
<button <button
class="primary-button btn-sm permission_folder_btn" class="primary-button btn-sm permission_folder_btn"
title="Discard Changes" title="放弃更改"
@click.stop="toggleEditMode(row.item)"> @click.stop="toggleEditMode(row.item)">
<FontAwesomeIcon :icon="faTimes" /> <FontAwesomeIcon :icon="faTimes" />
Cancel 取消
</button> </button>
</div> </div>
<div v-else> <div v-else>
...@@ -193,31 +192,31 @@ ...@@ -193,31 +192,31 @@
data-placement="top" data-placement="top"
size="sm" size="sm"
class="lib-btn permission_folder_btn edit_folder_btn" class="lib-btn permission_folder_btn edit_folder_btn"
:title="'Edit ' + row.item.name" :title="`编辑 ${row.item.name}`"
@click.stop="toggleEditMode(row.item)"> @click.stop="toggleEditMode(row.item)">
<FontAwesomeIcon :icon="faPencilAlt" /> <FontAwesomeIcon :icon="faPencilAlt" />
Edit 编辑
</BButton> </BButton>
<BButton <BButton
v-if="currentUser?.is_admin" v-if="currentUser?.is_admin"
size="sm" size="sm"
class="lib-btn permission_lib_btn" class="lib-btn permission_lib_btn"
:title="`Permissions of ${row.item.name}`" :title="`${row.item.name} 的权限`"
:to="{ path: `${navigateToPermission(row.item)}` }" :to="{ path: `${navigateToPermission(row.item)}` }"
@click.stop> @click.stop>
<FontAwesomeIcon :icon="faUsers" /> <FontAwesomeIcon :icon="faUsers" />
Manage 管理
</BButton> </BButton>
<button <button
v-if="row.item.deleted" v-if="row.item.deleted"
:title="'Undelete ' + row.item.name" :title="`取消删除 ${row.item.name}`"
class="lib-btn primary-button btn-sm undelete_dataset_btn" class="lib-btn primary-button btn-sm undelete_dataset_btn"
type="button" type="button"
@click.stop="undelete(row.item, folder_id)"> @click.stop="undelete(row.item, folder_id)">
<FontAwesomeIcon :icon="faUnlock" /> <FontAwesomeIcon :icon="faUnlock" />
Undelete 取消删除
</button> </button>
</div> </div>
</template> </template>
...@@ -253,7 +252,7 @@ ...@@ -253,7 +252,7 @@
type="number" /> type="number" />
</td> </td>
<td class="text-muted ml-1 paginator-text"> <td class="text-muted ml-1 paginator-text">
<span class="pagination-total-pages-text">per page, {{ total_rows }} total</span> <span class="pagination-total-pages-text">每页,共 {{ total_rows }} 条</span>
</td> </td>
</tr> </tr>
</table> </table>
...@@ -600,9 +599,9 @@ export default { ...@@ -600,9 +599,9 @@ export default {
}, },
createNewFolder: function (folder) { createNewFolder: function (folder) {
if (!folder.name) { if (!folder.name) {
Toast.error("Folder's name is missing."); Toast.error("文件夹名称缺失。");
} else if (folder.name.length < 3) { } else if (folder.name.length < 3) {
Toast.warning("Folder name has to be at least 3 characters long."); Toast.warning("文件夹名称长度至少需要 3 个字符。");
} else { } else {
this.services.newFolder( this.services.newFolder(
{ {
...@@ -618,10 +617,10 @@ export default { ...@@ -618,10 +617,10 @@ export default {
folder.isNewFolder = false; folder.isNewFolder = false;
this.refreshTable(); this.refreshTable();
Toast.success("Folder created."); Toast.success("文件夹已创建。");
}, },
() => { () => {
Toast.error("An error occurred."); Toast.error("发生错误。");
}, },
); );
} }
...@@ -678,7 +677,7 @@ export default { ...@@ -678,7 +677,7 @@ export default {
folder.name = new_name; folder.name = new_name;
is_changed = true; is_changed = true;
} else { } else {
Toast.warning("Folder name has to be at least 3 characters long."); Toast.warning("文件夹名称长度至少需要 3 个字符。");
return; return;
} }
} }
...@@ -691,7 +690,7 @@ export default { ...@@ -691,7 +690,7 @@ export default {
this.services.updateFolder( this.services.updateFolder(
folder, folder,
() => { () => {
Toast.success("Changes to folder saved."); Toast.success("对文件夹的更改已保存。");
folder.editMode = false; folder.editMode = false;
this.refreshTable(); this.refreshTable();
}, },
...@@ -699,12 +698,12 @@ export default { ...@@ -699,12 +698,12 @@ export default {
if (error.data && error.data.err_msg) { if (error.data && error.data.err_msg) {
Toast.error(error.data.err_msg); Toast.error(error.data.err_msg);
} else { } else {
Toast.error("An error occurred while attempting to update the folder."); Toast.error("尝试更新文件夹时发生错误。");
} }
}, },
); );
} else { } else {
Toast.info("Nothing has changed."); Toast.info("没有任何更改。");
} }
}, },
}, },
......
...@@ -5,46 +5,46 @@ ...@@ -5,46 +5,46 @@
<!-- Toolbar --> <!-- Toolbar -->
<BButton <BButton
title="Download dataset" title="下载数据集"
class="mr-1 mb-2" class="mr-1 mb-2"
data-test-id="download-btn" data-test-id="download-btn"
@click="download(datasetDownloadFormat, dataset_id)"> @click="download(datasetDownloadFormat, dataset_id)">
<FontAwesomeIcon :icon="faDownload" /> <FontAwesomeIcon :icon="faDownload" />
Download 下载
</BButton> </BButton>
<BButton <BButton
title="Import dataset into history" title="将数据集导入历史记录"
class="mr-1 mb-2" class="mr-1 mb-2"
data-test-id="import-history-btn" data-test-id="import-history-btn"
@click="importToHistory"> @click="importToHistory">
<FontAwesomeIcon :icon="faBook" /> <FontAwesomeIcon :icon="faBook" />
to History 导入到历史记录
</BButton> </BButton>
<span v-if="dataset.can_user_modify"> <span v-if="dataset.can_user_modify">
<BButton <BButton
title="Modify library item" title="修改文库项目"
class="mr-1 mb-2" class="mr-1 mb-2"
data-test-id="modify-btn" data-test-id="modify-btn"
@click="isEditMode = true"> @click="isEditMode = true">
<FontAwesomeIcon :icon="faPencilAlt" /> <FontAwesomeIcon :icon="faPencilAlt" />
Modify 修改
</BButton> </BButton>
<BButton <BButton
title="Attempt to detect the format of dataset" title="尝试检测数据集的格式"
class="mr-1 mb-2" class="mr-1 mb-2"
data-test-id="auto-detect-btn" data-test-id="auto-detect-btn"
@click="detectDatatype"> @click="detectDatatype">
<FontAwesomeIcon :icon="faRedo" /> <FontAwesomeIcon :icon="faRedo" />
Auto-detect datatype 自动检测数据类型
</BButton> </BButton>
</span> </span>
<BButton <BButton
v-if="currentUser?.is_admin" v-if="currentUser?.is_admin"
title="Manage permissions" title="管理权限"
class="mr-1 mb-2" class="mr-1 mb-2"
:to="{ :to="{
name: 'LibraryFolderDatasetPermissions', name: 'LibraryFolderDatasetPermissions',
...@@ -52,16 +52,16 @@ ...@@ -52,16 +52,16 @@
}" }"
data-test-id="permissions-btn"> data-test-id="permissions-btn">
<FontAwesomeIcon :icon="faUsers" /> <FontAwesomeIcon :icon="faUsers" />
Permissions 权限
</BButton> </BButton>
</div> </div>
<div v-if="dataset.is_unrestricted" data-test-id="unrestricted-msg"> <div v-if="dataset.is_unrestricted" data-test-id="unrestricted-msg">
This dataset is unrestricted so everybody with the link can access it. 此数据集不受限制,任何拥有链接的人都可以访问。
<CopyToClipboard <CopyToClipboard
message="A link to current dataset was copied to your clipboard" message="当前数据集的链接已复制到您的剪贴板"
:text="currentRouteName" :text="currentRouteName"
title="Copy link to this dataset " /> title="复制此数据集的链接" />
</div> </div>
<!-- Table --> <!-- Table -->
...@@ -124,12 +124,12 @@ ...@@ -124,12 +124,12 @@
<div v-if="isEditMode"> <div v-if="isEditMode">
<BButton class="mr-1 mb-2" @click="isEditMode = false"> <BButton class="mr-1 mb-2" @click="isEditMode = false">
<FontAwesomeIcon :icon="faTimes" /> <FontAwesomeIcon :icon="faTimes" />
Cancel 取消
</BButton> </BButton>
<BButton class="mr-1 mb-2" @click="updateDataset"> <BButton class="mr-1 mb-2" @click="updateDataset">
<FontAwesomeIcon :icon="faSave" /> <FontAwesomeIcon :icon="faSave" />
Save 保存
</BButton> </BButton>
</div> </div>
...@@ -236,7 +236,7 @@ export default { ...@@ -236,7 +236,7 @@ export default {
{ file_ext: "auto" }, { file_ext: "auto" },
(response) => { (response) => {
this.populateDatasetDetailsTable(response); this.populateDatasetDetailsTable(response);
Toast.success("Changes to library dataset saved."); Toast.success("对文库数据集的更改已保存。");
}, },
(error) => Toast.error(error), (error) => Toast.error(error),
); );
...@@ -248,7 +248,7 @@ export default { ...@@ -248,7 +248,7 @@ export default {
this.datasetChanges, this.datasetChanges,
(response) => { (response) => {
this.populateDatasetDetailsTable(response); this.populateDatasetDetailsTable(response);
Toast.success("Changes to library dataset saved."); Toast.success("对文库数据集的更改已保存。");
}, },
(error) => Toast.error(error), (error) => Toast.error(error),
); );
......
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
<b-button <b-button
data-toggle="tooltip" data-toggle="tooltip"
data-placement="top" data-placement="top"
title="Go to Dataset Details" title="转到数据集详情"
variant="secondary" variant="secondary"
type="button" type="button"
:href="`${root}libraries/folders/${folder_id}/dataset/${dataset_id}`"> :href="`${root}libraries/folders/${folder_id}/dataset/${dataset_id}`">
<FontAwesomeIcon :icon="faFile" /> <FontAwesomeIcon :icon="faFile" />
&nbsp;Dataset Details &nbsp;数据集详情
</b-button> </b-button>
<PermissionsHeader :name="dataset.name" /> <PermissionsHeader :name="dataset.name" />
</div> </div>
...@@ -22,29 +22,28 @@ ...@@ -22,29 +22,28 @@
:id="dataset_id" :id="dataset_id"
:permission_type="modify_item_roles_type" :permission_type="modify_item_roles_type"
:initial_value="modify_item_roles" :initial_value="modify_item_roles"
title="Roles that can modify the library item" title="可以修改文库项目的角色"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
alert="User with <strong>any</strong> of these roles can modify name, metadata, and other information about this library item." alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以修改此文库项目的名称、元数据和其他信息。"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<hr class="my-4" /> <hr class="my-4" />
<h2 class="text-center">数据集相关权限</h2> <h2 class="text-center">数据集相关权限</h2>
<div class="alert alert-warning text-center"> <div class="alert alert-warning text-center">
Changes made below will affect <strong>every</strong> library item that was created from this dataset 下方所做的更改将影响由该数据集创建<strong>所有</strong>文库项目,以及该数据集所属的每个历史记录。
and also every history this dataset is part of.
</div> </div>
<p v-if="is_unrestricted" class="text-center"> <p v-if="is_unrestricted" class="text-center">
You can 您可以将
<strong class="make-private" @click="toggleDatasetPrivacy(true)"> <strong class="make-private" @click="toggleDatasetPrivacy(true)">
<a id="make-private" href="javascript:void(0)">make this dataset private</a> <a id="make-private" href="javascript:void(0)">使此数据集仅对您私有</a>
</strong> </strong>
to you. 。
</p> </p>
<p v-else class="text-center"> <p v-else class="text-center">
You can 您可以
<strong class="remove-restrictions" @click="toggleDatasetPrivacy(false)"> <strong class="remove-restrictions" @click="toggleDatasetPrivacy(false)">
<a href="javascript:void(0)">remove all access restrictions</a> <a href="javascript:void(0)">移除此数据集的所有访问限制</a>
</strong> </strong>
on this dataset. 。
</p> </p>
<PermissionsInputField <PermissionsInputField
...@@ -54,20 +53,20 @@ ...@@ -54,20 +53,20 @@
:permission_type="access_dataset_roles_type" :permission_type="access_dataset_roles_type"
:initial_value="access_dataset_roles" :initial_value="access_dataset_roles"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
title="Roles that can access the dataset" title="可以访问数据集的角色"
alert="User has to have <strong>all these roles</strong> in order to access this dataset. alert="用户必须拥有<strong>所有这些角色</strong>才能访问此数据集。
Users without access permission <strong>cannot</strong> have other permissions on this dataset. 没有访问权限的用户<strong>不能</strong>拥有此数据集的其他权限。
If there are no access roles set on the dataset it is considered <strong>unrestricted</strong>." 如果数据集上没有设置访问角色,则视为<strong>不受限制</strong>。"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<b-button <b-button
data-toggle="tooltip" data-toggle="tooltip"
data-placement="top" data-placement="top"
title="Save modifications" title="保存修改"
class="toolbtn_save_permissions" class="toolbtn_save_permissions"
variant="secondary" variant="secondary"
@click="postPermissions"> @click="postPermissions">
<FontAwesomeIcon :icon="faSave" /> <FontAwesomeIcon :icon="faSave" />
&nbsp;Save &nbsp;保存
</b-button> </b-button>
</b-container> </b-container>
</div> </div>
...@@ -157,15 +156,15 @@ export default { ...@@ -157,15 +156,15 @@ export default {
Toast.success( Toast.success(
`${ `${
isMakePrivate isMakePrivate
? "The dataset is now private to you." ? "该数据集现在仅对您私有。"
: "Access to this dataset is now unrestricted." : "此数据集的访问现在不受限制。"
}`, }`,
); );
this.assignFetchedPermissions(fetched_permissions); this.assignFetchedPermissions(fetched_permissions);
this.$refs.access_field.assignValue(this.access_dataset_roles); this.$refs.access_field.assignValue(this.access_dataset_roles);
}, },
(error) => { (error) => {
Toast.error("An error occurred while attempting to set folder permissions."); Toast.error("尝试设置文库权限时发生错误。");
console.error(error); console.error(error);
}, },
); );
...@@ -179,11 +178,11 @@ export default { ...@@ -179,11 +178,11 @@ export default {
this.dataset_id, this.dataset_id,
[{ "access_ids[]": this.access_dataset_roles }, { "modify_ids[]": this.modify_item_roles }], [{ "access_ids[]": this.access_dataset_roles }, { "modify_ids[]": this.modify_item_roles }],
(fetched_permissions) => { (fetched_permissions) => {
Toast.success("Permissions saved."); Toast.success("权限已保存。");
this.assignFetchedPermissions(fetched_permissions); this.assignFetchedPermissions(fetched_permissions);
}, },
(error) => { (error) => {
Toast.error("An error occurred while attempting to set folder permissions."); Toast.error("尝试设置文库权限时发生错误。");
console.error(error); console.error(error);
}, },
); );
......
...@@ -11,9 +11,8 @@ ...@@ -11,9 +11,8 @@
:permission_type="add_type" :permission_type="add_type"
:initial_value="add_library_item_role_list" :initial_value="add_library_item_role_list"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
title="Roles that can add items to this folder" title="可以向此文件夹添加项目的角色"
alert="User with <strong>any</strong> of these roles can add items to this folder (folders and alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以向此文件夹添加项目(文件夹和数据集)。"
datasets)."
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<PermissionsInputField <PermissionsInputField
v-if="modify_folder_role_list" v-if="modify_folder_role_list"
...@@ -21,18 +20,18 @@ ...@@ -21,18 +20,18 @@
:permission_type="modify_type" :permission_type="modify_type"
:initial_value="modify_folder_role_list" :initial_value="modify_folder_role_list"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
title="Roles that can modify this folder" title="可以修改此文件夹的角色"
alert="User with <strong>any</strong> of these roles can modify this folder (name, etc.)." alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以修改此文件夹(名称等)。"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<button <button
data-toggle="tooltip" data-toggle="tooltip"
data-placement="top" data-placement="top"
title="Save modifications" title="保存修改"
class="btn btn-secondary toolbtn_save_permissions primary-button" class="btn btn-secondary toolbtn_save_permissions primary-button"
type="button" type="button"
@click="postPermissions"> @click="postPermissions">
<FontAwesomeIcon :icon="faSave" /> <FontAwesomeIcon :icon="faSave" />
&nbsp;Save &nbsp;保存
</button> </button>
</div> </div>
</b-container> </b-container>
...@@ -101,11 +100,11 @@ export default { ...@@ -101,11 +100,11 @@ export default {
this.folder_id, this.folder_id,
[{ "add_ids[]": this.add_library_item_role_list }, { "modify_ids[]": this.modify_folder_role_list }], [{ "add_ids[]": this.add_library_item_role_list }, { "modify_ids[]": this.modify_folder_role_list }],
(fetched_permissions) => { (fetched_permissions) => {
Toast.success("Permissions saved."); Toast.success("权限已保存。");
this.permissions = fetched_permissions; this.permissions = fetched_permissions;
}, },
(error) => { (error) => {
Toast.error("An error occurred while attempting to set folder permissions."); Toast.error("尝试设置文件夹权限时发生错误。");
console.error(error); console.error(error);
}, },
); );
......
...@@ -2,11 +2,10 @@ ...@@ -2,11 +2,10 @@
<div> <div>
<div class="text-center"> <div class="text-center">
<b-alert v-if="is_admin" show variant="warning"> <b-alert v-if="is_admin" show variant="warning">
You are logged in as an <strong>administrator</strong> therefore you can manage any folder on this 您以<strong>管理员</strong>身份登录,因此可以管理此 Galaxy 实例上的任何文件夹。
Galaxy instance.
</b-alert> </b-alert>
<b-alert v-else show variant="warning"> <b-alert v-else show variant="warning">
You can assign any number of roles to any of the following permission types. 您可以为以下任何权限类型分配任意数量的角色。
</b-alert> </b-alert>
</div> </div>
</div> </div>
......
...@@ -18,13 +18,12 @@ import SingleItemSelector from "@/components/SingleItemSelector.vue"; ...@@ -18,13 +18,12 @@ import SingleItemSelector from "@/components/SingleItemSelector.vue";
const autoExtension = { const autoExtension = {
id: "auto", id: "auto",
extension: "auto", extension: "auto",
text: "Auto-detect", text: "自动检测",
description: `This system will try to detect the file type automatically. description: `系统将尝试自动检测文件类型。
If your file is not detected properly as one of the known formats, 如果您的文件未能被正确识别为已知格式之一,
it most likely means that it has some format problems (e.g., different 这很可能意味着它存在某些格式问题(例如,不同行有不同数量的列)。
number of columns on different rows). You can still coerce the system 您仍然可以强制系统将数据设置为您认为应有的格式。
to set your data to the format you think it should be. 您也可以上传压缩文件,系统会自动解压`,
You can also upload compressed files, which will automatically be decompressed`,
descriptionUrl: "", descriptionUrl: "",
}; };
...@@ -80,7 +79,7 @@ const filesMode = computed(() => { ...@@ -80,7 +79,7 @@ const filesMode = computed(() => {
return activeTab.value === 0; return activeTab.value === 0;
}); });
const title = computed(() => { const title = computed(() => {
return pathMode.value ? "Please enter paths to import" : "Please select folders or files"; return pathMode.value ? "请输入要导入的路径" : "请选择文件夹或文件";
}); });
const importDisable = computed(() => { const importDisable = computed(() => {
if (importing.value) { if (importing.value) {
...@@ -96,7 +95,7 @@ const importDisable = computed(() => { ...@@ -96,7 +95,7 @@ const importDisable = computed(() => {
const okButtonText = computed(() => { const okButtonText = computed(() => {
const length = currentValue.value?.length || 0; const length = currentValue.value?.length || 0;
return length === 0 ? "Import" : `Import ${length} dataset${length > 1 ? "s" : ""}`; return length === 0 ? "导入" : `导入 ${length} 个数据集`;
}); });
async function fetchOptions() { async function fetchOptions() {
...@@ -115,7 +114,7 @@ async function fetchOptions() { ...@@ -115,7 +114,7 @@ async function fetchOptions() {
options.value = mapDataToOptions(data); options.value = mapDataToOptions(data);
if (error) { if (error) {
errorMessage.value = errorMessageAsString(error, "Failed to load directories."); errorMessage.value = errorMessageAsString(error, "无法加载目录。");
} }
optionsLoading.value = false; optionsLoading.value = false;
...@@ -188,7 +187,7 @@ async function onImport() { ...@@ -188,7 +187,7 @@ async function onImport() {
} }
if (validPaths.length === 0) { if (validPaths.length === 0) {
Toast.error("Please provide a valid path"); Toast.error("请提供有效的路径");
return; return;
} else { } else {
importFileOrFolder(validPaths, "admin_path"); importFileOrFolder(validPaths, "admin_path");
...@@ -262,19 +261,19 @@ watch( ...@@ -262,19 +261,19 @@ watch(
<template> <template>
<BModal :title="title" visible scrollable content-class="directory-dataset-picker" @hide="emit('onClose')"> <BModal :title="title" visible scrollable content-class="directory-dataset-picker" @hide="emit('onClose')">
<GTabs v-if="!pathMode" v-model="activeTab" fill pills> <GTabs v-if="!pathMode" v-model="activeTab" fill pills>
<GTab title="Choose Files" /> <GTab title="选择文件" />
<GTab title="Choose Folders" /> <GTab title="选择文件夹" />
</GTabs> </GTabs>
<BAlert v-if="filesMode" show class="mt-2"> <BAlert v-if="filesMode" show class="mt-2">
All files you select will be imported into the current folder ignoring their folder structure. 您选择的所有文件都将导入当前文件夹,忽略其文件夹结构。
</BAlert> </BAlert>
<BAlert v-else-if="!filesMode" show class="mt-2"> <BAlert v-else-if="!filesMode" show class="mt-2">
All files within the selected folders and their sub-folders will be imported into the current folder. 所选文件夹及其子文件夹中的所有文件都将导入当前文件夹。
</BAlert> </BAlert>
<BAlert v-else-if="pathMode" show class="mt-2"> <BAlert v-else-if="pathMode" show class="mt-2">
All files within the given folders and their sub-folders will be imported into the current folder. 给定文件夹及其子文件夹中的所有文件都将导入当前文件夹。
</BAlert> </BAlert>
<BFormCheckboxGroup v-model="preserveOptions" switches class="directory-dataset-picker-options"> <BFormCheckboxGroup v-model="preserveOptions" switches class="directory-dataset-picker-options">
...@@ -283,14 +282,14 @@ watch( ...@@ -283,14 +282,14 @@ watch(
<BFormCheckbox value="space_to_tab">将空格转换为制表符</BFormCheckbox> <BFormCheckbox value="space_to_tab">将空格转换为制表符</BFormCheckbox>
<BFormCheckbox value="tags_from_filenames">根据文件名标记数据集</BFormCheckbox> <BFormCheckbox value="tags_from_filenames">根据文件名标记数据集</BFormCheckbox>
<BFormCheckbox v-if="!filesMode || pathMode" value="preserve_directory_structure"> <BFormCheckbox v-if="!filesMode || pathMode" value="preserve_directory_structure">
Preserve directory structure 保留目录结构
</BFormCheckbox> </BFormCheckbox>
</BFormCheckboxGroup> </BFormCheckboxGroup>
<hr /> <hr />
You can set database/build and extension type for all imported datasets at once: 您可以同时为所有导入的数据集设置数据库/参考基因组和扩展类型:
<BFormGroup label="Database/Build"> <BFormGroup label="数据库/参考基因组">
<SingleItemSelector <SingleItemSelector
:current-item="selectedDbKey" :current-item="selectedDbKey"
collection-name="DB Keys" collection-name="DB Keys"
...@@ -298,7 +297,7 @@ watch( ...@@ -298,7 +297,7 @@ watch(
@update:selected-item="onSelectDbKey" /> @update:selected-item="onSelectDbKey" />
</BFormGroup> </BFormGroup>
<BFormGroup label="Extension"> <BFormGroup label="扩展名">
<SingleItemSelector <SingleItemSelector
:current-item="selectedExtension" :current-item="selectedExtension"
collection-name="Extensions" collection-name="Extensions"
...@@ -314,10 +313,10 @@ watch( ...@@ -314,10 +313,10 @@ watch(
v-if="pathMode" v-if="pathMode"
id="import_paths" id="import_paths"
v-model="paths" v-model="paths"
placeholder="Absolute paths (or paths relative to Galaxy root) separated by newline" placeholder="绝对路径(或相对于 Galaxy 根的路径),用换行分隔"
rows="5" /> rows="5" />
<BAlert v-else-if="optionsLoading" variant="info" show> <BAlert v-else-if="optionsLoading" variant="info" show>
<LoadingSpan message="Loading directories" /> <LoadingSpan message="正在加载目录" />
</BAlert> </BAlert>
<BAlert v-else-if="errorMessage" variant="danger" show> <BAlert v-else-if="errorMessage" variant="danger" show>
{{ errorMessage }} {{ errorMessage }}
......
...@@ -179,7 +179,7 @@ async function downloadData(format: string) { ...@@ -179,7 +179,7 @@ async function downloadData(format: string) {
const { datasets, folders } = await findCheckedItems(); const { datasets, folders } = await findCheckedItems();
if (props.selected.length === 0) { if (props.selected.length === 0) {
Toast.info("You must select at least one dataset to download"); Toast.info("您必须至少选择一个数据集才能下载");
return; return;
} }
...@@ -246,7 +246,7 @@ async function addDatasets( ...@@ -246,7 +246,7 @@ async function addDatasets(
progress.value = true; progress.value = true;
progressStatus.total = selectedDatasets.length; progressStatus.total = selectedDatasets.length;
progressNote.value = "Adding datasets to the folder"; progressNote.value = "正在向文件夹添加数据集";
emit("setBusy", true); emit("setBusy", true);
...@@ -265,15 +265,9 @@ async function addDatasets( ...@@ -265,15 +265,9 @@ async function addDatasets(
} }
if (progressStatus.errorCount > 0) { if (progressStatus.errorCount > 0) {
progressNote.value = `Added ${progressStatus.okCount} dataset${ progressNote.value = `已向文件夹添加 ${progressStatus.okCount} 个数据集,但添加 ${progressStatus.errorCount} 个数据集失败`;
progressStatus.okCount > 1 ? "s" : ""
}, but failed to add ${progressStatus.errorCount} dataset${
progressStatus.errorCount > 1 ? "s" : ""
} to the folder`;
} else { } else {
progressNote.value = `Added ${progressStatus.okCount} dataset${ progressNote.value = `已向文件夹添加 ${progressStatus.okCount} 个数据集`;
progressStatus.okCount > 1 ? "s" : ""
} to the folder`;
} }
emit("setBusy", false); emit("setBusy", false);
...@@ -316,7 +310,7 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea ...@@ -316,7 +310,7 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea
class="mr-1 btn btn-secondary" class="mr-1 btn btn-secondary"
:to="{ path: `/libraries` }" :to="{ path: `/libraries` }"
data-toggle="tooltip" data-toggle="tooltip"
title="Go to libraries list"> title="转到文库列表">
<FontAwesomeIcon :icon="faHome" /> <FontAwesomeIcon :icon="faHome" />
</BButton> </BButton>
...@@ -326,12 +320,12 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea ...@@ -326,12 +320,12 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea
<BButton <BButton
v-if="props.canAddLibraryItem" v-if="props.canAddLibraryItem"
title="Create new folder" title="创建新文件夹"
class="add-library-items-folder mr-1" class="add-library-items-folder mr-1"
type="button" type="button"
@click="newFolder"> @click="newFolder">
<FontAwesomeIcon :icon="faPlus" /> <FontAwesomeIcon :icon="faPlus" />
Folder 文件夹
</BButton> </BButton>
<BDropdown <BDropdown
...@@ -342,25 +336,25 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea ...@@ -342,25 +336,25 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea
class="add-library-items-datasets mr-1"> class="add-library-items-datasets mr-1">
<template v-slot:button-content> <template v-slot:button-content>
<FontAwesomeIcon :icon="faPlus" /> <FontAwesomeIcon :icon="faPlus" />
Datasets 数据集
<FontAwesomeIcon :icon="faCaretDown" /> <FontAwesomeIcon :icon="faCaretDown" />
</template> </template>
<BDropdownItem @click="onAddDatasets('history')"> from History </BDropdownItem> <BDropdownItem @click="onAddDatasets('history')"> 来自历史记录 </BDropdownItem>
<BDropdownItem v-if="userLibraryImportDirAvailable" @click="onAddDatasets('userdir')"> <BDropdownItem v-if="userLibraryImportDirAvailable" @click="onAddDatasets('userdir')">
from User Directory 来自用户目录
</BDropdownItem> </BDropdownItem>
<BDropdownDivider v-if="libraryImportDir || allowLibraryPathPaste" /> <BDropdownDivider v-if="libraryImportDir || allowLibraryPathPaste" />
<BDropdownGroup v-if="libraryImportDir || allowLibraryPathPaste" header="Admins Only"> <BDropdownGroup v-if="libraryImportDir || allowLibraryPathPaste" header="仅限管理员">
<BDropdownItem v-if="libraryImportDir" @click="onAddDatasets('importdir')"> <BDropdownItem v-if="libraryImportDir" @click="onAddDatasets('importdir')">
from Import Directory 来自导入目录
</BDropdownItem> </BDropdownItem>
<BDropdownItem v-if="allowLibraryPathPaste" @click="onAddDatasets('path')"> <BDropdownItem v-if="allowLibraryPathPaste" @click="onAddDatasets('path')">
from Path 来自路径
</BDropdownItem> </BDropdownItem>
</BDropdownGroup> </BDropdownGroup>
</BDropdown> </BDropdown>
...@@ -368,45 +362,45 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea ...@@ -368,45 +362,45 @@ function onAddDatasetsDirectory(selectedDatasets: Record<string, string | boolea
<BDropdown v-b-tooltip.top.noninteractive right no-caret class="add-to-history mr-1"> <BDropdown v-b-tooltip.top.noninteractive right no-caret class="add-to-history mr-1">
<template v-slot:button-content> <template v-slot:button-content>
<FontAwesomeIcon :icon="faBook" /> <FontAwesomeIcon :icon="faBook" />
Add to History 添加到历史记录
<FontAwesomeIcon :icon="faCaretDown" /> <FontAwesomeIcon :icon="faCaretDown" />
</template> </template>
<BDropdownItem class="add-to-history-datasets" @click="importToHistoryModal(false)"> <BDropdownItem class="add-to-history-datasets" @click="importToHistoryModal(false)">
as Datasets 作为数据集
</BDropdownItem> </BDropdownItem>
<BDropdownItem class="add-to-history-collection" @click="importToHistoryModal(true)"> <BDropdownItem class="add-to-history-collection" @click="importToHistoryModal(true)">
as a Collection 作为集合
</BDropdownItem> </BDropdownItem>
</BDropdown> </BDropdown>
<div <div
v-if="datasetManipulation" v-if="datasetManipulation"
title="Download items as archive" title="以归档形式下载项目"
class="dropdown dataset-manipulation mr-1"> class="dropdown dataset-manipulation mr-1">
<BButton id="download--btn" type="button" class="primary-button" @click="downloadData('zip')"> <BButton id="download--btn" type="button" class="primary-button" @click="downloadData('zip')">
<FontAwesomeIcon :icon="faDownload" /> <FontAwesomeIcon :icon="faDownload" />
Download 下载
</BButton> </BButton>
</div> </div>
<BButton <BButton
v-if="canDelete" v-if="canDelete"
data-toggle="tooltip" data-toggle="tooltip"
title="Mark items deleted" title="将项目标记为已删除"
class="primary-button toolbtn-bulk-delete logged-dataset-manipulation mr-1" class="primary-button toolbtn-bulk-delete logged-dataset-manipulation mr-1"
type="button" type="button"
@click="deleteSelected"> @click="deleteSelected">
<FontAwesomeIcon :icon="faTrash" /> <FontAwesomeIcon :icon="faTrash" />
Delete 删除
</BButton> </BButton>
<FolderDetails :id="props.folderId" class="mr-1" :metadata="props.metadata" /> <FolderDetails :id="props.folderId" class="mr-1" :metadata="props.metadata" />
<div v-if="canDelete" class="form-check logged-dataset-manipulation mr-1"> <div v-if="canDelete" class="form-check logged-dataset-manipulation mr-1">
<BFormCheckbox :checked="props.includeDeleted" @change="$emit('update:includeDeleted', $event)"> <BFormCheckbox :checked="props.includeDeleted" @change="$emit('update:includeDeleted', $event)">
include deleted 包含已删除
</BFormCheckbox> </BFormCheckbox>
</div> </div>
</div> </div>
......
...@@ -21,7 +21,7 @@ export function deleteSelectedItems(checkedRows, onRemove, refreshTable, refresh ...@@ -21,7 +21,7 @@ export function deleteSelectedItems(checkedRows, onRemove, refreshTable, refresh
var dataset_ids = []; var dataset_ids = [];
var folder_ids = []; var folder_ids = [];
if (checkedRows.length === 0) { if (checkedRows.length === 0) {
Toast.info("You must select at least one item for deletion."); Toast.info("您必须至少选择一个项目才能删除。");
} else { } else {
var template = templateDeletingItemsProgressBar(); var template = templateDeletingItemsProgressBar();
modal.show({ modal.show({
...@@ -81,7 +81,7 @@ function templateDeletingItemsProgressBar() { ...@@ -81,7 +81,7 @@ function templateDeletingItemsProgressBar() {
<div class="progress"> <div class="progress">
<div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0"
aria-valuemax="100" style="width: 00%;"> aria-valuemax="100" style="width: 00%;">
<span class="completion_span">0% Complete</span> <span class="completion_span">完成 0%</span>
</div> </div>
</div>`, </div>`,
); );
...@@ -98,13 +98,13 @@ function chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refresh ...@@ -98,13 +98,13 @@ function chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refresh
if (typeof item_to_delete === "undefined") { if (typeof item_to_delete === "undefined") {
if (chain_call_control.failed_number === 0) { if (chain_call_control.failed_number === 0) {
refreshTableContent(); refreshTableContent();
Toast.success("Selected items were deleted."); Toast.success("所选项目已删除。");
} else if (chain_call_control.failed_number === chain_call_control.total_number) { } else if (chain_call_control.failed_number === chain_call_control.total_number) {
Toast.error( Toast.error(
"There was an error and no items were deleted. Please make sure you have sufficient permissions.", "发生错误,没有任何项目被删除。请确保您拥有足够的权限。",
); );
} else if (chain_call_control.failed_number < chain_call_control.total_number) { } else if (chain_call_control.failed_number < chain_call_control.total_number) {
Toast.warning("Some of the items could not be deleted. Please make sure you have sufficient permissions."); Toast.warning("部分项目无法删除。请确保您拥有足够的权限。");
} }
modal.hide(); modal.hide();
return deleted_items; return deleted_items;
...@@ -135,6 +135,6 @@ function chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refresh ...@@ -135,6 +135,6 @@ function chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refresh
export function updateProgress() { export function updateProgress() {
progress += progressStep; progress += progressStep;
$(".progress-bar-import").width(`${Math.round(progress)}%`); $(".progress-bar-import").width(`${Math.round(progress)}%`);
var txt_representation = `${Math.round(progress)}% Complete`; var txt_representation = `完成 ${Math.round(progress)}%`;
$(".completion_span").text(txt_representation); $(".completion_span").text(txt_representation);
} }
...@@ -20,7 +20,7 @@ function processDownload(url, data, method) { ...@@ -20,7 +20,7 @@ function processDownload(url, data, method) {
.submit() .submit()
.remove(); .remove();
Toast.info("Your download will begin soon."); Toast.info("您的下载即将开始。");
} }
} }
/** /**
......
...@@ -41,7 +41,7 @@ var ImportCollectionModal = Backbone.View.extend({ ...@@ -41,7 +41,7 @@ var ImportCollectionModal = Backbone.View.extend({
showCollectionSelect: function (e) { showCollectionSelect: function (e) {
var checked_items = this.findCheckedItems(); var checked_items = this.findCheckedItems();
if (checked_items.length === 0) { if (checked_items.length === 0) {
Toast.info("You must select some datasets first."); Toast.info("您必须首先选择一些数据集。");
} else { } else {
var template = this.templateCollectionSelectModal(); var template = this.templateCollectionSelectModal();
...@@ -50,7 +50,7 @@ var ImportCollectionModal = Backbone.View.extend({ ...@@ -50,7 +50,7 @@ var ImportCollectionModal = Backbone.View.extend({
.done(() => { .done(() => {
modal.show({ modal.show({
closing_events: true, closing_events: true,
title: "Create History Collection from Datasets", title: "从数据集创建历史集合",
body: template({ body: template({
selected_datasets: checked_items.dataset_ids.length, selected_datasets: checked_items.dataset_ids.length,
histories: this.histories.models, histories: this.histories.models,
...@@ -70,7 +70,7 @@ var ImportCollectionModal = Backbone.View.extend({ ...@@ -70,7 +70,7 @@ var ImportCollectionModal = Backbone.View.extend({
if (typeof response.responseJSON !== "undefined") { if (typeof response.responseJSON !== "undefined") {
Toast.error(response.responseJSON.err_msg); Toast.error(response.responseJSON.err_msg);
} else { } else {
Toast.error("An error occurred."); Toast.error("发生错误。");
} }
}); });
} }
...@@ -96,12 +96,12 @@ var ImportCollectionModal = Backbone.View.extend({ ...@@ -96,12 +96,12 @@ var ImportCollectionModal = Backbone.View.extend({
if (new_history_name !== "") { if (new_history_name !== "") {
this.createNewHistory(new_history_name) this.createNewHistory(new_history_name)
.then((new_history) => { .then((new_history) => {
Toast.success("History created"); Toast.success("历史记录已创建");
this.collectionImport(collection_elements, new_history.id); this.collectionImport(collection_elements, new_history.id);
}) })
.catch((error) => { .catch((error) => {
console.error(error); console.error(error);
Toast.error("An error occurred."); Toast.error("发生错误。");
}); });
} else { } else {
this.select_collection_history = modal.el.querySelector("#library-collection-history-select"); this.select_collection_history = modal.el.querySelector("#library-collection-history-select");
...@@ -129,7 +129,7 @@ var ImportCollectionModal = Backbone.View.extend({ ...@@ -129,7 +129,7 @@ var ImportCollectionModal = Backbone.View.extend({
`<div> <!-- elements selection --> `<div> <!-- elements selection -->
<!-- history selection/creation --> <!-- history selection/creation -->
<div class="library-modal-item"> <div class="library-modal-item">
<h4>Select history</h4> <h4>选择历史记录</h4>
<div class="form-group"> <div class="form-group">
<select id="library-collection-history-select" name="library-collection-history-select" class="form-control"> <select id="library-collection-history-select" name="library-collection-history-select" class="form-control">
<% _.each(histories, function(history) { %> <!-- history select box --> <% _.each(histories, function(history) { %> <!-- history select box -->
...@@ -138,34 +138,34 @@ var ImportCollectionModal = Backbone.View.extend({ ...@@ -138,34 +138,34 @@ var ImportCollectionModal = Backbone.View.extend({
</option> </option>
<% }); %> <% }); %>
</select> </select>
<label>or create new:</label> <label>或创建新的:</label>
<input class="form-control" type="text" name="history_name" value="" placeholder="name of the new history" /> <input class="form-control" type="text" name="history_name" value="" placeholder="新历史记录的名称" />
</div> </div>
</div> </div>
<!-- type selection --> <!-- type selection -->
<div class="library-modal-item"> <div class="library-modal-item">
<h4>Collection type</h4> <h4>集合类型</h4>
<div class="form-group"> <div class="form-group">
<select id="library-collection-type-select" name="library-collection-type-select" class="form-control"> <select id="library-collection-type-select" name="library-collection-type-select" class="form-control">
<option value="list">List</option> <option value="list">列表</option>
<option value="paired">Paired</option> <option value="paired">配对</option>
<option value="list:paired">List of Pairs</option> <option value="list:paired">配对列表</option>
<option value="rules">From Rules</option> <option value="rules">来自规则</option>
</select> </select>
</div> </div>
<h5>Which type to choose?</h5> <h5>该选择哪种类型?</h5>
<dl class="row"> <dl class="row">
<dt class="col-sm-3">List</dt> <dt class="col-sm-3">列表</dt>
<dd class="col-sm-9">Generic collection which groups any number of datasets into a set; similar to file system folder.</dd> <dd class="col-sm-9">将任意数量的数据集分组为集合的通用集合类型;类似于文件系统文件夹。</dd>
<dt class="col-sm-3">Paired</dt> <dt class="col-sm-3">配对</dt>
<dd class="col-sm-9">Simple collection containing exactly two sequence datasets; one reverse and the other forward.</dd> <dd class="col-sm-9">恰好包含两个序列数据集的简单集合;一个反向、一个正向。</dd>
<dt class="col-sm-3">List of Pairs</dt> <dt class="col-sm-3">配对列表</dt>
<dd class="col-sm-9">Advanced collection containing any number of Pairs; imagine as Pair-type collections inside of a List-type collection.</dd> <dd class="col-sm-9">包含任意数量配对的高级集合;可以想象为列表类型集合内的配对类型集合。</dd>
<dt class="col-sm-3">From Rules</dt> <dt class="col-sm-3">来自规则</dt>
<dd class="col-sm-9">Use Galaxy's rule builder to describe collections. This is more of an advanced feature that allows building any number of collections or any type.</dd> <dd class="col-sm-9">使用 Galaxy 的规则构建器描述集合。这是一项更高级的功能,允许构建任意数量或任意类型的集合。</dd>
</dl> </dl>
</div> </div>
</div>`, </div>`,
......
...@@ -30,7 +30,7 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -30,7 +30,7 @@ var ImportDatasetModal = Backbone.View.extend({
var $checkedValues = this.findCheckedItems(); var $checkedValues = this.findCheckedItems();
var template = this.templateImportIntoHistoryModal(); var template = this.templateImportIntoHistoryModal();
if ($checkedValues.length === 0) { if ($checkedValues.length === 0) {
Toast.info("You must select some datasets first."); Toast.info("您必须首先选择一些数据集。");
} else { } else {
var promise = this.fetchUserHistories(); var promise = this.fetchUserHistories();
promise promise
...@@ -55,7 +55,7 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -55,7 +55,7 @@ var ImportDatasetModal = Backbone.View.extend({
if (typeof response.responseJSON !== "undefined") { if (typeof response.responseJSON !== "undefined") {
Toast.error(response.responseJSON.err_msg); Toast.error(response.responseJSON.err_msg);
} else { } else {
Toast.error("An error occurred."); Toast.error("发生错误。");
} }
}); });
} }
...@@ -78,7 +78,7 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -78,7 +78,7 @@ var ImportDatasetModal = Backbone.View.extend({
this.processImportToHistory(new_history.id, new_history.name); this.processImportToHistory(new_history.id, new_history.name);
}) })
.fail((xhr, status, error) => { .fail((xhr, status, error) => {
Toast.error("An error occurred."); Toast.error("发生错误。");
}) })
.always(() => { .always(() => {
modal.enableButton("Import"); modal.enableButton("Import");
...@@ -152,15 +152,15 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -152,15 +152,15 @@ var ImportDatasetModal = Backbone.View.extend({
if (typeof popped_item == "undefined") { if (typeof popped_item == "undefined") {
if (this.options.chain_call_control.failed_number === 0) { if (this.options.chain_call_control.failed_number === 0) {
Toast.success( Toast.success(
"Click here to start analyzing it.", "点击此处开始分析。",
"Selected datasets imported into history", "所选数据集已导入历史记录",
`${getAppRoot()}histories/view?id=${history_id}`, `${getAppRoot()}histories/view?id=${history_id}`,
); );
} else if (this.options.chain_call_control.failed_number === this.options.chain_call_control.total_number) { } else if (this.options.chain_call_control.failed_number === this.options.chain_call_control.total_number) {
Toast.error("There was an error and no datasets were imported into history."); Toast.error("发生错误,没有任何数据集被导入历史记录。");
} else if (this.options.chain_call_control.failed_number < this.options.chain_call_control.total_number) { } else if (this.options.chain_call_control.failed_number < this.options.chain_call_control.total_number) {
Toast.warning( Toast.warning(
"Some of the datasets could not be imported into history. Click this to see what was imported.", "部分数据集无法导入历史记录。点击此处查看已导入的内容。",
"", "",
`${getAppRoot()}histories/view?id=${history_id}`, `${getAppRoot()}histories/view?id=${history_id}`,
); );
...@@ -190,12 +190,12 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -190,12 +190,12 @@ var ImportDatasetModal = Backbone.View.extend({
templateImportIntoHistoryProgressBar: function () { templateImportIntoHistoryProgressBar: function () {
return _.template( return _.template(
`<div class="import_text"> `<div class="import_text">
Importing selected items to history <b><%= _.escape(history_name) %></b> 正在将所选项目导入历史记录 <b><%= _.escape(history_name) %></b>
</div> </div>
<div class="progress"> <div class="progress">
<div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0"
aria-valuemax="100" style="width: 00%;"> aria-valuemax="100" style="width: 00%;">
<span class="completion_span">0% Complete</span> <span class="completion_span">完成 0%</span>
</div> </div>
</div>`, </div>`,
); );
...@@ -207,7 +207,7 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -207,7 +207,7 @@ var ImportDatasetModal = Backbone.View.extend({
<div class="progress"> <div class="progress">
<div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0"
aria-valuemax="100" style="width: 00%;"> aria-valuemax="100" style="width: 00%;">
<span class="completion_span">0% Complete</span> <span class="completion_span">完成 0%</span>
</div> </div>
</div>`, </div>`,
); );
...@@ -216,7 +216,7 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -216,7 +216,7 @@ var ImportDatasetModal = Backbone.View.extend({
return _.template( return _.template(
`<div> `<div>
<div class="library-modal-item"> <div class="library-modal-item">
Select history: 选择历史记录:
<select name="import_to_history" style="width:50%; margin-bottom: 1em; " autofocus> <select name="import_to_history" style="width:50%; margin-bottom: 1em; " autofocus>
<% _.each(histories, function(history) { %> <% _.each(histories, function(history) { %>
<option value="<%= _.escape(history.get("id")) %>"> <option value="<%= _.escape(history.get("id")) %>">
...@@ -226,9 +226,9 @@ var ImportDatasetModal = Backbone.View.extend({ ...@@ -226,9 +226,9 @@ var ImportDatasetModal = Backbone.View.extend({
</select> </select>
</div> </div>
<div class="library-modal-item"> <div class="library-modal-item">
or create new: 或创建新的:
<input type="text" name="history_name" value="" <input type="text" name="history_name" value=""
placeholder="name of the new history" style="width:50%;" /> placeholder="新历史记录的名称" style="width:50%;" />
</div> </div>
</div>`, </div>`,
); );
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
:permission_type="access_type" :permission_type="access_type"
:initial_value="access_library_role_list" :initial_value="access_library_role_list"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
alert="User with <strong>any</strong> of these roles can access this library. If there are no access roles set on the library it is considered <strong>unrestricted</strong>." alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以访问此文库。如果文库上没有设置任何访问角色,则视为<strong>不受限制</strong>。"
title="Roles that can access the library" title="可以访问文库的角色"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<PermissionsInputField <PermissionsInputField
v-if="add_library_item_role_list" v-if="add_library_item_role_list"
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
:initial_value="add_library_item_role_list" :initial_value="add_library_item_role_list"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
class="add_perm" class="add_perm"
alert="User with <strong>any</strong> of these roles can add items to this library (folders and datasets)." alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以向此文库添加项目(文件夹和数据集)。"
title="Roles that can add items to this library" title="可以向此文库添加项目的角色"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<PermissionsInputField <PermissionsInputField
v-if="modify_library_role_list" v-if="modify_library_role_list"
...@@ -28,8 +28,8 @@ ...@@ -28,8 +28,8 @@
:permission_type="modify_type" :permission_type="modify_type"
:initial_value="modify_library_role_list" :initial_value="modify_library_role_list"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
alert="User with <strong>any</strong> of these roles can modify this library (name, synopsis, etc.)." alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以修改此文库(名称、摘要等)。"
title="Roles that can modify this library" title="可以修改此文库的角色"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<PermissionsInputField <PermissionsInputField
v-if="manage_library_role_list" v-if="manage_library_role_list"
...@@ -37,12 +37,12 @@ ...@@ -37,12 +37,12 @@
:permission_type="manage_type" :permission_type="manage_type"
:initial_value="manage_library_role_list" :initial_value="manage_library_role_list"
:api-root-url="apiRootUrl" :api-root-url="apiRootUrl"
alert="User with <strong>any</strong> of these roles can manage this library." alert="拥有这些角色中的<strong>任意一个</strong>的用户都可以管理此文库。"
title="Roles that can manage this library" title="可以管理此文库的角色"
@input="setUserPermissionsPreferences" /> @input="setUserPermissionsPreferences" />
<button title="Save modifications" class="toolbtn_save_permissions" @click="postPermissions"> <button title="保存修改" class="toolbtn_save_permissions" @click="postPermissions">
<FontAwesomeIcon :icon="faSave" /> <FontAwesomeIcon :icon="faSave" />
Save 保存
</button> </button>
</div> </div>
</template> </template>
...@@ -121,11 +121,11 @@ export default { ...@@ -121,11 +121,11 @@ export default {
{ "access_ids[]": this.access_library_role_list }, { "access_ids[]": this.access_library_role_list },
], ],
(fetched_permissions) => { (fetched_permissions) => {
Toast.success("Library permissions saved."); Toast.success("文库权限已保存。");
this.permissions = fetched_permissions; this.permissions = fetched_permissions;
}, },
(error) => { (error) => {
Toast.error("An error occurred while attempting to set folder permissions."); Toast.error("尝试设置文库权限时发生错误。");
console.error(error); console.error(error);
}, },
); );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment