Update ImageUtilities.plugin.js

This commit is contained in:
Mirco Wittrien 2021-02-09 14:51:23 +01:00
parent 91f086d72c
commit dc4cb37e70
1 changed files with 283 additions and 334 deletions

View File

@ -14,12 +14,12 @@ module.exports = (_ => {
"info": { "info": {
"name": "ImageUtilities", "name": "ImageUtilities",
"author": "DevilBro", "author": "DevilBro",
"version": "4.2.5", "version": "4.2.6",
"description": "Add a handful of options for images/emotes/avatars (direct download, reverse image search, zoom, copy image link, copy image to clipboard, gallery mode)" "description": "Add a handful of options for images/emotes/avatars (direct download, reverse image search, zoom, copy image link, copy image to clipboard, gallery mode)"
}, },
"changeLog": { "changeLog": {
"fixed": { "added": {
"Download": "Download via Image Modal would sometimes download a small version of the image" "Videos": "Save as and Copy File Link now also works for videos"
} }
} }
}; };
@ -62,10 +62,24 @@ module.exports = (_ => {
return template.content.firstElementChild; return template.content.firstElementChild;
} }
} : (([Plugin, BDFDB]) => { } : (([Plugin, BDFDB]) => {
const imgUrlReplaceString = "DEVILBRO_BD_REVERSEIMAGESEARCH_REPLACE_IMAGEURL";
var firedEvents = [], clickedImage; var firedEvents = [], clickedImage;
var settings = {}, amounts = {}, zoomSettings = {}, engines = {}, enabledEngines = {}, ownLocations = {}, downloadsFolder; var settings = {}, amounts = {}, zoomSettings = {}, engines = {}, enabledEngines = {}, ownLocations = {}, downloadsFolder;
const imgUrlReplaceString = "DEVILBRO_BD_REVERSEIMAGESEARCH_REPLACE_IMAGEURL";
const fileTypes = {
apng: {copyable: false, searchable: true, video: false},
avi: {copyable: false, searchable: false, video: true},
jpeg: {copyable: true, searchable: true, video: false},
jpg: {copyable: true, searchable: true, video: false},
gif: {copyable: false, searchable: true, video: false},
mov: {copyable: false, searchable: false, video: true},
mp4: {copyable: false, searchable: false, video: true},
png: {copyable: true, searchable: true, video: false},
svg: {copyable: false, searchable: false, video: false},
webp: {copyable: true, searchable: true, video: false}
};
const ImageDetails = class ImageDetails extends BdApi.React.Component { const ImageDetails = class ImageDetails extends BdApi.React.Component {
componentDidMount() { componentDidMount() {
this.props.attachment = BDFDB.ReactUtils.findValue(BDFDB.ObjectUtils.get(this, `${BDFDB.ReactUtils.instanceKey}.return`), "attachment", {up: true}); this.props.attachment = BDFDB.ReactUtils.findValue(BDFDB.ObjectUtils.get(this, `${BDFDB.ReactUtils.instanceKey}.return`), "attachment", {up: true});
@ -241,14 +255,6 @@ module.exports = (_ => {
} }
onStart () { onStart () {
// REMOVE 16.12.2020
let oL = BDFDB.DataUtils.load(this, "ownLocations"), c = false;
for (let i in oL) if (!BDFDB.ObjectUtils.is(oL[i])) {
oL[i] = {enabled: true, location: oL[i]};
c = true;
}
if (c) BDFDB.DataUtils.save(oL, this, "ownLocations")
BDFDB.ListenerUtils.add(this, document.body, "click", BDFDB.dotCNS.message + BDFDB.dotCNS.imagewrapper + "img", e => { BDFDB.ListenerUtils.add(this, document.body, "click", BDFDB.dotCNS.message + BDFDB.dotCNS.imagewrapper + "img", e => {
clickedImage = e.target; clickedImage = e.target;
BDFDB.TimeUtils.timeout(_ => {clickedImage = null;}); BDFDB.TimeUtils.timeout(_ => {clickedImage = null;});
@ -334,11 +340,11 @@ module.exports = (_ => {
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Button, { BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Button, {
style: {marginBottom: 1}, style: {marginBottom: 1},
onClick: _ => { onClick: _ => {
for (let input of settingsPanel.props._node.querySelectorAll(".input-newlocation " + BDFDB.dotCN.input)) if (!input.value || input.value.length == 0 || input.value.trim().length == 0) return BDFDB.NotificationUtils.toast("Fill out all fields to add a new location.", {type: "danger"}); for (let input of settingsPanel.props._node.querySelectorAll(".input-newlocation " + BDFDB.dotCN.input)) if (!input.value || input.value.length == 0 || input.value.trim().length == 0) return BDFDB.NotificationUtils.toast("Fill out all fields to add a new Location.", {type: "danger"});
let name = settingsPanel.props._node.querySelector(".input-name " + BDFDB.dotCN.input).value.trim(); let name = settingsPanel.props._node.querySelector(".input-name " + BDFDB.dotCN.input).value.trim();
let location = settingsPanel.props._node.querySelector(".input-location " + BDFDB.dotCN.input).value.trim(); let location = settingsPanel.props._node.querySelector(".input-location " + BDFDB.dotCN.input).value.trim();
if (ownLocations[name] || name == "Downloads") return BDFDB.NotificationUtils.toast("A location with the choosen name already exists, please choose another name", {type: "danger"}); if (ownLocations[name] || name == "Downloads") return BDFDB.NotificationUtils.toast("A Location with the choosen Name already exists, please choose another Name", {type: "danger"});
else if (!BDFDB.LibraryRequires.fs.existsSync(location)) return BDFDB.NotificationUtils.toast("The choosen download location is not a valid path to a folder", {type: "danger"}); else if (!BDFDB.LibraryRequires.fs.existsSync(location)) return BDFDB.NotificationUtils.toast("The choosen download Location is not a valid Path to a Folder", {type: "danger"});
else { else {
ownLocations[name] = {enabled: true, location: location}; ownLocations[name] = {enabled: true, location: location};
BDFDB.DataUtils.save(ownLocations, this, "ownLocations"); BDFDB.DataUtils.save(ownLocations, this, "ownLocations");
@ -487,12 +493,15 @@ module.exports = (_ => {
onMessageContextMenu (e) { onMessageContextMenu (e) {
if (e.instance.props.message && e.instance.props.channel && e.instance.props.target) { if (e.instance.props.message && e.instance.props.channel && e.instance.props.target) {
if (e.instance.props.attachment) this.injectItem(e, e.instance.props.attachment.url); if (e.instance.props.attachment) this.injectItem(e, e.instance.props.attachment.url);
else if (e.instance.props.target.tagName == "A" && e.instance.props.message.embeds && e.instance.props.message.embeds[0] && e.instance.props.message.embeds[0].type == "image") this.injectItem(e, e.instance.props.target.href); else if (e.instance.props.target.tagName == "A" && e.instance.props.message.embeds && e.instance.props.message.embeds[0] && (e.instance.props.message.embeds[0].type == "image" || e.instance.props.message.embeds[0].type == "video")) this.injectItem(e, e.instance.props.target.href);
else if (e.instance.props.target.tagName == "IMG") { else if (e.instance.props.target.tagName == "IMG") {
if (BDFDB.DOMUtils.containsClass(e.instance.props.target.parentElement, BDFDB.disCN.imagewrapper)) this.injectItem(e, e.instance.props.target.src); if (BDFDB.DOMUtils.containsClass(e.instance.props.target.parentElement, BDFDB.disCN.imagewrapper)) this.injectItem(e, e.instance.props.target.src);
else if (BDFDB.DOMUtils.containsClass(e.instance.props.target, BDFDB.disCN.embedauthoricon) && settings.addUserAvatarEntry) this.injectItem(e, e.instance.props.target.src); else if (BDFDB.DOMUtils.containsClass(e.instance.props.target, BDFDB.disCN.embedauthoricon) && settings.addUserAvatarEntry) this.injectItem(e, e.instance.props.target.src);
else if (BDFDB.DOMUtils.containsClass(e.instance.props.target, BDFDB.disCN.emojiold, "emote", false) && settings.addEmojiEntry) this.injectItem(e, e.instance.props.target.src); else if (BDFDB.DOMUtils.containsClass(e.instance.props.target, BDFDB.disCN.emojiold, "emote", false) && settings.addEmojiEntry) this.injectItem(e, e.instance.props.target.src);
} }
else if (e.instance.props.target.tagName == "VIDEO") {
if (BDFDB.DOMUtils.getParent(BDFDB.dotCN.attachmentvideo, e.instance.props.target)) this.injectItem(e, e.instance.props.target.src);
}
else { else {
let reaction = BDFDB.DOMUtils.getParent(BDFDB.dotCN.messagereaction, e.instance.props.target); let reaction = BDFDB.DOMUtils.getParent(BDFDB.dotCN.messagereaction, e.instance.props.target);
if (reaction && settings.addEmojiEntry) this.injectItem(e, reaction.querySelector(BDFDB.dotCN.emojiold).src); if (reaction && settings.addEmojiEntry) this.injectItem(e, reaction.querySelector(BDFDB.dotCN.emojiold).src);
@ -502,7 +511,7 @@ module.exports = (_ => {
injectItem (e, ...urls) { injectItem (e, ...urls) {
let types = []; let types = [];
let validUrls = urls.filter(n => this.isValidImg(n)).map(n => { let validUrls = urls.filter(n => this.isValid(n)).map(n => {
let url = n.replace(/^url\(|\)$|"|'/g, "").replace(/\?size\=\d+$/, "?size=4096").replace(/[\?\&](height|width)=\d+/g, ""); let url = n.replace(/^url\(|\)$|"|'/g, "").replace(/\?size\=\d+$/, "?size=4096").replace(/[\?\&](height|width)=\d+/g, "");
if (url.indexOf("https://images-ext-1.discordapp.net/external/") > -1) { if (url.indexOf("https://images-ext-1.discordapp.net/external/") > -1) {
if (url.split("/https/").length > 1) url = "https://" + url.split("/https/").pop(); if (url.split("/https/").length > 1) url = "https://" + url.split("/https/").pop();
@ -513,10 +522,12 @@ module.exports = (_ => {
return url && type && !types.includes(type) && types.push(type) && {url, type}; return url && type && !types.includes(type) && types.push(type) && {url, type};
}).filter(n => n); }).filter(n => n);
if (!validUrls.length) return; if (!validUrls.length) return;
let type = this.isValid(validUrls[0].url, "video") ? BDFDB.LanguageUtils.LanguageStrings.VIDEO : BDFDB.LanguageUtils.LanguageStrings.IMAGE;
let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "devmode-copy-id", group: true}); let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "devmode-copy-id", group: true});
children.splice(index > -1 ? index : children.length, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { children.splice(index > -1 ? index : children.length, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: BDFDB.LanguageUtils.LanguageStrings.IMAGE + " " + BDFDB.LanguageUtils.LanguageStrings.ACTIONS, label: type + " " + BDFDB.LanguageUtils.LanguageStrings.ACTIONS,
id: BDFDB.ContextMenuUtils.createItemId(this.name, "main-subitem"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "main-subitem"),
children: validUrls.length == 1 ? this.createUrlMenu(e, validUrls[0].url) : validUrls.map((urlData, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { children: validUrls.length == 1 ? this.createUrlMenu(e, validUrls[0].url) : validUrls.map((urlData, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: urlData.type.toUpperCase(), label: urlData.type.toUpperCase(),
@ -531,10 +542,12 @@ module.exports = (_ => {
let enginesWithoutAll = BDFDB.ObjectUtils.filter(enabledEngines, n => n != "_all", true); let enginesWithoutAll = BDFDB.ObjectUtils.filter(enabledEngines, n => n != "_all", true);
let engineKeys = Object.keys(enginesWithoutAll); let engineKeys = Object.keys(enginesWithoutAll);
let locations = Object.keys(ownLocations).filter(n => ownLocations[n].enabled); let locations = Object.keys(ownLocations).filter(n => ownLocations[n].enabled);
let isVideo = this.isValid(url, "video");
let type = isVideo ? BDFDB.LanguageUtils.LanguageStrings.VIDEO : BDFDB.LanguageUtils.LanguageStrings.IMAGE;
return [ return [
BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { !isVideo && BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_viewimage, label: this.labels.context_view.replace("{{var0}}", type),
id: BDFDB.ContextMenuUtils.createItemId(this.name, "view-image"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "view-file"),
action: _ => { action: _ => {
let img = new Image(); let img = new Image();
img.onload = function() { img.onload = function() {
@ -560,38 +573,36 @@ module.exports = (_ => {
} }
}), }),
BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_saveimageas, label: this.labels.context_saveas.replace("{{var0}}", type),
id: BDFDB.ContextMenuUtils.createItemId(this.name, "download-image-as"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "download-file-as"),
action: _ => { action: _ => {
this.downloadImageAs(url); this.downloadFileAs(url);
}, },
children: locations.length && BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { children: locations.length && BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
children: locations.map((name, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { children: locations.map((name, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
id: BDFDB.ContextMenuUtils.createItemId(this.name, "download", name, i), id: BDFDB.ContextMenuUtils.createItemId(this.name, "download", name, i),
label: name, label: name,
action: _ => { action: _ => {
this.downloadImage(url, ownLocations[name].location); this.downloadFile(url, ownLocations[name].location);
} }
})) }))
}) })
}), }),
!this.isCopyable(url) ? null : BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { !this.isValid(url, "copyable") ? null : BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_copyimage, label: this.labels.context_copy.replace("{{var0}}", type),
id: BDFDB.ContextMenuUtils.createItemId(this.name, "copy-image"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "copy-file"),
action: _ => { action: _ => this.copyFile(url)
this.copyImage(url);
}
}), }),
BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_copyimagelink, label: BDFDB.LanguageUtils.LanguageStrings.COPY_MEDIA_LINK,
id: BDFDB.ContextMenuUtils.createItemId(this.name, "copy-src"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "copy-src"),
action: _ => { action: _ => {
BDFDB.LibraryRequires.electron.clipboard.write({text: url}); BDFDB.LibraryRequires.electron.clipboard.write({text: url});
BDFDB.NotificationUtils.toast(this.labels.toast_copyimagelink_success, {type: "success"}); BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LanguageStrings.LINK_COPIED, {type: "success"});
} }
}), }),
!this.isSearchable(url) ? null : engineKeys.length == 1 ? BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { !this.isValid(url, "searchable") ? null : engineKeys.length == 1 ? BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_reverseimagesearch.replace("...", this.defaults.engines[engineKeys[0]].name), label: this.labels.context_searchwith.replace("{{var0}}", type).replace("...", this.defaults.engines[engineKeys[0]].name),
id: BDFDB.ContextMenuUtils.createItemId(this.name, "single-search"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "single-search"),
persisting: true, persisting: true,
action: event => { action: event => {
@ -601,7 +612,7 @@ module.exports = (_ => {
}); });
} }
}) : BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { }) : BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_reverseimagesearch, label: this.labels.context_searchwith.replace("{{var0}}", type),
id: BDFDB.ContextMenuUtils.createItemId(this.name, "submenu-search"), id: BDFDB.ContextMenuUtils.createItemId(this.name, "submenu-search"),
children: !engineKeys.length ? BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { children: !engineKeys.length ? BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.submenu_disabled, label: this.labels.submenu_disabled,
@ -635,6 +646,7 @@ module.exports = (_ => {
if (e.returnvalue) { if (e.returnvalue) {
let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {props: [["className", BDFDB.disCN.downloadlink]]}); let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {props: [["className", BDFDB.disCN.downloadlink]]});
if (index > -1) { if (index > -1) {
let type = this.isValid(url, "video") ? BDFDB.LanguageUtils.LanguageStrings.VIDEO : BDFDB.LanguageUtils.LanguageStrings.IMAGE;
let openContext = event => { let openContext = event => {
BDFDB.ContextMenuUtils.open(this, event, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { BDFDB.ContextMenuUtils.open(this, event, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
children: Object.keys(zoomSettings).map(type => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuSliderItem, Object.assign({ children: Object.keys(zoomSettings).map(type => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuSliderItem, Object.assign({
@ -666,10 +678,10 @@ module.exports = (_ => {
}), }),
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Anchor, { BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Anchor, {
className: BDFDB.disCN.downloadlink, className: BDFDB.disCN.downloadlink,
children: this.labels.context_saveimageas, children: this.labels.context_saveas.replace("{{var0}}", type),
onClick: event => { onClick: event => {
BDFDB.ListenerUtils.stopEvent(event); BDFDB.ListenerUtils.stopEvent(event);
this.downloadImageAs(url); this.downloadFileAs(url);
}, },
onContextMenu: event => { onContextMenu: event => {
let locations = Object.keys(ownLocations).filter(n => ownLocations[n].enabled); let locations = Object.keys(ownLocations).filter(n => ownLocations[n].enabled);
@ -677,15 +689,13 @@ module.exports = (_ => {
children: locations.map((name, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { children: locations.map((name, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
id: BDFDB.ContextMenuUtils.createItemId(this.name, "download", name, i), id: BDFDB.ContextMenuUtils.createItemId(this.name, "download", name, i),
label: name, label: name,
action: _ => { action: _ => this.downloadFile(url, ownLocations[name].location)
this.downloadImage(url, ownLocations[name].location);
}
})) }))
})); }));
} }
}) })
], ],
settings.enableCopyImg && this.isCopyable(url) && !isVideo && [ settings.enableCopyImg && this.isValid(url, "copyable") && !isVideo && [
BDFDB.ReactUtils.createElement("span", { BDFDB.ReactUtils.createElement("span", {
className: BDFDB.disCN.downloadlink, className: BDFDB.disCN.downloadlink,
children: "|", children: "|",
@ -693,10 +703,10 @@ module.exports = (_ => {
}), }),
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Anchor, { BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Anchor, {
className: BDFDB.disCN.downloadlink, className: BDFDB.disCN.downloadlink,
children: this.labels.context_copyimage, children: this.labels.context_copy.replace("{{var0}}", type),
onClick: event => { onClick: event => {
BDFDB.ListenerUtils.stopEvent(event); BDFDB.ListenerUtils.stopEvent(event);
this.copyImage(url); this.copyFile(url);
} }
}) })
], ],
@ -932,35 +942,27 @@ module.exports = (_ => {
return child; return child;
} }
isValidImg (url) { isValid (url, type) {
if (!url) return false;
const file = url && (BDFDB.LibraryModules.URLParser.parse(url).pathname || "").toLowerCase(); const file = url && (BDFDB.LibraryModules.URLParser.parse(url).pathname || "").toLowerCase();
return file && (url.startsWith("https://images-ext-2.discordapp.net/") || file.endsWith(".jpg") || file.endsWith(".jpeg") || file.endsWith(".png") || file.endsWith(".gif") || file.endsWith(".apng") || file.endsWith(".webp") || file.endsWith(".svg")); return file && (url.startsWith("https://images-ext-2.discordapp.net/") || !type && Object.keys(fileTypes).some(t => file.endsWith(`.${t}`)) || type && Object.keys(fileTypes).filter(t => fileTypes[t][type]).some(t => file.endsWith(`.${t}`)));
} }
isCopyable (url) { downloadFile (url, path) {
const file = url && (BDFDB.LibraryModules.URLParser.parse(url).pathname || "").toLowerCase();
return file && (url.startsWith("https://images-ext-2.discordapp.net/") || file.endsWith(".jpg") || file.endsWith(".jpeg") || file.endsWith(".png"));
}
isSearchable (url) {
const file = url && (BDFDB.LibraryModules.URLParser.parse(url).pathname || "").toLowerCase();
return file && (url.startsWith("https://images-ext-2.discordapp.net/") || file.endsWith(".jpg") || file.endsWith(".jpeg") || file.endsWith(".png") || file.endsWith(".gif") || file.endsWith(".apng") || file.endsWith(".webp"));
}
downloadImage (url, path) {
url = url.startsWith("/assets") ? (window.location.origin + url) : url; url = url.startsWith("/assets") ? (window.location.origin + url) : url;
BDFDB.LibraryRequires.request(url, {encoding: null}, (error, response, body) => { BDFDB.LibraryRequires.request(url, {encoding: null}, (error, response, body) => {
if (error) BDFDB.NotificationUtils.toast(this.labels.toast_saveimage_failed.replace("{{path}}", path), {type: "danger"}); let type = this.isValid(url, "video") ? BDFDB.LanguageUtils.LanguageStrings.VIDEO : BDFDB.LanguageUtils.LanguageStrings.IMAGE;
if (error) BDFDB.NotificationUtils.toast(this.labels.toast_save_failed.replace("{{var0}}", type).replace("{{var1}}", path), {type: "danger"});
else { else {
BDFDB.LibraryRequires.fs.writeFile(this.getFileName(path, url.split("/").pop().split(".").slice(0, -1).join("."), response.headers["content-type"].split("/").pop().split("+")[0], 0), body, error => { BDFDB.LibraryRequires.fs.writeFile(this.getFileName(path, url.split("/").pop().split(".").slice(0, -1).join("."), response.headers["content-type"].split("/").pop().split("+")[0], 0), body, error => {
if (error) BDFDB.NotificationUtils.toast(this.labels.toast_saveimage_failed.replace("{{path}}", path), {type: "danger"}); if (error) BDFDB.NotificationUtils.toast(this.labels.toast_save_failed.replace("{{var0}}", type).replace("{{var1}}", path), {type: "danger"});
else BDFDB.NotificationUtils.toast(this.labels.toast_saveimage_success.replace("{{path}}", path), {type: "success"}); else BDFDB.NotificationUtils.toast(this.labels.toast_save_success.replace("{{var0}}", type).replace("{{var1}}", path), {type: "success"});
}); });
} }
}); });
} }
downloadImageAs (url) { downloadFileAs (url) {
url = url.startsWith("/assets") ? (window.location.origin + url) : url; url = url.startsWith("/assets") ? (window.location.origin + url) : url;
BDFDB.LibraryRequires.request(url, {encoding: null}, (error, response, body) => { BDFDB.LibraryRequires.request(url, {encoding: null}, (error, response, body) => {
let hrefURL = window.URL.createObjectURL(new Blob([body])); let hrefURL = window.URL.createObjectURL(new Blob([body]));
@ -972,9 +974,10 @@ module.exports = (_ => {
}); });
} }
copyImage (url) { copyFile (url) {
BDFDB.LibraryRequires.request(url, {encoding: null}, (error, response, buffer) => { BDFDB.LibraryRequires.request(url, {encoding: null}, (error, response, buffer) => {
if (error) BDFDB.NotificationUtils.toast(this.labels.toast_copyimage_failed, {type: "danger"}); let type = this.isValid(url, "video") ? BDFDB.LanguageUtils.LanguageStrings.VIDEO : BDFDB.LanguageUtils.LanguageStrings.IMAGE;
if (error) BDFDB.NotificationUtils.toast(this.labels.toast_copy_failed.replace("{{var0}}", type), {type: "danger"});
else if (buffer) { else if (buffer) {
if (BDFDB.LibraryRequires.process.platform === "win32" || BDFDB.LibraryRequires.process.platform === "darwin") { if (BDFDB.LibraryRequires.process.platform === "win32" || BDFDB.LibraryRequires.process.platform === "darwin") {
BDFDB.LibraryRequires.electron.clipboard.write({image: BDFDB.LibraryRequires.electron.nativeImage.createFromBuffer(buffer)}); BDFDB.LibraryRequires.electron.clipboard.write({image: BDFDB.LibraryRequires.electron.nativeImage.createFromBuffer(buffer)});
@ -985,7 +988,7 @@ module.exports = (_ => {
BDFDB.LibraryRequires.electron.clipboard.write({image: file}); BDFDB.LibraryRequires.electron.clipboard.write({image: file});
BDFDB.LibraryRequires.fs.unlinkSync(file); BDFDB.LibraryRequires.fs.unlinkSync(file);
} }
BDFDB.NotificationUtils.toast(this.labels.toast_copyimage_success, {type: "success"}); BDFDB.NotificationUtils.toast(this.labels.toast_copy_success.replace("{{var0}}", type), {type: "success"});
} }
}); });
} }
@ -1111,408 +1114,354 @@ module.exports = (_ => {
switch (BDFDB.LanguageUtils.getLanguage().id) { switch (BDFDB.LanguageUtils.getLanguage().id) {
case "bg": // Bulgarian case "bg": // Bulgarian
return { return {
context_copyimage: "Копирай изображение", context_copy: "Копирайте {{var0}}",
context_copyimagelink: "Копирайте Image Link",
context_lenssize: "Размер на обектива", context_lenssize: "Размер на обектива",
context_reverseimagesearch: "Търсене на изображение с ...", context_saveas: "Запазете {{var0}} като ...",
context_saveimageas: "Запазете изображението като ...", context_searchwith: "Търсете {{var0}} с ...",
context_viewimage: "Преглед на изображението", context_view: "Преглед {{var0}}",
submenu_disabled: "Всички инвалиди", submenu_disabled: "Всички инвалиди",
toast_copyimage_failed: "Копирането на изображението в клипборда не бе успешно", toast_copy_failed: "{{var0}} не можа да бъде копиран в клипборда",
toast_copyimage_success: "Копирано изображение в клипборда", toast_copy_success: "{{var0}} беше копиран в клипборда",
toast_copyimagelink_success: "Копирана връзка към изображение в клипборда", toast_save_failed: "{{var0}} не можа да бъде запазен в '{{var1}}'",
toast_saveimage_failed: "Запазването на изображението в '{{path}}' не бе успешно", toast_save_success: "{{var0}} бе запазено в '{{var1}}'"
toast_saveimage_success: "Запазено изображение в '{{path}}'"
}; };
case "da": // Danish case "da": // Danish
return { return {
context_copyimage: "Kopier billede", context_copy: "Kopiér {{var0}}",
context_copyimagelink: "Kopier billedlink",
context_lenssize: "Objektivstørrelse", context_lenssize: "Objektivstørrelse",
context_reverseimagesearch: "Søg i billede med ...", context_saveas: "Gem {{var0}} som ...",
context_saveimageas: "Gem billede som ...", context_searchwith: "Søg i {{var0}} med ...",
context_viewimage: "Se billede", context_view: "Se {{var0}}",
submenu_disabled: "Alle handicappede", submenu_disabled: "Alle handicappede",
toast_copyimage_failed: "Kunne ikke kopiere billedet til udklipsholderen", toast_copy_failed: "{{var0}} kunne ikke kopieres til udklipsholderen",
toast_copyimage_success: "Kopieret billede til udklipsholderen", toast_copy_success: "{{var0}} blev kopieret til udklipsholderen",
toast_copyimagelink_success: "Kopieret billedlink til udklipsholder", toast_save_failed: "{{var0}} kunne ikke gemmes i '{{var1}}'",
toast_saveimage_failed: "Kunne ikke gemme billedet i '{{path}}'", toast_save_success: "{{var0}} blev gemt i '{{var1}}'"
toast_saveimage_success: "Gemt billede i '{{path}}'"
}; };
case "de": // German case "de": // German
return { return {
context_copyimage: "Bild kopieren", context_copy: "{{var0}} kopieren",
context_copyimagelink: "Bildadresse kopieren",
context_lenssize: "Linsengröße", context_lenssize: "Linsengröße",
context_reverseimagesearch: "Bild suchen mit ...", context_saveas: "{{var0}} speichern als ...",
context_saveimageas: "Bild speichern unter ...", context_searchwith: "{{var0}} suchen mit ...",
context_viewimage: "Bild ansehen", context_view: "{{var0}} ansehen",
submenu_disabled: "Alle deaktiviert", submenu_disabled: "Alle deaktiviert",
toast_copyimage_failed: "Bild konnte nicht in die Zwischenablage kopiert werden", toast_copy_failed: "{{var0}} konnte nicht in die Zwischenablage kopiert werden",
toast_copyimage_success: "Kopiertes Bild in die Zwischenablage", toast_copy_success: "{{var0}} wurde in die Zwischenablage kopiert",
toast_copyimagelink_success: "Bildadresse in die Zwischenablage kopieren", toast_save_failed: "{{var0}} konnte nicht in '{{var1}}' gespeichert werden",
toast_saveimage_failed: "Bild konnte nicht in '{{path}}' gespeichert werden", toast_save_success: "{{var0}} wurde in '{{var1}}' gespeichert"
toast_saveimage_success: "Bild wurde in '{{path}}' gespeichert"
}; };
case "el": // Greek case "el": // Greek
return { return {
context_copyimage: "Αντιγραφή εικόνας", context_copy: "Αντιγραφή {{var0}}",
context_copyimagelink: "Αντιγραφή συνδέσμου εικόνας",
context_lenssize: "Μέγεθος φακού", context_lenssize: "Μέγεθος φακού",
context_reverseimagesearch: "Αναζήτηση εικόνας με ...", context_saveas: "Αποθήκευση {{var0}} ως ...",
context_saveimageas: "Αποθήκευση εικόνας ως ...", context_searchwith: "Αναζήτηση {{var0}} με ...",
context_viewimage: "Προβολή εικόνας", context_view: "Προβολή {{var0}}",
submenu_disabled: "Όλα τα άτομα με ειδικές ανάγκες", submenu_disabled: "Όλα τα άτομα με ειδικές ανάγκες",
toast_copyimage_failed: "Αποτυχία αντιγραφής εικόνας στο Πρόχειρο", toast_copy_failed: "Δεν ήταν δυνατή η αντιγραφή του {{var0}} στο πρόχειρο",
toast_copyimage_success: "Αντιγράφηκε η εικόνα στο Πρόχειρο", toast_copy_success: "Το {{var0}} αντιγράφηκε στο πρόχειρο",
toast_copyimagelink_success: "Αντιγράφηκε σύνδεσμος εικόνας στο Πρόχειρο", toast_save_failed: "Δεν ήταν δυνατή η αποθήκευση του {{var0}} στο '{{var1}}'",
toast_saveimage_failed: "Αποτυχία αποθήκευσης εικόνας στο '{{path}}'", toast_save_success: "Το {{var0}} αποθηκεύτηκε στο '{{var1}}'"
toast_saveimage_success: "Αποθηκευμένη εικόνα στο '{{path}}'"
}; };
case "es": // Spanish case "es": // Spanish
return { return {
context_copyimage: "Copiar imagen", context_copy: "Copiar {{var0}}",
context_copyimagelink: "Copiar enlace de imagen",
context_lenssize: "Tamaño de la lente", context_lenssize: "Tamaño de la lente",
context_reverseimagesearch: "Buscar imagen con ...", context_saveas: "Guardar {{var0}} como ...",
context_saveimageas: "Guardar imagen como ...", context_searchwith: "Buscar {{var0}} con ...",
context_viewimage: "Ver imagen", context_view: "Ver {{var0}}",
submenu_disabled: "Todos discapacitados", submenu_disabled: "Todos discapacitados",
toast_copyimage_failed: "No se pudo copiar la imagen al portapapeles", toast_copy_failed: "{{var0}} no se pudo copiar al portapapeles",
toast_copyimage_success: "Imagen copiada al portapapeles", toast_copy_success: "{{var0}} se copió en el portapapeles",
toast_copyimagelink_success: "Enlace de imagen copiado al portapapeles", toast_save_failed: "{{var0}} no se pudo guardar en '{{var1}}'",
toast_saveimage_failed: "No se pudo guardar la imagen en '{{path}}'", toast_save_success: "{{var0}} se guardó en '{{var1}}'"
toast_saveimage_success: "Imagen guardada en '{{path}}'"
}; };
case "fi": // Finnish case "fi": // Finnish
return { return {
context_copyimage: "Kopioi kuva", context_copy: "Kopioi {{var0}}",
context_copyimagelink: "Kopioi kuvalinkki",
context_lenssize: "Linssin koko", context_lenssize: "Linssin koko",
context_reverseimagesearch: "Hae kuvaa ...", context_saveas: "Tallenna {{var0}} nimellä ...",
context_saveimageas: "Tallenna kuva nimellä ...", context_searchwith: "Tee haku {{var0}} ...",
context_viewimage: "Näytä kuva", context_view: "Näytä {{var0}}",
submenu_disabled: "Kaikki vammaiset", submenu_disabled: "Kaikki vammaiset",
toast_copyimage_failed: "Kuvan kopioiminen leikepöydälle epäonnistui", toast_copy_failed: "Kohdetta {{var0}} ei voitu kopioida leikepöydälle",
toast_copyimage_success: "Kopioitu kuva leikepöydälle", toast_copy_success: "{{var0}} kopioitiin leikepöydälle",
toast_copyimagelink_success: "Kopioitu kuvalinkki leikepöydälle", toast_save_failed: "Kohdetta {{var0}} ei voitu tallentaa kansioon '{{var1}}'",
toast_saveimage_failed: "Kuvan tallentaminen kohteeseen '{{path}}' epäonnistui", toast_save_success: "{{var0}} tallennettiin kansioon '{{var1}}'"
toast_saveimage_success: "Tallennettu kuva kansioon '{{path}}'"
}; };
case "fr": // French case "fr": // French
return { return {
context_copyimage: "Copier l'image", context_copy: "Copier {{var0}}",
context_copyimagelink: "Copier le lien de l'image",
context_lenssize: "Taille de l'objectif", context_lenssize: "Taille de l'objectif",
context_reverseimagesearch: "Rechercher une image avec ...", context_saveas: "Enregistrer {{var0}} sous ...",
context_saveimageas: "Enregistrer l'image sous ...", context_searchwith: "Rechercher {{var0}} avec ...",
context_viewimage: "Voir l'image", context_view: "Afficher {{var0}}",
submenu_disabled: "Tout désactivé", submenu_disabled: "Tout désactivé",
toast_copyimage_failed: "Échec de la copie de l'image dans le presse-papiers", toast_copy_failed: "{{var0}} n'a pas pu être copié dans le presse-papiers",
toast_copyimage_success: "Image copiée dans le presse-papiers", toast_copy_success: "{{var0}} a été copié dans le presse-papiers",
toast_copyimagelink_success: "Lien d'image copié vers le presse-papiers", toast_save_failed: "{{var0}} n'a pas pu être enregistré dans '{{var1}}'",
toast_saveimage_failed: "Échec de l'enregistrement de l'image dans '{{path}}'", toast_save_success: "{{var0}} a été enregistré dans '{{var1}}'"
toast_saveimage_success: "Image enregistrée dans '{{path}}'"
}; };
case "hr": // Croatian case "hr": // Croatian
return { return {
context_copyimage: "Kopiraj sliku", context_copy: "Kopiraj {{var0}}",
context_copyimagelink: "Kopiraj vezu slike",
context_lenssize: "Veličina leće", context_lenssize: "Veličina leće",
context_reverseimagesearch: "Traži sliku pomoću ...", context_saveas: "Spremi {{var0}} kao ...",
context_saveimageas: "Spremi sliku kao ...", context_searchwith: "Traži {{var0}} sa ...",
context_viewimage: "Pogledati sliku", context_view: "Pogledajte {{var0}}",
submenu_disabled: "Svi invalidi", submenu_disabled: "Svi invalidi",
toast_copyimage_failed: "Kopiranje slike u međuspremnik nije uspjelo", toast_copy_failed: "{{var0}} nije moguće kopirati u međuspremnik",
toast_copyimage_success: "Kopirana slika u međuspremnik", toast_copy_success: "{{var0}} je kopirano u međuspremnik",
toast_copyimagelink_success: "Veza slike kopirana je u međuspremnik", toast_save_failed: "{{var0}} nije moguće spremiti u '{{var1}}'",
toast_saveimage_failed: "Spremanje slike u '{{path}}' nije uspjelo", toast_save_success: "{{var0}} spremljeno je u '{{var1}}'"
toast_saveimage_success: "Spremljena slika na '{{path}}'"
}; };
case "hu": // Hungarian case "hu": // Hungarian
return { return {
context_copyimage: "Képmásolat", context_copy: "{{var0}} másolása",
context_copyimagelink: "Képlink másolása",
context_lenssize: "Lencse mérete", context_lenssize: "Lencse mérete",
context_reverseimagesearch: "Kép keresése a következővel:", context_saveas: "{{var0}} mentése másként ...",
context_saveimageas: "Kép mentése másként ...", context_searchwith: "Keresés a következőben: {{var0}} a következővel:",
context_viewimage: "Kép megtekintése", context_view: "Megtekintés: {{var0}}",
submenu_disabled: "Minden fogyatékkal él", submenu_disabled: "Minden fogyatékkal él",
toast_copyimage_failed: "Nem sikerült másolni a képet a vágólapra", toast_copy_failed: "A {{var0}} fájl nem másolható a vágólapra",
toast_copyimage_success: "Kép másolása a vágólapra", toast_copy_success: "A {{var0}} elemet a vágólapra másolta",
toast_copyimagelink_success: "Képlink linkre másolva a vágólapra", toast_save_failed: "A {{var0}} fájl mentése nem sikerült a '{{var1}}' mappába",
toast_saveimage_failed: "Nem sikerült menteni a képet a '{{path}}” mappába", toast_save_success: "{{var0}} mentve a '{{var1}}' mappába"
toast_saveimage_success: "Mentett kép itt: '{{path}}”"
}; };
case "it": // Italian case "it": // Italian
return { return {
context_copyimage: "Copia l'immagine", context_copy: "Copia {{var0}}",
context_copyimagelink: "Copia link immagine",
context_lenssize: "Dimensione della lente", context_lenssize: "Dimensione della lente",
context_reverseimagesearch: "Cerca immagine con ...", context_saveas: "Salva {{var0}} come ...",
context_saveimageas: "Salva l'immagine come ...", context_searchwith: "Cerca {{var0}} con ...",
context_viewimage: "Guarda l'immagine", context_view: "Visualizza {{var0}}",
submenu_disabled: "Tutti disabilitati", submenu_disabled: "Tutti disabilitati",
toast_copyimage_failed: "Impossibile copiare l'immagine negli Appunti", toast_copy_failed: "{{var0}} non può essere copiato negli appunti",
toast_copyimage_success: "Immagine copiata negli Appunti", toast_copy_success: "{{var0}} è stato copiato negli appunti",
toast_copyimagelink_success: "Collegamento immagine copiato negli Appunti", toast_save_failed: "Impossibile salvare {{var0}} in '{{var1}}'",
toast_saveimage_failed: "Impossibile salvare l'immagine in '{{path}}'", toast_save_success: "{{var0}} è stato salvato in '{{var1}}'"
toast_saveimage_success: "Immagine salvata in '{{path}}'"
}; };
case "ja": // Japanese case "ja": // Japanese
return { return {
context_copyimage: "画像をコピーする", context_copy: "{{var0}} をコピーします",
context_copyimagelink: "画像リンクをコピー",
context_lenssize: "レンズサイズ", context_lenssize: "レンズサイズ",
context_reverseimagesearch: "で画像を検索...", context_saveas: "{{var0}} を...として保存します",
context_saveimageas: "画像を保存します ...", context_searchwith: "{{var0}} を...で検索",
context_viewimage: "画像を見る", context_view: "{{var0}} を表示",
submenu_disabled: "すべて無効", submenu_disabled: "すべて無効",
toast_copyimage_failed: "画像をクリップボードにコピーできませんでした", toast_copy_failed: "{{var0}} をクリップボードにコピーできませんでした",
toast_copyimage_success: "画像をクリップボードにコピー", toast_copy_success: "{{var0}} がクリップボードにコピーされました",
toast_copyimagelink_success: "クリップボードへのコピーされた画像リンク", toast_save_failed: "{{var0}} を「'{{var1}}'」に保存できませんでした",
toast_saveimage_failed: "'{{path}}'に画像を保存できませんでした", toast_save_success: "{{var0}} は「'{{var1}}'」に保存されました"
toast_saveimage_success: "'{{path}}'に保存された画像"
}; };
case "ko": // Korean case "ko": // Korean
return { return {
context_copyimage: "복사 이미지", context_copy: "{{var0}} 복사",
context_copyimagelink: "이미지 링크 복사",
context_lenssize: "렌즈 크기", context_lenssize: "렌즈 크기",
context_reverseimagesearch: "이미지 검색 ...", context_saveas: "{{var0}} 을 다른 이름으로 저장 ...",
context_saveimageas: "다른 이름으로 이미지 저장 ...", context_searchwith: "{{var0}} 검색 ...",
context_viewimage: "이미지보기", context_view: "{{var0}} 보기",
submenu_disabled: "모두 비활성화 됨", submenu_disabled: "모두 비활성화 됨",
toast_copyimage_failed: "이미지를 클립 보드로 복사하지 못했습니다.", toast_copy_failed: "{{var0}} 을 클립 보드에 복사 할 수 없습니다.",
toast_copyimage_success: "클립 보드에 복사 된 이미지", toast_copy_success: "{{var0}} 이 클립 보드에 복사되었습니다.",
toast_copyimagelink_success: "클립 보드에 복사 된 이미지 링크", toast_save_failed: "{{var0}} 을 '{{var1}}'에 저장할 수 없습니다.",
toast_saveimage_failed: "'{{path}}'에 이미지를 저장하지 못했습니다.", toast_save_success: "{{var0}} 이 '{{var1}}'에 저장되었습니다."
toast_saveimage_success: "'{{path}}'에 저장된 이미지"
}; };
case "lt": // Lithuanian case "lt": // Lithuanian
return { return {
context_copyimage: "Kopijuoti paveiksliuką", context_copy: "Kopijuoti {{var0}}",
context_copyimagelink: "Kopijuoti vaizdo nuorodą",
context_lenssize: "Objektyvo dydis", context_lenssize: "Objektyvo dydis",
context_reverseimagesearch: "Ieškoti vaizde su ...", context_saveas: "Išsaugoti '{{var0}}' kaip ...",
context_saveimageas: "Išsaugoti paveikslėlį kaip ...", context_searchwith: "Ieškoti {{var0}} naudojant ...",
context_viewimage: "Peržiūrėti Nuotrauka", context_view: "Žiūrėti {{var0}}",
submenu_disabled: "Visi neįgalūs", submenu_disabled: "Visi neįgalūs",
toast_copyimage_failed: "Nepavyko nukopijuoti vaizdo į iškarpinę", toast_copy_failed: "{{var0}} nepavyko nukopijuoti į mainų sritį",
toast_copyimage_success: "Nukopijuotas vaizdas į mainų sritį", toast_copy_success: "{{var0}} buvo nukopijuota į mainų sritį",
toast_copyimagelink_success: "Nukopijuota vaizdo nuoroda į iškarpinę", toast_save_failed: "Nepavyko išsaugoti {{var0}} aplanke '{{var1}}'",
toast_saveimage_failed: "Nepavyko išsaugoti vaizdo '{{path}}'", toast_save_success: "{{var0}} išsaugotas aplanke '{{var1}}'"
toast_saveimage_success: "Išsaugotas vaizdas '{{path}}'"
}; };
case "nl": // Dutch case "nl": // Dutch
return { return {
context_copyimage: "Kopieer afbeelding", context_copy: "Kopieer {{var0}}",
context_copyimagelink: "Kopieer afbeeldingslink",
context_lenssize: "Lens Maat", context_lenssize: "Lens Maat",
context_reverseimagesearch: "Zoek afbeelding met ...", context_saveas: "Bewaar {{var0}} als ...",
context_saveimageas: "Sla afbeelding op als ...", context_searchwith: "Zoek {{var0}} met ...",
context_viewimage: "Bekijk afbeelding", context_view: "Bekijk {{var0}}",
submenu_disabled: "Allemaal uitgeschakeld", submenu_disabled: "Allemaal uitgeschakeld",
toast_copyimage_failed: "Het kopiëren van de afbeelding naar het klembord is mislukt", toast_copy_failed: "{{var0}} kan niet naar het klembord worden gekopieerd",
toast_copyimage_success: "Gekopieerde afbeelding naar klembord", toast_copy_success: "{{var0}} is naar het klembord gekopieerd",
toast_copyimagelink_success: "Gekopieerde afbeeldingslink naar het klembord", toast_save_failed: "{{var0}} kan niet worden opgeslagen in '{{var1}}'",
toast_saveimage_failed: "Kan afbeelding niet opslaan in '{{path}}'", toast_save_success: "{{var0}} is opgeslagen in '{{var1}}'"
toast_saveimage_success: "Opgeslagen afbeelding in '{{path}}'"
}; };
case "no": // Norwegian case "no": // Norwegian
return { return {
context_copyimage: "Kopier bilde", context_copy: "Kopier {{var0}}",
context_copyimagelink: "Kopier bildelink",
context_lenssize: "Linsestørrelse", context_lenssize: "Linsestørrelse",
context_reverseimagesearch: "Søk i bilde med ...", context_saveas: "Lagre {{var0}} som ...",
context_saveimageas: "Lagre bildet som ...", context_searchwith: "Søk på {{var0}} med ...",
context_viewimage: "Vis bilde", context_view: "Vis {{var0}}",
submenu_disabled: "Alle funksjonshemmede", submenu_disabled: "Alle funksjonshemmede",
toast_copyimage_failed: "Kunne ikke kopiere bildet til utklippstavlen", toast_copy_failed: "{{var0}} kunne ikke kopieres til utklippstavlen",
toast_copyimage_success: "Kopiert bilde til utklippstavlen", toast_copy_success: "{{var0}} ble kopiert til utklippstavlen",
toast_copyimagelink_success: "Kopiert bildekobling til utklippstavlen", toast_save_failed: "{{var0}} kunne ikke lagres i '{{var1}}'",
toast_saveimage_failed: "Kunne ikke lagre bildet i '{{path}}'", toast_save_success: "{{var0}} ble lagret i '{{var1}}'"
toast_saveimage_success: "Lagret bilde i '{{path}}'"
}; };
case "pl": // Polish case "pl": // Polish
return { return {
context_copyimage: "Skopiuj obraz", context_copy: "Kopiuj {{var0}}",
context_copyimagelink: "Kopiuj łącze do obrazu",
context_lenssize: "Rozmiar soczewki", context_lenssize: "Rozmiar soczewki",
context_reverseimagesearch: "Szukaj obrazu za pomocą ...", context_saveas: "Zapisz {{var0}} jako ...",
context_saveimageas: "Zapisz obraz jako ...", context_searchwith: "Wyszukaj {{var0}} za pomocą ...",
context_viewimage: "Zobacz obrazek", context_view: "Wyświetl {{var0}}",
submenu_disabled: "Wszystkie wyłączone", submenu_disabled: "Wszystkie wyłączone",
toast_copyimage_failed: "Nie udało się skopiować obrazu do schowka", toast_copy_failed: "Nie można skopiować {{var0}} do schowka",
toast_copyimage_success: "Skopiowany obraz do schowka", toast_copy_success: "{{var0}} został skopiowany do schowka",
toast_copyimagelink_success: "Link do skopiowanego obrazu do schowka", toast_save_failed: "Nie można zapisać {{var0}} w '{{var1}}'",
toast_saveimage_failed: "Nie udało się zapisać obrazu w '{{path}}”", toast_save_success: "{{var0}} został zapisany w '{{var1}}'"
toast_saveimage_success: "Zapisany obraz w '{{path}}”"
}; };
case "pt-BR": // Portuguese (Brazil) case "pt-BR": // Portuguese (Brazil)
return { return {
context_copyimage: "Copiar imagem", context_copy: "Copiar {{var0}}",
context_copyimagelink: "Copiar link da imagem",
context_lenssize: "Tamanho da lente", context_lenssize: "Tamanho da lente",
context_reverseimagesearch: "Pesquisar imagem com ...", context_saveas: "Salve {{var0}} como ...",
context_saveimageas: "Salvar imagem como ...", context_searchwith: "Pesquise {{var0}} com ...",
context_viewimage: "Ver imagem", context_view: "Veja {{var0}}",
submenu_disabled: "Todos desativados", submenu_disabled: "Todos desativados",
toast_copyimage_failed: "Falha ao copiar a imagem para a área de transferência", toast_copy_failed: "{{var0}} não pôde ser copiado para a área de transferência",
toast_copyimage_success: "Imagem copiada para a área de transferência", toast_copy_success: "{{var0}} foi copiado para a área de transferência",
toast_copyimagelink_success: "Link da imagem copiada para a área de transferência", toast_save_failed: "{{var0}} não pôde ser salvo em '{{var1}}'",
toast_saveimage_failed: "Falha ao salvar a imagem em '{{path}}'", toast_save_success: "{{var0}} foi salvo em '{{var1}}'"
toast_saveimage_success: "Imagem salva em '{{path}}'"
}; };
case "ro": // Romanian case "ro": // Romanian
return { return {
context_copyimage: "Copiază imaginea", context_copy: "Copiați {{var0}}",
context_copyimagelink: "Copiați linkul de imagine",
context_lenssize: "Dimensiunea obiectivului", context_lenssize: "Dimensiunea obiectivului",
context_reverseimagesearch: "Căutați imaginea cu ...", context_saveas: "Salvați {{var0}} ca ...",
context_saveimageas: "Salveaza imaginea ca ...", context_searchwith: "Căutați {{var0}} cu ...",
context_viewimage: "Vezi imaginea", context_view: "Vizualizați {{var0}}",
submenu_disabled: "Toate sunt dezactivate", submenu_disabled: "Toate sunt dezactivate",
toast_copyimage_failed: "Copierea imaginii în clipboard nu a reușit", toast_copy_failed: "{{var0}} nu a putut fi copiat în clipboard",
toast_copyimage_success: "Copiat imaginea în Clipboard", toast_copy_success: "{{var0}} a fost copiat în clipboard",
toast_copyimagelink_success: "Link copiat pentru imagine în Clipboard", toast_save_failed: "{{var0}} nu a putut fi salvat în '{{var1}}'",
toast_saveimage_failed: "Salvarea imaginii în '{{path}}” nu a reușit", toast_save_success: "{{var0}} a fost salvat în '{{var1}}'"
toast_saveimage_success: "Imagine salvată în '{{path}}”"
}; };
case "ru": // Russian case "ru": // Russian
return { return {
context_copyimage: "Копировать изображение", context_copy: "Скопируйте {{var0}}",
context_copyimagelink: "Копировать ссылку на изображение",
context_lenssize: "Размер линзы", context_lenssize: "Размер линзы",
context_reverseimagesearch: "Искать изображение с помощью ...", context_saveas: "Сохранить {{var0}} как ...",
context_saveimageas: "Сохранить изображение как ...", context_searchwith: "Искать {{var0}} с помощью ...",
context_viewimage: "Просмотр изображения", context_view: "Посмотреть {{var0}}",
submenu_disabled: "Все отключены", submenu_disabled: "Все отключены",
toast_copyimage_failed: "Не удалось скопировать изображение в буфер обмена", toast_copy_failed: "{{var0}} не удалось скопировать в буфер обмена",
toast_copyimage_success: "Изображение скопировано в буфер обмена", toast_copy_success: "{{var0}} скопирован в буфер обмена",
toast_copyimagelink_success: "Ссылка на скопированное изображение в буфер обмена", toast_save_failed: "{{var0}} не удалось сохранить в '{{var1}}'",
toast_saveimage_failed: "Не удалось сохранить изображение в '{{path}}'", toast_save_success: "{{var0}} был сохранен в '{{var1}}'"
toast_saveimage_success: "Сохраненное изображение в '{{path}}'"
}; };
case "sv": // Swedish case "sv": // Swedish
return { return {
context_copyimage: "Kopiera bild", context_copy: "Kopiera {{var0}}",
context_copyimagelink: "Kopiera bildlänk",
context_lenssize: "Linsstorlek", context_lenssize: "Linsstorlek",
context_reverseimagesearch: "Sök bild med ...", context_saveas: "Spara {{var0}} som ...",
context_saveimageas: "Spara bild som ...", context_searchwith: "Sök {{var0}} med ...",
context_viewimage: "Se bild", context_view: "Visa {{var0}}",
submenu_disabled: "Alla funktionshindrade", submenu_disabled: "Alla funktionshindrade",
toast_copyimage_failed: "Det gick inte att kopiera bilden till Urklipp", toast_copy_failed: "{{var0}} kunde inte kopieras till Urklipp",
toast_copyimage_success: "Kopierad bild till Urklipp", toast_copy_success: "{{var0}} kopierades till Urklipp",
toast_copyimagelink_success: "Kopierad bildlänk till Urklipp", toast_save_failed: "{{var0}} kunde inte sparas i '{{var1}}'",
toast_saveimage_failed: "Det gick inte att spara bilden i '{{path}}'", toast_save_success: "{{var0}} sparades i '{{var1}}'"
toast_saveimage_success: "Sparad bild i '{{path}}'"
}; };
case "th": // Thai case "th": // Thai
return { return {
context_copyimage: "คัดลอกรูปภาพ", context_copy: "คัดลอก {{var0}}",
context_copyimagelink: "คัดลอกลิงค์รูปภาพ",
context_lenssize: "ขนาดเลนส์", context_lenssize: "ขนาดเลนส์",
context_reverseimagesearch: "ค้นหาภาพด้วย ...", context_saveas: "บันทึก {{var0}} เป็น ...",
context_saveimageas: "บันทึกภาพเป็น ...", context_searchwith: "ค้นหา {{var0}} ด้วย ...",
context_viewimage: "ดูภาพ", context_view: "ดู {{var0}}",
submenu_disabled: "ปิดใช้งานทั้งหมด", submenu_disabled: "ปิดใช้งานทั้งหมด",
toast_copyimage_failed: "คัดลอกรูปภาพไปยังคลิปบอร์ดไม่สำเร็จ", toast_copy_failed: "ไม่สามารถคัดลอก {{var0}} ไปยังคลิปบอร์ดได้",
toast_copyimage_success: "คัดลอกรูปภาพไปยังคลิปบอร์ดแล้ว", toast_copy_success: "คัดลอก {{var0}} ไปยังคลิปบอร์ดแล้ว",
toast_copyimagelink_success: "ลิงก์รูปภาพที่คัดลอกไปยังคลิปบอร์ด", toast_save_failed: "ไม่สามารถบันทึก {{var0}} ใน '{{var1}}'",
toast_saveimage_failed: "บันทึกภาพใน '{{path}}' ไม่สำเร็จ", toast_save_success: "{{var0}} ถูกบันทึกใน '{{var1}}'"
toast_saveimage_success: "ภาพที่บันทึกไว้ใน '{{path}}'"
}; };
case "tr": // Turkish case "tr": // Turkish
return { return {
context_copyimage: "Resmi kopyala", context_copy: "{{var0}} kopyala",
context_copyimagelink: "Resim Bağlantısını Kopyala",
context_lenssize: "Lens Boyutu", context_lenssize: "Lens Boyutu",
context_reverseimagesearch: "Şununla Resim Ara ...", context_saveas: "{{var0}} farklı kaydet ...",
context_saveimageas: "Resmi farklı kaydet ...", context_searchwith: "{{var0}} şununla ara ...",
context_viewimage: "Görseli göster", context_view: "{{var0}} görüntüle",
submenu_disabled: "Hepsi devre dışı", submenu_disabled: "Hepsi devre dışı",
toast_copyimage_failed: "Görüntü Panoya kopyalanamadı", toast_copy_failed: "{{var0}} panoya kopyalanamadı",
toast_copyimage_success: "Görüntü panoya kopyalandı", toast_copy_success: "{{var0}} panoya kopyalandı",
toast_copyimagelink_success: "Görüntü bağlantısı panoya kopyalandı", toast_save_failed: "{{var0}}, '{{var1}}' konumuna kaydedilemedi",
toast_saveimage_failed: "Resim '{{yol}}' içine kaydedilemedi", toast_save_success: "{{var0}}, '{{var1}}' konumuna kaydedildi"
toast_saveimage_success: "Resim '{{yol}}' içine kaydedildi"
}; };
case "uk": // Ukrainian case "uk": // Ukrainian
return { return {
context_copyimage: "Скопіювати зображення", context_copy: "Копіювати {{var0}}",
context_copyimagelink: "Скопіювати посилання на зображення",
context_lenssize: "Розмір лінзи", context_lenssize: "Розмір лінзи",
context_reverseimagesearch: "Шукати зображення за допомогою ...", context_saveas: "Збережіть {{var0}} як ...",
context_saveimageas: "Зберегти зображення як ...", context_searchwith: "Шукати {{var0}} за допомогою ...",
context_viewimage: "Переглянути зображення", context_view: "Переглянути {{var0}}",
submenu_disabled: "Всі інваліди", submenu_disabled: "Всі інваліди",
toast_copyimage_failed: "Не вдалося скопіювати зображення в буфер обміну", toast_copy_failed: "Не вдалося скопіювати {{var0}} у буфер обміну",
toast_copyimage_success: "Скопійовано зображення в буфер обміну", toast_copy_success: "{{var0}} скопійовано в буфер обміну",
toast_copyimagelink_success: "Скопійовано посилання на зображення в буфер обміну", toast_save_failed: "Не вдалося зберегти {{var0}} у '{{var1}}'",
toast_saveimage_failed: "Не вдалося зберегти зображення у '{{path}}'", toast_save_success: "{{var0}} було збережено у '{{var1}}'"
toast_saveimage_success: "Збережене зображення у '{{path}}'"
}; };
case "vi": // Vietnamese case "vi": // Vietnamese
return { return {
context_copyimage: "Sao chép hình ảnh", context_copy: "Sao chép {{var0}}",
context_copyimagelink: "Sao chép liên kết hình ảnh",
context_lenssize: "Kích thước ống kính", context_lenssize: "Kích thước ống kính",
context_reverseimagesearch: "Tìm kiếm Hình ảnh bằng ...", context_saveas: "Lưu {{var0}} dưới dạng ...",
context_saveimageas: "Lưu ảnh dưới dạng ...", context_searchwith: "Tìm kiếm {{var0}} bằng ...",
context_viewimage: "Xem hình ảnh", context_view: "Xem {{var0}}",
submenu_disabled: "Tất cả đã bị vô hiệu hóa", submenu_disabled: "Tất cả đã bị vô hiệu hóa",
toast_copyimage_failed: "Không sao chép được hình ảnh vào Clipboard", toast_copy_failed: "Không thể sao chép {{var0}} vào khay nhớ tạm",
toast_copyimage_success: "Đã sao chép hình ảnh vào Clipboard", toast_copy_success: "{{var0}} đã được sao chép vào khay nhớ tạm",
toast_copyimagelink_success: "Liên kết hình ảnh được sao chép vào Clipboard", toast_save_failed: "Không thể lưu {{var0}} trong '{{var1}}'",
toast_saveimage_failed: "Không lưu được Hình ảnh trong '{{path}}'", toast_save_success: "{{var0}} đã được lưu trong '{{var1}}'"
toast_saveimage_success: "Hình ảnh đã Lưu trong '{{path}}'"
}; };
case "zh-CN": // Chinese (China) case "zh-CN": // Chinese (China)
return { return {
context_copyimage: "复制图片", context_copy: "复制 {{var0}}",
context_copyimagelink: "复制图像链接",
context_lenssize: "镜片尺寸", context_lenssize: "镜片尺寸",
context_reverseimagesearch: "用...搜索图像", context_saveas: "将 {{var0}} 另存为 ...",
context_saveimageas: "将图像另存为...", context_searchwith: "用搜索 {{var0}} ...",
context_viewimage: "看图", context_view: "查看 {{var0}}",
submenu_disabled: "全部禁用", submenu_disabled: "全部禁用",
toast_copyimage_failed: "无法将图像复制到剪贴板", toast_copy_failed: "{{var0}} 无法复制到剪贴板",
toast_copyimage_success: "复制到剪贴板的图像", toast_copy_success: "{{var0}} 已复制到剪贴板",
toast_copyimagelink_success: "复制的图像链接到剪贴板", toast_save_failed: "{{var0}} 无法保存在'{{var1}}'中",
toast_saveimage_failed: "无法将图片保存到'{{path}}'中", toast_save_success: "{{var0}} 已保存在'{{var1}}'中"
toast_saveimage_success: "已将图像保存在'{{path}}'中"
}; };
case "zh-TW": // Chinese (Taiwan) case "zh-TW": // Chinese (Taiwan)
return { return {
context_copyimage: "複製圖片", context_copy: "複製 {{var0}}",
context_copyimagelink: "複製圖像鏈接",
context_lenssize: "鏡片尺寸", context_lenssize: "鏡片尺寸",
context_reverseimagesearch: "用...搜索圖像", context_saveas: "將 {{var0}} 另存為 ...",
context_saveimageas: "將圖像另存為...", context_searchwith: "用搜索 {{var0}} ...",
context_viewimage: "看圖", context_view: "查看 {{var0}}",
submenu_disabled: "全部禁用", submenu_disabled: "全部禁用",
toast_copyimage_failed: "無法將圖像複製到剪貼板", toast_copy_failed: "{{var0}} 無法複製到剪貼板",
toast_copyimage_success: "複製到剪貼板的圖像", toast_copy_success: "{{var0}} 已復製到剪貼板",
toast_copyimagelink_success: "複製的圖像鏈接到剪貼板", toast_save_failed: "{{var0}} 無法保存在'{{var1}}'中",
toast_saveimage_failed: "無法將圖片保存到'{{path}}'中", toast_save_success: "{{var0}} 已保存在'{{var1}}'中"
toast_saveimage_success: "已將圖像保存在'{{path}}'中"
}; };
default: // English default: // English
return { return {
context_copyimage: "Copy Image", context_copy: "Copy {{var0}}",
context_copyimagelink: "Copy Image Link",
context_lenssize: "Lens Size", context_lenssize: "Lens Size",
context_reverseimagesearch: "Search Image with ...", context_saveas: "Save {{var0}} as ...",
context_saveimageas: "Save Image as ...", context_searchwith: "Search {{var0}} with ...",
context_viewimage: "View Image", context_view: "View {{var0}}",
submenu_disabled: "All disabled", submenu_disabled: "All disabled",
toast_copyimage_failed: "Failed to copy Image to Clipboard", toast_copy_failed: "{{var0}} could not be copied to the Clipboard",
toast_copyimage_success: "Copied Image to Clipboard", toast_copy_success: "{{var0}} was copied to the Clipboard",
toast_copyimagelink_success: "Copied Image link to Clipboard", toast_save_failed: "{{var0}} could not be saved in '{{var1}}'",
toast_saveimage_failed: "Failed to save Image in '{{path}}'", toast_save_success: "{{var0}} was saved in '{{var1}}'"
toast_saveimage_success: "Saved Image in '{{path}}'"
}; };
} }
} }