From c63493c899de714b05b0521bb38aab60d19030ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Fri, 20 Jan 2017 00:55:51 +0100 Subject: Validation initiale --- sources/plugins/a11yhelp/dialogs/a11yhelp.js | 217 + .../a11yhelp/dialogs/lang/_translationstatus.txt | 25 + sources/plugins/a11yhelp/dialogs/lang/af.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ar.js | 140 + sources/plugins/a11yhelp/dialogs/lang/az.js | 140 + sources/plugins/a11yhelp/dialogs/lang/bg.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ca.js | 140 + sources/plugins/a11yhelp/dialogs/lang/cs.js | 140 + sources/plugins/a11yhelp/dialogs/lang/cy.js | 140 + sources/plugins/a11yhelp/dialogs/lang/da.js | 140 + sources/plugins/a11yhelp/dialogs/lang/de-ch.js | 140 + sources/plugins/a11yhelp/dialogs/lang/de.js | 140 + sources/plugins/a11yhelp/dialogs/lang/el.js | 140 + sources/plugins/a11yhelp/dialogs/lang/en-gb.js | 140 + sources/plugins/a11yhelp/dialogs/lang/en.js | 159 + sources/plugins/a11yhelp/dialogs/lang/eo.js | 140 + sources/plugins/a11yhelp/dialogs/lang/es.js | 140 + sources/plugins/a11yhelp/dialogs/lang/et.js | 140 + sources/plugins/a11yhelp/dialogs/lang/eu.js | 140 + sources/plugins/a11yhelp/dialogs/lang/fa.js | 140 + sources/plugins/a11yhelp/dialogs/lang/fi.js | 140 + sources/plugins/a11yhelp/dialogs/lang/fo.js | 140 + sources/plugins/a11yhelp/dialogs/lang/fr-ca.js | 140 + sources/plugins/a11yhelp/dialogs/lang/fr.js | 140 + sources/plugins/a11yhelp/dialogs/lang/gl.js | 140 + sources/plugins/a11yhelp/dialogs/lang/gu.js | 140 + sources/plugins/a11yhelp/dialogs/lang/he.js | 140 + sources/plugins/a11yhelp/dialogs/lang/hi.js | 140 + sources/plugins/a11yhelp/dialogs/lang/hr.js | 140 + sources/plugins/a11yhelp/dialogs/lang/hu.js | 140 + sources/plugins/a11yhelp/dialogs/lang/id.js | 140 + sources/plugins/a11yhelp/dialogs/lang/it.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ja.js | 140 + sources/plugins/a11yhelp/dialogs/lang/km.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ko.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ku.js | 140 + sources/plugins/a11yhelp/dialogs/lang/lt.js | 140 + sources/plugins/a11yhelp/dialogs/lang/lv.js | 140 + sources/plugins/a11yhelp/dialogs/lang/mk.js | 140 + sources/plugins/a11yhelp/dialogs/lang/mn.js | 140 + sources/plugins/a11yhelp/dialogs/lang/nb.js | 140 + sources/plugins/a11yhelp/dialogs/lang/nl.js | 140 + sources/plugins/a11yhelp/dialogs/lang/no.js | 140 + sources/plugins/a11yhelp/dialogs/lang/oc.js | 140 + sources/plugins/a11yhelp/dialogs/lang/pl.js | 140 + sources/plugins/a11yhelp/dialogs/lang/pt-br.js | 140 + sources/plugins/a11yhelp/dialogs/lang/pt.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ro.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ru.js | 140 + sources/plugins/a11yhelp/dialogs/lang/si.js | 140 + sources/plugins/a11yhelp/dialogs/lang/sk.js | 140 + sources/plugins/a11yhelp/dialogs/lang/sl.js | 140 + sources/plugins/a11yhelp/dialogs/lang/sq.js | 140 + sources/plugins/a11yhelp/dialogs/lang/sr-latn.js | 140 + sources/plugins/a11yhelp/dialogs/lang/sr.js | 140 + sources/plugins/a11yhelp/dialogs/lang/sv.js | 140 + sources/plugins/a11yhelp/dialogs/lang/th.js | 140 + sources/plugins/a11yhelp/dialogs/lang/tr.js | 140 + sources/plugins/a11yhelp/dialogs/lang/tt.js | 140 + sources/plugins/a11yhelp/dialogs/lang/ug.js | 140 + sources/plugins/a11yhelp/dialogs/lang/uk.js | 140 + sources/plugins/a11yhelp/dialogs/lang/vi.js | 140 + sources/plugins/a11yhelp/dialogs/lang/zh-cn.js | 140 + sources/plugins/a11yhelp/dialogs/lang/zh.js | 140 + sources/plugins/a11yhelp/plugin.js | 51 + sources/plugins/basicstyles/icons/bold.png | Bin 0 -> 580 bytes sources/plugins/basicstyles/icons/hidpi/bold.png | Bin 0 -> 1207 bytes sources/plugins/basicstyles/icons/hidpi/italic.png | Bin 0 -> 854 bytes sources/plugins/basicstyles/icons/hidpi/strike.png | Bin 0 -> 1357 bytes .../plugins/basicstyles/icons/hidpi/subscript.png | Bin 0 -> 1189 bytes .../basicstyles/icons/hidpi/superscript.png | Bin 0 -> 1156 bytes .../plugins/basicstyles/icons/hidpi/underline.png | Bin 0 -> 1084 bytes sources/plugins/basicstyles/icons/italic.png | Bin 0 -> 611 bytes sources/plugins/basicstyles/icons/strike.png | Bin 0 -> 627 bytes sources/plugins/basicstyles/icons/subscript.png | Bin 0 -> 584 bytes sources/plugins/basicstyles/icons/superscript.png | Bin 0 -> 594 bytes sources/plugins/basicstyles/icons/underline.png | Bin 0 -> 541 bytes sources/plugins/basicstyles/lang/af.js | 12 + sources/plugins/basicstyles/lang/ar.js | 12 + sources/plugins/basicstyles/lang/az.js | 12 + sources/plugins/basicstyles/lang/bg.js | 12 + sources/plugins/basicstyles/lang/bn.js | 12 + sources/plugins/basicstyles/lang/bs.js | 12 + sources/plugins/basicstyles/lang/ca.js | 12 + sources/plugins/basicstyles/lang/cs.js | 12 + sources/plugins/basicstyles/lang/cy.js | 12 + sources/plugins/basicstyles/lang/da.js | 12 + sources/plugins/basicstyles/lang/de-ch.js | 12 + sources/plugins/basicstyles/lang/de.js | 12 + sources/plugins/basicstyles/lang/el.js | 12 + sources/plugins/basicstyles/lang/en-au.js | 12 + sources/plugins/basicstyles/lang/en-ca.js | 12 + sources/plugins/basicstyles/lang/en-gb.js | 12 + sources/plugins/basicstyles/lang/en.js | 12 + sources/plugins/basicstyles/lang/eo.js | 12 + sources/plugins/basicstyles/lang/es.js | 12 + sources/plugins/basicstyles/lang/et.js | 12 + sources/plugins/basicstyles/lang/eu.js | 12 + sources/plugins/basicstyles/lang/fa.js | 12 + sources/plugins/basicstyles/lang/fi.js | 12 + sources/plugins/basicstyles/lang/fo.js | 12 + sources/plugins/basicstyles/lang/fr-ca.js | 12 + sources/plugins/basicstyles/lang/fr.js | 12 + sources/plugins/basicstyles/lang/gl.js | 12 + sources/plugins/basicstyles/lang/gu.js | 12 + sources/plugins/basicstyles/lang/he.js | 12 + sources/plugins/basicstyles/lang/hi.js | 12 + sources/plugins/basicstyles/lang/hr.js | 12 + sources/plugins/basicstyles/lang/hu.js | 12 + sources/plugins/basicstyles/lang/id.js | 12 + sources/plugins/basicstyles/lang/is.js | 12 + sources/plugins/basicstyles/lang/it.js | 12 + sources/plugins/basicstyles/lang/ja.js | 12 + sources/plugins/basicstyles/lang/ka.js | 12 + sources/plugins/basicstyles/lang/km.js | 12 + sources/plugins/basicstyles/lang/ko.js | 12 + sources/plugins/basicstyles/lang/ku.js | 12 + sources/plugins/basicstyles/lang/lt.js | 12 + sources/plugins/basicstyles/lang/lv.js | 12 + sources/plugins/basicstyles/lang/mk.js | 12 + sources/plugins/basicstyles/lang/mn.js | 12 + sources/plugins/basicstyles/lang/ms.js | 12 + sources/plugins/basicstyles/lang/nb.js | 12 + sources/plugins/basicstyles/lang/nl.js | 12 + sources/plugins/basicstyles/lang/no.js | 12 + sources/plugins/basicstyles/lang/oc.js | 12 + sources/plugins/basicstyles/lang/pl.js | 12 + sources/plugins/basicstyles/lang/pt-br.js | 12 + sources/plugins/basicstyles/lang/pt.js | 12 + sources/plugins/basicstyles/lang/ro.js | 12 + sources/plugins/basicstyles/lang/ru.js | 12 + sources/plugins/basicstyles/lang/si.js | 12 + sources/plugins/basicstyles/lang/sk.js | 12 + sources/plugins/basicstyles/lang/sl.js | 12 + sources/plugins/basicstyles/lang/sq.js | 12 + sources/plugins/basicstyles/lang/sr-latn.js | 12 + sources/plugins/basicstyles/lang/sr.js | 12 + sources/plugins/basicstyles/lang/sv.js | 12 + sources/plugins/basicstyles/lang/th.js | 12 + sources/plugins/basicstyles/lang/tr.js | 12 + sources/plugins/basicstyles/lang/tt.js | 12 + sources/plugins/basicstyles/lang/ug.js | 12 + sources/plugins/basicstyles/lang/uk.js | 12 + sources/plugins/basicstyles/lang/vi.js | 12 + sources/plugins/basicstyles/lang/zh-cn.js | 12 + sources/plugins/basicstyles/lang/zh.js | 12 + sources/plugins/basicstyles/plugin.js | 209 + sources/plugins/button/lang/af.js | 8 + sources/plugins/button/lang/ar.js | 8 + sources/plugins/button/lang/az.js | 8 + sources/plugins/button/lang/bg.js | 8 + sources/plugins/button/lang/ca.js | 8 + sources/plugins/button/lang/cs.js | 8 + sources/plugins/button/lang/da.js | 8 + sources/plugins/button/lang/de-ch.js | 8 + sources/plugins/button/lang/de.js | 8 + sources/plugins/button/lang/el.js | 8 + sources/plugins/button/lang/en-gb.js | 8 + sources/plugins/button/lang/en.js | 8 + sources/plugins/button/lang/eo.js | 8 + sources/plugins/button/lang/es.js | 8 + sources/plugins/button/lang/eu.js | 8 + sources/plugins/button/lang/fa.js | 8 + sources/plugins/button/lang/fi.js | 8 + sources/plugins/button/lang/fr.js | 8 + sources/plugins/button/lang/gl.js | 8 + sources/plugins/button/lang/he.js | 8 + sources/plugins/button/lang/hu.js | 8 + sources/plugins/button/lang/id.js | 8 + sources/plugins/button/lang/it.js | 8 + sources/plugins/button/lang/ja.js | 8 + sources/plugins/button/lang/km.js | 8 + sources/plugins/button/lang/ko.js | 8 + sources/plugins/button/lang/ku.js | 8 + sources/plugins/button/lang/lt.js | 8 + sources/plugins/button/lang/nb.js | 8 + sources/plugins/button/lang/nl.js | 8 + sources/plugins/button/lang/no.js | 8 + sources/plugins/button/lang/oc.js | 8 + sources/plugins/button/lang/pl.js | 8 + sources/plugins/button/lang/pt-br.js | 8 + sources/plugins/button/lang/pt.js | 8 + sources/plugins/button/lang/ro.js | 8 + sources/plugins/button/lang/ru.js | 8 + sources/plugins/button/lang/sk.js | 8 + sources/plugins/button/lang/sl.js | 8 + sources/plugins/button/lang/sq.js | 8 + sources/plugins/button/lang/sv.js | 8 + sources/plugins/button/lang/tr.js | 8 + sources/plugins/button/lang/tt.js | 8 + sources/plugins/button/lang/ug.js | 8 + sources/plugins/button/lang/uk.js | 8 + sources/plugins/button/lang/vi.js | 8 + sources/plugins/button/lang/zh-cn.js | 8 + sources/plugins/button/lang/zh.js | 8 + sources/plugins/button/plugin.js | 389 ++ sources/plugins/clipboard/dev/clipboard.html | 190 + sources/plugins/clipboard/dev/console.js | 49 + sources/plugins/clipboard/dev/dnd.html | 185 + sources/plugins/clipboard/dialogs/paste.js | 254 ++ sources/plugins/clipboard/icons/copy-rtl.png | Bin 0 -> 506 bytes sources/plugins/clipboard/icons/copy.png | Bin 0 -> 506 bytes sources/plugins/clipboard/icons/cut-rtl.png | Bin 0 -> 776 bytes sources/plugins/clipboard/icons/cut.png | Bin 0 -> 776 bytes sources/plugins/clipboard/icons/hidpi/copy-rtl.png | Bin 0 -> 759 bytes sources/plugins/clipboard/icons/hidpi/copy.png | Bin 0 -> 759 bytes sources/plugins/clipboard/icons/hidpi/cut-rtl.png | Bin 0 -> 1576 bytes sources/plugins/clipboard/icons/hidpi/cut.png | Bin 0 -> 1576 bytes .../plugins/clipboard/icons/hidpi/paste-rtl.png | Bin 0 -> 854 bytes sources/plugins/clipboard/icons/hidpi/paste.png | Bin 0 -> 854 bytes sources/plugins/clipboard/icons/paste-rtl.png | Bin 0 -> 464 bytes sources/plugins/clipboard/icons/paste.png | Bin 0 -> 464 bytes sources/plugins/clipboard/lang/af.js | 15 + sources/plugins/clipboard/lang/ar.js | 15 + sources/plugins/clipboard/lang/az.js | 15 + sources/plugins/clipboard/lang/bg.js | 15 + sources/plugins/clipboard/lang/bn.js | 15 + sources/plugins/clipboard/lang/bs.js | 15 + sources/plugins/clipboard/lang/ca.js | 15 + sources/plugins/clipboard/lang/cs.js | 15 + sources/plugins/clipboard/lang/cy.js | 15 + sources/plugins/clipboard/lang/da.js | 15 + sources/plugins/clipboard/lang/de-ch.js | 15 + sources/plugins/clipboard/lang/de.js | 15 + sources/plugins/clipboard/lang/el.js | 15 + sources/plugins/clipboard/lang/en-au.js | 15 + sources/plugins/clipboard/lang/en-ca.js | 15 + sources/plugins/clipboard/lang/en-gb.js | 15 + sources/plugins/clipboard/lang/en.js | 15 + sources/plugins/clipboard/lang/eo.js | 15 + sources/plugins/clipboard/lang/es.js | 15 + sources/plugins/clipboard/lang/et.js | 15 + sources/plugins/clipboard/lang/eu.js | 15 + sources/plugins/clipboard/lang/fa.js | 15 + sources/plugins/clipboard/lang/fi.js | 15 + sources/plugins/clipboard/lang/fo.js | 15 + sources/plugins/clipboard/lang/fr-ca.js | 15 + sources/plugins/clipboard/lang/fr.js | 15 + sources/plugins/clipboard/lang/gl.js | 15 + sources/plugins/clipboard/lang/gu.js | 15 + sources/plugins/clipboard/lang/he.js | 15 + sources/plugins/clipboard/lang/hi.js | 15 + sources/plugins/clipboard/lang/hr.js | 15 + sources/plugins/clipboard/lang/hu.js | 15 + sources/plugins/clipboard/lang/id.js | 15 + sources/plugins/clipboard/lang/is.js | 15 + sources/plugins/clipboard/lang/it.js | 15 + sources/plugins/clipboard/lang/ja.js | 15 + sources/plugins/clipboard/lang/ka.js | 15 + sources/plugins/clipboard/lang/km.js | 15 + sources/plugins/clipboard/lang/ko.js | 15 + sources/plugins/clipboard/lang/ku.js | 15 + sources/plugins/clipboard/lang/lt.js | 15 + sources/plugins/clipboard/lang/lv.js | 15 + sources/plugins/clipboard/lang/mk.js | 15 + sources/plugins/clipboard/lang/mn.js | 15 + sources/plugins/clipboard/lang/ms.js | 15 + sources/plugins/clipboard/lang/nb.js | 15 + sources/plugins/clipboard/lang/nl.js | 15 + sources/plugins/clipboard/lang/no.js | 15 + sources/plugins/clipboard/lang/oc.js | 15 + sources/plugins/clipboard/lang/pl.js | 15 + sources/plugins/clipboard/lang/pt-br.js | 15 + sources/plugins/clipboard/lang/pt.js | 15 + sources/plugins/clipboard/lang/ro.js | 15 + sources/plugins/clipboard/lang/ru.js | 15 + sources/plugins/clipboard/lang/si.js | 15 + sources/plugins/clipboard/lang/sk.js | 15 + sources/plugins/clipboard/lang/sl.js | 15 + sources/plugins/clipboard/lang/sq.js | 15 + sources/plugins/clipboard/lang/sr-latn.js | 15 + sources/plugins/clipboard/lang/sr.js | 15 + sources/plugins/clipboard/lang/sv.js | 15 + sources/plugins/clipboard/lang/th.js | 15 + sources/plugins/clipboard/lang/tr.js | 15 + sources/plugins/clipboard/lang/tt.js | 15 + sources/plugins/clipboard/lang/ug.js | 15 + sources/plugins/clipboard/lang/uk.js | 15 + sources/plugins/clipboard/lang/vi.js | 15 + sources/plugins/clipboard/lang/zh-cn.js | 15 + sources/plugins/clipboard/lang/zh.js | 15 + sources/plugins/clipboard/plugin.js | 2772 +++++++++++++ sources/plugins/contextmenu/lang/af.js | 7 + sources/plugins/contextmenu/lang/ar.js | 7 + sources/plugins/contextmenu/lang/az.js | 7 + sources/plugins/contextmenu/lang/bg.js | 7 + sources/plugins/contextmenu/lang/bn.js | 7 + sources/plugins/contextmenu/lang/bs.js | 7 + sources/plugins/contextmenu/lang/ca.js | 7 + sources/plugins/contextmenu/lang/cs.js | 7 + sources/plugins/contextmenu/lang/cy.js | 7 + sources/plugins/contextmenu/lang/da.js | 7 + sources/plugins/contextmenu/lang/de-ch.js | 7 + sources/plugins/contextmenu/lang/de.js | 7 + sources/plugins/contextmenu/lang/el.js | 7 + sources/plugins/contextmenu/lang/en-au.js | 7 + sources/plugins/contextmenu/lang/en-ca.js | 7 + sources/plugins/contextmenu/lang/en-gb.js | 7 + sources/plugins/contextmenu/lang/en.js | 7 + sources/plugins/contextmenu/lang/eo.js | 7 + sources/plugins/contextmenu/lang/es.js | 7 + sources/plugins/contextmenu/lang/et.js | 7 + sources/plugins/contextmenu/lang/eu.js | 7 + sources/plugins/contextmenu/lang/fa.js | 7 + sources/plugins/contextmenu/lang/fi.js | 7 + sources/plugins/contextmenu/lang/fo.js | 7 + sources/plugins/contextmenu/lang/fr-ca.js | 7 + sources/plugins/contextmenu/lang/fr.js | 7 + sources/plugins/contextmenu/lang/gl.js | 7 + sources/plugins/contextmenu/lang/gu.js | 7 + sources/plugins/contextmenu/lang/he.js | 7 + sources/plugins/contextmenu/lang/hi.js | 7 + sources/plugins/contextmenu/lang/hr.js | 7 + sources/plugins/contextmenu/lang/hu.js | 7 + sources/plugins/contextmenu/lang/id.js | 7 + sources/plugins/contextmenu/lang/is.js | 7 + sources/plugins/contextmenu/lang/it.js | 7 + sources/plugins/contextmenu/lang/ja.js | 7 + sources/plugins/contextmenu/lang/ka.js | 7 + sources/plugins/contextmenu/lang/km.js | 7 + sources/plugins/contextmenu/lang/ko.js | 7 + sources/plugins/contextmenu/lang/ku.js | 7 + sources/plugins/contextmenu/lang/lt.js | 7 + sources/plugins/contextmenu/lang/lv.js | 7 + sources/plugins/contextmenu/lang/mk.js | 7 + sources/plugins/contextmenu/lang/mn.js | 7 + sources/plugins/contextmenu/lang/ms.js | 7 + sources/plugins/contextmenu/lang/nb.js | 7 + sources/plugins/contextmenu/lang/nl.js | 7 + sources/plugins/contextmenu/lang/no.js | 7 + sources/plugins/contextmenu/lang/oc.js | 7 + sources/plugins/contextmenu/lang/pl.js | 7 + sources/plugins/contextmenu/lang/pt-br.js | 7 + sources/plugins/contextmenu/lang/pt.js | 7 + sources/plugins/contextmenu/lang/ro.js | 7 + sources/plugins/contextmenu/lang/ru.js | 7 + sources/plugins/contextmenu/lang/si.js | 7 + sources/plugins/contextmenu/lang/sk.js | 7 + sources/plugins/contextmenu/lang/sl.js | 7 + sources/plugins/contextmenu/lang/sq.js | 7 + sources/plugins/contextmenu/lang/sr-latn.js | 7 + sources/plugins/contextmenu/lang/sr.js | 7 + sources/plugins/contextmenu/lang/sv.js | 7 + sources/plugins/contextmenu/lang/th.js | 7 + sources/plugins/contextmenu/lang/tr.js | 7 + sources/plugins/contextmenu/lang/tt.js | 7 + sources/plugins/contextmenu/lang/ug.js | 7 + sources/plugins/contextmenu/lang/uk.js | 7 + sources/plugins/contextmenu/lang/vi.js | 7 + sources/plugins/contextmenu/lang/zh-cn.js | 7 + sources/plugins/contextmenu/lang/zh.js | 7 + sources/plugins/contextmenu/plugin.js | 159 + sources/plugins/dialog/dialogDefinition.js | 1032 +++++ sources/plugins/dialog/plugin.js | 3399 ++++++++++++++++ sources/plugins/dialog/samples/assets/my_dialog.js | 49 + sources/plugins/dialog/samples/dialog.html | 190 + sources/plugins/dialogadvtab/plugin.js | 196 + sources/plugins/dialogui/plugin.js | 1530 ++++++++ sources/plugins/elementspath/lang/af.js | 8 + sources/plugins/elementspath/lang/ar.js | 8 + sources/plugins/elementspath/lang/az.js | 8 + sources/plugins/elementspath/lang/bg.js | 8 + sources/plugins/elementspath/lang/bn.js | 8 + sources/plugins/elementspath/lang/bs.js | 8 + sources/plugins/elementspath/lang/ca.js | 8 + sources/plugins/elementspath/lang/cs.js | 8 + sources/plugins/elementspath/lang/cy.js | 8 + sources/plugins/elementspath/lang/da.js | 8 + sources/plugins/elementspath/lang/de-ch.js | 8 + sources/plugins/elementspath/lang/de.js | 8 + sources/plugins/elementspath/lang/el.js | 8 + sources/plugins/elementspath/lang/en-au.js | 8 + sources/plugins/elementspath/lang/en-ca.js | 8 + sources/plugins/elementspath/lang/en-gb.js | 8 + sources/plugins/elementspath/lang/en.js | 8 + sources/plugins/elementspath/lang/eo.js | 8 + sources/plugins/elementspath/lang/es.js | 8 + sources/plugins/elementspath/lang/et.js | 8 + sources/plugins/elementspath/lang/eu.js | 8 + sources/plugins/elementspath/lang/fa.js | 8 + sources/plugins/elementspath/lang/fi.js | 8 + sources/plugins/elementspath/lang/fo.js | 8 + sources/plugins/elementspath/lang/fr-ca.js | 8 + sources/plugins/elementspath/lang/fr.js | 8 + sources/plugins/elementspath/lang/gl.js | 8 + sources/plugins/elementspath/lang/gu.js | 8 + sources/plugins/elementspath/lang/he.js | 8 + sources/plugins/elementspath/lang/hi.js | 8 + sources/plugins/elementspath/lang/hr.js | 8 + sources/plugins/elementspath/lang/hu.js | 8 + sources/plugins/elementspath/lang/is.js | 8 + sources/plugins/elementspath/lang/it.js | 8 + sources/plugins/elementspath/lang/ja.js | 8 + sources/plugins/elementspath/lang/ka.js | 8 + sources/plugins/elementspath/lang/km.js | 8 + sources/plugins/elementspath/lang/ko.js | 8 + sources/plugins/elementspath/lang/ku.js | 8 + sources/plugins/elementspath/lang/lt.js | 8 + sources/plugins/elementspath/lang/lv.js | 8 + sources/plugins/elementspath/lang/mk.js | 8 + sources/plugins/elementspath/lang/mn.js | 8 + sources/plugins/elementspath/lang/ms.js | 8 + sources/plugins/elementspath/lang/nb.js | 8 + sources/plugins/elementspath/lang/nl.js | 8 + sources/plugins/elementspath/lang/no.js | 8 + sources/plugins/elementspath/lang/oc.js | 8 + sources/plugins/elementspath/lang/pl.js | 8 + sources/plugins/elementspath/lang/pt-br.js | 8 + sources/plugins/elementspath/lang/pt.js | 8 + sources/plugins/elementspath/lang/ro.js | 8 + sources/plugins/elementspath/lang/ru.js | 8 + sources/plugins/elementspath/lang/si.js | 8 + sources/plugins/elementspath/lang/sk.js | 8 + sources/plugins/elementspath/lang/sl.js | 8 + sources/plugins/elementspath/lang/sq.js | 8 + sources/plugins/elementspath/lang/sr-latn.js | 8 + sources/plugins/elementspath/lang/sr.js | 8 + sources/plugins/elementspath/lang/sv.js | 8 + sources/plugins/elementspath/lang/th.js | 8 + sources/plugins/elementspath/lang/tr.js | 8 + sources/plugins/elementspath/lang/tt.js | 8 + sources/plugins/elementspath/lang/ug.js | 8 + sources/plugins/elementspath/lang/uk.js | 8 + sources/plugins/elementspath/lang/vi.js | 8 + sources/plugins/elementspath/lang/zh-cn.js | 8 + sources/plugins/elementspath/lang/zh.js | 8 + sources/plugins/elementspath/plugin.js | 244 ++ sources/plugins/enterkey/plugin.js | 566 +++ sources/plugins/enterkey/samples/enterkey.html | 106 + sources/plugins/entities/plugin.js | 239 ++ sources/plugins/fakeobjects/lang/af.js | 11 + sources/plugins/fakeobjects/lang/ar.js | 11 + sources/plugins/fakeobjects/lang/az.js | 11 + sources/plugins/fakeobjects/lang/bg.js | 11 + sources/plugins/fakeobjects/lang/bn.js | 11 + sources/plugins/fakeobjects/lang/bs.js | 11 + sources/plugins/fakeobjects/lang/ca.js | 11 + sources/plugins/fakeobjects/lang/cs.js | 11 + sources/plugins/fakeobjects/lang/cy.js | 11 + sources/plugins/fakeobjects/lang/da.js | 11 + sources/plugins/fakeobjects/lang/de-ch.js | 11 + sources/plugins/fakeobjects/lang/de.js | 11 + sources/plugins/fakeobjects/lang/el.js | 11 + sources/plugins/fakeobjects/lang/en-au.js | 11 + sources/plugins/fakeobjects/lang/en-ca.js | 11 + sources/plugins/fakeobjects/lang/en-gb.js | 11 + sources/plugins/fakeobjects/lang/en.js | 11 + sources/plugins/fakeobjects/lang/eo.js | 11 + sources/plugins/fakeobjects/lang/es.js | 11 + sources/plugins/fakeobjects/lang/et.js | 11 + sources/plugins/fakeobjects/lang/eu.js | 11 + sources/plugins/fakeobjects/lang/fa.js | 11 + sources/plugins/fakeobjects/lang/fi.js | 11 + sources/plugins/fakeobjects/lang/fo.js | 11 + sources/plugins/fakeobjects/lang/fr-ca.js | 11 + sources/plugins/fakeobjects/lang/fr.js | 11 + sources/plugins/fakeobjects/lang/gl.js | 11 + sources/plugins/fakeobjects/lang/gu.js | 11 + sources/plugins/fakeobjects/lang/he.js | 11 + sources/plugins/fakeobjects/lang/hi.js | 11 + sources/plugins/fakeobjects/lang/hr.js | 11 + sources/plugins/fakeobjects/lang/hu.js | 11 + sources/plugins/fakeobjects/lang/id.js | 11 + sources/plugins/fakeobjects/lang/is.js | 11 + sources/plugins/fakeobjects/lang/it.js | 11 + sources/plugins/fakeobjects/lang/ja.js | 11 + sources/plugins/fakeobjects/lang/ka.js | 11 + sources/plugins/fakeobjects/lang/km.js | 11 + sources/plugins/fakeobjects/lang/ko.js | 11 + sources/plugins/fakeobjects/lang/ku.js | 11 + sources/plugins/fakeobjects/lang/lt.js | 11 + sources/plugins/fakeobjects/lang/lv.js | 11 + sources/plugins/fakeobjects/lang/mk.js | 11 + sources/plugins/fakeobjects/lang/mn.js | 11 + sources/plugins/fakeobjects/lang/ms.js | 11 + sources/plugins/fakeobjects/lang/nb.js | 11 + sources/plugins/fakeobjects/lang/nl.js | 11 + sources/plugins/fakeobjects/lang/no.js | 11 + sources/plugins/fakeobjects/lang/oc.js | 11 + sources/plugins/fakeobjects/lang/pl.js | 11 + sources/plugins/fakeobjects/lang/pt-br.js | 11 + sources/plugins/fakeobjects/lang/pt.js | 11 + sources/plugins/fakeobjects/lang/ro.js | 11 + sources/plugins/fakeobjects/lang/ru.js | 11 + sources/plugins/fakeobjects/lang/si.js | 11 + sources/plugins/fakeobjects/lang/sk.js | 11 + sources/plugins/fakeobjects/lang/sl.js | 11 + sources/plugins/fakeobjects/lang/sq.js | 11 + sources/plugins/fakeobjects/lang/sr-latn.js | 11 + sources/plugins/fakeobjects/lang/sr.js | 11 + sources/plugins/fakeobjects/lang/sv.js | 11 + sources/plugins/fakeobjects/lang/th.js | 11 + sources/plugins/fakeobjects/lang/tr.js | 11 + sources/plugins/fakeobjects/lang/tt.js | 11 + sources/plugins/fakeobjects/lang/ug.js | 11 + sources/plugins/fakeobjects/lang/uk.js | 11 + sources/plugins/fakeobjects/lang/vi.js | 11 + sources/plugins/fakeobjects/lang/zh-cn.js | 11 + sources/plugins/fakeobjects/lang/zh.js | 11 + sources/plugins/fakeobjects/plugin.js | 183 + sources/plugins/filebrowser/plugin.js | 573 +++ sources/plugins/floatingspace/plugin.js | 406 ++ sources/plugins/floatpanel/plugin.js | 598 +++ sources/plugins/format/lang/af.js | 18 + sources/plugins/format/lang/ar.js | 18 + sources/plugins/format/lang/az.js | 18 + sources/plugins/format/lang/bg.js | 18 + sources/plugins/format/lang/bn.js | 18 + sources/plugins/format/lang/bs.js | 18 + sources/plugins/format/lang/ca.js | 18 + sources/plugins/format/lang/cs.js | 18 + sources/plugins/format/lang/cy.js | 18 + sources/plugins/format/lang/da.js | 18 + sources/plugins/format/lang/de-ch.js | 18 + sources/plugins/format/lang/de.js | 18 + sources/plugins/format/lang/el.js | 18 + sources/plugins/format/lang/en-au.js | 18 + sources/plugins/format/lang/en-ca.js | 18 + sources/plugins/format/lang/en-gb.js | 18 + sources/plugins/format/lang/en.js | 18 + sources/plugins/format/lang/eo.js | 18 + sources/plugins/format/lang/es.js | 18 + sources/plugins/format/lang/et.js | 18 + sources/plugins/format/lang/eu.js | 18 + sources/plugins/format/lang/fa.js | 18 + sources/plugins/format/lang/fi.js | 18 + sources/plugins/format/lang/fo.js | 18 + sources/plugins/format/lang/fr-ca.js | 18 + sources/plugins/format/lang/fr.js | 18 + sources/plugins/format/lang/gl.js | 18 + sources/plugins/format/lang/gu.js | 18 + sources/plugins/format/lang/he.js | 18 + sources/plugins/format/lang/hi.js | 18 + sources/plugins/format/lang/hr.js | 18 + sources/plugins/format/lang/hu.js | 18 + sources/plugins/format/lang/id.js | 18 + sources/plugins/format/lang/is.js | 18 + sources/plugins/format/lang/it.js | 18 + sources/plugins/format/lang/ja.js | 18 + sources/plugins/format/lang/ka.js | 18 + sources/plugins/format/lang/km.js | 18 + sources/plugins/format/lang/ko.js | 18 + sources/plugins/format/lang/ku.js | 18 + sources/plugins/format/lang/lt.js | 18 + sources/plugins/format/lang/lv.js | 18 + sources/plugins/format/lang/mk.js | 18 + sources/plugins/format/lang/mn.js | 18 + sources/plugins/format/lang/ms.js | 18 + sources/plugins/format/lang/nb.js | 18 + sources/plugins/format/lang/nl.js | 18 + sources/plugins/format/lang/no.js | 18 + sources/plugins/format/lang/oc.js | 18 + sources/plugins/format/lang/pl.js | 18 + sources/plugins/format/lang/pt-br.js | 18 + sources/plugins/format/lang/pt.js | 18 + sources/plugins/format/lang/ro.js | 18 + sources/plugins/format/lang/ru.js | 18 + sources/plugins/format/lang/si.js | 18 + sources/plugins/format/lang/sk.js | 18 + sources/plugins/format/lang/sl.js | 18 + sources/plugins/format/lang/sq.js | 18 + sources/plugins/format/lang/sr-latn.js | 18 + sources/plugins/format/lang/sr.js | 18 + sources/plugins/format/lang/sv.js | 18 + sources/plugins/format/lang/th.js | 18 + sources/plugins/format/lang/tr.js | 18 + sources/plugins/format/lang/tt.js | 18 + sources/plugins/format/lang/ug.js | 18 + sources/plugins/format/lang/uk.js | 18 + sources/plugins/format/lang/vi.js | 18 + sources/plugins/format/lang/zh-cn.js | 18 + sources/plugins/format/lang/zh.js | 18 + sources/plugins/format/plugin.js | 279 ++ .../horizontalrule/icons/hidpi/horizontalrule.png | Bin 0 -> 530 bytes .../horizontalrule/icons/horizontalrule.png | Bin 0 -> 432 bytes sources/plugins/horizontalrule/lang/af.js | 7 + sources/plugins/horizontalrule/lang/ar.js | 7 + sources/plugins/horizontalrule/lang/az.js | 7 + sources/plugins/horizontalrule/lang/bg.js | 7 + sources/plugins/horizontalrule/lang/bn.js | 7 + sources/plugins/horizontalrule/lang/bs.js | 7 + sources/plugins/horizontalrule/lang/ca.js | 7 + sources/plugins/horizontalrule/lang/cs.js | 7 + sources/plugins/horizontalrule/lang/cy.js | 7 + sources/plugins/horizontalrule/lang/da.js | 7 + sources/plugins/horizontalrule/lang/de-ch.js | 7 + sources/plugins/horizontalrule/lang/de.js | 7 + sources/plugins/horizontalrule/lang/el.js | 7 + sources/plugins/horizontalrule/lang/en-au.js | 7 + sources/plugins/horizontalrule/lang/en-ca.js | 7 + sources/plugins/horizontalrule/lang/en-gb.js | 7 + sources/plugins/horizontalrule/lang/en.js | 7 + sources/plugins/horizontalrule/lang/eo.js | 7 + sources/plugins/horizontalrule/lang/es.js | 7 + sources/plugins/horizontalrule/lang/et.js | 7 + sources/plugins/horizontalrule/lang/eu.js | 7 + sources/plugins/horizontalrule/lang/fa.js | 7 + sources/plugins/horizontalrule/lang/fi.js | 7 + sources/plugins/horizontalrule/lang/fo.js | 7 + sources/plugins/horizontalrule/lang/fr-ca.js | 7 + sources/plugins/horizontalrule/lang/fr.js | 7 + sources/plugins/horizontalrule/lang/gl.js | 7 + sources/plugins/horizontalrule/lang/gu.js | 7 + sources/plugins/horizontalrule/lang/he.js | 7 + sources/plugins/horizontalrule/lang/hi.js | 7 + sources/plugins/horizontalrule/lang/hr.js | 7 + sources/plugins/horizontalrule/lang/hu.js | 7 + sources/plugins/horizontalrule/lang/id.js | 7 + sources/plugins/horizontalrule/lang/is.js | 7 + sources/plugins/horizontalrule/lang/it.js | 7 + sources/plugins/horizontalrule/lang/ja.js | 7 + sources/plugins/horizontalrule/lang/ka.js | 7 + sources/plugins/horizontalrule/lang/km.js | 7 + sources/plugins/horizontalrule/lang/ko.js | 7 + sources/plugins/horizontalrule/lang/ku.js | 7 + sources/plugins/horizontalrule/lang/lt.js | 7 + sources/plugins/horizontalrule/lang/lv.js | 7 + sources/plugins/horizontalrule/lang/mk.js | 7 + sources/plugins/horizontalrule/lang/mn.js | 7 + sources/plugins/horizontalrule/lang/ms.js | 7 + sources/plugins/horizontalrule/lang/nb.js | 7 + sources/plugins/horizontalrule/lang/nl.js | 7 + sources/plugins/horizontalrule/lang/no.js | 7 + sources/plugins/horizontalrule/lang/oc.js | 7 + sources/plugins/horizontalrule/lang/pl.js | 7 + sources/plugins/horizontalrule/lang/pt-br.js | 7 + sources/plugins/horizontalrule/lang/pt.js | 7 + sources/plugins/horizontalrule/lang/ro.js | 7 + sources/plugins/horizontalrule/lang/ru.js | 7 + sources/plugins/horizontalrule/lang/si.js | 7 + sources/plugins/horizontalrule/lang/sk.js | 7 + sources/plugins/horizontalrule/lang/sl.js | 7 + sources/plugins/horizontalrule/lang/sq.js | 7 + sources/plugins/horizontalrule/lang/sr-latn.js | 7 + sources/plugins/horizontalrule/lang/sr.js | 7 + sources/plugins/horizontalrule/lang/sv.js | 7 + sources/plugins/horizontalrule/lang/th.js | 7 + sources/plugins/horizontalrule/lang/tr.js | 7 + sources/plugins/horizontalrule/lang/tt.js | 7 + sources/plugins/horizontalrule/lang/ug.js | 7 + sources/plugins/horizontalrule/lang/uk.js | 7 + sources/plugins/horizontalrule/lang/vi.js | 7 + sources/plugins/horizontalrule/lang/zh-cn.js | 7 + sources/plugins/horizontalrule/lang/zh.js | 7 + sources/plugins/horizontalrule/plugin.js | 43 + sources/plugins/htmlwriter/plugin.js | 360 ++ .../assets/outputforflash/outputforflash.fla | Bin 0 -> 85504 bytes .../assets/outputforflash/outputforflash.swf | Bin 0 -> 15571 bytes .../samples/assets/outputforflash/swfobject.js | 5 + .../plugins/htmlwriter/samples/outputforflash.html | 283 ++ sources/plugins/htmlwriter/samples/outputhtml.html | 224 ++ sources/plugins/iframe/dialogs/iframe.js | 207 + sources/plugins/iframe/icons/hidpi/iframe.png | Bin 0 -> 1837 bytes sources/plugins/iframe/icons/iframe.png | Bin 0 -> 816 bytes sources/plugins/iframe/images/placeholder.png | Bin 0 -> 265 bytes sources/plugins/iframe/lang/af.js | 11 + sources/plugins/iframe/lang/ar.js | 11 + sources/plugins/iframe/lang/az.js | 11 + sources/plugins/iframe/lang/bg.js | 11 + sources/plugins/iframe/lang/bn.js | 11 + sources/plugins/iframe/lang/bs.js | 11 + sources/plugins/iframe/lang/ca.js | 11 + sources/plugins/iframe/lang/cs.js | 11 + sources/plugins/iframe/lang/cy.js | 11 + sources/plugins/iframe/lang/da.js | 11 + sources/plugins/iframe/lang/de-ch.js | 11 + sources/plugins/iframe/lang/de.js | 11 + sources/plugins/iframe/lang/el.js | 11 + sources/plugins/iframe/lang/en-au.js | 11 + sources/plugins/iframe/lang/en-ca.js | 11 + sources/plugins/iframe/lang/en-gb.js | 11 + sources/plugins/iframe/lang/en.js | 11 + sources/plugins/iframe/lang/eo.js | 11 + sources/plugins/iframe/lang/es.js | 11 + sources/plugins/iframe/lang/et.js | 11 + sources/plugins/iframe/lang/eu.js | 11 + sources/plugins/iframe/lang/fa.js | 11 + sources/plugins/iframe/lang/fi.js | 11 + sources/plugins/iframe/lang/fo.js | 11 + sources/plugins/iframe/lang/fr-ca.js | 11 + sources/plugins/iframe/lang/fr.js | 11 + sources/plugins/iframe/lang/gl.js | 11 + sources/plugins/iframe/lang/gu.js | 11 + sources/plugins/iframe/lang/he.js | 11 + sources/plugins/iframe/lang/hi.js | 11 + sources/plugins/iframe/lang/hr.js | 11 + sources/plugins/iframe/lang/hu.js | 11 + sources/plugins/iframe/lang/id.js | 11 + sources/plugins/iframe/lang/is.js | 11 + sources/plugins/iframe/lang/it.js | 11 + sources/plugins/iframe/lang/ja.js | 11 + sources/plugins/iframe/lang/ka.js | 11 + sources/plugins/iframe/lang/km.js | 11 + sources/plugins/iframe/lang/ko.js | 11 + sources/plugins/iframe/lang/ku.js | 11 + sources/plugins/iframe/lang/lt.js | 11 + sources/plugins/iframe/lang/lv.js | 11 + sources/plugins/iframe/lang/mk.js | 11 + sources/plugins/iframe/lang/mn.js | 11 + sources/plugins/iframe/lang/ms.js | 11 + sources/plugins/iframe/lang/nb.js | 11 + sources/plugins/iframe/lang/nl.js | 11 + sources/plugins/iframe/lang/no.js | 11 + sources/plugins/iframe/lang/oc.js | 11 + sources/plugins/iframe/lang/pl.js | 11 + sources/plugins/iframe/lang/pt-br.js | 11 + sources/plugins/iframe/lang/pt.js | 11 + sources/plugins/iframe/lang/ro.js | 11 + sources/plugins/iframe/lang/ru.js | 11 + sources/plugins/iframe/lang/si.js | 11 + sources/plugins/iframe/lang/sk.js | 11 + sources/plugins/iframe/lang/sl.js | 11 + sources/plugins/iframe/lang/sq.js | 11 + sources/plugins/iframe/lang/sr-latn.js | 11 + sources/plugins/iframe/lang/sr.js | 11 + sources/plugins/iframe/lang/sv.js | 11 + sources/plugins/iframe/lang/th.js | 11 + sources/plugins/iframe/lang/tr.js | 11 + sources/plugins/iframe/lang/tt.js | 11 + sources/plugins/iframe/lang/ug.js | 11 + sources/plugins/iframe/lang/uk.js | 11 + sources/plugins/iframe/lang/vi.js | 11 + sources/plugins/iframe/lang/zh-cn.js | 11 + sources/plugins/iframe/lang/zh.js | 11 + sources/plugins/iframe/plugin.js | 85 + sources/plugins/image/dialogs/image.js | 1254 ++++++ sources/plugins/image/icons/hidpi/image.png | Bin 0 -> 905 bytes sources/plugins/image/icons/image.png | Bin 0 -> 498 bytes sources/plugins/image/images/noimage.png | Bin 0 -> 1610 bytes sources/plugins/image/lang/af.js | 25 + sources/plugins/image/lang/ar.js | 25 + sources/plugins/image/lang/az.js | 25 + sources/plugins/image/lang/bg.js | 25 + sources/plugins/image/lang/bn.js | 25 + sources/plugins/image/lang/bs.js | 25 + sources/plugins/image/lang/ca.js | 25 + sources/plugins/image/lang/cs.js | 25 + sources/plugins/image/lang/cy.js | 25 + sources/plugins/image/lang/da.js | 25 + sources/plugins/image/lang/de-ch.js | 25 + sources/plugins/image/lang/de.js | 25 + sources/plugins/image/lang/el.js | 25 + sources/plugins/image/lang/en-au.js | 25 + sources/plugins/image/lang/en-ca.js | 25 + sources/plugins/image/lang/en-gb.js | 25 + sources/plugins/image/lang/en.js | 25 + sources/plugins/image/lang/eo.js | 25 + sources/plugins/image/lang/es.js | 25 + sources/plugins/image/lang/et.js | 25 + sources/plugins/image/lang/eu.js | 25 + sources/plugins/image/lang/fa.js | 25 + sources/plugins/image/lang/fi.js | 25 + sources/plugins/image/lang/fo.js | 25 + sources/plugins/image/lang/fr-ca.js | 25 + sources/plugins/image/lang/fr.js | 25 + sources/plugins/image/lang/gl.js | 25 + sources/plugins/image/lang/gu.js | 25 + sources/plugins/image/lang/he.js | 25 + sources/plugins/image/lang/hi.js | 25 + sources/plugins/image/lang/hr.js | 25 + sources/plugins/image/lang/hu.js | 25 + sources/plugins/image/lang/id.js | 25 + sources/plugins/image/lang/is.js | 25 + sources/plugins/image/lang/it.js | 25 + sources/plugins/image/lang/ja.js | 25 + sources/plugins/image/lang/ka.js | 25 + sources/plugins/image/lang/km.js | 25 + sources/plugins/image/lang/ko.js | 25 + sources/plugins/image/lang/ku.js | 25 + sources/plugins/image/lang/lt.js | 25 + sources/plugins/image/lang/lv.js | 25 + sources/plugins/image/lang/mk.js | 25 + sources/plugins/image/lang/mn.js | 25 + sources/plugins/image/lang/ms.js | 25 + sources/plugins/image/lang/nb.js | 25 + sources/plugins/image/lang/nl.js | 25 + sources/plugins/image/lang/no.js | 25 + sources/plugins/image/lang/oc.js | 25 + sources/plugins/image/lang/pl.js | 25 + sources/plugins/image/lang/pt-br.js | 25 + sources/plugins/image/lang/pt.js | 25 + sources/plugins/image/lang/ro.js | 25 + sources/plugins/image/lang/ru.js | 25 + sources/plugins/image/lang/si.js | 25 + sources/plugins/image/lang/sk.js | 25 + sources/plugins/image/lang/sl.js | 25 + sources/plugins/image/lang/sq.js | 25 + sources/plugins/image/lang/sr-latn.js | 25 + sources/plugins/image/lang/sr.js | 25 + sources/plugins/image/lang/sv.js | 25 + sources/plugins/image/lang/th.js | 25 + sources/plugins/image/lang/tr.js | 25 + sources/plugins/image/lang/tt.js | 25 + sources/plugins/image/lang/ug.js | 25 + sources/plugins/image/lang/uk.js | 25 + sources/plugins/image/lang/vi.js | 25 + sources/plugins/image/lang/zh-cn.js | 25 + sources/plugins/image/lang/zh.js | 25 + sources/plugins/image/plugin.js | 183 + sources/plugins/indent/dev/indent.html | 284 ++ sources/plugins/indent/icons/hidpi/indent-rtl.png | Bin 0 -> 757 bytes sources/plugins/indent/icons/hidpi/indent.png | Bin 0 -> 1001 bytes sources/plugins/indent/icons/hidpi/outdent-rtl.png | Bin 0 -> 738 bytes sources/plugins/indent/icons/hidpi/outdent.png | Bin 0 -> 754 bytes sources/plugins/indent/icons/indent-rtl.png | Bin 0 -> 438 bytes sources/plugins/indent/icons/indent.png | Bin 0 -> 489 bytes sources/plugins/indent/icons/outdent-rtl.png | Bin 0 -> 450 bytes sources/plugins/indent/icons/outdent.png | Bin 0 -> 413 bytes sources/plugins/indent/lang/af.js | 8 + sources/plugins/indent/lang/ar.js | 8 + sources/plugins/indent/lang/az.js | 8 + sources/plugins/indent/lang/bg.js | 8 + sources/plugins/indent/lang/bn.js | 8 + sources/plugins/indent/lang/bs.js | 8 + sources/plugins/indent/lang/ca.js | 8 + sources/plugins/indent/lang/cs.js | 8 + sources/plugins/indent/lang/cy.js | 8 + sources/plugins/indent/lang/da.js | 8 + sources/plugins/indent/lang/de-ch.js | 8 + sources/plugins/indent/lang/de.js | 8 + sources/plugins/indent/lang/el.js | 8 + sources/plugins/indent/lang/en-au.js | 8 + sources/plugins/indent/lang/en-ca.js | 8 + sources/plugins/indent/lang/en-gb.js | 8 + sources/plugins/indent/lang/en.js | 8 + sources/plugins/indent/lang/eo.js | 8 + sources/plugins/indent/lang/es.js | 8 + sources/plugins/indent/lang/et.js | 8 + sources/plugins/indent/lang/eu.js | 8 + sources/plugins/indent/lang/fa.js | 8 + sources/plugins/indent/lang/fi.js | 8 + sources/plugins/indent/lang/fo.js | 8 + sources/plugins/indent/lang/fr-ca.js | 8 + sources/plugins/indent/lang/fr.js | 8 + sources/plugins/indent/lang/gl.js | 8 + sources/plugins/indent/lang/gu.js | 8 + sources/plugins/indent/lang/he.js | 8 + sources/plugins/indent/lang/hi.js | 8 + sources/plugins/indent/lang/hr.js | 8 + sources/plugins/indent/lang/hu.js | 8 + sources/plugins/indent/lang/id.js | 8 + sources/plugins/indent/lang/is.js | 8 + sources/plugins/indent/lang/it.js | 8 + sources/plugins/indent/lang/ja.js | 8 + sources/plugins/indent/lang/ka.js | 8 + sources/plugins/indent/lang/km.js | 8 + sources/plugins/indent/lang/ko.js | 8 + sources/plugins/indent/lang/ku.js | 8 + sources/plugins/indent/lang/lt.js | 8 + sources/plugins/indent/lang/lv.js | 8 + sources/plugins/indent/lang/mk.js | 8 + sources/plugins/indent/lang/mn.js | 8 + sources/plugins/indent/lang/ms.js | 8 + sources/plugins/indent/lang/nb.js | 8 + sources/plugins/indent/lang/nl.js | 8 + sources/plugins/indent/lang/no.js | 8 + sources/plugins/indent/lang/oc.js | 8 + sources/plugins/indent/lang/pl.js | 8 + sources/plugins/indent/lang/pt-br.js | 8 + sources/plugins/indent/lang/pt.js | 8 + sources/plugins/indent/lang/ro.js | 8 + sources/plugins/indent/lang/ru.js | 8 + sources/plugins/indent/lang/si.js | 8 + sources/plugins/indent/lang/sk.js | 8 + sources/plugins/indent/lang/sl.js | 8 + sources/plugins/indent/lang/sq.js | 8 + sources/plugins/indent/lang/sr-latn.js | 8 + sources/plugins/indent/lang/sr.js | 8 + sources/plugins/indent/lang/sv.js | 8 + sources/plugins/indent/lang/th.js | 8 + sources/plugins/indent/lang/tr.js | 8 + sources/plugins/indent/lang/tt.js | 8 + sources/plugins/indent/lang/ug.js | 8 + sources/plugins/indent/lang/uk.js | 8 + sources/plugins/indent/lang/vi.js | 8 + sources/plugins/indent/lang/zh-cn.js | 8 + sources/plugins/indent/lang/zh.js | 8 + sources/plugins/indent/plugin.js | 461 +++ sources/plugins/indentblock/plugin.js | 312 ++ sources/plugins/indentlist/plugin.js | 318 ++ .../plugins/justify/icons/hidpi/justifyblock.png | Bin 0 -> 533 bytes .../plugins/justify/icons/hidpi/justifycenter.png | Bin 0 -> 576 bytes .../plugins/justify/icons/hidpi/justifyleft.png | Bin 0 -> 569 bytes .../plugins/justify/icons/hidpi/justifyright.png | Bin 0 -> 549 bytes sources/plugins/justify/icons/justifyblock.png | Bin 0 -> 315 bytes sources/plugins/justify/icons/justifycenter.png | Bin 0 -> 564 bytes sources/plugins/justify/icons/justifyleft.png | Bin 0 -> 342 bytes sources/plugins/justify/icons/justifyright.png | Bin 0 -> 348 bytes sources/plugins/justify/lang/af.js | 10 + sources/plugins/justify/lang/ar.js | 10 + sources/plugins/justify/lang/az.js | 10 + sources/plugins/justify/lang/bg.js | 10 + sources/plugins/justify/lang/bn.js | 10 + sources/plugins/justify/lang/bs.js | 10 + sources/plugins/justify/lang/ca.js | 10 + sources/plugins/justify/lang/cs.js | 10 + sources/plugins/justify/lang/cy.js | 10 + sources/plugins/justify/lang/da.js | 10 + sources/plugins/justify/lang/de-ch.js | 10 + sources/plugins/justify/lang/de.js | 10 + sources/plugins/justify/lang/el.js | 10 + sources/plugins/justify/lang/en-au.js | 10 + sources/plugins/justify/lang/en-ca.js | 10 + sources/plugins/justify/lang/en-gb.js | 10 + sources/plugins/justify/lang/en.js | 10 + sources/plugins/justify/lang/eo.js | 10 + sources/plugins/justify/lang/es.js | 10 + sources/plugins/justify/lang/et.js | 10 + sources/plugins/justify/lang/eu.js | 10 + sources/plugins/justify/lang/fa.js | 10 + sources/plugins/justify/lang/fi.js | 10 + sources/plugins/justify/lang/fo.js | 10 + sources/plugins/justify/lang/fr-ca.js | 10 + sources/plugins/justify/lang/fr.js | 10 + sources/plugins/justify/lang/gl.js | 10 + sources/plugins/justify/lang/gu.js | 10 + sources/plugins/justify/lang/he.js | 10 + sources/plugins/justify/lang/hi.js | 10 + sources/plugins/justify/lang/hr.js | 10 + sources/plugins/justify/lang/hu.js | 10 + sources/plugins/justify/lang/id.js | 10 + sources/plugins/justify/lang/is.js | 10 + sources/plugins/justify/lang/it.js | 10 + sources/plugins/justify/lang/ja.js | 10 + sources/plugins/justify/lang/ka.js | 10 + sources/plugins/justify/lang/km.js | 10 + sources/plugins/justify/lang/ko.js | 10 + sources/plugins/justify/lang/ku.js | 10 + sources/plugins/justify/lang/lt.js | 10 + sources/plugins/justify/lang/lv.js | 10 + sources/plugins/justify/lang/mk.js | 10 + sources/plugins/justify/lang/mn.js | 10 + sources/plugins/justify/lang/ms.js | 10 + sources/plugins/justify/lang/nb.js | 10 + sources/plugins/justify/lang/nl.js | 10 + sources/plugins/justify/lang/no.js | 10 + sources/plugins/justify/lang/oc.js | 10 + sources/plugins/justify/lang/pl.js | 10 + sources/plugins/justify/lang/pt-br.js | 10 + sources/plugins/justify/lang/pt.js | 10 + sources/plugins/justify/lang/ro.js | 10 + sources/plugins/justify/lang/ru.js | 10 + sources/plugins/justify/lang/si.js | 10 + sources/plugins/justify/lang/sk.js | 10 + sources/plugins/justify/lang/sl.js | 10 + sources/plugins/justify/lang/sq.js | 10 + sources/plugins/justify/lang/sr-latn.js | 10 + sources/plugins/justify/lang/sr.js | 10 + sources/plugins/justify/lang/sv.js | 10 + sources/plugins/justify/lang/th.js | 10 + sources/plugins/justify/lang/tr.js | 10 + sources/plugins/justify/lang/tt.js | 10 + sources/plugins/justify/lang/ug.js | 10 + sources/plugins/justify/lang/uk.js | 10 + sources/plugins/justify/lang/vi.js | 10 + sources/plugins/justify/lang/zh-cn.js | 10 + sources/plugins/justify/lang/zh.js | 10 + sources/plugins/justify/plugin.js | 245 ++ sources/plugins/lineutils/dev/dnd.html | 172 + sources/plugins/lineutils/dev/magicfinger.html | 285 ++ sources/plugins/lineutils/plugin.js | 1018 +++++ sources/plugins/link/dialogs/anchor.js | 105 + sources/plugins/link/dialogs/link.js | 979 +++++ sources/plugins/link/icons/anchor-rtl.png | Bin 0 -> 523 bytes sources/plugins/link/icons/anchor.png | Bin 0 -> 517 bytes sources/plugins/link/icons/hidpi/anchor-rtl.png | Bin 0 -> 957 bytes sources/plugins/link/icons/hidpi/anchor.png | Bin 0 -> 917 bytes sources/plugins/link/icons/hidpi/link.png | Bin 0 -> 935 bytes sources/plugins/link/icons/hidpi/unlink.png | Bin 0 -> 1317 bytes sources/plugins/link/icons/link.png | Bin 0 -> 533 bytes sources/plugins/link/icons/unlink.png | Bin 0 -> 692 bytes sources/plugins/link/images/anchor.png | Bin 0 -> 752 bytes sources/plugins/link/images/hidpi/anchor.png | Bin 0 -> 1109 bytes sources/plugins/link/lang/af.js | 67 + sources/plugins/link/lang/ar.js | 67 + sources/plugins/link/lang/az.js | 67 + sources/plugins/link/lang/bg.js | 67 + sources/plugins/link/lang/bn.js | 67 + sources/plugins/link/lang/bs.js | 67 + sources/plugins/link/lang/ca.js | 67 + sources/plugins/link/lang/cs.js | 67 + sources/plugins/link/lang/cy.js | 67 + sources/plugins/link/lang/da.js | 67 + sources/plugins/link/lang/de-ch.js | 67 + sources/plugins/link/lang/de.js | 67 + sources/plugins/link/lang/el.js | 67 + sources/plugins/link/lang/en-au.js | 67 + sources/plugins/link/lang/en-ca.js | 67 + sources/plugins/link/lang/en-gb.js | 67 + sources/plugins/link/lang/en.js | 67 + sources/plugins/link/lang/eo.js | 67 + sources/plugins/link/lang/es.js | 67 + sources/plugins/link/lang/et.js | 67 + sources/plugins/link/lang/eu.js | 67 + sources/plugins/link/lang/fa.js | 67 + sources/plugins/link/lang/fi.js | 67 + sources/plugins/link/lang/fo.js | 67 + sources/plugins/link/lang/fr-ca.js | 67 + sources/plugins/link/lang/fr.js | 67 + sources/plugins/link/lang/gl.js | 67 + sources/plugins/link/lang/gu.js | 67 + sources/plugins/link/lang/he.js | 67 + sources/plugins/link/lang/hi.js | 67 + sources/plugins/link/lang/hr.js | 67 + sources/plugins/link/lang/hu.js | 67 + sources/plugins/link/lang/id.js | 67 + sources/plugins/link/lang/is.js | 67 + sources/plugins/link/lang/it.js | 67 + sources/plugins/link/lang/ja.js | 67 + sources/plugins/link/lang/ka.js | 67 + sources/plugins/link/lang/km.js | 67 + sources/plugins/link/lang/ko.js | 67 + sources/plugins/link/lang/ku.js | 67 + sources/plugins/link/lang/lt.js | 67 + sources/plugins/link/lang/lv.js | 67 + sources/plugins/link/lang/mk.js | 67 + sources/plugins/link/lang/mn.js | 67 + sources/plugins/link/lang/ms.js | 67 + sources/plugins/link/lang/nb.js | 67 + sources/plugins/link/lang/nl.js | 67 + sources/plugins/link/lang/no.js | 67 + sources/plugins/link/lang/oc.js | 67 + sources/plugins/link/lang/pl.js | 67 + sources/plugins/link/lang/pt-br.js | 67 + sources/plugins/link/lang/pt.js | 67 + sources/plugins/link/lang/ro.js | 67 + sources/plugins/link/lang/ru.js | 67 + sources/plugins/link/lang/si.js | 67 + sources/plugins/link/lang/sk.js | 67 + sources/plugins/link/lang/sl.js | 67 + sources/plugins/link/lang/sq.js | 67 + sources/plugins/link/lang/sr-latn.js | 67 + sources/plugins/link/lang/sr.js | 67 + sources/plugins/link/lang/sv.js | 67 + sources/plugins/link/lang/th.js | 67 + sources/plugins/link/lang/tr.js | 67 + sources/plugins/link/lang/tt.js | 67 + sources/plugins/link/lang/ug.js | 67 + sources/plugins/link/lang/uk.js | 67 + sources/plugins/link/lang/vi.js | 67 + sources/plugins/link/lang/zh-cn.js | 67 + sources/plugins/link/lang/zh.js | 67 + sources/plugins/link/plugin.js | 828 ++++ sources/plugins/list/icons/bulletedlist-rtl.png | Bin 0 -> 367 bytes sources/plugins/list/icons/bulletedlist.png | Bin 0 -> 370 bytes .../plugins/list/icons/hidpi/bulletedlist-rtl.png | Bin 0 -> 820 bytes sources/plugins/list/icons/hidpi/bulletedlist.png | Bin 0 -> 828 bytes .../plugins/list/icons/hidpi/numberedlist-rtl.png | Bin 0 -> 628 bytes sources/plugins/list/icons/hidpi/numberedlist.png | Bin 0 -> 655 bytes sources/plugins/list/icons/numberedlist-rtl.png | Bin 0 -> 390 bytes sources/plugins/list/icons/numberedlist.png | Bin 0 -> 390 bytes sources/plugins/list/lang/af.js | 8 + sources/plugins/list/lang/ar.js | 8 + sources/plugins/list/lang/az.js | 8 + sources/plugins/list/lang/bg.js | 8 + sources/plugins/list/lang/bn.js | 8 + sources/plugins/list/lang/bs.js | 8 + sources/plugins/list/lang/ca.js | 8 + sources/plugins/list/lang/cs.js | 8 + sources/plugins/list/lang/cy.js | 8 + sources/plugins/list/lang/da.js | 8 + sources/plugins/list/lang/de-ch.js | 8 + sources/plugins/list/lang/de.js | 8 + sources/plugins/list/lang/el.js | 8 + sources/plugins/list/lang/en-au.js | 8 + sources/plugins/list/lang/en-ca.js | 8 + sources/plugins/list/lang/en-gb.js | 8 + sources/plugins/list/lang/en.js | 8 + sources/plugins/list/lang/eo.js | 8 + sources/plugins/list/lang/es.js | 8 + sources/plugins/list/lang/et.js | 8 + sources/plugins/list/lang/eu.js | 8 + sources/plugins/list/lang/fa.js | 8 + sources/plugins/list/lang/fi.js | 8 + sources/plugins/list/lang/fo.js | 8 + sources/plugins/list/lang/fr-ca.js | 8 + sources/plugins/list/lang/fr.js | 8 + sources/plugins/list/lang/gl.js | 8 + sources/plugins/list/lang/gu.js | 8 + sources/plugins/list/lang/he.js | 8 + sources/plugins/list/lang/hi.js | 8 + sources/plugins/list/lang/hr.js | 8 + sources/plugins/list/lang/hu.js | 8 + sources/plugins/list/lang/id.js | 8 + sources/plugins/list/lang/is.js | 8 + sources/plugins/list/lang/it.js | 8 + sources/plugins/list/lang/ja.js | 8 + sources/plugins/list/lang/ka.js | 8 + sources/plugins/list/lang/km.js | 8 + sources/plugins/list/lang/ko.js | 8 + sources/plugins/list/lang/ku.js | 8 + sources/plugins/list/lang/lt.js | 8 + sources/plugins/list/lang/lv.js | 8 + sources/plugins/list/lang/mk.js | 8 + sources/plugins/list/lang/mn.js | 8 + sources/plugins/list/lang/ms.js | 8 + sources/plugins/list/lang/nb.js | 8 + sources/plugins/list/lang/nl.js | 8 + sources/plugins/list/lang/no.js | 8 + sources/plugins/list/lang/oc.js | 8 + sources/plugins/list/lang/pl.js | 8 + sources/plugins/list/lang/pt-br.js | 8 + sources/plugins/list/lang/pt.js | 8 + sources/plugins/list/lang/ro.js | 8 + sources/plugins/list/lang/ru.js | 8 + sources/plugins/list/lang/si.js | 8 + sources/plugins/list/lang/sk.js | 8 + sources/plugins/list/lang/sl.js | 8 + sources/plugins/list/lang/sq.js | 8 + sources/plugins/list/lang/sr-latn.js | 8 + sources/plugins/list/lang/sr.js | 8 + sources/plugins/list/lang/sv.js | 8 + sources/plugins/list/lang/th.js | 8 + sources/plugins/list/lang/tr.js | 8 + sources/plugins/list/lang/tt.js | 8 + sources/plugins/list/lang/ug.js | 8 + sources/plugins/list/lang/uk.js | 8 + sources/plugins/list/lang/vi.js | 8 + sources/plugins/list/lang/zh-cn.js | 8 + sources/plugins/list/lang/zh.js | 8 + sources/plugins/list/plugin.js | 1111 ++++++ sources/plugins/listblock/plugin.js | 241 ++ sources/plugins/liststyle/dialogs/liststyle.js | 189 + sources/plugins/liststyle/lang/af.js | 25 + sources/plugins/liststyle/lang/ar.js | 25 + sources/plugins/liststyle/lang/az.js | 25 + sources/plugins/liststyle/lang/bg.js | 25 + sources/plugins/liststyle/lang/bn.js | 25 + sources/plugins/liststyle/lang/bs.js | 25 + sources/plugins/liststyle/lang/ca.js | 25 + sources/plugins/liststyle/lang/cs.js | 25 + sources/plugins/liststyle/lang/cy.js | 25 + sources/plugins/liststyle/lang/da.js | 25 + sources/plugins/liststyle/lang/de-ch.js | 25 + sources/plugins/liststyle/lang/de.js | 25 + sources/plugins/liststyle/lang/el.js | 25 + sources/plugins/liststyle/lang/en-au.js | 25 + sources/plugins/liststyle/lang/en-ca.js | 25 + sources/plugins/liststyle/lang/en-gb.js | 25 + sources/plugins/liststyle/lang/en.js | 25 + sources/plugins/liststyle/lang/eo.js | 25 + sources/plugins/liststyle/lang/es.js | 25 + sources/plugins/liststyle/lang/et.js | 25 + sources/plugins/liststyle/lang/eu.js | 25 + sources/plugins/liststyle/lang/fa.js | 25 + sources/plugins/liststyle/lang/fi.js | 25 + sources/plugins/liststyle/lang/fo.js | 25 + sources/plugins/liststyle/lang/fr-ca.js | 25 + sources/plugins/liststyle/lang/fr.js | 25 + sources/plugins/liststyle/lang/gl.js | 25 + sources/plugins/liststyle/lang/gu.js | 25 + sources/plugins/liststyle/lang/he.js | 25 + sources/plugins/liststyle/lang/hi.js | 25 + sources/plugins/liststyle/lang/hr.js | 25 + sources/plugins/liststyle/lang/hu.js | 25 + sources/plugins/liststyle/lang/id.js | 25 + sources/plugins/liststyle/lang/is.js | 25 + sources/plugins/liststyle/lang/it.js | 25 + sources/plugins/liststyle/lang/ja.js | 25 + sources/plugins/liststyle/lang/ka.js | 25 + sources/plugins/liststyle/lang/km.js | 25 + sources/plugins/liststyle/lang/ko.js | 25 + sources/plugins/liststyle/lang/ku.js | 25 + sources/plugins/liststyle/lang/lt.js | 25 + sources/plugins/liststyle/lang/lv.js | 25 + sources/plugins/liststyle/lang/mk.js | 25 + sources/plugins/liststyle/lang/mn.js | 25 + sources/plugins/liststyle/lang/ms.js | 25 + sources/plugins/liststyle/lang/nb.js | 25 + sources/plugins/liststyle/lang/nl.js | 25 + sources/plugins/liststyle/lang/no.js | 25 + sources/plugins/liststyle/lang/oc.js | 25 + sources/plugins/liststyle/lang/pl.js | 25 + sources/plugins/liststyle/lang/pt-br.js | 25 + sources/plugins/liststyle/lang/pt.js | 25 + sources/plugins/liststyle/lang/ro.js | 25 + sources/plugins/liststyle/lang/ru.js | 25 + sources/plugins/liststyle/lang/si.js | 25 + sources/plugins/liststyle/lang/sk.js | 25 + sources/plugins/liststyle/lang/sl.js | 25 + sources/plugins/liststyle/lang/sq.js | 25 + sources/plugins/liststyle/lang/sr-latn.js | 25 + sources/plugins/liststyle/lang/sr.js | 25 + sources/plugins/liststyle/lang/sv.js | 25 + sources/plugins/liststyle/lang/th.js | 25 + sources/plugins/liststyle/lang/tr.js | 25 + sources/plugins/liststyle/lang/tt.js | 25 + sources/plugins/liststyle/lang/ug.js | 25 + sources/plugins/liststyle/lang/uk.js | 25 + sources/plugins/liststyle/lang/vi.js | 25 + sources/plugins/liststyle/lang/zh-cn.js | 25 + sources/plugins/liststyle/lang/zh.js | 25 + sources/plugins/liststyle/plugin.js | 75 + sources/plugins/magicline/dev/magicline.html | 594 +++ .../plugins/magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes sources/plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes sources/plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes sources/plugins/magicline/images/icon.png | Bin 0 -> 133 bytes sources/plugins/magicline/lang/af.js | 8 + sources/plugins/magicline/lang/ar.js | 8 + sources/plugins/magicline/lang/az.js | 8 + sources/plugins/magicline/lang/bg.js | 8 + sources/plugins/magicline/lang/ca.js | 8 + sources/plugins/magicline/lang/cs.js | 8 + sources/plugins/magicline/lang/cy.js | 8 + sources/plugins/magicline/lang/da.js | 8 + sources/plugins/magicline/lang/de-ch.js | 8 + sources/plugins/magicline/lang/de.js | 8 + sources/plugins/magicline/lang/el.js | 8 + sources/plugins/magicline/lang/en-gb.js | 8 + sources/plugins/magicline/lang/en.js | 8 + sources/plugins/magicline/lang/eo.js | 8 + sources/plugins/magicline/lang/es.js | 8 + sources/plugins/magicline/lang/et.js | 8 + sources/plugins/magicline/lang/eu.js | 8 + sources/plugins/magicline/lang/fa.js | 8 + sources/plugins/magicline/lang/fi.js | 8 + sources/plugins/magicline/lang/fr-ca.js | 8 + sources/plugins/magicline/lang/fr.js | 8 + sources/plugins/magicline/lang/gl.js | 8 + sources/plugins/magicline/lang/he.js | 8 + sources/plugins/magicline/lang/hr.js | 8 + sources/plugins/magicline/lang/hu.js | 8 + sources/plugins/magicline/lang/id.js | 8 + sources/plugins/magicline/lang/it.js | 8 + sources/plugins/magicline/lang/ja.js | 8 + sources/plugins/magicline/lang/km.js | 8 + sources/plugins/magicline/lang/ko.js | 8 + sources/plugins/magicline/lang/ku.js | 8 + sources/plugins/magicline/lang/lv.js | 8 + sources/plugins/magicline/lang/nb.js | 8 + sources/plugins/magicline/lang/nl.js | 8 + sources/plugins/magicline/lang/no.js | 8 + sources/plugins/magicline/lang/oc.js | 8 + sources/plugins/magicline/lang/pl.js | 8 + sources/plugins/magicline/lang/pt-br.js | 8 + sources/plugins/magicline/lang/pt.js | 8 + sources/plugins/magicline/lang/ru.js | 8 + sources/plugins/magicline/lang/si.js | 8 + sources/plugins/magicline/lang/sk.js | 8 + sources/plugins/magicline/lang/sl.js | 8 + sources/plugins/magicline/lang/sq.js | 8 + sources/plugins/magicline/lang/sv.js | 8 + sources/plugins/magicline/lang/tr.js | 8 + sources/plugins/magicline/lang/tt.js | 8 + sources/plugins/magicline/lang/ug.js | 8 + sources/plugins/magicline/lang/uk.js | 8 + sources/plugins/magicline/lang/vi.js | 8 + sources/plugins/magicline/lang/zh-cn.js | 8 + sources/plugins/magicline/lang/zh.js | 8 + sources/plugins/magicline/plugin.js | 1874 +++++++++ sources/plugins/magicline/samples/magicline.html | 209 + sources/plugins/maximize/icons/hidpi/maximize.png | Bin 0 -> 1112 bytes sources/plugins/maximize/icons/maximize.png | Bin 0 -> 461 bytes sources/plugins/maximize/lang/af.js | 8 + sources/plugins/maximize/lang/ar.js | 8 + sources/plugins/maximize/lang/az.js | 8 + sources/plugins/maximize/lang/bg.js | 8 + sources/plugins/maximize/lang/bn.js | 8 + sources/plugins/maximize/lang/bs.js | 8 + sources/plugins/maximize/lang/ca.js | 8 + sources/plugins/maximize/lang/cs.js | 8 + sources/plugins/maximize/lang/cy.js | 8 + sources/plugins/maximize/lang/da.js | 8 + sources/plugins/maximize/lang/de-ch.js | 8 + sources/plugins/maximize/lang/de.js | 8 + sources/plugins/maximize/lang/el.js | 8 + sources/plugins/maximize/lang/en-au.js | 8 + sources/plugins/maximize/lang/en-ca.js | 8 + sources/plugins/maximize/lang/en-gb.js | 8 + sources/plugins/maximize/lang/en.js | 8 + sources/plugins/maximize/lang/eo.js | 8 + sources/plugins/maximize/lang/es.js | 8 + sources/plugins/maximize/lang/et.js | 8 + sources/plugins/maximize/lang/eu.js | 8 + sources/plugins/maximize/lang/fa.js | 8 + sources/plugins/maximize/lang/fi.js | 8 + sources/plugins/maximize/lang/fo.js | 8 + sources/plugins/maximize/lang/fr-ca.js | 8 + sources/plugins/maximize/lang/fr.js | 8 + sources/plugins/maximize/lang/gl.js | 8 + sources/plugins/maximize/lang/gu.js | 8 + sources/plugins/maximize/lang/he.js | 8 + sources/plugins/maximize/lang/hi.js | 8 + sources/plugins/maximize/lang/hr.js | 8 + sources/plugins/maximize/lang/hu.js | 8 + sources/plugins/maximize/lang/id.js | 8 + sources/plugins/maximize/lang/is.js | 8 + sources/plugins/maximize/lang/it.js | 8 + sources/plugins/maximize/lang/ja.js | 8 + sources/plugins/maximize/lang/ka.js | 8 + sources/plugins/maximize/lang/km.js | 8 + sources/plugins/maximize/lang/ko.js | 8 + sources/plugins/maximize/lang/ku.js | 8 + sources/plugins/maximize/lang/lt.js | 8 + sources/plugins/maximize/lang/lv.js | 8 + sources/plugins/maximize/lang/mk.js | 8 + sources/plugins/maximize/lang/mn.js | 8 + sources/plugins/maximize/lang/ms.js | 8 + sources/plugins/maximize/lang/nb.js | 8 + sources/plugins/maximize/lang/nl.js | 8 + sources/plugins/maximize/lang/no.js | 8 + sources/plugins/maximize/lang/oc.js | 8 + sources/plugins/maximize/lang/pl.js | 8 + sources/plugins/maximize/lang/pt-br.js | 8 + sources/plugins/maximize/lang/pt.js | 8 + sources/plugins/maximize/lang/ro.js | 8 + sources/plugins/maximize/lang/ru.js | 8 + sources/plugins/maximize/lang/si.js | 8 + sources/plugins/maximize/lang/sk.js | 8 + sources/plugins/maximize/lang/sl.js | 8 + sources/plugins/maximize/lang/sq.js | 8 + sources/plugins/maximize/lang/sr-latn.js | 8 + sources/plugins/maximize/lang/sr.js | 8 + sources/plugins/maximize/lang/sv.js | 8 + sources/plugins/maximize/lang/th.js | 8 + sources/plugins/maximize/lang/tr.js | 8 + sources/plugins/maximize/lang/tt.js | 8 + sources/plugins/maximize/lang/ug.js | 8 + sources/plugins/maximize/lang/uk.js | 8 + sources/plugins/maximize/lang/vi.js | 8 + sources/plugins/maximize/lang/zh-cn.js | 8 + sources/plugins/maximize/lang/zh.js | 8 + sources/plugins/maximize/plugin.js | 314 ++ sources/plugins/menu/plugin.js | 572 +++ sources/plugins/oembed/LICENSE.md | 21 + sources/plugins/oembed/README.md | 201 + sources/plugins/oembed/icons/hidpi/oembed.png | Bin 0 -> 1849 bytes sources/plugins/oembed/icons/oembed.png | Bin 0 -> 3143 bytes sources/plugins/oembed/lang/de.js | 23 + sources/plugins/oembed/lang/en.js | 23 + sources/plugins/oembed/lang/fr.js | 25 + sources/plugins/oembed/lang/nl.js | 23 + sources/plugins/oembed/lang/pl.js | 23 + sources/plugins/oembed/lang/pt-br.js | 23 + sources/plugins/oembed/lang/ru.js | 23 + sources/plugins/oembed/lang/tr.js | 23 + sources/plugins/oembed/libs/jquery.oembed.min.js | 1 + sources/plugins/oembed/plugin.js | 446 +++ sources/plugins/panel/plugin.js | 403 ++ sources/plugins/popup/plugin.js | 65 + .../removeformat/icons/hidpi/removeformat.png | Bin 0 -> 1219 bytes .../plugins/removeformat/icons/removeformat.png | Bin 0 -> 637 bytes sources/plugins/removeformat/lang/af.js | 7 + sources/plugins/removeformat/lang/ar.js | 7 + sources/plugins/removeformat/lang/az.js | 7 + sources/plugins/removeformat/lang/bg.js | 7 + sources/plugins/removeformat/lang/bn.js | 7 + sources/plugins/removeformat/lang/bs.js | 7 + sources/plugins/removeformat/lang/ca.js | 7 + sources/plugins/removeformat/lang/cs.js | 7 + sources/plugins/removeformat/lang/cy.js | 7 + sources/plugins/removeformat/lang/da.js | 7 + sources/plugins/removeformat/lang/de-ch.js | 7 + sources/plugins/removeformat/lang/de.js | 7 + sources/plugins/removeformat/lang/el.js | 7 + sources/plugins/removeformat/lang/en-au.js | 7 + sources/plugins/removeformat/lang/en-ca.js | 7 + sources/plugins/removeformat/lang/en-gb.js | 7 + sources/plugins/removeformat/lang/en.js | 7 + sources/plugins/removeformat/lang/eo.js | 7 + sources/plugins/removeformat/lang/es.js | 7 + sources/plugins/removeformat/lang/et.js | 7 + sources/plugins/removeformat/lang/eu.js | 7 + sources/plugins/removeformat/lang/fa.js | 7 + sources/plugins/removeformat/lang/fi.js | 7 + sources/plugins/removeformat/lang/fo.js | 7 + sources/plugins/removeformat/lang/fr-ca.js | 7 + sources/plugins/removeformat/lang/fr.js | 7 + sources/plugins/removeformat/lang/gl.js | 7 + sources/plugins/removeformat/lang/gu.js | 7 + sources/plugins/removeformat/lang/he.js | 7 + sources/plugins/removeformat/lang/hi.js | 7 + sources/plugins/removeformat/lang/hr.js | 7 + sources/plugins/removeformat/lang/hu.js | 7 + sources/plugins/removeformat/lang/id.js | 7 + sources/plugins/removeformat/lang/is.js | 7 + sources/plugins/removeformat/lang/it.js | 7 + sources/plugins/removeformat/lang/ja.js | 7 + sources/plugins/removeformat/lang/ka.js | 7 + sources/plugins/removeformat/lang/km.js | 7 + sources/plugins/removeformat/lang/ko.js | 7 + sources/plugins/removeformat/lang/ku.js | 7 + sources/plugins/removeformat/lang/lt.js | 7 + sources/plugins/removeformat/lang/lv.js | 7 + sources/plugins/removeformat/lang/mk.js | 7 + sources/plugins/removeformat/lang/mn.js | 7 + sources/plugins/removeformat/lang/ms.js | 7 + sources/plugins/removeformat/lang/nb.js | 7 + sources/plugins/removeformat/lang/nl.js | 7 + sources/plugins/removeformat/lang/no.js | 7 + sources/plugins/removeformat/lang/oc.js | 7 + sources/plugins/removeformat/lang/pl.js | 7 + sources/plugins/removeformat/lang/pt-br.js | 7 + sources/plugins/removeformat/lang/pt.js | 7 + sources/plugins/removeformat/lang/ro.js | 7 + sources/plugins/removeformat/lang/ru.js | 7 + sources/plugins/removeformat/lang/si.js | 7 + sources/plugins/removeformat/lang/sk.js | 7 + sources/plugins/removeformat/lang/sl.js | 7 + sources/plugins/removeformat/lang/sq.js | 7 + sources/plugins/removeformat/lang/sr-latn.js | 7 + sources/plugins/removeformat/lang/sr.js | 7 + sources/plugins/removeformat/lang/sv.js | 7 + sources/plugins/removeformat/lang/th.js | 7 + sources/plugins/removeformat/lang/tr.js | 7 + sources/plugins/removeformat/lang/tt.js | 7 + sources/plugins/removeformat/lang/ug.js | 7 + sources/plugins/removeformat/lang/uk.js | 7 + sources/plugins/removeformat/lang/vi.js | 7 + sources/plugins/removeformat/lang/zh-cn.js | 7 + sources/plugins/removeformat/lang/zh.js | 7 + sources/plugins/removeformat/plugin.js | 193 + sources/plugins/resize/plugin.js | 187 + sources/plugins/richcombo/plugin.js | 434 ++ sources/plugins/showborders/plugin.js | 174 + .../plugins/sourcearea/icons/hidpi/source-rtl.png | Bin 0 -> 1018 bytes sources/plugins/sourcearea/icons/hidpi/source.png | Bin 0 -> 1041 bytes sources/plugins/sourcearea/icons/source-rtl.png | Bin 0 -> 565 bytes sources/plugins/sourcearea/icons/source.png | Bin 0 -> 571 bytes sources/plugins/sourcearea/lang/af.js | 7 + sources/plugins/sourcearea/lang/ar.js | 7 + sources/plugins/sourcearea/lang/az.js | 7 + sources/plugins/sourcearea/lang/bg.js | 7 + sources/plugins/sourcearea/lang/bn.js | 7 + sources/plugins/sourcearea/lang/bs.js | 7 + sources/plugins/sourcearea/lang/ca.js | 7 + sources/plugins/sourcearea/lang/cs.js | 7 + sources/plugins/sourcearea/lang/cy.js | 7 + sources/plugins/sourcearea/lang/da.js | 7 + sources/plugins/sourcearea/lang/de-ch.js | 7 + sources/plugins/sourcearea/lang/de.js | 7 + sources/plugins/sourcearea/lang/el.js | 7 + sources/plugins/sourcearea/lang/en-au.js | 7 + sources/plugins/sourcearea/lang/en-ca.js | 7 + sources/plugins/sourcearea/lang/en-gb.js | 7 + sources/plugins/sourcearea/lang/en.js | 7 + sources/plugins/sourcearea/lang/eo.js | 7 + sources/plugins/sourcearea/lang/es.js | 7 + sources/plugins/sourcearea/lang/et.js | 7 + sources/plugins/sourcearea/lang/eu.js | 7 + sources/plugins/sourcearea/lang/fa.js | 7 + sources/plugins/sourcearea/lang/fi.js | 7 + sources/plugins/sourcearea/lang/fo.js | 7 + sources/plugins/sourcearea/lang/fr-ca.js | 7 + sources/plugins/sourcearea/lang/fr.js | 7 + sources/plugins/sourcearea/lang/gl.js | 7 + sources/plugins/sourcearea/lang/gu.js | 7 + sources/plugins/sourcearea/lang/he.js | 7 + sources/plugins/sourcearea/lang/hi.js | 7 + sources/plugins/sourcearea/lang/hr.js | 7 + sources/plugins/sourcearea/lang/hu.js | 7 + sources/plugins/sourcearea/lang/id.js | 7 + sources/plugins/sourcearea/lang/is.js | 7 + sources/plugins/sourcearea/lang/it.js | 7 + sources/plugins/sourcearea/lang/ja.js | 7 + sources/plugins/sourcearea/lang/ka.js | 7 + sources/plugins/sourcearea/lang/km.js | 7 + sources/plugins/sourcearea/lang/ko.js | 7 + sources/plugins/sourcearea/lang/ku.js | 7 + sources/plugins/sourcearea/lang/lt.js | 7 + sources/plugins/sourcearea/lang/lv.js | 7 + sources/plugins/sourcearea/lang/mk.js | 7 + sources/plugins/sourcearea/lang/mn.js | 7 + sources/plugins/sourcearea/lang/ms.js | 7 + sources/plugins/sourcearea/lang/nb.js | 7 + sources/plugins/sourcearea/lang/nl.js | 7 + sources/plugins/sourcearea/lang/no.js | 7 + sources/plugins/sourcearea/lang/oc.js | 7 + sources/plugins/sourcearea/lang/pl.js | 7 + sources/plugins/sourcearea/lang/pt-br.js | 7 + sources/plugins/sourcearea/lang/pt.js | 7 + sources/plugins/sourcearea/lang/ro.js | 7 + sources/plugins/sourcearea/lang/ru.js | 7 + sources/plugins/sourcearea/lang/si.js | 7 + sources/plugins/sourcearea/lang/sk.js | 7 + sources/plugins/sourcearea/lang/sl.js | 7 + sources/plugins/sourcearea/lang/sq.js | 7 + sources/plugins/sourcearea/lang/sr-latn.js | 7 + sources/plugins/sourcearea/lang/sr.js | 7 + sources/plugins/sourcearea/lang/sv.js | 7 + sources/plugins/sourcearea/lang/th.js | 7 + sources/plugins/sourcearea/lang/tr.js | 7 + sources/plugins/sourcearea/lang/tt.js | 7 + sources/plugins/sourcearea/lang/ug.js | 7 + sources/plugins/sourcearea/lang/uk.js | 7 + sources/plugins/sourcearea/lang/vi.js | 7 + sources/plugins/sourcearea/lang/zh-cn.js | 7 + sources/plugins/sourcearea/lang/zh.js | 7 + sources/plugins/sourcearea/plugin.js | 168 + sources/plugins/tab/plugin.js | 302 ++ sources/plugins/toolbar/lang/af.js | 22 + sources/plugins/toolbar/lang/ar.js | 22 + sources/plugins/toolbar/lang/az.js | 22 + sources/plugins/toolbar/lang/bg.js | 22 + sources/plugins/toolbar/lang/bn.js | 22 + sources/plugins/toolbar/lang/bs.js | 22 + sources/plugins/toolbar/lang/ca.js | 22 + sources/plugins/toolbar/lang/cs.js | 22 + sources/plugins/toolbar/lang/cy.js | 22 + sources/plugins/toolbar/lang/da.js | 22 + sources/plugins/toolbar/lang/de-ch.js | 22 + sources/plugins/toolbar/lang/de.js | 22 + sources/plugins/toolbar/lang/el.js | 22 + sources/plugins/toolbar/lang/en-au.js | 22 + sources/plugins/toolbar/lang/en-ca.js | 22 + sources/plugins/toolbar/lang/en-gb.js | 22 + sources/plugins/toolbar/lang/en.js | 22 + sources/plugins/toolbar/lang/eo.js | 22 + sources/plugins/toolbar/lang/es.js | 22 + sources/plugins/toolbar/lang/et.js | 22 + sources/plugins/toolbar/lang/eu.js | 22 + sources/plugins/toolbar/lang/fa.js | 22 + sources/plugins/toolbar/lang/fi.js | 22 + sources/plugins/toolbar/lang/fo.js | 22 + sources/plugins/toolbar/lang/fr-ca.js | 22 + sources/plugins/toolbar/lang/fr.js | 22 + sources/plugins/toolbar/lang/gl.js | 22 + sources/plugins/toolbar/lang/gu.js | 22 + sources/plugins/toolbar/lang/he.js | 22 + sources/plugins/toolbar/lang/hi.js | 22 + sources/plugins/toolbar/lang/hr.js | 22 + sources/plugins/toolbar/lang/hu.js | 22 + sources/plugins/toolbar/lang/id.js | 22 + sources/plugins/toolbar/lang/is.js | 22 + sources/plugins/toolbar/lang/it.js | 22 + sources/plugins/toolbar/lang/ja.js | 22 + sources/plugins/toolbar/lang/ka.js | 22 + sources/plugins/toolbar/lang/km.js | 22 + sources/plugins/toolbar/lang/ko.js | 22 + sources/plugins/toolbar/lang/ku.js | 22 + sources/plugins/toolbar/lang/lt.js | 22 + sources/plugins/toolbar/lang/lv.js | 22 + sources/plugins/toolbar/lang/mk.js | 22 + sources/plugins/toolbar/lang/mn.js | 22 + sources/plugins/toolbar/lang/ms.js | 22 + sources/plugins/toolbar/lang/nb.js | 22 + sources/plugins/toolbar/lang/nl.js | 22 + sources/plugins/toolbar/lang/no.js | 22 + sources/plugins/toolbar/lang/oc.js | 22 + sources/plugins/toolbar/lang/pl.js | 22 + sources/plugins/toolbar/lang/pt-br.js | 22 + sources/plugins/toolbar/lang/pt.js | 22 + sources/plugins/toolbar/lang/ro.js | 22 + sources/plugins/toolbar/lang/ru.js | 22 + sources/plugins/toolbar/lang/si.js | 22 + sources/plugins/toolbar/lang/sk.js | 22 + sources/plugins/toolbar/lang/sl.js | 22 + sources/plugins/toolbar/lang/sq.js | 22 + sources/plugins/toolbar/lang/sr-latn.js | 22 + sources/plugins/toolbar/lang/sr.js | 22 + sources/plugins/toolbar/lang/sv.js | 22 + sources/plugins/toolbar/lang/th.js | 22 + sources/plugins/toolbar/lang/tr.js | 22 + sources/plugins/toolbar/lang/tt.js | 22 + sources/plugins/toolbar/lang/ug.js | 22 + sources/plugins/toolbar/lang/uk.js | 22 + sources/plugins/toolbar/lang/vi.js | 22 + sources/plugins/toolbar/lang/zh-cn.js | 22 + sources/plugins/toolbar/lang/zh.js | 22 + sources/plugins/toolbar/plugin.js | 806 ++++ sources/plugins/toolbar/samples/toolbar.html | 235 ++ sources/plugins/widget/dev/assets/contents.css | 23 + sources/plugins/widget/dev/assets/sample.jpg | Bin 0 -> 17932 bytes .../widget/dev/assets/simplebox/contents.css | 36 + .../dev/assets/simplebox/dialogs/simplebox.js | 51 + .../dev/assets/simplebox/icons/simplebox.png | Bin 0 -> 286 bytes .../plugins/widget/dev/assets/simplebox/plugin.js | 114 + sources/plugins/widget/dev/console.js | 131 + sources/plugins/widget/dev/nestedwidgets.html | 134 + sources/plugins/widget/dev/widgetstyles.html | 144 + sources/plugins/widget/images/handle.png | Bin 0 -> 220 bytes sources/plugins/widget/lang/af.js | 8 + sources/plugins/widget/lang/ar.js | 8 + sources/plugins/widget/lang/az.js | 8 + sources/plugins/widget/lang/bg.js | 8 + sources/plugins/widget/lang/ca.js | 8 + sources/plugins/widget/lang/cs.js | 8 + sources/plugins/widget/lang/cy.js | 8 + sources/plugins/widget/lang/da.js | 8 + sources/plugins/widget/lang/de-ch.js | 8 + sources/plugins/widget/lang/de.js | 8 + sources/plugins/widget/lang/el.js | 8 + sources/plugins/widget/lang/en-gb.js | 8 + sources/plugins/widget/lang/en.js | 8 + sources/plugins/widget/lang/eo.js | 8 + sources/plugins/widget/lang/es.js | 8 + sources/plugins/widget/lang/eu.js | 8 + sources/plugins/widget/lang/fa.js | 8 + sources/plugins/widget/lang/fi.js | 8 + sources/plugins/widget/lang/fr.js | 8 + sources/plugins/widget/lang/gl.js | 8 + sources/plugins/widget/lang/he.js | 8 + sources/plugins/widget/lang/hr.js | 8 + sources/plugins/widget/lang/hu.js | 8 + sources/plugins/widget/lang/id.js | 8 + sources/plugins/widget/lang/it.js | 8 + sources/plugins/widget/lang/ja.js | 8 + sources/plugins/widget/lang/km.js | 8 + sources/plugins/widget/lang/ko.js | 8 + sources/plugins/widget/lang/ku.js | 8 + sources/plugins/widget/lang/lv.js | 8 + sources/plugins/widget/lang/nb.js | 8 + sources/plugins/widget/lang/nl.js | 8 + sources/plugins/widget/lang/no.js | 8 + sources/plugins/widget/lang/oc.js | 8 + sources/plugins/widget/lang/pl.js | 8 + sources/plugins/widget/lang/pt-br.js | 8 + sources/plugins/widget/lang/pt.js | 8 + sources/plugins/widget/lang/ru.js | 8 + sources/plugins/widget/lang/sk.js | 8 + sources/plugins/widget/lang/sl.js | 8 + sources/plugins/widget/lang/sq.js | 8 + sources/plugins/widget/lang/sv.js | 8 + sources/plugins/widget/lang/tr.js | 8 + sources/plugins/widget/lang/tt.js | 8 + sources/plugins/widget/lang/ug.js | 8 + sources/plugins/widget/lang/uk.js | 8 + sources/plugins/widget/lang/vi.js | 8 + sources/plugins/widget/lang/zh-cn.js | 8 + sources/plugins/widget/lang/zh.js | 8 + sources/plugins/widget/plugin.js | 4126 ++++++++++++++++++++ sources/plugins/widgetselection/plugin.js | 366 ++ sources/plugins/wysiwygarea/plugin.js | 713 ++++ sources/plugins/wysiwygarea/samples/fullpage.html | 80 + 1625 files changed, 65587 insertions(+) create mode 100644 sources/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt create mode 100644 sources/plugins/a11yhelp/dialogs/lang/af.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ar.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/az.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/bg.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ca.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/cs.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/cy.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/da.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/de-ch.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/de.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/el.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/en-gb.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/eo.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/es.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/et.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/eu.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/fa.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/fi.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/fo.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/fr-ca.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/fr.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/gl.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/gu.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/he.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/hi.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/hr.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/hu.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/id.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/it.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ja.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/km.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ko.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ku.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/lt.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/lv.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/mk.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/mn.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/nb.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/nl.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/no.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/oc.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/pl.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/pt-br.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/pt.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ro.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ru.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/si.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/sk.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/sl.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/sq.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/sr-latn.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/sr.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/sv.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/th.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/tr.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/tt.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/ug.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/uk.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/vi.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 sources/plugins/a11yhelp/dialogs/lang/zh.js create mode 100644 sources/plugins/a11yhelp/plugin.js create mode 100644 sources/plugins/basicstyles/icons/bold.png create mode 100644 sources/plugins/basicstyles/icons/hidpi/bold.png create mode 100644 sources/plugins/basicstyles/icons/hidpi/italic.png create mode 100644 sources/plugins/basicstyles/icons/hidpi/strike.png create mode 100644 sources/plugins/basicstyles/icons/hidpi/subscript.png create mode 100644 sources/plugins/basicstyles/icons/hidpi/superscript.png create mode 100644 sources/plugins/basicstyles/icons/hidpi/underline.png create mode 100644 sources/plugins/basicstyles/icons/italic.png create mode 100644 sources/plugins/basicstyles/icons/strike.png create mode 100644 sources/plugins/basicstyles/icons/subscript.png create mode 100644 sources/plugins/basicstyles/icons/superscript.png create mode 100644 sources/plugins/basicstyles/icons/underline.png create mode 100644 sources/plugins/basicstyles/lang/af.js create mode 100644 sources/plugins/basicstyles/lang/ar.js create mode 100644 sources/plugins/basicstyles/lang/az.js create mode 100644 sources/plugins/basicstyles/lang/bg.js create mode 100644 sources/plugins/basicstyles/lang/bn.js create mode 100644 sources/plugins/basicstyles/lang/bs.js create mode 100644 sources/plugins/basicstyles/lang/ca.js create mode 100644 sources/plugins/basicstyles/lang/cs.js create mode 100644 sources/plugins/basicstyles/lang/cy.js create mode 100644 sources/plugins/basicstyles/lang/da.js create mode 100644 sources/plugins/basicstyles/lang/de-ch.js create mode 100644 sources/plugins/basicstyles/lang/de.js create mode 100644 sources/plugins/basicstyles/lang/el.js create mode 100644 sources/plugins/basicstyles/lang/en-au.js create mode 100644 sources/plugins/basicstyles/lang/en-ca.js create mode 100644 sources/plugins/basicstyles/lang/en-gb.js create mode 100644 sources/plugins/basicstyles/lang/en.js create mode 100644 sources/plugins/basicstyles/lang/eo.js create mode 100644 sources/plugins/basicstyles/lang/es.js create mode 100644 sources/plugins/basicstyles/lang/et.js create mode 100644 sources/plugins/basicstyles/lang/eu.js create mode 100644 sources/plugins/basicstyles/lang/fa.js create mode 100644 sources/plugins/basicstyles/lang/fi.js create mode 100644 sources/plugins/basicstyles/lang/fo.js create mode 100644 sources/plugins/basicstyles/lang/fr-ca.js create mode 100644 sources/plugins/basicstyles/lang/fr.js create mode 100644 sources/plugins/basicstyles/lang/gl.js create mode 100644 sources/plugins/basicstyles/lang/gu.js create mode 100644 sources/plugins/basicstyles/lang/he.js create mode 100644 sources/plugins/basicstyles/lang/hi.js create mode 100644 sources/plugins/basicstyles/lang/hr.js create mode 100644 sources/plugins/basicstyles/lang/hu.js create mode 100644 sources/plugins/basicstyles/lang/id.js create mode 100644 sources/plugins/basicstyles/lang/is.js create mode 100644 sources/plugins/basicstyles/lang/it.js create mode 100644 sources/plugins/basicstyles/lang/ja.js create mode 100644 sources/plugins/basicstyles/lang/ka.js create mode 100644 sources/plugins/basicstyles/lang/km.js create mode 100644 sources/plugins/basicstyles/lang/ko.js create mode 100644 sources/plugins/basicstyles/lang/ku.js create mode 100644 sources/plugins/basicstyles/lang/lt.js create mode 100644 sources/plugins/basicstyles/lang/lv.js create mode 100644 sources/plugins/basicstyles/lang/mk.js create mode 100644 sources/plugins/basicstyles/lang/mn.js create mode 100644 sources/plugins/basicstyles/lang/ms.js create mode 100644 sources/plugins/basicstyles/lang/nb.js create mode 100644 sources/plugins/basicstyles/lang/nl.js create mode 100644 sources/plugins/basicstyles/lang/no.js create mode 100644 sources/plugins/basicstyles/lang/oc.js create mode 100644 sources/plugins/basicstyles/lang/pl.js create mode 100644 sources/plugins/basicstyles/lang/pt-br.js create mode 100644 sources/plugins/basicstyles/lang/pt.js create mode 100644 sources/plugins/basicstyles/lang/ro.js create mode 100644 sources/plugins/basicstyles/lang/ru.js create mode 100644 sources/plugins/basicstyles/lang/si.js create mode 100644 sources/plugins/basicstyles/lang/sk.js create mode 100644 sources/plugins/basicstyles/lang/sl.js create mode 100644 sources/plugins/basicstyles/lang/sq.js create mode 100644 sources/plugins/basicstyles/lang/sr-latn.js create mode 100644 sources/plugins/basicstyles/lang/sr.js create mode 100644 sources/plugins/basicstyles/lang/sv.js create mode 100644 sources/plugins/basicstyles/lang/th.js create mode 100644 sources/plugins/basicstyles/lang/tr.js create mode 100644 sources/plugins/basicstyles/lang/tt.js create mode 100644 sources/plugins/basicstyles/lang/ug.js create mode 100644 sources/plugins/basicstyles/lang/uk.js create mode 100644 sources/plugins/basicstyles/lang/vi.js create mode 100644 sources/plugins/basicstyles/lang/zh-cn.js create mode 100644 sources/plugins/basicstyles/lang/zh.js create mode 100644 sources/plugins/basicstyles/plugin.js create mode 100644 sources/plugins/button/lang/af.js create mode 100644 sources/plugins/button/lang/ar.js create mode 100644 sources/plugins/button/lang/az.js create mode 100644 sources/plugins/button/lang/bg.js create mode 100644 sources/plugins/button/lang/ca.js create mode 100644 sources/plugins/button/lang/cs.js create mode 100644 sources/plugins/button/lang/da.js create mode 100644 sources/plugins/button/lang/de-ch.js create mode 100644 sources/plugins/button/lang/de.js create mode 100644 sources/plugins/button/lang/el.js create mode 100644 sources/plugins/button/lang/en-gb.js create mode 100644 sources/plugins/button/lang/en.js create mode 100644 sources/plugins/button/lang/eo.js create mode 100644 sources/plugins/button/lang/es.js create mode 100644 sources/plugins/button/lang/eu.js create mode 100644 sources/plugins/button/lang/fa.js create mode 100644 sources/plugins/button/lang/fi.js create mode 100644 sources/plugins/button/lang/fr.js create mode 100644 sources/plugins/button/lang/gl.js create mode 100644 sources/plugins/button/lang/he.js create mode 100644 sources/plugins/button/lang/hu.js create mode 100644 sources/plugins/button/lang/id.js create mode 100644 sources/plugins/button/lang/it.js create mode 100644 sources/plugins/button/lang/ja.js create mode 100644 sources/plugins/button/lang/km.js create mode 100644 sources/plugins/button/lang/ko.js create mode 100644 sources/plugins/button/lang/ku.js create mode 100644 sources/plugins/button/lang/lt.js create mode 100644 sources/plugins/button/lang/nb.js create mode 100644 sources/plugins/button/lang/nl.js create mode 100644 sources/plugins/button/lang/no.js create mode 100644 sources/plugins/button/lang/oc.js create mode 100644 sources/plugins/button/lang/pl.js create mode 100644 sources/plugins/button/lang/pt-br.js create mode 100644 sources/plugins/button/lang/pt.js create mode 100644 sources/plugins/button/lang/ro.js create mode 100644 sources/plugins/button/lang/ru.js create mode 100644 sources/plugins/button/lang/sk.js create mode 100644 sources/plugins/button/lang/sl.js create mode 100644 sources/plugins/button/lang/sq.js create mode 100644 sources/plugins/button/lang/sv.js create mode 100644 sources/plugins/button/lang/tr.js create mode 100644 sources/plugins/button/lang/tt.js create mode 100644 sources/plugins/button/lang/ug.js create mode 100644 sources/plugins/button/lang/uk.js create mode 100644 sources/plugins/button/lang/vi.js create mode 100644 sources/plugins/button/lang/zh-cn.js create mode 100644 sources/plugins/button/lang/zh.js create mode 100644 sources/plugins/button/plugin.js create mode 100644 sources/plugins/clipboard/dev/clipboard.html create mode 100644 sources/plugins/clipboard/dev/console.js create mode 100644 sources/plugins/clipboard/dev/dnd.html create mode 100644 sources/plugins/clipboard/dialogs/paste.js create mode 100644 sources/plugins/clipboard/icons/copy-rtl.png create mode 100644 sources/plugins/clipboard/icons/copy.png create mode 100644 sources/plugins/clipboard/icons/cut-rtl.png create mode 100644 sources/plugins/clipboard/icons/cut.png create mode 100644 sources/plugins/clipboard/icons/hidpi/copy-rtl.png create mode 100644 sources/plugins/clipboard/icons/hidpi/copy.png create mode 100644 sources/plugins/clipboard/icons/hidpi/cut-rtl.png create mode 100644 sources/plugins/clipboard/icons/hidpi/cut.png create mode 100644 sources/plugins/clipboard/icons/hidpi/paste-rtl.png create mode 100644 sources/plugins/clipboard/icons/hidpi/paste.png create mode 100644 sources/plugins/clipboard/icons/paste-rtl.png create mode 100644 sources/plugins/clipboard/icons/paste.png create mode 100644 sources/plugins/clipboard/lang/af.js create mode 100644 sources/plugins/clipboard/lang/ar.js create mode 100644 sources/plugins/clipboard/lang/az.js create mode 100644 sources/plugins/clipboard/lang/bg.js create mode 100644 sources/plugins/clipboard/lang/bn.js create mode 100644 sources/plugins/clipboard/lang/bs.js create mode 100644 sources/plugins/clipboard/lang/ca.js create mode 100644 sources/plugins/clipboard/lang/cs.js create mode 100644 sources/plugins/clipboard/lang/cy.js create mode 100644 sources/plugins/clipboard/lang/da.js create mode 100644 sources/plugins/clipboard/lang/de-ch.js create mode 100644 sources/plugins/clipboard/lang/de.js create mode 100644 sources/plugins/clipboard/lang/el.js create mode 100644 sources/plugins/clipboard/lang/en-au.js create mode 100644 sources/plugins/clipboard/lang/en-ca.js create mode 100644 sources/plugins/clipboard/lang/en-gb.js create mode 100644 sources/plugins/clipboard/lang/en.js create mode 100644 sources/plugins/clipboard/lang/eo.js create mode 100644 sources/plugins/clipboard/lang/es.js create mode 100644 sources/plugins/clipboard/lang/et.js create mode 100644 sources/plugins/clipboard/lang/eu.js create mode 100644 sources/plugins/clipboard/lang/fa.js create mode 100644 sources/plugins/clipboard/lang/fi.js create mode 100644 sources/plugins/clipboard/lang/fo.js create mode 100644 sources/plugins/clipboard/lang/fr-ca.js create mode 100644 sources/plugins/clipboard/lang/fr.js create mode 100644 sources/plugins/clipboard/lang/gl.js create mode 100644 sources/plugins/clipboard/lang/gu.js create mode 100644 sources/plugins/clipboard/lang/he.js create mode 100644 sources/plugins/clipboard/lang/hi.js create mode 100644 sources/plugins/clipboard/lang/hr.js create mode 100644 sources/plugins/clipboard/lang/hu.js create mode 100644 sources/plugins/clipboard/lang/id.js create mode 100644 sources/plugins/clipboard/lang/is.js create mode 100644 sources/plugins/clipboard/lang/it.js create mode 100644 sources/plugins/clipboard/lang/ja.js create mode 100644 sources/plugins/clipboard/lang/ka.js create mode 100644 sources/plugins/clipboard/lang/km.js create mode 100644 sources/plugins/clipboard/lang/ko.js create mode 100644 sources/plugins/clipboard/lang/ku.js create mode 100644 sources/plugins/clipboard/lang/lt.js create mode 100644 sources/plugins/clipboard/lang/lv.js create mode 100644 sources/plugins/clipboard/lang/mk.js create mode 100644 sources/plugins/clipboard/lang/mn.js create mode 100644 sources/plugins/clipboard/lang/ms.js create mode 100644 sources/plugins/clipboard/lang/nb.js create mode 100644 sources/plugins/clipboard/lang/nl.js create mode 100644 sources/plugins/clipboard/lang/no.js create mode 100644 sources/plugins/clipboard/lang/oc.js create mode 100644 sources/plugins/clipboard/lang/pl.js create mode 100644 sources/plugins/clipboard/lang/pt-br.js create mode 100644 sources/plugins/clipboard/lang/pt.js create mode 100644 sources/plugins/clipboard/lang/ro.js create mode 100644 sources/plugins/clipboard/lang/ru.js create mode 100644 sources/plugins/clipboard/lang/si.js create mode 100644 sources/plugins/clipboard/lang/sk.js create mode 100644 sources/plugins/clipboard/lang/sl.js create mode 100644 sources/plugins/clipboard/lang/sq.js create mode 100644 sources/plugins/clipboard/lang/sr-latn.js create mode 100644 sources/plugins/clipboard/lang/sr.js create mode 100644 sources/plugins/clipboard/lang/sv.js create mode 100644 sources/plugins/clipboard/lang/th.js create mode 100644 sources/plugins/clipboard/lang/tr.js create mode 100644 sources/plugins/clipboard/lang/tt.js create mode 100644 sources/plugins/clipboard/lang/ug.js create mode 100644 sources/plugins/clipboard/lang/uk.js create mode 100644 sources/plugins/clipboard/lang/vi.js create mode 100644 sources/plugins/clipboard/lang/zh-cn.js create mode 100644 sources/plugins/clipboard/lang/zh.js create mode 100644 sources/plugins/clipboard/plugin.js create mode 100644 sources/plugins/contextmenu/lang/af.js create mode 100644 sources/plugins/contextmenu/lang/ar.js create mode 100644 sources/plugins/contextmenu/lang/az.js create mode 100644 sources/plugins/contextmenu/lang/bg.js create mode 100644 sources/plugins/contextmenu/lang/bn.js create mode 100644 sources/plugins/contextmenu/lang/bs.js create mode 100644 sources/plugins/contextmenu/lang/ca.js create mode 100644 sources/plugins/contextmenu/lang/cs.js create mode 100644 sources/plugins/contextmenu/lang/cy.js create mode 100644 sources/plugins/contextmenu/lang/da.js create mode 100644 sources/plugins/contextmenu/lang/de-ch.js create mode 100644 sources/plugins/contextmenu/lang/de.js create mode 100644 sources/plugins/contextmenu/lang/el.js create mode 100644 sources/plugins/contextmenu/lang/en-au.js create mode 100644 sources/plugins/contextmenu/lang/en-ca.js create mode 100644 sources/plugins/contextmenu/lang/en-gb.js create mode 100644 sources/plugins/contextmenu/lang/en.js create mode 100644 sources/plugins/contextmenu/lang/eo.js create mode 100644 sources/plugins/contextmenu/lang/es.js create mode 100644 sources/plugins/contextmenu/lang/et.js create mode 100644 sources/plugins/contextmenu/lang/eu.js create mode 100644 sources/plugins/contextmenu/lang/fa.js create mode 100644 sources/plugins/contextmenu/lang/fi.js create mode 100644 sources/plugins/contextmenu/lang/fo.js create mode 100644 sources/plugins/contextmenu/lang/fr-ca.js create mode 100644 sources/plugins/contextmenu/lang/fr.js create mode 100644 sources/plugins/contextmenu/lang/gl.js create mode 100644 sources/plugins/contextmenu/lang/gu.js create mode 100644 sources/plugins/contextmenu/lang/he.js create mode 100644 sources/plugins/contextmenu/lang/hi.js create mode 100644 sources/plugins/contextmenu/lang/hr.js create mode 100644 sources/plugins/contextmenu/lang/hu.js create mode 100644 sources/plugins/contextmenu/lang/id.js create mode 100644 sources/plugins/contextmenu/lang/is.js create mode 100644 sources/plugins/contextmenu/lang/it.js create mode 100644 sources/plugins/contextmenu/lang/ja.js create mode 100644 sources/plugins/contextmenu/lang/ka.js create mode 100644 sources/plugins/contextmenu/lang/km.js create mode 100644 sources/plugins/contextmenu/lang/ko.js create mode 100644 sources/plugins/contextmenu/lang/ku.js create mode 100644 sources/plugins/contextmenu/lang/lt.js create mode 100644 sources/plugins/contextmenu/lang/lv.js create mode 100644 sources/plugins/contextmenu/lang/mk.js create mode 100644 sources/plugins/contextmenu/lang/mn.js create mode 100644 sources/plugins/contextmenu/lang/ms.js create mode 100644 sources/plugins/contextmenu/lang/nb.js create mode 100644 sources/plugins/contextmenu/lang/nl.js create mode 100644 sources/plugins/contextmenu/lang/no.js create mode 100644 sources/plugins/contextmenu/lang/oc.js create mode 100644 sources/plugins/contextmenu/lang/pl.js create mode 100644 sources/plugins/contextmenu/lang/pt-br.js create mode 100644 sources/plugins/contextmenu/lang/pt.js create mode 100644 sources/plugins/contextmenu/lang/ro.js create mode 100644 sources/plugins/contextmenu/lang/ru.js create mode 100644 sources/plugins/contextmenu/lang/si.js create mode 100644 sources/plugins/contextmenu/lang/sk.js create mode 100644 sources/plugins/contextmenu/lang/sl.js create mode 100644 sources/plugins/contextmenu/lang/sq.js create mode 100644 sources/plugins/contextmenu/lang/sr-latn.js create mode 100644 sources/plugins/contextmenu/lang/sr.js create mode 100644 sources/plugins/contextmenu/lang/sv.js create mode 100644 sources/plugins/contextmenu/lang/th.js create mode 100644 sources/plugins/contextmenu/lang/tr.js create mode 100644 sources/plugins/contextmenu/lang/tt.js create mode 100644 sources/plugins/contextmenu/lang/ug.js create mode 100644 sources/plugins/contextmenu/lang/uk.js create mode 100644 sources/plugins/contextmenu/lang/vi.js create mode 100644 sources/plugins/contextmenu/lang/zh-cn.js create mode 100644 sources/plugins/contextmenu/lang/zh.js create mode 100644 sources/plugins/contextmenu/plugin.js create mode 100644 sources/plugins/dialog/dialogDefinition.js create mode 100644 sources/plugins/dialog/plugin.js create mode 100644 sources/plugins/dialog/samples/assets/my_dialog.js create mode 100644 sources/plugins/dialog/samples/dialog.html create mode 100644 sources/plugins/dialogadvtab/plugin.js create mode 100644 sources/plugins/dialogui/plugin.js create mode 100644 sources/plugins/elementspath/lang/af.js create mode 100644 sources/plugins/elementspath/lang/ar.js create mode 100644 sources/plugins/elementspath/lang/az.js create mode 100644 sources/plugins/elementspath/lang/bg.js create mode 100644 sources/plugins/elementspath/lang/bn.js create mode 100644 sources/plugins/elementspath/lang/bs.js create mode 100644 sources/plugins/elementspath/lang/ca.js create mode 100644 sources/plugins/elementspath/lang/cs.js create mode 100644 sources/plugins/elementspath/lang/cy.js create mode 100644 sources/plugins/elementspath/lang/da.js create mode 100644 sources/plugins/elementspath/lang/de-ch.js create mode 100644 sources/plugins/elementspath/lang/de.js create mode 100644 sources/plugins/elementspath/lang/el.js create mode 100644 sources/plugins/elementspath/lang/en-au.js create mode 100644 sources/plugins/elementspath/lang/en-ca.js create mode 100644 sources/plugins/elementspath/lang/en-gb.js create mode 100644 sources/plugins/elementspath/lang/en.js create mode 100644 sources/plugins/elementspath/lang/eo.js create mode 100644 sources/plugins/elementspath/lang/es.js create mode 100644 sources/plugins/elementspath/lang/et.js create mode 100644 sources/plugins/elementspath/lang/eu.js create mode 100644 sources/plugins/elementspath/lang/fa.js create mode 100644 sources/plugins/elementspath/lang/fi.js create mode 100644 sources/plugins/elementspath/lang/fo.js create mode 100644 sources/plugins/elementspath/lang/fr-ca.js create mode 100644 sources/plugins/elementspath/lang/fr.js create mode 100644 sources/plugins/elementspath/lang/gl.js create mode 100644 sources/plugins/elementspath/lang/gu.js create mode 100644 sources/plugins/elementspath/lang/he.js create mode 100644 sources/plugins/elementspath/lang/hi.js create mode 100644 sources/plugins/elementspath/lang/hr.js create mode 100644 sources/plugins/elementspath/lang/hu.js create mode 100644 sources/plugins/elementspath/lang/is.js create mode 100644 sources/plugins/elementspath/lang/it.js create mode 100644 sources/plugins/elementspath/lang/ja.js create mode 100644 sources/plugins/elementspath/lang/ka.js create mode 100644 sources/plugins/elementspath/lang/km.js create mode 100644 sources/plugins/elementspath/lang/ko.js create mode 100644 sources/plugins/elementspath/lang/ku.js create mode 100644 sources/plugins/elementspath/lang/lt.js create mode 100644 sources/plugins/elementspath/lang/lv.js create mode 100644 sources/plugins/elementspath/lang/mk.js create mode 100644 sources/plugins/elementspath/lang/mn.js create mode 100644 sources/plugins/elementspath/lang/ms.js create mode 100644 sources/plugins/elementspath/lang/nb.js create mode 100644 sources/plugins/elementspath/lang/nl.js create mode 100644 sources/plugins/elementspath/lang/no.js create mode 100644 sources/plugins/elementspath/lang/oc.js create mode 100644 sources/plugins/elementspath/lang/pl.js create mode 100644 sources/plugins/elementspath/lang/pt-br.js create mode 100644 sources/plugins/elementspath/lang/pt.js create mode 100644 sources/plugins/elementspath/lang/ro.js create mode 100644 sources/plugins/elementspath/lang/ru.js create mode 100644 sources/plugins/elementspath/lang/si.js create mode 100644 sources/plugins/elementspath/lang/sk.js create mode 100644 sources/plugins/elementspath/lang/sl.js create mode 100644 sources/plugins/elementspath/lang/sq.js create mode 100644 sources/plugins/elementspath/lang/sr-latn.js create mode 100644 sources/plugins/elementspath/lang/sr.js create mode 100644 sources/plugins/elementspath/lang/sv.js create mode 100644 sources/plugins/elementspath/lang/th.js create mode 100644 sources/plugins/elementspath/lang/tr.js create mode 100644 sources/plugins/elementspath/lang/tt.js create mode 100644 sources/plugins/elementspath/lang/ug.js create mode 100644 sources/plugins/elementspath/lang/uk.js create mode 100644 sources/plugins/elementspath/lang/vi.js create mode 100644 sources/plugins/elementspath/lang/zh-cn.js create mode 100644 sources/plugins/elementspath/lang/zh.js create mode 100644 sources/plugins/elementspath/plugin.js create mode 100644 sources/plugins/enterkey/plugin.js create mode 100644 sources/plugins/enterkey/samples/enterkey.html create mode 100644 sources/plugins/entities/plugin.js create mode 100644 sources/plugins/fakeobjects/lang/af.js create mode 100644 sources/plugins/fakeobjects/lang/ar.js create mode 100644 sources/plugins/fakeobjects/lang/az.js create mode 100644 sources/plugins/fakeobjects/lang/bg.js create mode 100644 sources/plugins/fakeobjects/lang/bn.js create mode 100644 sources/plugins/fakeobjects/lang/bs.js create mode 100644 sources/plugins/fakeobjects/lang/ca.js create mode 100644 sources/plugins/fakeobjects/lang/cs.js create mode 100644 sources/plugins/fakeobjects/lang/cy.js create mode 100644 sources/plugins/fakeobjects/lang/da.js create mode 100644 sources/plugins/fakeobjects/lang/de-ch.js create mode 100644 sources/plugins/fakeobjects/lang/de.js create mode 100644 sources/plugins/fakeobjects/lang/el.js create mode 100644 sources/plugins/fakeobjects/lang/en-au.js create mode 100644 sources/plugins/fakeobjects/lang/en-ca.js create mode 100644 sources/plugins/fakeobjects/lang/en-gb.js create mode 100644 sources/plugins/fakeobjects/lang/en.js create mode 100644 sources/plugins/fakeobjects/lang/eo.js create mode 100644 sources/plugins/fakeobjects/lang/es.js create mode 100644 sources/plugins/fakeobjects/lang/et.js create mode 100644 sources/plugins/fakeobjects/lang/eu.js create mode 100644 sources/plugins/fakeobjects/lang/fa.js create mode 100644 sources/plugins/fakeobjects/lang/fi.js create mode 100644 sources/plugins/fakeobjects/lang/fo.js create mode 100644 sources/plugins/fakeobjects/lang/fr-ca.js create mode 100644 sources/plugins/fakeobjects/lang/fr.js create mode 100644 sources/plugins/fakeobjects/lang/gl.js create mode 100644 sources/plugins/fakeobjects/lang/gu.js create mode 100644 sources/plugins/fakeobjects/lang/he.js create mode 100644 sources/plugins/fakeobjects/lang/hi.js create mode 100644 sources/plugins/fakeobjects/lang/hr.js create mode 100644 sources/plugins/fakeobjects/lang/hu.js create mode 100644 sources/plugins/fakeobjects/lang/id.js create mode 100644 sources/plugins/fakeobjects/lang/is.js create mode 100644 sources/plugins/fakeobjects/lang/it.js create mode 100644 sources/plugins/fakeobjects/lang/ja.js create mode 100644 sources/plugins/fakeobjects/lang/ka.js create mode 100644 sources/plugins/fakeobjects/lang/km.js create mode 100644 sources/plugins/fakeobjects/lang/ko.js create mode 100644 sources/plugins/fakeobjects/lang/ku.js create mode 100644 sources/plugins/fakeobjects/lang/lt.js create mode 100644 sources/plugins/fakeobjects/lang/lv.js create mode 100644 sources/plugins/fakeobjects/lang/mk.js create mode 100644 sources/plugins/fakeobjects/lang/mn.js create mode 100644 sources/plugins/fakeobjects/lang/ms.js create mode 100644 sources/plugins/fakeobjects/lang/nb.js create mode 100644 sources/plugins/fakeobjects/lang/nl.js create mode 100644 sources/plugins/fakeobjects/lang/no.js create mode 100644 sources/plugins/fakeobjects/lang/oc.js create mode 100644 sources/plugins/fakeobjects/lang/pl.js create mode 100644 sources/plugins/fakeobjects/lang/pt-br.js create mode 100644 sources/plugins/fakeobjects/lang/pt.js create mode 100644 sources/plugins/fakeobjects/lang/ro.js create mode 100644 sources/plugins/fakeobjects/lang/ru.js create mode 100644 sources/plugins/fakeobjects/lang/si.js create mode 100644 sources/plugins/fakeobjects/lang/sk.js create mode 100644 sources/plugins/fakeobjects/lang/sl.js create mode 100644 sources/plugins/fakeobjects/lang/sq.js create mode 100644 sources/plugins/fakeobjects/lang/sr-latn.js create mode 100644 sources/plugins/fakeobjects/lang/sr.js create mode 100644 sources/plugins/fakeobjects/lang/sv.js create mode 100644 sources/plugins/fakeobjects/lang/th.js create mode 100644 sources/plugins/fakeobjects/lang/tr.js create mode 100644 sources/plugins/fakeobjects/lang/tt.js create mode 100644 sources/plugins/fakeobjects/lang/ug.js create mode 100644 sources/plugins/fakeobjects/lang/uk.js create mode 100644 sources/plugins/fakeobjects/lang/vi.js create mode 100644 sources/plugins/fakeobjects/lang/zh-cn.js create mode 100644 sources/plugins/fakeobjects/lang/zh.js create mode 100644 sources/plugins/fakeobjects/plugin.js create mode 100644 sources/plugins/filebrowser/plugin.js create mode 100644 sources/plugins/floatingspace/plugin.js create mode 100644 sources/plugins/floatpanel/plugin.js create mode 100644 sources/plugins/format/lang/af.js create mode 100644 sources/plugins/format/lang/ar.js create mode 100644 sources/plugins/format/lang/az.js create mode 100644 sources/plugins/format/lang/bg.js create mode 100644 sources/plugins/format/lang/bn.js create mode 100644 sources/plugins/format/lang/bs.js create mode 100644 sources/plugins/format/lang/ca.js create mode 100644 sources/plugins/format/lang/cs.js create mode 100644 sources/plugins/format/lang/cy.js create mode 100644 sources/plugins/format/lang/da.js create mode 100644 sources/plugins/format/lang/de-ch.js create mode 100644 sources/plugins/format/lang/de.js create mode 100644 sources/plugins/format/lang/el.js create mode 100644 sources/plugins/format/lang/en-au.js create mode 100644 sources/plugins/format/lang/en-ca.js create mode 100644 sources/plugins/format/lang/en-gb.js create mode 100644 sources/plugins/format/lang/en.js create mode 100644 sources/plugins/format/lang/eo.js create mode 100644 sources/plugins/format/lang/es.js create mode 100644 sources/plugins/format/lang/et.js create mode 100644 sources/plugins/format/lang/eu.js create mode 100644 sources/plugins/format/lang/fa.js create mode 100644 sources/plugins/format/lang/fi.js create mode 100644 sources/plugins/format/lang/fo.js create mode 100644 sources/plugins/format/lang/fr-ca.js create mode 100644 sources/plugins/format/lang/fr.js create mode 100644 sources/plugins/format/lang/gl.js create mode 100644 sources/plugins/format/lang/gu.js create mode 100644 sources/plugins/format/lang/he.js create mode 100644 sources/plugins/format/lang/hi.js create mode 100644 sources/plugins/format/lang/hr.js create mode 100644 sources/plugins/format/lang/hu.js create mode 100644 sources/plugins/format/lang/id.js create mode 100644 sources/plugins/format/lang/is.js create mode 100644 sources/plugins/format/lang/it.js create mode 100644 sources/plugins/format/lang/ja.js create mode 100644 sources/plugins/format/lang/ka.js create mode 100644 sources/plugins/format/lang/km.js create mode 100644 sources/plugins/format/lang/ko.js create mode 100644 sources/plugins/format/lang/ku.js create mode 100644 sources/plugins/format/lang/lt.js create mode 100644 sources/plugins/format/lang/lv.js create mode 100644 sources/plugins/format/lang/mk.js create mode 100644 sources/plugins/format/lang/mn.js create mode 100644 sources/plugins/format/lang/ms.js create mode 100644 sources/plugins/format/lang/nb.js create mode 100644 sources/plugins/format/lang/nl.js create mode 100644 sources/plugins/format/lang/no.js create mode 100644 sources/plugins/format/lang/oc.js create mode 100644 sources/plugins/format/lang/pl.js create mode 100644 sources/plugins/format/lang/pt-br.js create mode 100644 sources/plugins/format/lang/pt.js create mode 100644 sources/plugins/format/lang/ro.js create mode 100644 sources/plugins/format/lang/ru.js create mode 100644 sources/plugins/format/lang/si.js create mode 100644 sources/plugins/format/lang/sk.js create mode 100644 sources/plugins/format/lang/sl.js create mode 100644 sources/plugins/format/lang/sq.js create mode 100644 sources/plugins/format/lang/sr-latn.js create mode 100644 sources/plugins/format/lang/sr.js create mode 100644 sources/plugins/format/lang/sv.js create mode 100644 sources/plugins/format/lang/th.js create mode 100644 sources/plugins/format/lang/tr.js create mode 100644 sources/plugins/format/lang/tt.js create mode 100644 sources/plugins/format/lang/ug.js create mode 100644 sources/plugins/format/lang/uk.js create mode 100644 sources/plugins/format/lang/vi.js create mode 100644 sources/plugins/format/lang/zh-cn.js create mode 100644 sources/plugins/format/lang/zh.js create mode 100644 sources/plugins/format/plugin.js create mode 100644 sources/plugins/horizontalrule/icons/hidpi/horizontalrule.png create mode 100644 sources/plugins/horizontalrule/icons/horizontalrule.png create mode 100644 sources/plugins/horizontalrule/lang/af.js create mode 100644 sources/plugins/horizontalrule/lang/ar.js create mode 100644 sources/plugins/horizontalrule/lang/az.js create mode 100644 sources/plugins/horizontalrule/lang/bg.js create mode 100644 sources/plugins/horizontalrule/lang/bn.js create mode 100644 sources/plugins/horizontalrule/lang/bs.js create mode 100644 sources/plugins/horizontalrule/lang/ca.js create mode 100644 sources/plugins/horizontalrule/lang/cs.js create mode 100644 sources/plugins/horizontalrule/lang/cy.js create mode 100644 sources/plugins/horizontalrule/lang/da.js create mode 100644 sources/plugins/horizontalrule/lang/de-ch.js create mode 100644 sources/plugins/horizontalrule/lang/de.js create mode 100644 sources/plugins/horizontalrule/lang/el.js create mode 100644 sources/plugins/horizontalrule/lang/en-au.js create mode 100644 sources/plugins/horizontalrule/lang/en-ca.js create mode 100644 sources/plugins/horizontalrule/lang/en-gb.js create mode 100644 sources/plugins/horizontalrule/lang/en.js create mode 100644 sources/plugins/horizontalrule/lang/eo.js create mode 100644 sources/plugins/horizontalrule/lang/es.js create mode 100644 sources/plugins/horizontalrule/lang/et.js create mode 100644 sources/plugins/horizontalrule/lang/eu.js create mode 100644 sources/plugins/horizontalrule/lang/fa.js create mode 100644 sources/plugins/horizontalrule/lang/fi.js create mode 100644 sources/plugins/horizontalrule/lang/fo.js create mode 100644 sources/plugins/horizontalrule/lang/fr-ca.js create mode 100644 sources/plugins/horizontalrule/lang/fr.js create mode 100644 sources/plugins/horizontalrule/lang/gl.js create mode 100644 sources/plugins/horizontalrule/lang/gu.js create mode 100644 sources/plugins/horizontalrule/lang/he.js create mode 100644 sources/plugins/horizontalrule/lang/hi.js create mode 100644 sources/plugins/horizontalrule/lang/hr.js create mode 100644 sources/plugins/horizontalrule/lang/hu.js create mode 100644 sources/plugins/horizontalrule/lang/id.js create mode 100644 sources/plugins/horizontalrule/lang/is.js create mode 100644 sources/plugins/horizontalrule/lang/it.js create mode 100644 sources/plugins/horizontalrule/lang/ja.js create mode 100644 sources/plugins/horizontalrule/lang/ka.js create mode 100644 sources/plugins/horizontalrule/lang/km.js create mode 100644 sources/plugins/horizontalrule/lang/ko.js create mode 100644 sources/plugins/horizontalrule/lang/ku.js create mode 100644 sources/plugins/horizontalrule/lang/lt.js create mode 100644 sources/plugins/horizontalrule/lang/lv.js create mode 100644 sources/plugins/horizontalrule/lang/mk.js create mode 100644 sources/plugins/horizontalrule/lang/mn.js create mode 100644 sources/plugins/horizontalrule/lang/ms.js create mode 100644 sources/plugins/horizontalrule/lang/nb.js create mode 100644 sources/plugins/horizontalrule/lang/nl.js create mode 100644 sources/plugins/horizontalrule/lang/no.js create mode 100644 sources/plugins/horizontalrule/lang/oc.js create mode 100644 sources/plugins/horizontalrule/lang/pl.js create mode 100644 sources/plugins/horizontalrule/lang/pt-br.js create mode 100644 sources/plugins/horizontalrule/lang/pt.js create mode 100644 sources/plugins/horizontalrule/lang/ro.js create mode 100644 sources/plugins/horizontalrule/lang/ru.js create mode 100644 sources/plugins/horizontalrule/lang/si.js create mode 100644 sources/plugins/horizontalrule/lang/sk.js create mode 100644 sources/plugins/horizontalrule/lang/sl.js create mode 100644 sources/plugins/horizontalrule/lang/sq.js create mode 100644 sources/plugins/horizontalrule/lang/sr-latn.js create mode 100644 sources/plugins/horizontalrule/lang/sr.js create mode 100644 sources/plugins/horizontalrule/lang/sv.js create mode 100644 sources/plugins/horizontalrule/lang/th.js create mode 100644 sources/plugins/horizontalrule/lang/tr.js create mode 100644 sources/plugins/horizontalrule/lang/tt.js create mode 100644 sources/plugins/horizontalrule/lang/ug.js create mode 100644 sources/plugins/horizontalrule/lang/uk.js create mode 100644 sources/plugins/horizontalrule/lang/vi.js create mode 100644 sources/plugins/horizontalrule/lang/zh-cn.js create mode 100644 sources/plugins/horizontalrule/lang/zh.js create mode 100644 sources/plugins/horizontalrule/plugin.js create mode 100644 sources/plugins/htmlwriter/plugin.js create mode 100644 sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.fla create mode 100644 sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.swf create mode 100644 sources/plugins/htmlwriter/samples/assets/outputforflash/swfobject.js create mode 100644 sources/plugins/htmlwriter/samples/outputforflash.html create mode 100644 sources/plugins/htmlwriter/samples/outputhtml.html create mode 100644 sources/plugins/iframe/dialogs/iframe.js create mode 100644 sources/plugins/iframe/icons/hidpi/iframe.png create mode 100644 sources/plugins/iframe/icons/iframe.png create mode 100644 sources/plugins/iframe/images/placeholder.png create mode 100644 sources/plugins/iframe/lang/af.js create mode 100644 sources/plugins/iframe/lang/ar.js create mode 100644 sources/plugins/iframe/lang/az.js create mode 100644 sources/plugins/iframe/lang/bg.js create mode 100644 sources/plugins/iframe/lang/bn.js create mode 100644 sources/plugins/iframe/lang/bs.js create mode 100644 sources/plugins/iframe/lang/ca.js create mode 100644 sources/plugins/iframe/lang/cs.js create mode 100644 sources/plugins/iframe/lang/cy.js create mode 100644 sources/plugins/iframe/lang/da.js create mode 100644 sources/plugins/iframe/lang/de-ch.js create mode 100644 sources/plugins/iframe/lang/de.js create mode 100644 sources/plugins/iframe/lang/el.js create mode 100644 sources/plugins/iframe/lang/en-au.js create mode 100644 sources/plugins/iframe/lang/en-ca.js create mode 100644 sources/plugins/iframe/lang/en-gb.js create mode 100644 sources/plugins/iframe/lang/en.js create mode 100644 sources/plugins/iframe/lang/eo.js create mode 100644 sources/plugins/iframe/lang/es.js create mode 100644 sources/plugins/iframe/lang/et.js create mode 100644 sources/plugins/iframe/lang/eu.js create mode 100644 sources/plugins/iframe/lang/fa.js create mode 100644 sources/plugins/iframe/lang/fi.js create mode 100644 sources/plugins/iframe/lang/fo.js create mode 100644 sources/plugins/iframe/lang/fr-ca.js create mode 100644 sources/plugins/iframe/lang/fr.js create mode 100644 sources/plugins/iframe/lang/gl.js create mode 100644 sources/plugins/iframe/lang/gu.js create mode 100644 sources/plugins/iframe/lang/he.js create mode 100644 sources/plugins/iframe/lang/hi.js create mode 100644 sources/plugins/iframe/lang/hr.js create mode 100644 sources/plugins/iframe/lang/hu.js create mode 100644 sources/plugins/iframe/lang/id.js create mode 100644 sources/plugins/iframe/lang/is.js create mode 100644 sources/plugins/iframe/lang/it.js create mode 100644 sources/plugins/iframe/lang/ja.js create mode 100644 sources/plugins/iframe/lang/ka.js create mode 100644 sources/plugins/iframe/lang/km.js create mode 100644 sources/plugins/iframe/lang/ko.js create mode 100644 sources/plugins/iframe/lang/ku.js create mode 100644 sources/plugins/iframe/lang/lt.js create mode 100644 sources/plugins/iframe/lang/lv.js create mode 100644 sources/plugins/iframe/lang/mk.js create mode 100644 sources/plugins/iframe/lang/mn.js create mode 100644 sources/plugins/iframe/lang/ms.js create mode 100644 sources/plugins/iframe/lang/nb.js create mode 100644 sources/plugins/iframe/lang/nl.js create mode 100644 sources/plugins/iframe/lang/no.js create mode 100644 sources/plugins/iframe/lang/oc.js create mode 100644 sources/plugins/iframe/lang/pl.js create mode 100644 sources/plugins/iframe/lang/pt-br.js create mode 100644 sources/plugins/iframe/lang/pt.js create mode 100644 sources/plugins/iframe/lang/ro.js create mode 100644 sources/plugins/iframe/lang/ru.js create mode 100644 sources/plugins/iframe/lang/si.js create mode 100644 sources/plugins/iframe/lang/sk.js create mode 100644 sources/plugins/iframe/lang/sl.js create mode 100644 sources/plugins/iframe/lang/sq.js create mode 100644 sources/plugins/iframe/lang/sr-latn.js create mode 100644 sources/plugins/iframe/lang/sr.js create mode 100644 sources/plugins/iframe/lang/sv.js create mode 100644 sources/plugins/iframe/lang/th.js create mode 100644 sources/plugins/iframe/lang/tr.js create mode 100644 sources/plugins/iframe/lang/tt.js create mode 100644 sources/plugins/iframe/lang/ug.js create mode 100644 sources/plugins/iframe/lang/uk.js create mode 100644 sources/plugins/iframe/lang/vi.js create mode 100644 sources/plugins/iframe/lang/zh-cn.js create mode 100644 sources/plugins/iframe/lang/zh.js create mode 100644 sources/plugins/iframe/plugin.js create mode 100644 sources/plugins/image/dialogs/image.js create mode 100644 sources/plugins/image/icons/hidpi/image.png create mode 100644 sources/plugins/image/icons/image.png create mode 100644 sources/plugins/image/images/noimage.png create mode 100644 sources/plugins/image/lang/af.js create mode 100644 sources/plugins/image/lang/ar.js create mode 100644 sources/plugins/image/lang/az.js create mode 100644 sources/plugins/image/lang/bg.js create mode 100644 sources/plugins/image/lang/bn.js create mode 100644 sources/plugins/image/lang/bs.js create mode 100644 sources/plugins/image/lang/ca.js create mode 100644 sources/plugins/image/lang/cs.js create mode 100644 sources/plugins/image/lang/cy.js create mode 100644 sources/plugins/image/lang/da.js create mode 100644 sources/plugins/image/lang/de-ch.js create mode 100644 sources/plugins/image/lang/de.js create mode 100644 sources/plugins/image/lang/el.js create mode 100644 sources/plugins/image/lang/en-au.js create mode 100644 sources/plugins/image/lang/en-ca.js create mode 100644 sources/plugins/image/lang/en-gb.js create mode 100644 sources/plugins/image/lang/en.js create mode 100644 sources/plugins/image/lang/eo.js create mode 100644 sources/plugins/image/lang/es.js create mode 100644 sources/plugins/image/lang/et.js create mode 100644 sources/plugins/image/lang/eu.js create mode 100644 sources/plugins/image/lang/fa.js create mode 100644 sources/plugins/image/lang/fi.js create mode 100644 sources/plugins/image/lang/fo.js create mode 100644 sources/plugins/image/lang/fr-ca.js create mode 100644 sources/plugins/image/lang/fr.js create mode 100644 sources/plugins/image/lang/gl.js create mode 100644 sources/plugins/image/lang/gu.js create mode 100644 sources/plugins/image/lang/he.js create mode 100644 sources/plugins/image/lang/hi.js create mode 100644 sources/plugins/image/lang/hr.js create mode 100644 sources/plugins/image/lang/hu.js create mode 100644 sources/plugins/image/lang/id.js create mode 100644 sources/plugins/image/lang/is.js create mode 100644 sources/plugins/image/lang/it.js create mode 100644 sources/plugins/image/lang/ja.js create mode 100644 sources/plugins/image/lang/ka.js create mode 100644 sources/plugins/image/lang/km.js create mode 100644 sources/plugins/image/lang/ko.js create mode 100644 sources/plugins/image/lang/ku.js create mode 100644 sources/plugins/image/lang/lt.js create mode 100644 sources/plugins/image/lang/lv.js create mode 100644 sources/plugins/image/lang/mk.js create mode 100644 sources/plugins/image/lang/mn.js create mode 100644 sources/plugins/image/lang/ms.js create mode 100644 sources/plugins/image/lang/nb.js create mode 100644 sources/plugins/image/lang/nl.js create mode 100644 sources/plugins/image/lang/no.js create mode 100644 sources/plugins/image/lang/oc.js create mode 100644 sources/plugins/image/lang/pl.js create mode 100644 sources/plugins/image/lang/pt-br.js create mode 100644 sources/plugins/image/lang/pt.js create mode 100644 sources/plugins/image/lang/ro.js create mode 100644 sources/plugins/image/lang/ru.js create mode 100644 sources/plugins/image/lang/si.js create mode 100644 sources/plugins/image/lang/sk.js create mode 100644 sources/plugins/image/lang/sl.js create mode 100644 sources/plugins/image/lang/sq.js create mode 100644 sources/plugins/image/lang/sr-latn.js create mode 100644 sources/plugins/image/lang/sr.js create mode 100644 sources/plugins/image/lang/sv.js create mode 100644 sources/plugins/image/lang/th.js create mode 100644 sources/plugins/image/lang/tr.js create mode 100644 sources/plugins/image/lang/tt.js create mode 100644 sources/plugins/image/lang/ug.js create mode 100644 sources/plugins/image/lang/uk.js create mode 100644 sources/plugins/image/lang/vi.js create mode 100644 sources/plugins/image/lang/zh-cn.js create mode 100644 sources/plugins/image/lang/zh.js create mode 100644 sources/plugins/image/plugin.js create mode 100644 sources/plugins/indent/dev/indent.html create mode 100644 sources/plugins/indent/icons/hidpi/indent-rtl.png create mode 100644 sources/plugins/indent/icons/hidpi/indent.png create mode 100644 sources/plugins/indent/icons/hidpi/outdent-rtl.png create mode 100644 sources/plugins/indent/icons/hidpi/outdent.png create mode 100644 sources/plugins/indent/icons/indent-rtl.png create mode 100644 sources/plugins/indent/icons/indent.png create mode 100644 sources/plugins/indent/icons/outdent-rtl.png create mode 100644 sources/plugins/indent/icons/outdent.png create mode 100644 sources/plugins/indent/lang/af.js create mode 100644 sources/plugins/indent/lang/ar.js create mode 100644 sources/plugins/indent/lang/az.js create mode 100644 sources/plugins/indent/lang/bg.js create mode 100644 sources/plugins/indent/lang/bn.js create mode 100644 sources/plugins/indent/lang/bs.js create mode 100644 sources/plugins/indent/lang/ca.js create mode 100644 sources/plugins/indent/lang/cs.js create mode 100644 sources/plugins/indent/lang/cy.js create mode 100644 sources/plugins/indent/lang/da.js create mode 100644 sources/plugins/indent/lang/de-ch.js create mode 100644 sources/plugins/indent/lang/de.js create mode 100644 sources/plugins/indent/lang/el.js create mode 100644 sources/plugins/indent/lang/en-au.js create mode 100644 sources/plugins/indent/lang/en-ca.js create mode 100644 sources/plugins/indent/lang/en-gb.js create mode 100644 sources/plugins/indent/lang/en.js create mode 100644 sources/plugins/indent/lang/eo.js create mode 100644 sources/plugins/indent/lang/es.js create mode 100644 sources/plugins/indent/lang/et.js create mode 100644 sources/plugins/indent/lang/eu.js create mode 100644 sources/plugins/indent/lang/fa.js create mode 100644 sources/plugins/indent/lang/fi.js create mode 100644 sources/plugins/indent/lang/fo.js create mode 100644 sources/plugins/indent/lang/fr-ca.js create mode 100644 sources/plugins/indent/lang/fr.js create mode 100644 sources/plugins/indent/lang/gl.js create mode 100644 sources/plugins/indent/lang/gu.js create mode 100644 sources/plugins/indent/lang/he.js create mode 100644 sources/plugins/indent/lang/hi.js create mode 100644 sources/plugins/indent/lang/hr.js create mode 100644 sources/plugins/indent/lang/hu.js create mode 100644 sources/plugins/indent/lang/id.js create mode 100644 sources/plugins/indent/lang/is.js create mode 100644 sources/plugins/indent/lang/it.js create mode 100644 sources/plugins/indent/lang/ja.js create mode 100644 sources/plugins/indent/lang/ka.js create mode 100644 sources/plugins/indent/lang/km.js create mode 100644 sources/plugins/indent/lang/ko.js create mode 100644 sources/plugins/indent/lang/ku.js create mode 100644 sources/plugins/indent/lang/lt.js create mode 100644 sources/plugins/indent/lang/lv.js create mode 100644 sources/plugins/indent/lang/mk.js create mode 100644 sources/plugins/indent/lang/mn.js create mode 100644 sources/plugins/indent/lang/ms.js create mode 100644 sources/plugins/indent/lang/nb.js create mode 100644 sources/plugins/indent/lang/nl.js create mode 100644 sources/plugins/indent/lang/no.js create mode 100644 sources/plugins/indent/lang/oc.js create mode 100644 sources/plugins/indent/lang/pl.js create mode 100644 sources/plugins/indent/lang/pt-br.js create mode 100644 sources/plugins/indent/lang/pt.js create mode 100644 sources/plugins/indent/lang/ro.js create mode 100644 sources/plugins/indent/lang/ru.js create mode 100644 sources/plugins/indent/lang/si.js create mode 100644 sources/plugins/indent/lang/sk.js create mode 100644 sources/plugins/indent/lang/sl.js create mode 100644 sources/plugins/indent/lang/sq.js create mode 100644 sources/plugins/indent/lang/sr-latn.js create mode 100644 sources/plugins/indent/lang/sr.js create mode 100644 sources/plugins/indent/lang/sv.js create mode 100644 sources/plugins/indent/lang/th.js create mode 100644 sources/plugins/indent/lang/tr.js create mode 100644 sources/plugins/indent/lang/tt.js create mode 100644 sources/plugins/indent/lang/ug.js create mode 100644 sources/plugins/indent/lang/uk.js create mode 100644 sources/plugins/indent/lang/vi.js create mode 100644 sources/plugins/indent/lang/zh-cn.js create mode 100644 sources/plugins/indent/lang/zh.js create mode 100644 sources/plugins/indent/plugin.js create mode 100644 sources/plugins/indentblock/plugin.js create mode 100644 sources/plugins/indentlist/plugin.js create mode 100644 sources/plugins/justify/icons/hidpi/justifyblock.png create mode 100644 sources/plugins/justify/icons/hidpi/justifycenter.png create mode 100644 sources/plugins/justify/icons/hidpi/justifyleft.png create mode 100644 sources/plugins/justify/icons/hidpi/justifyright.png create mode 100644 sources/plugins/justify/icons/justifyblock.png create mode 100644 sources/plugins/justify/icons/justifycenter.png create mode 100644 sources/plugins/justify/icons/justifyleft.png create mode 100644 sources/plugins/justify/icons/justifyright.png create mode 100644 sources/plugins/justify/lang/af.js create mode 100644 sources/plugins/justify/lang/ar.js create mode 100644 sources/plugins/justify/lang/az.js create mode 100644 sources/plugins/justify/lang/bg.js create mode 100644 sources/plugins/justify/lang/bn.js create mode 100644 sources/plugins/justify/lang/bs.js create mode 100644 sources/plugins/justify/lang/ca.js create mode 100644 sources/plugins/justify/lang/cs.js create mode 100644 sources/plugins/justify/lang/cy.js create mode 100644 sources/plugins/justify/lang/da.js create mode 100644 sources/plugins/justify/lang/de-ch.js create mode 100644 sources/plugins/justify/lang/de.js create mode 100644 sources/plugins/justify/lang/el.js create mode 100644 sources/plugins/justify/lang/en-au.js create mode 100644 sources/plugins/justify/lang/en-ca.js create mode 100644 sources/plugins/justify/lang/en-gb.js create mode 100644 sources/plugins/justify/lang/en.js create mode 100644 sources/plugins/justify/lang/eo.js create mode 100644 sources/plugins/justify/lang/es.js create mode 100644 sources/plugins/justify/lang/et.js create mode 100644 sources/plugins/justify/lang/eu.js create mode 100644 sources/plugins/justify/lang/fa.js create mode 100644 sources/plugins/justify/lang/fi.js create mode 100644 sources/plugins/justify/lang/fo.js create mode 100644 sources/plugins/justify/lang/fr-ca.js create mode 100644 sources/plugins/justify/lang/fr.js create mode 100644 sources/plugins/justify/lang/gl.js create mode 100644 sources/plugins/justify/lang/gu.js create mode 100644 sources/plugins/justify/lang/he.js create mode 100644 sources/plugins/justify/lang/hi.js create mode 100644 sources/plugins/justify/lang/hr.js create mode 100644 sources/plugins/justify/lang/hu.js create mode 100644 sources/plugins/justify/lang/id.js create mode 100644 sources/plugins/justify/lang/is.js create mode 100644 sources/plugins/justify/lang/it.js create mode 100644 sources/plugins/justify/lang/ja.js create mode 100644 sources/plugins/justify/lang/ka.js create mode 100644 sources/plugins/justify/lang/km.js create mode 100644 sources/plugins/justify/lang/ko.js create mode 100644 sources/plugins/justify/lang/ku.js create mode 100644 sources/plugins/justify/lang/lt.js create mode 100644 sources/plugins/justify/lang/lv.js create mode 100644 sources/plugins/justify/lang/mk.js create mode 100644 sources/plugins/justify/lang/mn.js create mode 100644 sources/plugins/justify/lang/ms.js create mode 100644 sources/plugins/justify/lang/nb.js create mode 100644 sources/plugins/justify/lang/nl.js create mode 100644 sources/plugins/justify/lang/no.js create mode 100644 sources/plugins/justify/lang/oc.js create mode 100644 sources/plugins/justify/lang/pl.js create mode 100644 sources/plugins/justify/lang/pt-br.js create mode 100644 sources/plugins/justify/lang/pt.js create mode 100644 sources/plugins/justify/lang/ro.js create mode 100644 sources/plugins/justify/lang/ru.js create mode 100644 sources/plugins/justify/lang/si.js create mode 100644 sources/plugins/justify/lang/sk.js create mode 100644 sources/plugins/justify/lang/sl.js create mode 100644 sources/plugins/justify/lang/sq.js create mode 100644 sources/plugins/justify/lang/sr-latn.js create mode 100644 sources/plugins/justify/lang/sr.js create mode 100644 sources/plugins/justify/lang/sv.js create mode 100644 sources/plugins/justify/lang/th.js create mode 100644 sources/plugins/justify/lang/tr.js create mode 100644 sources/plugins/justify/lang/tt.js create mode 100644 sources/plugins/justify/lang/ug.js create mode 100644 sources/plugins/justify/lang/uk.js create mode 100644 sources/plugins/justify/lang/vi.js create mode 100644 sources/plugins/justify/lang/zh-cn.js create mode 100644 sources/plugins/justify/lang/zh.js create mode 100644 sources/plugins/justify/plugin.js create mode 100644 sources/plugins/lineutils/dev/dnd.html create mode 100644 sources/plugins/lineutils/dev/magicfinger.html create mode 100644 sources/plugins/lineutils/plugin.js create mode 100644 sources/plugins/link/dialogs/anchor.js create mode 100644 sources/plugins/link/dialogs/link.js create mode 100644 sources/plugins/link/icons/anchor-rtl.png create mode 100644 sources/plugins/link/icons/anchor.png create mode 100644 sources/plugins/link/icons/hidpi/anchor-rtl.png create mode 100644 sources/plugins/link/icons/hidpi/anchor.png create mode 100644 sources/plugins/link/icons/hidpi/link.png create mode 100644 sources/plugins/link/icons/hidpi/unlink.png create mode 100644 sources/plugins/link/icons/link.png create mode 100644 sources/plugins/link/icons/unlink.png create mode 100644 sources/plugins/link/images/anchor.png create mode 100644 sources/plugins/link/images/hidpi/anchor.png create mode 100644 sources/plugins/link/lang/af.js create mode 100644 sources/plugins/link/lang/ar.js create mode 100644 sources/plugins/link/lang/az.js create mode 100644 sources/plugins/link/lang/bg.js create mode 100644 sources/plugins/link/lang/bn.js create mode 100644 sources/plugins/link/lang/bs.js create mode 100644 sources/plugins/link/lang/ca.js create mode 100644 sources/plugins/link/lang/cs.js create mode 100644 sources/plugins/link/lang/cy.js create mode 100644 sources/plugins/link/lang/da.js create mode 100644 sources/plugins/link/lang/de-ch.js create mode 100644 sources/plugins/link/lang/de.js create mode 100644 sources/plugins/link/lang/el.js create mode 100644 sources/plugins/link/lang/en-au.js create mode 100644 sources/plugins/link/lang/en-ca.js create mode 100644 sources/plugins/link/lang/en-gb.js create mode 100644 sources/plugins/link/lang/en.js create mode 100644 sources/plugins/link/lang/eo.js create mode 100644 sources/plugins/link/lang/es.js create mode 100644 sources/plugins/link/lang/et.js create mode 100644 sources/plugins/link/lang/eu.js create mode 100644 sources/plugins/link/lang/fa.js create mode 100644 sources/plugins/link/lang/fi.js create mode 100644 sources/plugins/link/lang/fo.js create mode 100644 sources/plugins/link/lang/fr-ca.js create mode 100644 sources/plugins/link/lang/fr.js create mode 100644 sources/plugins/link/lang/gl.js create mode 100644 sources/plugins/link/lang/gu.js create mode 100644 sources/plugins/link/lang/he.js create mode 100644 sources/plugins/link/lang/hi.js create mode 100644 sources/plugins/link/lang/hr.js create mode 100644 sources/plugins/link/lang/hu.js create mode 100644 sources/plugins/link/lang/id.js create mode 100644 sources/plugins/link/lang/is.js create mode 100644 sources/plugins/link/lang/it.js create mode 100644 sources/plugins/link/lang/ja.js create mode 100644 sources/plugins/link/lang/ka.js create mode 100644 sources/plugins/link/lang/km.js create mode 100644 sources/plugins/link/lang/ko.js create mode 100644 sources/plugins/link/lang/ku.js create mode 100644 sources/plugins/link/lang/lt.js create mode 100644 sources/plugins/link/lang/lv.js create mode 100644 sources/plugins/link/lang/mk.js create mode 100644 sources/plugins/link/lang/mn.js create mode 100644 sources/plugins/link/lang/ms.js create mode 100644 sources/plugins/link/lang/nb.js create mode 100644 sources/plugins/link/lang/nl.js create mode 100644 sources/plugins/link/lang/no.js create mode 100644 sources/plugins/link/lang/oc.js create mode 100644 sources/plugins/link/lang/pl.js create mode 100644 sources/plugins/link/lang/pt-br.js create mode 100644 sources/plugins/link/lang/pt.js create mode 100644 sources/plugins/link/lang/ro.js create mode 100644 sources/plugins/link/lang/ru.js create mode 100644 sources/plugins/link/lang/si.js create mode 100644 sources/plugins/link/lang/sk.js create mode 100644 sources/plugins/link/lang/sl.js create mode 100644 sources/plugins/link/lang/sq.js create mode 100644 sources/plugins/link/lang/sr-latn.js create mode 100644 sources/plugins/link/lang/sr.js create mode 100644 sources/plugins/link/lang/sv.js create mode 100644 sources/plugins/link/lang/th.js create mode 100644 sources/plugins/link/lang/tr.js create mode 100644 sources/plugins/link/lang/tt.js create mode 100644 sources/plugins/link/lang/ug.js create mode 100644 sources/plugins/link/lang/uk.js create mode 100644 sources/plugins/link/lang/vi.js create mode 100644 sources/plugins/link/lang/zh-cn.js create mode 100644 sources/plugins/link/lang/zh.js create mode 100644 sources/plugins/link/plugin.js create mode 100644 sources/plugins/list/icons/bulletedlist-rtl.png create mode 100644 sources/plugins/list/icons/bulletedlist.png create mode 100644 sources/plugins/list/icons/hidpi/bulletedlist-rtl.png create mode 100644 sources/plugins/list/icons/hidpi/bulletedlist.png create mode 100644 sources/plugins/list/icons/hidpi/numberedlist-rtl.png create mode 100644 sources/plugins/list/icons/hidpi/numberedlist.png create mode 100644 sources/plugins/list/icons/numberedlist-rtl.png create mode 100644 sources/plugins/list/icons/numberedlist.png create mode 100644 sources/plugins/list/lang/af.js create mode 100644 sources/plugins/list/lang/ar.js create mode 100644 sources/plugins/list/lang/az.js create mode 100644 sources/plugins/list/lang/bg.js create mode 100644 sources/plugins/list/lang/bn.js create mode 100644 sources/plugins/list/lang/bs.js create mode 100644 sources/plugins/list/lang/ca.js create mode 100644 sources/plugins/list/lang/cs.js create mode 100644 sources/plugins/list/lang/cy.js create mode 100644 sources/plugins/list/lang/da.js create mode 100644 sources/plugins/list/lang/de-ch.js create mode 100644 sources/plugins/list/lang/de.js create mode 100644 sources/plugins/list/lang/el.js create mode 100644 sources/plugins/list/lang/en-au.js create mode 100644 sources/plugins/list/lang/en-ca.js create mode 100644 sources/plugins/list/lang/en-gb.js create mode 100644 sources/plugins/list/lang/en.js create mode 100644 sources/plugins/list/lang/eo.js create mode 100644 sources/plugins/list/lang/es.js create mode 100644 sources/plugins/list/lang/et.js create mode 100644 sources/plugins/list/lang/eu.js create mode 100644 sources/plugins/list/lang/fa.js create mode 100644 sources/plugins/list/lang/fi.js create mode 100644 sources/plugins/list/lang/fo.js create mode 100644 sources/plugins/list/lang/fr-ca.js create mode 100644 sources/plugins/list/lang/fr.js create mode 100644 sources/plugins/list/lang/gl.js create mode 100644 sources/plugins/list/lang/gu.js create mode 100644 sources/plugins/list/lang/he.js create mode 100644 sources/plugins/list/lang/hi.js create mode 100644 sources/plugins/list/lang/hr.js create mode 100644 sources/plugins/list/lang/hu.js create mode 100644 sources/plugins/list/lang/id.js create mode 100644 sources/plugins/list/lang/is.js create mode 100644 sources/plugins/list/lang/it.js create mode 100644 sources/plugins/list/lang/ja.js create mode 100644 sources/plugins/list/lang/ka.js create mode 100644 sources/plugins/list/lang/km.js create mode 100644 sources/plugins/list/lang/ko.js create mode 100644 sources/plugins/list/lang/ku.js create mode 100644 sources/plugins/list/lang/lt.js create mode 100644 sources/plugins/list/lang/lv.js create mode 100644 sources/plugins/list/lang/mk.js create mode 100644 sources/plugins/list/lang/mn.js create mode 100644 sources/plugins/list/lang/ms.js create mode 100644 sources/plugins/list/lang/nb.js create mode 100644 sources/plugins/list/lang/nl.js create mode 100644 sources/plugins/list/lang/no.js create mode 100644 sources/plugins/list/lang/oc.js create mode 100644 sources/plugins/list/lang/pl.js create mode 100644 sources/plugins/list/lang/pt-br.js create mode 100644 sources/plugins/list/lang/pt.js create mode 100644 sources/plugins/list/lang/ro.js create mode 100644 sources/plugins/list/lang/ru.js create mode 100644 sources/plugins/list/lang/si.js create mode 100644 sources/plugins/list/lang/sk.js create mode 100644 sources/plugins/list/lang/sl.js create mode 100644 sources/plugins/list/lang/sq.js create mode 100644 sources/plugins/list/lang/sr-latn.js create mode 100644 sources/plugins/list/lang/sr.js create mode 100644 sources/plugins/list/lang/sv.js create mode 100644 sources/plugins/list/lang/th.js create mode 100644 sources/plugins/list/lang/tr.js create mode 100644 sources/plugins/list/lang/tt.js create mode 100644 sources/plugins/list/lang/ug.js create mode 100644 sources/plugins/list/lang/uk.js create mode 100644 sources/plugins/list/lang/vi.js create mode 100644 sources/plugins/list/lang/zh-cn.js create mode 100644 sources/plugins/list/lang/zh.js create mode 100644 sources/plugins/list/plugin.js create mode 100644 sources/plugins/listblock/plugin.js create mode 100644 sources/plugins/liststyle/dialogs/liststyle.js create mode 100644 sources/plugins/liststyle/lang/af.js create mode 100644 sources/plugins/liststyle/lang/ar.js create mode 100644 sources/plugins/liststyle/lang/az.js create mode 100644 sources/plugins/liststyle/lang/bg.js create mode 100644 sources/plugins/liststyle/lang/bn.js create mode 100644 sources/plugins/liststyle/lang/bs.js create mode 100644 sources/plugins/liststyle/lang/ca.js create mode 100644 sources/plugins/liststyle/lang/cs.js create mode 100644 sources/plugins/liststyle/lang/cy.js create mode 100644 sources/plugins/liststyle/lang/da.js create mode 100644 sources/plugins/liststyle/lang/de-ch.js create mode 100644 sources/plugins/liststyle/lang/de.js create mode 100644 sources/plugins/liststyle/lang/el.js create mode 100644 sources/plugins/liststyle/lang/en-au.js create mode 100644 sources/plugins/liststyle/lang/en-ca.js create mode 100644 sources/plugins/liststyle/lang/en-gb.js create mode 100644 sources/plugins/liststyle/lang/en.js create mode 100644 sources/plugins/liststyle/lang/eo.js create mode 100644 sources/plugins/liststyle/lang/es.js create mode 100644 sources/plugins/liststyle/lang/et.js create mode 100644 sources/plugins/liststyle/lang/eu.js create mode 100644 sources/plugins/liststyle/lang/fa.js create mode 100644 sources/plugins/liststyle/lang/fi.js create mode 100644 sources/plugins/liststyle/lang/fo.js create mode 100644 sources/plugins/liststyle/lang/fr-ca.js create mode 100644 sources/plugins/liststyle/lang/fr.js create mode 100644 sources/plugins/liststyle/lang/gl.js create mode 100644 sources/plugins/liststyle/lang/gu.js create mode 100644 sources/plugins/liststyle/lang/he.js create mode 100644 sources/plugins/liststyle/lang/hi.js create mode 100644 sources/plugins/liststyle/lang/hr.js create mode 100644 sources/plugins/liststyle/lang/hu.js create mode 100644 sources/plugins/liststyle/lang/id.js create mode 100644 sources/plugins/liststyle/lang/is.js create mode 100644 sources/plugins/liststyle/lang/it.js create mode 100644 sources/plugins/liststyle/lang/ja.js create mode 100644 sources/plugins/liststyle/lang/ka.js create mode 100644 sources/plugins/liststyle/lang/km.js create mode 100644 sources/plugins/liststyle/lang/ko.js create mode 100644 sources/plugins/liststyle/lang/ku.js create mode 100644 sources/plugins/liststyle/lang/lt.js create mode 100644 sources/plugins/liststyle/lang/lv.js create mode 100644 sources/plugins/liststyle/lang/mk.js create mode 100644 sources/plugins/liststyle/lang/mn.js create mode 100644 sources/plugins/liststyle/lang/ms.js create mode 100644 sources/plugins/liststyle/lang/nb.js create mode 100644 sources/plugins/liststyle/lang/nl.js create mode 100644 sources/plugins/liststyle/lang/no.js create mode 100644 sources/plugins/liststyle/lang/oc.js create mode 100644 sources/plugins/liststyle/lang/pl.js create mode 100644 sources/plugins/liststyle/lang/pt-br.js create mode 100644 sources/plugins/liststyle/lang/pt.js create mode 100644 sources/plugins/liststyle/lang/ro.js create mode 100644 sources/plugins/liststyle/lang/ru.js create mode 100644 sources/plugins/liststyle/lang/si.js create mode 100644 sources/plugins/liststyle/lang/sk.js create mode 100644 sources/plugins/liststyle/lang/sl.js create mode 100644 sources/plugins/liststyle/lang/sq.js create mode 100644 sources/plugins/liststyle/lang/sr-latn.js create mode 100644 sources/plugins/liststyle/lang/sr.js create mode 100644 sources/plugins/liststyle/lang/sv.js create mode 100644 sources/plugins/liststyle/lang/th.js create mode 100644 sources/plugins/liststyle/lang/tr.js create mode 100644 sources/plugins/liststyle/lang/tt.js create mode 100644 sources/plugins/liststyle/lang/ug.js create mode 100644 sources/plugins/liststyle/lang/uk.js create mode 100644 sources/plugins/liststyle/lang/vi.js create mode 100644 sources/plugins/liststyle/lang/zh-cn.js create mode 100644 sources/plugins/liststyle/lang/zh.js create mode 100644 sources/plugins/liststyle/plugin.js create mode 100644 sources/plugins/magicline/dev/magicline.html create mode 100644 sources/plugins/magicline/images/hidpi/icon-rtl.png create mode 100644 sources/plugins/magicline/images/hidpi/icon.png create mode 100644 sources/plugins/magicline/images/icon-rtl.png create mode 100644 sources/plugins/magicline/images/icon.png create mode 100644 sources/plugins/magicline/lang/af.js create mode 100644 sources/plugins/magicline/lang/ar.js create mode 100644 sources/plugins/magicline/lang/az.js create mode 100644 sources/plugins/magicline/lang/bg.js create mode 100644 sources/plugins/magicline/lang/ca.js create mode 100644 sources/plugins/magicline/lang/cs.js create mode 100644 sources/plugins/magicline/lang/cy.js create mode 100644 sources/plugins/magicline/lang/da.js create mode 100644 sources/plugins/magicline/lang/de-ch.js create mode 100644 sources/plugins/magicline/lang/de.js create mode 100644 sources/plugins/magicline/lang/el.js create mode 100644 sources/plugins/magicline/lang/en-gb.js create mode 100644 sources/plugins/magicline/lang/en.js create mode 100644 sources/plugins/magicline/lang/eo.js create mode 100644 sources/plugins/magicline/lang/es.js create mode 100644 sources/plugins/magicline/lang/et.js create mode 100644 sources/plugins/magicline/lang/eu.js create mode 100644 sources/plugins/magicline/lang/fa.js create mode 100644 sources/plugins/magicline/lang/fi.js create mode 100644 sources/plugins/magicline/lang/fr-ca.js create mode 100644 sources/plugins/magicline/lang/fr.js create mode 100644 sources/plugins/magicline/lang/gl.js create mode 100644 sources/plugins/magicline/lang/he.js create mode 100644 sources/plugins/magicline/lang/hr.js create mode 100644 sources/plugins/magicline/lang/hu.js create mode 100644 sources/plugins/magicline/lang/id.js create mode 100644 sources/plugins/magicline/lang/it.js create mode 100644 sources/plugins/magicline/lang/ja.js create mode 100644 sources/plugins/magicline/lang/km.js create mode 100644 sources/plugins/magicline/lang/ko.js create mode 100644 sources/plugins/magicline/lang/ku.js create mode 100644 sources/plugins/magicline/lang/lv.js create mode 100644 sources/plugins/magicline/lang/nb.js create mode 100644 sources/plugins/magicline/lang/nl.js create mode 100644 sources/plugins/magicline/lang/no.js create mode 100644 sources/plugins/magicline/lang/oc.js create mode 100644 sources/plugins/magicline/lang/pl.js create mode 100644 sources/plugins/magicline/lang/pt-br.js create mode 100644 sources/plugins/magicline/lang/pt.js create mode 100644 sources/plugins/magicline/lang/ru.js create mode 100644 sources/plugins/magicline/lang/si.js create mode 100644 sources/plugins/magicline/lang/sk.js create mode 100644 sources/plugins/magicline/lang/sl.js create mode 100644 sources/plugins/magicline/lang/sq.js create mode 100644 sources/plugins/magicline/lang/sv.js create mode 100644 sources/plugins/magicline/lang/tr.js create mode 100644 sources/plugins/magicline/lang/tt.js create mode 100644 sources/plugins/magicline/lang/ug.js create mode 100644 sources/plugins/magicline/lang/uk.js create mode 100644 sources/plugins/magicline/lang/vi.js create mode 100644 sources/plugins/magicline/lang/zh-cn.js create mode 100644 sources/plugins/magicline/lang/zh.js create mode 100644 sources/plugins/magicline/plugin.js create mode 100644 sources/plugins/magicline/samples/magicline.html create mode 100644 sources/plugins/maximize/icons/hidpi/maximize.png create mode 100644 sources/plugins/maximize/icons/maximize.png create mode 100644 sources/plugins/maximize/lang/af.js create mode 100644 sources/plugins/maximize/lang/ar.js create mode 100644 sources/plugins/maximize/lang/az.js create mode 100644 sources/plugins/maximize/lang/bg.js create mode 100644 sources/plugins/maximize/lang/bn.js create mode 100644 sources/plugins/maximize/lang/bs.js create mode 100644 sources/plugins/maximize/lang/ca.js create mode 100644 sources/plugins/maximize/lang/cs.js create mode 100644 sources/plugins/maximize/lang/cy.js create mode 100644 sources/plugins/maximize/lang/da.js create mode 100644 sources/plugins/maximize/lang/de-ch.js create mode 100644 sources/plugins/maximize/lang/de.js create mode 100644 sources/plugins/maximize/lang/el.js create mode 100644 sources/plugins/maximize/lang/en-au.js create mode 100644 sources/plugins/maximize/lang/en-ca.js create mode 100644 sources/plugins/maximize/lang/en-gb.js create mode 100644 sources/plugins/maximize/lang/en.js create mode 100644 sources/plugins/maximize/lang/eo.js create mode 100644 sources/plugins/maximize/lang/es.js create mode 100644 sources/plugins/maximize/lang/et.js create mode 100644 sources/plugins/maximize/lang/eu.js create mode 100644 sources/plugins/maximize/lang/fa.js create mode 100644 sources/plugins/maximize/lang/fi.js create mode 100644 sources/plugins/maximize/lang/fo.js create mode 100644 sources/plugins/maximize/lang/fr-ca.js create mode 100644 sources/plugins/maximize/lang/fr.js create mode 100644 sources/plugins/maximize/lang/gl.js create mode 100644 sources/plugins/maximize/lang/gu.js create mode 100644 sources/plugins/maximize/lang/he.js create mode 100644 sources/plugins/maximize/lang/hi.js create mode 100644 sources/plugins/maximize/lang/hr.js create mode 100644 sources/plugins/maximize/lang/hu.js create mode 100644 sources/plugins/maximize/lang/id.js create mode 100644 sources/plugins/maximize/lang/is.js create mode 100644 sources/plugins/maximize/lang/it.js create mode 100644 sources/plugins/maximize/lang/ja.js create mode 100644 sources/plugins/maximize/lang/ka.js create mode 100644 sources/plugins/maximize/lang/km.js create mode 100644 sources/plugins/maximize/lang/ko.js create mode 100644 sources/plugins/maximize/lang/ku.js create mode 100644 sources/plugins/maximize/lang/lt.js create mode 100644 sources/plugins/maximize/lang/lv.js create mode 100644 sources/plugins/maximize/lang/mk.js create mode 100644 sources/plugins/maximize/lang/mn.js create mode 100644 sources/plugins/maximize/lang/ms.js create mode 100644 sources/plugins/maximize/lang/nb.js create mode 100644 sources/plugins/maximize/lang/nl.js create mode 100644 sources/plugins/maximize/lang/no.js create mode 100644 sources/plugins/maximize/lang/oc.js create mode 100644 sources/plugins/maximize/lang/pl.js create mode 100644 sources/plugins/maximize/lang/pt-br.js create mode 100644 sources/plugins/maximize/lang/pt.js create mode 100644 sources/plugins/maximize/lang/ro.js create mode 100644 sources/plugins/maximize/lang/ru.js create mode 100644 sources/plugins/maximize/lang/si.js create mode 100644 sources/plugins/maximize/lang/sk.js create mode 100644 sources/plugins/maximize/lang/sl.js create mode 100644 sources/plugins/maximize/lang/sq.js create mode 100644 sources/plugins/maximize/lang/sr-latn.js create mode 100644 sources/plugins/maximize/lang/sr.js create mode 100644 sources/plugins/maximize/lang/sv.js create mode 100644 sources/plugins/maximize/lang/th.js create mode 100644 sources/plugins/maximize/lang/tr.js create mode 100644 sources/plugins/maximize/lang/tt.js create mode 100644 sources/plugins/maximize/lang/ug.js create mode 100644 sources/plugins/maximize/lang/uk.js create mode 100644 sources/plugins/maximize/lang/vi.js create mode 100644 sources/plugins/maximize/lang/zh-cn.js create mode 100644 sources/plugins/maximize/lang/zh.js create mode 100644 sources/plugins/maximize/plugin.js create mode 100644 sources/plugins/menu/plugin.js create mode 100644 sources/plugins/oembed/LICENSE.md create mode 100644 sources/plugins/oembed/README.md create mode 100644 sources/plugins/oembed/icons/hidpi/oembed.png create mode 100644 sources/plugins/oembed/icons/oembed.png create mode 100644 sources/plugins/oembed/lang/de.js create mode 100644 sources/plugins/oembed/lang/en.js create mode 100644 sources/plugins/oembed/lang/fr.js create mode 100644 sources/plugins/oembed/lang/nl.js create mode 100644 sources/plugins/oembed/lang/pl.js create mode 100644 sources/plugins/oembed/lang/pt-br.js create mode 100644 sources/plugins/oembed/lang/ru.js create mode 100644 sources/plugins/oembed/lang/tr.js create mode 100644 sources/plugins/oembed/libs/jquery.oembed.min.js create mode 100644 sources/plugins/oembed/plugin.js create mode 100644 sources/plugins/panel/plugin.js create mode 100644 sources/plugins/popup/plugin.js create mode 100644 sources/plugins/removeformat/icons/hidpi/removeformat.png create mode 100644 sources/plugins/removeformat/icons/removeformat.png create mode 100644 sources/plugins/removeformat/lang/af.js create mode 100644 sources/plugins/removeformat/lang/ar.js create mode 100644 sources/plugins/removeformat/lang/az.js create mode 100644 sources/plugins/removeformat/lang/bg.js create mode 100644 sources/plugins/removeformat/lang/bn.js create mode 100644 sources/plugins/removeformat/lang/bs.js create mode 100644 sources/plugins/removeformat/lang/ca.js create mode 100644 sources/plugins/removeformat/lang/cs.js create mode 100644 sources/plugins/removeformat/lang/cy.js create mode 100644 sources/plugins/removeformat/lang/da.js create mode 100644 sources/plugins/removeformat/lang/de-ch.js create mode 100644 sources/plugins/removeformat/lang/de.js create mode 100644 sources/plugins/removeformat/lang/el.js create mode 100644 sources/plugins/removeformat/lang/en-au.js create mode 100644 sources/plugins/removeformat/lang/en-ca.js create mode 100644 sources/plugins/removeformat/lang/en-gb.js create mode 100644 sources/plugins/removeformat/lang/en.js create mode 100644 sources/plugins/removeformat/lang/eo.js create mode 100644 sources/plugins/removeformat/lang/es.js create mode 100644 sources/plugins/removeformat/lang/et.js create mode 100644 sources/plugins/removeformat/lang/eu.js create mode 100644 sources/plugins/removeformat/lang/fa.js create mode 100644 sources/plugins/removeformat/lang/fi.js create mode 100644 sources/plugins/removeformat/lang/fo.js create mode 100644 sources/plugins/removeformat/lang/fr-ca.js create mode 100644 sources/plugins/removeformat/lang/fr.js create mode 100644 sources/plugins/removeformat/lang/gl.js create mode 100644 sources/plugins/removeformat/lang/gu.js create mode 100644 sources/plugins/removeformat/lang/he.js create mode 100644 sources/plugins/removeformat/lang/hi.js create mode 100644 sources/plugins/removeformat/lang/hr.js create mode 100644 sources/plugins/removeformat/lang/hu.js create mode 100644 sources/plugins/removeformat/lang/id.js create mode 100644 sources/plugins/removeformat/lang/is.js create mode 100644 sources/plugins/removeformat/lang/it.js create mode 100644 sources/plugins/removeformat/lang/ja.js create mode 100644 sources/plugins/removeformat/lang/ka.js create mode 100644 sources/plugins/removeformat/lang/km.js create mode 100644 sources/plugins/removeformat/lang/ko.js create mode 100644 sources/plugins/removeformat/lang/ku.js create mode 100644 sources/plugins/removeformat/lang/lt.js create mode 100644 sources/plugins/removeformat/lang/lv.js create mode 100644 sources/plugins/removeformat/lang/mk.js create mode 100644 sources/plugins/removeformat/lang/mn.js create mode 100644 sources/plugins/removeformat/lang/ms.js create mode 100644 sources/plugins/removeformat/lang/nb.js create mode 100644 sources/plugins/removeformat/lang/nl.js create mode 100644 sources/plugins/removeformat/lang/no.js create mode 100644 sources/plugins/removeformat/lang/oc.js create mode 100644 sources/plugins/removeformat/lang/pl.js create mode 100644 sources/plugins/removeformat/lang/pt-br.js create mode 100644 sources/plugins/removeformat/lang/pt.js create mode 100644 sources/plugins/removeformat/lang/ro.js create mode 100644 sources/plugins/removeformat/lang/ru.js create mode 100644 sources/plugins/removeformat/lang/si.js create mode 100644 sources/plugins/removeformat/lang/sk.js create mode 100644 sources/plugins/removeformat/lang/sl.js create mode 100644 sources/plugins/removeformat/lang/sq.js create mode 100644 sources/plugins/removeformat/lang/sr-latn.js create mode 100644 sources/plugins/removeformat/lang/sr.js create mode 100644 sources/plugins/removeformat/lang/sv.js create mode 100644 sources/plugins/removeformat/lang/th.js create mode 100644 sources/plugins/removeformat/lang/tr.js create mode 100644 sources/plugins/removeformat/lang/tt.js create mode 100644 sources/plugins/removeformat/lang/ug.js create mode 100644 sources/plugins/removeformat/lang/uk.js create mode 100644 sources/plugins/removeformat/lang/vi.js create mode 100644 sources/plugins/removeformat/lang/zh-cn.js create mode 100644 sources/plugins/removeformat/lang/zh.js create mode 100644 sources/plugins/removeformat/plugin.js create mode 100644 sources/plugins/resize/plugin.js create mode 100644 sources/plugins/richcombo/plugin.js create mode 100644 sources/plugins/showborders/plugin.js create mode 100644 sources/plugins/sourcearea/icons/hidpi/source-rtl.png create mode 100644 sources/plugins/sourcearea/icons/hidpi/source.png create mode 100644 sources/plugins/sourcearea/icons/source-rtl.png create mode 100644 sources/plugins/sourcearea/icons/source.png create mode 100644 sources/plugins/sourcearea/lang/af.js create mode 100644 sources/plugins/sourcearea/lang/ar.js create mode 100644 sources/plugins/sourcearea/lang/az.js create mode 100644 sources/plugins/sourcearea/lang/bg.js create mode 100644 sources/plugins/sourcearea/lang/bn.js create mode 100644 sources/plugins/sourcearea/lang/bs.js create mode 100644 sources/plugins/sourcearea/lang/ca.js create mode 100644 sources/plugins/sourcearea/lang/cs.js create mode 100644 sources/plugins/sourcearea/lang/cy.js create mode 100644 sources/plugins/sourcearea/lang/da.js create mode 100644 sources/plugins/sourcearea/lang/de-ch.js create mode 100644 sources/plugins/sourcearea/lang/de.js create mode 100644 sources/plugins/sourcearea/lang/el.js create mode 100644 sources/plugins/sourcearea/lang/en-au.js create mode 100644 sources/plugins/sourcearea/lang/en-ca.js create mode 100644 sources/plugins/sourcearea/lang/en-gb.js create mode 100644 sources/plugins/sourcearea/lang/en.js create mode 100644 sources/plugins/sourcearea/lang/eo.js create mode 100644 sources/plugins/sourcearea/lang/es.js create mode 100644 sources/plugins/sourcearea/lang/et.js create mode 100644 sources/plugins/sourcearea/lang/eu.js create mode 100644 sources/plugins/sourcearea/lang/fa.js create mode 100644 sources/plugins/sourcearea/lang/fi.js create mode 100644 sources/plugins/sourcearea/lang/fo.js create mode 100644 sources/plugins/sourcearea/lang/fr-ca.js create mode 100644 sources/plugins/sourcearea/lang/fr.js create mode 100644 sources/plugins/sourcearea/lang/gl.js create mode 100644 sources/plugins/sourcearea/lang/gu.js create mode 100644 sources/plugins/sourcearea/lang/he.js create mode 100644 sources/plugins/sourcearea/lang/hi.js create mode 100644 sources/plugins/sourcearea/lang/hr.js create mode 100644 sources/plugins/sourcearea/lang/hu.js create mode 100644 sources/plugins/sourcearea/lang/id.js create mode 100644 sources/plugins/sourcearea/lang/is.js create mode 100644 sources/plugins/sourcearea/lang/it.js create mode 100644 sources/plugins/sourcearea/lang/ja.js create mode 100644 sources/plugins/sourcearea/lang/ka.js create mode 100644 sources/plugins/sourcearea/lang/km.js create mode 100644 sources/plugins/sourcearea/lang/ko.js create mode 100644 sources/plugins/sourcearea/lang/ku.js create mode 100644 sources/plugins/sourcearea/lang/lt.js create mode 100644 sources/plugins/sourcearea/lang/lv.js create mode 100644 sources/plugins/sourcearea/lang/mk.js create mode 100644 sources/plugins/sourcearea/lang/mn.js create mode 100644 sources/plugins/sourcearea/lang/ms.js create mode 100644 sources/plugins/sourcearea/lang/nb.js create mode 100644 sources/plugins/sourcearea/lang/nl.js create mode 100644 sources/plugins/sourcearea/lang/no.js create mode 100644 sources/plugins/sourcearea/lang/oc.js create mode 100644 sources/plugins/sourcearea/lang/pl.js create mode 100644 sources/plugins/sourcearea/lang/pt-br.js create mode 100644 sources/plugins/sourcearea/lang/pt.js create mode 100644 sources/plugins/sourcearea/lang/ro.js create mode 100644 sources/plugins/sourcearea/lang/ru.js create mode 100644 sources/plugins/sourcearea/lang/si.js create mode 100644 sources/plugins/sourcearea/lang/sk.js create mode 100644 sources/plugins/sourcearea/lang/sl.js create mode 100644 sources/plugins/sourcearea/lang/sq.js create mode 100644 sources/plugins/sourcearea/lang/sr-latn.js create mode 100644 sources/plugins/sourcearea/lang/sr.js create mode 100644 sources/plugins/sourcearea/lang/sv.js create mode 100644 sources/plugins/sourcearea/lang/th.js create mode 100644 sources/plugins/sourcearea/lang/tr.js create mode 100644 sources/plugins/sourcearea/lang/tt.js create mode 100644 sources/plugins/sourcearea/lang/ug.js create mode 100644 sources/plugins/sourcearea/lang/uk.js create mode 100644 sources/plugins/sourcearea/lang/vi.js create mode 100644 sources/plugins/sourcearea/lang/zh-cn.js create mode 100644 sources/plugins/sourcearea/lang/zh.js create mode 100644 sources/plugins/sourcearea/plugin.js create mode 100644 sources/plugins/tab/plugin.js create mode 100644 sources/plugins/toolbar/lang/af.js create mode 100644 sources/plugins/toolbar/lang/ar.js create mode 100644 sources/plugins/toolbar/lang/az.js create mode 100644 sources/plugins/toolbar/lang/bg.js create mode 100644 sources/plugins/toolbar/lang/bn.js create mode 100644 sources/plugins/toolbar/lang/bs.js create mode 100644 sources/plugins/toolbar/lang/ca.js create mode 100644 sources/plugins/toolbar/lang/cs.js create mode 100644 sources/plugins/toolbar/lang/cy.js create mode 100644 sources/plugins/toolbar/lang/da.js create mode 100644 sources/plugins/toolbar/lang/de-ch.js create mode 100644 sources/plugins/toolbar/lang/de.js create mode 100644 sources/plugins/toolbar/lang/el.js create mode 100644 sources/plugins/toolbar/lang/en-au.js create mode 100644 sources/plugins/toolbar/lang/en-ca.js create mode 100644 sources/plugins/toolbar/lang/en-gb.js create mode 100644 sources/plugins/toolbar/lang/en.js create mode 100644 sources/plugins/toolbar/lang/eo.js create mode 100644 sources/plugins/toolbar/lang/es.js create mode 100644 sources/plugins/toolbar/lang/et.js create mode 100644 sources/plugins/toolbar/lang/eu.js create mode 100644 sources/plugins/toolbar/lang/fa.js create mode 100644 sources/plugins/toolbar/lang/fi.js create mode 100644 sources/plugins/toolbar/lang/fo.js create mode 100644 sources/plugins/toolbar/lang/fr-ca.js create mode 100644 sources/plugins/toolbar/lang/fr.js create mode 100644 sources/plugins/toolbar/lang/gl.js create mode 100644 sources/plugins/toolbar/lang/gu.js create mode 100644 sources/plugins/toolbar/lang/he.js create mode 100644 sources/plugins/toolbar/lang/hi.js create mode 100644 sources/plugins/toolbar/lang/hr.js create mode 100644 sources/plugins/toolbar/lang/hu.js create mode 100644 sources/plugins/toolbar/lang/id.js create mode 100644 sources/plugins/toolbar/lang/is.js create mode 100644 sources/plugins/toolbar/lang/it.js create mode 100644 sources/plugins/toolbar/lang/ja.js create mode 100644 sources/plugins/toolbar/lang/ka.js create mode 100644 sources/plugins/toolbar/lang/km.js create mode 100644 sources/plugins/toolbar/lang/ko.js create mode 100644 sources/plugins/toolbar/lang/ku.js create mode 100644 sources/plugins/toolbar/lang/lt.js create mode 100644 sources/plugins/toolbar/lang/lv.js create mode 100644 sources/plugins/toolbar/lang/mk.js create mode 100644 sources/plugins/toolbar/lang/mn.js create mode 100644 sources/plugins/toolbar/lang/ms.js create mode 100644 sources/plugins/toolbar/lang/nb.js create mode 100644 sources/plugins/toolbar/lang/nl.js create mode 100644 sources/plugins/toolbar/lang/no.js create mode 100644 sources/plugins/toolbar/lang/oc.js create mode 100644 sources/plugins/toolbar/lang/pl.js create mode 100644 sources/plugins/toolbar/lang/pt-br.js create mode 100644 sources/plugins/toolbar/lang/pt.js create mode 100644 sources/plugins/toolbar/lang/ro.js create mode 100644 sources/plugins/toolbar/lang/ru.js create mode 100644 sources/plugins/toolbar/lang/si.js create mode 100644 sources/plugins/toolbar/lang/sk.js create mode 100644 sources/plugins/toolbar/lang/sl.js create mode 100644 sources/plugins/toolbar/lang/sq.js create mode 100644 sources/plugins/toolbar/lang/sr-latn.js create mode 100644 sources/plugins/toolbar/lang/sr.js create mode 100644 sources/plugins/toolbar/lang/sv.js create mode 100644 sources/plugins/toolbar/lang/th.js create mode 100644 sources/plugins/toolbar/lang/tr.js create mode 100644 sources/plugins/toolbar/lang/tt.js create mode 100644 sources/plugins/toolbar/lang/ug.js create mode 100644 sources/plugins/toolbar/lang/uk.js create mode 100644 sources/plugins/toolbar/lang/vi.js create mode 100644 sources/plugins/toolbar/lang/zh-cn.js create mode 100644 sources/plugins/toolbar/lang/zh.js create mode 100644 sources/plugins/toolbar/plugin.js create mode 100644 sources/plugins/toolbar/samples/toolbar.html create mode 100644 sources/plugins/widget/dev/assets/contents.css create mode 100644 sources/plugins/widget/dev/assets/sample.jpg create mode 100644 sources/plugins/widget/dev/assets/simplebox/contents.css create mode 100644 sources/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js create mode 100644 sources/plugins/widget/dev/assets/simplebox/icons/simplebox.png create mode 100644 sources/plugins/widget/dev/assets/simplebox/plugin.js create mode 100644 sources/plugins/widget/dev/console.js create mode 100644 sources/plugins/widget/dev/nestedwidgets.html create mode 100644 sources/plugins/widget/dev/widgetstyles.html create mode 100644 sources/plugins/widget/images/handle.png create mode 100644 sources/plugins/widget/lang/af.js create mode 100644 sources/plugins/widget/lang/ar.js create mode 100644 sources/plugins/widget/lang/az.js create mode 100644 sources/plugins/widget/lang/bg.js create mode 100644 sources/plugins/widget/lang/ca.js create mode 100644 sources/plugins/widget/lang/cs.js create mode 100644 sources/plugins/widget/lang/cy.js create mode 100644 sources/plugins/widget/lang/da.js create mode 100644 sources/plugins/widget/lang/de-ch.js create mode 100644 sources/plugins/widget/lang/de.js create mode 100644 sources/plugins/widget/lang/el.js create mode 100644 sources/plugins/widget/lang/en-gb.js create mode 100644 sources/plugins/widget/lang/en.js create mode 100644 sources/plugins/widget/lang/eo.js create mode 100644 sources/plugins/widget/lang/es.js create mode 100644 sources/plugins/widget/lang/eu.js create mode 100644 sources/plugins/widget/lang/fa.js create mode 100644 sources/plugins/widget/lang/fi.js create mode 100644 sources/plugins/widget/lang/fr.js create mode 100644 sources/plugins/widget/lang/gl.js create mode 100644 sources/plugins/widget/lang/he.js create mode 100644 sources/plugins/widget/lang/hr.js create mode 100644 sources/plugins/widget/lang/hu.js create mode 100644 sources/plugins/widget/lang/id.js create mode 100644 sources/plugins/widget/lang/it.js create mode 100644 sources/plugins/widget/lang/ja.js create mode 100644 sources/plugins/widget/lang/km.js create mode 100644 sources/plugins/widget/lang/ko.js create mode 100644 sources/plugins/widget/lang/ku.js create mode 100644 sources/plugins/widget/lang/lv.js create mode 100644 sources/plugins/widget/lang/nb.js create mode 100644 sources/plugins/widget/lang/nl.js create mode 100644 sources/plugins/widget/lang/no.js create mode 100644 sources/plugins/widget/lang/oc.js create mode 100644 sources/plugins/widget/lang/pl.js create mode 100644 sources/plugins/widget/lang/pt-br.js create mode 100644 sources/plugins/widget/lang/pt.js create mode 100644 sources/plugins/widget/lang/ru.js create mode 100644 sources/plugins/widget/lang/sk.js create mode 100644 sources/plugins/widget/lang/sl.js create mode 100644 sources/plugins/widget/lang/sq.js create mode 100644 sources/plugins/widget/lang/sv.js create mode 100644 sources/plugins/widget/lang/tr.js create mode 100644 sources/plugins/widget/lang/tt.js create mode 100644 sources/plugins/widget/lang/ug.js create mode 100644 sources/plugins/widget/lang/uk.js create mode 100644 sources/plugins/widget/lang/vi.js create mode 100644 sources/plugins/widget/lang/zh-cn.js create mode 100644 sources/plugins/widget/lang/zh.js create mode 100644 sources/plugins/widget/plugin.js create mode 100644 sources/plugins/widgetselection/plugin.js create mode 100644 sources/plugins/wysiwygarea/plugin.js create mode 100644 sources/plugins/wysiwygarea/samples/fullpage.html (limited to 'sources/plugins') diff --git a/sources/plugins/a11yhelp/dialogs/a11yhelp.js b/sources/plugins/a11yhelp/dialogs/a11yhelp.js new file mode 100644 index 0000000..73b930c --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/a11yhelp.js @@ -0,0 +1,217 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'a11yHelp', function( editor ) { + var lang = editor.lang.a11yhelp, + coreLang = editor.lang.common.keyboard, + id = CKEDITOR.tools.getNextId(); + + // CharCode <-> KeyChar. + var keyMap = { + 8: coreLang[ 8 ], + 9: lang.tab, + 13: coreLang[ 13 ], + 16: coreLang[ 16 ], + 17: coreLang[ 17 ], + 18: coreLang[ 18 ], + 19: lang.pause, + 20: lang.capslock, + 27: lang.escape, + 33: lang.pageUp, + 34: lang.pageDown, + 35: coreLang[ 35 ], + 36: coreLang[ 36 ], + 37: lang.leftArrow, + 38: lang.upArrow, + 39: lang.rightArrow, + 40: lang.downArrow, + 45: lang.insert, + 46: coreLang[ 46 ], + 91: lang.leftWindowKey, + 92: lang.rightWindowKey, + 93: lang.selectKey, + 96: lang.numpad0, + 97: lang.numpad1, + 98: lang.numpad2, + 99: lang.numpad3, + 100: lang.numpad4, + 101: lang.numpad5, + 102: lang.numpad6, + 103: lang.numpad7, + 104: lang.numpad8, + 105: lang.numpad9, + 106: lang.multiply, + 107: lang.add, + 109: lang.subtract, + 110: lang.decimalPoint, + 111: lang.divide, + 112: lang.f1, + 113: lang.f2, + 114: lang.f3, + 115: lang.f4, + 116: lang.f5, + 117: lang.f6, + 118: lang.f7, + 119: lang.f8, + 120: lang.f9, + 121: lang.f10, + 122: lang.f11, + 123: lang.f12, + 144: lang.numLock, + 145: lang.scrollLock, + 186: lang.semiColon, + 187: lang.equalSign, + 188: lang.comma, + 189: lang.dash, + 190: lang.period, + 191: lang.forwardSlash, + 192: lang.graveAccent, + 219: lang.openBracket, + 220: lang.backSlash, + 221: lang.closeBracket, + 222: lang.singleQuote + }; + + // Modifier keys override. + keyMap[ CKEDITOR.ALT ] = coreLang[ 18 ]; + keyMap[ CKEDITOR.SHIFT ] = coreLang[ 16 ]; + keyMap[ CKEDITOR.CTRL ] = coreLang[ 17 ]; + + // Sort in desc. + var modifiers = [ CKEDITOR.ALT, CKEDITOR.SHIFT, CKEDITOR.CTRL ]; + + function representKeyStroke( keystroke ) { + var quotient, modifier, + presentation = []; + + for ( var i = 0; i < modifiers.length; i++ ) { + modifier = modifiers[ i ]; + quotient = keystroke / modifiers[ i ]; + if ( quotient > 1 && quotient <= 2 ) { + keystroke -= modifier; + presentation.push( keyMap[ modifier ] ); + } + } + + presentation.push( keyMap[ keystroke ] || String.fromCharCode( keystroke ) ); + + return presentation.join( '+' ); + } + + var variablesPattern = /\$\{(.*?)\}/g; + + var replaceVariables = ( function() { + // Swaps keystrokes with their commands in object literal. + // This makes searching keystrokes by command much easier. + var keystrokesByCode = editor.keystrokeHandler.keystrokes, + keystrokesByName = {}; + + for ( var i in keystrokesByCode ) + keystrokesByName[ keystrokesByCode[ i ] ] = i; + + return function( match, name ) { + // Return the keystroke representation or leave match untouched + // if there's no keystroke for such command. + return keystrokesByName[ name ] ? representKeyStroke( keystrokesByName[ name ] ) : match; + }; + } )(); + + // Create the help list directly from lang file entries. + function buildHelpContents() { + var pageTpl = '
%1
' + + '' + lang.contents + ' ', + sectionTpl = '

%1

%2
', + itemTpl = '
%1
%2
'; + + var pageHtml = [], + sections = lang.legend, + sectionLength = sections.length; + + for ( var i = 0; i < sectionLength; i++ ) { + var section = sections[ i ], + sectionHtml = [], + items = section.items, + itemsLength = items.length; + + for ( var j = 0; j < itemsLength; j++ ) { + var item = items[ j ], + itemLegend = item.legend.replace( variablesPattern, replaceVariables ); + + // (#9765) If some commands haven't been replaced in the legend, + // most likely their keystrokes are unavailable and we shouldn't include + // them in our help list. + if ( itemLegend.match( variablesPattern ) ) + continue; + + sectionHtml.push( itemTpl.replace( '%1', item.name ).replace( '%2', itemLegend ) ); + } + + pageHtml.push( sectionTpl.replace( '%1', section.name ).replace( '%2', sectionHtml.join( '' ) ) ); + } + + return pageTpl.replace( '%1', pageHtml.join( '' ) ); + } + + return { + title: lang.title, + minWidth: 600, + minHeight: 400, + contents: [ { + id: 'info', + label: editor.lang.common.generalTab, + expand: true, + elements: [ + { + type: 'html', + id: 'legends', + style: 'white-space:normal;', + focus: function() { + this.getElement().focus(); + }, + html: buildHelpContents() + '' + } + ] + } ], + buttons: [ CKEDITOR.dialog.cancelButton ] + }; +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt new file mode 100644 index 0000000..28e8dae --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt @@ -0,0 +1,25 @@ +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +cs.js Found: 30 Missing: 0 +cy.js Found: 30 Missing: 0 +da.js Found: 12 Missing: 18 +de.js Found: 30 Missing: 0 +el.js Found: 25 Missing: 5 +eo.js Found: 30 Missing: 0 +fa.js Found: 30 Missing: 0 +fi.js Found: 30 Missing: 0 +fr.js Found: 30 Missing: 0 +gu.js Found: 12 Missing: 18 +he.js Found: 30 Missing: 0 +it.js Found: 30 Missing: 0 +mk.js Found: 5 Missing: 25 +nb.js Found: 30 Missing: 0 +nl.js Found: 30 Missing: 0 +no.js Found: 30 Missing: 0 +pt-br.js Found: 30 Missing: 0 +ro.js Found: 6 Missing: 24 +tr.js Found: 30 Missing: 0 +ug.js Found: 27 Missing: 3 +vi.js Found: 6 Missing: 24 +zh-cn.js Found: 30 Missing: 0 diff --git a/sources/plugins/a11yhelp/dialogs/lang/af.js b/sources/plugins/a11yhelp/dialogs/lang/af.js new file mode 100644 index 0000000..7469bc1 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/af.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'af', { + title: 'Toeganglikheid instruksies', + contents: 'Hulp inhoud. Druk ESC om toe te maak.', + legend: [ + { + name: 'Algemeen', + items: [ + { + name: 'Bewerker balk', + legend: 'Druk ${toolbarFocus} om op die werkbalk te land. Beweeg na die volgende en voorige wekrbalkgroep met TAB and SHIFT+TAB. Beweeg na die volgende en voorige werkbalkknop met die regter of linker pyl. Druk SPASIE of ENTER om die knop te bevestig.' + }, + + { + name: 'Bewerker dialoog', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Bewerkerinhoudmenu', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pouse', + capslock: 'Hoofletterslot', + escape: 'Ontsnap', + pageUp: 'Blaaiop', + pageDown: 'Blaaiaf', + leftArrow: 'Linkspyl', + upArrow: 'Oppyl', + rightArrow: 'Regterpyl', + downArrow: 'Afpyl', + insert: 'Toevoeg', + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Nommerblok 0', + numpad1: 'Nommerblok 1', + numpad2: 'Nommerblok 2', + numpad3: 'Nommerblok 3', + numpad4: 'Nommerblok 4', + numpad5: 'Nommerblok 5', + numpad6: 'Nommerblok 6', + numpad7: 'Nommerblok 7', + numpad8: 'Nommerblok 8', + numpad9: 'Nommerblok 9', + multiply: 'Maal', + add: 'Plus', + subtract: 'Minus', + decimalPoint: 'Desimaalepunt', + divide: 'Gedeeldeur', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Nommervergrendel', + scrollLock: 'Rolvergrendel', + semiColon: 'Kommapunt', + equalSign: 'Isgelykaan', + comma: 'Komma', + dash: 'Koppelteken', + period: 'Punt', + forwardSlash: 'Skuinsstreep', + graveAccent: 'Aksentteken', + openBracket: 'Oopblokhakkie', + backSlash: 'Trustreep', + closeBracket: 'Toeblokhakkie', + singleQuote: 'Enkelaanhaalingsteken' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ar.js b/sources/plugins/a11yhelp/dialogs/lang/ar.js new file mode 100644 index 0000000..5c316c7 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ar.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ar', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'عام', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'إضافة', + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'تقسيم', + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'فاصلة', + dash: 'Dash', // MISSING + period: 'نقطة', + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/az.js b/sources/plugins/a11yhelp/dialogs/lang/az.js new file mode 100644 index 0000000..9c04b65 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/az.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'az', { + title: 'Əlillərə dəstək üzrə təlimat', + contents: 'Kömək. Pəncərəni bağlamaq üçün ESC basın.', + legend: [ + { + name: 'Əsas', + items: [ + { + name: 'Düzəliş edənin alətlər çubuğu', + legend: 'Panelə keçmək üçün ${toolbarFocus} basın. Növbəti panelə TAB, əvvəlki panelə isə SHIFT+TAB düyməsi vasitəsi ilə keçə bilərsiz. Paneldəki düymələr arasında sol və sağ ox düyməsi ilə keçid edə bilərsiz. Seçilmiş düyməsi SPACE və ya ENTER ilə işlədə bilərsiniz.' + }, + + { + name: 'Redaktorun pəncərəsi', + legend: + 'Pəncərə içində növbəti element seçmək üçün TAB düyməni basın, əvvəlki isə - SHIFT+TAB. Təsdiq edilməsi üçün ENTER, imtina edilməsi isə ESC diymələri istifadə edin. Pəncərədə bir neçə vərəq olanda olnarın siyahı ALT+F10 ilə aça bilərsiz. Vərəqlərin siyahı fokus altında olanda ox düymələr vasitəsi ilə onların arasında keçid edə bilərsiz.' + }, + + { + name: 'Redaktorun seçimlərin menyusu', + legend: 'Seçimləri redaktə etmək üçün ${contextMenu} ya da APPLICATION KEY basın. Növbəti seçimə keçmək üçün TAB ya AŞAĞI OX düyməsini basın, əvvəlki isə - SHIFT+TAB ya YUXARI OX. Seçimi arımaq SPACE ya ENTER düymələri istifadə edin. Alt menyunu açmaq üçün SPACE, ENTER ya SAĞA OX basın. ESC ya SOLA OX ilə geriyə qayıda bilərsiz. Bütün menyunu ESC ilə bağlıyın.' + }, + + { + name: 'Düzəliş edənin siyahı qutusu', + legend: 'Siyahı qutusu içində növbəti bənd seçmək üçün TAB ya AŞAĞI OX, əvvəlki isə SHIFT+TAB ya YUXARI OX basın. Seçimi arımaq SPACE ya ENTER düymələri istifadə edin. Siyahı qutusu ESC ilə bağlıyın.' + }, + + { + name: 'Redaktor elementin cığır paneli', + legend: 'Elementin cığır paneli seçmək üçün ${elementsPathFocus} basın. Növbəti element seçmək üçün TAB ya SAĞA OX, əvvəlki isə SHIFT+TAB ya SOLA OX istifadə edin. Elementi arımaq SPACE ya ENTER düymələri mövcuddur.' + } + ] + }, + { + name: 'Əmrlər', + items: [ + { + name: 'Əmri geri qaytar', + legend: '${undo} basın' + }, + { + name: 'Geri əmri', + legend: '${redo} basın' + }, + { + name: 'Qalın əmri', + legend: '${bold} basın' + }, + { + name: 'Kursiv əmri', + legend: '${italic} basın' + }, + { + name: 'Altdan xətt əmri', + legend: '${underline} basın' + }, + { + name: 'Link əmri', + legend: '${link} basın' + }, + { + name: 'Paneli gizlət əmri', + legend: '${toolbarCollapse} basın' + }, + { + name: 'Əvvəlki fokus sahəsi seç əmrı', + legend: 'Kursordan əvvəl ən yaxın əlçatmaz yerə dəymək üçün ${accessPreviousSpace} basın, misal üçün: iki dal-badal HR teg. Uzaq yerlərə dəymək üçün bir neçə dəfə basın.' + }, + { + name: 'Növbəti fokus sahəsi seç əmrı', + legend: 'Kursordan sonra ən yaxın əlçatmaz yerə dəymək üçün ${accessNextSpace} basın, misal üçün: iki dal-badal HR teg. Uzaq yerlərə dəymək üçün bir neçə dəfə basın.' + }, + { + name: 'Hərtərəfli Kömək', + legend: '${a11yHelp} basın' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Sola ox işarəsi', + upArrow: 'Yuxarı ox işarəsi', + rightArrow: 'Sağa ox işarəsi', + downArrow: 'Aşağı ox işarəsi', + insert: 'Insert', + leftWindowKey: 'Soldaki Windows düyməsi', + rightWindowKey: 'Sağdaki Windows düyməsi', + selectKey: 'Düyməni seçin', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Vurma', + add: 'Əlavə et', + subtract: 'Çıxma', + decimalPoint: 'Onluq kəsri tam ədəddən ayıran nöqtə', + divide: 'Bölüşdürmə', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Nöqtəli verqül', + equalSign: 'Barəbərlik işarəsi', + comma: 'Vergül', + dash: 'Defis', + period: 'Nöqtə', + forwardSlash: 'Çəp xətt', + graveAccent: 'Vurğu işarəsi', + openBracket: 'Açılan mötərizə', + backSlash: 'Tərs çəpəki xətt', + closeBracket: 'Bağlanan mötərizə', + singleQuote: 'Tək dırnaq' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/bg.js b/sources/plugins/a11yhelp/dialogs/lang/bg.js new file mode 100644 index 0000000..ce9cdd8 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/bg.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'bg', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'Общо', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ca.js b/sources/plugins/a11yhelp/dialogs/lang/ca.js new file mode 100644 index 0000000..f415b90 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ca.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ca', { + title: 'Instruccions d\'Accessibilitat', + contents: 'Continguts de l\'Ajuda. Per tancar aquest quadre de diàleg premi ESC.', + legend: [ + { + name: 'General', + items: [ + { + name: 'Editor de barra d\'eines', + legend: 'Premi ${toolbarFocus} per desplaçar-se per la barra d\'eines. Vagi en el següent i anterior grup de barra d\'eines amb TAB i SHIFT+TAB. Vagi en el següent i anterior botó de la barra d\'eines amb RIGHT ARROW i LEFT ARROW. Premi SPACE o ENTER per activar el botó de la barra d\'eines.' + }, + + { + name: 'Editor de quadre de diàleg', + legend: + 'Dins d\'un quadre de diàleg, premi la tecla TAB per desplaçar-se fins al següent element del quadre de diàleg, premi la tecla Shift + TAB per desplaçar-se a l\'anterior element del quadre de diàleg, premi la tecla ENTER per confirmar el quadre de diàleg, premi la tecla ESC per cancel·lar el quadre de diàleg. Quan un quadre de diàleg té diverses pestanyes, la llista de pestanyes pot ser assolit ja sigui amb ALT + F10 o TAB, com a part de l\'ordre de tabulació del quadre de diàleg. Amb la llista de pestanyes seleccionada, pot anar a la fitxa següent i anterior amb la tecla FLETXA DRETA i ESQUERRA, respectivament.' + }, + + { + name: 'Editor de menú contextual', + legend: 'Premi ${contextMenu} o APPLICATION KEY per obrir el menú contextual. Després desplacis a la següent opció del menú amb TAB o DOWN ARROW. Desplacis a l\'anterior opció amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l\'opció del menú. Obri el submenú de l\'actual opció utilitzant SPACE o ENTER o RIGHT ARROW. Pot tornar a l\'opció del menú pare amb ESC o LEFT ARROW. Tanqui el menú contextual amb ESC.' + }, + + { + name: 'Editor de caixa de llista', + legend: 'Dins d\'un quadre de llista, desplacis al següent element de la llista amb TAB o DOWN ARROW. Desplacis a l\'anterior element de la llista amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l\'opció de la llista. Premi ESC per tancar el quadre de llista.' + }, + + { + name: 'Editor de barra de ruta de l\'element', + legend: 'Premi ${elementsPathFocus} per anar als elements de la barra de ruta. Desplacis al botó de l\'element següent amb TAB o RIGHT ARROW. Desplacis a l\'anterior botó amb SHIFT+TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar l\'element a l\'editor.' + } + ] + }, + { + name: 'Ordres', + items: [ + { + name: 'Desfer ordre', + legend: 'Premi ${undo}' + }, + { + name: 'Refer ordre', + legend: 'Premi ${redo}' + }, + { + name: 'Ordre negreta', + legend: 'Premi ${bold}' + }, + { + name: 'Ordre cursiva', + legend: 'Premi ${italic}' + }, + { + name: 'Ordre subratllat', + legend: 'Premi ${underline}' + }, + { + name: 'Ordre enllaç', + legend: 'Premi ${link}' + }, + { + name: 'Ordre amagar barra d\'eines', + legend: 'Premi ${toolbarCollapse}' + }, + { + name: 'Ordre per accedir a l\'anterior espai enfocat', + legend: 'Premi ${accessPreviousSpace} per accedir a l\'enfocament d\'espai més proper inabastable abans del símbol d\'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d\'espais distants.' + }, + { + name: 'Ordre per accedir al següent espai enfocat', + legend: 'Premi ${accessNextSpace} per accedir a l\'enfocament d\'espai més proper inabastable després del símbol d\'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d\'espais distants.' + }, + { + name: 'Ajuda d\'accessibilitat', + legend: 'Premi ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulació', + pause: 'Pausa', + capslock: 'Bloqueig de majúscules', + escape: 'Escape', + pageUp: 'Pàgina Amunt', + pageDown: 'Pàgina Avall', + leftArrow: 'Fletxa Esquerra', + upArrow: 'Fletxa Amunt', + rightArrow: 'Fletxa Dreta', + downArrow: 'Fletxa Avall', + insert: 'Inserir', + leftWindowKey: 'Tecla Windows Esquerra', + rightWindowKey: 'Tecla Windows Dreta', + selectKey: 'Tecla Seleccionar', + numpad0: 'Teclat Numèric 0', + numpad1: 'Teclat Numèric 1', + numpad2: 'Teclat Numèric 2', + numpad3: 'Teclat Numèric 3', + numpad4: 'Teclat Numèric 4', + numpad5: 'Teclat Numèric 5', + numpad6: 'Teclat Numèric 6', + numpad7: 'Teclat Numèric 7', + numpad8: 'Teclat Numèric 8', + numpad9: 'Teclat Numèric 9', + multiply: 'Multiplicació', + add: 'Suma', + subtract: 'Resta', + decimalPoint: 'Punt Decimal', + divide: 'Divisió', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Bloqueig Teclat Numèric', + scrollLock: 'Bloqueig de Desplaçament', + semiColon: 'Punt i Coma', + equalSign: 'Símbol Igual', + comma: 'Coma', + dash: 'Guió', + period: 'Punt', + forwardSlash: 'Barra Diagonal', + graveAccent: 'Accent Obert', + openBracket: 'Claudàtor Obert', + backSlash: 'Barra Invertida', + closeBracket: 'Claudàtor Tancat', + singleQuote: 'Cometa Simple' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/cs.js b/sources/plugins/a11yhelp/dialogs/lang/cs.js new file mode 100644 index 0000000..39e4d64 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/cs.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'cs', { + title: 'Instrukce pro přístupnost', + contents: 'Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.', + legend: [ + { + name: 'Obecné', + items: [ + { + name: 'Panel nástrojů editoru', + legend: 'Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT+TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete.' + }, + + { + name: 'Dialogové okno editoru', + legend: + 'Uvnitř dialogového okna stiskněte TAB pro přesunutí na další prvek okna, stiskněte SHIFT+TAB pro přesun na předchozí prvek okna, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT+F10 pro zaměření seznamu karet, nebo TAB, pro posun podle pořadí karet.Při zaměření seznamu karet se můžete jimi posouvat pomocí ŠIPKY VPRAVO a VLEVO.' + }, + + { + name: 'Kontextové menu editoru', + legend: 'Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC.' + }, + + { + name: 'Rámeček seznamu editoru', + legend: 'Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT+TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu.' + }, + + { + name: 'Lišta cesty prvku v editoru', + legend: 'Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí tlačítko se přesunete pomocí SHIFT+TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru.' + } + ] + }, + { + name: 'Příkazy', + items: [ + { + name: ' Příkaz Zpět', + legend: 'Stiskněte ${undo}' + }, + { + name: ' Příkaz Znovu', + legend: 'Stiskněte ${redo}' + }, + { + name: ' Příkaz Tučné', + legend: 'Stiskněte ${bold}' + }, + { + name: ' Příkaz Kurzíva', + legend: 'Stiskněte ${italic}' + }, + { + name: ' Příkaz Podtržení', + legend: 'Stiskněte ${underline}' + }, + { + name: ' Příkaz Odkaz', + legend: 'Stiskněte ${link}' + }, + { + name: ' Příkaz Skrýt panel nástrojů', + legend: 'Stiskněte ${toolbarCollapse}' + }, + { + name: 'Příkaz pro přístup k předchozímu prostoru zaměření', + legend: 'Stiskněte ${accessPreviousSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření před stříškou, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte.' + }, + { + name: 'Příkaz pro přístup k dalšímu prostoru zaměření', + legend: 'Stiskněte ${accessNextSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření po stříšce, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte.' + }, + { + name: ' Nápověda přístupnosti', + legend: 'Stiskněte ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulátor', + pause: 'Pauza', + capslock: 'Caps lock', + escape: 'Escape', + pageUp: 'Stránka nahoru', + pageDown: 'Stránka dolů', + leftArrow: 'Šipka vlevo', + upArrow: 'Šipka nahoru', + rightArrow: 'Šipka vpravo', + downArrow: 'Šipka dolů', + insert: 'Vložit', + leftWindowKey: 'Levá klávesa Windows', + rightWindowKey: 'Pravá klávesa Windows', + selectKey: 'Vyberte klávesu', + numpad0: 'Numerická klávesa 0', + numpad1: 'Numerická klávesa 1', + numpad2: 'Numerická klávesa 2', + numpad3: 'Numerická klávesa 3', + numpad4: 'Numerická klávesa 4', + numpad5: 'Numerická klávesa 5', + numpad6: 'Numerická klávesa 6', + numpad7: 'Numerická klávesa 7', + numpad8: 'Numerická klávesa 8', + numpad9: 'Numerická klávesa 9', + multiply: 'Numerická klávesa násobení', + add: 'Přidat', + subtract: 'Numerická klávesa odečítání', + decimalPoint: 'Desetinná tečka', + divide: 'Numerická klávesa dělení', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num lock', + scrollLock: 'Scroll lock', + semiColon: 'Středník', + equalSign: 'Rovnítko', + comma: 'Čárka', + dash: 'Pomlčka', + period: 'Tečka', + forwardSlash: 'Lomítko', + graveAccent: 'Přízvuk', + openBracket: 'Otevřená hranatá závorka', + backSlash: 'Obrácené lomítko', + closeBracket: 'Uzavřená hranatá závorka', + singleQuote: 'Jednoduchá uvozovka' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/cy.js b/sources/plugins/a11yhelp/dialogs/lang/cy.js new file mode 100644 index 0000000..3ac77cf --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/cy.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'cy', { + title: 'Canllawiau Hygyrchedd', + contents: 'Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.', + legend: [ + { + name: 'Cyffredinol', + items: [ + { + name: 'Bar Offer y Golygydd', + legend: 'Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i\'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT+TAB. Symudwch i\'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol.' + }, + + { + name: 'Deialog y Golygydd', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Dewislen Cyd-destun y Golygydd', + legend: 'Pwyswch $ {contextMenu} neu\'r ALLWEDD \'APPLICATION\' i agor y ddewislen cyd-destun. Yna symudwch i\'r opsiwn ddewislen nesaf gyda\'r TAB neu\'r SAETH I LAWR. Symudwch i\'r opsiwn blaenorol gyda SHIFT+TAB neu\'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i\'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC.' + }, + + { + name: 'Blwch Rhestr y Golygydd', + legend: 'Tu mewn y blwch rhestr, ewch i\'r eitem rhestr nesaf gyda TAB neu\'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT+TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o\'r rhestr. Pwyswch ESC i gau\'r rhestr.' + }, + + { + name: 'Bar Llwybr Elfen y Golygydd', + legend: 'Pwyswch ${elementsPathFocus} i fynd i\'r bar llwybr elfennau. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT+TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd.' + } + ] + }, + { + name: 'Gorchmynion', + items: [ + { + name: 'Gorchymyn dadwneud', + legend: 'Pwyswch ${undo}' + }, + { + name: 'Gorchymyn ailadrodd', + legend: 'Pwyswch ${redo}' + }, + { + name: 'Gorchymyn Bras', + legend: 'Pwyswch ${bold}' + }, + { + name: 'Gorchymyn italig', + legend: 'Pwyswch ${italig}' + }, + { + name: 'Gorchymyn tanlinellu', + legend: 'Pwyso ${underline}' + }, + { + name: 'Gorchymyn dolen', + legend: 'Pwyswch ${link}' + }, + { + name: 'Gorchymyn Cwympo\'r Dewislen', + legend: 'Pwyswch ${toolbarCollapse}' + }, + { + name: 'Myned i orchymyn bwlch ffocws blaenorol', + legend: 'Pwyswch ${accessPreviousSpace} i fyned i\'r "blwch ffocws sydd methu ei gyrraedd" cyn y caret, er enghraifft: dwy elfen HR drws nesaf i\'w gilydd. AIladroddwch y cyfuniad allwedd i gyrraedd bylchau ffocws pell.' + }, + { + name: 'Ewch i\'r gorchymyn blwch ffocws nesaf', + legend: 'Pwyswch ${accessNextSpace} i fyned i\'r blwch ffocws agosaf nad oes modd ei gyrraedd ar ôl y caret, er enghraifft: dwy elfen HR drws nesaf i\'w gilydd. Ailadroddwch y cyfuniad allwedd i gyrraedd blychau ffocws pell.' + }, + { + name: 'Cymorth Hygyrchedd', + legend: 'Pwyswch ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/da.js b/sources/plugins/a11yhelp/dialogs/lang/da.js new file mode 100644 index 0000000..f507bf0 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/da.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'da', { + title: 'Tilgængelighedsinstrukser', + contents: 'Onlinehjælp. For at lukke dette vindue klik ESC', + legend: [ + { + name: 'Generelt', + items: [ + { + name: 'Editor værktøjslinje', + legend: 'Tryk ${toolbarFocus} for at navigere til værktøjslinjen. Flyt til næste eller forrige værktøjsline gruppe ved hjælp af TAB eller SHIFT+TAB. Flyt til næste eller forrige værktøjslinje knap med venstre- eller højre piltast. Tryk på SPACE eller ENTER for at aktivere værktøjslinje knappen.' + }, + + { + name: 'Editor dialogboks', + legend: + 'Inde i en dialogboks kan du, trykke på TAB for at navigere til næste element, trykke på SHIFT+TAB for at navigere til forrige element, trykke på ENTER for at afsende eller trykke på ESC for at lukke dialogboksen.\r\nNår en dialogboks har flere faner, fanelisten kan tilgås med ALT+F10 eller med TAB. Hvis fanelisten er i fokus kan du skifte til næste eller forrige tab, med højre- og venstre piltast.' + }, + + { + name: 'Redaktør kontekstmenu', + legend: 'Tryk ${contextMenu} eller APPLICATION KEY for at åbne kontekstmenuen. Flyt derefter til næste menuvalg med TAB eller PIL NED. Flyt til forrige valg med SHIFT+TAB eller PIL OP. Tryk MELLEMRUM eller RETUR for at vælge menu-muligheder. Åben under-menu af aktuelle valg med MELLEMRUM eller RETUR eller HØJRE PIL. Gå tilbage til overliggende menu-emne med ESC eller VENSTRE PIL. Luk kontekstmenu med ESC.' + }, + + { + name: 'Redaktør listeboks', + legend: 'Flyt til næste emne med TAB eller PIL NED inde i en listeboks. Flyt til forrige listeemne med SHIFT+TAB eller PIL OP. Tryk MELLEMRUM eller RETUR for at vælge liste-muligheder. Tryk ESC for at lukke liste-boksen.' + }, + + { + name: 'Redaktør elementsti-bar', + legend: 'Tryk ${elementsPathFocus} for at navigere til elementernes sti-bar. Flyt til næste element-knap med TAB eller HØJRE PIL. Flyt til forrige knap med SHIFT+TAB eller VENSTRE PIL. Klik MELLEMRUM eller RETUR for at vælge element i editoren.' + } + ] + }, + { + name: 'Kommandoer', + items: [ + { + name: 'Fortryd kommando', + legend: 'Klik på ${undo}' + }, + { + name: 'Gentag kommando', + legend: 'Klik ${redo}' + }, + { + name: 'Fed kommando', + legend: 'Klik ${bold}' + }, + { + name: 'Kursiv kommando', + legend: 'Klik ${italic}' + }, + { + name: 'Understregnings kommando', + legend: 'Klik ${underline}' + }, + { + name: 'Link kommando', + legend: 'Klik ${link}' + }, + { + name: 'Klap værktøjslinje sammen kommando ', + legend: 'Klik ${toolbarCollapse}' + }, + { + name: 'Adgang til forrige fokusområde kommando', + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: 'Tilgængelighedshjælp', + legend: 'Kilk ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Venstre pil', + upArrow: 'Pil op', + rightArrow: 'Højre pil', + downArrow: 'Pil ned', + insert: 'Insert', + leftWindowKey: 'Venstre Windows tast', + rightWindowKey: 'Højre Windows tast', + selectKey: 'Select-knap', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Gange', + add: 'Plus', + subtract: 'Minus', + decimalPoint: 'Komma', + divide: 'Divider', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semikolon', + equalSign: 'Lighedstegn', + comma: 'Komma', + dash: 'Bindestreg', + period: 'Punktum', + forwardSlash: 'Skråstreg', + graveAccent: 'Accent grave', + openBracket: 'Start klamme', + backSlash: 'Omvendt skråstreg', + closeBracket: 'Slut klamme', + singleQuote: 'Enkelt citationstegn' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/de-ch.js b/sources/plugins/a11yhelp/dialogs/lang/de-ch.js new file mode 100644 index 0000000..8d26d73 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/de-ch.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'de-ch', { + title: 'Barrierefreiheitinformationen', + contents: 'Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.', + legend: [ + { + name: 'Allgemein', + items: [ + { + name: 'Editorwerkzeugleiste', + legend: 'Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.' + }, + + { + name: 'Editordialog', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor-Kontextmenü', + legend: 'Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.' + }, + + { + name: 'Editor-Listenbox', + legend: 'Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.' + }, + + { + name: 'Editor-Elementpfadleiste', + legend: 'Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.' + } + ] + }, + { + name: 'Befehle', + items: [ + { + name: 'Rückgängig-Befehl', + legend: 'Drücken Sie ${undo}' + }, + { + name: 'Wiederherstellen-Befehl', + legend: 'Drücken Sie ${redo}' + }, + { + name: 'Fettschrift-Befehl', + legend: 'Drücken Sie ${bold}' + }, + { + name: 'Kursiv-Befehl', + legend: 'Drücken Sie ${italic}' + }, + { + name: 'Unterstreichen-Befehl', + legend: 'Drücken Sie ${underline}' + }, + { + name: 'Link-Befehl', + legend: 'Drücken Sie ${link}' + }, + { + name: 'Werkzeugleiste einklappen-Befehl', + legend: 'Drücken Sie ${toolbarCollapse}' + }, + { + name: 'Zugang bisheriger Fokussierung Raumbefehl ', + legend: 'Drücken Sie ${accessPreviousSpace} auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. ' + }, + { + name: 'Zugang nächster Schwerpunkt Raumbefehl ', + legend: 'Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. ' + }, + { + name: 'Eingabehilfen', + legend: 'Drücken Sie ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Feststell', + escape: 'Escape', + pageUp: 'Bild auf', + pageDown: 'Bild ab', + leftArrow: 'Linke Pfeiltaste', + upArrow: 'Obere Pfeiltaste', + rightArrow: 'Rechte Pfeiltaste', + downArrow: 'Untere Pfeiltaste', + insert: 'Einfügen', + leftWindowKey: 'Linke Windowstaste', + rightWindowKey: 'Rechte Windowstaste', + selectKey: 'Taste auswählen', + numpad0: 'Ziffernblock 0', + numpad1: 'Ziffernblock 1', + numpad2: 'Ziffernblock 2', + numpad3: 'Ziffernblock 3', + numpad4: 'Ziffernblock 4', + numpad5: 'Ziffernblock 5', + numpad6: 'Ziffernblock 6', + numpad7: 'Ziffernblock 7', + numpad8: 'Ziffernblock 8', + numpad9: 'Ziffernblock 9', + multiply: 'Multiplizieren', + add: 'Addieren', + subtract: 'Subtrahieren', + decimalPoint: 'Punkt', + divide: 'Dividieren', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Ziffernblock feststellen', + scrollLock: 'Rollen', + semiColon: 'Semikolon', + equalSign: 'Gleichheitszeichen', + comma: 'Komma', + dash: 'Bindestrich', + period: 'Punkt', + forwardSlash: 'Schrägstrich', + graveAccent: 'Gravis', + openBracket: 'Öffnende eckige Klammer', + backSlash: 'Rückwärtsgewandter Schrägstrich', + closeBracket: 'Schliessende eckige Klammer', + singleQuote: 'Einfaches Anführungszeichen' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/de.js b/sources/plugins/a11yhelp/dialogs/lang/de.js new file mode 100644 index 0000000..c74be37 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/de.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'de', { + title: 'Barrierefreiheitinformationen', + contents: 'Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.', + legend: [ + { + name: 'Allgemein', + items: [ + { + name: 'Editorwerkzeugleiste', + legend: 'Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.' + }, + + { + name: 'Editordialog', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor-Kontextmenü', + legend: 'Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.' + }, + + { + name: 'Editor-Listenbox', + legend: 'Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.' + }, + + { + name: 'Editor-Elementpfadleiste', + legend: 'Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.' + } + ] + }, + { + name: 'Befehle', + items: [ + { + name: 'Rückgängig-Befehl', + legend: 'Drücken Sie ${undo}' + }, + { + name: 'Wiederherstellen-Befehl', + legend: 'Drücken Sie ${redo}' + }, + { + name: 'Fettschrift-Befehl', + legend: 'Drücken Sie ${bold}' + }, + { + name: 'Kursiv-Befehl', + legend: 'Drücken Sie ${italic}' + }, + { + name: 'Unterstreichen-Befehl', + legend: 'Drücken Sie ${underline}' + }, + { + name: 'Link-Befehl', + legend: 'Drücken Sie ${link}' + }, + { + name: 'Werkzeugleiste einklappen-Befehl', + legend: 'Drücken Sie ${toolbarCollapse}' + }, + { + name: 'Zugang bisheriger Fokussierung Raumbefehl ', + legend: 'Drücken Sie ${accessPreviousSpace} auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. ' + }, + { + name: 'Zugang nächster Schwerpunkt Raumbefehl ', + legend: 'Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. ' + }, + { + name: 'Eingabehilfen', + legend: 'Drücken Sie ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Feststell', + escape: 'Escape', + pageUp: 'Bild auf', + pageDown: 'Bild ab', + leftArrow: 'Linke Pfeiltaste', + upArrow: 'Obere Pfeiltaste', + rightArrow: 'Rechte Pfeiltaste', + downArrow: 'Untere Pfeiltaste', + insert: 'Einfügen', + leftWindowKey: 'Linke Windowstaste', + rightWindowKey: 'Rechte Windowstaste', + selectKey: 'Taste auswählen', + numpad0: 'Ziffernblock 0', + numpad1: 'Ziffernblock 1', + numpad2: 'Ziffernblock 2', + numpad3: 'Ziffernblock 3', + numpad4: 'Ziffernblock 4', + numpad5: 'Ziffernblock 5', + numpad6: 'Ziffernblock 6', + numpad7: 'Ziffernblock 7', + numpad8: 'Ziffernblock 8', + numpad9: 'Ziffernblock 9', + multiply: 'Multiplizieren', + add: 'Addieren', + subtract: 'Subtrahieren', + decimalPoint: 'Punkt', + divide: 'Dividieren', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Ziffernblock feststellen', + scrollLock: 'Rollen', + semiColon: 'Semikolon', + equalSign: 'Gleichheitszeichen', + comma: 'Komma', + dash: 'Bindestrich', + period: 'Punkt', + forwardSlash: 'Schrägstrich', + graveAccent: 'Gravis', + openBracket: 'Öffnende eckige Klammer', + backSlash: 'Rückwärtsgewandter Schrägstrich', + closeBracket: 'Schließende eckige Klammer', + singleQuote: 'Einfaches Anführungszeichen' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/el.js b/sources/plugins/a11yhelp/dialogs/lang/el.js new file mode 100644 index 0000000..11febeb --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/el.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'el', { + title: 'Οδηγίες Προσβασιμότητας', + contents: 'Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.', + legend: [ + { + name: 'Γενικά', + items: [ + { + name: 'Εργαλειοθήκη Επεξεργαστή', + legend: 'Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και SHIFT+TAB. Μετακινηθείτε ανάμεσα στα κουμπιά εργαλείων με το ΔΕΞΙ ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου.' + }, + + { + name: 'Παράθυρο Διαλόγου Επεξεργαστή', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Αναδυόμενο Μενού Επεξεργαστή', + legend: 'Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με το ESC ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC.' + }, + + { + name: 'Κουτί Λίστας Επεξεργαστών', + legend: 'Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας.' + }, + + { + name: 'Μπάρα Διαδρομών Στοιχείων Επεξεργαστή', + legend: 'Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή.' + } + ] + }, + { + name: 'Εντολές', + items: [ + { + name: 'Εντολή αναίρεσης', + legend: 'Πατήστε ${undo}' + }, + { + name: 'Εντολή επανάληψης', + legend: 'Πατήστε ${redo}' + }, + { + name: 'Εντολή έντονης γραφής', + legend: 'Πατήστε ${bold}' + }, + { + name: 'Εντολή πλάγιας γραφής', + legend: 'Πατήστε ${italic}' + }, + { + name: 'Εντολή υπογράμμισης', + legend: 'Πατήστε ${underline}' + }, + { + name: 'Εντολή συνδέσμου', + legend: 'Πατήστε ${link}' + }, + { + name: 'Εντολή Σύμπτηξης Εργαλειοθήκης', + legend: 'Πατήστε ${toolbarCollapse}' + }, + { + name: 'Πρόσβαση στην προηγούμενη εντολή του χώρου εστίασης ', + legend: 'Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. ' + }, + { + name: 'Πρόσβαση στην επόμενη εντολή του χώρου εστίασης', + legend: 'Πατήστε ${accessNextSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. ' + }, + { + name: 'Βοήθεια Προσβασιμότητας', + legend: 'Πατήστε ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Αριστερό Βέλος', + upArrow: 'Πάνω Βέλος', + rightArrow: 'Δεξί Βέλος', + downArrow: 'Κάτω Βέλος', + insert: 'Insert ', + leftWindowKey: 'Αριστερό Πλήκτρο Windows', + rightWindowKey: 'Δεξί Πλήκτρο Windows', + selectKey: 'Πλήκτρο Select', + numpad0: 'Αριθμητικό πληκτρολόγιο 0', + numpad1: 'Αριθμητικό Πληκτρολόγιο 1', + numpad2: 'Αριθμητικό πληκτρολόγιο 2', + numpad3: 'Αριθμητικό πληκτρολόγιο 3', + numpad4: 'Αριθμητικό πληκτρολόγιο 4', + numpad5: 'Αριθμητικό πληκτρολόγιο 5', + numpad6: 'Αριθμητικό πληκτρολόγιο 6', + numpad7: 'Αριθμητικό πληκτρολόγιο 7', + numpad8: 'Αριθμητικό πληκτρολόγιο 8', + numpad9: 'Αριθμητικό πληκτρολόγιο 9', + multiply: 'Πολλαπλασιασμός', + add: 'Πρόσθεση', + subtract: 'Αφαίρεση', + decimalPoint: 'Υποδιαστολή', + divide: 'Διαίρεση', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: '6', + f7: '7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Ερωτηματικό', + equalSign: 'Σύμβολο Ισότητας', + comma: 'Κόμμα', + dash: 'Παύλα', + period: 'Τελεία', + forwardSlash: 'Κάθετος', + graveAccent: 'Βαρεία', + openBracket: 'Άνοιγμα Παρένθεσης', + backSlash: 'Ανάστροφη Κάθετος', + closeBracket: 'Κλείσιμο Παρένθεσης', + singleQuote: 'Απόστροφος' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/en-gb.js b/sources/plugins/a11yhelp/dialogs/lang/en-gb.js new file mode 100644 index 0000000..98bf636 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/en-gb.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'en-gb', { + title: 'Accessibility Instructions', + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'General', + items: [ + { + name: 'Editor Toolbar', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', + items: [ + { + name: ' Undo command', + legend: 'Press ${undo}' + }, + { + name: ' Redo command', + legend: 'Press ${redo}' + }, + { + name: ' Bold command', + legend: 'Press ${bold}' + }, + { + name: ' Italic command', + legend: 'Press ${italic}' + }, + { + name: ' Underline command', + legend: 'Press ${underline}' + }, + { + name: ' Link command', + legend: 'Press ${link}' + }, + { + name: ' Toolbar Collapse command', + legend: 'Press ${toolbarCollapse}' + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', + legend: 'Press ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Left Arrow', + upArrow: 'Up Arrow', + rightArrow: 'Right Arrow', + downArrow: 'Down Arrow', + insert: 'Insert', + leftWindowKey: 'Left Windows key', + rightWindowKey: 'Right Windows key', + selectKey: 'Select key', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Multiply', + add: 'Add', + subtract: 'Subtract', + decimalPoint: 'Decimal Point', + divide: 'Divide', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semicolon', + equalSign: 'Equal Sign', + comma: 'Comma', + dash: 'Dash', + period: 'Period', + forwardSlash: 'Forward Slash', + graveAccent: 'Grave Accent', + openBracket: 'Open Bracket', + backSlash: 'Backslash', + closeBracket: 'Close Bracket', + singleQuote: 'Single Quote' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/en.js b/sources/plugins/a11yhelp/dialogs/lang/en.js new file mode 100644 index 0000000..fee0b4e --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/en.js @@ -0,0 +1,159 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'en', { + title: 'Accessibility Instructions', + contents: 'Help Contents. To close this dialog press ESC.', + legend: [ + { + name: 'General', + items: [ + { + name: 'Editor Toolbar', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. ' + + 'Move to the next and previous toolbar group with TAB and SHIFT+TAB. ' + + 'Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. ' + + 'Press SPACE or ENTER to activate the toolbar button.' + }, + + { + name: 'Editor Dialog', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. ' + + 'When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. ' + + 'With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' + }, + + { + name: 'Editor Context Menu', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. ' + + 'Then move to next menu option with TAB or DOWN ARROW. ' + + 'Move to previous option with SHIFT+TAB or UP ARROW. ' + + 'Press SPACE or ENTER to select the menu option. ' + + 'Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. ' + + 'Go back to parent menu item with ESC or LEFT ARROW. ' + + 'Close context menu with ESC.' + }, + + { + name: 'Editor List Box', + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. ' + + 'Move to previous list item with SHIFT+TAB or UP ARROW. ' + + 'Press SPACE or ENTER to select the list option. ' + + 'Press ESC to close the list-box.' + }, + + { + name: 'Editor Element Path Bar', + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. ' + + 'Move to next element button with TAB or RIGHT ARROW. ' + + 'Move to previous button with SHIFT+TAB or LEFT ARROW. ' + + 'Press SPACE or ENTER to select the element in editor.' + } + ] + }, + { + name: 'Commands', + items: [ + { + name: ' Undo command', + legend: 'Press ${undo}' + }, + { + name: ' Redo command', + legend: 'Press ${redo}' + }, + { + name: ' Bold command', + legend: 'Press ${bold}' + }, + { + name: ' Italic command', + legend: 'Press ${italic}' + }, + { + name: ' Underline command', + legend: 'Press ${underline}' + }, + { + name: ' Link command', + legend: 'Press ${link}' + }, + { + name: ' Toolbar Collapse command', + legend: 'Press ${toolbarCollapse}' + }, + { + name: ' Access previous focus space command', + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, ' + + 'for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' + }, + { + name: ' Access next focus space command', + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, ' + + 'for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' + }, + { + name: ' Accessibility Help', + legend: 'Press ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Left Arrow', + upArrow: 'Up Arrow', + rightArrow: 'Right Arrow', + downArrow: 'Down Arrow', + insert: 'Insert', + leftWindowKey: 'Left Windows key', + rightWindowKey: 'Right Windows key', + selectKey: 'Select key', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Multiply', + add: 'Add', + subtract: 'Subtract', + decimalPoint: 'Decimal Point', + divide: 'Divide', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semicolon', + equalSign: 'Equal Sign', + comma: 'Comma', + dash: 'Dash', + period: 'Period', + forwardSlash: 'Forward Slash', + graveAccent: 'Grave Accent', + openBracket: 'Open Bracket', + backSlash: 'Backslash', + closeBracket: 'Close Bracket', + singleQuote: 'Single Quote' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/eo.js b/sources/plugins/a11yhelp/dialogs/lang/eo.js new file mode 100644 index 0000000..c2bc106 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/eo.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'eo', { + title: 'Uzindikoj pri atingeblo', + contents: 'Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.', + legend: [ + { + name: 'Ĝeneralaĵoj', + items: [ + { + name: 'Ilbreto de la redaktilo', + legend: 'Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA+TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon.' + }, + + { + name: 'Redaktildialogo', + legend: + 'En dialogo, premu la TABAN klavon por navigi al la sekva dialogelemento, premu la MAJUSKLIGAN+TABAN klavon por iri al la antaŭa dialogelemento, premu la ENEN klavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Kiam dialogo havas multajn langetojn, eblas atingi la langetliston aŭ per ALT+F10 aŭ per la TABA klavo kiel parton de la dialoga taba ordo. En langetlisto, moviĝu al la sekva kaj antaŭa langeto per la klavoj SAGO DEKSTREN KAJ MALDEKSTREN respektive.' + }, + + { + name: 'Kunteksta menuo de la redaktilo', + legend: 'Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo.' + }, + + { + name: 'Fallisto de la redaktilo', + legend: 'En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon.' + }, + + { + name: 'Breto indikanta la vojon al la redaktilelementoj', + legend: 'Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo.' + } + ] + }, + { + name: 'Komandoj', + items: [ + { + name: 'Komando malfari', + legend: 'Premu ${undo}' + }, + { + name: 'Komando refari', + legend: 'Premu ${redo}' + }, + { + name: 'Komando grasa', + legend: 'Premu ${bold}' + }, + { + name: 'Komando kursiva', + legend: 'Premu ${italic}' + }, + { + name: 'Komando substreki', + legend: 'Premu ${underline}' + }, + { + name: 'Komando ligilo', + legend: 'Premu ${link}' + }, + { + name: 'Komando faldi la ilbreton', + legend: 'Premu ${toolbarCollapse}' + }, + { + name: 'Komando por atingi la antaŭan fokusan spacon', + legend: 'Press ${accessPreviousSpace} por atingi la plej proksiman neatingeblan fokusan spacon antaŭ la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinaĵon por atingi malproksimajn fokusajn spacojn.' + }, + { + name: 'Komando por atingi la sekvan fokusan spacon', + legend: 'Press ${accessNextSpace} por atingi la plej proksiman neatingeblan fokusan spacon post la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinajôn por atingi malproksimajn fokusajn spacojn' + }, + { + name: 'Helpilo pri atingeblo', + legend: 'Premu ${a11yHelp}' + } + ] + } + ], + tab: 'Tabo', + pause: 'Paŭzo', + capslock: 'Majuskla baskulo', + escape: 'Eskapa klavo', + pageUp: 'Antaŭa Paĝo', + pageDown: 'Sekva Paĝo', + leftArrow: 'Sago Maldekstren', + upArrow: 'Sago Supren', + rightArrow: 'Sago Dekstren', + downArrow: 'Sago Suben', + insert: 'Enmeti', + leftWindowKey: 'Maldekstra Windows-klavo', + rightWindowKey: 'Dekstra Windows-klavo', + selectKey: 'Selektklavo', + numpad0: 'Nombra Klavaro 0', + numpad1: 'Nombra Klavaro 1', + numpad2: 'Nombra Klavaro 2', + numpad3: 'Nombra Klavaro 3', + numpad4: 'Nombra Klavaro 4', + numpad5: 'Nombra Klavaro 5', + numpad6: 'Nombra Klavaro 6', + numpad7: 'Nombra Klavaro 7', + numpad8: 'Nombra Klavaro 8', + numpad9: 'Nombra Klavaro 9', + multiply: 'Obligi', + add: 'Almeti', + subtract: 'Subtrahi', + decimalPoint: 'Dekuma Punkto', + divide: 'Dividi', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Nombra Baskulo', + scrollLock: 'Ruluma Baskulo', + semiColon: 'Punktokomo', + equalSign: 'Egalsigno', + comma: 'Komo', + dash: 'Haltostreko', + period: 'Punkto', + forwardSlash: 'Oblikvo', + graveAccent: 'Malakuto', + openBracket: 'Malferma Krampo', + backSlash: 'Retroklino', + closeBracket: 'Ferma Krampo', + singleQuote: 'Citilo' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/es.js b/sources/plugins/a11yhelp/dialogs/lang/es.js new file mode 100644 index 0000000..b1eaa20 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/es.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'es', { + title: 'Instrucciones de accesibilidad', + contents: 'Ayuda. Para cerrar presione ESC.', + legend: [ + { + name: 'General', + items: [ + { + name: 'Barra de herramientas del editor', + legend: 'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY+TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona "espacio" o "intro" para activar la herramienta.' + }, + + { + name: 'Editor de diálogo', + legend: + 'Dentro del diálogo, presione TAB para navegar a los siguientes elementos de diálogo, presione SHIFT+TAB para moverse a los anteriores elementos de diálogo, presione ENTER para enviar el diálogo, presiona ESC para cancelar el diálogo. Cuando el diálogo tiene multiples pestañas, la lista de pestañas puede ser abarcada con ALT + F10 or con TAB como parte del orden de pestañas del diálogo. ECon la pestaña enfocada, puede moverse a la siguiente o anterior pestaña con las FLECHAS IZQUIRDA y DERECHA respectivamente.' + }, + + { + name: 'Editor del menú contextual', + legend: 'Presiona ${contextMenu} o TECLA MENÚ para abrir el menú contextual. Entonces muévete a la siguiente opción del menú con TAB o FLECHA ABAJO. Muévete a la opción previa con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para seleccionar la opción del menú. Abre el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Regresa al elemento padre del menú con ESC o FLECHA IZQUIERDA. Cierra el menú contextual con ESC.' + }, + + { + name: 'Lista del Editor', + legend: 'Dentro de una lista, te mueves al siguiente elemento de la lista con TAB o FLECHA ABAJO. Te mueves al elemento previo de la lista con SHIFT+TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para elegir la opción de la lista. Presiona ESC para cerrar la lista.' + }, + + { + name: 'Barra de Ruta del Elemento en el Editor', + legend: 'Presiona ${elementsPathFocus} para navegar a los elementos de la barra de ruta. Te mueves al siguiente elemento botón con TAB o FLECHA DERECHA. Te mueves al botón previo con SHIFT+TAB o FLECHA IZQUIERDA. Presiona ESPACIO o ENTER para seleccionar el elemento en el editor.' + } + ] + }, + { + name: 'Comandos', + items: [ + { + name: 'Comando deshacer', + legend: 'Presiona ${undo}' + }, + { + name: 'Comando rehacer', + legend: 'Presiona ${redo}' + }, + { + name: 'Comando negrita', + legend: 'Presiona ${bold}' + }, + { + name: 'Comando itálica', + legend: 'Presiona ${italic}' + }, + { + name: 'Comando subrayar', + legend: 'Presiona ${underline}' + }, + { + name: 'Comando liga', + legend: 'Presiona ${liga}' + }, + { + name: 'Comando colapsar barra de herramientas', + legend: 'Presiona ${toolbarCollapse}' + }, + { + name: 'Comando accesar el anterior espacio de foco', + legend: 'Presiona ${accessPreviousSpace} para accesar el espacio de foco no disponible más cercano anterior al cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes.' + }, + { + name: 'Comando accesar el siguiente spacio de foco', + legend: 'Presiona ${accessNextSpace} para accesar el espacio de foco no disponible más cercano después del cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes.' + }, + { + name: 'Ayuda de Accesibilidad', + legend: 'Presiona ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulador', + pause: 'Pausa', + capslock: 'Bloq. Mayús.', + escape: 'Escape', + pageUp: 'Regresar Página', + pageDown: 'Avanzar Página', + leftArrow: 'Flecha Izquierda', + upArrow: 'Flecha Arriba', + rightArrow: 'Flecha Derecha', + downArrow: 'Flecha Abajo', + insert: 'Insertar', + leftWindowKey: 'Tecla Windows Izquierda', + rightWindowKey: 'Tecla Windows Derecha', + selectKey: 'Tecla de Selección', + numpad0: 'Tecla 0 del teclado numérico', + numpad1: 'Tecla 1 del teclado numérico', + numpad2: 'Tecla 2 del teclado numérico', + numpad3: 'Tecla 3 del teclado numérico', + numpad4: 'Tecla 4 del teclado numérico', + numpad5: 'Tecla 5 del teclado numérico', + numpad6: 'Tecla 6 del teclado numérico', + numpad7: 'Tecla 7 del teclado numérico', + numpad8: 'Tecla 8 del teclado numérico', + numpad9: 'Tecla 9 del teclado numérico', + multiply: 'Multiplicar', + add: 'Sumar', + subtract: 'Restar', + decimalPoint: 'Punto Decimal', + divide: 'Dividir', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Punto y coma', + equalSign: 'Signo de Igual', + comma: 'Coma', + dash: 'Guión', + period: 'Punto', + forwardSlash: 'Diagonal', + graveAccent: 'Acento Grave', + openBracket: 'Abrir llave', + backSlash: 'Diagonal Invertida', + closeBracket: 'Cerrar llave', + singleQuote: 'Comillas simples' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/et.js b/sources/plugins/a11yhelp/dialogs/lang/et.js new file mode 100644 index 0000000..0146089 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/et.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'et', { + title: 'Accessibility Instructions', // MISSING + contents: 'Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.', + legend: [ + { + name: 'Üldine', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/eu.js b/sources/plugins/a11yhelp/dialogs/lang/eu.js new file mode 100644 index 0000000..b53748f --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/eu.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'eu', { + title: 'Erabilerraztasunaren argibideak', + contents: 'Laguntzaren edukiak. Elkarrizketa-koadro hau ixteko sakatu ESC.', + legend: [ + { + name: 'Orokorra', + items: [ + { + name: 'Editorearen tresna-barra', + legend: 'Sakatu ${toolbarFocus} tresna-barrara nabigatzeko. Tresna-barrako aurreko eta hurrengo taldera joateko erabili TAB eta MAIUS+TAB. Tresna-barrako aurreko eta hurrengo botoira joateko erabili ESKUIN-GEZIA eta EZKER-GEZIA. Sakatu ZURIUNEA edo SARTU tresna-barrako botoia aktibatzeko.' + }, + + { + name: 'Editorearen elkarrizketa-koadroa', + legend: + 'Elkarrizketa-koadro baten barruan sakatu TAB hurrengo elementura nabigatzeko, sakatu MAIUS+TAB aurreko elementura joateko, sakatu SARTU elkarrizketa-koadroa bidaltzeko eta sakatu ESC uzteko. Elkarrizketa-koadro batek hainbat fitxa dituenean, ALT+F10 erabiliz irits daiteke fitxen zerrendara, edo TAB erabiliz. Fokoa fitxen zerrendak duenean, aurreko eta hurrengo fitxetara joateko erabili EZKER-GEZIA eta ESKUIN-GEZIA.' + }, + + { + name: 'Editorearen testuinguru-menua', + legend: 'Sakatu ${contextMenu} edo APLIKAZIO TEKLA testuinguru-menua irekitzeko. Menuko hurrengo aukerara joateko erabili TAB edo BEHERA GEZIA. Aurreko aukerara nabigatzeko erabili MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU menuko aukera hautatzeko. Ireki uneko aukeraren azpi-menua ZURIUNEA edo SARTU edo ESKUIN-GEZIA erabiliz. Menuko aukera gurasora itzultzeko erabili ESC edo EZKER-GEZIA. Testuinguru-menua ixteko sakatu ESC.' + }, + + { + name: 'Editorearen zerrenda-koadroa', + legend: 'Zerrenda-koadro baten barruan, zerrendako hurrengo elementura joateko erabili TAB edo BEHERA GEZIA. Zerrendako aurreko elementura nabigatzeko MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU zerrendako aukera hautatzeko. Sakatu ESC zerrenda-koadroa ixteko.' + }, + + { + name: 'Editorearen elementuaren bide-barra', + legend: 'Sakatu ${elementsPathFocus} elementuaren bide-barrara nabigatzeko. Hurrengo elementuaren botoira joateko erabili TAB edo ESKUIN-GEZIA. Aurreko botoira joateko aldiz erabili MAIUS+TAB edo EZKER-GEZIA. Elementua editorean hautatzeko sakatu ZURIUNEA edo SARTU.' + } + ] + }, + { + name: 'Komandoak', + items: [ + { + name: 'Desegin komandoa', + legend: 'Sakatu ${undo}' + }, + { + name: 'Berregin komandoa', + legend: 'Sakatu ${redo}' + }, + { + name: 'Lodia komandoa', + legend: 'Sakatu ${bold}' + }, + { + name: 'Etzana komandoa', + legend: 'Sakatu ${italic}' + }, + { + name: 'Azpimarratu komandoa', + legend: 'Sakatu ${underline}' + }, + { + name: 'Esteka komandoa', + legend: 'Sakatu ${link}' + }, + { + name: 'Tolestu tresna-barra komandoa', + legend: 'Sakatu ${toolbarCollapse}' + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: 'Erabilerraztasunaren laguntza', + legend: 'Sakatu ${a11yHelp}' + } + ] + } + ], + tab: 'Tabuladorea', + pause: 'Pausatu', + capslock: 'Blok Maius', + escape: 'Ihes', + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Ezker-gezia', + upArrow: 'Gora gezia', + rightArrow: 'Eskuin-gezia', + downArrow: 'Behera gezia', + insert: 'Txertatu', + leftWindowKey: 'Ezkerreko Windows tekla', + rightWindowKey: 'Eskuineko Windows tekla', + selectKey: 'Hautatu tekla', + numpad0: 'Zenbakizko teklatua 0', + numpad1: 'Zenbakizko teklatua 1', + numpad2: 'Zenbakizko teklatua 2', + numpad3: 'Zenbakizko teklatua 3', + numpad4: 'Zenbakizko teklatua 4', + numpad5: 'Zenbakizko teklatua 5', + numpad6: 'Zenbakizko teklatua 6', + numpad7: 'Zenbakizko teklatua 7', + numpad8: 'Zenbakizko teklatua 8', + numpad9: 'Zenbakizko teklatua 9', + multiply: 'Biderkatu', + add: 'Gehitu', + subtract: 'Kendu', + decimalPoint: 'Koma hamartarra', + divide: 'Zatitu', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Blok Zenb', + scrollLock: 'Blok Korr', + semiColon: 'Puntu eta koma', + equalSign: 'Berdin zeinua', + comma: 'Koma', + dash: 'Marratxoa', + period: 'Puntua', + forwardSlash: 'Barra', + graveAccent: 'Azentu kamutsa', + openBracket: 'Parentesia ireki', + backSlash: 'Alderantzizko barra', + closeBracket: 'Itxi parentesia', + singleQuote: 'Komatxo bakuna' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/fa.js b/sources/plugins/a11yhelp/dialogs/lang/fa.js new file mode 100644 index 0000000..88072f0 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/fa.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'fa', { + title: 'دستورالعمل‌های دسترسی', + contents: 'راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.', + legend: [ + { + name: 'عمومی', + items: [ + { + name: 'نوار ابزار ویرایشگر', + legend: '${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shift+Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهت‌نمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید.' + }, + + { + name: 'پنجره محاورهای ویرایشگر', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'منوی متنی ویرایشگر', + legend: '${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc.' + }, + + { + name: 'جعبه فهرست ویرایشگر', + legend: 'در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید.' + }, + + { + name: 'ویرایشگر عنصر نوار راه', + legend: 'برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر.' + } + ] + }, + { + name: 'فرمان‌ها', + items: [ + { + name: 'بازگشت به آخرین فرمان', + legend: 'فشردن ${undo}' + }, + { + name: 'انجام مجدد فرمان', + legend: 'فشردن ${redo}' + }, + { + name: 'فرمان درشت کردن متن', + legend: 'فشردن ${bold}' + }, + { + name: 'فرمان کج کردن متن', + legend: 'فشردن ${italic}' + }, + { + name: 'فرمان زیرخطدار کردن متن', + legend: 'فشردن ${underline}' + }, + { + name: 'فرمان پیوند دادن', + legend: 'فشردن ${link}' + }, + { + name: 'بستن نوار ابزار فرمان', + legend: 'فشردن ${toolbarCollapse}' + }, + { + name: 'دسترسی به فرمان محل تمرکز قبلی', + legend: 'فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور.' + }, + { + name: 'دسترسی به فضای دستور بعدی', + legend: 'برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال: دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید.' + }, + { + name: 'راهنمای دسترسی', + legend: 'فشردن ${a11yHelp}' + } + ] + } + ], + tab: 'برگه', + pause: 'توقف', + capslock: 'Caps Lock', + escape: 'گریز', + pageUp: 'صفحه به بالا', + pageDown: 'صفحه به پایین', + leftArrow: 'پیکان چپ', + upArrow: 'پیکان بالا', + rightArrow: 'پیکان راست', + downArrow: 'پیکان پایین', + insert: 'ورود', + leftWindowKey: 'کلید چپ ویندوز', + rightWindowKey: 'کلید راست ویندوز', + selectKey: 'انتخاب کلید', + numpad0: 'کلید شماره 0', + numpad1: 'کلید شماره 1', + numpad2: 'کلید شماره 2', + numpad3: 'کلید شماره 3', + numpad4: 'کلید شماره 4', + numpad5: 'کلید شماره 5', + numpad6: 'کلید شماره 6', + numpad7: 'کلید شماره 7', + numpad8: 'کلید شماره 8', + numpad9: 'کلید شماره 9', + multiply: 'ضرب', + add: 'افزودن', + subtract: 'تفریق', + decimalPoint: 'نقطه‌ی اعشار', + divide: 'جدا کردن', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semicolon', + equalSign: 'علامت تساوی', + comma: 'کاما', + dash: 'خط تیره', + period: 'دوره', + forwardSlash: 'Forward Slash', + graveAccent: 'Grave Accent', + openBracket: 'Open Bracket', + backSlash: 'Backslash', + closeBracket: 'Close Bracket', + singleQuote: 'Single Quote' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/fi.js b/sources/plugins/a11yhelp/dialogs/lang/fi.js new file mode 100644 index 0000000..093d409 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/fi.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'fi', { + title: 'Saavutettavuus ohjeet', + contents: 'Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.', + legend: [ + { + name: 'Yleinen', + items: [ + { + name: 'Editorin työkalupalkki', + legend: 'Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT+TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen.' + }, + + { + name: 'Editorin dialogi', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editorin oheisvalikko', + legend: 'Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella.' + }, + + { + name: 'Editorin listalaatikko', + legend: 'Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon.' + }, + + { + name: 'Editorin elementtipolun palkki', + legend: 'Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa.' + } + ] + }, + { + name: 'Komennot', + items: [ + { + name: 'Peruuta komento', + legend: 'Paina ${undo}' + }, + { + name: 'Tee uudelleen komento', + legend: 'Paina ${redo}' + }, + { + name: 'Lihavoi komento', + legend: 'Paina ${bold}' + }, + { + name: 'Kursivoi komento', + legend: 'Paina ${italic}' + }, + { + name: 'Alleviivaa komento', + legend: 'Paina ${underline}' + }, + { + name: 'Linkki komento', + legend: 'Paina ${link}' + }, + { + name: 'Pienennä työkalupalkki komento', + legend: 'Paina ${toolbarCollapse}' + }, + { + name: 'Siirry aiempaan fokustilaan komento', + legend: 'Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin edellä olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin.' + }, + { + name: 'Siirry seuraavaan fokustilaan komento', + legend: 'Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin jälkeen olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin.' + }, + { + name: 'Saavutettavuus ohjeet', + legend: 'Paina ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numeronäppäimistö 0', + numpad1: 'Numeronäppäimistö 1', + numpad2: 'Numeronäppäimistö 2', + numpad3: 'Numeronäppäimistö 3', + numpad4: 'Numeronäppäimistö 4', + numpad5: 'Numeronäppäimistö 5', + numpad6: 'Numeronäppäimistö 6', + numpad7: 'Numeronäppäimistö 7', + numpad8: 'Numeronäppäimistö 8', + numpad9: 'Numeronäppäimistö 9', + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Puolipiste', + equalSign: 'Equal Sign', // MISSING + comma: 'Pilkku', + dash: 'Dash', // MISSING + period: 'Piste', + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/fo.js b/sources/plugins/a11yhelp/dialogs/lang/fo.js new file mode 100644 index 0000000..efce724 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/fo.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'fo', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'General', // MISSING + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Falda', + add: 'Pluss', + subtract: 'Frádráttar', + decimalPoint: 'Decimal Point', // MISSING + divide: 'Býta', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semikolon', + equalSign: 'Javnatekn', + comma: 'Komma', + dash: 'Dash', // MISSING + period: 'Punktum', + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/fr-ca.js b/sources/plugins/a11yhelp/dialogs/lang/fr-ca.js new file mode 100644 index 0000000..c87c586 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/fr-ca.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'fr-ca', { + title: 'Instructions d\'accessibilité', + contents: 'Contenu de l\'aide. Pour fermer cette fenêtre, appuyez sur ESC.', + legend: [ + { + name: 'Général', + items: [ + { + name: 'Barre d\'outil de l\'éditeur', + legend: 'Appuyer sur ${toolbarFocus} pour accéder à la barre d\'outils. Se déplacer vers les groupes suivant ou précédent de la barre d\'outil avec les touches TAB et SHIFT+TAB. Se déplacer vers les boutons suivant ou précédent de la barre d\'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d\'espace ou la touche ENTRER pour activer le bouton de barre d\'outils.' + }, + + { + name: 'Dialogue de l\'éditeur', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Menu contextuel de l\'éditeur', + legend: 'Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l\'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l\'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D\'ESPACE ou la touche ENTREE pour sélectionner l\'option du menu. Oovrir le sous-menu de l\'option courante avec la BARRE D\'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l\'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC.' + }, + + { + name: 'Menu déroulant de l\'éditeur', + legend: 'A l\'intérieur d\'une liste en menu déroulant, se déplacer vers l\'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l\'élément précédent de la liste avec les touches SHIFT+TAB ou FLECHE HAUT. Appuyer sur la BARRE D\'ESPACE ou sur ENTREE pour sélectionner l\'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant.' + }, + + { + name: 'Barre d\'emplacement des éléments de l\'éditeur', + legend: 'Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d\'emplacement des éléments de léditeur. Se déplacer vers le bouton d\'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d\'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D\'ESPACE ou sur ENTREE pour sélectionner l\'élément dans l\'éditeur.' + } + ] + }, + { + name: 'Commandes', + items: [ + { + name: 'Annuler', + legend: 'Appuyer sur ${undo}' + }, + { + name: 'Refaire', + legend: 'Appuyer sur ${redo}' + }, + { + name: 'Gras', + legend: 'Appuyer sur ${bold}' + }, + { + name: 'Italique', + legend: 'Appuyer sur ${italic}' + }, + { + name: 'Souligné', + legend: 'Appuyer sur ${underline}' + }, + { + name: 'Lien', + legend: 'Appuyer sur ${link}' + }, + { + name: 'Enrouler la barre d\'outils', + legend: 'Appuyer sur ${toolbarCollapse}' + }, + { + name: 'Accéder à l\'objet de focus précédent', + legend: 'Appuyer ${accessPreviousSpace} pour accéder au prochain espace disponible avant le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d\'espaces distantes.' + }, + { + name: 'Accéder au prochain objet de focus', + legend: 'Appuyer ${accessNextSpace} pour accéder au prochain espace disponible après le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d\'espaces distantes.' + }, + { + name: 'Aide d\'accessibilité', + legend: 'Appuyer sur ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/fr.js b/sources/plugins/a11yhelp/dialogs/lang/fr.js new file mode 100644 index 0000000..9727639 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/fr.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'fr', { + title: 'Instructions d\'accessibilité', + contents: 'Contenu de l\'aide. Pour fermer cette fenêtre, appuyez sur la touche Échap.', + legend: [ + { + name: 'Général', + items: [ + { + name: 'Barre d\'outils de l\'éditeur', + legend: 'Appuyer sur ${toolbarFocus} pour accéder à la barre d\'outils. Se déplacer vers le groupe suivant ou précédent de la barre d\'outils avec les touches Tab et Maj+Tab. Se déplacer vers le bouton suivant ou précédent de la barre d\'outils avec les touches Flèche droite et Flèche gauche. Appuyer sur la barre d\'espace ou la touche Entrée pour activer le bouton de barre d\'outils.' + }, + + { + name: 'Fenêtre de l\'éditeur', + legend: + 'Dans une boîte de dialogue, appuyer sur Tab pour passer à l\'élément suivant, appuyer sur Maj+Tab pour passer à l\'élément précédent, appuyer sur Entrée pour valider, appuyer sur Échap pour annuler. Quand une boîte de dialogue possède des onglets, la liste peut être atteinte avec Alt+F10 ou avec Tab. Dans la liste des onglets, se déplacer vers le suivant et le précédent avec les touches Flèche droite et Flèche gauche respectivement.' + }, + + { + name: 'Menu contextuel de l\'éditeur', + legend: 'Appuyer sur ${contextMenu} ou sur la touche Menu pour ouvrir le menu contextuel. Se déplacer ensuite vers l\'option suivante du menu avec les touches Tab ou Flèche bas. Se déplacer vers l\'option précédente avec les touches Maj+Tab ou Flèche haut. Appuyer sur la barre d\'espace ou la touche Entrée pour sélectionner l\'option du menu. Appuyer sur la barre d\'espace, la touche Entrée ou Flèche droite pour ouvrir le sous-menu de l\'option sélectionnée. Revenir à l\'élément de menu parent avec la touche Échap ou Flèche gauche. Fermer le menu contextuel avec Échap.' + }, + + { + name: 'Zone de liste de l\'éditeur', + legend: 'Dans une liste en menu déroulant, se déplacer vers l\'élément suivant de la liste avec les touches Tab ou Flèche bas. Se déplacer vers l\'élément précédent de la liste avec les touches Maj+Tab ou Flèche haut. Appuyer sur la barre d\'espace ou sur Entrée pour sélectionner l\'option dans la liste. Appuyer sur Échap pour fermer le menu déroulant.' + }, + + { + name: 'Barre du chemin d\'éléments de l\'éditeur', + legend: 'Appuyer sur ${elementsPathFocus} pour naviguer vers la barre du fil d\'Ariane des éléments. Se déplacer vers le bouton de l\'élément suivant avec les touches Tab ou Flèche droite. Se déplacer vers le bouton précédent avec les touches Maj+Tab ou Flèche gauche. Appuyer sur la barre d\'espace ou sur Entrée pour sélectionner l\'élément dans l\'éditeur.' + } + ] + }, + { + name: 'Commandes', + items: [ + { + name: ' Annuler la commande', + legend: 'Appuyer sur ${undo}' + }, + { + name: 'Commande restaurer', + legend: 'Appuyer sur ${redo}' + }, + { + name: ' Commande gras', + legend: 'Appuyer sur ${bold}' + }, + { + name: ' Commande italique', + legend: 'Appuyer sur ${italic}' + }, + { + name: ' Commande souligné', + legend: 'Appuyer sur ${underline}' + }, + { + name: ' Commande lien', + legend: 'Appuyer sur ${link}' + }, + { + name: ' Commande enrouler la barre d\'outils', + legend: 'Appuyer sur ${toolbarCollapse}' + }, + { + name: 'Commande d\'accès à l\'élément sélectionnable précédent', + legend: 'Appuyer sur ${accessNextSpace} pour accéder à l\'élément sélectionnable inatteignable le plus proche avant le curseur, par exemple : deux lignes horizontales adjacentes. Répéter la combinaison de touches pour atteindre les éléments sélectionnables précédents.' + }, + { + name: 'Commande d\'accès à l\'élément sélectionnable suivant', + legend: 'Appuyer sur ${accessNextSpace} pour accéder à l\'élément sélectionnable inatteignable le plus proche après le curseur, par exemple : deux lignes horizontales adjacentes. Répéter la combinaison de touches pour atteindre les éléments sélectionnables suivants.' + }, + { + name: ' Aide sur l\'accessibilité', + legend: 'Appuyer sur ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulation', + pause: 'Pause', + capslock: 'Verr. Maj.', + escape: 'Échap', + pageUp: 'Page supérieure', + pageDown: 'Page suivante', + leftArrow: 'Flèche gauche', + upArrow: 'Flèche haut', + rightArrow: 'Flèche droite', + downArrow: 'Flèche basse', + insert: 'Inser', + leftWindowKey: 'Touche Windows gauche', + rightWindowKey: 'Touche Windows droite', + selectKey: 'Touche Sélectionner', + numpad0: '0 du pavé numérique', + numpad1: '1 du pavé numérique', + numpad2: '2 du pavé numérique', + numpad3: '3 du pavé numérique', + numpad4: '4 du pavé numérique', + numpad5: '5 du pavé numérique', + numpad6: '6 du pavé numérique', + numpad7: '7 du pavé numérique', + numpad8: 'Pavé numérique 8', + numpad9: '9 du pavé numérique', + multiply: 'Multiplier', + add: 'Plus', + subtract: 'Moins', + decimalPoint: 'Point décimal', + divide: 'Diviser', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Verr. Num.', + scrollLock: 'Arrêt défil.', + semiColon: 'Point-virgule', + equalSign: 'Signe égal', + comma: 'Virgule', + dash: 'Tiret', + period: 'Point', + forwardSlash: 'Barre oblique', + graveAccent: 'Accent grave', + openBracket: 'Parenthèse ouvrante', + backSlash: 'Barre oblique inverse', + closeBracket: 'Parenthèse fermante', + singleQuote: 'Apostrophe' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/gl.js b/sources/plugins/a11yhelp/dialogs/lang/gl.js new file mode 100644 index 0000000..4978330 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/gl.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'gl', { + title: 'Instrucións de accesibilidade', + contents: 'Axuda. Para pechar este diálogo prema ESC.', + legend: [ + { + name: 'Xeral', + items: [ + { + name: 'Barra de ferramentas do editor', + legend: 'Prema ${toolbarFocus} para navegar pola barra de ferramentas. Para moverse polos distintos grupos de ferramentas use as teclas TAB e MAIÚS+TAB. Para moverse polas distintas ferramentas use FRECHA DEREITA ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para activar o botón da barra de ferramentas.' + }, + + { + name: 'Editor de diálogo', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor do menú contextual', + legend: 'Prema ${contextMenu} ou a TECLA MENÚ para abrir o menú contextual. A seguir móvase á seguinte opción do menú con TAB ou FRECHA ABAIXO. Móvase á opción anterior con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para seleccionar a opción do menú. Abra o submenú da opción actual con ESPAZO ou INTRO ou FRECHA DEREITA. Regrese ao elemento principal do menú con ESC ou FRECHA ESQUERDA. Peche o menú contextual con ESC.' + }, + + { + name: 'Lista do editor', + legend: 'Dentro dunha lista, móvase ao seguinte elemento da lista con TAB ou FRECHA ABAIXO. Móvase ao elemento anterior da lista con MAIÚS+TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para escoller a opción da lista. Prema ESC para pechar a lista.' + }, + + { + name: 'Barra da ruta ao elemento no editor', + legend: 'Prema ${elementsPathFocus} para navegar ata os elementos da barra de ruta. Móvase ao seguinte elemento botón con TAB ou FRECHA DEREITA. Móvase ao botón anterior con MAIÚS+TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar o elemento no editor.' + } + ] + }, + { + name: 'Ordes', + items: [ + { + name: 'Orde «desfacer»', + legend: 'Prema ${undo}' + }, + { + name: 'Orde «refacer»', + legend: 'Prema ${redo}' + }, + { + name: 'Orde «negra»', + legend: 'Prema ${bold}' + }, + { + name: 'Orde «cursiva»', + legend: 'Prema ${italic}' + }, + { + name: 'Orde «subliñar»', + legend: 'Prema ${underline}' + }, + { + name: 'Orde «ligazón»', + legend: 'Prema ${link}' + }, + { + name: 'Orde «contraer a barra de ferramentas»', + legend: 'Prema ${toolbarCollapse}' + }, + { + name: 'Orde «acceder ao anterior espazo en foco»', + legend: 'Prema ${accessPreviousSpace} para acceder ao espazo máis próximo de foco inalcanzábel anterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes.' + }, + { + name: 'Orde «acceder ao seguinte espazo en foco»', + legend: 'Prema ${accessNextSpace} para acceder ao espazo máis próximo de foco inalcanzábel posterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes.' + }, + { + name: 'Axuda da accesibilidade', + legend: 'Prema ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulador', + pause: 'Pausa', + capslock: 'Bloq. Maiús', + escape: 'Escape', + pageUp: 'Páxina arriba', + pageDown: 'Páxina abaixo', + leftArrow: 'Frecha esquerda', + upArrow: 'Frecha arriba', + rightArrow: 'Frecha dereita', + downArrow: 'Frecha abaixo', + insert: 'Inserir', + leftWindowKey: 'Tecla Windows esquerda', + rightWindowKey: 'Tecla Windows dereita', + selectKey: 'Escolla a tecla', + numpad0: 'Tec. numérico 0', + numpad1: 'Tec. numérico 1', + numpad2: 'Tec. numérico 2', + numpad3: 'Tec. numérico 3', + numpad4: 'Tec. numérico 4', + numpad5: 'Tec. numérico 5', + numpad6: 'Tec. numérico 6', + numpad7: 'Tec. numérico 7', + numpad8: 'Tec. numérico 8', + numpad9: 'Tec. numérico 9', + multiply: 'Multiplicar', + add: 'Sumar', + subtract: 'Restar', + decimalPoint: 'Punto decimal', + divide: 'Dividir', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Bloq. num.', + scrollLock: 'Bloq. despraz.', + semiColon: 'Punto e coma', + equalSign: 'Signo igual', + comma: 'Coma', + dash: 'Guión', + period: 'Punto', + forwardSlash: 'Barra inclinada', + graveAccent: 'Acento grave', + openBracket: 'Abrir corchete', + backSlash: 'Barra invertida', + closeBracket: 'Pechar corchete', + singleQuote: 'Comiña simple' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/gu.js b/sources/plugins/a11yhelp/dialogs/lang/gu.js new file mode 100644 index 0000000..30eb2cd --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/gu.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'gu', { + title: 'એક્ક્ષેબિલિટી ની વિગતો', + contents: 'હેલ્પ. આ બંધ કરવા ESC દબાવો.', + legend: [ + { + name: 'જનરલ', + items: [ + { + name: 'એડિટર ટૂલબાર', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'એડિટર ડાયલોગ', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'કમાંડસ', + items: [ + { + name: 'અન્ડું કમાંડ', + legend: '$ દબાવો {undo}' + }, + { + name: 'ફરી કરો કમાંડ', + legend: '$ દબાવો {redo}' + }, + { + name: 'બોલ્દનો કમાંડ', + legend: '$ દબાવો {bold}' + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/he.js b/sources/plugins/a11yhelp/dialogs/lang/he.js new file mode 100644 index 0000000..24b8572 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/he.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'he', { + title: 'הוראות נגישות', + contents: 'הוראות נגישות. לסגירה לחץ אסקייפ (ESC).', + legend: [ + { + name: 'כללי', + items: [ + { + name: 'סרגל הכלים', + legend: 'לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר.' + }, + + { + name: 'דיאלוגים (חלונות תשאול)', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'תפריט ההקשר (Context Menu)', + legend: 'לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC).' + }, + + { + name: 'תפריטים צפים (List boxes)', + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'עץ אלמנטים (Elements Path)', + legend: 'לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך.' + } + ] + }, + { + name: 'פקודות', + items: [ + { + name: ' ביטול צעד אחרון', + legend: 'לחץ ${undo}' + }, + { + name: ' חזרה על צעד אחרון', + legend: 'לחץ ${redo}' + }, + { + name: ' הדגשה', + legend: 'לחץ ${bold}' + }, + { + name: ' הטייה', + legend: 'לחץ ${italic}' + }, + { + name: ' הוספת קו תחתון', + legend: 'לחץ ${underline}' + }, + { + name: ' הוספת לינק', + legend: 'לחץ ${link}' + }, + { + name: ' כיווץ סרגל הכלים', + legend: 'לחץ ${toolbarCollapse}' + }, + { + name: 'גישה למיקום המיקוד הקודם', + legend: 'לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.' + }, + { + name: 'גישה למיקום המיקוד הבא', + legend: 'לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.' + }, + { + name: ' הוראות נגישות', + legend: 'לחץ ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'חץ שמאלה', + upArrow: 'חץ למעלה', + rightArrow: 'חץ ימינה', + downArrow: 'חץ למטה', + insert: 'הכנס', + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'בחר מקש', + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'הוסף', + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'סלאש', + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'סלאש הפוך', + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'ציטוט יחיד' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/hi.js b/sources/plugins/a11yhelp/dialogs/lang/hi.js new file mode 100644 index 0000000..308c5ef --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/hi.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'hi', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'सामान्य', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/hr.js b/sources/plugins/a11yhelp/dialogs/lang/hr.js new file mode 100644 index 0000000..b05273e --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/hr.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'hr', { + title: 'Upute dostupnosti', + contents: 'Sadržaj pomoći. Za zatvaranje pritisnite ESC.', + legend: [ + { + name: 'Općenito', + items: [ + { + name: 'Alatna traka', + legend: 'Pritisni ${toolbarFocus} za navigaciju do alatne trake. Pomicanje do prethodne ili sljedeće alatne grupe vrši se pomoću SHIFT+TAB i TAB. Pomicanje do prethodnog ili sljedećeg gumba u alatnoj traci vrši se pomoću lijeve i desne strelice kursora. Pritisnite SPACE ili ENTER za aktivaciju alatne trake.' + }, + + { + name: 'Dijalog', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Kontekstni izbornik', + legend: 'Pritisnite ${contextMenu} ili APPLICATION tipku za otvaranje kontekstnog izbornika. Pomicanje se vrši TAB ili strelicom kursora prema dolje ili SHIFT+TAB ili strelica kursora prema gore. SPACE ili ENTER odabiru opciju izbornika. Otvorite podizbornik trenutne opcije sa SPACE, ENTER ili desna strelica kursora. Povratak na prethodni izbornik vrši se sa ESC ili lijevom strelicom kursora. Zatvaranje se vrši pritiskom na tipku ESC.' + }, + + { + name: 'Lista', + legend: 'Unutar list-boxa, pomicanje na sljedeću stavku vrši se sa TAB ili strelica kursora prema dolje. Na prethodnu sa SHIFT+TAB ili strelica prema gore. Pritiskom na SPACE ili ENTER odabire se stavka ili ESC za zatvaranje.' + }, + + { + name: 'Traka putanje elemenata', + legend: 'Pritisnite ${elementsPathFocus} za navigaciju po putanji elemenata. Pritisnite TAB ili desnu strelicu kursora za pomicanje na sljedeći element ili SHIFT+TAB ili lijeva strelica kursora za pomicanje na prethodni element. Pritiskom na SPACE ili ENTER vrši se odabir elementa.' + } + ] + }, + { + name: 'Naredbe', + items: [ + { + name: 'Vrati naredbu', + legend: 'Pritisni ${undo}' + }, + { + name: 'Ponovi naredbu', + legend: 'Pritisni ${redo}' + }, + { + name: 'Bold naredba', + legend: 'Pritisni ${bold}' + }, + { + name: 'Italic naredba', + legend: 'Pritisni ${italic}' + }, + { + name: 'Underline naredba', + legend: 'Pritisni ${underline}' + }, + { + name: 'Link naredba', + legend: 'Pritisni ${link}' + }, + { + name: 'Smanji alatnu traku naredba', + legend: 'Pritisni ${toolbarCollapse}' + }, + { + name: 'Access previous focus space naredba', + legend: 'Pritisni ${accessPreviousSpace} za pristup najbližem nedostupnom razmaku prije kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak.' + }, + { + name: 'Access next focus space naredba', + legend: 'Pritisni ${accessNextSpace} za pristup najbližem nedostupnom razmaku nakon kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak.' + }, + { + name: 'Pomoć za dostupnost', + legend: 'Pritisni ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/hu.js b/sources/plugins/a11yhelp/dialogs/lang/hu.js new file mode 100644 index 0000000..f14f17d --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/hu.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'hu', { + title: 'Kisegítő utasítások', + contents: 'Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.', + legend: [ + { + name: 'Általános', + items: [ + { + name: 'Szerkesztő Eszköztár', + legend: 'Nyomjon ${toolbarFocus} hogy kijelölje az eszköztárat. A következő és előző eszköztár csoporthoz a TAB és SHIFT+TAB-al juthat el. A következő és előző eszköztár gombhoz a BAL NYÍL vagy JOBB NYÍL gombbal juthat el. Nyomjon SPACE-t vagy ENTER-t hogy aktiválja az eszköztár gombot.' + }, + + { + name: 'Szerkesző párbeszéd ablak', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Szerkesztő helyi menü', + legend: 'Nyomjon ${contextMenu}-t vagy ALKALMAZÁS BILLENTYŰT a helyi menü megnyitásához. Ezután a következő menüpontra léphet a TAB vagy LEFELÉ NYÍLLAL. Az előző opciót a SHIFT+TAB vagy FELFELÉ NYÍLLAL érheti el. Nyomjon SPACE-t vagy ENTER-t a menüpont kiválasztásához. A jelenlegi menüpont almenüjének megnyitásához nyomjon SPACE-t vagy ENTER-t, vagy JOBB NYILAT. A főmenühöz való visszatéréshez nyomjon ESC-et vagy BAL NYILAT. A helyi menü bezárása az ESC billentyűvel lehetséges.' + }, + + { + name: 'Szerkesztő lista', + legend: 'A listán belül a következő elemre a TAB vagy LEFELÉ NYÍLLAL mozoghat. Az előző elem kiválasztásához nyomjon SHIFT+TAB-ot vagy FELFELÉ NYILAT. Nyomjon SPACE-t vagy ENTER-t az elem kiválasztásához. Az ESC billentyű megnyomásával bezárhatja a listát.' + }, + + { + name: 'Szerkesztő elem utak sáv', + legend: 'Nyomj ${elementsPathFocus} hogy kijelöld a elemek út sávját. A következő elem gombhoz a TAB-al vagy a JOBB NYÍLLAL juthatsz el. Az előző gombhoz a SHIFT+TAB vagy BAL NYÍLLAL mehetsz. A SPACE vagy ENTER billentyűvel kiválaszthatod az elemet a szerkesztőben.' + } + ] + }, + { + name: 'Parancsok', + items: [ + { + name: 'Parancs visszavonása', + legend: 'Nyomj ${undo}' + }, + { + name: 'Parancs megismétlése', + legend: 'Nyomjon ${redo}' + }, + { + name: 'Félkövér parancs', + legend: 'Nyomjon ${bold}' + }, + { + name: 'Dőlt parancs', + legend: 'Nyomjon ${italic}' + }, + { + name: 'Aláhúzott parancs', + legend: 'Nyomjon ${underline}' + }, + { + name: 'Link parancs', + legend: 'Nyomjon ${link}' + }, + { + name: 'Szerkesztősáv összecsukása parancs', + legend: 'Nyomjon ${toolbarCollapse}' + }, + { + name: 'Hozzáférés az előző fókusz helyhez parancs', + legend: 'Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel előtt, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket.' + }, + { + name: 'Hozzáférés a következő fókusz helyhez parancs', + legend: 'Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel után, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket.' + }, + { + name: 'Kisegítő súgó', + legend: 'Nyomjon ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'balra nyíl', + upArrow: 'felfelé nyíl', + rightArrow: 'jobbra nyíl', + downArrow: 'lefelé nyíl', + insert: 'Insert', + leftWindowKey: 'bal Windows-billentyű', + rightWindowKey: 'jobb Windows-billentyű', + selectKey: 'Billentyű választása', + numpad0: 'Számbillentyűk 0', + numpad1: 'Számbillentyűk 1', + numpad2: 'Számbillentyűk 2', + numpad3: 'Számbillentyűk 3', + numpad4: 'Számbillentyűk 4', + numpad5: 'Számbillentyűk 5', + numpad6: 'Számbillentyűk 6', + numpad7: 'Számbillentyűk 7', + numpad8: 'Számbillentyűk 8', + numpad9: 'Számbillentyűk 9', + multiply: 'Szorzás', + add: 'Hozzáadás', + subtract: 'Kivonás', + decimalPoint: 'Tizedespont', + divide: 'Osztás', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Pontosvessző', + equalSign: 'Egyenlőségjel', + comma: 'Vessző', + dash: 'Kötőjel', + period: 'Pont', + forwardSlash: 'Perjel', + graveAccent: 'Visszafelé dőlő ékezet', + openBracket: 'Nyitó szögletes zárójel', + backSlash: 'fordított perjel', + closeBracket: 'Záró szögletes zárójel', + singleQuote: 'szimpla idézőjel' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/id.js b/sources/plugins/a11yhelp/dialogs/lang/id.js new file mode 100644 index 0000000..7799b38 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/id.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'id', { + title: 'Instruksi Accessibility', + contents: 'Bantuan. Tekan ESC untuk menutup dialog ini.', + legend: [ + { + name: 'Umum', + items: [ + { + name: 'Toolbar Editor', + legend: 'Tekan ${toolbarFocus} untuk berpindah ke toolbar. Untuk berpindah ke group toolbar selanjutnya dan sebelumnya gunakan TAB dan SHIFT+TAB. Untuk berpindah ke tombol toolbar selanjutnya dan sebelumnya gunakan RIGHT ARROW atau LEFT ARROW. Tekan SPASI atau ENTER untuk mengaktifkan tombol toolbar.' + }, + + { + name: 'Dialog Editor', + legend: + 'Pada jendela dialog, tekan TAB untuk berpindah pada elemen dialog selanjutnya, tekan SHIFT+TAB untuk berpindah pada elemen dialog sebelumnya, tekan ENTER untuk submit dialog, tekan ESC untuk membatalkan dialog. Pada dialog dengan multi tab, daftar tab dapat diakses dengan ALT+F10 ataupun dengan tombol TAB sesuai urutan tab pada dialog. Jika daftar tab aktif terpilih, untuk berpindah tab dapat menggunakan RIGHT dan LEFT ARROW.' + }, + + { + name: 'Context Menu Editor', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'List Box Editor', + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/it.js b/sources/plugins/a11yhelp/dialogs/lang/it.js new file mode 100644 index 0000000..55ecadc --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/it.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'it', { + title: 'Istruzioni di Accessibilità', + contents: 'Contenuti di Aiuto. Per chiudere questa finestra premi ESC.', + legend: [ + { + name: 'Generale', + items: [ + { + name: 'Barra degli strumenti Editor', + legend: 'Premere ${toolbarFocus} per passare alla barra degli strumenti. Usare TAB per spostarsi al gruppo successivo, MAIUSC+TAB per spostarsi a quello precedente. Usare FRECCIA DESTRA per spostarsi al pulsante successivo, FRECCIA SINISTRA per spostarsi a quello precedente. Premere SPAZIO o INVIO per attivare il pulsante della barra degli strumenti.' + }, + + { + name: 'Finestra Editor', + legend: + 'All\'interno di una finestra di dialogo è possibile premere TAB per passare all\'elemento successivo della finestra, MAIUSC+TAB per passare a quello precedente; premere INVIO per inviare i dati della finestra, oppure ESC per annullare l\'operazione. Quando una finestra di dialogo ha più schede, è possibile passare all\'elenco delle schede sia con ALT+F10 che con TAB, in base all\'ordine delle tabulazioni della finestra. Quando l\'elenco delle schede è attivo, premere la FRECCIA DESTRA o la FRECCIA SINISTRA per passare rispettivamente alla scheda successiva o a quella precedente.' + }, + + { + name: 'Menù contestuale Editor', + legend: 'Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all\'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all\'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l\'opzione di menu. Apri il sottomenu dell\'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC.' + }, + + { + name: 'Box Lista Editor', + legend: 'All\'interno di un elenco di opzioni, per spostarsi all\'elemento successivo premere TAB oppure FRECCIA GIÙ. Per spostarsi all\'elemento precedente usare SHIFT+TAB oppure FRECCIA SU. Premere SPAZIO o INVIO per selezionare l\'elemento della lista. Premere ESC per chiudere l\'elenco di opzioni.' + }, + + { + name: 'Barra percorso elementi editor', + legend: 'Premere ${elementsPathFocus} per passare agli elementi della barra del percorso. Usare TAB o FRECCIA DESTRA per passare al pulsante successivo. Per passare al pulsante precedente premere MAIUSC+TAB o FRECCIA SINISTRA. Premere SPAZIO o INVIO per selezionare l\'elemento nell\'editor.' + } + ] + }, + { + name: 'Comandi', + items: [ + { + name: ' Annulla comando', + legend: 'Premi ${undo}' + }, + { + name: ' Ripeti comando', + legend: 'Premi ${redo}' + }, + { + name: ' Comando Grassetto', + legend: 'Premi ${bold}' + }, + { + name: ' Comando Corsivo', + legend: 'Premi ${italic}' + }, + { + name: ' Comando Sottolineato', + legend: 'Premi ${underline}' + }, + { + name: ' Comando Link', + legend: 'Premi ${link}' + }, + { + name: ' Comando riduci barra degli strumenti', + legend: 'Premi ${toolbarCollapse}' + }, + { + name: 'Comando di accesso al precedente spazio di focus', + legend: 'Premi ${accessPreviousSpace} per accedere il più vicino spazio di focus non raggiungibile prima del simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti.' + }, + { + name: 'Comando di accesso al prossimo spazio di focus', + legend: 'Premi ${accessNextSpace} per accedere il più vicino spazio di focus non raggiungibile dopo il simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti.' + }, + { + name: ' Aiuto Accessibilità', + legend: 'Premi ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pausa', + capslock: 'Bloc Maiusc', + escape: 'Esc', + pageUp: 'Pagina sù', + pageDown: 'Pagina giù', + leftArrow: 'Freccia sinistra', + upArrow: 'Freccia su', + rightArrow: 'Freccia destra', + downArrow: 'Freccia giù', + insert: 'Ins', + leftWindowKey: 'Tasto di Windows sinistro', + rightWindowKey: 'Tasto di Windows destro', + selectKey: 'Tasto di selezione', + numpad0: '0 sul tastierino numerico', + numpad1: '1 sul tastierino numerico', + numpad2: '2 sul tastierino numerico', + numpad3: '3 sul tastierino numerico', + numpad4: '4 sul tastierino numerico', + numpad5: '5 sul tastierino numerico', + numpad6: '6 sul tastierino numerico', + numpad7: '7 sul tastierino numerico', + numpad8: '8 sul tastierino numerico', + numpad9: '9 sul tastierino numerico', + multiply: 'Moltiplicazione', + add: 'Più', + subtract: 'Sottrazione', + decimalPoint: 'Punto decimale', + divide: 'Divisione', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Bloc Num', + scrollLock: 'Bloc Scorr', + semiColon: 'Punto-e-virgola', + equalSign: 'Segno di uguale', + comma: 'Virgola', + dash: 'Trattino', + period: 'Punto', + forwardSlash: 'Barra', + graveAccent: 'Accento grave', + openBracket: 'Parentesi quadra aperta', + backSlash: 'Barra rovesciata', + closeBracket: 'Parentesi quadra chiusa', + singleQuote: 'Apostrofo' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ja.js b/sources/plugins/a11yhelp/dialogs/lang/ja.js new file mode 100644 index 0000000..9053e37 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ja.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ja', { + title: 'ユーザー補助の説明', + contents: 'ヘルプ このダイアログを閉じるには ESCを押してください。', + legend: [ + { + name: '全般', + items: [ + { + name: 'エディターツールバー', + legend: '${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。' + }, + + { + name: '編集ダイアログ', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'エディターのメニュー', + legend: '${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。' + }, + + { + name: 'エディターリストボックス', + legend: 'リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。' + }, + + { + name: 'エディター要素パスバー', + legend: '${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。' + } + ] + }, + { + name: 'コマンド', + items: [ + { + name: '元に戻す', + legend: '${undo} をクリック' + }, + { + name: 'やり直し', + legend: '${redo} をクリック' + }, + { + name: '太字', + legend: '${bold} をクリック' + }, + { + name: '斜体 ', + legend: '${italic} をクリック' + }, + { + name: '下線', + legend: '${underline} をクリック' + }, + { + name: 'リンク', + legend: '${link} をクリック' + }, + { + name: 'ツールバーを縮める', + legend: '${toolbarCollapse} をクリック' + }, + { + name: '前のカーソル移動のできないポイントへ', + legend: '${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。' + }, + { + name: '次のカーソル移動のできないポイントへ', + legend: '${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。' + }, + { + name: 'ユーザー補助ヘルプ', + legend: '${a11yHelp} をクリック' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: '左矢印', + upArrow: '上矢印', + rightArrow: '右矢印', + downArrow: '下矢印', + insert: 'Insert', + leftWindowKey: '左Windowキー', + rightWindowKey: '右のWindowキー', + selectKey: 'Select', + numpad0: 'Num 0', + numpad1: 'Num 1', + numpad2: 'Num 2', + numpad3: 'Num 3', + numpad4: 'Num 4', + numpad5: 'Num 5', + numpad6: 'Num 6', + numpad7: 'Num 7', + numpad8: 'Num 8', + numpad9: 'Num 9', + multiply: '掛ける', + add: '足す', + subtract: '引く', + decimalPoint: '小数点', + divide: '割る', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'セミコロン', + equalSign: 'イコール記号', + comma: 'カンマ', + dash: 'ダッシュ', + period: 'ピリオド', + forwardSlash: 'フォワードスラッシュ', + graveAccent: 'グレイヴアクセント', + openBracket: '開きカッコ', + backSlash: 'バックスラッシュ', + closeBracket: '閉じカッコ', + singleQuote: 'シングルクォート' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/km.js b/sources/plugins/a11yhelp/dialogs/lang/km.js new file mode 100644 index 0000000..4cdd048 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/km.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'km', { + title: 'Accessibility Instructions', // MISSING + contents: 'មាតិកា​ជំនួយ។ ដើម្បី​បិទ​ផ្ទាំង​នេះ សូម​ចុច ESC ។', + legend: [ + { + name: 'ទូទៅ', + items: [ + { + name: 'របារ​ឧបករណ៍​កម្មវិធី​និពន្ធ', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'ផ្ទាំង​កម្មវិធីនិពន្ធ', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'ម៉ីនុយបរិបទអ្នកកែសម្រួល', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'ប្រអប់បញ្ជីអ្នកកែសម្រួល', + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'ពាក្យបញ្ជា', + items: [ + { + name: 'ការ​បញ្ជា​មិនធ្វើវិញ', + legend: 'ចុច ${undo}' + }, + { + name: 'ការបញ្ជា​ធ្វើវិញ', + legend: 'ចុច ${redo}' + }, + { + name: 'ការបញ្ជា​អក្សរ​ដិត', + legend: 'ចុច ${bold}' + }, + { + name: 'ការបញ្ជា​អក្សរ​ទ្រេត', + legend: 'ចុច ${italic}' + }, + { + name: 'ពាក្យបញ្ជា​បន្ទាត់​ពីក្រោម', + legend: 'ចុច ${underline}' + }, + { + name: 'ពាក្យបញ្ជា​តំណ', + legend: 'ចុច ${link}' + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: 'ជំនួយ​ពី​ភាព​ងាយស្រួល', + legend: 'ជួយ ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'ផ្អាក', + capslock: 'Caps Lock', // MISSING + escape: 'ចាកចេញ', + pageUp: 'ទំព័រ​លើ', + pageDown: 'ទំព័រ​ក្រោម', + leftArrow: 'ព្រួញ​ឆ្វេង', + upArrow: 'ព្រួញ​លើ', + rightArrow: 'ព្រួញ​ស្ដាំ', + downArrow: 'ព្រួញ​ក្រោម', + insert: 'បញ្ចូល', + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'ជ្រើស​គ្រាប់​ចុច', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'គុណ', + add: 'បន្ថែម', + subtract: 'ដក', + decimalPoint: 'ចំណុចទសភាគ', + divide: 'ចែក', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', // MISSING + scrollLock: 'បិទ​រំកិល', + semiColon: 'ចុច​ក្បៀស', + equalSign: 'សញ្ញា​អឺរ៉ូ', + comma: 'ក្បៀស', + dash: 'Dash', // MISSING + period: 'ចុច', + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'តង្កៀប​បើក', + backSlash: 'Backslash', // MISSING + closeBracket: 'តង្កៀប​បិទ', + singleQuote: 'បន្តក់​មួយ' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ko.js b/sources/plugins/a11yhelp/dialogs/lang/ko.js new file mode 100644 index 0000000..e5ed192 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ko.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ko', { + title: '접근성 설명', + contents: '도움말. 이 창을 닫으시려면 ESC 를 누르세요.', + legend: [ + { + name: '일반', + items: [ + { + name: '편집기 툴바', + legend: '툴바를 탐색하시려면 ${toolbarFocus} 를 투르세요. 이전/다음 툴바 그룹으로 이동하시려면 TAB 키 또는 SHIFT+TAB 키를 누르세요. 이전/다음 툴바 버튼으로 이동하시려면 오른쪽 화살표 키 또는 왼쪽 화살표 키를 누르세요. 툴바 버튼을 활성화 하려면 SPACE 키 또는 ENTER 키를 누르세요.' + }, + + { + name: '편집기 다이얼로그', + legend: + 'TAB 키를 누르면 다음 대화상자로 이동하고, SHIFT+TAB 키를 누르면 이전 대화상자로 이동합니다. 대화상자를 제출하려면 ENTER 키를 누르고, ESC 키를 누르면 대화상자를 취소합니다. 대화상자에 탭이 여러개 있을 때, ALT+F10 키 또는 TAB 키를 누르면 순서에 따라 탭 목록에 도달할 수 있습니다. 탭 목록에 초점이 맞을 때, 오른쪽과 왼쪽 화살표 키를 이용하면 각각 다음과 이전 탭으로 이동할 수 있습니다.' + }, + + { + name: '편집기 환경 메뉴', + legend: '${contextMenu} 또는 어플리케이션 키를 누르면 환경-메뉴를 열 수 있습니다. 환경-메뉴에서 TAB 키 또는 아래 화살표 키를 누르면 다음 메뉴 옵션으로 이동할 수 있습니다. 이전 옵션으로 이동은 SHIFT+TAB 키 또는 위 화살표 키를 눌러서 할 수 있습니다. 스페이스 키 또는 ENTER 키를 눌러서 메뉴 옵션을 선택할 수 있습니다. 스페이스 키 또는 ENTER 키 또는 오른쪽 화살표 키를 눌러서 하위 메뉴를 열 수 있습니다. 부모 메뉴 항목으로 돌아가려면 ESC 키 또는 왼쪽 화살표 키를 누릅니다. ESC 키를 눌러서 환경-메뉴를 닫습니다.' + }, + + { + name: '편집기 목록 박스', + legend: '리스트-박스 내에서, 목록의 다음 항목으로 이동하려면 TAB 키 또는 아래쪽 화살표 키를 누릅니다. 목록의 이전 항목으로 이동하려면 SHIFT+TAB 키 또는 위쪽 화살표 키를 누릅니다. 스페이스 키 또는 ENTER 키를 누르면 목록의 해당 옵션을 선택합니다. ESC 키를 눌러서 리스트-박스를 닫을 수 있습니다.' + }, + + { + name: '편집기 요소 경로 막대', + legend: '${elementsPathFocus}를 눌러서 요소 경로 막대를 탐색할 수 있습니다. 다음 요소로 이동하려면 TAB 키 또는 오른쪽 화살표 키를 누릅니다. SHIFT+TAB 키 또는 왼쪽 화살표 키를 누르면 이전 버튼으로 이동할 수 있습니다. 스페이스 키나 ENTER 키를 누르면 편집기의 해당 항목을 선택합니다.' + } + ] + }, + { + name: '명령', + items: [ + { + name: ' 명령 실행 취소', + legend: '${undo} 누르시오' + }, + { + name: ' 명령 다시 실행', + legend: '${redo} 누르시오' + }, + { + name: ' 굵게 명령', + legend: '${bold} 누르시오' + }, + { + name: ' 기울임 꼴 명령', + legend: '${italic} 누르시오' + }, + { + name: ' 밑줄 명령', + legend: '${underline} 누르시오' + }, + { + name: ' 링크 명령', + legend: '${link} 누르시오' + }, + { + name: ' 툴바 줄이기 명령', + legend: '${toolbarCollapse} 누르시오' + }, + { + name: ' 이전 포커스 공간 접근 명령', + legend: '탈자 기호(^) 이전에 ${accessPreviousSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다.' + }, + { + name: '다음 포커스 공간 접근 명령', + legend: '탈자 기호(^) 다음에 ${accessNextSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다. ' + }, + { + name: ' 접근성 도움말', + legend: '${a11yHelp} 누르시오' + } + ] + } + ], + tab: '탭 키', + pause: '일시정지 키', + capslock: '캡스 록 키', + escape: '이스케이프 키', + pageUp: '페이지 업 키', + pageDown: '페이지 다운 키', + leftArrow: '왼쪽 화살표 키', + upArrow: '위쪽 화살표 키', + rightArrow: '오른쪽 화살표 키', + downArrow: '아래쪽 화살표 키', + insert: '인서트 키', + leftWindowKey: '왼쪽 윈도우 키', + rightWindowKey: '오른쪽 윈도우 키', + selectKey: '셀렉트 키', + numpad0: '숫자 패드 0 키', + numpad1: '숫자 패드 1 키', + numpad2: '숫자 패드 2 키', + numpad3: '숫자 패드 3 키', + numpad4: '숫자 패드 4 키', + numpad5: '숫자 패드 5 키', + numpad6: '숫자 패드 6 키', + numpad7: '숫자 패드 7 키', + numpad8: '숫자 패드 8 키', + numpad9: '숫자 패드 9 키', + multiply: '곱셈(*) 키', + add: '덧셈(+) 키', + subtract: '뺄셈(-) 키', + decimalPoint: '온점(.) 키', + divide: '나눗셈(/) 키', + f1: 'F1 키', + f2: 'F2 키', + f3: 'F3 키', + f4: 'F4 키', + f5: 'F5 키', + f6: 'F6 키', + f7: 'F7 키', + f8: 'F8 키', + f9: 'F9 키', + f10: 'F10 키', + f11: 'F11 키', + f12: 'F12 키', + numLock: 'Num Lock 키', + scrollLock: 'Scroll Lock 키', + semiColon: '세미콜론(;) 키', + equalSign: '등호(=) 키', + comma: '쉼표(,) 키', + dash: '대시(-) 키', + period: '온점(.) 키', + forwardSlash: '슬래시(/) 키', + graveAccent: '억음 악센트(`) 키', + openBracket: '브라켓 열기([) 키', + backSlash: '역슬래시(\\\\) 키', + closeBracket: '브라켓 닫기(]) 키', + singleQuote: '외 따옴표(\') 키' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ku.js b/sources/plugins/a11yhelp/dialogs/lang/ku.js new file mode 100644 index 0000000..3f044a2 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ku.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ku', { + title: 'ڕێنمای لەبەردەستدابوون', + contents: 'پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.', + legend: [ + { + name: 'گشتی', + items: [ + { + name: 'تووڵامرازی دەستكاریكەر', + legend: 'کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT+TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز.' + }, + + { + name: 'دیالۆگی دەستكاریكەر', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' + }, + + { + name: 'پێڕستی سەرنووسەر', + legend: 'کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە.' + }, + + { + name: 'لیستی سنووقی سەرنووسەر', + legend: 'لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست.' + }, + + { + name: 'تووڵامرازی توخم', + legend: 'کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه.' + } + ] + }, + { + name: 'فەرمانەکان', + items: [ + { + name: 'پووچکردنەوەی فەرمان', + legend: 'کلیك ${undo}' + }, + { + name: 'هەڵگەڕانەوەی فەرمان', + legend: 'کلیك ${redo}' + }, + { + name: 'فەرمانی دەقی قەڵەو', + legend: 'کلیك ${bold}' + }, + { + name: 'فەرمانی دەقی لار', + legend: 'کلیك ${italic}' + }, + { + name: 'فەرمانی ژێرهێڵ', + legend: 'کلیك ${underline}' + }, + { + name: 'فەرمانی به‌ستەر', + legend: 'کلیك ${link}' + }, + { + name: 'شاردەنەوەی تووڵامراز', + legend: 'کلیك ${toolbarCollapse}' + }, + { + name: 'چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی', + legend: 'کلیک ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' + }, + { + name: 'چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی', + legend: 'کلیک ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' + }, + { + name: 'دەستپێگەیشتنی یارمەتی', + legend: 'کلیك ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Left Arrow', + upArrow: 'Up Arrow', + rightArrow: 'Right Arrow', + downArrow: 'Down Arrow', + insert: 'Insert', + leftWindowKey: 'پەنجەرەی چەپ', + rightWindowKey: 'پەنجەرەی ڕاست', + selectKey: 'Select', + numpad0: 'Numpad 0', // MISSING + numpad1: '1', + numpad2: '2', + numpad3: '3', + numpad4: '4', + numpad5: '5', + numpad6: '6', + numpad7: '7', + numpad8: '8', + numpad9: '9', + multiply: '*', + add: '+', + subtract: '-', + decimalPoint: '.', + divide: '/', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: ';', + equalSign: '=', + comma: ',', + dash: '-', + period: '.', + forwardSlash: '/', + graveAccent: '`', + openBracket: '[', + backSlash: '\\\\', + closeBracket: '}', + singleQuote: '\'' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/lt.js b/sources/plugins/a11yhelp/dialogs/lang/lt.js new file mode 100644 index 0000000..c27e3ba --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/lt.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'lt', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'Bendros savybės', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/lv.js b/sources/plugins/a11yhelp/dialogs/lang/lv.js new file mode 100644 index 0000000..aac4129 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/lv.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'lv', { + title: 'Pieejamības instrukcija', + contents: 'Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.', + legend: [ + { + name: 'Galvenais', + items: [ + { + name: 'Redaktora rīkjosla', + legend: 'Nospiediet ${toolbarFocus} lai pārvietotos uz rīkjoslu. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas grupu izmantojiet pogu TAB un SHIFT+TAB. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizētu rīkjosla pogu.' + }, + + { + name: 'Redaktora dialoga logs', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Redaktora satura izvēle', + legend: 'Nospiediet ${contextMenu} vai APPLICATION KEY lai atvērtu satura izvēlni. Lai pārvietotos uz nākošo izvēlnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pārvietotos uz iepriekšējo opciju izmantojiet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvelētos izvēlnes opciju. Atveriet tekošajā opcija apakšizvēlni ar SAPCE vai ENTER ka ari to var izdarīt ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvēlni nospiediet ESC vai Kreiso bultiņu. Lai aizvērtu ciet izvēlnes saturu nospiediet ESC.' + }, + + { + name: 'Redaktora saraksta lauks', + legend: 'Saraksta laukā, lai pārvietotos uz nākošo saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pārvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvēlētos saraksta opcijas. Nospiediet ESC lai aizvērtu saraksta lauku.' + }, + + { + name: 'Redaktora elementa ceļa josla', + legend: 'Nospiediet ${elementsPathFocus} lai pārvietotos uz elementa ceļa joslu. Lai pārvietotos uz nākošo elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo elementa pogu izmantojiet SHIFT+TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos elementu redaktorā.' + } + ] + }, + { + name: 'Komandas', + items: [ + { + name: 'Komanda atcelt darbību', + legend: 'Nospiediet ${undo}' + }, + { + name: 'Komanda atkārtot darbību', + legend: 'Nospiediet ${redo}' + }, + { + name: 'Treknraksta komanda', + legend: 'Nospiediet ${bold}' + }, + { + name: 'Kursīva komanda', + legend: 'Nospiediet ${italic}' + }, + { + name: 'Apakšsvītras komanda ', + legend: 'Nospiediet ${underline}' + }, + { + name: 'Hipersaites komanda', + legend: 'Nospiediet ${link}' + }, + { + name: 'Rīkjoslas aizvēršanas komanda', + legend: 'Nospiediet ${toolbarCollapse}' + }, + { + name: 'Piekļūt iepriekšējai fokusa vietas komandai', + legend: 'Nospiediet ${accessPreviousSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pirms kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām.' + }, + { + name: 'Piekļūt nākošā fokusa apgabala komandai', + legend: 'Nospiediet ${accessNextSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pēc kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām.' + }, + { + name: 'Pieejamības palīdzība', + legend: 'Nospiediet ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/mk.js b/sources/plugins/a11yhelp/dialogs/lang/mk.js new file mode 100644 index 0000000..8316358 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/mk.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'mk', { + title: 'Инструкции за пристапност', + contents: 'Содржина на делот за помош. За да го затворите овој дијалог притиснете ESC.', + legend: [ + { + name: 'Општо', + items: [ + { + name: 'Мени за уредувачот', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Дијалот за едиторот', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Контекст-мени на уредувачот', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Наредби', + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', + pause: 'Пауза', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Up', + leftArrow: 'Стрелка лево', + upArrow: 'Стрелка горе', + rightArrow: 'Стрелка десно', + downArrow: 'Стрелка доле', + insert: 'Insert', + leftWindowKey: 'Лево Windows копче', + rightWindowKey: 'Десно Windows копче', + selectKey: 'Select копче', + numpad0: 'Нум. таст. 0', + numpad1: 'Нум. таст. 1', + numpad2: 'Нум. таст. 2', + numpad3: 'Нум. таст. 3', + numpad4: 'Нум. таст. 4', + numpad5: 'Нум. таст. 5', + numpad6: 'Нум. таст. 6', + numpad7: 'Нум. таст. 7', + numpad8: 'Нум. таст. 8', + numpad9: 'Нум. таст. 9', + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/mn.js b/sources/plugins/a11yhelp/dialogs/lang/mn.js new file mode 100644 index 0000000..eb11634 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/mn.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'mn', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'Ерөнхий', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/nb.js b/sources/plugins/a11yhelp/dialogs/lang/nb.js new file mode 100644 index 0000000..ccfeb66 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/nb.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'nb', { + title: 'Instruksjoner for tilgjengelighet', + contents: 'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.', + legend: [ + { + name: 'Generelt', + items: [ + { + name: 'Verktøylinje for editor', + legend: 'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.' + }, + + { + name: 'Dialog for editor', + legend: + 'Mens du er i en dialog, trykk TAB for å navigere til neste dialogelement, trykk SHIFT+TAB for å flytte til forrige dialogelement, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. Når en dialog har flere faner, kan fanelisten nås med enten ALT+F10 eller med TAB. Når fanelisten er fokusert, går man til neste og forrige fane med henholdsvis HØYRE og VENSTRE PILTAST.' + }, + + { + name: 'Kontekstmeny for editor', + legend: 'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.' + }, + + { + name: 'Listeboks for editor', + legend: 'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.' + }, + + { + name: 'Verktøylinje for elementsti', + legend: 'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.' + } + ] + }, + { + name: 'Hurtigtaster', + items: [ + { + name: 'Angre', + legend: 'Trykk ${undo}' + }, + { + name: 'Gjør om', + legend: 'Trykk ${redo}' + }, + { + name: 'Fet tekst', + legend: 'Trykk ${bold}' + }, + { + name: 'Kursiv tekst', + legend: 'Trykk ${italic}' + }, + { + name: 'Understreking', + legend: 'Trykk ${underline}' + }, + { + name: 'Lenke', + legend: 'Trykk ${link}' + }, + { + name: 'Skjul verktøylinje', + legend: 'Trykk ${toolbarCollapse}' + }, + { + name: 'Gå til forrige fokusområde', + legend: 'Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' + }, + { + name: 'Gå til neste fokusområde', + legend: 'Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' + }, + { + name: 'Hjelp for tilgjengelighet', + legend: 'Trykk ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulator', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Venstre piltast', + upArrow: 'Opp-piltast', + rightArrow: 'Høyre piltast', + downArrow: 'Ned-piltast', + insert: 'Insert', + leftWindowKey: 'Venstre Windows-tast', + rightWindowKey: 'Høyre Windows-tast', + selectKey: 'Velg nøkkel', + numpad0: 'Numerisk tastatur 0', + numpad1: 'Numerisk tastatur 1', + numpad2: 'Numerisk tastatur 2', + numpad3: 'Numerisk tastatur 3', + numpad4: 'Numerisk tastatur 4', + numpad5: 'Numerisk tastatur 5', + numpad6: 'Numerisk tastatur 6', + numpad7: 'Numerisk tastatur 7', + numpad8: 'Numerisk tastatur 8', + numpad9: 'Numerisk tastatur 9', + multiply: 'Multipliser', + add: 'Legg til', + subtract: 'Trekk fra', + decimalPoint: 'Desimaltegn', + divide: 'Divider', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semikolon', + equalSign: 'Likhetstegn', + comma: 'Komma', + dash: 'Bindestrek', + period: 'Punktum', + forwardSlash: 'Forover skråstrek', + graveAccent: 'Grav aksent', + openBracket: 'Åpne parentes', + backSlash: 'Bakover skråstrek', + closeBracket: 'Lukk parentes', + singleQuote: 'Enkelt sitattegn' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/nl.js b/sources/plugins/a11yhelp/dialogs/lang/nl.js new file mode 100644 index 0000000..00d53ea --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/nl.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'nl', { + title: 'Toegankelijkheidsinstructies', + contents: 'Help-inhoud. Druk op ESC om dit dialoog te sluiten.', + legend: [ + { + name: 'Algemeen', + items: [ + { + name: 'Werkbalk tekstverwerker', + legend: 'Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren.' + }, + + { + name: 'Dialoog tekstverwerker', + legend: + 'In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Bij dialoogvensters met meerdere tabbladen kan de tabset bereikt worden met ALT+F10 of met TAB als onderdeel van de tabvolgorde in het dialoogvenster. Als de tabset focus heeft, kun je schakalen naar het volgende en vorige tabblad met respectievelijk PIJL RECHTS en PIJL LINKS.' + }, + + { + name: 'Contextmenu tekstverwerker', + legend: 'Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC.' + }, + + { + name: 'Keuzelijst tekstverwerker', + legend: 'In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten.' + }, + + { + name: 'Elementenpad werkbalk tekstverwerker', + legend: 'Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker.' + } + ] + }, + { + name: 'Opdrachten', + items: [ + { + name: 'Ongedaan maken opdracht', + legend: 'Druk op ${undo}' + }, + { + name: 'Opnieuw uitvoeren opdracht', + legend: 'Druk op ${redo}' + }, + { + name: 'Vetgedrukt opdracht', + legend: 'Druk op ${bold}' + }, + { + name: 'Cursief opdracht', + legend: 'Druk op ${italic}' + }, + { + name: 'Onderstrepen opdracht', + legend: 'Druk op ${underline}' + }, + { + name: 'Link opdracht', + legend: 'Druk op ${link}' + }, + { + name: 'Werkbalk inklappen opdracht', + legend: 'Druk op ${toolbarCollapse}' + }, + { + name: 'Ga naar vorige focus spatie commando', + legend: 'Druk ${accessPreviousSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie voor de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken.' + }, + { + name: 'Ga naar volgende focus spatie commando', + legend: 'Druk ${accessNextSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie na de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken.' + }, + { + name: 'Toegankelijkheidshulp', + legend: 'Druk op ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Pijl naar links', + upArrow: 'Pijl omhoog', + rightArrow: 'Pijl naar rechts', + downArrow: 'Pijl naar beneden', + insert: 'Invoegen', + leftWindowKey: 'Linker Windows-toets', + rightWindowKey: 'Rechter Windows-toets', + selectKey: 'Selecteer toets', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Vermenigvuldigen', + add: 'Toevoegen', + subtract: 'Aftrekken', + decimalPoint: 'Decimaalteken', + divide: 'Delen', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Puntkomma', + equalSign: 'Is gelijk-teken', + comma: 'Komma', + dash: 'Koppelteken', + period: 'Punt', + forwardSlash: 'Slash', + graveAccent: 'Accent grave', + openBracket: 'Vierkant haakje openen', + backSlash: 'Backslash', + closeBracket: 'Vierkant haakje sluiten', + singleQuote: 'Apostrof' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/no.js b/sources/plugins/a11yhelp/dialogs/lang/no.js new file mode 100644 index 0000000..4402ddf --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/no.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'no', { + title: 'Instruksjoner for tilgjengelighet', + contents: 'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.', + legend: [ + { + name: 'Generelt', + items: [ + { + name: 'Verktøylinje for editor', + legend: 'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.' + }, + + { + name: 'Dialog for editor', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Kontekstmeny for editor', + legend: 'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.' + }, + + { + name: 'Listeboks for editor', + legend: 'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.' + }, + + { + name: 'Verktøylinje for elementsti', + legend: 'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.' + } + ] + }, + { + name: 'Kommandoer', + items: [ + { + name: 'Angre', + legend: 'Trykk ${undo}' + }, + { + name: 'Gjør om', + legend: 'Trykk ${redo}' + }, + { + name: 'Fet tekst', + legend: 'Trykk ${bold}' + }, + { + name: 'Kursiv tekst', + legend: 'Trykk ${italic}' + }, + { + name: 'Understreking', + legend: 'Trykk ${underline}' + }, + { + name: 'Link', + legend: 'Trykk ${link}' + }, + { + name: 'Skjul verktøylinje', + legend: 'Trykk ${toolbarCollapse}' + }, + { + name: 'Gå til forrige fokusområde', + legend: 'Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' + }, + { + name: 'Gå til neste fokusområde', + legend: 'Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' + }, + { + name: 'Hjelp for tilgjengelighet', + legend: 'Trykk ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/oc.js b/sources/plugins/a11yhelp/dialogs/lang/oc.js new file mode 100644 index 0000000..8df209d --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/oc.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'oc', { + title: 'Instruccions d\'accessibilitat', + contents: 'Contengut de l\'ajuda. Per tampar aquesta fenèstra, quichatz sus la tòca Escap.', + legend: [ + { + name: 'General', + items: [ + { + name: 'Barra d\'aisinas de l\'editor', + legend: 'Quichar sus ${toolbarFocus} per accedir a la barra d\'aisinas. Se desplaçar cap al groupe seguent o precedent de la barra d\'aisinas amb las tòcas Tab e Maj+Tab. Se desplaçar cap al boton seguent o precedent de la barra d\'aisinas amb las tòcas Sageta dreita e Sageta esquèrra. Quichar sus la barra d\'espaci o la tòca Entrada per activer lo boton de barra d\'aisinas.' + }, + + { + name: 'Fenèstra de l\'editor', + legend: + 'Dins una bóstia de dialòg, quichar sus Tab per passar a l\'element seguent, quichar sus Maj+Tab per passar a l\'element precedent, quichar sus Entrada per validar, quichar sus Escap per anullar. Quand una bóstia de dialòg possedís des onglets, la lista pòt èsser atenta amb Alt+F10 o amb Tab. Dins la lista dels onglets, se desplaçar cap al seguent e lo precedent amb las tòcas Sageta dreita e Sageta esquèrra respectivament.' + }, + + { + name: 'Menú contextual de l\'editor', + legend: 'Quichar sus ${contextMenu} o sus la tòca Menú per dobrir lo menú contextual. Se desplaçar ensuite cap a l\'opcion seguenta del menú amb las tòcas Tab o Sageta bas. Se desplaçar cap a l\'opcion precedenta amb las tòcas Maj+Tab o Sageta naut. Quichar sus la barra d\'espaci o la tòca Entrada per seleccionar l\'opcion del menu. Quichar sus la barra d\'espaci, la tòca Entrada o Sageta dreita per dobrir lo sosmenú de l\'opcion seleccionada. Tornar a l\'element de menú parent amb la tòca Escap o Sageta esquèrra. Tampar lo menú contextual amb Escap.' + }, + + { + name: 'Zòna de lista de l\'editor', + legend: 'Dins una lista en menú desenrotlant, se desplaçar cap a l\'element seguent de la lista amb las tòcas Tab o Sageta bas. Se desplaçar cap a l\'element precedent de la lista amb las tòcas Maj+Tab o Sageta naut. Quichar sus la barra d\'espaci o sus Entrada per seleccionar l\'opcion dins la lista. Quichar sus Escap per tampar lo menú desenrotlant.' + }, + + { + name: 'Barra del camin d\'elements de l\'editor', + legend: 'Quichar sus ${elementsPathFocus} per naviguer cap a la barra del fial d\'Ariana dels elements. Se desplaçar cap al boton de l\'element seguent amb las tòcas Tab o Sageta dreita. Se desplaçar cap al boton precedent amb las tòcas Maj+Tab o Sageta esquèrra. Quichar sus la barra d\'espaci o sus Entrada per seleccionar l\'element dins l\'editor.' + } + ] + }, + { + name: 'Comandas', + items: [ + { + name: 'Anullar la comanda', + legend: 'Quichar sus ${undo}' + }, + { + name: 'Comanda restablir', + legend: 'Quichar sus ${redo}' + }, + { + name: ' Comanda gras', + legend: 'Quichar sus ${bold}' + }, + { + name: ' Comanda italica', + legend: 'Quichar sus ${italic}' + }, + { + name: ' Comanda solinhat', + legend: 'Quichar sus ${underline}' + }, + { + name: ' Comanda ligam', + legend: 'Quichar sus ${link}' + }, + { + name: 'Comanda enrotlar la barra d\'aisinas', + legend: 'Quichar sus ${toolbarCollapse}' + }, + { + name: 'Comanda d\'accès a l\'element seleccionable precedent', + legend: 'Quichar sus ${accessNextSpace} per accedir a l\'element seleccionable inategnible lo mai pròche abans lo cursor, per exemple : doas linhas orizontalas adjacentas. Repetir la combinason de tòcas per aténher los elements seleccionables precedents.' + }, + { + name: 'Comanda d\'accès a l\'element seleccionable seguent', + legend: 'Quichar sus ${accessNextSpace} per accedir a l\'element seleccionable inatenhible lo mai pròche aprèp lo cursor, per exemple : doas linhas orizontalas adjacentas. Repetir la combinason de tòcas per aténher los elements seleccionables seguents.' + }, + { + name: ' Ajuda sus l\'accessibilitat', + legend: 'Quichar sus ${a11yHelp}' + } + ] + } + ], + tab: 'Tabulacion', + pause: 'Pausa', + capslock: 'Verr. Maj.', + escape: 'Escap', + pageUp: 'Pagina superiora', + pageDown: 'Pagina seguenta', + leftArrow: 'Sageta esquèrra', + upArrow: 'Sageta naut', + rightArrow: 'Sageta dreita', + downArrow: 'Sageta bassa', + insert: 'Inser', + leftWindowKey: 'Tòca Windows esquèrra', + rightWindowKey: 'Tòca Windows dreita', + selectKey: 'Tòca Seleccionar', + numpad0: '0 del pavat numeric', + numpad1: '1 del pavat numeric', + numpad2: '2 del pavat numeric', + numpad3: '3 del pavat numeric', + numpad4: '4 del pavat numeric', + numpad5: '5 del pavat numeric', + numpad6: '6 del pavat numeric', + numpad7: '7 del pavat numeric', + numpad8: 'Pavat numeric 8', + numpad9: '9 del pavat numeric', + multiply: 'Multiplicar', + add: 'Plus', + subtract: 'Mens', + decimalPoint: 'Punt decimal', + divide: 'Devesir', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Verr. Num.', + scrollLock: 'Arrèst desfil.', + semiColon: 'Punt-virgula', + equalSign: 'Signe egal', + comma: 'Virgula', + dash: 'Jonhent', + period: 'Punt', + forwardSlash: 'Barra oblica', + graveAccent: 'Accent grèu', + openBracket: 'Parentèsi dobèrta', + backSlash: 'Barra oblica invèrsa', + closeBracket: 'Parentèsi tampanta', + singleQuote: 'Apostròfa' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/pl.js b/sources/plugins/a11yhelp/dialogs/lang/pl.js new file mode 100644 index 0000000..825ea08 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/pl.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'pl', { + title: 'Instrukcje dotyczące dostępności', + contents: 'Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.', + legend: [ + { + name: 'Informacje ogólne', + items: [ + { + name: 'Pasek narzędzi edytora', + legend: 'Naciśnij ${toolbarFocus}, by przejść do paska narzędzi. Przejdź do następnej i poprzedniej grupy narzędzi używając TAB oraz SHIFT+TAB. Przejdź do następnego i poprzedniego przycisku paska narzędzi za pomocą STRZAŁKI W PRAWO lub STRZAŁKI W LEWO. Naciśnij SPACJĘ lub ENTER by aktywować przycisk paska narzędzi.' + }, + + { + name: 'Okno dialogowe edytora', + legend: + 'Wewnątrz okna dialogowego naciśnij TAB, by przejść do kolejnego elementu tego okna lub SHIFT+TAB, by przejść do poprzedniego elementu okna. Naciśnij ENTER w celu zatwierdzenia opcji okna dialogowego lub ESC w celu anulowania zmian. Jeśli okno dialogowe ma kilka zakładek, do listy zakładek można przejść za pomocą ALT+F10 lub TAB. Gdy lista zakładek jest aktywna, możesz przejść do kolejnej i poprzedniej zakładki za pomocą STRZAŁKI W PRAWO i STRZAŁKI W LEWO.' + }, + + { + name: 'Menu kontekstowe edytora', + legend: 'Wciśnij ${contextMenu} lub PRZYCISK APLIKACJI aby otworzyć menu kontekstowe. Przejdź do następnej pozycji menu wciskając TAB lub STRZAŁKĘ W DÓŁ. Przejdź do poprzedniej pozycji menu wciskając SHIFT + TAB lub STRZAŁKĘ W GÓRĘ. Wciśnij SPACJĘ lub ENTER aby wygrać pozycję menu. Otwórz pod-menu obecnej pozycji wciskając SPACJĘ lub ENTER lub STRZAŁKĘ W PRAWO. Wróć do pozycji nadrzędnego menu wciskając ESC lub STRZAŁKĘ W LEWO. Zamknij menu wciskając ESC.' + }, + + { + name: 'Lista w edytorze', + legend: 'Wewnątrz listy przejdź do kolejnego elementu listy za pomocą przycisku TAB lub STRZAŁKI W DÓŁ. Przejdź do poprzedniego elementu listy za pomocą SHIFT+TAB lub STRZAŁKI W GÓRĘ. Naciśnij SPACJĘ lub ENTER w celu wybrania opcji z listy. Naciśnij ESC, by zamknąć listę.' + }, + + { + name: 'Pasek ścieżki elementów edytora', + legend: 'Naciśnij ${elementsPathFocus} w celu przejścia do paska ścieżki elementów edytora. W celu przejścia do kolejnego elementu naciśnij klawisz TAB lub STRZAŁKI W PRAWO. W celu przejścia do poprzedniego elementu naciśnij klawisze SHIFT+TAB lub STRZAŁKI W LEWO. By wybrać element w edytorze, użyj klawisza SPACJI lub ENTER.' + } + ] + }, + { + name: 'Polecenia', + items: [ + { + name: 'Polecenie Cofnij', + legend: 'Naciśnij ${undo}' + }, + { + name: 'Polecenie Ponów', + legend: 'Naciśnij ${redo}' + }, + { + name: 'Polecenie Pogrubienie', + legend: 'Naciśnij ${bold}' + }, + { + name: 'Polecenie Kursywa', + legend: 'Naciśnij ${italic}' + }, + { + name: 'Polecenie Podkreślenie', + legend: 'Naciśnij ${underline}' + }, + { + name: 'Polecenie Wstaw/ edytuj odnośnik', + legend: 'Naciśnij ${link}' + }, + { + name: 'Polecenie schowaj pasek narzędzi', + legend: 'Naciśnij ${toolbarCollapse}' + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: 'Pomoc dotycząca dostępności', + legend: 'Naciśnij ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Strzałka w lewo', + upArrow: 'Strzałka w górę', + rightArrow: 'Strzałka w prawo', + downArrow: 'Strzałka w dół', + insert: 'Insert', + leftWindowKey: 'Lewy klawisz Windows', + rightWindowKey: 'Prawy klawisz Windows', + selectKey: 'Klawisz wyboru', + numpad0: 'Klawisz 0 na klawiaturze numerycznej', + numpad1: 'Klawisz 1 na klawiaturze numerycznej', + numpad2: 'Klawisz 2 na klawiaturze numerycznej', + numpad3: 'Klawisz 3 na klawiaturze numerycznej', + numpad4: 'Klawisz 4 na klawiaturze numerycznej', + numpad5: 'Klawisz 5 na klawiaturze numerycznej', + numpad6: 'Klawisz 6 na klawiaturze numerycznej', + numpad7: 'Klawisz 7 na klawiaturze numerycznej', + numpad8: 'Klawisz 8 na klawiaturze numerycznej', + numpad9: 'Klawisz 9 na klawiaturze numerycznej', + multiply: 'Przemnóż', + add: 'Plus', + subtract: 'Minus', + decimalPoint: 'Separator dziesiętny', + divide: 'Podziel', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Średnik', + equalSign: 'Znak równości', + comma: 'Przecinek', + dash: 'Pauza', + period: 'Kropka', + forwardSlash: 'Ukośnik prawy', + graveAccent: 'Akcent słaby', + openBracket: 'Nawias kwadratowy otwierający', + backSlash: 'Ukośnik lewy', + closeBracket: 'Nawias kwadratowy zamykający', + singleQuote: 'Apostrof' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/pt-br.js b/sources/plugins/a11yhelp/dialogs/lang/pt-br.js new file mode 100644 index 0000000..030df98 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/pt-br.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'pt-br', { + title: 'Instruções de Acessibilidade', + contents: 'Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.', + legend: [ + { + name: 'Geral', + items: [ + { + name: 'Barra de Ferramentas do Editor', + legend: 'Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT+TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.' + }, + + { + name: 'Diálogo do Editor', + legend: + 'Dentro de um diálogo, pressione TAB para navegar para o próximo elemento. Pressione SHIFT+TAB para mover para o elemento anterior. Pressione ENTER ara enviar o diálogo. pressione ESC para cancelar o diálogo. Quando um diálogo tem múltiplas abas, a lista de abas pode ser acessada com ALT+F10 ou TAB, como parte da ordem de tabulação do diálogo. Com a lista de abas em foco, mova para a próxima aba e para a aba anterior com a SETA DIREITA ou SETA ESQUERDA, respectivamente.' + }, + + { + name: 'Menu de Contexto do Editor', + legend: 'Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC.' + }, + + { + name: 'Caixa de Lista do Editor', + legend: 'Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista.' + }, + + { + name: 'Barra de Caminho do Elementos do Editor', + legend: 'Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.' + } + ] + }, + { + name: 'Comandos', + items: [ + { + name: ' Comando Desfazer', + legend: 'Pressione ${undo}' + }, + { + name: ' Comando Refazer', + legend: 'Pressione ${redo}' + }, + { + name: ' Comando Negrito', + legend: 'Pressione ${bold}' + }, + { + name: ' Comando Itálico', + legend: 'Pressione ${italic}' + }, + { + name: ' Comando Sublinhado', + legend: 'Pressione ${underline}' + }, + { + name: ' Comando Link', + legend: 'Pressione ${link}' + }, + { + name: ' Comando Fechar Barra de Ferramentas', + legend: 'Pressione ${toolbarCollapse}' + }, + { + name: 'Acessar o comando anterior de spaço de foco', + legend: 'Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo antes do cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes.' + }, + { + name: 'Acessar próximo fomando de spaço de foco', + legend: 'Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo após o cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes.' + }, + { + name: ' Ajuda de Acessibilidade', + legend: 'Pressione ${a11yHelp}' + } + ] + } + ], + tab: 'Tecla Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Seta à Esquerda', + upArrow: 'Seta à Cima', + rightArrow: 'Seta à Direita', + downArrow: 'Seta à Baixo', + insert: 'Insert', + leftWindowKey: 'Tecla do Windows Esquerda', + rightWindowKey: 'Tecla do Windows Direita', + selectKey: 'Tecla Selecionar', + numpad0: '0 do Teclado Numérico', + numpad1: '1 do Teclado Numérico', + numpad2: '2 do Teclado Numérico', + numpad3: '3 do Teclado Numérico', + numpad4: '4 do Teclado Numérico', + numpad5: '5 do Teclado Numérico', + numpad6: '6 do Teclado Numérico', + numpad7: '7 do Teclado Numérico', + numpad8: '8 do Teclado Numérico', + numpad9: '9 do Teclado Numérico', + multiply: 'Multiplicar', + add: 'Mais', + subtract: 'Subtrair', + decimalPoint: 'Ponto', + divide: 'Dividir', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Ponto-e-vírgula', + equalSign: 'Igual', + comma: 'Vírgula', + dash: 'Hífen', + period: 'Ponto', + forwardSlash: 'Barra', + graveAccent: 'Acento Grave', + openBracket: 'Abrir Conchetes', + backSlash: 'Contra-barra', + closeBracket: 'Fechar Colchetes', + singleQuote: 'Aspas Simples' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/pt.js b/sources/plugins/a11yhelp/dialogs/lang/pt.js new file mode 100644 index 0000000..986a377 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/pt.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'pt', { + title: 'Instruções de acessibilidade', + contents: 'Conteúdo de ajuda. Use a tecla ESC para fechar esta janela.', + legend: [ + { + name: 'Geral', + items: [ + { + name: 'Barra de ferramentas do editor', + legend: 'Clique em ${toolbarFocus} para navegar na barra de ferramentas. Para navegar entre o grupo da barra de ferramentas anterior e seguinte use TAB e SHIFT+TAB. Para navegar entre o botão da barra de ferramentas seguinte e anterior use a SETA DIREITA ou SETA ESQUERDA. Carregue em ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.' + }, + + { + name: 'Janela do editor', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Menu de contexto do editor', + legend: 'Clique em ${contextMenu} ou TECLA APLICAÇÃO para abrir o menu de contexto. Depois vá para a opção do menu seguinte com TAB ou SETA PARA BAIXO. Vá para a opção anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO, ENTER ou SETA DIREITA. GVá para o item do menu parente com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC.' + }, + + { + name: 'Editor de caixa em lista', + legend: 'Dentro de uma lista, para navegar para o item seguinte da lista use TAB ou SETA PARA BAIXO. Para o item anterior da lista use SHIFT+TAB ou SETA PARA BAIXO. Carregue em ESPAÇO ou ENTER para selecionar a opção lista. Carregue em ESC para fechar a caixa da lista.' + }, + + { + name: 'Editor da barra de caminho dos elementos', + legend: 'Clique em ${elementsPathFocus} para navegar na barra de caminho dos elementos. Para o botão do elemento seguinte use TAB ou SETA DIREITA. para o botão anterior use SHIFT+TAB ou SETA ESQUERDA. Carregue em ESPAÇO ou ENTER para selecionar o elemento no editor.' + } + ] + }, + { + name: 'Comandos', + items: [ + { + name: 'Comando de anular', + legend: 'Carregar ${undo}' + }, + { + name: 'Comando de refazer', + legend: 'Clique ${redo}' + }, + { + name: 'Comando de negrito', + legend: 'Pressione ${bold}' + }, + { + name: 'Comando de itálico', + legend: 'Pressione ${italic}' + }, + { + name: 'Comando de sublinhado', + legend: 'Pressione ${underline}' + }, + { + name: 'Comando de hiperligação', + legend: 'Pressione ${link}' + }, + { + name: 'Comando de ocultar barra de ferramentas', + legend: 'Pressione ${toolbarCollapse}' + }, + { + name: 'Aceder ao comando espaço de foco anterior', + legend: 'Clique em ${accessPreviousSpace} para aceder ao espaço do focos inalcançável mais perto antes do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes.' + }, + { + name: 'Acesso comando do espaço focus seguinte', + legend: 'Pressione ${accessNextSpace} para aceder ao espaço do focos inalcançável mais perto depois do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes.' + }, + { + name: 'Ajuda a acessibilidade', + legend: 'Pressione ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pausa', + capslock: 'Maiúsculas', + escape: 'Esc', + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Seta esquerda', + upArrow: 'Seta para cima', + rightArrow: 'Seta direita', + downArrow: 'Seta para baixo', + insert: 'Inserir', + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiplicar', + add: 'Adicionar', + subtract: 'Subtrair', + decimalPoint: 'Decimal Point', // MISSING + divide: 'Separar', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Vírgula', + dash: 'Cardinal', + period: 'Ponto', + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Acento grave', + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Plica' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ro.js b/sources/plugins/a11yhelp/dialogs/lang/ro.js new file mode 100644 index 0000000..a182bbd --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ro.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ro', { + title: 'Instrucțiuni de accesibilitate', + contents: 'Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.', + legend: [ + { + name: 'General', + items: [ + { + name: 'Editează bara instrumente.', + legend: 'Apasă ${toolbarFocus} pentru a naviga prin bara de instrumente. Pentru a te mișca prin grupurile de instrumente folosește tastele TAB și SHIFT+TAB. Pentru a te mișca intre diverse instrumente folosește tastele SĂGEATĂ DREAPTA sau SĂGEATĂ STÂNGA. Apasă butonul SPAȚIU sau ENTER pentru activarea instrumentului.' + }, + + { + name: 'Dialog editor', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor meniu contextual', + legend: 'Apasă ${contextMenu} sau TASTA MENIU pentru a deschide meniul contextual. Treci la următoarea opțiune din meniu cu TAB sau SĂGEATĂ JOS. Treci la opțiunea anterioară cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta opțiunea din meniu. Deschide sub-meniul opțiunii curente cu SPAȚIU sau ENTER sau SĂGEATĂ DREAPTA. Revino la elementul din meniul părinte cu ESC sau SĂGEATĂ STÂNGA. Închide meniul de context cu ESC.' + }, + + { + name: 'Editor Casetă Listă', + legend: 'În interiorul unei liste, treci la următorull element cu TAB sau SĂGEATĂ JOS. Treci la elementul anterior din listă cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta opțiunea din listă. Apasă ESC pentru a închide lista.' + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Comenzi', + items: [ + { + name: ' Undo command', // MISSING + legend: 'Apasă ${undo}' + }, + { + name: 'Comanda precedentă', + legend: 'Apasă ${redo}' + }, + { + name: 'Comanda Îngroșat', + legend: 'Apasă ${bold}' + }, + { + name: 'Comanda Inclinat', + legend: 'Apasă ${italic}' + }, + { + name: 'Comanda Subliniere', + legend: 'Apasă ${underline}' + }, + { + name: 'Comanda Legatură', + legend: 'Apasă ${link}' + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ru.js b/sources/plugins/a11yhelp/dialogs/lang/ru.js new file mode 100644 index 0000000..19d502a --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ru.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ru', { + title: 'Горячие клавиши', + contents: 'Помощь. Для закрытия этого окна нажмите ESC.', + legend: [ + { + name: 'Основное', + items: [ + { + name: 'Панель инструментов', + legend: 'Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT+TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов.' + }, + + { + name: 'Диалоги', + legend: + 'Внутри диалога, нажмите TAB чтобы перейти к следующему элементу диалога, нажмите SHIFT+TAB чтобы перейти к предыдущему элементу диалога, нажмите ENTER чтобы отправить диалог, нажмите ESC чтобы отменить диалог. Когда диалоговое окно имеет несколько вкладок, получить доступ к панели вкладок как части диалога можно нажатием или сочетания ALT+F10 или TAB, при этом активные элементы диалога будут перебираться с учетом порядка табуляции. При активной панели вкладок, переход к следующей или предыдущей вкладке осуществляется нажатием стрелки "ВПРАВО" или стрелки "ВЛЕВО" соответственно.' + }, + + { + name: 'Контекстное меню', + legend: 'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой "ВНИЗ". Переход к предыдущей опции - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой "ВПРАВО". Возврат к родительскому пункту меню - ESC или стрелкой "ВЛЕВО". Закрытие контекстного меню - ESC.' + }, + + { + name: 'Редактор списка', + legend: 'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой "ВНИЗ". Переход к предыдущему пункту списка - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.' + }, + + { + name: 'Путь к элементу', + legend: 'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой "ВПРАВО". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой "ВЛЕВО". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.' + } + ] + }, + { + name: 'Команды', + items: [ + { + name: 'Отменить', + legend: 'Нажмите ${undo}' + }, + { + name: 'Повторить', + legend: 'Нажмите ${redo}' + }, + { + name: 'Полужирный', + legend: 'Нажмите ${bold}' + }, + { + name: 'Курсив', + legend: 'Нажмите ${italic}' + }, + { + name: 'Подчеркнутый', + legend: 'Нажмите ${underline}' + }, + { + name: 'Гиперссылка', + legend: 'Нажмите ${link}' + }, + { + name: 'Свернуть панель инструментов', + legend: 'Нажмите ${toolbarCollapse}' + }, + { + name: 'Команды доступа к предыдущему фокусному пространству', + legend: 'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом "^", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.' + }, + { + name: 'Команды доступа к следующему фокусному пространству', + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' + }, + { + name: 'Справка по горячим клавишам', + legend: 'Нажмите ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Esc', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Стрелка влево', + upArrow: 'Стрелка вверх', + rightArrow: 'Стрелка вправо', + downArrow: 'Стрелка вниз', + insert: 'Insert', + leftWindowKey: 'Левая клавиша Windows', + rightWindowKey: 'Правая клавиша Windows', + selectKey: 'Выбрать', + numpad0: 'Цифра 0', + numpad1: 'Цифра 1', + numpad2: 'Цифра 2', + numpad3: 'Цифра 3', + numpad4: 'Цифра 4', + numpad5: 'Цифра 5', + numpad6: 'Цифра 6', + numpad7: 'Цифра 7', + numpad8: 'Цифра 8', + numpad9: 'Цифра 9', + multiply: 'Умножить', + add: 'Плюс', + subtract: 'Вычесть', + decimalPoint: 'Десятичная точка', + divide: 'Делить', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Точка с запятой', + equalSign: 'Равно', + comma: 'Запятая', + dash: 'Тире', + period: 'Точка', + forwardSlash: 'Наклонная черта', + graveAccent: 'Апостроф', + openBracket: 'Открыть скобку', + backSlash: 'Обратная наклонная черта', + closeBracket: 'Закрыть скобку', + singleQuote: 'Одинарная кавычка' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/si.js b/sources/plugins/a11yhelp/dialogs/lang/si.js new file mode 100644 index 0000000..14d94ad --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/si.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'si', { + title: 'ළඟා වියහැකි ', + contents: 'උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න', + legend: [ + { + name: 'පොදු කරුණු', + items: [ + { + name: 'සංස්කරණ මෙවලම් ', + legend: 'ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.' + }, + + { + name: 'සංස්කරණ ', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'සංස්කරණ අඩංගුවට ', + legend: 'ඔබන්න ${අන්තර්ගත මෙනුව} හෝ APPLICATION KEY අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද, දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට ESC හෝ LEFT ARROW බොත්තම ද. අන්තර්ගත-මෙනුව වැසීමට ESC බොත්තම ද ඔබන්න.' + }, + + { + name: 'සංස්කරණ තේරුම් ', + legend: 'තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට SHIFT+TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට SPACE හෝ ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න.' + }, + + { + name: 'සංස්කරණ අංග සහිත ', + legend: 'ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.' + } + ] + }, + { + name: 'විධාන', + items: [ + { + name: 'විධානය වෙනස් ', + legend: 'ඔබන්න ${වෙනස් කිරීම}' + }, + { + name: 'විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.', + legend: 'ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}' + }, + { + name: 'තද අකුරින් විධාන', + legend: 'ඔබන්න ${තද }' + }, + { + name: 'බැධී අකුරු විධාන', + legend: 'ඔබන්න ${බැධී අකුරු }' + }, + { + name: 'යටින් ඉරි ඇද ඇති විධාන.', + legend: 'ඔබන්න ${යටින් ඉරි ඇද ඇති}' + }, + { + name: 'සම්බන්ධිත විධාන', + legend: 'ඔබන්න ${සම්බන්ධ }' + }, + { + name: 'මෙවලම් තීරු හැකුලුම් විධාන', + legend: 'ඔබන්න ${මෙවලම් තීරු හැකුලුම් }' + }, + { + name: 'යොමුවීමට පෙර වැදගත් විධාන', + legend: 'ඔබන්න ${යොමුවීමට ඊළඟ }' + }, + { + name: 'යොමුවීමට ඊළග වැදගත් විධාන', + legend: 'ඔබන්න ${යොමුවීමට ඊළඟ }' + }, + { + name: 'ප්‍රවේශ ', + legend: 'ඔබන්න ${a11y }' + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/sk.js b/sources/plugins/a11yhelp/dialogs/lang/sk.js new file mode 100644 index 0000000..2d74c3b --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/sk.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'sk', { + title: 'Inštrukcie prístupnosti', + contents: 'Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.', + legend: [ + { + name: 'Všeobecne', + items: [ + { + name: 'Lišta nástrojov editora', + legend: 'Stlačte ${toolbarFocus} pre navigáciu na lištu nástrojov. Medzi ďalšou a predchádzajúcou lištou nástrojov sa pohybujete s TAB a SHIFT+TAB. Medzi ďalším a predchádzajúcim tlačidlom na lište nástrojov sa pohybujete s pravou šípkou a ľavou šípkou. Stlačte medzerník alebo ENTER pre aktiváciu tlačidla lišty nástrojov.' + }, + + { + name: 'Editorový dialóg', + legend: + 'V dialógovom okne stlačte TAB pre presun na ďalší prvok, SHIFT+TAB pre presun na predchádzajúci prvok, ENTER pre odoslanie, ESC pre zrušenie. Keď má dialógové okno viacero kariet, zoznam kariet dosiahnete buď stlačením ALT+F10 alebo s TAB v príslušnom poradí kariet. So zameraným zoznamom kariet sa pohybujte k ďalšej alebo predchádzajúcej karte cez PRAVÚ a ĽAVÚ ŠÍPKU.' + }, + + { + name: 'Editorové kontextové menu', + legend: 'Stlačte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ďalšie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodičovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC.' + }, + + { + name: 'Editorov box zoznamu', + legend: 'V boxe zoznamu, presuňte sa na ďalšiu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti zoznamu. Stlačte ESC pre zatvorenie boxu zoznamu.' + }, + + { + name: 'Editorove pásmo cesty prvku', + legend: 'Stlačte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlačidlo ďalšieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlačidlu s SHIFT+TAB alebo ľavou šípkou. Stlačte medzerník alebo ENTER pre výber prvku v editore.' + } + ] + }, + { + name: 'Príkazy', + items: [ + { + name: 'Vrátiť príkazy', + legend: 'Stlačte ${undo}' + }, + { + name: 'Nanovo vrátiť príkaz', + legend: 'Stlačte ${redo}' + }, + { + name: 'Príkaz na stučnenie', + legend: 'Stlačte ${bold}' + }, + { + name: 'Príkaz na kurzívu', + legend: 'Stlačte ${italic}' + }, + { + name: 'Príkaz na podčiarknutie', + legend: 'Stlačte ${underline}' + }, + { + name: 'Príkaz na odkaz', + legend: 'Stlačte ${link}' + }, + { + name: 'Príkaz na zbalenie lišty nástrojov', + legend: 'Stlačte ${toolbarCollapse}' + }, + { + name: 'Prejsť na predchádzajúcu zamerateľnú medzeru príkazu', + legend: 'Stlačte ${accessPreviousSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery pred vsuvkuo. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier.' + }, + { + name: 'Prejsť na ďalší ', + legend: 'Stlačte ${accessNextSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery po vsuvke. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier.' + }, + { + name: 'Pomoc prístupnosti', + legend: 'Stlačte ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Stránka hore', + pageDown: 'Stránka dole', + leftArrow: 'Šípka naľavo', + upArrow: 'Šípka hore', + rightArrow: 'Šípka napravo', + downArrow: 'Šípka dole', + insert: 'Insert', + leftWindowKey: 'Ľavé Windows tlačidlo', + rightWindowKey: 'Pravé Windows tlačidlo', + selectKey: 'Tlačidlo Select', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Násobenie', + add: 'Sčítanie', + subtract: 'Odčítanie', + decimalPoint: 'Desatinná čiarka', + divide: 'Delenie', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Bodkočiarka', + equalSign: 'Rovná sa', + comma: 'Čiarka', + dash: 'Pomĺčka', + period: 'Bodka', + forwardSlash: 'Lomítko', + graveAccent: 'Zdôrazňovanie prízvuku', + openBracket: 'Hranatá zátvorka otváracia', + backSlash: 'Backslash', + closeBracket: 'Hranatá zátvorka zatváracia', + singleQuote: 'Jednoduché úvodzovky' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/sl.js b/sources/plugins/a11yhelp/dialogs/lang/sl.js new file mode 100644 index 0000000..bb38713 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/sl.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'sl', { + title: 'Navodila za dostopnost', + contents: 'Vsebina pomoči. Če želite zapreti pogovorno okno, pritisnite ESC.', + legend: [ + { + name: 'Splošno', + items: [ + { + name: 'Orodna vrstica urejevalnika', + legend: 'Pritisnite ${toolbarFocus} za pomik v orodno vrstico. Z TAB in SHIFT+TAB se pomikate na naslednjo in prejšnjo skupino orodne vrstice. Z DESNO PUŠČICO ali LEVO PUŠČICO se pomikate na naslednji in prejšnji gumb orodne vrstice. Pritisnite SPACE ali ENTER, da aktivirate gumb orodne vrstice.' + }, + + { + name: 'Urejevalno Pogovorno Okno', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Kontekstni meni urejevalnika', + legend: 'Pritisnite ${contextMenu} ali APPLICATION KEY, da odprete kontekstni meni. Nato se premaknite na naslednjo možnost menija s tipko TAB ali PUŠČICA DOL. Premakniti se na prejšnjo možnost z SHIFT + TAB ali PUŠČICA GOR. Pritisnite SPACE ali ENTER za izbiro možnosti menija. Odprite podmeni trenutne možnosti menija s tipko SPACE ali ENTER ali DESNA PUŠČICA. Vrnite se na matični element menija s tipko ESC ali LEVA PUŠČICA. Zaprite kontekstni meni z ESC.' + }, + + { + name: 'Urejevalno Seznamsko Polje', + legend: 'Znotraj seznama, se premaknete na naslednji element seznama s tipko TAB ali PUŠČICO DOL. Z SHIFT+TAB ali PUŠČICO GOR se premaknete na prejšnji element seznama. Pritisnite tipko SPACE ali ENTER za izbiro elementa. Pritisnite tipko ESC, da zaprete seznam.' + }, + + { + name: 'Urejevalna vrstica poti elementa', + legend: 'Pritisnite ${elementsPathFocus} za pomikanje po vrstici elementnih poti. S TAB ali DESNA PUŠČICA se premaknete na naslednji gumb elementa. Z SHIFT+TAB ali LEVO PUŠČICO se premaknete na prejšnji gumb elementa. Pritisnite SPACE ali ENTER za izbiro elementa v urejevalniku.' + } + ] + }, + { + name: 'Ukazi', + items: [ + { + name: 'Razveljavi ukaz', + legend: 'Pritisnite ${undo}' + }, + { + name: 'Ponovi ukaz', + legend: 'Pritisnite ${redo}' + }, + { + name: 'Krepki ukaz', + legend: 'Pritisnite ${bold}' + }, + { + name: 'Ležeči ukaz', + legend: 'Pritisnite ${italic}' + }, + { + name: 'Poudarni ukaz', + legend: 'Pritisnite ${underline}' + }, + { + name: 'Ukaz povezave', + legend: 'Pritisnite ${link}' + }, + { + name: 'Skrči Orodno Vrstico Ukaz', + legend: 'Pritisnite ${toolbarCollapse}' + }, + { + name: 'Dostop do prejšnjega ukaza ostrenja', + legend: 'Pritisnite ${accessPreviousSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora pred strešico, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore.' + }, + { + name: 'Dostop do naslednjega ukaza ostrenja', + legend: 'Pritisnite ${accessNextSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora po strešici, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore.' + }, + { + name: 'Pomoč dostopnosti', + legend: 'Pritisnite ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Puščica levo', + upArrow: 'Puščica gor', + rightArrow: 'Puščica desno', + downArrow: 'Puščica dol', + insert: 'Insert', + leftWindowKey: 'Leva tipka Windows', + rightWindowKey: 'Desna tipka Windows', + selectKey: 'Select tipka', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Zmnoži', + add: 'Dodaj', + subtract: 'Odštej', + decimalPoint: 'Decimalna vejica', + divide: 'Deli', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Podpičje', + equalSign: 'Enačaj', + comma: 'Vejica', + dash: 'Vezaj', + period: 'Pika', + forwardSlash: 'Desna poševnica', + graveAccent: 'Krativec', + openBracket: 'Oklepaj', + backSlash: 'Leva poševnica', + closeBracket: 'Zaklepaj', + singleQuote: 'Opuščaj' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/sq.js b/sources/plugins/a11yhelp/dialogs/lang/sq.js new file mode 100644 index 0000000..c5947cc --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/sq.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'sq', { + title: 'Udhëzimet e Qasjes', + contents: 'Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.', + legend: [ + { + name: 'Të përgjithshme', + items: [ + { + name: 'Shiriti i Redaktuesit', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Dialogu i Redaktuesit', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Komandat', + items: [ + { + name: 'Rikthe komandën', + legend: 'Shtyp ${undo}' + }, + { + name: 'Ribëj komandën', + legend: 'Shtyp ${redo}' + }, + { + name: 'Komanda e trashjes së tekstit', + legend: 'Shtyp ${bold}' + }, + { + name: 'Komanda kursive', + legend: 'Shtyp ${italic}' + }, + { + name: 'Komanda e nënvijëzimit', + legend: 'Shtyp ${underline}' + }, + { + name: 'Komanda e Nyjes', + legend: 'Shtyp ${link}' + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Shtyp ${toolbarCollapse}' + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: 'Ndihmë Qasjeje', + legend: 'Shtyp ${a11yHelp}' + } + ] + } + ], + tab: 'Fletë', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Shenja majtas', + upArrow: 'Shenja sipër', + rightArrow: 'Shenja djathtas', + downArrow: 'Shenja poshtë', + insert: 'Shto', + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Shto', + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semicolon', + equalSign: 'Equal Sign', // MISSING + comma: 'Presje', + dash: 'vizë', + period: 'Pikë', + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Hape kllapën', + backSlash: 'Backslash', // MISSING + closeBracket: 'Mbylle kllapën', + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/sr-latn.js b/sources/plugins/a11yhelp/dialogs/lang/sr-latn.js new file mode 100644 index 0000000..5b743ac --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/sr-latn.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'sr-latn', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'Opšte', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/sr.js b/sources/plugins/a11yhelp/dialogs/lang/sr.js new file mode 100644 index 0000000..0e3e979 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/sr.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'sr', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'Опште', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Commands', // MISSING + items: [ + { + name: ' Undo command', // MISSING + legend: 'Press ${undo}' // MISSING + }, + { + name: ' Redo command', // MISSING + legend: 'Press ${redo}' // MISSING + }, + { + name: ' Bold command', // MISSING + legend: 'Press ${bold}' // MISSING + }, + { + name: ' Italic command', // MISSING + legend: 'Press ${italic}' // MISSING + }, + { + name: ' Underline command', // MISSING + legend: 'Press ${underline}' // MISSING + }, + { + name: ' Link command', // MISSING + legend: 'Press ${link}' // MISSING + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/sv.js b/sources/plugins/a11yhelp/dialogs/lang/sv.js new file mode 100644 index 0000000..4962b95 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/sv.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'sv', { + title: 'Hjälpmedelsinstruktioner', + contents: 'Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.', + legend: [ + { + name: 'Allmänt', + items: [ + { + name: 'Editor verktygsfält', + legend: 'Tryck på ${toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT+TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck SPACE eller ENTER för att aktivera knappen i verktygsfältet.' + }, + + { + name: 'Dialogeditor', + legend: + 'Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan, tryck SKIFT+TAB för att flytta till föregående fält, tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT+F10 eller TAB för att navigera till fliklistan. med fliklistan vald flytta till nästa och föregående flik med HÖGER- eller VÄNSTERPIL.' + }, + + { + name: 'Editor för innehållsmeny', + legend: 'Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC.' + }, + + { + name: 'Editor för list-box', + legend: 'Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT+TAB eller UPPIL. Tryck SPACE eller ENTER för att välja listan alternativet. Tryck ESC för att stänga list-boxen.' + }, + + { + name: 'Editor för elementens sökväg', + legend: 'Tryck på ${elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT+TAB eller VÄNSTERPIL. Tryck SPACE eller ENTER för att välja element i redigeraren.' + } + ] + }, + { + name: 'Kommandon', + items: [ + { + name: 'Ångra kommando', + legend: 'Tryck på ${undo}' + }, + { + name: 'Gör om kommando', + legend: 'Tryck på ${redo}' + }, + { + name: 'Kommandot fet stil', + legend: 'Tryck på ${bold}' + }, + { + name: 'Kommandot kursiv', + legend: 'Tryck på ${italic}' + }, + { + name: 'Kommandot understruken', + legend: 'Tryck på ${underline}' + }, + { + name: 'Kommandot länk', + legend: 'Tryck på ${link}' + }, + { + name: 'Verktygsfält Dölj kommandot', + legend: 'Tryck på ${toolbarCollapse}' + }, + { + name: 'Gå till föregående fokus plats', + legend: 'Tryck på ${accessPreviousSpace} för att gå till närmast onåbara utrymme före markören, exempel: två intilliggande HR element. Repetera tangentkombinationen för att gå till nästa.' + }, + { + name: 'Tillgå nästa fokuskommandots utrymme', + legend: 'Tryck ${accessNextSpace} på för att komma åt den närmaste onåbar fokus utrymme efter cirkumflex, till exempel: två intilliggande HR element. Upprepa tangentkombinationen för att nå avlägsna fokus utrymmen.' + }, + { + name: 'Hjälp om tillgänglighet', + legend: 'Tryck ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Paus', + capslock: 'Caps lock', + escape: 'Escape', + pageUp: 'Sida Up', + pageDown: 'Sida Ned', + leftArrow: 'Vänsterpil', + upArrow: 'Uppil', + rightArrow: 'Högerpil', + downArrow: 'Nedåtpil', + insert: 'Infoga', + leftWindowKey: 'Vänster Windowstangent', + rightWindowKey: 'Höger Windowstangent', + selectKey: 'Välj tangent', + numpad0: 'Nummer 0', + numpad1: 'Nummer 1', + numpad2: 'Nummer 2', + numpad3: 'Nummer 3', + numpad4: 'Nummer 4', + numpad5: 'Nummer 5', + numpad6: 'Nummer 6', + numpad7: 'Nummer 7', + numpad8: 'Nummer 8', + numpad9: 'Nummer 9', + multiply: 'Multiplicera', + add: 'Addera', + subtract: 'Minus', + decimalPoint: 'Decimalpunkt', + divide: 'Dividera', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Semikolon', + equalSign: 'Lika med tecken', + comma: 'Komma', + dash: 'Minus', + period: 'Punkt', + forwardSlash: 'Snedstreck framåt', + graveAccent: 'Accent', + openBracket: 'Öppningsparentes', + backSlash: 'Snedstreck bakåt', + closeBracket: 'Slutparentes', + singleQuote: 'Enkelt Citattecken' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/th.js b/sources/plugins/a11yhelp/dialogs/lang/th.js new file mode 100644 index 0000000..1382894 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/th.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'th', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'ทั่วไป', + items: [ + { + name: 'แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์', + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'คำสั่ง', + items: [ + { + name: 'เลิกทำคำสั่ง', + legend: 'วาง ${undo}' + }, + { + name: 'คำสั่งสำหรับทำซ้ำ', + legend: 'วาง ${redo}' + }, + { + name: 'คำสั่งสำหรับตัวหนา', + legend: 'วาง ${bold}' + }, + { + name: 'คำสั่งสำหรับตัวเอียง', + legend: 'วาง ${italic}' + }, + { + name: 'คำสั่งสำหรับขีดเส้นใต้', + legend: 'วาง ${underline}' + }, + { + name: 'คำสั่งสำหรับลิงก์', + legend: 'วาง ${link}' + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: 'Press ${toolbarCollapse}' // MISSING + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: 'Press ${a11yHelp}' // MISSING + } + ] + } + ], + tab: 'Tab', // MISSING + pause: 'Pause', // MISSING + capslock: 'Caps Lock', // MISSING + escape: 'Escape', // MISSING + pageUp: 'Page Up', // MISSING + pageDown: 'Page Down', // MISSING + leftArrow: 'Left Arrow', // MISSING + upArrow: 'Up Arrow', // MISSING + rightArrow: 'Right Arrow', // MISSING + downArrow: 'Down Arrow', // MISSING + insert: 'Insert', // MISSING + leftWindowKey: 'Left Windows key', // MISSING + rightWindowKey: 'Right Windows key', // MISSING + selectKey: 'Select key', // MISSING + numpad0: 'Numpad 0', // MISSING + numpad1: 'Numpad 1', // MISSING + numpad2: 'Numpad 2', // MISSING + numpad3: 'Numpad 3', // MISSING + numpad4: 'Numpad 4', // MISSING + numpad5: 'Numpad 5', // MISSING + numpad6: 'Numpad 6', // MISSING + numpad7: 'Numpad 7', // MISSING + numpad8: 'Numpad 8', // MISSING + numpad9: 'Numpad 9', // MISSING + multiply: 'Multiply', // MISSING + add: 'Add', // MISSING + subtract: 'Subtract', // MISSING + decimalPoint: 'Decimal Point', // MISSING + divide: 'Divide', // MISSING + f1: 'F1', // MISSING + f2: 'F2', // MISSING + f3: 'F3', // MISSING + f4: 'F4', // MISSING + f5: 'F5', // MISSING + f6: 'F6', // MISSING + f7: 'F7', // MISSING + f8: 'F8', // MISSING + f9: 'F9', // MISSING + f10: 'F10', // MISSING + f11: 'F11', // MISSING + f12: 'F12', // MISSING + numLock: 'Num Lock', // MISSING + scrollLock: 'Scroll Lock', // MISSING + semiColon: 'Semicolon', // MISSING + equalSign: 'Equal Sign', // MISSING + comma: 'Comma', // MISSING + dash: 'Dash', // MISSING + period: 'Period', // MISSING + forwardSlash: 'Forward Slash', // MISSING + graveAccent: 'Grave Accent', // MISSING + openBracket: 'Open Bracket', // MISSING + backSlash: 'Backslash', // MISSING + closeBracket: 'Close Bracket', // MISSING + singleQuote: 'Single Quote' // MISSING +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/tr.js b/sources/plugins/a11yhelp/dialogs/lang/tr.js new file mode 100644 index 0000000..15306a5 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/tr.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'tr', { + title: 'Erişilebilirlik Talimatları', + contents: 'Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.', + legend: [ + { + name: 'Genel', + items: [ + { + name: 'Düzenleyici Araç Çubuğu', + legend: 'Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT+TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın.' + }, + + { + name: 'Diyalog Düzenleyici', + legend: + 'Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın.' + }, + + { + name: 'İçerik Menü Editörü', + legend: 'İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU\'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın.' + }, + + { + name: 'Liste Kutusu Editörü', + legend: 'Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT+TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın.' + }, + + { + name: 'Element Yol Çubuğu Editörü', + legend: 'Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT+TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın.' + } + ] + }, + { + name: 'Komutlar', + items: [ + { + name: 'Komutu geri al', + legend: '$(undo)\'ya basın' + }, + { + name: 'Komutu geri al', + legend: '${redo} basın' + }, + { + name: ' Kalın komut', + legend: '${bold} basın' + }, + { + name: ' İtalik komutu', + legend: '${italic} basın' + }, + { + name: ' Alttan çizgi komutu', + legend: '${underline} basın' + }, + { + name: ' Bağlantı komutu', + legend: '${link} basın' + }, + { + name: ' Araç çubuğu Toplama komutu', + legend: '${toolbarCollapse} basın' + }, + { + name: 'Önceki komut alanına odaklan', + legend: 'Düzeltme imleçinden önce, en yakın uzaktaki alana erişmek için ${accessPreviousSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın.' + }, + { + name: 'Sonraki komut alanına odaklan', + legend: 'Düzeltme imleçinden sonra, en yakın uzaktaki alana erişmek için ${accessNextSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın.' + }, + { + name: 'Erişilebilirlik Yardımı', + legend: '${a11yHelp}\'e basın' + } + ] + } + ], + tab: 'Sekme tuşu', + pause: 'Durdurma tuşu', + capslock: 'Büyük harf tuşu', + escape: 'Vazgeç tuşu', + pageUp: 'Sayfa Yukarı', + pageDown: 'Sayfa Aşağı', + leftArrow: 'Sol ok', + upArrow: 'Yukarı ok', + rightArrow: 'Sağ ok', + downArrow: 'Aşağı ok', + insert: 'Araya gir', + leftWindowKey: 'Sol windows tuşu', + rightWindowKey: 'Sağ windows tuşu', + selectKey: 'Seçme tuşu', + numpad0: 'Nümerik 0', + numpad1: 'Nümerik 1', + numpad2: 'Nümerik 2', + numpad3: 'Nümerik 3', + numpad4: 'Nümerik 4', + numpad5: 'Nümerik 5', + numpad6: 'Nümerik 6', + numpad7: 'Nümerik 7', + numpad8: 'Nümerik 8', + numpad9: 'Nümerik 9', + multiply: 'Çarpma', + add: 'Toplama', + subtract: 'Çıkarma', + decimalPoint: 'Ondalık işareti', + divide: 'Bölme', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lk', + scrollLock: 'Scr Lk', + semiColon: 'Noktalı virgül', + equalSign: 'Eşittir', + comma: 'Virgül', + dash: 'Eksi', + period: 'Nokta', + forwardSlash: 'İleri eğik çizgi', + graveAccent: 'Üst tırnak', + openBracket: 'Parantez aç', + backSlash: 'Ters eğik çizgi', + closeBracket: 'Parantez kapa', + singleQuote: 'Tek tırnak' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/tt.js b/sources/plugins/a11yhelp/dialogs/lang/tt.js new file mode 100644 index 0000000..bdd9847 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/tt.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'tt', { + title: 'Accessibility Instructions', // MISSING + contents: 'Help Contents. To close this dialog press ESC.', // MISSING + legend: [ + { + name: 'Гомуми', + items: [ + { + name: 'Editor Toolbar', // MISSING + legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.' // MISSING + }, + + { + name: 'Editor Dialog', // MISSING + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Editor Context Menu', // MISSING + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING + }, + + { + name: 'Editor List Box', // MISSING + legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING + }, + + { + name: 'Editor Element Path Bar', // MISSING + legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING + } + ] + }, + { + name: 'Командалар', + items: [ + { + name: 'Кайтару', + legend: '${undo} басыгыз' + }, + { + name: 'Кабатлау', + legend: '${redo} басыгыз' + }, + { + name: 'Калын', + legend: '${bold} басыгыз' + }, + { + name: 'Курсив', + legend: '${italic} басыгыз' + }, + { + name: 'Астына сызылган', + legend: '${underline} басыгыз' + }, + { + name: 'Сылталама', + legend: '${link} басыгыз' + }, + { + name: ' Toolbar Collapse command', // MISSING + legend: '${toolbarCollapse} басыгыз' + }, + { + name: ' Access previous focus space command', // MISSING + legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Access next focus space command', // MISSING + legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING + }, + { + name: ' Accessibility Help', // MISSING + legend: '${a11yHelp} басыгыз' + } + ] + } + ], + tab: 'Tab', + pause: 'Тыныш', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Сул якка ук', + upArrow: 'Өскә таба ук', + rightArrow: 'Уң якка ук', + downArrow: 'Аска таба ук', + insert: 'Өстәү', + leftWindowKey: 'Сул Windows төймəсе', + rightWindowKey: 'Уң Windows төймəсе', + selectKey: 'Select төймəсе', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Тапкырлау', + add: 'Кушу', + subtract: 'Алу', + decimalPoint: 'Унарлы нокта', + divide: 'Бүлү', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Нокталы өтер', + equalSign: 'Тигезлек билгесе', + comma: 'Өтер', + dash: 'Сызык', + period: 'Дәрәҗә', + forwardSlash: 'Кыек сызык', + graveAccent: 'Гравис', + openBracket: 'Җәя ачу', + backSlash: 'Кире кыек сызык', + closeBracket: 'Җәя ябу', + singleQuote: 'Бер иңле куштырнаклар' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/ug.js b/sources/plugins/a11yhelp/dialogs/lang/ug.js new file mode 100644 index 0000000..1771562 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/ug.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'ug', { + title: 'قوشۇمچە چۈشەندۈرۈش', + contents: 'ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.', + legend: [ + { + name: 'ئادەتتىكى', + items: [ + { + name: 'قورال بالداق تەھرىر', + legend: '${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ.' + }, + + { + name: 'تەھرىرلىگۈچ سۆزلەشكۈسى', + legend: + 'سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT+TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT+F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛SHIFT+ TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ.' + }, + + { + name: 'تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى', + legend: '${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ.' + }, + + { + name: 'تەھرىرلىگۈچ تىزىمى', + legend: 'تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ.' + }, + + { + name: 'تەھرىرلىگۈچ ئېلېمېنت يول بالداق', + legend: '${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ.' + } + ] + }, + { + name: 'بۇيرۇق', + items: [ + { + name: 'بۇيرۇقتىن يېنىۋال', + legend: '${undo} نى بېسىڭ' + }, + { + name: 'قايتىلاش بۇيرۇقى', + legend: '${redo} نى بېسىڭ' + }, + { + name: 'توملىتىش بۇيرۇقى', + legend: '${bold} نى بېسىڭ' + }, + { + name: 'يانتۇ بۇيرۇقى', + legend: '${italic} نى بېسىڭ' + }, + { + name: 'ئاستى سىزىق بۇيرۇقى', + legend: '${underline} نى بېسىڭ' + }, + { + name: 'ئۇلانما بۇيرۇقى', + legend: '${link} نى بېسىڭ' + }, + { + name: 'قورال بالداق قاتلاش بۇيرۇقى', + legend: '${toolbarCollapse} نى بېسىڭ' + }, + { + name: 'ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق', + legend: '${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.' + }, + { + name: 'كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق', + legend: '${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.' + }, + { + name: 'توسالغۇسىز لايىھە چۈشەندۈرۈشى', + legend: '${a11yHelp} نى بېسىڭ' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Escape', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'سول يا ئوق', + upArrow: 'ئۈستى يا ئوق', + rightArrow: 'ئوڭ يا ئوق', + downArrow: 'ئاستى يا ئوق', + insert: 'قىستۇر', + leftWindowKey: 'سول Windows كۇنۇپكىسى', + rightWindowKey: 'ئوڭ Windows كۇنۇپكىسى', + selectKey: 'تاللاش كۇنۇپكىسى', + numpad0: 'سان تاختا 0', + numpad1: 'سان تاختا 1', + numpad2: 'سان تاختا 2', + numpad3: 'سان تاختا 3', + numpad4: 'سان تاختا 4', + numpad5: 'سان تاختا 5', + numpad6: 'سان تاختا 6', + numpad7: 'سان تاختا 7', + numpad8: 'سان تاختا 8', + numpad9: 'سان تاختا 9', + multiply: 'يۇلتۇز كۇنۇپكىسى', + add: 'قوشۇش', + subtract: 'ئېلىش', + decimalPoint: 'كەسىر چېكىت', + divide: 'بۆلۈش', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'سان قۇلۇپ كۇنۇپكىسى', + scrollLock: 'سۈرگۈچ قۇلۇپ كۇنۇپكىسى', + semiColon: 'چېكىتلىك پەش', + equalSign: 'تەڭلىك بەلگىسى', + comma: 'پەش', + dash: 'سىزىقچە', + period: 'چېكىت', + forwardSlash: 'سولغا يانتۇ سىزىق', + graveAccent: 'ئۇرغۇ بەلگىسى', + openBracket: 'ئېچىلغان تىرناق', + backSlash: 'ئوڭغا يانتۇ سىزىق', + closeBracket: 'يېپىلغان تىرناق', + singleQuote: 'يالاڭ پەش' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/uk.js b/sources/plugins/a11yhelp/dialogs/lang/uk.js new file mode 100644 index 0000000..d1e8589 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/uk.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'uk', { + title: 'Спеціальні Інструкції', + contents: 'Довідка. Натисніть ESC і вона зникне.', + legend: [ + { + name: 'Основне', + items: [ + { + name: 'Панель Редактора', + legend: 'Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT+TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів.' + }, + + { + name: 'Діалог Редактора', + legend: + 'Усередині діалогу, натисніть TAB щоб перейти до наступного елементу діалогу, натисніть SHIFT+TAB щоб перейти до попереднього елемента діалогу, натисніть ENTER щоб відправити діалог, натисніть ESC щоб скасувати діалог. Коли діалогове вікно має декілька вкладок, отримати доступ до панелі вкладок як частині діалогу можна натисканням або поєднання ALT+F10 або TAB, при цьому активні елементи діалогу будуть перебиратися з урахуванням порядку табуляції. При активній панелі вкладок, перехід до наступної або попередньої вкладці здійснюється натисканням стрілки "ВПРАВО" або стрілки "ВЛЕВО" відповідно.' + }, + + { + name: 'Контекстне Меню Редактора', + legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC.' + }, + + { + name: 'Скринька Списків Редактора', + legend: 'Усередині списку, перехід до наступного пункту списку виконується клавішею TAB або СТРІЛКА ВНИЗ. Перехід до попереднього елемента списку клавішею SHIFT+TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список.' + }, + + { + name: 'Шлях до елемента редактора', + legend: 'Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі.' + } + ] + }, + { + name: 'Команди', + items: [ + { + name: 'Відмінити команду', + legend: 'Натисніть ${undo}' + }, + { + name: 'Повторити', + legend: 'Натисніть ${redo}' + }, + { + name: 'Жирний', + legend: 'Натисніть ${bold}' + }, + { + name: 'Курсив', + legend: 'Натисніть ${italic}' + }, + { + name: 'Підкреслений', + legend: 'Натисніть ${underline}' + }, + { + name: 'Посилання', + legend: 'Натисніть ${link}' + }, + { + name: 'Згорнути панель інструментів', + legend: 'Натисніть ${toolbarCollapse}' + }, + { + name: 'Доступ до попереднього місця фокусування', + legend: 'Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.' + }, + { + name: 'Доступ до наступного місця фокусування', + legend: 'Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.' + }, + { + name: 'Допомога з доступності', + legend: 'Натисніть ${a11yHelp}' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Esc', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: 'Ліва стрілка', + upArrow: 'Стрілка вгору', + rightArrow: 'Права стрілка', + downArrow: 'Стрілка вниз', + insert: 'Вставити', + leftWindowKey: 'Ліва клавіша Windows', + rightWindowKey: 'Права клавіша Windows', + selectKey: 'Виберіть клавішу', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: 'Множення', + add: 'Додати', + subtract: 'Віднімання', + decimalPoint: 'Десяткова кома', + divide: 'Ділення', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Крапка з комою', + equalSign: 'Знак рівності', + comma: 'Кома', + dash: 'Тире', + period: 'Період', + forwardSlash: 'Коса риска', + graveAccent: 'Гравіс', + openBracket: 'Відкрити дужку', + backSlash: 'Зворотна коса риска', + closeBracket: 'Закрити дужку', + singleQuote: 'Одинарні лапки' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/vi.js b/sources/plugins/a11yhelp/dialogs/lang/vi.js new file mode 100644 index 0000000..497deb2 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/vi.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'vi', { + title: 'Hướng dẫn trợ năng', + contents: 'Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.', + legend: [ + { + name: 'Chung', + items: [ + { + name: 'Thanh công cụ soạn thảo', + legend: 'Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT+TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công cụ.' + }, + + { + name: 'Hộp thoại Biên t', + legend: + 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.' // MISSING + }, + + { + name: 'Trình đơn Ngữ cảnh cBộ soạn thảo', + legend: 'Nhấn ${contextMenu} hoặc PHÍM ỨNG DỤNG để mở thực đơn ngữ cảnh. Sau đó nhấn TAB hoặc MŨI TÊN XUỐNG để di chuyển đến tuỳ chọn tiếp theo của thực đơn. Nhấn SHIFT+TAB hoặc MŨI TÊN LÊN để quay lại tuỳ chọn trước. Nhấn DẤU CÁCH hoặc ENTER để chọn tuỳ chọn của thực đơn. Nhấn DẤU CÁCH hoặc ENTER hoặc MŨI TÊN SANG PHẢI để mở thực đơn con của tuỳ chọn hiện tại. Nhấn ESC hoặc MŨI TÊN SANG TRÁI để quay trở lại thực đơn gốc. Nhấn ESC để đóng thực đơn ngữ cảnh.' + }, + + { + name: 'Hộp danh sách trình biên tập', + legend: 'Trong một danh sách chọn, di chuyển đối tượng tiếp theo với phím TAB hoặc phím mũi tên hướng xuống. Di chuyển đến đối tượng trước đó bằng cách nhấn tổ hợp phím SHIFT+TAB hoặc mũi tên hướng lên. Phím khoảng cách hoặc phím ENTER để chọn các tùy chọn trong danh sách. Nhấn phím ESC để đóng lại danh sách chọn.' + }, + + { + name: 'Thanh đường dẫn các đối tượng', + legend: 'Nhấn ${elementsPathFocus} để điều hướng các đối tượng trong thanh đường dẫn. Di chuyển đến đối tượng tiếp theo bằng phím TAB hoặc phím mũi tên bên phải. Di chuyển đến đối tượng trước đó bằng tổ hợp phím SHIFT+TAB hoặc phím mũi tên bên trái. Nhấn phím khoảng cách hoặc ENTER để chọn đối tượng trong trình soạn thảo.' + } + ] + }, + { + name: 'Lệnh', + items: [ + { + name: 'Làm lại lện', + legend: 'Ấn ${undo}' + }, + { + name: 'Làm lại lệnh', + legend: 'Ấn ${redo}' + }, + { + name: 'Lệnh in đậm', + legend: 'Ấn ${bold}' + }, + { + name: 'Lệnh in nghiêng', + legend: 'Ấn ${italic}' + }, + { + name: 'Lệnh gạch dưới', + legend: 'Ấn ${underline}' + }, + { + name: 'Lệnh liên kết', + legend: 'Nhấn ${link}' + }, + { + name: 'Lệnh hiển thị thanh công cụ', + legend: 'Nhấn${toolbarCollapse}' + }, + { + name: 'Truy cập đến lệnh tập trung vào khoảng cách trước đó', + legend: 'Ấn ${accessPreviousSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách.' + }, + { + name: 'Truy cập phần đối tượng lệnh khoảng trống', + legend: 'Ấn ${accessNextSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách.' + }, + { + name: 'Trợ giúp liên quan', + legend: 'Nhấn ${a11yHelp}' + } + ] + } + ], + tab: 'Phím Tab', + pause: 'Phím Pause', + capslock: 'Phím Caps Lock', + escape: 'Phím Escape', + pageUp: 'Phím Page Up', + pageDown: 'Phím Page Down', + leftArrow: 'Phím Left Arrow', + upArrow: 'Phím Up Arrow', + rightArrow: 'Phím Right Arrow', + downArrow: 'Phím Down Arrow', + insert: 'Chèn', + leftWindowKey: 'Phím Left Windows', + rightWindowKey: 'Phím Right Windows ', + selectKey: 'Chọn phím', + numpad0: 'Phím 0', + numpad1: 'Phím 1', + numpad2: 'Phím 2', + numpad3: 'Phím 3', + numpad4: 'Phím 4', + numpad5: 'Phím 5', + numpad6: 'Phím 6', + numpad7: 'Phím 7', + numpad8: 'Phím 8', + numpad9: 'Phím 9', + multiply: 'Nhân', + add: 'Thêm', + subtract: 'Trừ', + decimalPoint: 'Điểm số thập phân', + divide: 'Chia', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: 'Dấu chấm phẩy', + equalSign: 'Đăng nhập bằng', + comma: 'Dấu phẩy', + dash: 'Dấu gạch ngang', + period: 'Phím .', + forwardSlash: 'Phím /', + graveAccent: 'Phím `', + openBracket: 'Open Bracket', + backSlash: 'Dấu gạch chéo ngược', + closeBracket: 'Gần giá đỡ', + singleQuote: 'Trích dẫn' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/zh-cn.js b/sources/plugins/a11yhelp/dialogs/lang/zh-cn.js new file mode 100644 index 0000000..d2d0f2b --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/zh-cn.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'zh-cn', { + title: '辅助功能说明', + contents: '帮助内容。要关闭此对话框请按 ESC 键。', + legend: [ + { + name: '常规', + items: [ + { + name: '编辑器工具栏', + legend: '按 ${toolbarFocus} 切换到工具栏,使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个或下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。' + }, + + { + name: '编辑器对话框', + legend: + '在对话框内,按 TAB 键移动到下一个字段,按 SHIFT + TAB 组合键移动到上一个字段,按 ENTER 键提交对话框,按 ESC 键取消对话框。对于有多选项卡的对话框,可以按 ALT + F10 直接切换到或者按 TAB 键逐步移到选项卡列表,当焦点移到选项卡列表时可以用左右箭头键来移动到前后的选项卡。' + }, + + { + name: '编辑器上下文菜单', + legend: '用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项;SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键,ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。' + }, + + { + name: '编辑器列表框', + legend: '在列表框中,移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT+TAB 组合键或者上箭头键,用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。' + }, + + { + name: '编辑器元素路径栏', + legend: '按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。' + } + ] + }, + { + name: '命令', + items: [ + { + name: ' 撤消命令', + legend: '按 ${undo}' + }, + { + name: ' 重做命令', + legend: '按 ${redo}' + }, + { + name: ' 加粗命令', + legend: '按 ${bold}' + }, + { + name: ' 倾斜命令', + legend: '按 ${italic}' + }, + { + name: ' 下划线命令', + legend: '按 ${underline}' + }, + { + name: ' 链接命令', + legend: '按 ${link}' + }, + { + name: ' 工具栏折叠命令', + legend: '按 ${toolbarCollapse}' + }, + { + name: '访问前一个焦点区域的命令', + legend: '按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域,例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。' + }, + { + name: '访问下一个焦点区域命令', + legend: '按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。' + }, + { + name: '辅助功能帮助', + legend: '按 ${a11yHelp}' + } + ] + } + ], + tab: 'Tab 键', + pause: '暂停键', + capslock: '大写锁定键', + escape: 'Esc 键', + pageUp: '上翻页键', + pageDown: '下翻页键', + leftArrow: '向左箭头键', + upArrow: '向上箭头键', + rightArrow: '向右箭头键', + downArrow: '向下箭头键', + insert: '插入键', + leftWindowKey: '左 WIN 键', + rightWindowKey: '右 WIN 键', + selectKey: '选择键', + numpad0: '小键盘 0 键', + numpad1: '小键盘 1 键', + numpad2: '小键盘 2 键', + numpad3: '小键盘 3 键', + numpad4: '小键盘 4 键', + numpad5: '小键盘 5 键', + numpad6: '小键盘 6 键', + numpad7: '小键盘 7 键', + numpad8: '小键盘 8 键', + numpad9: '小键盘 9 键', + multiply: '星号键', + add: '加号键', + subtract: '减号键', + decimalPoint: '小数点键', + divide: '除号键', + f1: 'F1 键', + f2: 'F2 键', + f3: 'F3 键', + f4: 'F4 键', + f5: 'F5 键', + f6: 'F6 键', + f7: 'F7 键', + f8: 'F8 键', + f9: 'F9 键', + f10: 'F10 键', + f11: 'F11 键', + f12: 'F12 键', + numLock: '数字锁定键', + scrollLock: '滚动锁定键', + semiColon: '分号键', + equalSign: '等号键', + comma: '逗号键', + dash: '短划线键', + period: '句号键', + forwardSlash: '斜杠键', + graveAccent: '重音符键', + openBracket: '左中括号键', + backSlash: '反斜杠键', + closeBracket: '右中括号键', + singleQuote: '单引号键' +} ); diff --git a/sources/plugins/a11yhelp/dialogs/lang/zh.js b/sources/plugins/a11yhelp/dialogs/lang/zh.js new file mode 100644 index 0000000..0fe1310 --- /dev/null +++ b/sources/plugins/a11yhelp/dialogs/lang/zh.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'a11yhelp', 'zh', { + title: '輔助工具指南', + contents: '說明內容。若要關閉此對話框請按「ESC」。', + legend: [ + { + name: '一般', + items: [ + { + name: '編輯器工具列', + legend: '請按 ${toolbarFocus} 以導覽到工具列。利用 TAB 或 SHIFT+TAB 以便移動到下一個及前一個工具列群組。利用右方向鍵或左方向鍵以便移動到下一個及上一個工具列按鈕。按下空白鍵或 ENTER 鍵啟用工具列按鈕。' + }, + + { + name: '編輯器對話方塊', + legend: + '在對話框中,按下 TAB 鍵以導覽到下一個對話框元素,按下 SHIFT+TAB 以移動到上一個對話框元素,按下 ENTER 以遞交對話框,按下 ESC 以取消對話框。當對話框有多個分頁時,可以使用 ALT+F10 或是在對話框分頁順序中的一部份按下 TAB 以使用分頁列表。焦點在分頁列表上時,分別使用右方向鍵及左方向鍵移動到下一個及上一個分頁。' + }, + + { + name: '編輯器內容功能表', + legend: '請按下「${contextMenu}」或是「應用程式鍵」以開啟內容選單。以「TAB」或是「↓」鍵移動到下一個選單選項。以「SHIFT + TAB」或是「↑」鍵移動到上一個選單選項。按下「空白鍵」或是「ENTER」鍵以選取選單選項。以「空白鍵」或「ENTER」或「→」開啟目前選項之子選單。以「ESC」或「←」回到父選單。以「ESC」鍵關閉內容選單」。' + }, + + { + name: '編輯器清單方塊', + legend: '在清單方塊中,使用 TAB 或下方向鍵移動到下一個列表項目。使用 SHIFT+TAB 或上方向鍵移動到上一個列表項目。按下空白鍵或 ENTER 以選取列表選項。按下 ESC 以關閉清單方塊。' + }, + + { + name: '編輯器元件路徑工具列', + legend: '請按 ${elementsPathFocus} 以瀏覽元素路徑列。利用 TAB 或右方向鍵以便移動到下一個元素按鈕。利用 SHIFT 或左方向鍵以便移動到上一個按鈕。按下空白鍵或 ENTER 鍵來選取在編輯器中的元素。' + } + ] + }, + { + name: '命令', + items: [ + { + name: '復原命令', + legend: '請按下「${undo}」' + }, + { + name: '重複命令', + legend: '請按下「 ${redo}」' + }, + { + name: '粗體命令', + legend: '請按下「${bold}」' + }, + { + name: '斜體', + legend: '請按下「${italic}」' + }, + { + name: '底線命令', + legend: '請按下「${underline}」' + }, + { + name: '連結', + legend: '請按下「${link}」' + }, + { + name: '隱藏工具列', + legend: '請按下「${toolbarCollapse}」' + }, + { + name: '存取前一個焦點空間命令', + legend: '請按下 ${accessPreviousSpace} 以存取最近但無法靠近之插字符號前的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。' + }, + { + name: '存取下一個焦點空間命令', + legend: '請按下 ${accessNextSpace} 以存取最近但無法靠近之插字符號後的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。' + }, + { + name: '協助工具說明', + legend: '請按下「${a11yHelp}」' + } + ] + } + ], + tab: 'Tab', + pause: 'Pause', + capslock: 'Caps Lock', + escape: 'Esc', + pageUp: 'Page Up', + pageDown: 'Page Down', + leftArrow: '向左箭號', + upArrow: '向上鍵號', + rightArrow: '向右鍵號', + downArrow: '向下鍵號', + insert: '插入', + leftWindowKey: '左方 Windows 鍵', + rightWindowKey: '右方 Windows 鍵', + selectKey: '選擇鍵', + numpad0: 'Numpad 0', + numpad1: 'Numpad 1', + numpad2: 'Numpad 2', + numpad3: 'Numpad 3', + numpad4: 'Numpad 4', + numpad5: 'Numpad 5', + numpad6: 'Numpad 6', + numpad7: 'Numpad 7', + numpad8: 'Numpad 8', + numpad9: 'Numpad 9', + multiply: '乘號', + add: '新增', + subtract: '減號', + decimalPoint: '小數點', + divide: '除號', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + numLock: 'Num Lock', + scrollLock: 'Scroll Lock', + semiColon: '分號', + equalSign: '等號', + comma: '逗號', + dash: '虛線', + period: '句點', + forwardSlash: '斜線', + graveAccent: '抑音符號', + openBracket: '左方括號', + backSlash: '反斜線', + closeBracket: '右方括號', + singleQuote: '單引號' +} ); diff --git a/sources/plugins/a11yhelp/plugin.js b/sources/plugins/a11yhelp/plugin.js new file mode 100644 index 0000000..9e2925a --- /dev/null +++ b/sources/plugins/a11yhelp/plugin.js @@ -0,0 +1,51 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Plugin definition for the a11yhelp, which provides a dialog + * with accessibility related help. + */ + +( function() { + var pluginName = 'a11yhelp', + commandName = 'a11yHelp'; + + CKEDITOR.plugins.add( pluginName, { + requires: 'dialog', + + // List of available localizations. + // jscs:disable + availableLangs: { af:1,ar:1,az:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,'de-ch':1,el:1,en:1,'en-gb':1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,fr:1,'fr-ca':1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,oc:1,pl:1,pt:1,'pt-br':1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,sr:1,'sr-latn':1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,zh:1,'zh-cn':1 }, + // jscs:enable + + init: function( editor ) { + var plugin = this; + editor.addCommand( commandName, { + exec: function() { + var langCode = editor.langCode; + langCode = + plugin.availableLangs[ langCode ] ? langCode : + plugin.availableLangs[ langCode.replace( /-.*/, '' ) ] ? langCode.replace( /-.*/, '' ) : + 'en'; + + CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( plugin.path + 'dialogs/lang/' + langCode + '.js' ), function() { + editor.lang.a11yhelp = plugin.langEntries[ langCode ]; + editor.openDialog( commandName ); + } ); + }, + modes: { wysiwyg: 1, source: 1 }, + readOnly: 1, + canUndo: false + } ); + + editor.setKeystroke( CKEDITOR.ALT + 48 /*0*/, 'a11yHelp' ); + CKEDITOR.dialog.add( commandName, this.path + 'dialogs/a11yhelp.js' ); + + editor.on( 'ariaEditorHelpLabel', function( evt ) { + evt.data.label = editor.lang.common.editorHelp; + } ); + } + } ); +} )(); diff --git a/sources/plugins/basicstyles/icons/bold.png b/sources/plugins/basicstyles/icons/bold.png new file mode 100644 index 0000000..d714916 Binary files /dev/null and b/sources/plugins/basicstyles/icons/bold.png differ diff --git a/sources/plugins/basicstyles/icons/hidpi/bold.png b/sources/plugins/basicstyles/icons/hidpi/bold.png new file mode 100644 index 0000000..2de207d Binary files /dev/null and b/sources/plugins/basicstyles/icons/hidpi/bold.png differ diff --git a/sources/plugins/basicstyles/icons/hidpi/italic.png b/sources/plugins/basicstyles/icons/hidpi/italic.png new file mode 100644 index 0000000..2c2dae4 Binary files /dev/null and b/sources/plugins/basicstyles/icons/hidpi/italic.png differ diff --git a/sources/plugins/basicstyles/icons/hidpi/strike.png b/sources/plugins/basicstyles/icons/hidpi/strike.png new file mode 100644 index 0000000..19c5e22 Binary files /dev/null and b/sources/plugins/basicstyles/icons/hidpi/strike.png differ diff --git a/sources/plugins/basicstyles/icons/hidpi/subscript.png b/sources/plugins/basicstyles/icons/hidpi/subscript.png new file mode 100644 index 0000000..585d59b Binary files /dev/null and b/sources/plugins/basicstyles/icons/hidpi/subscript.png differ diff --git a/sources/plugins/basicstyles/icons/hidpi/superscript.png b/sources/plugins/basicstyles/icons/hidpi/superscript.png new file mode 100644 index 0000000..9daa12a Binary files /dev/null and b/sources/plugins/basicstyles/icons/hidpi/superscript.png differ diff --git a/sources/plugins/basicstyles/icons/hidpi/underline.png b/sources/plugins/basicstyles/icons/hidpi/underline.png new file mode 100644 index 0000000..6653814 Binary files /dev/null and b/sources/plugins/basicstyles/icons/hidpi/underline.png differ diff --git a/sources/plugins/basicstyles/icons/italic.png b/sources/plugins/basicstyles/icons/italic.png new file mode 100644 index 0000000..5f8aaae Binary files /dev/null and b/sources/plugins/basicstyles/icons/italic.png differ diff --git a/sources/plugins/basicstyles/icons/strike.png b/sources/plugins/basicstyles/icons/strike.png new file mode 100644 index 0000000..5842b7a Binary files /dev/null and b/sources/plugins/basicstyles/icons/strike.png differ diff --git a/sources/plugins/basicstyles/icons/subscript.png b/sources/plugins/basicstyles/icons/subscript.png new file mode 100644 index 0000000..db11f78 Binary files /dev/null and b/sources/plugins/basicstyles/icons/subscript.png differ diff --git a/sources/plugins/basicstyles/icons/superscript.png b/sources/plugins/basicstyles/icons/superscript.png new file mode 100644 index 0000000..3df28d2 Binary files /dev/null and b/sources/plugins/basicstyles/icons/superscript.png differ diff --git a/sources/plugins/basicstyles/icons/underline.png b/sources/plugins/basicstyles/icons/underline.png new file mode 100644 index 0000000..160be92 Binary files /dev/null and b/sources/plugins/basicstyles/icons/underline.png differ diff --git a/sources/plugins/basicstyles/lang/af.js b/sources/plugins/basicstyles/lang/af.js new file mode 100644 index 0000000..bcceb14 --- /dev/null +++ b/sources/plugins/basicstyles/lang/af.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'af', { + bold: 'Vet', + italic: 'Skuins', + strike: 'Deurgestreep', + subscript: 'Onderskrif', + superscript: 'Bo-skrif', + underline: 'Onderstreep' +} ); diff --git a/sources/plugins/basicstyles/lang/ar.js b/sources/plugins/basicstyles/lang/ar.js new file mode 100644 index 0000000..fb4adc6 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ar.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ar', { + bold: 'عريض', + italic: 'مائل', + strike: 'يتوسطه خط', + subscript: 'منخفض', + superscript: 'مرتفع', + underline: 'تسطير' +} ); diff --git a/sources/plugins/basicstyles/lang/az.js b/sources/plugins/basicstyles/lang/az.js new file mode 100644 index 0000000..097a1ec --- /dev/null +++ b/sources/plugins/basicstyles/lang/az.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'az', { + bold: 'Qalın', + italic: 'Kursiv', + strike: 'Üstüxətli', + subscript: 'Aşağı indeks', + superscript: 'Yuxarı indeks', + underline: 'Altdan xətt' +} ); diff --git a/sources/plugins/basicstyles/lang/bg.js b/sources/plugins/basicstyles/lang/bg.js new file mode 100644 index 0000000..56f6f7d --- /dev/null +++ b/sources/plugins/basicstyles/lang/bg.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'bg', { + bold: 'Удебелен', + italic: 'Наклонен', + strike: 'Зачертан текст', + subscript: 'Индексиран текст', + superscript: 'Суперскрипт', + underline: 'Подчертан' +} ); diff --git a/sources/plugins/basicstyles/lang/bn.js b/sources/plugins/basicstyles/lang/bn.js new file mode 100644 index 0000000..fd790a4 --- /dev/null +++ b/sources/plugins/basicstyles/lang/bn.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'bn', { + bold: 'বোল্ড', + italic: 'বাঁকা', + strike: 'স্ট্রাইক থ্রু', + subscript: 'অধোলেখ', + superscript: 'অভিলেখ', + underline: 'আন্ডারলাইন' +} ); diff --git a/sources/plugins/basicstyles/lang/bs.js b/sources/plugins/basicstyles/lang/bs.js new file mode 100644 index 0000000..9188f98 --- /dev/null +++ b/sources/plugins/basicstyles/lang/bs.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'bs', { + bold: 'Boldiraj', + italic: 'Ukosi', + strike: 'Precrtaj', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Podvuci' +} ); diff --git a/sources/plugins/basicstyles/lang/ca.js b/sources/plugins/basicstyles/lang/ca.js new file mode 100644 index 0000000..2924d1e --- /dev/null +++ b/sources/plugins/basicstyles/lang/ca.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ca', { + bold: 'Negreta', + italic: 'Cursiva', + strike: 'Ratllat', + subscript: 'Subíndex', + superscript: 'Superíndex', + underline: 'Subratllat' +} ); diff --git a/sources/plugins/basicstyles/lang/cs.js b/sources/plugins/basicstyles/lang/cs.js new file mode 100644 index 0000000..737c648 --- /dev/null +++ b/sources/plugins/basicstyles/lang/cs.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'cs', { + bold: 'Tučné', + italic: 'Kurzíva', + strike: 'Přeškrtnuté', + subscript: 'Dolní index', + superscript: 'Horní index', + underline: 'Podtržené' +} ); diff --git a/sources/plugins/basicstyles/lang/cy.js b/sources/plugins/basicstyles/lang/cy.js new file mode 100644 index 0000000..3acb736 --- /dev/null +++ b/sources/plugins/basicstyles/lang/cy.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'cy', { + bold: 'Bras', + italic: 'Italig', + strike: 'Llinell Trwyddo', + subscript: 'Is-sgript', + superscript: 'Uwchsgript', + underline: 'Tanlinellu' +} ); diff --git a/sources/plugins/basicstyles/lang/da.js b/sources/plugins/basicstyles/lang/da.js new file mode 100644 index 0000000..0b1f3e8 --- /dev/null +++ b/sources/plugins/basicstyles/lang/da.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'da', { + bold: 'Fed', + italic: 'Kursiv', + strike: 'Gennemstreget', + subscript: 'Sænket skrift', + superscript: 'Hævet skrift', + underline: 'Understreget' +} ); diff --git a/sources/plugins/basicstyles/lang/de-ch.js b/sources/plugins/basicstyles/lang/de-ch.js new file mode 100644 index 0000000..2370c04 --- /dev/null +++ b/sources/plugins/basicstyles/lang/de-ch.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'de-ch', { + bold: 'Fett', + italic: 'Kursiv', + strike: 'Durchgestrichen', + subscript: 'Tiefgestellt', + superscript: 'Hochgestellt', + underline: 'Unterstrichen' +} ); diff --git a/sources/plugins/basicstyles/lang/de.js b/sources/plugins/basicstyles/lang/de.js new file mode 100644 index 0000000..fbc92e4 --- /dev/null +++ b/sources/plugins/basicstyles/lang/de.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'de', { + bold: 'Fett', + italic: 'Kursiv', + strike: 'Durchgestrichen', + subscript: 'Tiefgestellt', + superscript: 'Hochgestellt', + underline: 'Unterstrichen' +} ); diff --git a/sources/plugins/basicstyles/lang/el.js b/sources/plugins/basicstyles/lang/el.js new file mode 100644 index 0000000..2c72cda --- /dev/null +++ b/sources/plugins/basicstyles/lang/el.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'el', { + bold: 'Έντονη', + italic: 'Πλάγια', + strike: 'Διακριτή Διαγραφή', + subscript: 'Δείκτης', + superscript: 'Εκθέτης', + underline: 'Υπογράμμιση' +} ); diff --git a/sources/plugins/basicstyles/lang/en-au.js b/sources/plugins/basicstyles/lang/en-au.js new file mode 100644 index 0000000..6b9dc7e --- /dev/null +++ b/sources/plugins/basicstyles/lang/en-au.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'en-au', { + bold: 'Bold', + italic: 'Italic', + strike: 'Strike Through', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Underline' +} ); diff --git a/sources/plugins/basicstyles/lang/en-ca.js b/sources/plugins/basicstyles/lang/en-ca.js new file mode 100644 index 0000000..612b2b8 --- /dev/null +++ b/sources/plugins/basicstyles/lang/en-ca.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'en-ca', { + bold: 'Bold', + italic: 'Italic', + strike: 'Strike Through', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Underline' +} ); diff --git a/sources/plugins/basicstyles/lang/en-gb.js b/sources/plugins/basicstyles/lang/en-gb.js new file mode 100644 index 0000000..418058e --- /dev/null +++ b/sources/plugins/basicstyles/lang/en-gb.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'en-gb', { + bold: 'Bold', + italic: 'Italic', + strike: 'Strike Through', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Underline' +} ); diff --git a/sources/plugins/basicstyles/lang/en.js b/sources/plugins/basicstyles/lang/en.js new file mode 100644 index 0000000..3c9bc32 --- /dev/null +++ b/sources/plugins/basicstyles/lang/en.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'en', { + bold: 'Bold', + italic: 'Italic', + strike: 'Strikethrough', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Underline' +} ); diff --git a/sources/plugins/basicstyles/lang/eo.js b/sources/plugins/basicstyles/lang/eo.js new file mode 100644 index 0000000..995f0c3 --- /dev/null +++ b/sources/plugins/basicstyles/lang/eo.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'eo', { + bold: 'Grasa', + italic: 'Kursiva', + strike: 'Trastreko', + subscript: 'Suba indico', + superscript: 'Supra indico', + underline: 'Substreko' +} ); diff --git a/sources/plugins/basicstyles/lang/es.js b/sources/plugins/basicstyles/lang/es.js new file mode 100644 index 0000000..baaf99f --- /dev/null +++ b/sources/plugins/basicstyles/lang/es.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'es', { + bold: 'Negrita', + italic: 'Cursiva', + strike: 'Tachado', + subscript: 'Subíndice', + superscript: 'Superíndice', + underline: 'Subrayado' +} ); diff --git a/sources/plugins/basicstyles/lang/et.js b/sources/plugins/basicstyles/lang/et.js new file mode 100644 index 0000000..8dee05e --- /dev/null +++ b/sources/plugins/basicstyles/lang/et.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'et', { + bold: 'Paks', + italic: 'Kursiiv', + strike: 'Läbijoonitud', + subscript: 'Allindeks', + superscript: 'Ülaindeks', + underline: 'Allajoonitud' +} ); diff --git a/sources/plugins/basicstyles/lang/eu.js b/sources/plugins/basicstyles/lang/eu.js new file mode 100644 index 0000000..7017540 --- /dev/null +++ b/sources/plugins/basicstyles/lang/eu.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'eu', { + bold: 'Lodia', + italic: 'Etzana', + strike: 'Marratua', + subscript: 'Azpi-indizea', + superscript: 'Goi-indizea', + underline: 'Azpimarratu' +} ); diff --git a/sources/plugins/basicstyles/lang/fa.js b/sources/plugins/basicstyles/lang/fa.js new file mode 100644 index 0000000..49343fb --- /dev/null +++ b/sources/plugins/basicstyles/lang/fa.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'fa', { + bold: 'درشت', + italic: 'خمیده', + strike: 'خط‌خورده', + subscript: 'زیرنویس', + superscript: 'بالانویس', + underline: 'زیرخط‌دار' +} ); diff --git a/sources/plugins/basicstyles/lang/fi.js b/sources/plugins/basicstyles/lang/fi.js new file mode 100644 index 0000000..5e1fbce --- /dev/null +++ b/sources/plugins/basicstyles/lang/fi.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'fi', { + bold: 'Lihavoitu', + italic: 'Kursivoitu', + strike: 'Yliviivattu', + subscript: 'Alaindeksi', + superscript: 'Yläindeksi', + underline: 'Alleviivattu' +} ); diff --git a/sources/plugins/basicstyles/lang/fo.js b/sources/plugins/basicstyles/lang/fo.js new file mode 100644 index 0000000..f48b73a --- /dev/null +++ b/sources/plugins/basicstyles/lang/fo.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'fo', { + bold: 'Feit skrift', + italic: 'Skráskrift', + strike: 'Yvirstrikað', + subscript: 'Lækkað skrift', + superscript: 'Hækkað skrift', + underline: 'Undirstrikað' +} ); diff --git a/sources/plugins/basicstyles/lang/fr-ca.js b/sources/plugins/basicstyles/lang/fr-ca.js new file mode 100644 index 0000000..6b8ffbf --- /dev/null +++ b/sources/plugins/basicstyles/lang/fr-ca.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'fr-ca', { + bold: 'Gras', + italic: 'Italique', + strike: 'Barré', + subscript: 'Indice', + superscript: 'Exposant', + underline: 'Souligné' +} ); diff --git a/sources/plugins/basicstyles/lang/fr.js b/sources/plugins/basicstyles/lang/fr.js new file mode 100644 index 0000000..022e438 --- /dev/null +++ b/sources/plugins/basicstyles/lang/fr.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'fr', { + bold: 'Gras', + italic: 'Italique', + strike: 'Barré', + subscript: 'Indice', + superscript: 'Exposant', + underline: 'Souligné' +} ); diff --git a/sources/plugins/basicstyles/lang/gl.js b/sources/plugins/basicstyles/lang/gl.js new file mode 100644 index 0000000..ebd5aa4 --- /dev/null +++ b/sources/plugins/basicstyles/lang/gl.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'gl', { + bold: 'Negra', + italic: 'Cursiva', + strike: 'Riscado', + subscript: 'Subíndice', + superscript: 'Superíndice', + underline: 'Subliñado' +} ); diff --git a/sources/plugins/basicstyles/lang/gu.js b/sources/plugins/basicstyles/lang/gu.js new file mode 100644 index 0000000..fc043b4 --- /dev/null +++ b/sources/plugins/basicstyles/lang/gu.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'gu', { + bold: 'બોલ્ડ/સ્પષ્ટ', + italic: 'ઇટેલિક, ત્રાંસા', + strike: 'છેકી નાખવું', + subscript: 'એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન', + superscript: 'એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.', + underline: 'અન્ડર્લાઇન, નીચે લીટી' +} ); diff --git a/sources/plugins/basicstyles/lang/he.js b/sources/plugins/basicstyles/lang/he.js new file mode 100644 index 0000000..16b16a4 --- /dev/null +++ b/sources/plugins/basicstyles/lang/he.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'he', { + bold: 'מודגש', + italic: 'נטוי', + strike: 'כתיב מחוק', + subscript: 'כתיב תחתון', + superscript: 'כתיב עליון', + underline: 'קו תחתון' +} ); diff --git a/sources/plugins/basicstyles/lang/hi.js b/sources/plugins/basicstyles/lang/hi.js new file mode 100644 index 0000000..2b2fcb5 --- /dev/null +++ b/sources/plugins/basicstyles/lang/hi.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'hi', { + bold: 'बोल्ड', + italic: 'इटैलिक', + strike: 'स्ट्राइक थ्रू', + subscript: 'अधोलेख', + superscript: 'अभिलेख', + underline: 'रेखांकण' +} ); diff --git a/sources/plugins/basicstyles/lang/hr.js b/sources/plugins/basicstyles/lang/hr.js new file mode 100644 index 0000000..6ddfb31 --- /dev/null +++ b/sources/plugins/basicstyles/lang/hr.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'hr', { + bold: 'Podebljaj', + italic: 'Ukosi', + strike: 'Precrtano', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Potcrtano' +} ); diff --git a/sources/plugins/basicstyles/lang/hu.js b/sources/plugins/basicstyles/lang/hu.js new file mode 100644 index 0000000..41d3a32 --- /dev/null +++ b/sources/plugins/basicstyles/lang/hu.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'hu', { + bold: 'Félkövér', + italic: 'Dőlt', + strike: 'Áthúzott', + subscript: 'Alsó index', + superscript: 'Felső index', + underline: 'Aláhúzott' +} ); diff --git a/sources/plugins/basicstyles/lang/id.js b/sources/plugins/basicstyles/lang/id.js new file mode 100644 index 0000000..39e916d --- /dev/null +++ b/sources/plugins/basicstyles/lang/id.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'id', { + bold: 'Huruf Tebal', + italic: 'Huruf Miring', + strike: 'Strikethrough', // MISSING + subscript: 'Subscript', // MISSING + superscript: 'Superscript', // MISSING + underline: 'Garis Bawah' +} ); diff --git a/sources/plugins/basicstyles/lang/is.js b/sources/plugins/basicstyles/lang/is.js new file mode 100644 index 0000000..d22f80a --- /dev/null +++ b/sources/plugins/basicstyles/lang/is.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'is', { + bold: 'Feitletrað', + italic: 'Skáletrað', + strike: 'Yfirstrikað', + subscript: 'Niðurskrifað', + superscript: 'Uppskrifað', + underline: 'Undirstrikað' +} ); diff --git a/sources/plugins/basicstyles/lang/it.js b/sources/plugins/basicstyles/lang/it.js new file mode 100644 index 0000000..12d5594 --- /dev/null +++ b/sources/plugins/basicstyles/lang/it.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'it', { + bold: 'Grassetto', + italic: 'Corsivo', + strike: 'Barrato', + subscript: 'Pedice', + superscript: 'Apice', + underline: 'Sottolineato' +} ); diff --git a/sources/plugins/basicstyles/lang/ja.js b/sources/plugins/basicstyles/lang/ja.js new file mode 100644 index 0000000..1d7ba09 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ja.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ja', { + bold: '太字', + italic: '斜体', + strike: '打ち消し線', + subscript: '下付き', + superscript: '上付き', + underline: '下線' +} ); diff --git a/sources/plugins/basicstyles/lang/ka.js b/sources/plugins/basicstyles/lang/ka.js new file mode 100644 index 0000000..e1ea391 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ka.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ka', { + bold: 'მსხვილი', + italic: 'დახრილი', + strike: 'გადახაზული', + subscript: 'ინდექსი', + superscript: 'ხარისხი', + underline: 'გახაზული' +} ); diff --git a/sources/plugins/basicstyles/lang/km.js b/sources/plugins/basicstyles/lang/km.js new file mode 100644 index 0000000..a55d004 --- /dev/null +++ b/sources/plugins/basicstyles/lang/km.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'km', { + bold: 'ដិត', + italic: 'ទ្រេត', + strike: 'គូស​បន្ទាត់​ចំ​កណ្ដាល', + subscript: 'អក្សរតូចក្រោម', + superscript: 'អក្សរតូចលើ', + underline: 'គូស​បន្ទាត់​ក្រោម' +} ); diff --git a/sources/plugins/basicstyles/lang/ko.js b/sources/plugins/basicstyles/lang/ko.js new file mode 100644 index 0000000..7a61f11 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ko.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ko', { + bold: '굵게', + italic: '기울임꼴', + strike: '취소선', + subscript: '아래 첨자', + superscript: '위 첨자', + underline: '밑줄' +} ); diff --git a/sources/plugins/basicstyles/lang/ku.js b/sources/plugins/basicstyles/lang/ku.js new file mode 100644 index 0000000..fa3c16d --- /dev/null +++ b/sources/plugins/basicstyles/lang/ku.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ku', { + bold: 'قەڵەو', + italic: 'لار', + strike: 'لێدان', + subscript: 'ژێرنووس', + superscript: 'سەرنووس', + underline: 'ژێرهێڵ' +} ); diff --git a/sources/plugins/basicstyles/lang/lt.js b/sources/plugins/basicstyles/lang/lt.js new file mode 100644 index 0000000..edb6949 --- /dev/null +++ b/sources/plugins/basicstyles/lang/lt.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'lt', { + bold: 'Pusjuodis', + italic: 'Kursyvas', + strike: 'Perbrauktas', + subscript: 'Apatinis indeksas', + superscript: 'Viršutinis indeksas', + underline: 'Pabrauktas' +} ); diff --git a/sources/plugins/basicstyles/lang/lv.js b/sources/plugins/basicstyles/lang/lv.js new file mode 100644 index 0000000..4efd61f --- /dev/null +++ b/sources/plugins/basicstyles/lang/lv.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'lv', { + bold: 'Treknināts', + italic: 'Kursīvs', + strike: 'Pārsvītrots', + subscript: 'Apakšrakstā', + superscript: 'Augšrakstā', + underline: 'Pasvītrots' +} ); diff --git a/sources/plugins/basicstyles/lang/mk.js b/sources/plugins/basicstyles/lang/mk.js new file mode 100644 index 0000000..7d56475 --- /dev/null +++ b/sources/plugins/basicstyles/lang/mk.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'mk', { + bold: 'Здебелено', + italic: 'Накривено', + strike: 'Прецртано', + subscript: 'Долен индекс', + superscript: 'Горен индекс', + underline: 'Подвлечено' +} ); diff --git a/sources/plugins/basicstyles/lang/mn.js b/sources/plugins/basicstyles/lang/mn.js new file mode 100644 index 0000000..71fa4da --- /dev/null +++ b/sources/plugins/basicstyles/lang/mn.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'mn', { + bold: 'Тод бүдүүн', + italic: 'Налуу', + strike: 'Дундуур нь зураастай болгох', + subscript: 'Суурь болгох', + superscript: 'Зэрэг болгох', + underline: 'Доогуур нь зураастай болгох' +} ); diff --git a/sources/plugins/basicstyles/lang/ms.js b/sources/plugins/basicstyles/lang/ms.js new file mode 100644 index 0000000..0fd97ee --- /dev/null +++ b/sources/plugins/basicstyles/lang/ms.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ms', { + bold: 'Bold', + italic: 'Italic', + strike: 'Strike Through', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Underline' +} ); diff --git a/sources/plugins/basicstyles/lang/nb.js b/sources/plugins/basicstyles/lang/nb.js new file mode 100644 index 0000000..6ab2325 --- /dev/null +++ b/sources/plugins/basicstyles/lang/nb.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'nb', { + bold: 'Fet', + italic: 'Kursiv', + strike: 'Gjennomstreking', + subscript: 'Senket skrift', + superscript: 'Hevet skrift', + underline: 'Understreking' +} ); diff --git a/sources/plugins/basicstyles/lang/nl.js b/sources/plugins/basicstyles/lang/nl.js new file mode 100644 index 0000000..b2ddb86 --- /dev/null +++ b/sources/plugins/basicstyles/lang/nl.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'nl', { + bold: 'Vet', + italic: 'Cursief', + strike: 'Doorhalen', + subscript: 'Subscript', + superscript: 'Superscript', + underline: 'Onderstrepen' +} ); diff --git a/sources/plugins/basicstyles/lang/no.js b/sources/plugins/basicstyles/lang/no.js new file mode 100644 index 0000000..9fdcf1b --- /dev/null +++ b/sources/plugins/basicstyles/lang/no.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'no', { + bold: 'Fet', + italic: 'Kursiv', + strike: 'Gjennomstreking', + subscript: 'Senket skrift', + superscript: 'Hevet skrift', + underline: 'Understreking' +} ); diff --git a/sources/plugins/basicstyles/lang/oc.js b/sources/plugins/basicstyles/lang/oc.js new file mode 100644 index 0000000..56d7df0 --- /dev/null +++ b/sources/plugins/basicstyles/lang/oc.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'oc', { + bold: 'Gras', + italic: 'Italica', + strike: 'Raiat', + subscript: 'Indici', + superscript: 'Exponent', + underline: 'Solinhat' +} ); diff --git a/sources/plugins/basicstyles/lang/pl.js b/sources/plugins/basicstyles/lang/pl.js new file mode 100644 index 0000000..5739141 --- /dev/null +++ b/sources/plugins/basicstyles/lang/pl.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'pl', { + bold: 'Pogrubienie', + italic: 'Kursywa', + strike: 'Przekreślenie', + subscript: 'Indeks dolny', + superscript: 'Indeks górny', + underline: 'Podkreślenie' +} ); diff --git a/sources/plugins/basicstyles/lang/pt-br.js b/sources/plugins/basicstyles/lang/pt-br.js new file mode 100644 index 0000000..b1bbd20 --- /dev/null +++ b/sources/plugins/basicstyles/lang/pt-br.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'pt-br', { + bold: 'Negrito', + italic: 'Itálico', + strike: 'Tachado', + subscript: 'Subscrito', + superscript: 'Sobrescrito', + underline: 'Sublinhado' +} ); diff --git a/sources/plugins/basicstyles/lang/pt.js b/sources/plugins/basicstyles/lang/pt.js new file mode 100644 index 0000000..7421106 --- /dev/null +++ b/sources/plugins/basicstyles/lang/pt.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'pt', { + bold: 'Negrito', + italic: 'Itálico', + strike: 'Rasurado', + subscript: 'Superior à linha', + superscript: 'Superior à linha', + underline: 'Sublinhado' +} ); diff --git a/sources/plugins/basicstyles/lang/ro.js b/sources/plugins/basicstyles/lang/ro.js new file mode 100644 index 0000000..e760a45 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ro.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ro', { + bold: 'Îngroşat (bold)', + italic: 'Înclinat (italic)', + strike: 'Tăiat (strike through)', + subscript: 'Indice (subscript)', + superscript: 'Putere (superscript)', + underline: 'Subliniat (underline)' +} ); diff --git a/sources/plugins/basicstyles/lang/ru.js b/sources/plugins/basicstyles/lang/ru.js new file mode 100644 index 0000000..0a38898 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ru.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ru', { + bold: 'Полужирный', + italic: 'Курсив', + strike: 'Зачеркнутый', + subscript: 'Подстрочный индекс', + superscript: 'Надстрочный индекс', + underline: 'Подчеркнутый' +} ); diff --git a/sources/plugins/basicstyles/lang/si.js b/sources/plugins/basicstyles/lang/si.js new file mode 100644 index 0000000..58b5a45 --- /dev/null +++ b/sources/plugins/basicstyles/lang/si.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'si', { + bold: 'තද අකුරින් ලියනලද', + italic: 'බැධීඅකුරින් ලියන ලද', + strike: 'Strikethrough', // MISSING + subscript: 'Subscript', // MISSING + superscript: 'Superscript', // MISSING + underline: 'යටින් ඉරි අදින ලද' +} ); diff --git a/sources/plugins/basicstyles/lang/sk.js b/sources/plugins/basicstyles/lang/sk.js new file mode 100644 index 0000000..42e351d --- /dev/null +++ b/sources/plugins/basicstyles/lang/sk.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'sk', { + bold: 'Tučné', + italic: 'Kurzíva', + strike: 'Prečiarknuté', + subscript: 'Dolný index', + superscript: 'Horný index', + underline: 'Podčiarknuté' +} ); diff --git a/sources/plugins/basicstyles/lang/sl.js b/sources/plugins/basicstyles/lang/sl.js new file mode 100644 index 0000000..3ccb5ba --- /dev/null +++ b/sources/plugins/basicstyles/lang/sl.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'sl', { + bold: 'Krepko', + italic: 'Ležeče', + strike: 'Prečrtano', + subscript: 'Podpisano', + superscript: 'Nadpisano', + underline: 'Podčrtano' +} ); diff --git a/sources/plugins/basicstyles/lang/sq.js b/sources/plugins/basicstyles/lang/sq.js new file mode 100644 index 0000000..5c6d704 --- /dev/null +++ b/sources/plugins/basicstyles/lang/sq.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'sq', { + bold: 'Trash', + italic: 'Pjerrët', + strike: 'Nëpërmes', + subscript: 'Nën-skriptë', + superscript: 'Super-skriptë', + underline: 'Nënvijëzuar' +} ); diff --git a/sources/plugins/basicstyles/lang/sr-latn.js b/sources/plugins/basicstyles/lang/sr-latn.js new file mode 100644 index 0000000..535dd50 --- /dev/null +++ b/sources/plugins/basicstyles/lang/sr-latn.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'sr-latn', { + bold: 'Podebljano', + italic: 'Kurziv', + strike: 'Precrtano', + subscript: 'Indeks', + superscript: 'Stepen', + underline: 'Podvučeno' +} ); diff --git a/sources/plugins/basicstyles/lang/sr.js b/sources/plugins/basicstyles/lang/sr.js new file mode 100644 index 0000000..2e7564e --- /dev/null +++ b/sources/plugins/basicstyles/lang/sr.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'sr', { + bold: 'Подебљано', + italic: 'Курзив', + strike: 'Прецртано', + subscript: 'Индекс', + superscript: 'Степен', + underline: 'Подвучено' +} ); diff --git a/sources/plugins/basicstyles/lang/sv.js b/sources/plugins/basicstyles/lang/sv.js new file mode 100644 index 0000000..efa20a8 --- /dev/null +++ b/sources/plugins/basicstyles/lang/sv.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'sv', { + bold: 'Fet', + italic: 'Kursiv', + strike: 'Genomstruken', + subscript: 'Nedsänkta tecken', + superscript: 'Upphöjda tecken', + underline: 'Understruken' +} ); diff --git a/sources/plugins/basicstyles/lang/th.js b/sources/plugins/basicstyles/lang/th.js new file mode 100644 index 0000000..82cab00 --- /dev/null +++ b/sources/plugins/basicstyles/lang/th.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'th', { + bold: 'ตัวหนา', + italic: 'ตัวเอียง', + strike: 'ตัวขีดเส้นทับ', + subscript: 'ตัวห้อย', + superscript: 'ตัวยก', + underline: 'ตัวขีดเส้นใต้' +} ); diff --git a/sources/plugins/basicstyles/lang/tr.js b/sources/plugins/basicstyles/lang/tr.js new file mode 100644 index 0000000..0e36c82 --- /dev/null +++ b/sources/plugins/basicstyles/lang/tr.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'tr', { + bold: 'Kalın', + italic: 'İtalik', + strike: 'Üstü Çizgili', + subscript: 'Alt Simge', + superscript: 'Üst Simge', + underline: 'Altı Çizgili' +} ); diff --git a/sources/plugins/basicstyles/lang/tt.js b/sources/plugins/basicstyles/lang/tt.js new file mode 100644 index 0000000..c8da547 --- /dev/null +++ b/sources/plugins/basicstyles/lang/tt.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'tt', { + bold: 'Калын', + italic: 'Курсив', + strike: 'Сызылган', + subscript: 'Аскы индекс', + superscript: 'Өске индекс', + underline: 'Астына сызылган' +} ); diff --git a/sources/plugins/basicstyles/lang/ug.js b/sources/plugins/basicstyles/lang/ug.js new file mode 100644 index 0000000..aa28429 --- /dev/null +++ b/sources/plugins/basicstyles/lang/ug.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'ug', { + bold: 'توم', + italic: 'يانتۇ', + strike: 'ئۆچۈرۈش سىزىقى', + subscript: 'تۆۋەن ئىندېكس', + superscript: 'يۇقىرى ئىندېكس', + underline: 'ئاستى سىزىق' +} ); diff --git a/sources/plugins/basicstyles/lang/uk.js b/sources/plugins/basicstyles/lang/uk.js new file mode 100644 index 0000000..3ec1acc --- /dev/null +++ b/sources/plugins/basicstyles/lang/uk.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'uk', { + bold: 'Жирний', + italic: 'Курсив', + strike: 'Закреслений', + subscript: 'Нижній індекс', + superscript: 'Верхній індекс', + underline: 'Підкреслений' +} ); diff --git a/sources/plugins/basicstyles/lang/vi.js b/sources/plugins/basicstyles/lang/vi.js new file mode 100644 index 0000000..c0aaa69 --- /dev/null +++ b/sources/plugins/basicstyles/lang/vi.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'vi', { + bold: 'Đậm', + italic: 'Nghiêng', + strike: 'Gạch xuyên ngang', + subscript: 'Chỉ số dưới', + superscript: 'Chỉ số trên', + underline: 'Gạch chân' +} ); diff --git a/sources/plugins/basicstyles/lang/zh-cn.js b/sources/plugins/basicstyles/lang/zh-cn.js new file mode 100644 index 0000000..f43d23d --- /dev/null +++ b/sources/plugins/basicstyles/lang/zh-cn.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'zh-cn', { + bold: '加粗', + italic: '倾斜', + strike: '删除线', + subscript: '下标', + superscript: '上标', + underline: '下划线' +} ); diff --git a/sources/plugins/basicstyles/lang/zh.js b/sources/plugins/basicstyles/lang/zh.js new file mode 100644 index 0000000..d74943c --- /dev/null +++ b/sources/plugins/basicstyles/lang/zh.js @@ -0,0 +1,12 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'basicstyles', 'zh', { + bold: '粗體', + italic: '斜體', + strike: '刪除線', + subscript: '下標', + superscript: '上標', + underline: '底線' +} ); diff --git a/sources/plugins/basicstyles/plugin.js b/sources/plugins/basicstyles/plugin.js new file mode 100644 index 0000000..4a6325a --- /dev/null +++ b/sources/plugins/basicstyles/plugin.js @@ -0,0 +1,209 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'basicstyles', { + // jscs:disable maximumLineLength + lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + icons: 'bold,italic,underline,strike,subscript,superscript', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + init: function( editor ) { + var order = 0; + // All buttons use the same code to register. So, to avoid + // duplications, let's use this tool function. + var addButtonCommand = function( buttonName, buttonLabel, commandName, styleDefiniton ) { + // Disable the command if no definition is configured. + if ( !styleDefiniton ) + return; + + var style = new CKEDITOR.style( styleDefiniton ), + forms = contentForms[ commandName ]; + + // Put the style as the most important form. + forms.unshift( style ); + + // Listen to contextual style activation. + editor.attachStyleStateChange( style, function( state ) { + !editor.readOnly && editor.getCommand( commandName ).setState( state ); + } ); + + // Create the command that can be used to apply the style. + editor.addCommand( commandName, new CKEDITOR.styleCommand( style, { + contentForms: forms + } ) ); + + // Register the button, if the button plugin is loaded. + if ( editor.ui.addButton ) { + editor.ui.addButton( buttonName, { + label: buttonLabel, + command: commandName, + toolbar: 'basicstyles,' + ( order += 10 ) + } ); + } + }; + + var contentForms = { + bold: [ + 'strong', + 'b', + [ 'span', function( el ) { + var fw = el.styles[ 'font-weight' ]; + return fw == 'bold' || +fw >= 700; + } ] + ], + + italic: [ + 'em', + 'i', + [ 'span', function( el ) { + return el.styles[ 'font-style' ] == 'italic'; + } ] + ], + + underline: [ + 'u', + [ 'span', function( el ) { + return el.styles[ 'text-decoration' ] == 'underline'; + } ] + ], + + strike: [ + 's', + 'strike', + [ 'span', function( el ) { + return el.styles[ 'text-decoration' ] == 'line-through'; + } ] + ], + + subscript: [ + 'sub' + ], + + superscript: [ + 'sup' + ] + }, + config = editor.config, + lang = editor.lang.basicstyles; + + addButtonCommand( 'Bold', lang.bold, 'bold', config.coreStyles_bold ); + addButtonCommand( 'Italic', lang.italic, 'italic', config.coreStyles_italic ); + addButtonCommand( 'Underline', lang.underline, 'underline', config.coreStyles_underline ); + addButtonCommand( 'Strike', lang.strike, 'strike', config.coreStyles_strike ); + addButtonCommand( 'Subscript', lang.subscript, 'subscript', config.coreStyles_subscript ); + addButtonCommand( 'Superscript', lang.superscript, 'superscript', config.coreStyles_superscript ); + + editor.setKeystroke( [ + [ CKEDITOR.CTRL + 66 /*B*/, 'bold' ], + [ CKEDITOR.CTRL + 73 /*I*/, 'italic' ], + [ CKEDITOR.CTRL + 85 /*U*/, 'underline' ] + ] ); + } +} ); + +// Basic Inline Styles. + +/** + * The style definition that applies the **bold** style to the text. + * + * Read more in the [documentation](#!/guide/dev_basicstyles) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html). + * + * config.coreStyles_bold = { element: 'b', overrides: 'strong' }; + * + * config.coreStyles_bold = { + * element: 'span', + * attributes: { 'class': 'Bold' } + * }; + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.coreStyles_bold = { element: 'strong', overrides: 'b' }; + +/** + * The style definition that applies the *italics* style to the text. + * + * Read more in the [documentation](#!/guide/dev_basicstyles) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html). + * + * config.coreStyles_italic = { element: 'i', overrides: 'em' }; + * + * CKEDITOR.config.coreStyles_italic = { + * element: 'span', + * attributes: { 'class': 'Italic' } + * }; + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.coreStyles_italic = { element: 'em', overrides: 'i' }; + +/** + * The style definition that applies the underline style to the text. + * + * Read more in the [documentation](#!/guide/dev_basicstyles) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html). + * + * CKEDITOR.config.coreStyles_underline = { + * element: 'span', + * attributes: { 'class': 'Underline' } + * }; + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.coreStyles_underline = { element: 'u' }; + +/** + * The style definition that applies the strikethrough style to the text. + * + * Read more in the [documentation](#!/guide/dev_basicstyles) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html). + * + * CKEDITOR.config.coreStyles_strike = { + * element: 'span', + * attributes: { 'class': 'Strikethrough' }, + * overrides: 'strike' + * }; + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.coreStyles_strike = { element: 's', overrides: 'strike' }; + +/** + * The style definition that applies the subscript style to the text. + * + * Read more in the [documentation](#!/guide/dev_basicstyles) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html). + * + * CKEDITOR.config.coreStyles_subscript = { + * element: 'span', + * attributes: { 'class': 'Subscript' }, + * overrides: 'sub' + * }; + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.coreStyles_subscript = { element: 'sub' }; + +/** + * The style definition that applies the superscript style to the text. + * + * Read more in the [documentation](#!/guide/dev_basicstyles) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html). + * + * CKEDITOR.config.coreStyles_superscript = { + * element: 'span', + * attributes: { 'class': 'Superscript' }, + * overrides: 'sup' + * }; + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.coreStyles_superscript = { element: 'sup' }; diff --git a/sources/plugins/button/lang/af.js b/sources/plugins/button/lang/af.js new file mode 100644 index 0000000..6ccebfa --- /dev/null +++ b/sources/plugins/button/lang/af.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'af', { + selectedLabel: '%1 uitgekies' +} ); diff --git a/sources/plugins/button/lang/ar.js b/sources/plugins/button/lang/ar.js new file mode 100644 index 0000000..025068d --- /dev/null +++ b/sources/plugins/button/lang/ar.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ar', { + selectedLabel: '%1 (محدد)' +} ); diff --git a/sources/plugins/button/lang/az.js b/sources/plugins/button/lang/az.js new file mode 100644 index 0000000..30ac85e --- /dev/null +++ b/sources/plugins/button/lang/az.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'az', { + selectedLabel: '%1 (seçilib)' +} ); diff --git a/sources/plugins/button/lang/bg.js b/sources/plugins/button/lang/bg.js new file mode 100644 index 0000000..0b146bb --- /dev/null +++ b/sources/plugins/button/lang/bg.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'bg', { + selectedLabel: '%1 (Избрано)' +} ); diff --git a/sources/plugins/button/lang/ca.js b/sources/plugins/button/lang/ca.js new file mode 100644 index 0000000..0891d49 --- /dev/null +++ b/sources/plugins/button/lang/ca.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ca', { + selectedLabel: '%1 (Seleccionat)' +} ); diff --git a/sources/plugins/button/lang/cs.js b/sources/plugins/button/lang/cs.js new file mode 100644 index 0000000..552a05c --- /dev/null +++ b/sources/plugins/button/lang/cs.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'cs', { + selectedLabel: '%1 (Vybráno)' +} ); diff --git a/sources/plugins/button/lang/da.js b/sources/plugins/button/lang/da.js new file mode 100644 index 0000000..255dcc5 --- /dev/null +++ b/sources/plugins/button/lang/da.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'da', { + selectedLabel: '%1 (Valgt)' +} ); diff --git a/sources/plugins/button/lang/de-ch.js b/sources/plugins/button/lang/de-ch.js new file mode 100644 index 0000000..63430d7 --- /dev/null +++ b/sources/plugins/button/lang/de-ch.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'de-ch', { + selectedLabel: '%1 (Ausgewählt)' +} ); diff --git a/sources/plugins/button/lang/de.js b/sources/plugins/button/lang/de.js new file mode 100644 index 0000000..dca3daa --- /dev/null +++ b/sources/plugins/button/lang/de.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'de', { + selectedLabel: '%1 (Ausgewählt)' +} ); diff --git a/sources/plugins/button/lang/el.js b/sources/plugins/button/lang/el.js new file mode 100644 index 0000000..1718816 --- /dev/null +++ b/sources/plugins/button/lang/el.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'el', { + selectedLabel: '%1 (Επιλεγμένο)' +} ); diff --git a/sources/plugins/button/lang/en-gb.js b/sources/plugins/button/lang/en-gb.js new file mode 100644 index 0000000..d7daefc --- /dev/null +++ b/sources/plugins/button/lang/en-gb.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'en-gb', { + selectedLabel: '%1 (Selected)' +} ); diff --git a/sources/plugins/button/lang/en.js b/sources/plugins/button/lang/en.js new file mode 100644 index 0000000..d5c4088 --- /dev/null +++ b/sources/plugins/button/lang/en.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'en', { + selectedLabel: '%1 (Selected)' +} ); diff --git a/sources/plugins/button/lang/eo.js b/sources/plugins/button/lang/eo.js new file mode 100644 index 0000000..acf0c13 --- /dev/null +++ b/sources/plugins/button/lang/eo.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'eo', { + selectedLabel: '%1 (Selektita)' +} ); diff --git a/sources/plugins/button/lang/es.js b/sources/plugins/button/lang/es.js new file mode 100644 index 0000000..cb46c6f --- /dev/null +++ b/sources/plugins/button/lang/es.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'es', { + selectedLabel: '%1 (Seleccionado)' +} ); diff --git a/sources/plugins/button/lang/eu.js b/sources/plugins/button/lang/eu.js new file mode 100644 index 0000000..c49d92a --- /dev/null +++ b/sources/plugins/button/lang/eu.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'eu', { + selectedLabel: '%1 (hautatuta)' +} ); diff --git a/sources/plugins/button/lang/fa.js b/sources/plugins/button/lang/fa.js new file mode 100644 index 0000000..358c88a --- /dev/null +++ b/sources/plugins/button/lang/fa.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'fa', { + selectedLabel: '%1 (انتخاب شده)' +} ); diff --git a/sources/plugins/button/lang/fi.js b/sources/plugins/button/lang/fi.js new file mode 100644 index 0000000..4822e74 --- /dev/null +++ b/sources/plugins/button/lang/fi.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'fi', { + selectedLabel: '%1 (Valittu)' +} ); diff --git a/sources/plugins/button/lang/fr.js b/sources/plugins/button/lang/fr.js new file mode 100644 index 0000000..1b1c6d3 --- /dev/null +++ b/sources/plugins/button/lang/fr.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'fr', { + selectedLabel: '%1 (Sélectionné)' +} ); diff --git a/sources/plugins/button/lang/gl.js b/sources/plugins/button/lang/gl.js new file mode 100644 index 0000000..3e4e0b7 --- /dev/null +++ b/sources/plugins/button/lang/gl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'gl', { + selectedLabel: '%1 (seleccionado)' +} ); diff --git a/sources/plugins/button/lang/he.js b/sources/plugins/button/lang/he.js new file mode 100644 index 0000000..c67afb6 --- /dev/null +++ b/sources/plugins/button/lang/he.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'he', { + selectedLabel: '1% (סומן)' +} ); diff --git a/sources/plugins/button/lang/hu.js b/sources/plugins/button/lang/hu.js new file mode 100644 index 0000000..0dffac1 --- /dev/null +++ b/sources/plugins/button/lang/hu.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'hu', { + selectedLabel: '%1 (Kiválasztva)' +} ); diff --git a/sources/plugins/button/lang/id.js b/sources/plugins/button/lang/id.js new file mode 100644 index 0000000..f973ffc --- /dev/null +++ b/sources/plugins/button/lang/id.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'id', { + selectedLabel: '%1(Dipilih)' +} ); diff --git a/sources/plugins/button/lang/it.js b/sources/plugins/button/lang/it.js new file mode 100644 index 0000000..359dc9a --- /dev/null +++ b/sources/plugins/button/lang/it.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'it', { + selectedLabel: '%1 (selezionato)' +} ); diff --git a/sources/plugins/button/lang/ja.js b/sources/plugins/button/lang/ja.js new file mode 100644 index 0000000..e2b064f --- /dev/null +++ b/sources/plugins/button/lang/ja.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ja', { + selectedLabel: '%1 (選択中)' +} ); diff --git a/sources/plugins/button/lang/km.js b/sources/plugins/button/lang/km.js new file mode 100644 index 0000000..9437a2f --- /dev/null +++ b/sources/plugins/button/lang/km.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'km', { + selectedLabel: '%1 (បាន​ជ្រើស​រើស)' +} ); diff --git a/sources/plugins/button/lang/ko.js b/sources/plugins/button/lang/ko.js new file mode 100644 index 0000000..64ad966 --- /dev/null +++ b/sources/plugins/button/lang/ko.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ko', { + selectedLabel: '%1 (선택됨)' +} ); diff --git a/sources/plugins/button/lang/ku.js b/sources/plugins/button/lang/ku.js new file mode 100644 index 0000000..d342dd0 --- /dev/null +++ b/sources/plugins/button/lang/ku.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ku', { + selectedLabel: '%1 (هەڵبژێردراو)' +} ); diff --git a/sources/plugins/button/lang/lt.js b/sources/plugins/button/lang/lt.js new file mode 100644 index 0000000..b492bd5 --- /dev/null +++ b/sources/plugins/button/lang/lt.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'lt', { + selectedLabel: '%1 (Pasirinkta)' +} ); diff --git a/sources/plugins/button/lang/nb.js b/sources/plugins/button/lang/nb.js new file mode 100644 index 0000000..8d38121 --- /dev/null +++ b/sources/plugins/button/lang/nb.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'nb', { + selectedLabel: '%1 (Valgt)' +} ); diff --git a/sources/plugins/button/lang/nl.js b/sources/plugins/button/lang/nl.js new file mode 100644 index 0000000..3e00f80 --- /dev/null +++ b/sources/plugins/button/lang/nl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'nl', { + selectedLabel: '%1 (Geselecteerd)' +} ); diff --git a/sources/plugins/button/lang/no.js b/sources/plugins/button/lang/no.js new file mode 100644 index 0000000..e6252b1 --- /dev/null +++ b/sources/plugins/button/lang/no.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'no', { + selectedLabel: '%1 (Valgt)' +} ); diff --git a/sources/plugins/button/lang/oc.js b/sources/plugins/button/lang/oc.js new file mode 100644 index 0000000..cb91761 --- /dev/null +++ b/sources/plugins/button/lang/oc.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'oc', { + selectedLabel: '%1 (Seleccionat)' +} ); diff --git a/sources/plugins/button/lang/pl.js b/sources/plugins/button/lang/pl.js new file mode 100644 index 0000000..304d07a --- /dev/null +++ b/sources/plugins/button/lang/pl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'pl', { + selectedLabel: '%1 (Wybrany)' +} ); diff --git a/sources/plugins/button/lang/pt-br.js b/sources/plugins/button/lang/pt-br.js new file mode 100644 index 0000000..e3fdf84 --- /dev/null +++ b/sources/plugins/button/lang/pt-br.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'pt-br', { + selectedLabel: '%1 (Selecionado)' +} ); diff --git a/sources/plugins/button/lang/pt.js b/sources/plugins/button/lang/pt.js new file mode 100644 index 0000000..e02c45a --- /dev/null +++ b/sources/plugins/button/lang/pt.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'pt', { + selectedLabel: '%1 (Selecionado)' +} ); diff --git a/sources/plugins/button/lang/ro.js b/sources/plugins/button/lang/ro.js new file mode 100644 index 0000000..0669dd5 --- /dev/null +++ b/sources/plugins/button/lang/ro.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ro', { + selectedLabel: '%1 (Selectat)' +} ); diff --git a/sources/plugins/button/lang/ru.js b/sources/plugins/button/lang/ru.js new file mode 100644 index 0000000..085f6ee --- /dev/null +++ b/sources/plugins/button/lang/ru.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ru', { + selectedLabel: '%1 (Выбрано)' +} ); diff --git a/sources/plugins/button/lang/sk.js b/sources/plugins/button/lang/sk.js new file mode 100644 index 0000000..12bec80 --- /dev/null +++ b/sources/plugins/button/lang/sk.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'sk', { + selectedLabel: '%1 (Vybrané)' +} ); diff --git a/sources/plugins/button/lang/sl.js b/sources/plugins/button/lang/sl.js new file mode 100644 index 0000000..c6633ae --- /dev/null +++ b/sources/plugins/button/lang/sl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'sl', { + selectedLabel: '%1 (Izbrano)' +} ); diff --git a/sources/plugins/button/lang/sq.js b/sources/plugins/button/lang/sq.js new file mode 100644 index 0000000..2e53e4c --- /dev/null +++ b/sources/plugins/button/lang/sq.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'sq', { + selectedLabel: '%1 (Përzgjedhur)' +} ); diff --git a/sources/plugins/button/lang/sv.js b/sources/plugins/button/lang/sv.js new file mode 100644 index 0000000..b89e475 --- /dev/null +++ b/sources/plugins/button/lang/sv.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'sv', { + selectedLabel: '%1 (Vald)' +} ); diff --git a/sources/plugins/button/lang/tr.js b/sources/plugins/button/lang/tr.js new file mode 100644 index 0000000..30d3670 --- /dev/null +++ b/sources/plugins/button/lang/tr.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'tr', { + selectedLabel: '%1 (Seçilmiş)' +} ); diff --git a/sources/plugins/button/lang/tt.js b/sources/plugins/button/lang/tt.js new file mode 100644 index 0000000..6324922 --- /dev/null +++ b/sources/plugins/button/lang/tt.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'tt', { + selectedLabel: '%1 (Сайланган)' +} ); diff --git a/sources/plugins/button/lang/ug.js b/sources/plugins/button/lang/ug.js new file mode 100644 index 0000000..fa3a90c --- /dev/null +++ b/sources/plugins/button/lang/ug.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'ug', { + selectedLabel: '%1 (تاللاندى)' +} ); diff --git a/sources/plugins/button/lang/uk.js b/sources/plugins/button/lang/uk.js new file mode 100644 index 0000000..7b49fe2 --- /dev/null +++ b/sources/plugins/button/lang/uk.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'uk', { + selectedLabel: '%1 (Вибрано)' +} ); diff --git a/sources/plugins/button/lang/vi.js b/sources/plugins/button/lang/vi.js new file mode 100644 index 0000000..b6a5911 --- /dev/null +++ b/sources/plugins/button/lang/vi.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'vi', { + selectedLabel: '%1 (Đã chọn)' +} ); diff --git a/sources/plugins/button/lang/zh-cn.js b/sources/plugins/button/lang/zh-cn.js new file mode 100644 index 0000000..fade7d7 --- /dev/null +++ b/sources/plugins/button/lang/zh-cn.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'zh-cn', { + selectedLabel: '已选中 %1 项' +} ); diff --git a/sources/plugins/button/lang/zh.js b/sources/plugins/button/lang/zh.js new file mode 100644 index 0000000..7479462 --- /dev/null +++ b/sources/plugins/button/lang/zh.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'button', 'zh', { + selectedLabel: '%1 (已選取)' +} ); diff --git a/sources/plugins/button/plugin.js b/sources/plugins/button/plugin.js new file mode 100644 index 0000000..6d2db33 --- /dev/null +++ b/sources/plugins/button/plugin.js @@ -0,0 +1,389 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +( function() { + var template = '' + + '{label}' + + '{ariaShortcut}' + + '{arrowHtml}' + + ''; + + var templateArrow = '' + + // BLACK DOWN-POINTING TRIANGLE + ( CKEDITOR.env.hc ? '▼' : '' ) + + ''; + + var btnArrowTpl = CKEDITOR.addTemplate( 'buttonArrow', templateArrow ), + btnTpl = CKEDITOR.addTemplate( 'button', template ); + + CKEDITOR.plugins.add( 'button', { + lang: 'af,ar,az,bg,ca,cs,da,de,de-ch,el,en,en-gb,eo,es,eu,fa,fi,fr,gl,he,hu,id,it,ja,km,ko,ku,lt,nb,nl,no,oc,pl,pt,pt-br,ro,ru,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + beforeInit: function( editor ) { + editor.ui.addHandler( CKEDITOR.UI_BUTTON, CKEDITOR.ui.button.handler ); + } + } ); + + /** + * Button UI element. + * + * @readonly + * @property {String} [='button'] + * @member CKEDITOR + */ + CKEDITOR.UI_BUTTON = 'button'; + + /** + * Represents a button UI element. This class should not be called directly. To + * create new buttons use {@link CKEDITOR.ui#addButton} instead. + * + * @class + * @constructor Creates a button class instance. + * @param {Object} definition The button definition. + */ + CKEDITOR.ui.button = function( definition ) { + CKEDITOR.tools.extend( this, definition, + // Set defaults. + { + title: definition.label, + click: definition.click || + function( editor ) { + editor.execCommand( definition.command ); + } + } ); + + this._ = {}; + }; + + /** + * Represents the button handler object. + * + * @class + * @singleton + * @extends CKEDITOR.ui.handlerDefinition + */ + CKEDITOR.ui.button.handler = { + /** + * Transforms a button definition in a {@link CKEDITOR.ui.button} instance. + * + * @member CKEDITOR.ui.button.handler + * @param {Object} definition + * @returns {CKEDITOR.ui.button} + */ + create: function( definition ) { + return new CKEDITOR.ui.button( definition ); + } + }; + + /** @class CKEDITOR.ui.button */ + CKEDITOR.ui.button.prototype = { + /** + * Renders the button. + * + * @param {CKEDITOR.editor} editor The editor instance which this button is + * to be used by. + * @param {Array} output The output array to which the HTML code related to + * this button should be appended. + */ + render: function( editor, output ) { + function updateState() { + // "this" is a CKEDITOR.ui.button instance. + var mode = editor.mode; + + if ( mode ) { + // Restore saved button state. + var state = this.modes[ mode ] ? modeStates[ mode ] !== undefined ? modeStates[ mode ] : CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; + + state = editor.readOnly && !this.readOnly ? CKEDITOR.TRISTATE_DISABLED : state; + + this.setState( state ); + + // Let plugin to disable button. + if ( this.refresh ) + this.refresh(); + } + } + + var env = CKEDITOR.env, + id = this._.id = CKEDITOR.tools.getNextId(), + stateName = '', + command = this.command, + // Get the command name. + clickFn, + keystroke, + shortcut; + + this._.editor = editor; + + var instance = { + id: id, + button: this, + editor: editor, + focus: function() { + var element = CKEDITOR.document.getById( id ); + element.focus(); + }, + execute: function() { + this.button.click( editor ); + }, + attach: function( editor ) { + this.button.attach( editor ); + } + }; + + var keydownFn = CKEDITOR.tools.addFunction( function( ev ) { + if ( instance.onkey ) { + ev = new CKEDITOR.dom.event( ev ); + return ( instance.onkey( instance, ev.getKeystroke() ) !== false ); + } + } ); + + var focusFn = CKEDITOR.tools.addFunction( function( ev ) { + var retVal; + + if ( instance.onfocus ) + retVal = ( instance.onfocus( instance, new CKEDITOR.dom.event( ev ) ) !== false ); + + return retVal; + } ); + + var selLocked = 0; + + instance.clickFn = clickFn = CKEDITOR.tools.addFunction( function() { + + // Restore locked selection in Opera. + if ( selLocked ) { + editor.unlockSelection( 1 ); + selLocked = 0; + } + instance.execute(); + + // Fixed iOS focus issue when your press disabled button (#12381). + if ( env.iOS ) { + editor.focus(); + } + } ); + + + // Indicate a mode sensitive button. + if ( this.modes ) { + var modeStates = {}; + + editor.on( 'beforeModeUnload', function() { + if ( editor.mode && this._.state != CKEDITOR.TRISTATE_DISABLED ) + modeStates[ editor.mode ] = this._.state; + }, this ); + + // Update status when activeFilter, mode or readOnly changes. + editor.on( 'activeFilterChange', updateState, this ); + editor.on( 'mode', updateState, this ); + // If this button is sensitive to readOnly state, update it accordingly. + !this.readOnly && editor.on( 'readOnly', updateState, this ); + + } else if ( command ) { + // Get the command instance. + command = editor.getCommand( command ); + + if ( command ) { + command.on( 'state', function() { + this.setState( command.state ); + }, this ); + + stateName += ( command.state == CKEDITOR.TRISTATE_ON ? 'on' : command.state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' : 'off' ); + } + } + + // For button that has text-direction awareness on selection path. + if ( this.directional ) { + editor.on( 'contentDirChanged', function( evt ) { + var el = CKEDITOR.document.getById( this._.id ), + icon = el.getFirst(); + + var pathDir = evt.data; + + // Make a minor direction change to become style-able for the skin icon. + if ( pathDir != editor.lang.dir ) + el.addClass( 'cke_' + pathDir ); + else + el.removeClass( 'cke_ltr' ).removeClass( 'cke_rtl' ); + + // Inline style update for the plugin icon. + icon.setAttribute( 'style', CKEDITOR.skin.getIconStyle( iconName, pathDir == 'rtl', this.icon, this.iconOffset ) ); + }, this ); + } + + if ( !command ) { + stateName += 'off'; + } else { + keystroke = editor.getCommandKeystroke( command ); + + if ( keystroke ) { + shortcut = CKEDITOR.tools.keystrokeToString( editor.lang.common.keyboard, keystroke ); + } + } + + var name = this.name || this.command, + iconName = name; + + // Check if we're pointing to an icon defined by another command. (#9555) + if ( this.icon && !( /\./ ).test( this.icon ) ) { + iconName = this.icon; + this.icon = null; + } + + var params = { + id: id, + name: name, + iconName: iconName, + label: this.label, + cls: this.className || '', + state: stateName, + ariaDisabled: stateName == 'disabled' ? 'true' : 'false', + title: this.title + ( shortcut ? ' (' + shortcut.display + ')' : '' ), + ariaShortcut: shortcut ? editor.lang.common.keyboardShortcut + ' ' + shortcut.aria : '', + titleJs: env.gecko && !env.hc ? '' : ( this.title || '' ).replace( "'", '' ), + hasArrow: this.hasArrow ? 'true' : 'false', + keydownFn: keydownFn, + focusFn: focusFn, + clickFn: clickFn, + style: CKEDITOR.skin.getIconStyle( iconName, ( editor.lang.dir == 'rtl' ), this.icon, this.iconOffset ), + arrowHtml: this.hasArrow ? btnArrowTpl.output() : '' + }; + + btnTpl.output( params, output ); + + if ( this.onRender ) + this.onRender(); + + return instance; + }, + + /** + * Sets the button state. + * + * @param {Number} state Indicates the button state. One of {@link CKEDITOR#TRISTATE_ON}, + * {@link CKEDITOR#TRISTATE_OFF}, or {@link CKEDITOR#TRISTATE_DISABLED}. + */ + setState: function( state ) { + if ( this._.state == state ) + return false; + + this._.state = state; + + var element = CKEDITOR.document.getById( this._.id ); + + if ( element ) { + element.setState( state, 'cke_button' ); + + state == CKEDITOR.TRISTATE_DISABLED ? + element.setAttribute( 'aria-disabled', true ) : + element.removeAttribute( 'aria-disabled' ); + + if ( !this.hasArrow ) { + // Note: aria-pressed attribute should not be added to menuButton instances. (#11331) + state == CKEDITOR.TRISTATE_ON ? + element.setAttribute( 'aria-pressed', true ) : + element.removeAttribute( 'aria-pressed' ); + } else { + var newLabel = state == CKEDITOR.TRISTATE_ON ? + this._.editor.lang.button.selectedLabel.replace( /%1/g, this.label ) : this.label; + CKEDITOR.document.getById( this._.id + '_label' ).setText( newLabel ); + } + + return true; + } else { + return false; + } + }, + + /** + * Gets the button state. + * + * @returns {Number} The button state. One of {@link CKEDITOR#TRISTATE_ON}, + * {@link CKEDITOR#TRISTATE_OFF}, or {@link CKEDITOR#TRISTATE_DISABLED}. + */ + getState: function() { + return this._.state; + }, + + /** + * Returns this button's {@link CKEDITOR.feature} instance. + * + * It may be this button instance if it has at least one of + * `allowedContent` and `requiredContent` properties. Otherwise, + * if a command is bound to this button by the `command` property, then + * that command will be returned. + * + * This method implements the {@link CKEDITOR.feature#toFeature} interface method. + * + * @since 4.1 + * @param {CKEDITOR.editor} Editor instance. + * @returns {CKEDITOR.feature} The feature. + */ + toFeature: function( editor ) { + if ( this._.feature ) + return this._.feature; + + var feature = this; + + // If button isn't a feature, return command if is bound. + if ( !this.allowedContent && !this.requiredContent && this.command ) + feature = editor.getCommand( this.command ) || feature; + + return this._.feature = feature; + } + }; + + /** + * Adds a button definition to the UI elements list. + * + * editorInstance.ui.addButton( 'MyBold', { + * label: 'My Bold', + * command: 'bold', + * toolbar: 'basicstyles,1' + * } ); + * + * @member CKEDITOR.ui + * @param {String} name The button name. + * @param {Object} definition The button definition. + * @param {String} definition.label The textual part of the button (if visible) and its tooltip. + * @param {String} definition.command The command to be executed once the button is activated. + * @param {String} definition.toolbar The {@link CKEDITOR.config#toolbarGroups toolbar group} into which + * the button will be added. An optional index value (separated by a comma) determines the button position within the group. + */ + CKEDITOR.ui.prototype.addButton = function( name, definition ) { + this.add( name, CKEDITOR.UI_BUTTON, definition ); + }; + +} )(); diff --git a/sources/plugins/clipboard/dev/clipboard.html b/sources/plugins/clipboard/dev/clipboard.html new file mode 100644 index 0000000..735d00e --- /dev/null +++ b/sources/plugins/clipboard/dev/clipboard.html @@ -0,0 +1,190 @@ + + + + + + Clipboard playground – CKEditor Sample + + + + + +

+ CKEditor Sample — clipboard plugin playground +

+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+
+

Editor 6

+

Content content content.

+

Styled by .someClass.

+
+
+
+
+ + + diff --git a/sources/plugins/clipboard/dev/console.js b/sources/plugins/clipboard/dev/console.js new file mode 100644 index 0000000..96ccd81 --- /dev/null +++ b/sources/plugins/clipboard/dev/console.js @@ -0,0 +1,49 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/* global CKCONSOLE */ + +'use strict'; + +( function() { + var pasteType, pasteValue; + + CKCONSOLE.add( 'paste', { + panels: [ + { + type: 'box', + content: + '', + + refresh: function() { + return { + header: 'Paste', + type: pasteType, + value: pasteValue + }; + }, + + refreshOn: function( editor, refresh ) { + editor.on( 'paste', function( evt ) { + pasteType = evt.data.type; + pasteValue = CKEDITOR.tools.htmlEncode( evt.data.dataValue ); + refresh(); + } ); + } + }, + { + type: 'log', + on: function( editor, log, logFn ) { + editor.on( 'paste', function( evt ) { + logFn( 'paste; type:' + evt.data.type )(); + } ); + } + } + ] + } ); +} )(); diff --git a/sources/plugins/clipboard/dev/dnd.html b/sources/plugins/clipboard/dev/dnd.html new file mode 100644 index 0000000..2dfb2be --- /dev/null +++ b/sources/plugins/clipboard/dev/dnd.html @@ -0,0 +1,185 @@ + + + + + + Manual test for #11460 + + + + + + + +

+ Manual test for #11460 +

+

Description (hide/show)

+
+

Test internal D&D in the editor, dropping content from an external source (helpers, MS Word) and D&D between editors. Keep in mind that internal D&D is the most complex operation because editor have to handle two ranges at the same time.

+

Expected behavior:

+ +

Drag scenarios:

+ +

Drop scenarios:

+ +

Known issues (not part of this ticket):

+ +
+
+

Helpers (hide/show)

+
+ +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. In commodo vulputate tempor. Sed <b>at elit</b> vel ligula mollis aliquet a ac odio. +
+Aenean cursus egestas ipsum.
+				
+
+
+
+
+
+

Classic editor (hide/show)

+
+ +
+
+
+

Inline editor (hide/show)

+
+

Saturn V carrying Apollo 11 Apollo 11

+ +

Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

+ +

Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

+ +

Broadcasting and quotes

+ +

Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

+ +
+

One small step for [a] man, one giant leap for mankind.

+
+ +

Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

+ +
+

[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

+
+ +

Technical details

+ + + + + + + + + + + + + + + + + + + + + + + +
Mission crew
PositionAstronaut
CommanderNeil A. Armstrong
Command Module PilotMichael Collins
Lunar Module PilotEdwin "Buzz" E. Aldrin, Jr.
+ +

Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

+ +
    +
  1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
  2. +
  3. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
  4. +
  5. Lunar Module for landing on the Moon.
  6. +
+ +

After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.

+ +
+

Source: Wikipedia.org

+
+
+ + + diff --git a/sources/plugins/clipboard/dialogs/paste.js b/sources/plugins/clipboard/dialogs/paste.js new file mode 100644 index 0000000..80ce29f --- /dev/null +++ b/sources/plugins/clipboard/dialogs/paste.js @@ -0,0 +1,254 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'paste', function( editor ) { + var lang = editor.lang.clipboard, + clipboard = CKEDITOR.plugins.clipboard, + lastDataTransfer; + + function onPasteFrameLoad( win ) { + var doc = new CKEDITOR.dom.document( win.document ), + body = doc.getBody(), + script = doc.getById( 'cke_actscrpt' ); + + script && script.remove(); + + body.setAttribute( 'contenteditable', true ); + + // Forward dataTransfer (#13883). + body.on( clipboard.mainPasteEvent, function( evt ) { + var dataTransfer = clipboard.initPasteDataTransfer( evt ); + + if ( !lastDataTransfer ) { + lastDataTransfer = dataTransfer; + } else + // For two paste with the same dataTransfer we can use that dataTransfer (two internal pastes are + // considered as an internal paste). + if ( dataTransfer != lastDataTransfer ) { + // If there were two paste with different DataTransfer objects create a new, empty, data transfer + // and use it (one internal and one external paste are considered as external paste). + lastDataTransfer = clipboard.initPasteDataTransfer(); + } + } ); + + // IE before version 8 will leave cursor blinking inside the document after + // editor blurred unless we clean up the selection. (#4716) + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) { + doc.getWindow().on( 'blur', function() { + doc.$.selection.empty(); + } ); + } + + doc.on( 'keydown', function( e ) { + var domEvent = e.data, + key = domEvent.getKeystroke(), + processed; + + switch ( key ) { + case 27: + this.hide(); + processed = 1; + break; + + case 9: + case CKEDITOR.SHIFT + 9: + this.changeFocus( 1 ); + processed = 1; + } + + processed && domEvent.preventDefault(); + }, this ); + + editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) ); + + // Handle pending focus. + if ( doc.getWindow().getFrame().removeCustomData( 'pendingFocus' ) ) + body.focus(); + } + + // If pasteDialogCommit wasn't canceled by e.g. editor.getClipboardData + // then fire paste event. + // Do not use editor#paste, because it would start from beforePaste event. + editor.on( 'pasteDialogCommit', function( evt ) { + if ( evt.data ) + editor.fire( 'paste', { + type: 'auto', + dataValue: evt.data.dataValue, + method: 'paste', + dataTransfer: evt.data.dataTransfer || clipboard.initPasteDataTransfer() + } ); + }, null, null, 1000 ); + + return { + title: lang.title, + + minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350, + minHeight: CKEDITOR.env.quirks ? 250 : 245, + onShow: function() { + // FIREFOX BUG: Force the browser to render the dialog to make the to-be- + // inserted iframe editable. (#3366) + this.parts.dialog.$.offsetHeight; + + this.setupContent(); + + // Set dialog title to the custom value (set e.g. in editor.openDialog callback) and reset this value. + // If custom title not set, use default one. + this.parts.title.setHtml( this.customTitle || lang.title ); + this.customTitle = null; + }, + + onLoad: function() { + if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' ) + this.parts.contents.setStyle( 'overflow', 'hidden' ); + }, + + onOk: function() { + this.commitContent(); + }, + + contents: [ { + id: 'general', + label: editor.lang.common.generalTab, + elements: [ + { + type: 'html', + id: 'securityMsg', + html: '
' + lang.securityMsg + '
' + }, + { + type: 'html', + id: 'pasteMsg', + html: '
' + lang.pasteMsg + '
' + }, + { + type: 'html', + id: 'editing_area', + style: 'width:100%;height:100%', + html: '', + focus: function() { + var iframe = this.getInputElement(), + doc = iframe.getFrameDocument(), + body = doc.getBody(); + + // Frame content may not loaded at the moment. + if ( !body || body.isReadOnly() ) + iframe.setCustomData( 'pendingFocus', 1 ); + else + body.focus(); + }, + setup: function() { + var dialog = this.getDialog(); + var htmlToLoad = '' + + '' + + '' + + ''; + + var src = + CKEDITOR.env.air ? + 'javascript:void(0)' : // jshint ignore:line + ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ? + 'javascript:void((function(){' + encodeURIComponent( // jshint ignore:line + 'document.open();' + + '(' + CKEDITOR.tools.fixDomain + ')();' + + 'document.close();' + ) + '})())"' + : ''; + + var iframe = CKEDITOR.dom.element.createFromHtml( '' ); + + // Reset last data transfer. + lastDataTransfer = null; + + iframe.on( 'load', function( e ) { + e.removeListener(); + + var doc = iframe.getFrameDocument(); + doc.write( htmlToLoad ); + + editor.focusManager.add( doc.getBody() ); + + if ( CKEDITOR.env.air ) + onPasteFrameLoad.call( this, doc.getWindow().$ ); + }, dialog ); + + iframe.setCustomData( 'dialog', dialog ); + + var container = this.getElement(); + container.setHtml( '' ); + container.append( iframe ); + + // IE need a redirect on focus to make + // the cursor blinking inside iframe. (#5461) + if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) { + var focusGrabber = CKEDITOR.dom.element.createFromHtml( '' ); + focusGrabber.on( 'focus', function() { + // Since fixDomain is called in src attribute, + // IE needs some slight delay to correctly move focus. + setTimeout( function() { + iframe.$.contentWindow.focus(); + } ); + } ); + container.append( focusGrabber ); + + // Override focus handler on field. + this.focus = function() { + focusGrabber.focus(); + this.fire( 'focus' ); + }; + } + + this.getInputElement = function() { + return iframe; + }; + + // Force container to scale in IE. + if ( CKEDITOR.env.ie ) { + container.setStyle( 'display', 'block' ); + container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' ); + } + }, + commit: function() { + var editor = this.getDialog().getParentEditor(), + body = this.getInputElement().getFrameDocument().getBody(), + bogus = body.getBogus(), + html; + bogus && bogus.remove(); + + // Saving the contents so changes until paste is complete will not take place (#7500) + html = body.getHtml(); + + // Opera needs some time to think about what has happened and what it should do now. + setTimeout( function() { + editor.fire( 'pasteDialogCommit', { + dataValue: html, + // Avoid error if there was no paste so lastDataTransfer is null. + dataTransfer: lastDataTransfer || clipboard.initPasteDataTransfer() + } ); + }, 0 ); + } + } + ] + } ] + }; +} ); + +/** + * Internal event to pass paste dialog's data to the listeners. + * + * @private + * @event pasteDialogCommit + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + */ diff --git a/sources/plugins/clipboard/icons/copy-rtl.png b/sources/plugins/clipboard/icons/copy-rtl.png new file mode 100644 index 0000000..ce94fc0 Binary files /dev/null and b/sources/plugins/clipboard/icons/copy-rtl.png differ diff --git a/sources/plugins/clipboard/icons/copy.png b/sources/plugins/clipboard/icons/copy.png new file mode 100644 index 0000000..ce94fc0 Binary files /dev/null and b/sources/plugins/clipboard/icons/copy.png differ diff --git a/sources/plugins/clipboard/icons/cut-rtl.png b/sources/plugins/clipboard/icons/cut-rtl.png new file mode 100644 index 0000000..8ae48d9 Binary files /dev/null and b/sources/plugins/clipboard/icons/cut-rtl.png differ diff --git a/sources/plugins/clipboard/icons/cut.png b/sources/plugins/clipboard/icons/cut.png new file mode 100644 index 0000000..8ae48d9 Binary files /dev/null and b/sources/plugins/clipboard/icons/cut.png differ diff --git a/sources/plugins/clipboard/icons/hidpi/copy-rtl.png b/sources/plugins/clipboard/icons/hidpi/copy-rtl.png new file mode 100644 index 0000000..74c6765 Binary files /dev/null and b/sources/plugins/clipboard/icons/hidpi/copy-rtl.png differ diff --git a/sources/plugins/clipboard/icons/hidpi/copy.png b/sources/plugins/clipboard/icons/hidpi/copy.png new file mode 100644 index 0000000..74c6765 Binary files /dev/null and b/sources/plugins/clipboard/icons/hidpi/copy.png differ diff --git a/sources/plugins/clipboard/icons/hidpi/cut-rtl.png b/sources/plugins/clipboard/icons/hidpi/cut-rtl.png new file mode 100644 index 0000000..f5a9b0d Binary files /dev/null and b/sources/plugins/clipboard/icons/hidpi/cut-rtl.png differ diff --git a/sources/plugins/clipboard/icons/hidpi/cut.png b/sources/plugins/clipboard/icons/hidpi/cut.png new file mode 100644 index 0000000..f5a9b0d Binary files /dev/null and b/sources/plugins/clipboard/icons/hidpi/cut.png differ diff --git a/sources/plugins/clipboard/icons/hidpi/paste-rtl.png b/sources/plugins/clipboard/icons/hidpi/paste-rtl.png new file mode 100644 index 0000000..12cac92 Binary files /dev/null and b/sources/plugins/clipboard/icons/hidpi/paste-rtl.png differ diff --git a/sources/plugins/clipboard/icons/hidpi/paste.png b/sources/plugins/clipboard/icons/hidpi/paste.png new file mode 100644 index 0000000..12cac92 Binary files /dev/null and b/sources/plugins/clipboard/icons/hidpi/paste.png differ diff --git a/sources/plugins/clipboard/icons/paste-rtl.png b/sources/plugins/clipboard/icons/paste-rtl.png new file mode 100644 index 0000000..7039251 Binary files /dev/null and b/sources/plugins/clipboard/icons/paste-rtl.png differ diff --git a/sources/plugins/clipboard/icons/paste.png b/sources/plugins/clipboard/icons/paste.png new file mode 100644 index 0000000..7039251 Binary files /dev/null and b/sources/plugins/clipboard/icons/paste.png differ diff --git a/sources/plugins/clipboard/lang/af.js b/sources/plugins/clipboard/lang/af.js new file mode 100644 index 0000000..f87522f --- /dev/null +++ b/sources/plugins/clipboard/lang/af.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'af', { + copy: 'Kopiëer', + copyError: 'U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).', + cut: 'Knip', + cutError: 'U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).', + paste: 'Plak', + pasteArea: 'Plak-area', + pasteMsg: 'Plak die teks in die volgende teks-area met die sleutelbordkombinasie (Ctrl/Cmd+V) en druk OK.', + securityMsg: 'Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.', + title: 'Byvoeg' +} ); diff --git a/sources/plugins/clipboard/lang/ar.js b/sources/plugins/clipboard/lang/ar.js new file mode 100644 index 0000000..aa96596 --- /dev/null +++ b/sources/plugins/clipboard/lang/ar.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ar', { + copy: 'نسخ', + copyError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).', + cut: 'قص', + cutError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).', + paste: 'لصق', + pasteArea: 'منطقة اللصق', + pasteMsg: 'الصق داخل الصندوق بإستخدام زرائر (Ctrl/Cmd+V) في لوحة المفاتيح، ثم اضغط زر موافق.', + securityMsg: 'نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.', + title: 'لصق' +} ); diff --git a/sources/plugins/clipboard/lang/az.js b/sources/plugins/clipboard/lang/az.js new file mode 100644 index 0000000..1fc1a99 --- /dev/null +++ b/sources/plugins/clipboard/lang/az.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'az', { + copy: 'Köçür', + copyError: 'Avtomatik köçürülməsi mümkün deyil. Ctrl+C basın.', + cut: 'Kəs', + cutError: 'Avtomatik kəsmə mümkün deyil. Ctrl+X basın.', + paste: 'Əlavə et', + pasteArea: 'Əlavəetmə sahəsi', + pasteMsg: 'Bu sahəyə əlavə edin (Ctrl+V)', + securityMsg: 'Mübadilə buferi açmaq mümkün deyil. Bu pəncərədə yenidən əlavə edin.', + title: 'Əlavə et' +} ); diff --git a/sources/plugins/clipboard/lang/bg.js b/sources/plugins/clipboard/lang/bg.js new file mode 100644 index 0000000..93a5a9c --- /dev/null +++ b/sources/plugins/clipboard/lang/bg.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'bg', { + copy: 'Копирай', + copyError: 'Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни запаметяването. За целта използвайте клавиатурата (Ctrl/Cmd+C).', + cut: 'Отрежи', + cutError: 'Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).', + paste: 'Вмъкни', + pasteArea: 'Зона за вмъкване', + pasteMsg: 'Вмъкнете тук съдъжанието с клавиатуарата (Ctrl/Cmd+V) и натиснете OK.', + securityMsg: 'Заради настройките за сигурност на Вашия браузър, редакторът не може да прочете данните от клипборда коректно.', + title: 'Вмъкни' +} ); diff --git a/sources/plugins/clipboard/lang/bn.js b/sources/plugins/clipboard/lang/bn.js new file mode 100644 index 0000000..f821fa0 --- /dev/null +++ b/sources/plugins/clipboard/lang/bn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'bn', { + copy: 'কপি', + copyError: 'আপনার ব্রাউজারের নিরাপত্তা সেটিংসমূহ এডিটরকে স্বয়ংক্রিয়ভাবে কপি করার প্রক্রিয়া চালনা করার অনুমতি দেয় না। অনুগ্রহপূর্বক এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।', + cut: 'কাট', + cutError: 'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।', + paste: 'পেস্ট', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (Ctrl/Cmd+V) পেস্ট করুন এবং OK চাপ দিন', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'পেস্ট' +} ); diff --git a/sources/plugins/clipboard/lang/bs.js b/sources/plugins/clipboard/lang/bs.js new file mode 100644 index 0000000..1c23a61 --- /dev/null +++ b/sources/plugins/clipboard/lang/bs.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'bs', { + copy: 'Kopiraj', + copyError: 'Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).', + cut: 'Izreži', + cutError: 'Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).', + paste: 'Zalijepi', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Zalijepi' +} ); diff --git a/sources/plugins/clipboard/lang/ca.js b/sources/plugins/clipboard/lang/ca.js new file mode 100644 index 0000000..52179c1 --- /dev/null +++ b/sources/plugins/clipboard/lang/ca.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ca', { + copy: 'Copiar', + copyError: 'La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).', + cut: 'Retallar', + cutError: 'La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).', + paste: 'Enganxar', + pasteArea: 'Àrea d\'enganxat', + pasteMsg: 'Si us plau, enganxi dins del següent camp utilitzant el teclat (Ctrl/Cmd+V) i premi OK.', + securityMsg: 'A causa de la configuració de seguretat del vostre navegador, l\'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.', + title: 'Enganxar' +} ); diff --git a/sources/plugins/clipboard/lang/cs.js b/sources/plugins/clipboard/lang/cs.js new file mode 100644 index 0000000..7cf573e --- /dev/null +++ b/sources/plugins/clipboard/lang/cs.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'cs', { + copy: 'Kopírovat', + copyError: 'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).', + cut: 'Vyjmout', + cutError: 'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).', + paste: 'Vložit', + pasteArea: 'Oblast vkládání', + pasteMsg: 'Do následujícího pole vložte požadovaný obsah pomocí klávesnice (Ctrl/Cmd+V) a stiskněte OK.', + securityMsg: 'Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.', + title: 'Vložit' +} ); diff --git a/sources/plugins/clipboard/lang/cy.js b/sources/plugins/clipboard/lang/cy.js new file mode 100644 index 0000000..00c5eeb --- /dev/null +++ b/sources/plugins/clipboard/lang/cy.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'cy', { + copy: 'Copïo', + copyError: '\'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu\'r golygydd i gynnal \'gweithredoedd copïo\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).', + cut: 'Torri', + cutError: 'Nid yw gosodiadau diogelwch eich porwr yn caniatàu\'r golygydd i gynnal \'gweithredoedd torri\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).', + paste: 'Gludo', + pasteArea: 'Ardal Gludo', + pasteMsg: 'Gludwch i mewn i\'r blwch canlynol gan ddefnyddio\'r bysellfwrdd (Ctrl/Cmd+V) a phwyso Iawn.', + securityMsg: 'Oherwydd gosodiadau diogelwch eich porwr, \'dyw\'r porwr ddim yn gallu ennill mynediad i\'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i\'r ffenestr hon.', + title: 'Gludo' +} ); diff --git a/sources/plugins/clipboard/lang/da.js b/sources/plugins/clipboard/lang/da.js new file mode 100644 index 0000000..c029016 --- /dev/null +++ b/sources/plugins/clipboard/lang/da.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'da', { + copy: 'Kopiér', + copyError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).', + cut: 'Klip', + cutError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).', + paste: 'Indsæt', + pasteArea: 'Indsæt område', + pasteMsg: 'Indsæt i feltet herunder (Ctrl/Cmd+V) og klik på OK.', + securityMsg: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

Du skal indsætte udklipsholderens indhold i dette vindue igen.', + title: 'Indsæt' +} ); diff --git a/sources/plugins/clipboard/lang/de-ch.js b/sources/plugins/clipboard/lang/de-ch.js new file mode 100644 index 0000000..325b100 --- /dev/null +++ b/sources/plugins/clipboard/lang/de-ch.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'de-ch', { + copy: 'Kopieren', + copyError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).', + cut: 'Ausschneiden', + cutError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).', + paste: 'Einfügen', + pasteArea: 'Einfügebereich', + pasteMsg: 'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit Strg+V) ein und bestätigen Sie mit OK.', + securityMsg: 'Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.', + title: 'Einfügen' +} ); diff --git a/sources/plugins/clipboard/lang/de.js b/sources/plugins/clipboard/lang/de.js new file mode 100644 index 0000000..2d6b30b --- /dev/null +++ b/sources/plugins/clipboard/lang/de.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'de', { + copy: 'Kopieren', + copyError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).', + cut: 'Ausschneiden', + cutError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).', + paste: 'Einfügen', + pasteArea: 'Einfügebereich', + pasteMsg: 'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit Strg+V) ein und bestätigen Sie mit OK.', + securityMsg: 'Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.', + title: 'Einfügen' +} ); diff --git a/sources/plugins/clipboard/lang/el.js b/sources/plugins/clipboard/lang/el.js new file mode 100644 index 0000000..0528840 --- /dev/null +++ b/sources/plugins/clipboard/lang/el.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'el', { + copy: 'Αντιγραφή', + copyError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).', + cut: 'Αποκοπή', + cutError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).', + paste: 'Επικόλληση', + pasteArea: 'Περιοχή Επικόλλησης', + pasteMsg: 'Παρακαλώ επικολλήστε στο ακόλουθο κουτί χρησιμοποιώντας το πληκτρολόγιο (Ctrl/Cmd+V) και πατήστε OK.', + securityMsg: 'Λόγων των ρυθμίσεων ασφάλειας του περιηγητή σας, ο επεξεργαστής δεν μπορεί να έχει πρόσβαση στην μνήμη επικόλλησης. Χρειάζεται να επικολλήσετε ξανά σε αυτό το παράθυρο.', + title: 'Επικόλληση' +} ); diff --git a/sources/plugins/clipboard/lang/en-au.js b/sources/plugins/clipboard/lang/en-au.js new file mode 100644 index 0000000..5c497fb --- /dev/null +++ b/sources/plugins/clipboard/lang/en-au.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en-au', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/sources/plugins/clipboard/lang/en-ca.js b/sources/plugins/clipboard/lang/en-ca.js new file mode 100644 index 0000000..036ebab --- /dev/null +++ b/sources/plugins/clipboard/lang/en-ca.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en-ca', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/sources/plugins/clipboard/lang/en-gb.js b/sources/plugins/clipboard/lang/en-gb.js new file mode 100644 index 0000000..bb511ce --- /dev/null +++ b/sources/plugins/clipboard/lang/en-gb.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en-gb', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/sources/plugins/clipboard/lang/en.js b/sources/plugins/clipboard/lang/en.js new file mode 100644 index 0000000..4db6960 --- /dev/null +++ b/sources/plugins/clipboard/lang/en.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/sources/plugins/clipboard/lang/eo.js b/sources/plugins/clipboard/lang/eo.js new file mode 100644 index 0000000..2df4150 --- /dev/null +++ b/sources/plugins/clipboard/lang/eo.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'eo', { + copy: 'Kopii', + copyError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).', + cut: 'Eltondi', + cutError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).', + paste: 'Interglui', + pasteArea: 'Intergluoareo', + pasteMsg: 'Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (Ctrl/Cmd+V) kaj premu OK', + securityMsg: 'Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poŝo. Bonvolu denove interglui la datenojn en tiun fenestron.', + title: 'Interglui' +} ); diff --git a/sources/plugins/clipboard/lang/es.js b/sources/plugins/clipboard/lang/es.js new file mode 100644 index 0000000..c455992 --- /dev/null +++ b/sources/plugins/clipboard/lang/es.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'es', { + copy: 'Copiar', + copyError: 'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).', + cut: 'Cortar', + cutError: 'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).', + paste: 'Pegar', + pasteArea: 'Zona de pegado', + pasteMsg: 'Por favor pegue dentro del cuadro utilizando el teclado (Ctrl/Cmd+V);\r\nluego presione Aceptar.', + securityMsg: 'Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.', + title: 'Pegar' +} ); diff --git a/sources/plugins/clipboard/lang/et.js b/sources/plugins/clipboard/lang/et.js new file mode 100644 index 0000000..7d86b30 --- /dev/null +++ b/sources/plugins/clipboard/lang/et.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'et', { + copy: 'Kopeeri', + copyError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).', + cut: 'Lõika', + cutError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).', + paste: 'Aseta', + pasteArea: 'Asetamise ala', + pasteMsg: 'Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+V) ja vajuta seejärel OK.', + securityMsg: 'Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.', + title: 'Asetamine' +} ); diff --git a/sources/plugins/clipboard/lang/eu.js b/sources/plugins/clipboard/lang/eu.js new file mode 100644 index 0000000..93240b5 --- /dev/null +++ b/sources/plugins/clipboard/lang/eu.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'eu', { + copy: 'Kopiatu', + copyError: 'Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki kopiatzea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+C).', + cut: 'Ebaki', + cutError: 'Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki moztea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+X).', + paste: 'Itsatsi', + pasteArea: 'Itsasteko area', + pasteMsg: 'Mesedez teklatua erabiliz (Ctrl/Cmd+V) ondorengo eremuan testua itsatsi eta sakatu Ados.', + securityMsg: 'Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.', + title: 'Itsatsi' +} ); diff --git a/sources/plugins/clipboard/lang/fa.js b/sources/plugins/clipboard/lang/fa.js new file mode 100644 index 0000000..8abee21 --- /dev/null +++ b/sources/plugins/clipboard/lang/fa.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fa', { + copy: 'رونوشت', + copyError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).', + cut: 'برش', + cutError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).', + paste: 'چسباندن', + pasteArea: 'محل چسباندن', + pasteMsg: 'لطفا متن را با کلیدهای (Ctrl/Cmd+V) در این جعبهٴ متنی بچسبانید و پذیرش را بزنید.', + securityMsg: 'به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.', + title: 'چسباندن' +} ); diff --git a/sources/plugins/clipboard/lang/fi.js b/sources/plugins/clipboard/lang/fi.js new file mode 100644 index 0000000..d165fb3 --- /dev/null +++ b/sources/plugins/clipboard/lang/fi.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fi', { + copy: 'Kopioi', + copyError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).', + cut: 'Leikkaa', + cutError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).', + paste: 'Liitä', + pasteArea: 'Leikealue', + pasteMsg: 'Liitä painamalla (Ctrl+V) ja painamalla OK.', + securityMsg: 'Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.', + title: 'Liitä' +} ); diff --git a/sources/plugins/clipboard/lang/fo.js b/sources/plugins/clipboard/lang/fo.js new file mode 100644 index 0000000..5c1ec8a --- /dev/null +++ b/sources/plugins/clipboard/lang/fo.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fo', { + copy: 'Avrita', + copyError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).', + cut: 'Kvett', + cutError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).', + paste: 'Innrita', + pasteArea: 'Avritingarumráði', + pasteMsg: 'Vinarliga koyr tekstin í hendan rútin við knappaborðinum (Ctrl/Cmd+V) og klikk á Góðtak.', + securityMsg: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.', + title: 'Innrita' +} ); diff --git a/sources/plugins/clipboard/lang/fr-ca.js b/sources/plugins/clipboard/lang/fr-ca.js new file mode 100644 index 0000000..3425f56 --- /dev/null +++ b/sources/plugins/clipboard/lang/fr-ca.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fr-ca', { + copy: 'Copier', + copyError: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).', + cut: 'Couper', + cutError: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).', + paste: 'Coller', + pasteArea: 'Coller la zone', + pasteMsg: 'Veuillez coller dans la zone ci-dessous en utilisant le clavier (Ctrl/Cmd+V) et appuyer sur OK.', + securityMsg: 'A cause des paramètres de sécurité de votre navigateur, l\'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.', + title: 'Coller' +} ); diff --git a/sources/plugins/clipboard/lang/fr.js b/sources/plugins/clipboard/lang/fr.js new file mode 100644 index 0000000..bb8349f --- /dev/null +++ b/sources/plugins/clipboard/lang/fr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fr', { + copy: 'Copier', + copyError: 'Les paramètres de sécurité de votre navigateur n\'autorisent pas l\'éditeur à exécuter automatiquement l\'opération « Copier ». Veuillez utiliser le raccourci clavier à cet effet (Ctrl/Cmd+C).', + cut: 'Couper', + cutError: 'Les paramètres de sécurité de votre navigateur n\'autorisent pas l\'éditeur à exécuter automatiquement l\'opération « Couper ». Veuillez utiliser le raccourci clavier à cet effet (Ctrl/Cmd+X).', + paste: 'Coller', + pasteArea: 'Coller la zone', + pasteMsg: 'Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (Ctrl/Cmd+V) et cliquez sur OK.', + securityMsg: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur d\'accéder directement aux données du presse-papier. Vous devez les coller à nouveau dans cette fenêtre.', + title: 'Coller' +} ); diff --git a/sources/plugins/clipboard/lang/gl.js b/sources/plugins/clipboard/lang/gl.js new file mode 100644 index 0000000..3c89dd0 --- /dev/null +++ b/sources/plugins/clipboard/lang/gl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'gl', { + copy: 'Copiar', + copyError: 'Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).', + cut: 'Cortar', + cutError: 'Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).', + paste: 'Pegar', + pasteArea: 'Zona de pegado', + pasteMsg: 'Pegue dentro do seguinte cadro usando o teclado (Ctrl/Cmd+V) e prema en Aceptar', + securityMsg: 'Por mor da configuración de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.', + title: 'Pegar' +} ); diff --git a/sources/plugins/clipboard/lang/gu.js b/sources/plugins/clipboard/lang/gu.js new file mode 100644 index 0000000..fcf039a --- /dev/null +++ b/sources/plugins/clipboard/lang/gu.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'gu', { + copy: 'નકલ', + copyError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।', + cut: 'કાપવું', + cutError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.', + paste: 'પેસ્ટ', + pasteArea: 'પેસ્ટ કરવાની જગ્યા', + pasteMsg: 'Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો', + securityMsg: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.', + title: 'પેસ્ટ' +} ); diff --git a/sources/plugins/clipboard/lang/he.js b/sources/plugins/clipboard/lang/he.js new file mode 100644 index 0000000..a3726c3 --- /dev/null +++ b/sources/plugins/clipboard/lang/he.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'he', { + copy: 'העתקה', + copyError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).', + cut: 'גזירה', + cutError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).', + paste: 'הדבקה', + pasteArea: 'איזור הדבקה', + pasteMsg: 'נא להדביק בתוך הקופסה באמצעות (Ctrl/Cmd+V) וללחוץ על אישור.', + securityMsg: 'עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.', + title: 'הדבקה' +} ); diff --git a/sources/plugins/clipboard/lang/hi.js b/sources/plugins/clipboard/lang/hi.js new file mode 100644 index 0000000..738b0b9 --- /dev/null +++ b/sources/plugins/clipboard/lang/hi.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'hi', { + copy: 'कॉपी', + copyError: 'आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।', + cut: 'कट', + cutError: 'आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।', + paste: 'पेस्ट', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.', + securityMsg: 'आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.', + title: 'पेस्ट' +} ); diff --git a/sources/plugins/clipboard/lang/hr.js b/sources/plugins/clipboard/lang/hr.js new file mode 100644 index 0000000..7366069 --- /dev/null +++ b/sources/plugins/clipboard/lang/hr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'hr', { + copy: 'Kopiraj', + copyError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).', + cut: 'Izreži', + cutError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).', + paste: 'Zalijepi', + pasteArea: 'Prostor za ljepljenje', + pasteMsg: 'Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (Ctrl/Cmd+V) i kliknite OK.', + securityMsg: 'Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.', + title: 'Zalijepi' +} ); diff --git a/sources/plugins/clipboard/lang/hu.js b/sources/plugins/clipboard/lang/hu.js new file mode 100644 index 0000000..b124e35 --- /dev/null +++ b/sources/plugins/clipboard/lang/hu.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'hu', { + copy: 'Másolás', + copyError: 'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).', + cut: 'Kivágás', + cutError: 'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).', + paste: 'Beillesztés', + pasteArea: 'Beszúrás mező', + pasteMsg: 'Másolja be az alábbi mezőbe a Ctrl/Cmd+V billentyűk lenyomásával, majd nyomjon Rendben-t.', + securityMsg: 'A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.', + title: 'Beillesztés' +} ); diff --git a/sources/plugins/clipboard/lang/id.js b/sources/plugins/clipboard/lang/id.js new file mode 100644 index 0000000..e7b40ad --- /dev/null +++ b/sources/plugins/clipboard/lang/id.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'id', { + copy: 'Salin', + copyError: 'Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)', + cut: 'Potong', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING + paste: 'Tempel', + pasteArea: 'Area Tempel', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Karena pengaturan keamanan peramban anda, editor tida dapat mengakses data clipboard anda secara langsung. Anda harus mem-paste kembali pada halaman ini', + title: 'Tempel' +} ); diff --git a/sources/plugins/clipboard/lang/is.js b/sources/plugins/clipboard/lang/is.js new file mode 100644 index 0000000..6b36cef --- /dev/null +++ b/sources/plugins/clipboard/lang/is.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'is', { + copy: 'Afrita', + copyError: 'Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).', + cut: 'Klippa', + cutError: 'Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).', + paste: 'Líma', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Límdu í svæðið hér að neðan og (Ctrl/Cmd+V) og smelltu á OK.', + securityMsg: 'Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.', + title: 'Líma' +} ); diff --git a/sources/plugins/clipboard/lang/it.js b/sources/plugins/clipboard/lang/it.js new file mode 100644 index 0000000..21f8815 --- /dev/null +++ b/sources/plugins/clipboard/lang/it.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'it', { + copy: 'Copia', + copyError: 'Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).', + cut: 'Taglia', + cutError: 'Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).', + paste: 'Incolla', + pasteArea: 'Incolla', + pasteMsg: 'Incolla il testo all\'interno dell\'area sottostante usando la scorciatoia di tastiere (Ctrl/Cmd+V) e premi OK.', + securityMsg: 'A causa delle impostazioni di sicurezza del browser,l\'editor non è in grado di accedere direttamente agli appunti. E\' pertanto necessario incollarli di nuovo in questa finestra.', + title: 'Incolla' +} ); diff --git a/sources/plugins/clipboard/lang/ja.js b/sources/plugins/clipboard/lang/ja.js new file mode 100644 index 0000000..f099380 --- /dev/null +++ b/sources/plugins/clipboard/lang/ja.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ja', { + copy: 'コピー', + copyError: 'ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。', + cut: '切り取り', + cutError: 'ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。', + paste: '貼り付け', + pasteArea: '貼り付け場所', + pasteMsg: 'キーボード(Ctrl/Cmd+V)を使用して、次の入力エリア内で貼り付けて、OKを押してください。', + securityMsg: 'ブラウザのセキュリティ設定により、エディタはクリップボードデータに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。', + title: '貼り付け' +} ); diff --git a/sources/plugins/clipboard/lang/ka.js b/sources/plugins/clipboard/lang/ka.js new file mode 100644 index 0000000..e1af8cb --- /dev/null +++ b/sources/plugins/clipboard/lang/ka.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ka', { + copy: 'ასლი', + copyError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).', + cut: 'ამოჭრა', + cutError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).', + paste: 'ჩასმა', + pasteArea: 'ჩასმის არე', + pasteMsg: 'ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (Ctrl/Cmd+V) და დააჭირეთ OK-ს', + securityMsg: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.', + title: 'ჩასმა' +} ); diff --git a/sources/plugins/clipboard/lang/km.js b/sources/plugins/clipboard/lang/km.js new file mode 100644 index 0000000..32c30cb --- /dev/null +++ b/sources/plugins/clipboard/lang/km.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'km', { + copy: 'ចម្លង', + copyError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។', + cut: 'កាត់យក', + cutError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។', + paste: 'បិទ​ភ្ជាប់', + pasteArea: 'តំបន់​បិទ​ភ្ជាប់', + pasteMsg: 'សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី ​(Ctrl/Cmd+V) ហើយចុច OK ។', + securityMsg: 'ព្រោះតែ​ការកំណត់​សុវត្ថិភាព ប្រអប់សរសេរ​មិន​អាចចាប់​យកទិន្នន័យពីក្តារតម្បៀតខ្ទាស់​អ្នក​​ដោយផ្ទាល់​បានទេ។ អ្នក​ត្រូវចំលង​ដាក់វាម្តង​ទៀត ក្នុងផ្ទាំងនេះ។', + title: 'បិទ​ភ្ជាប់' +} ); diff --git a/sources/plugins/clipboard/lang/ko.js b/sources/plugins/clipboard/lang/ko.js new file mode 100644 index 0000000..0a0d1e9 --- /dev/null +++ b/sources/plugins/clipboard/lang/ko.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ko', { + copy: '복사', + copyError: '브라우저의 보안설정 때문에 복사할 수 없습니다. 키보드(Ctrl/Cmd+C)를 이용해서 복사하십시오.', + cut: '잘라내기', + cutError: '브라우저의 보안설정 때문에 잘라내기 기능을 실행할 수 없습니다. 키보드(Ctrl/Cmd+X)를 이용해서 잘라내기 하십시오', + paste: '붙여넣기', + pasteArea: '붙여넣기 범위', + pasteMsg: '키보드(Ctrl/Cmd+V)를 이용해서 상자안에 붙여넣고 확인 를 누르세요.', + securityMsg: '브라우저 보안 설정으로 인해, 클립보드에 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.', + title: '붙여넣기' +} ); diff --git a/sources/plugins/clipboard/lang/ku.js b/sources/plugins/clipboard/lang/ku.js new file mode 100644 index 0000000..86e1778 --- /dev/null +++ b/sources/plugins/clipboard/lang/ku.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ku', { + copy: 'لەبەرگرتنەوە', + copyError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).', + cut: 'بڕین', + cutError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).', + paste: 'لکاندن', + pasteArea: 'ناوچەی لکاندن', + pasteMsg: 'تکایە بیلکێنە لەناوەوەی ئەم سنوقە لەڕێی تەختەکلیلەکەت بە بەکارهێنانی کلیلی (Ctrl/Cmd+V) دووای کلیکی باشە بکە.', + securityMsg: 'بەهۆی شێوەپێدانی پارێزی وێبگەڕەکەت، سەرنووسەکه ناتوانێت دەستبگەیەنێت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه پێویسته دووباره بیلکێنیت لەم پەنجەرەیه.', + title: 'لکاندن' +} ); diff --git a/sources/plugins/clipboard/lang/lt.js b/sources/plugins/clipboard/lang/lt.js new file mode 100644 index 0000000..86ecbbb --- /dev/null +++ b/sources/plugins/clipboard/lang/lt.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'lt', { + copy: 'Kopijuoti', + copyError: 'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).', + cut: 'Iškirpti', + cutError: 'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).', + paste: 'Įdėti', + pasteArea: 'Įkelti dalį', + pasteMsg: 'Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (Ctrl/Cmd+V) ir paspauskite mygtuką OK.', + securityMsg: 'Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.', + title: 'Įdėti' +} ); diff --git a/sources/plugins/clipboard/lang/lv.js b/sources/plugins/clipboard/lang/lv.js new file mode 100644 index 0000000..c762fc6 --- /dev/null +++ b/sources/plugins/clipboard/lang/lv.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'lv', { + copy: 'Kopēt', + copyError: 'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt kopēšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.', + cut: 'Izgriezt', + cutError: 'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt izgriezšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+X), lai veiktu šo darbību.', + paste: 'Ielīmēt', + pasteArea: 'Ielīmēšanas zona', + pasteMsg: 'Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (Ctrl/Cmd+V) un apstipriniet ar Darīts!.', + securityMsg: 'Jūsu pārlūka drošības uzstādījumu dēļ, nav iespējams tieši piekļūt jūsu starpliktuvei. Jums jāielīmē atkārtoti šajā logā.', + title: 'Ievietot' +} ); diff --git a/sources/plugins/clipboard/lang/mk.js b/sources/plugins/clipboard/lang/mk.js new file mode 100644 index 0000000..eb16066 --- /dev/null +++ b/sources/plugins/clipboard/lang/mk.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'mk', { + copy: 'Копирај (Copy)', + copyError: 'Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот автоматски да изврши копирање. Ве молиме употребете ја тастатурата. (Ctrl/Cmd+C)', + cut: 'Исечи (Cut)', + cutError: 'Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот автоматски да изврши сечење. Ве молиме употребете ја тастатурата. (Ctrl/Cmd+C)', + paste: 'Залепи (Paste)', + pasteArea: 'Простор за залепување', + pasteMsg: 'Ве молиме да залепите во следниот квадрат користејќи ја тастатурата (Ctrl/Cmd+V) и да притиснете OK', + securityMsg: 'Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот директно да пристапи до копираните податоци. Потребно е повторно да се обидете во овој прозорец.', + title: 'Залепи (Paste)' +} ); diff --git a/sources/plugins/clipboard/lang/mn.js b/sources/plugins/clipboard/lang/mn.js new file mode 100644 index 0000000..5351941 --- /dev/null +++ b/sources/plugins/clipboard/lang/mn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'mn', { + copy: 'Хуулах', + copyError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.', + cut: 'Хайчлах', + cutError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.', + paste: 'Буулгах', + pasteArea: 'Paste Area', // MISSING + pasteMsg: '(Ctrl/Cmd+V) товчийг ашиглан paste хийнэ үү. Мөн OK дар.', + securityMsg: 'Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.', + title: 'Буулгах' +} ); diff --git a/sources/plugins/clipboard/lang/ms.js b/sources/plugins/clipboard/lang/ms.js new file mode 100644 index 0000000..3a01be4 --- /dev/null +++ b/sources/plugins/clipboard/lang/ms.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ms', { + copy: 'Salin', + copyError: 'Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).', + cut: 'Potong', + cutError: 'Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).', + paste: 'Tampal', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Tampal' +} ); diff --git a/sources/plugins/clipboard/lang/nb.js b/sources/plugins/clipboard/lang/nb.js new file mode 100644 index 0000000..5355b8a --- /dev/null +++ b/sources/plugins/clipboard/lang/nb.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'nb', { + copy: 'Kopier', + copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).', + cut: 'Klipp ut', + cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).', + paste: 'Lim inn', + pasteArea: 'Innlimingsområde', + pasteMsg: 'Vennligst lim inn i følgende boks med tastaturet (Ctrl/Cmd+V) og trykk OK.', + securityMsg: 'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.', + title: 'Lim inn' +} ); diff --git a/sources/plugins/clipboard/lang/nl.js b/sources/plugins/clipboard/lang/nl.js new file mode 100644 index 0000000..bae806f --- /dev/null +++ b/sources/plugins/clipboard/lang/nl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'nl', { + copy: 'Kopiëren', + copyError: 'De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.', + cut: 'Knippen', + cutError: 'De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.', + paste: 'Plakken', + pasteArea: 'Plakgebied', + pasteMsg: 'Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (Ctrl/Cmd+V) en klik op OK.', + securityMsg: 'Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.', + title: 'Plakken' +} ); diff --git a/sources/plugins/clipboard/lang/no.js b/sources/plugins/clipboard/lang/no.js new file mode 100644 index 0000000..e8c48da --- /dev/null +++ b/sources/plugins/clipboard/lang/no.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'no', { + copy: 'Kopier', + copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).', + cut: 'Klipp ut', + cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).', + paste: 'Lim inn', + pasteArea: 'Innlimingsområde', + pasteMsg: 'Vennligst lim inn i følgende boks med tastaturet (Ctrl/Cmd+V) og trykk OK.', + securityMsg: 'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.', + title: 'Lim inn' +} ); diff --git a/sources/plugins/clipboard/lang/oc.js b/sources/plugins/clipboard/lang/oc.js new file mode 100644 index 0000000..e9e78cd --- /dev/null +++ b/sources/plugins/clipboard/lang/oc.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'oc', { + copy: 'Copiar', + copyError: 'Los paramètres de seguretat de vòstre navigador autorizan pas l\'editor a executar automaticament l\'operacion « Copiar ». Utilizatz l\'acorchi de clavièr a aqueste efièit (Ctrl/Cmd+C).', + cut: 'Talhar', + cutError: 'Los paramètres de seguretat de vòstre navigador autorizan pas l\'editor a executar automaticament l\'operacion « Talhar ». Utilizatz l\'acorchi de clavièr a aqueste efièit (Ctrl/Cmd+X).', + paste: 'Pegar', + pasteArea: 'Pegar la zòna', + pasteMsg: 'Pegatz lo tèxte dins la zòna seguenta en utilizant l\'acorchi de clavièr (Ctrl/Cmd+V) e clicatz sus D\'acòrdi.', + securityMsg: 'Los paramètres de seguretat de vòstre navigador empach l\'editor d\'accedir dirèctament a las donadas del quichapapièr. Las vos cal pegar tornamai dins aquesta fenèstra.', + title: 'Pegar' +} ); diff --git a/sources/plugins/clipboard/lang/pl.js b/sources/plugins/clipboard/lang/pl.js new file mode 100644 index 0000000..e2ccd16 --- /dev/null +++ b/sources/plugins/clipboard/lang/pl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'pl', { + copy: 'Kopiuj', + copyError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.', + cut: 'Wytnij', + cutError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.', + paste: 'Wklej', + pasteArea: 'Obszar wklejania', + pasteMsg: 'Wklej tekst w poniższym polu, używając skrótu klawiaturowego (Ctrl/Cmd+V), i kliknij OK.', + securityMsg: 'Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.', + title: 'Wklej' +} ); diff --git a/sources/plugins/clipboard/lang/pt-br.js b/sources/plugins/clipboard/lang/pt-br.js new file mode 100644 index 0000000..74608ba --- /dev/null +++ b/sources/plugins/clipboard/lang/pt-br.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'pt-br', { + copy: 'Copiar', + copyError: 'As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).', + cut: 'Recortar', + cutError: 'As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).', + paste: 'Colar', + pasteArea: 'Área para Colar', + pasteMsg: 'Transfira o link usado na caixa usando o teclado com (Ctrl/Cmd+V) e OK.', + securityMsg: 'As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.', + title: 'Colar' +} ); diff --git a/sources/plugins/clipboard/lang/pt.js b/sources/plugins/clipboard/lang/pt.js new file mode 100644 index 0000000..623ce06 --- /dev/null +++ b/sources/plugins/clipboard/lang/pt.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'pt', { + copy: 'Copiar', + copyError: 'A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).', + cut: 'Cortar', + cutError: 'A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).', + paste: 'Colar', + pasteArea: 'Colar área', + pasteMsg: 'Por favor, cole dentro da seguinte caixa usando o teclado (Ctrl/Cmd+V) e carregue em OK.', + securityMsg: 'Devido ás definições de segurança do teu browser, o editor não pode aceder ao clipboard diretamente. É necessário que voltes a colar as informações nesta janela.', + title: 'Colar' +} ); diff --git a/sources/plugins/clipboard/lang/ro.js b/sources/plugins/clipboard/lang/ro.js new file mode 100644 index 0000000..1e57798 --- /dev/null +++ b/sources/plugins/clipboard/lang/ro.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ro', { + copy: 'Copiază', + copyError: 'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).', + cut: 'Taie', + cutError: 'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).', + paste: 'Adaugă', + pasteArea: 'Suprafața de adăugare', + pasteMsg: 'Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (Ctrl/Cmd+V) şi apăsaţi OK', + securityMsg: 'Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.', + title: 'Adaugă' +} ); diff --git a/sources/plugins/clipboard/lang/ru.js b/sources/plugins/clipboard/lang/ru.js new file mode 100644 index 0000000..d9b4d58 --- /dev/null +++ b/sources/plugins/clipboard/lang/ru.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ru', { + copy: 'Копировать', + copyError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).', + cut: 'Вырезать', + cutError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).', + paste: 'Вставить', + pasteArea: 'Зона для вставки', + pasteMsg: 'Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (Ctrl/Cmd+V) и нажмите кнопку "OK".', + securityMsg: 'Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.', + title: 'Вставить' +} ); diff --git a/sources/plugins/clipboard/lang/si.js b/sources/plugins/clipboard/lang/si.js new file mode 100644 index 0000000..8430d01 --- /dev/null +++ b/sources/plugins/clipboard/lang/si.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'si', { + copy: 'පිටපත් කරන්න', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', // MISSING + cut: 'කපාගන්න', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING + paste: 'අලවන්න', + pasteArea: 'අලවන ප්‍රදේශ', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'අලවන්න' +} ); diff --git a/sources/plugins/clipboard/lang/sk.js b/sources/plugins/clipboard/lang/sk.js new file mode 100644 index 0000000..6b2b4f4 --- /dev/null +++ b/sources/plugins/clipboard/lang/sk.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sk', { + copy: 'Kopírovať', + copyError: 'Bezpečnostné nastavenia vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Použite na to klávesnicu (Ctrl/Cmd+C).', + cut: 'Vystrihnúť', + cutError: 'Bezpečnostné nastavenia vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Použite na to klávesnicu (Ctrl/Cmd+X).', + paste: 'Vložiť', + pasteArea: 'Miesto na vloženie', + pasteMsg: 'Použitím klávesnice (Ctrl/Cmd+V) vložte text do rámčeka a stlačte OK.', + securityMsg: 'Kvôli bezpečnostným nastaveniam vášho prehliadača editor nemôže pristupovať k schránke na kopírovanie priamo. Vložte to preto do tohto okna.', + title: 'Vložiť' +} ); diff --git a/sources/plugins/clipboard/lang/sl.js b/sources/plugins/clipboard/lang/sl.js new file mode 100644 index 0000000..3ddc89e --- /dev/null +++ b/sources/plugins/clipboard/lang/sl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sl', { + copy: 'Kopiraj', + copyError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).', + cut: 'Izreži', + cutError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).', + paste: 'Prilepi', + pasteArea: 'Prilepi območje', + pasteMsg: 'Prosimo, prilepite v sleči okvir s pomočjo tipkovnice (Ctrl/Cmd+V) in pritisnite V redu.', + securityMsg: 'Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.', + title: 'Prilepi' +} ); diff --git a/sources/plugins/clipboard/lang/sq.js b/sources/plugins/clipboard/lang/sq.js new file mode 100644 index 0000000..eda22e7 --- /dev/null +++ b/sources/plugins/clipboard/lang/sq.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sq', { + copy: 'Kopjo', + copyError: 'Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).', + cut: 'Preje', + cutError: 'Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).', + paste: 'Hidhe', + pasteArea: 'Hapësira Hedhëse', + pasteMsg: 'Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (Ctrl/Cmd+V) dhe shtypni Mirë.', + securityMsg: 'Për shkak të dhënave të sigurisë së shfletuesit tuaj, redaktuesi nuk është në gjendje të i qaset drejtpërdrejtë të dhanve të tabelës suaj të punës. Ju duhet të hidhni atë përsëri në këtë dritare.', + title: 'Hidhe' +} ); diff --git a/sources/plugins/clipboard/lang/sr-latn.js b/sources/plugins/clipboard/lang/sr-latn.js new file mode 100644 index 0000000..52102f6 --- /dev/null +++ b/sources/plugins/clipboard/lang/sr-latn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sr-latn', { + copy: 'Kopiraj', + copyError: 'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).', + cut: 'Iseci', + cutError: 'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).', + paste: 'Zalepi', + pasteArea: 'Prostor za lepljenje', + pasteMsg: 'Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (Ctrl/Cmd+V) i da pritisnete OK.', + securityMsg: 'Zbog sigurnosnih postavki vašeg pregledača, editor nije u mogućnosti da direktno pristupi podacima u klipbordu. Potrebno je da zalepite još jednom u ovom prozoru.', + title: 'Zalepi' +} ); diff --git a/sources/plugins/clipboard/lang/sr.js b/sources/plugins/clipboard/lang/sr.js new file mode 100644 index 0000000..c59ff1f --- /dev/null +++ b/sources/plugins/clipboard/lang/sr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sr', { + copy: 'Копирај', + copyError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).', + cut: 'Исеци', + cutError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).', + paste: 'Залепи', + pasteArea: 'Залепи зону', + pasteMsg: 'Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (Ctrl/Cmd+V) и да притиснете OK.', + securityMsg: 'Због сигурносних подешавања претраживача, едитор не може да приступи оставу. Требате да га поново залепите у овом прозору.', + title: 'Залепи' +} ); diff --git a/sources/plugins/clipboard/lang/sv.js b/sources/plugins/clipboard/lang/sv.js new file mode 100644 index 0000000..9663daa --- /dev/null +++ b/sources/plugins/clipboard/lang/sv.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sv', { + copy: 'Kopiera', + copyError: 'Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.', + cut: 'Klipp ut', + cutError: 'Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.', + paste: 'Klistra in', + pasteArea: 'Paste Area', + pasteMsg: 'Var god och klistra in Er text i rutan nedan genom att använda (Ctrl/Cmd+V) klicka sen på OK.', + securityMsg: 'På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.', + title: 'Klistra in' +} ); diff --git a/sources/plugins/clipboard/lang/th.js b/sources/plugins/clipboard/lang/th.js new file mode 100644 index 0000000..29664a6 --- /dev/null +++ b/sources/plugins/clipboard/lang/th.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'th', { + copy: 'สำเนา', + copyError: 'ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).', + cut: 'ตัด', + cutError: 'ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).', + paste: 'วาง', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (Ctrl/Cmd และ V)พร้อมๆกัน และกด OK.', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'วาง' +} ); diff --git a/sources/plugins/clipboard/lang/tr.js b/sources/plugins/clipboard/lang/tr.js new file mode 100644 index 0000000..a60ddc7 --- /dev/null +++ b/sources/plugins/clipboard/lang/tr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'tr', { + copy: 'Kopyala', + copyError: 'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.', + cut: 'Kes', + cutError: 'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.', + paste: 'Yapıştır', + pasteArea: 'Yapıştırma Alanı', + pasteMsg: 'Lütfen aşağıdaki kutunun içine yapıştırın. (Ctrl/Cmd+V) ve Tamam butonunu tıklayın.', + securityMsg: 'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..', + title: 'Yapıştır' +} ); diff --git a/sources/plugins/clipboard/lang/tt.js b/sources/plugins/clipboard/lang/tt.js new file mode 100644 index 0000000..e4b0537 --- /dev/null +++ b/sources/plugins/clipboard/lang/tt.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'tt', { + copy: 'Күчермәләү', + copyError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.', + cut: 'Кисеп алу', + cutError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.', + paste: 'Өстәү', + pasteArea: 'Өстәү мәйданы', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Өстәү' +} ); diff --git a/sources/plugins/clipboard/lang/ug.js b/sources/plugins/clipboard/lang/ug.js new file mode 100644 index 0000000..dcdf29c --- /dev/null +++ b/sources/plugins/clipboard/lang/ug.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ug', { + copy: 'كۆچۈر', + copyError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ', + cut: 'كەس', + cutError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ', + paste: 'چاپلا', + pasteArea: 'چاپلاش دائىرىسى', + pasteMsg: 'ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+V) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن جەزملەنى بېسىڭ', + securityMsg: 'توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.', + title: 'چاپلا' +} ); diff --git a/sources/plugins/clipboard/lang/uk.js b/sources/plugins/clipboard/lang/uk.js new file mode 100644 index 0000000..242688f --- /dev/null +++ b/sources/plugins/clipboard/lang/uk.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'uk', { + copy: 'Копіювати', + copyError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).', + cut: 'Вирізати', + cutError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)', + paste: 'Вставити', + pasteArea: 'Область вставки', + pasteMsg: 'Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (Ctrl/Cmd+V), та натисніть OK.', + securityMsg: 'Редактор не може отримати прямий доступ до буферу обміну у зв\'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.', + title: 'Вставити' +} ); diff --git a/sources/plugins/clipboard/lang/vi.js b/sources/plugins/clipboard/lang/vi.js new file mode 100644 index 0000000..fd36e1f --- /dev/null +++ b/sources/plugins/clipboard/lang/vi.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'vi', { + copy: 'Sao chép', + copyError: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).', + cut: 'Cắt', + cutError: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).', + paste: 'Dán', + pasteArea: 'Khu vực dán', + pasteMsg: 'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (Ctrl/Cmd+V) và nhấn vào nút Đồng ý.', + securityMsg: 'Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.', + title: 'Dán' +} ); diff --git a/sources/plugins/clipboard/lang/zh-cn.js b/sources/plugins/clipboard/lang/zh-cn.js new file mode 100644 index 0000000..930f24e --- /dev/null +++ b/sources/plugins/clipboard/lang/zh-cn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'zh-cn', { + copy: '复制', + copyError: '您的浏览器安全设置不允许编辑器自动执行复制操作,请使用键盘快捷键(Ctrl/Cmd+C)来完成。', + cut: '剪切', + cutError: '您的浏览器安全设置不允许编辑器自动执行剪切操作,请使用键盘快捷键(Ctrl/Cmd+X)来完成。', + paste: '粘贴', + pasteArea: '粘贴区域', + pasteMsg: '请使用键盘快捷键(Ctrl/Cmd+V)把内容粘贴到下面的方框里,再按 确定', + securityMsg: '因为您的浏览器的安全设置原因,本编辑器不能直接访问您的剪贴板内容,你需要在本窗口重新粘贴一次。', + title: '粘贴' +} ); diff --git a/sources/plugins/clipboard/lang/zh.js b/sources/plugins/clipboard/lang/zh.js new file mode 100644 index 0000000..33a4ef0 --- /dev/null +++ b/sources/plugins/clipboard/lang/zh.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'zh', { + copy: '複製', + copyError: '瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用鍵盤快捷鍵 (Ctrl/Cmd+C) 複製。', + cut: '剪下', + cutError: '瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用鏐盤快捷鍵 (Ctrl/Cmd+X) 剪下。', + paste: '貼上', + pasteArea: '貼上區', + pasteMsg: '請使用鍵盤快捷鍵 (Ctrl/Cmd+V) 貼到下方區域中並按下「確定」。', + securityMsg: '因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。', + title: '貼上' +} ); diff --git a/sources/plugins/clipboard/plugin.js b/sources/plugins/clipboard/plugin.js new file mode 100644 index 0000000..5c387b3 --- /dev/null +++ b/sources/plugins/clipboard/plugin.js @@ -0,0 +1,2772 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @ignore + * File overview: Clipboard support. + */ + +// +// COPY & PASTE EXECUTION FLOWS: +// -- CTRL+C +// * if ( isCustomCopyCutSupported ) +// * dataTransfer.setData( 'text/html', getSelectedHtml ) +// * else +// * browser's default behavior +// -- CTRL+X +// * listen onKey (onkeydown) +// * fire 'saveSnapshot' on editor +// * if ( isCustomCopyCutSupported ) +// * dataTransfer.setData( 'text/html', getSelectedHtml ) +// * extractSelectedHtml // remove selected contents +// * else +// * browser's default behavior +// * deferred second 'saveSnapshot' event +// -- CTRL+V +// * listen onKey (onkeydown) +// * simulate 'beforepaste' for non-IEs on editable +// * listen 'onpaste' on editable ('onbeforepaste' for IE) +// * fire 'beforePaste' on editor +// * if ( !canceled && ( htmlInDataTransfer || !external paste) && dataTransfer is not empty ) getClipboardDataByPastebin +// * fire 'paste' on editor +// * !canceled && fire 'afterPaste' on editor +// -- Copy command +// * tryToCutCopy +// * execCommand +// * !success && notification +// -- Cut command +// * fixCut +// * tryToCutCopy +// * execCommand +// * !success && notification +// -- Paste command +// * fire 'paste' on editable ('beforepaste' for IE) +// * !canceled && execCommand 'paste' +// * !success && fire 'pasteDialog' on editor +// -- Paste from native context menu & menubar +// (Fx & Webkits are handled in 'paste' default listener. +// Opera cannot be handled at all because it doesn't fire any events +// Special treatment is needed for IE, for which is this part of doc) +// * listen 'onpaste' +// * cancel native event +// * fire 'beforePaste' on editor +// * if ( !canceled && ( htmlInDataTransfer || !external paste) && dataTransfer is not empty ) getClipboardDataByPastebin +// * execIECommand( 'paste' ) -> this fires another 'paste' event, so cancel it +// * fire 'paste' on editor +// * !canceled && fire 'afterPaste' on editor +// +// +// PASTE EVENT - PREPROCESSING: +// -- Possible dataValue types: auto, text, html. +// -- Possible dataValue contents: +// * text (possible \n\r) +// * htmlified text (text + br,div,p - no presentational markup & attrs - depends on browser) +// * html +// -- Possible flags: +// * htmlified - if true then content is a HTML even if no markup inside. This flag is set +// for content from editable pastebins, because they 'htmlify' pasted content. +// +// -- Type: auto: +// * content: htmlified text -> filter, unify text markup (brs, ps, divs), set type: text +// * content: html -> filter, set type: html +// -- Type: text: +// * content: htmlified text -> filter, unify text markup +// * content: html -> filter, strip presentational markup, unify text markup +// -- Type: html: +// * content: htmlified text -> filter, unify text markup +// * content: html -> filter +// +// -- Phases: +// * if dataValue is empty copy data from dataTransfer to dataValue (priority 1) +// * filtering (priorities 3-5) - e.g. pastefromword filters +// * content type sniffing (priority 6) +// * markup transformations for text (priority 6) +// +// DRAG & DROP EXECUTION FLOWS: +// -- Drag +// * save to the global object: +// * drag timestamp (with 'cke-' prefix), +// * selected html, +// * drag range, +// * editor instance. +// * put drag timestamp into event.dataTransfer.text +// -- Drop +// * if events text == saved timestamp && editor == saved editor +// internal drag & drop occurred +// * getRangeAtDropPosition +// * create bookmarks for drag and drop ranges starting from the end of the document +// * dragRange.deleteContents() +// * fire 'paste' with saved html and drop range +// * if events text == saved timestamp && editor != saved editor +// cross editor drag & drop occurred +// * getRangeAtDropPosition +// * fire 'paste' with saved html +// * dragRange.deleteContents() +// * FF: refreshCursor on afterPaste +// * if events text != saved timestamp +// drop form external source occurred +// * getRangeAtDropPosition +// * if event contains html data then fire 'paste' with html +// * else if event contains text data then fire 'paste' with encoded text +// * FF: refreshCursor on afterPaste + +'use strict'; + +( function() { + // Register the plugin. + CKEDITOR.plugins.add( 'clipboard', { + requires: 'dialog', + // jscs:disable maximumLineLength + lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + icons: 'copy,copy-rtl,cut,cut-rtl,paste,paste-rtl', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + init: function( editor ) { + var filterType, + filtersFactory = filtersFactoryFactory(); + + if ( editor.config.forcePasteAsPlainText ) { + filterType = 'plain-text'; + } else if ( editor.config.pasteFilter ) { + filterType = editor.config.pasteFilter; + } + // On Webkit the pasteFilter defaults 'semantic-content' because pasted data is so terrible + // that it must be always filtered. + else if ( CKEDITOR.env.webkit && !( 'pasteFilter' in editor.config ) ) { + filterType = 'semantic-content'; + } + + editor.pasteFilter = filtersFactory.get( filterType ); + + initPasteClipboard( editor ); + initDragDrop( editor ); + + CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) ); + + // Convert image file (if present) to base64 string for Firefox. Do it as the first + // step as the conversion is asynchronous and should hold all further paste processing. + if ( CKEDITOR.env.gecko ) { + var supportedImageTypes = [ 'image/png', 'image/jpeg', 'image/gif' ], + latestId; + + editor.on( 'paste', function( evt ) { + var dataObj = evt.data, + data = dataObj.dataValue, + dataTransfer = dataObj.dataTransfer; + + // If data empty check for image content inside data transfer. #16705 + if ( !data && dataObj.method == 'paste' && dataTransfer && dataTransfer.getFilesCount() == 1 && latestId != dataTransfer.id ) { + var file = dataTransfer.getFile( 0 ); + + if ( CKEDITOR.tools.indexOf( supportedImageTypes, file.type ) != -1 ) { + var fileReader = new FileReader(); + + // Convert image file to img tag with base64 image. + fileReader.addEventListener( 'load', function() { + evt.data.dataValue = ''; + editor.fire( 'paste', evt.data ); + }, false ); + + // Proceed with normal flow if reading file was aborted. + fileReader.addEventListener( 'abort', function() { + editor.fire( 'paste', evt.data ); + }, false ); + + // Proceed with normal flow if reading file failed. + fileReader.addEventListener( 'error', function() { + editor.fire( 'paste', evt.data ); + }, false ); + + fileReader.readAsDataURL( file ); + + latestId = dataObj.dataTransfer.id; + + evt.stop(); + } + } + }, null, null, 1 ); + } + + editor.on( 'paste', function( evt ) { + // Init `dataTransfer` if `paste` event was fired without it, so it will be always available. + if ( !evt.data.dataTransfer ) { + evt.data.dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer(); + } + + // If dataValue is already set (manually or by paste bin), so do not override it. + if ( evt.data.dataValue ) { + return; + } + + var dataTransfer = evt.data.dataTransfer, + // IE support only text data and throws exception if we try to get html data. + // This html data object may also be empty if we drag content of the textarea. + value = dataTransfer.getData( 'text/html' ); + + if ( value ) { + evt.data.dataValue = value; + evt.data.type = 'html'; + } else { + // Try to get text data otherwise. + value = dataTransfer.getData( 'text/plain' ); + + if ( value ) { + evt.data.dataValue = editor.editable().transformPlainTextToHtml( value ); + evt.data.type = 'text'; + } + } + }, null, null, 1 ); + + editor.on( 'paste', function( evt ) { + var data = evt.data.dataValue, + blockElements = CKEDITOR.dtd.$block; + + // Filter webkit garbage. + if ( data.indexOf( 'Apple-' ) > -1 ) { + // Replace special webkit's   with simple space, because webkit + // produces them even for normal spaces. + data = data.replace( / <\/span>/gi, ' ' ); + + // Strip around white-spaces when not in forced 'html' content type. + // This spans are created only when pasting plain text into Webkit, + // but for safety reasons remove them always. + if ( evt.data.type != 'html' ) { + data = data.replace( /]*>([^<]*)<\/span>/gi, function( all, spaces ) { + // Replace tabs with 4 spaces like Fx does. + return spaces.replace( /\t/g, '    ' ); + } ); + } + + // This br is produced only when copying & pasting HTML content. + if ( data.indexOf( '
' ) > -1 ) { + evt.data.startsWithEOL = 1; + evt.data.preSniffing = 'html'; // Mark as not text. + data = data.replace( /
/, '' ); + } + + // Remove all other classes. + data = data.replace( /(<[^>]+) class="Apple-[^"]*"/gi, '$1' ); + } + + // Strip editable that was copied from inside. (#9534) + if ( data.match( /^<[^<]+cke_(editable|contents)/i ) ) { + var tmp, + editable_wrapper, + wrapper = new CKEDITOR.dom.element( 'div' ); + + wrapper.setHtml( data ); + // Verify for sure and check for nested editor UI parts. (#9675) + while ( wrapper.getChildCount() == 1 && + ( tmp = wrapper.getFirst() ) && + tmp.type == CKEDITOR.NODE_ELEMENT && // Make sure first-child is element. + ( tmp.hasClass( 'cke_editable' ) || tmp.hasClass( 'cke_contents' ) ) ) { + wrapper = editable_wrapper = tmp; + } + + // If editable wrapper was found strip it and bogus
(added on FF). + if ( editable_wrapper ) + data = editable_wrapper.getHtml().replace( /
$/i, '' ); + } + + if ( CKEDITOR.env.ie ) { + //  

->

(br.cke-pasted-remove will be removed later) + data = data.replace( /^ (?: |\r\n)?<(\w+)/g, function( match, elementName ) { + if ( elementName.toLowerCase() in blockElements ) { + evt.data.preSniffing = 'html'; // Mark as not a text. + return '<' + elementName; + } + return match; + } ); + } else if ( CKEDITOR.env.webkit ) { + //


->


+ // We don't mark br, because this situation can happen for htmlified text too. + data = data.replace( /<\/(\w+)>

<\/div>$/, function( match, elementName ) { + if ( elementName in blockElements ) { + evt.data.endsWithEOL = 1; + return ''; + } + return match; + } ); + } else if ( CKEDITOR.env.gecko ) { + // Firefox adds bogus
when user pasted text followed by space(s). + data = data.replace( /(\s)
$/, '$1' ); + } + + evt.data.dataValue = data; + }, null, null, 3 ); + + editor.on( 'paste', function( evt ) { + var dataObj = evt.data, + type = dataObj.type, + data = dataObj.dataValue, + trueType, + // Default is 'html'. + defaultType = editor.config.clipboard_defaultContentType || 'html', + transferType = dataObj.dataTransfer.getTransferType( editor ); + + // If forced type is 'html' we don't need to know true data type. + if ( type == 'html' || dataObj.preSniffing == 'html' ) { + trueType = 'html'; + } else { + trueType = recogniseContentType( data ); + } + + // Unify text markup. + if ( trueType == 'htmlifiedtext' ) { + data = htmlifiedTextHtmlification( editor.config, data ); + } + + // Strip presentational markup & unify text markup. + // Forced plain text (dialog or forcePAPT). + // Note: we do not check dontFilter option in this case, because forcePAPT was implemented + // before pasteFilter and pasteFilter is automatically used on Webkit&Blink since 4.5, so + // forcePAPT should have priority as it had before 4.5. + if ( type == 'text' && trueType == 'html' ) { + data = filterContent( editor, data, filtersFactory.get( 'plain-text' ) ); + } + // External paste and pasteFilter exists and filtering isn't disabled. + else if ( transferType == CKEDITOR.DATA_TRANSFER_EXTERNAL && editor.pasteFilter && !dataObj.dontFilter ) { + data = filterContent( editor, data, editor.pasteFilter ); + } + + if ( dataObj.startsWithEOL ) { + data = '
' + data; + } + if ( dataObj.endsWithEOL ) { + data += '
'; + } + + if ( type == 'auto' ) { + type = ( trueType == 'html' || defaultType == 'html' ) ? 'html' : 'text'; + } + + dataObj.type = type; + dataObj.dataValue = data; + delete dataObj.preSniffing; + delete dataObj.startsWithEOL; + delete dataObj.endsWithEOL; + }, null, null, 6 ); + + // Inserts processed data into the editor at the end of the + // events chain. + editor.on( 'paste', function( evt ) { + var data = evt.data; + + if ( data.dataValue ) { + editor.insertHtml( data.dataValue, data.type, data.range ); + + // Defer 'afterPaste' so all other listeners for 'paste' will be fired first. + // Fire afterPaste only if paste inserted some HTML. + setTimeout( function() { + editor.fire( 'afterPaste' ); + }, 0 ); + } + }, null, null, 1000 ); + + editor.on( 'pasteDialog', function( evt ) { + // TODO it's possible that this setTimeout is not needed any more, + // because of changes introduced in the same commit as this comment. + // Editor.getClipboardData adds listener to the dialog's events which are + // fired after a while (not like 'showDialog'). + setTimeout( function() { + // Open default paste dialog. + editor.openDialog( 'paste', evt.data ); + }, 0 ); + } ); + } + } ); + + function firePasteEvents( editor, data, withBeforePaste ) { + if ( !data.type ) { + data.type = 'auto'; + } + + if ( withBeforePaste ) { + // Fire 'beforePaste' event so clipboard flavor get customized + // by other plugins. + if ( editor.fire( 'beforePaste', data ) === false ) + return false; // Event canceled + } + + // Do not fire paste if there is no data (dataValue and dataTranfser are empty). + // This check should be done after firing 'beforePaste' because for native paste + // 'beforePaste' is by default fired even for empty clipboard. + if ( !data.dataValue && data.dataTransfer.isEmpty() ) { + return false; + } + + if ( !data.dataValue ) { + data.dataValue = ''; + } + + // Because of FF bug we need to use this hack, otherwise cursor is hidden + // or it is not possible to move it (#12420). + // Also, check that editor.toolbox exists, because the toolbar plugin might not be loaded (#13305). + if ( CKEDITOR.env.gecko && data.method == 'drop' && editor.toolbox ) { + editor.once( 'afterPaste', function() { + editor.toolbox.focus(); + } ); + } + + return editor.fire( 'paste', data ); + } + + function initPasteClipboard( editor ) { + var clipboard = CKEDITOR.plugins.clipboard, + preventBeforePasteEvent = 0, + preventPasteEvent = 0, + inReadOnly = 0; + + addListeners(); + addButtonsCommands(); + + /** + * Gets clipboard data by directly accessing the clipboard (IE only) or opening the paste dialog window. + * + * editor.getClipboardData( { title: 'Get my data' }, function( data ) { + * if ( data ) + * alert( data.type + ' ' + data.dataValue ); + * } ); + * + * @member CKEDITOR.editor + * @param {Object} options + * @param {String} [options.title] The title of the paste dialog window. + * @param {Function} callback A function that will be executed with `data.type` and `data.dataValue` + * or `null` if none of the capturing methods succeeded. + */ + editor.getClipboardData = function( options, callback ) { + var beforePasteNotCanceled = false, + dataType = 'auto', + dialogCommited = false; + + // Options are optional - args shift. + if ( !callback ) { + callback = options; + options = null; + } + + // Listen with maximum priority to handle content before everyone else. + // This callback will handle paste event that will be fired if direct + // access to the clipboard succeed in IE. + editor.on( 'paste', onPaste, null, null, 0 ); + + // Listen at the end of listeners chain to see if event wasn't canceled + // and to retrieve modified data.type. + editor.on( 'beforePaste', onBeforePaste, null, null, 1000 ); + + // getClipboardDataDirectly() will fire 'beforePaste' synchronously, so we can + // check if it was canceled and if any listener modified data.type. + + // If command didn't succeed (only IE allows to access clipboard and only if + // user agrees) open and handle paste dialog. + if ( getClipboardDataDirectly() === false ) { + // Direct access to the clipboard wasn't successful so remove listener. + editor.removeListener( 'paste', onPaste ); + + // If beforePaste was canceled do not open dialog. + // Add listeners only if dialog really opened. 'pasteDialog' can be canceled. + if ( beforePasteNotCanceled && editor.fire( 'pasteDialog', onDialogOpen ) ) { + editor.on( 'pasteDialogCommit', onDialogCommit ); + + // 'dialogHide' will be fired after 'pasteDialogCommit'. + editor.on( 'dialogHide', function( evt ) { + evt.removeListener(); + evt.data.removeListener( 'pasteDialogCommit', onDialogCommit ); + + // Because Opera has to wait a while in pasteDialog we have to wait here. + setTimeout( function() { + // Notify even if user canceled dialog (clicked 'cancel', ESC, etc). + if ( !dialogCommited ) + callback( null ); + }, 10 ); + } ); + } else { + callback( null ); + } + } + + function onPaste( evt ) { + evt.removeListener(); + evt.cancel(); + callback( evt.data ); + } + + function onBeforePaste( evt ) { + evt.removeListener(); + beforePasteNotCanceled = true; + dataType = evt.data.type; + } + + function onDialogCommit( evt ) { + evt.removeListener(); + // Cancel pasteDialogCommit so paste dialog won't automatically fire + // 'paste' evt by itself. + evt.cancel(); + dialogCommited = true; + callback( { + type: dataType, + dataValue: evt.data.dataValue, + dataTransfer: evt.data.dataTransfer, + method: 'paste' + } ); + } + + function onDialogOpen() { + this.customTitle = ( options && options.title ); + } + }; + + function addButtonsCommands() { + addButtonCommand( 'Cut', 'cut', createCutCopyCmd( 'cut' ), 10, 1 ); + addButtonCommand( 'Copy', 'copy', createCutCopyCmd( 'copy' ), 20, 4 ); + addButtonCommand( 'Paste', 'paste', createPasteCmd(), 30, 8 ); + + function addButtonCommand( buttonName, commandName, command, toolbarOrder, ctxMenuOrder ) { + var lang = editor.lang.clipboard[ commandName ]; + + editor.addCommand( commandName, command ); + editor.ui.addButton && editor.ui.addButton( buttonName, { + label: lang, + command: commandName, + toolbar: 'clipboard,' + toolbarOrder + } ); + + // If the "menu" plugin is loaded, register the menu item. + if ( editor.addMenuItems ) { + editor.addMenuItem( commandName, { + label: lang, + command: commandName, + group: 'clipboard', + order: ctxMenuOrder + } ); + } + } + } + + function addListeners() { + editor.on( 'key', onKey ); + editor.on( 'contentDom', addPasteListenersToEditable ); + + // For improved performance, we're checking the readOnly state on selectionChange instead of hooking a key event for that. + editor.on( 'selectionChange', function( evt ) { + inReadOnly = evt.data.selection.getRanges()[ 0 ].checkReadOnly(); + setToolbarStates(); + } ); + + // If the "contextmenu" plugin is loaded, register the listeners. + if ( editor.contextMenu ) { + editor.contextMenu.addListener( function( element, selection ) { + inReadOnly = selection.getRanges()[ 0 ].checkReadOnly(); + return { + cut: stateFromNamedCommand( 'cut' ), + copy: stateFromNamedCommand( 'copy' ), + paste: stateFromNamedCommand( 'paste' ) + }; + } ); + } + } + + // Add events listeners to editable. + function addPasteListenersToEditable() { + var editable = editor.editable(); + + if ( CKEDITOR.plugins.clipboard.isCustomCopyCutSupported ) { + var initOnCopyCut = function( evt ) { + // If user tries to cut in read-only editor, we must prevent default action. (#13872) + if ( !editor.readOnly || evt.name != 'cut' ) { + clipboard.initPasteDataTransfer( evt, editor ); + } + evt.data.preventDefault(); + }; + + editable.on( 'copy', initOnCopyCut ); + editable.on( 'cut', initOnCopyCut ); + + // Delete content with the low priority so one can overwrite cut data. + editable.on( 'cut', function() { + // If user tries to cut in read-only editor, we must prevent default action. (#13872) + if ( !editor.readOnly ) { + editor.extractSelectedHtml(); + } + }, null, null, 999 ); + } + + // We'll be catching all pasted content in one line, regardless of whether + // it's introduced by a document command execution (e.g. toolbar buttons) or + // user paste behaviors (e.g. CTRL+V). + editable.on( clipboard.mainPasteEvent, function( evt ) { + if ( clipboard.mainPasteEvent == 'beforepaste' && preventBeforePasteEvent ) { + return; + } + + // If you've just asked yourself why preventPasteEventNow() is not here, but + // in listener for CTRL+V and exec method of 'paste' command + // you've asked the same question we did. + // + // THE ANSWER: + // + // First thing to notice - this answer makes sense only for IE, + // because other browsers don't listen for 'paste' event. + // + // What would happen if we move preventPasteEventNow() here? + // For: + // * CTRL+V - IE fires 'beforepaste', so we prevent 'paste' and pasteDataFromClipboard(). OK. + // * editor.execCommand( 'paste' ) - we fire 'beforepaste', so we prevent + // 'paste' and pasteDataFromClipboard() and doc.execCommand( 'Paste' ). OK. + // * native context menu - IE fires 'beforepaste', so we prevent 'paste', but unfortunately + // on IE we fail with pasteDataFromClipboard() here, because of... we don't know why, but + // we just fail, so... we paste nothing. FAIL. + // * native menu bar - the same as for native context menu. + // + // But don't you know any way to distinguish first two cases from last two? + // Only one - special flag set in CTRL+V handler and exec method of 'paste' + // command. And that's what we did using preventPasteEventNow(). + + pasteDataFromClipboard( evt ); + } ); + + // It's not possible to clearly handle all four paste methods (ctrl+v, native menu bar + // native context menu, editor's command) in one 'paste/beforepaste' event in IE. + // + // For ctrl+v & editor's command it's easy to handle pasting in 'beforepaste' listener, + // so we do this. For another two methods it's better to use 'paste' event. + // + // 'paste' is always being fired after 'beforepaste' (except of weird one on opening native + // context menu), so for two methods handled in 'beforepaste' we're canceling 'paste' + // using preventPasteEvent state. + // + // 'paste' event in IE is being fired before getClipboardDataByPastebin executes its callback. + // + // QUESTION: Why didn't you handle all 4 paste methods in handler for 'paste'? + // Wouldn't this just be simpler? + // ANSWER: Then we would have to evt.data.preventDefault() only for native + // context menu and menu bar pastes. The same with execIECommand(). + // That would force us to mark CTRL+V and editor's paste command with + // special flag, other than preventPasteEvent. But we still would have to + // have preventPasteEvent for the second event fired by execIECommand. + // Code would be longer and not cleaner. + if ( clipboard.mainPasteEvent == 'beforepaste' ) { + editable.on( 'paste', function( evt ) { + if ( preventPasteEvent ) { + return; + } + + // Cancel next 'paste' event fired by execIECommand( 'paste' ) + // at the end of this callback. + preventPasteEventNow(); + + // Prevent native paste. + evt.data.preventDefault(); + + pasteDataFromClipboard( evt ); + + // Force IE to paste content into pastebin so pasteDataFromClipboard will work. + if ( !execIECommand( 'paste' ) ) { + editor.openDialog( 'paste' ); + } + } ); + + // If mainPasteEvent is 'beforePaste' (IE before Edge), + // dismiss the (wrong) 'beforepaste' event fired on context/toolbar menu open. (#7953) + editable.on( 'contextmenu', preventBeforePasteEventNow, null, null, 0 ); + + editable.on( 'beforepaste', function( evt ) { + // Do not prevent event on CTRL+V and SHIFT+INS because it blocks paste (#11970). + if ( evt.data && !evt.data.$.ctrlKey && !evt.data.$.shiftKey ) + preventBeforePasteEventNow(); + }, null, null, 0 ); + } + + editable.on( 'beforecut', function() { + !preventBeforePasteEvent && fixCut( editor ); + } ); + + var mouseupTimeout; + + // Use editor.document instead of editable in non-IEs for observing mouseup + // since editable won't fire the event if selection process started within + // iframe and ended out of the editor (#9851). + editable.attachListener( CKEDITOR.env.ie ? editable : editor.document.getDocumentElement(), 'mouseup', function() { + mouseupTimeout = setTimeout( function() { + setToolbarStates(); + }, 0 ); + } ); + + // Make sure that deferred mouseup callback isn't executed after editor instance + // had been destroyed. This may happen when editor.destroy() is called in parallel + // with mouseup event (i.e. a button with onclick callback) (#10219). + editor.on( 'destroy', function() { + clearTimeout( mouseupTimeout ); + } ); + + editable.on( 'keyup', setToolbarStates ); + } + + // Create object representing Cut or Copy commands. + function createCutCopyCmd( type ) { + return { + type: type, + canUndo: type == 'cut', // We can't undo copy to clipboard. + startDisabled: true, + fakeKeystroke: type == 'cut' ? CKEDITOR.CTRL + 88 /*X*/ : CKEDITOR.CTRL + 67 /*C*/, + exec: function() { + // Attempts to execute the Cut and Copy operations. + function tryToCutCopy( type ) { + if ( CKEDITOR.env.ie ) + return execIECommand( type ); + + // non-IEs part + try { + // Other browsers throw an error if the command is disabled. + return editor.document.$.execCommand( type, false, null ); + } catch ( e ) { + return false; + } + } + + this.type == 'cut' && fixCut(); + + var success = tryToCutCopy( this.type ); + + if ( !success ) { + // Show cutError or copyError. + editor.showNotification( editor.lang.clipboard[ this.type + 'Error' ] ); // jshint ignore:line + } + + return success; + } + }; + } + + function createPasteCmd() { + return { + // Snapshots are done manually by editable.insertXXX methods. + canUndo: false, + async: true, + fakeKeystroke: CKEDITOR.CTRL + 86 /*V*/, + exec: function( editor, data ) { + var cmd = this, + fire = function( data, withBeforePaste ) { + data && firePasteEvents( editor, data, !!withBeforePaste ); + + editor.fire( 'afterCommandExec', { + name: 'paste', + command: cmd, + returnValue: !!data + } ); + }; + + // Check data precisely - don't open dialog on empty string. + if ( typeof data == 'string' ) + fire( { + dataValue: data, + method: 'paste', + dataTransfer: clipboard.initPasteDataTransfer() + }, 1 ); + else + editor.getClipboardData( fire ); + } + }; + } + + function preventPasteEventNow() { + preventPasteEvent = 1; + // For safety reason we should wait longer than 0/1ms. + // We don't know how long execution of quite complex getClipboardData will take + // and in for example 'paste' listener execCommand() (which fires 'paste') is called + // after getClipboardData finishes. + // Luckily, it's impossible to immediately fire another 'paste' event we want to handle, + // because we only handle there native context menu and menu bar. + setTimeout( function() { + preventPasteEvent = 0; + }, 100 ); + } + + function preventBeforePasteEventNow() { + preventBeforePasteEvent = 1; + setTimeout( function() { + preventBeforePasteEvent = 0; + }, 10 ); + } + + // Tries to execute any of the paste, cut or copy commands in IE. Returns a + // boolean indicating that the operation succeeded. + // @param {String} command *LOWER CASED* name of command ('paste', 'cut', 'copy'). + function execIECommand( command ) { + var doc = editor.document, + body = doc.getBody(), + enabled = false, + onExec = function() { + enabled = true; + }; + + // The following seems to be the only reliable way to detect that + // clipboard commands are enabled in IE. It will fire the + // onpaste/oncut/oncopy events only if the security settings allowed + // the command to execute. + body.on( command, onExec ); + + // IE7: document.execCommand has problem to paste into positioned element. + if ( CKEDITOR.env.version > 7 ) { + doc.$.execCommand( command ); + } else { + doc.$.selection.createRange().execCommand( command ); + } + + body.removeListener( command, onExec ); + + return enabled; + } + + // Cutting off control type element in IE standards breaks the selection entirely. (#4881) + function fixCut() { + if ( !CKEDITOR.env.ie || CKEDITOR.env.quirks ) + return; + + var sel = editor.getSelection(), + control, range, dummy; + + if ( ( sel.getType() == CKEDITOR.SELECTION_ELEMENT ) && ( control = sel.getSelectedElement() ) ) { + range = sel.getRanges()[ 0 ]; + dummy = editor.document.createText( '' ); + dummy.insertBefore( control ); + range.setStartBefore( dummy ); + range.setEndAfter( control ); + sel.selectRanges( [ range ] ); + + // Clear up the fix if the paste wasn't succeeded. + setTimeout( function() { + // Element still online? + if ( control.getParent() ) { + dummy.remove(); + sel.selectElement( control ); + } + }, 0 ); + } + } + + // Allow to peek clipboard content by redirecting the + // pasting content into a temporary bin and grab the content of it. + function getClipboardDataByPastebin( evt, callback ) { + var doc = editor.document, + editable = editor.editable(), + cancel = function( evt ) { + evt.cancel(); + }, + blurListener; + + // Avoid recursions on 'paste' event or consequent paste too fast. (#5730) + if ( doc.getById( 'cke_pastebin' ) ) + return; + + var sel = editor.getSelection(); + var bms = sel.createBookmarks(); + + // #11384. On IE9+ we use native selectionchange (i.e. editor#selectionCheck) to cache the most + // recent selection which we then lock on editable blur. See selection.js for more info. + // selectionchange fired before getClipboardDataByPastebin() cached selection + // before creating bookmark (cached selection will be invalid, because bookmarks modified the DOM), + // so we need to fire selectionchange one more time, to store current seleciton. + // Selection will be locked when we focus pastebin. + if ( CKEDITOR.env.ie ) + sel.root.fire( 'selectionchange' ); + + // Create container to paste into. + // For rich content we prefer to use "body" since it holds + // the least possibility to be splitted by pasted content, while this may + // breaks the text selection on a frame-less editable, "div" would be + // the best one in that case. + // In another case on old IEs moving the selection into a "body" paste bin causes error panic. + // Body can't be also used for Opera which fills it with
+ // what is indistinguishable from pasted
(copying
in Opera isn't possible, + // but it can be copied from other browser). + var pastebin = new CKEDITOR.dom.element( + ( CKEDITOR.env.webkit || editable.is( 'body' ) ) && !CKEDITOR.env.ie ? 'body' : 'div', doc ); + + pastebin.setAttributes( { + id: 'cke_pastebin', + 'data-cke-temp': '1' + } ); + + var containerOffset = 0, + offsetParent, + win = doc.getWindow(); + + if ( CKEDITOR.env.webkit ) { + // It's better to paste close to the real paste destination, so inherited styles + // (which Webkits will try to compensate by styling span) differs less from the destination's one. + editable.append( pastebin ); + // Style pastebin like .cke_editable, to minimize differences between origin and destination. (#9754) + pastebin.addClass( 'cke_editable' ); + + // Compensate position of offsetParent. + if ( !editable.is( 'body' ) ) { + // We're not able to get offsetParent from pastebin (body element), so check whether + // its parent (editable) is positioned. + if ( editable.getComputedStyle( 'position' ) != 'static' ) + offsetParent = editable; + // And if not - safely get offsetParent from editable. + else + offsetParent = CKEDITOR.dom.element.get( editable.$.offsetParent ); + + containerOffset = offsetParent.getDocumentPosition().y; + } + } else { + // Opera and IE doesn't allow to append to html element. + editable.getAscendant( CKEDITOR.env.ie ? 'body' : 'html', 1 ).append( pastebin ); + } + + pastebin.setStyles( { + position: 'absolute', + // Position the bin at the top (+10 for safety) of viewport to avoid any subsequent document scroll. + top: ( win.getScrollPosition().y - containerOffset + 10 ) + 'px', + width: '1px', + // Caret has to fit in that height, otherwise browsers like Chrome & Opera will scroll window to show it. + // Set height equal to viewport's height - 20px (safety gaps), minimum 1px. + height: Math.max( 1, win.getViewPaneSize().height - 20 ) + 'px', + overflow: 'hidden', + // Reset styles that can mess up pastebin position. + margin: 0, + padding: 0 + } ); + + // Paste fails in Safari when the body tag has 'user-select: none'. (#12506) + if ( CKEDITOR.env.safari ) + pastebin.setStyles( CKEDITOR.tools.cssVendorPrefix( 'user-select', 'text' ) ); + + // Check if the paste bin now establishes new editing host. + var isEditingHost = pastebin.getParent().isReadOnly(); + + if ( isEditingHost ) { + // Hide the paste bin. + pastebin.setOpacity( 0 ); + // And make it editable. + pastebin.setAttribute( 'contenteditable', true ); + } + // Transparency is not enough since positioned non-editing host always shows + // resize handler, pull it off the screen instead. + else { + pastebin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-10000px' ); + } + + editor.on( 'selectionChange', cancel, null, null, 0 ); + + // Webkit fill fire blur on editable when moving selection to + // pastebin (if body is used). Cancel it because it causes incorrect + // selection lock in case of inline editor (#10644). + // The same seems to apply to Firefox (#10787). + if ( CKEDITOR.env.webkit || CKEDITOR.env.gecko ) + blurListener = editable.once( 'blur', cancel, null, null, -100 ); + + // Temporarily move selection to the pastebin. + isEditingHost && pastebin.focus(); + var range = new CKEDITOR.dom.range( pastebin ); + range.selectNodeContents( pastebin ); + var selPastebin = range.select(); + + // If non-native paste is executed, IE will open security alert and blur editable. + // Editable will then lock selection inside itself and after accepting security alert + // this selection will be restored. We overwrite stored selection, so it's restored + // in pastebin. (#9552) + if ( CKEDITOR.env.ie ) { + blurListener = editable.once( 'blur', function() { + editor.lockSelection( selPastebin ); + } ); + } + + var scrollTop = CKEDITOR.document.getWindow().getScrollPosition().y; + + // Wait a while and grab the pasted contents. + setTimeout( function() { + // Restore main window's scroll position which could have been changed + // by browser in cases described in #9771. + if ( CKEDITOR.env.webkit ) + CKEDITOR.document.getBody().$.scrollTop = scrollTop; + + // Blur will be fired only on non-native paste. In other case manually remove listener. + blurListener && blurListener.removeListener(); + + // Restore properly the document focus. (#8849) + if ( CKEDITOR.env.ie ) + editable.focus(); + + // IE7: selection must go before removing pastebin. (#8691) + sel.selectBookmarks( bms ); + pastebin.remove(); + + // Grab the HTML contents. + // We need to look for a apple style wrapper on webkit it also adds + // a div wrapper if you copy/paste the body of the editor. + // Remove hidden div and restore selection. + var bogusSpan; + if ( CKEDITOR.env.webkit && ( bogusSpan = pastebin.getFirst() ) && ( bogusSpan.is && bogusSpan.hasClass( 'Apple-style-span' ) ) ) + pastebin = bogusSpan; + + editor.removeListener( 'selectionChange', cancel ); + callback( pastebin.getHtml() ); + }, 0 ); + } + + // Try to get content directly on IE from clipboard, without native event + // being fired before. In other words - synthetically get clipboard data, if it's possible. + // mainPasteEvent will be fired, so if forced native paste: + // * worked, getClipboardDataByPastebin will grab it, + // * didn't work, dataValue and dataTransfer will be empty and editor#paste won't be fired. + // Clipboard data can be accessed directly only on IEs older than Edge. + // On other browsers we should fire beforePaste event and return false. + function getClipboardDataDirectly() { + if ( clipboard.mainPasteEvent == 'paste' ) { + // beforePaste should be fired when dialog open so it can be canceled. + editor.fire( 'beforePaste', { type: 'auto', method: 'paste' } ); + return false; + } + + // Prevent IE from pasting at the begining of the document. + editor.focus(); + + // Command will be handled by 'beforepaste', but as + // execIECommand( 'paste' ) will fire also 'paste' event + // we're canceling it. + preventPasteEventNow(); + + // #9247: Lock focus to prevent IE from hiding toolbar for inline editor. + var focusManager = editor.focusManager; + focusManager.lock(); + + if ( editor.editable().fire( clipboard.mainPasteEvent ) && !execIECommand( 'paste' ) ) { + focusManager.unlock(); + return false; + } + focusManager.unlock(); + + return true; + } + + // Listens for some clipboard related keystrokes, so they get customized. + // Needs to be bind to keydown event. + function onKey( event ) { + if ( editor.mode != 'wysiwyg' ) + return; + + switch ( event.data.keyCode ) { + // Paste + case CKEDITOR.CTRL + 86: // CTRL+V + case CKEDITOR.SHIFT + 45: // SHIFT+INS + var editable = editor.editable(); + + // Cancel 'paste' event because ctrl+v is for IE handled + // by 'beforepaste'. + preventPasteEventNow(); + + // Simulate 'beforepaste' event for all browsers using 'paste' as main event. + if ( clipboard.mainPasteEvent == 'paste' ) { + editable.fire( 'beforepaste' ); + } + + return; + + // Cut + case CKEDITOR.CTRL + 88: // CTRL+X + case CKEDITOR.SHIFT + 46: // SHIFT+DEL + // Save Undo snapshot. + editor.fire( 'saveSnapshot' ); // Save before cut + setTimeout( function() { + editor.fire( 'saveSnapshot' ); // Save after cut + }, 50 ); // OSX is slow (#11416). + } + } + + function pasteDataFromClipboard( evt ) { + // Default type is 'auto', but can be changed by beforePaste listeners. + var eventData = { + type: 'auto', + method: 'paste', + dataTransfer: clipboard.initPasteDataTransfer( evt ) + }; + + eventData.dataTransfer.cacheData(); + + // Fire 'beforePaste' event so clipboard flavor get customized by other plugins. + // If 'beforePaste' is canceled continue executing getClipboardDataByPastebin and then do nothing + // (do not fire 'paste', 'afterPaste' events). This way we can grab all - synthetically + // and natively pasted content and prevent its insertion into editor + // after canceling 'beforePaste' event. + var beforePasteNotCanceled = editor.fire( 'beforePaste', eventData ) !== false; + + // Do not use paste bin if the browser let us get HTML or files from dataTranfer. + if ( beforePasteNotCanceled && clipboard.canClipboardApiBeTrusted( eventData.dataTransfer, editor ) ) { + evt.data.preventDefault(); + setTimeout( function() { + firePasteEvents( editor, eventData ); + }, 0 ); + } else { + getClipboardDataByPastebin( evt, function( data ) { + // Clean up. + eventData.dataValue = data.replace( /]+data-cke-bookmark[^<]*?<\/span>/ig, '' ); + + // Fire remaining events (without beforePaste) + beforePasteNotCanceled && firePasteEvents( editor, eventData ); + } ); + } + } + + function setToolbarStates() { + if ( editor.mode != 'wysiwyg' ) + return; + + var pasteState = stateFromNamedCommand( 'paste' ); + + editor.getCommand( 'cut' ).setState( stateFromNamedCommand( 'cut' ) ); + editor.getCommand( 'copy' ).setState( stateFromNamedCommand( 'copy' ) ); + editor.getCommand( 'paste' ).setState( pasteState ); + editor.fire( 'pasteState', pasteState ); + } + + function stateFromNamedCommand( command ) { + if ( inReadOnly && command in { paste: 1, cut: 1 } ) + return CKEDITOR.TRISTATE_DISABLED; + + if ( command == 'paste' ) + return CKEDITOR.TRISTATE_OFF; + + // Cut, copy - check if the selection is not empty. + var sel = editor.getSelection(), + ranges = sel.getRanges(), + selectionIsEmpty = sel.getType() == CKEDITOR.SELECTION_NONE || ( ranges.length == 1 && ranges[ 0 ].collapsed ); + + return selectionIsEmpty ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_OFF; + } + } + + // Returns: + // * 'htmlifiedtext' if content looks like transformed by browser from plain text. + // See clipboard/paste.html TCs for more info. + // * 'html' if it is not 'htmlifiedtext'. + function recogniseContentType( data ) { + if ( CKEDITOR.env.webkit ) { + // Plain text or (

and text inside
). + if ( !data.match( /^[^<]*$/g ) && !data.match( /^(
<\/div>|
[^<]*<\/div>)*$/gi ) ) + return 'html'; + } else if ( CKEDITOR.env.ie ) { + // Text and
or ( text and
in

- paragraphs can be separated by new \r\n ). + if ( !data.match( /^([^<]|)*$/gi ) && !data.match( /^(

([^<]|)*<\/p>|(\r\n))*$/gi ) ) + return 'html'; + } else if ( CKEDITOR.env.gecko ) { + // Text or
. + if ( !data.match( /^([^<]|)*$/gi ) ) + return 'html'; + } else { + return 'html'; + } + + return 'htmlifiedtext'; + } + + // This function transforms what browsers produce when + // pasting plain text into editable element (see clipboard/paste.html TCs + // for more info) into correct HTML (similar to that produced by text2Html). + function htmlifiedTextHtmlification( config, data ) { + function repeatParagraphs( repeats ) { + // Repeat blocks floor((n+1)/2) times. + // Even number of repeats - add
at the beginning of last

. + return CKEDITOR.tools.repeat( '

', ~~( repeats / 2 ) ) + ( repeats % 2 == 1 ? '
' : '' ); + } + + // Replace adjacent white-spaces (EOLs too - Fx sometimes keeps them) with one space. + data = data.replace( /\s+/g, ' ' ) + // Remove spaces from between tags. + .replace( /> +<' ) + // Normalize XHTML syntax and upper cased
tags. + .replace( /
/gi, '
' ); + + // IE - lower cased tags. + data = data.replace( /<\/?[A-Z]+>/g, function( match ) { + return match.toLowerCase(); + } ); + + // Don't touch single lines (no ) - nothing to do here. + if ( data.match( /^[^<]$/ ) ) + return data; + + // Webkit. + if ( CKEDITOR.env.webkit && data.indexOf( '

' ) > -1 ) { + // One line break at the beginning - insert
+ data = data.replace( /^(
(
|)<\/div>)(?!$|(
(
|)<\/div>))/g, '
' ) + // Two or more - reduce number of new lines by one. + .replace( /^(
(
|)<\/div>){2}(?!$)/g, '
' ); + + // Two line breaks create one paragraph in Webkit. + if ( data.match( /
(
|)<\/div>/ ) ) { + data = '

' + data.replace( /(

(
|)<\/div>)+/g, function( match ) { + return repeatParagraphs( match.split( '
' ).length + 1 ); + } ) + '

'; + } + + // One line break create br. + data = data.replace( /<\/div>
/g, '
' ); + + // Remove remaining divs. + data = data.replace( /<\/?div>/g, '' ); + } + + // Opera and Firefox and enterMode != BR. + if ( CKEDITOR.env.gecko && config.enterMode != CKEDITOR.ENTER_BR ) { + // Remove bogus
- Fx generates two for one line break. + // For two line breaks it still produces two , but it's better to ignore this case than the first one. + if ( CKEDITOR.env.gecko ) + data = data.replace( /^

$/, '
' ); + + // This line satisfy edge case when for Opera we have two line breaks + //data = data.replace( /) + + if ( data.indexOf( '

' ) > -1 ) { + // Two line breaks create one paragraph, three - 2, four - 3, etc. + data = '

' + data.replace( /(
){2,}/g, function( match ) { + return repeatParagraphs( match.length / 4 ); + } ) + '

'; + } + } + + return switchEnterMode( config, data ); + } + + function filtersFactoryFactory() { + var filters = {}; + + function setUpTags() { + var tags = {}; + + for ( var tag in CKEDITOR.dtd ) { + if ( tag.charAt( 0 ) != '$' && tag != 'div' && tag != 'span' ) { + tags[ tag ] = 1; + } + } + + return tags; + } + + function createSemanticContentFilter() { + var filter = new CKEDITOR.filter(); + + filter.allow( { + $1: { + elements: setUpTags(), + attributes: true, + styles: false, + classes: false + } + } ); + + return filter; + } + + return { + get: function( type ) { + if ( type == 'plain-text' ) { + // Does this look confusing to you? Did we forget about enter mode? + // It is a trick that let's us creating one filter for edidtor, regardless of its + // activeEnterMode (which as the name indicates can change during runtime). + // + // How does it work? + // The active enter mode is passed to the filter.applyTo method. + // The filter first marks all elements except
as disallowed and then tries to remove + // them. However, it cannot remove e.g. a

element completely, because it's a basic structural element, + // so it tries to replace it with an element created based on the active enter mode, eventually doing nothing. + // + // Now you can sleep well. + return filters.plainText || ( filters.plainText = new CKEDITOR.filter( 'br' ) ); + } else if ( type == 'semantic-content' ) { + return filters.semanticContent || ( filters.semanticContent = createSemanticContentFilter() ); + } else if ( type ) { + // Create filter based on rules (string or object). + return new CKEDITOR.filter( type ); + } + + return null; + } + }; + } + + function filterContent( editor, data, filter ) { + var fragment = CKEDITOR.htmlParser.fragment.fromHtml( data ), + writer = new CKEDITOR.htmlParser.basicWriter(); + + filter.applyTo( fragment, true, false, editor.activeEnterMode ); + fragment.writeHtml( writer ); + + return writer.getHtml(); + } + + function switchEnterMode( config, data ) { + if ( config.enterMode == CKEDITOR.ENTER_BR ) { + data = data.replace( /(<\/p>

)+/g, function( match ) { + return CKEDITOR.tools.repeat( '
', match.length / 7 * 2 ); + } ).replace( /<\/?p>/g, '' ); + } else if ( config.enterMode == CKEDITOR.ENTER_DIV ) { + data = data.replace( /<(\/)?p>/g, '<$1div>' ); + } + + return data; + } + + function preventDefaultSetDropEffectToNone( evt ) { + evt.data.preventDefault(); + evt.data.$.dataTransfer.dropEffect = 'none'; + } + + function initDragDrop( editor ) { + var clipboard = CKEDITOR.plugins.clipboard; + + editor.on( 'contentDom', function() { + var editable = editor.editable(), + dropTarget = CKEDITOR.plugins.clipboard.getDropTarget( editor ), + top = editor.ui.space( 'top' ), + bottom = editor.ui.space( 'bottom' ); + + // -------------- DRAGOVER TOP & BOTTOM -------------- + + // Not allowing dragging on toolbar and bottom (#12613). + clipboard.preventDefaultDropOnElement( top ); + clipboard.preventDefaultDropOnElement( bottom ); + + // -------------- DRAGSTART -------------- + // Listed on dragstart to mark internal and cross-editor drag & drop + // and save range and selected HTML. + + editable.attachListener( dropTarget, 'dragstart', fireDragEvent ); + + // Make sure to reset data transfer (in case dragend was not called or was canceled). + editable.attachListener( editor, 'dragstart', clipboard.resetDragDataTransfer, clipboard, null, 1 ); + + // Create a dataTransfer object and save it globally. + editable.attachListener( editor, 'dragstart', function( evt ) { + clipboard.initDragDataTransfer( evt, editor ); + }, null, null, 2 ); + + editable.attachListener( editor, 'dragstart', function() { + // Save drag range globally for cross editor D&D. + var dragRange = clipboard.dragRange = editor.getSelection().getRanges()[ 0 ]; + + // Store number of children, so we can later tell if any text node was split on drop. (#13011, #13447) + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) { + clipboard.dragStartContainerChildCount = dragRange ? getContainerChildCount( dragRange.startContainer ) : null; + clipboard.dragEndContainerChildCount = dragRange ? getContainerChildCount( dragRange.endContainer ) : null; + } + }, null, null, 100 ); + + // -------------- DRAGEND -------------- + // Clean up on dragend. + + editable.attachListener( dropTarget, 'dragend', fireDragEvent ); + + // Init data transfer if someone wants to use it in dragend. + editable.attachListener( editor, 'dragend', clipboard.initDragDataTransfer, clipboard, null, 1 ); + + // When drag & drop is done we need to reset dataTransfer so the future + // external drop will be not recognize as internal. + editable.attachListener( editor, 'dragend', clipboard.resetDragDataTransfer, clipboard, null, 100 ); + + // -------------- DRAGOVER -------------- + // We need to call preventDefault on dragover because otherwise if + // we drop image it will overwrite document. + + editable.attachListener( dropTarget, 'dragover', function( evt ) { + var target = evt.data.getTarget(); + + // Prevent reloading page when dragging image on empty document (#12619). + if ( target && target.is && target.is( 'html' ) ) { + evt.data.preventDefault(); + return; + } + + // If we do not prevent default dragover on IE the file path + // will be loaded and we will lose content. On the other hand + // if we prevent it the cursor will not we shown, so we prevent + // dragover only on IE, on versions which support file API and only + // if the event contains files. + if ( CKEDITOR.env.ie && + CKEDITOR.plugins.clipboard.isFileApiSupported && + evt.data.$.dataTransfer.types.contains( 'Files' ) ) { + evt.data.preventDefault(); + } + } ); + + // -------------- DROP -------------- + + editable.attachListener( dropTarget, 'drop', function( evt ) { + // Do nothing if event was already prevented. (#13879) + if ( evt.data.$.defaultPrevented ) { + return; + } + + // Cancel native drop. + evt.data.preventDefault(); + + var target = evt.data.getTarget(), + readOnly = target.isReadOnly(); + + // Do nothing if drop on non editable element (#13015). + // The tag isn't editable (body is), but we want to allow drop on it + // (so it is possible to drop below editor contents). + if ( readOnly && !( target.type == CKEDITOR.NODE_ELEMENT && target.is( 'html' ) ) ) { + return; + } + + // Getting drop position is one of the most complex parts. + var dropRange = clipboard.getRangeAtDropPosition( evt, editor ), + dragRange = clipboard.dragRange; + + // Do nothing if it was not possible to get drop range. + if ( !dropRange ) { + return; + } + + // Fire drop. + fireDragEvent( evt, dragRange, dropRange ); + }, null, null, 9999 ); + + // Create dataTransfer or get it, if it was created before. + editable.attachListener( editor, 'drop', clipboard.initDragDataTransfer, clipboard, null, 1 ); + + // Execute drop action, fire paste. + editable.attachListener( editor, 'drop', function( evt ) { + var data = evt.data; + + if ( !data ) { + return; + } + + // Let user modify drag and drop range. + var dropRange = data.dropRange, + dragRange = data.dragRange, + dataTransfer = data.dataTransfer; + + if ( dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_INTERNAL ) { + // Execute drop with a timeout because otherwise selection, after drop, + // on IE is in the drag position, instead of drop position. + setTimeout( function() { + clipboard.internalDrop( dragRange, dropRange, dataTransfer, editor ); + }, 0 ); + } else if ( dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_CROSS_EDITORS ) { + crossEditorDrop( dragRange, dropRange, dataTransfer ); + } else { + externalDrop( dropRange, dataTransfer ); + } + }, null, null, 9999 ); + + // Cross editor drag and drop (drag in one Editor and drop in the other). + function crossEditorDrop( dragRange, dropRange, dataTransfer ) { + // Paste event should be fired before delete contents because otherwise + // Chrome have a problem with drop range (Chrome split the drop + // range container so the offset is bigger then container length). + dropRange.select(); + firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop' }, 1 ); + + // Remove dragged content and make a snapshot. + dataTransfer.sourceEditor.fire( 'saveSnapshot' ); + + dataTransfer.sourceEditor.editable().extractHtmlFromRange( dragRange ); + + // Make some selection before saving snapshot, otherwise error will be thrown, because + // there will be no valid selection after content is removed. + dataTransfer.sourceEditor.getSelection().selectRanges( [ dragRange ] ); + dataTransfer.sourceEditor.fire( 'saveSnapshot' ); + } + + // Drop from external source. + function externalDrop( dropRange, dataTransfer ) { + // Paste content into the drop position. + dropRange.select(); + + firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop' }, 1 ); + + // Usually we reset DataTranfer on dragend, + // but dragend is called on the same element as dragstart + // so it will not be called on on external drop. + clipboard.resetDragDataTransfer(); + } + + // Fire drag/drop events (dragstart, dragend, drop). + function fireDragEvent( evt, dragRange, dropRange ) { + var eventData = { + $: evt.data.$, + target: evt.data.getTarget() + }; + + if ( dragRange ) { + eventData.dragRange = dragRange; + } + if ( dropRange ) { + eventData.dropRange = dropRange; + } + + if ( editor.fire( evt.name, eventData ) === false ) { + evt.data.preventDefault(); + } + } + + function getContainerChildCount( container ) { + if ( container.type != CKEDITOR.NODE_ELEMENT ) { + container = container.getParent(); + } + + return container.getChildCount(); + } + } ); + } + + /** + * @singleton + * @class CKEDITOR.plugins.clipboard + */ + CKEDITOR.plugins.clipboard = { + /** + * True if the environment allows to set data on copy or cut manually. This value is false in IE, because this browser + * shows the security dialog window when the script tries to set clipboard data and on iOS, because custom data is + * not saved to clipboard there. + * + * @since 4.5 + * @readonly + * @property {Boolean} + */ + isCustomCopyCutSupported: !CKEDITOR.env.ie && !CKEDITOR.env.iOS, + + /** + * True if the environment supports MIME types and custom data types in dataTransfer/cliboardData getData/setData methods. + * + * @since 4.5 + * @readonly + * @property {Boolean} + */ + isCustomDataTypesSupported: !CKEDITOR.env.ie, + + /** + * True if the environment supports File API. + * + * @since 4.5 + * @readonly + * @property {Boolean} + */ + isFileApiSupported: !CKEDITOR.env.ie || CKEDITOR.env.version > 9, + + /** + * Main native paste event editable should listen to. + * + * **Note:** Safari does not like the {@link CKEDITOR.editor#beforePaste} event — it sometimes does not + * handle Ctrl+C properly. This is probably caused by some race condition between events. + * Chrome, Firefox and Edge work well with both events, so it is better to use {@link CKEDITOR.editor#paste} + * which will handle pasting from e.g. browsers' menu bars. + * IE7/8 does not like the {@link CKEDITOR.editor#paste} event for which it is throwing random errors. + * + * @since 4.5 + * @readonly + * @property {String} + */ + mainPasteEvent: ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ? 'beforepaste' : 'paste', + + /** + * Returns `true` if it is expected that a browser provides HTML data through the Clipboard API. + * If not, this method returns `false` and as a result CKEditor will use the paste bin. Read more in + * the [Clipboard Integration](http://docs.ckeditor.com/#!/guide/dev_clipboard-section-clipboard-api) guide. + * + * @since 4.5.2 + * @returns {Boolean} + */ + canClipboardApiBeTrusted: function( dataTransfer, editor ) { + // If it's an internal or cross-editor data transfer, then it means that custom cut/copy/paste support works + // and that the data were put manually on the data transfer so we can be sure that it's available. + if ( dataTransfer.getTransferType( editor ) != CKEDITOR.DATA_TRANSFER_EXTERNAL ) { + return true; + } + + // In Chrome we can trust Clipboard API, with the exception of Chrome on Android (in both - mobile and desktop modes), where + // clipboard API is not available so we need to check it (#13187). + if ( CKEDITOR.env.chrome && !dataTransfer.isEmpty() ) { + return true; + } + + // Because of a Firefox bug HTML data are not available in some cases (e.g. paste from Word), in such cases we + // need to use the pastebin (#13528, https://bugzilla.mozilla.org/show_bug.cgi?id=1183686). + if ( CKEDITOR.env.gecko && ( dataTransfer.getData( 'text/html' ) || dataTransfer.getFilesCount() ) ) { + return true; + } + + // In Safari and IE HTML data is not available though the Clipboard API. + // In Edge things are a bit messy at the moment - + // https://connect.microsoft.com/IE/feedback/details/1572456/edge-clipboard-api-text-html-content-messed-up-in-event-clipboarddata + // It is safer to use the paste bin in unknown cases. + return false; + }, + + /** + * Returns the element that should be used as the target for the drop event. + * + * @since 4.5 + * @param {CKEDITOR.editor} editor The editor instance. + * @returns {CKEDITOR.dom.domObject} the element that should be used as the target for the drop event. + */ + getDropTarget: function( editor ) { + var editable = editor.editable(); + + // #11123 Firefox needs to listen on document, because otherwise event won't be fired. + // #11086 IE8 cannot listen on document. + if ( ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) || editable.isInline() ) { + return editable; + } else { + return editor.document; + } + }, + + /** + * IE 8 & 9 split text node on drop so the first node contains the + * text before the drop position and the second contains the rest. If you + * drag the content from the same node you will be not be able to get + * it (the range becomes invalid), so you need to join them back. + * + * Note that the first node in IE 8 & 9 is the original node object + * but with shortened content. + * + * Before: + * --- Text Node A ---------------------------------- + * /\ + * Drag position + * + * After (IE 8 & 9): + * --- Text Node A ----- --- Text Node B ----------- + * /\ /\ + * Drop position Drag position + * (invalid) + * + * After (other browsers): + * --- Text Node A ---------------------------------- + * /\ /\ + * Drop position Drag position + * + * **Note:** This function is in the public scope for tests usage only. + * + * @since 4.5 + * @private + * @param {CKEDITOR.dom.range} dragRange The drag range. + * @param {CKEDITOR.dom.range} dropRange The drop range. + * @param {Number} preDragStartContainerChildCount The number of children of the drag range start container before the drop. + * @param {Number} preDragEndContainerChildCount The number of children of the drag range end container before the drop. + */ + fixSplitNodesAfterDrop: function( dragRange, dropRange, preDragStartContainerChildCount, preDragEndContainerChildCount ) { + var dropContainer = dropRange.startContainer; + + if ( + typeof preDragEndContainerChildCount != 'number' || + typeof preDragStartContainerChildCount != 'number' + ) { + return; + } + + // We are only concerned about ranges anchored in elements. + if ( dropContainer.type != CKEDITOR.NODE_ELEMENT ) { + return; + } + + if ( handleContainer( dragRange.startContainer, dropContainer, preDragStartContainerChildCount ) ) { + return; + } + + if ( handleContainer( dragRange.endContainer, dropContainer, preDragEndContainerChildCount ) ) { + return; + } + + function handleContainer( dragContainer, dropContainer, preChildCount ) { + var dragElement = dragContainer; + if ( dragElement.type == CKEDITOR.NODE_TEXT ) { + dragElement = dragContainer.getParent(); + } + + if ( dragElement.equals( dropContainer ) && preChildCount != dropContainer.getChildCount() ) { + applyFix( dropRange ); + return true; + } + } + + function applyFix( dropRange ) { + var nodeBefore = dropRange.startContainer.getChild( dropRange.startOffset - 1 ), + nodeAfter = dropRange.startContainer.getChild( dropRange.startOffset ); + + if ( + nodeBefore && nodeBefore.type == CKEDITOR.NODE_TEXT && + nodeAfter && nodeAfter.type == CKEDITOR.NODE_TEXT + ) { + var offset = nodeBefore.getLength(); + + nodeBefore.setText( nodeBefore.getText() + nodeAfter.getText() ); + nodeAfter.remove(); + + dropRange.setStart( nodeBefore, offset ); + dropRange.collapse( true ); + } + } + }, + + /** + * Checks whether turning the drag range into bookmarks will invalidate the drop range. + * This usually happens when the drop range shares the container with the drag range and is + * located after the drag range, but there are countless edge cases. + * + * This function is stricly related to {@link #internalDrop} which toggles + * order in which it creates bookmarks for both ranges based on a value returned + * by this method. In some cases this method returns a value which is not necessarily + * true in terms of what it was meant to check, but it is convenient, because + * we know how it is interpreted in {@link #internalDrop}, so the correct + * behavior of the entire algorithm is assured. + * + * **Note:** This function is in the public scope for tests usage only. + * + * @since 4.5 + * @private + * @param {CKEDITOR.dom.range} dragRange The first range to compare. + * @param {CKEDITOR.dom.range} dropRange The second range to compare. + * @returns {Boolean} `true` if the first range is before the second range. + */ + isDropRangeAffectedByDragRange: function( dragRange, dropRange ) { + var dropContainer = dropRange.startContainer, + dropOffset = dropRange.endOffset; + + // Both containers are the same and drop offset is at the same position or later. + // " A L] A " " M A " + // ^ ^ + if ( dragRange.endContainer.equals( dropContainer ) && dragRange.endOffset <= dropOffset ) { + return true; + } + + // Bookmark for drag start container will mess up with offsets. + // " O [L A " " M A " + // ^ ^ + if ( + dragRange.startContainer.getParent().equals( dropContainer ) && + dragRange.startContainer.getIndex() < dropOffset + ) { + return true; + } + + // Bookmark for drag end container will mess up with offsets. + // " O] L A " " M A " + // ^ ^ + if ( + dragRange.endContainer.getParent().equals( dropContainer ) && + dragRange.endContainer.getIndex() < dropOffset + ) { + return true; + } + + return false; + }, + + /** + * Internal drag and drop (drag and drop in the same editor instance). + * + * **Note:** This function is in the public scope for tests usage only. + * + * @since 4.5 + * @private + * @param {CKEDITOR.dom.range} dragRange The first range to compare. + * @param {CKEDITOR.dom.range} dropRange The second range to compare. + * @param {CKEDITOR.plugins.clipboard.dataTransfer} dataTransfer + * @param {CKEDITOR.editor} editor + */ + internalDrop: function( dragRange, dropRange, dataTransfer, editor ) { + var clipboard = CKEDITOR.plugins.clipboard, + editable = editor.editable(), + dragBookmark, dropBookmark, isDropRangeAffected; + + // Save and lock snapshot so there will be only + // one snapshot for both remove and insert content. + editor.fire( 'saveSnapshot' ); + editor.fire( 'lockSnapshot', { dontUpdate: 1 } ); + + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) { + this.fixSplitNodesAfterDrop( + dragRange, + dropRange, + clipboard.dragStartContainerChildCount, + clipboard.dragEndContainerChildCount + ); + } + + // Because we manipulate multiple ranges we need to do it carefully, + // changing one range (event creating a bookmark) may make other invalid. + // We need to change ranges into bookmarks so we can manipulate them easily in the future. + // We can change the range which is later in the text before we change the preceding range. + // We call isDropRangeAffectedByDragRange to test the order of ranges. + isDropRangeAffected = this.isDropRangeAffectedByDragRange( dragRange, dropRange ); + if ( !isDropRangeAffected ) { + dragBookmark = dragRange.createBookmark( false ); + } + dropBookmark = dropRange.clone().createBookmark( false ); + if ( isDropRangeAffected ) { + dragBookmark = dragRange.createBookmark( false ); + } + + // Check if drop range is inside range. + // This is an edge case when we drop something on editable's margin/padding. + // That space is not treated as a part of the range we drag, so it is possible to drop there. + // When we drop, browser tries to find closest drop position and it finds it inside drag range. (#13453) + var startNode = dragBookmark.startNode, + endNode = dragBookmark.endNode, + dropNode = dropBookmark.startNode, + dropInsideDragRange = + // Must check endNode because dragRange could be collapsed in some edge cases (simulated DnD). + endNode && + ( startNode.getPosition( dropNode ) & CKEDITOR.POSITION_PRECEDING ) && + ( endNode.getPosition( dropNode ) & CKEDITOR.POSITION_FOLLOWING ); + + // If the drop range happens to be inside drag range change it's position to the beginning of the drag range. + if ( dropInsideDragRange ) { + // We only change position of bookmark span that is connected with dropBookmark. + // dropRange will be overwritten and set to the dropBookmark later. + dropNode.insertBefore( startNode ); + } + + // No we can safely delete content for the drag range... + dragRange = editor.createRange(); + dragRange.moveToBookmark( dragBookmark ); + editable.extractHtmlFromRange( dragRange, 1 ); + + // ...and paste content into the drop position. + dropRange = editor.createRange(); + dropRange.moveToBookmark( dropBookmark ); + + // We do not select drop range, because of may be in the place we can not set the selection + // (e.g. between blocks, in case of block widget D&D). We put range to the paste event instead. + firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop', range: dropRange }, 1 ); + + editor.fire( 'unlockSnapshot' ); + }, + + /** + * Gets the range from the `drop` event. + * + * @since 4.5 + * @param {Object} domEvent A native DOM drop event object. + * @param {CKEDITOR.editor} editor The source editor instance. + * @returns {CKEDITOR.dom.range} range at drop position. + */ + getRangeAtDropPosition: function( dropEvt, editor ) { + var $evt = dropEvt.data.$, + x = $evt.clientX, + y = $evt.clientY, + $range, + defaultRange = editor.getSelection( true ).getRanges()[ 0 ], + range = editor.createRange(); + + // Make testing possible. + if ( dropEvt.data.testRange ) + return dropEvt.data.testRange; + + // Webkits. + if ( document.caretRangeFromPoint ) { + $range = editor.document.$.caretRangeFromPoint( x, y ); + range.setStart( CKEDITOR.dom.node( $range.startContainer ), $range.startOffset ); + range.collapse( true ); + } + // FF. + else if ( $evt.rangeParent ) { + range.setStart( CKEDITOR.dom.node( $evt.rangeParent ), $evt.rangeOffset ); + range.collapse( true ); + } + // IEs 9+. + // We check if editable is focused to make sure that it's an internal DnD. External DnD must use the second + // mechanism because of http://dev.ckeditor.com/ticket/13472#comment:6. + else if ( CKEDITOR.env.ie && CKEDITOR.env.version > 8 && defaultRange && editor.editable().hasFocus ) { + // On IE 9+ range by default is where we expected it. + // defaultRange may be undefined if dragover was canceled (file drop). + return defaultRange; + } + // IE 8 and all IEs if !defaultRange or external DnD. + else if ( document.body.createTextRange ) { + // To use this method we need a focus (which may be somewhere else in case of external drop). + editor.focus(); + + $range = editor.document.getBody().$.createTextRange(); + try { + var sucess = false; + + // If user drop between text line IEs moveToPoint throws exception: + // + // Lorem ipsum pulvinar purus et euismod + // + // dolor sit amet,| consectetur adipiscing + // * + // vestibulum tincidunt augue eget tempus. + // + // * - drop position + // | - expected cursor position + // + // So we try to call moveToPoint with +-1px up to +-20px above or + // below original drop position to find nearest good drop position. + for ( var i = 0; i < 20 && !sucess; i++ ) { + if ( !sucess ) { + try { + $range.moveToPoint( x, y - i ); + sucess = true; + } catch ( err ) { + } + } + if ( !sucess ) { + try { + $range.moveToPoint( x, y + i ); + sucess = true; + } catch ( err ) { + } + } + } + + if ( sucess ) { + var id = 'cke-temp-' + ( new Date() ).getTime(); + $range.pasteHTML( '\u200b' ); + + var span = editor.document.getById( id ); + range.moveToPosition( span, CKEDITOR.POSITION_BEFORE_START ); + span.remove(); + } else { + // If the fist method does not succeed we might be next to + // the short element (like header): + // + // Lorem ipsum pulvinar purus et euismod. + // + // + // SOME HEADER| * + // + // + // vestibulum tincidunt augue eget tempus. + // + // * - drop position + // | - expected cursor position + // + // In such situation elementFromPoint returns proper element. Using getClientRect + // it is possible to check if the cursor should be at the beginning or at the end + // of paragraph. + var $element = editor.document.$.elementFromPoint( x, y ), + element = new CKEDITOR.dom.element( $element ), + rect; + + if ( !element.equals( editor.editable() ) && element.getName() != 'html' ) { + rect = element.getClientRect(); + + if ( x < rect.left ) { + range.setStartAt( element, CKEDITOR.POSITION_AFTER_START ); + range.collapse( true ); + } else { + range.setStartAt( element, CKEDITOR.POSITION_BEFORE_END ); + range.collapse( true ); + } + } + // If drop happens on no element elementFromPoint returns html or body. + // + // * |Lorem ipsum pulvinar purus et euismod. + // + // vestibulum tincidunt augue eget tempus. + // + // * - drop position + // | - expected cursor position + // + // In such case we can try to use default selection. If startContainer is not + // 'editable' element it is probably proper selection. + else if ( defaultRange && defaultRange.startContainer && + !defaultRange.startContainer.equals( editor.editable() ) ) { + return defaultRange; + + // Otherwise we can not find any drop position and we have to return null + // and cancel drop event. + } else { + return null; + } + + } + } catch ( err ) { + return null; + } + } else { + return null; + } + + return range; + }, + + /** + * This function tries to link the `evt.data.dataTransfer` property of the {@link CKEDITOR.editor#dragstart}, + * {@link CKEDITOR.editor#dragend} and {@link CKEDITOR.editor#drop} events to a single + * {@link CKEDITOR.plugins.clipboard.dataTransfer} object. + * + * This method is automatically used by the core of the drag and drop functionality and + * usually does not have to be called manually when using the drag and drop events. + * + * This method behaves differently depending on whether the drag and drop events were fired + * artificially (to represent a non-native drag and drop) or whether they were caused by the native drag and drop. + * + * If the native event is not available, then it will create a new {@link CKEDITOR.plugins.clipboard.dataTransfer} + * instance (if it does not exist already) and will link it to this and all following event objects until + * the {@link #resetDragDataTransfer} method is called. It means that all three drag and drop events must be fired + * in order to ensure that the data transfer is bound correctly. + * + * If the native event is available, then the {@link CKEDITOR.plugins.clipboard.dataTransfer} is identified + * by its ID and a new instance is assigned to the `evt.data.dataTransfer` only if the ID changed or + * the {@link #resetDragDataTransfer} method was called. + * + * @since 4.5 + * @param {CKEDITOR.dom.event} [evt] A drop event object. + * @param {CKEDITOR.editor} [sourceEditor] The source editor instance. + */ + initDragDataTransfer: function( evt, sourceEditor ) { + // Create a new dataTransfer object based on the drop event. + // If this event was used on dragstart to create dataTransfer + // both dataTransfer objects will have the same id. + var nativeDataTransfer = evt.data.$ ? evt.data.$.dataTransfer : null, + dataTransfer = new this.dataTransfer( nativeDataTransfer, sourceEditor ); + + if ( !nativeDataTransfer ) { + // No native event. + if ( this.dragData ) { + dataTransfer = this.dragData; + } else { + this.dragData = dataTransfer; + } + } else { + // Native event. If there is the same id we will replace dataTransfer with the one + // created on drag, because it contains drag editor, drag content and so on. + // Otherwise (in case of drag from external source) we save new object to + // the global clipboard.dragData. + if ( this.dragData && dataTransfer.id == this.dragData.id ) { + dataTransfer = this.dragData; + } else { + this.dragData = dataTransfer; + } + } + + evt.data.dataTransfer = dataTransfer; + }, + + /** + * Removes the global {@link #dragData} so the next call to {@link #initDragDataTransfer} + * always creates a new instance of {@link CKEDITOR.plugins.clipboard.dataTransfer}. + * + * @since 4.5 + */ + resetDragDataTransfer: function() { + this.dragData = null; + }, + + /** + * Global object storing the data transfer of the current drag and drop operation. + * Do not use it directly, use {@link #initDragDataTransfer} and {@link #resetDragDataTransfer}. + * + * Note: This object is global (meaning that it is not related to a single editor instance) + * in order to handle drag and drop from one editor into another. + * + * @since 4.5 + * @private + * @property {CKEDITOR.plugins.clipboard.dataTransfer} dragData + */ + + /** + * Range object to save the drag range and remove its content after the drop. + * + * @since 4.5 + * @private + * @property {CKEDITOR.dom.range} dragRange + */ + + /** + * Initializes and links data transfer objects based on the paste event. If the data + * transfer object was already initialized on this event, the function will + * return that object. In IE it is not possible to link copy/cut and paste events + * so the method always returns a new object. The same happens if there is no paste event + * passed to the method. + * + * @since 4.5 + * @param {CKEDITOR.dom.event} [evt] A paste event object. + * @param {CKEDITOR.editor} [sourceEditor] The source editor instance. + * @returns {CKEDITOR.plugins.clipboard.dataTransfer} The data transfer object. + */ + initPasteDataTransfer: function( evt, sourceEditor ) { + if ( !this.isCustomCopyCutSupported ) { + // Edge does not support custom copy/cut, but it have some useful data in the clipboardData (#13755). + return new this.dataTransfer( ( CKEDITOR.env.edge && evt && evt.data.$ && evt.data.$.clipboardData ) || null, sourceEditor ); + } else if ( evt && evt.data && evt.data.$ ) { + var dataTransfer = new this.dataTransfer( evt.data.$.clipboardData, sourceEditor ); + + if ( this.copyCutData && dataTransfer.id == this.copyCutData.id ) { + dataTransfer = this.copyCutData; + dataTransfer.$ = evt.data.$.clipboardData; + } else { + this.copyCutData = dataTransfer; + } + + return dataTransfer; + } else { + return new this.dataTransfer( null, sourceEditor ); + } + }, + + /** + * Prevents dropping on the specified element. + * + * @since 4.5 + * @param {CKEDITOR.dom.element} element The element on which dropping should be disabled. + */ + preventDefaultDropOnElement: function( element ) { + element && element.on( 'dragover', preventDefaultSetDropEffectToNone ); + } + }; + + // Data type used to link drag and drop events. + // + // In IE URL data type is buggie and there is no way to mark drag & drop without + // modifying text data (which would be displayed if user drop content to the textarea) + // so we just read dragged text. + // + // In Chrome and Firefox we can use custom data types. + var clipboardIdDataType = CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ? 'cke/id' : 'Text'; + /** + * Facade for the native `dataTransfer`/`clipboadData` object to hide all differences + * between browsers. + * + * @since 4.5 + * @class CKEDITOR.plugins.clipboard.dataTransfer + * @constructor Creates a class instance. + * @param {Object} [nativeDataTransfer] A native data transfer object. + * @param {CKEDITOR.editor} [editor] The source editor instance. If the editor is defined, dataValue will + * be created based on the editor content and the type will be 'html'. + */ + CKEDITOR.plugins.clipboard.dataTransfer = function( nativeDataTransfer, editor ) { + if ( nativeDataTransfer ) { + this.$ = nativeDataTransfer; + } + + this._ = { + metaRegExp: /^/i, + bodyRegExp: /([\s\S]*)<\/body>/i, + fragmentRegExp: //g, + + data: {}, + files: [], + + normalizeType: function( type ) { + type = type.toLowerCase(); + + if ( type == 'text' || type == 'text/plain' ) { + return 'Text'; // IE support only Text and URL; + } else if ( type == 'url' ) { + return 'URL'; // IE support only Text and URL; + } else { + return type; + } + } + }; + + // Check if ID is already created. + this.id = this.getData( clipboardIdDataType ); + + // If there is no ID we need to create it. Different browsers needs different ID. + if ( !this.id ) { + if ( clipboardIdDataType == 'Text' ) { + // For IE10+ only Text data type is supported and we have to compare dragged + // and dropped text. If the ID is not set it means that empty string was dragged + // (ex. image with no alt). We change null to empty string. + this.id = ''; + } else { + // String for custom data type. + this.id = 'cke-' + CKEDITOR.tools.getUniqueId(); + } + } + + // In IE10+ we can not use any data type besides text, so we do not call setData. + if ( clipboardIdDataType != 'Text' ) { + // Try to set ID so it will be passed from the drag to the drop event. + // On some browsers with some event it is not possible to setData so we + // need to catch exceptions. + try { + this.$.setData( clipboardIdDataType, this.id ); + } catch ( err ) {} + } + + if ( editor ) { + this.sourceEditor = editor; + + this.setData( 'text/html', editor.getSelectedHtml( 1 ) ); + + // Without setData( 'text', ... ) on dragstart there is no drop event in Safari. + // Also 'text' data is empty as drop to the textarea does not work if we do not put there text. + if ( clipboardIdDataType != 'Text' && !this.getData( 'text/plain' ) ) { + this.setData( 'text/plain', editor.getSelection().getSelectedText() ); + } + } + + /** + * Data transfer ID used to bind all dataTransfer + * objects based on the same event (e.g. in drag and drop events). + * + * @readonly + * @property {String} id + */ + + /** + * A native DOM event object. + * + * @readonly + * @property {Object} $ + */ + + /** + * Source editor — the editor where the drag starts. + * Might be undefined if the drag starts outside the editor (e.g. when dropping files to the editor). + * + * @readonly + * @property {CKEDITOR.editor} sourceEditor + */ + + /** + * Private properties and methods. + * + * @private + * @property {Object} _ + */ + }; + + /** + * Data transfer operation (drag and drop or copy and paste) started and ended in the same + * editor instance. + * + * @since 4.5 + * @readonly + * @property {Number} [=1] + * @member CKEDITOR + */ + CKEDITOR.DATA_TRANSFER_INTERNAL = 1; + + /** + * Data transfer operation (drag and drop or copy and paste) started in one editor + * instance and ended in another. + * + * @since 4.5 + * @readonly + * @property {Number} [=2] + * @member CKEDITOR + */ + CKEDITOR.DATA_TRANSFER_CROSS_EDITORS = 2; + + /** + * Data transfer operation (drag and drop or copy and paste) started outside of the editor. + * The source of the data may be a textarea, HTML, another application, etc. + * + * @since 4.5 + * @readonly + * @property {Number} [=3] + * @member CKEDITOR + */ + CKEDITOR.DATA_TRANSFER_EXTERNAL = 3; + + CKEDITOR.plugins.clipboard.dataTransfer.prototype = { + /** + * Facade for the native `getData` method. + * + * @param {String} type The type of data to retrieve. + * @returns {String} type Stored data for the given type or an empty string if the data for that type does not exist. + */ + getData: function( type ) { + function isEmpty( data ) { + return data === undefined || data === null || data === ''; + } + + type = this._.normalizeType( type ); + + var data = this._.data[ type ], + result; + + if ( isEmpty( data ) ) { + try { + data = this.$.getData( type ); + } catch ( e ) {} + } + + if ( isEmpty( data ) ) { + data = ''; + } + + // Some browsers add at the begging of the HTML data + // or surround it with ...(some content) and (some content) + // This code removes meta tags and returns only the contents of the element if found. Note that + // some significant content may be placed outside Start/EndFragment comments so it's kept. + // + // See #13583 for more details. + if ( type == 'text/html' ) { + data = data.replace( this._.metaRegExp, '' ); + + // Keep only contents of the element + result = this._.bodyRegExp.exec( data ); + if ( result && result.length ) { + data = result[ 1 ]; + + // Remove also comments. + data = data.replace( this._.fragmentRegExp, '' ); + } + } + // Firefox on Linux put files paths as a text/plain data if there are files + // in the dataTransfer object. We need to hide it, because files should be + // handled on paste only if dataValue is empty. + else if ( type == 'Text' && CKEDITOR.env.gecko && this.getFilesCount() && + data.substring( 0, 7 ) == 'file://' ) { + data = ''; + } + + return data; + }, + + /** + * Facade for the native `setData` method. + * + * @param {String} type The type of data to retrieve. + * @param {String} value The data to add. + */ + setData: function( type, value ) { + type = this._.normalizeType( type ); + + this._.data[ type ] = value; + + // There is "Unexpected call to method or property access." error if you try + // to set data of unsupported type on IE. + if ( !CKEDITOR.plugins.clipboard.isCustomDataTypesSupported && type != 'URL' && type != 'Text' ) { + return; + } + + // If we use the text type to bind the ID, then if someone tries to set the text, we must also + // update ID accordingly. #13468. + if ( clipboardIdDataType == 'Text' && type == 'Text' ) { + this.id = value; + } + + try { + this.$.setData( type, value ); + } catch ( e ) {} + }, + + /** + * Gets the data transfer type. + * + * @param {CKEDITOR.editor} targetEditor The drop/paste target editor instance. + * @returns {Number} Possible values: {@link CKEDITOR#DATA_TRANSFER_INTERNAL}, + * {@link CKEDITOR#DATA_TRANSFER_CROSS_EDITORS}, {@link CKEDITOR#DATA_TRANSFER_EXTERNAL}. + */ + getTransferType: function( targetEditor ) { + if ( !this.sourceEditor ) { + return CKEDITOR.DATA_TRANSFER_EXTERNAL; + } else if ( this.sourceEditor == targetEditor ) { + return CKEDITOR.DATA_TRANSFER_INTERNAL; + } else { + return CKEDITOR.DATA_TRANSFER_CROSS_EDITORS; + } + }, + + /** + * Copies the data from the native data transfer to a private cache. + * This function is needed because the data from the native data transfer + * is available only synchronously to the event listener. It is not possible + * to get the data asynchronously, after a timeout, and the {@link CKEDITOR.editor#paste} + * event is fired asynchronously — hence the need for caching the data. + */ + cacheData: function() { + if ( !this.$ ) { + return; + } + + var that = this, + i, file; + + function getAndSetData( type ) { + type = that._.normalizeType( type ); + + var data = that.getData( type ); + if ( data ) { + that._.data[ type ] = data; + } + } + + // Copy data. + if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) { + if ( this.$.types ) { + for ( i = 0; i < this.$.types.length; i++ ) { + getAndSetData( this.$.types[ i ] ); + } + } + } else { + getAndSetData( 'Text' ); + getAndSetData( 'URL' ); + } + + // Copy files references. + file = this._getImageFromClipboard(); + if ( ( this.$ && this.$.files ) || file ) { + this._.files = []; + + // Edge have empty files property with no length (#13755). + if ( this.$.files && this.$.files.length ) { + for ( i = 0; i < this.$.files.length; i++ ) { + this._.files.push( this.$.files[ i ] ); + } + } + + // Don't include $.items if both $.files and $.items contains files, because, + // according to spec and browsers behavior, they contain the same files. + if ( this._.files.length === 0 && file ) { + this._.files.push( file ); + } + } + }, + + /** + * Gets the number of files in the dataTransfer object. + * + * @returns {Number} The number of files. + */ + getFilesCount: function() { + if ( this._.files.length ) { + return this._.files.length; + } + + if ( this.$ && this.$.files && this.$.files.length ) { + return this.$.files.length; + } + + return this._getImageFromClipboard() ? 1 : 0; + }, + + /** + * Gets the file at the index given. + * + * @param {Number} i Index. + * @returns {File} File instance. + */ + getFile: function( i ) { + if ( this._.files.length ) { + return this._.files[ i ]; + } + + if ( this.$ && this.$.files && this.$.files.length ) { + return this.$.files[ i ]; + } + + // File or null if the file was not found. + return i === 0 ? this._getImageFromClipboard() : undefined; + }, + + /** + * Checks if the data transfer contains any data. + * + * @returns {Boolean} `true` if the object contains no data. + */ + isEmpty: function() { + var typesToCheck = {}, + type; + + // If dataTransfer contains files it is not empty. + if ( this.getFilesCount() ) { + return false; + } + + // Add custom types. + for ( type in this._.data ) { + typesToCheck[ type ] = 1; + } + + // Add native types. + if ( this.$ ) { + if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) { + if ( this.$.types ) { + for ( var i = 0; i < this.$.types.length; i++ ) { + typesToCheck[ this.$.types[ i ] ] = 1; + } + } + } else { + typesToCheck.Text = 1; + typesToCheck.URL = 1; + } + } + + // Remove ID. + if ( clipboardIdDataType != 'Text' ) { + typesToCheck[ clipboardIdDataType ] = 0; + } + + for ( type in typesToCheck ) { + if ( typesToCheck[ type ] && this.getData( type ) !== '' ) { + return false; + } + } + + return true; + }, + + /** + * When the content of the clipboard is pasted in Chrome, the clipboard data object has an empty `files` property, + * but it is possible to get the file as `items[0].getAsFile();` (#12961). + * + * @private + * @returns {File} File instance or `null` if not found. + */ + _getImageFromClipboard: function() { + var file; + + if ( this.$ && this.$.items && this.$.items[ 0 ] ) { + try { + file = this.$.items[ 0 ].getAsFile(); + // Duck typing + if ( file && file.type ) { + return file; + } + } catch ( err ) { + // noop + } + } + + return undefined; + } + }; +} )(); + +/** + * The default content type that is used when pasted data cannot be clearly recognized as HTML or text. + * + * For example: `'foo'` may come from a plain text editor or a website. It is not possible to recognize the content + * type in this case, so the default type will be used. At the same time it is clear that `'example text'` is + * HTML and its origin is a web page, email or another rich text editor. + * + * **Note:** If content type is text, then styles of the paste context are preserved. + * + * CKEDITOR.config.clipboard_defaultContentType = 'text'; + * + * See also the {@link CKEDITOR.editor#paste} event and read more about the integration with clipboard + * in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard). + * + * @since 4.0 + * @cfg {'html'/'text'} [clipboard_defaultContentType='html'] + * @member CKEDITOR.config + */ + +/** + * Fired after the user initiated a paste action, but before the data is inserted into the editor. + * The listeners to this event are able to process the content before its insertion into the document. + * + * Read more about the integration with clipboard in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard). + * + * See also: + * + * * the {@link CKEDITOR.config#pasteFilter} option, + * * the {@link CKEDITOR.editor#drop} event, + * * the {@link CKEDITOR.plugins.clipboard.dataTransfer} class. + * + * @since 3.1 + * @event paste + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param data + * @param {String} data.type The type of data in `data.dataValue`. Usually `'html'` or `'text'`, but for listeners + * with a priority smaller than `6` it may also be `'auto'` which means that the content type has not been recognised yet + * (this will be done by the content type sniffer that listens with priority `6`). + * @param {String} data.dataValue HTML to be pasted. + * @param {String} data.method Indicates the data transfer method. It could be drag and drop or copy and paste. + * Possible values: `'drop'`, `'paste'`. Introduced in CKEditor 4.5. + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer Facade for the native dataTransfer object + * which provides access to various data types and files, and passes some data between linked events + * (like drag and drop). Introduced in CKEditor 4.5. + * @param {Boolean} [data.dontFilter=false] Whether the {@link CKEDITOR.editor#pasteFilter paste filter} should not + * be applied to data. This option has no effect when `data.type` equals `'text'` which means that for instance + * {@link CKEDITOR.config#forcePasteAsPlainText} has a higher priority. Introduced in CKEditor 4.5. + */ + +/** + * Fired before the {@link #paste} event. Allows to preset data type. + * + * **Note:** This event is deprecated. Add a `0` priority listener for the + * {@link #paste} event instead. + * + * @deprecated + * @event beforePaste + * @member CKEDITOR.editor + */ + + /** + * Fired after the {@link #paste} event if content was modified. Note that if the paste + * event does not insert any data, the `afterPaste` event will not be fired. + * + * @event afterPaste + * @member CKEDITOR.editor + */ + +/** + * Internal event to open the Paste dialog window. + * + * @private + * @event pasteDialog + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param {Function} [data] Callback that will be passed to {@link CKEDITOR.editor#openDialog}. + */ + +/** + * Facade for the native `drop` event. Fired when the native `drop` event occurs. + * + * **Note:** To manipulate dropped data, use the {@link CKEDITOR.editor#paste} event. + * Use the `drop` event only to control drag and drop operations (e.g. to prevent the ability to drop some content). + * + * Read more about integration with drag and drop in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard). + * + * See also: + * + * * The {@link CKEDITOR.editor#paste} event, + * * The {@link CKEDITOR.editor#dragstart} and {@link CKEDITOR.editor#dragend} events, + * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class. + * + * @since 4.5 + * @event drop + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param data + * @param {Object} data.$ Native drop event. + * @param {CKEDITOR.dom.node} data.target Drop target. + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. + * @param {CKEDITOR.dom.range} data.dragRange Drag range, lets you manipulate the drag range. + * Note that dragged HTML is saved as `text/html` data on `dragstart` so if you change the drag range + * on drop, dropped HTML will not change. You need to change it manually using + * {@link CKEDITOR.plugins.clipboard.dataTransfer#setData dataTransfer.setData}. + * @param {CKEDITOR.dom.range} data.dropRange Drop range, lets you manipulate the drop range. + */ + +/** + * Facade for the native `dragstart` event. Fired when the native `dragstart` event occurs. + * + * This event can be canceled in order to block the drag start operation. It can also be fired to mimic the start of the drag and drop + * operation. For instance, the `widget` plugin uses this option to integrate its custom block widget drag and drop with + * the entire system. + * + * Read more about integration with drag and drop in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard). + * + * See also: + * + * * The {@link CKEDITOR.editor#paste} event, + * * The {@link CKEDITOR.editor#drop} and {@link CKEDITOR.editor#dragend} events, + * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class. + * + * @since 4.5 + * @event dragstart + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param data + * @param {Object} data.$ Native dragstart event. + * @param {CKEDITOR.dom.node} data.target Drag target. + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. + */ + +/** + * Facade for the native `dragend` event. Fired when the native `dragend` event occurs. + * + * Read more about integration with drag and drop in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard). + * + * See also: + * + * * The {@link CKEDITOR.editor#paste} event, + * * The {@link CKEDITOR.editor#drop} and {@link CKEDITOR.editor#dragend} events, + * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class. + * + * @since 4.5 + * @event dragend + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param data + * @param {Object} data.$ Native dragend event. + * @param {CKEDITOR.dom.node} data.target Drag target. + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. + */ + +/** + * Defines a filter which is applied to external data pasted or dropped into the editor. Possible values are: + * + * * `'plain-text'` – Content will be pasted as a plain text. + * * `'semantic-content'` – Known tags (except `div`, `span`) with all attributes (except + * `style` and `class`) will be kept. + * * `'h1 h2 p div'` – Custom rules compatible with {@link CKEDITOR.filter}. + * * `null` – Content will not be filtered by the paste filter (but it still may be filtered + * by [Advanced Content Filter](#!/guide/dev_advanced_content_filter)). This value can be used to + * disable the paste filter in Chrome and Safari, where this option defaults to `'semantic-content'`. + * + * Example: + * + * config.pasteFilter = 'plain-text'; + * + * Custom setting: + * + * config.pasteFilter = 'h1 h2 p ul ol li; img[!src, alt]; a[!href]'; + * + * Based on this configuration option, a proper {@link CKEDITOR.filter} instance will be defined and assigned to the editor + * as a {@link CKEDITOR.editor#pasteFilter}. You can tweak the paste filter settings on the fly on this object + * as well as delete or replace it. + * + * var editor = CKEDITOR.replace( 'editor', { + * pasteFilter: 'semantic-content' + * } ); + * + * editor.on( 'instanceReady', function() { + * // The result of this will be that all semantic content will be preserved + * // except tables. + * editor.pasteFilter.disallow( 'table' ); + * } ); + * + * Note that the paste filter is applied only to **external** data. There are three data sources: + * + * * copied and pasted in the same editor (internal), + * * copied from one editor and pasted into another (cross-editor), + * * coming from all other sources like websites, MS Word, etc. (external). + * + * If {@link CKEDITOR.config#allowedContent Advanced Content Filter} is not disabled, then + * it will also be applied to pasted and dropped data. The paste filter job is to "normalize" + * external data which often needs to be handled differently than content produced by the editor. + * + * This setting defaults to `'semantic-content'` in Chrome, Opera and Safari (all Blink and Webkit based browsers) + * due to messy HTML which these browsers keep in the clipboard. In other browsers it defaults to `null`. + * + * @since 4.5 + * @cfg {String} [pasteFilter='semantic-content' in Chrome and Safari and `null` in other browsers] + * @member CKEDITOR.config + */ + +/** + * {@link CKEDITOR.filter Content filter} which is used when external data is pasted or dropped into the editor + * or a forced paste as plain text occurs. + * + * This object might be used on the fly to define rules for pasted external content. + * This object is available and used if the {@link CKEDITOR.plugins.clipboard clipboard} plugin is enabled and + * {@link CKEDITOR.config#pasteFilter} or {@link CKEDITOR.config#forcePasteAsPlainText} was defined. + * + * To enable the filter: + * + * var editor = CKEDITOR.replace( 'editor', { + * pasteFilter: 'plain-text' + * } ); + * + * You can also modify the filter on the fly later on: + * + * editor.pasteFilter = new CKEDITOR.filter( 'p h1 h2; a[!href]' ); + * + * Note that the paste filter is only applied to **external** data. There are three data sources: + * + * * copied and pasted in the same editor (internal), + * * copied from one editor and pasted into another (cross-editor), + * * coming from all other sources like websites, MS Word, etc. (external). + * + * If {@link CKEDITOR.config#allowedContent Advanced Content Filter} is not disabled, then + * it will also be applied to pasted and dropped data. The paste filter job is to "normalize" + * external data which often needs to be handled differently than content produced by the editor. + * + * @since 4.5 + * @readonly + * @property {CKEDITOR.filter} [pasteFilter] + * @member CKEDITOR.editor + */ diff --git a/sources/plugins/contextmenu/lang/af.js b/sources/plugins/contextmenu/lang/af.js new file mode 100644 index 0000000..76b5b96 --- /dev/null +++ b/sources/plugins/contextmenu/lang/af.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'af', { + options: 'Konteks Spyskaart-opsies' +} ); diff --git a/sources/plugins/contextmenu/lang/ar.js b/sources/plugins/contextmenu/lang/ar.js new file mode 100644 index 0000000..c81b063 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ar.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ar', { + options: 'خصائص قائمة السياق' +} ); diff --git a/sources/plugins/contextmenu/lang/az.js b/sources/plugins/contextmenu/lang/az.js new file mode 100644 index 0000000..651f2f8 --- /dev/null +++ b/sources/plugins/contextmenu/lang/az.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'az', { + options: 'Əlavə əməliyyatlar' +} ); diff --git a/sources/plugins/contextmenu/lang/bg.js b/sources/plugins/contextmenu/lang/bg.js new file mode 100644 index 0000000..6bb7a40 --- /dev/null +++ b/sources/plugins/contextmenu/lang/bg.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'bg', { + options: 'Опции на контекстното меню' +} ); diff --git a/sources/plugins/contextmenu/lang/bn.js b/sources/plugins/contextmenu/lang/bn.js new file mode 100644 index 0000000..fe93ec8 --- /dev/null +++ b/sources/plugins/contextmenu/lang/bn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'bn', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/bs.js b/sources/plugins/contextmenu/lang/bs.js new file mode 100644 index 0000000..9354351 --- /dev/null +++ b/sources/plugins/contextmenu/lang/bs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'bs', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/ca.js b/sources/plugins/contextmenu/lang/ca.js new file mode 100644 index 0000000..91c7ec8 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ca', { + options: 'Opcions del menú contextual' +} ); diff --git a/sources/plugins/contextmenu/lang/cs.js b/sources/plugins/contextmenu/lang/cs.js new file mode 100644 index 0000000..e53a0f5 --- /dev/null +++ b/sources/plugins/contextmenu/lang/cs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'cs', { + options: 'Nastavení kontextové nabídky' +} ); diff --git a/sources/plugins/contextmenu/lang/cy.js b/sources/plugins/contextmenu/lang/cy.js new file mode 100644 index 0000000..1816b84 --- /dev/null +++ b/sources/plugins/contextmenu/lang/cy.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'cy', { + options: 'Opsiynau Dewislen Cyd-destun' +} ); diff --git a/sources/plugins/contextmenu/lang/da.js b/sources/plugins/contextmenu/lang/da.js new file mode 100644 index 0000000..10043a5 --- /dev/null +++ b/sources/plugins/contextmenu/lang/da.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'da', { + options: 'Muligheder for hjælpemenu' +} ); diff --git a/sources/plugins/contextmenu/lang/de-ch.js b/sources/plugins/contextmenu/lang/de-ch.js new file mode 100644 index 0000000..216cd18 --- /dev/null +++ b/sources/plugins/contextmenu/lang/de-ch.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'de-ch', { + options: 'Kontextmenüoptionen' +} ); diff --git a/sources/plugins/contextmenu/lang/de.js b/sources/plugins/contextmenu/lang/de.js new file mode 100644 index 0000000..aa0c098 --- /dev/null +++ b/sources/plugins/contextmenu/lang/de.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'de', { + options: 'Kontextmenüoptionen' +} ); diff --git a/sources/plugins/contextmenu/lang/el.js b/sources/plugins/contextmenu/lang/el.js new file mode 100644 index 0000000..bdad720 --- /dev/null +++ b/sources/plugins/contextmenu/lang/el.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'el', { + options: 'Επιλογές Αναδυόμενου Μενού' +} ); diff --git a/sources/plugins/contextmenu/lang/en-au.js b/sources/plugins/contextmenu/lang/en-au.js new file mode 100644 index 0000000..cd6b202 --- /dev/null +++ b/sources/plugins/contextmenu/lang/en-au.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en-au', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/en-ca.js b/sources/plugins/contextmenu/lang/en-ca.js new file mode 100644 index 0000000..25950c9 --- /dev/null +++ b/sources/plugins/contextmenu/lang/en-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en-ca', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/en-gb.js b/sources/plugins/contextmenu/lang/en-gb.js new file mode 100644 index 0000000..62f08d5 --- /dev/null +++ b/sources/plugins/contextmenu/lang/en-gb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en-gb', { + options: 'Context Menu Options' +} ); diff --git a/sources/plugins/contextmenu/lang/en.js b/sources/plugins/contextmenu/lang/en.js new file mode 100644 index 0000000..10b5f47 --- /dev/null +++ b/sources/plugins/contextmenu/lang/en.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en', { + options: 'Context Menu Options' +} ); diff --git a/sources/plugins/contextmenu/lang/eo.js b/sources/plugins/contextmenu/lang/eo.js new file mode 100644 index 0000000..6a9760c --- /dev/null +++ b/sources/plugins/contextmenu/lang/eo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'eo', { + options: 'Opcioj de Kunteksta Menuo' +} ); diff --git a/sources/plugins/contextmenu/lang/es.js b/sources/plugins/contextmenu/lang/es.js new file mode 100644 index 0000000..1e8e06d --- /dev/null +++ b/sources/plugins/contextmenu/lang/es.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'es', { + options: 'Opciones del menú contextual' +} ); diff --git a/sources/plugins/contextmenu/lang/et.js b/sources/plugins/contextmenu/lang/et.js new file mode 100644 index 0000000..d7ece9a --- /dev/null +++ b/sources/plugins/contextmenu/lang/et.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'et', { + options: 'Kontekstimenüü valikud' +} ); diff --git a/sources/plugins/contextmenu/lang/eu.js b/sources/plugins/contextmenu/lang/eu.js new file mode 100644 index 0000000..32018e0 --- /dev/null +++ b/sources/plugins/contextmenu/lang/eu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'eu', { + options: 'Testuinguru-menuaren aukerak' +} ); diff --git a/sources/plugins/contextmenu/lang/fa.js b/sources/plugins/contextmenu/lang/fa.js new file mode 100644 index 0000000..233d30d --- /dev/null +++ b/sources/plugins/contextmenu/lang/fa.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fa', { + options: 'گزینه​های منوی زمینه' +} ); diff --git a/sources/plugins/contextmenu/lang/fi.js b/sources/plugins/contextmenu/lang/fi.js new file mode 100644 index 0000000..5c11832 --- /dev/null +++ b/sources/plugins/contextmenu/lang/fi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fi', { + options: 'Pikavalikon ominaisuudet' +} ); diff --git a/sources/plugins/contextmenu/lang/fo.js b/sources/plugins/contextmenu/lang/fo.js new file mode 100644 index 0000000..6069a48 --- /dev/null +++ b/sources/plugins/contextmenu/lang/fo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fo', { + options: 'Context Menu Options' +} ); diff --git a/sources/plugins/contextmenu/lang/fr-ca.js b/sources/plugins/contextmenu/lang/fr-ca.js new file mode 100644 index 0000000..d7aca5c --- /dev/null +++ b/sources/plugins/contextmenu/lang/fr-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fr-ca', { + options: 'Options du menu contextuel' +} ); diff --git a/sources/plugins/contextmenu/lang/fr.js b/sources/plugins/contextmenu/lang/fr.js new file mode 100644 index 0000000..7af3f33 --- /dev/null +++ b/sources/plugins/contextmenu/lang/fr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fr', { + options: 'Options du menu contextuel' +} ); diff --git a/sources/plugins/contextmenu/lang/gl.js b/sources/plugins/contextmenu/lang/gl.js new file mode 100644 index 0000000..de69eae --- /dev/null +++ b/sources/plugins/contextmenu/lang/gl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'gl', { + options: 'Opcións do menú contextual' +} ); diff --git a/sources/plugins/contextmenu/lang/gu.js b/sources/plugins/contextmenu/lang/gu.js new file mode 100644 index 0000000..d9a83da --- /dev/null +++ b/sources/plugins/contextmenu/lang/gu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'gu', { + options: 'કોન્તેક્ષ્ત્ મેનુના વિકલ્પો' +} ); diff --git a/sources/plugins/contextmenu/lang/he.js b/sources/plugins/contextmenu/lang/he.js new file mode 100644 index 0000000..a276534 --- /dev/null +++ b/sources/plugins/contextmenu/lang/he.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'he', { + options: 'אפשרויות תפריט ההקשר' +} ); diff --git a/sources/plugins/contextmenu/lang/hi.js b/sources/plugins/contextmenu/lang/hi.js new file mode 100644 index 0000000..a3f501d --- /dev/null +++ b/sources/plugins/contextmenu/lang/hi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'hi', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/hr.js b/sources/plugins/contextmenu/lang/hr.js new file mode 100644 index 0000000..149c1eb --- /dev/null +++ b/sources/plugins/contextmenu/lang/hr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'hr', { + options: 'Opcije izbornika' +} ); diff --git a/sources/plugins/contextmenu/lang/hu.js b/sources/plugins/contextmenu/lang/hu.js new file mode 100644 index 0000000..60bb66c --- /dev/null +++ b/sources/plugins/contextmenu/lang/hu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'hu', { + options: 'Helyi menü opciók' +} ); diff --git a/sources/plugins/contextmenu/lang/id.js b/sources/plugins/contextmenu/lang/id.js new file mode 100644 index 0000000..8d19e50 --- /dev/null +++ b/sources/plugins/contextmenu/lang/id.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'id', { + options: 'Opsi Konteks Pilihan' +} ); diff --git a/sources/plugins/contextmenu/lang/is.js b/sources/plugins/contextmenu/lang/is.js new file mode 100644 index 0000000..4404c99 --- /dev/null +++ b/sources/plugins/contextmenu/lang/is.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'is', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/it.js b/sources/plugins/contextmenu/lang/it.js new file mode 100644 index 0000000..0453e18 --- /dev/null +++ b/sources/plugins/contextmenu/lang/it.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'it', { + options: 'Opzioni del menù contestuale' +} ); diff --git a/sources/plugins/contextmenu/lang/ja.js b/sources/plugins/contextmenu/lang/ja.js new file mode 100644 index 0000000..5887847 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ja.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ja', { + options: 'コンテキストメニューオプション' +} ); diff --git a/sources/plugins/contextmenu/lang/ka.js b/sources/plugins/contextmenu/lang/ka.js new file mode 100644 index 0000000..f279b0a --- /dev/null +++ b/sources/plugins/contextmenu/lang/ka.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ka', { + options: 'კონტექსტური მენიუს პარამეტრები' +} ); diff --git a/sources/plugins/contextmenu/lang/km.js b/sources/plugins/contextmenu/lang/km.js new file mode 100644 index 0000000..9f5d965 --- /dev/null +++ b/sources/plugins/contextmenu/lang/km.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'km', { + options: 'ជម្រើស​ម៉ឺនុយ​បរិបទ' +} ); diff --git a/sources/plugins/contextmenu/lang/ko.js b/sources/plugins/contextmenu/lang/ko.js new file mode 100644 index 0000000..45273b5 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ko.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ko', { + options: '컨텍스트 메뉴 옵션' +} ); diff --git a/sources/plugins/contextmenu/lang/ku.js b/sources/plugins/contextmenu/lang/ku.js new file mode 100644 index 0000000..c183cb2 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ku.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ku', { + options: 'هەڵبژاردەی لیستەی کلیکی دەستی ڕاست' +} ); diff --git a/sources/plugins/contextmenu/lang/lt.js b/sources/plugins/contextmenu/lang/lt.js new file mode 100644 index 0000000..e16597a --- /dev/null +++ b/sources/plugins/contextmenu/lang/lt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'lt', { + options: 'Kontekstinio meniu parametrai' +} ); diff --git a/sources/plugins/contextmenu/lang/lv.js b/sources/plugins/contextmenu/lang/lv.js new file mode 100644 index 0000000..b14f0eb --- /dev/null +++ b/sources/plugins/contextmenu/lang/lv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'lv', { + options: 'Uznirstošās izvēlnes uzstādījumi' +} ); diff --git a/sources/plugins/contextmenu/lang/mk.js b/sources/plugins/contextmenu/lang/mk.js new file mode 100644 index 0000000..1d7c4c7 --- /dev/null +++ b/sources/plugins/contextmenu/lang/mk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'mk', { + options: 'Контекст-мени опции' +} ); diff --git a/sources/plugins/contextmenu/lang/mn.js b/sources/plugins/contextmenu/lang/mn.js new file mode 100644 index 0000000..5076f18 --- /dev/null +++ b/sources/plugins/contextmenu/lang/mn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'mn', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/ms.js b/sources/plugins/contextmenu/lang/ms.js new file mode 100644 index 0000000..019ba76 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ms.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ms', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/nb.js b/sources/plugins/contextmenu/lang/nb.js new file mode 100644 index 0000000..c7c41b0 --- /dev/null +++ b/sources/plugins/contextmenu/lang/nb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'nb', { + options: 'Alternativer for høyreklikkmeny' +} ); diff --git a/sources/plugins/contextmenu/lang/nl.js b/sources/plugins/contextmenu/lang/nl.js new file mode 100644 index 0000000..0ceb7cb --- /dev/null +++ b/sources/plugins/contextmenu/lang/nl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'nl', { + options: 'Contextmenu opties' +} ); diff --git a/sources/plugins/contextmenu/lang/no.js b/sources/plugins/contextmenu/lang/no.js new file mode 100644 index 0000000..ee283cf --- /dev/null +++ b/sources/plugins/contextmenu/lang/no.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'no', { + options: 'Alternativer for høyreklikkmeny' +} ); diff --git a/sources/plugins/contextmenu/lang/oc.js b/sources/plugins/contextmenu/lang/oc.js new file mode 100644 index 0000000..8fab98f --- /dev/null +++ b/sources/plugins/contextmenu/lang/oc.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'oc', { + options: 'Opcions del menú contextual' +} ); diff --git a/sources/plugins/contextmenu/lang/pl.js b/sources/plugins/contextmenu/lang/pl.js new file mode 100644 index 0000000..99ef5d9 --- /dev/null +++ b/sources/plugins/contextmenu/lang/pl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'pl', { + options: 'Opcje menu kontekstowego' +} ); diff --git a/sources/plugins/contextmenu/lang/pt-br.js b/sources/plugins/contextmenu/lang/pt-br.js new file mode 100644 index 0000000..ec91513 --- /dev/null +++ b/sources/plugins/contextmenu/lang/pt-br.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'pt-br', { + options: 'Opções Menu de Contexto' +} ); diff --git a/sources/plugins/contextmenu/lang/pt.js b/sources/plugins/contextmenu/lang/pt.js new file mode 100644 index 0000000..c2c969d --- /dev/null +++ b/sources/plugins/contextmenu/lang/pt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'pt', { + options: 'Menu de opções de contexto' +} ); diff --git a/sources/plugins/contextmenu/lang/ro.js b/sources/plugins/contextmenu/lang/ro.js new file mode 100644 index 0000000..928c4b3 --- /dev/null +++ b/sources/plugins/contextmenu/lang/ro.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ro', { + options: 'Opțiuni Meniu Contextual' +} ); diff --git a/sources/plugins/contextmenu/lang/ru.js b/sources/plugins/contextmenu/lang/ru.js new file mode 100644 index 0000000..f671b6a --- /dev/null +++ b/sources/plugins/contextmenu/lang/ru.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ru', { + options: 'Параметры контекстного меню' +} ); diff --git a/sources/plugins/contextmenu/lang/si.js b/sources/plugins/contextmenu/lang/si.js new file mode 100644 index 0000000..ec603a3 --- /dev/null +++ b/sources/plugins/contextmenu/lang/si.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'si', { + options: 'අනතර්ග ලේඛණ විකල්ප' +} ); diff --git a/sources/plugins/contextmenu/lang/sk.js b/sources/plugins/contextmenu/lang/sk.js new file mode 100644 index 0000000..fda2b3d --- /dev/null +++ b/sources/plugins/contextmenu/lang/sk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sk', { + options: 'Možnosti kontextového menu' +} ); diff --git a/sources/plugins/contextmenu/lang/sl.js b/sources/plugins/contextmenu/lang/sl.js new file mode 100644 index 0000000..9c7fc29 --- /dev/null +++ b/sources/plugins/contextmenu/lang/sl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sl', { + options: 'Možnosti kontekstnega menija' +} ); diff --git a/sources/plugins/contextmenu/lang/sq.js b/sources/plugins/contextmenu/lang/sq.js new file mode 100644 index 0000000..698ca2d --- /dev/null +++ b/sources/plugins/contextmenu/lang/sq.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sq', { + options: 'Mundësitë e Menysë së Kontekstit' +} ); diff --git a/sources/plugins/contextmenu/lang/sr-latn.js b/sources/plugins/contextmenu/lang/sr-latn.js new file mode 100644 index 0000000..d550e84 --- /dev/null +++ b/sources/plugins/contextmenu/lang/sr-latn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sr-latn', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/sr.js b/sources/plugins/contextmenu/lang/sr.js new file mode 100644 index 0000000..2f7ba14 --- /dev/null +++ b/sources/plugins/contextmenu/lang/sr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sr', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/sv.js b/sources/plugins/contextmenu/lang/sv.js new file mode 100644 index 0000000..a3b043f --- /dev/null +++ b/sources/plugins/contextmenu/lang/sv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sv', { + options: 'Context Menu Options' +} ); diff --git a/sources/plugins/contextmenu/lang/th.js b/sources/plugins/contextmenu/lang/th.js new file mode 100644 index 0000000..ce77065 --- /dev/null +++ b/sources/plugins/contextmenu/lang/th.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'th', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/sources/plugins/contextmenu/lang/tr.js b/sources/plugins/contextmenu/lang/tr.js new file mode 100644 index 0000000..4d5a550 --- /dev/null +++ b/sources/plugins/contextmenu/lang/tr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'tr', { + options: 'İçerik Menüsü Seçenekleri' +} ); diff --git a/sources/plugins/contextmenu/lang/tt.js b/sources/plugins/contextmenu/lang/tt.js new file mode 100644 index 0000000..0531370 --- /dev/null +++ b/sources/plugins/contextmenu/lang/tt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'tt', { + options: 'Контекст меню үзлекләре' +} ); diff --git a/sources/plugins/contextmenu/lang/ug.js b/sources/plugins/contextmenu/lang/ug.js new file mode 100644 index 0000000..95a9d0a --- /dev/null +++ b/sources/plugins/contextmenu/lang/ug.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ug', { + options: 'قىسقا يول تىزىملىك تاللانمىسى' +} ); diff --git a/sources/plugins/contextmenu/lang/uk.js b/sources/plugins/contextmenu/lang/uk.js new file mode 100644 index 0000000..0a4ffb9 --- /dev/null +++ b/sources/plugins/contextmenu/lang/uk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'uk', { + options: 'Опції контекстного меню' +} ); diff --git a/sources/plugins/contextmenu/lang/vi.js b/sources/plugins/contextmenu/lang/vi.js new file mode 100644 index 0000000..42c39b0 --- /dev/null +++ b/sources/plugins/contextmenu/lang/vi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'vi', { + options: 'Tùy chọn menu bổ xung' +} ); diff --git a/sources/plugins/contextmenu/lang/zh-cn.js b/sources/plugins/contextmenu/lang/zh-cn.js new file mode 100644 index 0000000..56879ee --- /dev/null +++ b/sources/plugins/contextmenu/lang/zh-cn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'zh-cn', { + options: '快捷菜单选项' +} ); diff --git a/sources/plugins/contextmenu/lang/zh.js b/sources/plugins/contextmenu/lang/zh.js new file mode 100644 index 0000000..c8d8b93 --- /dev/null +++ b/sources/plugins/contextmenu/lang/zh.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'zh', { + options: '內容功能表選項' +} ); diff --git a/sources/plugins/contextmenu/plugin.js b/sources/plugins/contextmenu/plugin.js new file mode 100644 index 0000000..6cd3935 --- /dev/null +++ b/sources/plugins/contextmenu/plugin.js @@ -0,0 +1,159 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'contextmenu', { + requires: 'menu', + + // jscs:disable maximumLineLength + lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + + // Make sure the base class (CKEDITOR.menu) is loaded before it (#3318). + onLoad: function() { + /** + * Class replacing the non-configurable native context menu with a configurable CKEditor's equivalent. + * + * @class + * @extends CKEDITOR.menu + */ + CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass( { + base: CKEDITOR.menu, + + /** + * Creates the CKEDITOR.plugins.contextMenu class instance. + * + * @constructor + * @param {CKEDITOR.editor} editor + */ + $: function( editor ) { + this.base.call( this, editor, { + panel: { + className: 'cke_menu_panel', + attributes: { + 'aria-label': editor.lang.contextmenu.options + } + } + } ); + }, + + proto: { + /** + * Starts watching on native context menu triggers (Option key, right click) on the given element. + * + * @param {CKEDITOR.dom.element} element + * @param {Boolean} [nativeContextMenuOnCtrl] Whether to open native context menu if the + * Ctrl key is held on opening the context menu. See {@link CKEDITOR.config#browserContextMenuOnCtrl}. + */ + addTarget: function( element, nativeContextMenuOnCtrl ) { + element.on( 'contextmenu', function( event ) { + var domEvent = event.data, + isCtrlKeyDown = + // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event, + // which make this property unreliable. (#4826) + ( CKEDITOR.env.webkit ? holdCtrlKey : ( CKEDITOR.env.mac ? domEvent.$.metaKey : domEvent.$.ctrlKey ) ); + + if ( nativeContextMenuOnCtrl && isCtrlKeyDown ) + return; + + // Cancel the browser context menu. + domEvent.preventDefault(); + + // Fix selection when non-editable element in Webkit/Blink (Mac) (#11306). + if ( CKEDITOR.env.mac && CKEDITOR.env.webkit ) { + var editor = this.editor, + contentEditableParent = new CKEDITOR.dom.elementPath( domEvent.getTarget(), editor.editable() ).contains( function( el ) { + // Return when non-editable or nested editable element is found. + return el.hasAttribute( 'contenteditable' ); + }, true ); // Exclude editor's editable. + + // Fake selection for non-editables only (to exclude nested editables). + if ( contentEditableParent && contentEditableParent.getAttribute( 'contenteditable' ) == 'false' ) + editor.getSelection().fake( contentEditableParent ); + } + + var doc = domEvent.getTarget().getDocument(), + offsetParent = domEvent.getTarget().getDocument().getDocumentElement(), + fromFrame = !doc.equals( CKEDITOR.document ), + scroll = doc.getWindow().getScrollPosition(), + offsetX = fromFrame ? domEvent.$.clientX : domEvent.$.pageX || scroll.x + domEvent.$.clientX, + offsetY = fromFrame ? domEvent.$.clientY : domEvent.$.pageY || scroll.y + domEvent.$.clientY; + + CKEDITOR.tools.setTimeout( function() { + this.open( offsetParent, null, offsetX, offsetY ); + + // IE needs a short while to allow selection change before opening menu. (#7908) + }, CKEDITOR.env.ie ? 200 : 0, this ); + }, this ); + + if ( CKEDITOR.env.webkit ) { + var holdCtrlKey, + onKeyDown = function( event ) { + holdCtrlKey = CKEDITOR.env.mac ? event.data.$.metaKey : event.data.$.ctrlKey; + }, + resetOnKeyUp = function() { + holdCtrlKey = 0; + }; + + element.on( 'keydown', onKeyDown ); + element.on( 'keyup', resetOnKeyUp ); + element.on( 'contextmenu', resetOnKeyUp ); + } + }, + + /** + * Opens the context menu in the given location. See the {@link CKEDITOR.menu#show} method. + * + * @param {CKEDITOR.dom.element} offsetParent + * @param {Number} [corner] + * @param {Number} [offsetX] + * @param {Number} [offsetY] + */ + open: function( offsetParent, corner, offsetX, offsetY ) { + this.editor.focus(); + offsetParent = offsetParent || CKEDITOR.document.getDocumentElement(); + + // #9362: Force selection check to update commands' states in the new context. + this.editor.selectionChange( 1 ); + + this.show( offsetParent, corner, offsetX, offsetY ); + } + } + } ); + }, + + beforeInit: function( editor ) { + /** + * @readonly + * @property {CKEDITOR.plugins.contextMenu} contextMenu + * @member CKEDITOR.editor + */ + var contextMenu = editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor ); + + editor.on( 'contentDom', function() { + contextMenu.addTarget( editor.editable(), editor.config.browserContextMenuOnCtrl !== false ); + } ); + + editor.addCommand( 'contextMenu', { + exec: function() { + editor.contextMenu.open( editor.document.getBody() ); + } + } ); + + editor.setKeystroke( CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ); + editor.setKeystroke( CKEDITOR.CTRL + CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ); + } +} ); + +/** + * Whether to show the browser native context menu when the Ctrl or + * Meta (Mac) key is pressed on opening the context menu with the + * right mouse button click or the Menu key. + * + * config.browserContextMenuOnCtrl = false; + * + * @since 3.0.2 + * @cfg {Boolean} [browserContextMenuOnCtrl=true] + * @member CKEDITOR.config + */ diff --git a/sources/plugins/dialog/dialogDefinition.js b/sources/plugins/dialog/dialogDefinition.js new file mode 100644 index 0000000..6ecb491 --- /dev/null +++ b/sources/plugins/dialog/dialogDefinition.js @@ -0,0 +1,1032 @@ +// jscs:disable disallowMixedSpacesAndTabs +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the "virtual" dialog, dialog content and dialog button + * definition classes. + */ + +/** + * The definition of a dialog window. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialogs. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * CKEDITOR.dialog.add( 'testOnly', function( editor ) { + * return { + * title: 'Test Dialog', + * resizable: CKEDITOR.DIALOG_RESIZE_BOTH, + * minWidth: 500, + * minHeight: 400, + * contents: [ + * { + * id: 'tab1', + * label: 'First Tab', + * title: 'First Tab Title', + * accessKey: 'Q', + * elements: [ + * { + * type: 'text', + * label: 'Test Text 1', + * id: 'testText1', + * 'default': 'hello world!' + * } + * ] + * } + * ] + * }; + * } ); + * + * @class CKEDITOR.dialog.definition + */ + +/** + * The dialog title, displayed in the dialog's header. Required. + * + * @property {String} title + */ + +/** + * How the dialog can be resized, must be one of the four contents defined below. + * + * * {@link CKEDITOR#DIALOG_RESIZE_NONE} + * * {@link CKEDITOR#DIALOG_RESIZE_WIDTH} + * * {@link CKEDITOR#DIALOG_RESIZE_HEIGHT} + * * {@link CKEDITOR#DIALOG_RESIZE_BOTH} + * + * @property {Number} [resizable=CKEDITOR.DIALOG_RESIZE_NONE] + */ + +/** + * The minimum width of the dialog, in pixels. + * + * @property {Number} [minWidth=600] + */ + +/** + * The minimum height of the dialog, in pixels. + * + * @property {Number} [minHeight=400] + */ + + +/** + * The initial width of the dialog, in pixels. + * + * @since 3.5.3 + * @property {Number} [width=CKEDITOR.dialog.definition#minWidth] + */ + +/** + * The initial height of the dialog, in pixels. + * + * @since 3.5.3 + * @property {Number} [height=CKEDITOR.dialog.definition.minHeight] + */ + +/** + * The buttons in the dialog, defined as an array of + * {@link CKEDITOR.dialog.definition.button} objects. + * + * @property {Array} [buttons=[ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]] + */ + +/** + * The contents in the dialog, defined as an array of + * {@link CKEDITOR.dialog.definition.content} objects. Required. + * + * @property {Array} contents + */ + +/** + * The function to execute when OK is pressed. + * + * @property {Function} onOk + */ + +/** + * The function to execute when Cancel is pressed. + * + * @property {Function} onCancel + */ + +/** + * The function to execute when the dialog is displayed for the first time. + * + * @property {Function} onLoad + */ + +/** + * The function to execute when the dialog is loaded (executed every time the dialog is opened). + * + * @property {Function} onShow + */ + +/** + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialog content pages. + * + * @class CKEDITOR.dialog.definition.content. + */ + +/** + * The id of the content page. + * + * @property {String} id + */ + +/** + * The tab label of the content page. + * + * @property {String} label + */ + +/** + * The popup message of the tab label. + * + * @property {String} title + */ + +/** + * The CTRL hotkey for switching to the tab. + * + * contentDefinition.accessKey = 'Q'; // Switch to this page when CTRL-Q is pressed. + * + * @property {String} accessKey + */ + +/** + * The UI elements contained in this content page, defined as an array of + * {@link CKEDITOR.dialog.definition.uiElement} objects. + * + * @property {Array} elements + */ + +/** + * The definition of user interface element (textarea, radio etc). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialog UI elements. + * + * @class CKEDITOR.dialog.definition.uiElement + * @see CKEDITOR.ui.dialog.uiElement + */ + +/** + * The id of the UI element. + * + * @property {String} id + */ + +/** + * The type of the UI element. Required. + * + * @property {String} type + */ + +/** + * The popup label of the UI element. + * + * @property {String} title + */ + +/** + * The content that needs to be allowed to enable this UI element. + * All formats accepted by {@link CKEDITOR.filter#check} may be used. + * + * When all UI elements in a tab are disabled, this tab will be disabled automatically. + * + * @property {String/Object/CKEDITOR.style} requiredContent + */ + +/** + * CSS class names to append to the UI element. + * + * @property {String} className + */ + +/** + * Inline CSS classes to append to the UI element. + * + * @property {String} style + */ + +/** + * Horizontal alignment (in container) of the UI element. + * + * @property {String} align + */ + +/** + * Function to execute the first time the UI element is displayed. + * + * @property {Function} onLoad + */ + +/** + * Function to execute whenever the UI element's parent dialog is displayed. + * + * @property {Function} onShow + */ + +/** + * Function to execute whenever the UI element's parent dialog is closed. + * + * @property {Function} onHide + */ + +/** + * Function to execute whenever the UI element's parent + * dialog's {@link CKEDITOR.dialog#setupContent} method is executed. + * It usually takes care of the respective UI element as a standalone element. + * + * @property {Function} setup + */ + +/** + * Function to execute whenever the UI element's parent + * dialog's {@link CKEDITOR.dialog#commitContent} method is executed. + * It usually takes care of the respective UI element as a standalone element. + * + * @property {Function} commit + */ + +// ----- hbox ----------------------------------------------------------------- + +/** + * Horizontal layout box for dialog UI elements, auto-expends to available width of container. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create horizontal layouts. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.hbox} object and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'hbox', + * widths: [ '25%', '25%', '50%' ], + * children: [ + * { + * type: 'text', + * id: 'id1', + * width: '40px', + * }, + * { + * type: 'text', + * id: 'id2', + * width: '40px', + * }, + * { + * type: 'text', + * id: 'id3' + * } + * ] + * } + * + * @class CKEDITOR.dialog.definition.hbox + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * + * @property {Array} children + */ + +/** + * (Optional) The widths of child cells. + * + * @property {Array} widths + */ + +/** + * (Optional) The height of the layout. + * + * @property {Number} height + */ + +/** + * The CSS styles to apply to this element. + * + * @property {String} styles + */ + +/** + * (Optional) The padding width inside child cells. Example: 0, 1. + * + * @property {Number} padding + */ + +/** + * (Optional) The alignment of the whole layout. Example: center, top. + * + * @property {String} align + */ + +// ----- vbox ----------------------------------------------------------------- + +/** + * Vertical layout box for dialog UI elements. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create vertical layouts. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.vbox} object and can + * be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'vbox', + * align: 'right', + * width: '200px', + * children: [ + * { + * type: 'text', + * id: 'age', + * label: 'Age' + * }, + * { + * type: 'text', + * id: 'sex', + * label: 'Sex' + * }, + * { + * type: 'text', + * id: 'nationality', + * label: 'Nationality' + * } + * ] + * } + * + * @class CKEDITOR.dialog.definition.vbox + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * + * @property {Array} children + */ + +/** + * (Optional) The width of the layout. + * + * @property {Array} width + */ + +/** + * (Optional) The heights of individual cells. + * + * @property {Number} heights + */ + +/** + * The CSS styles to apply to this element. + * + * @property {String} styles + */ + +/** + * (Optional) The padding width inside child cells. Example: 0, 1. + * + * @property {Number} padding + */ + +/** + * (Optional) The alignment of the whole layout. Example: center, top. + * + * @property {String} align + */ + +/** + * (Optional) Whether the layout should expand vertically to fill its container. + * + * @property {Boolean} expand + */ + +// ----- labeled element ------------------------------------------------------ + +/** + * The definition of labeled user interface element (textarea, textInput etc). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialog UI elements. + * + * @class CKEDITOR.dialog.definition.labeledElement + * @extends CKEDITOR.dialog.definition.uiElement + * @see CKEDITOR.ui.dialog.labeledElement + */ + +/** + * The label of the UI element. + * + * { + * type: 'text', + * label: 'My Label' + * } + * + * @property {String} label + */ + +/** + * (Optional) Specify the layout of the label. Set to `'horizontal'` for horizontal layout. + * The default layout is vertical. + * + * { + * type: 'text', + * label: 'My Label', + * labelLayout: 'horizontal' + * } + * + * @property {String} labelLayout + */ + +/** + * (Optional) Applies only to horizontal layouts: a two elements array of lengths to specify the widths of the + * label and the content element. See also {@link CKEDITOR.dialog.definition.labeledElement#labelLayout}. + * + * { + * type: 'text', + * label: 'My Label', + * labelLayout: 'horizontal', + * widths: [100, 200] + * } + * + * @property {Array} widths + */ + +/** + * Specify the inline style of the uiElement label. + * + * { + * type: 'text', + * label: 'My Label', + * labelStyle: 'color: red' + * } + * + * @property {String} labelStyle + */ + + +/** + * Specify the inline style of the input element. + * + * { + * type: 'text', + * label: 'My Label', + * inputStyle: 'text-align: center' + * } + * + * @since 3.6.1 + * @property {String} inputStyle + */ + +/** + * Specify the inline style of the input element container. + * + * { + * type: 'text', + * label: 'My Label', + * controlStyle: 'width: 3em' + * } + * + * @since 3.6.1 + * @property {String} controlStyle + */ + +// ----- button --------------------------------------------------------------- + +/** + * The definition of a button. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create buttons. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.button} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'button', + * id: 'buttonId', + * label: 'Click me', + * title: 'My title', + * onClick: function() { + * // this = CKEDITOR.ui.dialog.button + * alert( 'Clicked: ' + this.id ); + * } + * } + * + * @class CKEDITOR.dialog.definition.button + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * Whether the button is disabled. + * + * @property {Boolean} disabled + */ + +/** + * The label of the UI element. + * + * @property {String} label + */ + +// ----- checkbox ------ +/** + * The definition of a checkbox element. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create groups of checkbox buttons. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.checkbox} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'checkbox', + * id: 'agree', + * label: 'I agree', + * 'default': 'checked', + * onClick: function() { + * // this = CKEDITOR.ui.dialog.checkbox + * alert( 'Checked: ' + this.getValue() ); + * } + * } + * + * @class CKEDITOR.dialog.definition.checkbox + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * The label of the UI element. + * + * @property {String} label + */ + +/** + * The default state. + * + * @property {String} [default='' (unchecked)] + */ + +// ----- file ----------------------------------------------------------------- + +/** + * The definition of a file upload input. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create file upload elements. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.file} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'file', + * id: 'upload', + * label: 'Select file from your computer', + * size: 38 + * }, + * { + * type: 'fileButton', + * id: 'fileId', + * label: 'Upload file', + * 'for': [ 'tab1', 'upload' ], + * filebrowser: { + * onSelect: function( fileUrl, data ) { + * alert( 'Successfully uploaded: ' + fileUrl ); + * } + * } + * } + * + * @class CKEDITOR.dialog.definition.file + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * (Optional) The action attribute of the form element associated with this file upload input. + * If empty, CKEditor will use path to server connector for currently opened folder. + * + * @property {String} action + */ + +/** + * The size of the UI element. + * + * @property {Number} size + */ + +// ----- fileButton ----------------------------------------------------------- + +/** + * The definition of a button for submitting the file in a file upload input. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create a button for submitting the file in a file upload input. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.fileButton} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * @class CKEDITOR.dialog.definition.fileButton + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * The label of the UI element. + * + * @property {String} label + */ + +/** + * The instruction for CKEditor how to deal with file upload. + * By default, the file and fileButton elements will not work "as expected" if this attribute is not set. + * + * // Update field with id 'txtUrl' in the 'tab1' tab when file is uploaded. + * filebrowser: 'tab1:txtUrl' + * + * // Call custom onSelect function when file is successfully uploaded. + * filebrowser: { + * onSelect: function( fileUrl, data ) { + * alert( 'Successfully uploaded: ' + fileUrl ); + * } + * } + * + * @property {String} filebrowser/Object + */ + +/** + * An array that contains pageId and elementId of the file upload input element for which this button is created. + * + * [ pageId, elementId ] + * + * @property {String} for + */ + +// ----- html ----------------------------------------------------------------- + +/** + * The definition of a raw HTML element. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create elements made from raw HTML code. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.html} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * To access HTML elements use {@link CKEDITOR.dom.document#getById}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example 1: + * { + * type: 'html', + * html: '

This is some sample HTML content.

' + * } + * + * // Example 2: + * // Complete sample with document.getById() call when the "Ok" button is clicked. + * var dialogDefinition = { + * title: 'Sample dialog', + * minWidth: 300, + * minHeight: 200, + * onOk: function() { + * // "this" is now a CKEDITOR.dialog object. + * var document = this.getElement().getDocument(); + * // document = CKEDITOR.dom.document + * var element = document.getById( 'myDiv' ); + * if ( element ) + * alert( element.getHtml() ); + * }, + * contents: [ + * { + * id: 'tab1', + * label: '', + * title: '', + * elements: [ + * { + * type: 'html', + * html: '
Sample text.
Another div.
' + * } + * ] + * } + * ], + * buttons: [ CKEDITOR.dialog.cancelButton, CKEDITOR.dialog.okButton ] + * }; + * + * @class CKEDITOR.dialog.definition.html + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * (Required) HTML code of this element. + * + * @property {String} html + */ + +// ----- radio ---------------------------------------------------------------- + +/** + * The definition of a radio group. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create groups of radio buttons. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.radio} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'radio', + * id: 'country', + * label: 'Which country is bigger', + * items: [ [ 'France', 'FR' ], [ 'Germany', 'DE' ] ], + * style: 'color: green', + * 'default': 'DE', + * onClick: function() { + * // this = CKEDITOR.ui.dialog.radio + * alert( 'Current value: ' + this.getValue() ); + * } + * } + * + * @class CKEDITOR.dialog.definition.radio + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`. + * If `'Value'` is missing, then the value would be assumed to be the same as the description. + * + * @property {Array} items + */ + +// ----- selectElement -------------------------------------------------------- + +/** + * The definition of a select element. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create select elements. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.select} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'select', + * id: 'sport', + * label: 'Select your favourite sport', + * items: [ [ 'Basketball' ], [ 'Baseball' ], [ 'Hockey' ], [ 'Football' ] ], + * 'default': 'Football', + * onChange: function( api ) { + * // this = CKEDITOR.ui.dialog.select + * alert( 'Current value: ' + this.getValue() ); + * } + * } + * + * @class CKEDITOR.dialog.definition.select + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`. + * If `'Value'` is missing, then the value would be assumed to be the same as the description. + * + * @property {Array} items + */ + +/** + * (Optional) Set this to true if you'd like to have a multiple-choice select box. + * + * @property {Boolean} [multiple=false] + */ + +/** + * (Optional) The number of items to display in the select box. + * + * @property {Number} size + */ + +// ----- textInput ------------------------------------------------------------ + +/** + * The definition of a text field (single line). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create text fields. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textInput} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * { + * type: 'text', + * id: 'name', + * label: 'Your name', + * 'default': '', + * validate: function() { + * if ( !this.getValue() ) { + * api.openMsgDialog( '', 'Name cannot be empty.' ); + * return false; + * } + * } + * } + * + * @class CKEDITOR.dialog.definition.textInput + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * (Optional) The maximum length. + * + * @property {Number} maxLength + */ + +/** + * (Optional) The size of the input field. + * + * @property {Number} size + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * @property bidi + * @inheritdoc CKEDITOR.dialog.definition.textarea#bidi + */ + +// ----- textarea ------------------------------------------------------------- + +/** + * The definition of a text field (multiple lines). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create textarea. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textarea} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * +* // There is no constructor for this class, the user just has to define an +* // object with the appropriate properties. +* +* // Example: +* { +* type: 'textarea', +* id: 'message', +* label: 'Your comment', +* 'default': '', +* validate: function() { +* if ( this.getValue().length < 5 ) { +* api.openMsgDialog( 'The comment is too short.' ); +* return false; +* } +* } +* } + * + * @class CKEDITOR.dialog.definition.textarea + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The number of rows. + * + * @property {Number} rows + */ + +/** + * The number of columns. + * + * @property {Number} cols + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * Whether the text direction of this input should be togglable using the following keystrokes: + * + * * *Shift+Alt+End* – switch to Right-To-Left, + * * *Shift+Alt+Home* – switch to Left-To-Right. + * + * By default the input will be loaded without any text direction set, which means that + * the direction will be inherited from the editor's text direction. + * + * If the direction was set, a marker will be prepended to every non-empty value of this input: + * + * * [`\u202A`](http://unicode.org/cldr/utility/character.jsp?a=202A) – for Right-To-Left, + * * [`\u202B`](http://unicode.org/cldr/utility/character.jsp?a=202B) – for Left-To-Right. + * + * This marker allows for restoring the same text direction upon the next dialog opening. + * + * @since 4.5 + * @property {Boolean} bidi + */ diff --git a/sources/plugins/dialog/plugin.js b/sources/plugins/dialog/plugin.js new file mode 100644 index 0000000..d6af6a2 --- /dev/null +++ b/sources/plugins/dialog/plugin.js @@ -0,0 +1,3399 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The floating dialog plugin. + */ + +/** + * No resize for this dialog. + * + * @readonly + * @property {Number} [=0] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_NONE = 0; + +/** + * Only allow horizontal resizing for this dialog, disable vertical resizing. + * + * @readonly + * @property {Number} [=1] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_WIDTH = 1; + +/** + * Only allow vertical resizing for this dialog, disable horizontal resizing. + * + * @readonly + * @property {Number} [=2] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_HEIGHT = 2; + +/** + * Allow the dialog to be resized in both directions. + * + * @readonly + * @property {Number} [=3] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_BOTH = 3; + +/** + * Dialog state when idle. + * + * @readonly + * @property {Number} [=1] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_STATE_IDLE = 1; + +/** + * Dialog state when busy. + * + * @readonly + * @property {Number} [=2] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_STATE_BUSY = 2; + +( function() { + var cssLength = CKEDITOR.tools.cssLength; + + function isTabVisible( tabId ) { + return !!this._.tabs[ tabId ][ 0 ].$.offsetHeight; + } + + function getPreviousVisibleTab() { + var tabId = this._.currentTabId, + length = this._.tabIdList.length, + tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ) + length; + + for ( var i = tabIndex - 1; i > tabIndex - length; i-- ) { + if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) ) + return this._.tabIdList[ i % length ]; + } + + return null; + } + + function getNextVisibleTab() { + var tabId = this._.currentTabId, + length = this._.tabIdList.length, + tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ); + + for ( var i = tabIndex + 1; i < tabIndex + length; i++ ) { + if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) ) + return this._.tabIdList[ i % length ]; + } + + return null; + } + + + function clearOrRecoverTextInputValue( container, isRecover ) { + var inputs = container.$.getElementsByTagName( 'input' ); + for ( var i = 0, length = inputs.length; i < length; i++ ) { + var item = new CKEDITOR.dom.element( inputs[ i ] ); + + if ( item.getAttribute( 'type' ).toLowerCase() == 'text' ) { + if ( isRecover ) { + item.setAttribute( 'value', item.getCustomData( 'fake_value' ) || '' ); + item.removeCustomData( 'fake_value' ); + } else { + item.setCustomData( 'fake_value', item.getAttribute( 'value' ) ); + item.setAttribute( 'value', '' ); + } + } + } + } + + // Handle dialog element validation state UI changes. + function handleFieldValidated( isValid, msg ) { + var input = this.getInputElement(); + if ( input ) + isValid ? input.removeAttribute( 'aria-invalid' ) : input.setAttribute( 'aria-invalid', true ); + + if ( !isValid ) { + if ( this.select ) + this.select(); + else + this.focus(); + } + + msg && alert( msg ); // jshint ignore:line + + this.fire( 'validated', { valid: isValid, msg: msg } ); + } + + function resetField() { + var input = this.getInputElement(); + input && input.removeAttribute( 'aria-invalid' ); + } + + var templateSource = ''; + + function buildDialog( editor ) { + var element = CKEDITOR.dom.element.createFromHtml( CKEDITOR.addTemplate( 'dialog', templateSource ).output( { + id: CKEDITOR.tools.getNextNumber(), + editorId: editor.id, + langDir: editor.lang.dir, + langCode: editor.langCode, + editorDialogClass: 'cke_editor_' + editor.name.replace( /\./g, '\\.' ) + '_dialog', + closeTitle: editor.lang.common.close, + hidpi: CKEDITOR.env.hidpi ? 'cke_hidpi' : '' + } ) ); + + // TODO: Change this to getById(), so it'll support custom templates. + var body = element.getChild( [ 0, 0, 0, 0, 0 ] ), + title = body.getChild( 0 ), + close = body.getChild( 1 ); + + // Don't allow dragging on dialog (#13184). + editor.plugins.clipboard && CKEDITOR.plugins.clipboard.preventDefaultDropOnElement( body ); + + // IFrame shim for dialog that masks activeX in IE. (#7619) + if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks && !CKEDITOR.env.edge ) { + var src = 'javascript:void(function(){' + encodeURIComponent( 'document.open();(' + CKEDITOR.tools.fixDomain + ')();document.close();' ) + '}())', // jshint ignore:line + iframe = CKEDITOR.dom.element.createFromHtml( '' ); + iframe.appendTo( body.getParent() ); + } + + // Make the Title and Close Button unselectable. + title.unselectable(); + close.unselectable(); + + return { + element: element, + parts: { + dialog: element.getChild( 0 ), + title: title, + close: close, + tabs: body.getChild( 2 ), + contents: body.getChild( [ 3, 0, 0, 0 ] ), + footer: body.getChild( [ 3, 0, 1, 0 ] ) + } + }; + } + + /** + * This is the base class for runtime dialog objects. An instance of this + * class represents a single named dialog for a single editor instance. + * + * var dialogObj = new CKEDITOR.dialog( editor, 'smiley' ); + * + * @class + * @constructor Creates a dialog class instance. + * @param {Object} editor The editor which created the dialog. + * @param {String} dialogName The dialog's registered name. + */ + CKEDITOR.dialog = function( editor, dialogName ) { + // Load the dialog definition. + var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ], + defaultDefinition = CKEDITOR.tools.clone( defaultDialogDefinition ), + buttonsOrder = editor.config.dialog_buttonsOrder || 'OS', + dir = editor.lang.dir, + tabsToRemove = {}, + i, processed, stopPropagation; + + if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) || // The buttons in MacOS Apps are in reverse order (#4750) + ( buttonsOrder == 'rtl' && dir == 'ltr' ) || ( buttonsOrder == 'ltr' && dir == 'rtl' ) ) + defaultDefinition.buttons.reverse(); + + + // Completes the definition with the default values. + definition = CKEDITOR.tools.extend( definition( editor ), defaultDefinition ); + + // Clone a functionally independent copy for this dialog. + definition = CKEDITOR.tools.clone( definition ); + + // Create a complex definition object, extending it with the API + // functions. + definition = new definitionObject( this, definition ); + + var themeBuilt = buildDialog( editor ); + + // Initialize some basic parameters. + this._ = { + editor: editor, + element: themeBuilt.element, + name: dialogName, + contentSize: { width: 0, height: 0 }, + size: { width: 0, height: 0 }, + contents: {}, + buttons: {}, + accessKeyMap: {}, + + // Initialize the tab and page map. + tabs: {}, + tabIdList: [], + currentTabId: null, + currentTabIndex: null, + pageCount: 0, + lastTab: null, + tabBarMode: false, + + // Initialize the tab order array for input widgets. + focusList: [], + currentFocusIndex: 0, + hasFocus: false + }; + + this.parts = themeBuilt.parts; + + CKEDITOR.tools.setTimeout( function() { + editor.fire( 'ariaWidget', this.parts.contents ); + }, 0, this ); + + // Set the startup styles for the dialog, avoiding it enlarging the + // page size on the dialog creation. + var startStyles = { + position: CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed', + top: 0, + visibility: 'hidden' + }; + + startStyles[ dir == 'rtl' ? 'right' : 'left' ] = 0; + this.parts.dialog.setStyles( startStyles ); + + + // Call the CKEDITOR.event constructor to initialize this instance. + CKEDITOR.event.call( this ); + + // Fire the "dialogDefinition" event, making it possible to customize + // the dialog definition. + this.definition = definition = CKEDITOR.fire( 'dialogDefinition', { + name: dialogName, + definition: definition + }, editor ).definition; + + // Cache tabs that should be removed. + if ( !( 'removeDialogTabs' in editor._ ) && editor.config.removeDialogTabs ) { + var removeContents = editor.config.removeDialogTabs.split( ';' ); + + for ( i = 0; i < removeContents.length; i++ ) { + var parts = removeContents[ i ].split( ':' ); + if ( parts.length == 2 ) { + var removeDialogName = parts[ 0 ]; + if ( !tabsToRemove[ removeDialogName ] ) + tabsToRemove[ removeDialogName ] = []; + tabsToRemove[ removeDialogName ].push( parts[ 1 ] ); + } + } + editor._.removeDialogTabs = tabsToRemove; + } + + // Remove tabs of this dialog. + if ( editor._.removeDialogTabs && ( tabsToRemove = editor._.removeDialogTabs[ dialogName ] ) ) { + for ( i = 0; i < tabsToRemove.length; i++ ) + definition.removeContents( tabsToRemove[ i ] ); + } + + // Initialize load, show, hide, ok and cancel events. + if ( definition.onLoad ) + this.on( 'load', definition.onLoad ); + + if ( definition.onShow ) + this.on( 'show', definition.onShow ); + + if ( definition.onHide ) + this.on( 'hide', definition.onHide ); + + if ( definition.onOk ) { + this.on( 'ok', function( evt ) { + // Dialog confirm might probably introduce content changes (#5415). + editor.fire( 'saveSnapshot' ); + setTimeout( function() { + editor.fire( 'saveSnapshot' ); + }, 0 ); + if ( definition.onOk.call( this, evt ) === false ) + evt.data.hide = false; + } ); + } + + // Set default dialog state. + this.state = CKEDITOR.DIALOG_STATE_IDLE; + + if ( definition.onCancel ) { + this.on( 'cancel', function( evt ) { + if ( definition.onCancel.call( this, evt ) === false ) + evt.data.hide = false; + } ); + } + + var me = this; + + // Iterates over all items inside all content in the dialog, calling a + // function for each of them. + var iterContents = function( func ) { + var contents = me._.contents, + stop = false; + + for ( var i in contents ) { + for ( var j in contents[ i ] ) { + stop = func.call( this, contents[ i ][ j ] ); + if ( stop ) + return; + } + } + }; + + this.on( 'ok', function( evt ) { + iterContents( function( item ) { + if ( item.validate ) { + var retval = item.validate( this ), + invalid = ( typeof retval == 'string' ) || retval === false; + + if ( invalid ) { + evt.data.hide = false; + evt.stop(); + } + + handleFieldValidated.call( item, !invalid, typeof retval == 'string' ? retval : undefined ); + return invalid; + } + } ); + }, this, null, 0 ); + + this.on( 'cancel', function( evt ) { + iterContents( function( item ) { + if ( item.isChanged() ) { + if ( !editor.config.dialog_noConfirmCancel && !confirm( editor.lang.common.confirmCancel ) ) // jshint ignore:line + evt.data.hide = false; + return true; + } + } ); + }, this, null, 0 ); + + this.parts.close.on( 'click', function( evt ) { + if ( this.fire( 'cancel', { hide: true } ).hide !== false ) + this.hide(); + evt.data.preventDefault(); + }, this ); + + // Sort focus list according to tab order definitions. + function setupFocus() { + var focusList = me._.focusList; + focusList.sort( function( a, b ) { + // Mimics browser tab order logics; + if ( a.tabIndex != b.tabIndex ) + return b.tabIndex - a.tabIndex; + // Sort is not stable in some browsers, + // fall-back the comparator to 'focusIndex'; + else + return a.focusIndex - b.focusIndex; + } ); + + var size = focusList.length; + for ( var i = 0; i < size; i++ ) + focusList[ i ].focusIndex = i; + } + + // Expects 1 or -1 as an offset, meaning direction of the offset change. + function changeFocus( offset ) { + var focusList = me._.focusList; + offset = offset || 0; + + if ( focusList.length < 1 ) + return; + + var startIndex = me._.currentFocusIndex; + + if ( me._.tabBarMode && offset < 0 ) { + // If we are in tab mode, we need to mimic that we started tabbing back from the first + // focusList (so it will go to the last one). + startIndex = 0; + } + + // Trigger the 'blur' event of any input element before anything, + // since certain UI updates may depend on it. + try { + focusList[ startIndex ].getInputElement().$.blur(); + } catch ( e ) {} + + var currentIndex = startIndex, + hasTabs = me._.pageCount > 1; + + do { + currentIndex = currentIndex + offset; + + if ( hasTabs && !me._.tabBarMode && ( currentIndex == focusList.length || currentIndex == -1 ) ) { + // If the dialog was not in tab mode, then focus the first tab (#13027). + me._.tabBarMode = true; + me._.tabs[ me._.currentTabId ][ 0 ].focus(); + me._.currentFocusIndex = -1; + + // Early return, in order to avoid accessing focusList[ -1 ]. + return; + } + + currentIndex = ( currentIndex + focusList.length ) % focusList.length; + + if ( currentIndex == startIndex ) { + break; + } + } while ( offset && !focusList[ currentIndex ].isFocusable() ); + + focusList[ currentIndex ].focus(); + + // Select whole field content. + if ( focusList[ currentIndex ].type == 'text' ) + focusList[ currentIndex ].select(); + } + + this.changeFocus = changeFocus; + + + function keydownHandler( evt ) { + // If I'm not the top dialog, ignore. + if ( me != CKEDITOR.dialog._.currentTop ) + return; + + var keystroke = evt.data.getKeystroke(), + rtl = editor.lang.dir == 'rtl', + arrowKeys = [ 37, 38, 39, 40 ], + button; + + processed = stopPropagation = 0; + + if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 ) { + var shiftPressed = ( keystroke == CKEDITOR.SHIFT + 9 ); + changeFocus( shiftPressed ? -1 : 1 ); + processed = 1; + } else if ( keystroke == CKEDITOR.ALT + 121 && !me._.tabBarMode && me.getPageCount() > 1 ) { + // Alt-F10 puts focus into the current tab item in the tab bar. + me._.tabBarMode = true; + me._.tabs[ me._.currentTabId ][ 0 ].focus(); + me._.currentFocusIndex = -1; + processed = 1; + } else if ( CKEDITOR.tools.indexOf( arrowKeys, keystroke ) != -1 && me._.tabBarMode ) { + // Array with key codes that activate previous tab. + var prevKeyCodes = [ + // Depending on the lang dir: right or left key + rtl ? 39 : 37, + // Top/bot arrow: actually for both cases it's the same. + 38 + ], + nextId = CKEDITOR.tools.indexOf( prevKeyCodes, keystroke ) != -1 ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me ); + + me.selectPage( nextId ); + me._.tabs[ nextId ][ 0 ].focus(); + processed = 1; + } else if ( ( keystroke == 13 || keystroke == 32 ) && me._.tabBarMode ) { + this.selectPage( this._.currentTabId ); + this._.tabBarMode = false; + this._.currentFocusIndex = -1; + changeFocus( 1 ); + processed = 1; + } + // If user presses enter key in a text box, it implies clicking OK for the dialog. + else if ( keystroke == 13 /*ENTER*/ ) { + // Don't do that for a target that handles ENTER. + var target = evt.data.getTarget(); + if ( !target.is( 'a', 'button', 'select', 'textarea' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) ) { + button = this.getButton( 'ok' ); + button && CKEDITOR.tools.setTimeout( button.click, 0, button ); + processed = 1; + } + stopPropagation = 1; // Always block the propagation (#4269) + } else if ( keystroke == 27 /*ESC*/ ) { + button = this.getButton( 'cancel' ); + + // If there's a Cancel button, click it, else just fire the cancel event and hide the dialog. + if ( button ) + CKEDITOR.tools.setTimeout( button.click, 0, button ); + else { + if ( this.fire( 'cancel', { hide: true } ).hide !== false ) + this.hide(); + } + stopPropagation = 1; // Always block the propagation (#4269) + } else { + return; + } + + keypressHandler( evt ); + } + + function keypressHandler( evt ) { + if ( processed ) + evt.data.preventDefault( 1 ); + else if ( stopPropagation ) + evt.data.stopPropagation(); + } + + var dialogElement = this._.element; + + editor.focusManager.add( dialogElement, 1 ); + + // Add the dialog keyboard handlers. + this.on( 'show', function() { + dialogElement.on( 'keydown', keydownHandler, this ); + + // Some browsers instead, don't cancel key events in the keydown, but in the + // keypress. So we must do a longer trip in those cases. (#4531,#8985) + if ( CKEDITOR.env.gecko ) + dialogElement.on( 'keypress', keypressHandler, this ); + + } ); + this.on( 'hide', function() { + dialogElement.removeListener( 'keydown', keydownHandler ); + if ( CKEDITOR.env.gecko ) + dialogElement.removeListener( 'keypress', keypressHandler ); + + // Reset fields state when closing dialog. + iterContents( function( item ) { + resetField.apply( item ); + } ); + } ); + this.on( 'iframeAdded', function( evt ) { + var doc = new CKEDITOR.dom.document( evt.data.iframe.$.contentWindow.document ); + doc.on( 'keydown', keydownHandler, this, null, 0 ); + } ); + + // Auto-focus logic in dialog. + this.on( 'show', function() { + // Setup tabIndex on showing the dialog instead of on loading + // to allow dynamic tab order happen in dialog definition. + setupFocus(); + + var hasTabs = me._.pageCount > 1; + + if ( editor.config.dialog_startupFocusTab && hasTabs ) { + me._.tabBarMode = true; + me._.tabs[ me._.currentTabId ][ 0 ].focus(); + me._.currentFocusIndex = -1; + } else if ( !this._.hasFocus ) { + // http://dev.ckeditor.com/ticket/13114#comment:4. + this._.currentFocusIndex = hasTabs ? -1 : this._.focusList.length - 1; + + // Decide where to put the initial focus. + if ( definition.onFocus ) { + var initialFocus = definition.onFocus.call( this ); + // Focus the field that the user specified. + initialFocus && initialFocus.focus(); + } + // Focus the first field in layout order. + else { + changeFocus( 1 ); + } + } + }, this, null, 0xffffffff ); + + // IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (#2661). + // This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken. + if ( CKEDITOR.env.ie6Compat ) { + this.on( 'load', function() { + var outer = this.getElement(), + inner = outer.getFirst(); + inner.remove(); + inner.appendTo( outer ); + }, this ); + } + + initDragAndDrop( this ); + initResizeHandles( this ); + + // Insert the title. + ( new CKEDITOR.dom.text( definition.title, CKEDITOR.document ) ).appendTo( this.parts.title ); + + // Insert the tabs and contents. + for ( i = 0; i < definition.contents.length; i++ ) { + var page = definition.contents[ i ]; + page && this.addPage( page ); + } + + this.parts.tabs.on( 'click', function( evt ) { + var target = evt.data.getTarget(); + // If we aren't inside a tab, bail out. + if ( target.hasClass( 'cke_dialog_tab' ) ) { + // Get the ID of the tab, without the 'cke_' prefix and the unique number suffix. + var id = target.$.id; + this.selectPage( id.substring( 4, id.lastIndexOf( '_' ) ) ); + + if ( this._.tabBarMode ) { + this._.tabBarMode = false; + this._.currentFocusIndex = -1; + changeFocus( 1 ); + } + evt.data.preventDefault(); + } + }, this ); + + // Insert buttons. + var buttonsHtml = [], + buttons = CKEDITOR.dialog._.uiElementBuilders.hbox.build( this, { + type: 'hbox', + className: 'cke_dialog_footer_buttons', + widths: [], + children: definition.buttons + }, buttonsHtml ).getChild(); + this.parts.footer.setHtml( buttonsHtml.join( '' ) ); + + for ( i = 0; i < buttons.length; i++ ) + this._.buttons[ buttons[ i ].id ] = buttons[ i ]; + + /** + * Current state of the dialog. Use the {@link #setState} method to update it. + * See the {@link #event-state} event to know more. + * + * @readonly + * @property {Number} [state=CKEDITOR.DIALOG_STATE_IDLE] + */ + }; + + // Focusable interface. Use it via dialog.addFocusable. + function Focusable( dialog, element, index ) { + this.element = element; + this.focusIndex = index; + // TODO: support tabIndex for focusables. + this.tabIndex = 0; + this.isFocusable = function() { + return !element.getAttribute( 'disabled' ) && element.isVisible(); + }; + this.focus = function() { + dialog._.currentFocusIndex = this.focusIndex; + this.element.focus(); + }; + // Bind events + element.on( 'keydown', function( e ) { + if ( e.data.getKeystroke() in { 32: 1, 13: 1 } ) + this.fire( 'click' ); + } ); + element.on( 'focus', function() { + this.fire( 'mouseover' ); + } ); + element.on( 'blur', function() { + this.fire( 'mouseout' ); + } ); + } + + // Re-layout the dialog on window resize. + function resizeWithWindow( dialog ) { + var win = CKEDITOR.document.getWindow(); + function resizeHandler() { + dialog.layout(); + } + win.on( 'resize', resizeHandler ); + dialog.on( 'hide', function() { + win.removeListener( 'resize', resizeHandler ); + } ); + } + + CKEDITOR.dialog.prototype = { + destroy: function() { + this.hide(); + this._.element.remove(); + }, + + /** + * Resizes the dialog. + * + * dialogObj.resize( 800, 640 ); + * + * @method + * @param {Number} width The width of the dialog in pixels. + * @param {Number} height The height of the dialog in pixels. + */ + resize: ( function() { + return function( width, height ) { + if ( this._.contentSize && this._.contentSize.width == width && this._.contentSize.height == height ) + return; + + CKEDITOR.dialog.fire( 'resize', { + dialog: this, + width: width, + height: height + }, this._.editor ); + + this.fire( 'resize', { + width: width, + height: height + }, this._.editor ); + + var contents = this.parts.contents; + contents.setStyles( { + width: width + 'px', + height: height + 'px' + } ); + + // Update dialog position when dimension get changed in RTL. + if ( this._.editor.lang.dir == 'rtl' && this._.position ) + this._.position.x = CKEDITOR.document.getWindow().getViewPaneSize().width - this._.contentSize.width - parseInt( this._.element.getFirst().getStyle( 'right' ), 10 ); + + this._.contentSize = { width: width, height: height }; + }; + } )(), + + /** + * Gets the current size of the dialog in pixels. + * + * var width = dialogObj.getSize().width; + * + * @returns {Object} + * @returns {Number} return.width + * @returns {Number} return.height + */ + getSize: function() { + var element = this._.element.getFirst(); + return { width: element.$.offsetWidth || 0, height: element.$.offsetHeight || 0 }; + }, + + /** + * Moves the dialog to an `(x, y)` coordinate relative to the window. + * + * dialogObj.move( 10, 40 ); + * + * @method + * @param {Number} x The target x-coordinate. + * @param {Number} y The target y-coordinate. + * @param {Boolean} save Flag indicate whether the dialog position should be remembered on next open up. + */ + move: function( x, y, save ) { + + // The dialog may be fixed positioned or absolute positioned. Ask the + // browser what is the current situation first. + var element = this._.element.getFirst(), rtl = this._.editor.lang.dir == 'rtl'; + var isFixed = element.getComputedStyle( 'position' ) == 'fixed'; + + // (#8888) In some cases of a very small viewport, dialog is incorrectly + // positioned in IE7. It also happens that it remains sticky and user cannot + // scroll down/up to reveal dialog's content below/above the viewport; this is + // cumbersome. + // The only way to fix this is to move mouse out of the browser and + // go back to see that dialog position is automagically fixed. No events, + // no style change - pure magic. This is a IE7 rendering issue, which can be + // fixed with dummy style redraw on each move. + if ( CKEDITOR.env.ie ) + element.setStyle( 'zoom', '100%' ); + + if ( isFixed && this._.position && this._.position.x == x && this._.position.y == y ) + return; + + // Save the current position. + this._.position = { x: x, y: y }; + + // If not fixed positioned, add scroll position to the coordinates. + if ( !isFixed ) { + var scrollPosition = CKEDITOR.document.getWindow().getScrollPosition(); + x += scrollPosition.x; + y += scrollPosition.y; + } + + // Translate coordinate for RTL. + if ( rtl ) { + var dialogSize = this.getSize(), viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(); + x = viewPaneSize.width - dialogSize.width - x; + } + + var styles = { 'top': ( y > 0 ? y : 0 ) + 'px' }; + styles[ rtl ? 'right' : 'left' ] = ( x > 0 ? x : 0 ) + 'px'; + + element.setStyles( styles ); + + save && ( this._.moved = 1 ); + }, + + /** + * Gets the dialog's position in the window. + * + * var dialogX = dialogObj.getPosition().x; + * + * @returns {Object} + * @returns {Number} return.x + * @returns {Number} return.y + */ + getPosition: function() { + return CKEDITOR.tools.extend( {}, this._.position ); + }, + + /** + * Shows the dialog box. + * + * dialogObj.show(); + */ + show: function() { + // Insert the dialog's element to the root document. + var element = this._.element; + var definition = this.definition; + if ( !( element.getParent() && element.getParent().equals( CKEDITOR.document.getBody() ) ) ) + element.appendTo( CKEDITOR.document.getBody() ); + else + element.setStyle( 'display', 'block' ); + + // First, set the dialog to an appropriate size. + this.resize( + this._.contentSize && this._.contentSize.width || definition.width || definition.minWidth, + this._.contentSize && this._.contentSize.height || definition.height || definition.minHeight + ); + + // Reset all inputs back to their default value. + this.reset(); + + // Select the first tab by default. + this.selectPage( this.definition.contents[ 0 ].id ); + + // Set z-index. + if ( CKEDITOR.dialog._.currentZIndex === null ) + CKEDITOR.dialog._.currentZIndex = this._.editor.config.baseFloatZIndex; + this._.element.getFirst().setStyle( 'z-index', CKEDITOR.dialog._.currentZIndex += 10 ); + + // Maintain the dialog ordering and dialog cover. + if ( CKEDITOR.dialog._.currentTop === null ) { + CKEDITOR.dialog._.currentTop = this; + this._.parentDialog = null; + showCover( this._.editor ); + + } else { + this._.parentDialog = CKEDITOR.dialog._.currentTop; + var parentElement = this._.parentDialog.getElement().getFirst(); + parentElement.$.style.zIndex -= Math.floor( this._.editor.config.baseFloatZIndex / 2 ); + CKEDITOR.dialog._.currentTop = this; + } + + element.on( 'keydown', accessKeyDownHandler ); + element.on( 'keyup', accessKeyUpHandler ); + + // Reset the hasFocus state. + this._.hasFocus = false; + + for ( var i in definition.contents ) { + if ( !definition.contents[ i ] ) + continue; + + var content = definition.contents[ i ], + tab = this._.tabs[ content.id ], + requiredContent = content.requiredContent, + enableElements = 0; + + if ( !tab ) + continue; + + for ( var j in this._.contents[ content.id ] ) { + var elem = this._.contents[ content.id ][ j ]; + + if ( elem.type == 'hbox' || elem.type == 'vbox' || !elem.getInputElement() ) + continue; + + if ( elem.requiredContent && !this._.editor.activeFilter.check( elem.requiredContent ) ) + elem.disable(); + else { + elem.enable(); + enableElements++; + } + } + + if ( !enableElements || ( requiredContent && !this._.editor.activeFilter.check( requiredContent ) ) ) + tab[ 0 ].addClass( 'cke_dialog_tab_disabled' ); + else + tab[ 0 ].removeClass( 'cke_dialog_tab_disabled' ); + } + + CKEDITOR.tools.setTimeout( function() { + this.layout(); + resizeWithWindow( this ); + + this.parts.dialog.setStyle( 'visibility', '' ); + + // Execute onLoad for the first show. + this.fireOnce( 'load', {} ); + CKEDITOR.ui.fire( 'ready', this ); + + this.fire( 'show', {} ); + this._.editor.fire( 'dialogShow', this ); + + if ( !this._.parentDialog ) + this._.editor.focusManager.lock(); + + // Save the initial values of the dialog. + this.foreach( function( contentObj ) { + contentObj.setInitValue && contentObj.setInitValue(); + } ); + + }, 100, this ); + }, + + /** + * Rearrange the dialog to its previous position or the middle of the window. + * + * @since 3.5 + */ + layout: function() { + var el = this.parts.dialog; + var dialogSize = this.getSize(); + var win = CKEDITOR.document.getWindow(), + viewSize = win.getViewPaneSize(); + + var posX = ( viewSize.width - dialogSize.width ) / 2, + posY = ( viewSize.height - dialogSize.height ) / 2; + + // Switch to absolute position when viewport is smaller than dialog size. + if ( !CKEDITOR.env.ie6Compat ) { + if ( dialogSize.height + ( posY > 0 ? posY : 0 ) > viewSize.height || dialogSize.width + ( posX > 0 ? posX : 0 ) > viewSize.width ) { + el.setStyle( 'position', 'absolute' ); + } else { + el.setStyle( 'position', 'fixed' ); + } + } + + this.move( this._.moved ? this._.position.x : posX, this._.moved ? this._.position.y : posY ); + }, + + /** + * Executes a function for each UI element. + * + * @param {Function} fn Function to execute for each UI element. + * @returns {CKEDITOR.dialog} The current dialog object. + */ + foreach: function( fn ) { + for ( var i in this._.contents ) { + for ( var j in this._.contents[ i ] ) { + fn.call( this, this._.contents[i][j] ); + } + } + + return this; + }, + + /** + * Resets all input values in the dialog. + * + * dialogObj.reset(); + * + * @method + * @chainable + */ + reset: ( function() { + var fn = function( widget ) { + if ( widget.reset ) + widget.reset( 1 ); + }; + return function() { + this.foreach( fn ); + return this; + }; + } )(), + + + /** + * Calls the {@link CKEDITOR.dialog.definition.uiElement#setup} method of each + * of the UI elements, with the arguments passed through it. + * It is usually being called when the dialog is opened, to put the initial value inside the field. + * + * dialogObj.setupContent(); + * + * var timestamp = ( new Date() ).valueOf(); + * dialogObj.setupContent( timestamp ); + */ + setupContent: function() { + var args = arguments; + this.foreach( function( widget ) { + if ( widget.setup ) + widget.setup.apply( widget, args ); + } ); + }, + + /** + * Calls the {@link CKEDITOR.dialog.definition.uiElement#commit} method of each + * of the UI elements, with the arguments passed through it. + * It is usually being called when the user confirms the dialog, to process the values. + * + * dialogObj.commitContent(); + * + * var timestamp = ( new Date() ).valueOf(); + * dialogObj.commitContent( timestamp ); + */ + commitContent: function() { + var args = arguments; + this.foreach( function( widget ) { + // Make sure IE triggers "change" event on last focused input before closing the dialog. (#7915) + if ( CKEDITOR.env.ie && this._.currentFocusIndex == widget.focusIndex ) + widget.getInputElement().$.blur(); + + if ( widget.commit ) + widget.commit.apply( widget, args ); + } ); + }, + + /** + * Hides the dialog box. + * + * dialogObj.hide(); + */ + hide: function() { + if ( !this.parts.dialog.isVisible() ) + return; + + this.fire( 'hide', {} ); + this._.editor.fire( 'dialogHide', this ); + // Reset the tab page. + this.selectPage( this._.tabIdList[ 0 ] ); + var element = this._.element; + element.setStyle( 'display', 'none' ); + this.parts.dialog.setStyle( 'visibility', 'hidden' ); + // Unregister all access keys associated with this dialog. + unregisterAccessKey( this ); + + // Close any child(top) dialogs first. + while ( CKEDITOR.dialog._.currentTop != this ) + CKEDITOR.dialog._.currentTop.hide(); + + // Maintain dialog ordering and remove cover if needed. + if ( !this._.parentDialog ) + hideCover( this._.editor ); + else { + var parentElement = this._.parentDialog.getElement().getFirst(); + parentElement.setStyle( 'z-index', parseInt( parentElement.$.style.zIndex, 10 ) + Math.floor( this._.editor.config.baseFloatZIndex / 2 ) ); + } + CKEDITOR.dialog._.currentTop = this._.parentDialog; + + // Deduct or clear the z-index. + if ( !this._.parentDialog ) { + CKEDITOR.dialog._.currentZIndex = null; + + // Remove access key handlers. + element.removeListener( 'keydown', accessKeyDownHandler ); + element.removeListener( 'keyup', accessKeyUpHandler ); + + var editor = this._.editor; + editor.focus(); + + // Give a while before unlock, waiting for focus to return to the editable. (#172) + setTimeout( function() { + editor.focusManager.unlock(); + + // Fixed iOS focus issue (#12381). + // Keep in mind that editor.focus() does not work in this case. + if ( CKEDITOR.env.iOS ) { + editor.window.focus(); + } + }, 0 ); + + } else { + CKEDITOR.dialog._.currentZIndex -= 10; + } + + delete this._.parentDialog; + // Reset the initial values of the dialog. + this.foreach( function( contentObj ) { + contentObj.resetInitValue && contentObj.resetInitValue(); + } ); + + // Reset dialog state back to IDLE, if busy (#13213). + this.setState( CKEDITOR.DIALOG_STATE_IDLE ); + }, + + /** + * Adds a tabbed page into the dialog. + * + * @param {Object} contents Content definition. + */ + addPage: function( contents ) { + if ( contents.requiredContent && !this._.editor.filter.check( contents.requiredContent ) ) + return; + + var pageHtml = [], + titleHtml = contents.label ? ' title="' + CKEDITOR.tools.htmlEncode( contents.label ) + '"' : '', + vbox = CKEDITOR.dialog._.uiElementBuilders.vbox.build( this, { + type: 'vbox', + className: 'cke_dialog_page_contents', + children: contents.elements, + expand: !!contents.expand, + padding: contents.padding, + style: contents.style || 'width: 100%;' + }, pageHtml ); + + var contentMap = this._.contents[ contents.id ] = {}, + cursor, + children = vbox.getChild(), + enabledFields = 0; + + while ( ( cursor = children.shift() ) ) { + // Count all allowed fields. + if ( !cursor.notAllowed && cursor.type != 'hbox' && cursor.type != 'vbox' ) + enabledFields++; + + contentMap[ cursor.id ] = cursor; + if ( typeof cursor.getChild == 'function' ) + children.push.apply( children, cursor.getChild() ); + } + + // If all fields are disabled (because they are not allowed) hide this tab. + if ( !enabledFields ) + contents.hidden = true; + + // Create the HTML for the tab and the content block. + var page = CKEDITOR.dom.element.createFromHtml( pageHtml.join( '' ) ); + page.setAttribute( 'role', 'tabpanel' ); + + var env = CKEDITOR.env; + var tabId = 'cke_' + contents.id + '_' + CKEDITOR.tools.getNextNumber(), + tab = CKEDITOR.dom.element.createFromHtml( [ + ' 0 ? ' cke_last' : 'cke_first' ), + titleHtml, + ( !!contents.hidden ? ' style="display:none"' : '' ), + ' id="', tabId, '"', + env.gecko && !env.hc ? '' : ' href="javascript:void(0)"', + ' tabIndex="-1"', + ' hidefocus="true"', + ' role="tab">', + contents.label, + '' + ].join( '' ) ); + + page.setAttribute( 'aria-labelledby', tabId ); + + // Take records for the tabs and elements created. + this._.tabs[ contents.id ] = [ tab, page ]; + this._.tabIdList.push( contents.id ); + !contents.hidden && this._.pageCount++; + this._.lastTab = tab; + this.updateStyle(); + + // Attach the DOM nodes. + + page.setAttribute( 'name', contents.id ); + page.appendTo( this.parts.contents ); + + tab.unselectable(); + this.parts.tabs.append( tab ); + + // Add access key handlers if access key is defined. + if ( contents.accessKey ) { + registerAccessKey( this, this, 'CTRL+' + contents.accessKey, tabAccessKeyDown, tabAccessKeyUp ); + this._.accessKeyMap[ 'CTRL+' + contents.accessKey ] = contents.id; + } + }, + + /** + * Activates a tab page in the dialog by its id. + * + * dialogObj.selectPage( 'tab_1' ); + * + * @param {String} id The id of the dialog tab to be activated. + */ + selectPage: function( id ) { + if ( this._.currentTabId == id ) + return; + + if ( this._.tabs[ id ][ 0 ].hasClass( 'cke_dialog_tab_disabled' ) ) + return; + + // If event was canceled - do nothing. + if ( this.fire( 'selectPage', { page: id, currentPage: this._.currentTabId } ) === false ) + return; + + // Hide the non-selected tabs and pages. + for ( var i in this._.tabs ) { + var tab = this._.tabs[ i ][ 0 ], + page = this._.tabs[ i ][ 1 ]; + if ( i != id ) { + tab.removeClass( 'cke_dialog_tab_selected' ); + page.hide(); + } + page.setAttribute( 'aria-hidden', i != id ); + } + + var selected = this._.tabs[ id ]; + selected[ 0 ].addClass( 'cke_dialog_tab_selected' ); + + // [IE] an invisible input[type='text'] will enlarge it's width + // if it's value is long when it shows, so we clear it's value + // before it shows and then recover it (#5649) + if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat ) { + clearOrRecoverTextInputValue( selected[ 1 ] ); + selected[ 1 ].show(); + setTimeout( function() { + clearOrRecoverTextInputValue( selected[ 1 ], 1 ); + }, 0 ); + } else { + selected[ 1 ].show(); + } + + this._.currentTabId = id; + this._.currentTabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, id ); + }, + + /** + * Dialog state-specific style updates. + */ + updateStyle: function() { + // If only a single page shown, a different style is used in the central pane. + this.parts.dialog[ ( this._.pageCount === 1 ? 'add' : 'remove' ) + 'Class' ]( 'cke_single_page' ); + }, + + /** + * Hides a page's tab away from the dialog. + * + * dialog.hidePage( 'tab_3' ); + * + * @param {String} id The page's Id. + */ + hidePage: function( id ) { + var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ]; + if ( !tab || this._.pageCount == 1 || !tab.isVisible() ) + return; + // Switch to other tab first when we're hiding the active tab. + else if ( id == this._.currentTabId ) + this.selectPage( getPreviousVisibleTab.call( this ) ); + + tab.hide(); + this._.pageCount--; + this.updateStyle(); + }, + + /** + * Unhides a page's tab. + * + * dialog.showPage( 'tab_2' ); + * + * @param {String} id The page's Id. + */ + showPage: function( id ) { + var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ]; + if ( !tab ) + return; + tab.show(); + this._.pageCount++; + this.updateStyle(); + }, + + /** + * Gets the root DOM element of the dialog. + * + * var dialogElement = dialogObj.getElement().getFirst(); + * dialogElement.setStyle( 'padding', '5px' ); + * + * @returns {CKEDITOR.dom.element} The `` element containing this dialog. + */ + getElement: function() { + return this._.element; + }, + + /** + * Gets the name of the dialog. + * + * var dialogName = dialogObj.getName(); + * + * @returns {String} The name of this dialog. + */ + getName: function() { + return this._.name; + }, + + /** + * Gets a dialog UI element object from a dialog page. + * + * dialogObj.getContentElement( 'tabId', 'elementId' ).setValue( 'Example' ); + * + * @param {String} pageId id of dialog page. + * @param {String} elementId id of UI element. + * @returns {CKEDITOR.ui.dialog.uiElement} The dialog UI element. + */ + getContentElement: function( pageId, elementId ) { + var page = this._.contents[ pageId ]; + return page && page[ elementId ]; + }, + + /** + * Gets the value of a dialog UI element. + * + * alert( dialogObj.getValueOf( 'tabId', 'elementId' ) ); + * + * @param {String} pageId id of dialog page. + * @param {String} elementId id of UI element. + * @returns {Object} The value of the UI element. + */ + getValueOf: function( pageId, elementId ) { + return this.getContentElement( pageId, elementId ).getValue(); + }, + + /** + * Sets the value of a dialog UI element. + * + * dialogObj.setValueOf( 'tabId', 'elementId', 'Example' ); + * + * @param {String} pageId id of the dialog page. + * @param {String} elementId id of the UI element. + * @param {Object} value The new value of the UI element. + */ + setValueOf: function( pageId, elementId, value ) { + return this.getContentElement( pageId, elementId ).setValue( value ); + }, + + /** + * Gets the UI element of a button in the dialog's button row. + * + * @returns {CKEDITOR.ui.dialog.button} The button object. + * + * @param {String} id The id of the button. + */ + getButton: function( id ) { + return this._.buttons[ id ]; + }, + + /** + * Simulates a click to a dialog button in the dialog's button row. + * + * @returns The return value of the dialog's `click` event. + * + * @param {String} id The id of the button. + */ + click: function( id ) { + return this._.buttons[ id ].click(); + }, + + /** + * Disables a dialog button. + * + * @param {String} id The id of the button. + */ + disableButton: function( id ) { + return this._.buttons[ id ].disable(); + }, + + /** + * Enables a dialog button. + * + * @param {String} id The id of the button. + */ + enableButton: function( id ) { + return this._.buttons[ id ].enable(); + }, + + /** + * Gets the number of pages in the dialog. + * + * @returns {Number} Page count. + */ + getPageCount: function() { + return this._.pageCount; + }, + + /** + * Gets the editor instance which opened this dialog. + * + * @returns {CKEDITOR.editor} Parent editor instances. + */ + getParentEditor: function() { + return this._.editor; + }, + + /** + * Gets the element that was selected when opening the dialog, if any. + * + * @returns {CKEDITOR.dom.element} The element that was selected, or `null`. + */ + getSelectedElement: function() { + return this.getParentEditor().getSelection().getSelectedElement(); + }, + + /** + * Adds element to dialog's focusable list. + * + * @param {CKEDITOR.dom.element} element + * @param {Number} [index] + */ + addFocusable: function( element, index ) { + if ( typeof index == 'undefined' ) { + index = this._.focusList.length; + this._.focusList.push( new Focusable( this, element, index ) ); + } else { + this._.focusList.splice( index, 0, new Focusable( this, element, index ) ); + for ( var i = index + 1; i < this._.focusList.length; i++ ) + this._.focusList[ i ].focusIndex++; + } + }, + + /** + * Sets the dialog {@link #property-state}. + * + * @since 4.5 + * @param {Number} state Either {@link CKEDITOR#DIALOG_STATE_IDLE} or {@link CKEDITOR#DIALOG_STATE_BUSY}. + */ + setState: function( state ) { + var oldState = this.state; + + if ( oldState == state ) { + return; + } + + this.state = state; + + if ( state == CKEDITOR.DIALOG_STATE_BUSY ) { + // Insert the spinner on demand. + if ( !this.parts.spinner ) { + var dir = this.getParentEditor().lang.dir, + spinnerDef = { + attributes: { + 'class': 'cke_dialog_spinner' + }, + styles: { + 'float': dir == 'rtl' ? 'right' : 'left' + } + }; + + spinnerDef.styles[ 'margin-' + ( dir == 'rtl' ? 'left' : 'right' ) ] = '8px'; + + this.parts.spinner = CKEDITOR.document.createElement( 'div', spinnerDef ); + + this.parts.spinner.setHtml( '⌛' ); + this.parts.spinner.appendTo( this.parts.title, 1 ); + } + + // Finally, show the spinner. + this.parts.spinner.show(); + + this.getButton( 'ok' ).disable(); + } else if ( state == CKEDITOR.DIALOG_STATE_IDLE ) { + // Hide the spinner. But don't do anything if there is no spinner yet. + this.parts.spinner && this.parts.spinner.hide(); + + this.getButton( 'ok' ).enable(); + } + + this.fire( 'state', state ); + } + }; + + CKEDITOR.tools.extend( CKEDITOR.dialog, { + /** + * Registers a dialog. + * + * // Full sample plugin, which does not only register a dialog window but also adds an item to the context menu. + * // To open the dialog window, choose "Open dialog" in the context menu. + * CKEDITOR.plugins.add( 'myplugin', { + * init: function( editor ) { + * editor.addCommand( 'mydialog',new CKEDITOR.dialogCommand( 'mydialog' ) ); + * + * if ( editor.contextMenu ) { + * editor.addMenuGroup( 'mygroup', 10 ); + * editor.addMenuItem( 'My Dialog', { + * label: 'Open dialog', + * command: 'mydialog', + * group: 'mygroup' + * } ); + * editor.contextMenu.addListener( function( element ) { + * return { 'My Dialog': CKEDITOR.TRISTATE_OFF }; + * } ); + * } + * + * CKEDITOR.dialog.add( 'mydialog', function( api ) { + * // CKEDITOR.dialog.definition + * var dialogDefinition = { + * title: 'Sample dialog', + * minWidth: 390, + * minHeight: 130, + * contents: [ + * { + * id: 'tab1', + * label: 'Label', + * title: 'Title', + * expand: true, + * padding: 0, + * elements: [ + * { + * type: 'html', + * html: '

This is some sample HTML content.

' + * }, + * { + * type: 'textarea', + * id: 'textareaId', + * rows: 4, + * cols: 40 + * } + * ] + * } + * ], + * buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ], + * onOk: function() { + * // "this" is now a CKEDITOR.dialog object. + * // Accessing dialog elements: + * var textareaObj = this.getContentElement( 'tab1', 'textareaId' ); + * alert( "You have entered: " + textareaObj.getValue() ); + * } + * }; + * + * return dialogDefinition; + * } ); + * } + * } ); + * + * CKEDITOR.replace( 'editor1', { extraPlugins: 'myplugin' } ); + * + * @static + * @param {String} name The dialog's name. + * @param {Function/String} dialogDefinition + * A function returning the dialog's definition, or the URL to the `.js` file holding the function. + * The function should accept an argument `editor` which is the current editor instance, and + * return an object conforming to {@link CKEDITOR.dialog.definition}. + * @see CKEDITOR.dialog.definition + */ + add: function( name, dialogDefinition ) { + // Avoid path registration from multiple instances override definition. + if ( !this._.dialogDefinitions[ name ] || typeof dialogDefinition == 'function' ) + this._.dialogDefinitions[ name ] = dialogDefinition; + }, + + /** + * @static + * @todo + */ + exists: function( name ) { + return !!this._.dialogDefinitions[ name ]; + }, + + /** + * @static + * @todo + */ + getCurrent: function() { + return CKEDITOR.dialog._.currentTop; + }, + + /** + * Check whether tab wasn't removed by {@link CKEDITOR.config#removeDialogTabs}. + * + * @since 4.1 + * @static + * @param {CKEDITOR.editor} editor + * @param {String} dialogName + * @param {String} tabName + * @returns {Boolean} + */ + isTabEnabled: function( editor, dialogName, tabName ) { + var cfg = editor.config.removeDialogTabs; + + return !( cfg && cfg.match( new RegExp( '(?:^|;)' + dialogName + ':' + tabName + '(?:$|;)', 'i' ) ) ); + }, + + /** + * The default OK button for dialogs. Fires the `ok` event and closes the dialog if the event succeeds. + * + * @static + * @method + */ + okButton: ( function() { + var retval = function( editor, override ) { + override = override || {}; + return CKEDITOR.tools.extend( { + id: 'ok', + type: 'button', + label: editor.lang.common.ok, + 'class': 'cke_dialog_ui_button_ok', + onClick: function( evt ) { + var dialog = evt.data.dialog; + if ( dialog.fire( 'ok', { hide: true } ).hide !== false ) + dialog.hide(); + } + }, override, true ); + }; + retval.type = 'button'; + retval.override = function( override ) { + return CKEDITOR.tools.extend( function( editor ) { + return retval( editor, override ); + }, { type: 'button' }, true ); + }; + return retval; + } )(), + + /** + * The default cancel button for dialogs. Fires the `cancel` event and + * closes the dialog if no UI element value changed. + * + * @static + * @method + */ + cancelButton: ( function() { + var retval = function( editor, override ) { + override = override || {}; + return CKEDITOR.tools.extend( { + id: 'cancel', + type: 'button', + label: editor.lang.common.cancel, + 'class': 'cke_dialog_ui_button_cancel', + onClick: function( evt ) { + var dialog = evt.data.dialog; + if ( dialog.fire( 'cancel', { hide: true } ).hide !== false ) + dialog.hide(); + } + }, override, true ); + }; + retval.type = 'button'; + retval.override = function( override ) { + return CKEDITOR.tools.extend( function( editor ) { + return retval( editor, override ); + }, { type: 'button' }, true ); + }; + return retval; + } )(), + + /** + * Registers a dialog UI element. + * + * @static + * @param {String} typeName The name of the UI element. + * @param {Function} builder The function to build the UI element. + */ + addUIElement: function( typeName, builder ) { + this._.uiElementBuilders[ typeName ] = builder; + } + } ); + + CKEDITOR.dialog._ = { + uiElementBuilders: {}, + + dialogDefinitions: {}, + + currentTop: null, + + currentZIndex: null + }; + + // "Inherit" (copy actually) from CKEDITOR.event. + CKEDITOR.event.implementOn( CKEDITOR.dialog ); + CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype ); + + var defaultDialogDefinition = { + resizable: CKEDITOR.DIALOG_RESIZE_BOTH, + minWidth: 600, + minHeight: 400, + buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ] + }; + + // Tool function used to return an item from an array based on its id + // property. + var getById = function( array, id, recurse ) { + for ( var i = 0, item; + ( item = array[ i ] ); i++ ) { + if ( item.id == id ) + return item; + if ( recurse && item[ recurse ] ) { + var retval = getById( item[ recurse ], id, recurse ); + if ( retval ) + return retval; + } + } + return null; + }; + + // Tool function used to add an item into an array. + var addById = function( array, newItem, nextSiblingId, recurse, nullIfNotFound ) { + if ( nextSiblingId ) { + for ( var i = 0, item; + ( item = array[ i ] ); i++ ) { + if ( item.id == nextSiblingId ) { + array.splice( i, 0, newItem ); + return newItem; + } + + if ( recurse && item[ recurse ] ) { + var retval = addById( item[ recurse ], newItem, nextSiblingId, recurse, true ); + if ( retval ) + return retval; + } + } + + if ( nullIfNotFound ) + return null; + } + + array.push( newItem ); + return newItem; + }; + + // Tool function used to remove an item from an array based on its id. + var removeById = function( array, id, recurse ) { + for ( var i = 0, item; + ( item = array[ i ] ); i++ ) { + if ( item.id == id ) + return array.splice( i, 1 ); + if ( recurse && item[ recurse ] ) { + var retval = removeById( item[ recurse ], id, recurse ); + if ( retval ) + return retval; + } + } + return null; + }; + + /** + * This class is not really part of the API. It is the `definition` property value + * passed to `dialogDefinition` event handlers. + * + * CKEDITOR.on( 'dialogDefinition', function( evt ) { + * var definition = evt.data.definition; + * var content = definition.getContents( 'page1' ); + * // ... + * } ); + * + * @private + * @class CKEDITOR.dialog.definitionObject + * @extends CKEDITOR.dialog.definition + * @constructor Creates a definitionObject class instance. + */ + var definitionObject = function( dialog, dialogDefinition ) { + // TODO : Check if needed. + this.dialog = dialog; + + // Transform the contents entries in contentObjects. + var contents = dialogDefinition.contents; + for ( var i = 0, content; + ( content = contents[ i ] ); i++ ) + contents[ i ] = content && new contentObject( dialog, content ); + + CKEDITOR.tools.extend( this, dialogDefinition ); + }; + + definitionObject.prototype = { + /** + * Gets a content definition. + * + * @param {String} id The id of the content definition. + * @returns {CKEDITOR.dialog.definition.content} The content definition matching id. + */ + getContents: function( id ) { + return getById( this.contents, id ); + }, + + /** + * Gets a button definition. + * + * @param {String} id The id of the button definition. + * @returns {CKEDITOR.dialog.definition.button} The button definition matching id. + */ + getButton: function( id ) { + return getById( this.buttons, id ); + }, + + /** + * Adds a content definition object under this dialog definition. + * + * @param {CKEDITOR.dialog.definition.content} contentDefinition The + * content definition. + * @param {String} [nextSiblingId] The id of an existing content + * definition which the new content definition will be inserted + * before. Omit if the new content definition is to be inserted as + * the last item. + * @returns {CKEDITOR.dialog.definition.content} The inserted content definition. + */ + addContents: function( contentDefinition, nextSiblingId ) { + return addById( this.contents, contentDefinition, nextSiblingId ); + }, + + /** + * Adds a button definition object under this dialog definition. + * + * @param {CKEDITOR.dialog.definition.button} buttonDefinition The + * button definition. + * @param {String} [nextSiblingId] The id of an existing button + * definition which the new button definition will be inserted + * before. Omit if the new button definition is to be inserted as + * the last item. + * @returns {CKEDITOR.dialog.definition.button} The inserted button definition. + */ + addButton: function( buttonDefinition, nextSiblingId ) { + return addById( this.buttons, buttonDefinition, nextSiblingId ); + }, + + /** + * Removes a content definition from this dialog definition. + * + * @param {String} id The id of the content definition to be removed. + * @returns {CKEDITOR.dialog.definition.content} The removed content definition. + */ + removeContents: function( id ) { + removeById( this.contents, id ); + }, + + /** + * Removes a button definition from the dialog definition. + * + * @param {String} id The id of the button definition to be removed. + * @returns {CKEDITOR.dialog.definition.button} The removed button definition. + */ + removeButton: function( id ) { + removeById( this.buttons, id ); + } + }; + + /** + * This class is not really part of the API. It is the template of the + * objects representing content pages inside the + * CKEDITOR.dialog.definitionObject. + * + * CKEDITOR.on( 'dialogDefinition', function( evt ) { + * var definition = evt.data.definition; + * var content = definition.getContents( 'page1' ); + * content.remove( 'textInput1' ); + * // ... + * } ); + * + * @private + * @class CKEDITOR.dialog.definition.contentObject + * @constructor Creates a contentObject class instance. + */ + function contentObject( dialog, contentDefinition ) { + this._ = { + dialog: dialog + }; + + CKEDITOR.tools.extend( this, contentDefinition ); + } + + contentObject.prototype = { + /** + * Gets a UI element definition under the content definition. + * + * @param {String} id The id of the UI element definition. + * @returns {CKEDITOR.dialog.definition.uiElement} + */ + get: function( id ) { + return getById( this.elements, id, 'children' ); + }, + + /** + * Adds a UI element definition to the content definition. + * + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition The + * UI elemnet definition to be added. + * @param {String} nextSiblingId The id of an existing UI element + * definition which the new UI element definition will be inserted + * before. Omit if the new button definition is to be inserted as + * the last item. + * @returns {CKEDITOR.dialog.definition.uiElement} The element definition inserted. + */ + add: function( elementDefinition, nextSiblingId ) { + return addById( this.elements, elementDefinition, nextSiblingId, 'children' ); + }, + + /** + * Removes a UI element definition from the content definition. + * + * @param {String} id The id of the UI element definition to be removed. + * @returns {CKEDITOR.dialog.definition.uiElement} The element definition removed. + */ + remove: function( id ) { + removeById( this.elements, id, 'children' ); + } + }; + + function initDragAndDrop( dialog ) { + var lastCoords = null, + abstractDialogCoords = null, + editor = dialog.getParentEditor(), + magnetDistance = editor.config.dialog_magnetDistance, + margins = CKEDITOR.skin.margins || [ 0, 0, 0, 0 ]; + + if ( typeof magnetDistance == 'undefined' ) + magnetDistance = 20; + + function mouseMoveHandler( evt ) { + var dialogSize = dialog.getSize(), + viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(), + x = evt.data.$.screenX, + y = evt.data.$.screenY, + dx = x - lastCoords.x, + dy = y - lastCoords.y, + realX, realY; + + lastCoords = { x: x, y: y }; + abstractDialogCoords.x += dx; + abstractDialogCoords.y += dy; + + if ( abstractDialogCoords.x + margins[ 3 ] < magnetDistance ) + realX = -margins[ 3 ]; + else if ( abstractDialogCoords.x - margins[ 1 ] > viewPaneSize.width - dialogSize.width - magnetDistance ) + realX = viewPaneSize.width - dialogSize.width + ( editor.lang.dir == 'rtl' ? 0 : margins[ 1 ] ); + else + realX = abstractDialogCoords.x; + + if ( abstractDialogCoords.y + margins[ 0 ] < magnetDistance ) + realY = -margins[ 0 ]; + else if ( abstractDialogCoords.y - margins[ 2 ] > viewPaneSize.height - dialogSize.height - magnetDistance ) + realY = viewPaneSize.height - dialogSize.height + margins[ 2 ]; + else + realY = abstractDialogCoords.y; + + dialog.move( realX, realY, 1 ); + + evt.data.preventDefault(); + } + + function mouseUpHandler() { + CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler ); + CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler ); + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.removeListener( 'mousemove', mouseMoveHandler ); + coverDoc.removeListener( 'mouseup', mouseUpHandler ); + } + } + + dialog.parts.title.on( 'mousedown', function( evt ) { + lastCoords = { x: evt.data.$.screenX, y: evt.data.$.screenY }; + + CKEDITOR.document.on( 'mousemove', mouseMoveHandler ); + CKEDITOR.document.on( 'mouseup', mouseUpHandler ); + abstractDialogCoords = dialog.getPosition(); + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.on( 'mousemove', mouseMoveHandler ); + coverDoc.on( 'mouseup', mouseUpHandler ); + } + + evt.data.preventDefault(); + }, dialog ); + } + + function initResizeHandles( dialog ) { + var def = dialog.definition, + resizable = def.resizable; + + if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE ) + return; + + var editor = dialog.getParentEditor(); + var wrapperWidth, wrapperHeight, viewSize, origin, startSize, dialogCover; + + var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) { + startSize = dialog.getSize(); + + var content = dialog.parts.contents, + iframeDialog = content.$.getElementsByTagName( 'iframe' ).length; + + // Shim to help capturing "mousemove" over iframe. + if ( iframeDialog ) { + dialogCover = CKEDITOR.dom.element.createFromHtml( '
' ); + content.append( dialogCover ); + } + + // Calculate the offset between content and chrome size. + wrapperHeight = startSize.height - dialog.parts.contents.getSize( 'height', !( CKEDITOR.env.gecko || CKEDITOR.env.ie && CKEDITOR.env.quirks ) ); + wrapperWidth = startSize.width - dialog.parts.contents.getSize( 'width', 1 ); + + origin = { x: $event.screenX, y: $event.screenY }; + + viewSize = CKEDITOR.document.getWindow().getViewPaneSize(); + + CKEDITOR.document.on( 'mousemove', mouseMoveHandler ); + CKEDITOR.document.on( 'mouseup', mouseUpHandler ); + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.on( 'mousemove', mouseMoveHandler ); + coverDoc.on( 'mouseup', mouseUpHandler ); + } + + $event.preventDefault && $event.preventDefault(); + } ); + + // Prepend the grip to the dialog. + dialog.on( 'load', function() { + var direction = ''; + if ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH ) + direction = ' cke_resizer_horizontal'; + else if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT ) + direction = ' cke_resizer_vertical'; + var resizer = CKEDITOR.dom.element.createFromHtml( + '' + + // BLACK LOWER RIGHT TRIANGLE (ltr) + // BLACK LOWER LEFT TRIANGLE (rtl) + ( editor.lang.dir == 'ltr' ? '\u25E2' : '\u25E3' ) + + '
' ); + dialog.parts.footer.append( resizer, 1 ); + } ); + editor.on( 'destroy', function() { + CKEDITOR.tools.removeFunction( mouseDownFn ); + } ); + + function mouseMoveHandler( evt ) { + var rtl = editor.lang.dir == 'rtl', + dx = ( evt.data.$.screenX - origin.x ) * ( rtl ? -1 : 1 ), + dy = evt.data.$.screenY - origin.y, + width = startSize.width, + height = startSize.height, + internalWidth = width + dx * ( dialog._.moved ? 1 : 2 ), + internalHeight = height + dy * ( dialog._.moved ? 1 : 2 ), + element = dialog._.element.getFirst(), + right = rtl && element.getComputedStyle( 'right' ), + position = dialog.getPosition(); + + if ( position.y + internalHeight > viewSize.height ) + internalHeight = viewSize.height - position.y; + + if ( ( rtl ? right : position.x ) + internalWidth > viewSize.width ) + internalWidth = viewSize.width - ( rtl ? right : position.x ); + + // Make sure the dialog will not be resized to the wrong side when it's in the leftmost position for RTL. + if ( ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) ) + width = Math.max( def.minWidth || 0, internalWidth - wrapperWidth ); + + if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) + height = Math.max( def.minHeight || 0, internalHeight - wrapperHeight ); + + dialog.resize( width, height ); + + if ( !dialog._.moved ) + dialog.layout(); + + evt.data.preventDefault(); + } + + function mouseUpHandler() { + CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler ); + CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler ); + + if ( dialogCover ) { + dialogCover.remove(); + dialogCover = null; + } + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.removeListener( 'mouseup', mouseUpHandler ); + coverDoc.removeListener( 'mousemove', mouseMoveHandler ); + } + } + } + + var resizeCover; + // Caching resuable covers and allowing only one cover + // on screen. + var covers = {}, + currentCover; + + function cancelEvent( ev ) { + ev.data.preventDefault( 1 ); + } + + function showCover( editor ) { + var win = CKEDITOR.document.getWindow(), + config = editor.config, + skinName = ( CKEDITOR.skinName || editor.config.skin ), + backgroundColorStyle = config.dialog_backgroundCoverColor || ( skinName == 'moono-lisa' ? 'black' : 'white' ), + backgroundCoverOpacity = config.dialog_backgroundCoverOpacity, + baseFloatZIndex = config.baseFloatZIndex, + coverKey = CKEDITOR.tools.genKey( backgroundColorStyle, backgroundCoverOpacity, baseFloatZIndex ), + coverElement = covers[ coverKey ]; + + if ( !coverElement ) { + var html = [ + '
' + ]; + + if ( CKEDITOR.env.ie6Compat ) { + // Support for custom document.domain in IE. + var iframeHtml = ''; + + html.push( '' + + '' ); + } + + html.push( '
' ); + + coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) ); + coverElement.setOpacity( backgroundCoverOpacity !== undefined ? backgroundCoverOpacity : 0.5 ); + + coverElement.on( 'keydown', cancelEvent ); + coverElement.on( 'keypress', cancelEvent ); + coverElement.on( 'keyup', cancelEvent ); + + coverElement.appendTo( CKEDITOR.document.getBody() ); + covers[ coverKey ] = coverElement; + } else { + coverElement.show(); + } + + // Makes the dialog cover a focus holder as well. + editor.focusManager.add( coverElement ); + + currentCover = coverElement; + var resizeFunc = function() { + var size = win.getViewPaneSize(); + coverElement.setStyles( { + width: size.width + 'px', + height: size.height + 'px' + } ); + }; + + var scrollFunc = function() { + var pos = win.getScrollPosition(), + cursor = CKEDITOR.dialog._.currentTop; + coverElement.setStyles( { + left: pos.x + 'px', + top: pos.y + 'px' + } ); + + if ( cursor ) { + do { + var dialogPos = cursor.getPosition(); + cursor.move( dialogPos.x, dialogPos.y ); + } while ( ( cursor = cursor._.parentDialog ) ); + } + }; + + resizeCover = resizeFunc; + win.on( 'resize', resizeFunc ); + resizeFunc(); + // Using Safari/Mac, focus must be kept where it is (#7027) + if ( !( CKEDITOR.env.mac && CKEDITOR.env.webkit ) ) + coverElement.focus(); + + if ( CKEDITOR.env.ie6Compat ) { + // IE BUG: win.$.onscroll assignment doesn't work.. it must be window.onscroll. + // So we need to invent a really funny way to make it work. + var myScrollHandler = function() { + scrollFunc(); + arguments.callee.prevScrollHandler.apply( this, arguments ); + }; + win.$.setTimeout( function() { + myScrollHandler.prevScrollHandler = window.onscroll || + function() {}; + window.onscroll = myScrollHandler; + }, 0 ); + scrollFunc(); + } + } + + function hideCover( editor ) { + if ( !currentCover ) + return; + + editor.focusManager.remove( currentCover ); + var win = CKEDITOR.document.getWindow(); + currentCover.hide(); + win.removeListener( 'resize', resizeCover ); + + if ( CKEDITOR.env.ie6Compat ) { + win.$.setTimeout( function() { + var prevScrollHandler = window.onscroll && window.onscroll.prevScrollHandler; + window.onscroll = prevScrollHandler || null; + }, 0 ); + } + resizeCover = null; + } + + function removeCovers() { + for ( var coverId in covers ) + covers[ coverId ].remove(); + covers = {}; + } + + var accessKeyProcessors = {}; + + var accessKeyDownHandler = function( evt ) { + var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey, + alt = evt.data.$.altKey, + shift = evt.data.$.shiftKey, + key = String.fromCharCode( evt.data.$.keyCode ), + keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ]; + + if ( !keyProcessor || !keyProcessor.length ) + return; + + keyProcessor = keyProcessor[ keyProcessor.length - 1 ]; + keyProcessor.keydown && keyProcessor.keydown.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key ); + evt.data.preventDefault(); + }; + + var accessKeyUpHandler = function( evt ) { + var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey, + alt = evt.data.$.altKey, + shift = evt.data.$.shiftKey, + key = String.fromCharCode( evt.data.$.keyCode ), + keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ]; + + if ( !keyProcessor || !keyProcessor.length ) + return; + + keyProcessor = keyProcessor[ keyProcessor.length - 1 ]; + if ( keyProcessor.keyup ) { + keyProcessor.keyup.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key ); + evt.data.preventDefault(); + } + }; + + var registerAccessKey = function( uiElement, dialog, key, downFunc, upFunc ) { + var procList = accessKeyProcessors[ key ] || ( accessKeyProcessors[ key ] = [] ); + procList.push( { + uiElement: uiElement, + dialog: dialog, + key: key, + keyup: upFunc || uiElement.accessKeyUp, + keydown: downFunc || uiElement.accessKeyDown + } ); + }; + + var unregisterAccessKey = function( obj ) { + for ( var i in accessKeyProcessors ) { + var list = accessKeyProcessors[ i ]; + for ( var j = list.length - 1; j >= 0; j-- ) { + if ( list[ j ].dialog == obj || list[ j ].uiElement == obj ) + list.splice( j, 1 ); + } + if ( list.length === 0 ) + delete accessKeyProcessors[ i ]; + } + }; + + var tabAccessKeyUp = function( dialog, key ) { + if ( dialog._.accessKeyMap[ key ] ) + dialog.selectPage( dialog._.accessKeyMap[ key ] ); + }; + + var tabAccessKeyDown = function() {}; + + ( function() { + CKEDITOR.ui.dialog = { + /** + * The base class of all dialog UI elements. + * + * @class CKEDITOR.ui.dialog.uiElement + * @constructor Creates a uiElement class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element + * definition. + * + * Accepted fields: + * + * * `id` (Required) The id of the UI element. See {@link CKEDITOR.dialog#getContentElement}. + * * `type` (Required) The type of the UI element. The + * value to this field specifies which UI element class will be used to + * generate the final widget. + * * `title` (Optional) The popup tooltip for the UI + * element. + * * `hidden` (Optional) A flag that tells if the element + * should be initially visible. + * * `className` (Optional) Additional CSS class names + * to add to the UI element. Separated by space. + * * `style` (Optional) Additional CSS inline styles + * to add to the UI element. A semicolon (;) is required after the last + * style declaration. + * * `accessKey` (Optional) The alphanumeric access key + * for this element. Access keys are automatically prefixed by CTRL. + * * `on*` (Optional) Any UI element definition field that + * starts with `on` followed immediately by a capital letter and + * probably more letters is an event handler. Event handlers may be further + * divided into registered event handlers and DOM event handlers. Please + * refer to {@link CKEDITOR.ui.dialog.uiElement#registerEvents} and + * {@link CKEDITOR.ui.dialog.uiElement#eventProcessors} for more information. + * + * @param {Array} htmlList + * List of HTML code to be added to the dialog's content area. + * @param {Function/String} [nodeNameArg='div'] + * A function returning a string, or a simple string for the node name for + * the root DOM node. + * @param {Function/Object} [stylesArg={}] + * A function returning an object, or a simple object for CSS styles applied + * to the DOM node. + * @param {Function/Object} [attributesArg={}] + * A fucntion returning an object, or a simple object for attributes applied + * to the DOM node. + * @param {Function/String} [contentsArg=''] + * A function returning a string, or a simple string for the HTML code inside + * the root DOM node. Default is empty string. + */ + uiElement: function( dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg ) { + if ( arguments.length < 4 ) + return; + + var nodeName = ( nodeNameArg.call ? nodeNameArg( elementDefinition ) : nodeNameArg ) || 'div', + html = [ '<', nodeName, ' ' ], + styles = ( stylesArg && stylesArg.call ? stylesArg( elementDefinition ) : stylesArg ) || {}, + attributes = ( attributesArg && attributesArg.call ? attributesArg( elementDefinition ) : attributesArg ) || {}, + innerHTML = ( contentsArg && contentsArg.call ? contentsArg.call( this, dialog, elementDefinition ) : contentsArg ) || '', + domId = this.domId = attributes.id || CKEDITOR.tools.getNextId() + '_uiElement', + i; + + if ( elementDefinition.requiredContent && !dialog.getParentEditor().filter.check( elementDefinition.requiredContent ) ) { + styles.display = 'none'; + this.notAllowed = true; + } + + // Set the id, a unique id is required for getElement() to work. + attributes.id = domId; + + // Set the type and definition CSS class names. + var classes = {}; + if ( elementDefinition.type ) + classes[ 'cke_dialog_ui_' + elementDefinition.type ] = 1; + if ( elementDefinition.className ) + classes[ elementDefinition.className ] = 1; + if ( elementDefinition.disabled ) + classes.cke_disabled = 1; + + var attributeClasses = ( attributes[ 'class' ] && attributes[ 'class' ].split ) ? attributes[ 'class' ].split( ' ' ) : []; + for ( i = 0; i < attributeClasses.length; i++ ) { + if ( attributeClasses[ i ] ) + classes[ attributeClasses[ i ] ] = 1; + } + var finalClasses = []; + for ( i in classes ) + finalClasses.push( i ); + attributes[ 'class' ] = finalClasses.join( ' ' ); + + // Set the popup tooltop. + if ( elementDefinition.title ) + attributes.title = elementDefinition.title; + + // Write the inline CSS styles. + var styleStr = ( elementDefinition.style || '' ).split( ';' ); + + // Element alignment support. + if ( elementDefinition.align ) { + var align = elementDefinition.align; + styles[ 'margin-left' ] = align == 'left' ? 0 : 'auto'; + styles[ 'margin-right' ] = align == 'right' ? 0 : 'auto'; + } + + for ( i in styles ) + styleStr.push( i + ':' + styles[ i ] ); + if ( elementDefinition.hidden ) + styleStr.push( 'display:none' ); + for ( i = styleStr.length - 1; i >= 0; i-- ) { + if ( styleStr[ i ] === '' ) + styleStr.splice( i, 1 ); + } + if ( styleStr.length > 0 ) + attributes.style = ( attributes.style ? ( attributes.style + '; ' ) : '' ) + styleStr.join( '; ' ); + + // Write the attributes. + for ( i in attributes ) + html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[ i ] ) + '" ' ); + + // Write the content HTML. + html.push( '>', innerHTML, '' ); + + // Add contents to the parent HTML array. + htmlList.push( html.join( '' ) ); + + ( this._ || ( this._ = {} ) ).dialog = dialog; + + // Override isChanged if it is defined in element definition. + if ( typeof elementDefinition.isChanged == 'boolean' ) + this.isChanged = function() { + return elementDefinition.isChanged; + }; + if ( typeof elementDefinition.isChanged == 'function' ) + this.isChanged = elementDefinition.isChanged; + + // Overload 'get(set)Value' on definition. + if ( typeof elementDefinition.setValue == 'function' ) { + this.setValue = CKEDITOR.tools.override( this.setValue, function( org ) { + return function( val ) { + org.call( this, elementDefinition.setValue.call( this, val ) ); + }; + } ); + } + + if ( typeof elementDefinition.getValue == 'function' ) { + this.getValue = CKEDITOR.tools.override( this.getValue, function( org ) { + return function() { + return elementDefinition.getValue.call( this, org.call( this ) ); + }; + } ); + } + + // Add events. + CKEDITOR.event.implementOn( this ); + + this.registerEvents( elementDefinition ); + if ( this.accessKeyUp && this.accessKeyDown && elementDefinition.accessKey ) + registerAccessKey( this, dialog, 'CTRL+' + elementDefinition.accessKey ); + + var me = this; + dialog.on( 'load', function() { + var input = me.getInputElement(); + if ( input ) { + var focusClass = me.type in { 'checkbox': 1, 'ratio': 1 } && CKEDITOR.env.ie && CKEDITOR.env.version < 8 ? 'cke_dialog_ui_focused' : ''; + input.on( 'focus', function() { + dialog._.tabBarMode = false; + dialog._.hasFocus = true; + me.fire( 'focus' ); + focusClass && this.addClass( focusClass ); + + } ); + + input.on( 'blur', function() { + me.fire( 'blur' ); + focusClass && this.removeClass( focusClass ); + } ); + } + } ); + + // Completes this object with everything we have in the + // definition. + CKEDITOR.tools.extend( this, elementDefinition ); + + // Register the object as a tab focus if it can be included. + if ( this.keyboardFocusable ) { + this.tabIndex = elementDefinition.tabIndex || 0; + + this.focusIndex = dialog._.focusList.push( this ) - 1; + this.on( 'focus', function() { + dialog._.currentFocusIndex = me.focusIndex; + } ); + } + }, + + /** + * Horizontal layout box for dialog UI elements, auto-expends to available width of container. + * + * @class CKEDITOR.ui.dialog.hbox + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a hbox class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog object. + * @param {Array} childObjList + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * @param {Array} childHtmlList + * Array of HTML code that correspond to the HTML output of all the + * objects in childObjList. + * @param {Array} htmlList + * Array of HTML code that this element will output to. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `widths` (Optional) The widths of child cells. + * * `height` (Optional) The height of the layout. + * * `padding` (Optional) The padding width inside child cells. + * * `align` (Optional) The alignment of the whole layout. + */ + hbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { + if ( arguments.length < 4 ) + return; + + this._ || ( this._ = {} ); + + var children = this._.children = childObjList, + widths = elementDefinition && elementDefinition.widths || null, + height = elementDefinition && elementDefinition.height || null, + styles = {}, + i; + /** @ignore */ + var innerHTML = function() { + var html = [ '' ]; + for ( i = 0; i < childHtmlList.length; i++ ) { + var className = 'cke_dialog_ui_hbox_child', + styles = []; + if ( i === 0 ) { + className = 'cke_dialog_ui_hbox_first'; + } + if ( i == childHtmlList.length - 1 ) { + className = 'cke_dialog_ui_hbox_last'; + } + + html.push( ' 0 ) { + html.push( 'style="' + styles.join( '; ' ) + '" ' ); + } + html.push( '>', childHtmlList[ i ], '' ); + } + html.push( '' ); + return html.join( '' ); + }; + + var attribs = { role: 'presentation' }; + elementDefinition && elementDefinition.align && ( attribs.align = elementDefinition.align ); + + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'hbox' }, htmlList, 'table', styles, attribs, innerHTML ); + }, + + /** + * Vertical layout box for dialog UI elements. + * + * @class CKEDITOR.ui.dialog.vbox + * @extends CKEDITOR.ui.dialog.hbox + * @constructor Creates a vbox class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog object. + * @param {Array} childObjList + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * @param {Array} childHtmlList + * Array of HTML code that correspond to the HTML output of all the + * objects in childObjList. + * @param {Array} htmlList Array of HTML code that this element will output to. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `width` (Optional) The width of the layout. + * * `heights` (Optional) The heights of individual cells. + * * `align` (Optional) The alignment of the layout. + * * `padding` (Optional) The padding width inside child cells. + * * `expand` (Optional) Whether the layout should expand + * vertically to fill its container. + */ + vbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { + if ( arguments.length < 3 ) + return; + + this._ || ( this._ = {} ); + + var children = this._.children = childObjList, + width = elementDefinition && elementDefinition.width || null, + heights = elementDefinition && elementDefinition.heights || null; + /** @ignore */ + var innerHTML = function() { + var html = [ '' ); + for ( var i = 0; i < childHtmlList.length; i++ ) { + var styles = []; + html.push( '' ); + } + html.push( '
0 ) + html.push( 'style="', styles.join( '; ' ), '" ' ); + html.push( ' class="cke_dialog_ui_vbox_child">', childHtmlList[ i ], '
' ); + return html.join( '' ); + }; + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'vbox' }, htmlList, 'div', null, { role: 'presentation' }, innerHTML ); + } + }; + } )(); + + /** @class CKEDITOR.ui.dialog.uiElement */ + CKEDITOR.ui.dialog.uiElement.prototype = { + /** + * Gets the root DOM element of this dialog UI object. + * + * uiElement.getElement().hide(); + * + * @returns {CKEDITOR.dom.element} Root DOM element of UI object. + */ + getElement: function() { + return CKEDITOR.document.getById( this.domId ); + }, + + /** + * Gets the DOM element that the user inputs values. + * + * This function is used by {@link #setValue}, {@link #getValue} and {@link #focus}. It should + * be overrided in child classes where the input element isn't the root + * element. + * + * var rawValue = textInput.getInputElement().$.value; + * + * @returns {CKEDITOR.dom.element} The element where the user input values. + */ + getInputElement: function() { + return this.getElement(); + }, + + /** + * Gets the parent dialog object containing this UI element. + * + * var dialog = uiElement.getDialog(); + * + * @returns {CKEDITOR.dialog} Parent dialog object. + */ + getDialog: function() { + return this._.dialog; + }, + + /** + * Sets the value of this dialog UI object. + * + * uiElement.setValue( 'Dingo' ); + * + * @chainable + * @param {Object} value The new value. + * @param {Boolean} noChangeEvent Internal commit, to supress `change` event on this element. + */ + setValue: function( value, noChangeEvent ) { + this.getInputElement().setValue( value ); + !noChangeEvent && this.fire( 'change', { value: value } ); + return this; + }, + + /** + * Gets the current value of this dialog UI object. + * + * var myValue = uiElement.getValue(); + * + * @returns {Object} The current value. + */ + getValue: function() { + return this.getInputElement().getValue(); + }, + + /** + * Tells whether the UI object's value has changed. + * + * if ( uiElement.isChanged() ) + * confirm( 'Value changed! Continue?' ); + * + * @returns {Boolean} `true` if changed, `false` if not changed. + */ + isChanged: function() { + // Override in input classes. + return false; + }, + + /** + * Selects the parent tab of this element. Usually called by focus() or overridden focus() methods. + * + * focus : function() { + * this.selectParentTab(); + * // do something else. + * } + * + * @chainable + */ + selectParentTab: function() { + var element = this.getInputElement(), + cursor = element, + tabId; + while ( ( cursor = cursor.getParent() ) && cursor.$.className.search( 'cke_dialog_page_contents' ) == -1 ) { + + } + + // Some widgets don't have parent tabs (e.g. OK and Cancel buttons). + if ( !cursor ) + return this; + + tabId = cursor.getAttribute( 'name' ); + // Avoid duplicate select. + if ( this._.dialog._.currentTabId != tabId ) + this._.dialog.selectPage( tabId ); + return this; + }, + + /** + * Puts the focus to the UI object. Switches tabs if the UI object isn't in the active tab page. + * + * uiElement.focus(); + * + * @chainable + */ + focus: function() { + this.selectParentTab().getInputElement().focus(); + return this; + }, + + /** + * Registers the `on*` event handlers defined in the element definition. + * + * The default behavior of this function is: + * + * 1. If the on* event is defined in the class's eventProcesors list, + * then the registration is delegated to the corresponding function + * in the eventProcessors list. + * 2. If the on* event is not defined in the eventProcessors list, then + * register the event handler under the corresponding DOM event of + * the UI element's input DOM element (as defined by the return value + * of {@link #getInputElement}). + * + * This function is only called at UI element instantiation, but can + * be overridded in child classes if they require more flexibility. + * + * @chainable + * @param {CKEDITOR.dialog.definition.uiElement} definition The UI element + * definition. + */ + registerEvents: function( definition ) { + var regex = /^on([A-Z]\w+)/, + match; + + var registerDomEvent = function( uiElement, dialog, eventName, func ) { + dialog.on( 'load', function() { + uiElement.getInputElement().on( eventName, func, uiElement ); + } ); + }; + + for ( var i in definition ) { + if ( !( match = i.match( regex ) ) ) + continue; + if ( this.eventProcessors[ i ] ) + this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] ); + else + registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] ); + } + + return this; + }, + + /** + * The event processor list used by + * {@link CKEDITOR.ui.dialog.uiElement#getInputElement} at UI element + * instantiation. The default list defines three `on*` events: + * + * 1. `onLoad` - Called when the element's parent dialog opens for the + * first time. + * 2. `onShow` - Called whenever the element's parent dialog opens. + * 3. `onHide` - Called whenever the element's parent dialog closes. + * + * // This connects the 'click' event in CKEDITOR.ui.dialog.button to onClick + * // handlers in the UI element's definitions. + * CKEDITOR.ui.dialog.button.eventProcessors = CKEDITOR.tools.extend( {}, + * CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, + * { onClick : function( dialog, func ) { this.on( 'click', func ); } }, + * true + * ); + * + * @property {Object} + */ + eventProcessors: { + onLoad: function( dialog, func ) { + dialog.on( 'load', func, this ); + }, + + onShow: function( dialog, func ) { + dialog.on( 'show', func, this ); + }, + + onHide: function( dialog, func ) { + dialog.on( 'hide', func, this ); + } + }, + + /** + * The default handler for a UI element's access key down event, which + * tries to put focus to the UI element. + * + * Can be overridded in child classes for more sophisticaed behavior. + * + * @param {CKEDITOR.dialog} dialog The parent dialog object. + * @param {String} key The key combination pressed. Since access keys + * are defined to always include the `CTRL` key, its value should always + * include a `'CTRL+'` prefix. + */ + accessKeyDown: function() { + this.focus(); + }, + + /** + * The default handler for a UI element's access key up event, which + * does nothing. + * + * Can be overridded in child classes for more sophisticated behavior. + * + * @param {CKEDITOR.dialog} dialog The parent dialog object. + * @param {String} key The key combination pressed. Since access keys + * are defined to always include the `CTRL` key, its value should always + * include a `'CTRL+'` prefix. + */ + accessKeyUp: function() {}, + + /** + * Disables a UI element. + */ + disable: function() { + var element = this.getElement(), + input = this.getInputElement(); + input.setAttribute( 'disabled', 'true' ); + element.addClass( 'cke_disabled' ); + }, + + /** + * Enables a UI element. + */ + enable: function() { + var element = this.getElement(), + input = this.getInputElement(); + input.removeAttribute( 'disabled' ); + element.removeClass( 'cke_disabled' ); + }, + + /** + * Determines whether an UI element is enabled or not. + * + * @returns {Boolean} Whether the UI element is enabled. + */ + isEnabled: function() { + return !this.getElement().hasClass( 'cke_disabled' ); + }, + + /** + * Determines whether an UI element is visible or not. + * + * @returns {Boolean} Whether the UI element is visible. + */ + isVisible: function() { + return this.getInputElement().isVisible(); + }, + + /** + * Determines whether an UI element is focus-able or not. + * Focus-able is defined as being both visible and enabled. + * + * @returns {Boolean} Whether the UI element can be focused. + */ + isFocusable: function() { + if ( !this.isEnabled() || !this.isVisible() ) + return false; + return true; + } + }; + + /** @class CKEDITOR.ui.dialog.hbox */ + CKEDITOR.ui.dialog.hbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), { + /** + * Gets a child UI element inside this container. + * + * var checkbox = hbox.getChild( [0,1] ); + * checkbox.setValue( true ); + * + * @param {Array/Number} indices An array or a single number to indicate the child's + * position in the container's descendant tree. Omit to get all the children in an array. + * @returns {Array/CKEDITOR.ui.dialog.uiElement} Array of all UI elements in the container + * if no argument given, or the specified UI element if indices is given. + */ + getChild: function( indices ) { + // If no arguments, return a clone of the children array. + if ( arguments.length < 1 ) + return this._.children.concat(); + + // If indices isn't array, make it one. + if ( !indices.splice ) + indices = [ indices ]; + + // Retrieve the child element according to tree position. + if ( indices.length < 2 ) + return this._.children[ indices[ 0 ] ]; + else + return ( this._.children[ indices[ 0 ] ] && this._.children[ indices[ 0 ] ].getChild ) ? this._.children[ indices[ 0 ] ].getChild( indices.slice( 1, indices.length ) ) : null; + } + }, true ); + + CKEDITOR.ui.dialog.vbox.prototype = new CKEDITOR.ui.dialog.hbox(); + + ( function() { + var commonBuilder = { + build: function( dialog, elementDefinition, output ) { + var children = elementDefinition.children, + child, + childHtmlList = [], + childObjList = []; + for ( var i = 0; + ( i < children.length && ( child = children[ i ] ) ); i++ ) { + var childHtml = []; + childHtmlList.push( childHtml ); + childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); + } + return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); + } + }; + + CKEDITOR.dialog.addUIElement( 'hbox', commonBuilder ); + CKEDITOR.dialog.addUIElement( 'vbox', commonBuilder ); + } )(); + + /** + * Generic dialog command. It opens a specific dialog when executed. + * + * // Register the "link" command, which opens the "link" dialog. + * editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) ); + * + * @class + * @constructor Creates a dialogCommand class instance. + * @extends CKEDITOR.commandDefinition + * @param {String} dialogName The name of the dialog to open when executing + * this command. + * @param {Object} [ext] Additional command definition's properties. + */ + CKEDITOR.dialogCommand = function( dialogName, ext ) { + this.dialogName = dialogName; + CKEDITOR.tools.extend( this, ext, true ); + }; + + CKEDITOR.dialogCommand.prototype = { + exec: function( editor ) { + editor.openDialog( this.dialogName ); + }, + + // Dialog commands just open a dialog ui, thus require no undo logic, + // undo support should dedicate to specific dialog implementation. + canUndo: false, + + editorFocus: 1 + }; + + ( function() { + var notEmptyRegex = /^([a]|[^a])+$/, + integerRegex = /^\d*$/, + numberRegex = /^\d*(?:\.\d+)?$/, + htmlLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/, + cssLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i, + inlineStyleRegex = /^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/; + + CKEDITOR.VALIDATE_OR = 1; + CKEDITOR.VALIDATE_AND = 2; + + CKEDITOR.dialog.validate = { + functions: function() { + var args = arguments; + return function() { + /** + * It's important for validate functions to be able to accept the value + * as argument in addition to this.getValue(), so that it is possible to + * combine validate functions together to make more sophisticated + * validators. + */ + var value = this && this.getValue ? this.getValue() : args[ 0 ]; + + var msg, + relation = CKEDITOR.VALIDATE_AND, + functions = [], + i; + + for ( i = 0; i < args.length; i++ ) { + if ( typeof args[ i ] == 'function' ) + functions.push( args[ i ] ); + else + break; + } + + if ( i < args.length && typeof args[ i ] == 'string' ) { + msg = args[ i ]; + i++; + } + + if ( i < args.length && typeof args[ i ] == 'number' ) + relation = args[ i ]; + + var passed = ( relation == CKEDITOR.VALIDATE_AND ? true : false ); + for ( i = 0; i < functions.length; i++ ) { + if ( relation == CKEDITOR.VALIDATE_AND ) + passed = passed && functions[ i ]( value ); + else + passed = passed || functions[ i ]( value ); + } + + return !passed ? msg : true; + }; + }, + + regex: function( regex, msg ) { + /* + * Can be greatly shortened by deriving from functions validator if code size + * turns out to be more important than performance. + */ + return function() { + var value = this && this.getValue ? this.getValue() : arguments[ 0 ]; + return !regex.test( value ) ? msg : true; + }; + }, + + notEmpty: function( msg ) { + return this.regex( notEmptyRegex, msg ); + }, + + integer: function( msg ) { + return this.regex( integerRegex, msg ); + }, + + 'number': function( msg ) { + return this.regex( numberRegex, msg ); + }, + + 'cssLength': function( msg ) { + return this.functions( function( val ) { + return cssLengthRegex.test( CKEDITOR.tools.trim( val ) ); + }, msg ); + }, + + 'htmlLength': function( msg ) { + return this.functions( function( val ) { + return htmlLengthRegex.test( CKEDITOR.tools.trim( val ) ); + }, msg ); + }, + + 'inlineStyle': function( msg ) { + return this.functions( function( val ) { + return inlineStyleRegex.test( CKEDITOR.tools.trim( val ) ); + }, msg ); + }, + + equals: function( value, msg ) { + return this.functions( function( val ) { + return val == value; + }, msg ); + }, + + notEqual: function( value, msg ) { + return this.functions( function( val ) { + return val != value; + }, msg ); + } + }; + + CKEDITOR.on( 'instanceDestroyed', function( evt ) { + // Remove dialog cover on last instance destroy. + if ( CKEDITOR.tools.isEmpty( CKEDITOR.instances ) ) { + var currentTopDialog; + while ( ( currentTopDialog = CKEDITOR.dialog._.currentTop ) ) + currentTopDialog.hide(); + removeCovers(); + } + + var dialogs = evt.editor._.storedDialogs; + for ( var name in dialogs ) + dialogs[ name ].destroy(); + + } ); + + } )(); + + // Extend the CKEDITOR.editor class with dialog specific functions. + CKEDITOR.tools.extend( CKEDITOR.editor.prototype, { + /** + * Loads and opens a registered dialog. + * + * CKEDITOR.instances.editor1.openDialog( 'smiley' ); + * + * @member CKEDITOR.editor + * @param {String} dialogName The registered name of the dialog. + * @param {Function} callback The function to be invoked after dialog instance created. + * @returns {CKEDITOR.dialog} The dialog object corresponding to the dialog displayed. + * `null` if the dialog name is not registered. + * @see CKEDITOR.dialog#add + */ + openDialog: function( dialogName, callback ) { + var dialog = null, dialogDefinitions = CKEDITOR.dialog._.dialogDefinitions[ dialogName ]; + + if ( CKEDITOR.dialog._.currentTop === null ) + showCover( this ); + + // If the dialogDefinition is already loaded, open it immediately. + if ( typeof dialogDefinitions == 'function' ) { + var storedDialogs = this._.storedDialogs || ( this._.storedDialogs = {} ); + + dialog = storedDialogs[ dialogName ] || ( storedDialogs[ dialogName ] = new CKEDITOR.dialog( this, dialogName ) ); + + callback && callback.call( dialog, dialog ); + dialog.show(); + + } else if ( dialogDefinitions == 'failed' ) { + hideCover( this ); + throw new Error( '[CKEDITOR.dialog.openDialog] Dialog "' + dialogName + '" failed when loading definition.' ); + } else if ( typeof dialogDefinitions == 'string' ) { + + CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( dialogDefinitions ), + function() { + var dialogDefinition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ]; + // In case of plugin error, mark it as loading failed. + if ( typeof dialogDefinition != 'function' ) + CKEDITOR.dialog._.dialogDefinitions[ dialogName ] = 'failed'; + + this.openDialog( dialogName, callback ); + }, this, 0, 1 ); + } + + CKEDITOR.skin.loadPart( 'dialog' ); + + return dialog; + } + } ); +} )(); + +CKEDITOR.plugins.add( 'dialog', { + requires: 'dialogui', + init: function( editor ) { + editor.on( 'doubleclick', function( evt ) { + if ( evt.data.dialog ) + editor.openDialog( evt.data.dialog ); + }, null, null, 999 ); + } +} ); + +// Dialog related configurations. + +/** + * The color of the dialog background cover. It should be a valid CSS color string. + * + * config.dialog_backgroundCoverColor = 'rgb(255, 254, 253)'; + * + * @cfg {String} [dialog_backgroundCoverColor='white'] + * @member CKEDITOR.config + */ + +/** + * The opacity of the dialog background cover. It should be a number within the + * range `[0.0, 1.0]`. + * + * config.dialog_backgroundCoverOpacity = 0.7; + * + * @cfg {Number} [dialog_backgroundCoverOpacity=0.5] + * @member CKEDITOR.config + */ + +/** + * If the dialog has more than one tab, put focus into the first tab as soon as dialog is opened. + * + * config.dialog_startupFocusTab = true; + * + * @cfg {Boolean} [dialog_startupFocusTab=false] + * @member CKEDITOR.config + */ + +/** + * The distance of magnetic borders used in moving and resizing dialogs, + * measured in pixels. + * + * config.dialog_magnetDistance = 30; + * + * @cfg {Number} [dialog_magnetDistance=20] + * @member CKEDITOR.config + */ + +/** + * The guideline to follow when generating the dialog buttons. There are 3 possible options: + * + * * `'OS'` - the buttons will be displayed in the default order of the user's OS; + * * `'ltr'` - for Left-To-Right order; + * * `'rtl'` - for Right-To-Left order. + * + * Example: + * + * config.dialog_buttonsOrder = 'rtl'; + * + * @since 3.5 + * @cfg {String} [dialog_buttonsOrder='OS'] + * @member CKEDITOR.config + */ + +/** + * The dialog contents to removed. It's a string composed by dialog name and tab name with a colon between them. + * + * Separate each pair with semicolon (see example). + * + * **Note:** All names are case-sensitive. + * + * **Note:** Be cautious when specifying dialog tabs that are mandatory, + * like `'info'`, dialog functionality might be broken because of this! + * + * config.removeDialogTabs = 'flash:advanced;image:Link'; + * + * @since 3.5 + * @cfg {String} [removeDialogTabs=''] + * @member CKEDITOR.config + */ + +/** + * Tells if user should not be asked to confirm close, if any dialog field was modified. + * By default it is set to `false` meaning that the confirmation dialog will be shown. + * + * config.dialog_noConfirmCancel = true; + * + * @since 4.3 + * @cfg {Boolean} [dialog_noConfirmCancel=false] + * @member CKEDITOR.config + */ + +/** + * Event fired when a dialog definition is about to be used to create a dialog into + * an editor instance. This event makes it possible to customize the definition + * before creating it. + * + * Note that this event is called only the first time a specific dialog is + * opened. Successive openings will use the cached dialog, and this event will + * not get fired. + * + * @event dialogDefinition + * @member CKEDITOR + * @param {CKEDITOR.dialog.definition} data The dialog defination that + * is being loaded. + * @param {CKEDITOR.editor} editor The editor instance that will use the dialog. + */ + +/** + * Event fired when a tab is going to be selected in a dialog. + * + * @event selectPage + * @member CKEDITOR.dialog + * @param data + * @param {String} data.page The id of the page that it's gonna be selected. + * @param {String} data.currentPage The id of the current page. + */ + +/** + * Event fired when the user tries to dismiss a dialog. + * + * @event cancel + * @member CKEDITOR.dialog + * @param data + * @param {Boolean} data.hide Whether the event should proceed or not. + */ + +/** + * Event fired when the user tries to confirm a dialog. + * + * @event ok + * @member CKEDITOR.dialog + * @param data + * @param {Boolean} data.hide Whether the event should proceed or not. + */ + +/** + * Event fired when a dialog is shown. + * + * @event show + * @member CKEDITOR.dialog + */ + +/** + * Event fired when a dialog is shown. + * + * @event dialogShow + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param {CKEDITOR.dialog} data The opened dialog instance. + */ + +/** + * Event fired when a dialog is hidden. + * + * @event hide + * @member CKEDITOR.dialog + */ + +/** + * Event fired when a dialog is hidden. + * + * @event dialogHide + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param {CKEDITOR.dialog} data The hidden dialog instance. + */ + +/** + * Event fired when a dialog is being resized. The event is fired on + * both the {@link CKEDITOR.dialog} object and the dialog instance + * since 3.5.3, previously it was only available in the global object. + * + * @static + * @event resize + * @member CKEDITOR.dialog + * @param data + * @param {CKEDITOR.dialog} data.dialog The dialog being resized (if + * it is fired on the dialog itself, this parameter is not sent). + * @param {String} data.skin The skin name. + * @param {Number} data.width The new width. + * @param {Number} data.height The new height. + */ + +/** + * Event fired when a dialog is being resized. The event is fired on + * both the {@link CKEDITOR.dialog} object and the dialog instance + * since 3.5.3, previously it was only available in the global object. + * + * @since 3.5 + * @event resize + * @member CKEDITOR.dialog + * @param data + * @param {Number} data.width The new width. + * @param {Number} data.height The new height. + */ + +/** + * Event fired when the dialog state changes, usually by {@link CKEDITOR.dialog#setState}. + * + * @since 4.5 + * @event state + * @member CKEDITOR.dialog + * @param data + * @param {Number} data The new state. Either {@link CKEDITOR#DIALOG_STATE_IDLE} or {@link CKEDITOR#DIALOG_STATE_BUSY}. + */ diff --git a/sources/plugins/dialog/samples/assets/my_dialog.js b/sources/plugins/dialog/samples/assets/my_dialog.js new file mode 100644 index 0000000..6239dea --- /dev/null +++ b/sources/plugins/dialog/samples/assets/my_dialog.js @@ -0,0 +1,49 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'myDialog', function() { + return { + title: 'My Dialog', + minWidth: 400, + minHeight: 200, + contents: [ + { + id: 'tab1', + label: 'First Tab', + title: 'First Tab', + elements: [ + { + id: 'input1', + type: 'text', + label: 'Text Field' + }, + { + id: 'select1', + type: 'select', + label: 'Select Field', + items: [ + [ 'option1', 'value1' ], + [ 'option2', 'value2' ] + ] + } + ] + }, + { + id: 'tab2', + label: 'Second Tab', + title: 'Second Tab', + elements: [ + { + id: 'button1', + type: 'button', + label: 'Button Field' + } + ] + } + ] + }; +} ); + +// %LEAVE_UNMINIFIED% %REMOVE_LINE% diff --git a/sources/plugins/dialog/samples/dialog.html b/sources/plugins/dialog/samples/dialog.html new file mode 100644 index 0000000..0f22a1a --- /dev/null +++ b/sources/plugins/dialog/samples/dialog.html @@ -0,0 +1,190 @@ + + + + + + Using API to Customize Dialog Windows — CKEditor Sample + + + + + + + + + +

+ CKEditor Samples » Using CKEditor Dialog API +

+
+ This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK. +
+
+

+ This sample shows how to use the + CKEditor Dialog API + to customize CKEditor dialog windows without changing the original editor code. + The following customizations are being done in the example below: +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+

A custom dialog is added to the editors using the pluginsLoaded event, from an external dialog definition file:

+
    +
  1. Creating a custom dialog window – "My Dialog" dialog window opened with the "My Dialog" toolbar button.
  2. +
  3. Creating a custom button – Add button to open the dialog with "My Dialog" toolbar button.
  4. +
+ + +

The below editor modify the dialog definition of the above added dialog using the dialogDefinition event:

+
    +
  1. Adding dialog tab – Add new tab "My Tab" to dialog window.
  2. +
  3. Removing a dialog window tab – Remove "Second Tab" page from the dialog window.
  4. +
  5. Adding dialog window fields – Add "My Custom Field" to the dialog window.
  6. +
  7. Removing dialog window field – Remove "Select Field" selection field from the dialog window.
  8. +
  9. Setting default values for dialog window fields – Set default value of "Text Field" text field.
  10. +
  11. Setup initial focus for dialog window – Put initial focus on "My Custom Field" text field.
  12. +
+ + + + + diff --git a/sources/plugins/dialogadvtab/plugin.js b/sources/plugins/dialogadvtab/plugin.js new file mode 100644 index 0000000..460b534 --- /dev/null +++ b/sources/plugins/dialogadvtab/plugin.js @@ -0,0 +1,196 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +( function() { + + function setupAdvParams( element ) { + var attrName = this.att; + + var value = element && element.hasAttribute( attrName ) && element.getAttribute( attrName ) || ''; + + if ( value !== undefined ) + this.setValue( value ); + } + + function commitAdvParams() { + // Dialogs may use different parameters in the commit list, so, by + // definition, we take the first CKEDITOR.dom.element available. + var element; + + for ( var i = 0; i < arguments.length; i++ ) { + if ( arguments[ i ] instanceof CKEDITOR.dom.element ) { + element = arguments[ i ]; + break; + } + } + + if ( element ) { + var attrName = this.att, + value = this.getValue(); + + if ( value ) + element.setAttribute( attrName, value ); + else + element.removeAttribute( attrName, value ); + } + } + + var defaultTabConfig = { id: 1, dir: 1, classes: 1, styles: 1 }; + + CKEDITOR.plugins.add( 'dialogadvtab', { + requires: 'dialog', + + // Returns allowed content rule for the content created by this plugin. + allowedContent: function( tabConfig ) { + if ( !tabConfig ) + tabConfig = defaultTabConfig; + + var allowedAttrs = []; + if ( tabConfig.id ) + allowedAttrs.push( 'id' ); + if ( tabConfig.dir ) + allowedAttrs.push( 'dir' ); + + var allowed = ''; + + if ( allowedAttrs.length ) + allowed += '[' + allowedAttrs.join( ',' ) + ']'; + + if ( tabConfig.classes ) + allowed += '(*)'; + if ( tabConfig.styles ) + allowed += '{*}'; + + return allowed; + }, + + // @param tabConfig + // id, dir, classes, styles + createAdvancedTab: function( editor, tabConfig, element ) { + if ( !tabConfig ) + tabConfig = defaultTabConfig; + + var lang = editor.lang.common; + + var result = { + id: 'advanced', + label: lang.advancedTab, + title: lang.advancedTab, + elements: [ { + type: 'vbox', + padding: 1, + children: [] + } ] + }; + + var contents = []; + + if ( tabConfig.id || tabConfig.dir ) { + if ( tabConfig.id ) { + contents.push( { + id: 'advId', + att: 'id', + type: 'text', + requiredContent: element ? element + '[id]' : null, + label: lang.id, + setup: setupAdvParams, + commit: commitAdvParams + } ); + } + + if ( tabConfig.dir ) { + contents.push( { + id: 'advLangDir', + att: 'dir', + type: 'select', + requiredContent: element ? element + '[dir]' : null, + label: lang.langDir, + 'default': '', + style: 'width:100%', + items: [ + [ lang.notSet, '' ], + [ lang.langDirLTR, 'ltr' ], + [ lang.langDirRTL, 'rtl' ] + ], + setup: setupAdvParams, + commit: commitAdvParams + } ); + } + + result.elements[ 0 ].children.push( { + type: 'hbox', + widths: [ '50%', '50%' ], + children: [].concat( contents ) + } ); + } + + if ( tabConfig.styles || tabConfig.classes ) { + contents = []; + + if ( tabConfig.styles ) { + contents.push( { + id: 'advStyles', + att: 'style', + type: 'text', + requiredContent: element ? element + '{cke-xyz}' : null, + label: lang.styles, + 'default': '', + + validate: CKEDITOR.dialog.validate.inlineStyle( lang.invalidInlineStyle ), + onChange: function() {}, + + getStyle: function( name, defaultValue ) { + var match = this.getValue().match( new RegExp( '(?:^|;)\\s*' + name + '\\s*:\\s*([^;]*)', 'i' ) ); + return match ? match[ 1 ] : defaultValue; + }, + + updateStyle: function( name, value ) { + var styles = this.getValue(); + + var tmp = editor.document.createElement( 'span' ); + tmp.setAttribute( 'style', styles ); + tmp.setStyle( name, value ); + styles = CKEDITOR.tools.normalizeCssText( tmp.getAttribute( 'style' ) ); + + this.setValue( styles, 1 ); + }, + + setup: setupAdvParams, + + commit: commitAdvParams + + } ); + } + + if ( tabConfig.classes ) { + contents.push( { + type: 'hbox', + widths: [ '45%', '55%' ], + children: [ { + id: 'advCSSClasses', + att: 'class', + type: 'text', + requiredContent: element ? element + '(cke-xyz)' : null, + label: lang.cssClasses, + 'default': '', + setup: setupAdvParams, + commit: commitAdvParams + + } ] + } ); + } + + result.elements[ 0 ].children.push( { + type: 'hbox', + widths: [ '50%', '50%' ], + children: [].concat( contents ) + } ); + } + + return result; + } + } ); + +} )(); diff --git a/sources/plugins/dialogui/plugin.js b/sources/plugins/dialogui/plugin.js new file mode 100644 index 0000000..cf91407 --- /dev/null +++ b/sources/plugins/dialogui/plugin.js @@ -0,0 +1,1530 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The Dialog User Interface plugin. + */ + +CKEDITOR.plugins.add( 'dialogui', { + onLoad: function() { + + var initPrivateObject = function( elementDefinition ) { + this._ || ( this._ = {} ); + this._[ 'default' ] = this._.initValue = elementDefinition[ 'default' ] || ''; + this._.required = elementDefinition.required || false; + var args = [ this._ ]; + for ( var i = 1; i < arguments.length; i++ ) + args.push( arguments[ i ] ); + args.push( true ); + CKEDITOR.tools.extend.apply( CKEDITOR.tools, args ); + return this._; + }, + textBuilder = { + build: function( dialog, elementDefinition, output ) { + return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output ); + } + }, + commonBuilder = { + build: function( dialog, elementDefinition, output ) { + return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, elementDefinition, output ); + } + }, + containerBuilder = { + build: function( dialog, elementDefinition, output ) { + var children = elementDefinition.children, + child, + childHtmlList = [], + childObjList = []; + for ( var i = 0; + ( i < children.length && ( child = children[ i ] ) ); i++ ) { + var childHtml = []; + childHtmlList.push( childHtml ); + childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); + } + return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); + } + }, + commonPrototype = { + isChanged: function() { + return this.getValue() != this.getInitValue(); + }, + + reset: function( noChangeEvent ) { + this.setValue( this.getInitValue(), noChangeEvent ); + }, + + setInitValue: function() { + this._.initValue = this.getValue(); + }, + + resetInitValue: function() { + this._.initValue = this._[ 'default' ]; + }, + + getInitValue: function() { + return this._.initValue; + } + }, + commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, { + onChange: function( dialog, func ) { + if ( !this._.domOnChangeRegistered ) { + dialog.on( 'load', function() { + this.getInputElement().on( 'change', function() { + // Make sure 'onchange' doesn't get fired after dialog closed. (#5719) + if ( !dialog.parts.dialog.isVisible() ) + return; + + this.fire( 'change', { value: this.getValue() } ); + }, this ); + }, this ); + this._.domOnChangeRegistered = true; + } + + this.on( 'change', func ); + } + }, true ), + eventRegex = /^on([A-Z]\w+)/, + cleanInnerDefinition = function( def ) { + // An inner UI element should not have the parent's type, title or events. + for ( var i in def ) { + if ( eventRegex.test( i ) || i == 'title' || i == 'type' ) + delete def[ i ]; + } + return def; + }, + // @context {CKEDITOR.dialog.uiElement} UI element (textarea or textInput) + // @param {CKEDITOR.dom.event} evt + toggleBidiKeyUpHandler = function( evt ) { + var keystroke = evt.data.getKeystroke(); + + // ALT + SHIFT + Home for LTR direction. + if ( keystroke == CKEDITOR.SHIFT + CKEDITOR.ALT + 36 ) + this.setDirectionMarker( 'ltr' ); + + // ALT + SHIFT + End for RTL direction. + else if ( keystroke == CKEDITOR.SHIFT + CKEDITOR.ALT + 35 ) + this.setDirectionMarker( 'rtl' ); + }; + + CKEDITOR.tools.extend( CKEDITOR.ui.dialog, { + /** + * Base class for all dialog window elements with a textual label on the left. + * + * @class CKEDITOR.ui.dialog.labeledElement + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a labeledElement class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `label` (Required) The label string. + * * `labelLayout` (Optional) Put 'horizontal' here if the + * label element is to be laid out horizontally. Otherwise a vertical + * layout will be used. + * * `widths` (Optional) This applies only to horizontal + * layouts — a two-element array of lengths to specify the widths of the + * label and the content element. + * * `role` (Optional) Value for the `role` attribute. + * * `includeLabel` (Optional) If set to `true`, the `aria-labelledby` attribute + * will be included. + * + * @param {Array} htmlList The list of HTML code to output to. + * @param {Function} contentHtml + * A function returning the HTML code string to be added inside the content + * cell. + */ + labeledElement: function( dialog, elementDefinition, htmlList, contentHtml ) { + if ( arguments.length < 4 ) + return; + + var _ = initPrivateObject.call( this, elementDefinition ); + _.labelId = CKEDITOR.tools.getNextId() + '_label'; + this._.children = []; + + var innerHTML = function() { + var html = [], + requiredClass = elementDefinition.required ? ' cke_required' : ''; + if ( elementDefinition.labelLayout != 'horizontal' ) { + html.push( + '', + '' ); + } else { + var hboxDefinition = { + type: 'hbox', + widths: elementDefinition.widths, + padding: 0, + children: [ { + type: 'html', + html: '' + }, + { + type: 'html', + html: '' + + contentHtml.call( this, dialog, elementDefinition ) + + '' + } ] + }; + CKEDITOR.dialog._.uiElementBuilders.hbox.build( dialog, hboxDefinition, html ); + } + return html.join( '' ); + }; + var attributes = { role: elementDefinition.role || 'presentation' }; + + if ( elementDefinition.includeLabel ) + attributes[ 'aria-labelledby' ] = _.labelId; + + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'div', null, attributes, innerHTML ); + }, + + /** + * A text input with a label. This UI element class represents both the + * single-line text inputs and password inputs in dialog boxes. + * + * @class CKEDITOR.ui.dialog.textInput + * @extends CKEDITOR.ui.dialog.labeledElement + * @constructor Creates a textInput class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `default` (Optional) The default value. + * * `validate` (Optional) The validation function. + * * `maxLength` (Optional) The maximum length of text box contents. + * * `size` (Optional) The size of the text box. This is + * usually overridden by the size defined by the skin, though. + * + * @param {Array} htmlList List of HTML code to output to. + */ + textInput: function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + initPrivateObject.call( this, elementDefinition ); + var domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textInput', + attributes = { 'class': 'cke_dialog_ui_input_' + elementDefinition.type, id: domId, type: elementDefinition.type }; + + // Set the validator, if any. + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + // Set the max length and size. + if ( elementDefinition.maxLength ) + attributes.maxlength = elementDefinition.maxLength; + if ( elementDefinition.size ) + attributes.size = elementDefinition.size; + + if ( elementDefinition.inputStyle ) + attributes.style = elementDefinition.inputStyle; + + // If user presses Enter in a text box, it implies clicking OK for the dialog. + var me = this, + keyPressedOnMe = false; + dialog.on( 'load', function() { + me.getInputElement().on( 'keydown', function( evt ) { + if ( evt.data.getKeystroke() == 13 ) + keyPressedOnMe = true; + } ); + + // Lower the priority this 'keyup' since 'ok' will close the dialog.(#3749) + me.getInputElement().on( 'keyup', function( evt ) { + if ( evt.data.getKeystroke() == 13 && keyPressedOnMe ) { + dialog.getButton( 'ok' ) && setTimeout( function() { + dialog.getButton( 'ok' ).click(); + }, 0 ); + keyPressedOnMe = false; + } + + if ( me.bidi ) + toggleBidiKeyUpHandler.call( me, evt ); + }, null, null, 1000 ); + } ); + + var innerHTML = function() { + // IE BUG: Text input fields in IE at 100% would exceed a or inline + // container's width, so need to wrap it inside a
. + var html = [ '' ); + return html.join( '' ); + }; + CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); + }, + + /** + * A text area with a label at the top or on the left. + * + * @class CKEDITOR.ui.dialog.textarea + * @extends CKEDITOR.ui.dialog.labeledElement + * @constructor Creates a textarea class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * + * The element definition. Accepted fields: + * + * * `rows` (Optional) The number of rows displayed. + * Defaults to 5 if not defined. + * * `cols` (Optional) The number of cols displayed. + * Defaults to 20 if not defined. Usually overridden by skins. + * * `default` (Optional) The default value. + * * `validate` (Optional) The validation function. + * + * @param {Array} htmlList List of HTML code to output to. + */ + textarea: function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + initPrivateObject.call( this, elementDefinition ); + var me = this, + domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textarea', + attributes = {}; + + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + // Generates the essential attributes for the textarea tag. + attributes.rows = elementDefinition.rows || 5; + attributes.cols = elementDefinition.cols || 20; + + attributes[ 'class' ] = 'cke_dialog_ui_input_textarea ' + ( elementDefinition[ 'class' ] || '' ); + + if ( typeof elementDefinition.inputStyle != 'undefined' ) + attributes.style = elementDefinition.inputStyle; + + if ( elementDefinition.dir ) + attributes.dir = elementDefinition.dir; + + if ( me.bidi ) { + dialog.on( 'load', function() { + me.getInputElement().on( 'keyup', toggleBidiKeyUpHandler ); + }, me ); + } + + var innerHTML = function() { + attributes[ 'aria-labelledby' ] = this._.labelId; + this._.required && ( attributes[ 'aria-required' ] = this._.required ); + var html = [ '' ); + return html.join( '' ); + }; + CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); + }, + + /** + * A single checkbox with a label on the right. + * + * @class CKEDITOR.ui.dialog.checkbox + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a checkbox class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `checked` (Optional) Whether the checkbox is checked + * on instantiation. Defaults to `false`. + * * `validate` (Optional) The validation function. + * * `label` (Optional) The checkbox label. + * + * @param {Array} htmlList List of HTML code to output to. + */ + checkbox: function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + var _ = initPrivateObject.call( this, elementDefinition, { 'default': !!elementDefinition[ 'default' ] } ); + + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + var innerHTML = function() { + var myDefinition = CKEDITOR.tools.extend( + {}, + elementDefinition, + { + id: elementDefinition.id ? elementDefinition.id + '_checkbox' : CKEDITOR.tools.getNextId() + '_checkbox' + }, + true + ), + html = []; + + var labelId = CKEDITOR.tools.getNextId() + '_label'; + var attributes = { 'class': 'cke_dialog_ui_checkbox_input', type: 'checkbox', 'aria-labelledby': labelId }; + cleanInnerDefinition( myDefinition ); + if ( elementDefinition[ 'default' ] ) + attributes.checked = 'checked'; + + if ( typeof myDefinition.inputStyle != 'undefined' ) + myDefinition.style = myDefinition.inputStyle; + + _.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes ); + html.push( + ' ' + ); + return html.join( '' ); + }; + + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'span', null, null, innerHTML ); + }, + + /** + * A group of radio buttons. + * + * @class CKEDITOR.ui.dialog.radio + * @extends CKEDITOR.ui.dialog.labeledElement + * @constructor Creates a radio class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `default` (Required) The default value. + * * `validate` (Optional) The validation function. + * * `items` (Required) An array of options. Each option + * is a one- or two-item array of format `[ 'Description', 'Value' ]`. If `'Value'` + * is missing, then the value would be assumed to be the same as the description. + * + * @param {Array} htmlList List of HTML code to output to. + */ + radio: function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + initPrivateObject.call( this, elementDefinition ); + + if ( !this._[ 'default' ] ) + this._[ 'default' ] = this._.initValue = elementDefinition.items[ 0 ][ 1 ]; + + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + var children = [], + me = this; + + var innerHTML = function() { + var inputHtmlList = [], + html = [], + commonName = ( elementDefinition.id ? elementDefinition.id : CKEDITOR.tools.getNextId() ) + '_radio'; + + for ( var i = 0; i < elementDefinition.items.length; i++ ) { + var item = elementDefinition.items[ i ], + title = item[ 2 ] !== undefined ? item[ 2 ] : item[ 0 ], + value = item[ 1 ] !== undefined ? item[ 1 ] : item[ 0 ], + inputId = CKEDITOR.tools.getNextId() + '_radio_input', + labelId = inputId + '_label', + + inputDefinition = CKEDITOR.tools.extend( {}, elementDefinition, { + id: inputId, + title: null, + type: null + }, true ), + + labelDefinition = CKEDITOR.tools.extend( {}, inputDefinition, { + title: title + }, true ), + + inputAttributes = { + type: 'radio', + 'class': 'cke_dialog_ui_radio_input', + name: commonName, + value: value, + 'aria-labelledby': labelId + }, + + inputHtml = []; + + if ( me._[ 'default' ] == value ) + inputAttributes.checked = 'checked'; + + cleanInnerDefinition( inputDefinition ); + cleanInnerDefinition( labelDefinition ); + + if ( typeof inputDefinition.inputStyle != 'undefined' ) + inputDefinition.style = inputDefinition.inputStyle; + + // Make inputs of radio type focusable (#10866). + inputDefinition.keyboardFocusable = true; + + children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) ); + + inputHtml.push( ' ' ); + + new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtml, 'label', null, { + id: labelId, + 'for': inputAttributes.id + }, item[ 0 ] ); + + inputHtmlList.push( inputHtml.join( '' ) ); + } + + new CKEDITOR.ui.dialog.hbox( dialog, children, inputHtmlList, html ); + + return html.join( '' ); + }; + + // Adding a role="radiogroup" to definition used for wrapper. + elementDefinition.role = 'radiogroup'; + elementDefinition.includeLabel = true; + + CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); + this._.children = children; + }, + + /** + * A button with a label inside. + * + * @class CKEDITOR.ui.dialog.button + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a button class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `label` (Required) The button label. + * * `disabled` (Optional) Set to `true` if you want the + * button to appear in the disabled state. + * + * @param {Array} htmlList List of HTML code to output to. + */ + button: function( dialog, elementDefinition, htmlList ) { + if ( !arguments.length ) + return; + + if ( typeof elementDefinition == 'function' ) + elementDefinition = elementDefinition( dialog.getParentEditor() ); + + initPrivateObject.call( this, elementDefinition, { disabled: elementDefinition.disabled || false } ); + + // Add OnClick event to this input. + CKEDITOR.event.implementOn( this ); + + var me = this; + + // Register an event handler for processing button clicks. + dialog.on( 'load', function() { + var element = this.getElement(); + + ( function() { + element.on( 'click', function( evt ) { + me.click(); + // #9958 + evt.data.preventDefault(); + } ); + + element.on( 'keydown', function( evt ) { + if ( evt.data.getKeystroke() in { 32: 1 } ) { + me.click(); + evt.data.preventDefault(); + } + } ); + } )(); + + element.unselectable(); + }, this ); + + var outerDefinition = CKEDITOR.tools.extend( {}, elementDefinition ); + delete outerDefinition.style; + + var labelId = CKEDITOR.tools.getNextId() + '_label'; + CKEDITOR.ui.dialog.uiElement.call( this, dialog, outerDefinition, htmlList, 'a', null, { + style: elementDefinition.style, + href: 'javascript:void(0)', // jshint ignore:line + title: elementDefinition.label, + hidefocus: 'true', + 'class': elementDefinition[ 'class' ], + role: 'button', + 'aria-labelledby': labelId + }, '' + + CKEDITOR.tools.htmlEncode( elementDefinition.label ) + + '' ); + }, + + /** + * A select box. + * + * @class CKEDITOR.ui.dialog.select + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a button class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `default` (Required) The default value. + * * `validate` (Optional) The validation function. + * * `items` (Required) An array of options. Each option + * is a one- or two-item array of format `[ 'Description', 'Value' ]`. If `'Value'` + * is missing, then the value would be assumed to be the same as the + * description. + * * `multiple` (Optional) Set this to `true` if you would like + * to have a multiple-choice select box. + * * `size` (Optional) The number of items to display in + * the select box. + * + * @param {Array} htmlList List of HTML code to output to. + */ + select: function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + var _ = initPrivateObject.call( this, elementDefinition ); + + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + _.inputId = CKEDITOR.tools.getNextId() + '_select'; + + var innerHTML = function() { + var myDefinition = CKEDITOR.tools.extend( + {}, + elementDefinition, + { + id: ( elementDefinition.id ? elementDefinition.id + '_select' : CKEDITOR.tools.getNextId() + '_select' ) + }, + true + ), + html = [], + innerHTML = [], + attributes = { 'id': _.inputId, 'class': 'cke_dialog_ui_input_select', 'aria-labelledby': this._.labelId }; + + html.push( '' ); + + return html.join( '' ); + }; + + CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); + }, + + /** + * A file upload input. + * + * @class CKEDITOR.ui.dialog.file + * @extends CKEDITOR.ui.dialog.labeledElement + * @constructor Creates a file class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `validate` (Optional) The validation function. + * + * @param {Array} htmlList List of HTML code to output to. + */ + file: function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + if ( elementDefinition[ 'default' ] === undefined ) + elementDefinition[ 'default' ] = ''; + + var _ = CKEDITOR.tools.extend( initPrivateObject.call( this, elementDefinition ), { definition: elementDefinition, buttons: [] } ); + + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + /** @ignore */ + var innerHTML = function() { + _.frameId = CKEDITOR.tools.getNextId() + '_fileInput'; + + var html = [ + '' ); + + return html.join( '' ); + }; + + // IE BUG: Parent container does not resize to contain the iframe automatically. + dialog.on( 'load', function() { + var iframe = CKEDITOR.document.getById( _.frameId ), + contentDiv = iframe.getParent(); + contentDiv.addClass( 'cke_dialog_ui_input_file' ); + } ); + + CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); + }, + + /** + * A button for submitting the file in a file upload input. + * + * @class CKEDITOR.ui.dialog.fileButton + * @extends CKEDITOR.ui.dialog.button + * @constructor Creates a fileButton class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `for` (Required) The file input's page and element ID + * to associate with, in a two-item array format: `[ 'page_id', 'element_id' ]`. + * * `validate` (Optional) The validation function. + * + * @param {Array} htmlList List of HTML code to output to. + */ + fileButton: function( dialog, elementDefinition, htmlList ) { + var me = this; + if ( arguments.length < 3 ) + return; + + initPrivateObject.call( this, elementDefinition ); + + if ( elementDefinition.validate ) + this.validate = elementDefinition.validate; + + var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition ); + var onClick = myDefinition.onClick; + myDefinition.className = ( myDefinition.className ? myDefinition.className + ' ' : '' ) + 'cke_dialog_ui_button'; + myDefinition.onClick = function( evt ) { + var target = elementDefinition[ 'for' ]; // [ pageId, elementId ] + if ( !onClick || onClick.call( this, evt ) !== false ) { + dialog.getContentElement( target[ 0 ], target[ 1 ] ).submit(); + this.disable(); + } + }; + + dialog.on( 'load', function() { + dialog.getContentElement( elementDefinition[ 'for' ][ 0 ], elementDefinition[ 'for' ][ 1 ] )._.buttons.push( me ); + } ); + + CKEDITOR.ui.dialog.button.call( this, dialog, myDefinition, htmlList ); + }, + + html: ( function() { + var myHtmlRe = /^\s*<[\w:]+\s+([^>]*)?>/, + theirHtmlRe = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/, + emptyTagRe = /\/$/; + /** + * A dialog window element made from raw HTML code. + * + * @class CKEDITOR.ui.dialog.html + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a html class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element definition. + * Accepted fields: + * + * * `html` (Required) HTML code of this element. + * + * @param {Array} htmlList List of HTML code to be added to the dialog's content area. + */ + return function( dialog, elementDefinition, htmlList ) { + if ( arguments.length < 3 ) + return; + + var myHtmlList = [], + myHtml, + theirHtml = elementDefinition.html, + myMatch, theirMatch; + + // If the HTML input doesn't contain any tags at the beginning, add a tag around it. + if ( theirHtml.charAt( 0 ) != '<' ) + theirHtml = '' + theirHtml + ''; + + // Look for focus function in definition. + var focus = elementDefinition.focus; + if ( focus ) { + var oldFocus = this.focus; + this.focus = function() { + ( typeof focus == 'function' ? focus : oldFocus ).call( this ); + this.fire( 'focus' ); + }; + if ( elementDefinition.isFocusable ) { + var oldIsFocusable = this.isFocusable; + this.isFocusable = oldIsFocusable; + } + this.keyboardFocusable = true; + } + + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtmlList, 'span', null, null, '' ); + + // Append the attributes created by the uiElement call to the real HTML. + myHtml = myHtmlList.join( '' ); + myMatch = myHtml.match( myHtmlRe ); + theirMatch = theirHtml.match( theirHtmlRe ) || [ '', '', '' ]; + + if ( emptyTagRe.test( theirMatch[ 1 ] ) ) { + theirMatch[ 1 ] = theirMatch[ 1 ].slice( 0, -1 ); + theirMatch[ 2 ] = '/' + theirMatch[ 2 ]; + } + + htmlList.push( [ theirMatch[ 1 ], ' ', myMatch[ 1 ] || '', theirMatch[ 2 ] ].join( '' ) ); + }; + } )(), + + /** + * Form fieldset for grouping dialog UI elements. + * + * @class CKEDITOR.ui.dialog.fieldset + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a fieldset class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {Array} childObjList + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * @param {Array} childHtmlList Array of HTML code that corresponds to the HTML output of all the + * objects in childObjList. + * @param {Array} htmlList Array of HTML code that this element will output to. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `label` (Optional) The legend of the this fieldset. + * * `children` (Required) An array of dialog window field definitions which will be grouped inside this fieldset. + * + */ + fieldset: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { + var legendLabel = elementDefinition.label; + /** @ignore */ + var innerHTML = function() { + var html = []; + legendLabel && html.push( '' + legendLabel + '' ); + for ( var i = 0; i < childHtmlList.length; i++ ) + html.push( childHtmlList[ i ] ); + return html.join( '' ); + }; + + this._ = { children: childObjList }; + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'fieldset', null, null, innerHTML ); + } + + }, true ); + + CKEDITOR.ui.dialog.html.prototype = new CKEDITOR.ui.dialog.uiElement(); + + /** @class CKEDITOR.ui.dialog.labeledElement */ + CKEDITOR.ui.dialog.labeledElement.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), { + /** + * Sets the label text of the element. + * + * @param {String} label The new label text. + * @returns {CKEDITOR.ui.dialog.labeledElement} The current labeled element. + */ + setLabel: function( label ) { + var node = CKEDITOR.document.getById( this._.labelId ); + if ( node.getChildCount() < 1 ) + ( new CKEDITOR.dom.text( label, CKEDITOR.document ) ).appendTo( node ); + else + node.getChild( 0 ).$.nodeValue = label; + return this; + }, + + /** + * Retrieves the current label text of the elment. + * + * @returns {String} The current label text. + */ + getLabel: function() { + var node = CKEDITOR.document.getById( this._.labelId ); + if ( !node || node.getChildCount() < 1 ) + return ''; + else + return node.getChild( 0 ).getText(); + }, + + /** + * Defines the `onChange` event for UI element definitions. + * @property {Object} + */ + eventProcessors: commonEventProcessors + }, true ); + + /** @class CKEDITOR.ui.dialog.button */ + CKEDITOR.ui.dialog.button.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), { + /** + * Simulates a click to the button. + * + * @returns {Object} Return value of the `click` event. + */ + click: function() { + if ( !this._.disabled ) + return this.fire( 'click', { dialog: this._.dialog } ); + return false; + }, + + /** + * Enables the button. + */ + enable: function() { + this._.disabled = false; + var element = this.getElement(); + element && element.removeClass( 'cke_disabled' ); + }, + + /** + * Disables the button. + */ + disable: function() { + this._.disabled = true; + this.getElement().addClass( 'cke_disabled' ); + }, + + /** + * Checks whether a field is visible. + * + * @returns {Boolean} + */ + isVisible: function() { + return this.getElement().getFirst().isVisible(); + }, + + /** + * Checks whether a field is enabled. Fields can be disabled by using the + * {@link #disable} method and enabled by using the {@link #enable} method. + * + * @returns {Boolean} + */ + isEnabled: function() { + return !this._.disabled; + }, + + /** + * Defines the `onChange` event and `onClick` for button element definitions. + * + * @property {Object} + */ + eventProcessors: CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, { + onClick: function( dialog, func ) { + this.on( 'click', function() { + func.apply( this, arguments ); + } ); + } + }, true ), + + /** + * Handler for the element's access key up event. Simulates a click to + * the button. + */ + accessKeyUp: function() { + this.click(); + }, + + /** + * Handler for the element's access key down event. Simulates a mouse + * down to the button. + */ + accessKeyDown: function() { + this.focus(); + }, + + keyboardFocusable: true + }, true ); + + /** @class CKEDITOR.ui.dialog.textInput */ + CKEDITOR.ui.dialog.textInput.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), { + /** + * Gets the text input DOM element under this UI object. + * + * @returns {CKEDITOR.dom.element} The DOM element of the text input. + */ + getInputElement: function() { + return CKEDITOR.document.getById( this._.inputId ); + }, + + /** + * Puts focus into the text input. + */ + focus: function() { + var me = this.selectParentTab(); + + // GECKO BUG: setTimeout() is needed to workaround invisible selections. + setTimeout( function() { + var element = me.getInputElement(); + element && element.$.focus(); + }, 0 ); + }, + + /** + * Selects all the text in the text input. + */ + select: function() { + var me = this.selectParentTab(); + + // GECKO BUG: setTimeout() is needed to workaround invisible selections. + setTimeout( function() { + var e = me.getInputElement(); + if ( e ) { + e.$.focus(); + e.$.select(); + } + }, 0 ); + }, + + /** + * Handler for the text input's access key up event. Makes a `select()` + * call to the text input. + */ + accessKeyUp: function() { + this.select(); + }, + + /** + * Sets the value of this text input object. + * + * uiElement.setValue( 'Blamo' ); + * + * @param {Object} value The new value. + * @returns {CKEDITOR.ui.dialog.textInput} The current UI element. + */ + setValue: function( value ) { + if ( this.bidi ) { + var marker = value && value.charAt( 0 ), + dir = ( marker == '\u202A' ? 'ltr' : marker == '\u202B' ? 'rtl' : null ); + + if ( dir ) { + value = value.slice( 1 ); + } + + // Set the marker or reset it (if dir==null). + this.setDirectionMarker( dir ); + } + + if ( !value ) { + value = ''; + } + + return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply( this, arguments ); + }, + + /** + * Gets the value of this text input object. + * + * @returns {String} The value. + */ + getValue: function() { + var value = CKEDITOR.ui.dialog.uiElement.prototype.getValue.call( this ); + + if ( this.bidi && value ) { + var dir = this.getDirectionMarker(); + if ( dir ) { + value = ( dir == 'ltr' ? '\u202A' : '\u202B' ) + value; + } + } + + return value; + }, + + /** + * Sets the text direction marker and the `dir` attribute of the input element. + * + * @since 4.5 + * @param {String} dir The text direction. Pass `null` to reset. + */ + setDirectionMarker: function( dir ) { + var inputElement = this.getInputElement(); + + if ( dir ) { + inputElement.setAttributes( { + dir: dir, + 'data-cke-dir-marker': dir + } ); + // Don't remove the dir attribute if this field hasn't got the marker, + // because the dir attribute could be set independently. + } else if ( this.getDirectionMarker() ) { + inputElement.removeAttributes( [ 'dir', 'data-cke-dir-marker' ] ); + } + }, + + /** + * Gets the value of the text direction marker. + * + * @since 4.5 + * @returns {String} `'ltr'`, `'rtl'` or `null` if the marker is not set. + */ + getDirectionMarker: function() { + return this.getInputElement().data( 'cke-dir-marker' ); + }, + + keyboardFocusable: true + }, commonPrototype, true ); + + CKEDITOR.ui.dialog.textarea.prototype = new CKEDITOR.ui.dialog.textInput(); + + /** @class CKEDITOR.ui.dialog.select */ + CKEDITOR.ui.dialog.select.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), { + /** + * Gets the DOM element of the select box. + * + * @returns {CKEDITOR.dom.element} The `` element of this file input. + * + * @returns {CKEDITOR.dom.element} The file input element. + */ + getInputElement: function() { + var frameDocument = CKEDITOR.document.getById( this._.frameId ).getFrameDocument(); + return frameDocument.$.forms.length > 0 ? new CKEDITOR.dom.element( frameDocument.$.forms[ 0 ].elements[ 0 ] ) : this.getElement(); + }, + + /** + * Uploads the file in the file input. + * + * @returns {CKEDITOR.ui.dialog.file} This object. + */ + submit: function() { + this.getInputElement().getParent().$.submit(); + return this; + }, + + /** + * Gets the action assigned to the form. + * + * @returns {String} The value of the action. + */ + getAction: function() { + return this.getInputElement().getParent().$.action; + }, + + /** + * The events must be applied to the inner input element, and + * this must be done when the iframe and form have been loaded. + */ + registerEvents: function( definition ) { + var regex = /^on([A-Z]\w+)/, + match; + + var registerDomEvent = function( uiElement, dialog, eventName, func ) { + uiElement.on( 'formLoaded', function() { + uiElement.getInputElement().on( eventName, func, uiElement ); + } ); + }; + + for ( var i in definition ) { + if ( !( match = i.match( regex ) ) ) + continue; + + if ( this.eventProcessors[ i ] ) + this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] ); + else + registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] ); + } + + return this; + }, + + /** + * Redraws the file input and resets the file path in the file input. + * The redrawing logic is necessary because non-IE browsers tend to clear + * the `' ); + + var frameDocTpl = CKEDITOR.addTemplate( 'panel-frame-inner', '' + + '' + + '{css}' + + '' + + '<\/html>' ); + + /** @class CKEDITOR.ui.panel */ + CKEDITOR.ui.panel.prototype = { + /** + * Renders the combo. + * + * @param {CKEDITOR.editor} editor The editor instance which this button is + * to be used by. + * @param {Array} [output] The output array to which append the HTML relative + * to this button. + */ + render: function( editor, output ) { + this.getHolderElement = function() { + var holder = this._.holder; + + if ( !holder ) { + if ( this.isFramed ) { + var iframe = this.document.getById( this.id + '_frame' ), + parentDiv = iframe.getParent(), + doc = iframe.getFrameDocument(); + + // Make it scrollable on iOS. (#8308) + CKEDITOR.env.iOS && parentDiv.setStyles( { + 'overflow': 'scroll', + '-webkit-overflow-scrolling': 'touch' + } ); + + var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function() { + this.isLoaded = true; + if ( this.onLoad ) + this.onLoad(); + }, this ) ); + + doc.write( frameDocTpl.output( CKEDITOR.tools.extend( { + css: CKEDITOR.tools.buildStyleHtml( this.css ), + onload: 'window.parent.CKEDITOR.tools.callFunction(' + onLoad + ');' + }, data ) ) ); + + var win = doc.getWindow(); + + // Register the CKEDITOR global. + win.$.CKEDITOR = CKEDITOR; + + // Arrow keys for scrolling is only preventable with 'keypress' event in Opera (#4534). + doc.on( 'keydown', function( evt ) { + var keystroke = evt.data.getKeystroke(), + dir = this.document.getById( this.id ).getAttribute( 'dir' ); + + // Delegate key processing to block. + if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false ) { + evt.data.preventDefault(); + return; + } + + // ESC/ARROW-LEFT(ltr) OR ARROW-RIGHT(rtl) + if ( keystroke == 27 || keystroke == ( dir == 'rtl' ? 39 : 37 ) ) { + if ( this.onEscape && this.onEscape( keystroke ) === false ) + evt.data.preventDefault(); + } + }, this ); + + holder = doc.getBody(); + holder.unselectable(); + CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad ); + } else { + holder = this.document.getById( this.id ); + } + + this._.holder = holder; + } + + return holder; + }; + + var data = { + editorId: editor.id, + id: this.id, + langCode: editor.langCode, + dir: editor.lang.dir, + cls: this.className, + frame: '', + env: CKEDITOR.env.cssClass, + 'z-index': editor.config.baseFloatZIndex + 1 + }; + + if ( this.isFramed ) { + // With IE, the custom domain has to be taken care at first, + // for other browers, the 'src' attribute should be left empty to + // trigger iframe's 'load' event. + var src = + CKEDITOR.env.air ? 'javascript:void(0)' : // jshint ignore:line + CKEDITOR.env.ie ? 'javascript:void(function(){' + encodeURIComponent( // jshint ignore:line + 'document.open();' + + // In IE, the document domain must be set any time we call document.open(). + '(' + CKEDITOR.tools.fixDomain + ')();' + + 'document.close();' + ) + '}())' : + ''; + + data.frame = frameTpl.output( { + id: this.id + '_frame', + src: src + } ); + } + + var html = panelTpl.output( data ); + + if ( output ) + output.push( html ); + + return html; + }, + + /** + * @todo + */ + addBlock: function( name, block ) { + block = this._.blocks[ name ] = block instanceof CKEDITOR.ui.panel.block ? block : new CKEDITOR.ui.panel.block( this.getHolderElement(), block ); + + if ( !this._.currentBlock ) + this.showBlock( name ); + + return block; + }, + + /** + * @todo + */ + getBlock: function( name ) { + return this._.blocks[ name ]; + }, + + /** + * @todo + */ + showBlock: function( name ) { + var blocks = this._.blocks, + block = blocks[ name ], + current = this._.currentBlock; + + // ARIA role works better in IE on the body element, while on the iframe + // for FF. (#8864) + var holder = !this.forceIFrame || CKEDITOR.env.ie ? this._.holder : this.document.getById( this.id + '_frame' ); + + if ( current ) + current.hide(); + + this._.currentBlock = block; + + CKEDITOR.fire( 'ariaWidget', holder ); + + // Reset the focus index, so it will always go into the first one. + block._.focusIndex = -1; + + this._.onKeyDown = block.onKeyDown && CKEDITOR.tools.bind( block.onKeyDown, block ); + + block.show(); + + return block; + }, + + /** + * @todo + */ + destroy: function() { + this.element && this.element.remove(); + } + }; + + /** + * @class + * + * @todo class and all methods + */ + CKEDITOR.ui.panel.block = CKEDITOR.tools.createClass( { + /** + * Creates a block class instances. + * + * @constructor + * @todo + */ + $: function( blockHolder, blockDefinition ) { + this.element = blockHolder.append( blockHolder.getDocument().createElement( 'div', { + attributes: { + 'tabindex': -1, + 'class': 'cke_panel_block' + }, + styles: { + display: 'none' + } + } ) ); + + // Copy all definition properties to this object. + if ( blockDefinition ) + CKEDITOR.tools.extend( this, blockDefinition ); + + // Set the a11y attributes of this element ... + this.element.setAttributes( { + 'role': this.attributes.role || 'presentation', + 'aria-label': this.attributes[ 'aria-label' ], + 'title': this.attributes.title || this.attributes[ 'aria-label' ] + } ); + + this.keys = {}; + + this._.focusIndex = -1; + + // Disable context menu for panels. + this.element.disableContextMenu(); + }, + + _: { + + /** + * Mark the item specified by the index as current activated. + */ + markItem: function( index ) { + if ( index == -1 ) + return; + var links = this.element.getElementsByTag( 'a' ); + var item = links.getItem( this._.focusIndex = index ); + + // Safari need focus on the iframe window first(#3389), but we need + // lock the blur to avoid hiding the panel. + if ( CKEDITOR.env.webkit ) + item.getDocument().getWindow().focus(); + item.focus(); + + this.onMark && this.onMark( item ); + } + }, + + proto: { + show: function() { + this.element.setStyle( 'display', '' ); + }, + + hide: function() { + if ( !this.onHide || this.onHide.call( this ) !== true ) + this.element.setStyle( 'display', 'none' ); + }, + + onKeyDown: function( keystroke, noCycle ) { + var keyAction = this.keys[ keystroke ]; + switch ( keyAction ) { + // Move forward. + case 'next': + var index = this._.focusIndex, + links = this.element.getElementsByTag( 'a' ), + link; + + while ( ( link = links.getItem( ++index ) ) ) { + // Move the focus only if the element is marked with + // the _cke_focus and it it's visible (check if it has + // width). + if ( link.getAttribute( '_cke_focus' ) && link.$.offsetWidth ) { + this._.focusIndex = index; + link.focus(); + break; + } + } + + // If no link was found, cycle and restart from the top. (#11125) + if ( !link && !noCycle ) { + this._.focusIndex = -1; + return this.onKeyDown( keystroke, 1 ); + } + + return false; + + // Move backward. + case 'prev': + index = this._.focusIndex; + links = this.element.getElementsByTag( 'a' ); + + while ( index > 0 && ( link = links.getItem( --index ) ) ) { + // Move the focus only if the element is marked with + // the _cke_focus and it it's visible (check if it has + // width). + if ( link.getAttribute( '_cke_focus' ) && link.$.offsetWidth ) { + this._.focusIndex = index; + link.focus(); + break; + } + + // Make sure link is null when the loop ends and nothing was + // found (#11125). + link = null; + } + + // If no link was found, cycle and restart from the bottom. (#11125) + if ( !link && !noCycle ) { + this._.focusIndex = links.count(); + return this.onKeyDown( keystroke, 1 ); + } + + return false; + + case 'click': + case 'mouseup': + index = this._.focusIndex; + link = index >= 0 && this.element.getElementsByTag( 'a' ).getItem( index ); + + if ( link ) + link.$[ keyAction ] ? link.$[ keyAction ]() : link.$[ 'on' + keyAction ](); + + return false; + } + + return true; + } + } + } ); + +} )(); + +/** + * Fired when a panel is added to the document. + * + * @event ariaWidget + * @member CKEDITOR + * @param {Object} data The element wrapping the panel. + */ diff --git a/sources/plugins/popup/plugin.js b/sources/plugins/popup/plugin.js new file mode 100644 index 0000000..352d239 --- /dev/null +++ b/sources/plugins/popup/plugin.js @@ -0,0 +1,65 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'popup' ); + +CKEDITOR.tools.extend( CKEDITOR.editor.prototype, { + /** + * Opens Browser in a popup. The `width` and `height` parameters accept + * numbers (pixels) or percent (of screen size) values. + * + * @member CKEDITOR.editor + * @param {String} url The url of the external file browser. + * @param {Number/String} [width='80%'] Popup window width. + * @param {Number/String} [height='70%'] Popup window height. + * @param {String} [options='location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes'] + * Popup window features. + */ + popup: function( url, width, height, options ) { + width = width || '80%'; + height = height || '70%'; + + if ( typeof width == 'string' && width.length > 1 && width.substr( width.length - 1, 1 ) == '%' ) + width = parseInt( window.screen.width * parseInt( width, 10 ) / 100, 10 ); + + if ( typeof height == 'string' && height.length > 1 && height.substr( height.length - 1, 1 ) == '%' ) + height = parseInt( window.screen.height * parseInt( height, 10 ) / 100, 10 ); + + if ( width < 640 ) + width = 640; + + if ( height < 420 ) + height = 420; + + var top = parseInt( ( window.screen.height - height ) / 2, 10 ), + left = parseInt( ( window.screen.width - width ) / 2, 10 ); + + options = ( options || 'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes' ) + ',width=' + width + + ',height=' + height + + ',top=' + top + + ',left=' + left; + + var popupWindow = window.open( '', null, options, true ); + + // Blocked by a popup blocker. + if ( !popupWindow ) + return false; + + try { + // Chrome is problematic with moveTo/resizeTo, but it's not really needed here (#8855). + var ua = navigator.userAgent.toLowerCase(); + if ( ua.indexOf( ' chrome/' ) == -1 ) { + popupWindow.moveTo( left, top ); + popupWindow.resizeTo( width, height ); + } + popupWindow.focus(); + popupWindow.location.href = url; + } catch ( e ) { + popupWindow = window.open( url, null, options, true ); + } + + return true; + } +} ); diff --git a/sources/plugins/removeformat/icons/hidpi/removeformat.png b/sources/plugins/removeformat/icons/hidpi/removeformat.png new file mode 100644 index 0000000..0695878 Binary files /dev/null and b/sources/plugins/removeformat/icons/hidpi/removeformat.png differ diff --git a/sources/plugins/removeformat/icons/removeformat.png b/sources/plugins/removeformat/icons/removeformat.png new file mode 100644 index 0000000..f4597bf Binary files /dev/null and b/sources/plugins/removeformat/icons/removeformat.png differ diff --git a/sources/plugins/removeformat/lang/af.js b/sources/plugins/removeformat/lang/af.js new file mode 100644 index 0000000..4904945 --- /dev/null +++ b/sources/plugins/removeformat/lang/af.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'af', { + toolbar: 'Verwyder opmaak' +} ); diff --git a/sources/plugins/removeformat/lang/ar.js b/sources/plugins/removeformat/lang/ar.js new file mode 100644 index 0000000..661e851 --- /dev/null +++ b/sources/plugins/removeformat/lang/ar.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ar', { + toolbar: 'إزالة التنسيقات' +} ); diff --git a/sources/plugins/removeformat/lang/az.js b/sources/plugins/removeformat/lang/az.js new file mode 100644 index 0000000..948837e --- /dev/null +++ b/sources/plugins/removeformat/lang/az.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'az', { + toolbar: 'Formatı sil' +} ); diff --git a/sources/plugins/removeformat/lang/bg.js b/sources/plugins/removeformat/lang/bg.js new file mode 100644 index 0000000..a96dc60 --- /dev/null +++ b/sources/plugins/removeformat/lang/bg.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'bg', { + toolbar: 'Премахване на форматирането' +} ); diff --git a/sources/plugins/removeformat/lang/bn.js b/sources/plugins/removeformat/lang/bn.js new file mode 100644 index 0000000..0c59c81 --- /dev/null +++ b/sources/plugins/removeformat/lang/bn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'bn', { + toolbar: 'ধরন-প্রকৃতি অপসারণ করি' +} ); diff --git a/sources/plugins/removeformat/lang/bs.js b/sources/plugins/removeformat/lang/bs.js new file mode 100644 index 0000000..83fd723 --- /dev/null +++ b/sources/plugins/removeformat/lang/bs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'bs', { + toolbar: 'Poništi format' +} ); diff --git a/sources/plugins/removeformat/lang/ca.js b/sources/plugins/removeformat/lang/ca.js new file mode 100644 index 0000000..01ead3b --- /dev/null +++ b/sources/plugins/removeformat/lang/ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ca', { + toolbar: 'Elimina Format' +} ); diff --git a/sources/plugins/removeformat/lang/cs.js b/sources/plugins/removeformat/lang/cs.js new file mode 100644 index 0000000..cab8cfc --- /dev/null +++ b/sources/plugins/removeformat/lang/cs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'cs', { + toolbar: 'Odstranit formátování' +} ); diff --git a/sources/plugins/removeformat/lang/cy.js b/sources/plugins/removeformat/lang/cy.js new file mode 100644 index 0000000..7908104 --- /dev/null +++ b/sources/plugins/removeformat/lang/cy.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'cy', { + toolbar: 'Tynnu Fformat' +} ); diff --git a/sources/plugins/removeformat/lang/da.js b/sources/plugins/removeformat/lang/da.js new file mode 100644 index 0000000..6f35909 --- /dev/null +++ b/sources/plugins/removeformat/lang/da.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'da', { + toolbar: 'Fjern formatering' +} ); diff --git a/sources/plugins/removeformat/lang/de-ch.js b/sources/plugins/removeformat/lang/de-ch.js new file mode 100644 index 0000000..37d1ccd --- /dev/null +++ b/sources/plugins/removeformat/lang/de-ch.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'de-ch', { + toolbar: 'Formatierung entfernen' +} ); diff --git a/sources/plugins/removeformat/lang/de.js b/sources/plugins/removeformat/lang/de.js new file mode 100644 index 0000000..5d8901b --- /dev/null +++ b/sources/plugins/removeformat/lang/de.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'de', { + toolbar: 'Formatierung entfernen' +} ); diff --git a/sources/plugins/removeformat/lang/el.js b/sources/plugins/removeformat/lang/el.js new file mode 100644 index 0000000..e0da8c6 --- /dev/null +++ b/sources/plugins/removeformat/lang/el.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'el', { + toolbar: 'Εκκαθάριση Μορφοποίησης' +} ); diff --git a/sources/plugins/removeformat/lang/en-au.js b/sources/plugins/removeformat/lang/en-au.js new file mode 100644 index 0000000..4d98f6d --- /dev/null +++ b/sources/plugins/removeformat/lang/en-au.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'en-au', { + toolbar: 'Remove Format' +} ); diff --git a/sources/plugins/removeformat/lang/en-ca.js b/sources/plugins/removeformat/lang/en-ca.js new file mode 100644 index 0000000..998eb01 --- /dev/null +++ b/sources/plugins/removeformat/lang/en-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'en-ca', { + toolbar: 'Remove Format' +} ); diff --git a/sources/plugins/removeformat/lang/en-gb.js b/sources/plugins/removeformat/lang/en-gb.js new file mode 100644 index 0000000..f40ca18 --- /dev/null +++ b/sources/plugins/removeformat/lang/en-gb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'en-gb', { + toolbar: 'Remove Format' +} ); diff --git a/sources/plugins/removeformat/lang/en.js b/sources/plugins/removeformat/lang/en.js new file mode 100644 index 0000000..ed26343 --- /dev/null +++ b/sources/plugins/removeformat/lang/en.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'en', { + toolbar: 'Remove Format' +} ); diff --git a/sources/plugins/removeformat/lang/eo.js b/sources/plugins/removeformat/lang/eo.js new file mode 100644 index 0000000..bb25f96 --- /dev/null +++ b/sources/plugins/removeformat/lang/eo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'eo', { + toolbar: 'Forigi Formaton' +} ); diff --git a/sources/plugins/removeformat/lang/es.js b/sources/plugins/removeformat/lang/es.js new file mode 100644 index 0000000..d097bdb --- /dev/null +++ b/sources/plugins/removeformat/lang/es.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'es', { + toolbar: 'Eliminar Formato' +} ); diff --git a/sources/plugins/removeformat/lang/et.js b/sources/plugins/removeformat/lang/et.js new file mode 100644 index 0000000..823749d --- /dev/null +++ b/sources/plugins/removeformat/lang/et.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'et', { + toolbar: 'Vormingu eemaldamine' +} ); diff --git a/sources/plugins/removeformat/lang/eu.js b/sources/plugins/removeformat/lang/eu.js new file mode 100644 index 0000000..bc487f7 --- /dev/null +++ b/sources/plugins/removeformat/lang/eu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'eu', { + toolbar: 'Kendu formatua' +} ); diff --git a/sources/plugins/removeformat/lang/fa.js b/sources/plugins/removeformat/lang/fa.js new file mode 100644 index 0000000..8fc6b93 --- /dev/null +++ b/sources/plugins/removeformat/lang/fa.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'fa', { + toolbar: 'برداشتن فرمت' +} ); diff --git a/sources/plugins/removeformat/lang/fi.js b/sources/plugins/removeformat/lang/fi.js new file mode 100644 index 0000000..c61a093 --- /dev/null +++ b/sources/plugins/removeformat/lang/fi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'fi', { + toolbar: 'Poista muotoilu' +} ); diff --git a/sources/plugins/removeformat/lang/fo.js b/sources/plugins/removeformat/lang/fo.js new file mode 100644 index 0000000..b80c158 --- /dev/null +++ b/sources/plugins/removeformat/lang/fo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'fo', { + toolbar: 'Strika sniðgeving' +} ); diff --git a/sources/plugins/removeformat/lang/fr-ca.js b/sources/plugins/removeformat/lang/fr-ca.js new file mode 100644 index 0000000..fe3534d --- /dev/null +++ b/sources/plugins/removeformat/lang/fr-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'fr-ca', { + toolbar: 'Supprimer le formatage' +} ); diff --git a/sources/plugins/removeformat/lang/fr.js b/sources/plugins/removeformat/lang/fr.js new file mode 100644 index 0000000..e18fd83 --- /dev/null +++ b/sources/plugins/removeformat/lang/fr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'fr', { + toolbar: 'Supprimer la mise en forme' +} ); diff --git a/sources/plugins/removeformat/lang/gl.js b/sources/plugins/removeformat/lang/gl.js new file mode 100644 index 0000000..8190cca --- /dev/null +++ b/sources/plugins/removeformat/lang/gl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'gl', { + toolbar: 'Retirar o formato' +} ); diff --git a/sources/plugins/removeformat/lang/gu.js b/sources/plugins/removeformat/lang/gu.js new file mode 100644 index 0000000..621ad9d --- /dev/null +++ b/sources/plugins/removeformat/lang/gu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'gu', { + toolbar: 'ફૉર્મટ કાઢવું' +} ); diff --git a/sources/plugins/removeformat/lang/he.js b/sources/plugins/removeformat/lang/he.js new file mode 100644 index 0000000..bcdc1bd --- /dev/null +++ b/sources/plugins/removeformat/lang/he.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'he', { + toolbar: 'הסרת העיצוב' +} ); diff --git a/sources/plugins/removeformat/lang/hi.js b/sources/plugins/removeformat/lang/hi.js new file mode 100644 index 0000000..ab15f5d --- /dev/null +++ b/sources/plugins/removeformat/lang/hi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'hi', { + toolbar: 'फ़ॉर्मैट हटायें' +} ); diff --git a/sources/plugins/removeformat/lang/hr.js b/sources/plugins/removeformat/lang/hr.js new file mode 100644 index 0000000..c061400 --- /dev/null +++ b/sources/plugins/removeformat/lang/hr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'hr', { + toolbar: 'Ukloni formatiranje' +} ); diff --git a/sources/plugins/removeformat/lang/hu.js b/sources/plugins/removeformat/lang/hu.js new file mode 100644 index 0000000..fe1c099 --- /dev/null +++ b/sources/plugins/removeformat/lang/hu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'hu', { + toolbar: 'Formázás eltávolítása' +} ); diff --git a/sources/plugins/removeformat/lang/id.js b/sources/plugins/removeformat/lang/id.js new file mode 100644 index 0000000..e7eded0 --- /dev/null +++ b/sources/plugins/removeformat/lang/id.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'id', { + toolbar: 'Hapus Format' +} ); diff --git a/sources/plugins/removeformat/lang/is.js b/sources/plugins/removeformat/lang/is.js new file mode 100644 index 0000000..98b9b4d --- /dev/null +++ b/sources/plugins/removeformat/lang/is.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'is', { + toolbar: 'Fjarlægja snið' +} ); diff --git a/sources/plugins/removeformat/lang/it.js b/sources/plugins/removeformat/lang/it.js new file mode 100644 index 0000000..0ea8fb9 --- /dev/null +++ b/sources/plugins/removeformat/lang/it.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'it', { + toolbar: 'Elimina formattazione' +} ); diff --git a/sources/plugins/removeformat/lang/ja.js b/sources/plugins/removeformat/lang/ja.js new file mode 100644 index 0000000..ca0970f --- /dev/null +++ b/sources/plugins/removeformat/lang/ja.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ja', { + toolbar: '書式を解除' +} ); diff --git a/sources/plugins/removeformat/lang/ka.js b/sources/plugins/removeformat/lang/ka.js new file mode 100644 index 0000000..b624c5d --- /dev/null +++ b/sources/plugins/removeformat/lang/ka.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ka', { + toolbar: 'ფორმატირების მოხსნა' +} ); diff --git a/sources/plugins/removeformat/lang/km.js b/sources/plugins/removeformat/lang/km.js new file mode 100644 index 0000000..cacd321 --- /dev/null +++ b/sources/plugins/removeformat/lang/km.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'km', { + toolbar: 'ជម្រះ​ទ្រង់​ទ្រាយ' +} ); diff --git a/sources/plugins/removeformat/lang/ko.js b/sources/plugins/removeformat/lang/ko.js new file mode 100644 index 0000000..a594ccc --- /dev/null +++ b/sources/plugins/removeformat/lang/ko.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ko', { + toolbar: '형식 지우기' +} ); diff --git a/sources/plugins/removeformat/lang/ku.js b/sources/plugins/removeformat/lang/ku.js new file mode 100644 index 0000000..51ae15a --- /dev/null +++ b/sources/plugins/removeformat/lang/ku.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ku', { + toolbar: 'لابردنی داڕشتەکە' +} ); diff --git a/sources/plugins/removeformat/lang/lt.js b/sources/plugins/removeformat/lang/lt.js new file mode 100644 index 0000000..1e7f2df --- /dev/null +++ b/sources/plugins/removeformat/lang/lt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'lt', { + toolbar: 'Panaikinti formatą' +} ); diff --git a/sources/plugins/removeformat/lang/lv.js b/sources/plugins/removeformat/lang/lv.js new file mode 100644 index 0000000..f382171 --- /dev/null +++ b/sources/plugins/removeformat/lang/lv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'lv', { + toolbar: 'Noņemt stilus' +} ); diff --git a/sources/plugins/removeformat/lang/mk.js b/sources/plugins/removeformat/lang/mk.js new file mode 100644 index 0000000..be04ba4 --- /dev/null +++ b/sources/plugins/removeformat/lang/mk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'mk', { + toolbar: 'Remove Format' // MISSING +} ); diff --git a/sources/plugins/removeformat/lang/mn.js b/sources/plugins/removeformat/lang/mn.js new file mode 100644 index 0000000..378a898 --- /dev/null +++ b/sources/plugins/removeformat/lang/mn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'mn', { + toolbar: 'Параргафын загварыг авч хаях' +} ); diff --git a/sources/plugins/removeformat/lang/ms.js b/sources/plugins/removeformat/lang/ms.js new file mode 100644 index 0000000..ee81ba1 --- /dev/null +++ b/sources/plugins/removeformat/lang/ms.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ms', { + toolbar: 'Buang Format' +} ); diff --git a/sources/plugins/removeformat/lang/nb.js b/sources/plugins/removeformat/lang/nb.js new file mode 100644 index 0000000..19f093d --- /dev/null +++ b/sources/plugins/removeformat/lang/nb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'nb', { + toolbar: 'Fjern formatering' +} ); diff --git a/sources/plugins/removeformat/lang/nl.js b/sources/plugins/removeformat/lang/nl.js new file mode 100644 index 0000000..46be61b --- /dev/null +++ b/sources/plugins/removeformat/lang/nl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'nl', { + toolbar: 'Opmaak verwijderen' +} ); diff --git a/sources/plugins/removeformat/lang/no.js b/sources/plugins/removeformat/lang/no.js new file mode 100644 index 0000000..84d38af --- /dev/null +++ b/sources/plugins/removeformat/lang/no.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'no', { + toolbar: 'Fjern formatering' +} ); diff --git a/sources/plugins/removeformat/lang/oc.js b/sources/plugins/removeformat/lang/oc.js new file mode 100644 index 0000000..7dda966 --- /dev/null +++ b/sources/plugins/removeformat/lang/oc.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'oc', { + toolbar: 'Suprimir la mesa en forma' +} ); diff --git a/sources/plugins/removeformat/lang/pl.js b/sources/plugins/removeformat/lang/pl.js new file mode 100644 index 0000000..41e7034 --- /dev/null +++ b/sources/plugins/removeformat/lang/pl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'pl', { + toolbar: 'Usuń formatowanie' +} ); diff --git a/sources/plugins/removeformat/lang/pt-br.js b/sources/plugins/removeformat/lang/pt-br.js new file mode 100644 index 0000000..61b44c0 --- /dev/null +++ b/sources/plugins/removeformat/lang/pt-br.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'pt-br', { + toolbar: 'Remover Formatação' +} ); diff --git a/sources/plugins/removeformat/lang/pt.js b/sources/plugins/removeformat/lang/pt.js new file mode 100644 index 0000000..b54dbce --- /dev/null +++ b/sources/plugins/removeformat/lang/pt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'pt', { + toolbar: 'Limpar formatação' +} ); diff --git a/sources/plugins/removeformat/lang/ro.js b/sources/plugins/removeformat/lang/ro.js new file mode 100644 index 0000000..649bced --- /dev/null +++ b/sources/plugins/removeformat/lang/ro.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ro', { + toolbar: 'Înlătură formatarea' +} ); diff --git a/sources/plugins/removeformat/lang/ru.js b/sources/plugins/removeformat/lang/ru.js new file mode 100644 index 0000000..ea05d6e --- /dev/null +++ b/sources/plugins/removeformat/lang/ru.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ru', { + toolbar: 'Убрать форматирование' +} ); diff --git a/sources/plugins/removeformat/lang/si.js b/sources/plugins/removeformat/lang/si.js new file mode 100644 index 0000000..db5d715 --- /dev/null +++ b/sources/plugins/removeformat/lang/si.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'si', { + toolbar: 'සැකසීම වෙනස් කරන්න' +} ); diff --git a/sources/plugins/removeformat/lang/sk.js b/sources/plugins/removeformat/lang/sk.js new file mode 100644 index 0000000..625c8d6 --- /dev/null +++ b/sources/plugins/removeformat/lang/sk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'sk', { + toolbar: 'Odstrániť formátovanie' +} ); diff --git a/sources/plugins/removeformat/lang/sl.js b/sources/plugins/removeformat/lang/sl.js new file mode 100644 index 0000000..895c1e7 --- /dev/null +++ b/sources/plugins/removeformat/lang/sl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'sl', { + toolbar: 'Odstrani oblikovanje' +} ); diff --git a/sources/plugins/removeformat/lang/sq.js b/sources/plugins/removeformat/lang/sq.js new file mode 100644 index 0000000..45f455a --- /dev/null +++ b/sources/plugins/removeformat/lang/sq.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'sq', { + toolbar: 'Largo Formatin' +} ); diff --git a/sources/plugins/removeformat/lang/sr-latn.js b/sources/plugins/removeformat/lang/sr-latn.js new file mode 100644 index 0000000..51f34a7 --- /dev/null +++ b/sources/plugins/removeformat/lang/sr-latn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'sr-latn', { + toolbar: 'Ukloni formatiranje' +} ); diff --git a/sources/plugins/removeformat/lang/sr.js b/sources/plugins/removeformat/lang/sr.js new file mode 100644 index 0000000..c6080dd --- /dev/null +++ b/sources/plugins/removeformat/lang/sr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'sr', { + toolbar: 'Уклони форматирање' +} ); diff --git a/sources/plugins/removeformat/lang/sv.js b/sources/plugins/removeformat/lang/sv.js new file mode 100644 index 0000000..2dd7edc --- /dev/null +++ b/sources/plugins/removeformat/lang/sv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'sv', { + toolbar: 'Radera formatering' +} ); diff --git a/sources/plugins/removeformat/lang/th.js b/sources/plugins/removeformat/lang/th.js new file mode 100644 index 0000000..0bc74e2 --- /dev/null +++ b/sources/plugins/removeformat/lang/th.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'th', { + toolbar: 'ล้างรูปแบบ' +} ); diff --git a/sources/plugins/removeformat/lang/tr.js b/sources/plugins/removeformat/lang/tr.js new file mode 100644 index 0000000..2c961c5 --- /dev/null +++ b/sources/plugins/removeformat/lang/tr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'tr', { + toolbar: 'Biçimi Kaldır' +} ); diff --git a/sources/plugins/removeformat/lang/tt.js b/sources/plugins/removeformat/lang/tt.js new file mode 100644 index 0000000..b3afbda --- /dev/null +++ b/sources/plugins/removeformat/lang/tt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'tt', { + toolbar: 'Форматлауны бетерү' +} ); diff --git a/sources/plugins/removeformat/lang/ug.js b/sources/plugins/removeformat/lang/ug.js new file mode 100644 index 0000000..07e5daf --- /dev/null +++ b/sources/plugins/removeformat/lang/ug.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'ug', { + toolbar: 'پىچىمنى چىقىرىۋەت' +} ); diff --git a/sources/plugins/removeformat/lang/uk.js b/sources/plugins/removeformat/lang/uk.js new file mode 100644 index 0000000..7ef1f1c --- /dev/null +++ b/sources/plugins/removeformat/lang/uk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'uk', { + toolbar: 'Видалити форматування' +} ); diff --git a/sources/plugins/removeformat/lang/vi.js b/sources/plugins/removeformat/lang/vi.js new file mode 100644 index 0000000..38316bf --- /dev/null +++ b/sources/plugins/removeformat/lang/vi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'vi', { + toolbar: 'Xoá định dạng' +} ); diff --git a/sources/plugins/removeformat/lang/zh-cn.js b/sources/plugins/removeformat/lang/zh-cn.js new file mode 100644 index 0000000..ec833f1 --- /dev/null +++ b/sources/plugins/removeformat/lang/zh-cn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'zh-cn', { + toolbar: '清除格式' +} ); diff --git a/sources/plugins/removeformat/lang/zh.js b/sources/plugins/removeformat/lang/zh.js new file mode 100644 index 0000000..dd23488 --- /dev/null +++ b/sources/plugins/removeformat/lang/zh.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'removeformat', 'zh', { + toolbar: '移除格式' +} ); diff --git a/sources/plugins/removeformat/plugin.js b/sources/plugins/removeformat/plugin.js new file mode 100644 index 0000000..20f7ecb --- /dev/null +++ b/sources/plugins/removeformat/plugin.js @@ -0,0 +1,193 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'removeformat', { + // jscs:disable maximumLineLength + lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + icons: 'removeformat', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + init: function( editor ) { + editor.addCommand( 'removeFormat', CKEDITOR.plugins.removeformat.commands.removeformat ); + editor.ui.addButton && editor.ui.addButton( 'RemoveFormat', { + label: editor.lang.removeformat.toolbar, + command: 'removeFormat', + toolbar: 'cleanup,10' + } ); + } +} ); + +CKEDITOR.plugins.removeformat = { + commands: { + removeformat: { + exec: function( editor ) { + var tagsRegex = editor._.removeFormatRegex || ( editor._.removeFormatRegex = new RegExp( '^(?:' + editor.config.removeFormatTags.replace( /,/g, '|' ) + ')$', 'i' ) ); + + var removeAttributes = editor._.removeAttributes || ( editor._.removeAttributes = editor.config.removeFormatAttributes.split( ',' ) ), + filter = CKEDITOR.plugins.removeformat.filter, + ranges = editor.getSelection().getRanges(), + iterator = ranges.createIterator(), + isElement = function( element ) { + return element.type == CKEDITOR.NODE_ELEMENT; + }, + range; + + while ( ( range = iterator.getNextRange() ) ) { + if ( !range.collapsed ) + range.enlarge( CKEDITOR.ENLARGE_ELEMENT ); + + // Bookmark the range so we can re-select it after processing. + var bookmark = range.createBookmark(), + // The style will be applied within the bookmark boundaries. + startNode = bookmark.startNode, + endNode = bookmark.endNode, + currentNode; + + // We need to check the selection boundaries (bookmark spans) to break + // the code in a way that we can properly remove partially selected nodes. + // For example, removing a style from + // This is [some text to show the] problem + // ... where [ and ] represent the selection, must result: + // This is [some text to show the] problem + // The strategy is simple, we just break the partial nodes before the + // removal logic, having something that could be represented this way: + // This is [some text to show the] problem + + var breakParent = function( node ) { + // Let's start checking the start boundary. + var path = editor.elementPath( node ), + pathElements = path.elements; + + for ( var i = 1, pathElement; pathElement = pathElements[ i ]; i++ ) { + if ( pathElement.equals( path.block ) || pathElement.equals( path.blockLimit ) ) + break; + + // If this element can be removed (even partially). + if ( tagsRegex.test( pathElement.getName() ) && filter( editor, pathElement ) ) + node.breakParent( pathElement ); + } + }; + + breakParent( startNode ); + if ( endNode ) { + breakParent( endNode ); + + // Navigate through all nodes between the bookmarks. + currentNode = startNode.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT ); + + while ( currentNode ) { + // If we have reached the end of the selection, stop looping. + if ( currentNode.equals( endNode ) ) + break; + + if ( currentNode.isReadOnly() ) { + // In case of non-editable we're skipping to the next sibling *elmenet*. + + // We need to be aware that endNode can be nested within current non-editable. + // This condition tests if currentNode (non-editable) contains endNode. If it does + // then we should break the filtering + if ( currentNode.getPosition( endNode ) & CKEDITOR.POSITION_CONTAINS ) { + break; + } + + currentNode = currentNode.getNext( isElement ); + continue; + } + + // Cache the next node to be processed. Do it now, because + // currentNode may be removed. + var nextNode = currentNode.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT ), + isFakeElement = currentNode.getName() == 'img' && currentNode.data( 'cke-realelement' ); + + // This node must not be a fake element, and must not be read-only. + if ( !isFakeElement && filter( editor, currentNode ) ) { + // Remove elements nodes that match with this style rules. + if ( tagsRegex.test( currentNode.getName() ) ) + currentNode.remove( 1 ); + else { + currentNode.removeAttributes( removeAttributes ); + editor.fire( 'removeFormatCleanup', currentNode ); + } + } + + currentNode = nextNode; + } + } + + range.moveToBookmark( bookmark ); + } + + // The selection path may not changed, but we should force a selection + // change event to refresh command states, due to the above attribution change. (#9238) + editor.forceNextSelectionCheck(); + editor.getSelection().selectRanges( ranges ); + } + } + }, + + // Perform the remove format filters on the passed element. + // @param {CKEDITOR.editor} editor + // @param {CKEDITOR.dom.element} element + filter: function( editor, element ) { + // If editor#addRemoveFotmatFilter hasn't been executed yet value is not initialized. + var filters = editor._.removeFormatFilters || []; + for ( var i = 0; i < filters.length; i++ ) { + if ( filters[ i ]( element ) === false ) + return false; + } + return true; + } +}; + +/** + * Add to a collection of functions to decide whether a specific + * element should be considered as formatting element and thus + * could be removed during `removeFormat` command. + * + * **Note:** Only available with the existence of `removeformat` plugin. + * + * // Don't remove empty span. + * editor.addRemoveFormatFilter( function( element ) { + * return !( element.is( 'span' ) && CKEDITOR.tools.isEmpty( element.getAttributes() ) ); + * } ); + * + * @since 3.3 + * @member CKEDITOR.editor + * @param {Function} func The function to be called, which will be passed a {CKEDITOR.dom.element} element to test. + */ +CKEDITOR.editor.prototype.addRemoveFormatFilter = function( func ) { + if ( !this._.removeFormatFilters ) + this._.removeFormatFilters = []; + + this._.removeFormatFilters.push( func ); +}; + +/** + * A comma separated list of elements to be removed when executing the `remove + * format` command. Note that only inline elements are allowed. + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.removeFormatTags = 'b,big,cite,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var'; + +/** + * A comma separated list of elements attributes to be removed when executing + * the `remove format` command. + * + * @cfg + * @member CKEDITOR.config + */ +CKEDITOR.config.removeFormatAttributes = 'class,style,lang,width,height,align,hspace,valign'; + +/** + * Fired after an element was cleaned by the removeFormat plugin. + * + * @event removeFormatCleanup + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param data + * @param {CKEDITOR.dom.element} data.element The element that was cleaned up. + */ diff --git a/sources/plugins/resize/plugin.js b/sources/plugins/resize/plugin.js new file mode 100644 index 0000000..095ee12 --- /dev/null +++ b/sources/plugins/resize/plugin.js @@ -0,0 +1,187 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'resize', { + init: function( editor ) { + function dragHandler( evt ) { + var dx = evt.data.$.screenX - origin.x, + dy = evt.data.$.screenY - origin.y, + width = startSize.width, + height = startSize.height, + internalWidth = width + dx * ( resizeDir == 'rtl' ? -1 : 1 ), + internalHeight = height + dy; + + if ( resizeHorizontal ) + width = Math.max( config.resize_minWidth, Math.min( internalWidth, config.resize_maxWidth ) ); + + if ( resizeVertical ) + height = Math.max( config.resize_minHeight, Math.min( internalHeight, config.resize_maxHeight ) ); + + // DO NOT impose fixed size with single direction resize. (#6308) + editor.resize( resizeHorizontal ? width : null, height ); + } + + function dragEndHandler() { + CKEDITOR.document.removeListener( 'mousemove', dragHandler ); + CKEDITOR.document.removeListener( 'mouseup', dragEndHandler ); + + if ( editor.document ) { + editor.document.removeListener( 'mousemove', dragHandler ); + editor.document.removeListener( 'mouseup', dragEndHandler ); + } + } + + var config = editor.config; + var spaceId = editor.ui.spaceId( 'resizer' ); + + // Resize in the same direction of chrome, + // which is identical to dir of editor element. (#6614) + var resizeDir = editor.element ? editor.element.getDirection( 1 ) : 'ltr'; + + !config.resize_dir && ( config.resize_dir = 'vertical' ); + ( config.resize_maxWidth === undefined ) && ( config.resize_maxWidth = 3000 ); + ( config.resize_maxHeight === undefined ) && ( config.resize_maxHeight = 3000 ); + ( config.resize_minWidth === undefined ) && ( config.resize_minWidth = 750 ); + ( config.resize_minHeight === undefined ) && ( config.resize_minHeight = 250 ); + + if ( config.resize_enabled !== false ) { + var container = null, + origin, startSize, + resizeHorizontal = ( config.resize_dir == 'both' || config.resize_dir == 'horizontal' ) && ( config.resize_minWidth != config.resize_maxWidth ), + resizeVertical = ( config.resize_dir == 'both' || config.resize_dir == 'vertical' ) && ( config.resize_minHeight != config.resize_maxHeight ); + + var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) { + if ( !container ) + container = editor.getResizable(); + + startSize = { width: container.$.offsetWidth || 0, height: container.$.offsetHeight || 0 }; + origin = { x: $event.screenX, y: $event.screenY }; + + config.resize_minWidth > startSize.width && ( config.resize_minWidth = startSize.width ); + config.resize_minHeight > startSize.height && ( config.resize_minHeight = startSize.height ); + + CKEDITOR.document.on( 'mousemove', dragHandler ); + CKEDITOR.document.on( 'mouseup', dragEndHandler ); + + if ( editor.document ) { + editor.document.on( 'mousemove', dragHandler ); + editor.document.on( 'mouseup', dragEndHandler ); + } + + $event.preventDefault && $event.preventDefault(); + } ); + + editor.on( 'destroy', function() { + CKEDITOR.tools.removeFunction( mouseDownFn ); + } ); + + editor.on( 'uiSpace', function( event ) { + if ( event.data.space == 'bottom' ) { + var direction = ''; + if ( resizeHorizontal && !resizeVertical ) + direction = ' cke_resizer_horizontal'; + if ( !resizeHorizontal && resizeVertical ) + direction = ' cke_resizer_vertical'; + + var resizerHtml = + '' + + // BLACK LOWER RIGHT TRIANGLE (ltr) + // BLACK LOWER LEFT TRIANGLE (rtl) + ( resizeDir == 'ltr' ? '\u25E2' : '\u25E3' ) + + ''; + + // Always sticks the corner of botttom space. + resizeDir == 'ltr' && direction == 'ltr' ? event.data.html += resizerHtml : event.data.html = resizerHtml + event.data.html; + } + }, editor, null, 100 ); + + // Toggle the visibility of the resizer when an editor is being maximized or minimized. + editor.on( 'maximize', function( event ) { + editor.ui.space( 'resizer' )[ event.data == CKEDITOR.TRISTATE_ON ? 'hide' : 'show' ](); + } ); + } + } +} ); + +/** + * The minimum editor width, in pixels, when resizing the editor interface by using the resize handle. + * Note: It falls back to editor's actual width if it is smaller than the default value. + * + * Read more in the [documentation](#!/guide/dev_resize) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html). + * + * config.resize_minWidth = 500; + * + * @cfg {Number} [resize_minWidth=750] + * @member CKEDITOR.config + */ + +/** + * The minimum editor height, in pixels, when resizing the editor interface by using the resize handle. + * Note: It falls back to editor's actual height if it is smaller than the default value. + * + * Read more in the [documentation](#!/guide/dev_resize) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html). + * + * config.resize_minHeight = 600; + * + * @cfg {Number} [resize_minHeight=250] + * @member CKEDITOR.config + */ + +/** + * The maximum editor width, in pixels, when resizing the editor interface by using the resize handle. + * + * Read more in the [documentation](#!/guide/dev_resize) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html). + * + * config.resize_maxWidth = 750; + * + * @cfg {Number} [resize_maxWidth=3000] + * @member CKEDITOR.config + */ + +/** + * The maximum editor height, in pixels, when resizing the editor interface by using the resize handle. + * + * Read more in the [documentation](#!/guide/dev_resize) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html). + * + * config.resize_maxHeight = 600; + * + * @cfg {Number} [resize_maxHeight=3000] + * @member CKEDITOR.config + */ + +/** + * Whether to enable the resizing feature. If this feature is disabled, the resize handle will not be visible. + * + * Read more in the [documentation](#!/guide/dev_resize) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html). + * + * config.resize_enabled = false; + * + * @cfg {Boolean} [resize_enabled=true] + * @member CKEDITOR.config + */ + +/** + * The dimensions for which the editor resizing is enabled. Possible values + * are `both`, `vertical`, and `horizontal`. + * + * Read more in the [documentation](#!/guide/dev_resize) + * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html). + * + * config.resize_dir = 'both'; + * + * @since 3.3 + * @cfg {String} [resize_dir='vertical'] + * @member CKEDITOR.config + */ diff --git a/sources/plugins/richcombo/plugin.js b/sources/plugins/richcombo/plugin.js new file mode 100644 index 0000000..231a7c7 --- /dev/null +++ b/sources/plugins/richcombo/plugin.js @@ -0,0 +1,434 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'richcombo', { + requires: 'floatpanel,listblock,button', + + beforeInit: function( editor ) { + editor.ui.addHandler( CKEDITOR.UI_RICHCOMBO, CKEDITOR.ui.richCombo.handler ); + } +} ); + +( function() { + var template = '' + + '{label}' + + '' + + '{label}' + + '' + + '' + + // BLACK DOWN-POINTING TRIANGLE + ( CKEDITOR.env.hc ? '▼' : CKEDITOR.env.air ? ' ' : '' ) + + '' + + '' + + '' + + ''; + + var rcomboTpl = CKEDITOR.addTemplate( 'combo', template ); + + /** + * Button UI element. + * + * @readonly + * @property {String} [='richcombo'] + * @member CKEDITOR + */ + CKEDITOR.UI_RICHCOMBO = 'richcombo'; + + /** + * @class + * @todo + */ + CKEDITOR.ui.richCombo = CKEDITOR.tools.createClass( { + $: function( definition ) { + // Copy all definition properties to this object. + CKEDITOR.tools.extend( this, definition, + // Set defaults. + { + // The combo won't participate in toolbar grouping. + canGroup: false, + title: definition.label, + modes: { wysiwyg: 1 }, + editorFocus: 1 + } ); + + // We don't want the panel definition in this object. + var panelDefinition = this.panel || {}; + delete this.panel; + + this.id = CKEDITOR.tools.getNextNumber(); + + this.document = ( panelDefinition.parent && panelDefinition.parent.getDocument() ) || CKEDITOR.document; + + panelDefinition.className = 'cke_combopanel'; + panelDefinition.block = { + multiSelect: panelDefinition.multiSelect, + attributes: panelDefinition.attributes + }; + panelDefinition.toolbarRelated = true; + + this._ = { + panelDefinition: panelDefinition, + items: {} + }; + }, + + proto: { + renderHtml: function( editor ) { + var output = []; + this.render( editor, output ); + return output.join( '' ); + }, + + /** + * Renders the combo. + * + * @param {CKEDITOR.editor} editor The editor instance which this button is + * to be used by. + * @param {Array} output The output array to which append the HTML relative + * to this button. + */ + render: function( editor, output ) { + var env = CKEDITOR.env; + + var id = 'cke_' + this.id; + var clickFn = CKEDITOR.tools.addFunction( function( el ) { + // Restore locked selection in Opera. + if ( selLocked ) { + editor.unlockSelection( 1 ); + selLocked = 0; + } + instance.execute( el ); + }, this ); + + var combo = this; + var instance = { + id: id, + combo: this, + focus: function() { + var element = CKEDITOR.document.getById( id ).getChild( 1 ); + element.focus(); + }, + execute: function( el ) { + var _ = combo._; + + if ( _.state == CKEDITOR.TRISTATE_DISABLED ) + return; + + combo.createPanel( editor ); + + if ( _.on ) { + _.panel.hide(); + return; + } + + combo.commit(); + var value = combo.getValue(); + if ( value ) + _.list.mark( value ); + else + _.list.unmarkAll(); + + _.panel.showBlock( combo.id, new CKEDITOR.dom.element( el ), 4 ); + }, + clickFn: clickFn + }; + + function updateState() { + // Don't change state while richcombo is active (#11793). + if ( this.getState() == CKEDITOR.TRISTATE_ON ) + return; + + var state = this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; + + if ( editor.readOnly && !this.readOnly ) + state = CKEDITOR.TRISTATE_DISABLED; + + this.setState( state ); + this.setValue( '' ); + + // Let plugin to disable button. + if ( state != CKEDITOR.TRISTATE_DISABLED && this.refresh ) + this.refresh(); + } + + // Update status when activeFilter, mode, selection or readOnly changes. + editor.on( 'activeFilterChange', updateState, this ); + editor.on( 'mode', updateState, this ); + editor.on( 'selectionChange', updateState, this ); + // If this combo is sensitive to readOnly state, update it accordingly. + !this.readOnly && editor.on( 'readOnly', updateState, this ); + + var keyDownFn = CKEDITOR.tools.addFunction( function( ev, element ) { + ev = new CKEDITOR.dom.event( ev ); + + var keystroke = ev.getKeystroke(); + + // ARROW-DOWN + // This call is duplicated in plugins/toolbar/plugin.js in itemKeystroke(). + // Move focus to the first element after drop down was opened by the arrow down key. + if ( keystroke == 40 ) { + editor.once( 'panelShow', function( evt ) { + evt.data._.panel._.currentBlock.onKeyDown( 40 ); + } ); + } + + switch ( keystroke ) { + case 13: // ENTER + case 32: // SPACE + case 40: // ARROW-DOWN + // Show panel + CKEDITOR.tools.callFunction( clickFn, element ); + break; + default: + // Delegate the default behavior to toolbar button key handling. + instance.onkey( instance, keystroke ); + } + + // Avoid subsequent focus grab on editor document. + ev.preventDefault(); + } ); + + var focusFn = CKEDITOR.tools.addFunction( function() { + instance.onfocus && instance.onfocus(); + } ); + + var selLocked = 0; + + // For clean up + instance.keyDownFn = keyDownFn; + + var params = { + id: id, + name: this.name || this.command, + label: this.label, + title: this.title, + cls: this.className || '', + titleJs: env.gecko && !env.hc ? '' : ( this.title || '' ).replace( "'", '' ), + keydownFn: keyDownFn, + focusFn: focusFn, + clickFn: clickFn + }; + + rcomboTpl.output( params, output ); + + if ( this.onRender ) + this.onRender(); + + return instance; + }, + + createPanel: function( editor ) { + if ( this._.panel ) + return; + + var panelDefinition = this._.panelDefinition, + panelBlockDefinition = this._.panelDefinition.block, + panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(), + namedPanelCls = 'cke_combopanel__' + this.name, + panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ), + list = panel.addListBlock( this.id, panelBlockDefinition ), + me = this; + + panel.onShow = function() { + this.element.addClass( namedPanelCls ); + + me.setState( CKEDITOR.TRISTATE_ON ); + + me._.on = 1; + + me.editorFocus && !editor.focusManager.hasFocus && editor.focus(); + + if ( me.onOpen ) + me.onOpen(); + + // The "panelShow" event is fired assinchronously, after the + // onShow method call. + editor.once( 'panelShow', function() { + list.focus( !list.multiSelect && me.getValue() ); + } ); + }; + + panel.onHide = function( preventOnClose ) { + this.element.removeClass( namedPanelCls ); + + me.setState( me.modes && me.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); + + me._.on = 0; + + if ( !preventOnClose && me.onClose ) + me.onClose(); + }; + + panel.onEscape = function() { + // Hide drop-down with focus returned. + panel.hide( 1 ); + }; + + list.onClick = function( value, marked ) { + + if ( me.onClick ) + me.onClick.call( me, value, marked ); + + panel.hide(); + }; + + this._.panel = panel; + this._.list = list; + + panel.getBlock( this.id ).onHide = function() { + me._.on = 0; + me.setState( CKEDITOR.TRISTATE_OFF ); + }; + + if ( this.init ) + this.init(); + }, + + setValue: function( value, text ) { + this._.value = value; + + var textElement = this.document.getById( 'cke_' + this.id + '_text' ); + if ( textElement ) { + if ( !( value || text ) ) { + text = this.label; + textElement.addClass( 'cke_combo_inlinelabel' ); + } else { + textElement.removeClass( 'cke_combo_inlinelabel' ); + } + + textElement.setText( typeof text != 'undefined' ? text : value ); + } + }, + + getValue: function() { + return this._.value || ''; + }, + + unmarkAll: function() { + this._.list.unmarkAll(); + }, + + mark: function( value ) { + this._.list.mark( value ); + }, + + hideItem: function( value ) { + this._.list.hideItem( value ); + }, + + hideGroup: function( groupTitle ) { + this._.list.hideGroup( groupTitle ); + }, + + showAll: function() { + this._.list.showAll(); + }, + + add: function( value, html, text ) { + this._.items[ value ] = text || value; + this._.list.add( value, html, text ); + }, + + startGroup: function( title ) { + this._.list.startGroup( title ); + }, + + commit: function() { + if ( !this._.committed ) { + this._.list.commit(); + this._.committed = 1; + CKEDITOR.ui.fire( 'ready', this ); + } + this._.committed = 1; + }, + + setState: function( state ) { + if ( this._.state == state ) + return; + + var el = this.document.getById( 'cke_' + this.id ); + el.setState( state, 'cke_combo' ); + + state == CKEDITOR.TRISTATE_DISABLED ? + el.setAttribute( 'aria-disabled', true ) : + el.removeAttribute( 'aria-disabled' ); + + this._.state = state; + }, + + getState: function() { + return this._.state; + }, + + enable: function() { + if ( this._.state == CKEDITOR.TRISTATE_DISABLED ) + this.setState( this._.lastState ); + }, + + disable: function() { + if ( this._.state != CKEDITOR.TRISTATE_DISABLED ) { + this._.lastState = this._.state; + this.setState( CKEDITOR.TRISTATE_DISABLED ); + } + } + }, + + /** + * Represents richCombo handler object. + * + * @class CKEDITOR.ui.richCombo.handler + * @singleton + * @extends CKEDITOR.ui.handlerDefinition + */ + statics: { + handler: { + /** + * Transforms a richCombo definition in a {@link CKEDITOR.ui.richCombo} instance. + * + * @param {Object} definition + * @returns {CKEDITOR.ui.richCombo} + */ + create: function( definition ) { + return new CKEDITOR.ui.richCombo( definition ); + } + } + } + } ); + + /** + * @param {String} name + * @param {Object} definition + * @member CKEDITOR.ui + * @todo + */ + CKEDITOR.ui.prototype.addRichCombo = function( name, definition ) { + this.add( name, CKEDITOR.UI_RICHCOMBO, definition ); + }; + +} )(); diff --git a/sources/plugins/showborders/plugin.js b/sources/plugins/showborders/plugin.js new file mode 100644 index 0000000..7dbfb59 --- /dev/null +++ b/sources/plugins/showborders/plugin.js @@ -0,0 +1,174 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The "show border" plugin. The command display visible outline + * border line around all table elements if table doesn't have a none-zero 'border' attribute specified. + */ + +( function() { + var commandDefinition = { + preserveState: true, + editorFocus: false, + readOnly: 1, + + exec: function( editor ) { + this.toggleState(); + this.refresh( editor ); + }, + + refresh: function( editor ) { + if ( editor.document ) { + var funcName = ( this.state == CKEDITOR.TRISTATE_ON ) ? 'attachClass' : 'removeClass'; + editor.editable()[ funcName ]( 'cke_show_borders' ); + } + } + }; + + var showBorderClassName = 'cke_show_border'; + + CKEDITOR.plugins.add( 'showborders', { + modes: { 'wysiwyg': 1 }, + + onLoad: function() { + var cssStyleText, + cssTemplate = + // TODO: For IE6, we don't have child selector support, + // where nested table cells could be incorrect. + ( CKEDITOR.env.ie6Compat ? [ + '.%1 table.%2,', + '.%1 table.%2 td, .%1 table.%2 th', + '{', + 'border : #d3d3d3 1px dotted', + '}' + ] : [ + '.%1 table.%2,', + '.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,', + '.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,', + '.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,', + '.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th', + '{', + 'border : #d3d3d3 1px dotted', + '}' + ] ).join( '' ); + + cssStyleText = cssTemplate.replace( /%2/g, showBorderClassName ).replace( /%1/g, 'cke_show_borders ' ); + + CKEDITOR.addCss( cssStyleText ); + }, + + init: function( editor ) { + + var command = editor.addCommand( 'showborders', commandDefinition ); + command.canUndo = false; + + if ( editor.config.startupShowBorders !== false ) + command.setState( CKEDITOR.TRISTATE_ON ); + + // Refresh the command on setData. + editor.on( 'mode', function() { + if ( command.state != CKEDITOR.TRISTATE_DISABLED ) + command.refresh( editor ); + }, null, null, 100 ); + + // Refresh the command on wysiwyg frame reloads. + editor.on( 'contentDom', function() { + if ( command.state != CKEDITOR.TRISTATE_DISABLED ) + command.refresh( editor ); + } ); + + editor.on( 'removeFormatCleanup', function( evt ) { + var element = evt.data; + if ( editor.getCommand( 'showborders' ).state == CKEDITOR.TRISTATE_ON && element.is( 'table' ) && ( !element.hasAttribute( 'border' ) || parseInt( element.getAttribute( 'border' ), 10 ) <= 0 ) ) + element.addClass( showBorderClassName ); + } ); + }, + + afterInit: function( editor ) { + var dataProcessor = editor.dataProcessor, + dataFilter = dataProcessor && dataProcessor.dataFilter, + htmlFilter = dataProcessor && dataProcessor.htmlFilter; + + if ( dataFilter ) { + dataFilter.addRules( { + elements: { + 'table': function( element ) { + var attributes = element.attributes, + cssClass = attributes[ 'class' ], + border = parseInt( attributes.border, 10 ); + + if ( ( !border || border <= 0 ) && ( !cssClass || cssClass.indexOf( showBorderClassName ) == -1 ) ) + attributes[ 'class' ] = ( cssClass || '' ) + ' ' + showBorderClassName; + } + } + } ); + } + + if ( htmlFilter ) { + htmlFilter.addRules( { + elements: { + 'table': function( table ) { + var attributes = table.attributes, + cssClass = attributes[ 'class' ]; + + cssClass && ( attributes[ 'class' ] = cssClass.replace( showBorderClassName, '' ).replace( /\s{2}/, ' ' ).replace( /^\s+|\s+$/, '' ) ); + } + } + } ); + } + } + } ); + + // Table dialog must be aware of it. + CKEDITOR.on( 'dialogDefinition', function( ev ) { + var dialogName = ev.data.name; + + if ( dialogName == 'table' || dialogName == 'tableProperties' ) { + var dialogDefinition = ev.data.definition, + infoTab = dialogDefinition.getContents( 'info' ), + borderField = infoTab.get( 'txtBorder' ), + originalCommit = borderField.commit; + + borderField.commit = CKEDITOR.tools.override( originalCommit, function( org ) { + return function( data, selectedTable ) { + org.apply( this, arguments ); + var value = parseInt( this.getValue(), 10 ); + selectedTable[ ( !value || value <= 0 ) ? 'addClass' : 'removeClass' ]( showBorderClassName ); + }; + } ); + + var advTab = dialogDefinition.getContents( 'advanced' ), + classField = advTab && advTab.get( 'advCSSClasses' ); + + if ( classField ) { + classField.setup = CKEDITOR.tools.override( classField.setup, function( originalSetup ) { + return function() { + originalSetup.apply( this, arguments ); + this.setValue( this.getValue().replace( /cke_show_border/, '' ) ); + }; + } ); + + classField.commit = CKEDITOR.tools.override( classField.commit, function( originalCommit ) { + return function( data, element ) { + originalCommit.apply( this, arguments ); + + if ( !parseInt( element.getAttribute( 'border' ), 10 ) ) + element.addClass( 'cke_show_border' ); + }; + } ); + } + } + } ); + +} )(); + +/** + * Whether to automatically enable the "show borders" command when the editor loads. + * + * config.startupShowBorders = false; + * + * @cfg {Boolean} [startupShowBorders=true] + * @member CKEDITOR.config + */ diff --git a/sources/plugins/sourcearea/icons/hidpi/source-rtl.png b/sources/plugins/sourcearea/icons/hidpi/source-rtl.png new file mode 100644 index 0000000..c95da32 Binary files /dev/null and b/sources/plugins/sourcearea/icons/hidpi/source-rtl.png differ diff --git a/sources/plugins/sourcearea/icons/hidpi/source.png b/sources/plugins/sourcearea/icons/hidpi/source.png new file mode 100644 index 0000000..2f3eae1 Binary files /dev/null and b/sources/plugins/sourcearea/icons/hidpi/source.png differ diff --git a/sources/plugins/sourcearea/icons/source-rtl.png b/sources/plugins/sourcearea/icons/source-rtl.png new file mode 100644 index 0000000..5353eee Binary files /dev/null and b/sources/plugins/sourcearea/icons/source-rtl.png differ diff --git a/sources/plugins/sourcearea/icons/source.png b/sources/plugins/sourcearea/icons/source.png new file mode 100644 index 0000000..0783e85 Binary files /dev/null and b/sources/plugins/sourcearea/icons/source.png differ diff --git a/sources/plugins/sourcearea/lang/af.js b/sources/plugins/sourcearea/lang/af.js new file mode 100644 index 0000000..a5a499e --- /dev/null +++ b/sources/plugins/sourcearea/lang/af.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'af', { + toolbar: 'Bron' +} ); diff --git a/sources/plugins/sourcearea/lang/ar.js b/sources/plugins/sourcearea/lang/ar.js new file mode 100644 index 0000000..40808ac --- /dev/null +++ b/sources/plugins/sourcearea/lang/ar.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ar', { + toolbar: 'المصدر' +} ); diff --git a/sources/plugins/sourcearea/lang/az.js b/sources/plugins/sourcearea/lang/az.js new file mode 100644 index 0000000..9aeff4b --- /dev/null +++ b/sources/plugins/sourcearea/lang/az.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'az', { + toolbar: 'HTML mənbəyini göstər' +} ); diff --git a/sources/plugins/sourcearea/lang/bg.js b/sources/plugins/sourcearea/lang/bg.js new file mode 100644 index 0000000..4902635 --- /dev/null +++ b/sources/plugins/sourcearea/lang/bg.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'bg', { + toolbar: 'Изходен код' +} ); diff --git a/sources/plugins/sourcearea/lang/bn.js b/sources/plugins/sourcearea/lang/bn.js new file mode 100644 index 0000000..b050458 --- /dev/null +++ b/sources/plugins/sourcearea/lang/bn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'bn', { + toolbar: 'উৎস' +} ); diff --git a/sources/plugins/sourcearea/lang/bs.js b/sources/plugins/sourcearea/lang/bs.js new file mode 100644 index 0000000..c0b5e09 --- /dev/null +++ b/sources/plugins/sourcearea/lang/bs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'bs', { + toolbar: 'HTML kôd' +} ); diff --git a/sources/plugins/sourcearea/lang/ca.js b/sources/plugins/sourcearea/lang/ca.js new file mode 100644 index 0000000..c958e9b --- /dev/null +++ b/sources/plugins/sourcearea/lang/ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ca', { + toolbar: 'Codi font' +} ); diff --git a/sources/plugins/sourcearea/lang/cs.js b/sources/plugins/sourcearea/lang/cs.js new file mode 100644 index 0000000..dccf574 --- /dev/null +++ b/sources/plugins/sourcearea/lang/cs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'cs', { + toolbar: 'Zdroj' +} ); diff --git a/sources/plugins/sourcearea/lang/cy.js b/sources/plugins/sourcearea/lang/cy.js new file mode 100644 index 0000000..b8ce201 --- /dev/null +++ b/sources/plugins/sourcearea/lang/cy.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'cy', { + toolbar: 'HTML' +} ); diff --git a/sources/plugins/sourcearea/lang/da.js b/sources/plugins/sourcearea/lang/da.js new file mode 100644 index 0000000..bf02c14 --- /dev/null +++ b/sources/plugins/sourcearea/lang/da.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'da', { + toolbar: 'Kilde' +} ); diff --git a/sources/plugins/sourcearea/lang/de-ch.js b/sources/plugins/sourcearea/lang/de-ch.js new file mode 100644 index 0000000..c039623 --- /dev/null +++ b/sources/plugins/sourcearea/lang/de-ch.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'de-ch', { + toolbar: 'Quellcode' +} ); diff --git a/sources/plugins/sourcearea/lang/de.js b/sources/plugins/sourcearea/lang/de.js new file mode 100644 index 0000000..dfa995f --- /dev/null +++ b/sources/plugins/sourcearea/lang/de.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'de', { + toolbar: 'Quellcode' +} ); diff --git a/sources/plugins/sourcearea/lang/el.js b/sources/plugins/sourcearea/lang/el.js new file mode 100644 index 0000000..0a8d8a8 --- /dev/null +++ b/sources/plugins/sourcearea/lang/el.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'el', { + toolbar: 'Κώδικας' +} ); diff --git a/sources/plugins/sourcearea/lang/en-au.js b/sources/plugins/sourcearea/lang/en-au.js new file mode 100644 index 0000000..10e7843 --- /dev/null +++ b/sources/plugins/sourcearea/lang/en-au.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'en-au', { + toolbar: 'Source' +} ); diff --git a/sources/plugins/sourcearea/lang/en-ca.js b/sources/plugins/sourcearea/lang/en-ca.js new file mode 100644 index 0000000..f5e61da --- /dev/null +++ b/sources/plugins/sourcearea/lang/en-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'en-ca', { + toolbar: 'Source' +} ); diff --git a/sources/plugins/sourcearea/lang/en-gb.js b/sources/plugins/sourcearea/lang/en-gb.js new file mode 100644 index 0000000..5d876aa --- /dev/null +++ b/sources/plugins/sourcearea/lang/en-gb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'en-gb', { + toolbar: 'Source' +} ); diff --git a/sources/plugins/sourcearea/lang/en.js b/sources/plugins/sourcearea/lang/en.js new file mode 100644 index 0000000..90a24e9 --- /dev/null +++ b/sources/plugins/sourcearea/lang/en.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'en', { + toolbar: 'Source' +} ); diff --git a/sources/plugins/sourcearea/lang/eo.js b/sources/plugins/sourcearea/lang/eo.js new file mode 100644 index 0000000..613de63 --- /dev/null +++ b/sources/plugins/sourcearea/lang/eo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'eo', { + toolbar: 'Fonto' +} ); diff --git a/sources/plugins/sourcearea/lang/es.js b/sources/plugins/sourcearea/lang/es.js new file mode 100644 index 0000000..014a967 --- /dev/null +++ b/sources/plugins/sourcearea/lang/es.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'es', { + toolbar: 'Fuente HTML' +} ); diff --git a/sources/plugins/sourcearea/lang/et.js b/sources/plugins/sourcearea/lang/et.js new file mode 100644 index 0000000..9a73ece --- /dev/null +++ b/sources/plugins/sourcearea/lang/et.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'et', { + toolbar: 'Lähtekood' +} ); diff --git a/sources/plugins/sourcearea/lang/eu.js b/sources/plugins/sourcearea/lang/eu.js new file mode 100644 index 0000000..350b3e2 --- /dev/null +++ b/sources/plugins/sourcearea/lang/eu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'eu', { + toolbar: 'Iturburua' +} ); diff --git a/sources/plugins/sourcearea/lang/fa.js b/sources/plugins/sourcearea/lang/fa.js new file mode 100644 index 0000000..40757c0 --- /dev/null +++ b/sources/plugins/sourcearea/lang/fa.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'fa', { + toolbar: 'منبع' +} ); diff --git a/sources/plugins/sourcearea/lang/fi.js b/sources/plugins/sourcearea/lang/fi.js new file mode 100644 index 0000000..fba260e --- /dev/null +++ b/sources/plugins/sourcearea/lang/fi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'fi', { + toolbar: 'Koodi' +} ); diff --git a/sources/plugins/sourcearea/lang/fo.js b/sources/plugins/sourcearea/lang/fo.js new file mode 100644 index 0000000..f384c40 --- /dev/null +++ b/sources/plugins/sourcearea/lang/fo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'fo', { + toolbar: 'Kelda' +} ); diff --git a/sources/plugins/sourcearea/lang/fr-ca.js b/sources/plugins/sourcearea/lang/fr-ca.js new file mode 100644 index 0000000..707686f --- /dev/null +++ b/sources/plugins/sourcearea/lang/fr-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'fr-ca', { + toolbar: 'Source' +} ); diff --git a/sources/plugins/sourcearea/lang/fr.js b/sources/plugins/sourcearea/lang/fr.js new file mode 100644 index 0000000..57d4f5f --- /dev/null +++ b/sources/plugins/sourcearea/lang/fr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'fr', { + toolbar: 'Source' +} ); diff --git a/sources/plugins/sourcearea/lang/gl.js b/sources/plugins/sourcearea/lang/gl.js new file mode 100644 index 0000000..c68a1da --- /dev/null +++ b/sources/plugins/sourcearea/lang/gl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'gl', { + toolbar: 'Orixe' +} ); diff --git a/sources/plugins/sourcearea/lang/gu.js b/sources/plugins/sourcearea/lang/gu.js new file mode 100644 index 0000000..a1c9b66 --- /dev/null +++ b/sources/plugins/sourcearea/lang/gu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'gu', { + toolbar: 'મૂળ કે પ્રાથમિક દસ્તાવેજ' +} ); diff --git a/sources/plugins/sourcearea/lang/he.js b/sources/plugins/sourcearea/lang/he.js new file mode 100644 index 0000000..8b0f28d --- /dev/null +++ b/sources/plugins/sourcearea/lang/he.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'he', { + toolbar: 'מקור' +} ); diff --git a/sources/plugins/sourcearea/lang/hi.js b/sources/plugins/sourcearea/lang/hi.js new file mode 100644 index 0000000..0d8cc1b --- /dev/null +++ b/sources/plugins/sourcearea/lang/hi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'hi', { + toolbar: 'सोर्स' +} ); diff --git a/sources/plugins/sourcearea/lang/hr.js b/sources/plugins/sourcearea/lang/hr.js new file mode 100644 index 0000000..dca2202 --- /dev/null +++ b/sources/plugins/sourcearea/lang/hr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'hr', { + toolbar: 'Kôd' +} ); diff --git a/sources/plugins/sourcearea/lang/hu.js b/sources/plugins/sourcearea/lang/hu.js new file mode 100644 index 0000000..9628fe4 --- /dev/null +++ b/sources/plugins/sourcearea/lang/hu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'hu', { + toolbar: 'Forráskód' +} ); diff --git a/sources/plugins/sourcearea/lang/id.js b/sources/plugins/sourcearea/lang/id.js new file mode 100644 index 0000000..f8e25c5 --- /dev/null +++ b/sources/plugins/sourcearea/lang/id.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'id', { + toolbar: 'Sumber' +} ); diff --git a/sources/plugins/sourcearea/lang/is.js b/sources/plugins/sourcearea/lang/is.js new file mode 100644 index 0000000..a90207d --- /dev/null +++ b/sources/plugins/sourcearea/lang/is.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'is', { + toolbar: 'Kóði' +} ); diff --git a/sources/plugins/sourcearea/lang/it.js b/sources/plugins/sourcearea/lang/it.js new file mode 100644 index 0000000..b445a21 --- /dev/null +++ b/sources/plugins/sourcearea/lang/it.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'it', { + toolbar: 'Sorgente' +} ); diff --git a/sources/plugins/sourcearea/lang/ja.js b/sources/plugins/sourcearea/lang/ja.js new file mode 100644 index 0000000..3f026b6 --- /dev/null +++ b/sources/plugins/sourcearea/lang/ja.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ja', { + toolbar: 'ソース' +} ); diff --git a/sources/plugins/sourcearea/lang/ka.js b/sources/plugins/sourcearea/lang/ka.js new file mode 100644 index 0000000..f06b130 --- /dev/null +++ b/sources/plugins/sourcearea/lang/ka.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ka', { + toolbar: 'კოდები' +} ); diff --git a/sources/plugins/sourcearea/lang/km.js b/sources/plugins/sourcearea/lang/km.js new file mode 100644 index 0000000..9cd4769 --- /dev/null +++ b/sources/plugins/sourcearea/lang/km.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'km', { + toolbar: 'អក្សរ​កូដ' +} ); diff --git a/sources/plugins/sourcearea/lang/ko.js b/sources/plugins/sourcearea/lang/ko.js new file mode 100644 index 0000000..26fe7ff --- /dev/null +++ b/sources/plugins/sourcearea/lang/ko.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ko', { + toolbar: '소스' +} ); diff --git a/sources/plugins/sourcearea/lang/ku.js b/sources/plugins/sourcearea/lang/ku.js new file mode 100644 index 0000000..a3f1263 --- /dev/null +++ b/sources/plugins/sourcearea/lang/ku.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ku', { + toolbar: 'سەرچاوە' +} ); diff --git a/sources/plugins/sourcearea/lang/lt.js b/sources/plugins/sourcearea/lang/lt.js new file mode 100644 index 0000000..c3304dc --- /dev/null +++ b/sources/plugins/sourcearea/lang/lt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'lt', { + toolbar: 'Šaltinis' +} ); diff --git a/sources/plugins/sourcearea/lang/lv.js b/sources/plugins/sourcearea/lang/lv.js new file mode 100644 index 0000000..c3ef246 --- /dev/null +++ b/sources/plugins/sourcearea/lang/lv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'lv', { + toolbar: 'HTML kods' +} ); diff --git a/sources/plugins/sourcearea/lang/mk.js b/sources/plugins/sourcearea/lang/mk.js new file mode 100644 index 0000000..eeccabd --- /dev/null +++ b/sources/plugins/sourcearea/lang/mk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'mk', { + toolbar: 'Source' // MISSING +} ); diff --git a/sources/plugins/sourcearea/lang/mn.js b/sources/plugins/sourcearea/lang/mn.js new file mode 100644 index 0000000..a7c1288 --- /dev/null +++ b/sources/plugins/sourcearea/lang/mn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'mn', { + toolbar: 'Код' +} ); diff --git a/sources/plugins/sourcearea/lang/ms.js b/sources/plugins/sourcearea/lang/ms.js new file mode 100644 index 0000000..f09ac53 --- /dev/null +++ b/sources/plugins/sourcearea/lang/ms.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ms', { + toolbar: 'Sumber' +} ); diff --git a/sources/plugins/sourcearea/lang/nb.js b/sources/plugins/sourcearea/lang/nb.js new file mode 100644 index 0000000..87b75a8 --- /dev/null +++ b/sources/plugins/sourcearea/lang/nb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'nb', { + toolbar: 'Kilde' +} ); diff --git a/sources/plugins/sourcearea/lang/nl.js b/sources/plugins/sourcearea/lang/nl.js new file mode 100644 index 0000000..dc61f34 --- /dev/null +++ b/sources/plugins/sourcearea/lang/nl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'nl', { + toolbar: 'Broncode' +} ); diff --git a/sources/plugins/sourcearea/lang/no.js b/sources/plugins/sourcearea/lang/no.js new file mode 100644 index 0000000..86f386d --- /dev/null +++ b/sources/plugins/sourcearea/lang/no.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'no', { + toolbar: 'Kilde' +} ); diff --git a/sources/plugins/sourcearea/lang/oc.js b/sources/plugins/sourcearea/lang/oc.js new file mode 100644 index 0000000..90f418f --- /dev/null +++ b/sources/plugins/sourcearea/lang/oc.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'oc', { + toolbar: 'Font' +} ); diff --git a/sources/plugins/sourcearea/lang/pl.js b/sources/plugins/sourcearea/lang/pl.js new file mode 100644 index 0000000..48734a8 --- /dev/null +++ b/sources/plugins/sourcearea/lang/pl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'pl', { + toolbar: 'Źródło dokumentu' +} ); diff --git a/sources/plugins/sourcearea/lang/pt-br.js b/sources/plugins/sourcearea/lang/pt-br.js new file mode 100644 index 0000000..54e3ce1 --- /dev/null +++ b/sources/plugins/sourcearea/lang/pt-br.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'pt-br', { + toolbar: 'Código-Fonte' +} ); diff --git a/sources/plugins/sourcearea/lang/pt.js b/sources/plugins/sourcearea/lang/pt.js new file mode 100644 index 0000000..7fd6c23 --- /dev/null +++ b/sources/plugins/sourcearea/lang/pt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'pt', { + toolbar: 'Fonte' +} ); diff --git a/sources/plugins/sourcearea/lang/ro.js b/sources/plugins/sourcearea/lang/ro.js new file mode 100644 index 0000000..5eb00c4 --- /dev/null +++ b/sources/plugins/sourcearea/lang/ro.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ro', { + toolbar: 'Sursa' +} ); diff --git a/sources/plugins/sourcearea/lang/ru.js b/sources/plugins/sourcearea/lang/ru.js new file mode 100644 index 0000000..304695c --- /dev/null +++ b/sources/plugins/sourcearea/lang/ru.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ru', { + toolbar: 'Источник' +} ); diff --git a/sources/plugins/sourcearea/lang/si.js b/sources/plugins/sourcearea/lang/si.js new file mode 100644 index 0000000..22996eb --- /dev/null +++ b/sources/plugins/sourcearea/lang/si.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'si', { + toolbar: 'මුලාශ්‍රය' +} ); diff --git a/sources/plugins/sourcearea/lang/sk.js b/sources/plugins/sourcearea/lang/sk.js new file mode 100644 index 0000000..aed1c61 --- /dev/null +++ b/sources/plugins/sourcearea/lang/sk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'sk', { + toolbar: 'Zdroj' +} ); diff --git a/sources/plugins/sourcearea/lang/sl.js b/sources/plugins/sourcearea/lang/sl.js new file mode 100644 index 0000000..b9a2b5f --- /dev/null +++ b/sources/plugins/sourcearea/lang/sl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'sl', { + toolbar: 'Izvorna koda' +} ); diff --git a/sources/plugins/sourcearea/lang/sq.js b/sources/plugins/sourcearea/lang/sq.js new file mode 100644 index 0000000..f4512ce --- /dev/null +++ b/sources/plugins/sourcearea/lang/sq.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'sq', { + toolbar: 'Burimi' +} ); diff --git a/sources/plugins/sourcearea/lang/sr-latn.js b/sources/plugins/sourcearea/lang/sr-latn.js new file mode 100644 index 0000000..0d8ebd7 --- /dev/null +++ b/sources/plugins/sourcearea/lang/sr-latn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'sr-latn', { + toolbar: 'Kôd' +} ); diff --git a/sources/plugins/sourcearea/lang/sr.js b/sources/plugins/sourcearea/lang/sr.js new file mode 100644 index 0000000..a872556 --- /dev/null +++ b/sources/plugins/sourcearea/lang/sr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'sr', { + toolbar: 'Kôд' +} ); diff --git a/sources/plugins/sourcearea/lang/sv.js b/sources/plugins/sourcearea/lang/sv.js new file mode 100644 index 0000000..a05d49d --- /dev/null +++ b/sources/plugins/sourcearea/lang/sv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'sv', { + toolbar: 'Källa' +} ); diff --git a/sources/plugins/sourcearea/lang/th.js b/sources/plugins/sourcearea/lang/th.js new file mode 100644 index 0000000..4afb9bc --- /dev/null +++ b/sources/plugins/sourcearea/lang/th.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'th', { + toolbar: 'ดูรหัส HTML' +} ); diff --git a/sources/plugins/sourcearea/lang/tr.js b/sources/plugins/sourcearea/lang/tr.js new file mode 100644 index 0000000..7a9f70a --- /dev/null +++ b/sources/plugins/sourcearea/lang/tr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'tr', { + toolbar: 'Kaynak' +} ); diff --git a/sources/plugins/sourcearea/lang/tt.js b/sources/plugins/sourcearea/lang/tt.js new file mode 100644 index 0000000..ca05df1 --- /dev/null +++ b/sources/plugins/sourcearea/lang/tt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'tt', { + toolbar: 'Чыганак' +} ); diff --git a/sources/plugins/sourcearea/lang/ug.js b/sources/plugins/sourcearea/lang/ug.js new file mode 100644 index 0000000..791c596 --- /dev/null +++ b/sources/plugins/sourcearea/lang/ug.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'ug', { + toolbar: 'مەنبە' +} ); diff --git a/sources/plugins/sourcearea/lang/uk.js b/sources/plugins/sourcearea/lang/uk.js new file mode 100644 index 0000000..905af47 --- /dev/null +++ b/sources/plugins/sourcearea/lang/uk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'uk', { + toolbar: 'Джерело' +} ); diff --git a/sources/plugins/sourcearea/lang/vi.js b/sources/plugins/sourcearea/lang/vi.js new file mode 100644 index 0000000..df7eb93 --- /dev/null +++ b/sources/plugins/sourcearea/lang/vi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'vi', { + toolbar: 'Mã HTML' +} ); diff --git a/sources/plugins/sourcearea/lang/zh-cn.js b/sources/plugins/sourcearea/lang/zh-cn.js new file mode 100644 index 0000000..a98c869 --- /dev/null +++ b/sources/plugins/sourcearea/lang/zh-cn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'zh-cn', { + toolbar: '源码' +} ); diff --git a/sources/plugins/sourcearea/lang/zh.js b/sources/plugins/sourcearea/lang/zh.js new file mode 100644 index 0000000..043dd11 --- /dev/null +++ b/sources/plugins/sourcearea/lang/zh.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'sourcearea', 'zh', { + toolbar: '原始碼' +} ); diff --git a/sources/plugins/sourcearea/plugin.js b/sources/plugins/sourcearea/plugin.js new file mode 100644 index 0000000..837bc30 --- /dev/null +++ b/sources/plugins/sourcearea/plugin.js @@ -0,0 +1,168 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The Source Editing Area plugin. It registers the "source" editing + * mode, which displays raw HTML data being edited in the editor. + */ + +( function() { + CKEDITOR.plugins.add( 'sourcearea', { + // jscs:disable maximumLineLength + lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + icons: 'source,source-rtl', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + init: function( editor ) { + // Source mode in inline editors is only available through the "sourcedialog" plugin. + if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ) + return; + + var sourcearea = CKEDITOR.plugins.sourcearea; + + editor.addMode( 'source', function( callback ) { + var contentsSpace = editor.ui.space( 'contents' ), + textarea = contentsSpace.getDocument().createElement( 'textarea' ); + + textarea.setStyles( + CKEDITOR.tools.extend( { + // IE7 has overflow the +

+	
+ +
+

Full toolbar configuration

+

Below you can see editor with full toolbar, generated automatically by the editor.

+

+ Note: To create editor instance with full toolbar you don't have to set anything. + Just leave toolbar and toolbarGroups with the default, null values. +

+ +

+	
+ + + + + + diff --git a/sources/plugins/widget/dev/assets/contents.css b/sources/plugins/widget/dev/assets/contents.css new file mode 100644 index 0000000..2cff316 --- /dev/null +++ b/sources/plugins/widget/dev/assets/contents.css @@ -0,0 +1,23 @@ +.mediumBorder { + border-width: 2px; +} +.thickBorder { + border-width: 5px; +} +img.thickBorder, img.mediumBorder { + border-style: solid; + border-color: #CCC; +} +.important.soMuch { + margin: 25px; + padding: 25px; + background: red; + border: none; +} + +span.redMarker { + background-color: red; +} +.invisible { + opacity: 0.1; +} diff --git a/sources/plugins/widget/dev/assets/sample.jpg b/sources/plugins/widget/dev/assets/sample.jpg new file mode 100644 index 0000000..a4a77fa Binary files /dev/null and b/sources/plugins/widget/dev/assets/sample.jpg differ diff --git a/sources/plugins/widget/dev/assets/simplebox/contents.css b/sources/plugins/widget/dev/assets/simplebox/contents.css new file mode 100644 index 0000000..ddf3675 --- /dev/null +++ b/sources/plugins/widget/dev/assets/simplebox/contents.css @@ -0,0 +1,36 @@ +.simplebox { + padding: 8px; + margin: 10px; + background: #eee; + border-radius: 8px; + border: 1px solid #ddd; + box-shadow: 0 1px 1px #fff inset, 0 -1px 0px #ccc inset; +} +.simplebox-title, .simplebox-content { + box-shadow: 0 1px 1px #ddd inset; + border: 1px solid #cccccc; + border-radius: 5px; + background: #fff; +} +.simplebox-title { + margin: 0 0 8px; + padding: 5px 8px; +} +.simplebox-content { + padding: 0 8px; +} +.simplebox-content::after { + content: ''; + display: block; + clear: both; +} +.simplebox.align-right { + float: right; +} +.simplebox.align-left { + float: left; +} +.simplebox.align-center { + margin-left: auto; + margin-right: auto; +} diff --git a/sources/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js b/sources/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js new file mode 100644 index 0000000..45a150c --- /dev/null +++ b/sources/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js @@ -0,0 +1,51 @@ +// Note: This automatic widget to dialog window binding (the fact that every field is set up from the widget +// and is committed to the widget) is only possible when the dialog is opened by the Widgets System +// (i.e. the widgetDef.dialog property is set). +// When you are opening the dialog window by yourself, you need to take care of this by yourself too. + +CKEDITOR.dialog.add( 'simplebox', function( editor ) { + return { + title: 'Edit Simple Box', + minWidth: 200, + minHeight: 100, + contents: [ + { + id: 'info', + elements: [ + { + id: 'align', + type: 'select', + label: 'Align', + items: [ + [ editor.lang.common.notSet, '' ], + [ editor.lang.common.alignLeft, 'left' ], + [ editor.lang.common.alignRight, 'right' ], + [ editor.lang.common.alignCenter, 'center' ] + ], + // When setting up this field, set its value to the "align" value from widget data. + // Note: Align values used in the widget need to be the same as those defined in the "items" array above. + setup: function( widget ) { + this.setValue( widget.data.align ); + }, + // When committing (saving) this field, set its value to the widget data. + commit: function( widget ) { + widget.setData( 'align', this.getValue() ); + } + }, + { + id: 'width', + type: 'text', + label: 'Width', + width: '50px', + setup: function( widget ) { + this.setValue( widget.data.width ); + }, + commit: function( widget ) { + widget.setData( 'width', this.getValue() ); + } + } + ] + } + ] + }; +} ); diff --git a/sources/plugins/widget/dev/assets/simplebox/icons/simplebox.png b/sources/plugins/widget/dev/assets/simplebox/icons/simplebox.png new file mode 100644 index 0000000..6a5e313 Binary files /dev/null and b/sources/plugins/widget/dev/assets/simplebox/icons/simplebox.png differ diff --git a/sources/plugins/widget/dev/assets/simplebox/plugin.js b/sources/plugins/widget/dev/assets/simplebox/plugin.js new file mode 100644 index 0000000..43dbad5 --- /dev/null +++ b/sources/plugins/widget/dev/assets/simplebox/plugin.js @@ -0,0 +1,114 @@ +'use strict'; + +// Register the plugin within the editor. +CKEDITOR.plugins.add( 'simplebox', { + // This plugin requires the Widgets System defined in the 'widget' plugin. + requires: 'widget', + + // Register the icon used for the toolbar button. It must be the same + // as the name of the widget. + icons: 'simplebox', + + // The plugin initialization logic goes inside this method. + init: function( editor ) { + // Register the editing dialog. + CKEDITOR.dialog.add( 'simplebox', this.path + 'dialogs/simplebox.js' ); + + // Register the simplebox widget. + editor.widgets.add( 'simplebox', { + // Allow all HTML elements, classes, and styles that this widget requires. + // Read more about the Advanced Content Filter here: + // * http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter + // * http://docs.ckeditor.com/#!/guide/plugin_sdk_integration_with_acf + allowedContent: + 'div(!simplebox,align-left,align-right,align-center){width};' + + 'div(!simplebox-content); h2(!simplebox-title)', + + // Minimum HTML which is required by this widget to work. + requiredContent: 'div(simplebox)', + + // Define two nested editable areas. + editables: { + title: { + // Define CSS selector used for finding the element inside widget element. + selector: '.simplebox-title', + // Define content allowed in this nested editable. Its content will be + // filtered accordingly and the toolbar will be adjusted when this editable + // is focused. + allowedContent: 'br strong em' + }, + content: { + selector: '.simplebox-content' + } + }, + + // Define the template of a new Simple Box widget. + // The template will be used when creating new instances of the Simple Box widget. + template: + '
' + + '

Title

' + + '

Content...

' + + '
', + + // Define the label for a widget toolbar button which will be automatically + // created by the Widgets System. This button will insert a new widget instance + // created from the template defined above, or will edit selected widget + // (see second part of this tutorial to learn about editing widgets). + // + // Note: In order to be able to translate your widget you should use the + // editor.lang.simplebox.* property. A string was used directly here to simplify this tutorial. + button: 'Create a simple box', + + // Set the widget dialog window name. This enables the automatic widget-dialog binding. + // This dialog window will be opened when creating a new widget or editing an existing one. + dialog: 'simplebox', + + // Check the elements that need to be converted to widgets. + // + // Note: The "element" argument is an instance of http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element + // so it is not a real DOM element yet. This is caused by the fact that upcasting is performed + // during data processing which is done on DOM represented by JavaScript objects. + upcast: function( element ) { + // Return "true" (that element needs to converted to a Simple Box widget) + // for all
elements with a "simplebox" class. + return element.name == 'div' && element.hasClass( 'simplebox' ); + }, + + // When a widget is being initialized, we need to read the data ("align" and "width") + // from DOM and set it by using the widget.setData() method. + // More code which needs to be executed when DOM is available may go here. + init: function() { + var width = this.element.getStyle( 'width' ); + if ( width ) + this.setData( 'width', width ); + + if ( this.element.hasClass( 'align-left' ) ) + this.setData( 'align', 'left' ); + if ( this.element.hasClass( 'align-right' ) ) + this.setData( 'align', 'right' ); + if ( this.element.hasClass( 'align-center' ) ) + this.setData( 'align', 'center' ); + }, + + // Listen on the widget#data event which is fired every time the widget data changes + // and updates the widget's view. + // Data may be changed by using the widget.setData() method, which we use in the + // Simple Box dialog window. + data: function() { + // Check whether "width" widget data is set and remove or set "width" CSS style. + // The style is set on widget main element (div.simplebox). + if ( !this.data.width ) + this.element.removeStyle( 'width' ); + else + this.element.setStyle( 'width', this.data.width ); + + // Brutally remove all align classes and set a new one if "align" widget data is set. + this.element.removeClass( 'align-left' ); + this.element.removeClass( 'align-right' ); + this.element.removeClass( 'align-center' ); + if ( this.data.align ) + this.element.addClass( 'align-' + this.data.align ); + } + } ); + } +} ); diff --git a/sources/plugins/widget/dev/console.js b/sources/plugins/widget/dev/console.js new file mode 100644 index 0000000..78db0d0 --- /dev/null +++ b/sources/plugins/widget/dev/console.js @@ -0,0 +1,131 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/* global CKCONSOLE */ + +'use strict'; + +( function() { + + CKCONSOLE.add( 'widget', { + panels: [ + { + type: 'box', + content: '
    ', + + refresh: function( editor ) { + var instances = obj2Array( editor.widgets.instances ); + + return { + header: 'Instances (' + instances.length + ')', + instances: generateInstancesList( instances ) + }; + }, + + refreshOn: function( editor, refresh ) { + editor.widgets.on( 'instanceCreated', function( evt ) { + refresh(); + + evt.data.on( 'data', refresh ); + } ); + + editor.widgets.on( 'instanceDestroyed', refresh ); + } + }, + + { + type: 'box', + content: + '
      ' + + '
    • focused:
    • ' + + '
    • selected:
    • ' + + '
    ', + + refresh: function( editor ) { + var focused = editor.widgets.focused, + selected = editor.widgets.selected, + selectedIds = []; + + for ( var i = 0; i < selected.length; ++i ) + selectedIds.push( selected[ i ].id ); + + return { + header: 'Focus & selection', + focused: focused ? 'id: ' + focused.id : '-', + selected: selectedIds.length ? 'id: ' + selectedIds.join( ', id: ' ) : '-' + }; + }, + + refreshOn: function( editor, refresh ) { + editor.on( 'selectionCheck', refresh, null, null, 999 ); + } + }, + + { + type: 'log', + + on: function( editor, log, logFn ) { + // Add all listeners with high priorities to log + // messages in the correct order when one event depends on another. + // E.g. selectionChange triggers widget selection - if this listener + // for selectionChange will be executed later than that one, then order + // will be incorrect. + + editor.on( 'selectionChange', function( evt ) { + var msg = 'selection change', + sel = evt.data.selection, + el = sel.getSelectedElement(), + widget; + + if ( el && ( widget = editor.widgets.getByElement( el, true ) ) ) + msg += ' (id: ' + widget.id + ')'; + + log( msg ); + }, null, null, 1 ); + + editor.widgets.on( 'instanceDestroyed', function( evt ) { + log( 'instance destroyed (id: ' + evt.data.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'instanceCreated', function( evt ) { + log( 'instance created (id: ' + evt.data.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'widgetFocused', function( evt ) { + log( 'widget focused (id: ' + evt.data.widget.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'widgetBlurred', function( evt ) { + log( 'widget blurred (id: ' + evt.data.widget.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'checkWidgets', logFn( 'checking widgets' ), null, null, 1 ); + editor.widgets.on( 'checkSelection', logFn( 'checking selection' ), null, null, 1 ); + } + } + ] + } ); + + function generateInstancesList( instances ) { + var html = '', + instance; + + for ( var i = 0; i < instances.length; ++i ) { + instance = instances[ i ]; + html += itemTpl.output( { id: instance.id, name: instance.name, data: JSON.stringify( instance.data ) } ); + } + return html; + } + + function obj2Array( obj ) { + var arr = []; + for ( var id in obj ) + arr.push( obj[ id ] ); + + return arr; + } + + var itemTpl = new CKEDITOR.template( '
  • id: {id}, name: {name}, data: {data}
  • ' ); +} )(); diff --git a/sources/plugins/widget/dev/nestedwidgets.html b/sources/plugins/widget/dev/nestedwidgets.html new file mode 100644 index 0000000..0686d2c --- /dev/null +++ b/sources/plugins/widget/dev/nestedwidgets.html @@ -0,0 +1,134 @@ + + + + + + Nested widgets — CKEditor Sample + + + + + + + + + +

    Nested widgets

    + +

    Classic (iframe-based) Sample

    + + +

    Inline Sample

    +
    +

    Simple Box Sample

    + +
    +

    Title

    +
    +

    Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

    + +
    + The Eagle +
    The Eagle in lunar orbit
    +
    + +
      +
    • Foo!
    • +
    • Bar!
    • +
    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

    +
    +
    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

    + +

    Pellentesque vitae eleifend nisl, non accumsan tellus. Maecenas nec libero non tellus tincidunt mollis porttitor sed arcu. Donec ultricies nulla vitae eros lacinia, vel congue sem auctor. Vivamus convallis, urna ac tincidunt malesuada, lectus erat convallis metus, a hendrerit massa augue accumsan magna. Nulla mattis tellus elit, nec congue magna scelerisque eget. Aliquam posuere nisi augue, posuere sodales nisi iaculis eu. Donec fermentum urna id nibh sagittis fermentum sit amet sed enim. Aliquam neque elit, pretium elementum nunc a, faucibus accumsan lorem. Etiam pulvinar odio et hendrerit tincidunt. Suspendisse tempus eros lacus, in convallis velit mollis ut. Aenean congue, justo eleifend ultricies malesuada, nunc nunc molestie mauris, eget placerat libero eros vel nisi. Quisque diam arcu, mollis ac laoreet vitae, varius et sem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis in vehicula sapien. Nunc feugiat porta elit nec volutpat.

    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

    + +
    +

    Title

    +
    +

    The EagleApollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

    + +
      +
    • Foo!
    • +
    • Bar!
    • +
    +
    +
    + +

    Ut eget ipsum a sapien porta ultrices. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus mi lacus, pharetra eu bibendum blandit, tristique sit amet leo. Integer eu nulla nec magna vulputate blandit. Praesent mattis quis ante eget adipiscing. Nulla vel tempus risus, in placerat velit. Mauris sed nibh at elit posuere laoreet. Morbi non sapien sed nunc fringilla imperdiet.

    +
    + + + + diff --git a/sources/plugins/widget/dev/widgetstyles.html b/sources/plugins/widget/dev/widgetstyles.html new file mode 100644 index 0000000..8e54b8d --- /dev/null +++ b/sources/plugins/widget/dev/widgetstyles.html @@ -0,0 +1,144 @@ + + + + + + Applying styles to widgets — CKEditor Sample + + + + + + +

    Applying styles to widgets

    + +

    Classic (iframe-based) Sample

    + + +

    Inline Sample

    +
    +

    Apollo 11

    + +
    + Saturn V +
    Roll out of Saturn V on launch pad
    +
    + +

    Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

    + +

    Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

    + +

    Broadcasting and quotes

    + +

    Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

    + +
    +

    One small step for [a] man, one giant leap for mankind.

    +
    + +

    \( \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \)

    + +

    Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

    + +
    +

    [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

    +
    + +
    + The Eagle +
    The Eagle in lunar orbit
    +
    + +

    Technical details

    + +

    Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

    + +
      +
    1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
    2. +
    3. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
    4. +
    5. Lunar Module for landing on the Moon.
    6. +
    + +

    After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.

    +
    + + + + diff --git a/sources/plugins/widget/images/handle.png b/sources/plugins/widget/images/handle.png new file mode 100644 index 0000000..ba8cda5 Binary files /dev/null and b/sources/plugins/widget/images/handle.png differ diff --git a/sources/plugins/widget/lang/af.js b/sources/plugins/widget/lang/af.js new file mode 100644 index 0000000..e37c598 --- /dev/null +++ b/sources/plugins/widget/lang/af.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'af', { + 'move': 'Klik en trek on te beweeg', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/ar.js b/sources/plugins/widget/lang/ar.js new file mode 100644 index 0000000..0a4f8eb --- /dev/null +++ b/sources/plugins/widget/lang/ar.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ar', { + 'move': 'إضغط و إسحب للتحريك', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/az.js b/sources/plugins/widget/lang/az.js new file mode 100644 index 0000000..24ddaf3 --- /dev/null +++ b/sources/plugins/widget/lang/az.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'az', { + 'move': 'Tıklayın və aparın', + 'label': '%1 vidjet' +} ); diff --git a/sources/plugins/widget/lang/bg.js b/sources/plugins/widget/lang/bg.js new file mode 100644 index 0000000..9b51458 --- /dev/null +++ b/sources/plugins/widget/lang/bg.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'bg', { + 'move': 'Кликни и влачи, за да преместиш', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/ca.js b/sources/plugins/widget/lang/ca.js new file mode 100644 index 0000000..f46a4f8 --- /dev/null +++ b/sources/plugins/widget/lang/ca.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ca', { + 'move': 'Clicar i arrossegar per moure', + 'label': '%1 widget' +} ); diff --git a/sources/plugins/widget/lang/cs.js b/sources/plugins/widget/lang/cs.js new file mode 100644 index 0000000..5d9590b --- /dev/null +++ b/sources/plugins/widget/lang/cs.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'cs', { + 'move': 'Klepněte a táhněte pro přesunutí', + 'label': 'Ovládací prvek %1' +} ); diff --git a/sources/plugins/widget/lang/cy.js b/sources/plugins/widget/lang/cy.js new file mode 100644 index 0000000..29dc110 --- /dev/null +++ b/sources/plugins/widget/lang/cy.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'cy', { + 'move': 'Clcio a llusgo i symud', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/da.js b/sources/plugins/widget/lang/da.js new file mode 100644 index 0000000..8dfe785 --- /dev/null +++ b/sources/plugins/widget/lang/da.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'da', { + 'move': 'Klik og træk for at flytte', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/de-ch.js b/sources/plugins/widget/lang/de-ch.js new file mode 100644 index 0000000..a95febb --- /dev/null +++ b/sources/plugins/widget/lang/de-ch.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'de-ch', { + 'move': 'Zum Verschieben anwählen und ziehen', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/de.js b/sources/plugins/widget/lang/de.js new file mode 100644 index 0000000..838ad89 --- /dev/null +++ b/sources/plugins/widget/lang/de.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'de', { + 'move': 'Zum Verschieben anwählen und ziehen', + 'label': '%1 Steuerelement' +} ); diff --git a/sources/plugins/widget/lang/el.js b/sources/plugins/widget/lang/el.js new file mode 100644 index 0000000..863604a --- /dev/null +++ b/sources/plugins/widget/lang/el.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'el', { + 'move': 'Κάνετε κλικ και σύρετε το ποντίκι για να μετακινήστε', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/en-gb.js b/sources/plugins/widget/lang/en-gb.js new file mode 100644 index 0000000..ed09606 --- /dev/null +++ b/sources/plugins/widget/lang/en-gb.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'en-gb', { + 'move': 'Click and drag to move', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/en.js b/sources/plugins/widget/lang/en.js new file mode 100644 index 0000000..5967f4d --- /dev/null +++ b/sources/plugins/widget/lang/en.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'en', { + 'move': 'Click and drag to move', + 'label': '%1 widget' +} ); diff --git a/sources/plugins/widget/lang/eo.js b/sources/plugins/widget/lang/eo.js new file mode 100644 index 0000000..f4979ac --- /dev/null +++ b/sources/plugins/widget/lang/eo.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'eo', { + 'move': 'klaki kaj treni por movi', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/es.js b/sources/plugins/widget/lang/es.js new file mode 100644 index 0000000..d8deb2c --- /dev/null +++ b/sources/plugins/widget/lang/es.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'es', { + 'move': 'Dar clic y arrastrar para mover', + 'label': 'reproductor %1' +} ); diff --git a/sources/plugins/widget/lang/eu.js b/sources/plugins/widget/lang/eu.js new file mode 100644 index 0000000..e128dfe --- /dev/null +++ b/sources/plugins/widget/lang/eu.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'eu', { + 'move': 'Klikatu eta arrastatu lekuz aldatzeko', + 'label': '%1 widget' +} ); diff --git a/sources/plugins/widget/lang/fa.js b/sources/plugins/widget/lang/fa.js new file mode 100644 index 0000000..57ea31f --- /dev/null +++ b/sources/plugins/widget/lang/fa.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'fa', { + 'move': 'کلیک و کشیدن برای جابجایی', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/fi.js b/sources/plugins/widget/lang/fi.js new file mode 100644 index 0000000..759b2cf --- /dev/null +++ b/sources/plugins/widget/lang/fi.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'fi', { + 'move': 'Siirrä klikkaamalla ja raahaamalla', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/fr.js b/sources/plugins/widget/lang/fr.js new file mode 100644 index 0000000..9decbf6 --- /dev/null +++ b/sources/plugins/widget/lang/fr.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'fr', { + 'move': 'Cliquer et glisser pour déplacer', + 'label': 'Élément %1' +} ); diff --git a/sources/plugins/widget/lang/gl.js b/sources/plugins/widget/lang/gl.js new file mode 100644 index 0000000..ef070b6 --- /dev/null +++ b/sources/plugins/widget/lang/gl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'gl', { + 'move': 'Prema e arrastre para mover', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/he.js b/sources/plugins/widget/lang/he.js new file mode 100644 index 0000000..b8dd2cb --- /dev/null +++ b/sources/plugins/widget/lang/he.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'he', { + 'move': 'לחץ וגרור להזזה', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/hr.js b/sources/plugins/widget/lang/hr.js new file mode 100644 index 0000000..952d800 --- /dev/null +++ b/sources/plugins/widget/lang/hr.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'hr', { + 'move': 'Klikni i povuci da pomakneš', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/hu.js b/sources/plugins/widget/lang/hu.js new file mode 100644 index 0000000..4721305 --- /dev/null +++ b/sources/plugins/widget/lang/hu.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'hu', { + 'move': 'Kattints és húzd a mozgatáshoz', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/id.js b/sources/plugins/widget/lang/id.js new file mode 100644 index 0000000..ef19392 --- /dev/null +++ b/sources/plugins/widget/lang/id.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'id', { + 'move': 'Tekan dan geser untuk memindahkan', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/it.js b/sources/plugins/widget/lang/it.js new file mode 100644 index 0000000..59b43f6 --- /dev/null +++ b/sources/plugins/widget/lang/it.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'it', { + 'move': 'Fare clic e trascinare per spostare', + 'label': 'Widget %1' +} ); diff --git a/sources/plugins/widget/lang/ja.js b/sources/plugins/widget/lang/ja.js new file mode 100644 index 0000000..a742718 --- /dev/null +++ b/sources/plugins/widget/lang/ja.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ja', { + 'move': 'ドラッグして移動', + 'label': '%1 ウィジェット' +} ); diff --git a/sources/plugins/widget/lang/km.js b/sources/plugins/widget/lang/km.js new file mode 100644 index 0000000..6c61c73 --- /dev/null +++ b/sources/plugins/widget/lang/km.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'km', { + 'move': 'ចុច​ហើយ​ទាញ​ដើម្បី​ផ្លាស់​ទី', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/ko.js b/sources/plugins/widget/lang/ko.js new file mode 100644 index 0000000..0107a13 --- /dev/null +++ b/sources/plugins/widget/lang/ko.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ko', { + 'move': '움직이려면 클릭 후 드래그 하세요', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/ku.js b/sources/plugins/widget/lang/ku.js new file mode 100644 index 0000000..2af50cb --- /dev/null +++ b/sources/plugins/widget/lang/ku.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ku', { + 'move': 'کرتەبکە و ڕایبکێشە بۆ جوڵاندن', + 'label': '%1 ویجێت' +} ); diff --git a/sources/plugins/widget/lang/lv.js b/sources/plugins/widget/lang/lv.js new file mode 100644 index 0000000..e5fc3ac --- /dev/null +++ b/sources/plugins/widget/lang/lv.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'lv', { + 'move': 'Klikšķina un velc, lai pārvietotu', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/nb.js b/sources/plugins/widget/lang/nb.js new file mode 100644 index 0000000..af46bc9 --- /dev/null +++ b/sources/plugins/widget/lang/nb.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'nb', { + 'move': 'Klikk og dra for å flytte', + 'label': 'Widget %1' +} ); diff --git a/sources/plugins/widget/lang/nl.js b/sources/plugins/widget/lang/nl.js new file mode 100644 index 0000000..56b182c --- /dev/null +++ b/sources/plugins/widget/lang/nl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'nl', { + 'move': 'Klik en sleep om te verplaatsen', + 'label': '%1 widget' +} ); diff --git a/sources/plugins/widget/lang/no.js b/sources/plugins/widget/lang/no.js new file mode 100644 index 0000000..b86bd7b --- /dev/null +++ b/sources/plugins/widget/lang/no.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'no', { + 'move': 'Klikk og dra for å flytte', + 'label': 'Widget %1' +} ); diff --git a/sources/plugins/widget/lang/oc.js b/sources/plugins/widget/lang/oc.js new file mode 100644 index 0000000..10ff842 --- /dev/null +++ b/sources/plugins/widget/lang/oc.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'oc', { + 'move': 'Clicar e lisar per desplaçar', + 'label': 'Element %1' +} ); diff --git a/sources/plugins/widget/lang/pl.js b/sources/plugins/widget/lang/pl.js new file mode 100644 index 0000000..2d90df8 --- /dev/null +++ b/sources/plugins/widget/lang/pl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'pl', { + 'move': 'Kliknij i przeciągnij, by przenieść.', + 'label': 'Widget %1' +} ); diff --git a/sources/plugins/widget/lang/pt-br.js b/sources/plugins/widget/lang/pt-br.js new file mode 100644 index 0000000..9ce9be4 --- /dev/null +++ b/sources/plugins/widget/lang/pt-br.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'pt-br', { + 'move': 'Click e arraste para mover', + 'label': '%1 widget' +} ); diff --git a/sources/plugins/widget/lang/pt.js b/sources/plugins/widget/lang/pt.js new file mode 100644 index 0000000..422ef93 --- /dev/null +++ b/sources/plugins/widget/lang/pt.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'pt', { + 'move': 'Clique e arraste para mover', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/ru.js b/sources/plugins/widget/lang/ru.js new file mode 100644 index 0000000..d6f36f5 --- /dev/null +++ b/sources/plugins/widget/lang/ru.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ru', { + 'move': 'Нажмите и перетащите, чтобы переместить', + 'label': '%1 виджет' +} ); diff --git a/sources/plugins/widget/lang/sk.js b/sources/plugins/widget/lang/sk.js new file mode 100644 index 0000000..05acac4 --- /dev/null +++ b/sources/plugins/widget/lang/sk.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sk', { + 'move': 'Kliknite a potiahnite pre presunutie', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/sl.js b/sources/plugins/widget/lang/sl.js new file mode 100644 index 0000000..96ffd1e --- /dev/null +++ b/sources/plugins/widget/lang/sl.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sl', { + 'move': 'Kliknite in povlecite, da premaknete', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/sq.js b/sources/plugins/widget/lang/sq.js new file mode 100644 index 0000000..ad46c7d --- /dev/null +++ b/sources/plugins/widget/lang/sq.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sq', { + 'move': 'Kliko dhe tërhiqe për ta lëvizur', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/sv.js b/sources/plugins/widget/lang/sv.js new file mode 100644 index 0000000..7faff37 --- /dev/null +++ b/sources/plugins/widget/lang/sv.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sv', { + 'move': 'Klicka och drag för att flytta', + 'label': '%1-widget' +} ); diff --git a/sources/plugins/widget/lang/tr.js b/sources/plugins/widget/lang/tr.js new file mode 100644 index 0000000..92fa952 --- /dev/null +++ b/sources/plugins/widget/lang/tr.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'tr', { + 'move': 'Taşımak için, tıklayın ve sürükleyin', + 'label': '%1 Grafik Beleşeni' +} ); diff --git a/sources/plugins/widget/lang/tt.js b/sources/plugins/widget/lang/tt.js new file mode 100644 index 0000000..30fb31a --- /dev/null +++ b/sources/plugins/widget/lang/tt.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'tt', { + 'move': 'Күчереп куер өчен басып шудырыгыз', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/ug.js b/sources/plugins/widget/lang/ug.js new file mode 100644 index 0000000..fc216c4 --- /dev/null +++ b/sources/plugins/widget/lang/ug.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ug', { + 'move': 'يۆتكەشتە چېكىپ سۆرەڭ', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/uk.js b/sources/plugins/widget/lang/uk.js new file mode 100644 index 0000000..fab6d5d --- /dev/null +++ b/sources/plugins/widget/lang/uk.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'uk', { + 'move': 'Клікніть і потягніть для переміщення', + 'label': '%1 віджет' +} ); diff --git a/sources/plugins/widget/lang/vi.js b/sources/plugins/widget/lang/vi.js new file mode 100644 index 0000000..2bbe246 --- /dev/null +++ b/sources/plugins/widget/lang/vi.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'vi', { + 'move': 'Nhấp chuột và kéo để di chuyển', + 'label': '%1 widget' // MISSING +} ); diff --git a/sources/plugins/widget/lang/zh-cn.js b/sources/plugins/widget/lang/zh-cn.js new file mode 100644 index 0000000..2381407 --- /dev/null +++ b/sources/plugins/widget/lang/zh-cn.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'zh-cn', { + 'move': '点击并拖拽以移动', + 'label': '%1 小部件' +} ); diff --git a/sources/plugins/widget/lang/zh.js b/sources/plugins/widget/lang/zh.js new file mode 100644 index 0000000..b6e945b --- /dev/null +++ b/sources/plugins/widget/lang/zh.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'zh', { + 'move': '拖曳以移動', + 'label': '%1 小工具' +} ); diff --git a/sources/plugins/widget/plugin.js b/sources/plugins/widget/plugin.js new file mode 100644 index 0000000..37374ab --- /dev/null +++ b/sources/plugins/widget/plugin.js @@ -0,0 +1,4126 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview [Widget](http://ckeditor.com/addon/widget) plugin. + */ + +'use strict'; + +( function() { + var DRAG_HANDLER_SIZE = 15; + + CKEDITOR.plugins.add( 'widget', { + // jscs:disable maximumLineLength + lang: 'af,ar,az,bg,ca,cs,cy,da,de,de-ch,el,en,en-gb,eo,es,eu,fa,fi,fr,gl,he,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,oc,pl,pt,pt-br,ru,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + requires: 'lineutils,clipboard,widgetselection', + onLoad: function() { + CKEDITOR.addCss( + '.cke_widget_wrapper{' + + 'position:relative;' + + 'outline:none' + + '}' + + '.cke_widget_inline{' + + 'display:inline-block' + + '}' + + '.cke_widget_wrapper:hover>.cke_widget_element{' + + 'outline:2px solid yellow;' + + 'cursor:default' + + '}' + + '.cke_widget_wrapper:hover .cke_widget_editable{' + + 'outline:2px solid yellow' + + '}' + + '.cke_widget_wrapper.cke_widget_focused>.cke_widget_element,' + + // We need higher specificity than hover style. + '.cke_widget_wrapper .cke_widget_editable.cke_widget_editable_focused{' + + 'outline:2px solid #ace' + + '}' + + '.cke_widget_editable{' + + 'cursor:text' + + '}' + + '.cke_widget_drag_handler_container{' + + 'position:absolute;' + + 'width:' + DRAG_HANDLER_SIZE + 'px;' + + 'height:0;' + + // Initially drag handler should not be visible, until its position will be + // calculated (#11177). + // We need to hide unpositined handlers, so they don't extend + // widget's outline far to the left (#12024). + 'display:none;' + + 'opacity:0.75;' + + 'transition:height 0s 0.2s;' + // Delay hiding drag handler. + // Prevent drag handler from being misplaced (#11198). + 'line-height:0' + + '}' + + '.cke_widget_wrapper:hover>.cke_widget_drag_handler_container{' + + 'height:' + DRAG_HANDLER_SIZE + 'px;' + + 'transition:none' + + '}' + + '.cke_widget_drag_handler_container:hover{' + + 'opacity:1' + + '}' + + 'img.cke_widget_drag_handler{' + + 'cursor:move;' + + 'width:' + DRAG_HANDLER_SIZE + 'px;' + + 'height:' + DRAG_HANDLER_SIZE + 'px;' + + 'display:inline-block' + + '}' + + '.cke_widget_mask{' + + 'position:absolute;' + + 'top:0;' + + 'left:0;' + + 'width:100%;' + + 'height:100%;' + + 'display:block' + + '}' + + '.cke_editable.cke_widget_dragging, .cke_editable.cke_widget_dragging *{' + + 'cursor:move !important' + + '}' + ); + }, + + beforeInit: function( editor ) { + /** + * An instance of widget repository. It contains all + * {@link CKEDITOR.plugins.widget.repository#registered registered widget definitions} and + * {@link CKEDITOR.plugins.widget.repository#instances initialized instances}. + * + * editor.widgets.add( 'someName', { + * // Widget definition... + * } ); + * + * editor.widgets.registered.someName; // -> Widget definition + * + * @since 4.3 + * @readonly + * @property {CKEDITOR.plugins.widget.repository} widgets + * @member CKEDITOR.editor + */ + editor.widgets = new Repository( editor ); + }, + + afterInit: function( editor ) { + addWidgetButtons( editor ); + setupContextMenu( editor ); + } + } ); + + /** + * Widget repository. It keeps track of all {@link #registered registered widget definitions} and + * {@link #instances initialized instances}. An instance of the repository is available under + * the {@link CKEDITOR.editor#widgets} property. + * + * @class CKEDITOR.plugins.widget.repository + * @mixins CKEDITOR.event + * @constructor Creates a widget repository instance. Note that the widget plugin automatically + * creates a repository instance which is available under the {@link CKEDITOR.editor#widgets} property. + * @param {CKEDITOR.editor} editor The editor instance for which the repository will be created. + */ + function Repository( editor ) { + /** + * The editor instance for which this repository was created. + * + * @readonly + * @property {CKEDITOR.editor} editor + */ + this.editor = editor; + + /** + * A hash of registered widget definitions (definition name => {@link CKEDITOR.plugins.widget.definition}). + * + * To register a definition use the {@link #add} method. + * + * @readonly + */ + this.registered = {}; + + /** + * An object containing initialized widget instances (widget id => {@link CKEDITOR.plugins.widget}). + * + * @readonly + */ + this.instances = {}; + + /** + * An array of selected widget instances. + * + * @readonly + * @property {CKEDITOR.plugins.widget[]} selected + */ + this.selected = []; + + /** + * The focused widget instance. See also {@link CKEDITOR.plugins.widget#event-focus} + * and {@link CKEDITOR.plugins.widget#event-blur} events. + * + * editor.on( 'selectionChange', function() { + * if ( editor.widgets.focused ) { + * // Do something when a widget is focused... + * } + * } ); + * + * @readonly + * @property {CKEDITOR.plugins.widget} focused + */ + this.focused = null; + + /** + * The widget instance that contains the nested editable which is currently focused. + * + * @readonly + * @property {CKEDITOR.plugins.widget} widgetHoldingFocusedEditable + */ + this.widgetHoldingFocusedEditable = null; + + this._ = { + nextId: 0, + upcasts: [], + upcastCallbacks: [], + filters: {} + }; + + setupWidgetsLifecycle( this ); + setupSelectionObserver( this ); + setupMouseObserver( this ); + setupKeyboardObserver( this ); + setupDragAndDrop( this ); + setupNativeCutAndCopy( this ); + } + + Repository.prototype = { + /** + * Minimum interval between selection checks. + * + * @private + */ + MIN_SELECTION_CHECK_INTERVAL: 500, + + /** + * Adds a widget definition to the repository. Fires the {@link CKEDITOR.editor#widgetDefinition} event + * which allows to modify the widget definition which is going to be registered. + * + * @param {String} name The name of the widget definition. + * @param {CKEDITOR.plugins.widget.definition} widgetDef Widget definition. + * @returns {CKEDITOR.plugins.widget.definition} + */ + add: function( name, widgetDef ) { + // Create prototyped copy of original widget definition, so we won't modify it. + widgetDef = CKEDITOR.tools.prototypedCopy( widgetDef ); + widgetDef.name = name; + + widgetDef._ = widgetDef._ || {}; + + this.editor.fire( 'widgetDefinition', widgetDef ); + + if ( widgetDef.template ) + widgetDef.template = new CKEDITOR.template( widgetDef.template ); + + addWidgetCommand( this.editor, widgetDef ); + addWidgetProcessors( this, widgetDef ); + + this.registered[ name ] = widgetDef; + + return widgetDef; + }, + + /** + * Adds a callback for element upcasting. Each callback will be executed + * for every element which is later tested by upcast methods. If a callback + * returns `false`, the element will not be upcasted. + * + * // Images with the "banner" class will not be upcasted (e.g. to the image widget). + * editor.widgets.addUpcastCallback( function( element ) { + * if ( element.name == 'img' && element.hasClass( 'banner' ) ) + * return false; + * } ); + * + * @param {Function} callback + * @param {CKEDITOR.htmlParser.element} callback.element + */ + addUpcastCallback: function( callback ) { + this._.upcastCallbacks.push( callback ); + }, + + /** + * Checks the selection to update widget states (selection and focus). + * + * This method is triggered by the {@link #event-checkSelection} event. + */ + checkSelection: function() { + var sel = this.editor.getSelection(), + selectedElement = sel.getSelectedElement(), + updater = stateUpdater( this ), + widget; + + // Widget is focused so commit and finish checking. + if ( selectedElement && ( widget = this.getByElement( selectedElement, true ) ) ) + return updater.focus( widget ).select( widget ).commit(); + + var range = sel.getRanges()[ 0 ]; + + // No ranges or collapsed range mean that nothing is selected, so commit and finish checking. + if ( !range || range.collapsed ) + return updater.commit(); + + // Range is not empty, so create walker checking for wrappers. + var walker = new CKEDITOR.dom.walker( range ), + wrapper; + + walker.evaluator = Widget.isDomWidgetWrapper; + + while ( ( wrapper = walker.next() ) ) + updater.select( this.getByElement( wrapper ) ); + + updater.commit(); + }, + + /** + * Checks if all widget instances are still present in the DOM. + * Destroys those instances that are not present. + * Reinitializes widgets on widget wrappers for which widget instances + * cannot be found. Takes nested widgets into account, too. + * + * This method triggers the {@link #event-checkWidgets} event whose listeners + * can cancel the method's execution or modify its options. + * + * @param [options] The options object. + * @param {Boolean} [options.initOnlyNew] Initializes widgets only on newly wrapped + * widget elements (those which still have the `cke_widget_new` class). When this option is + * set to `true`, widgets which were invalidated (e.g. by replacing with a cloned DOM structure) + * will not be reinitialized. This makes the check faster. + * @param {Boolean} [options.focusInited] If only one widget is initialized by + * the method, it will be focused. + */ + checkWidgets: function( options ) { + this.fire( 'checkWidgets', CKEDITOR.tools.copy( options || {} ) ); + }, + + /** + * Removes the widget from the editor and moves the selection to the closest + * editable position if the widget was focused before. + * + * @param {CKEDITOR.plugins.widget} widget The widget instance to be deleted. + */ + del: function( widget ) { + if ( this.focused === widget ) { + var editor = widget.editor, + range = editor.createRange(), + found; + + // If haven't found place for caret on the default side, + // try to find it on the other side. + if ( !( found = range.moveToClosestEditablePosition( widget.wrapper, true ) ) ) + found = range.moveToClosestEditablePosition( widget.wrapper, false ); + + if ( found ) + editor.getSelection().selectRanges( [ range ] ); + } + + widget.wrapper.remove(); + this.destroy( widget, true ); + }, + + /** + * Destroys the widget instance and all its nested widgets (widgets inside its nested editables). + * + * @param {CKEDITOR.plugins.widget} widget The widget instance to be destroyed. + * @param {Boolean} [offline] Whether the widget is offline (detached from the DOM tree) — + * in this case the DOM (attributes, classes, etc.) will not be cleaned up. + */ + destroy: function( widget, offline ) { + if ( this.widgetHoldingFocusedEditable === widget ) + setFocusedEditable( this, widget, null, offline ); + + widget.destroy( offline ); + delete this.instances[ widget.id ]; + this.fire( 'instanceDestroyed', widget ); + }, + + /** + * Destroys all widget instances. + * + * @param {Boolean} [offline] Whether the widgets are offline (detached from the DOM tree) — + * in this case the DOM (attributes, classes, etc.) will not be cleaned up. + * @param {CKEDITOR.dom.element} [container] The container within widgets will be destroyed. + * This option will be ignored if the `offline` flag was set to `true`, because in such case + * it is not possible to find widgets within the passed block. + */ + destroyAll: function( offline, container ) { + var widget, + id, + instances = this.instances; + + if ( container && !offline ) { + var wrappers = container.find( '.cke_widget_wrapper' ), + l = wrappers.count(), + i = 0; + + // Length is constant, because this is not a live node list. + // Note: since querySelectorAll returns nodes in document order, + // outer widgets are always placed before their nested widgets and therefore + // are destroyed before them. + for ( ; i < l; ++i ) { + widget = this.getByElement( wrappers.getItem( i ), true ); + // Widget might not be found, because it could be a nested widget, + // which would be destroyed when destroying its parent. + if ( widget ) + this.destroy( widget ); + } + + return; + } + + for ( id in instances ) { + widget = instances[ id ]; + this.destroy( widget, offline ); + } + }, + + /** + * Finalizes a process of widget creation. This includes: + * + * * inserting widget element into editor, + * * marking widget instance as ready (see {@link CKEDITOR.plugins.widget#event-ready}), + * * focusing widget instance. + * + * This method is used by the default widget's command and is called + * after widget's dialog (if set) is closed. It may also be used in a + * customized process of widget creation and insertion. + * + * widget.once( 'edit', function() { + * // Finalize creation only of not ready widgets. + * if ( widget.isReady() ) + * return; + * + * // Cancel edit event to prevent automatic widget insertion. + * evt.cancel(); + * + * CustomDialog.open( widget.data, function saveCallback( savedData ) { + * // Cache the container, because widget may be destroyed while saving data, + * // if this process will require some deep transformations. + * var container = widget.wrapper.getParent(); + * + * widget.setData( savedData ); + * + * // Widget will be retrieved from container and inserted into editor. + * editor.widgets.finalizeCreation( container ); + * } ); + * } ); + * + * @param {CKEDITOR.dom.element/CKEDITOR.dom.documentFragment} container The element + * or document fragment which contains widget wrapper. The container is used, so before + * finalizing creation the widget can be freely transformed (even destroyed and reinitialized). + */ + finalizeCreation: function( container ) { + var wrapper = container.getFirst(); + if ( wrapper && Widget.isDomWidgetWrapper( wrapper ) ) { + this.editor.insertElement( wrapper ); + + var widget = this.getByElement( wrapper ); + // Fire postponed #ready event. + widget.ready = true; + widget.fire( 'ready' ); + widget.focus(); + } + }, + + /** + * Finds a widget instance which contains a given element. The element will be the {@link CKEDITOR.plugins.widget#wrapper wrapper} + * of the returned widget or a descendant of this {@link CKEDITOR.plugins.widget#wrapper wrapper}. + * + * editor.widgets.getByElement( someWidget.wrapper ); // -> someWidget + * editor.widgets.getByElement( someWidget.parts.caption ); // -> someWidget + * + * // Check wrapper only: + * editor.widgets.getByElement( someWidget.wrapper, true ); // -> someWidget + * editor.widgets.getByElement( someWidget.parts.caption, true ); // -> null + * + * @param {CKEDITOR.dom.element} element The element to be checked. + * @param {Boolean} [checkWrapperOnly] If set to `true`, the method will not check wrappers' descendants. + * @returns {CKEDITOR.plugins.widget} The widget instance or `null`. + */ + getByElement: ( function() { + var validWrapperElements = { div: 1, span: 1 }; + function getWidgetId( element ) { + return element.is( validWrapperElements ) && element.data( 'cke-widget-id' ); + } + + return function( element, checkWrapperOnly ) { + if ( !element ) + return null; + + var id = getWidgetId( element ); + + // There's no need to check element parents if element is a wrapper. + if ( !checkWrapperOnly && !id ) { + var limit = this.editor.editable(); + + // Try to find a closest ascendant which is a widget wrapper. + do { + element = element.getParent(); + } while ( element && !element.equals( limit ) && !( id = getWidgetId( element ) ) ); + } + + return this.instances[ id ] || null; + }; + } )(), + + /** + * Initializes a widget on a given element if the widget has not been initialized on it yet. + * + * @param {CKEDITOR.dom.element} element The future widget element. + * @param {String/CKEDITOR.plugins.widget.definition} [widgetDef] Name of a widget or a widget definition. + * The widget definition should be previously registered by using the + * {@link CKEDITOR.plugins.widget.repository#add} method. + * @param [startupData] Widget startup data (has precedence over default one). + * @returns {CKEDITOR.plugins.widget} The widget instance or `null` if a widget could not be initialized on + * a given element. + */ + initOn: function( element, widgetDef, startupData ) { + if ( !widgetDef ) + widgetDef = this.registered[ element.data( 'widget' ) ]; + else if ( typeof widgetDef == 'string' ) + widgetDef = this.registered[ widgetDef ]; + + if ( !widgetDef ) + return null; + + // Wrap element if still wasn't wrapped (was added during runtime by method that skips dataProcessor). + var wrapper = this.wrapElement( element, widgetDef.name ); + + if ( wrapper ) { + // Check if widget wrapper is new (widget hasn't been initialized on it yet). + // This class will be removed by widget constructor to avoid locking snapshot twice. + if ( wrapper.hasClass( 'cke_widget_new' ) ) { + var widget = new Widget( this, this._.nextId++, element, widgetDef, startupData ); + + // Widget could be destroyed when initializing it. + if ( widget.isInited() ) { + this.instances[ widget.id ] = widget; + + return widget; + } else { + return null; + } + } + + // Widget already has been initialized, so try to get widget by element. + // Note - it may happen that other instance will returned than the one created above, + // if for example widget was destroyed and reinitialized. + return this.getByElement( element ); + } + + // No wrapper means that there's no widget for this element. + return null; + }, + + /** + * Initializes widgets on all elements which were wrapped by {@link #wrapElement} and + * have not been initialized yet. + * + * @param {CKEDITOR.dom.element} [container=editor.editable()] The container which will be checked for not + * initialized widgets. Defaults to editor's {@link CKEDITOR.editor#editable editable} element. + * @returns {CKEDITOR.plugins.widget[]} Array of widget instances which have been initialized. + * Note: Only first-level widgets are returned — without nested widgets. + */ + initOnAll: function( container ) { + var newWidgets = ( container || this.editor.editable() ).find( '.cke_widget_new' ), + newInstances = [], + instance; + + for ( var i = newWidgets.count(); i--; ) { + instance = this.initOn( newWidgets.getItem( i ).getFirst( Widget.isDomWidgetElement ) ); + if ( instance ) + newInstances.push( instance ); + } + + return newInstances; + }, + + /** + * Allows to listen to events on specific types of widgets, even if they are not created yet. + * + * Please note that this method inherits parameters from the {@link CKEDITOR.event#method-on} method with one + * extra parameter at the beginning which is the widget name. + * + * editor.widgets.onWidget( 'image', 'action', function( evt ) { + * // Event `action` occurs on `image` widget. + * } ); + * + * @since 4.5 + * @param {String} widgetName + * @param {String} eventName + * @param {Function} listenerFunction + * @param {Object} [scopeObj] + * @param {Object} [listenerData] + * @param {Number} [priority=10] + */ + onWidget: function( widgetName ) { + var args = Array.prototype.slice.call( arguments ); + + args.shift(); + + for ( var i in this.instances ) { + var instance = this.instances[ i ]; + + if ( instance.name == widgetName ) { + instance.on.apply( instance, args ); + } + } + + this.on( 'instanceCreated', function( evt ) { + var widget = evt.data; + + if ( widget.name == widgetName ) { + widget.on.apply( widget, args ); + } + } ); + }, + + /** + * Parses element classes string and returns an object + * whose keys contain class names. Skips all `cke_*` classes. + * + * This method is used by the {@link CKEDITOR.plugins.widget#getClasses} method and + * may be used when overriding that method. + * + * @since 4.4 + * @param {String} classes String (value of `class` attribute). + * @returns {Object} Object containing classes or `null` if no classes found. + */ + parseElementClasses: function( classes ) { + if ( !classes ) + return null; + + classes = CKEDITOR.tools.trim( classes ).split( /\s+/ ); + + var cl, + obj = {}, + hasClasses = 0; + + while ( ( cl = classes.pop() ) ) { + if ( cl.indexOf( 'cke_' ) == -1 ) + obj[ cl ] = hasClasses = 1; + } + + return hasClasses ? obj : null; + }, + + /** + * Wraps an element with a widget's non-editable container. + * + * If this method is called on an {@link CKEDITOR.htmlParser.element}, then it will + * also take care of fixing the DOM after wrapping (the wrapper may not be allowed in element's parent). + * + * @param {CKEDITOR.dom.element/CKEDITOR.htmlParser.element} element The widget element to be wrapped. + * @param {String} [widgetName] The name of the widget definition. Defaults to element's `data-widget` + * attribute value. + * @returns {CKEDITOR.dom.element/CKEDITOR.htmlParser.element} The wrapper element or `null` if + * the widget definition of this name is not registered. + */ + wrapElement: function( element, widgetName ) { + var wrapper = null, + widgetDef, + isInline; + + if ( element instanceof CKEDITOR.dom.element ) { + widgetName = widgetName || element.data( 'widget' ); + widgetDef = this.registered[ widgetName ]; + + if ( !widgetDef ) + return null; + + // Do not wrap already wrapped element. + wrapper = element.getParent(); + if ( wrapper && wrapper.type == CKEDITOR.NODE_ELEMENT && wrapper.data( 'cke-widget-wrapper' ) ) + return wrapper; + + // If attribute isn't already set (e.g. for pasted widget), set it. + if ( !element.hasAttribute( 'data-cke-widget-keep-attr' ) ) + element.data( 'cke-widget-keep-attr', element.data( 'widget' ) ? 1 : 0 ); + + element.data( 'widget', widgetName ); + + isInline = isWidgetInline( widgetDef, element.getName() ); + + wrapper = new CKEDITOR.dom.element( isInline ? 'span' : 'div' ); + wrapper.setAttributes( getWrapperAttributes( isInline, widgetName ) ); + + wrapper.data( 'cke-display-name', widgetDef.pathName ? widgetDef.pathName : element.getName() ); + + // Replace element unless it is a detached one. + if ( element.getParent( true ) ) + wrapper.replace( element ); + element.appendTo( wrapper ); + } + else if ( element instanceof CKEDITOR.htmlParser.element ) { + widgetName = widgetName || element.attributes[ 'data-widget' ]; + widgetDef = this.registered[ widgetName ]; + + if ( !widgetDef ) + return null; + + wrapper = element.parent; + if ( wrapper && wrapper.type == CKEDITOR.NODE_ELEMENT && wrapper.attributes[ 'data-cke-widget-wrapper' ] ) + return wrapper; + + // If attribute isn't already set (e.g. for pasted widget), set it. + if ( !( 'data-cke-widget-keep-attr' in element.attributes ) ) + element.attributes[ 'data-cke-widget-keep-attr' ] = element.attributes[ 'data-widget' ] ? 1 : 0; + if ( widgetName ) + element.attributes[ 'data-widget' ] = widgetName; + + isInline = isWidgetInline( widgetDef, element.name ); + + wrapper = new CKEDITOR.htmlParser.element( isInline ? 'span' : 'div', getWrapperAttributes( isInline, widgetName ) ); + wrapper.attributes[ 'data-cke-display-name' ] = widgetDef.pathName ? widgetDef.pathName : element.name; + + var parent = element.parent, + index; + + // Don't detach already detached element. + if ( parent ) { + index = element.getIndex(); + element.remove(); + } + + wrapper.add( element ); + + // Insert wrapper fixing DOM (splitting parents if wrapper is not allowed inside them). + parent && insertElement( parent, index, wrapper ); + } + + return wrapper; + }, + + // Expose for tests. + _tests_createEditableFilter: createEditableFilter + }; + + CKEDITOR.event.implementOn( Repository.prototype ); + + /** + * An event fired when a widget instance is created, but before it is fully initialized. + * + * @event instanceCreated + * @param {CKEDITOR.plugins.widget} data The widget instance. + */ + + /** + * An event fired when a widget instance was destroyed. + * + * See also {@link CKEDITOR.plugins.widget#event-destroy}. + * + * @event instanceDestroyed + * @param {CKEDITOR.plugins.widget} data The widget instance. + */ + + /** + * An event fired to trigger the selection check. + * + * See the {@link #method-checkSelection} method. + * + * @event checkSelection + */ + + /** + * An event fired by the the {@link #method-checkWidgets} method. + * + * It can be canceled in order to stop the {@link #method-checkWidgets} + * method execution or the event listener can modify the method's options. + * + * @event checkWidgets + * @param [data] + * @param {Boolean} [data.initOnlyNew] Initialize widgets only on newly wrapped + * widget elements (those which still have the `cke_widget_new` class). When this option is + * set to `true`, widgets which were invalidated (e.g. by replacing with a cloned DOM structure) + * will not be reinitialized. This makes the check faster. + * @param {Boolean} [data.focusInited] If only one widget is initialized by + * the method, it will be focused. + */ + + + /** + * An instance of a widget. Together with {@link CKEDITOR.plugins.widget.repository} these + * two classes constitute the core of the Widget System. + * + * Note that neither the repository nor the widget instances can be created by using their constructors. + * A repository instance is automatically set up by the Widget plugin and is accessible under + * {@link CKEDITOR.editor#widgets}, while widget instances are created and destroyed by the repository. + * + * To create a widget, first you need to {@link CKEDITOR.plugins.widget.repository#add register} its + * {@link CKEDITOR.plugins.widget.definition definition}: + * + * editor.widgets.add( 'simplebox', { + * upcast: function( element ) { + * // Defines which elements will become widgets. + * if ( element.hasClass( 'simplebox' ) ) + * return true; + * }, + * init: function() { + * // ... + * } + * } ); + * + * Once the widget definition is registered, widgets will be automatically + * created when loading data: + * + * editor.setData( '
    foo
    ', function() { + * console.log( editor.widgets.instances ); // -> An object containing one instance. + * } ); + * + * It is also possible to create instances during runtime by using a command + * (if a {@link CKEDITOR.plugins.widget.definition#template} property was defined): + * + * // You can execute an automatically defined command to + * // insert a new simplebox widget or edit the one currently focused. + * editor.execCommand( 'simplebox' ); + * + * Note: Since CKEditor 4.5 widget's `startupData` can be passed as the command argument: + * + * editor.execCommand( 'simplebox', { + * startupData: { + * align: 'left' + * } + * } ); + * + * A widget can also be created in a completely custom way: + * + * var element = editor.document.createElement( 'div' ); + * editor.insertElement( element ); + * var widget = editor.widgets.initOn( element, 'simplebox' ); + * + * @since 4.3 + * @class CKEDITOR.plugins.widget + * @mixins CKEDITOR.event + * @extends CKEDITOR.plugins.widget.definition + * @constructor Creates an instance of the widget class. Do not use it directly, but instead initialize widgets + * by using the {@link CKEDITOR.plugins.widget.repository#initOn} method or by the upcasting system. + * @param {CKEDITOR.plugins.widget.repository} widgetsRepo + * @param {Number} id Unique ID of this widget instance. + * @param {CKEDITOR.dom.element} element The widget element. + * @param {CKEDITOR.plugins.widget.definition} widgetDef Widget's registered definition. + * @param [startupData] Initial widget data. This data object will overwrite the default data and + * the data loaded from the DOM. + */ + function Widget( widgetsRepo, id, element, widgetDef, startupData ) { + var editor = widgetsRepo.editor; + + // Extend this widget with widgetDef-specific methods and properties. + CKEDITOR.tools.extend( this, widgetDef, { + /** + * The editor instance. + * + * @readonly + * @property {CKEDITOR.editor} + */ + editor: editor, + + /** + * This widget's unique (per editor instance) ID. + * + * @readonly + * @property {Number} + */ + id: id, + + /** + * Whether this widget is an inline widget (based on an inline element unless + * forced otherwise by {@link CKEDITOR.plugins.widget.definition#inline}). + * + * **Note:** This option does not allow to turn a block element into an inline widget. + * However, it makes it possible to turn an inline element into a block widget or to + * force a correct type in case when automatic recognition fails. + * + * @readonly + * @property {Boolean} + */ + inline: element.getParent().getName() == 'span', + + /** + * The widget element — the element on which the widget was initialized. + * + * @readonly + * @property {CKEDITOR.dom.element} element + */ + element: element, + + /** + * Widget's data object. + * + * The data can only be set by using the {@link #setData} method. + * Changes made to the data fire the {@link #event-data} event. + * + * @readonly + */ + data: CKEDITOR.tools.extend( {}, typeof widgetDef.defaults == 'function' ? widgetDef.defaults() : widgetDef.defaults ), + + /** + * Indicates if a widget is data-ready. Set to `true` when data from all sources + * ({@link CKEDITOR.plugins.widget.definition#defaults}, set in the + * {@link #init} method, loaded from the widget's element and startup data coming from the constructor) + * are finally loaded. This is immediately followed by the first {@link #event-data}. + * + * @readonly + */ + dataReady: false, + + /** + * Whether a widget instance was initialized. This means that: + * + * * An instance was created, + * * Its properties were set, + * * The `init` method was executed. + * + * **Note**: The first {@link #event-data} event could not be fired yet which + * means that the widget's DOM has not been set up yet. Wait for the {@link #event-ready} + * event to be notified when a widget is fully initialized and ready. + * + * **Note**: Use the {@link #isInited} method to check whether a widget is initialized and + * has not been destroyed. + * + * @readonly + */ + inited: false, + + /** + * Whether a widget instance is ready. This means that the widget is {@link #inited} and + * that its DOM was finally set up. + * + * **Note:** Use the {@link #isReady} method to check whether a widget is ready and + * has not been destroyed. + * + * @readonly + */ + ready: false, + + // Revert what widgetDef could override (automatic #edit listener). + edit: Widget.prototype.edit, + + /** + * The nested editable element which is currently focused. + * + * @readonly + * @property {CKEDITOR.plugins.widget.nestedEditable} + */ + focusedEditable: null, + + /** + * The widget definition from which this instance was created. + * + * @readonly + * @property {CKEDITOR.plugins.widget.definition} definition + */ + definition: widgetDef, + + /** + * Link to the widget repository which created this instance. + * + * @readonly + * @property {CKEDITOR.plugins.widget.repository} repository + */ + repository: widgetsRepo, + + draggable: widgetDef.draggable !== false, + + // WAAARNING: Overwrite widgetDef's priv object, because otherwise violent unicorn's gonna visit you. + _: { + downcastFn: ( widgetDef.downcast && typeof widgetDef.downcast == 'string' ) ? + widgetDef.downcasts[ widgetDef.downcast ] : widgetDef.downcast + } + }, true ); + + /** + * An object of widget component elements. + * + * For every `partName => selector` pair in {@link CKEDITOR.plugins.widget.definition#parts}, + * one `partName => element` pair is added to this object during the widget initialization. + * + * @readonly + * @property {Object} parts + */ + + /** + * The template which will be used to create a new widget element (when the widget's command is executed). + * It will be populated with {@link #defaults default values}. + * + * @readonly + * @property {CKEDITOR.template} template + */ + + /** + * The widget wrapper — a non-editable `div` or `span` element (depending on {@link #inline}) + * which is a parent of the {@link #element} and widget compontents like the drag handler and the {@link #mask}. + * It is the outermost widget element. + * + * @readonly + * @property {CKEDITOR.dom.element} wrapper + */ + + widgetsRepo.fire( 'instanceCreated', this ); + + setupWidget( this, widgetDef ); + + this.init && this.init(); + + // Finally mark widget as inited. + this.inited = true; + + setupWidgetData( this, startupData ); + + // If at some point (e.g. in #data listener) widget hasn't been destroyed + // and widget is already attached to document then fire #ready. + if ( this.isInited() && editor.editable().contains( this.wrapper ) ) { + this.ready = true; + this.fire( 'ready' ); + } + } + + Widget.prototype = { + /** + * Adds a class to the widget element. This method is used by + * the {@link #applyStyle} method and should be overridden by widgets + * which should handle classes differently (e.g. add them to other elements). + * + * Since 4.6.0 this method also adds a corresponding class prefixed with {@link #WRAPPER_CLASS_PREFIX} + * to the widget wrapper element. + * + * **Note**: This method should not be used directly. Use the {@link #setData} method to + * set the `classes` property. Read more in the {@link #setData} documentation. + * + * See also: {@link #removeClass}, {@link #hasClass}, {@link #getClasses}. + * + * @since 4.4 + * @param {String} className The class name to be added. + */ + addClass: function( className ) { + this.element.addClass( className ); + this.wrapper.addClass( Widget.WRAPPER_CLASS_PREFIX + className ); + }, + + /** + * Applies the specified style to the widget. It is highly recommended to use the + * {@link CKEDITOR.editor#applyStyle} or {@link CKEDITOR.style#apply} methods instead of + * using this method directly, because unlike editor's and style's methods, this one + * does not perform any checks. + * + * By default this method handles only classes defined in the style. It clones existing + * classes which are stored in the {@link #property-data widget data}'s `classes` property, + * adds new classes, and calls the {@link #setData} method if at least one new class was added. + * Then, using the {@link #event-data} event listener widget applies modifications passing + * new classes to the {@link #addClass} method. + * + * If you need to handle classes differently than in the default way, you can override the + * {@link #addClass} and related methods. You can also handle other style properties than `classes` + * by overriding this method. + * + * See also: {@link #checkStyleActive}, {@link #removeStyle}. + * + * @since 4.4 + * @param {CKEDITOR.style} style The custom widget style to be applied. + */ + applyStyle: function( style ) { + applyRemoveStyle( this, style, 1 ); + }, + + /** + * Checks if the specified style is applied to this widget. It is highly recommended to use the + * {@link CKEDITOR.style#checkActive} method instead of using this method directly, + * because unlike style's method, this one does not perform any checks. + * + * By default this method handles only classes defined in the style and passes + * them to the {@link #hasClass} method. You can override these methods to handle classes + * differently or to handle more of the style properties. + * + * See also: {@link #applyStyle}, {@link #removeStyle}. + * + * @since 4.4 + * @param {CKEDITOR.style} style The custom widget style to be checked. + * @returns {Boolean} Whether the style is applied to this widget. + */ + checkStyleActive: function( style ) { + var classes = getStyleClasses( style ), + cl; + + if ( !classes ) + return false; + + while ( ( cl = classes.pop() ) ) { + if ( !this.hasClass( cl ) ) + return false; + } + return true; + }, + + /** + * Destroys this widget instance. + * + * Use {@link CKEDITOR.plugins.widget.repository#destroy} when possible instead of this method. + * + * This method fires the {#event-destroy} event. + * + * @param {Boolean} [offline] Whether a widget is offline (detached from the DOM tree) — + * in this case the DOM (attributes, classes, etc.) will not be cleaned up. + */ + destroy: function( offline ) { + this.fire( 'destroy' ); + + if ( this.editables ) { + for ( var name in this.editables ) + this.destroyEditable( name, offline ); + } + + if ( !offline ) { + if ( this.element.data( 'cke-widget-keep-attr' ) == '0' ) + this.element.removeAttribute( 'data-widget' ); + this.element.removeAttributes( [ 'data-cke-widget-data', 'data-cke-widget-keep-attr' ] ); + this.element.removeClass( 'cke_widget_element' ); + this.element.replace( this.wrapper ); + } + + this.wrapper = null; + }, + + /** + * Destroys a nested editable and all nested widgets. + * + * @param {String} editableName Nested editable name. + * @param {Boolean} [offline] See {@link #method-destroy} method. + */ + destroyEditable: function( editableName, offline ) { + var editable = this.editables[ editableName ]; + + editable.removeListener( 'focus', onEditableFocus ); + editable.removeListener( 'blur', onEditableBlur ); + this.editor.focusManager.remove( editable ); + + if ( !offline ) { + this.repository.destroyAll( false, editable ); + editable.removeClass( 'cke_widget_editable' ); + editable.removeClass( 'cke_widget_editable_focused' ); + editable.removeAttributes( [ 'contenteditable', 'data-cke-widget-editable', 'data-cke-enter-mode' ] ); + } + + delete this.editables[ editableName ]; + }, + + /** + * Starts widget editing. + * + * This method fires the {@link CKEDITOR.plugins.widget#event-edit} event + * which may be canceled in order to prevent it from opening a dialog window. + * + * The dialog window name is obtained from the event's data `dialog` property or + * from {@link CKEDITOR.plugins.widget.definition#dialog}. + * + * @returns {Boolean} Returns `true` if a dialog window was opened. + */ + edit: function() { + var evtData = { dialog: this.dialog }, + that = this; + + // Edit event was blocked or there's no dialog to be automatically opened. + if ( this.fire( 'edit', evtData ) === false || !evtData.dialog ) + return false; + + this.editor.openDialog( evtData.dialog, function( dialog ) { + var showListener, + okListener; + + // Allow to add a custom dialog handler. + if ( that.fire( 'dialog', dialog ) === false ) + return; + + showListener = dialog.on( 'show', function() { + dialog.setupContent( that ); + } ); + + okListener = dialog.on( 'ok', function() { + // Commit dialog's fields, but prevent from + // firing data event for every field. Fire only one, + // bulk event at the end. + var dataChanged, + dataListener = that.on( 'data', function( evt ) { + dataChanged = 1; + evt.cancel(); + }, null, null, 0 ); + + // Create snapshot preceeding snapshot with changed widget... + // TODO it should not be required, but it is and I found similar + // code in dialog#ok listener in dialog/plugin.js. + that.editor.fire( 'saveSnapshot' ); + dialog.commitContent( that ); + + dataListener.removeListener(); + if ( dataChanged ) { + that.fire( 'data', that.data ); + that.editor.fire( 'saveSnapshot' ); + } + } ); + + dialog.once( 'hide', function() { + showListener.removeListener(); + okListener.removeListener(); + } ); + } ); + + return true; + }, + + /** + * Returns widget element classes parsed to an object. This method + * is used to populate the `classes` property of widget's {@link #property-data}. + * + * This method reuses {@link CKEDITOR.plugins.widget.repository#parseElementClasses}. + * It should be overriden if a widget should handle classes differently (e.g. on other elements). + * + * See also: {@link #removeClass}, {@link #addClass}, {@link #hasClass}. + * + * @since 4.4 + * @returns {Object} + */ + getClasses: function() { + return this.repository.parseElementClasses( this.element.getAttribute( 'class' ) ); + }, + + /** + * Checks if the widget element has specified class. This method is used by + * the {@link #checkStyleActive} method and should be overriden by widgets + * which should handle classes differently (e.g. on other elements). + * + * See also: {@link #removeClass}, {@link #addClass}, {@link #getClasses}. + * + * @since 4.4 + * @param {String} className The class to be checked. + * @param {Boolean} Whether a widget has specified class. + */ + hasClass: function( className ) { + return this.element.hasClass( className ); + }, + + /** + * Initializes a nested editable. + * + * **Note**: Only elements from {@link CKEDITOR.dtd#$editable} may become editables. + * + * @param {String} editableName The nested editable name. + * @param {CKEDITOR.plugins.widget.nestedEditable.definition} definition The definition of the nested editable. + * @returns {Boolean} Whether an editable was successfully initialized. + */ + initEditable: function( editableName, definition ) { + // Don't fetch just first element which matched selector but look for a correct one. (#13334) + var editable = this._findOneNotNested( definition.selector ); + + if ( editable && editable.is( CKEDITOR.dtd.$editable ) ) { + editable = new NestedEditable( this.editor, editable, { + filter: createEditableFilter.call( this.repository, this.name, editableName, definition ) + } ); + this.editables[ editableName ] = editable; + + editable.setAttributes( { + contenteditable: 'true', + 'data-cke-widget-editable': editableName, + 'data-cke-enter-mode': editable.enterMode + } ); + + if ( editable.filter ) + editable.data( 'cke-filter', editable.filter.id ); + + editable.addClass( 'cke_widget_editable' ); + // This class may be left when d&ding widget which + // had focused editable. Clean this class here, not in + // cleanUpWidgetElement for performance and code size reasons. + editable.removeClass( 'cke_widget_editable_focused' ); + + if ( definition.pathName ) + editable.data( 'cke-display-name', definition.pathName ); + + this.editor.focusManager.add( editable ); + editable.on( 'focus', onEditableFocus, this ); + CKEDITOR.env.ie && editable.on( 'blur', onEditableBlur, this ); + + // Finally, process editable's data. This data wasn't processed when loading + // editor's data, becuase they need to be processed separately, with its own filters and settings. + editable._.initialSetData = true; + editable.setData( editable.getHtml() ); + + return true; + } + + return false; + }, + + /** + * Looks inside wrapper element to find a node that + * matches given selector and is not nested in other widget. (#13334) + * + * @since 4.5 + * @private + * @param {String} selector Selector to match. + * @returns {CKEDITOR.dom.element} Matched element or `null` if a node has not been found. + */ + _findOneNotNested: function( selector ) { + var matchedElements = this.wrapper.find( selector ), + match, + closestWrapper; + + for ( var i = 0; i < matchedElements.count(); i++ ) { + match = matchedElements.getItem( i ); + closestWrapper = match.getAscendant( Widget.isDomWidgetWrapper ); + + // The closest ascendant-wrapper of this match defines to which widget + // this match belongs. If the ascendant is this widget's wrapper + // it means that the match is not nested in other widget. + if ( this.wrapper.equals( closestWrapper ) ) { + return match; + } + } + + return null; + }, + + /** + * Checks if a widget has already been initialized and has not been destroyed yet. + * + * See {@link #inited} for more details. + * + * @returns {Boolean} + */ + isInited: function() { + return !!( this.wrapper && this.inited ); + }, + + /** + * Checks if a widget is ready and has not been destroyed yet. + * + * See {@link #property-ready} for more details. + * + * @returns {Boolean} + */ + isReady: function() { + return this.isInited() && this.ready; + }, + + /** + * Focuses a widget by selecting it. + */ + focus: function() { + var sel = this.editor.getSelection(); + + // Fake the selection before focusing editor, to avoid unpreventable viewports scrolling + // on Webkit/Blink/IE which is done because there's no selection or selection was somewhere else than widget. + if ( sel ) { + var isDirty = this.editor.checkDirty(); + + sel.fake( this.wrapper ); + + !isDirty && this.editor.resetDirty(); + } + + // Always focus editor (not only when focusManger.hasFocus is false) (because of #10483). + this.editor.focus(); + }, + + /** + * Removes a class from the widget element. This method is used by + * the {@link #removeStyle} method and should be overriden by widgets + * which should handle classes differently (e.g. on other elements). + * + * **Note**: This method should not be used directly. Use the {@link #setData} method to + * set the `classes` property. Read more in the {@link #setData} documentation. + * + * See also: {@link #hasClass}, {@link #addClass}. + * + * @since 4.4 + * @param {String} className The class to be removed. + */ + removeClass: function( className ) { + this.element.removeClass( className ); + this.wrapper.removeClass( Widget.WRAPPER_CLASS_PREFIX + className ); + }, + + /** + * Removes the specified style from the widget. It is highly recommended to use the + * {@link CKEDITOR.editor#removeStyle} or {@link CKEDITOR.style#remove} methods instead of + * using this method directly, because unlike editor's and style's methods, this one + * does not perform any checks. + * + * Read more about how applying/removing styles works in the {@link #applyStyle} method documentation. + * + * See also {@link #checkStyleActive}, {@link #applyStyle}, {@link #getClasses}. + * + * @since 4.4 + * @param {CKEDITOR.style} style The custom widget style to be removed. + */ + removeStyle: function( style ) { + applyRemoveStyle( this, style, 0 ); + }, + + /** + * Sets widget value(s) in the {@link #property-data} object. + * If the given value(s) modifies current ones, the {@link #event-data} event is fired. + * + * this.setData( 'align', 'left' ); + * this.data.align; // -> 'left' + * + * this.setData( { align: 'right', opened: false } ); + * this.data.align; // -> 'right' + * this.data.opened; // -> false + * + * Set values are stored in {@link #element}'s attribute (`data-cke-widget-data`), + * in a JSON string, therefore {@link #property-data} should contain + * only serializable data. + * + * **Note:** A special data property, `classes`, exists. It contains an object with + * classes which were returned by the {@link #getClasses} method during the widget initialization. + * This property is then used by the {@link #applyStyle} and {@link #removeStyle} methods. + * When it is changed (the reference to object must be changed!), the widget updates its classes by + * using the {@link #addClass} and {@link #removeClass} methods. + * + * // Adding a new class. + * var classes = CKEDITOR.tools.clone( widget.data.classes ); + * classes.newClass = 1; + * widget.setData( 'classes', classes ); + * + * // Removing a class. + * var classes = CKEDITOR.tools.clone( widget.data.classes ); + * delete classes.newClass; + * widget.setData( 'classes', classes ); + * + * @param {String/Object} keyOrData + * @param {Object} value + * @chainable + */ + setData: function( key, value ) { + var data = this.data, + modified = 0; + + if ( typeof key == 'string' ) { + if ( data[ key ] !== value ) { + data[ key ] = value; + modified = 1; + } + } + else { + var newData = key; + + for ( key in newData ) { + if ( data[ key ] !== newData[ key ] ) { + modified = 1; + data[ key ] = newData[ key ]; + } + } + } + + // Block firing data event and overwriting data element before setupWidgetData is executed. + if ( modified && this.dataReady ) { + writeDataToElement( this ); + this.fire( 'data', data ); + } + + return this; + }, + + /** + * Changes the widget's focus state. This method is executed automatically after + * a widget was focused by the {@link #method-focus} method or the selection was moved + * out of the widget. + * + * This is a low-level method which is not integrated with e.g. the undo manager. + * Use the {@link #method-focus} method instead. + * + * @param {Boolean} selected Whether to select or deselect this widget. + * @chainable + */ + setFocused: function( focused ) { + this.wrapper[ focused ? 'addClass' : 'removeClass' ]( 'cke_widget_focused' ); + this.fire( focused ? 'focus' : 'blur' ); + return this; + }, + + /** + * Changes the widget's select state. This method is executed automatically after + * a widget was selected by the {@link #method-focus} method or the selection + * was moved out of the widget. + * + * This is a low-level method which is not integrated with e.g. the undo manager. + * Use the {@link #method-focus} method instead or simply change the selection. + * + * @param {Boolean} selected Whether to select or deselect this widget. + * @chainable + */ + setSelected: function( selected ) { + this.wrapper[ selected ? 'addClass' : 'removeClass' ]( 'cke_widget_selected' ); + this.fire( selected ? 'select' : 'deselect' ); + return this; + }, + + /** + * Repositions drag handler according to the widget's element position. Should be called from events, like mouseover. + */ + updateDragHandlerPosition: function() { + var editor = this.editor, + domElement = this.element.$, + oldPos = this._.dragHandlerOffset, + newPos = { + x: domElement.offsetLeft, + y: domElement.offsetTop - DRAG_HANDLER_SIZE + }; + + if ( oldPos && newPos.x == oldPos.x && newPos.y == oldPos.y ) + return; + + // We need to make sure that dirty state is not changed (#11487). + var initialDirty = editor.checkDirty(); + + editor.fire( 'lockSnapshot' ); + this.dragHandlerContainer.setStyles( { + top: newPos.y + 'px', + left: newPos.x + 'px', + display: 'block' + } ); + editor.fire( 'unlockSnapshot' ); + !initialDirty && editor.resetDirty(); + + this._.dragHandlerOffset = newPos; + } + }; + + CKEDITOR.event.implementOn( Widget.prototype ); + + /** + * Gets the {@link #isDomNestedEditable nested editable} + * (returned as a {@link CKEDITOR.dom.element}, not as a {@link CKEDITOR.plugins.widget.nestedEditable}) + * closest to the `node` or the `node` if it is a nested editable itself. + * + * @since 4.5 + * @static + * @param {CKEDITOR.dom.element} guard Stop ancestor search on this node (usually editor's editable). + * @param {CKEDITOR.dom.node} node Start the search from this node. + * @returns {CKEDITOR.dom.element/null} Element or `null` if not found. + */ + Widget.getNestedEditable = function( guard, node ) { + if ( !node || node.equals( guard ) ) + return null; + + if ( Widget.isDomNestedEditable( node ) ) + return node; + + return Widget.getNestedEditable( guard, node.getParent() ); + }; + + /** + * Checks whether the `node` is a widget's drag handle element. + * + * @since 4.5 + * @static + * @param {CKEDITOR.dom.node} node + * @returns {Boolean} + */ + Widget.isDomDragHandler = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-drag-handler' ); + }; + + /** + * Checks whether the `node` is a container of the widget's drag handle element. + * + * @since 4.5 + * @static + * @param {CKEDITOR.dom.node} node + * @returns {Boolean} + */ + Widget.isDomDragHandlerContainer = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.hasClass( 'cke_widget_drag_handler_container' ); + }; + + /** + * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#editables nested editable}. + * Note that this function only checks whether it is the right element, not whether + * the passed `node` is an instance of {@link CKEDITOR.plugins.widget.nestedEditable}. + * + * @since 4.5 + * @static + * @param {CKEDITOR.dom.node} node + * @returns {Boolean} + */ + Widget.isDomNestedEditable = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-editable' ); + }; + + /** + * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#element widget element}. + * + * @since 4.5 + * @static + * @param {CKEDITOR.dom.node} node + * @returns {Boolean} + */ + Widget.isDomWidgetElement = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' ); + }; + + /** + * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#wrapper widget wrapper}. + * + * @since 4.5 + * @static + * @param {CKEDITOR.dom.element} node + * @returns {Boolean} + */ + Widget.isDomWidgetWrapper = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-wrapper' ); + }; + + /** + * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#element widget element}. + * + * @since 4.5 + * @static + * @param {CKEDITOR.htmlParser.node} node + * @returns {Boolean} + */ + Widget.isParserWidgetElement = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && !!node.attributes[ 'data-widget' ]; + }; + + /** + * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#wrapper widget wrapper}. + * + * @since 4.5 + * @static + * @param {CKEDITOR.htmlParser.element} node + * @returns {Boolean} + */ + Widget.isParserWidgetWrapper = function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && !!node.attributes[ 'data-cke-widget-wrapper' ]; + }; + + /** + * Prefix added to wrapper classes. Each class added to the widget element by the {@link #addClass} + * method will also be added to the wrapper prefixed with it. + * + * @since 4.6.0 + * @static + * @readonly + * @property {String} [='cke_widget_wrapper_'] + */ + Widget.WRAPPER_CLASS_PREFIX = 'cke_widget_wrapper_'; + + /** + * An event fired when a widget is ready (fully initialized). This event is fired after: + * + * * {@link #init} is called, + * * The first {@link #event-data} event is fired, + * * A widget is attached to the document. + * + * Therefore, in case of widget creation with a command which opens a dialog window, this event + * will be delayed after the dialog window is closed and the widget is finally inserted into the document. + * + * **Note**: If your widget does not use automatic dialog window binding (i.e. you open the dialog window manually) + * or another situation in which the widget wrapper is not attached to document at the time when it is + * initialized occurs, you need to take care of firing {@link #event-ready} yourself. + * + * See also {@link #property-ready} and {@link #property-inited} properties, and + * {@link #isReady} and {@link #isInited} methods. + * + * @event ready + */ + + /** + * An event fired when a widget is about to be destroyed, but before it is + * fully torn down. + * + * @event destroy + */ + + /** + * An event fired when a widget is focused. + * + * Widget can be focused by executing {@link #method-focus}. + * + * @event focus + */ + + /** + * An event fired when a widget is blurred. + * + * @event blur + */ + + /** + * An event fired when a widget is selected. + * + * @event select + */ + + /** + * An event fired when a widget is deselected. + * + * @event deselect + */ + + /** + * An event fired by the {@link #method-edit} method. It can be canceled + * in order to stop the default action (opening a dialog window and/or + * {@link CKEDITOR.plugins.widget.repository#finalizeCreation finalizing widget creation}). + * + * @event edit + * @param data + * @param {String} data.dialog Defaults to {@link CKEDITOR.plugins.widget.definition#dialog} + * and can be changed or set by the listener. + */ + + /** + * An event fired when a dialog window for widget editing is opened. + * This event can be canceled in order to handle the editing dialog in a custom manner. + * + * @event dialog + * @param {CKEDITOR.dialog} data The opened dialog window instance. + */ + + /** + * An event fired when a key is pressed on a focused widget. + * This event is forwarded from the {@link CKEDITOR.editor#key} event and + * has the ability to block editor keystrokes if it is canceled. + * + * @event key + * @param data + * @param {Number} data.keyCode A number representing the key code (or combination). + */ + + /** + * An event fired when a widget is double clicked. + * + * **Note:** If a default editing action is executed on double click (i.e. a widget has a + * {@link CKEDITOR.plugins.widget.definition#dialog dialog} defined and the {@link #event-doubleclick} event was not + * canceled), this event will be automatically canceled, so a listener added with the default priority (10) + * will not be executed. Use a listener with low priority (e.g. 5) to be sure that it will be executed. + * + * widget.on( 'doubleclick', function( evt ) { + * console.log( 'widget#doubleclick' ); + * }, null, null, 5 ); + * + * If your widget handles double click in a special way (so the default editing action is not executed), + * make sure you cancel this event, because otherwise it will be propagated to {@link CKEDITOR.editor#doubleclick} + * and another feature may step in (e.g. a Link dialog window may be opened if your widget was inside a link). + * + * @event doubleclick + * @param data + * @param {CKEDITOR.dom.element} data.element The double-clicked element. + */ + + /** + * An event fired when the context menu is opened for a widget. + * + * @event contextMenu + * @param data The object containing context menu options to be added + * for this widget. See {@link CKEDITOR.plugins.contextMenu#addListener}. + */ + + /** + * An event fired when the widget data changed. See the {@link #setData} method and the {@link #property-data} property. + * + * @event data + */ + + + + /** + * The wrapper class for editable elements inside widgets. + * + * Do not use directly. Use {@link CKEDITOR.plugins.widget.definition#editables} or + * {@link CKEDITOR.plugins.widget#initEditable}. + * + * @class CKEDITOR.plugins.widget.nestedEditable + * @extends CKEDITOR.dom.element + * @constructor + * @param {CKEDITOR.editor} editor + * @param {CKEDITOR.dom.element} element + * @param config + * @param {CKEDITOR.filter} [config.filter] + */ + function NestedEditable( editor, element, config ) { + // Call the base constructor. + CKEDITOR.dom.element.call( this, element.$ ); + this.editor = editor; + this._ = {}; + var filter = this.filter = config.filter; + + // If blockless editable - always use BR mode. + if ( !CKEDITOR.dtd[ this.getName() ].p ) + this.enterMode = this.shiftEnterMode = CKEDITOR.ENTER_BR; + else { + this.enterMode = filter ? filter.getAllowedEnterMode( editor.enterMode ) : editor.enterMode; + this.shiftEnterMode = filter ? filter.getAllowedEnterMode( editor.shiftEnterMode, true ) : editor.shiftEnterMode; + } + } + + NestedEditable.prototype = CKEDITOR.tools.extend( CKEDITOR.tools.prototypedCopy( CKEDITOR.dom.element.prototype ), { + /** + * Sets the editable data. The data will be passed through the {@link CKEDITOR.editor#dataProcessor} + * and the {@link CKEDITOR.editor#filter}. This ensures that the data was filtered and prepared to be + * edited like the {@link CKEDITOR.editor#method-setData editor data}. + * + * Before content is changed, all nested widgets are destroyed. Afterwards, after new content is loaded, + * all nested widgets are initialized. + * + * @param {String} data + */ + setData: function( data ) { + // For performance reasons don't call destroyAll when initializing a nested editable, + // because there are no widgets inside. + if ( !this._.initialSetData ) { + // Destroy all nested widgets before setting data. + this.editor.widgets.destroyAll( false, this ); + } + this._.initialSetData = false; + + data = this.editor.dataProcessor.toHtml( data, { + context: this.getName(), + filter: this.filter, + enterMode: this.enterMode + } ); + this.setHtml( data ); + + this.editor.widgets.initOnAll( this ); + }, + + /** + * Gets the editable data. Like {@link #setData}, this method will process and filter the data. + * + * @returns {String} + */ + getData: function() { + return this.editor.dataProcessor.toDataFormat( this.getHtml(), { + context: this.getName(), + filter: this.filter, + enterMode: this.enterMode + } ); + } + } ); + + /** + * The editor instance. + * + * @readonly + * @property {CKEDITOR.editor} editor + */ + + /** + * The filter instance if allowed content rules were defined. + * + * @readonly + * @property {CKEDITOR.filter} filter + */ + + /** + * The enter mode active in this editable. + * It is determined from editable's name (whether it is a blockless editable), + * its allowed content rules (if defined) and the default editor's mode. + * + * @readonly + * @property {Number} enterMode + */ + + /** + * The shift enter move active in this editable. + * + * @readonly + * @property {Number} shiftEnterMode + */ + + + // + // REPOSITORY helpers ----------------------------------------------------- + // + + function addWidgetButtons( editor ) { + var widgets = editor.widgets.registered, + widget, + widgetName, + widgetButton; + + for ( widgetName in widgets ) { + widget = widgets[ widgetName ]; + + // Create button if defined. + widgetButton = widget.button; + if ( widgetButton && editor.ui.addButton ) { + editor.ui.addButton( CKEDITOR.tools.capitalize( widget.name, true ), { + label: widgetButton, + command: widget.name, + toolbar: 'insert,10' + } ); + } + } + } + + // Create a command creating and editing widget. + // + // @param editor + // @param {CKEDITOR.plugins.widget.definition} widgetDef + function addWidgetCommand( editor, widgetDef ) { + editor.addCommand( widgetDef.name, { + exec: function( editor, commandData ) { + var focused = editor.widgets.focused; + // If a widget of the same type is focused, start editing. + if ( focused && focused.name == widgetDef.name ) + focused.edit(); + // Otherwise... + // ... use insert method is was defined. + else if ( widgetDef.insert ) + widgetDef.insert(); + // ... or create a brand-new widget from template. + else if ( widgetDef.template ) { + var defaults = typeof widgetDef.defaults == 'function' ? widgetDef.defaults() : widgetDef.defaults, + element = CKEDITOR.dom.element.createFromHtml( widgetDef.template.output( defaults ) ), + instance, + wrapper = editor.widgets.wrapElement( element, widgetDef.name ), + temp = new CKEDITOR.dom.documentFragment( wrapper.getDocument() ); + + // Append wrapper to a temporary document. This will unify the environment + // in which #data listeners work when creating and editing widget. + temp.append( wrapper ); + instance = editor.widgets.initOn( element, widgetDef, commandData && commandData.startupData ); + + // Instance could be destroyed during initialization. + // In this case finalize creation if some new widget + // was left in temporary document fragment. + if ( !instance ) { + finalizeCreation(); + return; + } + + // Listen on edit to finalize widget insertion. + // + // * If dialog was set, then insert widget after dialog was successfully saved or destroy this + // temporary instance. + // * If dialog wasn't set and edit wasn't canceled, insert widget. + var editListener = instance.once( 'edit', function( evt ) { + if ( evt.data.dialog ) { + instance.once( 'dialog', function( evt ) { + var dialog = evt.data, + okListener, + cancelListener; + + // Finalize creation AFTER (20) new data was set. + okListener = dialog.once( 'ok', finalizeCreation, null, null, 20 ); + + cancelListener = dialog.once( 'cancel', function( evt ) { + if ( !( evt.data && evt.data.hide === false ) ) { + editor.widgets.destroy( instance, true ); + } + } ); + + dialog.once( 'hide', function() { + okListener.removeListener(); + cancelListener.removeListener(); + } ); + } ); + } else { + // Dialog hasn't been set, so insert widget now. + finalizeCreation(); + } + }, null, null, 999 ); + + instance.edit(); + + // Remove listener in case someone canceled it before this + // listener was executed. + editListener.removeListener(); + } + + function finalizeCreation() { + editor.widgets.finalizeCreation( temp ); + } + }, + + allowedContent: widgetDef.allowedContent, + requiredContent: widgetDef.requiredContent, + contentForms: widgetDef.contentForms, + contentTransformations: widgetDef.contentTransformations + } ); + } + + function addWidgetProcessors( widgetsRepo, widgetDef ) { + var upcast = widgetDef.upcast, + upcasts, + priority = widgetDef.upcastPriority || 10; + + if ( !upcast ) + return; + + // Multiple upcasts defined in string. + if ( typeof upcast == 'string' ) { + upcasts = upcast.split( ',' ); + while ( upcasts.length ) { + addUpcast( widgetDef.upcasts[ upcasts.pop() ], widgetDef.name, priority ); + } + } + // Single rule which is automatically activated. + else { + addUpcast( upcast, widgetDef.name, priority ); + } + + function addUpcast( upcast, name, priority ) { + // Find index of the first higher (in terms of value) priority upcast. + var index = CKEDITOR.tools.getIndex( widgetsRepo._.upcasts, function( element ) { + return element[ 2 ] > priority; + } ); + // Add at the end if it is the highest priority so far. + if ( index < 0 ) { + index = widgetsRepo._.upcasts.length; + } + + widgetsRepo._.upcasts.splice( index, 0, [ upcast, name, priority ] ); + } + } + + function blurWidget( widgetsRepo, widget ) { + widgetsRepo.focused = null; + + if ( widget.isInited() ) { + var isDirty = widget.editor.checkDirty(); + + // Widget could be destroyed in the meantime - e.g. data could be set. + widgetsRepo.fire( 'widgetBlurred', { widget: widget } ); + widget.setFocused( false ); + + !isDirty && widget.editor.resetDirty(); + } + } + + function checkWidgets( evt ) { + var options = evt.data; + + if ( this.editor.mode != 'wysiwyg' ) + return; + + var editable = this.editor.editable(), + instances = this.instances, + newInstances, i, count, wrapper, notYetInitialized; + + if ( !editable ) + return; + + // Remove widgets which have no corresponding elements in DOM. + for ( i in instances ) { + // #13410 Remove widgets that are ready. This prevents from destroying widgets that are during loading process. + if ( instances[ i ].isReady() && !editable.contains( instances[ i ].wrapper ) ) + this.destroy( instances[ i ], true ); + } + + // Init on all (new) if initOnlyNew option was passed. + if ( options && options.initOnlyNew ) + newInstances = this.initOnAll(); + else { + var wrappers = editable.find( '.cke_widget_wrapper' ); + newInstances = []; + + // Create widgets on existing wrappers if they do not exists. + for ( i = 0, count = wrappers.count(); i < count; i++ ) { + wrapper = wrappers.getItem( i ); + notYetInitialized = !this.getByElement( wrapper, true ); + + // Check if: + // * there's no instance for this widget + // * wrapper is not inside some temporary element like copybin (#11088) + // * it was a nested widget's wrapper which has been detached from DOM, + // when nested editable has been initialized (it overwrites its innerHTML + // and initializes nested widgets). + if ( notYetInitialized && !findParent( wrapper, isDomTemp ) && editable.contains( wrapper ) ) { + // Add cke_widget_new class because otherwise + // widget will not be created on such wrapper. + wrapper.addClass( 'cke_widget_new' ); + newInstances.push( this.initOn( wrapper.getFirst( Widget.isDomWidgetElement ) ) ); + } + } + } + + // If only single widget was initialized and focusInited was passed, focus it. + if ( options && options.focusInited && newInstances.length == 1 ) + newInstances[ 0 ].focus(); + } + + // Unwraps widget element and clean up element. + // + // This function is used to clean up pasted widgets. + // It should have similar result to widget#destroy plus + // some additional adjustments, specific for pasting. + // + // @param {CKEDITOR.htmlParser.element} el + function cleanUpWidgetElement( el ) { + var parent = el.parent; + if ( parent.type == CKEDITOR.NODE_ELEMENT && parent.attributes[ 'data-cke-widget-wrapper' ] ) + parent.replaceWith( el ); + } + + // Similar to cleanUpWidgetElement, but works on DOM and finds + // widget elements by its own. + // + // Unlike cleanUpWidgetElement it will wrap element back. + // + // @param {CKEDITOR.dom.element} container + function cleanUpAllWidgetElements( widgetsRepo, container ) { + var wrappers = container.find( '.cke_widget_wrapper' ), + wrapper, element, + i = 0, + l = wrappers.count(); + + for ( ; i < l; ++i ) { + wrapper = wrappers.getItem( i ); + element = wrapper.getFirst( Widget.isDomWidgetElement ); + // If wrapper contains widget element - unwrap it and wrap again. + if ( element.type == CKEDITOR.NODE_ELEMENT && element.data( 'widget' ) ) { + element.replace( wrapper ); + widgetsRepo.wrapElement( element ); + } else { + // Otherwise - something is wrong... clean this up. + wrapper.remove(); + } + } + } + + // Creates {@link CKEDITOR.filter} instance for given widget, editable and rules. + // + // Once filter for widget-editable pair is created it is cached, so the same instance + // will be returned when method is executed again. + // + // @param {String} widgetName + // @param {String} editableName + // @param {CKEDITOR.plugins.widget.nestedEditableDefinition} editableDefinition The nested editable definition. + // @returns {CKEDITOR.filter} Filter instance or `null` if rules are not defined. + // @context CKEDITOR.plugins.widget.repository + function createEditableFilter( widgetName, editableName, editableDefinition ) { + if ( !editableDefinition.allowedContent ) + return null; + + var editables = this._.filters[ widgetName ]; + + if ( !editables ) + this._.filters[ widgetName ] = editables = {}; + + var filter = editables[ editableName ]; + + if ( !filter ) + editables[ editableName ] = filter = new CKEDITOR.filter( editableDefinition.allowedContent ); + + return filter; + } + + // Creates an iterator function which when executed on all + // elements in DOM tree will gather elements that should be wrapped + // and initialized as widgets. + function createUpcastIterator( widgetsRepo ) { + var toBeWrapped = [], + upcasts = widgetsRepo._.upcasts, + upcastCallbacks = widgetsRepo._.upcastCallbacks; + + return { + toBeWrapped: toBeWrapped, + + iterator: function( element ) { + var upcast, upcasted, + data, + i, + upcastsLength, + upcastCallbacksLength; + + // Wrapper found - find widget element, add it to be + // cleaned up (unwrapped) and wrapped and stop iterating in this branch. + if ( 'data-cke-widget-wrapper' in element.attributes ) { + element = element.getFirst( Widget.isParserWidgetElement ); + + if ( element ) + toBeWrapped.push( [ element ] ); + + // Do not iterate over descendants. + return false; + } + // Widget element found - add it to be cleaned up (just in case) + // and wrapped and stop iterating in this branch. + else if ( 'data-widget' in element.attributes ) { + toBeWrapped.push( [ element ] ); + + // Do not iterate over descendants. + return false; + } + else if ( ( upcastsLength = upcasts.length ) ) { + // Ignore elements with data-cke-widget-upcasted to avoid multiple upcasts (#11533). + // Do not iterate over descendants. + if ( element.attributes[ 'data-cke-widget-upcasted' ] ) + return false; + + // Check element with upcast callbacks first. + // If any of them return false abort upcasting. + for ( i = 0, upcastCallbacksLength = upcastCallbacks.length; i < upcastCallbacksLength; ++i ) { + if ( upcastCallbacks[ i ]( element ) === false ) + return; + // Return nothing in order to continue iterating over ascendants. + // See http://dev.ckeditor.com/ticket/11186#comment:6 + } + + for ( i = 0; i < upcastsLength; ++i ) { + upcast = upcasts[ i ]; + data = {}; + + if ( ( upcasted = upcast[ 0 ]( element, data ) ) ) { + // If upcast function returned element, upcast this one. + // It can be e.g. a new element wrapping the original one. + if ( upcasted instanceof CKEDITOR.htmlParser.element ) + element = upcasted; + + // Set initial data attr with data from upcast method. + element.attributes[ 'data-cke-widget-data' ] = encodeURIComponent( JSON.stringify( data ) ); + element.attributes[ 'data-cke-widget-upcasted' ] = 1; + + toBeWrapped.push( [ element, upcast[ 1 ] ] ); + + // Do not iterate over descendants. + return false; + } + } + } + } + }; + } + + // Finds a first parent that matches query. + // + // @param {CKEDITOR.dom.element} element + // @param {Function} query + function findParent( element, query ) { + var parent = element; + + while ( ( parent = parent.getParent() ) ) { + if ( query( parent ) ) + return true; + } + return false; + } + + function getWrapperAttributes( inlineWidget, name ) { + return { + // tabindex="-1" means that it can receive focus by code. + tabindex: -1, + contenteditable: 'false', + 'data-cke-widget-wrapper': 1, + 'data-cke-filter': 'off', + // Class cke_widget_new marks widgets which haven't been initialized yet. + 'class': 'cke_widget_wrapper cke_widget_new cke_widget_' + + ( inlineWidget ? 'inline' : 'block' ) + + ( name ? ' cke_widget_' + name : '' ) + }; + } + + // Inserts element at given index. + // It will check DTD and split ancestor elements up to the first + // that can contain this element. + // + // @param {CKEDITOR.htmlParser.element} parent + // @param {Number} index + // @param {CKEDITOR.htmlParser.element} element + function insertElement( parent, index, element ) { + // Do not split doc fragment... + if ( parent.type == CKEDITOR.NODE_ELEMENT ) { + var parentAllows = CKEDITOR.dtd[ parent.name ]; + // Parent element is known (included in DTD) and cannot contain + // this element. + if ( parentAllows && !parentAllows[ element.name ] ) { + var parent2 = parent.split( index ), + parentParent = parent.parent; + + // Element will now be inserted at right parent's index. + index = parent2.getIndex(); + + // If left part of split is empty - remove it. + if ( !parent.children.length ) { + index -= 1; + parent.remove(); + } + + // If right part of split is empty - remove it. + if ( !parent2.children.length ) + parent2.remove(); + + // Try inserting as grandpas' children. + return insertElement( parentParent, index, element ); + } + } + + // Finally we can add this element. + parent.add( element, index ); + } + + // Checks whether for the given widget definition and element widget should be created in inline or block mode. + // + // See also: {@link CKEDITOR.plugins.widget.definition#inline} and {@link CKEDITOR.plugins.widget#element}. + // + // @param {CKEDITOR.plugins.widget.definition} widgetDef The widget definition. + // @param {String} elementName The name of the widget element. + // @returns {Boolean} + function isWidgetInline( widgetDef, elementName ) { + return typeof widgetDef.inline == 'boolean' ? widgetDef.inline : !!CKEDITOR.dtd.$inline[ elementName ]; + } + + // @param {CKEDITOR.dom.element} + // @returns {Boolean} + function isDomTemp( element ) { + return element.hasAttribute( 'data-cke-temp' ); + } + + function onEditableKey( widget, keyCode ) { + var focusedEditable = widget.focusedEditable, + range; + + // CTRL+A. + if ( keyCode == CKEDITOR.CTRL + 65 ) { + var bogus = focusedEditable.getBogus(); + + range = widget.editor.createRange(); + range.selectNodeContents( focusedEditable ); + // Exclude bogus if exists. + if ( bogus ) + range.setEndAt( bogus, CKEDITOR.POSITION_BEFORE_START ); + + range.select(); + // Cancel event - block default. + return false; + } + // DEL or BACKSPACE. + else if ( keyCode == 8 || keyCode == 46 ) { + var ranges = widget.editor.getSelection().getRanges(); + + range = ranges[ 0 ]; + + // Block del or backspace if at editable's boundary. + return !( ranges.length == 1 && range.collapsed && + range.checkBoundaryOfElement( focusedEditable, CKEDITOR[ keyCode == 8 ? 'START' : 'END' ] ) ); + } + } + + function setFocusedEditable( widgetsRepo, widget, editableElement, offline ) { + var editor = widgetsRepo.editor; + + editor.fire( 'lockSnapshot' ); + + if ( editableElement ) { + var editableName = editableElement.data( 'cke-widget-editable' ), + editableInstance = widget.editables[ editableName ]; + + widgetsRepo.widgetHoldingFocusedEditable = widget; + widget.focusedEditable = editableInstance; + editableElement.addClass( 'cke_widget_editable_focused' ); + + if ( editableInstance.filter ) + editor.setActiveFilter( editableInstance.filter ); + editor.setActiveEnterMode( editableInstance.enterMode, editableInstance.shiftEnterMode ); + } else { + if ( !offline ) + widget.focusedEditable.removeClass( 'cke_widget_editable_focused' ); + + widget.focusedEditable = null; + widgetsRepo.widgetHoldingFocusedEditable = null; + editor.setActiveFilter( null ); + editor.setActiveEnterMode( null, null ); + } + + editor.fire( 'unlockSnapshot' ); + } + + function setupContextMenu( editor ) { + if ( !editor.contextMenu ) + return; + + editor.contextMenu.addListener( function( element ) { + var widget = editor.widgets.getByElement( element, true ); + + if ( widget ) + return widget.fire( 'contextMenu', {} ); + } ); + } + + // And now we've got two problems - original problem and RegExp. + // Some softeners: + // * FF tends to copy all blocks up to the copybin container. + // * IE tends to copy only the copybin, without its container. + // * We use spans on IE and blockless editors, but divs in other cases. + var pasteReplaceRegex = new RegExp( + '^' + + '(?:<(?:div|span)(?: data-cke-temp="1")?(?: id="cke_copybin")?(?: data-cke-temp="1")?>)?' + + '(?:<(?:div|span)(?: style="[^"]+")?>)?' + + ']*data-cke-copybin-start="1"[^>]*>.?([\\s\\S]+)]*data-cke-copybin-end="1"[^>]*>.?' + + '(?:)?' + + '(?:)?' + + '$', + // IE8 prefers uppercase when browsers stick to lowercase HTML (#13460). + 'i' + ); + + function pasteReplaceFn( match, wrapperHtml ) { + // Avoid polluting pasted data with any whitspaces, + // what's going to break check whether only one widget was pasted. + return CKEDITOR.tools.trim( wrapperHtml ); + } + + function setupDragAndDrop( widgetsRepo ) { + var editor = widgetsRepo.editor, + lineutils = CKEDITOR.plugins.lineutils; + + // These listeners handle inline and block widgets drag and drop. + // The only thing we need to do to make block widgets custom drag and drop functionality + // is to fire those events with the right properties (like the target which must be the drag handle). + editor.on( 'dragstart', function( evt ) { + var target = evt.data.target; + + if ( Widget.isDomDragHandler( target ) ) { + var widget = widgetsRepo.getByElement( target ); + + evt.data.dataTransfer.setData( 'cke/widget-id', widget.id ); + + // IE needs focus. + editor.focus(); + + // and widget need to be focused on drag start (#12172#comment:10). + widget.focus(); + } + } ); + + editor.on( 'drop', function( evt ) { + var dataTransfer = evt.data.dataTransfer, + id = dataTransfer.getData( 'cke/widget-id' ), + transferType = dataTransfer.getTransferType( editor ), + dragRange = editor.createRange(), + sourceWidget; + + // Disable cross-editor drag & drop for widgets - #13599. + if ( id !== '' && transferType === CKEDITOR.DATA_TRANSFER_CROSS_EDITORS ) { + evt.cancel(); + return; + } + + if ( id === '' || transferType != CKEDITOR.DATA_TRANSFER_INTERNAL ) { + return; + } + + sourceWidget = widgetsRepo.instances[ id ]; + if ( !sourceWidget ) { + return; + } + + dragRange.setStartBefore( sourceWidget.wrapper ); + dragRange.setEndAfter( sourceWidget.wrapper ); + evt.data.dragRange = dragRange; + + // [IE8-9] Reset state of the clipboard#fixSplitNodesAfterDrop fix because by setting evt.data.dragRange + // (see above) after drop happened we do not need it. That fix is needed only if dragRange was created + // before drop (before text node was split). + delete CKEDITOR.plugins.clipboard.dragStartContainerChildCount; + delete CKEDITOR.plugins.clipboard.dragEndContainerChildCount; + + evt.data.dataTransfer.setData( 'text/html', editor.editable().getHtmlFromRange( dragRange ).getHtml() ); + editor.widgets.destroy( sourceWidget, true ); + } ); + + editor.on( 'contentDom', function() { + var editable = editor.editable(); + + // Register Lineutils's utilities as properties of repo. + CKEDITOR.tools.extend( widgetsRepo, { + finder: new lineutils.finder( editor, { + lookups: { + // Element is block but not list item and not in nested editable. + 'default': function( el ) { + if ( el.is( CKEDITOR.dtd.$listItem ) ) + return; + + if ( !el.is( CKEDITOR.dtd.$block ) ) + return; + + // Allow drop line inside, but never before or after nested editable (#12006). + if ( Widget.isDomNestedEditable( el ) ) + return; + + // Do not allow droping inside the widget being dragged (#13397). + if ( widgetsRepo._.draggedWidget.wrapper.contains( el ) ) { + return; + } + + // If element is nested editable, make sure widget can be dropped there (#12006). + var nestedEditable = Widget.getNestedEditable( editable, el ); + if ( nestedEditable ) { + var draggedWidget = widgetsRepo._.draggedWidget; + + // Don't let the widget to be dropped into its own nested editable. + if ( widgetsRepo.getByElement( nestedEditable ) == draggedWidget ) + return; + + var filter = CKEDITOR.filter.instances[ nestedEditable.data( 'cke-filter' ) ], + draggedRequiredContent = draggedWidget.requiredContent; + + // There will be no relation if the filter of nested editable does not allow + // requiredContent of dragged widget. + if ( filter && draggedRequiredContent && !filter.check( draggedRequiredContent ) ) + return; + } + + return CKEDITOR.LINEUTILS_BEFORE | CKEDITOR.LINEUTILS_AFTER; + } + } + } ), + locator: new lineutils.locator( editor ), + liner: new lineutils.liner( editor, { + lineStyle: { + cursor: 'move !important', + 'border-top-color': '#666' + }, + tipLeftStyle: { + 'border-left-color': '#666' + }, + tipRightStyle: { + 'border-right-color': '#666' + } + } ) + }, true ); + } ); + } + + // Setup mouse observer which will trigger: + // * widget focus on widget click, + // * widget#doubleclick forwarded from editor#doubleclick. + function setupMouseObserver( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'contentDom', function() { + var editable = editor.editable(), + evtRoot = editable.isInline() ? editable : editor.document, + widget, + mouseDownOnDragHandler; + + editable.attachListener( evtRoot, 'mousedown', function( evt ) { + var target = evt.data.getTarget(); + + // #10887 Clicking scrollbar in IE8 will invoke event with empty target object. + if ( !target.type ) + return false; + + widget = widgetsRepo.getByElement( target ); + mouseDownOnDragHandler = 0; // Reset. + + // Widget was clicked, but not editable nested in it. + if ( widget ) { + // Ignore mousedown on drag and drop handler if the widget is inline. + // Block widgets are handled by Lineutils. + if ( widget.inline && target.type == CKEDITOR.NODE_ELEMENT && target.hasAttribute( 'data-cke-widget-drag-handler' ) ) { + mouseDownOnDragHandler = 1; + + // When drag handler is pressed we have to clear current selection if it wasn't already on this widget. + // Otherwise, the selection may be in a fillingChar, which prevents dragging a widget. (#13284, see comment 8 and 9.) + if ( widgetsRepo.focused != widget ) + editor.getSelection().removeAllRanges(); + + return; + } + + if ( !Widget.getNestedEditable( widget.wrapper, target ) ) { + evt.data.preventDefault(); + if ( !CKEDITOR.env.ie ) + widget.focus(); + } else { + // Reset widget so mouseup listener is not confused. + widget = null; + } + } + } ); + + // Focus widget on mouseup if mousedown was fired on drag handler. + // Note: mouseup won't be fired at all if widget was dragged and dropped, so + // this code will be executed only when drag handler was clicked. + editable.attachListener( evtRoot, 'mouseup', function() { + // Check if widget is not destroyed (if widget is destroyed the wrapper will be null). + if ( mouseDownOnDragHandler && widget && widget.wrapper ) { + mouseDownOnDragHandler = 0; + widget.focus(); + } + } ); + + // On IE it is not enough to block mousedown. If widget wrapper (element with + // contenteditable=false attribute) is clicked directly (it is a target), + // then after mouseup/click IE will select that element. + // It is not possible to prevent that default action, + // so we force fake selection after everything happened. + if ( CKEDITOR.env.ie ) { + editable.attachListener( evtRoot, 'mouseup', function() { + setTimeout( function() { + // Check if widget is not destroyed (if widget is destroyed the wrapper will be null) and + // in editable contains widget (it could be dragged and removed). + if ( widget && widget.wrapper && editable.contains( widget.wrapper ) ) { + widget.focus(); + widget = null; + } + } ); + } ); + } + } ); + + editor.on( 'doubleclick', function( evt ) { + var widget = widgetsRepo.getByElement( evt.data.element ); + + // Not in widget or in nested editable. + if ( !widget || Widget.getNestedEditable( widget.wrapper, evt.data.element ) ) + return; + + return widget.fire( 'doubleclick', { element: evt.data.element } ); + }, null, null, 1 ); + } + + // Setup editor#key observer which will forward it + // to focused widget. + function setupKeyboardObserver( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'key', function( evt ) { + var focused = widgetsRepo.focused, + widgetHoldingFocusedEditable = widgetsRepo.widgetHoldingFocusedEditable, + ret; + + if ( focused ) + ret = focused.fire( 'key', { keyCode: evt.data.keyCode } ); + else if ( widgetHoldingFocusedEditable ) + ret = onEditableKey( widgetHoldingFocusedEditable, evt.data.keyCode ); + + return ret; + }, null, null, 1 ); + } + + // Setup copybin on native copy and cut events in order to handle copy and cut commands + // if user accepted security alert on IEs. + // Note: when copying or cutting using keystroke, copySingleWidget will be first executed + // by the keydown listener. Conflict between two calls will be resolved by copy_bin existence check. + function setupNativeCutAndCopy( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'contentDom', function() { + var editable = editor.editable(); + + editable.attachListener( editable, 'copy', eventListener ); + editable.attachListener( editable, 'cut', eventListener ); + } ); + + function eventListener( evt ) { + if ( widgetsRepo.focused ) + copySingleWidget( widgetsRepo.focused, evt.name == 'cut' ); + } + } + + // Setup selection observer which will trigger: + // * widget select & focus on selection change, + // * nested editable focus (related properites and classes) on selection change, + // * deselecting and blurring all widgets on data, + // * blurring widget on editor blur. + function setupSelectionObserver( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'selectionCheck', function() { + widgetsRepo.fire( 'checkSelection' ); + } ); + + widgetsRepo.on( 'checkSelection', widgetsRepo.checkSelection, widgetsRepo ); + + editor.on( 'selectionChange', function( evt ) { + var nestedEditable = Widget.getNestedEditable( editor.editable(), evt.data.selection.getStartElement() ), + newWidget = nestedEditable && widgetsRepo.getByElement( nestedEditable ), + oldWidget = widgetsRepo.widgetHoldingFocusedEditable; + + if ( oldWidget ) { + if ( oldWidget !== newWidget || !oldWidget.focusedEditable.equals( nestedEditable ) ) { + setFocusedEditable( widgetsRepo, oldWidget, null ); + + if ( newWidget && nestedEditable ) + setFocusedEditable( widgetsRepo, newWidget, nestedEditable ); + } + } + // It may happen that there's no widget even if editable was found - + // e.g. if selection was automatically set in editable although widget wasn't initialized yet. + else if ( newWidget && nestedEditable ) { + setFocusedEditable( widgetsRepo, newWidget, nestedEditable ); + } + } ); + + // Invalidate old widgets early - immediately on dataReady. + editor.on( 'dataReady', function() { + // Deselect and blur all widgets. + stateUpdater( widgetsRepo ).commit(); + } ); + + editor.on( 'blur', function() { + var widget; + + if ( ( widget = widgetsRepo.focused ) ) + blurWidget( widgetsRepo, widget ); + + if ( ( widget = widgetsRepo.widgetHoldingFocusedEditable ) ) + setFocusedEditable( widgetsRepo, widget, null ); + } ); + } + + // Set up actions like: + // * processing in toHtml/toDataFormat, + // * pasting handling, + // * insertion handling, + // * editable reload handling (setData, mode switch, undo/redo), + // * DOM invalidation handling, + // * widgets checks. + function setupWidgetsLifecycle( widgetsRepo ) { + setupWidgetsLifecycleStart( widgetsRepo ); + setupWidgetsLifecycleEnd( widgetsRepo ); + + widgetsRepo.on( 'checkWidgets', checkWidgets ); + widgetsRepo.editor.on( 'contentDomInvalidated', widgetsRepo.checkWidgets, widgetsRepo ); + } + + function setupWidgetsLifecycleEnd( widgetsRepo ) { + var editor = widgetsRepo.editor, + downcastingSessions = {}; + + // Listen before htmlDP#htmlFilter is applied to cache all widgets, because we'll + // loose data-cke-* attributes. + editor.on( 'toDataFormat', function( evt ) { + // To avoid conflicts between htmlDP#toDF calls done at the same time + // (e.g. nestedEditable#getData called during downcasting some widget) + // mark every toDataFormat event chain with the downcasting session id. + var id = CKEDITOR.tools.getNextNumber(), + toBeDowncasted = []; + evt.data.downcastingSessionId = id; + downcastingSessions[ id ] = toBeDowncasted; + + evt.data.dataValue.forEach( function( element ) { + var attrs = element.attributes, + widget, widgetElement; + + // Wrapper. + // Perform first part of downcasting (cleanup) and cache widgets, + // because after applying DP's filter all data-cke-* attributes will be gone. + if ( 'data-cke-widget-id' in attrs ) { + widget = widgetsRepo.instances[ attrs[ 'data-cke-widget-id' ] ]; + if ( widget ) { + widgetElement = element.getFirst( Widget.isParserWidgetElement ); + toBeDowncasted.push( { + wrapper: element, + element: widgetElement, + widget: widget, + editables: {} + } ); + + // If widget did not have data-cke-widget attribute before upcasting remove it. + if ( widgetElement.attributes[ 'data-cke-widget-keep-attr' ] != '1' ) + delete widgetElement.attributes[ 'data-widget' ]; + } + } + // Nested editable. + else if ( 'data-cke-widget-editable' in attrs ) { + // Save the reference to this nested editable in the closest widget to be downcasted. + // Nested editables are downcasted in the successive toDataFormat to create an opportunity + // for dataFilter's "excludeNestedEditable" option to do its job (that option relies on + // contenteditable="true" attribute) (#11372). + toBeDowncasted[ toBeDowncasted.length - 1 ].editables[ attrs[ 'data-cke-widget-editable' ] ] = element; + + // Don't check children - there won't be next wrapper or nested editable which we + // should process in this session. + return false; + } + }, CKEDITOR.NODE_ELEMENT, true ); + }, null, null, 8 ); + + // Listen after dataProcessor.htmlFilter and ACF were applied + // so wrappers securing widgets' contents are removed after all filtering was done. + editor.on( 'toDataFormat', function( evt ) { + // Ignore some unmarked sessions. + if ( !evt.data.downcastingSessionId ) + return; + + var toBeDowncasted = downcastingSessions[ evt.data.downcastingSessionId ], + toBe, widget, widgetElement, retElement, editableElement, e; + + while ( ( toBe = toBeDowncasted.shift() ) ) { + widget = toBe.widget; + widgetElement = toBe.element; + retElement = widget._.downcastFn && widget._.downcastFn.call( widget, widgetElement ); + + // Replace nested editables' content with their output data. + for ( e in toBe.editables ) { + editableElement = toBe.editables[ e ]; + + delete editableElement.attributes.contenteditable; + editableElement.setHtml( widget.editables[ e ].getData() ); + } + + // Returned element always defaults to widgetElement. + if ( !retElement ) + retElement = widgetElement; + + toBe.wrapper.replaceWith( retElement ); + } + }, null, null, 13 ); + + + editor.on( 'contentDomUnload', function() { + widgetsRepo.destroyAll( true ); + } ); + } + + function setupWidgetsLifecycleStart( widgetsRepo ) { + var editor = widgetsRepo.editor, + processedWidgetOnly, + snapshotLoaded; + + // Listen after ACF (so data are filtered), + // but before dataProcessor.dataFilter was applied (so we can secure widgets' internals). + editor.on( 'toHtml', function( evt ) { + var upcastIterator = createUpcastIterator( widgetsRepo ), + toBeWrapped; + + evt.data.dataValue.forEach( upcastIterator.iterator, CKEDITOR.NODE_ELEMENT, true ); + + // Clean up and wrap all queued elements. + while ( ( toBeWrapped = upcastIterator.toBeWrapped.pop() ) ) { + cleanUpWidgetElement( toBeWrapped[ 0 ] ); + widgetsRepo.wrapElement( toBeWrapped[ 0 ], toBeWrapped[ 1 ] ); + } + + // Used to determine whether only widget was pasted. + if ( evt.data.protectedWhitespaces ) { + // Whitespaces are protected by wrapping content with spans. Take the middle node only. + processedWidgetOnly = evt.data.dataValue.children.length == 3 && + Widget.isParserWidgetWrapper( evt.data.dataValue.children[ 1 ] ); + } else { + processedWidgetOnly = evt.data.dataValue.children.length == 1 && + Widget.isParserWidgetWrapper( evt.data.dataValue.children[ 0 ] ); + } + }, null, null, 8 ); + + editor.on( 'dataReady', function() { + // Clean up all widgets loaded from snapshot. + if ( snapshotLoaded ) + cleanUpAllWidgetElements( widgetsRepo, editor.editable() ); + snapshotLoaded = 0; + + // Some widgets were destroyed on contentDomUnload, + // some on loadSnapshot, but that does not include + // e.g. setHtml on inline editor or widgets removed just + // before setting data. + widgetsRepo.destroyAll( true ); + widgetsRepo.initOnAll(); + } ); + + // Set flag so dataReady will know that additional + // cleanup is needed, because snapshot containing widgets was loaded. + editor.on( 'loadSnapshot', function( evt ) { + // Primitive but sufficient check which will prevent from executing + // heavier cleanUpAllWidgetElements if not needed. + if ( ( /data-cke-widget/ ).test( evt.data ) ) + snapshotLoaded = 1; + + widgetsRepo.destroyAll( true ); + }, null, null, 9 ); + + // Handle pasted single widget. + editor.on( 'paste', function( evt ) { + var data = evt.data; + + data.dataValue = data.dataValue.replace( pasteReplaceRegex, pasteReplaceFn ); + + // If drag'n'drop kind of paste into nested editable (data.range), selection is set AFTER + // data is pasted, which means editor has no chance to change activeFilter's context. + // As a result, pasted data is filtered with default editor's filter instead of NE's and + // funny things get inserted. Changing the filter by analysis of the paste range below (#13186). + if ( data.range ) { + // Check if pasting into nested editable. + var nestedEditable = Widget.getNestedEditable( editor.editable(), data.range.startContainer ); + + if ( nestedEditable ) { + // Retrieve the filter from NE's data and set it active before editor.insertHtml is done + // in clipboard plugin. + var filter = CKEDITOR.filter.instances[ nestedEditable.data( 'cke-filter' ) ]; + + if ( filter ) { + editor.setActiveFilter( filter ); + } + } + } + } ); + + // Listen with high priority to check widgets after data was inserted. + editor.on( 'afterInsertHtml', function( evt ) { + if ( evt.data.intoRange ) { + widgetsRepo.checkWidgets( { initOnlyNew: true } ); + } else { + editor.fire( 'lockSnapshot' ); + // Init only new for performance reason. + // Focus inited if only widget was processed. + widgetsRepo.checkWidgets( { initOnlyNew: true, focusInited: processedWidgetOnly } ); + + editor.fire( 'unlockSnapshot' ); + } + } ); + } + + // Helper for coordinating which widgets should be + // selected/deselected and which one should be focused/blurred. + function stateUpdater( widgetsRepo ) { + var currentlySelected = widgetsRepo.selected, + toBeSelected = [], + toBeDeselected = currentlySelected.slice( 0 ), + focused = null; + + return { + select: function( widget ) { + if ( CKEDITOR.tools.indexOf( currentlySelected, widget ) < 0 ) + toBeSelected.push( widget ); + + var index = CKEDITOR.tools.indexOf( toBeDeselected, widget ); + if ( index >= 0 ) + toBeDeselected.splice( index, 1 ); + + return this; + }, + + focus: function( widget ) { + focused = widget; + return this; + }, + + commit: function() { + var focusedChanged = widgetsRepo.focused !== focused, + widget, isDirty; + + widgetsRepo.editor.fire( 'lockSnapshot' ); + + if ( focusedChanged && ( widget = widgetsRepo.focused ) ) + blurWidget( widgetsRepo, widget ); + + while ( ( widget = toBeDeselected.pop() ) ) { + currentlySelected.splice( CKEDITOR.tools.indexOf( currentlySelected, widget ), 1 ); + // Widget could be destroyed in the meantime - e.g. data could be set. + if ( widget.isInited() ) { + isDirty = widget.editor.checkDirty(); + + widget.setSelected( false ); + + !isDirty && widget.editor.resetDirty(); + } + } + + if ( focusedChanged && focused ) { + isDirty = widgetsRepo.editor.checkDirty(); + + widgetsRepo.focused = focused; + widgetsRepo.fire( 'widgetFocused', { widget: focused } ); + focused.setFocused( true ); + + !isDirty && widgetsRepo.editor.resetDirty(); + } + + while ( ( widget = toBeSelected.pop() ) ) { + currentlySelected.push( widget ); + widget.setSelected( true ); + } + + widgetsRepo.editor.fire( 'unlockSnapshot' ); + } + }; + } + + + // + // WIDGET helpers --------------------------------------------------------- + // + + // LEFT, RIGHT, UP, DOWN, DEL, BACKSPACE - unblock default fake sel handlers. + var keystrokesNotBlockedByWidget = { 37: 1, 38: 1, 39: 1, 40: 1, 8: 1, 46: 1 }; + + // Applies or removes style's classes from widget. + // @param {CKEDITOR.style} style Custom widget style. + // @param {Boolean} apply Whether to apply or remove style. + function applyRemoveStyle( widget, style, apply ) { + var changed = 0, + classes = getStyleClasses( style ), + updatedClasses = widget.data.classes || {}, + cl; + + // Ee... Something is wrong with this style. + if ( !classes ) + return; + + // Clone, because we need to break reference. + updatedClasses = CKEDITOR.tools.clone( updatedClasses ); + + while ( ( cl = classes.pop() ) ) { + if ( apply ) { + if ( !updatedClasses[ cl ] ) + changed = updatedClasses[ cl ] = 1; + } else { + if ( updatedClasses[ cl ] ) { + delete updatedClasses[ cl ]; + changed = 1; + } + } + } + if ( changed ) + widget.setData( 'classes', updatedClasses ); + } + + function cancel( evt ) { + evt.cancel(); + } + + function copySingleWidget( widget, isCut ) { + var editor = widget.editor, + doc = editor.document; + + // We're still handling previous copy/cut. + // When keystroke is used to copy/cut this will also prevent + // conflict with copySingleWidget called again for native copy/cut event. + if ( doc.getById( 'cke_copybin' ) ) + return; + + // [IE] Use span for copybin and its container to avoid bug with expanding editable height by + // absolutely positioned element. + var copybinName = ( editor.blockless || CKEDITOR.env.ie ) ? 'span' : 'div', + copybin = doc.createElement( copybinName ), + copybinContainer = doc.createElement( copybinName ), + // IE8 always jumps to the end of document. + needsScrollHack = CKEDITOR.env.ie && CKEDITOR.env.version < 9; + + copybinContainer.setAttributes( { + id: 'cke_copybin', + 'data-cke-temp': '1' + } ); + + // Position copybin element outside current viewport. + copybin.setStyles( { + position: 'absolute', + width: '1px', + height: '1px', + overflow: 'hidden' + } ); + + copybin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-5000px' ); + + var range = editor.createRange(); + range.setStartBefore( widget.wrapper ); + range.setEndAfter( widget.wrapper ); + + copybin.setHtml( + '\u200b' + + editor.editable().getHtmlFromRange( range ).getHtml() + + '\u200b' ); + + // Save snapshot with the current state. + editor.fire( 'saveSnapshot' ); + + // Ignore copybin. + editor.fire( 'lockSnapshot' ); + + copybinContainer.append( copybin ); + editor.editable().append( copybinContainer ); + + var listener1 = editor.on( 'selectionChange', cancel, null, null, 0 ), + listener2 = widget.repository.on( 'checkSelection', cancel, null, null, 0 ); + + if ( needsScrollHack ) { + var docElement = doc.getDocumentElement().$, + scrollTop = docElement.scrollTop; + } + + // Once the clone of the widget is inside of copybin, select + // the entire contents. This selection will be copied by the + // native browser's clipboard system. + range = editor.createRange(); + range.selectNodeContents( copybin ); + range.select(); + + if ( needsScrollHack ) + docElement.scrollTop = scrollTop; + + setTimeout( function() { + // [IE] Focus widget before removing copybin to avoid scroll jump. + if ( !isCut ) + widget.focus(); + + copybinContainer.remove(); + + listener1.removeListener(); + listener2.removeListener(); + + editor.fire( 'unlockSnapshot' ); + + if ( isCut ) { + widget.repository.del( widget ); + editor.fire( 'saveSnapshot' ); + } + }, 100 ); // Use 100ms, so Chrome (@Mac) will be able to grab the content. + } + + // Extracts classes array from style instance. + function getStyleClasses( style ) { + var attrs = style.getDefinition().attributes, + classes = attrs && attrs[ 'class' ]; + + return classes ? classes.split( /\s+/ ) : null; + } + + // [IE] Force keeping focus because IE sometimes forgets to fire focus on main editable + // when blurring nested editable. + // @context widget + function onEditableBlur() { + var active = CKEDITOR.document.getActive(), + editor = this.editor, + editable = editor.editable(); + + // If focus stays within editor override blur and set currentActive because it should be + // automatically changed to editable on editable#focus but it is not fired. + if ( ( editable.isInline() ? editable : editor.document.getWindow().getFrame() ).equals( active ) ) + editor.focusManager.focus( editable ); + } + + // Force selectionChange when editable was focused. + // Similar to hack in selection.js#~620. + // @context widget + function onEditableFocus() { + // Gecko does not support 'DOMFocusIn' event on which we unlock selection + // in selection.js to prevent selection locking when entering nested editables. + if ( CKEDITOR.env.gecko ) + this.editor.unlockSelection(); + + // We don't need to force selectionCheck on Webkit, because on Webkit + // we do that on DOMFocusIn in selection.js. + if ( !CKEDITOR.env.webkit ) { + this.editor.forceNextSelectionCheck(); + this.editor.selectionChange( 1 ); + } + } + + // Setup listener on widget#data which will update (remove/add) classes + // by comparing newly set classes with the old ones. + function setupDataClassesListener( widget ) { + // Note: previousClasses and newClasses may be null! + // Tip: for ( cl in null ) is correct. + var previousClasses = null; + + widget.on( 'data', function() { + var newClasses = this.data.classes, + cl; + + // When setting new classes one need to remember + // that he must break reference. + if ( previousClasses == newClasses ) + return; + + for ( cl in previousClasses ) { + // Avoid removing and adding classes again. + if ( !( newClasses && newClasses[ cl ] ) ) + this.removeClass( cl ); + } + for ( cl in newClasses ) + this.addClass( cl ); + + previousClasses = newClasses; + } ); + } + + // Add a listener to data event that will set/change widget's label (#14539). + function setupA11yListener( widget ) { + // Note, the function gets executed in a context of widget instance. + function getLabelDefault() { + return this.editor.lang.widget.label.replace( /%1/, this.pathName || this.element.getName() ); + } + + // Setting a listener on data is enough, there's no need to perform it on widget initialization, as + // setupWidgetData fires this event anyway. + widget.on( 'data', function() { + // In some cases widget might get destroyed in an earlier data listener. For instance, image2 plugin, does + // so when changing its internal state. + if ( !widget.wrapper ) { + return; + } + + var label = this.getLabel ? this.getLabel() : getLabelDefault.call( this ); + + widget.wrapper.setAttribute( 'role', 'region' ); + widget.wrapper.setAttribute( 'aria-label', label ); + }, null, null, 9999 ); + } + + function setupDragHandler( widget ) { + if ( !widget.draggable ) + return; + + var editor = widget.editor, + // Use getLast to find wrapper's direct descendant (#12022). + container = widget.wrapper.getLast( Widget.isDomDragHandlerContainer ), + img; + + // Reuse drag handler if already exists (#11281). + if ( container ) + img = container.findOne( 'img' ); + else { + container = new CKEDITOR.dom.element( 'span', editor.document ); + container.setAttributes( { + 'class': 'cke_reset cke_widget_drag_handler_container', + // Split background and background-image for IE8 which will break on rgba(). + style: 'background:rgba(220,220,220,0.5);background-image:url(' + editor.plugins.widget.path + 'images/handle.png)' + } ); + + img = new CKEDITOR.dom.element( 'img', editor.document ); + img.setAttributes( { + 'class': 'cke_reset cke_widget_drag_handler', + 'data-cke-widget-drag-handler': '1', + src: CKEDITOR.tools.transparentImageData, + width: DRAG_HANDLER_SIZE, + title: editor.lang.widget.move, + height: DRAG_HANDLER_SIZE, + role: 'presentation' + } ); + widget.inline && img.setAttribute( 'draggable', 'true' ); + + container.append( img ); + widget.wrapper.append( container ); + } + + // Preventing page reload when dropped content on widget wrapper (#13015). + // Widget is not editable so by default drop on it isn't allowed what means that + // browser handles it (there's no editable#drop event). If there's no drop event we cannot block + // the drop, so page is reloaded. This listener enables drop on widget wrappers. + widget.wrapper.on( 'dragover', function( evt ) { + evt.data.preventDefault(); + } ); + + widget.wrapper.on( 'mouseenter', widget.updateDragHandlerPosition, widget ); + setTimeout( function() { + widget.on( 'data', widget.updateDragHandlerPosition, widget ); + }, 50 ); + + if ( !widget.inline ) { + img.on( 'mousedown', onBlockWidgetDrag, widget ); + + // On IE8 'dragstart' is propagated to editable, so editor#dragstart is fired twice on block widgets. + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) { + img.on( 'dragstart', function( evt ) { + evt.data.preventDefault( true ); + } ); + } + } + + widget.dragHandlerContainer = container; + } + + function onBlockWidgetDrag( evt ) { + var finder = this.repository.finder, + locator = this.repository.locator, + liner = this.repository.liner, + editor = this.editor, + editable = editor.editable(), + listeners = [], + sorted = [], + locations, + y; + + // Mark dragged widget for repository#finder. + this.repository._.draggedWidget = this; + + // Harvest all possible relations and display some closest. + var relations = finder.greedySearch(), + + buffer = CKEDITOR.tools.eventsBuffer( 50, function() { + locations = locator.locate( relations ); + + // There's only a single line displayed for D&D. + sorted = locator.sort( y, 1 ); + + if ( sorted.length ) { + liner.prepare( relations, locations ); + liner.placeLine( sorted[ 0 ] ); + liner.cleanup(); + } + } ); + + // Let's have the "dragging cursor" over entire editable. + editable.addClass( 'cke_widget_dragging' ); + + // Cache mouse position so it is re-used in events buffer. + listeners.push( editable.on( 'mousemove', function( evt ) { + y = evt.data.$.clientY; + buffer.input(); + } ) ); + + // Fire drag start as it happens during the native D&D. + editor.fire( 'dragstart', { target: evt.sender } ); + + function onMouseUp() { + var l; + + buffer.reset(); + + // Stop observing events. + while ( ( l = listeners.pop() ) ) + l.removeListener(); + + onBlockWidgetDrop.call( this, sorted, evt.sender ); + } + + // Mouseup means "drop". This is when the widget is being detached + // from DOM and placed at range determined by the line (location). + listeners.push( editor.document.once( 'mouseup', onMouseUp, this ) ); + + // Prevent calling 'onBlockWidgetDrop' twice in the inline editor. + // `removeListener` does not work if it is called at the same time event is fired. + if ( !editable.isInline() ) { + // Mouseup may occur when user hovers the line, which belongs to + // the outer document. This is, of course, a valid listener too. + listeners.push( CKEDITOR.document.once( 'mouseup', onMouseUp, this ) ); + } + } + + function onBlockWidgetDrop( sorted, dragTarget ) { + var finder = this.repository.finder, + liner = this.repository.liner, + editor = this.editor, + editable = this.editor.editable(); + + if ( !CKEDITOR.tools.isEmpty( liner.visible ) ) { + // Retrieve range for the closest location. + var dropRange = finder.getRange( sorted[ 0 ] ); + + // Focus widget (it could lost focus after mousedown+mouseup) + // and save this state as the one where we want to be taken back when undoing. + this.focus(); + + // Drag range will be set in the drop listener. + editor.fire( 'drop', { + dropRange: dropRange, + target: dropRange.startContainer + } ); + } + + // Clean-up custom cursor for editable. + editable.removeClass( 'cke_widget_dragging' ); + + // Clean-up all remaining lines. + liner.hideVisible(); + + // Clean-up drag & drop. + editor.fire( 'dragend', { target: dragTarget } ); + } + + function setupEditables( widget ) { + var editableName, + editableDef, + definedEditables = widget.editables; + + widget.editables = {}; + + if ( !widget.editables ) + return; + + for ( editableName in definedEditables ) { + editableDef = definedEditables[ editableName ]; + widget.initEditable( editableName, typeof editableDef == 'string' ? { selector: editableDef } : editableDef ); + } + } + + function setupMask( widget ) { + if ( !widget.mask ) + return; + + // Reuse mask if already exists (#11281). + var img = widget.wrapper.findOne( '.cke_widget_mask' ); + + if ( !img ) { + img = new CKEDITOR.dom.element( 'img', widget.editor.document ); + img.setAttributes( { + src: CKEDITOR.tools.transparentImageData, + 'class': 'cke_reset cke_widget_mask' + } ); + widget.wrapper.append( img ); + } + + widget.mask = img; + } + + // Replace parts object containing: + // partName => selector pairs + // with: + // partName => element pairs + function setupParts( widget ) { + if ( widget.parts ) { + var parts = {}, + el, partName; + + for ( partName in widget.parts ) { + el = widget.wrapper.findOne( widget.parts[ partName ] ); + parts[ partName ] = el; + } + widget.parts = parts; + } + } + + function setupWidget( widget, widgetDef ) { + setupWrapper( widget ); + setupParts( widget ); + setupEditables( widget ); + setupMask( widget ); + setupDragHandler( widget ); + setupDataClassesListener( widget ); + setupA11yListener( widget ); + + // #11145: [IE8] Non-editable content of widget is draggable. + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) { + widget.wrapper.on( 'dragstart', function( evt ) { + var target = evt.data.getTarget(); + + // Allow text dragging inside nested editables or dragging inline widget's drag handler. + if ( !Widget.getNestedEditable( widget, target ) && !( widget.inline && Widget.isDomDragHandler( target ) ) ) + evt.data.preventDefault(); + } ); + } + + widget.wrapper.removeClass( 'cke_widget_new' ); + widget.element.addClass( 'cke_widget_element' ); + + widget.on( 'key', function( evt ) { + var keyCode = evt.data.keyCode; + + // ENTER. + if ( keyCode == 13 ) { + widget.edit(); + // CTRL+C or CTRL+X. + } else if ( keyCode == CKEDITOR.CTRL + 67 || keyCode == CKEDITOR.CTRL + 88 ) { + copySingleWidget( widget, keyCode == CKEDITOR.CTRL + 88 ); + return; // Do not preventDefault. + } else if ( keyCode in keystrokesNotBlockedByWidget || ( CKEDITOR.CTRL & keyCode ) || ( CKEDITOR.ALT & keyCode ) ) { + // Pass chosen keystrokes to other plugins or default fake sel handlers. + // Pass all CTRL/ALT keystrokes. + return; + } + + return false; + }, null, null, 999 ); + // Listen with high priority so it's possible + // to overwrite this callback. + + widget.on( 'doubleclick', function( evt ) { + if ( widget.edit() ) { + // We have to cancel event if edit method opens a dialog, otherwise + // link plugin may open extra dialog (#12140). + evt.cancel(); + } + } ); + + if ( widgetDef.data ) + widget.on( 'data', widgetDef.data ); + + if ( widgetDef.edit ) + widget.on( 'edit', widgetDef.edit ); + } + + function setupWidgetData( widget, startupData ) { + var widgetDataAttr = widget.element.data( 'cke-widget-data' ); + + if ( widgetDataAttr ) + widget.setData( JSON.parse( decodeURIComponent( widgetDataAttr ) ) ); + if ( startupData ) + widget.setData( startupData ); + + // Populate classes if they are not preset. + if ( !widget.data.classes ) + widget.setData( 'classes', widget.getClasses() ); + + // Unblock data and... + widget.dataReady = true; + + // Write data to element because this was blocked when data wasn't ready. + writeDataToElement( widget ); + + // Fire data event first time, because this was blocked when data wasn't ready. + widget.fire( 'data', widget.data ); + } + + function setupWrapper( widget ) { + // Retrieve widget wrapper. Assign an id to it. + var wrapper = widget.wrapper = widget.element.getParent(); + wrapper.setAttribute( 'data-cke-widget-id', widget.id ); + } + + function writeDataToElement( widget ) { + widget.element.data( 'cke-widget-data', encodeURIComponent( JSON.stringify( widget.data ) ) ); + } + + // + // WIDGET STYLE HANDLER --------------------------------------------------- + // + + ( function() { + // Styles categorized by group. It is used to prevent applying styles for the same group being used together. + var styleGroups = {}; + + /** + * The class representing a widget style. It is an {@link CKEDITOR#STYLE_OBJECT object} like + * the styles handler for widgets. + * + * **Note:** This custom style handler does not support all methods of the {@link CKEDITOR.style} class. + * Not supported methods: {@link #applyToRange}, {@link #removeFromRange}, {@link #applyToObject}. + * + * @since 4.4 + * @class CKEDITOR.style.customHandlers.widget + * @extends CKEDITOR.style + */ + CKEDITOR.style.addCustomHandler( { + type: 'widget', + + setup: function( styleDefinition ) { + /** + * The name of widget to which this style can be applied. + * It is extracted from style definition's `widget` property. + * + * @property {String} widget + */ + this.widget = styleDefinition.widget; + + /** + * An array of groups that this style belongs to. + * Styles assigned to the same group cannot be combined. + * + * @since 4.6.2 + * @property {Array} group + */ + this.group = typeof styleDefinition.group == 'string' ? [ styleDefinition.group ] : styleDefinition.group; + + // Store style categorized by its group. + // It is used to prevent enabling two styles from same group. + if ( this.group ) { + saveStyleGroup( this ); + } + }, + + apply: function( editor ) { + var widget; + + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return; + + // Theoretically we could bypass checkApplicable, get widget from + // widgets.focused and check its name, what would be faster, but then + // this custom style would work differently than the default style + // which checks if it's applicable before applying or removing itself. + if ( this.checkApplicable( editor.elementPath(), editor ) ) { + widget = editor.widgets.focused; + + // Remove other styles from the same group. + if ( this.group ) { + this.removeStylesFromSameGroup( editor ); + } + + widget.applyStyle( this ); + } + }, + + remove: function( editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return; + + if ( this.checkApplicable( editor.elementPath(), editor ) ) + editor.widgets.focused.removeStyle( this ); + }, + + /** + * Removes all styles that belong to the same group as this style. This method will neither add nor remove + * the current style. + * Returns `true` if any style was removed, otherwise returns `false`. + * + * @since 4.6.2 + * @param {CKEDITOR.editor} editor + * @returns {Boolean} + */ + removeStylesFromSameGroup: function( editor ) { + var stylesFromSameGroup, + path, + removed = false; + + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return false; + + path = editor.elementPath(); + if ( this.checkApplicable( path, editor ) ) { + // Iterate over each group. + for ( var i = 0, l = this.group.length; i < l; i++ ) { + stylesFromSameGroup = styleGroups[ this.widget ][ this.group[ i ] ]; + // Iterate over each style from group. + for ( var j = 0; j < stylesFromSameGroup.length; j++ ) { + if ( stylesFromSameGroup[ j ] !== this && stylesFromSameGroup[ j ].checkActive( path, editor ) ) { + editor.widgets.focused.removeStyle( stylesFromSameGroup[ j ] ); + removed = true; + } + } + } + } + + return removed; + }, + + checkActive: function( elementPath, editor ) { + return this.checkElementMatch( elementPath.lastElement, 0, editor ); + }, + + checkApplicable: function( elementPath, editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return false; + + return this.checkElement( elementPath.lastElement ); + }, + + checkElementMatch: checkElementMatch, + + checkElementRemovable: checkElementMatch, + + /** + * Checks if an element is a {@link CKEDITOR.plugins.widget#wrapper wrapper} of a + * widget whose name matches the {@link #widget widget name} specified in the style definition. + * + * @param {CKEDITOR.dom.element} element + * @returns {Boolean} + */ + checkElement: function( element ) { + if ( !Widget.isDomWidgetWrapper( element ) ) + return false; + + var widgetElement = element.getFirst( Widget.isDomWidgetElement ); + return widgetElement && widgetElement.data( 'widget' ) == this.widget; + }, + + buildPreview: function( label ) { + return label || this._.definition.name; + }, + + /** + * Returns allowed content rules which should be registered for this style. + * Uses widget's {@link CKEDITOR.plugins.widget.definition#styleableElements} to make a rule + * allowing classes on specified elements or use widget's + * {@link CKEDITOR.plugins.widget.definition#styleToAllowedContentRules} method to transform a style + * into allowed content rules. + * + * @param {CKEDITOR.editor} The editor instance. + * @returns {CKEDITOR.filter.allowedContentRules} + */ + toAllowedContentRules: function( editor ) { + if ( !editor ) + return null; + + var widgetDef = editor.widgets.registered[ this.widget ], + classes, + rule = {}; + + if ( !widgetDef ) + return null; + + if ( widgetDef.styleableElements ) { + classes = this.getClassesArray(); + if ( !classes ) + return null; + + rule[ widgetDef.styleableElements ] = { + classes: classes, + propertiesOnly: true + }; + return rule; + } + if ( widgetDef.styleToAllowedContentRules ) + return widgetDef.styleToAllowedContentRules( this ); + return null; + }, + + /** + * Returns classes defined in the style in form of an array. + * + * @returns {String[]} + */ + getClassesArray: function() { + var classes = this._.definition.attributes && this._.definition.attributes[ 'class' ]; + + return classes ? CKEDITOR.tools.trim( classes ).split( /\s+/ ) : null; + }, + + /** + * Not implemented. + * + * @method applyToRange + */ + applyToRange: notImplemented, + + /** + * Not implemented. + * + * @method removeFromRange + */ + removeFromRange: notImplemented, + + /** + * Not implemented. + * + * @method applyToObject + */ + applyToObject: notImplemented + } ); + + function notImplemented() {} + + // @context style + function checkElementMatch( element, fullMatch, editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !editor ) + return false; + + if ( !this.checkElement( element ) ) + return false; + + var widget = editor.widgets.getByElement( element, true ); + return widget && widget.checkStyleActive( this ); + } + + // Save and categorize style by its group. + function saveStyleGroup( style ) { + var widgetName = style.widget, + group; + + if ( !styleGroups[ widgetName ] ) { + styleGroups[ widgetName ] = {}; + } + + for ( var i = 0, l = style.group.length; i < l; i++ ) { + group = style.group[ i ]; + if ( !styleGroups[ widgetName ][ group ] ) { + styleGroups[ widgetName ][ group ] = []; + } + + styleGroups[ widgetName ][ group ].push( style ); + } + } + + } )(); + + // + // EXPOSE PUBLIC API ------------------------------------------------------ + // + + CKEDITOR.plugins.widget = Widget; + Widget.repository = Repository; + Widget.nestedEditable = NestedEditable; +} )(); + +/** + * An event fired when a widget definition is registered by the {@link CKEDITOR.plugins.widget.repository#add} method. + * It is possible to modify the definition being registered. + * + * @event widgetDefinition + * @member CKEDITOR.editor + * @param {CKEDITOR.plugins.widget.definition} data Widget definition. + */ + +/** + * This is an abstract class that describes the definition of a widget. + * It is a type of {@link CKEDITOR.plugins.widget.repository#add} method's second argument. + * + * Widget instances inherit from registered widget definitions, although not in a prototypal way. + * They are simply extended with corresponding widget definitions. Note that not all properties of + * the widget definition become properties of a widget. Some, like {@link #data} or {@link #edit}, become + * widget's events listeners. + * + * @class CKEDITOR.plugins.widget.definition + * @abstract + * @mixins CKEDITOR.feature + */ + +/** + * Widget definition name. It is automatically set when the definition is + * {@link CKEDITOR.plugins.widget.repository#add registered}. + * + * @property {String} name + */ + +/** + * The method executed while initializing a widget, after a widget instance + * is created, but before it is ready. It is executed before the first + * {@link CKEDITOR.plugins.widget#event-data} is fired so it is common to + * use the `init` method to populate widget data with information loaded from + * the DOM, like for exmaple: + * + * init: function() { + * this.setData( 'width', this.element.getStyle( 'width' ) ); + * + * if ( this.parts.caption.getStyle( 'display' ) != 'none' ) + * this.setData( 'showCaption', true ); + * } + * + * @property {Function} init + */ + +/** + * The function to be used to upcast an element to this widget or a + * comma-separated list of upcast methods from the {@link #upcasts} object. + * + * The upcast function **is not** executed in the widget context (because the widget + * does not exist yet) and two arguments are passed: + * + * * `element` ({@link CKEDITOR.htmlParser.element}) – The element to be checked. + * * `data` (`Object`) – The object which can be extended with data which will then be passed to the widget. + * + * An element will be upcasted if a function returned `true` or an instance of + * a {@link CKEDITOR.htmlParser.element} if upcasting meant DOM structure changes + * (in this case the widget will be initialized on the returned element). + * + * @property {String/Function} upcast + */ + +/** + * The object containing functions which can be used to upcast this widget. + * Only those pointed by the {@link #upcast} property will be used. + * + * In most cases it is appropriate to use {@link #upcast} directly, + * because majority of widgets need just one method. + * However, in some cases the widget author may want to expose more than one variant + * and then this property may be used. + * + * upcasts: { + * // This function may upcast only figure elements. + * figure: function() { + * // ... + * }, + * // This function may upcast only image elements. + * image: function() { + * // ... + * }, + * // More variants... + * } + * + * // Then, widget user may choose which upcast methods will be enabled. + * editor.on( 'widgetDefinition', function( evt ) { + * if ( evt.data.name == 'image' ) + * evt.data.upcast = 'figure,image'; // Use both methods. + * } ); + * + * @property {Object} upcasts + */ + +/** + * The {@link #upcast} method(s) priority. The upcast with a lower priority number will be called before + * the one with a higher number. The default priority is `10`. + * + * @since 4.5 + * @property {Number} [upcastPriority=10] + */ + +/** + * The function to be used to downcast this widget or + * a name of the downcast option from the {@link #downcasts} object. + * + * The downcast funciton will be executed in the {@link CKEDITOR.plugins.widget} context + * and with `widgetElement` ({@link CKEDITOR.htmlParser.element}) argument which is + * the widget's main element. + * + * The function may return an instance of the {@link CKEDITOR.htmlParser.node} class if the widget + * needs to be downcasted to a different node than the widget's main element. + * + * @property {String/Function} downcast + */ + +/** + * The object containing functions which can be used to downcast this widget. + * Only the one pointed by the {@link #downcast} property will be used. + * + * In most cases it is appropriate to use {@link #downcast} directly, + * because majority of widgets have just one variant of downcasting (or none at all). + * However, in some cases the widget author may want to expose more than one variant + * and then this property may be used. + * + * downcasts: { + * // This downcast may transform the widget into the figure element. + * figure: function() { + * // ... + * }, + * // This downcast may transform the widget into the image element with data-* attributes. + * image: function() { + * // ... + * } + * } + * + * // Then, the widget user may choose one of the downcast options when setting up his editor. + * editor.on( 'widgetDefinition', function( evt ) { + * if ( evt.data.name == 'image' ) + * evt.data.downcast = 'figure'; + * } ); + * + * @property downcasts + */ + +/** + * If set, it will be added as the {@link CKEDITOR.plugins.widget#event-edit} event listener. + * This means that it will be executed when a widget is being edited. + * See the {@link CKEDITOR.plugins.widget#method-edit} method. + * + * @property {Function} edit + */ + +/** + * If set, it will be added as the {@link CKEDITOR.plugins.widget#event-data} event listener. + * This means that it will be executed every time the {@link CKEDITOR.plugins.widget#property-data widget data} changes. + * + * @property {Function} data + */ + +/** + * The method to be executed when the widget's command is executed in order to insert a new widget + * (widget of this type is not focused). If not defined, then the default action will be + * performed which means that: + * + * * An instance of the widget will be created in a detached {@link CKEDITOR.dom.documentFragment document fragment}, + * * The {@link CKEDITOR.plugins.widget#method-edit} method will be called to trigger widget editing, + * * The widget element will be inserted into DOM. + * + * @property {Function} insert + */ + +/** + * The name of a dialog window which will be opened on {@link CKEDITOR.plugins.widget#method-edit}. + * If not defined, then the {@link CKEDITOR.plugins.widget#method-edit} method will not perform any action and + * widget's command will insert a new widget without opening a dialog window first. + * + * @property {String} dialog + */ + +/** + * The template which will be used to create a new widget element (when the widget's command is executed). + * This string is populated with {@link #defaults default values} by using the {@link CKEDITOR.template} format. + * Therefore it has to be a valid {@link CKEDITOR.template} argument. + * + * @property {String} template + */ + +/** + * The data object which will be used to populate the data of a newly created widget. + * See {@link CKEDITOR.plugins.widget#property-data}. + * + * defaults: { + * showCaption: true, + * align: 'none' + * } + * + * @property defaults + */ + +/** + * An object containing definitions of widget components (part name => CSS selector). + * + * parts: { + * image: 'img', + * caption: 'div.caption' + * } + * + * @property parts + */ + +/** + * An object containing definitions of nested editables (editable name => {@link CKEDITOR.plugins.widget.nestedEditable.definition}). + * Note that editables *have to* be defined in the same order as they are in DOM / {@link CKEDITOR.plugins.widget.definition#template template}. + * Otherwise errors will occur when nesting widgets inside each other. + * + * editables: { + * header: 'h1', + * content: { + * selector: 'div.content', + * allowedContent: 'p strong em; a[!href]' + * } + * } + * + * @property editables + */ + +/** + * The function used to obtain an accessibility label for the widget. It might be used to make + * the widget labels as precise as possible, since it has access to the widget instance. + * + * If not specified, the default implementation will use the {@link #pathName} or the main + * {@link CKEDITOR.plugins.widget#element element} tag name. + * + * @property {Function} getLabel + */ + +/** + * The widget name displayed in the elements path. + * + * @property {String} pathName + */ + +/** + * If set to `true`, the widget's element will be covered with a transparent mask. + * This will prevent its content from being clickable, which matters in case + * of special elements like embedded Flash or iframes that generate a separate "context". + * + * @property {Boolean} mask + */ + +/** + * If set to `true/false`, it will force the widget to be either an inline or a block widget. + * If not set, the widget type will be determined from the widget element. + * + * Widget type influences whether a block (`div`) or an inline (`span`) element is used + * for the wrapper. + * + * @property {Boolean} inline + */ + +/** + * The label for the widget toolbar button. + * + * editor.widgets.add( 'simplebox', { + * button: 'Create a simple box' + * } ); + * + * editor.widgets.add( 'simplebox', { + * button: editor.lang.simplebox.title + * } ); + * + * @property {String} button + */ + +/** + * Whether widget should be draggable. Defaults to `true`. + * If set to `false` drag handler will not be displayed when hovering widget. + * + * @property {Boolean} draggable + */ + +/** + * Names of element(s) (separated by spaces) for which the {@link CKEDITOR.filter} should allow classes + * defined in the widget styles. For example if your widget is upcasted from a simple `
    ` + * element, then in order to make it styleable you can set: + * + * editor.widgets.add( 'customWidget', { + * upcast: function( element ) { + * return element.name == 'div'; + * }, + * + * // ... + * + * styleableElements: 'div' + * } ); + * + * Then, when the following style is defined: + * + * { + * name: 'Thick border', type: 'widget', widget: 'customWidget', + * attributes: { 'class': 'thickBorder' } + * } + * + * a rule allowing the `thickBorder` class for `div` elements will be registered in the {@link CKEDITOR.filter}. + * + * If you need to have more freedom when transforming widget style to allowed content rules, + * you can use the {@link #styleToAllowedContentRules} callback. + * + * @since 4.4 + * @property {String} styleableElements + */ + +/** + * Function transforming custom widget's {@link CKEDITOR.style} instance into + * {@link CKEDITOR.filter.allowedContentRules}. It may be used when a static + * {@link #styleableElements} property is not enough to inform the {@link CKEDITOR.filter} + * what HTML features should be enabled when allowing the given style. + * + * In most cases, when style's classes just have to be added to element name(s) used by + * the widget element, it is recommended to use simpler {@link #styleableElements} property. + * + * In order to get parsed classes from the style definition you can use + * {@link CKEDITOR.style.customHandlers.widget#getClassesArray}. + * + * For example, if you want to use the [object format of allowed content rules](#!/guide/dev_allowed_content_rules-section-object-format), + * to specify `match` validator, your implementation could look like this: + * + * editor.widgets.add( 'customWidget', { + * // ... + * + * styleToAllowedContentRules: funciton( style ) { + * // Retrieve classes defined in the style. + * var classes = style.getClassesArray(); + * + * // Do something crazy - for example return allowed content rules in object format, + * // with custom match property and propertiesOnly flag. + * return { + * h1: { + * match: isWidgetElement, + * propertiesOnly: true, + * classes: classes + * } + * }; + * } + * } ); + * + * @since 4.4 + * @property {Function} styleToAllowedContentRules + * @param {CKEDITOR.style.customHandlers.widget} style The style to be transformed. + * @returns {CKEDITOR.filter.allowedContentRules} + */ + +/** + * This is an abstract class that describes the definition of a widget's nested editable. + * It is a type of values in the {@link CKEDITOR.plugins.widget.definition#editables} object. + * + * In the simplest case the definition is a string which is a CSS selector used to + * find an element that will become a nested editable inside the widget. Note that + * the widget element can be a nested editable, too. + * + * In the more advanced case a definition is an object with a required `selector` property. + * + * editables: { + * header: 'h1', + * content: { + * selector: 'div.content', + * allowedContent: 'p strong em; a[!href]' + * } + * } + * + * @class CKEDITOR.plugins.widget.nestedEditable.definition + * @abstract + */ + +/** + * The CSS selector used to find an element which will become a nested editable. + * + * @property {String} selector + */ + +/** + * The [Advanced Content Filter](#!/guide/dev_advanced_content_filter) rules + * which will be used to limit the content allowed in this nested editable. + * This option is similar to {@link CKEDITOR.config#allowedContent} and one can + * use it to limit the editor features available in the nested editable. + * + * @property {CKEDITOR.filter.allowedContentRules} allowedContent + */ + +/** + * Nested editable name displayed in elements path. + * + * @property {String} pathName + */ diff --git a/sources/plugins/widgetselection/plugin.js b/sources/plugins/widgetselection/plugin.js new file mode 100644 index 0000000..b7aa6a0 --- /dev/null +++ b/sources/plugins/widgetselection/plugin.js @@ -0,0 +1,366 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview A plugin created to handle ticket #11064. While the issue is caused by native WebKit/Blink behaviour, + * this plugin can be easily detached or modified when the issue is fixed in the browsers without changing the core. + * When Ctrl/Cmd + A is pressed to select all content it does not work due to a bug in + * Webkit/Blink if a non-editable element is at the beginning or the end of the content. + */ + +( function() { + 'use strict'; + + CKEDITOR.plugins.add( 'widgetselection', { + + init: function( editor ) { + if ( CKEDITOR.env.webkit ) { + var widgetselection = CKEDITOR.plugins.widgetselection; + + editor.on( 'contentDom', function( evt ) { + + var editor = evt.editor, + doc = editor.document, + editable = editor.editable(); + + editable.attachListener( doc, 'keydown', function( evt ) { + var data = evt.data.$; + + // Ctrl/Cmd + A + if ( evt.data.getKey() == 65 && ( CKEDITOR.env.mac && data.metaKey || !CKEDITOR.env.mac && data.ctrlKey ) ) { + + // Defer the call so the selection is already changed by the pressed keys. + CKEDITOR.tools.setTimeout( function() { + + // Manage filler elements on keydown. If there is no need + // to add fillers, we need to check and clean previously used once. + if ( !widgetselection.addFillers( editable ) ) { + widgetselection.removeFillers( editable ); + } + }, 0 ); + } + }, null, null, -1 ); + + // Check and clean previously used fillers. + editor.on( 'selectionCheck', function( evt ) { + widgetselection.removeFillers( evt.editor.editable() ); + } ); + + // Remove fillers on paste before data gets inserted into editor. + editor.on( 'paste', function( evt ) { + evt.data.dataValue = widgetselection.cleanPasteData( evt.data.dataValue ); + } ); + + if ( 'selectall' in editor.plugins ) { + widgetselection.addSelectAllIntegration( editor ); + } + } ); + } + } + } ); + + /** + * A set of helper methods for the Widget Selection plugin. + * + * @property widgetselection + * @member CKEDITOR.plugins + * @since 4.6.1 + */ + CKEDITOR.plugins.widgetselection = { + + /** + * The start filler element reference. + * + * @property {CKEDITOR.dom.element} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + startFiller: null, + + /** + * The end filler element reference. + * + * @property {CKEDITOR.dom.element} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + endFiller: null, + + /** + * An attribute which identifies the filler element. + * + * @property {String} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + fillerAttribute: 'data-cke-filler-webkit', + + /** + * The default content of the filler element. Note: The filler needs to have `visible` content. + * Unprintable elements or empty content do not help as a workaround. + * + * @property {String} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + fillerContent: ' ', + + /** + * Tag name which is used to create fillers. + * + * @property {String} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + fillerTagName: 'div', + + /** + * Adds a filler before or after a non-editable element at the beginning or the end of the `editable`. + * + * @param {CKEDITOR.editable} editable + * @returns {Boolean} + * @member CKEDITOR.plugins.widgetselection + */ + addFillers: function( editable ) { + var editor = editable.editor; + + // Whole content should be selected, if not fix the selection manually. + if ( !this.isWholeContentSelected( editable ) && editable.getChildCount() > 0 ) { + + var firstChild = editable.getFirst( filterTempElements ), + lastChild = editable.getLast( filterTempElements ); + + // Check if first element is editable. If not prepend with filler. + if ( firstChild && firstChild.type == CKEDITOR.NODE_ELEMENT && !firstChild.isEditable() ) { + this.startFiller = this.createFiller(); + editable.append( this.startFiller, 1 ); + } + + // Check if last element is editable. If not append filler. + if ( lastChild && lastChild.type == CKEDITOR.NODE_ELEMENT && !lastChild.isEditable() ) { + this.endFiller = this.createFiller( true ); + editable.append( this.endFiller, 0 ); + } + + // Reselect whole content after any filler was added. + if ( this.hasFiller( editable ) ) { + var rangeAll = editor.createRange(); + rangeAll.selectNodeContents( editable ); + rangeAll.select(); + return true; + } + } + return false; + }, + + /** + * Removes filler elements or updates their references. + * + * It will **not remove** filler elements if the whole content is selected, as it would break the + * selection. + * + * @param {CKEDITOR.editable} editable + * @member CKEDITOR.plugins.widgetselection + */ + removeFillers: function( editable ) { + // If startFiller or endFiller exists and not entire content is selected it means the selection + // just changed from selected all. We need to remove fillers and set proper selection/content. + if ( this.hasFiller( editable ) && !this.isWholeContentSelected( editable ) ) { + + var startFillerContent = editable.findOne( this.fillerTagName + '[' + this.fillerAttribute + '=start]' ), + endFillerContent = editable.findOne( this.fillerTagName + '[' + this.fillerAttribute + '=end]' ); + + if ( this.startFiller && startFillerContent && this.startFiller.equals( startFillerContent ) ) { + this.removeFiller( this.startFiller, editable ); + } else { + // The start filler is still present but it is a different element than previous one. It means the + // undo recreating entirely selected content was performed. We need to update filler reference. + this.startFiller = startFillerContent; + } + + if ( this.endFiller && endFillerContent && this.endFiller.equals( endFillerContent ) ) { + this.removeFiller( this.endFiller, editable ); + } else { + // Same as with start filler. + this.endFiller = endFillerContent; + } + } + }, + + /** + * Removes fillers from the paste data. + * + * @param {String} data + * @returns {String} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + cleanPasteData: function( data ) { + if ( data && data.length ) { + data = data + .replace( this.createFillerRegex(), '' ) + .replace( this.createFillerRegex( true ), '' ); + } + return data; + }, + + /** + * Checks if the entire content of the given editable is selected. + * + * @param {CKEDITOR.editable} editable + * @returns {Boolean} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + isWholeContentSelected: function( editable ) { + + var range = editable.editor.getSelection().getRanges()[ 0 ]; + if ( range ) { + + if ( range && range.collapsed ) { + return false; + + } else { + var rangeClone = range.clone(); + rangeClone.enlarge( CKEDITOR.ENLARGE_ELEMENT ); + + return !!( rangeClone && editable && rangeClone.startContainer && rangeClone.endContainer && + rangeClone.startOffset === 0 && rangeClone.endOffset === editable.getChildCount() && + rangeClone.startContainer.equals( editable ) && rangeClone.endContainer.equals( editable ) ); + } + } + return false; + }, + + /** + * Checks if there is any filler element in the given editable. + * + * @param {CKEDITOR.editable} editable + * @returns {Boolean} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + hasFiller: function( editable ) { + return editable.find( this.fillerTagName + '[' + this.fillerAttribute + ']' ).count() > 0; + }, + + /** + * Creates a filler element. + * + * @param {Boolean} [onEnd] If filler will be placed on end or beginning of the content. + * @returns {CKEDITOR.dom.element} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + createFiller: function( onEnd ) { + var filler = new CKEDITOR.dom.element( this.fillerTagName ); + filler.setHtml( this.fillerContent ); + filler.setAttribute( this.fillerAttribute, onEnd ? 'end' : 'start' ); + filler.setAttribute( 'data-cke-temp', 1 ); + filler.setStyles( { + display: 'block', + width: 0, + height: 0, + padding: 0, + border: 0, + margin: 0, + position: 'absolute', + top: 0, + left: '-9999px', + opacity: 0, + overflow: 'hidden' + } ); + + return filler; + }, + + /** + * Removes the specific filler element from the given editable. If the filler contains any content (typed or pasted), + * it replaces the current editable content. If not, the caret is placed before the first or after the last editable + * element (depends if the filler was at the beginning or the end). + * + * @param {CKEDITOR.dom.element} filler + * @param {CKEDITOR.editable} editable + * @member CKEDITOR.plugins.widgetselection + * @private + */ + removeFiller: function( filler, editable ) { + if ( filler ) { + var editor = editable.editor, + currentRange = editable.editor.getSelection().getRanges()[ 0 ], + currentPath = currentRange.startPath(), + range = editor.createRange(), + insertedHtml, + fillerOnStart, + manuallyHandleCaret; + + if ( currentPath.contains( filler ) ) { + insertedHtml = filler.getHtml(); + manuallyHandleCaret = true; + } + + fillerOnStart = filler.getAttribute( this.fillerAttribute ) == 'start'; + filler.remove(); + filler = null; + + if ( insertedHtml && insertedHtml.length > 0 && insertedHtml != this.fillerContent ) { + editable.insertHtmlIntoRange( insertedHtml, editor.getSelection().getRanges()[ 0 ] ); + range.setStartAt( editable.getChild( editable.getChildCount() - 1 ), CKEDITOR.POSITION_BEFORE_END ); + editor.getSelection().selectRanges( [ range ] ); + + } else if ( manuallyHandleCaret ) { + if ( fillerOnStart ) { + range.setStartAt( editable.getFirst().getNext(), CKEDITOR.POSITION_AFTER_START ); + } else { + range.setEndAt( editable.getLast().getPrevious(), CKEDITOR.POSITION_BEFORE_END ); + } + editable.editor.getSelection().selectRanges( [ range ] ); + } + } + }, + + /** + * Creates a regular expression which will match the filler HTML in the text. + * + * @param {Boolean} [onEnd] Whether a regular expression should be created for the filler at the beginning or + * the end of the content. + * @returns {RegExp} + * @member CKEDITOR.plugins.widgetselection + * @private + */ + createFillerRegex: function( onEnd ) { + var matcher = this.createFiller( onEnd ).getOuterHtml() + .replace( /style="[^"]*"/gi, 'style="[^"]*"' ) + .replace( />[^<]*[^<]*<' ); + + return new RegExp( ( !onEnd ? '^' : '' ) + matcher + ( onEnd ? '$' : '' ) ); + }, + + /** + * Adds an integration for the [Select All](http://ckeditor.com/addon/selectall) plugin to the given `editor`. + * + * @private + * @param {CKEDITOR.editor} editor + * @member CKEDITOR.plugins.widgetselection + */ + addSelectAllIntegration: function( editor ) { + var widgetselection = this; + + editor.editable().attachListener( editor, 'beforeCommandExec', function( evt ) { + var editable = editor.editable(); + + if ( evt.data.name == 'selectAll' && editable ) { + widgetselection.addFillers( editable ); + } + }, null, null, 9999 ); + } + }; + + + function filterTempElements( el ) { + return el.getName && !el.hasAttribute( 'data-cke-temp' ); + } + +} )(); diff --git a/sources/plugins/wysiwygarea/plugin.js b/sources/plugins/wysiwygarea/plugin.js new file mode 100644 index 0000000..962f31e --- /dev/null +++ b/sources/plugins/wysiwygarea/plugin.js @@ -0,0 +1,713 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The WYSIWYG Area plugin. It registers the "wysiwyg" editing + * mode, which handles the main editing area space. + */ + +( function() { + var framedWysiwyg; + + CKEDITOR.plugins.add( 'wysiwygarea', { + init: function( editor ) { + if ( editor.config.fullPage ) { + editor.addFeature( { + allowedContent: 'html head title; style [media,type]; body (*)[id]; meta link [*]', + requiredContent: 'body' + } ); + } + + editor.addMode( 'wysiwyg', function( callback ) { + var src = 'document.open();' + + // In IE, the document domain must be set any time we call document.open(). + ( CKEDITOR.env.ie ? '(' + CKEDITOR.tools.fixDomain + ')();' : '' ) + + 'document.close();'; + + // With IE, the custom domain has to be taken care at first, + // for other browers, the 'src' attribute should be left empty to + // trigger iframe's 'load' event. + // Microsoft Edge throws "Permission Denied" if treated like an IE (#13441). + if ( CKEDITOR.env.air ) { + src = 'javascript:void(0)'; // jshint ignore:line + } else if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) { + src = 'javascript:void(function(){' + encodeURIComponent( src ) + '}())'; // jshint ignore:line + } else { + src = ''; + } + + var iframe = CKEDITOR.dom.element.createFromHtml( '' ); + iframe.setStyles( { width: '100%', height: '100%' } ); + iframe.addClass( 'cke_wysiwyg_frame' ).addClass( 'cke_reset' ); + + var contentSpace = editor.ui.space( 'contents' ); + contentSpace.append( iframe ); + + + // Asynchronous iframe loading is only required in IE>8 and Gecko (other reasons probably). + // Do not use it on WebKit as it'll break the browser-back navigation. + var useOnloadEvent = ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) || CKEDITOR.env.gecko; + if ( useOnloadEvent ) + iframe.on( 'load', onLoad ); + + var frameLabel = editor.title, + helpLabel = editor.fire( 'ariaEditorHelpLabel', {} ).label; + + if ( frameLabel ) { + if ( CKEDITOR.env.ie && helpLabel ) + frameLabel += ', ' + helpLabel; + + iframe.setAttribute( 'title', frameLabel ); + } + + if ( helpLabel ) { + var labelId = CKEDITOR.tools.getNextId(), + desc = CKEDITOR.dom.element.createFromHtml( '' + helpLabel + '' ); + + contentSpace.append( desc, 1 ); + iframe.setAttribute( 'aria-describedby', labelId ); + } + + // Remove the ARIA description. + editor.on( 'beforeModeUnload', function( evt ) { + evt.removeListener(); + if ( desc ) + desc.remove(); + } ); + + iframe.setAttributes( { + tabIndex: editor.tabIndex, + allowTransparency: 'true' + } ); + + // Execute onLoad manually for all non IE||Gecko browsers. + !useOnloadEvent && onLoad(); + + editor.fire( 'ariaWidget', iframe ); + + function onLoad( evt ) { + evt && evt.removeListener(); + editor.editable( new framedWysiwyg( editor, iframe.$.contentWindow.document.body ) ); + editor.setData( editor.getData( 1 ), callback ); + } + } ); + } + } ); + + /** + * Adds the path to a stylesheet file to the exisiting {@link CKEDITOR.config#contentsCss} value. + * + * **Note:** This method is available only with the `wysiwygarea` plugin and only affects + * classic editors based on it (so it does not affect inline editors). + * + * editor.addContentsCss( 'assets/contents.css' ); + * + * @since 4.4 + * @param {String} cssPath The path to the stylesheet file which should be added. + * @member CKEDITOR.editor + */ + CKEDITOR.editor.prototype.addContentsCss = function( cssPath ) { + var cfg = this.config, + curContentsCss = cfg.contentsCss; + + // Convert current value into array. + if ( !CKEDITOR.tools.isArray( curContentsCss ) ) + cfg.contentsCss = curContentsCss ? [ curContentsCss ] : []; + + cfg.contentsCss.push( cssPath ); + }; + + function onDomReady( win ) { + var editor = this.editor, + doc = win.document, + body = doc.body; + + // Remove helper scripts from the DOM. + var script = doc.getElementById( 'cke_actscrpt' ); + script && script.parentNode.removeChild( script ); + script = doc.getElementById( 'cke_shimscrpt' ); + script && script.parentNode.removeChild( script ); + script = doc.getElementById( 'cke_basetagscrpt' ); + script && script.parentNode.removeChild( script ); + + body.contentEditable = true; + + if ( CKEDITOR.env.ie ) { + // Don't display the focus border. + body.hideFocus = true; + + // Disable and re-enable the body to avoid IE from + // taking the editing focus at startup. (#141 / #523) + body.disabled = true; + body.removeAttribute( 'disabled' ); + } + + delete this._.isLoadingData; + + // Play the magic to alter element reference to the reloaded one. + this.$ = body; + + doc = new CKEDITOR.dom.document( doc ); + + this.setup(); + this.fixInitialSelection(); + + var editable = this; + + // Without it IE8 has problem with removing selection in nested editable. (#13785) + if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) { + doc.getDocumentElement().addClass( doc.$.compatMode ); + } + + // Prevent IE/Edge from leaving a new paragraph/div after deleting all contents in body. (#6966, #13142) + if ( CKEDITOR.env.ie && !CKEDITOR.env.edge && editor.enterMode != CKEDITOR.ENTER_P ) { + removeSuperfluousElement( 'p' ); + } else if ( CKEDITOR.env.edge && editor.enterMode != CKEDITOR.ENTER_DIV ) { + removeSuperfluousElement( 'div' ); + } + + // Fix problem with cursor not appearing in Webkit and IE11+ when clicking below the body (#10945, #10906). + // Fix for older IEs (8-10 and QM) is placed inside selection.js. + if ( CKEDITOR.env.webkit || ( CKEDITOR.env.ie && CKEDITOR.env.version > 10 ) ) { + doc.getDocumentElement().on( 'mousedown', function( evt ) { + if ( evt.data.getTarget().is( 'html' ) ) { + // IE needs this timeout. Webkit does not, but it does not cause problems too. + setTimeout( function() { + editor.editable().focus(); + } ); + } + } ); + } + + // Config props: disableObjectResizing and disableNativeTableHandles handler. + objectResizeDisabler( editor ); + + // Enable dragging of position:absolute elements in IE. + try { + editor.document.$.execCommand( '2D-position', false, true ); + } catch ( e ) {} + + if ( CKEDITOR.env.gecko || CKEDITOR.env.ie && editor.document.$.compatMode == 'CSS1Compat' ) { + this.attachListener( this, 'keydown', function( evt ) { + var keyCode = evt.data.getKeystroke(); + + // PageUp OR PageDown + if ( keyCode == 33 || keyCode == 34 ) { + // PageUp/PageDown scrolling is broken in document + // with standard doctype, manually fix it. (#4736) + if ( CKEDITOR.env.ie ) { + setTimeout( function() { + editor.getSelection().scrollIntoView(); + }, 0 ); + } + // Page up/down cause editor selection to leak + // outside of editable thus we try to intercept + // the behavior, while it affects only happen + // when editor contents are not overflowed. (#7955) + else if ( editor.window.$.innerHeight > this.$.offsetHeight ) { + var range = editor.createRange(); + range[ keyCode == 33 ? 'moveToElementEditStart' : 'moveToElementEditEnd' ]( this ); + range.select(); + evt.data.preventDefault(); + } + } + } ); + } + + if ( CKEDITOR.env.ie ) { + // [IE] Iframe will still keep the selection when blurred, if + // focus is moved onto a non-editing host, e.g. link or button, but + // it becomes a problem for the object type selection, since the resizer + // handler attached on it will mark other part of the UI, especially + // for the dialog. (#8157) + // [IE<8 & Opera] Even worse For old IEs, the cursor will not vanish even if + // the selection has been moved to another text input in some cases. (#4716) + // + // Now the range restore is disabled, so we simply force IE to clean + // up the selection before blur. + this.attachListener( doc, 'blur', function() { + // Error proof when the editor is not visible. (#6375) + try { + doc.$.selection.empty(); + } catch ( er ) {} + } ); + } + + if ( CKEDITOR.env.iOS ) { + // [iOS] If touch is bound to any parent of the iframe blur happens on any touch + // event and body becomes the focused element (#10714). + this.attachListener( doc, 'touchend', function() { + win.focus(); + } ); + } + + var title = editor.document.getElementsByTag( 'title' ).getItem( 0 ); + // document.title is malfunctioning on Chrome, so get value from the element (#12402). + title.data( 'cke-title', title.getText() ); + + // [IE] JAWS will not recognize the aria label we used on the iframe + // unless the frame window title string is used as the voice label, + // backup the original one and restore it on output. + if ( CKEDITOR.env.ie ) + editor.document.$.title = this._.docTitle; + + CKEDITOR.tools.setTimeout( function() { + // Editable is ready after first setData. + if ( this.status == 'unloaded' ) + this.status = 'ready'; + + editor.fire( 'contentDom' ); + + if ( this._.isPendingFocus ) { + editor.focus(); + this._.isPendingFocus = false; + } + + setTimeout( function() { + editor.fire( 'dataReady' ); + }, 0 ); + }, 0, this ); + + function removeSuperfluousElement( tagName ) { + var lockRetain = false; + + // Superfluous elements appear after keydown + // and before keyup, so the procedure is as follows: + // 1. On first keydown mark all elements with + // a specified tag name as non-superfluous. + editable.attachListener( editable, 'keydown', function() { + var body = doc.getBody(), + retained = body.getElementsByTag( tagName ); + + if ( !lockRetain ) { + for ( var i = 0; i < retained.count(); i++ ) { + retained.getItem( i ).setCustomData( 'retain', true ); + } + lockRetain = true; + } + }, null, null, 1 ); + + // 2. On keyup remove all elements that were not marked + // as non-superfluous (which means they must have had appeared in the meantime). + // Also we should preserve all temporary elements inserted by editor – otherwise we'd likely + // leak fake selection's content into editable due to removing hidden selection container (#14831). + editable.attachListener( editable, 'keyup', function() { + var elements = doc.getElementsByTag( tagName ); + if ( lockRetain ) { + if ( elements.count() == 1 && !elements.getItem( 0 ).getCustomData( 'retain' ) && + !elements.getItem( 0 ).hasAttribute( 'data-cke-temp' ) ) { + elements.getItem( 0 ).remove( 1 ); + } + lockRetain = false; + } + } ); + } + } + + framedWysiwyg = CKEDITOR.tools.createClass( { + $: function() { + this.base.apply( this, arguments ); + + this._.frameLoadedHandler = CKEDITOR.tools.addFunction( function( win ) { + // Avoid opening design mode in a frame window thread, + // which will cause host page scrolling.(#4397) + CKEDITOR.tools.setTimeout( onDomReady, 0, this, win ); + }, this ); + + this._.docTitle = this.getWindow().getFrame().getAttribute( 'title' ); + }, + + base: CKEDITOR.editable, + + proto: { + setData: function( data, isSnapshot ) { + var editor = this.editor; + + if ( isSnapshot ) { + this.setHtml( data ); + this.fixInitialSelection(); + + // Fire dataReady for the consistency with inline editors + // and because it makes sense. (#10370) + editor.fire( 'dataReady' ); + } + else { + this._.isLoadingData = true; + editor._.dataStore = { id: 1 }; + + var config = editor.config, + fullPage = config.fullPage, + docType = config.docType; + + // Build the additional stuff to be included into . + var headExtra = CKEDITOR.tools.buildStyleHtml( iframeCssFixes() ).replace( /