add translation for the rest 7 dialogs

This commit is contained in:
Nriver 2024-07-25 17:14:08 +08:00
parent a8d6e5b1ea
commit da96344690
9 changed files with 218 additions and 87 deletions

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import utils from "../../services/utils.js";
import BasicWidget from "../basic_widget.js";
@ -6,17 +7,16 @@ const TPL = `
<div class="modal-dialog modal-md" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title mr-auto">Password is not set</h5>
<h5 class="modal-title mr-auto">${t("password_not_set.title")}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0;">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Protected notes are encrypted using a user password, but password has not been set yet.
To be able to protect notes, <a class="open-password-options-button" href="javascript:">
click here to open the Options dialog</a> and set your password.
${t("password_not_set.body1")}
${t("password_not_set.body2")}
</div>
</div>
</div>

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import utils from "../../services/utils.js";
import BasicWidget from "../basic_widget.js";
@ -7,8 +8,7 @@ const TPL = `
<div class="modal-content">
<form class="prompt-dialog-form">
<div class="modal-header">
<h5 class="prompt-title modal-title mr-auto">Prompt</h5>
<h5 class="prompt-title modal-title mr-auto">${t("prompt.title")}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
@ -16,7 +16,7 @@ const TPL = `
<div class="modal-body">
</div>
<div class="modal-footer">
<button class="prompt-dialog-ok-button btn btn-primary btn-sm">OK <kbd>enter</kbd></button>
<button class="prompt-dialog-ok-button btn btn-primary btn-sm">${t("prompt.ok")}</button>
</div>
</form>
</div>
@ -69,7 +69,7 @@ export default class PromptDialog extends BasicWidget {
this.shownCb = shown;
this.resolve = callback;
this.$widget.find(".prompt-title").text(title || "Prompt");
this.$widget.find(".prompt-title").text(title || t("prompt.defaultTitle"));
this.$question = $("<label>")
.prop("for", "prompt-dialog-answer")

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import protectedSessionService from "../../services/protected_session.js";
import utils from "../../services/utils.js";
import BasicWidget from "../basic_widget.js";
@ -7,11 +8,11 @@ const TPL = `
<div class="modal-dialog modal-md" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title mr-auto">Protected session</h5>
<h5 class="modal-title mr-auto">${t("protected_session_password.modal_title")}</h5>
<button class="help-button" type="button" data-help-page="Protected-notes" title="Help on Protected notes">?</button>
<button class="help-button" type="button" data-help-page="Protected-notes" title="${t("protected_session_password.help_title")}">?</button>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0;">
<button type="button" class="close" data-dismiss="modal" aria-label="${t("protected_session_password.close_label")}" style="margin-left: 0;">
<span aria-hidden="true">&times;</span>
</button>
</div>
@ -19,13 +20,13 @@ const TPL = `
<div class="modal-body">
<div class="form-group">
<label>
To proceed with requested action you need to start protected session by entering password:
${t("protected_session_password.form_label")}
<input class="form-control protected-session-password" type="password">
</label>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary">Start protected session <kbd>enter</kbd></button>
<button class="btn btn-primary">${t("protected_session_password.start_button")}</button>
</div>
</form>
</div>

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import linkService from '../../services/link.js';
import utils from '../../services/utils.js';
import server from '../../services/server.js';
@ -14,10 +15,10 @@ const TPL = `
<div class="modal-dialog modal-lg modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title mr-auto">Recent changes</h5>
<h5 class="modal-title mr-auto">${t('recent_changes.title')}</h5>
<button class="erase-deleted-notes-now-button btn btn-sm" style="padding: 0 10px">
Erase deleted notes now</button>
${t('recent_changes.erase_notes_button')}</button>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0 !important;">
<span aria-hidden="true">&times;</span>
@ -39,7 +40,7 @@ export default class RecentChangesDialog extends BasicWidget {
server.post('notes/erase-deleted-notes-now').then(() => {
this.refresh();
toastService.showMessage("Deleted notes have been erased.");
toastService.showMessage(t('recent_changes.deleted_notes_message'));
});
});
}
@ -65,7 +66,7 @@ export default class RecentChangesDialog extends BasicWidget {
this.$content.empty();
if (recentChangesRows.length === 0) {
this.$content.append("No changes yet ...");
this.$content.append(t('recent_changes.no_changes_message'));
}
const groupedByDate = this.groupByDate(recentChangesRows);
@ -85,9 +86,9 @@ export default class RecentChangesDialog extends BasicWidget {
if (change.canBeUndeleted) {
const $undeleteLink = $(`<a href="javascript:">`)
.text("undelete")
.text(t('recent_changes.undelete_link'))
.on('click', async () => {
const text = 'Do you want to undelete this note and its sub-notes?';
const text = t('recent_changes.confirm_undelete');
if (await dialogService.confirm(text)) {
await server.put(`notes/${change.noteId}/undelete`);

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import utils from '../../services/utils.js';
import server from '../../services/server.js';
import toastService from "../../services/toast.js";
@ -39,13 +40,13 @@ const TPL = `
<div class="modal-dialog modal-xl" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title mr-auto">Note revisions</h5>
<h5 class="modal-title mr-auto">${t("revisions.note_revisions")}</h5>
<button class="revisions-erase-all-revisions-button btn btn-sm"
title="Delete all revisions of this note"
style="padding: 0 10px 0 10px;" type="button">Delete all revisions</button>
title="${t("revisions.delete_all_revisions")}"
style="padding: 0 10px 0 10px;" type="button">${t("revisions.delete_all_button")}</button>
<button class="help-button" type="button" data-help-page="Note-revisions" title="Help on Note revisions">?</button>
<button class="help-button" type="button" data-help-page="Note-revisions" title="${t("revisions.help_title")}">?</button>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0 !important;">
<span aria-hidden="true">&times;</span>
@ -53,7 +54,7 @@ const TPL = `
</div>
<div class="modal-body" style="display: flex; height: 80vh;">
<div class="dropdown">
<button class="revision-list-dropdown" type="button" style="display: none;" data-toggle="dropdown">Dropdown trigger</button>
<button class="revision-list-dropdown" type="button" style="display: none;" data-toggle="dropdown">${t("revisions.dropdown_trigger")}</button>
<div class="revision-list dropdown-menu" style="position: static; height: 100%; overflow: auto;"></div>
</div>
@ -105,14 +106,14 @@ export default class RevisionsDialog extends BasicWidget {
});
this.$eraseAllRevisionsButton.on('click', async () => {
const text = 'Do you want to delete all revisions of this note? This action will erase revision title and content, but still preserve revision metadata.';
const text = t("revisions.confirm_delete_all");
if (await dialogService.confirm(text)) {
await server.remove(`notes/${this.note.noteId}/revisions`);
this.$widget.modal('hide');
toastService.showMessage('Note revisions has been deleted.');
toastService.showMessage(t("revisions.revisions_deleted"));
}
});
@ -149,7 +150,7 @@ export default class RevisionsDialog extends BasicWidget {
$('<a class="dropdown-item" tabindex="0">')
.text(`${item.dateLastEdited.substr(0, 16)} (${utils.formatSize(item.contentLength)})`)
.attr('data-revision-id', item.revisionId)
.attr('title', `This revision was last edited on ${item.dateLastEdited}`)
.attr('title', t("revisions.revision_last_edited", { date: item.dateLastEdited }))
);
}
@ -160,7 +161,7 @@ export default class RevisionsDialog extends BasicWidget {
this.revisionId = this.revisionItems[0].revisionId;
}
} else {
this.$title.text("No revisions for this note yet...");
this.$title.text(t("revisions.no_revisions"));
this.revisionId = null;
}
@ -182,31 +183,31 @@ export default class RevisionsDialog extends BasicWidget {
renderContentButtons(revisionItem) {
this.$titleButtons.empty();
const $restoreRevisionButton = $('<button class="btn btn-sm" type="button">Restore this revision</button>');
const $restoreRevisionButton = $(`<button class="btn btn-sm" type="button">${t("revisions.restore_button")}</button>`);
$restoreRevisionButton.on('click', async () => {
const text = 'Do you want to restore this revision? This will overwrite current title/content of the note with this revision.';
const text = t("revisions.confirm_restore");
if (await dialogService.confirm(text)) {
await server.post(`revisions/${revisionItem.revisionId}/restore`);
this.$widget.modal('hide');
toastService.showMessage('Note revision has been restored.');
toastService.showMessage(t("revisions.revision_restored"));
}
});
const $eraseRevisionButton = $('<button class="btn btn-sm" type="button">Delete this revision</button>');
const $eraseRevisionButton = $(`<button class="btn btn-sm" type="button">${t("revisions.delete_button")}</button>`);
$eraseRevisionButton.on('click', async () => {
const text = 'Do you want to delete this revision? This action will delete revision title and content, but still preserve revision metadata.';
const text = t("revisions.confirm_delete");
if (await dialogService.confirm(text)) {
await server.remove(`revisions/${revisionItem.revisionId}`);
this.loadRevisions(revisionItem.noteId);
toastService.showMessage('Note revision has been deleted.');
toastService.showMessage(t("revisions.revision_deleted"));
}
});
@ -220,7 +221,7 @@ export default class RevisionsDialog extends BasicWidget {
.append($eraseRevisionButton)
.append(' &nbsp; ');
const $downloadButton = $('<button class="btn btn-sm btn-primary" type="button">Download</button>');
const $downloadButton = $(`<button class="btn btn-sm btn-primary" type="button">${t("revisions.download_button")}</button>`);
$downloadButton.on('click', () => openService.downloadRevision(revisionItem.noteId, revisionItem.revisionId));
@ -254,18 +255,18 @@ export default class RevisionsDialog extends BasicWidget {
} else if (revisionItem.type === 'file') {
const $table = $("<table cellpadding='10'>")
.append($("<tr>").append(
$("<th>").text("MIME: "),
$("<th>").text(t("revisions.mime")),
$("<td>").text(revisionItem.mime)
))
.append($("<tr>").append(
$("<th>").text("File size:"),
$("<th>").text(t("revisions.file_size")),
$("<td>").text(utils.formatSize(revisionItem.contentLength))
));
if (fullRevision.content) {
$table.append($("<tr>").append(
$('<td colspan="2">').append(
$('<div style="font-weight: bold;">').text("Preview:"),
$('<div style="font-weight: bold;">').text(t("revisions.preview")),
$('<pre class="file-preview-content"></pre>')
.text(fullRevision.content)
)
@ -288,7 +289,7 @@ export default class RevisionsDialog extends BasicWidget {
this.$content.append($("<pre>").text(fullRevision.content));
} else {
this.$content.text("Preview isn't available for this note type.");
this.$content.text(t("revisions.preview_not_available"));
}
}
}

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import server from "../../services/server.js";
import utils from "../../services/utils.js";
import BasicWidget from "../basic_widget.js";
@ -6,88 +7,73 @@ const TPL = `<div class="sort-child-notes-dialog modal mx-auto" tabindex="-1" ro
<div class="modal-dialog modal-lg" style="max-width: 500px" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title mr-auto">Sort children by ...</h5>
<h5 class="modal-title mr-auto">${t("sort_child_notes.sort_children_by")}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0 !important;">
<span aria-hidden="true">&times;</span>
</button>
</div>
<form class="sort-child-notes-form">
<div class="modal-body">
<h5>Sorting criteria</h5>
<h5>${t("sort_child_notes.sorting_criteria")}</h5>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="sort-by" value="title" checked>
title
<input class="form-check-input" type="radio" name="sort-by" value="title" checked>
${t("sort_child_notes.title")}
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="sort-by" value="dateCreated">
date created
${t("sort_child_notes.date_created")}
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="sort-by" value="dateModified">
date modified
${t("sort_child_notes.date_modified")}
</label>
</div>
<br/>
<h5>Sorting direction</h5>
<h5>${t("sort_child_notes.sorting_direction")}</h5>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="sort-direction" value="asc" checked>
ascending
${t("sort_child_notes.ascending")}
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="sort-direction" value="desc">
descending
${t("sort_child_notes.descending")}
</label>
</div>
<br />
<h5>Folders</h5>
<h5>${t("sort_child_notes.folders")}</h5>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" name="sort-folders-first" value="1">
sort folders at the top
${t("sort_child_notes.sort_folders_at_top")}
</label>
</div>
<br />
<h5>Natural Sort</h5>
<h5>${t("sort_child_notes.natural_sort")}</h5>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" name="sort-natural" value="1">
sort with respect to different character sorting and collation rules in different languages or regions.
${t("sort_child_notes.sort_with_respect_to_different_character_sorting")}
</label>
</div>
<br />
<div class="form-check">
<label>
Natural sort language
${t("sort_child_notes.natural_sort_language")}
<input class="form-control" name="sort-locale">
The language code for natural sort, e.g. "zh-CN" for Chinese.
${t("sort_child_notes.the_language_code_for_natural_sort")}
</label>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Sort <kbd>enter</kbd></button>
<button type="submit" class="btn btn-primary">${t("sort_child_notes.sort")} <kbd>enter</kbd></button>
</div>
</form>
</div>
@ -106,13 +92,13 @@ export default class SortChildNotesDialog extends BasicWidget {
const sortNatural = this.$form.find("input[name='sort-natural']").is(":checked");
const sortLocale = this.$form.find("input[name='sort-locale']").val();
await server.put(`notes/${this.parentNoteId}/sort-children`, {sortBy, sortDirection, foldersFirst, sortNatural, sortLocale});
await server.put(`notes/${this.parentNoteId}/sort-children`, { sortBy, sortDirection, foldersFirst, sortNatural, sortLocale });
utils.closeActiveDialog();
});
}
async sortChildNotesEvent({node}) {
async sortChildNotesEvent({ node }) {
this.parentNoteId = node.data.noteId;
utils.openDialog(this.$widget);

View File

@ -1,3 +1,4 @@
import { t } from "../../services/i18n.js";
import utils from '../../services/utils.js';
import treeService from "../../services/tree.js";
import importService from "../../services/import.js";
@ -9,7 +10,7 @@ const TPL = `
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Upload attachments to note</h5>
<h5 class="modal-title">${t("upload_attachments.upload_attachments_to_note")}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
@ -17,25 +18,22 @@ const TPL = `
<form class="upload-attachment-form">
<div class="modal-body">
<div class="form-group">
<label for="upload-attachment-file-upload-input"><strong>Choose files</strong></label>
<label for="upload-attachment-file-upload-input"><strong>${t("upload_attachments.choose_files")}</strong></label>
<input type="file" class="upload-attachment-file-upload-input form-control-file" multiple />
<p>Files will be uploaded as attachments into <strong class="upload-attachment-note-title"></strong>.
<p>${t("upload_attachments.files_will_be_uploaded")} <strong class="upload-attachment-note-title"></strong>.</p>
</div>
<div class="form-group">
<strong>Options:</strong>
<strong>${t("upload_attachments.options")}:</strong>
<div class="checkbox">
<label data-toggle="tooltip" title="<p>If you check this option, Trilium will attempt to shrink the uploaded images by scaling and optimization which may affect the perceived image quality. If unchecked, images will be uploaded without changes.</p>">
<input class="shrink-images-checkbox" value="1" type="checkbox" checked> <span>Shrink images</span>
<label data-toggle="tooltip" title="${t("upload_attachments.tooltip")}">
<input class="shrink-images-checkbox" value="1" type="checkbox" checked> <span>${t("upload_attachments.shrink_images")}</span>
</label>
</div>
</div>
</div>
<div class="modal-footer">
<button class="upload-attachment-button btn btn-primary">Upload</button>
<button class="upload-attachment-button btn btn-primary">${t("upload_attachments.upload")}</button>
</div>
</form>
</div>
@ -60,9 +58,7 @@ export default class UploadAttachmentsDialog extends BasicWidget {
this.$form.on('submit', () => {
// disabling so that import is not triggered again.
this.$uploadButton.attr("disabled", "disabled");
this.uploadAttachments(this.parentNoteId);
return false;
});

View File

@ -60,7 +60,7 @@
},
"delete_notes": {
"delete_notes_preview": "删除笔记预览",
"delete_all_clones_description": "同时删除所有克隆(可以在最近改中撤消)",
"delete_all_clones_description": "同时删除所有克隆(可以在最近改中撤消)",
"erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。",
"erase_notes_warning": "永久擦除笔记(无法撤销),包括所有克隆。这将强制应用程序重新加载。",
"notes_to_be_deleted": "将删除以下笔记(<span class=\"deleted-notes-count\"></span>",
@ -151,7 +151,7 @@
"safeImport": "安全导入",
"explodeArchivesTooltip": "如果选中此项则Trilium将读取<code>.zip</code>、<code>.enex</code>和<code>.opml</code>文件并从这些归档文件内部的文件创建笔记。如果未选中则Trilium会将这些归档文件本身附加到笔记中。",
"explodeArchives": "读取<code>.zip</code>、<code>.enex</code>和<code>.opml</code>归档文件的内容。",
"shrinkImagesTooltip": "<p>如果选中此选项Trilium将尝试通过缩放和优化来缩小导入的图像这可能会影响图像的感知质量。如果未选中图像将不做改地导入。</p><p>这不适用于带有元数据的<code>.zip</code>导入,因为这些文件已被假定为已优化。</p>",
"shrinkImagesTooltip": "<p>如果选中此选项Trilium将尝试通过缩放和优化来缩小导入的图像这可能会影响图像的感知质量。如果未选中图像将不做改地导入。</p><p>这不适用于带有元数据的<code>.zip</code>导入,因为这些文件已被假定为已优化。</p>",
"shrinkImages": "压缩图像",
"textImportedAsText": "如果元数据不明确将HTML、Markdown和TXT导入为文本笔记",
"codeImportedAsCode": "如果元数据不明确,将识别的代码文件(例如<code>.json</code>)导入为代码笔记",
@ -197,5 +197,78 @@
"modal_body": "选择新笔记的类型或模板:",
"dropdown_trigger": "下拉触发",
"templates": "模板:"
},
"password_not_set": {
"title": "密码未设置",
"body1": "受保护的笔记使用用户密码加密,但密码尚未设置。",
"body2": "点击<a class=\"open-password-options-button\" href=\"javascript:\">这里</a>打开选项对话框并设置您的密码。"
},
"prompt": {
"title": "提示",
"ok": "确定 <kbd>回车</kbd>",
"defaultTitle": "提示"
},
"protected_session_password": {
"modal_title": "保护会话",
"help_title": "关于保护笔记的帮助",
"close_label": "关闭",
"form_label": "输入密码进入保护会话以继续:",
"start_button": "开始保护会话 <kbd>回车</kbd>"
},
"recent_changes": {
"title": "最近修改",
"erase_notes_button": "立即清理已删除的笔记",
"deleted_notes_message": "已删除的笔记已清理。",
"no_changes_message": "暂无修改...",
"undelete_link": "恢复删除",
"confirm_undelete": "您确定要恢复此笔记及其子笔记吗?"
},
"revisions": {
"note_revisions": "笔记历史版本",
"delete_all_revisions": "删除此笔记的所有历史版本",
"delete_all_button": "删除所有历史版本",
"help_title": "关于笔记历史版本的帮助",
"dropdown_trigger": "下拉触发器",
"revision_last_edited": "此历史版本上次编辑于 {{date}}",
"confirm_delete_all": "您是否要删除此笔记的所有历史版本?此操作将擦除历史版本的标题和内容,但仍将保留历史版本的元数据。",
"no_revisions": "此笔记暂无历史版本...",
"restore_button": "恢复此历史版本",
"confirm_restore": "您是否要恢复此历史版本?这将使用此历史版本覆盖笔记的当前标题和内容。",
"delete_button": "删除此历史版本",
"confirm_delete": "您是否要删除此历史版本?此操作将删除历史版本的标题和内容,但仍将保留历史版本的元数据。",
"revisions_deleted": "笔记历史版本已删除。",
"revision_restored": "笔记历史版本已恢复。",
"revision_deleted": "笔记历史版本已删除。",
"download_button": "下载",
"mime": "MIME类型",
"file_size": "文件大小:",
"preview": "预览:",
"preview_not_available": "无法预览此类型的笔记。"
},
"sort_child_notes": {
"sort_children_by": "按...排序子笔记",
"sorting_criteria": "排序条件",
"title": "标题",
"date_created": "创建日期",
"date_modified": "修改日期",
"sorting_direction": "排序方向",
"ascending": "升序",
"descending": "降序",
"folders": "文件夹",
"sort_folders_at_top": "将文件夹置顶排序",
"natural_sort": "自然排序",
"sort_with_respect_to_different_character_sorting": "根据不同语言或地区的字符排序和排序规则排序。",
"natural_sort_language": "自然排序语言",
"the_language_code_for_natural_sort": "自然排序的语言代码,例如中文的 \"zh-CN\"。",
"sort": "排序"
},
"upload_attachments": {
"upload_attachments_to_note": "上传附件到笔记",
"choose_files": "选择文件",
"files_will_be_uploaded": "文件将作为附件上传到",
"options": "选项",
"shrink_images": "缩小图片",
"upload": "上传",
"tooltip": "如果您勾选此选项Trilium 将尝试通过缩放和优化来缩小上传的图像,这可能会影响感知的图像质量。如果未选中,则将以不进行更改的方式上传图像。"
}
}

View File

@ -197,5 +197,78 @@
"modal_body": "Choose note type / template of the new note:",
"dropdown_trigger": "Dropdown trigger",
"templates": "Templates:"
},
"password_not_set": {
"title": "Password is not set",
"body1": "Protected notes are encrypted using a user password, but password has not been set yet.",
"body2": "To be able to protect notes, click <a class=\"open-password-options-button\" href=\"javascript:\">here</a> to open the Options dialog and set your password.</a>"
},
"prompt": {
"title": "Prompt",
"ok": "OK <kbd>enter</kbd>",
"defaultTitle": "Prompt"
},
"protected_session_password": {
"modal_title": "Protected session",
"help_title": "Help on Protected notes",
"close_label": "Close",
"form_label": "To proceed with requested action you need to start protected session by entering password:",
"start_button": "Start protected session <kbd>enter</kbd>"
},
"recent_changes": {
"title": "Recent changes",
"erase_notes_button": "Erase deleted notes now",
"deleted_notes_message": "Deleted notes have been erased.",
"no_changes_message": "No changes yet ...",
"undelete_link": "undelete",
"confirm_undelete": "Do you want to undelete this note and its sub-notes?"
},
"revisions": {
"note_revisions": "Note revisions",
"delete_all_revisions": "Delete all revisions of this note",
"delete_all_button": "Delete all revisions",
"help_title": "Help on Note revisions",
"dropdown_trigger": "Dropdown trigger",
"revision_last_edited": "This revision was last edited on {{date}}",
"confirm_delete_all": "Do you want to delete all revisions of this note? This action will erase revision title and content, but still preserve revision metadata.",
"no_revisions": "No revisions for this note yet...",
"restore_button": "Restore this revision",
"confirm_restore": "Do you want to restore this revision? This will overwrite current title and content of the note with this revision.",
"delete_button": "Delete this revision",
"confirm_delete": "Do you want to delete this revision? This action will delete revision title and content, but still preserve revision metadata.",
"revisions_deleted": "Note revisions has been deleted.",
"revision_restored": "Note revision has been restored.",
"revision_deleted": "Note revision has been deleted.",
"download_button": "Download",
"mime": "MIME: ",
"file_size": "File size:",
"preview": "Preview:",
"preview_not_available": "Preview isn't available for this note type."
},
"sort_child_notes": {
"sort_children_by": "Sort children by ...",
"sorting_criteria": "Sorting criteria",
"title": "title",
"date_created": "date created",
"date_modified": "date modified",
"sorting_direction": "Sorting direction",
"ascending": "ascending",
"descending": "descending",
"folders": "Folders",
"sort_folders_at_top": "sort folders at the top",
"natural_sort": "Natural Sort",
"sort_with_respect_to_different_character_sorting": "sort with respect to different character sorting and collation rules in different languages or regions.",
"natural_sort_language": "Natural sort language",
"the_language_code_for_natural_sort": "The language code for natural sort, e.g. \"zh-CN\" for Chinese.",
"sort": "Sort"
},
"upload_attachments": {
"upload_attachments_to_note": "Upload attachments to note",
"choose_files": "Choose files",
"files_will_be_uploaded": "Files will be uploaded as attachments into",
"options": "Options",
"shrink_images": "Shrink images",
"upload": "Upload",
"tooltip": "If you check this option, Trilium will attempt to shrink the uploaded images by scaling and optimization which may affect the perceived image quality. If unchecked, images will be uploaded without changes."
}
}