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": "ошибка",