diff --git a/.eslintignore b/.eslintignore index c735e410ac3..f06202dbaa1 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,6 +9,7 @@ lib/ace/mode/xml/* lib/ace/mode/xquery/* lib/ace/mode/xquery.js lib/ace/mode/yaml/* +src/lib/default_english_messages.js **/test/asyncjs/* **/es5-shim.js **/vim*.js diff --git a/Makefile.dryice.js b/Makefile.dryice.js index 734423fc83f..7ac4d0cb023 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -654,16 +654,23 @@ function extractCss(callback) { } function extractNls() { - var allMessages = {}; + var defaultData = require(__dirname + "/src/lib/default_english_messages").defaultEnglishMessages; + searchFiles(__dirname + "/src", function(path) { if (/_test/.test(path)) return; var text = fs.readFileSync(path, "utf8"); - var matches = text.match(/nls\s*\(\s*("([^"\\]|\\.)+"|'([^'\\]|\\.)+')/g); + var matches = text.match(/nls\s*\(\s*("([^"\\]|\\.)+"|'([^'\\]|\\.)+'),\s*("([^"\\]|\\.)+"|'([^'\\]|\\.)+')/g); matches && matches.forEach(function(m) { - var eng = m.replace(/^nls\s*\(\s*["']|["']$/g, ""); - allMessages[eng] = ""; + var match = m.match(/("([^"\\]|\\.)+"|'([^'\\]|\\.)+)/g); + var key = match[0].replace(/["']|["']$/g, ""); + var defaultString = match[1].replace(/["']|["']$/g, ""); + + // If the key not yet in the default file, add it: + if (defaultData[key] !== undefined) return; + defaultData[key] = defaultString; }); }); + fs.writeFileSync(__dirname + "/src/lib/default_english_messages.js", "var defaultEnglishMessages = " + JSON.stringify(defaultData, null, 4) + "\n\nexports.defaultEnglishMessages = defaultEnglishMessages;", "utf8"); fs.readdirSync(__dirname + "/translations").forEach(function(x) { if (!/\.json$/.test(x)) return; @@ -671,11 +678,10 @@ function extractNls() { var existingStr = fs.readFileSync(path, "utf8"); var existing = JSON.parse(existingStr); - var newData = {$id: existing.$id}; - for (var i in allMessages) { - newData[i] = existing[i] || ""; + for (var i in defaultData) { + existing[i] = existing[i] || ""; } - fs.writeFileSync(path, JSON.stringify(newData, null, 4), "utf8"); + fs.writeFileSync(path, JSON.stringify(existing, null, 4), "utf8"); console.log("Saved " + x); }); } diff --git a/src/autocomplete.js b/src/autocomplete.js index 95fa49f66c7..e921caa9c50 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -121,7 +121,7 @@ class Autocomplete { } static get completionsForLoading() { return [{ - caption: config.nls("Loading..."), + caption: config.nls("autocomplete.loading", "Loading..."), value: "" }]; } diff --git a/src/autocomplete/popup.js b/src/autocomplete/popup.js index 1211922e57d..99afd326ac9 100644 --- a/src/autocomplete/popup.js +++ b/src/autocomplete/popup.js @@ -62,8 +62,8 @@ class AcePopup { // Set aria attributes for the popup popup.renderer.$textLayer.element.setAttribute("role", popupAriaRole); - popup.renderer.$textLayer.element.setAttribute("aria-roledescription", nls("Autocomplete suggestions")); - popup.renderer.$textLayer.element.setAttribute("aria-label", nls("Autocomplete suggestions")); + popup.renderer.$textLayer.element.setAttribute("aria-roledescription", nls("autocomplete.popup.aria-roledescription", "Autocomplete suggestions")); + popup.renderer.$textLayer.element.setAttribute("aria-label", nls("autocomplete.popup.aria-label", "Autocomplete suggestions")); popup.renderer.textarea.setAttribute("aria-hidden", "true"); popup.setOption("displayIndentGuides", false); @@ -152,7 +152,7 @@ class AcePopup { t.element.setAttribute("aria-activedescendant", ariaId); el.setAttribute("aria-activedescendant", ariaId); selected.setAttribute("role", optionAriaRole); - selected.setAttribute("aria-roledescription", nls("item")); + selected.setAttribute("aria-roledescription", nls("autocomplete.popup.item.aria-roledescription", "item")); selected.setAttribute("aria-label", popup.getData(row).caption || popup.getData(row).value); selected.setAttribute("aria-setsize", popup.data.length); selected.setAttribute("aria-posinset", row + 1); diff --git a/src/config_test.js b/src/config_test.js index 34e89f7b0a1..5305705d88b 100644 --- a/src/config_test.js +++ b/src/config_test.js @@ -52,13 +52,16 @@ module.exports = { "test: nls": function() { var nls = config.nls; config.setMessages({ - foo: "hello world of $1" + foo: "hello world of $1", + test_key: "hello world for test key" }); - assert.equal(nls("bar $1"), "bar $1"); - assert.equal(nls("bar"), "bar"); - assert.equal(nls("foo"), "hello world of $1"); - assert.equal(nls("foo", {1: "goo"}), "hello world of goo"); - assert.equal(nls("$0B is $1$$", [0.11, 22]), "0.11B is 22$"); + assert.equal(nls("untranslated_key","bar $1"), "bar $1"); + assert.equal(nls("untranslated_key", "bar"), "bar"); + assert.equal(nls("untranslated_key_but_translated_default_string", "foo"), "hello world of $1"); + assert.equal(nls("untranslated_key_but_translated_default_string", "foo", {1: "goo"}), "hello world of goo"); + assert.equal(nls("untranslated_key", "$0B is $1$$", [0.11, 22]), "0.11B is 22$"); + assert.equal(nls("untranslated_key_but_translated_default_string", "foo", {1: "goo"}), "hello world of goo"); + assert.equal(nls("test_key", "this text should not appear"), "hello world for test key"); }, "test: define options" : function() { var o = {}; diff --git a/src/editor.js b/src/editor.js index 5501f622526..fa99ddf95b9 100644 --- a/src/editor.js +++ b/src/editor.js @@ -2944,10 +2944,10 @@ config.defineOptions(Editor.prototype, "editor", { this.textInput.setNumberOfExtraLines(useragent.isWin ? 3 : 0); this.renderer.scroller.setAttribute("tabindex", 0); this.renderer.scroller.setAttribute("role", "group"); - this.renderer.scroller.setAttribute("aria-roledescription", nls("editor")); + this.renderer.scroller.setAttribute("aria-roledescription", nls("editor.scroller.aria-roledescription", "editor")); this.renderer.scroller.classList.add(this.renderer.keyboardFocusClassName); this.renderer.scroller.setAttribute("aria-label", - nls("Editor content, press Enter to start editing, press Escape to exit") + nls("editor.scroller.aria-label", "Editor content, press Enter to start editing, press Escape to exit") ); this.renderer.scroller.addEventListener("keyup", focusOnEnterKeyup.bind(this)); @@ -2956,9 +2956,9 @@ config.defineOptions(Editor.prototype, "editor", { this.renderer.$gutter.setAttribute("tabindex", 0); this.renderer.$gutter.setAttribute("aria-hidden", false); this.renderer.$gutter.setAttribute("role", "group"); - this.renderer.$gutter.setAttribute("aria-roledescription", nls("editor")); + this.renderer.$gutter.setAttribute("aria-roledescription", nls("editor.gutter.aria-roledescription", "editor")); this.renderer.$gutter.setAttribute("aria-label", - nls("Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit") + nls("editor.gutter.aria-label", "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit") ); this.renderer.$gutter.classList.add(this.renderer.keyboardFocusClassName); diff --git a/src/ext/error_marker.js b/src/ext/error_marker.js index 0fb5705bfe3..cd5052ddc04 100644 --- a/src/ext/error_marker.js +++ b/src/ext/error_marker.js @@ -98,7 +98,7 @@ exports.showErrorMarker = function(editor, dir) { return; } else { gutterAnno = { - text: [nls("Looks good!")], + text: [nls("error-marker.good-state", "Looks good!")], className: "ace_ok" }; } diff --git a/src/ext/prompt.js b/src/ext/prompt.js index 54ba7d8bfae..620fb8c9e69 100644 --- a/src/ext/prompt.js +++ b/src/ext/prompt.js @@ -441,13 +441,13 @@ prompt.commands = function(editor, callback) { otherCommands = getFilteredCompletions(otherCommands, prefix); if (recentlyUsedCommands.length && otherCommands.length) { - recentlyUsedCommands[0].message = nls("Recently used"); - otherCommands[0].message = nls("Other commands"); + recentlyUsedCommands[0].message = nls("prompt.recently-used", "Recently used"); + otherCommands[0].message = nls("prompt.other-commands", "Other commands"); } var completions = recentlyUsedCommands.concat(otherCommands); return completions.length > 0 ? completions : [{ - value: nls("No matching commands"), + value: nls("prompt.no-matching-commands", "No matching commands"), error: 1 }]; } diff --git a/src/ext/searchbox.js b/src/ext/searchbox.js index cfb1c08e3fa..f676da50803 100644 --- a/src/ext/searchbox.js +++ b/src/ext/searchbox.js @@ -27,24 +27,24 @@ class SearchBox { dom.buildDom(["div", {class:"ace_search right"}, ["span", {action: "hide", class: "ace_searchbtn_close"}], ["div", {class: "ace_search_form"}, - ["input", {class: "ace_search_field", placeholder: nls("Search for"), spellcheck: "false"}], + ["input", {class: "ace_search_field", placeholder: nls("search-box.find.placeholder", "Search for"), spellcheck: "false"}], ["span", {action: "findPrev", class: "ace_searchbtn prev"}, "\u200b"], ["span", {action: "findNext", class: "ace_searchbtn next"}, "\u200b"], - ["span", {action: "findAll", class: "ace_searchbtn", title: "Alt-Enter"}, nls("All")] + ["span", {action: "findAll", class: "ace_searchbtn", title: "Alt-Enter"}, nls("search-box.find-all.text", "All")] ], ["div", {class: "ace_replace_form"}, - ["input", {class: "ace_search_field", placeholder: nls("Replace with"), spellcheck: "false"}], - ["span", {action: "replaceAndFindNext", class: "ace_searchbtn"}, nls("Replace")], - ["span", {action: "replaceAll", class: "ace_searchbtn"}, nls("All")] + ["input", {class: "ace_search_field", placeholder: nls("search-box.replace.placeholder", "Replace with"), spellcheck: "false"}], + ["span", {action: "replaceAndFindNext", class: "ace_searchbtn"}, nls("search-box.replace-next.text", "Replace")], + ["span", {action: "replaceAll", class: "ace_searchbtn"}, nls("search-box.replace-all.text", "All")] ], ["div", {class: "ace_search_options"}, - ["span", {action: "toggleReplace", class: "ace_button", title: nls("Toggle Replace mode"), + ["span", {action: "toggleReplace", class: "ace_button", title: nls("search-box.toggle-replace.title", "Toggle Replace mode"), style: "float:left;margin-top:-2px;padding:0 5px;"}, "+"], ["span", {class: "ace_search_counter"}], - ["span", {action: "toggleRegexpMode", class: "ace_button", title: nls("RegExp Search")}, ".*"], - ["span", {action: "toggleCaseSensitive", class: "ace_button", title: nls("CaseSensitive Search")}, "Aa"], - ["span", {action: "toggleWholeWords", class: "ace_button", title: nls("Whole Word Search")}, "\\b"], - ["span", {action: "searchInSelection", class: "ace_button", title: nls("Search In Selection")}, "S"] + ["span", {action: "toggleRegexpMode", class: "ace_button", title: nls("search-box.toggle-regexp.title", "RegExp Search")}, ".*"], + ["span", {action: "toggleCaseSensitive", class: "ace_button", title: nls("search-box.toggle-case.title", "CaseSensitive Search")}, "Aa"], + ["span", {action: "toggleWholeWords", class: "ace_button", title: nls("search-box.toggle-whole-word.title", "Whole Word Search")}, "\\b"], + ["span", {action: "searchInSelection", class: "ace_button", title: nls("search-box.toggle-in-selection.title", "Search In Selection")}, "S"] ] ], div); /**@type {any}*/ @@ -234,7 +234,7 @@ class SearchBox { } } } - this.searchCounter.textContent = nls("$0 of $1", [before , (all > MAX_COUNT ? MAX_COUNT + "+" : all)]); + this.searchCounter.textContent = nls("search-box.search-counter", "$0 of $1", [before , (all > MAX_COUNT ? MAX_COUNT + "+" : all)]); } findNext() { this.find(true, false); diff --git a/src/keyboard/textinput.js b/src/keyboard/textinput.js index cb43af223ef..7a316c21ab5 100644 --- a/src/keyboard/textinput.js +++ b/src/keyboard/textinput.js @@ -87,10 +87,10 @@ TextInput= function(parentNode, host) { text.setAttribute("role", options.role); } if (options.setLabel) { - text.setAttribute("aria-roledescription", nls("editor")); + text.setAttribute("aria-roledescription", nls("text-input.aria-roledescription", "editor")); if(host.session) { var row = host.session.selection.cursor.row; - text.setAttribute("aria-label", nls("Cursor at row $0", [row + 1])); + text.setAttribute("aria-label", nls("text-input.aria-label", "Cursor at row $0", [row + 1])); } } }; diff --git a/src/layer/gutter.js b/src/layer/gutter.js index 4b87b803bf1..3f04c4f5f79 100644 --- a/src/layer/gutter.js +++ b/src/layer/gutter.js @@ -409,21 +409,21 @@ class Gutter{ // getFoldWidgetRange is optional to be implemented by fold modes, if not available we fall-back. if (foldRange) - foldWidget.setAttribute("aria-label", nls("Toggle code folding, rows $0 through $1", [foldRange.start.row + 1, foldRange.end.row + 1])); + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.range.aria-label", "Toggle code folding, rows $0 through $1", [foldRange.start.row + 1, foldRange.end.row + 1])); else { if (fold) - foldWidget.setAttribute("aria-label", nls("Toggle code folding, rows $0 through $1", [fold.start.row + 1, fold.end.row + 1])); + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.closed.aria-label", "Toggle code folding, rows $0 through $1", [fold.start.row + 1, fold.end.row + 1])); else - foldWidget.setAttribute("aria-label", nls("Toggle code folding, row $0", [row + 1])); + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.open.aria-label", "Toggle code folding, row $0", [row + 1])); } if (isClosedFold) { foldWidget.setAttribute("aria-expanded", "false"); - foldWidget.setAttribute("title", nls("Unfold code")); + foldWidget.setAttribute("title", nls("gutter.code-folding.closed.title", "Unfold code")); } else { foldWidget.setAttribute("aria-expanded", "true"); - foldWidget.setAttribute("title", nls("Fold code")); + foldWidget.setAttribute("title", nls("gutter.code-folding.open.title", "Fold code")); } } else { if (foldWidget) { @@ -442,7 +442,17 @@ class Gutter{ dom.setStyle(annotationIconNode.style, "height", lineHeight); dom.setStyle(annotationNode.style, "display", "block"); dom.setStyle(annotationNode.style, "height", lineHeight); - annotationNode.setAttribute("aria-label", nls("Read annotations row $0", [rowText])); + var ariaLabel; + switch(foldAnnotationClass) { + case " ace_error_fold": + ariaLabel = nls("gutter.annotation.aria-label.error", "Read annotations row $0", [rowText]); + break; + + case " ace_warning_fold": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Read annotations row $0", [rowText]); + break; + } + annotationNode.setAttribute("aria-label", ariaLabel); annotationNode.setAttribute("tabindex", "-1"); annotationNode.setAttribute("role", "button"); } @@ -458,7 +468,21 @@ class Gutter{ dom.setStyle(annotationIconNode.style, "height", lineHeight); dom.setStyle(annotationNode.style, "display", "block"); dom.setStyle(annotationNode.style, "height", lineHeight); - annotationNode.setAttribute("aria-label", nls("Read annotations row $0", [rowText])); + var ariaLabel; + switch(this.$annotations[row].className) { + case " ace_error": + ariaLabel = nls("gutter.annotation.aria-label.error", "Read annotations row $0", [rowText]); + break; + + case " ace_warning": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Read annotations row $0", [rowText]); + break; + + case " ace_info": + ariaLabel = nls("gutter.annotation.aria-label.info", "Read annotations row $0", [rowText]); + break; + } + annotationNode.setAttribute("aria-label", ariaLabel); annotationNode.setAttribute("tabindex", "-1"); annotationNode.setAttribute("role", "button"); } diff --git a/src/layer/text.js b/src/layer/text.js index 9d3264af627..20cc1194316 100644 --- a/src/layer/text.js +++ b/src/layer/text.js @@ -418,7 +418,7 @@ class Text { var span = this.dom.createElement("span"); if (token.type == "fold"){ span.style.width = (token.value.length * this.config.characterWidth) + "px"; - span.setAttribute("title", nls("Unfold code")); + span.setAttribute("title", nls("inline-fold.closed.title", "Unfold code")); } span.className = classes; diff --git a/src/lib/app_config.js b/src/lib/app_config.js index 3ca8dfb5725..041b32d51ef 100644 --- a/src/lib/app_config.js +++ b/src/lib/app_config.js @@ -2,6 +2,7 @@ var oop = require("./oop"); var EventEmitter = require("./event_emitter").EventEmitter; const reportError = require("./report_error").reportError; +const defaultEnglishMessages = require("./default_english_messages").defaultEnglishMessages; var optionsProvider = { setOptions: function(optList) { @@ -61,8 +62,9 @@ var messages; class AppConfig { constructor() { - this.$defaultOptions = {}; - } + this.$defaultOptions = {}; + messages = defaultEnglishMessages; + } /** * @param {Object} obj @@ -142,14 +144,19 @@ class AppConfig { } /** - * @param {string} string + * @param {string} key + * @param {string} defaultString * @param {{ [x: string]: any; }} [params] */ - nls(string, params) { - if (messages && !messages[string]) { - warn("No message found for '" + string + "' in the provided messages, falling back to default English message."); - } - var translated = messages && messages[string] || string; + nls(key, defaultString, params) { + if (!messages[key]) { + warn("No message found for the key '" + key + "' in the provided messages, trying to find a translation for the default string '" + defaultString + "'."); + if (!messages[defaultString]) { + warn("No message found for the default string '" + defaultString + "' in the provided messages. Falling back to the default English message."); + } + } + + var translated = messages[key] || messages[defaultString] || defaultString; if (params) { translated = translated.replace(/\$(\$|[\d]+)/g, function(_, name) { if (name == "$") return "$"; diff --git a/src/lib/default_english_messages.js b/src/lib/default_english_messages.js new file mode 100644 index 00000000000..c112868f8b5 --- /dev/null +++ b/src/lib/default_english_messages.js @@ -0,0 +1,44 @@ +var defaultEnglishMessages = { + "autocomplete.popup.aria-roledescription": "Autocomplete suggestions", + "autocomplete.popup.aria-label": "Autocomplete suggestions", + "autocomplete.popup.item.aria-roledescription": "item", + "autocomplete.loading": "Loading...", + "editor.scroller.aria-roledescription": "editor", + "editor.scroller.aria-label": "Editor content, press Enter to start editing, press Escape to exit", + "editor.gutter.aria-roledescription": "editor", + "editor.gutter.aria-label": "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit", + "error-marker.good-state": "Looks good!", + "prompt.recently-used": "Recently used", + "prompt.other-commands": "Other commands", + "prompt.no-matching-commands": "No matching commands", + "search-box.find.placeholder": "Search for", + "search-box.find-all.text": "All", + "search-box.replace.placeholder": "Replace with", + "search-box.replace-next.text": "Replace", + "search-box.replace-all.text": "All", + "search-box.toggle-replace.title": "Toggle Replace mode", + "search-box.toggle-regexp.title": "RegExp Search", + "search-box.toggle-case.title": "CaseSensitive Search", + "search-box.toggle-whole-word.title": "Whole Word Search", + "search-box.toggle-in-selection.title": "Search In Selection", + "search-box.search-counter": "$0 of $1", + "text-input.aria-roledescription": "editor", + "text-input.aria-label": "Cursor at row $0", + "gutter.code-folding.range.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.closed.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.open.aria-label": "Toggle code folding, row $0", + "gutter.code-folding.closed.title": "Unfold code", + "gutter.code-folding.open.title": "Fold code", + "gutter.annotation.aria-label.error": "Error, read annotations row $0", + "gutter.annotation.aria-label.warning": "Warning, read annotations row $0", + "gutter.annotation.aria-label.info": "Info, read annotations row $0", + "inline-fold.closed.title": "Unfold code", + "gutter-tooltip.aria-label.error.singular": "error", + "gutter-tooltip.aria-label.error.plural": "errors", + "gutter-tooltip.aria-label.warning.singular": "warning", + "gutter-tooltip.aria-label.warning.plural": "warnings", + "gutter-tooltip.aria-label.info.singular": "information message", + "gutter-tooltip.aria-label.info.plural": "information messages" +} + +exports.defaultEnglishMessages = defaultEnglishMessages; \ No newline at end of file diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index e3b07646853..3d705eca22b 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -151,9 +151,18 @@ class GutterTooltip extends Tooltip { } static get annotationLabels() { return { - error: {singular: nls("error"), plural: nls("errors")}, - warning: {singular: nls("warning"), plural: nls("warnings")}, - info: {singular: nls("information message"), plural: nls("information messages")} + error: { + singular: nls("gutter-tooltip.aria-label.error.singular", "error"), + plural: nls("gutter-tooltip.aria-label.error.plural", "errors") + }, + warning: { + singular: nls("gutter-tooltip.aria-label.warning.singular", "warning"), + plural: nls("gutter-tooltip.aria-label.warning.plural", "warnings") + }, + info: { + singular: nls("gutter-tooltip.aria-label.info.singular", "information message"), + plural: nls("gutter-tooltip.aria-label.info.plural", "information messages") + } }; } diff --git a/translations/Readme.md b/translations/Readme.md new file mode 100644 index 00000000000..5bc47dd6d82 --- /dev/null +++ b/translations/Readme.md @@ -0,0 +1,4 @@ +### Generating new translation file +- Create a `JSON` file in this folder named `.json`. +- Add `{"$id": ""}` to the empty file. +- Run `node Makefile.dryice.js nls` in the root of the repository to generate empty translation file. \ No newline at end of file diff --git a/translations/am.json b/translations/am.json index 4c54ef434f3..ebfb6b29b55 100644 --- a/translations/am.json +++ b/translations/am.json @@ -1,34 +1,43 @@ { "$id": "am", - "Autocomplete suggestions": "Ավտոմատ լրացման առաջարկներ", - "Loading...": "Բեռնվում է...", - "editor": "", - "Editor content, press Enter to start editing, press Escape to exit": "", - "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit": "", - "Looks good!": "Սխալ չկա", - "Recently used": "Վերջերս օգտագործված", - "Other commands": "Այլ հրամաններ", - "No matching commands": "Չկան համապատասխան հրամաններ", - "Search for": "Փնտրել", - "All": "Բոլորը", - "Replace with": "Փոխարինել", - "Replace": "Փոխարինել", - "Toggle Replace mode": "", - "RegExp Search": "Փնտրել ռեգեքսպով", - "CaseSensitive Search": "", - "Whole Word Search": "Ամբողջ բառեր", - "Search In Selection": "Փնտրել նշվածում", - "$0 of $1": "$1-ից $0", - "Cursor at row $0": "", - "Toggle code folding, rows $0 through $1": "", - "Toggle code folding, row $0": "", - "Unfold code": "", - "Fold code": "", - "Read annotations row $0": "", - "error": "սխալ", - "errors": "սխալներ", - "warning": "նախազգուշացում", - "warnings": "նախազգուշացումներ", - "information message": "տեղեկատվություն", - "information messages": "տեղեկատվություններ" + "autocomplete.popup.aria-roledescription": "Ավտոմատ լրացման առաջարկներ", + "autocomplete.popup.aria-label": "", + "autocomplete.popup.item.aria-roledescription": "", + "autocomplete.loading": "Բեռնվում է...", + "editor.scroller.aria-roledescription": "", + "editor.scroller.aria-label": "", + "editor.gutter.aria-roledescription": "", + "editor.gutter.aria-label": "", + "error-marker.good-state": "Սխալ չկա", + "prompt.recently-used": "Վերջերս օգտագործված", + "prompt.other-commands": "Այլ հրամաններ", + "prompt.no-matching-commands": "Չկան համապատասխան հրամաններ", + "search-box.find.placeholder": "Փնտրել", + "search-box.find-all.text": "Բոլորը", + "search-box.replace.placeholder": "Փոխարինել", + "search-box.replace-next.text": "Փոխարինել", + "search-box.replace-all.text": "", + "search-box.toggle-replace.title": "", + "search-box.toggle-regexp.title": "Փնտրել ռեգեքսպով", + "search-box.toggle-case.title": "", + "search-box.toggle-whole-word.title": "Ամբողջ բառեր", + "search-box.toggle-in-selection.title": "Փնտրել նշվածում", + "search-box.search-counter": "$1-ից $0", + "text-input.aria-roledescription": "", + "text-input.aria-label": "", + "gutter.code-folding.range.aria-label": "", + "gutter.code-folding.closed.aria-label": "", + "gutter.code-folding.open.aria-label": "", + "gutter.code-folding.closed.title": "", + "gutter.code-folding.open.title": "", + "gutter.annotation.aria-label.error": "", + "gutter.annotation.aria-label.warning": "", + "gutter.annotation.aria-label.info": "", + "inline-fold.closed.title": "", + "gutter-tooltip.aria-label.error.singular": "սխալ", + "gutter-tooltip.aria-label.error.plural": "սխալներ", + "gutter-tooltip.aria-label.warning.singular": "նախազգուշացում", + "gutter-tooltip.aria-label.warning.plural": "նախազգուշացումներ", + "gutter-tooltip.aria-label.info.singular": "տեղեկատվություն", + "gutter-tooltip.aria-label.info.plural": "տեղեկատվություններ" } \ No newline at end of file diff --git a/translations/es.json b/translations/es.json index 1a1e3a6416d..7d17260e75e 100644 --- a/translations/es.json +++ b/translations/es.json @@ -1,34 +1,43 @@ { "$id": "es", - "Autocomplete suggestions": "Sugerencias de autocompletar", - "Loading...": "Cargando...", - "editor": "editor", - "Editor content, press Enter to start editing, press Escape to exit": "Contenido del editor, presiona Entrar para empezar a editar, presiona Escape para salir", - "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit": "Canaleta de editor, presiona Entrar para por, presiona Escape para salir", - "Looks good!": "¡Parece bien!", - "Recently used": "Usado recientemente", - "Other commands": "Otros mandos", - "No matching commands": "No hay mandos que hacen juego", - "Search for": "Buscar", - "All": "Todo", - "Replace with": "Reemplazar con", - "Replace": "Reemplazar", - "Toggle Replace mode": "Pasar el modo de reemplazar", - "RegExp Search": "Búsqueda de RegExp", - "CaseSensitive Search": "Búsqueda sensible a mayúsculas y minúsculas", - "Whole Word Search": "Búsqueda de palabras enteras", - "Search In Selection": "Buscar en la selección", - "$0 of $1": "$0 de $1", - "Cursor at row $0": "Cursor en row $0", - "Unfold code": "Desplegar el codigo", - "Toggle code folding, rows $0 through $1": "", - "Toggle code folding, row $0": "", - "Fold code": "Plegar el codigo", - "Read annotations row $0": "Leer anotaciones fila $0", - "error": "error", - "errors": "errores", - "warning": "advertencia", - "warnings": "advertencias", - "information message": "mensaje de informacion", - "information messages": "mensajes de informacion" + "autocomplete.popup.aria-roledescription": "Sugerencias de autocompletar", + "autocomplete.popup.aria-label": "Sugerencias de autocompletar", + "autocomplete.popup.item.aria-roledescription": "", + "autocomplete.loading": "Cargando...", + "editor.scroller.aria-roledescription": "editor", + "editor.scroller.aria-label": "Contenido del editor, presiona Entrar para empezar a editar, presiona Escape para salir", + "editor.gutter.aria-roledescription": "editor", + "editor.gutter.aria-label": "Canaleta de editor, presiona Entrar para por, presiona Escape para salir", + "error-marker.good-state": "¡Parece bien!", + "prompt.recently-used": "Usado recientemente", + "prompt.other-commands": "Otros mandos", + "prompt.no-matching-commands": "No hay mandos que hacen juego", + "search-box.find.placeholder": "Todo", + "search-box.find-all.text": "", + "search-box.replace.placeholder": "Reemplazar con", + "search-box.replace-next.text": "Reemplazar", + "search-box.replace-all.text": "Todo", + "search-box.toggle-replace.title": "Pasar el modo de reemplazar", + "search-box.toggle-regexp.title": "Búsqueda de RegExp", + "search-box.toggle-case.title": "Búsqueda sensible a mayúsculas y minúsculas", + "search-box.toggle-whole-word.title": "Búsqueda de palabras enteras", + "search-box.toggle-in-selection.title": "Buscar en la selección", + "search-box.search-counter": "$0 de $1", + "text-input.aria-roledescription": "editor", + "text-input.aria-label": "Cursor en row $0", + "gutter.code-folding.range.aria-label": "", + "gutter.code-folding.closed.aria-label": "", + "gutter.code-folding.open.aria-label": "", + "gutter.code-folding.closed.title": "Desplegar el codigo", + "gutter.code-folding.open.title": "Plegar el codigo", + "gutter.annotation.aria-label.error": "Leer anotaciones fila $0", + "gutter.annotation.aria-label.warning": "Leer anotaciones fila $0", + "gutter.annotation.aria-label.info": "Leer anotaciones fila $0", + "inline-fold.closed.title": "Desplegar el codigo", + "gutter-tooltip.aria-label.error.singular": "error", + "gutter-tooltip.aria-label.error.plural": "errores", + "gutter-tooltip.aria-label.warning.singular": "advertencia", + "gutter-tooltip.aria-label.warning.plural": "advertencias", + "gutter-tooltip.aria-label.info.singular": "mensaje de informacion", + "gutter-tooltip.aria-label.info.plural": "mensajes de informacion" } \ No newline at end of file diff --git a/translations/ru.json b/translations/ru.json index 6df6c8d2dce..d807d9ff303 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -1,34 +1,43 @@ { "$id": "ru", - "Autocomplete suggestions": "Предложения автозаполнения", - "Loading...": "Загрузка...", - "editor": "", - "Editor content, press Enter to start editing, press Escape to exit": "", - "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit": "", - "Looks good!": "Нет ошибок", - "Recently used": "Недавно использованные", - "Other commands": "Другие команды", - "No matching commands": "Нет подходящих команд", - "Search for": "Найти", - "All": "Все", - "Replace with": "Заменить", - "Replace": "Заменить", - "Toggle Replace mode": "Перейти в режим поиска", - "RegExp Search": "Поиск по регулярному выражению", - "CaseSensitive Search": "", - "Whole Word Search": "", - "Search In Selection": "Искать в выделенном", - "$0 of $1": "$0 из $1", - "Cursor at row $0": "", - "Toggle code folding, rows $0 through $1": "", - "Toggle code folding, row $0": "", - "Unfold code": "", - "Fold code": "", - "Read annotations row $0": "", - "error": "ошибка", - "errors": "ошибки", - "warning": "предупреждение", - "warnings": "предупреждения", - "information message": "информационное сообщение", - "information messages": "информационные сообщения" + "autocomplete.popup.aria-roledescription": "", + "autocomplete.popup.aria-label": "Предложения автозаполнения", + "autocomplete.popup.item.aria-roledescription": "", + "autocomplete.loading": "Загрузка...", + "editor.scroller.aria-roledescription": "", + "editor.scroller.aria-label": "", + "editor.gutter.aria-roledescription": "", + "editor.gutter.aria-label": "", + "error-marker.good-state": "Нет ошибок", + "prompt.recently-used": "Недавно использованные", + "prompt.other-commands": "Другие команды", + "prompt.no-matching-commands": "Нет подходящих команд", + "search-box.find.placeholder": "Найти", + "search-box.find-all.text": "Все", + "search-box.replace.placeholder": "Заменить", + "search-box.replace-next.text": "Заменить", + "search-box.replace-all.text": "", + "search-box.toggle-replace.title": "Перейти в режим поиска", + "search-box.toggle-regexp.title": "Поиск по регулярному выражению", + "search-box.toggle-case.title": "", + "search-box.toggle-whole-word.title": "", + "search-box.toggle-in-selection.title": "Искать в выделенном", + "search-box.search-counter": "$0 из $1", + "text-input.aria-roledescription": "", + "text-input.aria-label": "", + "gutter.code-folding.range.aria-label": "", + "gutter.code-folding.closed.aria-label": "", + "gutter.code-folding.open.aria-label": "", + "gutter.code-folding.closed.title": "", + "gutter.code-folding.open.title": "", + "gutter.annotation.aria-label.error": "", + "gutter.annotation.aria-label.warning": "", + "gutter.annotation.aria-label.info": "", + "inline-fold.closed.title": "", + "gutter-tooltip.aria-label.error.singular": "ошибка", + "gutter-tooltip.aria-label.error.plural": "ошибки", + "gutter-tooltip.aria-label.warning.singular": "предупреждение", + "gutter-tooltip.aria-label.warning.plural": "предупреждения", + "gutter-tooltip.aria-label.info.singular": "информационное сообщение", + "gutter-tooltip.aria-label.info.plural": "информационные сообщения" } \ No newline at end of file