diff --git a/.github/ISSUE_TEMPLATE/--bug.yml b/.github/ISSUE_TEMPLATE/--bug.yml index c612a5db..c5e8de7e 100644 --- a/.github/ISSUE_TEMPLATE/--bug.yml +++ b/.github/ISSUE_TEMPLATE/--bug.yml @@ -1,6 +1,6 @@ -name: Bug Report -description: Report a bug for ScratchTools, or something that doesn't work properly. -labels: ["bug"] +name: 🐛 Bug +description: Report a bug in ScratchTools. +labels: ["type: bug", "status: needs review"] body: - type: textarea @@ -16,8 +16,8 @@ body: id: why attributes: label: What is causing the bug? - description: Are there any actions that you take that could be causing a bug? For example, does it happen when you enter the editor or share a project? - placeholder: Type here + description: We aren't asking for code, we just want to know when and where this code is happening. + placeholder: For example- "When I go to my own profile and close the comments." validations: required: true diff --git a/.github/ISSUE_TEMPLATE/--enhancement.yml b/.github/ISSUE_TEMPLATE/--enhancement.yml new file mode 100644 index 00000000..be7a1451 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/--enhancement.yml @@ -0,0 +1,28 @@ +name: ✨ Enhancement +description: Suggest an enhancement for ScratchTools to improve a certain feature or other part of the extension. +labels: ["status: needs review", "type: enhancement"] +body: + + - type: textarea + id: describe + attributes: + label: Why would this be helpful? + description: We'd like to know in what cases something like this might be helpful. + placeholder: Type here + validations: + required: true + + - type: textarea + id: how + attributes: + label: How would this work? + description: We aren't asking for code specifics, but we'd like to know your vision for it. + placeholder: Type here + validations: + required: true + + - type: textarea + id: extra + attributes: + label: Anything else? + description: You can put more info here if you have any. diff --git a/.github/ISSUE_TEMPLATE/--feature.yml b/.github/ISSUE_TEMPLATE/--feature.yml index abca8c58..30540233 100644 --- a/.github/ISSUE_TEMPLATE/--feature.yml +++ b/.github/ISSUE_TEMPLATE/--feature.yml @@ -1,22 +1,22 @@ -name: New Feature -description: Suggest a new feature for ScratchTools, or an enhancement for a feature. -labels: ["new feature"] +name: 🎉 New Feature +description: Suggest an entirely new feature for ScratchTools. +labels: ["new feature", "status: needs review"] body: - type: textarea id: describe attributes: - label: How does the feature work? - description: Describe what you're suggesting. + label: Why would this be helpful? + description: We'd like to know in what cases something like this might be helpful. placeholder: Type here validations: required: true - type: textarea - id: why + id: how attributes: - label: What situations would make this helpful? - description: Who would find this helpful, and when? + label: How would this work? + description: We aren't asking for code specifics, but we'd like to know your vision for it. placeholder: Type here validations: required: true diff --git a/.github/ISSUE_TEMPLATE/blank.md b/.github/ISSUE_TEMPLATE/blank.md new file mode 100644 index 00000000..e4bb3a72 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/blank.md @@ -0,0 +1,7 @@ +--- +name: 'Blank issue' +about: "Don't see your issue here? Open a blank issue." +title: '' +labels: 'status: needs review' +assignees: '' +--- diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..d65a57b3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +blank_issues_enabled: false +contact_links: + - name: 💬 Send Feedback + url: https://scratchtools.app/feedback + about: Submit feedback for ScratchTools developers to review. + - name: 🔒 Report a Vulnerability + url: mailto:security@scratchtools.app?subject=Reporting%20a%20Security%20Vulnerability&body=(Please%20put%20the%20details%20below) + about: Please report security vulnerabilities here. + - name: 👥 Community Discord Server + url: https://discord.gg/EByJKZR2AE + about: Join the Discord server to submit suggestions/bugs and talk to other users. + - name: 🧑‍💻 Development Discord Server + url: https://discord.gg/6Ecds4pTKT + about: Join the development server to chat with other developers. diff --git a/.github/scripts/extract-classnames.js b/.github/scripts/extract-classnames.js new file mode 100644 index 00000000..78234e19 --- /dev/null +++ b/.github/scripts/extract-classnames.js @@ -0,0 +1,45 @@ +const fs = require("fs"); +const path = require("path"); + +const rootDir = path.resolve(__dirname, "../../features"); +const outputFile = path.resolve(__dirname, "../../class-names.json"); + +let collected = new Set(); + +function traverseDir(dir) { + const files = fs.readdirSync(dir); + for (const file of files) { + const fullPath = path.join(dir, file); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + traverseDir(fullPath); + } else if (stat.isFile() && file.endsWith(".js")) { + const content = fs.readFileSync(fullPath, "utf-8"); + const regex = /className\(["'`](.*?)["'`]\)/g; + let match; + while ((match = regex.exec(content)) !== null) { + collected.add({ + className: "ste-" + match[1].replaceAll(" ", "-"), + features: [ + dir.split("/features/")[1].split("/")[0].replaceAll(".js", ""), + ], + }); + } + } + } +} + +traverseDir(rootDir); + +const mergedFeatures = Object.values( + [...collected].reduce((acc, item) => { + if (!acc[item.className]) { + acc[item.className] = { className: item.className, features: new Set() }; + } + item.features.forEach(f => acc[item.className].features.add(f)); + return acc; + }, {}) + ).map(obj => ({ className: obj.className, features: [...obj.features] })); + +fs.writeFileSync(outputFile, JSON.stringify(mergedFeatures, null, 2)); diff --git a/.github/workflows/extract-classnames.yml b/.github/workflows/extract-classnames.yml new file mode 100644 index 00000000..b135caac --- /dev/null +++ b/.github/workflows/extract-classnames.yml @@ -0,0 +1,60 @@ +name: Extract Class Names + +on: + push: + paths: + - "features/**.js" + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + extract: + if: github.repository == 'STForScratch/ScratchTools' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Generate GitHub App token + id: generate_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + installation_id: ${{ secrets.INSTALLATION_ID }} + + - name: Run extraction script + run: node .github/scripts/extract-classnames.js + + - name: Check for changes + id: git-diff + run: | + if git diff --quiet --exit-code class-names.json; then + echo "changed=false" >> $GITHUB_OUTPUT + else + echo "changed=true" >> $GITHUB_OUTPUT + fi + + - name: Create or Update Pull Request + if: steps.git-diff.outputs.changed == 'true' + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ steps.generate_token.outputs.token }} + commit-message: "Update class-names.json" + branch: update-class-names + title: "Update feature class names" + body: "Automated update of class-names.json to keep track of class names used across all features." + labels: automated + assignees: rgantzos + delete-branch: true diff --git a/README.md b/README.md index daf379c9..c44300a8 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,12 @@ There are multiple ways of installing. - Chrome: You can download from Chrome's Extension Webstore [here](https://chrome.google.com/webstore/detail/scratchtools/jjnpbalpllpfdpgplpbcbadkgdmleopm). Then just press the Add to Chrome button, and you've downloaded ScratchTools! > [!NOTE] -> If you are using a browser based on Chromium (eg. Brave), then this is your way of installing unless your browser has it's own extension store. +> If you are using a browser based on Chromium (eg. Brave), then this is your way of installing unless your browser has its own extension store. - Firefox/Mozilla: You can download from Firefox Addons (Works on Firefox forks) [here](https://addons.mozilla.org/en-US/firefox/addon/scratchtools/). You can then just add it to Firefox, and then you have ScratchTools! > [!NOTE] -> The Firefox version of Scratchtools is behind compared to the chrome version of Scratchtools due to technical difficulties. Until a solution is found, the Firefox version will remain behind. +> The Firefox version of ScratchTools is behind compared to the Chrome version of ScratchTools due to technical difficulties. Until a solution is found, the Firefox version will remain behind. - Microsoft Edge: You can download from Edge's addon webstore [here](https://microsoftedge.microsoft.com/addons/detail/scratchtools/aaidjeidbnhpjhblbianjeghjopbimmk). You can then just add it to Edge, and then you have ScratchTools! - Safari (macOS, iPadOS and iOS): You can build the extension by typing `make` for macOS, and `make ios` for the iOS app (you will have to sign it on Xcode), make sure you have enabled Developer mode and allowed unsigned extensions. @@ -55,9 +55,9 @@ There are multiple ways of installing. - GitHub (For Firefox & Firefox Forks): Download from the GitHub repository [here](https://github.com/STForScratch/ScratchTools/zipball/master). After the `.zip` file is downloaded, unpack it. Then, with the folder, go to `about:debugging`, click "This Firefox" and click "Load temporary extension", go into the extension folder and select the `manifest.json`. > [!WARNING] -> Extensions loaded this way onto Safari indeed temporary. Once you close the window, it will be gone. In addition, ScratchTools is still outdated on Firefox at the time of writing this. +> Extensions loaded this way onto Safari are temporary. Once you close the window, it will be gone. -- Installing with Git: Open the code dropdown on the extension's repository, copy the HTTPS url and then execute `git clone https://github.com/STForScratch/ScratchTools.git -b main` in Git, and you have installed ScratchTools! To pull changes instead of cloning the repository, enter the folder and execute `git remote add upstream https://github.com/STForScratch/ScratchTools.git -b main`. When a commit is made to the repository, you can just run `git pull upstream master` to pull the changes, note that sometimes you may need to refresh ScratchTools. +- Installing with Git: Open the code dropdown on the extension's repository, copy the HTTPS url and then execute `git clone https://github.com/STForScratch/ScratchTools.git -b main` in Git, and you have installed ScratchTools! To pull changes instead of cloning the repository, enter the folder and execute `git remote add upstream https://github.com/STForScratch/ScratchTools.git`. When a commit is made to the repository, you can just run `git pull upstream main` to pull the changes, note that sometimes you may need to refresh ScratchTools. ### Building a Feature It's not very hard to build a feature, and if you're ever having trouble, our developers are always here to help you! For ideas, code help, beta testing for your features, and more, you can [join our Discord server](https://discord.gg/5AkUsCbEsy). Now, here's how to build a feature! @@ -77,7 +77,7 @@ Using `ScratchTools.Auth`, you can access the authentication info for the signed Using `ScratchTools.Scratch.blockly` and `ScratchTools.Scratch.vm`, you can access the Blockly and Virtual Machine from inside the editor (or on the project page with vm). Blockly must wait for the editor to load, but the virtual machine is ready instantly. ##### Blockly Context Menus If you want to control what appears in a context menu, you easily can with the `ScratchTools.Scratch.waitForContextMenu()` API. The only input you need is JSON, which must include the block ID for the context menu, the ID you want to set for the context menu option (lets you change the context menu option, so don't use the same ID as another feature), and the callback for when the context menu is opened. The callback function will also have an input, which is the context menu itself. That way, you can add the context menu option when the context menu is opened. -##### Sound , GUI and Paint-Mode +##### Sound, GUI and Paint-Mode Using `ScratchTools.Scratch.scratchSound`and `ScratchTools.Scratch.scratchGui`, you can return sound from the editor as well as access Graphical User Interface inside the editor. `ScratchTools.Scratch.scratchPaint` can be used in selecting the paint editor mode. #### Logging diff --git a/_locales/en/messages.json b/_locales/en/messages.json index e6b5260c..725bacc9 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -6,7 +6,7 @@ "message": "ScratchTools is fully customizable with tons of features, all for making the Scratch website better and easier to use!" }, "supportButton": { - "message": "Get support" + "message": "Get live support" }, "feedbackButton": { "message": "Give feedback" diff --git a/api/content/redux.js b/api/content/redux.js new file mode 100644 index 00000000..aea24df6 --- /dev/null +++ b/api/content/redux.js @@ -0,0 +1,78 @@ +// Thank you to WorldLanguages, ErrorGamer2000, and apple502j + +function injectRedux() { + window.__steRedux = {}; + + class ReDucks { + static compose(...composeArgs) { + if (composeArgs.length === 0) return (...args) => args; + return (...args) => { + const composeArgsReverse = composeArgs.slice(0).reverse(); + let result = composeArgsReverse.shift()(...args); + for (const fn of composeArgsReverse) { + result = fn(result); + } + return result; + }; + } + + static applyMiddleware(...middlewares) { + return (createStore) => + (...createStoreArgs) => { + const store = createStore(...createStoreArgs); + let { dispatch } = store; + const api = { + getState: store.getState, + dispatch: (action) => dispatch(action), + }; + const initialized = middlewares.map((middleware) => middleware(api)); + dispatch = ReDucks.compose(...initialized)(store.dispatch); + return Object.assign({}, store, { dispatch }); + }; + } + } + + let newerCompose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__; + function compose(...args) { + const steRedux = window.__steRedux; + const reduxTarget = (steRedux.target = new EventTarget()); + steRedux.state = {}; + steRedux.dispatch = () => {}; + + function middleware({ getState, dispatch }) { + steRedux.dispatch = dispatch; + steRedux.state = getState(); + return (next) => (action) => { + const nextReturn = next(action); + const ev = new CustomEvent("statechanged", { + detail: { + prev: steRedux.state, + next: (steRedux.state = getState()), + action, + }, + }); + reduxTarget.dispatchEvent(ev); + return nextReturn; + }; + } + args.splice(1, 0, ReDucks.applyMiddleware(middleware)); + return newerCompose + ? newerCompose.apply(this, args) + : ReDucks.compose.apply(this, args); + } + + try { + Object.defineProperty(window, "__REDUX_DEVTOOLS_EXTENSION_COMPOSE__", { + get: () => compose, + set: (v) => { + newerCompose = v; + }, + }); + } catch (err) { + window.__steRedux = __scratchAddonsRedux; + } +} + +if (!(document.documentElement instanceof SVGElement)) { + immediatelyRunFunctionInMainWorld(injectRedux); +} diff --git a/api/content/vm.js b/api/content/vm.js new file mode 100644 index 00000000..d7975bd9 --- /dev/null +++ b/api/content/vm.js @@ -0,0 +1,32 @@ +// Thank you to mxmou, WorldLanguages, ErrorGamer2000, apple502j, TheColaber, and towerofnix + +function immediatelyRunFunctionInMainWorld(fn) { + if (typeof fn !== "function") throw "Expected function"; + const div = document.createElement("div"); + div.setAttribute("onclick", "(" + fn + ")()"); + document.documentElement.appendChild(div); + div.click(); + div.remove(); +} + +immediatelyRunFunctionInMainWorld(() => { + const oldBind = Function.prototype.bind; + window.__steTraps = new EventTarget() + const onceMap = (__steTraps._onceMap = Object.create(null)); + + Function.prototype.bind = function (...args) { + if (Function.prototype.bind === oldBind) { + return oldBind.apply(this, args); + } else if ( + args[0] && + Object.prototype.hasOwnProperty.call(args[0], "editingTarget") && + Object.prototype.hasOwnProperty.call(args[0], "runtime") + ) { + onceMap.vm = args[0]; + Function.prototype.bind = oldBind; + return oldBind.apply(this, args); + } else { + return oldBind.apply(this, args); + } + }; +}); diff --git a/api/feature.js b/api/feature.js index d37bad3c..5f98785c 100644 --- a/api/feature.js +++ b/api/feature.js @@ -6,6 +6,9 @@ class Feature { finalFeature = el; } }); + this.requestPermissions = async function(...permissions) { + return await ScratchTools.sendMessage("request-perms", permissions) + } this.data = finalFeature; this.msg = function (string) { return this.data.localesData[`${this.data.id}/`+string] || `ScratchTools.${this.data.id}.${string}`; @@ -81,9 +84,16 @@ class Feature { path: window.location.pathname, scratch: document.querySelector("#app") ? 3 : 2, } - this.redux = document.querySelector("#app")?.[ - Object.keys(app).find((key) => key.startsWith("__reactContainer")) - ].child.stateNode.store + this.getInternals = function(element) { + let reactKey = Object.keys(element).find((key) => key.startsWith("__reactInternalInstance")) + if (!reactKey) return null; + + return element[reactKey] + } + this.getInternalKey = function(element) { + return Object.keys(element).find((key) => key.startsWith("__reactInternalInstance")) || null + } + this.redux = window.__steRedux if (finalFeature.version !== 2) { console.warn( `'${finalFeature.file}' does not use Feature v2. It is recommended that you use the newest version.` diff --git a/api/feature/index.js b/api/feature/index.js index f6fbed93..7788522c 100644 --- a/api/feature/index.js +++ b/api/feature/index.js @@ -1,11 +1,18 @@ import { default as self } from "./self.js"; import { default as traps } from "./traps.js"; import { default as auth } from "./auth.js"; +import { default as server } from "./server.js"; export default function (data) { var feature = new Feature(data); feature.self = self(data.id); feature.traps = traps() feature.auth = auth() + feature.server = server() + feature.page = { + appendToSharedSpace: ScratchTools.appendToSharedSpace, + waitForElement: ScratchTools.waitForElement, + waitForElements: ScratchTools.waitForElements, + } return feature; } diff --git a/api/feature/server.js b/api/feature/server.js new file mode 100644 index 00000000..b1f4c507 --- /dev/null +++ b/api/feature/server.js @@ -0,0 +1,8 @@ +export default function (id) { + return { + url: "https://data.scratchtools.app", + endpoint: function(path) { + return "https://data.scratchtools.app" + path + }, + } +} \ No newline at end of file diff --git a/api/main.js b/api/main.js index 6af72838..b2149202 100644 --- a/api/main.js +++ b/api/main.js @@ -74,6 +74,24 @@ ScratchTools.Storage = {}; ScratchTools.Resources = {}; ste.console.log("ScratchTools API Created", "ste-main"); +ScratchTools.cssFiles = []; +async function updateCSSFiles() { + let activeCSSFiles = Array.from(document.styleSheets) + .filter((sheet) => sheet.href) + .map((sheet) => sheet.href) + .filter((el) => new URL(el).host === "scratch.mit.edu"); + activeCSSFiles = activeCSSFiles.filter( + (el) => !ScratchTools.cssFiles.find((e) => e.url === el) + ); + + for (var i in activeCSSFiles) { + ScratchTools.cssFiles.push({ + url: activeCSSFiles[i], + data: await (await fetch(activeCSSFiles[i])).text(), + }); + } +} + if ( window.location.href.startsWith("https://scratch.mit.edu/projects/") && window.location.href.includes("/editor") @@ -83,6 +101,23 @@ if ( ScratchTools.type = "Website"; } +ScratchTools.MESSAGES = [] +ScratchTools.sendMessage = function(id, content) { + let uuid = UUID() + chrome.runtime.sendMessage(ScratchTools.id, { message: id, content, source: "message-api", uuid }); + return new Promise((resolve, reject) => { + ScratchTools.MESSAGES.push({ message: id, source: "message-api", uuid, resolve }); + }); +} + +function UUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (char) { + const random = Math.random() * 16 | 0; + const value = char === 'x' ? random : (random & 0x3 | 0x8); + return value.toString(16); + }); +} + var storagePromises = []; ScratchTools.storage = { get: async function (key) { @@ -159,6 +194,7 @@ function enableScratchToolsSelectorsMutationObserver() { enableScratchToolsSelectorsMutationObserver(); function returnScratchToolsSelectorsMutationObserverCallbacks() { + updateCSSFiles() Object.keys(allWaitInstances).forEach(function (key) { var waitInstance = allWaitInstances[key]; if (!waitInstance.removed) { @@ -340,6 +376,39 @@ ScratchTools.styles = { }, }; +function scratchClass(name) { + let element = document.querySelector(`[class*='${name}']`); + if (element) { + let classes = [...element.classList]; + return classes.find((el) => el.includes(name)); + } else { + let text = [] + + for (var i in ScratchTools.cssFiles) { + text.push(ScratchTools.cssFiles[i].data) + } + + text = text.join("\n\n") + let classes = ScratchTools.getClassNamesFromCSSText(text) + + let relClass = classes.find((el) => el.includes(name)) + return relClass + } +} + +ScratchTools.getClassNamesFromCSSText = function(cssText) { + const classNames = new Set(); + + const classRegex = /\.([a-zA-Z0-9_-]+)\b/g; + + let match; + while ((match = classRegex.exec(cssText)) !== null) { + classNames.add(match[1]); + } + + return Array.from(classNames); +} + ScratchTools.waitForElements( "ul[class*='menu_menu_'][class*='menu_right_']", function (ul) { @@ -351,10 +420,13 @@ ScratchTools.waitForElements( if (!ul.querySelector(".ste-menu-full-settings")) { var li = document.createElement("li"); li.className = - "ste-menu-full-settings menu_menu-item_3EwYA menu_hoverable_3u9dt"; + "ste-menu-full-settings " + + scratchClass("menu_menu-item_") + + " " + + scratchClass("menu_hoverable_"); var div = document.createElement("div"); - div.className = "settings-menu_option_3rMur"; + div.className = "settings-menu_option_GGukG"; var icon = document.createElement("img"); icon.src = ScratchTools.icons.main; @@ -391,6 +463,8 @@ async function blockliveDetection() { Object.keys(app).find((key) => key.startsWith("__reactContainer")) ].child.stateNode.store.getState()?.scratchGui; if (!gui?.projectState) return; - let detectBlocklive = await import("./blocklive-detection/blocklive-detect.js"); + let detectBlocklive = await import( + "./blocklive-detection/blocklive-detect.js" + ); detectBlocklive.default(); -} \ No newline at end of file +} diff --git a/api/modal.css b/api/modal.css index 4e7032cf..6bfdf408 100644 --- a/api/modal.css +++ b/api/modal.css @@ -12,14 +12,16 @@ .st-modal { position: fixed; - top: 15rem; + top: 50%; width: calc(40% - 4rem); padding: 2rem; left: 30%; background-color: #fafafa; border-radius: 0.5rem; - padding-top: 3rem; + padding-top: 1rem; z-index: 2147483647; + transform: translateY(-50%); + border-top: 1rem solid #ff9f00; } .st-modal h1 { @@ -75,4 +77,17 @@ .st-modal button:hover { top: .4rem !important; +} + +.st-modal button.ste-modal-cancel-btn { + background-color: #c9c9c9 !important; +} + +.st-modal input { + padding: 0.5rem !important; + outline: none !important; + border-radius: 0.25rem !important; + border: 0px !important; + background-color: #e3e3e3; + margin-right: .5rem; } \ No newline at end of file diff --git a/api/modals.js b/api/modals.js index 67ec7161..9cf8e134 100644 --- a/api/modals.js +++ b/api/modals.js @@ -24,26 +24,31 @@ ScratchTools.modals = { p.textContent = data.description; modal.appendChild(p); - var orangeBar = document.createElement("div"); - orangeBar.className = "st-modal-header"; - data.components?.forEach(function (component) { if (component.type === "code") { var code = document.createElement("code"); code.textContent = component.content; modal.appendChild(code); + } else if (component.type === "html") { + modal.appendChild(component.content); } }); var closeButton = document.createElement("button"); - closeButton.textContent = "Close"; + closeButton.textContent = data.cancel ? "Cancel" : "Close"; + closeButton.className = data.cancel ? "ste-modal-cancel-btn" : "" closeButton.onclick = function () { div.remove(); }; modal.appendChild(closeButton); div.appendChild(modal); - modal.prepend(orangeBar); document.body.appendChild(div); + + return { + close: function () { + div.remove(); + }, + }; }, }; diff --git a/api/module.js b/api/module.js index 589f2731..71dcf878 100644 --- a/api/module.js +++ b/api/module.js @@ -1,6 +1,30 @@ let allFeatures = [] let alreadyInjected = []; +function scratchClass(name) { + let element = document.querySelector(`[class*='${name}']`); + if (element) { + let classes = [...element.classList]; + return classes.find((el) => el.includes(name)); + } else { + let text = [] + + for (var i in ScratchTools.cssFiles) { + text.push(ScratchTools.cssFiles[i].data) + } + + text = text.join("\n\n") + let classes = ScratchTools.getClassNamesFromCSSText(text) + + let relClass = classes.find((el) => el.includes(name)) + return relClass + } +} + +function className(name) { + return "ste-" + name.toLowerCase().replaceAll(" ", "-") +} + ScratchTools.modules.forEach(async function (script) { var feature = await import(ScratchTools.dir + "/api/feature/index.js"); var shouldBeRun = true; @@ -20,6 +44,8 @@ ScratchTools.modules.forEach(async function (script) { allFeatures.push(featureGenerated) fun.default({ feature: featureGenerated, + scratchClass, + className, console: { log: function (content) { ste.console.log(content, script.feature.id); @@ -56,6 +82,8 @@ ScratchTools.injectModule = async function (script) { allFeatures.push(featureGenerated) fun.default({ feature: featureGenerated, + scratchClass, + className, console: { log: function (content) { ste.console.log(content, script.feature.id); diff --git a/api/update/changelogs/forum.json b/api/update/changelogs/forum.json new file mode 100644 index 00000000..9a9b0818 --- /dev/null +++ b/api/update/changelogs/forum.json @@ -0,0 +1,7 @@ +{ + "active": false, + "title": "Forum Changes for {{ version }}", + "description": "", + "changes": [] + } + \ No newline at end of file diff --git a/api/update/changelogs/project.json b/api/update/changelogs/project.json new file mode 100644 index 00000000..ca32136d --- /dev/null +++ b/api/update/changelogs/project.json @@ -0,0 +1,63 @@ +{ + "active": true, + "title": "Project Page Changes for {{ version }}", + "description": "ScratchTools is introducing many new project page and editor features that will revolutionize the way that you use Scratch. You can enable them on the settings page.", + "changes": [ + { + "icon": "gradient.svg", + "slogan": "Rotate gradient colors in the paint editor" + }, + { + "icon": "align.svg", + "slogan": "Align shapes and objects in the paint editor" + }, + { + "icon": "align.svg", + "slogan": "Quickly center text in your project instructions" + }, + { + "icon": "extend.svg", + "slogan": "Extend C-blocks around code when dragging them" + }, + { + "icon": "filesize.svg", + "slogan": "View file sizes for any asset" + }, + { + "icon": "font.svg", + "slogan": "Use dozens of extra fonts in the paint editor" + }, + { + "icon": "nocloud.svg", + "slogan": "Temporarily disable cloud variables in projects" + }, + { + "icon": "opacity.svg", + "slogan": "Customize the opacity of stage variable monitors" + }, + { + "icon": "outline.svg", + "slogan": "Customize and round lines and shape outlines" + }, + { + "icon": "reaction.svg", + "slogan": "Add and view emoji reactions on any project" + }, + { + "icon": "record.svg", + "slogan": "Record and save videos of your project stage" + }, + { + "icon": "shapes.svg", + "slogan": "Unite, subtract, intersect, and exclude shapes" + }, + { + "icon": "thumbnail.svg", + "slogan": "Upload custom project thumbnails" + }, + { + "icon": "upload.svg", + "slogan": "Upload WEBP images as costumes and sprites" + } + ] +} diff --git a/api/update/changelogs/website.json b/api/update/changelogs/website.json new file mode 100644 index 00000000..8e4cd84c --- /dev/null +++ b/api/update/changelogs/website.json @@ -0,0 +1,28 @@ +{ + "active": true, + "title": "Website Changes for {{ version }}", + "description": "ScratchTools is introducing many new features for the Scratch website. You can enable them on the settings page.", + "changes": [ + { + "icon": "change.svg", + "slogan": "Customize what tag is used by default on the explore page" + }, + { + "icon": "gift.svg", + "slogan": "A ScratchTools selection of featured projects" + }, + { + "icon": "filter.svg", + "slogan": "Filter through studio, explore, and searched projects" + }, + { + "icon": "date.svg", + "slogan": "See when a studio was created" + }, + { + "icon": "countdown.svg", + "slogan": "View how many replies are left in a thread" + } + ] + } + \ No newline at end of file diff --git a/api/update/icons/align.svg b/api/update/icons/align.svg new file mode 100644 index 00000000..0f181f48 --- /dev/null +++ b/api/update/icons/align.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/change.svg b/api/update/icons/change.svg new file mode 100644 index 00000000..5040be17 --- /dev/null +++ b/api/update/icons/change.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/countdown.svg b/api/update/icons/countdown.svg new file mode 100644 index 00000000..b2483d3d --- /dev/null +++ b/api/update/icons/countdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/date.svg b/api/update/icons/date.svg new file mode 100644 index 00000000..98123090 --- /dev/null +++ b/api/update/icons/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/extend.svg b/api/update/icons/extend.svg new file mode 100644 index 00000000..59355358 --- /dev/null +++ b/api/update/icons/extend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/filesize.svg b/api/update/icons/filesize.svg new file mode 100644 index 00000000..b3887810 --- /dev/null +++ b/api/update/icons/filesize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/filter.svg b/api/update/icons/filter.svg new file mode 100644 index 00000000..add0849e --- /dev/null +++ b/api/update/icons/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/font.svg b/api/update/icons/font.svg new file mode 100644 index 00000000..9886d27c --- /dev/null +++ b/api/update/icons/font.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/gift.svg b/api/update/icons/gift.svg new file mode 100644 index 00000000..ada83f3c --- /dev/null +++ b/api/update/icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/gradient.svg b/api/update/icons/gradient.svg new file mode 100644 index 00000000..b60fe149 --- /dev/null +++ b/api/update/icons/gradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/logo.svg b/api/update/icons/logo.svg new file mode 100644 index 00000000..e5f60834 --- /dev/null +++ b/api/update/icons/logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/update/icons/nocloud.svg b/api/update/icons/nocloud.svg new file mode 100644 index 00000000..b550d987 --- /dev/null +++ b/api/update/icons/nocloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/opacity.svg b/api/update/icons/opacity.svg new file mode 100644 index 00000000..4f91c12a --- /dev/null +++ b/api/update/icons/opacity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/outline.svg b/api/update/icons/outline.svg new file mode 100644 index 00000000..76653e2b --- /dev/null +++ b/api/update/icons/outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/reaction.svg b/api/update/icons/reaction.svg new file mode 100644 index 00000000..939ef3e1 --- /dev/null +++ b/api/update/icons/reaction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/record.svg b/api/update/icons/record.svg new file mode 100644 index 00000000..19a6067a --- /dev/null +++ b/api/update/icons/record.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/shapes.svg b/api/update/icons/shapes.svg new file mode 100644 index 00000000..b0546afa --- /dev/null +++ b/api/update/icons/shapes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/thumbnail.svg b/api/update/icons/thumbnail.svg new file mode 100644 index 00000000..ba07ba78 --- /dev/null +++ b/api/update/icons/thumbnail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/upload.svg b/api/update/icons/upload.svg new file mode 100644 index 00000000..ebd22086 --- /dev/null +++ b/api/update/icons/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/variable.svg b/api/update/icons/variable.svg new file mode 100644 index 00000000..73a6a993 --- /dev/null +++ b/api/update/icons/variable.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/index.js b/api/update/index.js new file mode 100644 index 00000000..06da0a1a --- /dev/null +++ b/api/update/index.js @@ -0,0 +1,147 @@ +function getPageType() { + let url = new URL(window.location.href); + if (document.querySelector("#page-404")) { + return null; + } else if (url.pathname.startsWith("/projects/")) { + return "project"; + } else if (url.pathname.startsWith("/discuss/")) { + return "forum"; + } else { + return "website"; + } +} + +async function checkUpdate() { + let version = chrome.runtime.getManifest().version; + let { updateScreens } = await chrome.storage.sync.get("updateScreens"); + + if (updateScreens) { + let page = getPageType(); + + if (page && updateScreens[page] !== version) { + updateScreens[page] = version; + await chrome.storage.sync.set({ + updateScreens, + }); + let update = await ( + await fetch( + chrome.runtime.getURL(`/api/update/changelogs/${page}.json`) + ) + ).json(); + if (update.active) { + makeScreen(update); + } + } + } else { + await chrome.storage.sync.set({ + updateScreens: { + website: "0", + project: "0", + forum: "0", + }, + }); + // checkUpdate() + } +} +// checkUpdate(); + +function makeScreen(update) { + return + console.log(update); + if (document.querySelector(".ste-update-bg")) return; + let background = Object.assign(document.createElement("div"), { + className: "ste-update-bg", + }); + + let div = Object.assign(document.createElement("div"), { + className: "ste-update-box", + }); + + let topRow = document.createElement("div"); + topRow.append( + Object.assign(document.createElement("img"), { + src: chrome.runtime.getURL("/api/update/icons/logo.svg"), + }) + ); + div.appendChild(topRow); + + let h2 = document.createElement("h2"); + buildText(h2, update.title); + div.appendChild(h2); + + let p = document.createElement("p"); + p.textContent = update.description; + div.appendChild(p); + + let b = document.createElement("b"); + b.textContent = " Here's what's new:"; + p.appendChild(b); + + let rows = Object.assign(document.createElement("div"), { + className: "rows", + }); + + for (var i in update.changes) { + let row = document.createElement("div"); + let img = document.createElement("img"); + img.src = chrome.runtime.getURL( + `/api/update/icons/${update.changes[i].icon}` + ); + let slogan = document.createElement("p"); + slogan.textContent = update.changes[i].slogan; + row.append(img, slogan); + rows.appendChild(row); + } + + div.appendChild(rows); + + let viewMore = document.createElement("div"); + viewMore.className = "view-more"; + let viewMoreSpan = viewMore.appendChild( + Object.assign(document.createElement("span"), { + textContent: "View All", + }) + ); + div.appendChild(viewMore); + + viewMoreSpan.addEventListener("click", function () { + viewMore.remove(); + rows.style.maxHeight = "none"; + }); + + let button = document.createElement("button"); + button.textContent = "Continue"; + button.addEventListener("click", function () { + background.remove(); + div.remove(); + }); + background.addEventListener("click", function () { + div.remove(); + background.remove(); + }); + div.appendChild(button); + + document.body.appendChild(div); + document.body.appendChild(background); +} + +function buildText(element, title) { + let blocks = title.split("{{ version }}"); + console.log(blocks); + + for (var i in blocks) { + let span = document.createElement("span"); + span.textContent = blocks[i]; + element.appendChild(span); + + if (Number(i) !== Number(blocks.length - 1)) { + console.log(i); + let version = document.createElement("span"); + version.textContent = "v" + chrome.runtime.getManifest().version; + version.className = "color"; + element.appendChild(version); + } + } + + return; +} diff --git a/api/update/style.css b/api/update/style.css new file mode 100644 index 00000000..7d61ba7e --- /dev/null +++ b/api/update/style.css @@ -0,0 +1,138 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter&display=swap"); + +.ste-update-bg { + display: block; + position: fixed; + left: 0px; + top: 0px; + z-index: 2147483646; + width: 100vw; + height: 100vh; + background: #00000080; +} + +.ste-update-box { + all: unset; /* Reset inherited styles */ + box-sizing: border-box; + position: fixed; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + background: white; + padding: 32px; + border-radius: 12.8px; + z-index: 2147483647; + width: calc(40 * 16px); + max-width: calc(100% - calc(8 * 16px)); + max-height: calc(100% - calc(8 * 16px)); + overflow-y: auto; + font-size: 16px; + line-height: 20px; +} + +.ste-update-box > div:first-child img { + height: calc(2 * 16px); + float: right; +} + +.ste-update-box * { + font-family: "Inter", sans-serif !important; + text-shadow: none !important; +} + +.ste-update-box h2 { + position: relative; + top: calc(.4 * -16px); + margin-bottom: 20px; + color: black; + font-size: calc(2 * 16px); +} + +.ste-update-box .rows div { + display: flex; + vertical-align: middle; + margin-bottom: calc(2 * 16px); + align-items: center; + break-inside: avoid +} + +.ste-update-box h2 span.color { + background: -webkit-linear-gradient(#ff8c2d, #ffb740); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.ste-update-box .rows div p { + color: black; + margin: 0px; + font-weight: 600; + font-size: calc(1 * 16px); + margin-left: calc(.8 * 16px); +} + +.ste-update-box > p { + color: black; + opacity: .6; + margin-top: 0px; + margin-bottom: calc(1 * 16px); + position: relative; + top: calc(1 * -16px); +} + +.ste-update-box > p > b { + font-weight: 600; +} + +.ste-update-box .rows img { + height: calc(2 * 16px); +} + +.ste-update-box .rows { + column-count: 2; + column-gap: calc(2 * 16px); + margin-bottom: calc(2 * 16px); + max-height: calc(14 * 16px); + overflow-y: hidden; +} + +.ste-update-box > button { + background: linear-gradient(0.25turn, #ff8c2d, #ffb740); + color: white; + width: 100%; + outline: none; + border: 0px; + padding: calc(.8 * 16px); + border-radius: calc(.5 * 16px); + cursor: pointer; + font-weight: 600; + transition: background .3s, opacity .3s; + line-height: 24px; + height: 48px; + font-size: 16px; +} + +.ste-update-box > button:hover { + background: linear-gradient(0.25turn, #ffb740, #ff8c2d); + opacity: .7; +} + +.ste-update-box .view-more { + height: calc(5 * 16px); + width: 100%; + background: linear-gradient(360deg, white, transparent); + position: relative; + top: calc(-8 * 16px); + margin-bottom: calc(-4 * 16px); +} + +.ste-update-box .view-more span { + position: absolute; + left: 50%; + top: calc(50% + calc(3 * 16px)); + transform: translateX(-50%) translateY(-150%); + font-size: calc(1 * 16px); + font-weight: 600; + color: black; + opacity: .65; + cursor: pointer; +} \ No newline at end of file diff --git a/api/vm.js b/api/vm.js index 8bf344cc..e4145c0d 100644 --- a/api/vm.js +++ b/api/vm.js @@ -3,14 +3,7 @@ ScratchTools.Scratch = { blockly: null, }; try { - ScratchTools.Scratch.vm = - window.vm || - (() => { - const app = document.querySelector("#app"); - return app[ - Object.keys(app).find((key) => key.startsWith("__reactContainer")) - ].child.stateNode.store.getState().scratchGui.vm; - })(); + ScratchTools.Scratch.vm = window.vm || window.__steTraps._onceMap.vm; ste.console.log("Able to load Virtual Machine.", "ste-traps"); } catch (err) { ste.console.warn("Unable to load Virtual Machine.", "ste-traps"); @@ -28,11 +21,16 @@ try { ScratchTools.Scratch.scratchSound = function () { try { - return document.querySelector("div.sound-editor_editor-container_iUSW-")[ + let rI = document.querySelector("[class^=sound-editor_editor-container]")[ Object.keys( - document.querySelector("div.sound-editor_editor-container_iUSW-") - ).find((key) => key.startsWith("__reactInternalInstance")) - ].return.return.return.stateNode; + document.querySelector("[class^=sound-editor_editor-container]") + ).find((key) => key.startsWith("__reactFiber")) + ]; + + while (!rI.stateNode?.audioBufferPlayer) { + rI = rI.return; + } + return rI.stateNode; } catch (err) { return null; } @@ -40,10 +38,7 @@ ScratchTools.Scratch.scratchSound = function () { ScratchTools.Scratch.scratchGui = function () { try { - const app = document.querySelector("#app"); - return app[ - Object.keys(app).find((key) => key.startsWith("__reactContainer")) - ].child.stateNode.store.getState().scratchGui; + return window.__steRedux.state.scratchGui; } catch (err) { return null; } @@ -176,46 +171,42 @@ ScratchTools.Scratch.waitForContextMenu = function (info) { }; ScratchTools.Scratch.scratchPaint = function () { - var app = document.querySelector(".paint-editor_mode-selector_28iiQ"); - if (app !== null) { - return ( - app[ - Object.keys(app).find((key) => - key.startsWith("__reactInternalInstance") - ) - ].child.stateNode.store.getState()?.scratchPaint || null - ); - } else { + try { + return __steRedux.state.scratchPaint; + } catch (err) { return null; } }; -ScratchTools.Scratch.getPaper = function () { - let paintElement = document.querySelector( - "[class*='paint-editor_mode-selector']" - ); - let paintState = - paintElement[ - Object.keys(paintElement).find((key) => - key.startsWith("__reactInternalInstance") - ) - ].child; +window.__paperCache = null + +async function getPaper() { + const modeSelector = document.querySelector("[class*='paint-editor_mode-selector']"); + const internalState = modeSelector[Object.keys(modeSelector).find((el) => el.startsWith("__reactFiber"))].child; + let toolState = internalState; let tool; - while (paintState) { - let paintIn = paintState.child?.stateNode; - if (paintIn?.tool) { - tool = paintIn.tool; + while (toolState) { + const toolInstance = toolState.child.child.stateNode; + if (toolInstance.tool) { + tool = toolInstance.tool; break; } - if (paintIn?.blob && paintIn?.blob.tool) { - tool = paintIn.blob.tool; + if (toolInstance.blob && toolInstance.blob.tool) { + tool = toolInstance.blob.tool; break; } - paintState = paintState.sibling; + toolState = toolState.sibling; } if (tool) { - return tool._scope; + const paperScope = tool._scope; + window.__paperCache = paperScope + return paperScope; } + return null +} + +ScratchTools.Scratch.getPaper = async function () { + return await getPaper() }; async function alertForUpdates() { @@ -240,19 +231,51 @@ async function alertForUpdates() { } } -function getScratchBlocks() { - var blocksWrapper = document.querySelector( - 'div[class^="gui_blocks-wrapper"]' - ); - var key = Object.keys(blocksWrapper).find((key) => - key.startsWith("__reactInternalInstance$") - ); - const internal = blocksWrapper[key]; - var recent = internal.child; - while (!recent.stateNode?.ScratchBlocks) { - recent = recent.child; +window.__steScratchBlocks = null + +async function _getBlocksWrapperComponent() { + const BLOCKS_CLASS = '[class^="gui_blocks-wrapper"]'; + let elem = document.querySelector(BLOCKS_CLASS); + if (!elem) { + elem = document.querySelector(BLOCKS_CLASS); } - return recent.stateNode.ScratchBlocks || null; + return _getBlocksComponent(elem); +} + +function _getBlocksComponent(wrapper) { + const internal = wrapper[getInternalKey(wrapper)]; + let childable = internal; + while (((childable = childable.child), !childable || !childable.stateNode || !childable.stateNode.ScratchBlocks)) {} + return childable; +} + +function getInternalKey(elem) { + return Object.keys(elem).find((key) => key.startsWith("__react")) +} + +function _getBlocksComponent(wrapper) { + const internal = wrapper[getInternalKey(wrapper)]; + let childable = internal; + while (((childable = childable.child), !childable || !childable.stateNode || !childable.stateNode.ScratchBlocks)) {} + return childable; +} + +async function getBlockly() { + const childable = await _getBlocksWrapperComponent(); + return childable.stateNode.ScratchBlocks +} + +window.__steRedux.target.addEventListener("statechanged", async function() { + try { + let blockly = await getBlockly() + if (blockly) { + window.__steScratchBlocks = blockly + } + } catch(err) {} +}) + +function getScratchBlocks() { + return window.__steScratchBlocks } ScratchTools.waitForElements( diff --git a/build/index.js b/build/index.js new file mode 100644 index 00000000..152e7566 --- /dev/null +++ b/build/index.js @@ -0,0 +1 @@ +require("./write-permissions") \ No newline at end of file diff --git a/build/write-permissions.js b/build/write-permissions.js new file mode 100644 index 00000000..b1136f1a --- /dev/null +++ b/build/write-permissions.js @@ -0,0 +1,26 @@ +const fs = require("fs") +let features = JSON.parse(fs.readFileSync("./features/features.json")) +let manifest = JSON.parse(fs.readFileSync("./manifest.json")) +let permissions = ["https://api.scratch.mit.edu"] + +for (var i in features) { + if (features[i].version === 2) { + let feature = JSON.parse(fs.readFileSync(`./features/${features[i].id}/data.json`)) + if (feature.permissions) { + permissions.push(...feature.permissions.filter((perm) => !permissions.includes(perm))) + } + } +} + +manifest.optional_permissions = permissions.filter((perm) => !checkUrl(perm)) +manifest.optional_host_permissions = permissions.filter((perm) => checkUrl(perm)) +fs.writeFileSync("./manifest.json", JSON.stringify(manifest, null, 2), 'utf8'); + +function checkUrl(perm) { + try { + new URL(perm); + return true; + } catch (_) { + return false; + } +} \ No newline at end of file diff --git a/changelog/changes.json b/changelog/changes.json index 99424d0e..ff855a02 100644 --- a/changelog/changes.json +++ b/changelog/changes.json @@ -1,12 +1,25 @@ { "NOTE": "THERE IS NO NEED TO UPDATE THIS YOURSELF, IT WILL BE UPDATED WHEN RELEASED.", - "version": "3.8.0", + "version": "3.9.0", "enhanced": [ - "Update contributor names.", - "Add clicker game." + "Better feature options.", + "Add a selection option for feature settings.", + "Use images for Flag on Profile feature.", + "Improved wording for Summarized Descriptions comment text.", + "Improved wording for Project Miniplayer options.", + "Technical: Add manifest schema to VSCode settings.", + "Technical: update README instructions.", + "Technical: update issue templates.", + "Technical: add feature.page API." ], "fixed": [ - "Fix protect mention text.", - "Fix search bar." + "Fix Summarized Descriptions button placement.", + "Fix Select Self adding clones to dropdown.", + "Fix Summarized Descriptions overlapping with text.", + "Fix Block Count in My Stuff not working.", + "Fix popup search bar.", + "Remove a few features that reply on Scratch DB.", + "Fix Select Self when reenabled.", + "Minor selection option fixes." ] } \ No newline at end of file diff --git a/class-names.json b/class-names.json new file mode 100644 index 00000000..19886986 --- /dev/null +++ b/class-names.json @@ -0,0 +1,74 @@ +[ + { + "className": "ste-search-user", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-search-user-pfp", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-search-user-data", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-search-user-username", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-search-user-bio", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-search-user-btn", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-search-border-top", + "features": [ + "advanced-search" + ] + }, + { + "className": "ste-formatted-newline-comment", + "features": [ + "comment-newlines" + ] + }, + { + "className": "ste-mutual-following-container", + "features": [ + "mutual-following" + ] + }, + { + "className": "ste-mutual-followers-container", + "features": [ + "mutual-following" + ] + }, + { + "className": "ste-real-profile-date", + "features": [ + "real-date" + ] + }, + { + "className": "ste-hide-ago-real-date", + "features": [ + "real-date" + ] + } +] \ No newline at end of file diff --git a/extras/background.js b/extras/background.js index bd33d7c9..9c6a10d5 100644 --- a/extras/background.js +++ b/extras/background.js @@ -49,8 +49,7 @@ async function checkBetaUpdates() { ).json(); if ( data.version !== chrome.runtime.getManifest().version_name || - (await (await fetch("/changelog/beta.json")).json()).beta !== - data.beta + (await (await fetch("/changelog/beta.json")).json()).beta !== data.beta ) { // chrome.tabs.create({ // url: "/extras/beta/index.html", @@ -64,6 +63,7 @@ if (chrome.runtime.getManifest().version_name.endsWith("-beta")) { } chrome.runtime.onInstalled.addListener(async function (object) { + checkApril(); try { var featureData = await (await fetch("/features/features.json")).json(); } catch (err) { @@ -671,12 +671,17 @@ chrome.runtime.onMessageExternal.addListener(async function ( } if (msg.msg === "openPong") { await chrome.tabs.create({ - url: "/api/april/pong/index.html?username=" + msg.username + "&id=" + msg.id, + url: + "/api/april/pong/index.html?username=" + msg.username + "&id=" + msg.id, }); } if (msg.msg === "openDashboardPage") { await chrome.tabs.create({ - url: "/extras/dashboard/index.html?code=" + msg.token + "&username=" + msg.username, + url: + "/extras/dashboard/index.html?code=" + + msg.token + + "&username=" + + msg.username, }); chrome.tabs.remove(sender.tab.id, function () {}); } @@ -691,6 +696,30 @@ chrome.runtime.onMessageExternal.addListener(async function ( url: "/extras/index.html", }); } + if (msg === "returnToTab") { + await chrome.tabs.update(sender.tab.id, { active: true }); + } + if (msg.source === "message-api") { + if (msg.message?.startsWith("request-perms")) { + let perms = msg.content; + + chrome.permissions.request({ permissions: perms }, async (granted) => { + let isComplete = !!granted; + + await chrome.scripting.executeScript({ + args: [isComplete, msg.uuid], + target: { tabId: sender.tab.id }, + func: sendPermsResponse, + world: "MAIN", + }); + function sendPermsResponse(completed, uuid) { + ScratchTools.MESSAGES.find((el) => el.uuid === uuid).resolve( + completed + ); + } + }); + } + } if (typeof msg === "object") { if (msg.message === "storageSet") { await chrome.storage.sync.set({ [msg.key]: msg.value }); @@ -797,7 +826,32 @@ chrome.runtime.onMessage.addListener(async function ( } }); +async function checkApril() { + if (new Date().getMonth() === 3 && new Date().getDate() === 1) { + let features = (await chrome.storage.sync.get("features"))?.features || ""; + if (!features.includes("random-block-colors")) { + await chrome.storage.sync.set({ aprilAutomatic2025: true }); + features = features + ".random-block-colors"; + await chrome.storage.sync.set({ features }); + } + } else { + let aprilAutomatic = (await chrome.storage.sync.get("aprilAutomatic2025")) + ?.aprilAutomatic2025; + + if (aprilAutomatic) { + let features = + (await chrome.storage.sync.get("features"))?.features || ""; + if (features.includes("random-block-colors")) { + features = features.replaceAll("random-block-colors", ""); + await chrome.storage.sync.set({ features }); + await chrome.storage.sync.set({ aprilAutomatic2025: false }); + } + } + } +} + chrome.alarms.onAlarm.addListener(async function () { + checkApril(); chrome.alarms.clearAll(); chrome.alarms.create("test", { delayInMinutes: 0.5, diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 3ae9dae4..e1629d06 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"relevant-forum-posts/title":{"message":"Show Relevant Forum Posts"},"relevant-forum-posts/description":{"message":"When creating a new forum topic, shows other topics that may be similar to what you are creating."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"important-messages/title":{"message":"Important Messages"},"important-messages/description":{"message":"Separate important messages on the messages page."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"user-stats/title":{"message":"Show User Statistics"},"user-stats/description":{"message":"Replaces the 'What I've been doing' section on a profile page with the user's statistics."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"real-date/title":{"message":"Real Profile Join Dates"},"real-date/description":{"message":"Displays the real join date on profiles instead of the relative times."},"comment-newlines/title":{"message":"Comment Newlines"},"comment-newlines/description":{"message":"Allows you to view and use multiple lines in comments, rather than just one row of text."},"recent-followers-and-following/title":{"message":"Show Recent Followers and Followings"},"recent-followers-and-following/description":{"message":"Displays the most recent followers and followings of a user on their profile page."},"picture-in-picture/title":{"message":"Picture in Picture"},"picture-in-picture/description":{"message":"Adds a button to the project page that allows you to open the stage up and continue to view it while using other tabs or apps."},"mutual-following/title":{"message":"Mutual Following"},"mutual-following/description":{"message":"See your mutual following with other users on their profiles."},"studio-invite-comments/title":{"message":"Invite to Studio from Comments"},"studio-invite-comments/description":{"message":"Adds an invite option next to report on studio comments."},"copy-paste-lists/title":{"message":"Copy and Paste Lists"},"copy-paste-lists/description":{"message":"Allows you to right-click on lists on the stage to copy and paste large amounts of items."},"random-block-colors/title":{"message":"Random Block Colors"},"random-block-colors/description":{"message":"Swaps around the colors of all the blocks each time you press the green flag!"},"remove-confirmation/title":{"message":"Remove Delete Confirmation"},"remove-confirmation/description":{"message":"Removes the delete confirmation prompt when deleting sprites in the Scratch editor."},"outline-shape-options/title":{"message":"Customizable Shape Outlines"},"outline-shape-options/description":{"message":"Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round."},"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from countries that speak other languages less visible."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Turns the Front Page Curator's name into a clickable link to their profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file diff --git a/extras/feature-locales/es.json b/extras/feature-locales/es.json index 7bac9ccf..096dc77d 100644 --- a/extras/feature-locales/es.json +++ b/extras/feature-locales/es.json @@ -1,37 +1,29 @@ { - "fullscreen-explorer/title": { - "message": "Cuadrículas de proyectos de pantalla completa" - }, - "fullscreen-explorer/description": { - "message": "Encuentre proyectos en la pantalla grande eliminando los espacios en blanco izquierdo y derecho en las páginas Tendencias, Búsqueda y Remezcla." - }, - "total-stats/title": { - "message": "Estadísticas totales de usuarios" - }, - "total-stats/description": { - "message": "Junto a los proyectos compartidos en el perfil de un usuario, se muestra el total de amores, favoritos y vistas que el usuario ha recibido en todos sus proyectos compartidos." - }, - "project-miniplayer/title": { - "message": "Minijugador del proyecto" + "stage-in-spritepane/title": { "message": "Etapa en el panel de sprites" }, + "stage-in-spritepane/description": { + "message": "Mueva el botón de escenario al panel de sprites para ampliar el campo de sprites." }, - "project-miniplayer/description": { - "message": "Desplázate hacia abajo en la página del proyecto y verás automáticamente el minireproductor del proyecto." - }, - "project-descriptions/title": { - "message": "Descripciones resumidas" + "better-cloud-history/title": { "message": "Mejor historial de la nube" }, + "better-cloud-history/description": { + "message": "Actualiza la página del monitor de la nube a una versión más moderna con más detalles. Puede hacer clic en los nombres de las variables para ordenar por esa variable." }, - "project-descriptions/description": { - "message": "Utiliza inteligencia artificial para resumir las descripciones de los proyectos cuando lo desees, y acorta las descripciones largas a información importante, como las instrucciones del juego." + "sprite-layers/title": { "message": "Ver capas de sprites" }, + "sprite-layers/description": { + "message": "Le permite pasar el cursor sobre la opción mostrar/ocultar en el panel de propiedades de sprites del editor para ver las capas de sprites." }, - "pin-comments/title": { - "message": "Anclar comentarios del proyecto" + "hide-project-tags/title": { "message": "Ocultar etiquetas de proyecto" }, + "hide-project-tags/description": { + "message": "Oculta todas las etiquetas de las Instrucciones/Notas y Créditos de los proyectos." }, - "pin-comments/description": { - "message": "Le permite anclar comentarios en sus propios proyectos y ver qué comentarios están anclados en otros proyectos." + "snap-to-grid/title": { "message": "Ajustar scripts a la cuadrícula" }, + "snap-to-grid/description": { + "message": "Alinea automáticamente los guiones con la cuadrícula de puntos en el editor cuando se colocan." }, - "sidebar/title": { - "message": "Barra lateral" + "select-self/title": { "message": "Seleccione el sprite actual" }, + "select-self/description": { + "message": "Le permite seleccionar el sprite actual al abrir menús desplegables de sprites, en lugar de solo otros sprites." }, + "sidebar/title": { "message": "Barra lateral" }, "sidebar/description": { "message": "Agrega una barra lateral a la página de Scratch, en vez de sólo la barra de navegación en la parte superior de la pantalla." }, @@ -41,57 +33,61 @@ "project-version-detector/description": { "message": "Comprueba cuándo se ha compartido un proyecto y añade una etiqueta junto a la fecha de uso compartido para indicar qué versión de Scratch estaba en uso en ese momento." }, - "download-project/title": { - "message": "Descargar Proyectos" + "fullscreen-explorer/title": { + "message": "Cuadrículas de proyectos de pantalla completa" + }, + "fullscreen-explorer/description": { + "message": "Encuentre proyectos en la pantalla grande eliminando los espacios en blanco izquierdo y derecho en las páginas Tendencias, Búsqueda y Remezcla." + }, + "project-descriptions/title": { "message": "Descripciones resumidas" }, + "project-descriptions/description": { + "message": "Utiliza inteligencia artificial para resumir las descripciones de los proyectos cuando lo desees, y acorta las descripciones largas a información importante, como las instrucciones del juego." + }, + "total-stats/title": { "message": "Estadísticas totales de usuarios" }, + "total-stats/description": { + "message": "Junto a los proyectos compartidos en el perfil de un usuario, se muestra el total de amores, favoritos y vistas que el usuario ha recibido en todos sus proyectos compartidos." + }, + "project-miniplayer/title": { "message": "Minijugador del proyecto" }, + "project-miniplayer/description": { + "message": "Desplázate hacia abajo en la página del proyecto y verás automáticamente el minireproductor del proyecto." + }, + "pin-comments/title": { "message": "Anclar comentarios del proyecto" }, + "pin-comments/description": { + "message": "Le permite anclar comentarios en sus propios proyectos y ver qué comentarios están anclados en otros proyectos." }, + "download-project/title": { "message": "Descargar Proyectos" }, "download-project/description": { "message": "Agrega un botón en los proyectos que te permite descargar el proyecto como un archivo sb3." }, - "blur-modal/title": { - "message": "Borronear fondos modales" - }, + "blur-modal/title": { "message": "Borronear fondos modales" }, "blur-modal/description": { "message": "Borronea los fondos de los modales en lugar de tener una superposición de color." }, - "quick-search/title": { - "message": "Búsqueda rápida" - }, + "quick-search/title": { "message": "Búsqueda rápida" }, "quick-search/description": { "message": "Salta entre páginas fácilmente en la página web de Scratch con Control + K." }, - "favicon-messages/title": { - "message": "Contador de mensajes" - }, + "favicon-messages/title": { "message": "Contador de mensajes" }, "favicon-messages/description": { "message": "Muestra el contador de mensajes en el logo de Scratch en la esquina superior izquierda del menú principal." }, - "show-emoji-names/title": { - "message": "Mostrar los nombres de los emojis" - }, + "show-emoji-names/title": { "message": "Mostrar los nombres de los emojis" }, "show-emoji-names/description": { "message": "Te permite ver los nombres de los emojis en los comentarios cuando pases el cursor por encima de ellos." }, - "more-block-themes/title": { - "message": "Más temáticas para bloques" - }, + "more-block-themes/title": { "message": "Más temáticas para bloques" }, "more-block-themes/description": { "message": "Agrega temáticas adicionales en el editor de bloques." }, - "more-key-inputs/title": { - "message": "Más entradas de teclas" - }, + "more-key-inputs/title": { "message": "Más entradas de teclas" }, "more-key-inputs/description": { "message": "Agrega soporte para más teclas en los bloques de \"tecla presionada\"." }, - "comment-tags/title": { - "message": "Etiquetas para comentarios del editor" - }, + "comment-tags/title": { "message": "Etiquetas para comentarios del editor" }, "comment-tags/description": { "message": "Agrega etiquetas a los comentarios del editor para organizarlos fácilmente." }, - "profile-flag/title": { - "message": "Bandera en el perfil" - }, + "profile-flag/title": { "message": "Bandera en el perfil" }, "profile-flag/description": { "message": "Agrega emojis de banderas cerca de ubicaciones seleccionadas en las páginas de perfil." }, @@ -101,9 +97,7 @@ "follow-on-projects/description": { "message": "Sigue a usuarios directamente desde la página de un proyecto en vez de yendo hacia su perfil." }, - "dark-paint-editor/title": { - "message": "Cambiar tono del fondo del editor" - }, + "dark-paint-editor/title": { "message": "Cambiar tono del fondo del editor" }, "dark-paint-editor/description": { "message": "Agrega un botón al lado de los controles de zoom en el editor de sprites que te permite cambiar el tono de su fondo entre claro y oscuro." }, @@ -113,159 +107,103 @@ "specific-replies/description": { "message": "En los mensajes relacionados a comentarios, se especifica a quién un comentario estaba respondiendo." }, - "better-trending-thumbnails/title": { - "message": "Miniaturas más grandes" - }, + "better-trending-thumbnails/title": { "message": "Miniaturas más grandes" }, "better-trending-thumbnails/description": { "message": "Actualiza las miniaturas en la página de tendencias y búsqueda para que sean más grandes y encajen mejor en el cuadro del proyecto." }, - "relevant-forum-posts/title": { - "message": "Mostrar publicaciones del foro relevantes" - }, - "relevant-forum-posts/description": { - "message": "Al crear un nuevo tema en el foro, muestra otros temas que pueden ser similares al tuyo." - }, - "anti-generic/title": { - "message": "Anti-genérico" - }, + "anti-generic/title": { "message": "Anti-genérico" }, "anti-generic/description": { "message": "En las páginas de explorar y tendencia, esta función beta automácitamente esconde proyectos repetitivos, junto con proyectos que parecen genéricos. Esto incluye proyectos con muchas etiquetas, nombres comúnes, y proyectos duplicados." }, - "wrap-lists/title": { - "message": "Romper ítems en las listas" - }, + "wrap-lists/title": { "message": "Romper ítems en las listas" }, "wrap-lists/description": { "message": "Muestra el texto en los ítems de las listas normalmente sin cortarlos si son demasiado largos." }, - "live-stats/title": { - "message": "Estadísticas en tiempo real" - }, + "live-stats/title": { "message": "Estadísticas en tiempo real" }, "live-stats/description": { "message": "Actualiza en tiempo real los corazones, favoritos, remixes y vistas en un proyecto, sin tener que refrescar la página para actualizarlo." }, - "hide-scratch-news/title": { - "message": "Esconder las Noticias de Scratch" - }, + "hide-scratch-news/title": { "message": "Esconder las Noticias de Scratch" }, "hide-scratch-news/description": { "message": "Esconde la sección de \"Noticias de Scratch\" en la página principal de Scratch." }, - "watch-later/title": { - "message": "Guardar para ver más tarde" - }, + "watch-later/title": { "message": "Guardar para ver más tarde" }, "watch-later/description": { "message": "Te permite guardar proyectos que quieras ver luego, y aparecerán en una página Ver más tarde." }, - "remove-project-button/title": { - "message": "Botón para eliminar proyecto" - }, + "remove-project-button/title": { "message": "Botón para eliminar proyecto" }, "remove-project-button/description": { "message": "Agrega un botón a los proyectos en los Estudios, que te permite fácilmente eliminarlos de ellos sin tener que abrir el menú." }, - "right-side-flag/title": { - "message": "Bandera verde en la derecha" - }, + "right-side-flag/title": { "message": "Bandera verde en la derecha" }, "right-side-flag/description": { "message": "Mueve la bandera verde y el ícono de detener hacia el lado derecho del escenario." }, - "love-fave-animate/title": { - "message": "Animaciones a los corazones" - }, + "love-fave-animate/title": { "message": "Animaciones a los corazones" }, "love-fave-animate/description": { "message": "Al hacer clic en el corazón y el favorito en los proyectos, estos serán animados." }, - "default-to-local/title": { - "message": "Local por defecto" - }, + "default-to-local/title": { "message": "Local por defecto" }, "default-to-local/description": { "message": "Al crear una nueva variable, establece el modo predeterminado de ella como \"Sólo para este sprite\", en vez de \"Para todos los sprites\"." }, - "start-stop-hotkeys/title": { - "message": "Atajos para la bandera verde" - }, + "start-stop-hotkeys/title": { "message": "Atajos para la bandera verde" }, "start-stop-hotkeys/description": { "message": "Presiona Control + G para comenzar o detener un proyecto, dependiendo de si este está en curso o no." }, - "opacity-slider/title": { - "message": "Barra de opacidad" - }, + "opacity-slider/title": { "message": "Barra de opacidad" }, "opacity-slider/description": { "message": "Agrega una barra deslizante en el editor de sprites que te permite cambiar la opacidad de ellos." }, - "more-studios/title": { - "message": "Más estudios" - }, + "more-studios/title": { "message": "Más estudios" }, "more-studios/description": { "message": "Te permite agregar proyectos a más estudios en lugar de 20." }, - "localized-explore/title": { - "message": "Proyectos de tu país" - }, + "localized-explore/title": { "message": "Proyectos de tu país" }, "localized-explore/description": { "message": "En la página de Explorar, hace menos visibles a los proyectos que provienen de otros países. Esto es para sólo mostrar proyectos que tú entiendas." }, - "project-bar/title": { - "message": "Barra de proyecto" - }, + "project-bar/title": { "message": "Barra de proyecto" }, "project-bar/description": { "message": "Continúa viendo la información de un proyecto, incluso luego de que hayas deslizado tras las notas y créditos." }, - "more-news/title": { - "message": "Más Noticias de Scratch" - }, + "more-news/title": { "message": "Más Noticias de Scratch" }, "more-news/description": { "message": "En la página principal, podrás deslizar por la sección de Noticias de Scratch y cargar más resultados." }, - "dumpster-fire/title": { - "message": "Basurero en llamas" - }, + "dumpster-fire/title": { "message": "Basurero en llamas" }, "dumpster-fire/description": { "message": "La página principal de Scratch es mentirosa con su sección de \"Proyectos destacados\". Esto le cambia su nombre a uno mucho más adecuado." }, - "steal-game/title": { - "message": "Robar juego" - }, + "steal-game/title": { "message": "Robar juego" }, "steal-game/description": { "message": "Cambia el texto del botón de Remix a \"Robar juego\"." }, - "statistics/title": { - "message": "Estadísticas" - }, + "statistics/title": { "message": "Estadísticas" }, "statistics/description": { "message": "Añade un botón de estadísticas en la página de \"Mis Cosas\" que enlaza a tu perfil de ScratchStats." }, - "echo-effect/title": { - "message": "Efecto de eco" - }, + "echo-effect/title": { "message": "Efecto de eco" }, "echo-effect/description": { "message": "Añade el efecto de eco de vuelta al editor de sonido de Scratch." }, - "compact-buttons/title": { - "message": "Botones compactos" - }, + "compact-buttons/title": { "message": "Botones compactos" }, "compact-buttons/description": { "message": "El texto de los botones es eliminado y recibe un nuevo icono si no lo tiene." }, - "message-count/title": { - "message": "Contador de mensajes" - }, + "message-count/title": { "message": "Contador de mensajes" }, "message-count/description": { "message": "Muestra el contador de mensajes de el usuario al lado de su país." }, - "move-share-button/title": { - "message": "Mover botón de compartir" - }, + "move-share-button/title": { "message": "Mover botón de compartir" }, "move-share-button/description": { "message": "En la página del proyecto, mueve el botón de compartir al lado de el botón de \"Ver dentro\"" }, - "preview-textboxes/title": { - "message": "Vista previa de cuadros de texto" - }, + "preview-textboxes/title": { "message": "Vista previa de cuadros de texto" }, "preview-textboxes/description": { "message": "Tenga una vista previa de tus apartados de \"Acerca de mí\" y \"En qué estoy trabajando\" y las Instrucciones y Notas y Créditos de tus proyectos para ver como se ve para otros usuarios." }, - "more-tutorials/title": { - "message": "Más tutoriales" - }, + "more-tutorials/title": { "message": "Más tutoriales" }, "more-tutorials/description": { "message": "En la página de Ideas, añade tutoriales adicionales de otros Scratchers." }, @@ -275,33 +213,19 @@ "simplify-action-buttons/description": { "message": "Muestra los botones de acción debajo de Notas y Créditos como sus iconos." }, - "slash-to-search/title": { - "message": "Barra para buscar" - }, + "slash-to-search/title": { "message": "Barra para buscar" }, "slash-to-search/description": { "message": "Pulse la tecla de barra (/) para seleccionar la barra de búsqueda." }, - "shared-clipboard/title": { - "message": "Portapapeles compartido" - }, + "shared-clipboard/title": { "message": "Portapapeles compartido" }, "shared-clipboard/description": { "message": "Permite copiar y pegar entre editores de disfraces de distintos proyectos." }, - "important-messages/title": { - "message": "Mensajes importantes" - }, - "important-messages/description": { - "message": "Separa mensajes importantes en la página de mensajes." - }, - "hide-footer/title": { - "message": "Ocultar pie de página" - }, + "hide-footer/title": { "message": "Ocultar pie de página" }, "hide-footer/description": { "message": "El pie de página ocupa mucho espacio innecesario, !así que ocúltalo!" }, - "original-colors/title": { - "message": "Revertir a azul" - }, + "original-colors/title": { "message": "Revertir a azul" }, "original-colors/description": { "message": "Cambia todos los colores de la página web de Scratch de vuelta a el color original de 3.0, previo al morado." }, @@ -311,21 +235,15 @@ "simplify-editor-tabs/description": { "message": "Cambia las ventanas del editor a un icono en un circulo." }, - "live-character-counts/title": { - "message": "Contador de caracteres" - }, + "live-character-counts/title": { "message": "Contador de caracteres" }, "live-character-counts/description": { "message": "En foros, estudios y paginas de proyecto, muestra el contador de caracteres en los cuadros de texto." }, - "advanced-search/title": { - "message": "Buscar perfiles" - }, + "advanced-search/title": { "message": "Buscar perfiles" }, "advanced-search/description": { "message": "Cuando busques un usuario, un link a su perfil estará al principio de la página." }, - "studio-links/title": { - "message": "Enlaces de estudio como títulos" - }, + "studio-links/title": { "message": "Enlaces de estudio como títulos" }, "studio-links/description": { "message": "Reemplaza enlaces de estudio con sus títulos," }, @@ -335,51 +253,35 @@ "block-studios/description": { "message": "Desactiva los mensajes de actividad de estudios especificos." }, - "block-messages/title": { - "message": "Bloquear usuarios" - }, + "block-messages/title": { "message": "Bloquear usuarios" }, "block-messages/description": { "message": "Esconde mensajes de otros usuarios que has bloqueado. Otros usuarios no sabrán que los has bloqueado." }, - "two-colors/title": { - "message": "Colores 2.0 para bloques" - }, + "two-colors/title": { "message": "Colores 2.0 para bloques" }, "two-colors/description": { "message": "Reemplaza los colores de los bloques en el editor con los de la versión 2.0" }, - "project-links/title": { - "message": "Enlaces de proyecto como títulos" - }, + "project-links/title": { "message": "Enlaces de proyecto como títulos" }, "project-links/description": { "message": "Reemplaza enlaces de proyecto con sus títulos" }, - "emoji-status/title": { - "message": "Estados de emoji" - }, + "emoji-status/title": { "message": "Estados de emoji" }, "emoji-status/description": { "message": "Pon un emoji como estado de tu perfil. Otros usuarios de ScratchTools podrán ver este estado-" }, - "display-name/title": { - "message": "Nombres de muestra" - }, + "display-name/title": { "message": "Nombres de muestra" }, "display-name/description": { "message": "Muestra nombres de muestra para Scratchers y permite ponerte tu propio nombre de muestra. Los nombres de muestra están al lado de tu nombre de usuario y no están limitados como este." }, - "isonline/title": { - "message": "Mostrar si el usuario esta en línea" - }, + "isonline/title": { "message": "Mostrar si el usuario esta en línea" }, "isonline/description": { "message": "En las páginas de perfiles, muestra si un usuario está en línea. También mostrara a otros usuarios si tú estás en línea. " }, - "plain-background/title": { - "message": "Fondo plano" - }, + "plain-background/title": { "message": "Fondo plano" }, "plain-background/description": { "message": "Oculta los puntos del fondo de el editor de código." }, - "hide-advertisements/title": { - "message": "Ocultar anuncios en comentarios" - }, + "hide-advertisements/title": { "message": "Ocultar anuncios en comentarios" }, "hide-advertisements/description": { "message": "Esconde los anuncios en los comentarios de perfiles, proyectos y estudios. Pueden llegar a ocupar un gran espacio en los comentarios." }, @@ -389,9 +291,7 @@ "hide-block-category-names/description": { "message": "Cambia las categorías de bloques en el editor para solo mostrar los colores de las categorias." }, - "unlisted-projects/title": { - "message": "Proyectos ocultos" - }, + "unlisted-projects/title": { "message": "Proyectos ocultos" }, "unlisted-projects/description": { "message": "Le permite generar enlaces para compartir proyectos no compartidos en el editor." }, @@ -401,33 +301,23 @@ "stats-percentages/description": { "message": "En la página de \"Mis Cosas\", pon el ratón sobre el número de favoritos y número de corazones para ver el porcentaje de visitantes que hicieron la acción." }, - "clone-counter/title": { - "message": "Contador de clones" - }, + "clone-counter/title": { "message": "Contador de clones" }, "clone-counter/description": { "message": "Muestra el número total de clones encima del proyecto, en el encabezado de el escenario." }, - "colored-shadows/title": { - "message": "Sombras coloreadas" - }, + "colored-shadows/title": { "message": "Sombras coloreadas" }, "colored-shadows/description": { "message": "Reemplaza la sombra creada cuando arrastras un bloque cerca de otro bloque con el color del bloque que está siendo movido." }, - "creator-badge/title": { - "message": "Insignia de autor" - }, + "creator-badge/title": { "message": "Insignia de autor" }, "creator-badge/description": { "message": "Añade una insignia al lado de los comentarios escritos por el autor del proyecto" }, - "original-buttons/title": { - "message": "Botones originales" - }, + "original-buttons/title": { "message": "Botones originales" }, "original-buttons/description": { "message": "Trae devuelta los íconos originales de Me Gusta, Favorito, Reinventar y Vistas en las páginas de proyectos de Scratch." }, - "box-shadows/title": { - "message": "Sombras en los recuadros de contenido" - }, + "box-shadows/title": { "message": "Sombras en los recuadros de contenido" }, "box-shadows/description": { "message": "Agrega un sombreado a los contornos de todos los recuadros de contenido. El sombreado se hará más oscuro cuando pases el cursor por ellos." }, @@ -437,15 +327,11 @@ "admin-notifications/description": { "message": "Si tienes una notificación por parte del Equipo de Scratch, el indicador de mensajes será rojo en vez de naranja." }, - "nicknames/title": { - "message": "Apodos" - }, + "nicknames/title": { "message": "Apodos" }, "nicknames/description": { "message": "Ponle apodos a otros Scratchers. Solo tú puedes ver los apodos, que reemplazarán el nombre del usuario apodado." }, - "load-more-forum-posts/title": { - "message": "Cargar más entradas" - }, + "load-more-forum-posts/title": { "message": "Cargar más entradas" }, "load-more-forum-posts/description": { "message": "Cargue más publicaciones en el foro sin tener que cambiar de página." }, @@ -455,42 +341,26 @@ "scroll-project-titles/description": { "message": "Permite ver el nombre entero de los proyectos que no son tuyos." }, - "search-context-menus/title": { - "message": "Buscar en menús contextuales" - }, + "search-context-menus/title": { "message": "Buscar en menús contextuales" }, "search-context-menus/description": { "message": "Escribe y busca menus de contexto para seleccionar una opción eficientemente. También puedes pulsar \"enter\" para seleccionar la opción superior." }, - "hover-user-cards/title": { - "message": "Tarjetas de usuarios" - }, + "hover-user-cards/title": { "message": "Tarjetas de usuarios" }, "hover-user-cards/description": { "message": "Mantén el ratón sobre cualquier nombre de usuario para mostrar la foto de perfil. nombre de usuario y número de seguidores." }, - "exact-join-date/title": { - "message": "Fecha exacta de ingreso" - }, + "exact-join-date/title": { "message": "Fecha exacta de ingreso" }, "exact-join-date/description": { "message": "Muestra en su perfil el momento exacto en el que un usuario se unió." }, - "upload-img-directly/title": { - "message": "Subida de imágenes directa" - }, + "upload-img-directly/title": { "message": "Subida de imágenes directa" }, "upload-img-directly/description": { "message": "Te permite subir imagenes en los foros de Scratch para publicaciones y firmas sin tener que usar ningún servicio de subida de imágenes de terceros." }, - "leave-studio/title": { - "message": "Botón de salir de estudio" - }, + "leave-studio/title": { "message": "Botón de salir de estudio" }, "leave-studio/description": { "message": "Añade un botón en la página de curadores de cualquier estudio que estés curando o administrando que te permite salir de dicho estudio fácilmente. Primero se mostrará una confirmación." }, - "user-stats/title": { - "message": "Mostrar estadísticas de usuario" - }, - "user-stats/description": { - "message": "Reemplaza la sección de \"En qué estoy trabajando\" en una página de perfil con las estadísticas del usuario." - }, "frontpage-curator/title": { "message": "Nombre de curador de la página principal como enlace" }, @@ -503,15 +373,11 @@ "minimized-remix-credits/description": { "message": "Los cuadros de créditos de reinvención en los proyectos ocupa espacio de las Instrucciones del proyecto, entonces esto hace las cajas más pequeñas." }, - "follows-you/title": { - "message": "Mostrar si te siguen en perfil" - }, + "follows-you/title": { "message": "Mostrar si te siguen en perfil" }, "follows-you/description": { "message": "Si un usuario te sigue, se mostrará al lado de su nombre de usuario cuando visites su perfil." }, - "custom-studio/title": { - "message": "Sección de estudio personalizada" - }, + "custom-studio/title": { "message": "Sección de estudio personalizada" }, "custom-studio/description": { "message": "En la página principal, los proyectos más recientes de el estudio de tu elección se mostraran encima de Proyectos Destacados." }, @@ -521,15 +387,7 @@ "highlight-unanswered/description": { "message": "Agrega un marcador azul a los temas sin respuestas en los foros." }, - "hide-project-tags/title": { - "message": "Ocultar etiquetas de proyecto" - }, - "hide-project-tags/description": { - "message": "Oculta todas las etiquetas de las Instrucciones/Notas y Créditos de los proyectos." - }, - "search-assets/title": { - "message": "Buscar archivos" - }, + "search-assets/title": { "message": "Buscar archivos" }, "search-assets/description": { "message": "Busca disfraces y sonidos en el editor." }, @@ -539,9 +397,7 @@ "block-count-in-mystuff/description": { "message": "Muestra el número de bloques de los proyectos en la página de \"Mis Cosas\"" }, - "pause-audio/title": { - "message": "Pausar audio" - }, + "pause-audio/title": { "message": "Pausar audio" }, "pause-audio/description": { "message": "Permite pausar y reanudar audio en el editor de audio de Scratch." }, @@ -551,15 +407,11 @@ "display-message-count-in-icon/description": { "message": "Muestra tu número de mensajes en el icono de extensión de ScratchTools." }, - "colored-context-menus/title": { - "message": "Menús de contexto coloridos" - }, + "colored-context-menus/title": { "message": "Menús de contexto coloridos" }, "colored-context-menus/description": { "message": "Como en Scratch 2.0, se colorea el menú contextual (el del clic derecho) en base al color del bloque correspondiente." }, - "left-side-stage/title": { - "message": "Escenario en la izquierda" - }, + "left-side-stage/title": { "message": "Escenario en la izquierda" }, "left-side-stage/description": { "message": "Como en Scratch 2.0, mueve el escenario a el lado izquierdo del editor en vez del derecho." }, @@ -575,15 +427,11 @@ "hide-disabled-menu-options/description": { "message": "Las opciones de menús contextuales en el editor se muestran aunque estén deshabilitadas y no se puedan usar, esta función las esconderá si lo están." }, - "follower-count/title": { - "message": "Contador de seguidores en proyectos" - }, + "follower-count/title": { "message": "Contador de seguidores en proyectos" }, "follower-count/description": { "message": "Muestra el número de seguidores del creador del proyecto." }, - "hide-studio-borders/title": { - "message": "Esconder marcos de estudios" - }, + "hide-studio-borders/title": { "message": "Esconder marcos de estudios" }, "hide-studio-borders/description": { "message": "Elimina los marcos extraños alrededor de las imágenes de los estudios en las páginas 2.0." }, @@ -611,15 +459,11 @@ "hide-studio-messages/description": { "message": "Esconde los mensajes sobre la actividad de estudios en el correo – Se apilan rápido y pueden ser una molestia." }, - "special-editor-fonts/title": { - "message": "Más fuentes en el editor" - }, + "special-editor-fonts/title": { "message": "Más fuentes en el editor" }, "special-editor-fonts/description": { "message": "Agrega más fuentes de texto para escoger en el editor de sprites. Se ven más agradables y modernos." }, - "get-project-tags/title": { - "message": "Mostrar etiquetas de proyectos" - }, + "get-project-tags/title": { "message": "Mostrar etiquetas de proyectos" }, "get-project-tags/description": { "message": "Cataloga todas las etiquetas usadas en la descripción de los proyectos justo debajo de las notas y créditos." }, @@ -641,9 +485,7 @@ "cloud-scratchers/description": { "message": "En los proyectos multijugador, se mostrarán todos los usuarios que actualmente lo juegan." }, - "editor-in-two/title": { - "message": "Editor 2.0" - }, + "editor-in-two/title": { "message": "Editor 2.0" }, "editor-in-two/description": { "message": "Reemplaza el editor 3.0 de Scratch con el editor de la versión 2.0. Es nostálgico, en serio." }, @@ -659,21 +501,15 @@ "turbowarp-button-in-editor/description": { "message": "Añade un botón al editor para que puedas abrir instantáneamente un proyecto en TurboWarp." }, - "sprite-clones/title": { - "message": "Contador de clones de sprites" - }, + "sprite-clones/title": { "message": "Contador de clones de sprites" }, "sprite-clones/description": { "message": "Muestra el contador de clones por cada sprite individual." }, - "block-log/title": { - "message": "Registro de bloques" - }, + "block-log/title": { "message": "Registro de bloques" }, "block-log/description": { "message": "Registra y muestra toda la información de deshacer en el editor cuando presiones Control + Shift + L." }, - "scrollable-list-items/title": { - "message": "Lista desplazable de valores" - }, + "scrollable-list-items/title": { "message": "Lista desplazable de valores" }, "scrollable-list-items/description": { "message": "Los valores de una lista que sean más largos que ella serán parcialmente mostrados. Ahora puedes desplazarte por la lista horizontalmente." }, @@ -683,15 +519,11 @@ "custom-fonts/description": { "message": "En la web de Scratch, podrás poner la fuente que quieras, siempre y cuando esté en la pagina de Google Fonts. Esto distingue entre mayúsculas y minúsculas." }, - "project-timer/title": { - "message": "Cronómetro del proyecto" - }, + "project-timer/title": { "message": "Cronómetro del proyecto" }, "project-timer/description": { "message": "Muestra la cantidad de tiempo (en segundos) en la que el proyecto ha estado funcionando." }, - "colored-comments/title": { - "message": "Comentarios coloridos en el editor" - }, + "colored-comments/title": { "message": "Comentarios coloridos en el editor" }, "colored-comments/description": { "message": "Colorea los comentarios en el editor basado en el color del bloque que comentan." }, @@ -701,39 +533,27 @@ "recently-viewed-projects/description": { "message": "Añade una pestaña a la pagina de Mis Cosas donde puedes ver una lista de los últimos proyectos que viste." }, - "collapse-blocks/title": { - "message": "Colapsar bloques" - }, + "collapse-blocks/title": { "message": "Colapsar bloques" }, "collapse-blocks/description": { "message": "En el menú de clic derecho del editor ahora habrá un botón que te permite colapsar el bloque seleccionado." }, - "set-featured-project/title": { - "message": "Establecer proyecto destacado" - }, + "set-featured-project/title": { "message": "Establecer proyecto destacado" }, "set-featured-project/description": { "message": "En cualquier página de proyecto, podrás establecer el proyecto destacado de tu perfil con sólo presionar un botón – incluso los proyectos no compartidos." }, - "scratchformat/title": { - "message": "ScratchFormat" - }, + "scratchformat/title": { "message": "ScratchFormat" }, "scratchformat/description": { "message": "Formatea tus comentarios con negrita, itálico y más. Esto lo podrán ver todos los usuarios que usen ScratchTools." }, - "expand-editor/title": { - "message": "Expandir el editor" - }, + "expand-editor/title": { "message": "Expandir el editor" }, "expand-editor/description": { "message": "Presiona Control + E para esconder o mostrar el escenario en el editor." }, - "list-sprites/title": { - "message": "Lista de objetos" - }, + "list-sprites/title": { "message": "Lista de objetos" }, "list-sprites/description": { "message": "Reemplaza la cuadrícula de objetos en el editor por una lista que incluye un contador de bloques del objeto y su posición." }, - "check-if-trending/title": { - "message": "¿Está en tendencia?" - }, + "check-if-trending/title": { "message": "¿Está en tendencia?" }, "check-if-trending/description": { "message": "Si el proyecto que estás viendo está en la sección de tendencia, su puesto numérico en tendencia se mostrará al lado de la fecha de compartir." }, @@ -761,45 +581,31 @@ "remove-collapse-buttons/description": { "message": "Esconde los botones de colapsar en la página principal de los foros." }, - "pin-projects/title": { - "message": "Fijar proyectos a Mis Cosas" - }, + "pin-projects/title": { "message": "Fijar proyectos a Mis Cosas" }, "pin-projects/description": { "message": "Fija uno de tus proyectos a la parte de arriba de tu página de Mis Cosas con el clic de un botón. También lo podrás desfijar o intercambiar por otro." }, - "last-key-pressed/title": { - "message": "Última tecla presionada" - }, + "last-key-pressed/title": { "message": "Última tecla presionada" }, "last-key-pressed/description": { "message": "En cualquier proyecto y en el editor, podrás ver la última tecla que has presionado mientras el proyecto está en curso, según el proyecto en sí. Esto es genial para los juegos de plataformas." }, - "hide-signatures/title": { - "message": "Esconder signaturas de foros" - }, + "hide-signatures/title": { "message": "Esconder signaturas de foros" }, "hide-signatures/description": { "message": "Esconde todas las signaturas y divisores de los foros." }, - "twemoji-in-forums/title": { - "message": "Mejores emojis en los foros" - }, + "twemoji-in-forums/title": { "message": "Mejores emojis en los foros" }, "twemoji-in-forums/description": { "message": "Reemplaza los emojis de baja calidad actuales con Twemojis de alta calidad." }, - "go-to-parent/title": { - "message": "Botón de ir a original" - }, + "go-to-parent/title": { "message": "Botón de ir a original" }, "go-to-parent/description": { "message": "En el editor de cualquier proyecto que sea un remix, podrás hacer clic en un botón para ir al editor del proyecto original." }, - "most-popular-project/title": { - "message": "Proyecto más popular" - }, + "most-popular-project/title": { "message": "Proyecto más popular" }, "most-popular-project/description": { "message": "Muestra el proyecto más popular (por vistas) del usuario en los perfiles. Puedes hacer clic en el proyecto para verlo." }, - "editor-dark-mode/title": { - "message": "Tema oscuro para el editor" - }, + "editor-dark-mode/title": { "message": "Tema oscuro para el editor" }, "editor-dark-mode/description": { "message": "Intercambia el tono claro del editor por un tono más oscuro." }, @@ -809,99 +615,67 @@ "hide-studio-group-icon/description": { "message": "Esconde el ícono de grupo del estudio, y sólo muestra la miniatura del estudio." }, - "colored-messages/title": { - "message": "Mensajes coloreados" - }, + "colored-messages/title": { "message": "Mensajes coloreados" }, "colored-messages/description": { "message": "Colorea tus mensajes en base al tipo de mensaje, como los corazones, favoritos, e invitaciones a estudios." }, - "full-title/title": { - "message": "Título entero del proyecto" - }, + "full-title/title": { "message": "Título entero del proyecto" }, "full-title/description": { "message": "En las páginas de perfiles, pasa el cursor por encima de cualquier título de un proyecto para mostrar el título completo." }, - "fixed-box/title": { - "message": "Arreglas cuadros de contenido" - }, + "fixed-box/title": { "message": "Arreglas cuadros de contenido" }, "fixed-box/description": { "message": "Hace que todas las puntas de los cuadros sean circulares, en vez de solo las de arriba." }, - "user-bio/title": { - "message": "Biografía de usuarios" - }, + "user-bio/title": { "message": "Biografía de usuarios" }, "user-bio/description": { "message": "En los comentarios de perfiles, pasa el cursos por encima de cualquier nombre de usuario para mostrar su biografía." }, - "nfe-project-checker/title": { - "message": "Detectos de proyectos NFE" - }, + "nfe-project-checker/title": { "message": "Detectos de proyectos NFE" }, "nfe-project-checker/description": { "message": "En los proyectos, muestra si el proyecto es Seguro, No Revisado, o NSFE (No Seguro para Todos)" }, - "sprite-data/title": { - "message": "Mostrar información del sprite" - }, + "sprite-data/title": { "message": "Mostrar información del sprite" }, "sprite-data/description": { "message": "En las pestañas de Código, Disfraces y Sonidos de cada sprite, se mostrarán la cantidad de bloques, disfraces y sonidos respectivamente del sprite seleccionado." }, - "aviate/title": { - "message": "Estados de Aviate" - }, + "aviate/title": { "message": "Estados de Aviate" }, "aviate/description": { "message": "Muestra estados de Aviate en los perfiles. Puedes establecer tu propio estado en aviate.scratchers.tech." }, - "idea-generator/title": { - "message": "Generador de ideas para proyectos" - }, + "idea-generator/title": { "message": "Generador de ideas para proyectos" }, "idea-generator/description": { "message": "En la página de \"Ideas\" en Scratch, habrá una sección donde podrás generar ideas para tu proyecto si necesitas algunas." }, - "hide-stickies/title": { - "message": "Esconder firmas de foros" - }, + "hide-stickies/title": { "message": "Esconder firmas de foros" }, "hide-stickies/description": { "message": "Esconde las firmas básicas que se encuentran encima de cada tema de foro." }, - "nfe-search/title": { - "message": "Búsqueda NFE" - }, + "nfe-search/title": { "message": "Búsqueda NFE" }, "nfe-search/description": { "message": "Usa un botón para buscar todos los proyectos, incluidos los NFE (No Para Todos)." }, - "open-in-new-tab/title": { - "message": "Abrir en nueva pestaña" - }, + "open-in-new-tab/title": { "message": "Abrir en nueva pestaña" }, "open-in-new-tab/description": { "message": "Los enlaces en un proyecto serán abiertos en una nueva pestaña automáticamente." }, - "unbold-site-text/title": { - "message": "Texto sin negrita" - }, + "unbold-site-text/title": { "message": "Texto sin negrita" }, "unbold-site-text/description": { "message": "Hace que todo el texto en la página de Scratch no sea en negrita, y que sólo sea texto normal." }, - "compact-navbar/title": { - "message": "Barra de navegación compacta" - }, + "compact-navbar/title": { "message": "Barra de navegación compacta" }, "compact-navbar/description": { "message": "Hace mas espacio en la barra de navigación cerca de tu perfil." }, - "delete-all/title": { - "message": "Borrar todos los sprites" - }, + "delete-all/title": { "message": "Borrar todos los sprites" }, "delete-all/description": { "message": "Agrega una opción en el menú de clic derecho para borrar todos los sprites (luego de confirmación para asegurar de que no fue un accidente)." }, - "round-profile-pictures/title": { - "message": "Redondear fotos de perfil" - }, + "round-profile-pictures/title": { "message": "Redondear fotos de perfil" }, "round-profile-pictures/description": { "message": "Todas las fotos de perfil en la página de Scratch serán redondas." }, - "ocular-link/title": { - "message": "Enlaces de ocular en foros" - }, + "ocular-link/title": { "message": "Enlaces de ocular en foros" }, "ocular-link/description": { "message": "Agrega un enlace a la página Ocular de cualquier usuario justo debajo de su nombre de usuario en una publicación." }, @@ -911,21 +685,15 @@ "forum-scratch-team/description": { "message": "Al lado del nombre de usuario de cualquier miembro del Equipo de Scratch en los foros, se le pondrá un asterisco. (*)" }, - "remove-editor-icons/title": { - "message": "Eliminar íconos del editor" - }, + "remove-editor-icons/title": { "message": "Eliminar íconos del editor" }, "remove-editor-icons/description": { "message": "Elimina los íconos de cada pestaña del editor." }, - "sprite-watermark/title": { - "message": "Eliminar marca de agua del sprite" - }, + "sprite-watermark/title": { "message": "Eliminar marca de agua del sprite" }, "sprite-watermark/description": { "message": "Elimina la marca de agua que aparece en el editor de sprites." }, - "compact-editor/title": { - "message": "Editor compacto" - }, + "compact-editor/title": { "message": "Editor compacto" }, "compact-editor/description": { "message": "Hace la información de los objetos y fondo más compacta." }, @@ -935,10 +703,8 @@ "my-recent-projects/description": { "message": "Reemplaza la sección de Noticias de Scratch en la página principal con tus proyectos compartidos recientemente." }, - "focus-mode/title": { - "message": "Modo de enfoque" - }, + "focus-mode/title": { "message": "Modo de enfoque" }, "focus-mode/description": { "message": "Agrega un botón en los proyectos que elimina los comentarios, las columnas de estudios y remixes, el encabezado y el pie de la página." } -} \ No newline at end of file +} diff --git a/extras/feature-locales/ja.json b/extras/feature-locales/ja.json index 3dc93441..af0bb8b4 100644 --- a/extras/feature-locales/ja.json +++ b/extras/feature-locales/ja.json @@ -1,37 +1,29 @@ { - "fullscreen-explorer/title": { - "message": "フルスクリーン プロジェクト グリッド" - }, - "fullscreen-explorer/description": { - "message": "トレンド、検索、リミックスのページで左右の空白を削除して、大画面でプロジェクトを検索します。" + "stage-in-spritepane/title": { "message": "スプライトペイン内のステージ" }, + "stage-in-spritepane/description": { + "message": "ステージボタンをスプライトペインに移動し、スプライトの表示領域を広げます。" }, - "total-stats/title": { - "message": "ユーザー統計の合計" + "better-cloud-history/title": { "message": "クラウドデータの履歴の改善" }, + "better-cloud-history/description": { + "message": "クラウドデータの履歴をより詳細で最新なものにします。変数名をクリックすると、その変数のみで一覧表示できます。" }, - "total-stats/description": { - "message": "ユーザーのプロフィールの共有プロジェクトの横に、ユーザーが共有したすべてのプロジェクトで受け取った「いいね」、「お気に入り」、「閲覧」の合計が表示されます。" - }, - "project-miniplayer/title": { - "message": "プロジェクトミニプレイヤー" - }, - "project-miniplayer/description": { - "message": "プロジェクト ページを下にスクロールすると、プロジェクトのミニプレイヤーが自動的に表示されます。" + "sprite-layers/title": { "message": "スプライトのレイヤーを表示" }, + "sprite-layers/description": { + "message": "エディターのスプライトの表示/非表示切り替えボタンにカーソルを合わせると、スプライトのレイヤーが表示されます。" }, - "project-descriptions/title": { - "message": "要約された説明" - }, - "project-descriptions/description": { - "message": "必要に応じて人工知能を使用してプロジェクトの説明を要約し、長い説明をゲームプレイの説明などの重要な情報に短縮します。" - }, - "pin-comments/title": { - "message": "プロジェクトコメントをピン留めする" + "hide-project-tags/title": { "message": "プロジェクトのタグの非表示" }, + "hide-project-tags/description": { + "message": "プロジェクトの「使い方」と「メモとクレジット」に書かれているリンクされているタグをすべて非表示にします。" }, - "pin-comments/description": { - "message": "自分のプロジェクトにコメントを固定したり、他のプロジェクトにどのようなコメントが固定されているかを確認したりできます。" + "snap-to-grid/title": { "message": "スクリプトをグリッドに揃える" }, + "snap-to-grid/description": { + "message": "スクリプトを配置すると、エディター内の点線のグリッドに自動的に揃えられます。" }, - "sidebar/title": { - "message": "サイドバー" + "select-self/title": { "message": "編集中のスプライトを選択" }, + "select-self/description": { + "message": "スプライトのドロップダウンを開いたときに、他のスプライトだけでなく編集中のスプライトを選択できるようにします。" }, + "sidebar/title": { "message": "サイドバー" }, "sidebar/description": { "message": "Scratchの画面上部のバーの位置を横に移動します。" }, @@ -41,63 +33,65 @@ "project-version-detector/description": { "message": "プロジェクトがいつ共有されたかを確認し、その時点で使用されていた Scratch のバージョンを示すラベルを共有日の横に追加します。" }, - "download-project/title": { - "message": "プロジェクトをダウンロード" + "fullscreen-explorer/title": { + "message": "フルスクリーン プロジェクト グリッド" }, + "fullscreen-explorer/description": { + "message": "トレンド、検索、リミックスのページで左右の空白を削除して、大画面でプロジェクトを検索します。" + }, + "project-descriptions/title": { "message": "要約された説明" }, + "project-descriptions/description": { + "message": "必要に応じて人工知能を使用してプロジェクトの説明を要約し、長い説明をゲームプレイの説明などの重要な情報に短縮します。" + }, + "total-stats/title": { "message": "ユーザー統計の合計" }, + "total-stats/description": { + "message": "ユーザーのプロフィールの共有プロジェクトの横に、ユーザーが共有したすべてのプロジェクトで受け取った「いいね」、「お気に入り」、「閲覧」の合計が表示されます。" + }, + "project-miniplayer/title": { "message": "プロジェクトミニプレイヤー" }, + "project-miniplayer/description": { + "message": "プロジェクト ページを下にスクロールすると、プロジェクトのミニプレイヤーが自動的に表示されます。" + }, + "pin-comments/title": { "message": "プロジェクトコメントをピン留めする" }, + "pin-comments/description": { + "message": "自分のプロジェクトにコメントを固定したり、他のプロジェクトにどのようなコメントが固定されているかを確認したりできます。" + }, + "download-project/title": { "message": "プロジェクトをダウンロード" }, "download-project/description": { "message": "プロジェクトページに、プロジェクトを.sb3ファイルとしてダウンロードできるボタンを追加します。" }, - "blur-modal/title": { - "message": "エディターのホップアップの背景をぼかす" - }, + "blur-modal/title": { "message": "エディターのホップアップの背景をぼかす" }, "blur-modal/description": { "message": "エディターのホップアップの背景を、色付きの半透明の背景ではなく、ぼかしたものにします。" }, - "quick-search/title": { - "message": "クイック検索" - }, + "quick-search/title": { "message": "クイック検索" }, "quick-search/description": { "message": "Ctrl + Kで、Scratch上のページ間を簡単に切り替えられます。" }, - "favicon-messages/title": { - "message": "ブラウザのタブにメッセージ数を表示" - }, + "favicon-messages/title": { "message": "ブラウザのタブにメッセージ数を表示" }, "favicon-messages/description": { "message": "ファビコン(ブラウザのタブにあるScratchアイコン)にメッセージ数を表示します。" }, - "show-emoji-names/title": { - "message": "絵文字の名前を表示" - }, + "show-emoji-names/title": { "message": "絵文字の名前を表示" }, "show-emoji-names/description": { "message": "コメント内のScratch絵文字にカーソルを合わせると、その絵文字の名前が表示されます。" }, - "more-block-themes/title": { - "message": "ブロックのテーマの追加" - }, + "more-block-themes/title": { "message": "ブロックのテーマの追加" }, "more-block-themes/description": { "message": "コードエディターのブロックのテーマを追加します。" }, - "more-key-inputs/title": { - "message": "より多くのキー入力の追加" - }, + "more-key-inputs/title": { "message": "より多くのキー入力の追加" }, "more-key-inputs/description": { "message": "「○○キーが押された」ブロックに、より多くのキーを追加します。" }, - "comment-tags/title": { - "message": "エディターのコメントにタグを追加" - }, + "comment-tags/title": { "message": "エディターのコメントにタグを追加" }, "comment-tags/description": { "message": "エディターのコメントにタグを追加して、簡単に整理することができます。" }, - "profile-flag/title": { - "message": "プロフィールに国旗を表示" - }, + "profile-flag/title": { "message": "プロフィールに国旗を表示" }, "profile-flag/description": { "message": "プロフィールに設定されている国名の横に、その国の国旗の絵文字を追加します。" }, - "follow-on-projects/title": { - "message": "プロジェクトページでフォローする" - }, + "follow-on-projects/title": { "message": "プロジェクトページでフォローする" }, "follow-on-projects/description": { "message": "プロフィールにアクセスしなくても、プロジェクトページから直接プロジェクトの作者をフォローできます。" }, @@ -107,219 +101,139 @@ "dark-paint-editor/description": { "message": "ペイントエディターのズームボタンの横に、ペイントエディターの背景をライトモードとダークモードに切り替えられるボタンを追加します。" }, - "specific-replies/title": { - "message": "メッセージで返信先を表示" - }, + "specific-replies/title": { "message": "メッセージで返信先を表示" }, "specific-replies/description": { "message": "コメントに関するメッセージで、そのコメントが誰に返信したものかを表示する。" }, - "better-trending-thumbnails/title": { - "message": "より大きいサムネイル" - }, + "better-trending-thumbnails/title": { "message": "より大きいサムネイル" }, "better-trending-thumbnails/description": { "message": "傾向と検索したときに表示されるプロジェクトのサムネイルを大きくし、プロジェクトとスタジオの枠によりぴったりになるようにします。" }, - "relevant-forum-posts/title": { - "message": "似ているトピックを表示" - }, - "relevant-forum-posts/description": { - "message": "フォーラムで新しいトピックを作成したときに、そのトピックに似ている他のトピックが表示されます。" - }, - "anti-generic/title": { - "message": "一般的なものの非表示" - }, + "anti-generic/title": { "message": "一般的なものの非表示" }, "anti-generic/description": { "message": "このベータ版機能では、検索ページと傾向ページにおいて、繰り返しの多いプロジェクトや、一般的と思われるプロジェクトを自動的に非表示にします。これには、タグが多いプロジェクト、一般的な名前のプロジェクト、プロジェクトの重複が含まれます。" }, - "wrap-lists/title": { - "message": "リストの項目を省略しない" - }, + "wrap-lists/title": { "message": "リストの項目を省略しない" }, "wrap-lists/description": { "message": "リスト内のテキストが長すぎる場合でも、それを省略せずに表示します。" }, - "live-stats/title": { - "message": "ステータスをリアルタイムで更新" - }, + "live-stats/title": { "message": "ステータスをリアルタイムで更新" }, "live-stats/description": { "message": "ページを再読み込みすることなく、プロジェクトの好き、お気に入り、リミックス、参照数をリアルタイムで更新します。" }, - "hide-scratch-news/title": { - "message": "Scratchニュースの非表示" - }, + "hide-scratch-news/title": { "message": "Scratchニュースの非表示" }, "hide-scratch-news/description": { "message": "トップページにあるScratchニュースを非表示にします。" }, - "watch-later/title": { - "message": "プロジェクトを後で見る" - }, + "watch-later/title": { "message": "プロジェクトを後で見る" }, "watch-later/description": { "message": "後で見たいプロジェクトとして保存したものを、「後で見る」ページに表示します。" }, - "remove-project-button/title": { - "message": "プロジェクト削除ボタン" - }, + "remove-project-button/title": { "message": "プロジェクト削除ボタン" }, "remove-project-button/description": { "message": "スタジオ内のプロジェクトを簡単に削除するためのボタンを追加します。メニューを開かずに削除することができます。" }, - "right-side-flag/title": { - "message": "緑の旗を右に表示する" - }, + "right-side-flag/title": { "message": "緑の旗を右に表示する" }, "right-side-flag/description": { "message": "緑の旗と停止ボタンをステージの右側に移動させます。" }, - "love-fave-animate/title": { - "message": "「好き」ボタンのアニメーション" - }, + "love-fave-animate/title": { "message": "「好き」ボタンのアニメーション" }, "love-fave-animate/description": { "message": "プロジェクトページ上の「いいね」ボタンと「お気に入り」ボタンのクリックしたときの動作をアニメーション化します。" }, - "default-to-local/title": { - "message": "デフォルトでローカル変数にする" - }, + "default-to-local/title": { "message": "デフォルトでローカル変数にする" }, "default-to-local/description": { "message": "変数を作った時に、デフォルトで「すべてのスプライト」ではなく「このスプライトのみ」に設定します。" }, - "start-stop-hotkeys/title": { - "message": "緑の旗のホットキー" - }, + "start-stop-hotkeys/title": { "message": "緑の旗のホットキー" }, "start-stop-hotkeys/description": { "message": "プロジェクトが実行中かどうかに応じて、Ctrl+Gキーを押すことで、プロジェクトを実行または停止することができます。" }, - "opacity-slider/title": { - "message": "透明度スライダー" - }, + "opacity-slider/title": { "message": "透明度スライダー" }, "opacity-slider/description": { "message": "ペイントエディターでオブジェクトの透明度を変更できるようになります。" }, - "more-studios/title": { - "message": "スタジオの追加" - }, + "more-studios/title": { "message": "スタジオの追加" }, "more-studios/description": { "message": "20個よりも多くのスタジオにプロジェクトを追加できるようにします。" }, - "localized-explore/title": { - "message": "国内のプロジェクト" - }, + "localized-explore/title": { "message": "国内のプロジェクト" }, "localized-explore/description": { "message": "検索ページで、他の国のプロジェクトをあまり表示しないようにします。これは、あなたが理解できる言語のプロジェクトだけを表示するためです。" }, - "project-bar/title": { - "message": "プロジェクトバー" - }, + "project-bar/title": { "message": "プロジェクトバー" }, "project-bar/description": { "message": "メモとクレジットより下へスクロールした後も、プロジェクトの情報を表示し続けることができます。" }, - "more-news/title": { - "message": "Scratchニュースの追加" - }, + "more-news/title": { "message": "Scratchニュースの追加" }, "more-news/description": { "message": "トップページで、Scratchニュースをスクロールして、より多くのニュースを読み込むことができます。" }, - "dumpster-fire/title": { - "message": "ゴミ捨て場の火災" - }, + "dumpster-fire/title": { "message": "ゴミ捨て場の火災" }, "dumpster-fire/description": { "message": "Scratchのホームページに「注目のプロジェクト」という項目があるが、これは嘘です。なので、この名称を「Dumpster Fire(ゴミ捨て場の火災)」という正しい名称に変更します。" }, - "steal-game/title": { - "message": "ゲームを盗む" - }, + "steal-game/title": { "message": "ゲームを盗む" }, "steal-game/description": { "message": "リミックスボタンの文字を「Steal game(ゲームを盗む)」にします。" }, - "statistics/title": { - "message": "統計情報" - }, + "statistics/title": { "message": "統計情報" }, "statistics/description": { "message": "ユーザーのScratchStatsに飛ぶことができるボタンを「私の作品」ページに追加します。" }, - "echo-effect/title": { - "message": "エコー効果" - }, + "echo-effect/title": { "message": "エコー効果" }, "echo-effect/description": { "message": "Scratchの音エディターにエコー効果を戻します。" }, - "compact-buttons/title": { - "message": "コンパクトなボタン" - }, + "compact-buttons/title": { "message": "コンパクトなボタン" }, "compact-buttons/description": { "message": "ボタンのテキストは削除され、アイコンがない場合は新しいアイコンが追加されます。" }, - "message-count/title": { - "message": "メッセージカウント" - }, + "message-count/title": { "message": "メッセージカウント" }, "message-count/description": { "message": "プロフィールのユーザーのメッセージ数を国名の横に表示します。" }, - "move-share-button/title": { - "message": "「共有する」ボタンを移動" - }, + "move-share-button/title": { "message": "「共有する」ボタンを移動" }, "move-share-button/description": { "message": "プロジェクトページで、「共有する」ボタンを「中を見る」ボタンの隣に移動します。" }, - "preview-textboxes/title": { - "message": "テキストボックスのプレビュー表示" - }, + "preview-textboxes/title": { "message": "テキストボックスのプレビュー表示" }, "preview-textboxes/description": { "message": "プロフィールの「私について」と「私が取り組んでいること」、そしてプロジェクトの「使い方」と「メモとクレジット」をプレビュー表示して、他のユーザーにどのように見えるかを確認できます。\n " }, - "more-tutorials/title": { - "message": "チュートリアルの追加" - }, + "more-tutorials/title": { "message": "チュートリアルの追加" }, "more-tutorials/description": { "message": "アイデアページで、他のスクラッチャーによって作られたチュートリアルを見ることができます。" }, - "simplify-action-buttons/title": { - "message": "簡素なアクションボタン" - }, + "simplify-action-buttons/title": { "message": "簡素なアクションボタン" }, "simplify-action-buttons/description": { "message": "プロジェクトページの「使い方」と「メモとクレジット」の下にあるアクションボタンをアイコンで表示します。" }, - "slash-to-search/title": { - "message": "スラッシュキーで検索" - }, + "slash-to-search/title": { "message": "スラッシュキーで検索" }, "slash-to-search/description": { "message": "スラッシュキー(/)で、検索バーに移動し、検索を開始できます。" }, - "shared-clipboard/title": { - "message": "共有クリップボード" - }, + "shared-clipboard/title": { "message": "共有クリップボード" }, "shared-clipboard/description": { "message": "異なるプロジェクトのペイントエディター間でアイテムをコピー&ペーストできます。" }, - "important-messages/title": { - "message": "重要なメッセージ" - }, - "important-messages/description": { - "message": "メッセージページで、重要なメッセージを別に表示します。" - }, - "hide-footer/title": { - "message": "フッターを隠す" - }, + "hide-footer/title": { "message": "フッターを隠す" }, "hide-footer/description": { "message": "フッターは不要なスペースを取ります。だから隠す!" }, - "original-colors/title": { - "message": "青色に戻す" - }, + "original-colors/title": { "message": "青色に戻す" }, "original-colors/description": { "message": "Scratchのウェブサイトのテーマカラーを、3.0の紫色になる前の色に戻します。" }, - "simplify-editor-tabs/title": { - "message": "エディターのタブの単純化" - }, + "simplify-editor-tabs/title": { "message": "エディターのタブの単純化" }, "simplify-editor-tabs/description": { "message": "エディターのタブの項目をアイコンのみにし、円形で表示します。" }, - "live-character-counts/title": { - "message": "現在の文字数" - }, + "live-character-counts/title": { "message": "現在の文字数" }, "live-character-counts/description": { "message": "フォーラム、スタジオ、プロジェクトページで、テキストボックスの現在の文字数を表示します。" }, - "advanced-search/title": { - "message": "ユーザー検索" - }, + "advanced-search/title": { "message": "ユーザー検索" }, "advanced-search/description": { "message": "ユーザーを検索すると、そのプロフィールへのリンクがページの上部に表示されます。" }, @@ -329,21 +243,15 @@ "studio-links/description": { "message": "Scratchウェブサイト全体のスタジオへのリンクをスタジオの名前に置き換えます。" }, - "block-studios/title": { - "message": "選択したスタジオからの通知の無効化" - }, + "block-studios/title": { "message": "選択したスタジオからの通知の無効化" }, "block-studios/description": { "message": "選択したスタジオの活動内容のメッセージを無効化します。" }, - "block-messages/title": { - "message": "ブロック機能" - }, + "block-messages/title": { "message": "ブロック機能" }, "block-messages/description": { "message": "ブロックしたユーザーからのメッセージを非表示にします。他のユーザーにはブロックしていることは表示されません。" }, - "two-colors/title": { - "message": "2.0ブロックカラー" - }, + "two-colors/title": { "message": "2.0ブロックカラー" }, "two-colors/description": { "message": "エディターのブロックの色を、Scratch2.0で使われていた色に変更します。" }, @@ -353,33 +261,23 @@ "project-links/description": { "message": "Scratchウェブサイト全体のプロジェクトへのリンクをプロジェクトの名前に置き換えます。" }, - "emoji-status/title": { - "message": "絵文字のステータス" - }, + "emoji-status/title": { "message": "絵文字のステータス" }, "emoji-status/description": { "message": "プロフィールのステータスに絵文字を設定します。他のScratchToolsユーザーは、このステータスを見ることができます。" }, - "display-name/title": { - "message": "ディスプレイネーム" - }, + "display-name/title": { "message": "ディスプレイネーム" }, "display-name/description": { "message": "他のScratcherのディスプレイネームが表示されます。また、自分のディスプレイネームを設定することもできます。ディスプレイネームはユーザー名の横に表示され、ユーザー名のように制限されることはありません。" }, - "isonline/title": { - "message": "ユーザーがオンラインか表示" - }, + "isonline/title": { "message": "ユーザーがオンラインか表示" }, "isonline/description": { "message": "プロフィールページで、ユーザーがオンラインか表示します。この機能は他のユーザーにあなたがオンラインどうかを表示します。" }, - "plain-background/title": { - "message": "無地のコードエディターの背景" - }, + "plain-background/title": { "message": "無地のコードエディターの背景" }, "plain-background/description": { "message": "コードエディターの背景からドットを削除します。" }, - "hide-advertisements/title": { - "message": "コメント欄の広告の非表示" - }, + "hide-advertisements/title": { "message": "コメント欄の広告の非表示" }, "hide-advertisements/description": { "message": "プロフィール、プロジェクト、スタジオのコメント欄の広告コメントを非表示にします。広告コメントはコメント欄で無駄にスペースを占有します。" }, @@ -395,57 +293,39 @@ "unlisted-projects/description": { "message": "エディターで非共有のプロジェクトを共有するリンクを生成します。そのプロジェクトはリンクを知っている人しか見ることができません。" }, - "stats-percentages/title": { - "message": "プロジェクトのステータスを表示" - }, + "stats-percentages/title": { "message": "プロジェクトのステータスを表示" }, "stats-percentages/description": { "message": "「私の作品」ページで、好き、お気に入り、リミックスの数にカーソルを合わせると、参照数のうちの何パーセントの人がその反応をしたかが表示されます。" }, - "clone-counter/title": { - "message": "クローンカウンター" - }, + "clone-counter/title": { "message": "クローンカウンター" }, "clone-counter/description": { "message": "ステージの上に、総クローン数を表示します。" }, - "colored-shadows/title": { - "message": "色付きの影" - }, + "colored-shadows/title": { "message": "色付きの影" }, "colored-shadows/description": { "message": "ドラッグ中のブロックを他のブロックに近づけた時に表示される影を、移動中のブロックの色にします。" }, - "creator-badge/title": { - "message": "作者バッジ" - }, + "creator-badge/title": { "message": "作者バッジ" }, "creator-badge/description": { "message": "プロジェクトページのコメント欄で、プロジェクトの作者のコメントの隣にバッジを表示します。" }, - "original-buttons/title": { - "message": "昔のマーク" - }, + "original-buttons/title": { "message": "昔のマーク" }, "original-buttons/description": { "message": "昔のハート、お気に入り、リミックス、参照マークに戻します。" }, - "box-shadows/title": { - "message": "コンテンツボックスの影" - }, + "box-shadows/title": { "message": "コンテンツボックスの影" }, "box-shadows/description": { "message": "すべてのコンテンツボックスに影を追加します。カーソルを合わせると、影が濃くなります。" }, - "admin-notifications/title": { - "message": "STからのメッセージを赤く表示" - }, + "admin-notifications/title": { "message": "STからのメッセージを赤く表示" }, "admin-notifications/description": { "message": "Scratch Teamからの管理者通知がある場合、上のバーのメッセージボタンはオレンジ色ではなく、赤色に表示されます。" }, - "nicknames/title": { - "message": "ニックネーム" - }, + "nicknames/title": { "message": "ニックネーム" }, "nicknames/description": { "message": "他のScratcherにニックネームを設定することができます。ニックネームは自分だけが見ることができ、相手のユーザーネームを見たときにユーザー名がニックネームに置き換えられます。" }, - "load-more-forum-posts/title": { - "message": "より多くの投稿を読み込む" - }, + "load-more-forum-posts/title": { "message": "より多くの投稿を読み込む" }, "load-more-forum-posts/description": { "message": "ディスカッションフォーラムで、ページを切り替えることなく、より多くの投稿を読み込むことができます。" }, @@ -455,42 +335,26 @@ "scroll-project-titles/description": { "message": "プロジェクトのタイトルをスクロールして見ることができます。" }, - "search-context-menus/title": { - "message": "検索コンテキストメニュー" - }, + "search-context-menus/title": { "message": "検索コンテキストメニュー" }, "search-context-menus/description": { "message": "コンテキストメニューを入力・検索して、効率的にオプションを選択できます。Enterキーを押すことで一番上のオプションを選択できます。" }, - "hover-user-cards/title": { - "message": "カーソルを合わせてステータスを表示" - }, + "hover-user-cards/title": { "message": "カーソルを合わせてステータスを表示" }, "hover-user-cards/description": { "message": "青いユーザー名にマウスカーソルを合わせると、アイコンとユーザー名とフォロワー数が表示されます。" }, - "exact-join-date/title": { - "message": "詳細な参加した日時" - }, + "exact-join-date/title": { "message": "詳細な参加した日時" }, "exact-join-date/description": { "message": "プロフィールにユーザーが参加した詳細な日時を表示します。" }, - "upload-img-directly/title": { - "message": "画像を直接アップロード" - }, + "upload-img-directly/title": { "message": "画像を直接アップロード" }, "upload-img-directly/description": { "message": "サードパーティ製の画像アップロードサービスを使わなくても、フォーラムで画像を自分のパソコンのファイルから直接アップロードできるようになります。" }, - "leave-studio/title": { - "message": "「スタジオを抜ける」ボタン" - }, + "leave-studio/title": { "message": "「スタジオを抜ける」ボタン" }, "leave-studio/description": { "message": "あなたがキュレーターまたはマネージャーであるスタジオのキュレータータブにスタジオから退出することができるボタンを追加します。ボタンを押すと、確認画面が表示されます。" }, - "user-stats/title": { - "message": "ユーザーの統計情報" - }, - "user-stats/description": { - "message": "プロフィールの「私が行ったこと」にユーザーの統計情報を表示します。" - }, "frontpage-curator/title": { "message": "トップページのキュレーターの名前をリンク化" }, @@ -503,15 +367,11 @@ "minimized-remix-credits/description": { "message": "リミックスのクレジットを小さくすることができます。" }, - "follows-you/title": { - "message": "相互フォロー表示" - }, + "follows-you/title": { "message": "相互フォロー表示" }, "follows-you/description": { "message": "相互フォローしている場合、そのユーザーのプロフィールのユーザー名の隣に表示されます。" }, - "custom-studio/title": { - "message": "トップページに指定したスタジオを表示" - }, + "custom-studio/title": { "message": "トップページに指定したスタジオを表示" }, "custom-studio/description": { "message": "トップページの「注目のプロジェクト」の上に指定したスタジオの最新のプロジェクトを表示します。" }, @@ -521,15 +381,7 @@ "highlight-unanswered/description": { "message": "フォーラムの返信されていないトピックに青いハイライトを追加します。" }, - "hide-project-tags/title": { - "message": "プロジェクトのタグの非表示" - }, - "hide-project-tags/description": { - "message": "プロジェクトの「使い方」と「メモとクレジット」に書かれているリンクされているタグをすべて非表示にします。" - }, - "search-assets/title": { - "message": "アセット検索" - }, + "search-assets/title": { "message": "アセット検索" }, "search-assets/description": { "message": "エディターでコスチュームや音の資料を検索できます。" }, @@ -539,9 +391,7 @@ "block-count-in-mystuff/description": { "message": "「私の作品」でプロジェクトのブロック数を表示します。" }, - "pause-audio/title": { - "message": "音の一時停止" - }, + "pause-audio/title": { "message": "音の一時停止" }, "pause-audio/description": { "message": "エディターの音エディターで音の一時停止と再生ができます。" }, @@ -551,21 +401,15 @@ "display-message-count-in-icon/description": { "message": "ScratchToolsの拡張機能のアイコンにメッセージ数を表示します。" }, - "colored-context-menus/title": { - "message": "色付きの右クリックメニュー" - }, + "colored-context-menus/title": { "message": "色付きの右クリックメニュー" }, "colored-context-menus/description": { "message": "Scratch 2.0のように右クリックメニューにクリックしたブロックの色と同じ色をつけます。" }, - "left-side-stage/title": { - "message": "ステージを左に表示" - }, + "left-side-stage/title": { "message": "ステージを左に表示" }, "left-side-stage/description": { "message": "Scratch 2.0のようにステージをエディターの左側に表示します。" }, - "move-project-title-input/title": { - "message": "タイトルボックスの移動" - }, + "move-project-title-input/title": { "message": "タイトルボックスの移動" }, "move-project-title-input/description": { "message": "Scratch 2.0のようにプロジェクトのタイトル入力ボックスを上のバーではなく、ステージの上に移動します。これはエディターにのみ適用されます。" }, @@ -575,15 +419,11 @@ "hide-disabled-menu-options/description": { "message": "エディターに表示される右クリックメニューは無効の機能も表示されます。この機能により、無効の機能が非表示になります。" }, - "follower-count/title": { - "message": "プロジェクトでフォロワー数を表示" - }, + "follower-count/title": { "message": "プロジェクトでフォロワー数を表示" }, "follower-count/description": { "message": "プロジェクトの作者名の隣にそのユーザーのフォロワー数を表示します。" }, - "hide-studio-borders/title": { - "message": "スタジオのアイコンの枠の非表示" - }, + "hide-studio-borders/title": { "message": "スタジオのアイコンの枠の非表示" }, "hide-studio-borders/description": { "message": "2.0版のスタジオの画像の周囲の枠を非表示にします。" }, @@ -593,9 +433,7 @@ "hide-textarea-labels/description": { "message": "使い方やメモとクレジットの枠の上の文字は枠内の情報を表示するのを妨げています。この機能はそれらを非表示にします。" }, - "default-to-trending/title": { - "message": "デフォルトで傾向を検索" - }, + "default-to-trending/title": { "message": "デフォルトで傾向を検索" }, "default-to-trending/description": { "message": "現在Scratchではプロジェクトを検索すると、人気のあるプロジェクトが表示されるようになっています。この機能はデフォルトで傾向のプロジェクトが表示されるようになります。" }, @@ -617,9 +455,7 @@ "special-editor-fonts/description": { "message": "ペイントエディターのテキストで使えるより美しく現代的なフォントを追加しました。" }, - "get-project-tags/title": { - "message": "プロジェクトのタグの別表示" - }, + "get-project-tags/title": { "message": "プロジェクトのタグの別表示" }, "get-project-tags/description": { "message": "プロジェクトのメモとクレジットの下にそのプロジェクトで使われたすべてのタグを表示します。" }, @@ -629,9 +465,7 @@ "link-to-propose/description": { "message": "トップページの「注目のプロジェクト」と注目のプロジェクトを提案するスタジオをリンクさせます" }, - "add-last-option-list/title": { - "message": "リスト項目を最後に設定" - }, + "add-last-option-list/title": { "message": "リスト項目を最後に設定" }, "add-last-option-list/description": { "message": "「[リスト] の [番号] 番目」ブロックを右クリックして、選択したリストの最後の項目を選択できるように設定します。" }, @@ -641,9 +475,7 @@ "cloud-scratchers/description": { "message": "オンラインゲームのプロジェクトに参加しているユーザーの一覧を表示します。" }, - "editor-in-two/title": { - "message": "2.0エディター" - }, + "editor-in-two/title": { "message": "2.0エディター" }, "editor-in-two/description": { "message": "デフォルトの3.0オンラインエディターを2.0エディターに置き換えます。" }, @@ -659,81 +491,55 @@ "turbowarp-button-in-editor/description": { "message": "プロジェクトをすぐにTurboWarpで開くことができるように、エディターにボタンを追加します。" }, - "sprite-clones/title": { - "message": "スプライトのクローンカウンター" - }, + "sprite-clones/title": { "message": "スプライトのクローンカウンター" }, "sprite-clones/description": { "message": "それぞれのスプライトのクローン数を表示します。" }, - "block-log/title": { - "message": "ブロックの履歴" - }, + "block-log/title": { "message": "ブロックの履歴" }, "block-log/description": { "message": "ctrl+shift+lを押したときにブロックエディターのすべてのブロックを履歴を表示します。" }, - "scrollable-list-items/title": { - "message": "スクロールできるリストの項目" - }, + "scrollable-list-items/title": { "message": "スクロールできるリストの項目" }, "scrollable-list-items/description": { "message": "リスト自体の幅より長い値が書かれているリストの項目を左右にスクロールできるようになります。" }, - "custom-fonts/title": { - "message": "サイトのフォントの変更" - }, + "custom-fonts/title": { "message": "サイトのフォントの変更" }, "custom-fonts/description": { "message": "Scratch上で表示されるフォントをGoogle Fontsのサイトにある好きなフォントに設定することができます。大文字と小文字は区別されます。" }, - "project-timer/title": { - "message": "プロジェクトのタイマー" - }, + "project-timer/title": { "message": "プロジェクトのタイマー" }, "project-timer/description": { "message": "プロジェクトが実行されている時間(秒)を表示します。" }, - "colored-comments/title": { - "message": "色付けされたエディターのコメント" - }, + "colored-comments/title": { "message": "色付けされたエディターのコメント" }, "colored-comments/description": { "message": "ブロックエディターのコメントをブロックの色と同じにします。" }, - "recently-viewed-projects/title": { - "message": "最近見たプロジェクト" - }, + "recently-viewed-projects/title": { "message": "最近見たプロジェクト" }, "recently-viewed-projects/description": { "message": "私の作品のページに最近見たプロジェクトの一覧を表示するタブを追加します。" }, - "collapse-blocks/title": { - "message": "折りたためるブロック" - }, + "collapse-blocks/title": { "message": "折りたためるブロック" }, "collapse-blocks/description": { "message": "エディターの右クリックメニューに、選択したブロックを折りたたむためのボタンを追加します。" }, - "set-featured-project/title": { - "message": "注目のプロジェクトを設定" - }, + "set-featured-project/title": { "message": "注目のプロジェクトを設定" }, "set-featured-project/description": { "message": "プロジェクトページでボタンをクリックするだけで簡単に自分のプロフィールの注目のプロジェクトに設定することができます。" }, - "scratchformat/title": { - "message": "ScratchFormat" - }, + "scratchformat/title": { "message": "ScratchFormat" }, "scratchformat/description": { "message": "太字や斜体など、コメントの書式を設定できます。ScratchToolsを使用している人にのみ表示されます。" }, - "expand-editor/title": { - "message": "エディターの拡大" - }, + "expand-editor/title": { "message": "エディターの拡大" }, "expand-editor/description": { "message": "Ctrl+Eでデフォルトのブロックエディター表示と、ステージを隠してエディターを拡大する表示を切り替えられます。" }, - "list-sprites/title": { - "message": "スプライトリスト" - }, + "list-sprites/title": { "message": "スプライトリスト" }, "list-sprites/description": { "message": "エディタ内の全スプライトをスプライトのブロック数と位置を含むリストで表示します。" }, - "check-if-trending/title": { - "message": "傾向入りしているかを表示" - }, + "check-if-trending/title": { "message": "傾向入りしているかを表示" }, "check-if-trending/description": { "message": "閲覧中のプロジェクトが英語の傾向にある場合、プロジェクトページの公開日の横に英語の傾向での場所が表示されます。" }, @@ -743,9 +549,7 @@ "link-forum-activity/description": { "message": "フォーラムの最終投稿欄で、ユーザー名をユーザーのプロフィールにリンクします。" }, - "remove-topic-and-post/title": { - "message": "フォーラムのカテゴリの非表示" - }, + "remove-topic-and-post/title": { "message": "フォーラムのカテゴリの非表示" }, "remove-topic-and-post/description": { "message": "フォーラムのトップページのトピック数と投稿数を非表示にします。" }, @@ -761,99 +565,67 @@ "remove-collapse-buttons/description": { "message": "フォーラムのトップページで折りたたみボタンを非表示にします。" }, - "pin-projects/title": { - "message": "プロジェクトを「私の作品」にピン留め" - }, + "pin-projects/title": { "message": "プロジェクトを「私の作品」にピン留め" }, "pin-projects/description": { "message": "プロジェクトページで「Pin」ボタンをクリックして、プロジェクトを「私の作品」ページのトップにピン留めできます。ピン留めしたプロジェクトを解除したり、別のプロジェクトに入れ替えることもできます。" }, - "last-key-pressed/title": { - "message": "最後に押されたキー" - }, + "last-key-pressed/title": { "message": "最後に押されたキー" }, "last-key-pressed/description": { "message": "プロジェクトページとエディターで、そのプロジェクトで最後に押したキーを表示します。これはプラットフォーマーのようなゲームに適しています。" }, - "hide-signatures/title": { - "message": "フォーラムの署名の非表示" - }, + "hide-signatures/title": { "message": "フォーラムの署名の非表示" }, "hide-signatures/description": { "message": "フォーラムの署名と署名の区切り線を非表示にします。" }, - "twemoji-in-forums/title": { - "message": "フォーラムの絵文字の改善" - }, + "twemoji-in-forums/title": { "message": "フォーラムの絵文字の改善" }, "twemoji-in-forums/description": { "message": "低解像度のフォーラムの絵文字を、高画質のTwemojisに置き換えます。" }, - "go-to-parent/title": { - "message": "「リミックス元に移動」ボタン" - }, + "go-to-parent/title": { "message": "「リミックス元に移動」ボタン" }, "go-to-parent/description": { "message": "リミックスされたプロジェクトのエディターで、ボタンをクリックすると、リミックス元のプロジェクトのエディターに移動します。" }, - "most-popular-project/title": { - "message": "一番有名なプロジェクト" - }, + "most-popular-project/title": { "message": "一番有名なプロジェクト" }, "most-popular-project/description": { "message": "プロフィールページに、そのユーザーの最も人気(参照数)のあるプロジェクトを表示します。プロジェクトをクリックすると表示されます。" }, - "editor-dark-mode/title": { - "message": "エディターのダークモード" - }, + "editor-dark-mode/title": { "message": "エディターのダークモード" }, "editor-dark-mode/description": { "message": "エディターの明るい配色を暗い配色に切り替えます。" }, - "hide-studio-group-icon/title": { - "message": "スタジオのアイコンを非表示" - }, + "hide-studio-group-icon/title": { "message": "スタジオのアイコンを非表示" }, "hide-studio-group-icon/description": { "message": "スタジオのアイコンを非表示にし、スタジオ名のみ表示します。" }, - "colored-messages/title": { - "message": "色付きのメッセージ" - }, + "colored-messages/title": { "message": "色付きのメッセージ" }, "colored-messages/description": { "message": "好き、お気に入り、スタジオ招待など、メッセージの種類に応じて色を付けます。" }, - "full-title/title": { - "message": "全体のプロジェクト名" - }, + "full-title/title": { "message": "全体のプロジェクト名" }, "full-title/description": { "message": "プロフィールでプロジェクト名にカーソルを合わせると、プロジェクト名の全文が表示されます。" }, - "fixed-box/title": { - "message": "右クリックメニューの修正" - }, + "fixed-box/title": { "message": "右クリックメニューの修正" }, "fixed-box/description": { "message": "プロフィールなどのボックスの上の角だけでなく、すべての角を丸くします。" }, - "user-bio/title": { - "message": "カーソルを合わせてプロフィールの表示" - }, + "user-bio/title": { "message": "カーソルを合わせてプロフィールの表示" }, "user-bio/description": { "message": "プロフィールのコメントで、ユーザー名にカーソルを合わせると、そのユーザーのプロフィールが表示されます。" }, - "nfe-project-checker/title": { - "message": "NFEプロジェクトチェッカー" - }, + "nfe-project-checker/title": { "message": "NFEプロジェクトチェッカー" }, "nfe-project-checker/description": { "message": "プロジェクトが「Safe(安全)」「Unreviewed(未審査)」「NSFE(万人むけでない)」のどれに評価されているかを表示します。" }, - "sprite-data/title": { - "message": "スプライトの情報を表示" - }, + "sprite-data/title": { "message": "スプライトの情報を表示" }, "sprite-data/description": { "message": "各スプライトのコード、コスチューム、音タブに、スプライトのブロックの数、コスチュームの数、音の数が表示されます。" }, - "aviate/title": { - "message": "Aviateのステータス" - }, + "aviate/title": { "message": "Aviateのステータス" }, "aviate/description": { "message": "プロフィールページにAviateのステータスを表示します。ステータスはaviate.scratchers.techで設定できます。" }, - "idea-generator/title": { - "message": "プロジェクトのアイデア生成器" - }, + "idea-generator/title": { "message": "プロジェクトのアイデア生成器" }, "idea-generator/description": { "message": "Scratchのアイデアのページに、必要に応じてプロジェクトのアイデアを生成できるチュートリアルを追加します。" }, @@ -863,15 +635,11 @@ "hide-stickies/description": { "message": "フォーラムの一番上にあるピン止めされたトピックのピン止めを外します。" }, - "nfe-search/title": { - "message": "NFE検索" - }, + "nfe-search/title": { "message": "NFE検索" }, "nfe-search/description": { "message": "普段表示されないNFE(万人向けでないプロジェクト)を含む全プロジェクトを検索します。" }, - "open-in-new-tab/title": { - "message": "新しいタブで開く" - }, + "open-in-new-tab/title": { "message": "新しいタブで開く" }, "open-in-new-tab/description": { "message": "プロジェクトページ上のリンクを自動的に新しいタブで開きます。" }, @@ -881,27 +649,19 @@ "unbold-site-text/description": { "message": "Scratchのすべての太字のテキストが通常のテキストになります。" }, - "compact-navbar/title": { - "message": "コンパクトなナビゲーションバー" - }, + "compact-navbar/title": { "message": "コンパクトなナビゲーションバー" }, "compact-navbar/description": { "message": "ナビゲーションバーを縮めて、プロフィールの下のスペースを広くします。" }, - "delete-all/title": { - "message": "全てのスプライトの削除" - }, + "delete-all/title": { "message": "全てのスプライトの削除" }, "delete-all/description": { "message": "スプライトの右クリックメニューにすべてのスプライトを削除するオプションを追加しました(確認画面が表示されます)。" }, - "round-profile-pictures/title": { - "message": "丸いプロフィールアイコン" - }, + "round-profile-pictures/title": { "message": "丸いプロフィールアイコン" }, "round-profile-pictures/description": { "message": "プロフィールのアイコンが丸くなります。" }, - "ocular-link/title": { - "message": "フォーラムでのOcularへのリンク" - }, + "ocular-link/title": { "message": "フォーラムでのOcularへのリンク" }, "ocular-link/description": { "message": "投稿したユーザーのユーザー名の下にOcularページへのリンクを追加します。" }, @@ -911,21 +671,15 @@ "forum-scratch-team/description": { "message": "フォーラムに参加しているScratch Teamのメンバーのユーザー名の横には、アスタリスク(*)が付けられます。" }, - "remove-editor-icons/title": { - "message": "エディターのアイコンの非表示" - }, + "remove-editor-icons/title": { "message": "エディターのアイコンの非表示" }, "remove-editor-icons/description": { "message": "エディターの横に表示されているブロックカテゴリーのアイコンを削除します。" }, - "sprite-watermark/title": { - "message": "スプライトの透かしの非表示" - }, + "sprite-watermark/title": { "message": "スプライトの透かしの非表示" }, "sprite-watermark/description": { "message": "コードエディターの右上に表示されているスプライトの透かしを非表示にします。" }, - "compact-editor/title": { - "message": "コンパクトなエディター" - }, + "compact-editor/title": { "message": "コンパクトなエディター" }, "compact-editor/description": { "message": "スプライトや背景の情報をよりコンパクトにします。" }, @@ -935,10 +689,8 @@ "my-recent-projects/description": { "message": "トップページのScratchニュースを最近のプロジェクトに置き換えます。" }, - "focus-mode/title": { - "message": "フォーカスモード" - }, + "focus-mode/title": { "message": "フォーカスモード" }, "focus-mode/description": { "message": "ボタンをクリックすると、プロジェクトページのコメント、スタジオ、リミックス、ヘッダー、フッターを削除します。" } -} \ No newline at end of file +} diff --git a/extras/feature-locales/tr.json b/extras/feature-locales/tr.json index 44fcf47a..4dfa5982 100644 --- a/extras/feature-locales/tr.json +++ b/extras/feature-locales/tr.json @@ -1,115 +1,101 @@ { - "fullscreen-explorer/title": { - "message": "Tam Ekran Proje Izgaraları" + "stage-in-spritepane/title": { "message": "Kukla Bölmesinde Sahne" }, + "stage-in-spritepane/description": { + "message": "Sprite alanını genişletmek için sahne düğmesini kukla bölmesine taşıyın." }, - "fullscreen-explorer/description": { - "message": "Trendler, Arama, Remix sayfalarında sol ve sağdaki boşlukları kaldırarak projeleri büyük ekranda bulun." + "better-cloud-history/title": { "message": "Daha İyi Bulut Geçmişi" }, + "better-cloud-history/description": { + "message": "Bulut monitörü sayfasını daha fazla ayrıntı içeren daha modern bir sürüme günceller. Değişkene göre sıralamak için değişken adlarına tıklayabilirsiniz." }, - "total-stats/title": { - "message": "Toplam Kullanıcı İstatistikleri" + "sprite-layers/title": { "message": "Kukla Katmanlarını Görüntüle" }, + "sprite-layers/description": { + "message": "Kukla katmanlarını görüntülemek için düzenleyicinin kukla özellikleri panelindeki göster/gizle geçişinin üzerine gelmenizi sağlar." }, - "total-stats/description": { - "message": "Kullanıcının profilindeki paylaşılan projelerin yanında, kullanıcının tüm paylaşılan projelerinde aldığı toplam beğeniler, favoriler ve görüntülemeler görüntülenir." + "hide-project-tags/title": { "message": "Proje Etiketlerini Gizle" }, + "hide-project-tags/description": { + "message": "Projelerin Talimatlarında / Notlarında ve Kredilerinde bağlantılı tüm etiketleri gizler." }, - "project-miniplayer/title": { - "message": "Proje Mini Ekranı" + "snap-to-grid/title": { "message": "Komut Dosyalarını Izgaraya Yapıştırma" }, + "snap-to-grid/description": { + "message": "Kodlar yerleştirildiğinde düzenleyicideki noktalı ızgaraya otomatik olarak hizalanır." }, - "project-miniplayer/description": { - "message": "Proje sayfasını aşağı kaydırdığınızda otomatik olarak proje mini ekranını göreceksiniz." + "select-self/title": { "message": "Kendini Seç" }, + "select-self/description": { + "message": "Kukla açılır menülerini açarken yalnızca diğer kuklalar yerine geçerli kuklayı seçmenizi sağlar." + }, + "sidebar/title": { "message": "Kenar çubuğu" }, + "sidebar/description": { + "message": "Ekranın üst kısmındaki normal gezinme çubuğu yerine Scratch web sitesine bir kenar çubuğu ekler." }, - "project-descriptions/title": { - "message": "Özetlenmiş Talimatlar" + "project-version-detector/title": { "message": "Proje Sürümü Dedektörü" }, + "project-version-detector/description": { + "message": "Bir projenin ne zaman paylaşıldığını kontrol eder ve o sırada Scratch'in hangi sürümünün kullanıldığını belirtmek için paylaşım tarihinin yanına bir etiket ekler." + }, + "fullscreen-explorer/title": { "message": "Tam Ekran Proje Izgaraları" }, + "fullscreen-explorer/description": { + "message": "Trendler, Arama, Remix sayfalarında sol ve sağdaki boşlukları kaldırarak projeleri büyük ekranda bulun." }, + "project-descriptions/title": { "message": "Özetlenmiş Talimatlar" }, "project-descriptions/description": { "message": "İstediğiniz zaman proje talimatlarını özetlemek için yapay zekayı kullanır ve uzun açıklamaları oyun talimatları gibi önemli bilgilere kadar kısaltır." }, - "pin-comments/title": { - "message": "Proje Yorumlarını İğnele" + "total-stats/title": { "message": "Toplam Kullanıcı İstatistikleri" }, + "total-stats/description": { + "message": "Kullanıcının profilindeki paylaşılan projelerin yanında, kullanıcının tüm paylaşılan projelerinde aldığı toplam beğeniler, favoriler ve görüntülemeler görüntülenir." + }, + "project-miniplayer/title": { "message": "Proje Mini Ekranı" }, + "project-miniplayer/description": { + "message": "Proje sayfasını aşağı kaydırdığınızda otomatik olarak proje mini ekranını göreceksiniz." }, + "pin-comments/title": { "message": "Proje Yorumlarını İğnele" }, "pin-comments/description": { "message": "Yorumları kendi projelerinize sabitlemenize ve diğer projelere hangi yorumların sabitlendiğini görmenize olanak tanır." }, - "sidebar/title": { - "message": "Kenar çubuğu" - }, - "sidebar/description": { - "message": "Ekranın üst kısmındaki normal gezinme çubuğu yerine Scratch web sitesine bir kenar çubuğu ekler." - }, - "project-version-detector/title": { - "message": "Proje Sürümü Dedektörü" - }, - "project-version-detector/description": { - "message": "Bir projenin ne zaman paylaşıldığını kontrol eder ve o sırada Scratch'in hangi sürümünün kullanıldığını belirtmek için paylaşım tarihinin yanına bir etiket ekler." - }, - "download-project/title": { - "message": "Projeleri İndir" - }, + "download-project/title": { "message": "Projeleri İndir" }, "download-project/description": { "message": "Proje sayfalarına, projeyi .sb3 dosyası olarak indirmenize olanak tanıyan bir buton ekler." }, - "blur-modal/title": { - "message": "Modal Arka Planları Bulanıklaştır" - }, + "blur-modal/title": { "message": "Modal Arka Planları Bulanıklaştır" }, "blur-modal/description": { "message": "Modalların renkli bir örtü yerine arka planlarını bulanıklaştırır." }, - "quick-search/title": { - "message": "Hızlı Arama" - }, + "quick-search/title": { "message": "Hızlı Arama" }, "quick-search/description": { "message": "Scratch web sitesinde Control + K tuşlarına basarak sayfalar arasında kolayca geçiş yapın." }, - "favicon-messages/title": { - "message": "Sekme Mesaj Sayısı" - }, + "favicon-messages/title": { "message": "Sekme Mesaj Sayısı" }, "favicon-messages/description": { "message": "Tab favicon'da mesaj sayınızı, sekmenizin üstündeki Scratch simgesini görüntüler." }, - "show-emoji-names/title": { - "message": "Emoji İsmini Göster" - }, + "show-emoji-names/title": { "message": "Emoji İsmini Göster" }, "show-emoji-names/description": { "message": "Yorumlardaki Scratch emojilerinin üzerine gelerek isimlerini görmenizi sağlar." }, - "more-block-themes/title": { - "message": "Daha Fazla Blok Teması" - }, + "more-block-themes/title": { "message": "Daha Fazla Blok Teması" }, "more-block-themes/description": { "message": "Kod düzenleyicisindeki bloklar için ek temalar ekler." }, - "more-key-inputs/title": { - "message": "Daha Fazla Anahtar Girişi" - }, + "more-key-inputs/title": { "message": "Daha Fazla Anahtar Girişi" }, "more-key-inputs/description": { "message": "\"Tuşa basıldı\" bloklarında daha fazla tuş desteği ekler." }, - "comment-tags/title": { - "message": "Editör Yorum Etiketleri" - }, + "comment-tags/title": { "message": "Editör Yorum Etiketleri" }, "comment-tags/description": { "message": "Editör yorumlarına etiket ekleyerek onları kolayca düzenleyin." }, - "profile-flag/title": { - "message": "Profilde Bayrak" - }, + "profile-flag/title": { "message": "Profilde Bayrak" }, "profile-flag/description": { "message": "Profil sayfalarında seçilen konumların yakınına bayrak emojileri ekler." }, - "follow-on-projects/title": { - "message": "Proje Sayfasını Takip Et" - }, + "follow-on-projects/title": { "message": "Proje Sayfasını Takip Et" }, "follow-on-projects/description": { "message": "Profiline gitmek yerine, kullanıcıları doğrudan proje sayfasından takip et." }, - "dark-paint-editor/title": { - "message": "Boya Arka Planını Değiştir" - }, + "dark-paint-editor/title": { "message": "Boya Arka Planını Değiştir" }, "dark-paint-editor/description": { "message": "Boyama editöründe yakınlaştırma kontrollerinin yanına bir düğme ekler. Bu düğme, boyama editörünün arka plan rengini açık ve koyu arasında değiştirmenize olanak sağlar." }, - "specific-replies/title": { - "message": "Özel Yanıt Mesajları" - }, + "specific-replies/title": { "message": "Özel Yanıt Mesajları" }, "specific-replies/description": { "message": "Yorumlara ilişkin iletilerde, bir yorumun hangi kişiye yanıt olduğunu belirtir." }, @@ -119,81 +105,51 @@ "better-trending-thumbnails/description": { "message": "Trend ve arama sayfalarındaki küçük resimleri güncelleyerek, proje/stüdyo kutusuna daha büyük ve daha iyi uyacak şekilde düzenler." }, - "relevant-forum-posts/title": { - "message": "İlgili forum gönderilerini görüntüle." - }, - "relevant-forum-posts/description": { - "message": "Yeni bir forum konusu oluştururken, oluşturduğunuz konuyla benzer olabilecek diğer konuları gösterir." - }, - "anti-generic/title": { - "message": "Anti Jenerik" - }, + "anti-generic/title": { "message": "Anti Jenerik" }, "anti-generic/description": { "message": "Keşfet ve trend sayfalarında, bu beta özelliği, genel olmasını beklediği projelerle birlikte tekrarlayan projeleri otomatik olarak gizler. Bu, çok sayıda etiket, ortak ad ve proje kopyası içeren projeleri içerir." }, - "wrap-lists/title": { - "message": "Kaydırılabilen Liste Öğeleri" - }, + "wrap-lists/title": { "message": "Kaydırılabilen Liste Öğeleri" }, "wrap-lists/description": { "message": "Liste öğelerinde metni normal olarak görüntüler eğer çok uzunlarsa kesmeden gösterir." }, - "live-stats/title": { - "message": "Canlı istatistikler" - }, + "live-stats/title": { "message": "Canlı istatistikler" }, "live-stats/description": { "message": "Bir projedeki beğenileri, favorileri, remixleri ve görüntülemeleri yeniden yüklemeye gerek duymadan canlı olarak günceller." }, - "hide-scratch-news/title": { - "message": "Scratch Haberlerini Gizle" - }, + "hide-scratch-news/title": { "message": "Scratch Haberlerini Gizle" }, "hide-scratch-news/description": { "message": "Scratch web sitesinin ana sayfasındaki Scratch Haberler bölümünü gizler." }, - "watch-later/title": { - "message": "Kaydedip Sonra İzle" - }, + "watch-later/title": { "message": "Kaydedip Sonra İzle" }, "watch-later/description": { "message": "Sonradan tekrar izlemek istediğiniz projeleri kaydedin ve sonra ise bunları daha sonra izlemek için bir \"İzlemek İçin Kaydet\" adlı bir sayfadan tekrar izleyebilirsiniz." }, - "remove-project-button/title": { - "message": "Proje Düğmesini Kaldır" - }, + "remove-project-button/title": { "message": "Proje Düğmesini Kaldır" }, "remove-project-button/description": { "message": "Stüdyolardaki projelere kolayca erişim sağlayan ve projeyi menüyü açmadan stüdyodan çıkartmanıza izin veren bir düğme ekler." }, - "right-side-flag/title": { - "message": "Bayrak Sağ Tarafta" - }, + "right-side-flag/title": { "message": "Bayrak Sağ Tarafta" }, "right-side-flag/description": { "message": "Yeşil bayrağı ve kırmızı dur işaretini sahne'nin sağ tarafına taşır." }, - "love-fave-animate/title": { - "message": "Animasyonlu Butonlar." - }, + "love-fave-animate/title": { "message": "Animasyonlu Butonlar." }, "love-fave-animate/description": { "message": "Projelerin sayfalarındaki \"Kalp\" ve \"Yıldız\" düğmelerinin tıklanmasını animasyonlaştırır." }, - "default-to-local/title": { - "message": "Varsayılan olarak Yerel" - }, + "default-to-local/title": { "message": "Varsayılan olarak Yerel" }, "default-to-local/description": { "message": "Bir değişken oluştururken, varsayılanı Tüm Hareketli Grafikler için değil, Yalnızca Bu Hareketli Grafik için ayarlar." }, - "start-stop-hotkeys/title": { - "message": "Yeşil Bayrak Kısayolları" - }, + "start-stop-hotkeys/title": { "message": "Yeşil Bayrak Kısayolları" }, "start-stop-hotkeys/description": { "message": "Bir projeyi başlatmak veya durdurmak için Ctrl ve G Tuşlarına aynı anda basın. " }, - "opacity-slider/title": { - "message": "Düzenleyici Saydamlık Ayarı" - }, + "opacity-slider/title": { "message": "Düzenleyici Saydamlık Ayarı" }, "opacity-slider/description": { "message": "Resim düzenleyicide nesnelerin şeffaflığını değiştirmeye yarayan bir kısım ekler." }, - "more-studios/title": { - "message": "Daha Fazla Stüdyo" - }, + "more-studios/title": { "message": "Daha Fazla Stüdyo" }, "more-studios/description": { "message": "Projenizi en fazla 20 Stüdyo'ya koyabilme kapasitesini artırır." }, @@ -203,51 +159,35 @@ "localized-explore/description": { "message": "Keşfet sayfasında, diğer ülkelerden gelen projeleri %10 Şeffaf hale getirir. Bu, yalnızca kendi dilinizdeki projeleri göstermek içindir." }, - "project-bar/title": { - "message": "Proje Bilgi Çubuğu" - }, + "project-bar/title": { "message": "Proje Bilgi Çubuğu" }, "project-bar/description": { "message": "Proje bilgilerini, notlar ve kredilerin altına kaydırdıktan sonra bile görüntülemeye devam etmesini sağlar." }, - "more-news/title": { - "message": "Daha Fazla Scratch Haberi" - }, + "more-news/title": { "message": "Daha Fazla Scratch Haberi" }, "more-news/description": { "message": "Ana sayfada Scratch Haberleri kısmına aşağı kaydırıp eski haberleri görmek için bir buton ekler." }, - "dumpster-fire/title": { - "message": "Çöplük Ateşi" - }, + "dumpster-fire/title": { "message": "Çöplük Ateşi" }, "dumpster-fire/description": { "message": "Scratch ana sayfası, \"Öne Çıkan Projeler\" bölümüyle bir yanlıştır. Bu, adı \"Çöplük Ateşi\" olan uygun forma değiştirir." }, - "steal-game/title": { - "message": "Oyunları Çal." - }, + "steal-game/title": { "message": "Oyunları Çal." }, "steal-game/description": { "message": "Remix düğmesinin metnini 'Oyun Çal' olarak değiştirir." }, - "statistics/title": { - "message": "Kullanıcı istatistikleri" - }, + "statistics/title": { "message": "Kullanıcı istatistikleri" }, "statistics/description": { "message": "Scratch'te \"Kendiminkiler sayfasına ScratchStats (Scratch istatistikleri) profilinize yönlendiren bir istatistik düğmesi ekler." }, - "echo-effect/title": { - "message": "Yankı Efekti" - }, + "echo-effect/title": { "message": "Yankı Efekti" }, "echo-effect/description": { "message": "Scratch'te ses düzenleyicisi kısmına Yankı butonunu ekler." }, - "compact-buttons/title": { - "message": "Yazıları simgeye çevir." - }, + "compact-buttons/title": { "message": "Yazıları simgeye çevir." }, "compact-buttons/description": { "message": "Scratch'teki butonlardaki metin kaldırılır, sadece simgesi görünür. Eğer bir simgesi yoksa yeni bir simge eklenir" }, - "message-count/title": { - "message": "Kullanıcı Mesaj Sayısı" - }, + "message-count/title": { "message": "Kullanıcı Mesaj Sayısı" }, "message-count/description": { "message": "Kullanıcıların profil kısmında kullanıcı bilgilerindeki kişinin ülke bilgisinin yanında kullanıcının bakılmamış mesaj sayısı gözükür." }, @@ -257,15 +197,11 @@ "move-share-button/description": { "message": "Projelerin sayfasında, Paylaş düğmesini \"İçine Bak\" düğmesinin yanına taşır." }, - "preview-textboxes/title": { - "message": "Metin kutularını önizleme" - }, + "preview-textboxes/title": { "message": "Metin kutularını önizleme" }, "preview-textboxes/description": { "message": "Scratch profilinizde \"Hakkımda\" ve \"Üzerinde Çalıştığım Proje\" veya \nScratch projelerinizde \"Notlar\" ve \"Talimatları\", sanki başka bir hesaptan\nbakıyormuş gibi ön izlemenizi sağlar." }, - "more-tutorials/title": { - "message": "Daha Fazla Öğretici" - }, + "more-tutorials/title": { "message": "Daha Fazla Öğretici" }, "more-tutorials/description": { "message": "Fikirler sayfasında, diğer Scratch kullanıcılarından ekstra rehberleri görebilirsiniz." }, @@ -275,33 +211,19 @@ "simplify-action-buttons/description": { "message": "Proje eylem düğmelerini, notlar ve kredilerin altında simgeleri olarak gösterir." }, - "slash-to-search/title": { - "message": "Arama Kısayolları" - }, + "slash-to-search/title": { "message": "Arama Kısayolları" }, "slash-to-search/description": { "message": "Arama çubuğunu seçmek ve yazmaya başlamak için \" / \" tuşuna tıklayın." }, - "shared-clipboard/title": { - "message": "Paylaşılan resim panosu" - }, + "shared-clipboard/title": { "message": "Paylaşılan resim panosu" }, "shared-clipboard/description": { "message": "Farklı projelerdeki resim düzenleyicileri arasında öğeleri kopyalamanıza ve yapıştırmanıza izin verir." }, - "important-messages/title": { - "message": "Önemli Mesajlar" - }, - "important-messages/description": { - "message": "Mesajlar sayfasında önemli mesajları ayırır." - }, - "hide-footer/title": { - "message": "Alt bilgiyi Gizle" - }, + "hide-footer/title": { "message": "Alt bilgiyi Gizle" }, "hide-footer/description": { "message": "Altbilgi gereksiz fazla alan kaplıyor, bu yüzden gizleyelim!" }, - "original-colors/title": { - "message": "Mavi'ye Geri Dön" - }, + "original-colors/title": { "message": "Mavi'ye Geri Dön" }, "original-colors/description": { "message": "Scratch'in tüm web sitesini mor renkten, Scratch 3.0'daki gibi maviye çevirir." }, @@ -311,75 +233,51 @@ "simplify-editor-tabs/description": { "message": "Editör'deki butonları yalnızca simge halinde gösterir ve onları bir daire olarak gösterir." }, - "live-character-counts/title": { - "message": "Canlı Karakter Sayısı" - }, + "live-character-counts/title": { "message": "Canlı Karakter Sayısı" }, "live-character-counts/description": { "message": "Forum, stüdyo ve proje sayfalarında metin kutuları için canlı karakter sayısını gösterir." }, - "advanced-search/title": { - "message": "Profilleri Ara" - }, + "advanced-search/title": { "message": "Profilleri Ara" }, "advanced-search/description": { "message": "Scratch'te Arama bölümünde kullanıcıyı aradığınızda, aradığınız kullanıcının profilinize giden bir bağlantı butonu ekler." }, - "studio-links/title": { - "message": "İsimli stüdyo bağlantıları" - }, + "studio-links/title": { "message": "İsimli stüdyo bağlantıları" }, "studio-links/description": { "message": "Scratch web sitesindeki tüm stüdyo bağlantılarını stüdyo ismiyle değiştirir." }, - "block-studios/title": { - "message": "Bireysel Stüdyo Etkinliğini Engelle" - }, + "block-studios/title": { "message": "Bireysel Stüdyo Etkinliğini Engelle" }, "block-studios/description": { "message": "Belirli stüdyolardan stüdyo etkinliği mesajlarını devre dışı bırakın." }, - "block-messages/title": { - "message": "Kullanıcıları Engelle" - }, + "block-messages/title": { "message": "Kullanıcıları Engelle" }, "block-messages/description": { "message": "Engellediğiniz kullanıcılardan gelen mesajları gizler. \nDiğer kullanıcılar sizi engellediğinizi görmeyecek." }, - "two-colors/title": { - "message": "2.0 Blok Renkleri" - }, + "two-colors/title": { "message": "2.0 Blok Renkleri" }, "two-colors/description": { "message": "Düzenleyicideki blokların renklerini, kod düzenleyicisinin 2.0 sürümündeki bloklarla değiştirir." }, - "project-links/title": { - "message": "İsimli proje bağlantıları" - }, + "project-links/title": { "message": "İsimli proje bağlantıları" }, "project-links/description": { "message": "Scratch web sitesindeki tüm proje bağlantılarını proje ismiyle değiştirir." }, - "emoji-status/title": { - "message": "Emoji Durumu" - }, + "emoji-status/title": { "message": "Emoji Durumu" }, "emoji-status/description": { "message": "Profilinizdeki durumu bir emoji olarak ayarlar. \nDiğer ScratchTools kullanıcıları bu durumu görebilir." }, - "display-name/title": { - "message": "Görünen İsimler" - }, + "display-name/title": { "message": "Görünen İsimler" }, "display-name/description": { "message": "Scratch kullanıcıları için görünen adlarınızı gösterir ve kendi görünen adınızı ayarlamanıza olanak sağlar. Görünen adlar, kullanıcı adlarınız gibi sınırlı değildir ve kullanıcı adınızın yanında görüntülenir." }, - "isonline/title": { - "message": "Kullanıcının aktifliği" - }, + "isonline/title": { "message": "Kullanıcının aktifliği" }, "isonline/description": { "message": "Profil sayfalarında kullanıcının çevrimiçi olup olmadığını gösterir. Bu aynı zamanda diğer kullanıcıların sizi çevrimiçi olup olmadığını görmelerini sağlar." }, - "plain-background/title": { - "message": "Noktasız editör arka planı" - }, + "plain-background/title": { "message": "Noktasız editör arka planı" }, "plain-background/description": { "message": "Kod düzenleyicisinin arka planındaki noktaları kaldırır." }, - "hide-advertisements/title": { - "message": "Mesajlardaki Reklamları Kaldır" - }, + "hide-advertisements/title": { "message": "Mesajlardaki Reklamları Kaldır" }, "hide-advertisements/description": { "message": "Profillerin, projelerin ve stüdyoların yorumlarındaki reklamları gizler. Yorumlarda çok yer kaplayabilirler." }, @@ -389,9 +287,7 @@ "hide-block-category-names/description": { "message": "Düzenleyicideki blok kategorilerini yalnızca kategorilerin renklerini gösterecek şekilde değiştirir." }, - "unlisted-projects/title": { - "message": "Liste Dışı Projeler" - }, + "unlisted-projects/title": { "message": "Liste Dışı Projeler" }, "unlisted-projects/description": { "message": "Düzenleyicide paylaşılmayan projeler için paylaşım bağlantıları oluşturmanıza olanak tanır." }, @@ -401,33 +297,23 @@ "stats-percentages/description": { "message": "Kendiminkiler sayfasında, beğenilerin, favorilerin veya remixlerin üzerine gelerek, bu eylemi gerçekleştiren izleyicilerin yüzdesini görüntüleyebilirsiniz." }, - "clone-counter/title": { - "message": "Klon Sayacı" - }, + "clone-counter/title": { "message": "Klon Sayacı" }, "clone-counter/description": { "message": "Projedeki kopya sayısını sahne başlığının üzerinde görüntüler." }, - "colored-shadows/title": { - "message": "Renkli Gölgeler" - }, + "colored-shadows/title": { "message": "Renkli Gölgeler" }, "colored-shadows/description": { "message": "Bir bloğu diğer bir bloğa yaklaştırdığınızda oluşan gölgeyi taşınan bloğun rengi ile değiştirir." }, - "creator-badge/title": { - "message": "Proje Sahibi Rozeti" - }, + "creator-badge/title": { "message": "Proje Sahibi Rozeti" }, "creator-badge/description": { "message": "Projeyi oluşturan kişinin yazdığı yorumların yanına bir rozet ekler." }, - "original-buttons/title": { - "message": "Orijinal Butonlar" - }, + "original-buttons/title": { "message": "Orijinal Butonlar" }, "original-buttons/description": { "message": "Orijinal kalp, favori, remix ve görünüm düğmelerini Scratch projesi sayfalarına döndürür." }, - "box-shadows/title": { - "message": "İçerik Kutusu Gölgeleri" - }, + "box-shadows/title": { "message": "İçerik Kutusu Gölgeleri" }, "box-shadows/description": { "message": "Tüm içerik kutularına gölgeler ekler. Birinin üzerine gelindiğinde gölge koyulaşır." }, @@ -437,69 +323,45 @@ "admin-notifications/description": { "message": "Scratch Ekibinden bir yönetici bildiriminiz varsa, gezinme çubuğundaki mesaj göstergesi turuncu yerine kırmızı renkte görüntülenir." }, - "nicknames/title": { - "message": "Takma Adlar" - }, + "nicknames/title": { "message": "Takma Adlar" }, "nicknames/description": { "message": "Diğer Scratch'çiler için takma adlar belirleyin. Takma adları yalnızca siz görebilirsiniz ve adlarını gördüğünüzde kullanıcı adları takma adla değiştirilecektir." }, - "load-more-forum-posts/title": { - "message": "Daha fazla gönderi yükle" - }, + "load-more-forum-posts/title": { "message": "Daha fazla gönderi yükle" }, "load-more-forum-posts/description": { "message": "Sayfaları değiştirmek zorunda kalmadan forumda daha fazla gönderi yükleyin." }, - "scroll-project-titles/title": { - "message": "Proje Başlıklarını Kaydır" - }, + "scroll-project-titles/title": { "message": "Proje Başlıklarını Kaydır" }, "scroll-project-titles/description": { "message": "Sahip olmadığınız projelerin başlığının tamamını kaydırmanıza ve görüntülemenize olanak tanır." }, - "search-context-menus/title": { - "message": "Arama Bağlam Menüleri" - }, + "search-context-menus/title": { "message": "Arama Bağlam Menüleri" }, "search-context-menus/description": { "message": "Seçeneği hızlı bir şekilde seçmek için tür ve arama bağlam menülerini kullanabilirsiniz. Ayrıca en üst seçeneği seçmek için \"enter\" tuşunu da kullanabilirsiniz." }, - "hover-user-cards/title": { - "message": "Kullanıcı Vurgulu Kartları" - }, + "hover-user-cards/title": { "message": "Kullanıcı Vurgulu Kartları" }, "hover-user-cards/description": { "message": "Profil resmini, kullanıcı adını ve takipçi sayısını görüntülemek için web sitesindeki herhangi bir kullanıcı adının üzerine gelin." }, - "exact-join-date/title": { - "message": "Tam Katılım Tarihi" - }, + "exact-join-date/title": { "message": "Tam Katılım Tarihi" }, "exact-join-date/description": { "message": "Bir kullanıcının katıldığı tam zamanı profilinde gösterir." }, - "upload-img-directly/title": { - "message": "Doğrudan Resim Yüklemeleri" - }, + "upload-img-directly/title": { "message": "Doğrudan Resim Yüklemeleri" }, "upload-img-directly/description": { "message": "Scratch forumları için iletiler ve imzalar için resim yüklemenize olanak tanır, üçüncü taraf resim yükleme hizmetlerini kullanmanıza gerek kalmaz." }, - "leave-studio/title": { - "message": "Stüdyodan Ayrıl Düğmesi" - }, + "leave-studio/title": { "message": "Stüdyodan Ayrıl Düğmesi" }, "leave-studio/description": { "message": "Yönettiğiniz veya katkıda bulunduğunuz stüdyoların küratörler sayfasına stüdyodan ayrılmanızı sağlayan bir düğme ekler. İlk olarak bir onay gösterilir." }, - "user-stats/title": { - "message": "Kullanıcı İstatistiklerini Göster" - }, - "user-stats/description": { - "message": "Bir profil sayfasındaki 'Ne yapıyorum' bölümünü kullanıcının istatistikleriyle değiştirir." - }, "frontpage-curator/title": { "message": "Ön sayfa İdareci Adı Bağlantı olarak" }, "frontpage-curator/description": { "message": "Ön sayfa İdarecinin adını profiline tıklanabilir bir bağlantıya dönüştürür." }, - "minimized-remix-credits/title": { - "message": "Küçültülmüş Remix Kredileri" - }, + "minimized-remix-credits/title": { "message": "Küçültülmüş Remix Kredileri" }, "minimized-remix-credits/description": { "message": "Projeler için remix kredi kutuları proje Talimatlarından yer kaplar, bu nedenle bu kutuyu küçültür." }, @@ -509,9 +371,7 @@ "follows-you/description": { "message": "Bir kullanıcı sizi takip ediyorsa, profilini ziyaret ettiğinizde kullanıcı adının yanında gösterilir." }, - "custom-studio/title": { - "message": "Özel Stüdyo Bölümü" - }, + "custom-studio/title": { "message": "Özel Stüdyo Bölümü" }, "custom-studio/description": { "message": "Scratch web sitesinin ana sayfasında, seçtiğiniz stüdyodan en yeni projeler Öne Çıkan Projelerin üzerinde görüntülenir." }, @@ -521,15 +381,7 @@ "highlight-unanswered/description": { "message": "Forumlarda yanıtı olmayan konulara mavi bir vurgu ekler." }, - "hide-project-tags/title": { - "message": "Proje Etiketlerini Gizle" - }, - "hide-project-tags/description": { - "message": "Projelerin Talimatlarında / Notlarında ve Kredilerinde bağlantılı tüm etiketleri gizler." - }, - "search-assets/title": { - "message": "Aranabilir Kuklalar" - }, + "search-assets/title": { "message": "Aranabilir Kuklalar" }, "search-assets/description": { "message": "Editörde kostüm ve ses kuklalarını aramak için bir kısım ekler." }, @@ -539,33 +391,23 @@ "block-count-in-mystuff/description": { "message": "Eşyalarım sayfasında projelerin blok sayısını görüntüler." }, - "pause-audio/title": { - "message": "Sesi Duraklat" - }, + "pause-audio/title": { "message": "Sesi Duraklat" }, "pause-audio/description": { "message": "Scratch projelerinin ses düzenleyicisinde sesi duraklatmanıza ve devam ettirmenize olanak tanır." }, - "display-message-count-in-icon/title": { - "message": "Mesaj Sayısını Göster" - }, + "display-message-count-in-icon/title": { "message": "Mesaj Sayısını Göster" }, "display-message-count-in-icon/description": { "message": "Mevcut mesaj sayınızı ScratchTools için uzantı simgesinde görüntüler." }, - "colored-context-menus/title": { - "message": "Renkli İçerik Menüleri" - }, + "colored-context-menus/title": { "message": "Renkli İçerik Menüleri" }, "colored-context-menus/description": { "message": "Scratch 2.0'da olduğu gibi, bağlam menülerini, amaçlandıkları bloğun rengine göre renklendirir." }, - "left-side-stage/title": { - "message": "Sol Tarafta Sahne" - }, + "left-side-stage/title": { "message": "Sol Tarafta Sahne" }, "left-side-stage/description": { "message": "Scratch 2.0'da olduğu gibi, sahneyi sağda tutmak yerine editörün sol tarafına taşır." }, - "move-project-title-input/title": { - "message": "Aşama Üstü Proje Başlığı" - }, + "move-project-title-input/title": { "message": "Aşama Üstü Proje Başlığı" }, "move-project-title-input/description": { "message": "Scratch 2.0'da olduğu gibi, proje başlığı giriş kutusunu gezinme çubuğundan ziyade sahne alanının üzerine taşır. Bu sadece editör için geçerlidir." }, @@ -575,15 +417,11 @@ "hide-disabled-menu-options/description": { "message": "Düzenleyicideki içerik menüsü seçenekleri, devre dışı bırakılmış ve kullanılamıyor olsalar bile gösterilir, bu nedenle bu özellik, devre dışı bırakılmışlarsa bunları gizler." }, - "follower-count/title": { - "message": "Projelere Takipçi Sayısı" - }, + "follower-count/title": { "message": "Projelere Takipçi Sayısı" }, "follower-count/description": { "message": "Proje oluşturucunun takipçi sayısını projelerinde görüntüler." }, - "hide-studio-borders/title": { - "message": "Stüdyo Çerçevelerini Gizle" - }, + "hide-studio-borders/title": { "message": "Stüdyo Çerçevelerini Gizle" }, "hide-studio-borders/description": { "message": "2.0 sayfalarındaki stüdyo görüntülerinin etrafındaki tek kareleri kaldırır." }, @@ -593,9 +431,7 @@ "hide-textarea-labels/description": { "message": "Talimatlar, notlar ve kredi etiketleri, olağan bilgilerin olabileceği oldukça fazla yer kaplar. Bu onları ortadan kaldırır." }, - "default-to-trending/title": { - "message": "Varsayılan Olarak Trend Ara" - }, + "default-to-trending/title": { "message": "Varsayılan Olarak Trend Ara" }, "default-to-trending/description": { "message": "Şu anda, Scratch web sitesinde projeler aradığınızda, trend olmak yerine otomatik olarak popüler filtreyle arama yaparsınız." }, @@ -617,9 +453,7 @@ "special-editor-fonts/description": { "message": "Kostüm Editörüne Daha Fazla Yazı Tipi Ekler. Daha güzel görünüyorlar ve daha modernler." }, - "get-project-tags/title": { - "message": "Proje Etiketlerini Görüntüleme" - }, + "get-project-tags/title": { "message": "Proje Etiketlerini Görüntüleme" }, "get-project-tags/description": { "message": "Proje açıklamasında kullanılan tüm etiketleri proje notlarının ve kredilerinin hemen altında listeler." }, @@ -641,9 +475,7 @@ "cloud-scratchers/description": { "message": "Proje sayfalarında, o anda o çok oyunculu oyunda bulunan tüm Scratch'çileri görüntüler." }, - "editor-in-two/title": { - "message": "2.0 Düzenleyici" - }, + "editor-in-two/title": { "message": "2.0 Düzenleyici" }, "editor-in-two/description": { "message": "Varsayılan 3.0 çevrimiçi proje düzenleyicisini 2.0 düzenleyicisiyle değiştirir. Gerçekten nostaljik." }, @@ -659,75 +491,51 @@ "turbowarp-button-in-editor/description": { "message": "Geçerli projeyi turbowarp'ta anında açabilmeniz için editöre bir düğme ekler." }, - "sprite-clones/title": { - "message": "Hareketli Grafik Klon Sayacı" - }, + "sprite-clones/title": { "message": "Hareketli Grafik Klon Sayacı" }, "sprite-clones/description": { "message": "Her bir hareketli grafik için klon sayısını görüntüler." }, - "block-log/title": { - "message": "Günlüğü Engelle" - }, + "block-log/title": { "message": "Günlüğü Engelle" }, "block-log/description": { "message": "Ctrl+shift+l tuşlarına bastığınızda blok düzenleyicinin tüm geri alma bilgilerini günlüğe kaydeder ve görüntüler." }, - "scrollable-list-items/title": { - "message": "Kaydırılabilir Liste Öğeleri" - }, + "scrollable-list-items/title": { "message": "Kaydırılabilir Liste Öğeleri" }, "scrollable-list-items/description": { "message": "Listenin genişliğinden daha uzun bir değere sahip liste öğeleri kesilir. Artık liste öğesinde sola ve sağa kaydırabilirsiniz." }, - "custom-fonts/title": { - "message": "Özel Web Sitesi Yazı Tipi" - }, + "custom-fonts/title": { "message": "Özel Web Sitesi Yazı Tipi" }, "custom-fonts/description": { "message": "Scratch web sitesinde, yazı tipini Google Fonts web sitesinde olduğu sürece istediğiniz yazı tipine ayarlayabilirsiniz. Bu büyük / küçük harfe duyarlıdır." }, - "project-timer/title": { - "message": "Proje Zamanlayıcısı" - }, + "project-timer/title": { "message": "Proje Zamanlayıcısı" }, "project-timer/description": { "message": "Projenin çalıştığı süreyi (saniye cinsinden) görüntüler." }, - "colored-comments/title": { - "message": "Renkli Editör Yorumları" - }, + "colored-comments/title": { "message": "Renkli Editör Yorumları" }, "colored-comments/description": { "message": "Düzenleyicideki yorumları üst bloğunun rengine göre renklendirir." }, - "recently-viewed-projects/title": { - "message": "Son Görüntülenen Projeler" - }, + "recently-viewed-projects/title": { "message": "Son Görüntülenen Projeler" }, "recently-viewed-projects/description": { "message": "Son görüntülediğiniz projelerin listesini görebileceğiniz Kendiminkiler sayfasına bir sekme ekler." }, - "collapse-blocks/title": { - "message": "Blokları Daralt" - }, + "collapse-blocks/title": { "message": "Blokları Daralt" }, "collapse-blocks/description": { "message": "Düzenleyicideki blok menülerine sağ tıkla, seçilen bloğu daraltmanıza izin verecek bir düğme içerir." }, - "set-featured-project/title": { - "message": "Öne Çıkan Projeyi Ayarla" - }, + "set-featured-project/title": { "message": "Öne Çıkan Projeyi Ayarla" }, "set-featured-project/description": { "message": "Herhangi bir proje sayfasında bir düğmeye tıklayarak profilinizin öne çıkan projesini ayarlayabilirsiniz, hatta paylaşılmamış projeleri bile." }, - "scratchformat/title": { - "message": "Scratch Formatı" - }, + "scratchformat/title": { "message": "Scratch Formatı" }, "scratchformat/description": { "message": "Yorumlarınızı kalın, italik ve daha fazlası ile biçimlendirebilirsiniz. Yorumlar, ScratchTools kullanan herkes için stil kazanır." }, - "expand-editor/title": { - "message": "Düzenleyiciyi Genişlet" - }, + "expand-editor/title": { "message": "Düzenleyiciyi Genişlet" }, "expand-editor/description": { "message": "Ctrl+E tuş kombinasyonunu kullanarak varsayılan blok düzenleyici görünümü ile sahneyi gizleyerek düzenleyiciyi genişleten görünüm arasında geçiş yapabilirsiniz." }, - "list-sprites/title": { - "message": "Kukla Listesi" - }, + "list-sprites/title": { "message": "Kukla Listesi" }, "list-sprites/description": { "message": "Düzenleyicideki kukla ızgarasını, kuklanın blok sayısını ve konumunu içeren bir listeyle değiştirir." }, @@ -749,9 +557,7 @@ "remove-topic-and-post/description": { "message": "Forum ana sayfası konusunu ve gönderi kutularını gizler." }, - "forum-homepage-emojis/title": { - "message": "Forum Kategorisi Emojileri" - }, + "forum-homepage-emojis/title": { "message": "Forum Kategorisi Emojileri" }, "forum-homepage-emojis/description": { "message": "Forum ana sayfası kategorilerine konularına göre renkli emojiler ekler." }, @@ -761,171 +567,115 @@ "remove-collapse-buttons/description": { "message": "Forum ana sayfasındaki daralt düğmelerini gizler." }, - "pin-projects/title": { - "message": "Projeleri Kendiminkilere Sabitle" - }, + "pin-projects/title": { "message": "Projeleri Kendiminkilere Sabitle" }, "pin-projects/description": { "message": "Kendiminkiler sayfanızın üstüne bir projeyi bir düğmeye tıklayarak sabitleyebilirsiniz. Sabitlenmiş projenizi sabitlemeyi kaldırabilir veya başka bir projeyi sabitlenmiş projenizle değiştirebilirsiniz." }, - "last-key-pressed/title": { - "message": "Basılan Son Tuş" - }, + "last-key-pressed/title": { "message": "Basılan Son Tuş" }, "last-key-pressed/description": { "message": "Herhangi bir proje sayfasında ve editörde, projeye göre o projede son bastığınız tuşu görebilirsiniz. Bu, platform tarzı oyunlar gibi oyunlar için faydalı olabilir." }, - "hide-signatures/title": { - "message": "Forum İmzalarını Gizle" - }, + "hide-signatures/title": { "message": "Forum İmzalarını Gizle" }, "hide-signatures/description": { "message": "Tüm forum imzalarını ve imza bölücülerini gizler." }, - "twemoji-in-forums/title": { - "message": "Daha iyi Forum Emojileri" - }, + "twemoji-in-forums/title": { "message": "Daha iyi Forum Emojileri" }, "twemoji-in-forums/description": { "message": "Mevcut düşük çözünürlüklü forum emojilerini yüksek kaliteli Twemoji ile değiştirir." }, - "go-to-parent/title": { - "message": "Ana Düğmeye Git" - }, + "go-to-parent/title": { "message": "Ana Düğmeye Git" }, "go-to-parent/description": { "message": "Remix olan herhangi bir projenin düzenleyicisinde, üst projedeki düzenleyiciye gitmek için bir düğmeyi tıklatabilirsiniz." }, - "most-popular-project/title": { - "message": "En Popüler Proje" - }, + "most-popular-project/title": { "message": "En Popüler Proje" }, "most-popular-project/description": { "message": "Kullanıcının en popüler projesini (görünümlere göre) profil sayfalarında görüntüler. Görüntülemek için projeye tıklayabilirsiniz." }, - "editor-dark-mode/title": { - "message": "Editör Karanlık Modu" - }, + "editor-dark-mode/title": { "message": "Editör Karanlık Modu" }, "editor-dark-mode/description": { "message": "Editörün açık renk düzenini daha koyu bir düzene geçirir." }, - "hide-studio-group-icon/title": { - "message": "Stüdyo Grubu Simgesini Gizle" - }, + "hide-studio-group-icon/title": { "message": "Stüdyo Grubu Simgesini Gizle" }, "hide-studio-group-icon/description": { "message": "Stüdyo grubu simgesini gizler ve yalnızca stüdyo küçük resmini gösterir." }, - "colored-messages/title": { - "message": "Renkli Mesajlar" - }, + "colored-messages/title": { "message": "Renkli Mesajlar" }, "colored-messages/description": { "message": "Mesajlarınızı türüne göre renklendirir, örneğin beğeniler, favoriler ve stüdyo davetiyeleri gibi." }, - "full-title/title": { - "message": "Projenin Tam Adı" - }, + "full-title/title": { "message": "Projenin Tam Adı" }, "full-title/description": { "message": "Profil sayfalarında, başlığın tamamını göstermek için herhangi bir proje başlığının üzerine gelin." }, - "fixed-box/title": { - "message": "İçerik Kutularını Düzeltin" - }, + "fixed-box/title": { "message": "İçerik Kutularını Düzeltin" }, "fixed-box/description": { "message": "Sayfalardaki kutuların tüm kenarlarını yalnızca üst kısımlar yerine yuvarlatılmış hale getirir." }, - "user-bio/title": { - "message": "Vurgulu Kullanıcı Biyografisi" - }, + "user-bio/title": { "message": "Vurgulu Kullanıcı Biyografisi" }, "user-bio/description": { "message": "Profil yorumlarında, kullanıcının biyografisini görüntülemek için herhangi bir kullanıcı adının üzerine gelin." }, - "nfe-project-checker/title": { - "message": "NFE Proje Denetleyicisi" - }, + "nfe-project-checker/title": { "message": "NFE Proje Denetleyicisi" }, "nfe-project-checker/description": { "message": "Proje sayfalarında, projenin Güvenli, Görüntülenmemiş veya NSFE (Herkes için Güvenli Değil) olup olmadığını görüntüler." }, - "sprite-data/title": { - "message": "Hareketli Grafik Verilerini Görüntüleme" - }, + "sprite-data/title": { "message": "Hareketli Grafik Verilerini Görüntüleme" }, "sprite-data/description": { "message": "Her hareketli grafik için Kod, Kostümler ve Sesler sekmesinde geçerli hareketli grafik için blok, kostüm ve ses sayısı görüntülenir." }, - "aviate/title": { - "message": "Havacılık Durumları" - }, + "aviate/title": { "message": "Havacılık Durumları" }, "aviate/description": { "message": "Profil sayfalarında Aviate durumlarını görüntüler. Durumunuzu aviate.scratchers.tech adresinde ayarlayabilirsiniz." }, - "idea-generator/title": { - "message": "Proje Fikir Üreteci" - }, + "idea-generator/title": { "message": "Proje Fikir Üreteci" }, "idea-generator/description": { "message": "Scratch Fikirler sayfasında, ihtiyacınız varsa proje fikirleri oluşturabileceğiniz bir bölüm olacak." }, - "hide-stickies/title": { - "message": "Forum Yapışkanlarını Gizle" - }, + "hide-stickies/title": { "message": "Forum Yapışkanlarını Gizle" }, "hide-stickies/description": { "message": "Her forum konusunun üst kısmındaki temel yapışkanları gizler." }, - "nfe-search/title": { - "message": "NFE Araması" - }, + "nfe-search/title": { "message": "NFE Araması" }, "nfe-search/description": { "message": "NFE projeleri de dahil olmak üzere tüm projeleri aramak için bir düğme kullanın." }, - "open-in-new-tab/title": { - "message": "Yeni Sekmede Aç" - }, + "open-in-new-tab/title": { "message": "Yeni Sekmede Aç" }, "open-in-new-tab/description": { "message": "Proje sayfalarındaki bağlantıları otomatik olarak yeni bir sekmede açar." }, - "unbold-site-text/title": { - "message": "Site Metninin Kalınlığını Kaldır" - }, + "unbold-site-text/title": { "message": "Site Metninin Kalınlığını Kaldır" }, "unbold-site-text/description": { "message": "Tüm Scratch üzerindeki metinlerin kalın olmayan, yani normal metin olarak görüntülenmesini sağlar." }, - "compact-navbar/title": { - "message": "Kompakt Gezinme Çubuğu" - }, + "compact-navbar/title": { "message": "Kompakt Gezinme Çubuğu" }, "compact-navbar/description": { "message": "Profil açılır listenizin bulunduğu yere yakın gezinme çubuğunda daha fazla yer açar." }, - "delete-all/title": { - "message": "Tüm Kuklaları Sil" - }, + "delete-all/title": { "message": "Tüm Kuklaları Sil" }, "delete-all/description": { "message": "Kuklalar için sağ tıklama bağlam menüsüne bir seçenek ekler. Tüm kuklaları silecektir (bir kaza olmadığından emin olmak için onaylandıktan sonra)." }, - "round-profile-pictures/title": { - "message": "Yuvarlak Profil Resimleri" - }, + "round-profile-pictures/title": { "message": "Yuvarlak Profil Resimleri" }, "round-profile-pictures/description": { "message": "Scratch web sitesindeki tüm profil resimleri yuvarlatılacaktır." }, - "ocular-link/title": { - "message": "Forumlardaki Oküler Bağlantılar" - }, + "ocular-link/title": { "message": "Forumlardaki Oküler Bağlantılar" }, "ocular-link/description": { "message": "Herhangi bir kullanıcının Oküler sayfasına, bir gönderideki kullanıcı adının hemen altına bir bağlantı ekler." }, - "forum-scratch-team/title": { - "message": "Forumlarda Scratch Ekibi Sembolü" - }, + "forum-scratch-team/title": { "message": "Forumlarda Scratch Ekibi Sembolü" }, "forum-scratch-team/description": { "message": "Forumlardaki herhangi bir Scratch Ekibi üyesinin kullanıcı adının yanında, kullanıcı adının sonuna bir yıldız işareti (*) yerleştirilir." }, - "remove-editor-icons/title": { - "message": "Düzenleyici Simgelerini Kaldır" - }, + "remove-editor-icons/title": { "message": "Düzenleyici Simgelerini Kaldır" }, "remove-editor-icons/description": { "message": "Simgeleri düzenleyicideki sekmelerden kaldırır." }, - "sprite-watermark/title": { - "message": "Kukla Filigranını Kaldır" - }, + "sprite-watermark/title": { "message": "Kukla Filigranını Kaldır" }, "sprite-watermark/description": { "message": "Düzenleyicide gösterilen kukla filigranını kaldırır." }, - "compact-editor/title": { - "message": "Kompakt Düzenleyici" - }, + "compact-editor/title": { "message": "Kompakt Düzenleyici" }, "compact-editor/description": { "message": "Kukla ve arka plan bilgilerini daha kompakt hale getirir." }, @@ -935,10 +685,8 @@ "my-recent-projects/description": { "message": "Ana sayfadaki Scratch Haberleri bölümünü son paylaşılan projelerinizle değiştirir." }, - "focus-mode/title": { - "message": "Odak Modu" - }, + "focus-mode/title": { "message": "Odak Modu" }, "focus-mode/description": { "message": "Düğme tıklatıldığında proje sayfalarındaki yorumları, stüdyo ve remix sütununu, üstbilgiyi ve altbilgiyi kaldırır." } -} \ No newline at end of file +} diff --git a/extras/games/tetris/index.html b/extras/games/tetris/index.html new file mode 100644 index 00000000..7902d6f9 --- /dev/null +++ b/extras/games/tetris/index.html @@ -0,0 +1,13 @@ + + + + + + Tetris Game + + + + + + + diff --git a/extras/games/tetris/styles.css b/extras/games/tetris/styles.css new file mode 100644 index 00000000..ed00833b --- /dev/null +++ b/extras/games/tetris/styles.css @@ -0,0 +1,38 @@ +body, +html { + height: 100%; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + transition: background-color 0.3s; +} + +canvas { + border: 0px; + display: block; + background-color: white; + padding: 0.5rem; + border-radius: 0.5rem; +} + +body.colorful { + animation: gradientFlash 5s infinite; + background: linear-gradient(to right, #ffc700, #ff0000); +} + +@keyframes gradientFlash { + 0%, + 100% { + background-position: 0%; + } + 25% { + background-position: 100%; + } + 50% { + background-position: 100%; + } + 75% { + background-position: 0%; + } +} \ No newline at end of file diff --git a/extras/games/tetris/tetris.js b/extras/games/tetris/tetris.js new file mode 100644 index 00000000..27757050 --- /dev/null +++ b/extras/games/tetris/tetris.js @@ -0,0 +1,291 @@ +const canvas = document.getElementById('gameCanvas'); +const context = canvas.getContext('2d'); +const grid = 32; +const tetrominoSequence = []; + +// Keep track of what is in every cell of the game using a 2d array +const playfield = []; + +// Create the empty state for the playfield +for (let row = -2; row < 20; row++) { + playfield[row] = []; + + for (let col = 0; col < 10; col++) { + playfield[row][col] = 0; + } +} + +// how to draw each tetromino +// @see https://tetris.fandom.com/wiki/Tetris_Guideline +const tetrominos = { + 'I': [ + [0,0,0,0], + [1,1,1,1], + [0,0,0,0], + [0,0,0,0] + ], + 'J': [ + [1,0,0], + [1,1,1], + [0,0,0], + ], + 'L': [ + [0,0,1], + [1,1,1], + [0,0,0], + ], + 'O': [ + [1,1], + [1,1], + ], + 'S': [ + [0,1,1], + [1,1,0], + [0,0,0], + ], + 'Z': [ + [1,1,0], + [0,1,1], + [0,0,0], + ], + 'T': [ + [0,1,0], + [1,1,1], + [0,0,0], + ] +}; + +// color of each tetromino +const colors = { + 'I': '#36b5ff', + 'O': '#ffe436', + 'T': '#d036ff', + 'S': '#36ff6b', + 'Z': '#ff3636', + 'J': '#3646ff', + 'L': '#ff9a36' +}; + +// Keep track of the position of the current tetromino +let tetromino = getNextTetromino(); +let rAF = null; // keep track of the animation frame so we can cancel it +let gameOver = false; + +// Get the next tetromino in the sequence +function getNextTetromino() { + if (tetrominoSequence.length === 0) { + const tetrominos = ['I', 'J', 'L', 'O', 'S', 'Z', 'T']; + + while (tetrominos.length) { + const rand = getRandomInt(0, tetrominos.length - 1); + const name = tetrominos.splice(rand, 1)[0]; + tetrominoSequence.push(name); + } + } + + const name = tetrominoSequence.pop(); + const matrix = tetrominos[name]; + + const col = playfield[0].length / 2 - Math.ceil(matrix[0].length / 2); + + const row = name === 'I' ? -1 : -2; + + document.body.style.backgroundColor = colors[name] + + return { + name: name, // name of the piece (L, O, etc.) + matrix: matrix, // the current rotation matrix + row: row, // current row (starts offscreen) + col: col // current col + }; +} + +// Generate a random number between min and max (inclusive) +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +// Rotate the matrix 90 degrees clockwise +function rotate(matrix) { + const N = matrix.length - 1; + const result = matrix.map((row, i) => + row.map((val, j) => matrix[N - j][i]) + ); + + return result; +} + +// Check to see if the new matrix/row/col is valid +function isValidMove(matrix, cellRow, cellCol) { + for (let row = 0; row < matrix.length; row++) { + for (let col = 0; col < matrix[row].length; col++) { + if (matrix[row][col] && ( + cellCol + col < 0 || + cellCol + col >= playfield[0].length || + cellRow + row >= playfield.length || + playfield[cellRow + row][cellCol + col]) + ) { + return false; + } + } + } + + return true; +} + +// Place the tetromino on the playfield +function placeTetromino() { + for (let row = 0; row < tetromino.matrix.length; row++) { + for (let col = 0; col < tetromino.matrix[row].length; col++) { + if (tetromino.matrix[row][col]) { + + // game over if piece has any part offscreen + if (tetromino.row + row < 0) { + return showGameOver(); + } + + playfield[tetromino.row + row][tetromino.col + col] = tetromino.name; + } + } + } + + for (let row = playfield.length - 1; row >= 0; ) { + if (playfield[row].every(cell => !!cell)) { + + for (let r = row; r >= 0; r--) { + for (let c = 0; c < playfield[r].length; c++) { + playfield[r][c] = playfield[r-1][c]; + } + } + } + else { + row--; + } + } + + tetromino = getNextTetromino(); +} + +// Show the game over screen +function showGameOver() { + cancelAnimationFrame(rAF); + gameOver = true; + + context.fillStyle = 'black'; + context.globalAlpha = 0.75; + context.fillRect(0, canvas.height / 2 - 30, canvas.width, 60); + + context.globalAlpha = 1; + context.fillStyle = 'white'; + context.font = '36px monospace'; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillText('GAME OVER!', canvas.width / 2, canvas.height / 2); +} + +// Draw the tetromino +function drawTetromino() { + context.fillStyle = colors[tetromino.name]; + + for (let row = 0; row < tetromino.matrix.length; row++) { + for (let col = 0; col < tetromino.matrix[row].length; col++) { + if (tetromino.matrix[row][col]) { + + context.fillRect((tetromino.col + col) * grid, (tetromino.row + row) * grid, grid, grid); + } + } + } +} + +// Draw the playfield +function drawPlayfield() { + for (let row = 0; row < playfield.length; row++) { + for (let col = 0; col < playfield[row].length; col++) { + if (playfield[row][col]) { + const name = playfield[row][col]; + context.fillStyle = colors[name]; + + context.fillRect(col * grid, row * grid, grid, grid); + } + } + } +} + +// Listen to keyboard events to move the active tetromino +document.addEventListener('keydown', function(e) { + if (gameOver) return; + + // Left arrow key (move left) + if (e.which === 37 || e.keyCode === 37) { + const col = tetromino.col - 1; + if (isValidMove(tetromino.matrix, tetromino.row, col)) { + tetromino.col = col; + } + } + + // Right arrow key (move right) + if (e.which === 39 || e.keyCode === 39) { + const col = tetromino.col + 1; + if (isValidMove(tetromino.matrix, tetromino.row, col)) { + tetromino.col = col; + } + } + + // Up arrow key (rotate) + if (e.which === 38 || e.keyCode === 38) { + const matrix = rotate(tetromino.matrix); + if (isValidMove(matrix, tetromino.row, tetromino.col)) { + tetromino.matrix = matrix; + } + } + + // Down arrow key (soft drop) + if (e.which === 40 || e.keyCode === 40) { + const row = tetromino.row + 1; + if (!isValidMove(tetromino.matrix, row, tetromino.col)) { + tetromino.row = row - 1; + placeTetromino(); + return; + } + + tetromino.row = row; + } + + if (e.which === 32 || e.keyCode === 32) { + while (isValidMove(tetromino.matrix, tetromino.row + 1, tetromino.col)) { + tetromino.row++; + } + placeTetromino(); + } +}); + +// Game loop +function loop() { + rAF = requestAnimationFrame(loop); + context.clearRect(0,0,canvas.width,canvas.height); + + drawPlayfield(); + drawTetromino(); + + if (++count > 35) { + tetromino.row++; + count = 0; + + if (!isValidMove(tetromino.matrix, tetromino.row, tetromino.col)) { + tetromino.row--; + placeTetromino(); + } + } +} + +// Fit the canvas to the screen +canvas.width = 10 * grid; // 10 columns +canvas.height = 20 * grid; // 20 rows + +// Keep track of time +let count = 0; + +// Start the game loop +rAF = requestAnimationFrame(loop); diff --git a/extras/icons/external.svg b/extras/icons/external.svg new file mode 100644 index 00000000..445732ca --- /dev/null +++ b/extras/icons/external.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extras/index.html b/extras/index.html index a60d0cfa..deecad57 100644 --- a/extras/index.html +++ b/extras/index.html @@ -102,7 +102,7 @@

-

All features

+

All features