From 67945c976c3b10bb4ab6e72373498df45e64dacc Mon Sep 17 00:00:00 2001 From: W_L Date: Tue, 4 Jun 2024 14:57:10 -0300 Subject: [PATCH 01/12] Bump version to 1.39.0-prerelease (#7501) --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 57be4cdf2d..79ecfe6ef1 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "manifest_version": 3, "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.38.2", - "version_name": "1.38.2", + "version": "1.39.0", + "version_name": "1.39.0-prerelease", "default_locale": "en", "background": { "service_worker": "background/background.js", From bbcc9c71213a55104235676aec090e68eb64084b Mon Sep 17 00:00:00 2001 From: "scratchaddons-bot[bot]" <73682299+scratchaddons-bot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:17:06 -0300 Subject: [PATCH 02/12] Translation update: 2024/06/04 (#7497) New strings from Transifex Co-authored-by: scratchaddons-bot[bot] <73682299+scratchaddons-bot[bot]@users.noreply.github.com> --- addons-l10n/ja/big-save-button.json | 2 +- addons-l10n/ja/place-backpack-code-at-cursor.json | 1 + addons-l10n/pl/editor-dark-mode.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 addons-l10n/ja/place-backpack-code-at-cursor.json diff --git a/addons-l10n/ja/big-save-button.json b/addons-l10n/ja/big-save-button.json index 4fbd730307..71d12f29c6 100644 --- a/addons-l10n/ja/big-save-button.json +++ b/addons-l10n/ja/big-save-button.json @@ -1 +1 @@ -{"big-save-button/@name":"「直ちに保存」ボタンを大きくする","big-save-button/@description":"エディターの「直ちに保存」ボタンを大きくして、クリックしやすくします。"} \ No newline at end of file +{"big-save-button/@name":"「直ちに保存」ボタンを大きくする","big-save-button/@description":"エディターの「直ちに保存」ボタンを大きくして、クリックしやすくする。"} \ No newline at end of file diff --git a/addons-l10n/ja/place-backpack-code-at-cursor.json b/addons-l10n/ja/place-backpack-code-at-cursor.json new file mode 100644 index 0000000000..70612293e4 --- /dev/null +++ b/addons-l10n/ja/place-backpack-code-at-cursor.json @@ -0,0 +1 @@ +{"place-backpack-code-at-cursor/@name":"バックパックから取り出したコードをカーソルの位置に置く","place-backpack-code-at-cursor/@description":"バックパックから取り出したコードブロックを、コードエリアの左上ではなくカーソルの位置に移動する。"} \ No newline at end of file diff --git a/addons-l10n/pl/editor-dark-mode.json b/addons-l10n/pl/editor-dark-mode.json index bb44868382..7e5f893b08 100644 --- a/addons-l10n/pl/editor-dark-mode.json +++ b/addons-l10n/pl/editor-dark-mode.json @@ -1 +1 @@ -{"editor-dark-mode/@name":"Ciemny tryb edytora i konfigurowalne kolory ","editor-dark-mode/@description":"Dostosuj kolory używane przez edytor Scratch. W tym dodatku znajdziesz wiele ciemnych motywów stworzonych przez różnych autorów. Jeśli nie potrzebujesz trybu ciemnego, ale chcesz zmienić kolory, możesz wybrać ustawienie \"Domyślne kolory” i dostosować je.","editor-dark-mode/@preset-name-3darker":"Ciemniejsze 3.0","editor-dark-mode/@preset-description-3darker":"Ciemny motyw oparty na kodzie autorstwa infinitytec.","editor-dark-mode/@preset-name-3darker-blue":"3.Ciemniejszy (niebieski)","editor-dark-mode/@preset-description-3darker-blue":"3.Ciemniejsza z niebieskim akcentem kolorów","editor-dark-mode/@preset-name-3dark":"Ciemne 3.0","editor-dark-mode/@preset-description-3dark":"Ciemnoniebieski motyw oparty na skrypcie autorstwa infinitytec.","editor-dark-mode/@preset-name-darkEditor":"Ciemny Edytor","editor-dark-mode/@preset-description-darkEditor":"Ciemny motyw oparty na stylu autorstwa _nix","editor-dark-mode/@preset-name-experimentalDark":"\"Eksperymentalny\" Ciemny Motyw","editor-dark-mode/@preset-description-experimentalDark":"Ciemny motyw autorstwa Maximouse. Już nie eksperymentalne","editor-dark-mode/@preset-name-tw-dark":"Ciemny TurboWarp","editor-dark-mode/@preset-description-tw-dark":"Ciemny motyw oparty na ciemnym stylu TurboWarp","editor-dark-mode/@preset-description-scratch2":"Motyw oparty na kolorach ze Scratcha 2.0","editor-dark-mode/@preset-description-scratch1":"Motyw oparty na kolorach Scratcha 1.x","editor-dark-mode/@preset-name-scratch":"Domyślne kolory Scratch","editor-dark-mode/@preset-description-scratch":"Domyślne kolory używane przez Scratch","editor-dark-mode/@preset-name-scratch-blue":"Domyślne kolory Scratch (niebieska)","editor-dark-mode/@credits-addon":"dodatek, \"Eksperymentalny\" Styl Ciemny","editor-dark-mode/@credits-darker":"Ciemny i Ciemniejszy styl 3.0","editor-dark-mode/@credits-dark":"Ciemny edytor","editor-dark-mode/@credits-twdark":"Tryb Ciemny TurboWarp","editor-dark-mode/@settings-name-page":"Tło strony","editor-dark-mode/@settings-name-primary":"Podkreślony kolor","editor-dark-mode/@settings-name-highlightText":"Kolor podkreślenia tekstu i ikony","editor-dark-mode/@settings-name-menuBar":"Tło paska menu","editor-dark-mode/@settings-name-activeTab":"Tło aktywnej zakładki","editor-dark-mode/@settings-name-tab":"Tło nieaktywnej zakładki","editor-dark-mode/@settings-name-selector":"Tło okienka duszka","editor-dark-mode/@settings-name-selector2":"Tło listy kostiumów i dźwięków","editor-dark-mode/@settings-name-selectorSelection":"Tło wybranego duszka/kostiumu/dźwięku","editor-dark-mode/@settings-name-accent":"Akcent tła","editor-dark-mode/@settings-name-input":"Tło danych wejściowych","editor-dark-mode/@settings-name-workspace":"Tło obszaru kodu","editor-dark-mode/@settings-name-categoryMenu":"Tło menu kategorii bloków","editor-dark-mode/@settings-name-palette":"Tło palety bloków","editor-dark-mode/@settings-name-fullscreen":"Tło pełnego ekranu","editor-dark-mode/@settings-name-stageHeader":"Tło nagłówka w trybie pełnoekranowym ","editor-dark-mode/@settings-name-border":"Kolor obramowania","editor-dark-mode/@settings-name-dots":"Pokaż kropki w obszarze roboczym","editor-dark-mode/@settings-name-affectStage":"Zmień kolor zmiennych, list, chmurek duszków i pól wpisywania odpowiedzi na scenie"} \ No newline at end of file +{"editor-dark-mode/@name":"Ciemny tryb edytora i konfigurowalne kolory ","editor-dark-mode/@description":"Dostosuj kolory używane przez edytor Scratch. W tym dodatku znajdziesz wiele ciemnych motywów stworzonych przez różnych autorów. Jeśli nie potrzebujesz trybu ciemnego, ale chcesz zmienić kolory, możesz wybrać ustawienie \"Domyślne kolory” i dostosować je.","editor-dark-mode/@preset-name-3darker":"Ciemniejsze 3.0","editor-dark-mode/@preset-description-3darker":"Ciemny motyw oparty na kodzie autorstwa infinitytec.","editor-dark-mode/@preset-name-3darker-blue":"3.Ciemniejszy (niebieski)","editor-dark-mode/@preset-description-3darker-blue":"3.Ciemniejsza z niebieskim akcentem kolorów","editor-dark-mode/@preset-name-3dark":"Ciemne 3.0","editor-dark-mode/@preset-description-3dark":"Ciemnoniebieski motyw oparty na skrypcie autorstwa infinitytec.","editor-dark-mode/@preset-name-darkEditor":"Ciemny Edytor","editor-dark-mode/@preset-description-darkEditor":"Ciemny motyw oparty na stylu autorstwa _nix","editor-dark-mode/@preset-name-experimentalDark":"\"Eksperymentalny\" Ciemny Motyw","editor-dark-mode/@preset-description-experimentalDark":"Ciemny motyw autorstwa Maximouse. Już nie eksperymentalne","editor-dark-mode/@preset-name-tw-dark":"Ciemny TurboWarp","editor-dark-mode/@preset-description-tw-dark":"Ciemny motyw oparty na ciemnym stylu TurboWarp","editor-dark-mode/@preset-description-scratch2":"Motyw oparty na kolorach ze Scratcha 2.0","editor-dark-mode/@preset-description-scratch1":"Motyw oparty na kolorach Scratcha 1.x","editor-dark-mode/@preset-name-scratch":"Domyślne kolory Scratch","editor-dark-mode/@preset-description-scratch":"Domyślne kolory używane przez Scratch","editor-dark-mode/@preset-name-scratch-blue":"Domyślne kolory Scratch (niebieska)","editor-dark-mode/@credits-addon":"dodatek, \"Eksperymentalny\" Styl Ciemny","editor-dark-mode/@credits-darker":"Ciemny i Ciemniejszy styl 3.0","editor-dark-mode/@credits-dark":"Ciemny edytor","editor-dark-mode/@credits-twdark":"Tryb Ciemny TurboWarp","editor-dark-mode/@settings-name-page":"Tło strony","editor-dark-mode/@settings-name-primary":"Podkreślony kolor","editor-dark-mode/@settings-name-highlightText":"Kolor podkreślenia tekstu i ikony","editor-dark-mode/@settings-name-menuBar":"Tło paska menu","editor-dark-mode/@settings-name-activeTab":"Tło aktywnej zakładki","editor-dark-mode/@settings-name-tab":"Tło nieaktywnej zakładki","editor-dark-mode/@settings-name-selector":"Tło okienka duszka","editor-dark-mode/@settings-name-selector2":"Tło listy kostiumów i dźwięków","editor-dark-mode/@settings-name-selectorSelection":"Tło wybranego duszka/kostiumu/dźwięku","editor-dark-mode/@settings-name-accent":"Akcent tła","editor-dark-mode/@settings-name-input":"Tło danych wejściowych","editor-dark-mode/@settings-name-workspace":"Tło obszaru kodu","editor-dark-mode/@settings-name-categoryMenu":"Tło menu kategorii bloków","editor-dark-mode/@settings-name-palette":"Tło palety bloków","editor-dark-mode/@settings-name-fullscreen":"Tło pełnego ekranu","editor-dark-mode/@settings-name-stageHeader":"Tło nagłówka w trybie pełnoekranowym ","editor-dark-mode/@settings-name-border":"Kolor obramowania","editor-dark-mode/@settings-name-dots":"Pokaż kropki w obszarze roboczym","editor-dark-mode/@settings-name-affectPaper":"Zmień tło w edytorze kostiumu","editor-dark-mode/@settings-name-affectStage":"Zmień kolor zmiennych, list, chmurek duszków i pól wpisywania odpowiedzi na scenie"} \ No newline at end of file From cd002c90ffa147656355e09f2d3144a21cc79566 Mon Sep 17 00:00:00 2001 From: Maximouse <51849865+mxmou@users.noreply.github.com> Date: Wed, 5 Jun 2024 21:29:56 +0200 Subject: [PATCH 03/12] my-ocular: purple reaction buttons (#7430) * Purple reaction buttons * Move code for dark mode support --- addons/dark-www/experimental_scratchr2.css | 19 ------------------- addons/my-ocular/reactions.css | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/addons/dark-www/experimental_scratchr2.css b/addons/dark-www/experimental_scratchr2.css index 5b6b510d7d..9757f9bd5d 100644 --- a/addons/dark-www/experimental_scratchr2.css +++ b/addons/dark-www/experimental_scratchr2.css @@ -257,10 +257,6 @@ button:hover, } /* Gray background */ -.my-ocular-reaction-button { - background-color: var(--darkWww-gray); - color: var(--darkWww-gray-scratchr2Text); -} .box, .postleft, .postfootleft, @@ -355,14 +351,10 @@ button:hover, } /* Input background */ -.my-ocular-popup, #comments .more-replies .pulldown { background-color: var(--darkWww-input); color: var(--darkWww-input-scratchr2Text); } -.my-ocular-popup::after { - border-top-color: var(--darkWww-input); -} #comments .more-replies { box-shadow: 0 -25px 20px -10px var(--darkWww-input); } @@ -409,13 +401,6 @@ textarea:focus, background-color: var(--darkWww-button-scratchr2PostHeader); border-top-color: var(--darkWww-button-scratchr2PostHeader); } -.my-ocular-reaction-button { - box-shadow: 0 0 2px var(--darkWww-button-scratchr2PostHeader); -} -.my-ocular-reaction-button.selected { - background-color: var(--darkWww-button-scratchr2PostHeader); - color: var(--darkWww-button-scratchr2PostHeaderText); -} .blockpost .box-head { border-top-color: rgba(255, 255, 255, 0.15); } @@ -478,7 +463,6 @@ input.link.black:active, .sa-collapse-footer #footer, .thumb img, .djangobb blockquote, -.my-ocular-popup, .media-list li, .media-item-content .media-thumb img, .header-text .profile-details .group, @@ -492,9 +476,6 @@ input.link.black:active, .markItUpHeader ul ul li:hover { border-color: var(--darkWww-border-15) !important; } -.my-ocular-popup::before { - border-top-color: var(--darkWww-border-15); -} .v-tabs li:hover { border-bottom-color: var(--darkWww-border-15); } diff --git a/addons/my-ocular/reactions.css b/addons/my-ocular/reactions.css index d1f7e34966..dde49275b9 100644 --- a/addons/my-ocular/reactions.css +++ b/addons/my-ocular/reactions.css @@ -5,14 +5,14 @@ .my-ocular-reaction-button { user-select: none; - background-color: #f2f2f2; + background-color: var(--darkWww-gray, #f2f2f2); margin: 0 5px; padding: 4px; vertical-align: middle; display: inline-block; /* don't wrap in the middle of a reaction */ line-height: 16px; border-radius: 6px; - box-shadow: 0 0 2px #28a5da; + box-shadow: 0 0 2px var(--darkWww-button-scratchr2PostHeader, #855cd6); text-shadow: none; opacity: 1; /* transition: opacity .5s; */ /* due to the way the list is rerendered, css transitions wont do anything */ @@ -21,11 +21,11 @@ } .my-ocular-reaction-button, .my-ocular-reaction-button:hover { - color: inherit; + color: var(--darkWww-gray-scratchr2Text, #322f31); } .my-ocular-reaction-button.selected { - color: #fff; - background-color: #28a5da; + color: var(--darkWww-button-scratchr2PostHeaderText, #fff); + background-color: var(--darkWww-button-scratchr2PostHeader, #855cd6); } .my-ocular-reaction-button > .my-ocular-popup { @@ -43,10 +43,10 @@ transform: translateX(-50%); width: max-content; padding: 6px; - background-color: #fafafa; - border: 1px solid #d9d9d9; + background-color: var(--darkWww-input, #fafafa); + border: 1px solid var(--darkWww-border-15, #d9d9d9); border-radius: 8px; - color: #322f31; + color: var(--darkWww-input-scratchr2Text, #322f31); } .my-ocular-popup::before { content: ""; @@ -57,7 +57,7 @@ width: 0; height: 0; border: 6px solid transparent; - border-top-color: #d9d9d9; + border-top-color: var(--darkWww-border-15, #d9d9d9); } .my-ocular-popup::after { content: ""; @@ -68,7 +68,7 @@ width: 0; height: 0; border: 5px solid transparent; - border-top-color: #fafafa; + border-top-color: var(--darkWww-input, #fafafa); } .my-ocular-reaction-menu-button { From ff306f3ba136455b6adc041ec4509b8878ab1608 Mon Sep 17 00:00:00 2001 From: Joe Clinton <48254978+Joeclinton1@users.noreply.github.com> Date: Wed, 5 Jun 2024 20:30:46 +0100 Subject: [PATCH 04/12] Bug fix for empty labels not working with reorder-custom-inputs addon (#7480) solve bug with space in empty label edge case --- addons/reorder-custom-inputs/modified-funcs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/reorder-custom-inputs/modified-funcs.js b/addons/reorder-custom-inputs/modified-funcs.js index e1217d8114..56aee8fd1f 100644 --- a/addons/reorder-custom-inputs/modified-funcs.js +++ b/addons/reorder-custom-inputs/modified-funcs.js @@ -27,7 +27,7 @@ export function modifiedCreateAllInputs(connectionMap) { this.populateArgument_(argumentType, argumentCount, connectionMap, id, input); argumentCount++; } else { - labelText = component.trim().replace("%l ", ""); + labelText = component == "%l" ? " " : component.replace("%l", "").trim(); } this.addProcedureLabel_(labelText.replace(/\\%/, "%")); } From 8ec2e09a1e853e6015dbf926fd81cb2c8a1e7da8 Mon Sep 17 00:00:00 2001 From: W_L Date: Wed, 5 Jun 2024 16:33:17 -0300 Subject: [PATCH 05/12] Remove `MANIFEST_VERSION` and related constants (#7489) --- background/handle-notifications.js | 12 +++++------- background/handle-permissions.js | 4 +--- background/message-cache.js | 6 +++--- background/transition.js | 6 ------ webpages/settings/permissions.js | 6 +----- 5 files changed, 10 insertions(+), 24 deletions(-) diff --git a/background/handle-notifications.js b/background/handle-notifications.js index 77bc39ced7..6618afaf41 100644 --- a/background/handle-notifications.js +++ b/background/handle-notifications.js @@ -1,7 +1,5 @@ import { updateBadge } from "./message-cache.js"; -const BROWSER_ACTION = globalThis.MANIFEST_VERSION === 2 ? "browser_action" : "action"; - const periods = [ { // Unfortunately, users on Chrome 96-99 will not get translations for these strings. @@ -55,17 +53,17 @@ function contextMenuUnmuted() { chrome.contextMenus.create({ id: "mute", title: (chrome.i18n.getMessage && chrome.i18n.getMessage("muteFor")) || "Do not disturb", - contexts: [BROWSER_ACTION], + contexts: ["action"], }); for (const period of periods) { chrome.contextMenus.create({ id: `mute_${period.mins}`, title: period.name, parentId: "mute", - contexts: [BROWSER_ACTION], + contexts: ["action"], }); } - chrome.browserAction.setIcon({ + chrome.action.setIcon({ path: { 16: chrome.runtime.getURL(chrome.runtime.getManifest().icons["16"]), 32: chrome.runtime.getURL(chrome.runtime.getManifest().icons["32"]), @@ -82,9 +80,9 @@ function contextMenuMuted() { chrome.contextMenus.create({ id: "unmute", title: (chrome.i18n.getMessage && chrome.i18n.getMessage("unmute")) || "Turn off Do not disturb", - contexts: [BROWSER_ACTION], + contexts: ["action"], }); - chrome.browserAction.setIcon({ + chrome.action.setIcon({ path: { 16: chrome.runtime.getURL("images/icon-gray-16.png"), 32: chrome.runtime.getURL("images/icon-gray-32.png"), diff --git a/background/handle-permissions.js b/background/handle-permissions.js index 559da877d7..3de48d08d9 100644 --- a/background/handle-permissions.js +++ b/background/handle-permissions.js @@ -12,11 +12,9 @@ const onPermissionsRevoked = ({ isStartup }) => { }; const checkSitePermissions = (sendResponse, { isStartup }) => { - const HOST_PERMISSIONS_KEY_NAME = globalThis.MANIFEST_VERSION === 2 ? "permissions" : "host_permissions"; - chrome.permissions.contains( { - origins: chrome.runtime.getManifest()[HOST_PERMISSIONS_KEY_NAME].filter((url) => url.startsWith("https://")), + origins: chrome.runtime.getManifest().host_permissions.filter((url) => url.startsWith("https://")), }, (hasPermissions) => { if (!hasPermissions) { diff --git a/background/message-cache.js b/background/message-cache.js index 4f4210947f..89a89f9ef7 100644 --- a/background/message-cache.js +++ b/background/message-cache.js @@ -43,8 +43,8 @@ export async function updateBadge(defaultStoreId) { const text = isLoggedIn ? String(count) : "?"; // The badge will show incorrect message count in other auth contexts. // Blocked on Chrome implementing store ID-based tab query - await promisify(chrome.browserAction.setBadgeBackgroundColor.bind(chrome.browserAction))({ color }); - await promisify(chrome.browserAction.setBadgeText.bind(chrome.browserAction))({ text }); + await promisify(chrome.action.setBadgeBackgroundColor.bind(chrome.action))({ color }); + await promisify(chrome.action.setBadgeText.bind(chrome.action))({ text }); return; } } @@ -57,7 +57,7 @@ export async function updateBadge(defaultStoreId) { // Hide badge when logged out and showOffline is false, // or when the logged-in user has no unread messages, // or when the addon is disabled - await promisify(chrome.browserAction.setBadgeText.bind(chrome.browserAction))({ text: "" }); + await promisify(chrome.action.setBadgeText.bind(chrome.action))({ text: "" }); } /** diff --git a/background/transition.js b/background/transition.js index 31a1295c62..4d6fc917b0 100644 --- a/background/transition.js +++ b/background/transition.js @@ -1,9 +1,3 @@ -globalThis.MANIFEST_VERSION = 3; - -if (globalThis.MANIFEST_VERSION === 3) { - chrome.browserAction = chrome.action; -} - const utm = `utm_source=extension&utm_medium=tabscreate&utm_campaign=v${chrome.runtime.getManifest().version}`; // Note: chrome.i18n.getUILanguage is not available Chrome 96-99 const uiLanguage = (chrome.i18n.getUILanguage && chrome.i18n.getUILanguage()) || navigator.language; diff --git a/webpages/settings/permissions.js b/webpages/settings/permissions.js index 99b7c5e53c..800946efd6 100644 --- a/webpages/settings/permissions.js +++ b/webpages/settings/permissions.js @@ -25,13 +25,9 @@ const promisify = (...args) => new Promise((resolve) => callbackFn(...args, resolve)); -const MANIFEST_VERSION = 3; - document.getElementById("permissionsBtn").addEventListener("click", async () => { - const HOST_PERMISSIONS_KEY_NAME = MANIFEST_VERSION === 2 ? "permissions" : "host_permissions"; - const manifest = chrome.runtime.getManifest(); - const origins = manifest[HOST_PERMISSIONS_KEY_NAME].filter((url) => url.startsWith("https://")); + const origins = manifest.host_permissions.filter((url) => url.startsWith("https://")); const granted = await promisify(chrome.permissions.request)({ origins }); if (granted) { From ffa21b50fd7e4b3980b4cd9af1138c7de30d5645 Mon Sep 17 00:00:00 2001 From: "scratchaddons-bot[bot]" <73682299+scratchaddons-bot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:17:27 -0300 Subject: [PATCH 06/12] Translation update: 2024/06/07 (#7508) New strings from Transifex Co-authored-by: scratchaddons-bot[bot] <73682299+scratchaddons-bot[bot]@users.noreply.github.com> --- _locales/vi/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 312ecfe27b..32b9471caa 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -1 +1 @@ -{"extensionName":{"message":"Scratch Addons"},"extensionDescription":{"message":"Scratch Addons cung cấp cho bạn nhiều tính năng và chủ đề có thể tùy chỉnh cho trang web scratch.mit.edu và trình chỉnh sửa dự án."},"messaging":{"message":"Tin nhắn"},"games":{"message":"Trò chơi"},"openInNewTab":{"message":"Mở trong thẻ trình duyệt mới"},"changelog":{"message":"Xem nhật ký thay đổi"},"notifChangelog":{"message":"Xem nhật ký thay đổi"},"15min":{"message":"Trong 15 phút"},"1hour":{"message":"Trong 1 giờ"},"8hours":{"message":"Trong 8 giờ"},"24hours":{"message":"Trong 24 giờ"},"untilEnabled":{"message":"Cho đến khi tôi bật nó lại"},"muteFor":{"message":"Không làm phiền"},"unmute":{"message":"Tắt chế độ Không làm phiền"},"recommended":{"message":"Khuyên dùng"},"featured":{"message":"Nổi bật"},"beta":{"message":"Chưa hoàn chỉnh"},"danger":{"message":"Nguy hiểm"},"dangerWarning":{"message":"Bạn có chắc bạn muốn sử dụng tính năng \"$1\"?"},"forums":{"message":"Diễn đàn "},"forEditor":{"message":"Cho trình dự án"},"forWebsite":{"message":"Cho trang web"},"confirmPreset":{"message":"Tải giá trị đặt trước này và ghi đè lên cài đặt hiện tại của tiện ích bổ sung này?"},"confirmReset":{"message":"Bạn có chắc bạn muốn cài đặt lại tính năng này về ban đầu không?"},"settingsTitle":{"message":"Cài đặt - Scratch Addons"},"settings":{"message":"Cài đặt"},"all":{"message":"Tất cả"},"editorFeatures":{"message":"Tính năng trình dự án"},"costumeEditorFeatures":{"message":"Trình chỉnh sửa trang phục"},"codeEditorFeatures":{"message":"Trình tạo lệnh"},"websiteFeatures":{"message":"Các tính năng dành trang web Scratch"},"profilesFeatures":{"message":"Hồ sơ"},"projectPlayerFeatures":{"message":"Trình chiếu dự án"},"projectPageFeatures":{"message":"Trang dự án"},"others":{"message":"Khác"},"themes":{"message":"Chủ đề"},"editorThemes":{"message":"Chủ đề trình chỉnh sửa"},"websiteThemes":{"message":"Chủ đề trang web"},"popupFeatures":{"message":"Tính năng cửa sổ nổi lên"},"theme":{"message":"Chủ đề:"},"credits":{"message":"Danh đề"},"review":{"message":"Đánh giá"},"feedback":{"message":"Gửi phản hồi"},"moreSettings":{"message":"Thêm cài đặt"},"close":{"message":"Đóng"},"filter":{"message":"Bộ lọc:"},"resetToDefault":{"message":"Thu hồi về cài đặt ban đầu"},"creditTo":{"message":"Công lao từ:"},"viewLicenses":{"message":"Xem giấy phép thư viện"},"reset":{"message":"Cài đặt lại"},"default":{"message":"Mặc định"},"presets":{"message":"Cài đặt có sẵn"},"preview":{"message":"Xem trước"},"scratchAddonsTheme":{"message":"Chủ đề cho Scratch Addons"},"scratchAddonsThemeDescription":{"message":"Nó giúp bạn thay đổi giữa nền sáng và tối cho trang cài đặt và cửa sổ hiện lên của tiện ích."},"light":{"message":"Sáng"},"dark":{"message":"Tối"},"licensesTitle":{"message":"Giấy phép - Scratch Addons"},"licenses":{"message":"Giấy phép"},"licensesForLibrary":{"message":"Giấy phép dành cho thư viện $1"},"libraryCredits":{"message":"Xem giấy phép của thư viện được sử dụng"},"recommendedTooltip":{"message":"Cái này đã được khuyên dùng bởi Scratch Addons. Hãy thử nó đi!"},"dangerTooltip":{"message":"Cân nhắc trước khi sử dụng. Hãy bảo đảm bạn hiểu những gì tính năng này làm trước khi bật lên."},"betaTooltip":{"message":"Hãy ghi nhớ rằng tính năng này có thể vẫn còn có thể có lỗi."},"forumsTooltip":{"message":"Tính năng này áp dụng cho Diễn đàn thảo luận của Scratch."},"reportItHere":{"message":"báo cáo nó tại đây"},"forumWarning":{"message":"Tin nhắn từ tiện ích Scratch Addons: Hãy bảo đảm rằng lỗi bạn chuẩn bị báo cáo vẫn còn xuất hiện khi tất cả tiện ích trên trình duyệt đã đóng, kể cả Scratch Addons. Nếu bạn tin là cái lỗi gây ra bởi Scratch Addons, hãy $1."},"forumWarningGeneral":{"message":"Tin nhắn từ tiện ích Scratch Addons: Chính sách của Scratch cấm việc thảo luận về tiện ích trình duyệt, kể cả Scratch Addons. Không quảng cáo Scratch Addons hay bất kỳ tính năng của nó. Nếu bạn tìm thấy lỗi, hãy $1."},"search":{"message":"Tìm kiếm"},"permissionsTitle":{"message":"Quyền hạn - Scratch Addons"},"permissions":{"message":"Quyền hạn"},"enablePermissionsTitle":{"message":"Vui lòng bật truy cập trang web"},"enablePermissionsDescription":{"message":"Scratch Addons cần quyền truy cập trang web để hoạt động."},"enableButton":{"message":"Bật"},"enableButtonDescription":{"message":"Bấm nút để bật."},"permissionsScreenAlt":{"message":"Ảnh chụp màn hình hộp thoại cho phép truy cập trang web"},"clickAllowDescription":{"message":"Bấm \"Cho phép\". Scratch Addons sẽ tải lại và hoạt động trở lại"},"permissionsDenied":{"message":"Không thể bật quyền truy cập trang web. Thử lại."},"translate":{"message":"Giúp phiên dịch"},"extensionUpdate":{"message":"Cập nhật tiện ích Scratch Addons"},"extensionHasUpdated":{"message":"Scratch addon đã được nâng cấp lên phiên bản $1"},"scratchAddonsSettings":{"message":"Cài đặt Scratch Addons"},"readTheBlogPost":{"message":"Đọc $1 để biết thêm thông tin.","description":"The placeholder is \"blog post\""},"blogPost":{"message":"bài viết trên blog"},"notAffiliated":{"message":"Scratch Addons không phải là một phần của Scratch."},"new":{"message":"Mới!","description":"Tag for addons. Singular."},"updated":{"message":"Tính năng mới","description":"Tag for addons with new features. Singular."},"updatedWithSettings":{"message":"Cài đặt mới","description":"Tag for addons with new settings. Singular."},"newGroup":{"message":"Những tiện ích và cập nhật mới khác","description":"Used as a category name for new addons and updates"},"featuredNew":{"message":"Các addon và bản cập nhật mới nổi bật","description":"Used as a category name for featured new addons and updates"},"enabled":{"message":"Đã bật","description":"Used as a category name for enabled addons"},"exportAndImportSettings":{"message":"Xuất ra và nhập vào cài đặt"},"exportAndImportSettingsDescription":{"message":"Xuất cài đặt ra tệp JSON để có thể sử dụng trên các máy tính khác."},"useBrowserSync":{"message":"Bạn cũng có thể bật tùy chọn đồng bộ hóa tích hợp trong trình duyệt của mình để tự động đồng bộ hóa cài đặt giữa các thiết bị."},"export":{"message":"Xuất ra cài đặt"},"import":{"message":"Nhập vào cài đặt"},"viewSettings":{"message":"Xem tệp cài đặt"},"fileNotSelected":{"message":"Xin chọn một tệp cài đặt"},"importSuccess":{"message":"Cài đặt đã được nhập vào thành công. Scratch Addons sẽ tải lại"},"importFailed":{"message":"Tệp cài đặt không hợp lệ. Xin vui lòng thử lại"},"confirmImport":{"message":"Xác nhận"},"language":{"message":"Ngôn ngữ"},"applySettings":{"message":"Áp dụng thay đổi"},"quickSettings":{"message":"bổ trợ"},"runningOnThisPage":{"message":"Tiện ích trên tab này"},"recentlyUsed":{"message":"Được sử dụng gần đây","description":"Used as a category name for recently used addons"},"settingsPagePermission":{"message":"Để bật tiện ích \"$1\", đi đến trang cài đặt toàn màn hình"},"openFullSettings":{"message":"Mở chế độ phóng to màn hình"},"skipOpenFullSettings":{"message":"Hủy"},"exploreAllAddons":{"message":"Khám phá tất cả các tiện ích bổ sung $1:","description":"Placeholder is a number. Example: explore all 80+ addons"},"searchNotFound":{"message":"Không có kết quả nào cho từ khóa này. Bạn hãy nên thử từ khóa khác."},"searchNotFoundInCategory":{"message":"Không có từ khóa nào trong \"$1\". Bạn hãy nên thử những từ khóa khác."},"captureCommentError":{"message":"Thông báo được thêm bởi Scratch Addons: nhận xét của bạn đề cập đến tiện ích mở rộng trình duyệt. $1 kêu gọi Scratchers không quảng cáo chúng, vì Nhóm Scratch chưa xem xét độ an toàn của chúng và không thể kiểm tra từng cái một. Vui lòng tuân theo chính sách nói trên bằng cách tránh mọi tham chiếu đến tiện ích mở rộng của trình duyệt khi đăng trên Scratch.","description":"The placeholder is \"Browser Extension Policy\""},"captureCommentPolicy":{"message":"Chính sách tiện ích mở rộng cho trình duyệt"},"captureCommentPostAnyway":{"message":"Vẫn đăng"},"captureCommentConfirm":{"message":"Việc đăng nhận xét này có thể dẫn đến việc tự động tắt tiếng tài khoản của bạn, tạm thời ngăn bạn nhận xét. Việc tắt tiếng liên tục có thể dẫn đến việc tài khoản của bạn bị chặn khỏi Scratch. Bạn có chắc chắn muốn gửi bình luận này?"},"extensionStoreDescription1":{"message":"Chọn từ 100+ tùy chọn:","description:":"Used in the description for the extension stores"},"extensionStoreDescription2":{"message":"• Nhanh chóng đọc và trả lời tin nhắn bằng cách nhấp vào biểu tượng tiện ích mở rộng.\n• Tham gia các trò chơi nhiều người chơi đang hoạt động với tab trò chơi trên đám mây.\n• Làm đẹp mọi trang trên trang web Scratch với phong cách 3.0 và các tùy chọn cho chế độ tối và chủ đề màu tùy chỉnh.\n• Dễ dàng rời khỏi studio, quảng bá hoặc loại bỏ người phụ trách và duyệt những người theo dõi để mời.\n• Cải thiện việc quản lý dự án với thanh tìm kiếm Thành Phẩm của Tôi và nút hủy chia sẻ.\n• Cải thiện trình phát dự án bằng nút tạm dừng, 60FPS và hỗ trợ gamepad.\n• Hoạt hình dễ dàng hơn với tính năng lột da củ hành, chọn màu chính xác và tìm kiếm trang phục.\n• Nâng cao hiệu quả mã hóa của bạn với tìm kiếm khối, danh sách thả xuống có thể tìm kiếm, chuyển đổi khối, lấy một lần và sao chép/dán.\n• Luôn ngăn nắp với bảng khối tự động ẩn và các thư mục sprite.\n• Trực tiếp đặt và đóng băng hình thu nhỏ của dự án thành bất kỳ hình ảnh hoặc GIF nào.\n• Mang về những khối mèo từ Cá tháng Tư.\n• Gỡ lỗi các dự án bằng cách ghi nhật ký, theo dõi hiệu suất và thực hiện từng bước.\n• Và hơn thế nữa với mỗi bản cập nhật!","description":"Used in the description for the extension stores"},"extensionStoreDescription3":{"message":"Tiện ích mở rộng này là phần mềm mã nguồn mở được cấp phép theo GPL v3.\nĐể đóng góp hoặc kiểm tra mã nguồn: https://github.com/ScratchAddons\nĐể biết thêm thông tin, hãy truy cập: ScratchAddons.com","description":"Used in the description for the extension stores. Do not translate \"GPL v3\" or the links."},"extensionStoreDescription4":{"message":"Dự án này không được liên kết, liên kết hoặc theo bất kỳ cách nào được kết nối chính thức với trang web Scratch hoặc các tổ chức duy trì nó.","description":"Used in the description for the extension stores"}} \ No newline at end of file +{"extensionName":{"message":"Scratch Addons"},"extensionDescription":{"message":"Scratch Addons cung cấp cho bạn nhiều tính năng và chủ đề có thể tùy chỉnh cho trang web scratch.mit.edu và trình chỉnh sửa dự án."},"messaging":{"message":"Tin nhắn"},"games":{"message":"Trò chơi"},"openInNewTab":{"message":"Mở trong thẻ trình duyệt mới"},"changelog":{"message":"Xem nhật ký thay đổi"},"notifChangelog":{"message":"Xem nhật ký thay đổi"},"15min":{"message":"Trong 15 phút"},"1hour":{"message":"Trong 1 giờ"},"8hours":{"message":"Trong 8 giờ"},"24hours":{"message":"Trong 24 giờ"},"untilEnabled":{"message":"Cho đến khi tôi bật nó lại"},"muteFor":{"message":"Không làm phiền"},"unmute":{"message":"Tắt chế độ Không làm phiền"},"recommended":{"message":"Khuyên dùng"},"featured":{"message":"Nổi bật"},"beta":{"message":"Bản thử nghiệm"},"danger":{"message":"Nguy hiểm"},"dangerWarning":{"message":"Bạn có chắc bạn muốn sử dụng tính năng \"$1\"?"},"forums":{"message":"Diễn đàn "},"forEditor":{"message":"Cho trình chỉnh sửa"},"forWebsite":{"message":"Cho trang web"},"confirmPreset":{"message":"Tải giá trị đặt trước này và ghi đè lên cài đặt hiện tại của tiện ích bổ sung này?"},"confirmReset":{"message":"Bạn có chắc bạn muốn cài đặt lại tính năng này về ban đầu không?"},"settingsTitle":{"message":"Cài đặt - Scratch Addons"},"settings":{"message":"Cài đặt"},"all":{"message":"Tất cả"},"editorFeatures":{"message":"Tính năng cho trình chỉnh sửa của Scratch"},"costumeEditorFeatures":{"message":"Trình chỉnh sửa trang phục"},"codeEditorFeatures":{"message":"Trình tạo lệnh"},"websiteFeatures":{"message":"Các tính năng dành trang web Scratch"},"profilesFeatures":{"message":"Hồ sơ"},"projectPlayerFeatures":{"message":"Trình chiếu dự án"},"projectPageFeatures":{"message":"Trang dự án"},"others":{"message":"Khác"},"themes":{"message":"Chủ đề"},"editorThemes":{"message":"Chủ đề trình chỉnh sửa"},"websiteThemes":{"message":"Chủ đề trang web"},"popupFeatures":{"message":"Tính năng cửa sổ nổi lên"},"theme":{"message":"Chủ đề:"},"credits":{"message":"Danh đề"},"review":{"message":"Đánh giá"},"feedback":{"message":"Gửi phản hồi"},"moreSettings":{"message":"Thêm cài đặt"},"close":{"message":"Đóng"},"filter":{"message":"Bộ lọc:"},"resetToDefault":{"message":"Đặt lại về cài đặt ban đầu"},"creditTo":{"message":"Công lao từ:"},"viewLicenses":{"message":"Xem giấy phép thư viện"},"reset":{"message":"Cài đặt lại"},"default":{"message":"Mặc định"},"presets":{"message":"Cài đặt có sẵn"},"preview":{"message":"Xem trước"},"scratchAddonsTheme":{"message":"Chủ đề cho Scratch Addons"},"scratchAddonsThemeDescription":{"message":"Nó giúp bạn thay đổi giữa nền sáng và tối cho trang cài đặt và cửa sổ hiện lên của tiện ích."},"light":{"message":"Sáng"},"dark":{"message":"Tối"},"licensesTitle":{"message":"Giấy phép - Scratch Addons"},"licenses":{"message":"Giấy phép"},"licensesForLibrary":{"message":"Giấy phép dành cho thư viện $1"},"libraryCredits":{"message":"Xem giấy phép của thư viện được sử dụng"},"recommendedTooltip":{"message":"Cái này đã được khuyên dùng bởi Scratch Addons. Hãy thử nó đi!"},"dangerTooltip":{"message":"Cân nhắc trước khi sử dụng. Hãy bảo đảm bạn hiểu những gì tính năng này làm trước khi bật lên."},"betaTooltip":{"message":"Hãy ghi nhớ rằng tính năng này có thể vẫn còn có thể có lỗi."},"forumsTooltip":{"message":"Tính năng này áp dụng cho Diễn đàn thảo luận của Scratch."},"reportItHere":{"message":"báo cáo nó tại đây"},"forumWarning":{"message":"Tin nhắn từ tiện ích Scratch Addons: Hãy bảo đảm rằng lỗi bạn chuẩn bị báo cáo vẫn còn xuất hiện khi tất cả tiện ích trên trình duyệt đã đóng, kể cả Scratch Addons. Nếu bạn tin là cái lỗi gây ra bởi Scratch Addons, hãy $1."},"forumWarningGeneral":{"message":"Tin nhắn từ tiện ích Scratch Addons: Chính sách của Scratch cấm việc thảo luận về tiện ích trình duyệt, kể cả Scratch Addons. Không quảng cáo Scratch Addons hay bất kỳ tính năng của nó. Nếu bạn tìm thấy lỗi, hãy $1."},"search":{"message":"Tìm kiếm"},"permissionsTitle":{"message":"Quyền hạn - Scratch Addons"},"permissions":{"message":"Quyền hạn"},"enablePermissionsTitle":{"message":"Vui lòng bật truy cập trang web"},"enablePermissionsDescription":{"message":"Scratch Addons cần quyền truy cập trang web để hoạt động."},"enableButton":{"message":"Bật"},"enableButtonDescription":{"message":"Bấm nút để bật."},"permissionsScreenAlt":{"message":"Ảnh chụp màn hình hộp thoại cho phép truy cập trang web"},"clickAllowDescription":{"message":"Bấm \"Cho phép\". Scratch Addons sẽ tải lại và hoạt động trở lại"},"permissionsDenied":{"message":"Không thể bật quyền truy cập trang web. Thử lại."},"translate":{"message":"Giúp phiên dịch"},"extensionUpdate":{"message":"Cập nhật tiện ích Scratch Addons"},"extensionHasUpdated":{"message":"Scratch addon đã được nâng cấp lên phiên bản $1"},"extensionUpdateInfo1_v1_38":{"message":"Đây là bản cập nhật thử nghiệm mà chúng tôi đang phát hành cho một phần cơ sở người dùng của mình. Nó chứa một số thay đổi hậu trường để hỗ trợ kiến ​​trúc tiện ích mở rộng mới mà trình duyệt yêu cầu (Manifest V3). Nếu bạn gặp bất kỳ vấn đề hoặc hành vi không mong muốn nào, vui lòng $1. Ngoài ra còn có một nút để gửi phản hồi trong trang cài đặt.","description":"!! The placeholder is \"send feedback\"."},"scratchAddonsSettings":{"message":"Cài đặt Scratch Addons"},"sendFeedbackNotification":{"message":"gửi phản hồi"},"extensionUpdateInfo2_v1_38":{"message":"Bản cập nhật này không giới thiệu bất kỳ tính năng mới nào, nhưng hãy chú ý tới các bản cập nhật sắp tới vì nó có thể sẽ có những thứ mà bạn không nghĩ tới đó."},"readTheBlogPost":{"message":"Đọc $1 để biết thêm thông tin.","description":"The placeholder is \"blog post\""},"blogPost":{"message":"bài viết trên blog"},"notAffiliated":{"message":"Scratch Addons không phải là một phần của Scratch."},"new":{"message":"Mới!","description":"Tag for addons. Singular."},"updated":{"message":"Tính năng mới","description":"Tag for addons with new features. Singular."},"updatedWithSettings":{"message":"Cài đặt mới","description":"Tag for addons with new settings. Singular."},"newGroup":{"message":"Những tiện ích và cập nhật mới khác","description":"Used as a category name for new addons and updates"},"featuredNew":{"message":"Các addon và bản cập nhật mới nổi bật","description":"Used as a category name for featured new addons and updates"},"enabled":{"message":"Đã bật","description":"Used as a category name for enabled addons"},"exportAndImportSettings":{"message":"Xuất ra và nhập vào cài đặt"},"exportAndImportSettingsDescription":{"message":"Xuất cài đặt ra tệp JSON để có thể sử dụng trên các máy tính khác."},"useBrowserSync":{"message":"Bạn cũng có thể bật tùy chọn đồng bộ hóa tích hợp trong trình duyệt của mình để tự động đồng bộ hóa cài đặt giữa các thiết bị."},"export":{"message":"Xuất ra cài đặt"},"import":{"message":"Nhập vào cài đặt"},"viewSettings":{"message":"Xem tệp cài đặt"},"fileNotSelected":{"message":"Xin chọn một tệp cài đặt"},"importSuccess":{"message":"Cài đặt đã được nhập vào thành công. Scratch Addons sẽ tải lại"},"importFailed":{"message":"Tệp cài đặt không hợp lệ. Xin vui lòng thử lại"},"confirmImport":{"message":"Xác nhận"},"language":{"message":"Ngôn ngữ"},"applySettings":{"message":"Áp dụng thay đổi"},"quickSettings":{"message":"bổ trợ"},"runningOnThisPage":{"message":"Tiện ích trên tab này"},"recentlyUsed":{"message":"Được sử dụng gần đây","description":"Used as a category name for recently used addons"},"settingsPagePermission":{"message":"Để bật tiện ích \"$1\", đi đến trang cài đặt toàn màn hình"},"openFullSettings":{"message":"Mở chế độ phóng to màn hình"},"skipOpenFullSettings":{"message":"Hủy"},"exploreAllAddons":{"message":"Khám phá tất cả các tiện ích bổ sung $1:","description":"Placeholder is a number. Example: explore all 80+ addons"},"searchNotFound":{"message":"Không có kết quả nào cho từ khóa này. Bạn hãy nên thử từ khóa khác."},"searchNotFoundInCategory":{"message":"Không có từ khóa nào trong \"$1\". Bạn hãy nên thử những từ khóa khác."},"captureCommentError":{"message":"Thông báo được thêm bởi Scratch Addons: nhận xét của bạn đề cập đến tiện ích mở rộng trình duyệt. $1 kêu gọi Scratchers không quảng cáo chúng, vì Nhóm Scratch chưa xem xét độ an toàn của chúng và không thể kiểm tra từng cái một. Vui lòng tuân theo chính sách nói trên bằng cách tránh mọi tham chiếu đến tiện ích mở rộng của trình duyệt khi đăng trên Scratch.","description":"The placeholder is \"Browser Extension Policy\""},"captureCommentPolicy":{"message":"Chính sách tiện ích mở rộng cho trình duyệt"},"captureCommentPostAnyway":{"message":"Vẫn đăng"},"captureCommentConfirm":{"message":"Việc đăng nhận xét này có thể dẫn đến việc tự động tắt tiếng tài khoản của bạn, tạm thời ngăn bạn nhận xét. Việc tắt tiếng liên tục có thể dẫn đến việc tài khoản của bạn bị chặn khỏi Scratch. Bạn có chắc chắn muốn gửi bình luận này?"},"extensionStoreDescription1":{"message":"Chọn từ 100+ tùy chọn:","description:":"Used in the description for the extension stores"},"extensionStoreDescription2":{"message":"• Nhanh chóng đọc và trả lời tin nhắn bằng cách nhấp vào biểu tượng tiện ích mở rộng.\n• Tham gia các trò chơi nhiều người chơi đang hoạt động với tab trò chơi trên đám mây.\n• Làm đẹp mọi trang trên trang web Scratch với phong cách 3.0 và các tùy chọn cho chế độ tối và chủ đề màu tùy chỉnh.\n• Dễ dàng rời khỏi studio, quảng bá hoặc loại bỏ người phụ trách và duyệt những người theo dõi để mời.\n• Cải thiện việc quản lý dự án với thanh tìm kiếm Thành Phẩm của Tôi và nút hủy chia sẻ.\n• Cải thiện trình phát dự án bằng nút tạm dừng, 60FPS và hỗ trợ gamepad.\n• Hoạt hình dễ dàng hơn với tính năng lột da củ hành, chọn màu chính xác và tìm kiếm trang phục.\n• Nâng cao hiệu quả mã hóa của bạn với tìm kiếm khối, danh sách thả xuống có thể tìm kiếm, chuyển đổi khối, lấy một lần và sao chép/dán.\n• Luôn ngăn nắp với bảng khối tự động ẩn và các thư mục sprite.\n• Trực tiếp đặt và đóng băng hình thu nhỏ của dự án thành bất kỳ hình ảnh hoặc GIF nào.\n• Mang về những khối mèo từ Cá tháng Tư.\n• Gỡ lỗi các dự án bằng cách ghi nhật ký, theo dõi hiệu suất và thực hiện từng bước.\n• Và hơn thế nữa với mỗi bản cập nhật!","description":"Used in the description for the extension stores"},"extensionStoreDescription3":{"message":"Tiện ích mở rộng này là phần mềm mã nguồn mở được cấp phép theo GPL v3.\nĐể đóng góp hoặc kiểm tra mã nguồn: https://github.com/ScratchAddons\nĐể biết thêm thông tin, hãy truy cập: ScratchAddons.com","description":"Used in the description for the extension stores. Do not translate \"GPL v3\" or the links."},"extensionStoreDescription4":{"message":"Dự án này không được liên kết, liên kết hoặc theo bất kỳ cách nào được kết nối chính thức với trang web Scratch hoặc các tổ chức duy trì nó.","description":"Used in the description for the extension stores"}} \ No newline at end of file From 7dc09b23c55afc28946675ba7cde7d39e418871b Mon Sep 17 00:00:00 2001 From: W_L Date: Fri, 7 Jun 2024 13:39:18 -0300 Subject: [PATCH 07/12] `better-img-uploads`: discard EXIF metadata before upload (#7506) * `better-img-uploads`: discard EXIF metadata before upload * I got confused * Format code * fix it --------- Co-authored-by: WorldLanguages Co-authored-by: Muffin --- addons/better-img-uploads/userscript.js | 41 ++++++++++++++++--------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/addons/better-img-uploads/userscript.js b/addons/better-img-uploads/userscript.js index b47fbdb6d0..20bd7793ad 100644 --- a/addons/better-img-uploads/userscript.js +++ b/addons/better-img-uploads/userscript.js @@ -116,20 +116,31 @@ export default async function ({ addon, console, msg }) { continue; } - let blob = await new Promise((resolve) => { - //Get the Blob data url for the image so that we can add it to the svg - let reader = new FileReader(); - reader.addEventListener("load", () => resolve(reader.result)); - reader.readAsDataURL(file); - }); - - let i = new Image(); //New image to get the image's size - i.src = blob; - await new Promise((resolve) => { - i.onload = resolve; - }); - - let dim = { width: i.width, height: i.height }; + const getImgData = async () => { + const img = new Image(); + img.src = URL.createObjectURL(file); + await new Promise((resolve) => { + img.onload = resolve; + }); + return img; + }; + + const img = await getImgData(); + let dim = { width: img.width, height: img.height }; + + // NOTE: we DON'T want to use the uploaded file directly. + // We redraw the image into a canvas first, so that: + // 1. We always embed a PNG file, + // 2. EXIF metadata (such as location, if applicable) is discarded. + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + canvas.width = dim.width; + canvas.height = dim.height; + ctx.drawImage(img, 0, 0); + + URL.revokeObjectURL(img.src); + const dataURL = canvas.toDataURL(); + const originalDim = JSON.parse(JSON.stringify(dim)); if (mode === "fit") { @@ -213,7 +224,7 @@ export default async function ({ addon, console, msg }) { width="${originalDim.width}" height="${originalDim.height}" transform="scale(${dim.width / originalDim.width},${dim.height / originalDim.height})" - xlink:href="${blob}" + xlink:href="${dataURL}" /> From 3e31382789a1a79a72f05942f45ed1fa3806b35b Mon Sep 17 00:00:00 2001 From: "scratchaddons-bot[bot]" <73682299+scratchaddons-bot[bot]@users.noreply.github.com> Date: Sun, 9 Jun 2024 19:03:20 -0300 Subject: [PATCH 08/12] Translation update: 2024/06/09 (#7511) New strings from Transifex Co-authored-by: scratchaddons-bot[bot] <73682299+scratchaddons-bot[bot]@users.noreply.github.com> --- _locales/de/messages.json | 2 +- addons-l10n/de/big-save-button.json | 2 +- addons-l10n/de/curator-link.json | 2 +- addons-l10n/de/debugger.json | 2 +- addons-l10n/de/hide-delete-button.json | 2 +- addons-l10n/de/remove-curved-stage-border.json | 2 +- addons-l10n/de/remove-sprite-confirm.json | 2 +- addons-l10n/de/resizable-comment-input.json | 2 +- addons-l10n/de/search-my-stuff.json | 2 +- addons-l10n/de/zebra-striping.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/_locales/de/messages.json b/_locales/de/messages.json index b6d837e2af..3d5ea8a26f 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1 +1 @@ -{"extensionName":{"message":"Scratch Addons"},"extensionDescription":{"message":"Scratch Addons bietet flexible Features und Designs für die Seite scratch.mit.edu und den Projekteditor an."},"messaging":{"message":"Nachrichten"},"games":{"message":"Spiele"},"openInNewTab":{"message":"In neuem Browsertab öffnen"},"changelog":{"message":"Änderungseverlauf anzeigen"},"notifChangelog":{"message":"Änderungseverlauf anzeigen"},"15min":{"message":"Für 15 Minuten"},"1hour":{"message":"Für 1 Stunde"},"8hours":{"message":"Für 8 Stunden"},"24hours":{"message":"Für 24 Stunden"},"untilEnabled":{"message":"Bis ich es selber ausschalte"},"muteFor":{"message":"Bitte nicht stören"},"unmute":{"message":"BItte nicht stören ausschalten"},"recommended":{"message":"Empfohlen"},"featured":{"message":"Vorgestellt"},"beta":{"message":"Beta"},"danger":{"message":"Gefährlich"},"dangerWarning":{"message":"Bist du dir sicher, dass du das \"$1\" Addon aktivieren möchtest?"},"forums":{"message":"Forum"},"forEditor":{"message":"Für den Editor"},"forWebsite":{"message":"Für die Website"},"confirmPreset":{"message":"Vorlage laden und aktuelle EInstellungen des Addons überschreiben?"},"confirmReset":{"message":"Bist du dir sicher, dass du dieses Addon auf seine Standardeinstellungen zurücksetzen möchtest?"},"settingsTitle":{"message":"Einstellungen - Scratch Addons"},"settings":{"message":"Einstellungen"},"all":{"message":"Alle"},"editorFeatures":{"message":"Scratch-Editor-Features"},"costumeEditorFeatures":{"message":"Kostüm-Editor"},"codeEditorFeatures":{"message":"Code-Editor"},"websiteFeatures":{"message":"Scratch-Website-Features"},"profilesFeatures":{"message":"Profile"},"projectPlayerFeatures":{"message":"Projektplayer"},"projectPageFeatures":{"message":"Projektseiten"},"others":{"message":"Andere"},"themes":{"message":"Designs"},"editorThemes":{"message":"Editor-Designs"},"websiteThemes":{"message":"Website-Designs"},"popupFeatures":{"message":"Erweiterungs-Popup-Features"},"theme":{"message":"Design:"},"credits":{"message":"Danksagungen"},"review":{"message":"Bewerten"},"feedback":{"message":"Feedback senden"},"moreSettings":{"message":"Mehr Einstellungen"},"close":{"message":"Schließen"},"filter":{"message":"Filter:"},"resetToDefault":{"message":"Auf Standardeinstellungen zurücksetzen"},"creditTo":{"message":"Danke an:"},"viewLicenses":{"message":"Verwendete Lizenzen anzeigen"},"reset":{"message":"Zurücksetzen"},"default":{"message":"Standard"},"presets":{"message":"Vorlagen"},"preview":{"message":"Vorschau"},"scratchAddonsTheme":{"message":"Scratch Addons-Design"},"scratchAddonsThemeDescription":{"message":"Dies ermöglicht es dir, für diese Seite und dem Popup zwischen dem hellen und dem dunklen Farbschema zu wechseln."},"light":{"message":"Hell"},"dark":{"message":"Dunkel"},"licensesTitle":{"message":"Lizenzen - Scratch Addons"},"licenses":{"message":"Lizenzen"},"licensesForLibrary":{"message":"Lizenzen der Bibliothek $1"},"libraryCredits":{"message":"Lizenzen der verwendeten Bibliotheken anzeigen"},"recommendedTooltip":{"message":"Dies wird von Scratch Addons empfohlen. Probiere es aus!"},"dangerTooltip":{"message":"Mit Vorsicht benutzen. Sei dir sicher, das du verstehst, was dieses Addon tut, bevor du es benutzt."},"betaTooltip":{"message":"Es könnte sein, dass dieses Addon noch Fehler enthält."},"forumsTooltip":{"message":"Dieses Addon wird auf den Diskussionsforen von Scratch angewendet."},"reportItHere":{"message":"melde ihn hier"},"forumWarning":{"message":"Nachricht von der Scratch Addons-Erweiterung: Stelle sicher, dass der Fehler, den du melden willst, auch dann noch auftritt, wenn alle Browser-Erweiterungen, einschließlich Scratch Addons, deaktiviert sind. Wenn du glaubst, dass ein Fehler durch Scratch Addons verursacht wird, bitte $1."},"forumWarningGeneral":{"message":"Nachricht der Scratch Addons-Erweiterung: Die Scratch-Richtlinien verbieten Diskussionen über Browser-Erweiterungen, einschließlich Scratch Addons. Werbe nicht für Scratch Addons oder eine seiner Funktionen. Falls dies ein Fehler ist, bitte $1."},"search":{"message":"Suchen"},"permissionsTitle":{"message":"Berechtigungen - Scratch Addons"},"permissions":{"message":"Berechtigungen"},"enablePermissionsTitle":{"message":"Bitte aktiviere den Seitenzugriff"},"enablePermissionsDescription":{"message":"Scratch Addons benötigt Zugriff auf die Seite, um zu funktionieren."},"enableButton":{"message":"Aktivieren"},"enableButtonDescription":{"message":"Klicke zum Aktivieren die Schaltfläche an."},"permissionsScreenAlt":{"message":"Screenshot eines Dialogs zum Aktivieren des Seitenzugriffes"},"clickAllowDescription":{"message":"Klicke auf \"Zulassen\". Scratch Addons wird neu geladen und die Addons werden wieder korrekt funktionieren"},"permissionsDenied":{"message":"Seitenzugriff konnte nicht aktiviert werden. Versuche es noch einmal."},"translate":{"message":"Beim Übersetzen mithelfen"},"extensionUpdate":{"message":"Update für die Scratch Addons-Erweiterung"},"extensionHasUpdated":{"message":"Scratch Addons wurde auf Version $1 aktualisiert"},"extensionUpdateInfo1_v1_38":{"message":"Dies ist ein experimentelles Update, das nur an einen kleinen Anteil unserer Nutzer verteilt wird. Es enthält mehrere Hintergrund-Änderungen, um die neue, von Browsern benötigte Architektur zu unterstützen (Manifest V3). Wenn du auf Probleme oder unerwartete Verhalten stößt, bitte $1. Es gibt auch eine Feedback-Schaltfläche in den Einstellungen.","description":"!! The placeholder is \"send feedback\"."},"scratchAddonsSettings":{"message":"Scratch Addons-Einstellungen"},"sendFeedbackNotification":{"message":"gib uns Bescheid"},"extensionUpdateInfo2_v1_38":{"message":"Dieses Update führt keine neue Funktionen ein, aber bleib für kommende Updates am laufenden."},"readTheBlogPost":{"message":"Lies den $1 für weitere Informationen.","description":"The placeholder is \"blog post\""},"blogPost":{"message":"Blogbeitrag"},"notAffiliated":{"message":"Scratch Addons ist in keiner Weise mit Scratch assoziiert."},"new":{"message":"Neu!","description":"Tag for addons. Singular."},"updated":{"message":"Neue Funktionen","description":"Tag for addons with new features. Singular."},"updatedWithSettings":{"message":"Neue Einstellungen","description":"Tag for addons with new settings. Singular."},"newGroup":{"message":"Andere neue und aktualisierte Addons","description":"Used as a category name for new addons and updates"},"featuredNew":{"message":"Vorgestellte neue und aktualisierte Addons","description":"Used as a category name for featured new addons and updates"},"enabled":{"message":"Aktiviert","description":"Used as a category name for enabled addons"},"exportAndImportSettings":{"message":"EInstellungen Importieren und Exportieren"},"exportAndImportSettingsDescription":{"message":"Einstellungen als JSON-Datei zur Benutzung auf anderen Computern exportieren."},"useBrowserSync":{"message":"Du kannst auch die integrierten Synchronisierungsoptionen deines Browsers aktivieren, um die Einstellungen automatisch zwischen Geräten zu synchronisieren."},"export":{"message":"Exportieren"},"import":{"message":"Importieren"},"viewSettings":{"message":"Einstellungsdatei anzeigen"},"fileNotSelected":{"message":"Bitte wähle eine Einstellungsdatei aus."},"importSuccess":{"message":"Einstellungen wurden erfolgreich importiert. Scratch Addons wird nun neu geladen."},"importFailed":{"message":"Die Einstellungsdatei ist ungültig. Bitte versuche es noch einmal."},"confirmImport":{"message":"Bestätigen"},"language":{"message":"Sprache"},"applySettings":{"message":"Änderungen anwenden"},"quickSettings":{"message":"Addons"},"runningOnThisPage":{"message":"Addons in diesem Tab"},"recentlyUsed":{"message":"Zuletzt verwendet","description":"Used as a category name for recently used addons"},"settingsPagePermission":{"message":"Um das Addon \"$1\" zu aktivieren, öffne die Einstellungen in einem neuen Tab."},"openFullSettings":{"message":"Einstellungenseite in neuem Tab öffnen"},"skipOpenFullSettings":{"message":"Abbrechen"},"exploreAllAddons":{"message":"Erkunde alle $1 Addons:","description":"Placeholder is a number. Example: explore all 80+ addons"},"searchNotFound":{"message":"Keine Ergebnisse gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"searchNotFoundInCategory":{"message":"Keine Ergebnisse in \"$1\" gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"captureCommentError":{"message":"Von Scratch Addons hinzugefügt Meldung: dein Kommentar erwähnt eine Browsererweiterung. Die $1 untersagt Werbung dafür, da das Scratch Team sie nicht auf ihre Sicherheit geprüft hat und nicht jede einzelne verifizieren kann. Bitte befolge die oben erwähnte Richtlinie und vermeide jegliche Referenzen zu Browsererweiterungen, wenn du auf Scratch postest.","description":"The placeholder is \"Browser Extension Policy\""},"captureCommentPolicy":{"message":"Richtlinie für Browsererweiterungen"},"captureCommentPostAnyway":{"message":"Trotzdem posten"},"captureCommentConfirm":{"message":"Das Absenden dieses Kommentars könnte zu automatischer Stummschaltung deines Accounts führen und dich vom Kommentieren abhalten. Dauerhafte Stummschaltung kann dazu führen, dass dein Account von Scratch blockiert wird. Bist du dir sicher, dass du diesen Kommentar absenden willst?"},"extensionStoreDescription1":{"message":"Wähle 100+ Optionen:","description:":"Used in the description for the extension stores"},"extensionStoreDescription2":{"message":"• Schnelles Lesen und Antworten auf Nachrichten durch Klicken auf das Erweiterungsicon.\n• Springen in aktive Multiplayer-Spiele mit dem Cloudspiele-Tab.\n• Verschönere jede Seite auf Scratch mit 3.0-Stil, dunklem Modus und benutzerdefinierten Farben.\n• Verlasse Studios mit einem Klick, befördere oder entferne Kuratoren und durchsuche Follower zum Hinzufügen.\n• Verbessere Projektverwaltung mit dem Suchfeld in Meine Sachen und dem Unveröffentlichen-Knopf.\n• Verbessere den Projektplayer mit einem Pause-Knopf, doppelter Geschwindigkeit mit 60FPS und Controller-Unterstützung.\n• Erleichtertes Animieren mit Onion Skinning, genauer Farbenauswahl und Figurensuche.\n• Booste deine Programmiereffizienz mit Blocksuche, durchsuchbaren Drop-Downs, Blockwechsel, einzelnes Verschieben und Kopieren/Einfügen.\n• Bleib ordentlich mit Blockpalette ausblenden und Figurenordner.\n• Setze deine Projektvorschau direkt auf jedes beliebige Bild oder GIF.\n• Hole die Katzenblöcke vom Aprilscherz zurück.\n• Debugge Projekte mit Logging, Leistungsansicht und Schritt-für-Schritt-Ausführung.\n• Und mehr mit jedem Update!","description":"Used in the description for the extension stores"},"extensionStoreDescription3":{"message":"Diese Erweiterung ist open source und unter GPL v3 lizensiert.\nUm Mitzumachen siehe den Quellcode: https://github.com/ScratchAddons\nFür mehr Infos, siehe: ScratchAddons.com","description":"Used in the description for the extension stores. Do not translate \"GPL v3\" or the links."},"extensionStoreDescription4":{"message":"Dieses Projekt ist in keiner Weise offiziell mit Scratch oder den Organisationen, die es am Laufen halten, assoziiert.","description":"Used in the description for the extension stores"}} \ No newline at end of file +{"extensionName":{"message":"Scratch Addons"},"extensionDescription":{"message":"Scratch Addons bietet flexible Features und Designs für die Seite scratch.mit.edu und den Projekteditor an."},"messaging":{"message":"Nachrichten"},"games":{"message":"Spiele"},"openInNewTab":{"message":"In neuem Browsertab öffnen"},"changelog":{"message":"Änderungseverlauf anzeigen"},"notifChangelog":{"message":"Änderungseverlauf anzeigen"},"15min":{"message":"Für 15 Minuten"},"1hour":{"message":"Für 1 Stunde"},"8hours":{"message":"Für 8 Stunden"},"24hours":{"message":"Für 24 Stunden"},"untilEnabled":{"message":"Bis ich es selber ausschalte"},"muteFor":{"message":"Bitte nicht stören"},"unmute":{"message":"BItte nicht stören ausschalten"},"recommended":{"message":"Empfohlen"},"featured":{"message":"Vorgestellt"},"beta":{"message":"Beta"},"danger":{"message":"Gefährlich"},"dangerWarning":{"message":"Bist du dir sicher, dass du das \"$1\" Addon aktivieren möchtest?"},"forums":{"message":"Forum"},"forEditor":{"message":"Für den Editor"},"forWebsite":{"message":"Für die Website"},"confirmPreset":{"message":"Vorlage laden und aktuelle EInstellungen des Addons überschreiben?"},"confirmReset":{"message":"Bist du dir sicher, dass du dieses Addon auf seine Standardeinstellungen zurücksetzen möchtest?"},"settingsTitle":{"message":"Einstellungen - Scratch Addons"},"settings":{"message":"Einstellungen"},"all":{"message":"Alle"},"editorFeatures":{"message":"Scratch-Editor-Features"},"costumeEditorFeatures":{"message":"Kostüm-Editor"},"codeEditorFeatures":{"message":"Code-Editor"},"websiteFeatures":{"message":"Scratch-Website-Features"},"profilesFeatures":{"message":"Profile"},"projectPlayerFeatures":{"message":"Projektplayer"},"projectPageFeatures":{"message":"Projektseiten"},"others":{"message":"Andere"},"themes":{"message":"Designs"},"editorThemes":{"message":"Editor-Designs"},"websiteThemes":{"message":"Website-Designs"},"popupFeatures":{"message":"Erweiterungs-Popup-Features"},"theme":{"message":"Design:"},"credits":{"message":"Danksagungen"},"review":{"message":"Bewerten"},"feedback":{"message":"Feedback senden"},"moreSettings":{"message":"Mehr Einstellungen"},"close":{"message":"Schließen"},"filter":{"message":"Filter:"},"resetToDefault":{"message":"Auf Standardeinstellungen zurücksetzen"},"creditTo":{"message":"Danke an:"},"viewLicenses":{"message":"Verwendete Lizenzen anzeigen"},"reset":{"message":"Zurücksetzen"},"default":{"message":"Standard"},"presets":{"message":"Vorlagen"},"preview":{"message":"Vorschau"},"scratchAddonsTheme":{"message":"Scratch Addons-Design"},"scratchAddonsThemeDescription":{"message":"Dies ermöglicht es dir, für diese Seite und dem Popup zwischen dem hellen und dem dunklen Farbschema zu wechseln."},"light":{"message":"Hell"},"dark":{"message":"Dunkel"},"licensesTitle":{"message":"Lizenzen - Scratch Addons"},"licenses":{"message":"Lizenzen"},"licensesForLibrary":{"message":"Lizenzen der Bibliothek $1"},"libraryCredits":{"message":"Lizenzen der verwendeten Bibliotheken anzeigen"},"recommendedTooltip":{"message":"Dies wird von Scratch Addons empfohlen. Probiere es aus!"},"dangerTooltip":{"message":"Mit Vorsicht benutzen. Sei dir sicher, das du verstehst, was dieses Addon tut, bevor du es benutzt."},"betaTooltip":{"message":"Es könnte sein, dass dieses Addon noch Fehler enthält."},"forumsTooltip":{"message":"Dieses Addon wird auf den Diskussionsforen von Scratch angewendet."},"reportItHere":{"message":"melde ihn hier"},"forumWarning":{"message":"Nachricht von der Scratch Addons-Erweiterung: Stelle sicher, dass der Fehler, den du melden willst, auch dann noch auftritt, wenn alle Browser-Erweiterungen, einschließlich Scratch Addons, deaktiviert sind. Wenn du glaubst, dass ein Fehler durch Scratch Addons verursacht wird, bitte $1."},"forumWarningGeneral":{"message":"Nachricht der Scratch Addons-Erweiterung: Die Scratch-Richtlinien verbieten Diskussionen über Browser-Erweiterungen, einschließlich Scratch Addons. Werbe nicht für Scratch Addons oder eine seiner Funktionen. Falls dies ein Fehler ist, bitte $1."},"search":{"message":"Suchen"},"permissionsTitle":{"message":"Berechtigungen - Scratch Addons"},"permissions":{"message":"Berechtigungen"},"enablePermissionsTitle":{"message":"Bitte aktiviere den Seitenzugriff"},"enablePermissionsDescription":{"message":"Scratch Addons benötigt Zugriff auf die Seite, um zu funktionieren."},"enableButton":{"message":"Aktivieren"},"enableButtonDescription":{"message":"Klicke zum Aktivieren die Schaltfläche an."},"permissionsScreenAlt":{"message":"Screenshot eines Dialogs zum Aktivieren des Seitenzugriffes"},"clickAllowDescription":{"message":"Klicke auf \"Zulassen\". Scratch Addons wird neu geladen und die Addons werden wieder korrekt funktionieren"},"permissionsDenied":{"message":"Seitenzugriff konnte nicht aktiviert werden. Versuche es noch einmal."},"translate":{"message":"Beim Übersetzen mithelfen"},"extensionUpdate":{"message":"Update für die Scratch Addons-Erweiterung"},"extensionHasUpdated":{"message":"Scratch Addons wurde auf Version $1 aktualisiert"},"extensionUpdateInfo1_v1_38":{"message":"Dies ist ein experimentelles Update, das nur an einen kleinen Anteil unserer Nutzer verteilt wird. Es enthält mehrere Hintergrund-Änderungen, um die neue, von Browsern benötigte Architektur zu unterstützen (Manifest V3). Wenn du auf Probleme oder unerwartete Verhalten stößt, bitte $1. Es gibt auch eine Feedback-Schaltfläche in den Einstellungen.","description":"!! The placeholder is \"send feedback\"."},"scratchAddonsSettings":{"message":"Scratch Addons-Einstellungen"},"sendFeedbackNotification":{"message":"gib uns Bescheid"},"extensionUpdateInfo2_v1_38":{"message":"Dieses Update führt keine neue Funktionen ein, aber bleib für kommende Updates am laufenden."},"readTheBlogPost":{"message":"Lies den $1 für weitere Informationen.","description":"The placeholder is \"blog post\""},"blogPost":{"message":"Blogbeitrag"},"notAffiliated":{"message":"Scratch Addons ist in keiner Weise mit Scratch assoziiert."},"new":{"message":"Neu!","description":"Tag for addons. Singular."},"updated":{"message":"Neue Funktionen","description":"Tag for addons with new features. Singular."},"updatedWithSettings":{"message":"Neue Einstellungen","description":"Tag for addons with new settings. Singular."},"newGroup":{"message":"Andere neue und aktualisierte Addons","description":"Used as a category name for new addons and updates"},"featuredNew":{"message":"Vorgestellte neue und aktualisierte Addons","description":"Used as a category name for featured new addons and updates"},"enabled":{"message":"Aktiviert","description":"Used as a category name for enabled addons"},"exportAndImportSettings":{"message":"EInstellungen Importieren und Exportieren"},"exportAndImportSettingsDescription":{"message":"Einstellungen als JSON-Datei zur Benutzung auf anderen Computern exportieren."},"useBrowserSync":{"message":"Du kannst auch die integrierten Synchronisierungsoptionen deines Browsers aktivieren, um die Einstellungen automatisch zwischen Geräten zu synchronisieren."},"export":{"message":"Exportieren"},"import":{"message":"Importieren"},"viewSettings":{"message":"Einstellungsdatei anzeigen"},"fileNotSelected":{"message":"Bitte wähle eine Einstellungsdatei aus."},"importSuccess":{"message":"Einstellungen wurden erfolgreich importiert. Scratch Addons wird nun neu geladen."},"importFailed":{"message":"Die Einstellungsdatei ist ungültig. Bitte versuche es noch einmal."},"confirmImport":{"message":"Bestätigen"},"language":{"message":"Sprache"},"applySettings":{"message":"Änderungen anwenden"},"quickSettings":{"message":"Addons"},"runningOnThisPage":{"message":"Addons in diesem Tab"},"recentlyUsed":{"message":"Zuletzt verwendet","description":"Used as a category name for recently used addons"},"settingsPagePermission":{"message":"Um das Addon \"$1\" zu aktivieren, öffne die Einstellungen in einem neuen Tab."},"openFullSettings":{"message":"Einstellungenseite in neuem Tab öffnen"},"skipOpenFullSettings":{"message":"Abbrechen"},"exploreAllAddons":{"message":"Erkunde alle $1 Addons:","description":"Placeholder is a number. Example: explore all 80+ addons"},"searchNotFound":{"message":"Keine Ergebnisse gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"searchNotFoundInCategory":{"message":"Keine Ergebnisse in \"$1\" gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"captureCommentError":{"message":"Von Scratch Addons hinzugefügt Meldung: dein Kommentar erwähnt eine Browsererweiterung. Die $1 untersagt Werbung dafür, da das Scratch Team sie nicht auf ihre Sicherheit geprüft hat und nicht jede einzelne verifizieren kann. Bitte befolge die oben erwähnte Richtlinie und vermeide jegliche Referenzen zu Browsererweiterungen, wenn du auf Scratch postest.","description":"The placeholder is \"Browser Extension Policy\""},"captureCommentPolicy":{"message":"Richtlinie für Browsererweiterungen"},"captureCommentPostAnyway":{"message":"Trotzdem posten"},"captureCommentConfirm":{"message":"Das Absenden dieses Kommentars könnte zu automatischer Stummschaltung deines Accounts führen und dich vom Kommentieren abhalten. Dauerhafte Stummschaltung kann dazu führen, dass dein Account von Scratch blockiert wird. Bist du dir sicher, dass du diesen Kommentar absenden willst?"},"extensionStoreDescription1":{"message":"Wähle 100+ Optionen:","description:":"Used in the description for the extension stores"},"extensionStoreDescription2":{"message":"• Schnelles Lesen und Antworten auf Nachrichten durch Klicken auf das Erweiterungsicon.\n• Springen in aktive Multiplayer-Spiele mit dem Cloudspiele-Tab.\n• Verschönere jede Seite auf Scratch mit 3.0-Stil, dunklem Modus und benutzerdefinierten Farben.\n• Verlasse Studios mit einem Klick, befördere oder entferne Kuratoren und durchsuche Follower zum Hinzufügen.\n• Verbessere Projektverwaltung mit dem Suchfeld in Meine Sachen und dem Unveröffentlichen-Knopf.\n• Verbessere den Projektplayer mit einem Pause-Knopf, doppelter Geschwindigkeit mit 60FPS und Controller-Unterstützung.\n• Erleichtertes Animieren mit Onion Skinning, genauer Farbenauswahl und Figurensuche.\n• Booste deine Programmiereffizienz mit Blocksuche, durchsuchbaren Drop-Downs, Blockwechsel, einzelnes Verschieben und Kopieren/Einfügen.\n• Bleib ordentlich mit Blockpalette ausblenden und Figurenordner.\n• Setze deine Projektvorschau direkt auf jedes beliebige Bild oder GIF.\n• Hole die Katzenblöcke vom Aprilscherz zurück.\n• Debugge Projekte mit Logging, Leistungsansicht und Schritt-für-Schritt-Ausführung.\n• Und mehr mit jedem Update!","description":"Used in the description for the extension stores"},"extensionStoreDescription3":{"message":"Diese Erweiterung ist open source und unter GPL v3 lizensiert.\nUm Mitzuwirken oder den Quellcode anzusehen: https://github.com/ScratchAddons\nFür mehr Infos, siehe: ScratchAddons.com","description":"Used in the description for the extension stores. Do not translate \"GPL v3\" or the links."},"extensionStoreDescription4":{"message":"Dieses Projekt ist in keiner Weise offiziell mit Scratch oder den Organisationen, die es am Laufen halten, assoziiert.","description":"Used in the description for the extension stores"}} \ No newline at end of file diff --git a/addons-l10n/de/big-save-button.json b/addons-l10n/de/big-save-button.json index 2036a2408b..723ab53546 100644 --- a/addons-l10n/de/big-save-button.json +++ b/addons-l10n/de/big-save-button.json @@ -1 +1 @@ -{"big-save-button/@name":"Größere Schaltfläche \"Jetzt speichern\"","big-save-button/@description":"Vergrößert die Schaltfläche \"Jetzt speichern\" im Editor, um sie leichter anklickbar zu machen."} \ No newline at end of file +{"big-save-button/@name":"Größere Schaltfläche \"Jetzt speichern\"","big-save-button/@description":"Vergrößert die Schaltfläche \"Jetzt speichern\" im Editor, damit sie leichter angeklickt werden kann."} \ No newline at end of file diff --git a/addons-l10n/de/curator-link.json b/addons-l10n/de/curator-link.json index 1586b154b1..262dfc2fd0 100644 --- a/addons-l10n/de/curator-link.json +++ b/addons-l10n/de/curator-link.json @@ -1 +1 @@ -{"curator-link/@name":"Homepagekurator-Link","curator-link/@description":"Macht den Benutzernamen des Homepagekuratoren zu einem anklickbaren Link zu seinem Profil.","curator-link/@settings-name-styleAsNormalText":"Als normalen Text anzeigen"} \ No newline at end of file +{"curator-link/@name":"Homepagekurator-Link","curator-link/@description":"Macht den Benutzernamen des Startseiten-Kuratoren zu einem anklickbaren Link zu seinem Profil.","curator-link/@settings-name-styleAsNormalText":"Als normalen Text anzeigen"} \ No newline at end of file diff --git a/addons-l10n/de/debugger.json b/addons-l10n/de/debugger.json index 53472a8693..1c4a6a9c29 100644 --- a/addons-l10n/de/debugger.json +++ b/addons-l10n/de/debugger.json @@ -1 +1 @@ -{"debugger/debug":"Debuggen","debugger/export":"Exportieren","debugger/clear":"Löschen","debugger/close":"Schließen","debugger/step":"Schritt","debugger/enter-format":"Exportformat eingeben:","debugger/unpause":"Fortsetzen","debugger/unknown-sprite":"(unbekannte Figur)","debugger/clone-of":"Klon von {sprite}","debugger/icon-warn":"Warnung","debugger/icon-error":"Fehler","debugger/empty-string":"(leerer Text)","debugger/export-desc":"Halte die Umschalttaste während dem Klicken gedrückt, um das Exportformat anzupassen.","debugger/block-breakpoint":"unterbrechen","debugger/block-log":"schreibe %s im Log","debugger/block-warn":"schreibe Warnung %s im Log","debugger/block-error":"schreibe Fehler %s im Log","debugger/cannot-pause-player":"Der \"unterbrechen\"-Block kann nur im Editor verwendet werden.","debugger/step-desc":"Führt einen Block aus.","debugger/tab-performance":"Leistung","debugger/no-logs":"Es gibt keine Logs zum Anzeigen.","debugger/no-threads-running":"Es werden momentan keine Threads ausgeführt.","debugger/performance-clonecount-title":"Klone","debugger/performance-clonecount-graph-tooltip":"Klone: {clones}","debugger/log-msg-flag-clicked":"Grüne Flagge angeklickt.","debugger/log-msg-clone-cap":"Klonen von '{sprite}' fehlgeschlagen, es können nicht mehr als 300 Klone erzeugt werden.","debugger/log-msg-clone-created":"'{sprite}' geklont.","debugger/log-msg-broadcasted":"Nachricht '{broadcast}' gesendet.","debugger/log-msg-list-append-too-long":"Hinzufügen zu Liste '{list}' fehlgeschlagen, es können nicht mehr als 200.000 Elemente hinzugefügt werden.","debugger/log-msg-list-insert-too-long":"Element 200.000 von Liste '{list}' entfernt, um Platz für Einfügen zu machen, es können nicht mehr als 200.000 Elemente hinzugefügt werden.","debugger/log-cloud-data-nan":"Festlegen von '{var}' fehlgeschlagen, Cloud-Variablen können nur Zahlen enthalten.","debugger/log-cloud-data-too-long":"Festlegen von '{var}' fehlgeschlagen, Cloud-Variablen können nicht mehr als 256 Ziffern besitzen.","debugger/@description":"Fügt ein neues \"Debugger\"-Fenster im Editor hinzu. Erlaubt das loggen in den \"Logs\"-Tab des Debugger-Fenster mit den Blöcken \"loggen\", \"warnen\" und \"Fehler\". Der \"Unterbrechen\"-Block wird das Projekt pausieren. Alle aktuell ausgeführten Blockreihen können im \"Threads\"-Tab des Debuggerfensters angezeigt werden, und wenn das Projekt pausiert ist, kann die \"Schritt\"-Schaltfläche verwendet werden, um einen Block nach dem anderen auszuführen. Ein Graph der Bildwiederholrate und der Klonanzahl kann im \"Leistung\"-Tab angezeigt werden.","debugger/@update":"Graphenanimationen sind jetzt standardmäßig deaktiviert, um die Leistung zu erhöhen. Du kannst sie bei Bedarf hier wieder einschalten.","debugger/@settings-name-log_clear_greenflag":"Logs beim Klicken auf die grüne Flagge löschen","debugger/@settings-name-log_greenflag":"Klicks auf dei grüne Flagge loggen","debugger/@settings-name-log_clone_create":"Klon-Erzeugungen loggen","debugger/@settings-name-log_failed_clone_creation":"Beim Überschreiten der Klongrenze loggen","debugger/@settings-name-log_broadcasts":"Nachrichten loggen","debugger/@settings-name-log_max_list_length":"Überschreitung von Begrenzungen für Listenlängen loggen","debugger/@settings-name-log_invalid_cloud_data":"Ungültige Werte von Cloud-Variablen loggen","debugger/@settings-name-fancy_graphs":"Animierte Graphen (könnte die Leistung beeinträchtigen)"} \ No newline at end of file +{"debugger/debug":"Debuggen","debugger/export":"Exportieren","debugger/clear":"Löschen","debugger/close":"Schließen","debugger/step":"Schritt","debugger/enter-format":"Exportformat eingeben:","debugger/unpause":"Fortsetzen","debugger/unknown-sprite":"(unbekannte Figur)","debugger/clone-of":"Klon von {sprite}","debugger/icon-warn":"Warnung","debugger/icon-error":"Fehler","debugger/empty-string":"(leerer Text)","debugger/export-desc":"Halte die Umschalttaste während dem Klicken gedrückt, um das Exportformat anzupassen.","debugger/block-breakpoint":"unterbrechen","debugger/block-log":"schreibe %s im Log","debugger/block-warn":"schreibe Warnung %s im Log","debugger/block-error":"schreibe Fehler %s im Log","debugger/cannot-pause-player":"Der \"unterbrechen\"-Block kann nur im Editor verwendet werden.","debugger/step-desc":"Führt einen Block aus.","debugger/tab-performance":"Leistung","debugger/no-logs":"Es gibt keine Logs zum Anzeigen.","debugger/no-threads-running":"Es werden momentan keine Threads ausgeführt.","debugger/performance-clonecount-title":"Klone","debugger/performance-clonecount-graph-tooltip":"Klone: {clones}","debugger/log-msg-flag-clicked":"Grüne Flagge angeklickt.","debugger/log-msg-clone-cap":"Klonen von '{sprite}' fehlgeschlagen, es können nicht mehr als 300 Klone erzeugt werden.","debugger/log-msg-clone-created":"'{sprite}' geklont.","debugger/log-msg-broadcasted":"Nachricht '{broadcast}' gesendet.","debugger/log-msg-list-append-too-long":"Hinzufügen zu Liste '{list}' fehlgeschlagen, es können nicht mehr als 200.000 Elemente hinzugefügt werden.","debugger/log-msg-list-insert-too-long":"Element 200.000 von Liste '{list}' entfernt, um Platz fürs Einfügen zu machen, Listen können nicht mehr als 200.000 Elemente enthalten.","debugger/log-cloud-data-nan":"Festlegen von '{var}' fehlgeschlagen, Cloud-Variablen können nur Zahlen enthalten.","debugger/log-cloud-data-too-long":"Festlegen von '{var}' fehlgeschlagen, Cloud-Variablen können nicht mehr als 256 Ziffern besitzen.","debugger/@description":"Fügt ein neues \"Debugger\"-Fenster im Editor hinzu. Erlaubt das loggen in den \"Logs\"-Tab des Debugger-Fenster mit den Blöcken \"loggen\", \"warnen\" und \"Fehler\". Der \"Unterbrechen\"-Block wird das Projekt pausieren. Alle aktuell ausgeführten Blockreihen können im \"Threads\"-Tab des Debuggerfensters angezeigt werden, und wenn das Projekt pausiert ist, kann die \"Schritt\"-Schaltfläche verwendet werden, um einen Block nach dem anderen auszuführen. Ein Graph der Bildwiederholrate und der Klonanzahl kann im \"Leistung\"-Tab angezeigt werden.","debugger/@update":"Graphenanimationen sind jetzt standardmäßig deaktiviert, um die Leistung zu erhöhen. Du kannst sie bei Bedarf hier wieder einschalten.","debugger/@settings-name-log_clear_greenflag":"Logs beim Klicken auf die grüne Flagge löschen","debugger/@settings-name-log_greenflag":"Klicks auf dei grüne Flagge loggen","debugger/@settings-name-log_clone_create":"Klon-Erzeugungen loggen","debugger/@settings-name-log_failed_clone_creation":"Beim Überschreiten der Klongrenze loggen","debugger/@settings-name-log_broadcasts":"Nachrichten loggen","debugger/@settings-name-log_max_list_length":"Überschreitung von Begrenzungen für Listenlängen loggen","debugger/@settings-name-log_invalid_cloud_data":"Ungültige Werte von Cloud-Variablen loggen","debugger/@settings-name-fancy_graphs":"Animierte Graphen (könnte die Leistung beeinträchtigen)"} \ No newline at end of file diff --git a/addons-l10n/de/hide-delete-button.json b/addons-l10n/de/hide-delete-button.json index 910dd1cccc..ff1fd244ed 100644 --- a/addons-l10n/de/hide-delete-button.json +++ b/addons-l10n/de/hide-delete-button.json @@ -1 +1 @@ -{"hide-delete-button/@name":"Löschen-Schaltfläche verstecken","hide-delete-button/@description":"Versteckt die Löschen-Schaltfläche (das Mülleimer-Icon) von FIguren, Kostümen und Klängen. Sie können weiterhin mit dem Rechtsklick-Kontextmenü gelöscht werden.","hide-delete-button/@info-restoretip":"Tipp. Wenn du aus Versehen eine Figur, eine Kostüm oder einen Klang löschst, kannst du das Löschen über den Menüpunkt \"Wiederherstellen\" unter \"Bearbeiten\" in der Menüleiste rückgängig machen.","hide-delete-button/@settings-name-sprites":"Figuren","hide-delete-button/@settings-name-costumes":"Kostüme und Hintergründe","hide-delete-button/@settings-name-sounds":"Klänge"} \ No newline at end of file +{"hide-delete-button/@name":"Löschen-Schaltfläche verstecken","hide-delete-button/@description":"Versteckt die Löschen-Schaltfläche (das Mülleimer-Icon) von FIguren, Kostümen und Klängen. Sie können weiterhin mit dem Rechtsklick-Kontextmenü gelöscht werden.","hide-delete-button/@info-restoretip":"Tipp: Wenn du aus Versehen eine Figur, eine Kostüm oder einen Klang löschst, kannst du das Löschen rückgängig machen, indem du in der Menüleiste auf \"Bearbeiten\" klickst und anschließend den Menüpunkt \"Wiederherstellen\" auswählst.","hide-delete-button/@settings-name-sprites":"Figuren","hide-delete-button/@settings-name-costumes":"Kostüme und Hintergründe","hide-delete-button/@settings-name-sounds":"Klänge"} \ No newline at end of file diff --git a/addons-l10n/de/remove-curved-stage-border.json b/addons-l10n/de/remove-curved-stage-border.json index 5ec470c974..cd5fc79dcb 100644 --- a/addons-l10n/de/remove-curved-stage-border.json +++ b/addons-l10n/de/remove-curved-stage-border.json @@ -1 +1 @@ -{"remove-curved-stage-border/@name":"Runden Bühnenrand entfernen","remove-curved-stage-border/@description":"Entfernt den runden Rand um die Bühne, um die Ecken sichtbar zu machen."} \ No newline at end of file +{"remove-curved-stage-border/@name":"Runden Bühnenrand entfernen","remove-curved-stage-border/@description":"Entfernt den runden Rand der Bühne, um die Ecken sichtbar zu machen."} \ No newline at end of file diff --git a/addons-l10n/de/remove-sprite-confirm.json b/addons-l10n/de/remove-sprite-confirm.json index 7f88fe2634..34aa386297 100644 --- a/addons-l10n/de/remove-sprite-confirm.json +++ b/addons-l10n/de/remove-sprite-confirm.json @@ -1 +1 @@ -{"remove-sprite-confirm/confirm":"Möchtest du diese Figur löschen?","remove-sprite-confirm/@name":"Löschen von Figuren bestätigen","remove-sprite-confirm/@description":"Fragt, ob du sicher bist, wenn du eine Figur in einem Projekt löschst.","remove-sprite-confirm/@info-restoretip":"Tipp. Wenn du aus Versehen eine Figur, eine Kostüm oder einen Klang löschst, kannst du das Löschen über den Menüpunkt \"Wiederherstellen\" unter \"Bearbeiten\" in der Menüleiste rückgängig machen."} \ No newline at end of file +{"remove-sprite-confirm/confirm":"Möchtest du diese Figur löschen?","remove-sprite-confirm/@name":"Löschen von Figuren bestätigen","remove-sprite-confirm/@description":"Fragt, ob du sicher bist, wenn du eine Figur in einem Projekt löschst.","remove-sprite-confirm/@info-restoretip":"Tipp: Wenn du aus Versehen eine Figur, eine Kostüm oder einen Klang löschst, kannst du das Löschen rückgängig machen, indem du in der Menüleiste auf \"Bearbeiten\" klickst und anschließend den Menüpunkt \"Wiederherstellen\" auswählst."} \ No newline at end of file diff --git a/addons-l10n/de/resizable-comment-input.json b/addons-l10n/de/resizable-comment-input.json index 8cd86b96e3..c9a7c3d712 100644 --- a/addons-l10n/de/resizable-comment-input.json +++ b/addons-l10n/de/resizable-comment-input.json @@ -1 +1 @@ -{"resizable-comment-input/@name":"Größe der Kommentarbox ändern","resizable-comment-input/@description":"Macht, dass die Größe der Kommentarbox auf Seiten, die Scratch 3.0-stilisiert sind, vertikal veränderbar ist."} \ No newline at end of file +{"resizable-comment-input/@name":"Größe der Kommentarbox ändern","resizable-comment-input/@description":"Ermöglicht das Ändern der Höhe der Kommentarbox auf Seiten, die Scratch 3.0-stilisiert sind."} \ No newline at end of file diff --git a/addons-l10n/de/search-my-stuff.json b/addons-l10n/de/search-my-stuff.json index fe84780be7..57dfc0c5c3 100644 --- a/addons-l10n/de/search-my-stuff.json +++ b/addons-l10n/de/search-my-stuff.json @@ -1 +1 @@ -{"search-my-stuff/project-placeholder":"Projekte durchsuchen","search-my-stuff/studio-placeholder":"Studios durchsuchen","search-my-stuff/trash-placeholder":"Papierkorb durchsuchen","search-my-stuff/search-by":"Suchen nach","search-my-stuff/progress-header":"Suche...","search-my-stuff/progress-tip":"{number, plural, one {1 Element bisher durchsucht} other {# Elemente bisher durchsucht.}}","search-my-stuff/load-more-header":"Das ist alles, was wir bisher gefunden haben.","search-my-stuff/load-more-tip":"Falls du das, wonach du suchst, nicht gefunden hast, klicke auf Mehr Anzeigen oder ändere das Suchen Nach-Dropdown, um nach verschiedenen Arten von Projekten zu suchen.\nFalls du sehr viele ungewünschte Ergebnisse bekommst, mache deine SUche spezifischer.","search-my-stuff/end-header":"Das ist alles, was wir gefunden haben.","search-my-stuff/end-tip":"Du hast nicht das, wonach du suchst, gefunden? Überprüfe deine Rechtschreibung oder ändere deine Suchwörter.","search-my-stuff/no-results-header":"Wir haben keine Ergebnisse für deine Suche gefunden","search-my-stuff/no-results-tip":"Überprüfe deine Rechtschreibung oder ändere deine Suchfilter.","search-my-stuff/@name":"Suchleiste in Meine Sachen","search-my-stuff/@description":"Ermöglicht das Durchsuchen deiner Projekte, Studios und deines Papierkorbs auf der Meine Sachen-Seite. Beginne irgendwo auf der Seite mit der Eingabe, um mit der Suche zu beginnen. Du kannst nach der Suche auch Strg+Enter drücken, um das erste Suchergebnis zu öffnen.","search-my-stuff/@info-pleaseBePatient":"Falls du shr viele Projekte oder Studios hast, könnte die Suche eine Weile dauern."} \ No newline at end of file +{"search-my-stuff/project-placeholder":"Projekte durchsuchen","search-my-stuff/studio-placeholder":"Studios durchsuchen","search-my-stuff/trash-placeholder":"Papierkorb durchsuchen","search-my-stuff/search-by":"Suchen nach","search-my-stuff/progress-header":"Suche...","search-my-stuff/progress-tip":"{number, plural, one {1 Element bisher durchsucht} other {# Elemente bisher durchsucht.}}","search-my-stuff/load-more-header":"Das ist alles, was wir bisher gefunden haben.","search-my-stuff/load-more-tip":"Falls du das, wonach du suchst, nicht gefunden hast, klicke auf Mehr Anzeigen oder ändere das Suchen Nach-Dropdown, um nach verschiedenen Arten von Projekten zu suchen.\nFalls du sehr viele ungewünschte Ergebnisse bekommst, mache deine Suche spezifischer.","search-my-stuff/end-header":"Das ist alles, was wir gefunden haben.","search-my-stuff/end-tip":"Du hast nicht das, wonach du suchst, gefunden? Überprüfe deine Rechtschreibung oder ändere deine Suchwörter.","search-my-stuff/no-results-header":"Wir haben keine Ergebnisse für deine Suche gefunden","search-my-stuff/no-results-tip":"Überprüfe deine Rechtschreibung oder ändere deine Suchfilter.","search-my-stuff/@name":"Suchleiste in Meine Sachen","search-my-stuff/@description":"Ermöglicht das Durchsuchen deiner Projekte, Studios und deines Papierkorbs auf der Meine Sachen-Seite. Beginne irgendwo auf der Seite mit der Eingabe, um mit der Suche zu beginnen. Du kannst nach der Suche auch Strg+Enter drücken, um das erste Suchergebnis zu öffnen.","search-my-stuff/@info-pleaseBePatient":"Falls du shr viele Projekte oder Studios hast, könnte die Suche eine Weile dauern."} \ No newline at end of file diff --git a/addons-l10n/de/zebra-striping.json b/addons-l10n/de/zebra-striping.json index bae1a314ea..5c7304d81a 100644 --- a/addons-l10n/de/zebra-striping.json +++ b/addons-l10n/de/zebra-striping.json @@ -1 +1 @@ -{"zebra-striping/@name":"Abwechselnde Farben für verschachtelte Blöcke","zebra-striping/@description":"Macht, dass Blöcke der selben Kategorie zwischen helleren und dunkleren Schattierungen abwechseln, wenn sie ineinander verschachtelt sind. Auch als Zebrastreifen bekannt.","zebra-striping/@settings-name-shade":"Schattierung","zebra-striping/@settings-select-shade-lighter":"Heller","zebra-striping/@settings-select-shade-darker":"Dunkler","zebra-striping/@settings-name-intensity":"Stärke (0-100%)"} \ No newline at end of file +{"zebra-striping/@name":"Abwechselnde Farben für verschachtelte Blöcke","zebra-striping/@description":"Wechselt Blöcke aus der gleichen Kategorie zwischen helleren und dunkleren Schattierungen ab, wenn sie ineinander verschachtelt sind. Auch als Zebrastreifen bekannt.","zebra-striping/@settings-name-shade":"Schattierung","zebra-striping/@settings-select-shade-lighter":"Heller","zebra-striping/@settings-select-shade-darker":"Dunkler","zebra-striping/@settings-name-intensity":"Stärke (0-100%)"} \ No newline at end of file From b00fc5bf1bcb5a35a162edb0009bf6a424d4581a Mon Sep 17 00:00:00 2001 From: Joe Clinton <48254978+Joeclinton1@users.noreply.github.com> Date: Mon, 10 Jun 2024 01:02:26 +0100 Subject: [PATCH 09/12] New Addon: Asset Conflict Resolution Dialog (#7232) * Initial commit * Improve modal design + fix bugs * Format code * add small comment * Apply suggestions from code review Co-authored-by: Samq64 <81489795+Samq64@users.noreply.github.com> * more small changes * undo change to dialogText * Make compatible with dark-mode * Format code * use dynamically generated js instead of .innerHTML * Format code * use map for cleaner code * Format code * fix small bug * simplify createAndAppendElement func * add styling suggestions and small fixes * Format code * Fix bug caused by 'newName' being outdated * handle dynamicEnable/disable + move initial logic outside promise * Format code * pollute shareCostume/Sound also * Format code * Don't include extension type in conflict dialog message * setCostume/Sound after replace * Format code * click on the replaced asset * Format code * Remove redundant condition * Slightly improve folders compatibility * Update asset list immediately * Format code * Fix simulated click going to wrong item when using folders addon * Fix conflicts inside folders * Select item without fake click events * Format code * move asset selection code to utils file + also move createAndAppendElement * Format code * Force replace if paint costume or record sound * Format code * fix mistake in comment * Add GarboMuffin to credits * folders: document addDefaultAssetFolderIfMissing * hotfix: backpack costumes not prompting dialog * Add support for addBackdrop conflict dialog * Format code * Remove unused variable * swap backdrop and sound in ternary op for improved clarity * Format code * Make code more concise * Use sentence case in addon name * Update versionAdded field --------- Co-authored-by: Joeclinton1 Co-authored-by: Samq64 <81489795+Samq64@users.noreply.github.com> Co-authored-by: Muffin Co-authored-by: GarboMuffin Co-authored-by: World_Languages --- addons-l10n/en/asset-conflict-dialog.json | 8 + addons/addons.json | 1 + addons/asset-conflict-dialog/addon.json | 32 +++ addons/asset-conflict-dialog/style.css | 37 ++++ addons/asset-conflict-dialog/userscript.js | 219 +++++++++++++++++++++ addons/asset-conflict-dialog/utils.js | 45 +++++ addons/folders/userscript.js | 137 ++++++------- 7 files changed, 413 insertions(+), 66 deletions(-) create mode 100644 addons-l10n/en/asset-conflict-dialog.json create mode 100644 addons/asset-conflict-dialog/addon.json create mode 100644 addons/asset-conflict-dialog/style.css create mode 100644 addons/asset-conflict-dialog/userscript.js create mode 100644 addons/asset-conflict-dialog/utils.js diff --git a/addons-l10n/en/asset-conflict-dialog.json b/addons-l10n/en/asset-conflict-dialog.json new file mode 100644 index 0000000000..4b2b4888c8 --- /dev/null +++ b/addons-l10n/en/asset-conflict-dialog.json @@ -0,0 +1,8 @@ +{ + "asset-conflict-dialog/rename": "Import and Rename", + "asset-conflict-dialog/replace": "Import and Replace", + "asset-conflict-dialog/skip": "Skip and Don't Import", + "asset-conflict-dialog/applyToAll": "Do this for all conflicts", + "asset-conflict-dialog/dialogText": "An asset named {fileName} already exists.", + "asset-conflict-dialog/title": "Rename, Replace or Skip Assets" +} diff --git a/addons/addons.json b/addons/addons.json index 6cba55015b..ac8aa9de77 100644 --- a/addons/addons.json +++ b/addons/addons.json @@ -156,6 +156,7 @@ "reorder-custom-inputs", "place-backpack-code-at-cursor", "big-save-button", + "asset-conflict-dialog", "// NEW ADDONS ABOVE THIS ↑↑", "// Note: these themes need this exact order to work properly,", diff --git a/addons/asset-conflict-dialog/addon.json b/addons/asset-conflict-dialog/addon.json new file mode 100644 index 0000000000..f1a599782a --- /dev/null +++ b/addons/asset-conflict-dialog/addon.json @@ -0,0 +1,32 @@ +{ + "name": "Asset conflict dialog", + "description": "When uploading costumes or sounds with the same name as an existing one, shows a dialog with options to replace or skip them instead of always renaming them.", + "credits": [ + { + "name": "Chrome_Cat", + "link": "https://scratch.mit.edu/users/Chrome_Cat/" + }, + { + "name": "GarboMuffin", + "link": "https://scratch.mit.edu/users/GarboMuffin/" + } + ], + "userstyles": [ + { + "url": "style.css", + "matches": ["projects"] + } + ], + "userscripts": [ + { + "url": "userscript.js", + "matches": ["projects"], + "runAtComplete": true + } + ], + "versionAdded": "1.39.0", + "tags": ["editor", "costumeEditor", "featured"], + "enabledByDefault": false, + "dynamicEnable": true, + "dynamicDisable": true +} diff --git a/addons/asset-conflict-dialog/style.css b/addons/asset-conflict-dialog/style.css new file mode 100644 index 0000000000..8340b826fd --- /dev/null +++ b/addons/asset-conflict-dialog/style.css @@ -0,0 +1,37 @@ +.conflictDialog { + box-sizing: border-box; + width: 600px; + max-height: 80vh; + max-width: 85%; + margin-top: 12vh; + overflow-y: auto; + margin-left: auto; + margin-right: auto; +} + +.conflictDialog .sa-editor-modal-content { + padding: 1.5rem 2.25rem; +} + +.conflictDialog .sa-editor-modal-content > p { + margin-top: 0; +} + +.conflictDialog-actions { + display: flex; + flex-direction: row; + margin-bottom: 1rem; +} + +.conflictDialog-actions > button:not([class^="prompt_ok-button_"]):hover { + background-color: var(--editorDarkMode-primary-transparent15, hsla(260, 60%, 60%, 0.15)); +} + +.conflictDialog-footer { + border-top: solid 1px var(--editorDarkMode-border, rgba(0, 0, 0, 0.15)); + padding-top: 1rem; +} + +.conflictDialog-footer :last-child { + margin-left: 1rem; +} diff --git a/addons/asset-conflict-dialog/userscript.js b/addons/asset-conflict-dialog/userscript.js new file mode 100644 index 0000000000..a1c4b28e43 --- /dev/null +++ b/addons/asset-conflict-dialog/userscript.js @@ -0,0 +1,219 @@ +import { addDefaultAssetFolderIfMissing } from "../folders/userscript.js"; +import { assetSelect, createAndAppendElement } from "./utils.js"; + +export default async function ({ addon, console, msg }) { + function createAssetConflictDialog(fileName, actionClickCallback) { + // Create the modal + const { remove, content, closeButton, container } = addon.tab.createModal(msg("title"), { + isOpen: true, + useEditorClasses: true, + }); + container.classList.add("conflictDialog"); + + // Add the modal content + const btnContainerClass = addon.tab.scratchClass("prompt_button-row", { others: "conflictDialog-actions" }); + const selectedClass = addon.tab.scratchClass("prompt_ok-button"); + + createAndAppendElement("p", content, { textContent: msg("dialogText", { fileName: `"${fileName}"` }) }); + const btnContainer = createAndAppendElement("div", content, { className: btnContainerClass }); + const buttons = ["rename", "replace", "skip"].map((action) => + createAndAppendElement("button", btnContainer, { + name: action, + value: action, + textContent: msg(action), + className: action === "rename" ? selectedClass : "", + }) + ); + conflictFooter = createAndAppendElement("div", content, { className: "conflictDialog-footer" }); + applyToAllCheckbox = createAndAppendElement("input", conflictFooter, { + type: "checkbox", + id: "applyToAll", + name: "applyToAll", + }); + createAndAppendElement("label", conflictFooter, { htmlFor: "applyToAll", textContent: msg("applyToAll") }); + + // initially hide the conflictFooter so that later, asynchronously, when multiple conflicts are in the conflictQueue we can show it again + if (!conflictQueue.length) { + conflictFooter.style.display = "none"; + } + + buttons.forEach((btn) => { + btn.addEventListener("click", function () { + buttons.forEach((btn) => btn.classList.remove("selected")); + this.classList.add("selected"); + // Logic to handle the confirmation action + actionClickCallback(this.value, applyToAllCheckbox.checked); + remove(); // Then close the modal + }); + }); + closeButton.addEventListener("click", () => { + conflictChainStarted = false; + // if the modal is closed apply vanilla scratch + actionClickCallback("skip", true); + remove(); + }); + } + + function createShareAssetWithFileConflictModal(originalShareFn, type) { + return function (...args) { + // handle dynamic enable/disable + if (addon.self.disabled) return originalShareFn.call(this, ...args); + + // https://github.com/scratchfoundation/scratch-vm/blob/6c8079147571b7289a8ddf120a6c324c3c228d54/src/virtual-machine.js#L1290 + // the method is a little hacky but we're going to call the original code up to the part it creates the clone + // then we'll simply swap to the already polluted addCostume and addSound functions + const [assetIndex, targetId] = args; + const originalAsset = (type === "costume" ? this.editingTarget.getCostumes() : this.editingTarget.getSounds())[ + assetIndex + ]; + const clone = Object.assign({}, originalAsset); + if (type === "costume") { + const md5ext = `${clone.assetId}.${clone.dataFormat}`; + return this.addCostume.call(this, md5ext, clone, targetId, 3); + } else { + return this.addSound.call(this, clone, targetId); + } + }; + } + + function wrapAddAssetWithFileConflictModal(originalFn, type) { + return function (...args) { + // `this` is a VirtualMachine + + // handle dynamic enable/disable + if (addon.self.disabled) return originalFn.call(this, ...args); + + // get args + const optTargetId = + type === "costume" ? args[2] : type === "backdrop" ? this.runtime.getTargetForStage() : args[1]; + // the only difference between backdrop and costume is backdrop has stage as target id + if (type == "backdrop") type = "costume"; + const assetObj = type === "costume" ? args[1] : args[0]; + + // handle new costume or sound via Paint/Record + // abuses the fact that new costumes don't have an asset property and new sounds have a format property set to "" + const isNewAsset = + (type === "costume" && !assetObj.asset && assetObj?.skinId === null) || + (type === "sound" && assetObj.format === "" && !assetObj.asset.clean); + if (isNewAsset) return originalFn.call(this, ...args); + + // folders addon compatibility + addDefaultAssetFolderIfMissing(assetObj); + + // get target and target.sprite + const target = optTargetId ? this.runtime.getTargetById(optTargetId) : this.editingTarget; + if (!target) return originalFn.call(this, ...args); + const sprite = target.sprite; + + // see if there is even a conflict + const assets = type === "costume" ? sprite.costumes_ : sprite.sounds; + const originalName = assetObj.name || ""; + const isConflicting = !!assets.find((i) => i.name === originalName); + if (!isConflicting) return originalFn.call(this, ...args); + + // Return a new Promise + return new Promise((resolve, reject) => { + // if there's a conflict, we need to wait for the user to make a choice in the modal dialog before we can act on this + // Note: as the outer function is not async we can't use await + // instead we'll create a callback that will handle the conflict once the modal is submitted and push to the conflictQueue + const conflictHandler = (action) => { + switch (action) { + case "rename": + resolve(originalFn.call(this, ...args)); + break; + case "replace": { + resolve( + originalFn.call(this, ...args).then(() => { + // Don't reuse values from above as they may have changed + const assets = type === "costume" ? sprite.costumes_ : sprite.sounds; + const assetObjIndex = assets.findIndex((e) => e === assetObj); + const duplicateIndex = assets.findIndex((e) => e.name === originalName); + assets[duplicateIndex] = assets[assetObjIndex]; + assets[duplicateIndex].name = originalName; + if (type === "costume") { + target.setCostume(duplicateIndex); + target.sprite.deleteCostumeAt(assetObjIndex); + } else { + target.deleteSound(assetObjIndex); + } + + // force asset list to update immediately, don't wait for the next Scratch frame + this.emitTargetsUpdate(); + + // if we are on the same tab as we added the costume to, set the tabs current asset state to the duplicate asset + if (this.runtime._editingTarget === target) { + assetSelect(addon, duplicateIndex, type); + } + }) + ); + break; + } + case "skip": + resolve(assetObj); + break; + } + }; + conflictQueue.push({ assetName: originalName, conflictHandler: conflictHandler }); + if (conflictFooter && conflictChainStarted) { + conflictFooter.style.display = "block"; + } + + // to avoid polluting any other functions we begin the dequeuing function from within the wrapper function + // this function sets off a recursive-callback chain which only ends once the queue is empty, so to avoid duplicate chains we only call it if the chain hasn't started + if (!conflictChainStarted) { + conflictChainStarted = true; + dequeueConflictModal(); + } + }); + }; + } + + function dequeueConflictModal() { + // handle base case + if (conflictQueue.length === 0) { + applyToAll = false; + conflictChainStarted = false; + return; + } + + // dequeue conflict from the conflictQueue + const { assetName, conflictHandler } = conflictQueue.shift(); + + // handle the case that applyToAll is set + if (applyToAll) { + conflictHandler(action); + dequeueConflictModal(); + return; + } + + createAssetConflictDialog(assetName, (action_, applyToAll_) => { + // apply the chosen conflict resolution action + conflictHandler(action_); + + // set applyToAll and it's corresponding action + if (applyToAll_) { + applyToAll = true; + action = action_; + } + + // call the next conflict in the chain + dequeueConflictModal(); + }); + } + + // global vars needed for async functionality + const vm = addon.tab.traps.vm; + let conflictQueue = []; + let applyToAll = false; + let action = null; + let conflictChainStarted = false; + let conflictFooter = null; + let applyToAllCheckbox = null; + + // pollute the costume and sound adding code to handle the replace/skip actions for assets + vm.addCostume = wrapAddAssetWithFileConflictModal(vm.addCostume, "costume"); + vm.addSound = wrapAddAssetWithFileConflictModal(vm.addSound, "sound"); + vm.addBackdrop = wrapAddAssetWithFileConflictModal(vm.addBackdrop, "backdrop"); + vm.shareCostumeToTarget = createShareAssetWithFileConflictModal(vm.shareCostumeToTarget, "costume"); + vm.shareSoundToTarget = createShareAssetWithFileConflictModal(vm.shareSoundToTarget, "sound"); +} diff --git a/addons/asset-conflict-dialog/utils.js b/addons/asset-conflict-dialog/utils.js new file mode 100644 index 0000000000..3ed84c88ee --- /dev/null +++ b/addons/asset-conflict-dialog/utils.js @@ -0,0 +1,45 @@ +// util function for selecting a costume or sound asset directly with the react State to avoid needing to simulate a click +export function assetSelect(addon, assetIndex, assetType) { + const tabIndex = addon.tab.redux.state.scratchGui.editorTab.activeTabIndex; + const tab = document.querySelectorAll("[class*='gui_tab-panel_']")[tabIndex]; + + // `tab` refers to a DOM element inside one of these : + // https://github.com/scratchfoundation/scratch-gui/blob/0c46d7b9fce8c767fb8ae01aca4f5472a70d1de8/src/components/gui/gui.jsx#L339-L344 + // The React tree looks like this: + // + // ... various unimportant DOM ... <-- this is `tab` + // - https://github.com/scratchfoundation/scratch-gui/blob/0c46d7b9fce8c767fb8ae01aca4f5472a70d1de8/src/containers/costume-tab.jsx#L380 + // - from react-redux + // - from react-intl + // - from Scratch error handling + // + // The sound tab is the same just find-and-replace CostumeTab with SoundTab + // The index of the current costume/sound is stored in CostumeTab/SoundTab's state, so we have to get down there + + // Instead of hardcoding .child.child.child.child ... we'll loop to make this at least a little bit resilient to change + // CostumeTab and SoundTab both have an onShowImporting prop so we'll stop when we see that + let reactInternal = tab[addon.tab.traps.getInternalKey(tab)]; + while (reactInternal && !reactInternal.pendingProps.onShowImporting) { + reactInternal = reactInternal.child; + } + + if (reactInternal) { + // overwrite state: + // https://github.com/scratchfoundation/scratch-gui/blob/0c46d7b9fce8c767fb8ae01aca4f5472a70d1de8/src/containers/costume-tab.jsx#L99 + // https://github.com/scratchfoundation/scratch-gui/blob/0c46d7b9fce8c767fb8ae01aca4f5472a70d1de8/src/containers/sound-tab.jsx#L57 + // delay is needed so that we won't get overridden by componentWillReceiveProps + setTimeout(() => { + reactInternal.stateNode.setState({ + [assetType === "costume" ? "selectedCostumeIndex" : "selectedSoundIndex"]: assetIndex, + }); + }); + } +} + +// util function for creating and appending Elements +export function createAndAppendElement(type, parent, attrs = {}) { + const element = document.createElement(type); + Object.assign(element, attrs); + parent.appendChild(element); + return element; +} diff --git a/addons/folders/userscript.js b/addons/folders/userscript.js index c0636261e0..ee63280e18 100644 --- a/addons/folders/userscript.js +++ b/addons/folders/userscript.js @@ -1,5 +1,74 @@ import { escapeHTML } from "../../libraries/common/cs/autoescaper.js"; +const DIVIDER = "//"; + +/** + * getFolderFromName("B") === null + * getFolderFromName("A//b") === "A" + */ +const getFolderFromName = (name) => { + const idx = name.indexOf(DIVIDER); + if (idx === -1 || idx === 0) { + return null; + } + return name.substr(0, idx); +}; + +/** + * getNameWithoutFolder("B") === "B" + * getNameWithoutFolder("A//b") === "b" + */ +const getNameWithoutFolder = (name) => { + const idx = name.indexOf(DIVIDER); + if (idx === -1 || idx === 0) { + return name; + } + return name.substr(idx + DIVIDER.length); +}; + +/** + * setFolderOfName("B", "y") === "y//B" + * setFolderOfName("c//B", "y") === "y//B" + * setFolderOfName("B", null) === "B" + * setFolderOfName("c//B", null) === "B" + */ +const setFolderOfName = (name, folder) => { + const basename = getNameWithoutFolder(name); + if (folder) { + return `${folder}${DIVIDER}${basename}`; + } + return basename; +}; + +const isValidFolderName = (name) => { + return !name.includes(DIVIDER) && !name.endsWith("/"); +}; + +const RESERVED_NAMES = ["_mouse_", "_stage_", "_edge_", "_myself_", "_random_"]; +const ensureNotReserved = (name) => { + if (name === "") return "2"; + if (RESERVED_NAMES.includes(name)) return `${name}2`; + return name; +}; + +let currentSpriteFolder = null; +let currentAssetFolder = null; + +/** + * Used for compatibility with other addons that trap the add costume or add sound functions. + * By default new assets are added to the folder that the user currently has open. This gets + * encoded in the name of the asset, but that information may not be added until late in the + * process. If you want to guarantee that your addon is aware of the asset name after + * accounting for folders, then pass it into this function. The asset will be modified in-place. + * It is safe to call this multiple times with the same asset. + * @param {{name: string}} asset a sound or costume asset + */ +export const addDefaultAssetFolderIfMissing = (asset) => { + if (asset && currentAssetFolder !== null && typeof getFolderFromName(asset.name) !== "string") { + asset.name = setFolderOfName(asset.name, currentAssetFolder); + } +}; + export default async function ({ addon, console, msg }) { // The basic premise of how this addon works is relative simple. // scratch-gui renders the sprite selectors and asset selectors in a hierarchy like this: @@ -27,63 +96,9 @@ export default async function ({ addon, console, msg }) { let reactInternalKey; - let currentSpriteFolder; - let currentAssetFolder; - let currentSpriteItems; let currentAssetItems; - const DIVIDER = "//"; - - /** - * getFolderFromName("B") === null - * getFolderFromName("A//b") === "A" - */ - const getFolderFromName = (name) => { - const idx = name.indexOf(DIVIDER); - if (idx === -1 || idx === 0) { - return null; - } - return name.substr(0, idx); - }; - - /** - * getNameWithoutFolder("B") === "B" - * getNameWithoutFolder("A//b") === "b" - */ - const getNameWithoutFolder = (name) => { - const idx = name.indexOf(DIVIDER); - if (idx === -1 || idx === 0) { - return name; - } - return name.substr(idx + DIVIDER.length); - }; - - /** - * setFolderOfName("B", "y") === "y//B" - * setFolderOfName("c//B", "y") === "y//B" - * setFolderOfName("B", null) === "B" - * setFolderOfName("c//B", null) === "B" - */ - const setFolderOfName = (name, folder) => { - const basename = getNameWithoutFolder(name); - if (folder) { - return `${folder}${DIVIDER}${basename}`; - } - return basename; - }; - - const isValidFolderName = (name) => { - return !name.includes(DIVIDER) && !name.endsWith("/"); - }; - - const RESERVED_NAMES = ["_mouse_", "_stage_", "_edge_", "_myself_", "_random_"]; - const ensureNotReserved = (name) => { - if (name === "") return "2"; - if (RESERVED_NAMES.includes(name)) return `${name}2`; - return name; - }; - const untilInEditor = () => { if (addon.tab.editorMode === "editor") return; return new Promise((resolve, reject) => { @@ -1008,12 +1023,7 @@ export default async function ({ addon, console, msg }) { const originalAddCostume = RenderedTarget.prototype.addCostume; RenderedTarget.prototype.addCostume = function (...args) { - if (currentAssetFolder !== null) { - const costume = args[0]; - if (costume && typeof getFolderFromName(costume.name) !== "string") { - costume.name = setFolderOfName(costume.name, currentAssetFolder); - } - } + addDefaultAssetFolderIfMissing(args[0]); const r = originalAddCostume.call(this, ...args); fixCostumeOrder(this); return r; @@ -1021,12 +1031,7 @@ export default async function ({ addon, console, msg }) { const originalAddSound = RenderedTarget.prototype.addSound; RenderedTarget.prototype.addSound = function (...args) { - if (currentAssetFolder !== null) { - const sound = args[0]; - if (sound && typeof getFolderFromName(sound.name) !== "string") { - sound.name = setFolderOfName(sound.name, currentAssetFolder); - } - } + addDefaultAssetFolderIfMissing(args[0]); const r = originalAddSound.call(this, ...args); fixSoundOrder(this); return r; From 586def818fd04b0c8e3a29013f9eaa53b236c4ce Mon Sep 17 00:00:00 2001 From: Niko <150537842+OneShot-Niko@users.noreply.github.com> Date: Mon, 10 Jun 2024 00:04:38 +0000 Subject: [PATCH 10/12] `comments-linebreaks`: add notice about linebreaks not rendering on scratchr2 pages (#7512) * Add notice * Change type & text Co-authored-by: Maximouse <51849865+mxmou@users.noreply.github.com> --------- Co-authored-by: Maximouse <51849865+mxmou@users.noreply.github.com> --- addons/comments-linebreaks/addon.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/comments-linebreaks/addon.json b/addons/comments-linebreaks/addon.json index b998b48b9c..dffb16999f 100644 --- a/addons/comments-linebreaks/addon.json +++ b/addons/comments-linebreaks/addon.json @@ -12,6 +12,11 @@ "type": "notice", "text": "Line breaks are only visible to users with this addon enabled. They will appear as spaces for others.", "id": "ownLineBreaks" + }, + { + "type": "info", + "text": "On profile pages, line breaks at the beginning or end of a comment do not appear.", + "id": "scratchr2Linebreaks" } ], "userscripts": [ From 7ad4a8b8b2316c3d64addfb593b913348bb7d109 Mon Sep 17 00:00:00 2001 From: "scratchaddons-bot[bot]" <73682299+scratchaddons-bot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:11:46 -0300 Subject: [PATCH 11/12] Translation update: 2024/06/11 (#7517) New strings from Transifex Co-authored-by: scratchaddons-bot[bot] <73682299+scratchaddons-bot[bot]@users.noreply.github.com> --- _locales/de/messages.json | 2 +- addons-l10n/de/asset-conflict-dialog.json | 1 + addons-l10n/de/comments-linebreaks.json | 2 +- addons-l10n/de/copy-reporter.json | 2 +- addons-l10n/de/editor-buttons-reverse-order.json | 2 +- addons-l10n/de/fullscreen.json | 2 +- addons-l10n/de/hide-stage.json | 2 +- addons-l10n/de/live-featured-project.json | 2 +- addons-l10n/de/mute-project.json | 2 +- addons-l10n/de/necropost-highlighter.json | 2 +- addons-l10n/de/turbowarp-player.json | 2 +- addons-l10n/de/youtube-fullscreen.json | 2 +- addons-l10n/nl/asset-conflict-dialog.json | 1 + addons-l10n/nl/comments-linebreaks.json | 2 +- addons-l10n/ru/debugger.json | 2 +- addons-l10n/ru/disable-stage-drag-select.json | 2 +- addons-l10n/ru/mediarecorder.json | 2 +- addons-l10n/ru/name-backpack-items.json | 2 +- addons-l10n/ru/turbowarp-player.json | 2 +- addons-l10n/sl/60fps.json | 2 +- addons-l10n/sl/editor-dark-mode.json | 2 +- addons-l10n/sl/hide-backpack.json | 1 + addons-l10n/sl/middle-click-popup.json | 2 +- addons-l10n/sl/place-backpack-code-at-cursor.json | 2 +- addons-l10n/sl/redirect-mobile-forums-v2.json | 2 +- addons-l10n/sl/script-snap.json | 2 +- 26 files changed, 26 insertions(+), 23 deletions(-) create mode 100644 addons-l10n/de/asset-conflict-dialog.json create mode 100644 addons-l10n/nl/asset-conflict-dialog.json create mode 100644 addons-l10n/sl/hide-backpack.json diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 3d5ea8a26f..37885bb062 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1 +1 @@ -{"extensionName":{"message":"Scratch Addons"},"extensionDescription":{"message":"Scratch Addons bietet flexible Features und Designs für die Seite scratch.mit.edu und den Projekteditor an."},"messaging":{"message":"Nachrichten"},"games":{"message":"Spiele"},"openInNewTab":{"message":"In neuem Browsertab öffnen"},"changelog":{"message":"Änderungseverlauf anzeigen"},"notifChangelog":{"message":"Änderungseverlauf anzeigen"},"15min":{"message":"Für 15 Minuten"},"1hour":{"message":"Für 1 Stunde"},"8hours":{"message":"Für 8 Stunden"},"24hours":{"message":"Für 24 Stunden"},"untilEnabled":{"message":"Bis ich es selber ausschalte"},"muteFor":{"message":"Bitte nicht stören"},"unmute":{"message":"BItte nicht stören ausschalten"},"recommended":{"message":"Empfohlen"},"featured":{"message":"Vorgestellt"},"beta":{"message":"Beta"},"danger":{"message":"Gefährlich"},"dangerWarning":{"message":"Bist du dir sicher, dass du das \"$1\" Addon aktivieren möchtest?"},"forums":{"message":"Forum"},"forEditor":{"message":"Für den Editor"},"forWebsite":{"message":"Für die Website"},"confirmPreset":{"message":"Vorlage laden und aktuelle EInstellungen des Addons überschreiben?"},"confirmReset":{"message":"Bist du dir sicher, dass du dieses Addon auf seine Standardeinstellungen zurücksetzen möchtest?"},"settingsTitle":{"message":"Einstellungen - Scratch Addons"},"settings":{"message":"Einstellungen"},"all":{"message":"Alle"},"editorFeatures":{"message":"Scratch-Editor-Features"},"costumeEditorFeatures":{"message":"Kostüm-Editor"},"codeEditorFeatures":{"message":"Code-Editor"},"websiteFeatures":{"message":"Scratch-Website-Features"},"profilesFeatures":{"message":"Profile"},"projectPlayerFeatures":{"message":"Projektplayer"},"projectPageFeatures":{"message":"Projektseiten"},"others":{"message":"Andere"},"themes":{"message":"Designs"},"editorThemes":{"message":"Editor-Designs"},"websiteThemes":{"message":"Website-Designs"},"popupFeatures":{"message":"Erweiterungs-Popup-Features"},"theme":{"message":"Design:"},"credits":{"message":"Danksagungen"},"review":{"message":"Bewerten"},"feedback":{"message":"Feedback senden"},"moreSettings":{"message":"Mehr Einstellungen"},"close":{"message":"Schließen"},"filter":{"message":"Filter:"},"resetToDefault":{"message":"Auf Standardeinstellungen zurücksetzen"},"creditTo":{"message":"Danke an:"},"viewLicenses":{"message":"Verwendete Lizenzen anzeigen"},"reset":{"message":"Zurücksetzen"},"default":{"message":"Standard"},"presets":{"message":"Vorlagen"},"preview":{"message":"Vorschau"},"scratchAddonsTheme":{"message":"Scratch Addons-Design"},"scratchAddonsThemeDescription":{"message":"Dies ermöglicht es dir, für diese Seite und dem Popup zwischen dem hellen und dem dunklen Farbschema zu wechseln."},"light":{"message":"Hell"},"dark":{"message":"Dunkel"},"licensesTitle":{"message":"Lizenzen - Scratch Addons"},"licenses":{"message":"Lizenzen"},"licensesForLibrary":{"message":"Lizenzen der Bibliothek $1"},"libraryCredits":{"message":"Lizenzen der verwendeten Bibliotheken anzeigen"},"recommendedTooltip":{"message":"Dies wird von Scratch Addons empfohlen. Probiere es aus!"},"dangerTooltip":{"message":"Mit Vorsicht benutzen. Sei dir sicher, das du verstehst, was dieses Addon tut, bevor du es benutzt."},"betaTooltip":{"message":"Es könnte sein, dass dieses Addon noch Fehler enthält."},"forumsTooltip":{"message":"Dieses Addon wird auf den Diskussionsforen von Scratch angewendet."},"reportItHere":{"message":"melde ihn hier"},"forumWarning":{"message":"Nachricht von der Scratch Addons-Erweiterung: Stelle sicher, dass der Fehler, den du melden willst, auch dann noch auftritt, wenn alle Browser-Erweiterungen, einschließlich Scratch Addons, deaktiviert sind. Wenn du glaubst, dass ein Fehler durch Scratch Addons verursacht wird, bitte $1."},"forumWarningGeneral":{"message":"Nachricht der Scratch Addons-Erweiterung: Die Scratch-Richtlinien verbieten Diskussionen über Browser-Erweiterungen, einschließlich Scratch Addons. Werbe nicht für Scratch Addons oder eine seiner Funktionen. Falls dies ein Fehler ist, bitte $1."},"search":{"message":"Suchen"},"permissionsTitle":{"message":"Berechtigungen - Scratch Addons"},"permissions":{"message":"Berechtigungen"},"enablePermissionsTitle":{"message":"Bitte aktiviere den Seitenzugriff"},"enablePermissionsDescription":{"message":"Scratch Addons benötigt Zugriff auf die Seite, um zu funktionieren."},"enableButton":{"message":"Aktivieren"},"enableButtonDescription":{"message":"Klicke zum Aktivieren die Schaltfläche an."},"permissionsScreenAlt":{"message":"Screenshot eines Dialogs zum Aktivieren des Seitenzugriffes"},"clickAllowDescription":{"message":"Klicke auf \"Zulassen\". Scratch Addons wird neu geladen und die Addons werden wieder korrekt funktionieren"},"permissionsDenied":{"message":"Seitenzugriff konnte nicht aktiviert werden. Versuche es noch einmal."},"translate":{"message":"Beim Übersetzen mithelfen"},"extensionUpdate":{"message":"Update für die Scratch Addons-Erweiterung"},"extensionHasUpdated":{"message":"Scratch Addons wurde auf Version $1 aktualisiert"},"extensionUpdateInfo1_v1_38":{"message":"Dies ist ein experimentelles Update, das nur an einen kleinen Anteil unserer Nutzer verteilt wird. Es enthält mehrere Hintergrund-Änderungen, um die neue, von Browsern benötigte Architektur zu unterstützen (Manifest V3). Wenn du auf Probleme oder unerwartete Verhalten stößt, bitte $1. Es gibt auch eine Feedback-Schaltfläche in den Einstellungen.","description":"!! The placeholder is \"send feedback\"."},"scratchAddonsSettings":{"message":"Scratch Addons-Einstellungen"},"sendFeedbackNotification":{"message":"gib uns Bescheid"},"extensionUpdateInfo2_v1_38":{"message":"Dieses Update führt keine neue Funktionen ein, aber bleib für kommende Updates am laufenden."},"readTheBlogPost":{"message":"Lies den $1 für weitere Informationen.","description":"The placeholder is \"blog post\""},"blogPost":{"message":"Blogbeitrag"},"notAffiliated":{"message":"Scratch Addons ist in keiner Weise mit Scratch assoziiert."},"new":{"message":"Neu!","description":"Tag for addons. Singular."},"updated":{"message":"Neue Funktionen","description":"Tag for addons with new features. Singular."},"updatedWithSettings":{"message":"Neue Einstellungen","description":"Tag for addons with new settings. Singular."},"newGroup":{"message":"Andere neue und aktualisierte Addons","description":"Used as a category name for new addons and updates"},"featuredNew":{"message":"Vorgestellte neue und aktualisierte Addons","description":"Used as a category name for featured new addons and updates"},"enabled":{"message":"Aktiviert","description":"Used as a category name for enabled addons"},"exportAndImportSettings":{"message":"EInstellungen Importieren und Exportieren"},"exportAndImportSettingsDescription":{"message":"Einstellungen als JSON-Datei zur Benutzung auf anderen Computern exportieren."},"useBrowserSync":{"message":"Du kannst auch die integrierten Synchronisierungsoptionen deines Browsers aktivieren, um die Einstellungen automatisch zwischen Geräten zu synchronisieren."},"export":{"message":"Exportieren"},"import":{"message":"Importieren"},"viewSettings":{"message":"Einstellungsdatei anzeigen"},"fileNotSelected":{"message":"Bitte wähle eine Einstellungsdatei aus."},"importSuccess":{"message":"Einstellungen wurden erfolgreich importiert. Scratch Addons wird nun neu geladen."},"importFailed":{"message":"Die Einstellungsdatei ist ungültig. Bitte versuche es noch einmal."},"confirmImport":{"message":"Bestätigen"},"language":{"message":"Sprache"},"applySettings":{"message":"Änderungen anwenden"},"quickSettings":{"message":"Addons"},"runningOnThisPage":{"message":"Addons in diesem Tab"},"recentlyUsed":{"message":"Zuletzt verwendet","description":"Used as a category name for recently used addons"},"settingsPagePermission":{"message":"Um das Addon \"$1\" zu aktivieren, öffne die Einstellungen in einem neuen Tab."},"openFullSettings":{"message":"Einstellungenseite in neuem Tab öffnen"},"skipOpenFullSettings":{"message":"Abbrechen"},"exploreAllAddons":{"message":"Erkunde alle $1 Addons:","description":"Placeholder is a number. Example: explore all 80+ addons"},"searchNotFound":{"message":"Keine Ergebnisse gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"searchNotFoundInCategory":{"message":"Keine Ergebnisse in \"$1\" gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"captureCommentError":{"message":"Von Scratch Addons hinzugefügt Meldung: dein Kommentar erwähnt eine Browsererweiterung. Die $1 untersagt Werbung dafür, da das Scratch Team sie nicht auf ihre Sicherheit geprüft hat und nicht jede einzelne verifizieren kann. Bitte befolge die oben erwähnte Richtlinie und vermeide jegliche Referenzen zu Browsererweiterungen, wenn du auf Scratch postest.","description":"The placeholder is \"Browser Extension Policy\""},"captureCommentPolicy":{"message":"Richtlinie für Browsererweiterungen"},"captureCommentPostAnyway":{"message":"Trotzdem posten"},"captureCommentConfirm":{"message":"Das Absenden dieses Kommentars könnte zu automatischer Stummschaltung deines Accounts führen und dich vom Kommentieren abhalten. Dauerhafte Stummschaltung kann dazu führen, dass dein Account von Scratch blockiert wird. Bist du dir sicher, dass du diesen Kommentar absenden willst?"},"extensionStoreDescription1":{"message":"Wähle 100+ Optionen:","description:":"Used in the description for the extension stores"},"extensionStoreDescription2":{"message":"• Schnelles Lesen und Antworten auf Nachrichten durch Klicken auf das Erweiterungsicon.\n• Springen in aktive Multiplayer-Spiele mit dem Cloudspiele-Tab.\n• Verschönere jede Seite auf Scratch mit 3.0-Stil, dunklem Modus und benutzerdefinierten Farben.\n• Verlasse Studios mit einem Klick, befördere oder entferne Kuratoren und durchsuche Follower zum Hinzufügen.\n• Verbessere Projektverwaltung mit dem Suchfeld in Meine Sachen und dem Unveröffentlichen-Knopf.\n• Verbessere den Projektplayer mit einem Pause-Knopf, doppelter Geschwindigkeit mit 60FPS und Controller-Unterstützung.\n• Erleichtertes Animieren mit Onion Skinning, genauer Farbenauswahl und Figurensuche.\n• Booste deine Programmiereffizienz mit Blocksuche, durchsuchbaren Drop-Downs, Blockwechsel, einzelnes Verschieben und Kopieren/Einfügen.\n• Bleib ordentlich mit Blockpalette ausblenden und Figurenordner.\n• Setze deine Projektvorschau direkt auf jedes beliebige Bild oder GIF.\n• Hole die Katzenblöcke vom Aprilscherz zurück.\n• Debugge Projekte mit Logging, Leistungsansicht und Schritt-für-Schritt-Ausführung.\n• Und mehr mit jedem Update!","description":"Used in the description for the extension stores"},"extensionStoreDescription3":{"message":"Diese Erweiterung ist open source und unter GPL v3 lizensiert.\nUm Mitzuwirken oder den Quellcode anzusehen: https://github.com/ScratchAddons\nFür mehr Infos, siehe: ScratchAddons.com","description":"Used in the description for the extension stores. Do not translate \"GPL v3\" or the links."},"extensionStoreDescription4":{"message":"Dieses Projekt ist in keiner Weise offiziell mit Scratch oder den Organisationen, die es am Laufen halten, assoziiert.","description":"Used in the description for the extension stores"}} \ No newline at end of file +{"extensionName":{"message":"Scratch Addons"},"extensionDescription":{"message":"Scratch Addons bietet flexible Features und Designs für die Seite scratch.mit.edu und den Projekteditor an."},"messaging":{"message":"Nachrichten"},"games":{"message":"Spiele"},"openInNewTab":{"message":"In neuem Browsertab öffnen"},"changelog":{"message":"Änderungseverlauf anzeigen"},"notifChangelog":{"message":"Änderungseverlauf anzeigen"},"15min":{"message":"Für 15 Minuten"},"1hour":{"message":"Für 1 Stunde"},"8hours":{"message":"Für 8 Stunden"},"24hours":{"message":"Für 24 Stunden"},"untilEnabled":{"message":"Bis ich es selbst wieder ausschalte"},"muteFor":{"message":"Bitte nicht stören"},"unmute":{"message":"BItte nicht stören ausschalten"},"recommended":{"message":"Empfohlen"},"featured":{"message":"Vorgestellt"},"beta":{"message":"Beta"},"danger":{"message":"Gefährlich"},"dangerWarning":{"message":"Bist du dir sicher, dass du das Addon \"$1\" aktivieren möchtest?"},"forums":{"message":"Forum"},"forEditor":{"message":"Editor"},"forWebsite":{"message":"Website"},"confirmPreset":{"message":"Vorlage laden und aktuelle Einstellungen des Addons überschreiben?"},"confirmReset":{"message":"Bist du dir sicher, dass du dieses Addon auf seine Standardeinstellungen zurücksetzen möchtest?"},"settingsTitle":{"message":"Einstellungen - Scratch Addons"},"settings":{"message":"Einstellungen"},"all":{"message":"Alle"},"editorFeatures":{"message":"Scratch-Editor-Features"},"costumeEditorFeatures":{"message":"Kostüm-Editor"},"codeEditorFeatures":{"message":"Code-Editor"},"websiteFeatures":{"message":"Scratch-Website-Features"},"profilesFeatures":{"message":"Profilseiten"},"projectPlayerFeatures":{"message":"Projekt-Player"},"projectPageFeatures":{"message":"Projektseiten"},"others":{"message":"Sonstige"},"themes":{"message":"Designs"},"editorThemes":{"message":"Editor-Designs"},"websiteThemes":{"message":"Website-Designs"},"popupFeatures":{"message":"Erweiterungs-Popup-Features"},"theme":{"message":"Design:"},"credits":{"message":"Danksagungen"},"review":{"message":"Bewerten"},"feedback":{"message":"Feedback senden"},"moreSettings":{"message":"Mehr Einstellungen"},"close":{"message":"Schließen"},"filter":{"message":"Filter:"},"resetToDefault":{"message":"Auf Standardeinstellungen zurücksetzen"},"creditTo":{"message":"Danke an:"},"viewLicenses":{"message":"Bibliothekslizenzen anzeigen"},"reset":{"message":"Zurücksetzen"},"default":{"message":"Standard"},"presets":{"message":"Vorlagen"},"preview":{"message":"Vorschau"},"scratchAddonsTheme":{"message":"Scratch Addons-Design"},"scratchAddonsThemeDescription":{"message":"Dies ermöglicht es dir, für diese Seite und dem Popup zwischen dem hellen und dem dunklen Farbschema zu wechseln."},"light":{"message":"Hell"},"dark":{"message":"Dunkel"},"licensesTitle":{"message":"Lizenzen - Scratch Addons"},"licenses":{"message":"Lizenzen"},"licensesForLibrary":{"message":"Lizenzen der Bibliothek $1"},"libraryCredits":{"message":"Lizenzen der verwendeten Bibliotheken anzeigen"},"recommendedTooltip":{"message":"Dies wird von Scratch Addons empfohlen. Probiere es aus!"},"dangerTooltip":{"message":"Mit Vorsicht benutzen. Sei dir sicher, das du verstehst, was dieses Addon bewirkt, bevor du es aktivierst."},"betaTooltip":{"message":"Es könnte sein, dass dieses Addon noch Fehler enthält."},"forumsTooltip":{"message":"Dieses Addon wird auf den Diskussionsforen von Scratch angewendet."},"reportItHere":{"message":"melde ihn hier"},"forumWarning":{"message":"Nachricht von der Scratch Addons-Erweiterung: Stelle sicher, dass der Fehler, den du melden willst, auch dann noch auftritt, wenn alle Browser-Erweiterungen, einschließlich Scratch Addons, deaktiviert sind. Wenn du glaubst, dass ein Fehler durch Scratch Addons verursacht wird, bitte $1."},"forumWarningGeneral":{"message":"Nachricht der Scratch Addons-Erweiterung: Die Scratch-Richtlinien verbieten Diskussionen über Browser-Erweiterungen, einschließlich Scratch Addons. Werbe nicht für Scratch Addons oder eine seiner Funktionen. Falls dies ein Fehler ist, bitte $1."},"search":{"message":"Suchen"},"permissionsTitle":{"message":"Berechtigungen - Scratch Addons"},"permissions":{"message":"Berechtigungen"},"enablePermissionsTitle":{"message":"Bitte aktiviere den Seitenzugriff"},"enablePermissionsDescription":{"message":"Scratch Addons benötigt Zugriff auf die Seite, um zu funktionieren."},"enableButton":{"message":"Aktivieren"},"enableButtonDescription":{"message":"Klicke zum Aktivieren die Schaltfläche an."},"permissionsScreenAlt":{"message":"Screenshot eines Dialogs zum Aktivieren des Seitenzugriffes"},"clickAllowDescription":{"message":"Klicke auf \"Zulassen\". Scratch Addons wird neu geladen und die Addons werden wieder korrekt funktionieren"},"permissionsDenied":{"message":"Seitenzugriff konnte nicht aktiviert werden. Versuche es noch einmal."},"translate":{"message":"Beim Übersetzen mithelfen"},"extensionUpdate":{"message":"Update für die Scratch Addons-Erweiterung"},"extensionHasUpdated":{"message":"Scratch Addons wurde auf Version $1 aktualisiert"},"extensionUpdateInfo1_v1_38":{"message":"Dies ist ein experimentelles Update, das nur an einen kleinen Anteil unserer Nutzer verteilt wird. Es enthält mehrere Hintergrund-Änderungen, um die neue, von Browsern benötigte Architektur zu unterstützen (Manifest V3). Wenn du auf Probleme oder unerwartete Verhalten stößt, bitte $1. Es gibt auch eine Feedback-Schaltfläche in den Einstellungen.","description":"!! The placeholder is \"send feedback\"."},"scratchAddonsSettings":{"message":"Scratch Addons-Einstellungen"},"sendFeedbackNotification":{"message":"gib uns Bescheid"},"extensionUpdateInfo2_v1_38":{"message":"Dieses Update führt keine neue Funktionen ein, aber bleib für kommende Updates am laufenden."},"readTheBlogPost":{"message":"Lies den $1 für weitere Informationen.","description":"The placeholder is \"blog post\""},"blogPost":{"message":"Blogbeitrag"},"notAffiliated":{"message":"Scratch Addons ist in keiner Weise mit Scratch assoziiert."},"new":{"message":"Neu!","description":"Tag for addons. Singular."},"updated":{"message":"Neue Funktionen","description":"Tag for addons with new features. Singular."},"updatedWithSettings":{"message":"Neue Einstellungen","description":"Tag for addons with new settings. Singular."},"newGroup":{"message":"Andere neue und aktualisierte Addons","description":"Used as a category name for new addons and updates"},"featuredNew":{"message":"Vorgestellte neue und aktualisierte Addons","description":"Used as a category name for featured new addons and updates"},"enabled":{"message":"Aktiviert","description":"Used as a category name for enabled addons"},"exportAndImportSettings":{"message":"EInstellungen Importieren und Exportieren"},"exportAndImportSettingsDescription":{"message":"Einstellungen als JSON-Datei zur Benutzung auf anderen Computern exportieren."},"useBrowserSync":{"message":"Du kannst auch die integrierten Synchronisierungsoptionen deines Browsers aktivieren, um die Einstellungen automatisch zwischen Geräten zu synchronisieren."},"export":{"message":"Exportieren"},"import":{"message":"Importieren"},"viewSettings":{"message":"Einstellungsdatei anzeigen"},"fileNotSelected":{"message":"Bitte wähle eine Einstellungsdatei aus."},"importSuccess":{"message":"Einstellungen wurden erfolgreich importiert. Scratch Addons wird nun neu geladen."},"importFailed":{"message":"Die Einstellungsdatei ist ungültig. Bitte versuche es noch einmal."},"confirmImport":{"message":"Bestätigen"},"language":{"message":"Sprache"},"applySettings":{"message":"Änderungen anwenden"},"quickSettings":{"message":"Addons"},"runningOnThisPage":{"message":"Addons in diesem Tab"},"recentlyUsed":{"message":"Zuletzt verwendet","description":"Used as a category name for recently used addons"},"settingsPagePermission":{"message":"Um das Addon \"$1\" zu aktivieren, öffne die Einstellungen in einem neuen Tab."},"openFullSettings":{"message":"Einstellungenseite in neuem Tab öffnen"},"skipOpenFullSettings":{"message":"Abbrechen"},"exploreAllAddons":{"message":"Erkunde alle $1 Addons:","description":"Placeholder is a number. Example: explore all 80+ addons"},"searchNotFound":{"message":"Keine Ergebnisse gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"searchNotFoundInCategory":{"message":"Keine Ergebnisse in \"$1\" gefunden. Vielleicht solltest du es mit anderen Stichwörtern versuchen?"},"captureCommentError":{"message":"Von Scratch Addons hinzugefügt Meldung: dein Kommentar erwähnt eine Browsererweiterung. Die $1 untersagt Werbung dafür, da das Scratch Team sie nicht auf ihre Sicherheit geprüft hat und nicht jede einzelne verifizieren kann. Bitte befolge die oben erwähnte Richtlinie und vermeide jegliche Referenzen zu Browsererweiterungen, wenn du auf Scratch postest.","description":"The placeholder is \"Browser Extension Policy\""},"captureCommentPolicy":{"message":"Richtlinie für Browsererweiterungen"},"captureCommentPostAnyway":{"message":"Trotzdem posten"},"captureCommentConfirm":{"message":"Das Absenden dieses Kommentars könnte zu automatischer Stummschaltung deines Accounts führen und dich vom Kommentieren abhalten. Dauerhafte Stummschaltung kann dazu führen, dass dein Account von Scratch blockiert wird. Bist du dir sicher, dass du diesen Kommentar absenden willst?"},"extensionStoreDescription1":{"message":"Wähle 100+ Optionen:","description:":"Used in the description for the extension stores"},"extensionStoreDescription2":{"message":"• Schnelles Lesen und Antworten auf Nachrichten durch Klicken auf das Erweiterungsicon.\n• Springen in aktive Multiplayer-Spiele mit dem Cloudspiele-Tab.\n• Verschönere jede Seite auf Scratch mit 3.0-Stil, dunklem Modus und benutzerdefinierten Farben.\n• Verlasse Studios mit einem Klick, befördere oder entferne Kuratoren und durchsuche Follower zum Hinzufügen.\n• Verbessere Projektverwaltung mit dem Suchfeld in Meine Sachen und der Unveröffentlichen-Schaltfläche.\n• Verbessere den Projekt-Player mit einer Pause-Schaltfläche, doppelter Geschwindigkeit mit 60FPS und Controller-Unterstützung.\n• Erleichtertes Animieren mit Onion Skinning, genauer Farbenauswahl und Figurensuche.\n• Booste deine Programmiereffizienz mit Blocksuche, durchsuchbaren Drop-Downs, Blockwechsel, einzelnes Verschieben und Kopieren/Einfügen.\n• Bleib ordentlich mit Blockpalette ausblenden und Figurenordner.\n• Setze deine Projektvorschau direkt auf jedes beliebige Bild oder GIF.\n• Hole die Katzenblöcke vom Aprilscherz zurück.\n• Debugge Projekte mit Logging, Leistungsansicht und Schritt-für-Schritt-Ausführung.\n• Und mehr mit jedem Update!","description":"Used in the description for the extension stores"},"extensionStoreDescription3":{"message":"Diese Erweiterung ist open source und unter GPL v3 lizensiert.\nUm Mitzuwirken oder den Quellcode anzusehen: https://github.com/ScratchAddons\nFür mehr Infos, siehe: ScratchAddons.com","description":"Used in the description for the extension stores. Do not translate \"GPL v3\" or the links."},"extensionStoreDescription4":{"message":"Dieses Projekt ist in keiner Weise offiziell mit Scratch oder den Organisationen, die es am Laufen halten, assoziiert.","description":"Used in the description for the extension stores"}} \ No newline at end of file diff --git a/addons-l10n/de/asset-conflict-dialog.json b/addons-l10n/de/asset-conflict-dialog.json new file mode 100644 index 0000000000..cde5be853e --- /dev/null +++ b/addons-l10n/de/asset-conflict-dialog.json @@ -0,0 +1 @@ +{"asset-conflict-dialog/rename":"Umbenennen und importieren","asset-conflict-dialog/replace":"Ersetzen und importieren","asset-conflict-dialog/skip":"Überspringen und nicht importieren","asset-conflict-dialog/applyToAll":"Für alle Konflikte wiederholen","asset-conflict-dialog/dialogText":"Es gibt bereits ein Element namens {fileName}.","asset-conflict-dialog/title":"Elemente umbenennen, ersetzen oder überspringen","asset-conflict-dialog/@name":"Elementkonflikt-Dialog","asset-conflict-dialog/@description":"Beim Hochladen von Kostümen oder Klängen, die denselben Namen eines bereits vorhandenen Elements haben, wird ein Dialog mit Optionen zum Ersetzen oder Überspringen angezeigt, anstatt das betroffene Element immer umzubenennen."} \ No newline at end of file diff --git a/addons-l10n/de/comments-linebreaks.json b/addons-l10n/de/comments-linebreaks.json index 566141e11b..52c26e99bf 100644 --- a/addons-l10n/de/comments-linebreaks.json +++ b/addons-l10n/de/comments-linebreaks.json @@ -1 +1 @@ -{"comments-linebreaks/@name":"Absätze in Kommentaren","comments-linebreaks/@description":"Zeigt Absätze (Entertaste drücken) in Kommentaren, anstatt sie zu Leerzeichen umzuwandeln.","comments-linebreaks/@info-ownLineBreaks":"Zeilenumbrüche sind nur für Nutzer mit diesem Addon sichtbar. Alle anderen werden stattdessen Leerzeichen sehen.","comments-linebreaks/@settings-name-scrollbars":"Scrolleisten für große Kommentare hinzufügen","comments-linebreaks/@settings-name-height":"Maximale gleichzeitig sichtbare Zeilen"} \ No newline at end of file +{"comments-linebreaks/@name":"Absätze in Kommentaren","comments-linebreaks/@description":"Zeigt Absätze (Entertaste drücken) in Kommentaren, anstatt sie zu Leerzeichen umzuwandeln.","comments-linebreaks/@info-ownLineBreaks":"Zeilenumbrüche sind nur für Nutzer mit diesem Addon sichtbar. Alle anderen werden stattdessen Leerzeichen sehen.","comments-linebreaks/@info-scratchr2Linebreaks":"Zeilenumbrüche am Beginn oder Ende von Kommentaren auf Profilseiten werden nicht angezeigt.","comments-linebreaks/@settings-name-scrollbars":"Scrolleisten für große Kommentare hinzufügen","comments-linebreaks/@settings-name-height":"Maximale gleichzeitig sichtbare Zeilen"} \ No newline at end of file diff --git a/addons-l10n/de/copy-reporter.json b/addons-l10n/de/copy-reporter.json index 56c779c372..3a1ba23764 100644 --- a/addons-l10n/de/copy-reporter.json +++ b/addons-l10n/de/copy-reporter.json @@ -1 +1 @@ -{"copy-reporter/copy-to-clipboard":"Kopieren","copy-reporter/copy-value":"Wert kopieren","copy-reporter/@name":"Variablenwerte kopieren","copy-reporter/@description":"Fügt eine Option (zum Rechtsklick-Kontextmenü) zum Kopieren von Werten in Sprechblasen und Anzeigen von Variablenblöcken hinzu."} \ No newline at end of file +{"copy-reporter/copy-to-clipboard":"Kopieren","copy-reporter/copy-value":"Wert kopieren","copy-reporter/@name":"Variablenwerte kopieren","copy-reporter/@description":"Ergänzt eine Option zum Kopieren der Werte in Variablenanzeigen auf der Bühne (im Rechtsklick-Kontextmenü) und in Sprechblasen von Variablenblöcken."} \ No newline at end of file diff --git a/addons-l10n/de/editor-buttons-reverse-order.json b/addons-l10n/de/editor-buttons-reverse-order.json index 59b03e254d..44da858c03 100644 --- a/addons-l10n/de/editor-buttons-reverse-order.json +++ b/addons-l10n/de/editor-buttons-reverse-order.json @@ -1 +1 @@ -{"editor-buttons-reverse-order/@name":"Verkehrte Anordnung von Player-Steuerelementen","editor-buttons-reverse-order/@description":"Verschiebt die grüne Flagge und den Stoppknopf auf die rechte und den Vollbildknopf auf die linke Seite, wie in Scratch 2.0."} \ No newline at end of file +{"editor-buttons-reverse-order/@name":"Verkehrte Anordnung von Player-Steuerelementen","editor-buttons-reverse-order/@description":"Verschiebt die grüne Flagge und das Stoppschild auf die rechte und die Vollbild-Schaltfläche auf die linke Seite, wie in Scratch 2.0."} \ No newline at end of file diff --git a/addons-l10n/de/fullscreen.json b/addons-l10n/de/fullscreen.json index 7bfb446f01..51cfd2b8a8 100644 --- a/addons-l10n/de/fullscreen.json +++ b/addons-l10n/de/fullscreen.json @@ -1 +1 @@ -{"fullscreen/@name":"Verbesserter Vollbildmodus","fullscreen/@description":"Behebt einige unerwünschte Effekte im Vollbildmodus des Projektplayers, öffnet ihn im Vollbildmodus deines Browsers und blendet die Symbolleiste mit der grünen Flagge aus.","fullscreen/@info-hideToolbarNotice":"Wenn du die Symbolleiste nie anzeigst, denke daran, dass du mit der Esc-Taste den Vollbildmodus des Projektplayers weiterhin verlassen kannst.","fullscreen/@settings-name-browserFullscreen":"Projektplayer im Vollbildmodus des Browsers öffnen","fullscreen/@settings-name-toolbar":"Sichtbarkeit der Symbolleiste","fullscreen/@settings-select-toolbar-show":"Immer","fullscreen/@settings-select-toolbar-hover":"Wenn sich der Mauszeiger oben befindet","fullscreen/@settings-select-toolbar-hide":"Nie"} \ No newline at end of file +{"fullscreen/@name":"Verbesserter Vollbildmodus","fullscreen/@description":"Behebt einige unerwünschte Effekte im Vollbildmodus des Projekt-Players, öffnet ihn im Vollbildmodus deines Browsers und blendet die Symbolleiste mit der grünen Flagge aus.","fullscreen/@info-hideToolbarNotice":"Wenn du die Symbolleiste nie anzeigst, denke daran, dass du mit der Esc-Taste den Vollbildmodus des Projekt-Players weiterhin verlassen kannst.","fullscreen/@settings-name-browserFullscreen":"Projekt-Player im Vollbildmodus des Browsers öffnen","fullscreen/@settings-name-toolbar":"Sichtbarkeit der Symbolleiste","fullscreen/@settings-select-toolbar-show":"Immer","fullscreen/@settings-select-toolbar-hover":"Wenn sich der Mauszeiger oben befindet","fullscreen/@settings-select-toolbar-hide":"Nie"} \ No newline at end of file diff --git a/addons-l10n/de/hide-stage.json b/addons-l10n/de/hide-stage.json index a8f527bc1e..5f04bdc2e2 100644 --- a/addons-l10n/de/hide-stage.json +++ b/addons-l10n/de/hide-stage.json @@ -1 +1 @@ -{"hide-stage/hide-stage":"Bühne ausblenden","hide-stage/@name":"Bühne und Figurenleiste ausblenden","hide-stage/@description":"Fügt einen Knopf neben dem \"Kleine Bühne\"-Knopf hinzu, der die Bühne und die Figurenleiste vollständig ausblendet und damit den Codebereich viel größer macht."} \ No newline at end of file +{"hide-stage/hide-stage":"Bühne ausblenden","hide-stage/@name":"Bühne und Figurenleiste ausblenden","hide-stage/@description":"Fügt eine Schaltfläche neben \"Kleine Bühne\" hinzu, die die Bühne und die Figurenleiste vollständig ausblendet und damit den Codebereich viel größer macht."} \ No newline at end of file diff --git a/addons-l10n/de/live-featured-project.json b/addons-l10n/de/live-featured-project.json index 4cbd463f06..25aeda61e1 100644 --- a/addons-l10n/de/live-featured-project.json +++ b/addons-l10n/de/live-featured-project.json @@ -1 +1 @@ -{"live-featured-project/change-featured":"Vorgestelles Projekt ändern","live-featured-project/@name":"Aktives vorgestelltes Projekt","live-featured-project/@description":"Zeigt ein interaktives vorgestelltes Projekt direkt auf der Profilseite des Benutzers. Basiert auf der Implementierung in Mega Scratch Userscript.","live-featured-project/@info-privacy":"Die EInstellung \"Scratch-Benutzernamen verwenden\" wird für die Verwendung von Clouddaten deinen Scratch-Benutzernamen an TurboWarp.org senden. TurboWarp besitzt unterschiedliche Clouddatenserver, deshalb werden die Cloudvariablen nicht denen im Scratch-Player entsprechen.","live-featured-project/@credits-update":"Update","live-featured-project/@settings-name-showMenu":"Zeige Projektemenü (obere Leiste)","live-featured-project/@settings-name-alternativePlayer":"Projektplayer","live-featured-project/@settings-name-autoPlay":"Projekte automatisch starten","live-featured-project/@settings-name-enableTWAddons":"Addons im Player verwenden","live-featured-project/@settings-name-shareUsername":"Scratch-Benutzernamen verwenden"} \ No newline at end of file +{"live-featured-project/change-featured":"Vorgestelles Projekt ändern","live-featured-project/@name":"Aktives vorgestelltes Projekt","live-featured-project/@description":"Zeigt ein interaktives vorgestelltes Projekt direkt auf der Profilseite des Benutzers. Basiert auf der Implementierung in Mega Scratch Userscript.","live-featured-project/@info-privacy":"Die Einstellung \"Scratch-Benutzernamen verwenden\" wird für die Verwendung von Clouddaten deinen Scratch-Benutzernamen an TurboWarp.org senden. TurboWarp besitzt unterschiedliche Clouddatenserver, deshalb werden die Cloudvariablen nicht denen im Scratch-Player entsprechen.","live-featured-project/@credits-update":"Update","live-featured-project/@settings-name-showMenu":"Zeige Projektemenü (obere Leiste)","live-featured-project/@settings-name-alternativePlayer":"Projekt-Player","live-featured-project/@settings-name-autoPlay":"Projekte automatisch starten","live-featured-project/@settings-name-enableTWAddons":"Addons im Player verwenden","live-featured-project/@settings-name-shareUsername":"Scratch-Benutzernamen verwenden"} \ No newline at end of file diff --git a/addons-l10n/de/mute-project.json b/addons-l10n/de/mute-project.json index ef4390435b..5dfa82e81a 100644 --- a/addons-l10n/de/mute-project.json +++ b/addons-l10n/de/mute-project.json @@ -1 +1 @@ -{"mute-project/@name":"Projektplayer stummschalten-Knopf","mute-project/@description":"Strg+Klicke auf die grüne Flagge, um das Projekt stummzuschalten bzw. die Stummschaltung aufzuheben.","mute-project/@info-macOS":"Verwende auf macOS statt der Strg-Taste die Cmd-Taste."} \ No newline at end of file +{"mute-project/@name":"\"Projekt-Player stummschalten\"-Schaltfläche","mute-project/@description":"Strg+Klicke auf die grüne Flagge, um das Projekt stummzuschalten bzw. die Stummschaltung aufzuheben.","mute-project/@info-macOS":"Verwende auf macOS statt der Strg-Taste die Cmd-Taste."} \ No newline at end of file diff --git a/addons-l10n/de/necropost-highlighter.json b/addons-l10n/de/necropost-highlighter.json index f1d8767c12..ec0604b0a7 100644 --- a/addons-l10n/de/necropost-highlighter.json +++ b/addons-l10n/de/necropost-highlighter.json @@ -1 +1 @@ -{"necropost-highlighter/@name":"Necropost-Markierung","necropost-highlighter/@description":"Markiert Themen, die viel früher als andere Themen auf derselben Forumseite gestartet wurden, damit du keine Zeit damit verlierst, Zombie-Nachrichten durchzulesen, um Fragen durchzulesen, die vor langer Zeit gestellt wurden.","necropost-highlighter/@info-whatGetsHighlighted":"Manchmal ist eine alte Diskussion aus einem guten Grund aktiv gehalten, wie bei einem fortlaufenden Gespräch. Alle älteren Themen in ausgewählten Foren werden markiert, was auch Themen betreffen könnte, die keine Necroposts sind. (Deshalb werden sie markiert und nicht entfernt.)","necropost-highlighter/@settings-name-monthCountConsideredOld":"Wie viele Monate sind \"alt\"?","necropost-highlighter/@settings-name-colorTopicCells":"Themenzellen einfärben?","necropost-highlighter/@settings-name-chooseCustomForums":"Benutzerdefinierte Foren auswählen","necropost-highlighter/@settings-name-applyToNewScratchers":"Neue Scratcher (normalerweise genau)","necropost-highlighter/@settings-name-applyToHelpWithScripts":"Hilfe mit Skripten (normalerweise genau)","necropost-highlighter/@settings-name-applyToQuestionsAboutScratch":"Fragen über Scratch (normalerweise genau)","necropost-highlighter/@settings-name-applyToBugsAndGlitches":"Fehler (normalerweise genau)","necropost-highlighter/@settings-name-applyToProjectIdeas":"Projektideen (großteils genau)","necropost-highlighter/@settings-name-applyToRequests":"Anfragen (eher ungenau)","necropost-highlighter/@settings-name-applyToSuggestions":"Vorschläge (eher ungenau)","necropost-highlighter/@settings-name-applyToOpenSourceProjects":"Open-source-Projekte (eher ungenau)"} \ No newline at end of file +{"necropost-highlighter/necropost":"(Inaktiv?)","necropost-highlighter/@name":"Inaktivitäts-Markierung","necropost-highlighter/@description":"Markiert Themen, die viel früher als andere Themen auf derselben Forumseite gestartet wurden, damit du keine Zeit damit verlierst, Zombie-Nachrichten durchzulesen, die vor langer Zeit gestellt wurden.","necropost-highlighter/@info-whatGetsHighlighted":"Manchmal ist eine alte Diskussion aus einem guten Grund aktiv gehalten, wie bei einem fortlaufenden Gespräch. Alle älteren Themen in ausgewählten Foren werden markiert, was auch Themen betreffen könnte, die eigentlich nicht inaktiv sind. (Deshalb werden sie markiert und nicht entfernt.)","necropost-highlighter/@settings-name-monthCountConsideredOld":"Wie viele Monate sind \"alt\"?","necropost-highlighter/@settings-name-colorTopicCells":"Themenzellen einfärben","necropost-highlighter/@settings-name-chooseCustomForums":"Benutzerdefinierte Foren auswählen","necropost-highlighter/@settings-name-applyToNewScratchers":"Neue Scratcher (normalerweise genau)","necropost-highlighter/@settings-name-applyToHelpWithScripts":"Hilfe mit Skripten (normalerweise genau)","necropost-highlighter/@settings-name-applyToQuestionsAboutScratch":"Fragen über Scratch (normalerweise genau)","necropost-highlighter/@settings-name-applyToBugsAndGlitches":"Fehler (normalerweise genau)","necropost-highlighter/@settings-name-applyToProjectIdeas":"Projektideen (großteils genau)","necropost-highlighter/@settings-name-applyToRequests":"Anfragen (eher ungenau)","necropost-highlighter/@settings-name-applyToSuggestions":"Vorschläge (eher ungenau)","necropost-highlighter/@settings-name-applyToOpenSourceProjects":"Open-source-Projekte (eher ungenau)"} \ No newline at end of file diff --git a/addons-l10n/de/turbowarp-player.json b/addons-l10n/de/turbowarp-player.json index bdc950ee89..c782608863 100644 --- a/addons-l10n/de/turbowarp-player.json +++ b/addons-l10n/de/turbowarp-player.json @@ -1 +1 @@ -{"turbowarp-player/confirmation":"Willst du hinein schauen? Der TurboWarp player wird dabei entfernt.","turbowarp-player/@name":"TurboWarp-Modus","turbowarp-player/@description":"Fügt eine Schaltfläche neben der Remixen-Schaltfläche auf Projektseiten hinzu, um Projekte in TurboWarp auszuführen.","turbowarp-player/@info-addonsWontWork":"Der \"Player ersetzen\"-Modus ändert den Scratch-Player zu einem TurboWarp-Embed, was das Hineinschauen in Projekten nicht unterstützt.","turbowarp-player/@info-cloudData":"Der Modus \"Player ersetzen\" wird deinen Scratch-Benutzernamen an TurboWarp.org für die Verwendung in Clouddaten senden. TurboWarp besitzt eigene Clouddaten-Server, Werte von Cloudvariablen werden also nicht dieselben wie die auf dem Scratch-Player sein.","turbowarp-player/@info-ctrlToOpen":"Wenn der Modus \"Player ersetzen\" aktiviert ist, kannst du weiterhin mit gedrückter Strg-Taste (auf macOS Cmd-Taste) auf die Schaltfläche klicken, um das Projekt in einem neuen TurboWarp-Tab zu öffnen.","turbowarp-player/@settings-name-action":"Beim Klicken auf die Schaltfläche","turbowarp-player/@settings-select-action-link":"Öffne neuen Tab","turbowarp-player/@settings-select-action-player":"Player ersetzen","turbowarp-player/@settings-name-addons":"Addons aktivieren"} \ No newline at end of file +{"turbowarp-player/confirmation":"Willst du hineinschauen? Der TurboWarp-Player wird dabei entfernt.","turbowarp-player/@name":"TurboWarp-Modus","turbowarp-player/@description":"Fügt eine Schaltfläche neben der Remixen-Schaltfläche auf Projektseiten hinzu, um Projekte in TurboWarp auszuführen.","turbowarp-player/@info-addonsWontWork":"Der \"Player ersetzen\"-Modus ändert den Scratch-Player in eine TurboWarp-Einbettung, die \"Schau hinein\" nicht unterstützt.","turbowarp-player/@info-cloudData":"Der Modus \"Player ersetzen\" wird deinen Scratch-Benutzernamen an TurboWarp.org für die Verwendung in Clouddaten senden. TurboWarp besitzt eigene Clouddaten-Server, Werte von Cloudvariablen werden also nicht dieselben wie die auf dem Scratch-Player sein.","turbowarp-player/@info-ctrlToOpen":"Wenn der Modus \"Player ersetzen\" aktiviert ist, kannst du weiterhin mit gedrückter Strg-Taste (auf macOS Cmd-Taste) auf die Schaltfläche klicken, um das Projekt in einem neuen TurboWarp-Tab zu öffnen.","turbowarp-player/@settings-name-action":"Beim Klicken auf die Schaltfläche","turbowarp-player/@settings-select-action-link":"Öffne neuen Tab","turbowarp-player/@settings-select-action-player":"Player ersetzen","turbowarp-player/@settings-name-addons":"Addons aktivieren"} \ No newline at end of file diff --git a/addons-l10n/de/youtube-fullscreen.json b/addons-l10n/de/youtube-fullscreen.json index ae1ce760e0..9c7f1184f3 100644 --- a/addons-l10n/de/youtube-fullscreen.json +++ b/addons-l10n/de/youtube-fullscreen.json @@ -1 +1 @@ -{"youtube-fullscreen/@name":"YouTube-Vollbild","youtube-fullscreen/@description":"Aktiviert die Schaltfläche \"Vollbild\" im YouTube-Videoplayer von Scratch."} \ No newline at end of file +{"youtube-fullscreen/@name":"YouTube-Vollbild","youtube-fullscreen/@description":"Aktiviert die Schaltfläche \"Vollbild\" im YouTube-Video-Player von Scratch."} \ No newline at end of file diff --git a/addons-l10n/nl/asset-conflict-dialog.json b/addons-l10n/nl/asset-conflict-dialog.json new file mode 100644 index 0000000000..833e3a95ab --- /dev/null +++ b/addons-l10n/nl/asset-conflict-dialog.json @@ -0,0 +1 @@ +{"asset-conflict-dialog/rename":"Importeren en naam wijzigen","asset-conflict-dialog/replace":"Importeren en vervangen","asset-conflict-dialog/skip":"Overslaan en niet importeren","asset-conflict-dialog/applyToAll":"Dit toepassen op alle conflicten","asset-conflict-dialog/dialogText":"Een onderdeel genaamd {fileName} bestaat al.","asset-conflict-dialog/title":"Onderdelen hernoemen, vervangen of overslaan","asset-conflict-dialog/@name":"Conflicten met onderdelen beheren","asset-conflict-dialog/@description":"Toont opties bij het uploaden van uiterlijken of geluiden om ze te vervangen of over te slaan als er al onderdelen bestaan met dezelfde naam, in plaats van altijd de naam te wijzigen."} \ No newline at end of file diff --git a/addons-l10n/nl/comments-linebreaks.json b/addons-l10n/nl/comments-linebreaks.json index 849061fd15..0dddabb9d2 100644 --- a/addons-l10n/nl/comments-linebreaks.json +++ b/addons-l10n/nl/comments-linebreaks.json @@ -1 +1 @@ -{"comments-linebreaks/@name":"Regeleinden in opmerkingen","comments-linebreaks/@description":"Maakt regeleinden (op Enter drukken) in opmerkingen op de website zichtbaar in plaats van ze te vervangen met spaties.","comments-linebreaks/@info-ownLineBreaks":"Regeleinden zijn alleen zichtbaar voor gebruikers die deze addon ingeschakeld hebben. Anderen zullen spaties zien.","comments-linebreaks/@settings-name-scrollbars":"Scrollbalken toevoegen aan grote opmerkingen","comments-linebreaks/@settings-name-height":"Maximaal aantal tegelijk zichtbare regels"} \ No newline at end of file +{"comments-linebreaks/@name":"Regeleinden in opmerkingen","comments-linebreaks/@description":"Maakt regeleinden (op Enter drukken) in opmerkingen op de website zichtbaar in plaats van ze te vervangen met spaties.","comments-linebreaks/@info-ownLineBreaks":"Regeleinden zijn alleen zichtbaar voor gebruikers die deze addon ingeschakeld hebben. Anderen zullen spaties zien.","comments-linebreaks/@info-scratchr2Linebreaks":"Regeleinden aan het begin of eind van opmerkingen op profielpagina's worden niet weergegeven.","comments-linebreaks/@settings-name-scrollbars":"Scrollbalken toevoegen aan grote opmerkingen","comments-linebreaks/@settings-name-height":"Maximaal aantal tegelijk zichtbare regels"} \ No newline at end of file diff --git a/addons-l10n/ru/debugger.json b/addons-l10n/ru/debugger.json index e1c1f43420..c7c66bd1e8 100644 --- a/addons-l10n/ru/debugger.json +++ b/addons-l10n/ru/debugger.json @@ -1 +1 @@ -{"debugger/console":"Логи","debugger/debug":"Отладка","debugger/export":"Экспорт","debugger/clear":"Очистить","debugger/close":"Закрыть","debugger/step":"Шаг","debugger/thread":"Поток {id}","debugger/enter-format":"Введите формат экспорта:","debugger/unpause":"Продолжить","debugger/unknown-sprite":"(неизвестный спрайт)","debugger/clone-of":"Клон {sprite}","debugger/icon-warn":"Предупреждение","debugger/icon-error":"Ошибка","debugger/empty-string":"(пустая строка)","debugger/export-desc":"Щелкните, удерживая Shift, чтобы настроить формат экспорта.","debugger/block-breakpoint":"приостановить","debugger/block-log":"логировать %s","debugger/block-warn":"предупредить %s","debugger/block-error":"ошибка %s","debugger/cannot-pause-player":"Блок точки остановки может быть использовать только в редакторе.","debugger/step-desc":"Выполнить один блок.","debugger/tab-logs":"Логи","debugger/tab-threads":"Потоки","debugger/tab-performance":"Производительность","debugger/no-logs":"Нет логов для показа.","debugger/no-threads-running":"Потоки не выполняются.","debugger/performance-framerate-title":"Кадровая частота","debugger/performance-framerate-graph-tooltip":"Кадровая частота: {fps}","debugger/performance-clonecount-title":"Клоны","debugger/performance-clonecount-graph-tooltip":"Клоны: {clones}","debugger/log-msg-flag-clicked":"Зелёный флаг нажат.","debugger/log-msg-clone-cap":"Не удалось создать клон '{sprite}', невозможно создать более 300 клонов.","debugger/log-msg-clone-created":"Создан клон '{sprite}'.","debugger/log-msg-broadcasted":"Передали «{broadcast}».","debugger/log-msg-list-append-too-long":"Не удалось добавить в список '{list}', списки не могут содержать более 200 000 элементов.","debugger/log-msg-list-insert-too-long":"Элемент 200 000 удален из списка '{list}', чтобы освободить место для вставки. Списки не могут содержать более 200 000 элементов.","debugger/log-cloud-data-nan":"Не удалось изменить облачную переменную '{var}'. Облачные переменные могут содержать только числа.","debugger/log-cloud-data-too-long":"Не удалось изменить облачную переменную '{var}'. Облачные переменные могут содержать не более 256 цифр.","debugger/@name":"Отладчик","debugger/@settings-name-log_clear_greenflag":"Очистить логи, когда зелёный флаг нажат","debugger/@settings-name-log_greenflag":"Логировать нажатия на зелёный флажок","debugger/@settings-name-log_clone_create":"Логировать создания клонов","debugger/@settings-name-log_broadcasts":"Логировать сообщения","debugger/@settings-name-log_max_list_length":"Логировать, когда макс. кол-во списка превышено","debugger/@settings-name-log_invalid_cloud_data":"Логировать недействительные значения облачных переменных"} \ No newline at end of file +{"debugger/console":"Логи","debugger/debug":"Отладка","debugger/export":"Экспорт","debugger/clear":"Очистить","debugger/close":"Закрыть","debugger/step":"Шаг","debugger/thread":"Поток {id}","debugger/enter-format":"Введите формат экспорта:","debugger/unpause":"Продолжить","debugger/unknown-sprite":"(неизвестный спрайт)","debugger/clone-of":"Клон {sprite}","debugger/icon-warn":"Предупреждение","debugger/icon-error":"Ошибка","debugger/empty-string":"(пустая строка)","debugger/export-desc":"Щелкните, удерживая Shift, чтобы настроить формат экспорта.","debugger/block-breakpoint":"приостановить","debugger/block-log":"логировать %s","debugger/block-warn":"предупредить %s","debugger/block-error":"ошибка %s","debugger/cannot-pause-player":"Блок точки остановки может быть использовать только в редакторе.","debugger/step-desc":"Выполнить один блок.","debugger/tab-logs":"Логи","debugger/tab-threads":"Потоки","debugger/tab-performance":"Производительность","debugger/no-logs":"Нет логов для показа.","debugger/no-threads-running":"Потоки не выполняются.","debugger/performance-framerate-title":"Кадровая частота","debugger/performance-framerate-graph-tooltip":"Кадровая частота: {fps}","debugger/performance-clonecount-title":"Клоны","debugger/performance-clonecount-graph-tooltip":"Клоны: {clones}","debugger/log-msg-flag-clicked":"Зелёный флаг нажат.","debugger/log-msg-clone-cap":"Не удалось создать клон '{sprite}', невозможно создать более 300 клонов.","debugger/log-msg-clone-created":"Создан клон '{sprite}'.","debugger/log-msg-broadcasted":"Передали «{broadcast}».","debugger/log-msg-list-append-too-long":"Не удалось добавить в список '{list}', списки не могут содержать более 200 000 элементов.","debugger/log-msg-list-insert-too-long":"Элемент 200 000 удален из списка '{list}', чтобы освободить место для вставки. Списки не могут содержать более 200 000 элементов.","debugger/log-cloud-data-nan":"Не удалось изменить облачную переменную '{var}'. Облачные переменные могут содержать только числа.","debugger/log-cloud-data-too-long":"Не удалось изменить облачную переменную '{var}'. Облачные переменные могут содержать не более 256 цифр.","debugger/@name":"Отладчик","debugger/@description":"Добавляет новое окно отладчика к редактору. Отладчик позволяет логировать во вкладку «Логи», используя блоки «логировать», «предупредить» и «ошибка». Блок «точки остановки» поставит проект на паузу при выполнении. Все выполняемые потоки могут быть просмотрены в вкладке «Потоки». При остановке проекта кнопка «Шаг вперёд» может быть использована для выполнения следующего блока. График FPS и кол-во клонов могут быть просмотрены в вкладке «Производительность».","debugger/@settings-name-log_clear_greenflag":"Очистить логи, когда зелёный флаг нажат","debugger/@settings-name-log_greenflag":"Логировать нажатия на зелёный флажок","debugger/@settings-name-log_clone_create":"Логировать создания клонов","debugger/@settings-name-log_broadcasts":"Логировать сообщения","debugger/@settings-name-log_max_list_length":"Логировать, когда макс. кол-во списка превышено","debugger/@settings-name-log_invalid_cloud_data":"Логировать недействительные значения облачных переменных"} \ No newline at end of file diff --git a/addons-l10n/ru/disable-stage-drag-select.json b/addons-l10n/ru/disable-stage-drag-select.json index 3218b39649..323cb3f9e7 100644 --- a/addons-l10n/ru/disable-stage-drag-select.json +++ b/addons-l10n/ru/disable-stage-drag-select.json @@ -1 +1 @@ -{"disable-stage-drag-select/@name":"Неперетаскиваемые спрайты в редакторе","disable-stage-drag-select/@description":"Удаляет возможность перетаскивать спрайты по сцене в редакторе, за исключением тех, которые установлены как перетаскиваемые. Удерживайте Shift при перетаскивании спрайта, чтобы переместить его в обычном режиме."} \ No newline at end of file +{"disable-stage-drag-select/@name":"Неперетаскиваемые спрайты в редакторе","disable-stage-drag-select/@description":"Удаляет возможность перетаскивать спрайты по сцене в редакторе, за исключением тех, которые установлены как перетаскиваемые. Удерживайте Shift при перетаскивании спрайта, чтобы переместить его в обычном режиме.","disable-stage-drag-select/@settings-name-drag_while_stopped":"Разрешить перетаскивание спрайтов, когда проект остановлен"} \ No newline at end of file diff --git a/addons-l10n/ru/mediarecorder.json b/addons-l10n/ru/mediarecorder.json index b941be83bc..88feffe5e4 100644 --- a/addons-l10n/ru/mediarecorder.json +++ b/addons-l10n/ru/mediarecorder.json @@ -1 +1 @@ -{"mediarecorder/record":"Запись","mediarecorder/stop":"Остановить запись","mediarecorder/option-title":"Настройки записи","mediarecorder/record-duration":"Продолжительность записи (в секундах)","mediarecorder/start-delay":"Задержка старта (в секундах)","mediarecorder/starting-in":"Старт через {secs}...","mediarecorder/record-audio":"Включить звуки проекта","mediarecorder/record-mic":"Включить звуки из микрофона","mediarecorder/record-audio-description":"Это не включает Text-to-Speech.","mediarecorder/record-after-flag":"Не начинать запись, пока не нажат зеленый флаг","mediarecorder/record-until-stop":"Остановить запись после остановки проекта","mediarecorder/start":"Начать","mediarecorder/cancel":"Отмена","mediarecorder/added-by":"Добавлено расширением для браузера Scratch Addons.","mediarecorder/click-flag":"Ожидание...","mediarecorder/click-flag-description":"Нажмите зеленый флаг, чтобы начать запись. Нажмите эту кнопку, чтобы остановить.","mediarecorder/record-until-stop-disabled":"Вы должны включить \"{afterFlagOption}\", чтобы использовать эту настройку.","mediarecorder/@name":"Запись проекта на видео","mediarecorder/@description":"Добавляет кнопку \"начать запись\" в меню редактора, которая позволяет записывать сцену проекта."} \ No newline at end of file +{"mediarecorder/record":"Запись","mediarecorder/stop":"Остановить запись","mediarecorder/option-title":"Настройки записи","mediarecorder/record-duration":"Продолжительность записи (в секундах)","mediarecorder/start-delay":"Задержка старта (в секундах)","mediarecorder/starting-in":"Старт через {secs}...","mediarecorder/record-audio":"Включить звуки проекта","mediarecorder/record-mic":"Включить звуки из микрофона","mediarecorder/record-audio-description":"Это не включает Text-to-Speech.","mediarecorder/record-after-flag":"Не начинать запись, пока не нажат зеленый флаг","mediarecorder/record-until-stop":"Остановить запись после остановки проекта","mediarecorder/record-description":"Записать проект в файл типа {extension}. Его можно скачать на ваш ПК после завершения записи.\n(Примечание: переменные и списки не будут видны на записи.)","mediarecorder/start":"Начать","mediarecorder/cancel":"Отмена","mediarecorder/added-by":"Добавлено расширением для браузера Scratch Addons.","mediarecorder/click-flag":"Ожидание...","mediarecorder/click-flag-description":"Нажмите зеленый флаг, чтобы начать запись. Нажмите эту кнопку, чтобы остановить.","mediarecorder/record-until-stop-disabled":"Вы должны включить \"{afterFlagOption}\", чтобы использовать эту настройку.","mediarecorder/@name":"Запись проекта на видео","mediarecorder/@description":"Добавляет кнопку \"начать запись\" в меню редактора, которая позволяет записывать сцену проекта."} \ No newline at end of file diff --git a/addons-l10n/ru/name-backpack-items.json b/addons-l10n/ru/name-backpack-items.json index 2ad9221364..b99395afcc 100644 --- a/addons-l10n/ru/name-backpack-items.json +++ b/addons-l10n/ru/name-backpack-items.json @@ -1 +1 @@ -{"name-backpack-items/prompt":"Назовите этот скрипт:","name-backpack-items/@name":"Называть скрипты перед тем, как положить в рюкзак","name-backpack-items/@description":"Спрашивает Вас называть скрипты после того, как Вы их перемещаете в рюкзак вместо названия по умолчанию «code»."} \ No newline at end of file +{"name-backpack-items/title":"Добавить в Рюкзак","name-backpack-items/prompt":"Назовите этот скрипт:","name-backpack-items/@name":"Называть скрипты перед тем, как положить в рюкзак","name-backpack-items/@description":"Спрашивает Вас называть скрипты после того, как Вы их перемещаете в рюкзак вместо названия по умолчанию «code»."} \ No newline at end of file diff --git a/addons-l10n/ru/turbowarp-player.json b/addons-l10n/ru/turbowarp-player.json index 9668c0829a..b0950fd357 100644 --- a/addons-l10n/ru/turbowarp-player.json +++ b/addons-l10n/ru/turbowarp-player.json @@ -1 +1 @@ -{"turbowarp-player/confirmation":"Вы уверены, что хотите войти внутрь проекта? Проигрыватель TurboWarp будет удалён.","turbowarp-player/@name":"Кнопка TurboWarp","turbowarp-player/@description":"Добавляет кнопку на страницах проектов после кнопки Ремикс, открывающую проект в TurboWarp.org.","turbowarp-player/@info-addonsWontWork":"Режим \"Заменить проигрыватель\" изменяет проигрыватель Scratch на TurboWarp, который не поддерживает просмотр проектов внутри.","turbowarp-player/@info-cloudData":"Режим \"Заменить проигрыватель\" отправит Ваше имя Scratch в TurboWarp.org для использования в облаке. TurboWarp имеет отдельные облачные серверы, поэтому облачные переменные будут различны от переменных на проигрывателе Scratch.","turbowarp-player/@settings-name-action":"Действие кнопки","turbowarp-player/@settings-select-action-link":"Открыть в новой вкладке","turbowarp-player/@settings-select-action-player":"Заменить проигрыватель","turbowarp-player/@settings-name-addons":"Включить аддоны"} \ No newline at end of file +{"turbowarp-player/confirmation":"Вы уверены, что хотите войти внутрь проекта? Проигрыватель TurboWarp будет удалён.","turbowarp-player/@name":"Кнопка TurboWarp","turbowarp-player/@description":"Добавляет кнопку на страницах проектов после кнопки Ремикс, открывающую проект в TurboWarp.org.","turbowarp-player/@info-addonsWontWork":"Режим \"Заменить проигрыватель\" изменяет проигрыватель Scratch на TurboWarp, который не поддерживает просмотр проектов внутри.","turbowarp-player/@info-cloudData":"Режим \"Заменить проигрыватель\" отправит Ваше имя Scratch в TurboWarp.org для использования в облаке. TurboWarp имеет отдельные облачные серверы, поэтому облачные переменные будут различны от переменных на проигрывателе Scratch.","turbowarp-player/@info-ctrlToOpen":"Если выбран режим «Заменить плеер», вы можете, удерживая Ctrl (Cmd на macOS), нажать на кнопку, чтобы открыть проект в новой вкладке TurboWarp.","turbowarp-player/@settings-name-action":"Действие кнопки","turbowarp-player/@settings-select-action-link":"Открыть в новой вкладке","turbowarp-player/@settings-select-action-player":"Заменить проигрыватель","turbowarp-player/@settings-name-addons":"Включить аддоны"} \ No newline at end of file diff --git a/addons-l10n/sl/60fps.json b/addons-l10n/sl/60fps.json index fe22149195..d5d73c2e2d 100644 --- a/addons-l10n/sl/60fps.json +++ b/addons-l10n/sl/60fps.json @@ -1 +1 @@ -{"60fps/@settings-name-framerate":"FPS po meri"} \ No newline at end of file +{"60fps/@name":"Način hitrejšega osveževanja v predvajalniku projektov","60fps/@description":"Omogoči izvajanje projektov z večjim številom sličic na sekundo (FPS), da je gibanje videti bolj enakomerno. Držite Alt in kliknite zeleno zastavico, da preklopite med Scratchevimi 30 FPS in prilagojeno hitrostjo osveževanja, ki jo lahko nastavite spodaj.","60fps/@info-projectRunsFasterNotice":"Sprememba hitrosti osveževanja Scratchevih projektov vpliva tudi na hitrost izvajanja nekaterih delov kode (na primer zank), zato večina projektov pri drugačni hitrosti ne bo delovala pravilno. Način hitrejšega osveževanja uporabljajte samo v projektih, ki ga podpirajo.","60fps/@info-powerSaver":"Če je vaš brskalnik v načinu varčevanja z energijo (npr. če je baterija skoraj prazna), lahko omeji hitrost osveževanja, zato ta dodatek morda ne bo izboljšal videza animacij.","60fps/@settings-name-framerate":"FPS po meri"} \ No newline at end of file diff --git a/addons-l10n/sl/editor-dark-mode.json b/addons-l10n/sl/editor-dark-mode.json index 7ae8390c74..ce35970a05 100644 --- a/addons-l10n/sl/editor-dark-mode.json +++ b/addons-l10n/sl/editor-dark-mode.json @@ -1 +1 @@ -{"editor-dark-mode/@name":"Temni način in prilagoditev barv v urejevalniku","editor-dark-mode/@description":"Prilagodite barve, uporabljene v urejevalniku projektov. Na voljo je več temnih načinov različnih avtorjev. Če ne potrebujete temnega načina, a bi radi spremenili barve, izberite prednastavitev \"Scratcheve barve\" in spremenite ustrezne nastavitve.","editor-dark-mode/@update":"Prednastavitve za ta dodatek smo posodobili s Scratchevo novo vijolično barvo poudarkov. Še vedno so na voljo tudi prednastavitve z modro barvo.","editor-dark-mode/@preset-description-3darker":"Temna tema, narejena na podlagi uporabniške skripte avtorja infinitytec","editor-dark-mode/@preset-name-3darker-blue":"3.Darker (modra)","editor-dark-mode/@preset-description-3darker-blue":"3.Darker z modro barvo poudarkov","editor-dark-mode/@preset-description-3dark":"Temno modra tema, narejena na podlagi uporabniške skripte avtorja infinitytec","editor-dark-mode/@preset-description-darkEditor":"Temna tema, narejena na podlagi uporabniškega sloga avtorja _nix","editor-dark-mode/@preset-description-experimentalDark":"Temna tema avtorja Maximouse, narejena na podlagi uporabniškega sloga. Ni eksperimentalna","editor-dark-mode/@preset-name-tw-dark":"Temni način TurboWarp","editor-dark-mode/@preset-description-tw-dark":"Temna tema, narejena na podlagi temnega načina v TurboWarp.","editor-dark-mode/@preset-description-scratch2":"Tema, narejena na podlagi barv v Scratchu 2.0.","editor-dark-mode/@preset-description-scratch1":"Tema, narejena na podlagi barv v Scratchu 1.x.","editor-dark-mode/@preset-name-scratch":"Scratcheve barve","editor-dark-mode/@preset-description-scratch":"Barve, ki jih Scratch običajno uporablja","editor-dark-mode/@preset-name-scratch-blue":"Scratcheve barve (modra)","editor-dark-mode/@preset-description-scratch-blue":"Barve, ki so bile prvotno uporabljene v Scratchu 3.0","editor-dark-mode/@credits-addon":"dodatek, \"Experimental\" Dark","editor-dark-mode/@credits-twdark":"temni način TurboWarp","editor-dark-mode/@settings-name-page":"Ozadje strani","editor-dark-mode/@settings-name-primary":"Barva poudarkov","editor-dark-mode/@settings-name-highlightText":"Barva poudarjenega besedila in ikon","editor-dark-mode/@settings-name-menuBar":"Ozadje menijske vrstice","editor-dark-mode/@settings-name-popup":"Barva ozadja pogovornih oken","editor-dark-mode/@settings-name-activeTab":"Ozadje izbranega zavihka","editor-dark-mode/@settings-name-tab":"Ozadje drugih zavihkov","editor-dark-mode/@settings-name-selector":"Ozadje seznama figur","editor-dark-mode/@settings-name-selector2":"Ozadje seznama videzov/zvokov","editor-dark-mode/@settings-name-selectorSelection":"Ozadje izbrane figure/videza/zvoka","editor-dark-mode/@settings-name-accent":"Poudarjeno ozadje","editor-dark-mode/@settings-name-input":"Ozadje vnosnih polj","editor-dark-mode/@settings-name-workspace":"Ozadje prostora za kodo","editor-dark-mode/@settings-name-categoryMenu":"Ozadje seznama kategorij blokov","editor-dark-mode/@settings-name-palette":"Ozadje palete blokov","editor-dark-mode/@settings-name-fullscreen":"Ozadje celozaslonskega načina","editor-dark-mode/@settings-name-stageHeader":"Ozadje glave celozaslonskega načina","editor-dark-mode/@settings-name-border":"Barva okvirjev","editor-dark-mode/@settings-name-dots":"Pokaži pike na ozadju prostora za kodo","editor-dark-mode/@settings-name-affectPaper":"Spremeni ozadje urejevalnika videzov","editor-dark-mode/@settings-name-affectStage":"Spremeni barve spremenljivk, seznamov, oblačkov in polj za vnos odgovora na odru"} \ No newline at end of file +{"editor-dark-mode/@name":"Temni način in prilagoditev barv v urejevalniku","editor-dark-mode/@description":"Prilagodite barve, uporabljene v urejevalniku projektov. Na voljo je več temnih načinov različnih avtorjev. Če ne potrebujete temnega načina, a bi radi spremenili barve, izberite prednastavitev \"Scratcheve barve\" in spremenite ustrezne nastavitve.","editor-dark-mode/@update":"Prednastavitve za ta dodatek smo posodobili s Scratchevo novo vijolično barvo poudarkov. Še vedno so na voljo tudi prednastavitve z modro barvo.","editor-dark-mode/@preset-description-3darker":"Temna tema, narejena na podlagi uporabniške skripte avtorja infinitytec","editor-dark-mode/@preset-name-3darker-blue":"3.Darker (modra)","editor-dark-mode/@preset-description-3darker-blue":"3.Darker z modro barvo poudarkov","editor-dark-mode/@preset-description-3dark":"Temno modra tema, narejena na podlagi uporabniške skripte avtorja infinitytec","editor-dark-mode/@preset-description-darkEditor":"Temna tema, narejena na podlagi uporabniškega sloga avtorja _nix","editor-dark-mode/@preset-description-experimentalDark":"Temna tema avtorja Maximouse, narejena na podlagi uporabniškega sloga. Ni eksperimentalna","editor-dark-mode/@preset-name-tw-dark":"Temni način TurboWarp","editor-dark-mode/@preset-description-tw-dark":"Temna tema, narejena na podlagi temnega načina v TurboWarp.","editor-dark-mode/@preset-description-scratch2":"Tema, narejena na podlagi barv v Scratchu 2.0.","editor-dark-mode/@preset-description-scratch1":"Tema, narejena na podlagi barv v Scratchu 1.x.","editor-dark-mode/@preset-name-scratch":"Scratcheve barve","editor-dark-mode/@preset-description-scratch":"Barve, ki jih Scratch običajno uporablja","editor-dark-mode/@preset-name-scratch-blue":"Scratcheve barve (modra)","editor-dark-mode/@preset-description-scratch-blue":"Barve, ki so bile prvotno uporabljene v Scratchu 3.0","editor-dark-mode/@credits-addon":"dodatek, \"Experimental\" Dark","editor-dark-mode/@credits-twdark":"temni način TurboWarp","editor-dark-mode/@settings-name-page":"Ozadje strani","editor-dark-mode/@settings-name-primary":"Barva poudarkov","editor-dark-mode/@settings-name-highlightText":"Barva poudarjenega besedila in ikon","editor-dark-mode/@settings-name-menuBar":"Ozadje menijske vrstice","editor-dark-mode/@settings-name-popup":"Barva ozadja za pogovornimi okni","editor-dark-mode/@settings-name-activeTab":"Ozadje izbranega zavihka","editor-dark-mode/@settings-name-tab":"Ozadje drugih zavihkov","editor-dark-mode/@settings-name-selector":"Ozadje seznama figur","editor-dark-mode/@settings-name-selector2":"Ozadje seznama videzov/zvokov","editor-dark-mode/@settings-name-selectorSelection":"Ozadje izbrane figure/videza/zvoka","editor-dark-mode/@settings-name-accent":"Poudarjeno ozadje","editor-dark-mode/@settings-name-input":"Ozadje vnosnih polj","editor-dark-mode/@settings-name-workspace":"Ozadje prostora za kodo","editor-dark-mode/@settings-name-categoryMenu":"Ozadje seznama kategorij blokov","editor-dark-mode/@settings-name-palette":"Ozadje palete blokov","editor-dark-mode/@settings-name-fullscreen":"Ozadje strani v celozaslonskem načinu","editor-dark-mode/@settings-name-stageHeader":"Ozadje glave v celozaslonskem načinu","editor-dark-mode/@settings-name-border":"Barva okvirjev","editor-dark-mode/@settings-name-dots":"Pokaži pike na ozadju prostora za kodo","editor-dark-mode/@settings-name-affectPaper":"Spremeni ozadje urejevalnika videzov","editor-dark-mode/@settings-name-affectStage":"Spremeni barve spremenljivk, seznamov, oblačkov za govor in polj za vnos odgovora na odru"} \ No newline at end of file diff --git a/addons-l10n/sl/hide-backpack.json b/addons-l10n/sl/hide-backpack.json new file mode 100644 index 0000000000..4b533cdb08 --- /dev/null +++ b/addons-l10n/sl/hide-backpack.json @@ -0,0 +1 @@ +{"hide-backpack/@name":"Zamenjaj vrstico Shramba z gumbom","hide-backpack/@description":"Zamenja vrstico Shramba delčkov kode na dnu urejevalnika z gumbom zraven nastavitev povečave."} \ No newline at end of file diff --git a/addons-l10n/sl/middle-click-popup.json b/addons-l10n/sl/middle-click-popup.json index 6879eeaad3..212f18877d 100644 --- a/addons-l10n/sl/middle-click-popup.json +++ b/addons-l10n/sl/middle-click-popup.json @@ -1 +1 @@ -{"middle-click-popup/start-typing":"Začnite tipkati...","middle-click-popup/@name":"Iskanje blokov","middle-click-popup/@description":"Kliknite območje s kodo s srednjim miškinim gumbom ali med držanjem tipke Shift ali pritisnite Ctrl+presledek, da odprete okno za iskanje blokov. Vnesite imena (ali dele imen) blokov in bloke povlecite v območje s kodo, da jih dodate v svoj projekt. Po seznamu se lahko premikate s puščicami in tipko Enter. Omogoča tudi samodejno dopolnjevanje s Tab. Med vlečenjem blokov lahko držite Shift, da seznam ostane odprt.","middle-click-popup/@info-developer-tools":"Ta funkcija je bila prej del dodatka \"orodje za razvijalce\", vendar smo jo premaknili sem.","middle-click-popup/@update":"Ta dodatek smo popolnoma prenovili. Zdaj lahko vnesete vrednosti polj in okrogle bloke znotraj drugih blokov in uporabite tipko Tab za samodejno dopolnjevanje.","middle-click-popup/@settings-name-popup_scale":"Velikost blokov v oknu za iskanje","middle-click-popup/@settings-name-popup_width":"Širina okna za iskanje","middle-click-popup/@settings-name-popup_max_height":"Največja višina okna za iskanje"} \ No newline at end of file +{"middle-click-popup/start-typing":"Začnite tipkati...","middle-click-popup/@name":"Iskanje blokov","middle-click-popup/@description":"Kliknite prostor za kodo s srednjim miškinim gumbom ali med držanjem tipke Shift ali pritisnite Ctrl+presledek, da odprete okno za iskanje blokov. Vnesite imena (ali dele imen) blokov in bloke povlecite v prostor za kodo, da jih dodate v svoj projekt. Po seznamu se lahko premikate s puščicami in tipko Enter. Omogoča tudi samodejno dopolnjevanje s Tab. Med vlečenjem blokov lahko držite Shift, da seznam ostane odprt.","middle-click-popup/@info-developer-tools":"Ta funkcija je bila prej del dodatka \"orodje za razvijalce\", vendar smo jo premaknili sem.","middle-click-popup/@update":"Ta dodatek smo popolnoma prenovili. Zdaj lahko vnesete vrednosti polj in okrogle bloke znotraj drugih blokov in uporabite tipko Tab za samodejno dopolnjevanje.","middle-click-popup/@settings-name-popup_scale":"Velikost blokov v oknu za iskanje","middle-click-popup/@settings-name-popup_width":"Širina okna za iskanje","middle-click-popup/@settings-name-popup_max_height":"Največja višina okna za iskanje"} \ No newline at end of file diff --git a/addons-l10n/sl/place-backpack-code-at-cursor.json b/addons-l10n/sl/place-backpack-code-at-cursor.json index 9c92daf582..e93f610fba 100644 --- a/addons-l10n/sl/place-backpack-code-at-cursor.json +++ b/addons-l10n/sl/place-backpack-code-at-cursor.json @@ -1 +1 @@ -{"place-backpack-code-at-cursor/@name":"Postavi kodo iz shrambe zraven miške","place-backpack-code-at-cursor/@description":"Bloke iz shrambe postavi tja, kamor jih povlečete, ne na rob območja za kodo."} \ No newline at end of file +{"place-backpack-code-at-cursor/@name":"Postavi kodo iz shrambe zraven miške","place-backpack-code-at-cursor/@description":"Bloke iz shrambe postavi tja, kamor jih povlečete, ne na rob prostora za kodo."} \ No newline at end of file diff --git a/addons-l10n/sl/redirect-mobile-forums-v2.json b/addons-l10n/sl/redirect-mobile-forums-v2.json index 4c0d6938f8..c417f600cb 100644 --- a/addons-l10n/sl/redirect-mobile-forums-v2.json +++ b/addons-l10n/sl/redirect-mobile-forums-v2.json @@ -1 +1 @@ -{"redirect-mobile-forums-v2/@name":"Preusmeritev v standardne forume"} \ No newline at end of file +{"redirect-mobile-forums-v2/@name":"Preusmeritev v standardne forume","redirect-mobile-forums-v2/@description":"Ko obiščete mobilno (\"m\") različico forumov, vas preusmeri na standardno (\"glavno\") različico, da se izognete napaki Strani nismo našli."} \ No newline at end of file diff --git a/addons-l10n/sl/script-snap.json b/addons-l10n/sl/script-snap.json index 7fc18da058..57c3daabf0 100644 --- a/addons-l10n/sl/script-snap.json +++ b/addons-l10n/sl/script-snap.json @@ -1 +1 @@ -{"script-snap/@name":"Pritrdi skripte na mrežo","script-snap/@description":"Potegnite skripto, da se njen položaj samodejno poravna s pikami na ozadju prostora za skripte.","script-snap/@preset-name-whole-block":"Cel blok","script-snap/@preset-name-half-block":"Pol bloka","script-snap/@preset-name-default":"Navadno","script-snap/@settings-name-grid":"Velikost mreže (px)"} \ No newline at end of file +{"script-snap/@name":"Pritrdi skripte na mrežo","script-snap/@description":"Potegnite skripto, da se njen položaj samodejno poravna s pikami na ozadju prostora za kodo.","script-snap/@preset-name-whole-block":"Cel blok","script-snap/@preset-name-half-block":"Pol bloka","script-snap/@preset-name-default":"Navadno","script-snap/@settings-name-grid":"Velikost mreže (px)"} \ No newline at end of file From 0da7e1c97052f0c02f4f03ff054374163d247fe2 Mon Sep 17 00:00:00 2001 From: Jazza <81956724+Jazza-231@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:20:27 +0900 Subject: [PATCH 12/12] New addon: "delete other assets" (`delete-others`) (#7030) * initial commit * remove dem dynamics * confirm * this should work, testing now * here * getting there * DANGER!!!! * fuck yes * no r * Window.addon is crucial to the working of this addon so we will remove it Co-authored-by: Samq64 <81489795+Samq64@users.noreply.github.com> * smaller popup and string changes * reverse * dynam en dis * stupid strings * opti and var name change * shit forgot that -1 * fix sounds being added in thr wrong order * update ver * Update versionAdded Co-authored-by: Maximouse <51849865+mxmou@users.noreply.github.com> * Arrow fix by mxmou Co-authored-by: Maximouse <51849865+mxmou@users.noreply.github.com> * Useless await * Use internal variable instead of abusing Redux * Cleanup variables * Use editingTarget.addCostume instead --------- Co-authored-by: Samq64 <81489795+Samq64@users.noreply.github.com> Co-authored-by: W_L Co-authored-by: Maximouse <51849865+mxmou@users.noreply.github.com> --- addons-l10n/en/delete-others.json | 8 +++ addons/addons.json | 1 + addons/delete-others/addon.json | 15 +++++ addons/delete-others/userscript.js | 99 ++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 addons-l10n/en/delete-others.json create mode 100644 addons/delete-others/addon.json create mode 100644 addons/delete-others/userscript.js diff --git a/addons-l10n/en/delete-others.json b/addons-l10n/en/delete-others.json new file mode 100644 index 0000000000..2ad5f03a09 --- /dev/null +++ b/addons-l10n/en/delete-others.json @@ -0,0 +1,8 @@ +{ + "delete-others/deleteOthers": "delete others", + "delete-others/confirmTitle": "Delete Others", + "delete-others/infoCostume": "Are you sure you want to delete all other costumes?\nThe deleted costumes can be restored by going to Edit \u2192 Restore Costumes.", + "delete-others/infoSound": "Are you sure you want to delete all other sounds?\nThe deleted sounds can be restored by going to Edit \u2192 Restore Sounds.", + "delete-others/multiCostumes": "Restore Costumes", + "delete-others/multiSounds": "Restore Sounds" +} diff --git a/addons/addons.json b/addons/addons.json index ac8aa9de77..a2a09ee30d 100644 --- a/addons/addons.json +++ b/addons/addons.json @@ -152,6 +152,7 @@ "paint-skew", "preview-project-description", "collapse-footer", + "delete-others", "download-button", "reorder-custom-inputs", "place-backpack-code-at-cursor", diff --git a/addons/delete-others/addon.json b/addons/delete-others/addon.json new file mode 100644 index 0000000000..3a83aa4eca --- /dev/null +++ b/addons/delete-others/addon.json @@ -0,0 +1,15 @@ +{ + "name": "Delete other assets", + "description": "Adds an option to the right click menu to easily delete all other costumes, backdrops, or sounds.", + "tags": ["editor", "costumeEditor", "recommended"], + "versionAdded": "1.39.0", + "userscripts": [ + { + "matches": ["projects"], + "url": "userscript.js" + } + ], + "credits": [{ "name": "Jazza", "link": "https://scratch.mit.edu/users/greeny--231" }], + "dynamicEnable": true, + "dynamicDisable": true +} diff --git a/addons/delete-others/userscript.js b/addons/delete-others/userscript.js new file mode 100644 index 0000000000..f2517fc214 --- /dev/null +++ b/addons/delete-others/userscript.js @@ -0,0 +1,99 @@ +export default async function ({ addon, console, msg }) { + const vm = addon.tab.traps.vm; + + const TYPES = ["sound", "costume"]; + let deletedItems = []; + let target; + let shouldChangeRestoreButtonText = false; + + function getRestoreFun(type) { + deletedItems.reverse(); + if (type === "costume") { + deletedItems.forEach((costume) => { + target.addCostume(costume); + }); + } else if (type === "sound") { + deletedItems.forEach((sound) => { + target.addSound(sound); + }); + } + vm.emitTargetsUpdate(); + deletedItems = []; + } + + addon.tab.createEditorContextMenu( + async (ctx) => { + if ( + await addon.tab.confirm(msg("confirmTitle"), msg(ctx.type === "costume" ? "infoCostume" : "infoSound"), { + useEditorClasses: true, + }) + ) { + const type = ctx.type === "costume" ? "Costume" : "Sound"; + + deletedItems = []; + target = vm.editingTarget; + + const numberOfAssets = ctx.type === "costume" ? target.getCostumes().length : target.getSounds().length; + + for (let i = numberOfAssets - 1; i > -1; i--) { + if (i !== ctx.index) { + let deleted = ctx.type === "costume" ? target.deleteCostume(i) : target.deleteSound(i); + if (deleted) deletedItems.push(deleted); + } + } + + addon.tab.redux.dispatch({ + type: "scratch-gui/restore-deletion/RESTORE_UPDATE", + state: { + restoreFun: getRestoreFun.bind(this, ctx.type), + deletedItem: type, + }, + }); + queueMicrotask(() => { + if (deletedItems.length > 1) { + shouldChangeRestoreButtonText = true; + } + }); + } + }, + { + types: TYPES, + position: "assetContextMenuAfterDelete", + order: 1, + label: msg("deleteOthers"), + dangerous: true, + condition: showDeleteOthers, + } + ); + + function showDeleteOthers(ctx) { + if (addon.self.disabled) return false; + if (ctx.type === "costume") { + return vm.editingTarget.getCostumes().length > 1; + } else { + return vm.editingTarget.getSounds().length > 1; + } + } + + addon.tab.redux.initialize(); + addon.tab.redux.addEventListener("statechanged", ({ detail }) => { + const e = detail; + if (!e.action || e.action.type !== "scratch-gui/restore-deletion/RESTORE_UPDATE") return; + shouldChangeRestoreButtonText = false; + }); + + while (true) { + const restoreButton = await addon.tab.waitForElement( + '[class*="menu-bar_menu-bar-item_"]:nth-child(4) [class*="menu_menu-item_"]:first-child > span', + { + markAsSeen: true, + reduxCondition: (state) => state.scratchGui.menus.editMenu, + condition: () => shouldChangeRestoreButtonText, + } + ); + + // We know that shouldChangeRestoreButtonText = true + const { deletedItem } = addon.tab.redux.state.scratchGui.restoreDeletion; + restoreButton.innerText = msg(`multi${deletedItem}s`); + } +}