Commit 1d1657e3 authored by wuzekai's avatar wuzekai

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

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