diff --git a/demo/i18n.html b/demo/i18n.html index ca9ac554e1a..b4cce7e568d 100644 --- a/demo/i18n.html +++ b/demo/i18n.html @@ -72,9 +72,9 @@ "Autocomplete suggestions": "Предложения автозаполнения", "Cursor at row $0": "", - "Unfold rows $0 to $1": "", + "Toggle code folding, rows $0 through $1": "", + "Toggle code folding, row $0": "", "Unfold code": "", - "Fold at row $0": "", "Fold code": "", "Read annotations row $0": "", @@ -109,9 +109,9 @@ "Autocomplete suggestions": "Ավտոմատ լրացման առաջարկներ", "Cursor at row $0": "", - "Unfold rows $0 to $1": "", + "Toggle code folding, rows $0 through $1": "", + "Toggle code folding, row $0": "", "Unfold code": "", - "Fold at row $0": "", "Fold code": "", "Read annotations row $0": "", @@ -147,6 +147,8 @@ "Unfold rows $0 to $1": "Desplegar las filas desde $0 hasta $1", "Unfold code": "Desplegar el codigo", "Fold at row $0": "Plegar en fila $0", + "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", diff --git a/src/keyboard/gutter_handler_test.js b/src/keyboard/gutter_handler_test.js index 06de46124f4..4dc8fd65704 100644 --- a/src/keyboard/gutter_handler_test.js +++ b/src/keyboard/gutter_handler_test.js @@ -256,6 +256,46 @@ module.exports = { assert.equal(document.activeElement, lines.cells[1].element.childNodes[2]); done(); }, 20); + },"test: aria attributes mode with getFoldWidgetRange" : function() { + var editor = this.editor; + var value = "x {" + "\n".repeat(5) + "}"; + editor.session.setMode(new Mode()); + editor.setOption("enableKeyboardAccessibility", true); + editor.setValue(value, -1); + editor.renderer.$loop._flush(); + + var lines = editor.renderer.$gutterLayer.$lines; + var toggler = lines.cells[0].element.children[1]; + + assert.equal(toggler.getAttribute("aria-label"), "Toggle code folding, rows 1 through 6"); + assert.equal(toggler.getAttribute("aria-expanded"), "true"); + assert.equal(toggler.getAttribute("title"), "Fold code"); + + editor.session.$toggleFoldWidget(0, {}); + editor.renderer.$loop._flush(); + + assert.equal(toggler.getAttribute("aria-label"), "Toggle code folding, rows 1 through 6"); + assert.equal(toggler.getAttribute("aria-expanded"), "false"); + assert.equal(toggler.getAttribute("title"), "Unfold code"); + }, + "test: aria attributes mode without getFoldWidgetRange" : function() { + var editor = this.editor; + var value = "x {" + "\n".repeat(5) + "}"; + var mode = new Mode(); + mode.foldingRules.getFoldWidgetRange = function(session, foldStyle, row) { + return null; + }; + editor.session.setMode(mode); + editor.setOption("enableKeyboardAccessibility", true); + editor.setValue(value, -1); + editor.renderer.$loop._flush(); + + var lines = editor.renderer.$gutterLayer.$lines; + var toggler = lines.cells[0].element.children[1]; + + assert.equal(toggler.getAttribute("aria-label"), "Toggle code folding, row 1"); + assert.equal(toggler.getAttribute("aria-expanded"), "true"); + assert.equal(toggler.getAttribute("title"), "Fold code"); },"test: should signal keyboard event" : function(done) { var editor = this.editor; var value = "x {" + "\n".repeat(50) + "}\n"; diff --git a/src/layer/gutter.js b/src/layer/gutter.js index 39ed43ebf72..8e3772dbf65 100644 --- a/src/layer/gutter.js +++ b/src/layer/gutter.js @@ -326,7 +326,8 @@ class Gutter{ if (c) { var foldClass = "ace_fold-widget ace_" + c; - if (c == "start" && row == foldStart && row < fold.end.row){ + var isClosedFold = c == "start" && row == foldStart && row < fold.end.row; + if (isClosedFold){ foldClass += " ace_closed"; var foldAnnotationClass = ''; var annotationInFold = false; @@ -360,13 +361,24 @@ class Gutter{ // Set a11y properties. foldWidget.setAttribute("role", "button"); foldWidget.setAttribute("tabindex", "-1"); - var fold = session.getFoldLine(rowText - 1); - if (fold) { - foldWidget.setAttribute("aria-label", nls("Unfold rows $0 to $1", [rowText, fold.end.row + 1])); + var foldRange = session.getFoldWidgetRange(row); + + // 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])); + else { + if (fold) + foldWidget.setAttribute("aria-label", nls("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])); + } + + if (isClosedFold) { + foldWidget.setAttribute("aria-expanded", "false"); foldWidget.setAttribute("title", nls("Unfold code")); } else { - foldWidget.setAttribute("aria-label", nls("Fold at row $0", [rowText])); + foldWidget.setAttribute("aria-expanded", "true"); foldWidget.setAttribute("title", nls("Fold code")); } } else { diff --git a/src/lib/app_config.js b/src/lib/app_config.js index a06a3ceac5d..6ad96377fee 100644 --- a/src/lib/app_config.js +++ b/src/lib/app_config.js @@ -131,6 +131,9 @@ class AppConfig { } 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; if (params) { translated = translated.replace(/\$(\$|[\d]+)/g, function(_, name) { diff --git a/translations/am.json b/translations/am.json index 2cecb0e1868..742cbbfdf29 100644 --- a/translations/am.json +++ b/translations/am.json @@ -19,9 +19,9 @@ "Search In Selection": "Փնտրել նշվածում", "$0 of $1": "$1-ից $0", "Cursor at row $0": "", - "Unfold rows $0 to $1": "", + "Toggle code folding, rows $0 through $1": "", + "Toggle code folding, row $0": "", "Unfold code": "", - "Fold at row $0": "", "Fold code": "", "Read annotations row $0": "", "error": "սխալ", diff --git a/translations/es.json b/translations/es.json index 54d3a898fc2..e296111f7a5 100644 --- a/translations/es.json +++ b/translations/es.json @@ -19,9 +19,9 @@ "Search In Selection": "Buscar en la selección", "$0 of $1": "$0 de $1", "Cursor at row $0": "Cursor en row $0", - "Unfold rows $0 to $1": "Desplegar las filas desde $0 hasta $1", "Unfold code": "Desplegar el codigo", - "Fold at row $0": "Plegar en fila $0", + "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", diff --git a/translations/ru.json b/translations/ru.json index 0135d054b67..c70519eaf47 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -19,9 +19,9 @@ "Search In Selection": "Искать в выделенном", "$0 of $1": "$0 из $1", "Cursor at row $0": "", - "Unfold rows $0 to $1": "", + "Toggle code folding, rows $0 through $1": "", + "Toggle code folding, row $0": "", "Unfold code": "", - "Fold at row $0": "", "Fold code": "", "Read annotations row $0": "", "error": "ошибка",