aboutsummaryrefslogtreecommitdiff
path: root/sources/plugins
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2016-01-25 17:45:33 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2016-01-25 18:00:33 +0100
commit7adcb81e4f83f98c468889aaa5a85558ba88c770 (patch)
tree0d6ede733777b29060b48df4afaa2c64bfbae276 /sources/plugins
downloadconnexionswing-ckeditor-component-7adcb81e4f83f98c468889aaa5a85558ba88c770.tar.gz
connexionswing-ckeditor-component-7adcb81e4f83f98c468889aaa5a85558ba88c770.tar.zst
connexionswing-ckeditor-component-7adcb81e4f83f98c468889aaa5a85558ba88c770.zip
Initial commit4.5.6
Diffstat (limited to 'sources/plugins')
-rw-r--r--sources/plugins/a11yhelp/dialogs/a11yhelp.js216
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt25
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/af.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ar.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/bg.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ca.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/cs.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/cy.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/da.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/de.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/el.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/en-gb.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/en.js167
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/eo.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/es.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/et.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/eu.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/fa.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/fi.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/fo.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/fr-ca.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/fr.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/gl.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/gu.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/he.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/hi.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/hr.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/hu.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/id.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/it.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ja.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/km.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ko.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ku.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/lt.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/lv.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/mk.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/mn.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/nb.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/nl.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/no.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/pl.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/pt-br.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/pt.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ro.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ru.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/si.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/sk.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/sl.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/sq.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/sr-latn.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/sr.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/sv.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/th.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/tr.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/tt.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/ug.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/uk.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/vi.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/zh-cn.js148
-rw-r--r--sources/plugins/a11yhelp/dialogs/lang/zh.js148
-rw-r--r--sources/plugins/a11yhelp/plugin.js51
-rw-r--r--sources/plugins/about/dialogs/about.js73
-rw-r--r--sources/plugins/about/dialogs/hidpi/logo_ckeditor.pngbin0 -> 13339 bytes
-rw-r--r--sources/plugins/about/dialogs/logo_ckeditor.pngbin0 -> 6757 bytes
-rw-r--r--sources/plugins/about/icons/about.pngbin0 -> 843 bytes
-rw-r--r--sources/plugins/about/icons/hidpi/about.pngbin0 -> 1992 bytes
-rw-r--r--sources/plugins/about/lang/af.js12
-rw-r--r--sources/plugins/about/lang/ar.js12
-rw-r--r--sources/plugins/about/lang/bg.js12
-rw-r--r--sources/plugins/about/lang/bn.js12
-rw-r--r--sources/plugins/about/lang/bs.js12
-rw-r--r--sources/plugins/about/lang/ca.js12
-rw-r--r--sources/plugins/about/lang/cs.js12
-rw-r--r--sources/plugins/about/lang/cy.js12
-rw-r--r--sources/plugins/about/lang/da.js12
-rw-r--r--sources/plugins/about/lang/de.js12
-rw-r--r--sources/plugins/about/lang/el.js12
-rw-r--r--sources/plugins/about/lang/en-au.js12
-rw-r--r--sources/plugins/about/lang/en-ca.js12
-rw-r--r--sources/plugins/about/lang/en-gb.js12
-rw-r--r--sources/plugins/about/lang/en.js12
-rw-r--r--sources/plugins/about/lang/eo.js12
-rw-r--r--sources/plugins/about/lang/es.js12
-rw-r--r--sources/plugins/about/lang/et.js12
-rw-r--r--sources/plugins/about/lang/eu.js12
-rw-r--r--sources/plugins/about/lang/fa.js12
-rw-r--r--sources/plugins/about/lang/fi.js12
-rw-r--r--sources/plugins/about/lang/fo.js12
-rw-r--r--sources/plugins/about/lang/fr-ca.js12
-rw-r--r--sources/plugins/about/lang/fr.js12
-rw-r--r--sources/plugins/about/lang/gl.js12
-rw-r--r--sources/plugins/about/lang/gu.js12
-rw-r--r--sources/plugins/about/lang/he.js12
-rw-r--r--sources/plugins/about/lang/hi.js12
-rw-r--r--sources/plugins/about/lang/hr.js12
-rw-r--r--sources/plugins/about/lang/hu.js12
-rw-r--r--sources/plugins/about/lang/id.js12
-rw-r--r--sources/plugins/about/lang/is.js12
-rw-r--r--sources/plugins/about/lang/it.js12
-rw-r--r--sources/plugins/about/lang/ja.js12
-rw-r--r--sources/plugins/about/lang/ka.js12
-rw-r--r--sources/plugins/about/lang/km.js12
-rw-r--r--sources/plugins/about/lang/ko.js12
-rw-r--r--sources/plugins/about/lang/ku.js12
-rw-r--r--sources/plugins/about/lang/lt.js12
-rw-r--r--sources/plugins/about/lang/lv.js12
-rw-r--r--sources/plugins/about/lang/mk.js12
-rw-r--r--sources/plugins/about/lang/mn.js12
-rw-r--r--sources/plugins/about/lang/ms.js12
-rw-r--r--sources/plugins/about/lang/nb.js12
-rw-r--r--sources/plugins/about/lang/nl.js12
-rw-r--r--sources/plugins/about/lang/no.js12
-rw-r--r--sources/plugins/about/lang/pl.js12
-rw-r--r--sources/plugins/about/lang/pt-br.js12
-rw-r--r--sources/plugins/about/lang/pt.js12
-rw-r--r--sources/plugins/about/lang/ro.js12
-rw-r--r--sources/plugins/about/lang/ru.js12
-rw-r--r--sources/plugins/about/lang/si.js12
-rw-r--r--sources/plugins/about/lang/sk.js12
-rw-r--r--sources/plugins/about/lang/sl.js12
-rw-r--r--sources/plugins/about/lang/sq.js12
-rw-r--r--sources/plugins/about/lang/sr-latn.js12
-rw-r--r--sources/plugins/about/lang/sr.js12
-rw-r--r--sources/plugins/about/lang/sv.js12
-rw-r--r--sources/plugins/about/lang/th.js12
-rw-r--r--sources/plugins/about/lang/tr.js12
-rw-r--r--sources/plugins/about/lang/tt.js12
-rw-r--r--sources/plugins/about/lang/ug.js12
-rw-r--r--sources/plugins/about/lang/uk.js12
-rw-r--r--sources/plugins/about/lang/vi.js12
-rw-r--r--sources/plugins/about/lang/zh-cn.js12
-rw-r--r--sources/plugins/about/lang/zh.js12
-rw-r--r--sources/plugins/about/plugin.js27
-rw-r--r--sources/plugins/basicstyles/icons/bold.pngbin0 -> 813 bytes
-rw-r--r--sources/plugins/basicstyles/icons/hidpi/bold.pngbin0 -> 1865 bytes
-rw-r--r--sources/plugins/basicstyles/icons/hidpi/italic.pngbin0 -> 1452 bytes
-rw-r--r--sources/plugins/basicstyles/icons/hidpi/strike.pngbin0 -> 2171 bytes
-rw-r--r--sources/plugins/basicstyles/icons/hidpi/subscript.pngbin0 -> 1965 bytes
-rw-r--r--sources/plugins/basicstyles/icons/hidpi/superscript.pngbin0 -> 2021 bytes
-rw-r--r--sources/plugins/basicstyles/icons/hidpi/underline.pngbin0 -> 1577 bytes
-rw-r--r--sources/plugins/basicstyles/icons/italic.pngbin0 -> 708 bytes
-rw-r--r--sources/plugins/basicstyles/icons/strike.pngbin0 -> 879 bytes
-rw-r--r--sources/plugins/basicstyles/icons/subscript.pngbin0 -> 806 bytes
-rw-r--r--sources/plugins/basicstyles/icons/superscript.pngbin0 -> 859 bytes
-rw-r--r--sources/plugins/basicstyles/icons/underline.pngbin0 -> 747 bytes
-rw-r--r--sources/plugins/basicstyles/lang/af.js12
-rw-r--r--sources/plugins/basicstyles/lang/ar.js12
-rw-r--r--sources/plugins/basicstyles/lang/bg.js12
-rw-r--r--sources/plugins/basicstyles/lang/bn.js12
-rw-r--r--sources/plugins/basicstyles/lang/bs.js12
-rw-r--r--sources/plugins/basicstyles/lang/ca.js12
-rw-r--r--sources/plugins/basicstyles/lang/cs.js12
-rw-r--r--sources/plugins/basicstyles/lang/cy.js12
-rw-r--r--sources/plugins/basicstyles/lang/da.js12
-rw-r--r--sources/plugins/basicstyles/lang/de.js12
-rw-r--r--sources/plugins/basicstyles/lang/el.js12
-rw-r--r--sources/plugins/basicstyles/lang/en-au.js12
-rw-r--r--sources/plugins/basicstyles/lang/en-ca.js12
-rw-r--r--sources/plugins/basicstyles/lang/en-gb.js12
-rw-r--r--sources/plugins/basicstyles/lang/en.js12
-rw-r--r--sources/plugins/basicstyles/lang/eo.js12
-rw-r--r--sources/plugins/basicstyles/lang/es.js12
-rw-r--r--sources/plugins/basicstyles/lang/et.js12
-rw-r--r--sources/plugins/basicstyles/lang/eu.js12
-rw-r--r--sources/plugins/basicstyles/lang/fa.js12
-rw-r--r--sources/plugins/basicstyles/lang/fi.js12
-rw-r--r--sources/plugins/basicstyles/lang/fo.js12
-rw-r--r--sources/plugins/basicstyles/lang/fr-ca.js12
-rw-r--r--sources/plugins/basicstyles/lang/fr.js12
-rw-r--r--sources/plugins/basicstyles/lang/gl.js12
-rw-r--r--sources/plugins/basicstyles/lang/gu.js12
-rw-r--r--sources/plugins/basicstyles/lang/he.js12
-rw-r--r--sources/plugins/basicstyles/lang/hi.js12
-rw-r--r--sources/plugins/basicstyles/lang/hr.js12
-rw-r--r--sources/plugins/basicstyles/lang/hu.js12
-rw-r--r--sources/plugins/basicstyles/lang/id.js12
-rw-r--r--sources/plugins/basicstyles/lang/is.js12
-rw-r--r--sources/plugins/basicstyles/lang/it.js12
-rw-r--r--sources/plugins/basicstyles/lang/ja.js12
-rw-r--r--sources/plugins/basicstyles/lang/ka.js12
-rw-r--r--sources/plugins/basicstyles/lang/km.js12
-rw-r--r--sources/plugins/basicstyles/lang/ko.js12
-rw-r--r--sources/plugins/basicstyles/lang/ku.js12
-rw-r--r--sources/plugins/basicstyles/lang/lt.js12
-rw-r--r--sources/plugins/basicstyles/lang/lv.js12
-rw-r--r--sources/plugins/basicstyles/lang/mk.js12
-rw-r--r--sources/plugins/basicstyles/lang/mn.js12
-rw-r--r--sources/plugins/basicstyles/lang/ms.js12
-rw-r--r--sources/plugins/basicstyles/lang/nb.js12
-rw-r--r--sources/plugins/basicstyles/lang/nl.js12
-rw-r--r--sources/plugins/basicstyles/lang/no.js12
-rw-r--r--sources/plugins/basicstyles/lang/pl.js12
-rw-r--r--sources/plugins/basicstyles/lang/pt-br.js12
-rw-r--r--sources/plugins/basicstyles/lang/pt.js12
-rw-r--r--sources/plugins/basicstyles/lang/ro.js12
-rw-r--r--sources/plugins/basicstyles/lang/ru.js12
-rw-r--r--sources/plugins/basicstyles/lang/si.js12
-rw-r--r--sources/plugins/basicstyles/lang/sk.js12
-rw-r--r--sources/plugins/basicstyles/lang/sl.js12
-rw-r--r--sources/plugins/basicstyles/lang/sq.js12
-rw-r--r--sources/plugins/basicstyles/lang/sr-latn.js12
-rw-r--r--sources/plugins/basicstyles/lang/sr.js12
-rw-r--r--sources/plugins/basicstyles/lang/sv.js12
-rw-r--r--sources/plugins/basicstyles/lang/th.js12
-rw-r--r--sources/plugins/basicstyles/lang/tr.js12
-rw-r--r--sources/plugins/basicstyles/lang/tt.js12
-rw-r--r--sources/plugins/basicstyles/lang/ug.js12
-rw-r--r--sources/plugins/basicstyles/lang/uk.js12
-rw-r--r--sources/plugins/basicstyles/lang/vi.js12
-rw-r--r--sources/plugins/basicstyles/lang/zh-cn.js12
-rw-r--r--sources/plugins/basicstyles/lang/zh.js12
-rw-r--r--sources/plugins/basicstyles/plugin.js209
-rw-r--r--sources/plugins/bidi/icons/bidiltr.pngbin0 -> 769 bytes
-rw-r--r--sources/plugins/bidi/icons/bidirtl.pngbin0 -> 768 bytes
-rw-r--r--sources/plugins/bidi/icons/hidpi/bidiltr.pngbin0 -> 1579 bytes
-rw-r--r--sources/plugins/bidi/icons/hidpi/bidirtl.pngbin0 -> 1596 bytes
-rw-r--r--sources/plugins/bidi/lang/af.js8
-rw-r--r--sources/plugins/bidi/lang/ar.js8
-rw-r--r--sources/plugins/bidi/lang/bg.js8
-rw-r--r--sources/plugins/bidi/lang/bn.js8
-rw-r--r--sources/plugins/bidi/lang/bs.js8
-rw-r--r--sources/plugins/bidi/lang/ca.js8
-rw-r--r--sources/plugins/bidi/lang/cs.js8
-rw-r--r--sources/plugins/bidi/lang/cy.js8
-rw-r--r--sources/plugins/bidi/lang/da.js8
-rw-r--r--sources/plugins/bidi/lang/de.js8
-rw-r--r--sources/plugins/bidi/lang/el.js8
-rw-r--r--sources/plugins/bidi/lang/en-au.js8
-rw-r--r--sources/plugins/bidi/lang/en-ca.js8
-rw-r--r--sources/plugins/bidi/lang/en-gb.js8
-rw-r--r--sources/plugins/bidi/lang/en.js8
-rw-r--r--sources/plugins/bidi/lang/eo.js8
-rw-r--r--sources/plugins/bidi/lang/es.js8
-rw-r--r--sources/plugins/bidi/lang/et.js8
-rw-r--r--sources/plugins/bidi/lang/eu.js8
-rw-r--r--sources/plugins/bidi/lang/fa.js8
-rw-r--r--sources/plugins/bidi/lang/fi.js8
-rw-r--r--sources/plugins/bidi/lang/fo.js8
-rw-r--r--sources/plugins/bidi/lang/fr-ca.js8
-rw-r--r--sources/plugins/bidi/lang/fr.js8
-rw-r--r--sources/plugins/bidi/lang/gl.js8
-rw-r--r--sources/plugins/bidi/lang/gu.js8
-rw-r--r--sources/plugins/bidi/lang/he.js8
-rw-r--r--sources/plugins/bidi/lang/hi.js8
-rw-r--r--sources/plugins/bidi/lang/hr.js8
-rw-r--r--sources/plugins/bidi/lang/hu.js8
-rw-r--r--sources/plugins/bidi/lang/id.js8
-rw-r--r--sources/plugins/bidi/lang/is.js8
-rw-r--r--sources/plugins/bidi/lang/it.js8
-rw-r--r--sources/plugins/bidi/lang/ja.js8
-rw-r--r--sources/plugins/bidi/lang/ka.js8
-rw-r--r--sources/plugins/bidi/lang/km.js8
-rw-r--r--sources/plugins/bidi/lang/ko.js8
-rw-r--r--sources/plugins/bidi/lang/ku.js8
-rw-r--r--sources/plugins/bidi/lang/lt.js8
-rw-r--r--sources/plugins/bidi/lang/lv.js8
-rw-r--r--sources/plugins/bidi/lang/mk.js8
-rw-r--r--sources/plugins/bidi/lang/mn.js8
-rw-r--r--sources/plugins/bidi/lang/ms.js8
-rw-r--r--sources/plugins/bidi/lang/nb.js8
-rw-r--r--sources/plugins/bidi/lang/nl.js8
-rw-r--r--sources/plugins/bidi/lang/no.js8
-rw-r--r--sources/plugins/bidi/lang/pl.js8
-rw-r--r--sources/plugins/bidi/lang/pt-br.js8
-rw-r--r--sources/plugins/bidi/lang/pt.js8
-rw-r--r--sources/plugins/bidi/lang/ro.js8
-rw-r--r--sources/plugins/bidi/lang/ru.js8
-rw-r--r--sources/plugins/bidi/lang/si.js8
-rw-r--r--sources/plugins/bidi/lang/sk.js8
-rw-r--r--sources/plugins/bidi/lang/sl.js8
-rw-r--r--sources/plugins/bidi/lang/sq.js8
-rw-r--r--sources/plugins/bidi/lang/sr-latn.js8
-rw-r--r--sources/plugins/bidi/lang/sr.js8
-rw-r--r--sources/plugins/bidi/lang/sv.js8
-rw-r--r--sources/plugins/bidi/lang/th.js8
-rw-r--r--sources/plugins/bidi/lang/tr.js8
-rw-r--r--sources/plugins/bidi/lang/tt.js8
-rw-r--r--sources/plugins/bidi/lang/ug.js8
-rw-r--r--sources/plugins/bidi/lang/uk.js8
-rw-r--r--sources/plugins/bidi/lang/vi.js8
-rw-r--r--sources/plugins/bidi/lang/zh-cn.js8
-rw-r--r--sources/plugins/bidi/lang/zh.js8
-rw-r--r--sources/plugins/bidi/plugin.js320
-rw-r--r--sources/plugins/blockquote/icons/blockquote.pngbin0 -> 925 bytes
-rw-r--r--sources/plugins/blockquote/icons/hidpi/blockquote.pngbin0 -> 2233 bytes
-rw-r--r--sources/plugins/blockquote/lang/af.js7
-rw-r--r--sources/plugins/blockquote/lang/ar.js7
-rw-r--r--sources/plugins/blockquote/lang/bg.js7
-rw-r--r--sources/plugins/blockquote/lang/bn.js7
-rw-r--r--sources/plugins/blockquote/lang/bs.js7
-rw-r--r--sources/plugins/blockquote/lang/ca.js7
-rw-r--r--sources/plugins/blockquote/lang/cs.js7
-rw-r--r--sources/plugins/blockquote/lang/cy.js7
-rw-r--r--sources/plugins/blockquote/lang/da.js7
-rw-r--r--sources/plugins/blockquote/lang/de.js7
-rw-r--r--sources/plugins/blockquote/lang/el.js7
-rw-r--r--sources/plugins/blockquote/lang/en-au.js7
-rw-r--r--sources/plugins/blockquote/lang/en-ca.js7
-rw-r--r--sources/plugins/blockquote/lang/en-gb.js7
-rw-r--r--sources/plugins/blockquote/lang/en.js7
-rw-r--r--sources/plugins/blockquote/lang/eo.js7
-rw-r--r--sources/plugins/blockquote/lang/es.js7
-rw-r--r--sources/plugins/blockquote/lang/et.js7
-rw-r--r--sources/plugins/blockquote/lang/eu.js7
-rw-r--r--sources/plugins/blockquote/lang/fa.js7
-rw-r--r--sources/plugins/blockquote/lang/fi.js7
-rw-r--r--sources/plugins/blockquote/lang/fo.js7
-rw-r--r--sources/plugins/blockquote/lang/fr-ca.js7
-rw-r--r--sources/plugins/blockquote/lang/fr.js7
-rw-r--r--sources/plugins/blockquote/lang/gl.js7
-rw-r--r--sources/plugins/blockquote/lang/gu.js7
-rw-r--r--sources/plugins/blockquote/lang/he.js7
-rw-r--r--sources/plugins/blockquote/lang/hi.js7
-rw-r--r--sources/plugins/blockquote/lang/hr.js7
-rw-r--r--sources/plugins/blockquote/lang/hu.js7
-rw-r--r--sources/plugins/blockquote/lang/id.js7
-rw-r--r--sources/plugins/blockquote/lang/is.js7
-rw-r--r--sources/plugins/blockquote/lang/it.js7
-rw-r--r--sources/plugins/blockquote/lang/ja.js7
-rw-r--r--sources/plugins/blockquote/lang/ka.js7
-rw-r--r--sources/plugins/blockquote/lang/km.js7
-rw-r--r--sources/plugins/blockquote/lang/ko.js7
-rw-r--r--sources/plugins/blockquote/lang/ku.js7
-rw-r--r--sources/plugins/blockquote/lang/lt.js7
-rw-r--r--sources/plugins/blockquote/lang/lv.js7
-rw-r--r--sources/plugins/blockquote/lang/mk.js7
-rw-r--r--sources/plugins/blockquote/lang/mn.js7
-rw-r--r--sources/plugins/blockquote/lang/ms.js7
-rw-r--r--sources/plugins/blockquote/lang/nb.js7
-rw-r--r--sources/plugins/blockquote/lang/nl.js7
-rw-r--r--sources/plugins/blockquote/lang/no.js7
-rw-r--r--sources/plugins/blockquote/lang/pl.js7
-rw-r--r--sources/plugins/blockquote/lang/pt-br.js7
-rw-r--r--sources/plugins/blockquote/lang/pt.js7
-rw-r--r--sources/plugins/blockquote/lang/ro.js7
-rw-r--r--sources/plugins/blockquote/lang/ru.js7
-rw-r--r--sources/plugins/blockquote/lang/si.js7
-rw-r--r--sources/plugins/blockquote/lang/sk.js7
-rw-r--r--sources/plugins/blockquote/lang/sl.js7
-rw-r--r--sources/plugins/blockquote/lang/sq.js7
-rw-r--r--sources/plugins/blockquote/lang/sr-latn.js7
-rw-r--r--sources/plugins/blockquote/lang/sr.js7
-rw-r--r--sources/plugins/blockquote/lang/sv.js7
-rw-r--r--sources/plugins/blockquote/lang/th.js7
-rw-r--r--sources/plugins/blockquote/lang/tr.js7
-rw-r--r--sources/plugins/blockquote/lang/tt.js7
-rw-r--r--sources/plugins/blockquote/lang/ug.js7
-rw-r--r--sources/plugins/blockquote/lang/uk.js7
-rw-r--r--sources/plugins/blockquote/lang/vi.js7
-rw-r--r--sources/plugins/blockquote/lang/zh-cn.js7
-rw-r--r--sources/plugins/blockquote/lang/zh.js7
-rw-r--r--sources/plugins/blockquote/plugin.js251
-rw-r--r--sources/plugins/button/lang/af.js8
-rw-r--r--sources/plugins/button/lang/ar.js8
-rw-r--r--sources/plugins/button/lang/bg.js8
-rw-r--r--sources/plugins/button/lang/ca.js8
-rw-r--r--sources/plugins/button/lang/cs.js8
-rw-r--r--sources/plugins/button/lang/da.js8
-rw-r--r--sources/plugins/button/lang/de.js8
-rw-r--r--sources/plugins/button/lang/el.js8
-rw-r--r--sources/plugins/button/lang/en-gb.js8
-rw-r--r--sources/plugins/button/lang/en.js8
-rw-r--r--sources/plugins/button/lang/eo.js8
-rw-r--r--sources/plugins/button/lang/es.js8
-rw-r--r--sources/plugins/button/lang/eu.js8
-rw-r--r--sources/plugins/button/lang/fa.js8
-rw-r--r--sources/plugins/button/lang/fi.js8
-rw-r--r--sources/plugins/button/lang/fr.js8
-rw-r--r--sources/plugins/button/lang/gl.js8
-rw-r--r--sources/plugins/button/lang/he.js8
-rw-r--r--sources/plugins/button/lang/hu.js8
-rw-r--r--sources/plugins/button/lang/id.js8
-rw-r--r--sources/plugins/button/lang/it.js8
-rw-r--r--sources/plugins/button/lang/ja.js8
-rw-r--r--sources/plugins/button/lang/km.js8
-rw-r--r--sources/plugins/button/lang/ko.js8
-rw-r--r--sources/plugins/button/lang/ku.js8
-rw-r--r--sources/plugins/button/lang/lt.js8
-rw-r--r--sources/plugins/button/lang/nb.js8
-rw-r--r--sources/plugins/button/lang/nl.js8
-rw-r--r--sources/plugins/button/lang/pl.js8
-rw-r--r--sources/plugins/button/lang/pt-br.js8
-rw-r--r--sources/plugins/button/lang/pt.js8
-rw-r--r--sources/plugins/button/lang/ro.js8
-rw-r--r--sources/plugins/button/lang/ru.js8
-rw-r--r--sources/plugins/button/lang/sk.js8
-rw-r--r--sources/plugins/button/lang/sl.js8
-rw-r--r--sources/plugins/button/lang/sq.js8
-rw-r--r--sources/plugins/button/lang/sv.js8
-rw-r--r--sources/plugins/button/lang/tr.js8
-rw-r--r--sources/plugins/button/lang/tt.js8
-rw-r--r--sources/plugins/button/lang/ug.js8
-rw-r--r--sources/plugins/button/lang/uk.js8
-rw-r--r--sources/plugins/button/lang/vi.js8
-rw-r--r--sources/plugins/button/lang/zh-cn.js8
-rw-r--r--sources/plugins/button/lang/zh.js8
-rw-r--r--sources/plugins/button/plugin.js377
-rw-r--r--sources/plugins/clipboard/dev/clipboard.html190
-rw-r--r--sources/plugins/clipboard/dev/console.js49
-rw-r--r--sources/plugins/clipboard/dev/dnd.html185
-rw-r--r--sources/plugins/clipboard/dialogs/paste.js254
-rw-r--r--sources/plugins/clipboard/icons/copy-rtl.pngbin0 -> 684 bytes
-rw-r--r--sources/plugins/clipboard/icons/copy.pngbin0 -> 684 bytes
-rw-r--r--sources/plugins/clipboard/icons/cut-rtl.pngbin0 -> 1031 bytes
-rw-r--r--sources/plugins/clipboard/icons/cut.pngbin0 -> 1031 bytes
-rw-r--r--sources/plugins/clipboard/icons/hidpi/copy-rtl.pngbin0 -> 1558 bytes
-rw-r--r--sources/plugins/clipboard/icons/hidpi/copy.pngbin0 -> 1558 bytes
-rw-r--r--sources/plugins/clipboard/icons/hidpi/cut-rtl.pngbin0 -> 2692 bytes
-rw-r--r--sources/plugins/clipboard/icons/hidpi/cut.pngbin0 -> 2692 bytes
-rw-r--r--sources/plugins/clipboard/icons/hidpi/paste-rtl.pngbin0 -> 1959 bytes
-rw-r--r--sources/plugins/clipboard/icons/hidpi/paste.pngbin0 -> 1959 bytes
-rw-r--r--sources/plugins/clipboard/icons/paste-rtl.pngbin0 -> 724 bytes
-rw-r--r--sources/plugins/clipboard/icons/paste.pngbin0 -> 724 bytes
-rw-r--r--sources/plugins/clipboard/lang/af.js15
-rw-r--r--sources/plugins/clipboard/lang/ar.js15
-rw-r--r--sources/plugins/clipboard/lang/bg.js15
-rw-r--r--sources/plugins/clipboard/lang/bn.js15
-rw-r--r--sources/plugins/clipboard/lang/bs.js15
-rw-r--r--sources/plugins/clipboard/lang/ca.js15
-rw-r--r--sources/plugins/clipboard/lang/cs.js15
-rw-r--r--sources/plugins/clipboard/lang/cy.js15
-rw-r--r--sources/plugins/clipboard/lang/da.js15
-rw-r--r--sources/plugins/clipboard/lang/de.js15
-rw-r--r--sources/plugins/clipboard/lang/el.js15
-rw-r--r--sources/plugins/clipboard/lang/en-au.js15
-rw-r--r--sources/plugins/clipboard/lang/en-ca.js15
-rw-r--r--sources/plugins/clipboard/lang/en-gb.js15
-rw-r--r--sources/plugins/clipboard/lang/en.js15
-rw-r--r--sources/plugins/clipboard/lang/eo.js15
-rw-r--r--sources/plugins/clipboard/lang/es.js15
-rw-r--r--sources/plugins/clipboard/lang/et.js15
-rw-r--r--sources/plugins/clipboard/lang/eu.js15
-rw-r--r--sources/plugins/clipboard/lang/fa.js15
-rw-r--r--sources/plugins/clipboard/lang/fi.js15
-rw-r--r--sources/plugins/clipboard/lang/fo.js15
-rw-r--r--sources/plugins/clipboard/lang/fr-ca.js15
-rw-r--r--sources/plugins/clipboard/lang/fr.js15
-rw-r--r--sources/plugins/clipboard/lang/gl.js15
-rw-r--r--sources/plugins/clipboard/lang/gu.js15
-rw-r--r--sources/plugins/clipboard/lang/he.js15
-rw-r--r--sources/plugins/clipboard/lang/hi.js15
-rw-r--r--sources/plugins/clipboard/lang/hr.js15
-rw-r--r--sources/plugins/clipboard/lang/hu.js15
-rw-r--r--sources/plugins/clipboard/lang/id.js15
-rw-r--r--sources/plugins/clipboard/lang/is.js15
-rw-r--r--sources/plugins/clipboard/lang/it.js15
-rw-r--r--sources/plugins/clipboard/lang/ja.js15
-rw-r--r--sources/plugins/clipboard/lang/ka.js15
-rw-r--r--sources/plugins/clipboard/lang/km.js15
-rw-r--r--sources/plugins/clipboard/lang/ko.js15
-rw-r--r--sources/plugins/clipboard/lang/ku.js15
-rw-r--r--sources/plugins/clipboard/lang/lt.js15
-rw-r--r--sources/plugins/clipboard/lang/lv.js15
-rw-r--r--sources/plugins/clipboard/lang/mk.js15
-rw-r--r--sources/plugins/clipboard/lang/mn.js15
-rw-r--r--sources/plugins/clipboard/lang/ms.js15
-rw-r--r--sources/plugins/clipboard/lang/nb.js15
-rw-r--r--sources/plugins/clipboard/lang/nl.js15
-rw-r--r--sources/plugins/clipboard/lang/no.js15
-rw-r--r--sources/plugins/clipboard/lang/pl.js15
-rw-r--r--sources/plugins/clipboard/lang/pt-br.js15
-rw-r--r--sources/plugins/clipboard/lang/pt.js15
-rw-r--r--sources/plugins/clipboard/lang/ro.js15
-rw-r--r--sources/plugins/clipboard/lang/ru.js15
-rw-r--r--sources/plugins/clipboard/lang/si.js15
-rw-r--r--sources/plugins/clipboard/lang/sk.js15
-rw-r--r--sources/plugins/clipboard/lang/sl.js15
-rw-r--r--sources/plugins/clipboard/lang/sq.js15
-rw-r--r--sources/plugins/clipboard/lang/sr-latn.js15
-rw-r--r--sources/plugins/clipboard/lang/sr.js15
-rw-r--r--sources/plugins/clipboard/lang/sv.js15
-rw-r--r--sources/plugins/clipboard/lang/th.js15
-rw-r--r--sources/plugins/clipboard/lang/tr.js15
-rw-r--r--sources/plugins/clipboard/lang/tt.js15
-rw-r--r--sources/plugins/clipboard/lang/ug.js15
-rw-r--r--sources/plugins/clipboard/lang/uk.js15
-rw-r--r--sources/plugins/clipboard/lang/vi.js15
-rw-r--r--sources/plugins/clipboard/lang/zh-cn.js15
-rw-r--r--sources/plugins/clipboard/lang/zh.js15
-rw-r--r--sources/plugins/clipboard/plugin.js2723
-rw-r--r--sources/plugins/colorbutton/icons/bgcolor.pngbin0 -> 906 bytes
-rw-r--r--sources/plugins/colorbutton/icons/hidpi/bgcolor.pngbin0 -> 2169 bytes
-rw-r--r--sources/plugins/colorbutton/icons/hidpi/textcolor.pngbin0 -> 1725 bytes
-rw-r--r--sources/plugins/colorbutton/icons/textcolor.pngbin0 -> 813 bytes
-rw-r--r--sources/plugins/colorbutton/lang/af.js53
-rw-r--r--sources/plugins/colorbutton/lang/ar.js53
-rw-r--r--sources/plugins/colorbutton/lang/bg.js53
-rw-r--r--sources/plugins/colorbutton/lang/bn.js53
-rw-r--r--sources/plugins/colorbutton/lang/bs.js53
-rw-r--r--sources/plugins/colorbutton/lang/ca.js53
-rw-r--r--sources/plugins/colorbutton/lang/cs.js53
-rw-r--r--sources/plugins/colorbutton/lang/cy.js53
-rw-r--r--sources/plugins/colorbutton/lang/da.js53
-rw-r--r--sources/plugins/colorbutton/lang/de.js53
-rw-r--r--sources/plugins/colorbutton/lang/el.js53
-rw-r--r--sources/plugins/colorbutton/lang/en-au.js53
-rw-r--r--sources/plugins/colorbutton/lang/en-ca.js53
-rw-r--r--sources/plugins/colorbutton/lang/en-gb.js53
-rw-r--r--sources/plugins/colorbutton/lang/en.js53
-rw-r--r--sources/plugins/colorbutton/lang/eo.js53
-rw-r--r--sources/plugins/colorbutton/lang/es.js53
-rw-r--r--sources/plugins/colorbutton/lang/et.js53
-rw-r--r--sources/plugins/colorbutton/lang/eu.js53
-rw-r--r--sources/plugins/colorbutton/lang/fa.js53
-rw-r--r--sources/plugins/colorbutton/lang/fi.js53
-rw-r--r--sources/plugins/colorbutton/lang/fo.js53
-rw-r--r--sources/plugins/colorbutton/lang/fr-ca.js53
-rw-r--r--sources/plugins/colorbutton/lang/fr.js53
-rw-r--r--sources/plugins/colorbutton/lang/gl.js53
-rw-r--r--sources/plugins/colorbutton/lang/gu.js53
-rw-r--r--sources/plugins/colorbutton/lang/he.js53
-rw-r--r--sources/plugins/colorbutton/lang/hi.js53
-rw-r--r--sources/plugins/colorbutton/lang/hr.js53
-rw-r--r--sources/plugins/colorbutton/lang/hu.js53
-rw-r--r--sources/plugins/colorbutton/lang/id.js53
-rw-r--r--sources/plugins/colorbutton/lang/is.js53
-rw-r--r--sources/plugins/colorbutton/lang/it.js53
-rw-r--r--sources/plugins/colorbutton/lang/ja.js53
-rw-r--r--sources/plugins/colorbutton/lang/ka.js53
-rw-r--r--sources/plugins/colorbutton/lang/km.js53
-rw-r--r--sources/plugins/colorbutton/lang/ko.js53
-rw-r--r--sources/plugins/colorbutton/lang/ku.js53
-rw-r--r--sources/plugins/colorbutton/lang/lt.js53
-rw-r--r--sources/plugins/colorbutton/lang/lv.js53
-rw-r--r--sources/plugins/colorbutton/lang/mk.js53
-rw-r--r--sources/plugins/colorbutton/lang/mn.js53
-rw-r--r--sources/plugins/colorbutton/lang/ms.js53
-rw-r--r--sources/plugins/colorbutton/lang/nb.js53
-rw-r--r--sources/plugins/colorbutton/lang/nl.js53
-rw-r--r--sources/plugins/colorbutton/lang/no.js53
-rw-r--r--sources/plugins/colorbutton/lang/pl.js53
-rw-r--r--sources/plugins/colorbutton/lang/pt-br.js53
-rw-r--r--sources/plugins/colorbutton/lang/pt.js53
-rw-r--r--sources/plugins/colorbutton/lang/ro.js53
-rw-r--r--sources/plugins/colorbutton/lang/ru.js53
-rw-r--r--sources/plugins/colorbutton/lang/si.js53
-rw-r--r--sources/plugins/colorbutton/lang/sk.js53
-rw-r--r--sources/plugins/colorbutton/lang/sl.js53
-rw-r--r--sources/plugins/colorbutton/lang/sq.js53
-rw-r--r--sources/plugins/colorbutton/lang/sr-latn.js53
-rw-r--r--sources/plugins/colorbutton/lang/sr.js53
-rw-r--r--sources/plugins/colorbutton/lang/sv.js53
-rw-r--r--sources/plugins/colorbutton/lang/th.js53
-rw-r--r--sources/plugins/colorbutton/lang/tr.js53
-rw-r--r--sources/plugins/colorbutton/lang/tt.js53
-rw-r--r--sources/plugins/colorbutton/lang/ug.js53
-rw-r--r--sources/plugins/colorbutton/lang/uk.js53
-rw-r--r--sources/plugins/colorbutton/lang/vi.js53
-rw-r--r--sources/plugins/colorbutton/lang/zh-cn.js53
-rw-r--r--sources/plugins/colorbutton/lang/zh.js53
-rw-r--r--sources/plugins/colorbutton/plugin.js301
-rw-r--r--sources/plugins/colordialog/dialogs/colordialog.js327
-rw-r--r--sources/plugins/colordialog/lang/af.js11
-rw-r--r--sources/plugins/colordialog/lang/ar.js11
-rw-r--r--sources/plugins/colordialog/lang/bg.js11
-rw-r--r--sources/plugins/colordialog/lang/bn.js11
-rw-r--r--sources/plugins/colordialog/lang/bs.js11
-rw-r--r--sources/plugins/colordialog/lang/ca.js11
-rw-r--r--sources/plugins/colordialog/lang/cs.js11
-rw-r--r--sources/plugins/colordialog/lang/cy.js11
-rw-r--r--sources/plugins/colordialog/lang/da.js11
-rw-r--r--sources/plugins/colordialog/lang/de.js11
-rw-r--r--sources/plugins/colordialog/lang/el.js11
-rw-r--r--sources/plugins/colordialog/lang/en-au.js11
-rw-r--r--sources/plugins/colordialog/lang/en-ca.js11
-rw-r--r--sources/plugins/colordialog/lang/en-gb.js11
-rw-r--r--sources/plugins/colordialog/lang/en.js11
-rw-r--r--sources/plugins/colordialog/lang/eo.js11
-rw-r--r--sources/plugins/colordialog/lang/es.js11
-rw-r--r--sources/plugins/colordialog/lang/et.js11
-rw-r--r--sources/plugins/colordialog/lang/eu.js11
-rw-r--r--sources/plugins/colordialog/lang/fa.js11
-rw-r--r--sources/plugins/colordialog/lang/fi.js11
-rw-r--r--sources/plugins/colordialog/lang/fo.js11
-rw-r--r--sources/plugins/colordialog/lang/fr-ca.js11
-rw-r--r--sources/plugins/colordialog/lang/fr.js11
-rw-r--r--sources/plugins/colordialog/lang/gl.js11
-rw-r--r--sources/plugins/colordialog/lang/gu.js11
-rw-r--r--sources/plugins/colordialog/lang/he.js11
-rw-r--r--sources/plugins/colordialog/lang/hi.js11
-rw-r--r--sources/plugins/colordialog/lang/hr.js11
-rw-r--r--sources/plugins/colordialog/lang/hu.js11
-rw-r--r--sources/plugins/colordialog/lang/id.js11
-rw-r--r--sources/plugins/colordialog/lang/is.js11
-rw-r--r--sources/plugins/colordialog/lang/it.js11
-rw-r--r--sources/plugins/colordialog/lang/ja.js11
-rw-r--r--sources/plugins/colordialog/lang/ka.js11
-rw-r--r--sources/plugins/colordialog/lang/km.js11
-rw-r--r--sources/plugins/colordialog/lang/ko.js11
-rw-r--r--sources/plugins/colordialog/lang/ku.js11
-rw-r--r--sources/plugins/colordialog/lang/lt.js11
-rw-r--r--sources/plugins/colordialog/lang/lv.js11
-rw-r--r--sources/plugins/colordialog/lang/mk.js11
-rw-r--r--sources/plugins/colordialog/lang/mn.js11
-rw-r--r--sources/plugins/colordialog/lang/ms.js11
-rw-r--r--sources/plugins/colordialog/lang/nb.js11
-rw-r--r--sources/plugins/colordialog/lang/nl.js11
-rw-r--r--sources/plugins/colordialog/lang/no.js11
-rw-r--r--sources/plugins/colordialog/lang/pl.js11
-rw-r--r--sources/plugins/colordialog/lang/pt-br.js11
-rw-r--r--sources/plugins/colordialog/lang/pt.js11
-rw-r--r--sources/plugins/colordialog/lang/ro.js11
-rw-r--r--sources/plugins/colordialog/lang/ru.js11
-rw-r--r--sources/plugins/colordialog/lang/si.js11
-rw-r--r--sources/plugins/colordialog/lang/sk.js11
-rw-r--r--sources/plugins/colordialog/lang/sl.js11
-rw-r--r--sources/plugins/colordialog/lang/sq.js11
-rw-r--r--sources/plugins/colordialog/lang/sr-latn.js11
-rw-r--r--sources/plugins/colordialog/lang/sr.js11
-rw-r--r--sources/plugins/colordialog/lang/sv.js11
-rw-r--r--sources/plugins/colordialog/lang/th.js11
-rw-r--r--sources/plugins/colordialog/lang/tr.js11
-rw-r--r--sources/plugins/colordialog/lang/tt.js11
-rw-r--r--sources/plugins/colordialog/lang/ug.js11
-rw-r--r--sources/plugins/colordialog/lang/uk.js11
-rw-r--r--sources/plugins/colordialog/lang/vi.js11
-rw-r--r--sources/plugins/colordialog/lang/zh-cn.js11
-rw-r--r--sources/plugins/colordialog/lang/zh.js11
-rw-r--r--sources/plugins/colordialog/plugin.js71
-rw-r--r--sources/plugins/contextmenu/lang/af.js7
-rw-r--r--sources/plugins/contextmenu/lang/ar.js7
-rw-r--r--sources/plugins/contextmenu/lang/bg.js7
-rw-r--r--sources/plugins/contextmenu/lang/bn.js7
-rw-r--r--sources/plugins/contextmenu/lang/bs.js7
-rw-r--r--sources/plugins/contextmenu/lang/ca.js7
-rw-r--r--sources/plugins/contextmenu/lang/cs.js7
-rw-r--r--sources/plugins/contextmenu/lang/cy.js7
-rw-r--r--sources/plugins/contextmenu/lang/da.js7
-rw-r--r--sources/plugins/contextmenu/lang/de.js7
-rw-r--r--sources/plugins/contextmenu/lang/el.js7
-rw-r--r--sources/plugins/contextmenu/lang/en-au.js7
-rw-r--r--sources/plugins/contextmenu/lang/en-ca.js7
-rw-r--r--sources/plugins/contextmenu/lang/en-gb.js7
-rw-r--r--sources/plugins/contextmenu/lang/en.js7
-rw-r--r--sources/plugins/contextmenu/lang/eo.js7
-rw-r--r--sources/plugins/contextmenu/lang/es.js7
-rw-r--r--sources/plugins/contextmenu/lang/et.js7
-rw-r--r--sources/plugins/contextmenu/lang/eu.js7
-rw-r--r--sources/plugins/contextmenu/lang/fa.js7
-rw-r--r--sources/plugins/contextmenu/lang/fi.js7
-rw-r--r--sources/plugins/contextmenu/lang/fo.js7
-rw-r--r--sources/plugins/contextmenu/lang/fr-ca.js7
-rw-r--r--sources/plugins/contextmenu/lang/fr.js7
-rw-r--r--sources/plugins/contextmenu/lang/gl.js7
-rw-r--r--sources/plugins/contextmenu/lang/gu.js7
-rw-r--r--sources/plugins/contextmenu/lang/he.js7
-rw-r--r--sources/plugins/contextmenu/lang/hi.js7
-rw-r--r--sources/plugins/contextmenu/lang/hr.js7
-rw-r--r--sources/plugins/contextmenu/lang/hu.js7
-rw-r--r--sources/plugins/contextmenu/lang/id.js7
-rw-r--r--sources/plugins/contextmenu/lang/is.js7
-rw-r--r--sources/plugins/contextmenu/lang/it.js7
-rw-r--r--sources/plugins/contextmenu/lang/ja.js7
-rw-r--r--sources/plugins/contextmenu/lang/ka.js7
-rw-r--r--sources/plugins/contextmenu/lang/km.js7
-rw-r--r--sources/plugins/contextmenu/lang/ko.js7
-rw-r--r--sources/plugins/contextmenu/lang/ku.js7
-rw-r--r--sources/plugins/contextmenu/lang/lt.js7
-rw-r--r--sources/plugins/contextmenu/lang/lv.js7
-rw-r--r--sources/plugins/contextmenu/lang/mk.js7
-rw-r--r--sources/plugins/contextmenu/lang/mn.js7
-rw-r--r--sources/plugins/contextmenu/lang/ms.js7
-rw-r--r--sources/plugins/contextmenu/lang/nb.js7
-rw-r--r--sources/plugins/contextmenu/lang/nl.js7
-rw-r--r--sources/plugins/contextmenu/lang/no.js7
-rw-r--r--sources/plugins/contextmenu/lang/pl.js7
-rw-r--r--sources/plugins/contextmenu/lang/pt-br.js7
-rw-r--r--sources/plugins/contextmenu/lang/pt.js7
-rw-r--r--sources/plugins/contextmenu/lang/ro.js7
-rw-r--r--sources/plugins/contextmenu/lang/ru.js7
-rw-r--r--sources/plugins/contextmenu/lang/si.js7
-rw-r--r--sources/plugins/contextmenu/lang/sk.js7
-rw-r--r--sources/plugins/contextmenu/lang/sl.js7
-rw-r--r--sources/plugins/contextmenu/lang/sq.js7
-rw-r--r--sources/plugins/contextmenu/lang/sr-latn.js7
-rw-r--r--sources/plugins/contextmenu/lang/sr.js7
-rw-r--r--sources/plugins/contextmenu/lang/sv.js7
-rw-r--r--sources/plugins/contextmenu/lang/th.js7
-rw-r--r--sources/plugins/contextmenu/lang/tr.js7
-rw-r--r--sources/plugins/contextmenu/lang/tt.js7
-rw-r--r--sources/plugins/contextmenu/lang/ug.js7
-rw-r--r--sources/plugins/contextmenu/lang/uk.js7
-rw-r--r--sources/plugins/contextmenu/lang/vi.js7
-rw-r--r--sources/plugins/contextmenu/lang/zh-cn.js7
-rw-r--r--sources/plugins/contextmenu/lang/zh.js7
-rw-r--r--sources/plugins/contextmenu/plugin.js159
-rw-r--r--sources/plugins/dialog/dialogDefinition.js1032
-rw-r--r--sources/plugins/dialog/plugin.js3398
-rw-r--r--sources/plugins/dialog/samples/assets/my_dialog.js49
-rw-r--r--sources/plugins/dialog/samples/dialog.html190
-rw-r--r--sources/plugins/dialogadvtab/plugin.js196
-rw-r--r--sources/plugins/dialogui/plugin.js1530
-rw-r--r--sources/plugins/div/dialogs/div.js430
-rw-r--r--sources/plugins/div/icons/creatediv.pngbin0 -> 862 bytes
-rw-r--r--sources/plugins/div/icons/hidpi/creatediv.pngbin0 -> 3053 bytes
-rw-r--r--sources/plugins/div/lang/af.js19
-rw-r--r--sources/plugins/div/lang/ar.js19
-rw-r--r--sources/plugins/div/lang/bg.js19
-rw-r--r--sources/plugins/div/lang/bn.js19
-rw-r--r--sources/plugins/div/lang/bs.js19
-rw-r--r--sources/plugins/div/lang/ca.js19
-rw-r--r--sources/plugins/div/lang/cs.js19
-rw-r--r--sources/plugins/div/lang/cy.js19
-rw-r--r--sources/plugins/div/lang/da.js19
-rw-r--r--sources/plugins/div/lang/de.js19
-rw-r--r--sources/plugins/div/lang/el.js19
-rw-r--r--sources/plugins/div/lang/en-au.js19
-rw-r--r--sources/plugins/div/lang/en-ca.js19
-rw-r--r--sources/plugins/div/lang/en-gb.js19
-rw-r--r--sources/plugins/div/lang/en.js19
-rw-r--r--sources/plugins/div/lang/eo.js19
-rw-r--r--sources/plugins/div/lang/es.js19
-rw-r--r--sources/plugins/div/lang/et.js19
-rw-r--r--sources/plugins/div/lang/eu.js19
-rw-r--r--sources/plugins/div/lang/fa.js19
-rw-r--r--sources/plugins/div/lang/fi.js19
-rw-r--r--sources/plugins/div/lang/fo.js19
-rw-r--r--sources/plugins/div/lang/fr-ca.js19
-rw-r--r--sources/plugins/div/lang/fr.js19
-rw-r--r--sources/plugins/div/lang/gl.js19
-rw-r--r--sources/plugins/div/lang/gu.js19
-rw-r--r--sources/plugins/div/lang/he.js19
-rw-r--r--sources/plugins/div/lang/hi.js19
-rw-r--r--sources/plugins/div/lang/hr.js19
-rw-r--r--sources/plugins/div/lang/hu.js19
-rw-r--r--sources/plugins/div/lang/id.js19
-rw-r--r--sources/plugins/div/lang/is.js19
-rw-r--r--sources/plugins/div/lang/it.js19
-rw-r--r--sources/plugins/div/lang/ja.js19
-rw-r--r--sources/plugins/div/lang/ka.js19
-rw-r--r--sources/plugins/div/lang/km.js19
-rw-r--r--sources/plugins/div/lang/ko.js19
-rw-r--r--sources/plugins/div/lang/ku.js19
-rw-r--r--sources/plugins/div/lang/lt.js19
-rw-r--r--sources/plugins/div/lang/lv.js19
-rw-r--r--sources/plugins/div/lang/mk.js19
-rw-r--r--sources/plugins/div/lang/mn.js19
-rw-r--r--sources/plugins/div/lang/ms.js19
-rw-r--r--sources/plugins/div/lang/nb.js19
-rw-r--r--sources/plugins/div/lang/nl.js19
-rw-r--r--sources/plugins/div/lang/no.js19
-rw-r--r--sources/plugins/div/lang/pl.js19
-rw-r--r--sources/plugins/div/lang/pt-br.js19
-rw-r--r--sources/plugins/div/lang/pt.js19
-rw-r--r--sources/plugins/div/lang/ro.js19
-rw-r--r--sources/plugins/div/lang/ru.js19
-rw-r--r--sources/plugins/div/lang/si.js19
-rw-r--r--sources/plugins/div/lang/sk.js19
-rw-r--r--sources/plugins/div/lang/sl.js19
-rw-r--r--sources/plugins/div/lang/sq.js19
-rw-r--r--sources/plugins/div/lang/sr-latn.js19
-rw-r--r--sources/plugins/div/lang/sr.js19
-rw-r--r--sources/plugins/div/lang/sv.js19
-rw-r--r--sources/plugins/div/lang/th.js19
-rw-r--r--sources/plugins/div/lang/tr.js19
-rw-r--r--sources/plugins/div/lang/tt.js19
-rw-r--r--sources/plugins/div/lang/ug.js19
-rw-r--r--sources/plugins/div/lang/uk.js19
-rw-r--r--sources/plugins/div/lang/vi.js19
-rw-r--r--sources/plugins/div/lang/zh-cn.js19
-rw-r--r--sources/plugins/div/lang/zh.js19
-rw-r--r--sources/plugins/div/plugin.js131
-rw-r--r--sources/plugins/elementspath/lang/af.js8
-rw-r--r--sources/plugins/elementspath/lang/ar.js8
-rw-r--r--sources/plugins/elementspath/lang/bg.js8
-rw-r--r--sources/plugins/elementspath/lang/bn.js8
-rw-r--r--sources/plugins/elementspath/lang/bs.js8
-rw-r--r--sources/plugins/elementspath/lang/ca.js8
-rw-r--r--sources/plugins/elementspath/lang/cs.js8
-rw-r--r--sources/plugins/elementspath/lang/cy.js8
-rw-r--r--sources/plugins/elementspath/lang/da.js8
-rw-r--r--sources/plugins/elementspath/lang/de.js8
-rw-r--r--sources/plugins/elementspath/lang/el.js8
-rw-r--r--sources/plugins/elementspath/lang/en-au.js8
-rw-r--r--sources/plugins/elementspath/lang/en-ca.js8
-rw-r--r--sources/plugins/elementspath/lang/en-gb.js8
-rw-r--r--sources/plugins/elementspath/lang/en.js8
-rw-r--r--sources/plugins/elementspath/lang/eo.js8
-rw-r--r--sources/plugins/elementspath/lang/es.js8
-rw-r--r--sources/plugins/elementspath/lang/et.js8
-rw-r--r--sources/plugins/elementspath/lang/eu.js8
-rw-r--r--sources/plugins/elementspath/lang/fa.js8
-rw-r--r--sources/plugins/elementspath/lang/fi.js8
-rw-r--r--sources/plugins/elementspath/lang/fo.js8
-rw-r--r--sources/plugins/elementspath/lang/fr-ca.js8
-rw-r--r--sources/plugins/elementspath/lang/fr.js8
-rw-r--r--sources/plugins/elementspath/lang/gl.js8
-rw-r--r--sources/plugins/elementspath/lang/gu.js8
-rw-r--r--sources/plugins/elementspath/lang/he.js8
-rw-r--r--sources/plugins/elementspath/lang/hi.js8
-rw-r--r--sources/plugins/elementspath/lang/hr.js8
-rw-r--r--sources/plugins/elementspath/lang/hu.js8
-rw-r--r--sources/plugins/elementspath/lang/is.js8
-rw-r--r--sources/plugins/elementspath/lang/it.js8
-rw-r--r--sources/plugins/elementspath/lang/ja.js8
-rw-r--r--sources/plugins/elementspath/lang/ka.js8
-rw-r--r--sources/plugins/elementspath/lang/km.js8
-rw-r--r--sources/plugins/elementspath/lang/ko.js8
-rw-r--r--sources/plugins/elementspath/lang/ku.js8
-rw-r--r--sources/plugins/elementspath/lang/lt.js8
-rw-r--r--sources/plugins/elementspath/lang/lv.js8
-rw-r--r--sources/plugins/elementspath/lang/mk.js8
-rw-r--r--sources/plugins/elementspath/lang/mn.js8
-rw-r--r--sources/plugins/elementspath/lang/ms.js8
-rw-r--r--sources/plugins/elementspath/lang/nb.js8
-rw-r--r--sources/plugins/elementspath/lang/nl.js8
-rw-r--r--sources/plugins/elementspath/lang/no.js8
-rw-r--r--sources/plugins/elementspath/lang/pl.js8
-rw-r--r--sources/plugins/elementspath/lang/pt-br.js8
-rw-r--r--sources/plugins/elementspath/lang/pt.js8
-rw-r--r--sources/plugins/elementspath/lang/ro.js8
-rw-r--r--sources/plugins/elementspath/lang/ru.js8
-rw-r--r--sources/plugins/elementspath/lang/si.js8
-rw-r--r--sources/plugins/elementspath/lang/sk.js8
-rw-r--r--sources/plugins/elementspath/lang/sl.js8
-rw-r--r--sources/plugins/elementspath/lang/sq.js8
-rw-r--r--sources/plugins/elementspath/lang/sr-latn.js8
-rw-r--r--sources/plugins/elementspath/lang/sr.js8
-rw-r--r--sources/plugins/elementspath/lang/sv.js8
-rw-r--r--sources/plugins/elementspath/lang/th.js8
-rw-r--r--sources/plugins/elementspath/lang/tr.js8
-rw-r--r--sources/plugins/elementspath/lang/tt.js8
-rw-r--r--sources/plugins/elementspath/lang/ug.js8
-rw-r--r--sources/plugins/elementspath/lang/uk.js8
-rw-r--r--sources/plugins/elementspath/lang/vi.js8
-rw-r--r--sources/plugins/elementspath/lang/zh-cn.js8
-rw-r--r--sources/plugins/elementspath/lang/zh.js8
-rw-r--r--sources/plugins/elementspath/plugin.js235
-rw-r--r--sources/plugins/enterkey/plugin.js566
-rw-r--r--sources/plugins/enterkey/samples/enterkey.html106
-rw-r--r--sources/plugins/entities/plugin.js239
-rw-r--r--sources/plugins/fakeobjects/lang/af.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ar.js11
-rw-r--r--sources/plugins/fakeobjects/lang/bg.js11
-rw-r--r--sources/plugins/fakeobjects/lang/bn.js11
-rw-r--r--sources/plugins/fakeobjects/lang/bs.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ca.js11
-rw-r--r--sources/plugins/fakeobjects/lang/cs.js11
-rw-r--r--sources/plugins/fakeobjects/lang/cy.js11
-rw-r--r--sources/plugins/fakeobjects/lang/da.js11
-rw-r--r--sources/plugins/fakeobjects/lang/de.js11
-rw-r--r--sources/plugins/fakeobjects/lang/el.js11
-rw-r--r--sources/plugins/fakeobjects/lang/en-au.js11
-rw-r--r--sources/plugins/fakeobjects/lang/en-ca.js11
-rw-r--r--sources/plugins/fakeobjects/lang/en-gb.js11
-rw-r--r--sources/plugins/fakeobjects/lang/en.js11
-rw-r--r--sources/plugins/fakeobjects/lang/eo.js11
-rw-r--r--sources/plugins/fakeobjects/lang/es.js11
-rw-r--r--sources/plugins/fakeobjects/lang/et.js11
-rw-r--r--sources/plugins/fakeobjects/lang/eu.js11
-rw-r--r--sources/plugins/fakeobjects/lang/fa.js11
-rw-r--r--sources/plugins/fakeobjects/lang/fi.js11
-rw-r--r--sources/plugins/fakeobjects/lang/fo.js11
-rw-r--r--sources/plugins/fakeobjects/lang/fr-ca.js11
-rw-r--r--sources/plugins/fakeobjects/lang/fr.js11
-rw-r--r--sources/plugins/fakeobjects/lang/gl.js11
-rw-r--r--sources/plugins/fakeobjects/lang/gu.js11
-rw-r--r--sources/plugins/fakeobjects/lang/he.js11
-rw-r--r--sources/plugins/fakeobjects/lang/hi.js11
-rw-r--r--sources/plugins/fakeobjects/lang/hr.js11
-rw-r--r--sources/plugins/fakeobjects/lang/hu.js11
-rw-r--r--sources/plugins/fakeobjects/lang/id.js11
-rw-r--r--sources/plugins/fakeobjects/lang/is.js11
-rw-r--r--sources/plugins/fakeobjects/lang/it.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ja.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ka.js11
-rw-r--r--sources/plugins/fakeobjects/lang/km.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ko.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ku.js11
-rw-r--r--sources/plugins/fakeobjects/lang/lt.js11
-rw-r--r--sources/plugins/fakeobjects/lang/lv.js11
-rw-r--r--sources/plugins/fakeobjects/lang/mk.js11
-rw-r--r--sources/plugins/fakeobjects/lang/mn.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ms.js11
-rw-r--r--sources/plugins/fakeobjects/lang/nb.js11
-rw-r--r--sources/plugins/fakeobjects/lang/nl.js11
-rw-r--r--sources/plugins/fakeobjects/lang/no.js11
-rw-r--r--sources/plugins/fakeobjects/lang/pl.js11
-rw-r--r--sources/plugins/fakeobjects/lang/pt-br.js11
-rw-r--r--sources/plugins/fakeobjects/lang/pt.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ro.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ru.js11
-rw-r--r--sources/plugins/fakeobjects/lang/si.js11
-rw-r--r--sources/plugins/fakeobjects/lang/sk.js11
-rw-r--r--sources/plugins/fakeobjects/lang/sl.js11
-rw-r--r--sources/plugins/fakeobjects/lang/sq.js11
-rw-r--r--sources/plugins/fakeobjects/lang/sr-latn.js11
-rw-r--r--sources/plugins/fakeobjects/lang/sr.js11
-rw-r--r--sources/plugins/fakeobjects/lang/sv.js11
-rw-r--r--sources/plugins/fakeobjects/lang/th.js11
-rw-r--r--sources/plugins/fakeobjects/lang/tr.js11
-rw-r--r--sources/plugins/fakeobjects/lang/tt.js11
-rw-r--r--sources/plugins/fakeobjects/lang/ug.js11
-rw-r--r--sources/plugins/fakeobjects/lang/uk.js11
-rw-r--r--sources/plugins/fakeobjects/lang/vi.js11
-rw-r--r--sources/plugins/fakeobjects/lang/zh-cn.js11
-rw-r--r--sources/plugins/fakeobjects/lang/zh.js11
-rw-r--r--sources/plugins/fakeobjects/plugin.js183
-rw-r--r--sources/plugins/filebrowser/plugin.js573
-rw-r--r--sources/plugins/find/dialogs/find.js802
-rw-r--r--sources/plugins/find/icons/find-rtl.pngbin0 -> 980 bytes
-rw-r--r--sources/plugins/find/icons/find.pngbin0 -> 980 bytes
-rw-r--r--sources/plugins/find/icons/hidpi/find-rtl.pngbin0 -> 2417 bytes
-rw-r--r--sources/plugins/find/icons/hidpi/find.pngbin0 -> 2417 bytes
-rw-r--r--sources/plugins/find/icons/hidpi/replace.pngbin0 -> 2761 bytes
-rw-r--r--sources/plugins/find/icons/replace.pngbin0 -> 948 bytes
-rw-r--r--sources/plugins/find/lang/af.js18
-rw-r--r--sources/plugins/find/lang/ar.js18
-rw-r--r--sources/plugins/find/lang/bg.js18
-rw-r--r--sources/plugins/find/lang/bn.js18
-rw-r--r--sources/plugins/find/lang/bs.js18
-rw-r--r--sources/plugins/find/lang/ca.js18
-rw-r--r--sources/plugins/find/lang/cs.js18
-rw-r--r--sources/plugins/find/lang/cy.js18
-rw-r--r--sources/plugins/find/lang/da.js18
-rw-r--r--sources/plugins/find/lang/de.js18
-rw-r--r--sources/plugins/find/lang/el.js18
-rw-r--r--sources/plugins/find/lang/en-au.js18
-rw-r--r--sources/plugins/find/lang/en-ca.js18
-rw-r--r--sources/plugins/find/lang/en-gb.js18
-rw-r--r--sources/plugins/find/lang/en.js18
-rw-r--r--sources/plugins/find/lang/eo.js18
-rw-r--r--sources/plugins/find/lang/es.js18
-rw-r--r--sources/plugins/find/lang/et.js18
-rw-r--r--sources/plugins/find/lang/eu.js18
-rw-r--r--sources/plugins/find/lang/fa.js18
-rw-r--r--sources/plugins/find/lang/fi.js18
-rw-r--r--sources/plugins/find/lang/fo.js18
-rw-r--r--sources/plugins/find/lang/fr-ca.js18
-rw-r--r--sources/plugins/find/lang/fr.js18
-rw-r--r--sources/plugins/find/lang/gl.js18
-rw-r--r--sources/plugins/find/lang/gu.js18
-rw-r--r--sources/plugins/find/lang/he.js18
-rw-r--r--sources/plugins/find/lang/hi.js18
-rw-r--r--sources/plugins/find/lang/hr.js18
-rw-r--r--sources/plugins/find/lang/hu.js18
-rw-r--r--sources/plugins/find/lang/id.js18
-rw-r--r--sources/plugins/find/lang/is.js18
-rw-r--r--sources/plugins/find/lang/it.js18
-rw-r--r--sources/plugins/find/lang/ja.js18
-rw-r--r--sources/plugins/find/lang/ka.js18
-rw-r--r--sources/plugins/find/lang/km.js18
-rw-r--r--sources/plugins/find/lang/ko.js18
-rw-r--r--sources/plugins/find/lang/ku.js18
-rw-r--r--sources/plugins/find/lang/lt.js18
-rw-r--r--sources/plugins/find/lang/lv.js18
-rw-r--r--sources/plugins/find/lang/mk.js18
-rw-r--r--sources/plugins/find/lang/mn.js18
-rw-r--r--sources/plugins/find/lang/ms.js18
-rw-r--r--sources/plugins/find/lang/nb.js18
-rw-r--r--sources/plugins/find/lang/nl.js18
-rw-r--r--sources/plugins/find/lang/no.js18
-rw-r--r--sources/plugins/find/lang/pl.js18
-rw-r--r--sources/plugins/find/lang/pt-br.js18
-rw-r--r--sources/plugins/find/lang/pt.js18
-rw-r--r--sources/plugins/find/lang/ro.js18
-rw-r--r--sources/plugins/find/lang/ru.js18
-rw-r--r--sources/plugins/find/lang/si.js18
-rw-r--r--sources/plugins/find/lang/sk.js18
-rw-r--r--sources/plugins/find/lang/sl.js18
-rw-r--r--sources/plugins/find/lang/sq.js18
-rw-r--r--sources/plugins/find/lang/sr-latn.js18
-rw-r--r--sources/plugins/find/lang/sr.js18
-rw-r--r--sources/plugins/find/lang/sv.js18
-rw-r--r--sources/plugins/find/lang/th.js18
-rw-r--r--sources/plugins/find/lang/tr.js18
-rw-r--r--sources/plugins/find/lang/tt.js18
-rw-r--r--sources/plugins/find/lang/ug.js18
-rw-r--r--sources/plugins/find/lang/uk.js18
-rw-r--r--sources/plugins/find/lang/vi.js18
-rw-r--r--sources/plugins/find/lang/zh-cn.js18
-rw-r--r--sources/plugins/find/lang/zh.js18
-rw-r--r--sources/plugins/find/plugin.js52
-rw-r--r--sources/plugins/flash/dialogs/flash.js647
-rw-r--r--sources/plugins/flash/icons/flash.pngbin0 -> 1038 bytes
-rw-r--r--sources/plugins/flash/icons/hidpi/flash.pngbin0 -> 2532 bytes
-rw-r--r--sources/plugins/flash/images/placeholder.pngbin0 -> 256 bytes
-rw-r--r--sources/plugins/flash/lang/af.js43
-rw-r--r--sources/plugins/flash/lang/ar.js43
-rw-r--r--sources/plugins/flash/lang/bg.js43
-rw-r--r--sources/plugins/flash/lang/bn.js43
-rw-r--r--sources/plugins/flash/lang/bs.js43
-rw-r--r--sources/plugins/flash/lang/ca.js43
-rw-r--r--sources/plugins/flash/lang/cs.js43
-rw-r--r--sources/plugins/flash/lang/cy.js43
-rw-r--r--sources/plugins/flash/lang/da.js43
-rw-r--r--sources/plugins/flash/lang/de.js43
-rw-r--r--sources/plugins/flash/lang/el.js43
-rw-r--r--sources/plugins/flash/lang/en-au.js43
-rw-r--r--sources/plugins/flash/lang/en-ca.js43
-rw-r--r--sources/plugins/flash/lang/en-gb.js43
-rw-r--r--sources/plugins/flash/lang/en.js43
-rw-r--r--sources/plugins/flash/lang/eo.js43
-rw-r--r--sources/plugins/flash/lang/es.js43
-rw-r--r--sources/plugins/flash/lang/et.js43
-rw-r--r--sources/plugins/flash/lang/eu.js43
-rw-r--r--sources/plugins/flash/lang/fa.js43
-rw-r--r--sources/plugins/flash/lang/fi.js43
-rw-r--r--sources/plugins/flash/lang/fo.js43
-rw-r--r--sources/plugins/flash/lang/fr-ca.js43
-rw-r--r--sources/plugins/flash/lang/fr.js43
-rw-r--r--sources/plugins/flash/lang/gl.js43
-rw-r--r--sources/plugins/flash/lang/gu.js43
-rw-r--r--sources/plugins/flash/lang/he.js43
-rw-r--r--sources/plugins/flash/lang/hi.js43
-rw-r--r--sources/plugins/flash/lang/hr.js43
-rw-r--r--sources/plugins/flash/lang/hu.js43
-rw-r--r--sources/plugins/flash/lang/id.js43
-rw-r--r--sources/plugins/flash/lang/is.js43
-rw-r--r--sources/plugins/flash/lang/it.js43
-rw-r--r--sources/plugins/flash/lang/ja.js43
-rw-r--r--sources/plugins/flash/lang/ka.js43
-rw-r--r--sources/plugins/flash/lang/km.js43
-rw-r--r--sources/plugins/flash/lang/ko.js43
-rw-r--r--sources/plugins/flash/lang/ku.js43
-rw-r--r--sources/plugins/flash/lang/lt.js43
-rw-r--r--sources/plugins/flash/lang/lv.js43
-rw-r--r--sources/plugins/flash/lang/mk.js43
-rw-r--r--sources/plugins/flash/lang/mn.js43
-rw-r--r--sources/plugins/flash/lang/ms.js43
-rw-r--r--sources/plugins/flash/lang/nb.js43
-rw-r--r--sources/plugins/flash/lang/nl.js43
-rw-r--r--sources/plugins/flash/lang/no.js43
-rw-r--r--sources/plugins/flash/lang/pl.js43
-rw-r--r--sources/plugins/flash/lang/pt-br.js43
-rw-r--r--sources/plugins/flash/lang/pt.js43
-rw-r--r--sources/plugins/flash/lang/ro.js43
-rw-r--r--sources/plugins/flash/lang/ru.js43
-rw-r--r--sources/plugins/flash/lang/si.js43
-rw-r--r--sources/plugins/flash/lang/sk.js43
-rw-r--r--sources/plugins/flash/lang/sl.js43
-rw-r--r--sources/plugins/flash/lang/sq.js43
-rw-r--r--sources/plugins/flash/lang/sr-latn.js43
-rw-r--r--sources/plugins/flash/lang/sr.js43
-rw-r--r--sources/plugins/flash/lang/sv.js43
-rw-r--r--sources/plugins/flash/lang/th.js43
-rw-r--r--sources/plugins/flash/lang/tr.js43
-rw-r--r--sources/plugins/flash/lang/tt.js43
-rw-r--r--sources/plugins/flash/lang/ug.js43
-rw-r--r--sources/plugins/flash/lang/uk.js43
-rw-r--r--sources/plugins/flash/lang/vi.js43
-rw-r--r--sources/plugins/flash/lang/zh-cn.js43
-rw-r--r--sources/plugins/flash/lang/zh.js43
-rw-r--r--sources/plugins/flash/plugin.js151
-rw-r--r--sources/plugins/floatingspace/plugin.js406
-rw-r--r--sources/plugins/floatpanel/plugin.js598
-rw-r--r--sources/plugins/font/lang/af.js14
-rw-r--r--sources/plugins/font/lang/ar.js14
-rw-r--r--sources/plugins/font/lang/bg.js14
-rw-r--r--sources/plugins/font/lang/bn.js14
-rw-r--r--sources/plugins/font/lang/bs.js14
-rw-r--r--sources/plugins/font/lang/ca.js14
-rw-r--r--sources/plugins/font/lang/cs.js14
-rw-r--r--sources/plugins/font/lang/cy.js14
-rw-r--r--sources/plugins/font/lang/da.js14
-rw-r--r--sources/plugins/font/lang/de.js14
-rw-r--r--sources/plugins/font/lang/el.js14
-rw-r--r--sources/plugins/font/lang/en-au.js14
-rw-r--r--sources/plugins/font/lang/en-ca.js14
-rw-r--r--sources/plugins/font/lang/en-gb.js14
-rw-r--r--sources/plugins/font/lang/en.js14
-rw-r--r--sources/plugins/font/lang/eo.js14
-rw-r--r--sources/plugins/font/lang/es.js14
-rw-r--r--sources/plugins/font/lang/et.js14
-rw-r--r--sources/plugins/font/lang/eu.js14
-rw-r--r--sources/plugins/font/lang/fa.js14
-rw-r--r--sources/plugins/font/lang/fi.js14
-rw-r--r--sources/plugins/font/lang/fo.js14
-rw-r--r--sources/plugins/font/lang/fr-ca.js14
-rw-r--r--sources/plugins/font/lang/fr.js14
-rw-r--r--sources/plugins/font/lang/gl.js14
-rw-r--r--sources/plugins/font/lang/gu.js14
-rw-r--r--sources/plugins/font/lang/he.js14
-rw-r--r--sources/plugins/font/lang/hi.js14
-rw-r--r--sources/plugins/font/lang/hr.js14
-rw-r--r--sources/plugins/font/lang/hu.js14
-rw-r--r--sources/plugins/font/lang/id.js14
-rw-r--r--sources/plugins/font/lang/is.js14
-rw-r--r--sources/plugins/font/lang/it.js14
-rw-r--r--sources/plugins/font/lang/ja.js14
-rw-r--r--sources/plugins/font/lang/ka.js14
-rw-r--r--sources/plugins/font/lang/km.js14
-rw-r--r--sources/plugins/font/lang/ko.js14
-rw-r--r--sources/plugins/font/lang/ku.js14
-rw-r--r--sources/plugins/font/lang/lt.js14
-rw-r--r--sources/plugins/font/lang/lv.js14
-rw-r--r--sources/plugins/font/lang/mk.js14
-rw-r--r--sources/plugins/font/lang/mn.js14
-rw-r--r--sources/plugins/font/lang/ms.js14
-rw-r--r--sources/plugins/font/lang/nb.js14
-rw-r--r--sources/plugins/font/lang/nl.js14
-rw-r--r--sources/plugins/font/lang/no.js14
-rw-r--r--sources/plugins/font/lang/pl.js14
-rw-r--r--sources/plugins/font/lang/pt-br.js14
-rw-r--r--sources/plugins/font/lang/pt.js14
-rw-r--r--sources/plugins/font/lang/ro.js14
-rw-r--r--sources/plugins/font/lang/ru.js14
-rw-r--r--sources/plugins/font/lang/si.js14
-rw-r--r--sources/plugins/font/lang/sk.js14
-rw-r--r--sources/plugins/font/lang/sl.js14
-rw-r--r--sources/plugins/font/lang/sq.js14
-rw-r--r--sources/plugins/font/lang/sr-latn.js14
-rw-r--r--sources/plugins/font/lang/sr.js14
-rw-r--r--sources/plugins/font/lang/sv.js14
-rw-r--r--sources/plugins/font/lang/th.js14
-rw-r--r--sources/plugins/font/lang/tr.js14
-rw-r--r--sources/plugins/font/lang/tt.js14
-rw-r--r--sources/plugins/font/lang/ug.js14
-rw-r--r--sources/plugins/font/lang/uk.js14
-rw-r--r--sources/plugins/font/lang/vi.js14
-rw-r--r--sources/plugins/font/lang/zh-cn.js14
-rw-r--r--sources/plugins/font/lang/zh.js14
-rw-r--r--sources/plugins/font/plugin.js313
-rw-r--r--sources/plugins/format/lang/af.js18
-rw-r--r--sources/plugins/format/lang/ar.js18
-rw-r--r--sources/plugins/format/lang/bg.js18
-rw-r--r--sources/plugins/format/lang/bn.js18
-rw-r--r--sources/plugins/format/lang/bs.js18
-rw-r--r--sources/plugins/format/lang/ca.js18
-rw-r--r--sources/plugins/format/lang/cs.js18
-rw-r--r--sources/plugins/format/lang/cy.js18
-rw-r--r--sources/plugins/format/lang/da.js18
-rw-r--r--sources/plugins/format/lang/de.js18
-rw-r--r--sources/plugins/format/lang/el.js18
-rw-r--r--sources/plugins/format/lang/en-au.js18
-rw-r--r--sources/plugins/format/lang/en-ca.js18
-rw-r--r--sources/plugins/format/lang/en-gb.js18
-rw-r--r--sources/plugins/format/lang/en.js18
-rw-r--r--sources/plugins/format/lang/eo.js18
-rw-r--r--sources/plugins/format/lang/es.js18
-rw-r--r--sources/plugins/format/lang/et.js18
-rw-r--r--sources/plugins/format/lang/eu.js18
-rw-r--r--sources/plugins/format/lang/fa.js18
-rw-r--r--sources/plugins/format/lang/fi.js18
-rw-r--r--sources/plugins/format/lang/fo.js18
-rw-r--r--sources/plugins/format/lang/fr-ca.js18
-rw-r--r--sources/plugins/format/lang/fr.js18
-rw-r--r--sources/plugins/format/lang/gl.js18
-rw-r--r--sources/plugins/format/lang/gu.js18
-rw-r--r--sources/plugins/format/lang/he.js18
-rw-r--r--sources/plugins/format/lang/hi.js18
-rw-r--r--sources/plugins/format/lang/hr.js18
-rw-r--r--sources/plugins/format/lang/hu.js18
-rw-r--r--sources/plugins/format/lang/id.js18
-rw-r--r--sources/plugins/format/lang/is.js18
-rw-r--r--sources/plugins/format/lang/it.js18
-rw-r--r--sources/plugins/format/lang/ja.js18
-rw-r--r--sources/plugins/format/lang/ka.js18
-rw-r--r--sources/plugins/format/lang/km.js18
-rw-r--r--sources/plugins/format/lang/ko.js18
-rw-r--r--sources/plugins/format/lang/ku.js18
-rw-r--r--sources/plugins/format/lang/lt.js18
-rw-r--r--sources/plugins/format/lang/lv.js18
-rw-r--r--sources/plugins/format/lang/mk.js18
-rw-r--r--sources/plugins/format/lang/mn.js18
-rw-r--r--sources/plugins/format/lang/ms.js18
-rw-r--r--sources/plugins/format/lang/nb.js18
-rw-r--r--sources/plugins/format/lang/nl.js18
-rw-r--r--sources/plugins/format/lang/no.js18
-rw-r--r--sources/plugins/format/lang/pl.js18
-rw-r--r--sources/plugins/format/lang/pt-br.js18
-rw-r--r--sources/plugins/format/lang/pt.js18
-rw-r--r--sources/plugins/format/lang/ro.js18
-rw-r--r--sources/plugins/format/lang/ru.js18
-rw-r--r--sources/plugins/format/lang/si.js18
-rw-r--r--sources/plugins/format/lang/sk.js18
-rw-r--r--sources/plugins/format/lang/sl.js18
-rw-r--r--sources/plugins/format/lang/sq.js18
-rw-r--r--sources/plugins/format/lang/sr-latn.js18
-rw-r--r--sources/plugins/format/lang/sr.js18
-rw-r--r--sources/plugins/format/lang/sv.js18
-rw-r--r--sources/plugins/format/lang/th.js18
-rw-r--r--sources/plugins/format/lang/tr.js18
-rw-r--r--sources/plugins/format/lang/tt.js18
-rw-r--r--sources/plugins/format/lang/ug.js18
-rw-r--r--sources/plugins/format/lang/uk.js18
-rw-r--r--sources/plugins/format/lang/vi.js18
-rw-r--r--sources/plugins/format/lang/zh-cn.js18
-rw-r--r--sources/plugins/format/lang/zh.js18
-rw-r--r--sources/plugins/format/plugin.js279
-rw-r--r--sources/plugins/forms/dialogs/button.js100
-rw-r--r--sources/plugins/forms/dialogs/checkbox.js146
-rw-r--r--sources/plugins/forms/dialogs/form.js145
-rw-r--r--sources/plugins/forms/dialogs/hiddenfield.js83
-rw-r--r--sources/plugins/forms/dialogs/radio.js129
-rw-r--r--sources/plugins/forms/dialogs/select.js505
-rw-r--r--sources/plugins/forms/dialogs/textarea.js128
-rw-r--r--sources/plugins/forms/dialogs/textfield.js193
-rw-r--r--sources/plugins/forms/icons/button.pngbin0 -> 528 bytes
-rw-r--r--sources/plugins/forms/icons/checkbox.pngbin0 -> 756 bytes
-rw-r--r--sources/plugins/forms/icons/form.pngbin0 -> 590 bytes
-rw-r--r--sources/plugins/forms/icons/hiddenfield.pngbin0 -> 239 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/button.pngbin0 -> 933 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/checkbox.pngbin0 -> 1780 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/form.pngbin0 -> 1348 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/hiddenfield.pngbin0 -> 2166 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/imagebutton.pngbin0 -> 1398 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/radio.pngbin0 -> 2435 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/select-rtl.pngbin0 -> 1451 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/select.pngbin0 -> 1452 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/textarea-rtl.pngbin0 -> 1732 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/textarea.pngbin0 -> 1680 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/textfield-rtl.pngbin0 -> 1324 bytes
-rw-r--r--sources/plugins/forms/icons/hidpi/textfield.pngbin0 -> 1324 bytes
-rw-r--r--sources/plugins/forms/icons/imagebutton.pngbin0 -> 680 bytes
-rw-r--r--sources/plugins/forms/icons/radio.pngbin0 -> 874 bytes
-rw-r--r--sources/plugins/forms/icons/select-rtl.pngbin0 -> 617 bytes
-rw-r--r--sources/plugins/forms/icons/select.pngbin0 -> 616 bytes
-rw-r--r--sources/plugins/forms/icons/textarea-rtl.pngbin0 -> 706 bytes
-rw-r--r--sources/plugins/forms/icons/textarea.pngbin0 -> 677 bytes
-rw-r--r--sources/plugins/forms/icons/textfield-rtl.pngbin0 -> 588 bytes
-rw-r--r--sources/plugins/forms/icons/textfield.pngbin0 -> 588 bytes
-rw-r--r--sources/plugins/forms/images/hiddenfield.gifbin0 -> 178 bytes
-rw-r--r--sources/plugins/forms/lang/af.js71
-rw-r--r--sources/plugins/forms/lang/ar.js71
-rw-r--r--sources/plugins/forms/lang/bg.js71
-rw-r--r--sources/plugins/forms/lang/bn.js71
-rw-r--r--sources/plugins/forms/lang/bs.js71
-rw-r--r--sources/plugins/forms/lang/ca.js71
-rw-r--r--sources/plugins/forms/lang/cs.js71
-rw-r--r--sources/plugins/forms/lang/cy.js71
-rw-r--r--sources/plugins/forms/lang/da.js71
-rw-r--r--sources/plugins/forms/lang/de.js71
-rw-r--r--sources/plugins/forms/lang/el.js71
-rw-r--r--sources/plugins/forms/lang/en-au.js71
-rw-r--r--sources/plugins/forms/lang/en-ca.js71
-rw-r--r--sources/plugins/forms/lang/en-gb.js71
-rw-r--r--sources/plugins/forms/lang/en.js71
-rw-r--r--sources/plugins/forms/lang/eo.js71
-rw-r--r--sources/plugins/forms/lang/es.js71
-rw-r--r--sources/plugins/forms/lang/et.js71
-rw-r--r--sources/plugins/forms/lang/eu.js71
-rw-r--r--sources/plugins/forms/lang/fa.js71
-rw-r--r--sources/plugins/forms/lang/fi.js71
-rw-r--r--sources/plugins/forms/lang/fo.js71
-rw-r--r--sources/plugins/forms/lang/fr-ca.js71
-rw-r--r--sources/plugins/forms/lang/fr.js71
-rw-r--r--sources/plugins/forms/lang/gl.js71
-rw-r--r--sources/plugins/forms/lang/gu.js71
-rw-r--r--sources/plugins/forms/lang/he.js71
-rw-r--r--sources/plugins/forms/lang/hi.js71
-rw-r--r--sources/plugins/forms/lang/hr.js71
-rw-r--r--sources/plugins/forms/lang/hu.js71
-rw-r--r--sources/plugins/forms/lang/id.js71
-rw-r--r--sources/plugins/forms/lang/is.js71
-rw-r--r--sources/plugins/forms/lang/it.js71
-rw-r--r--sources/plugins/forms/lang/ja.js71
-rw-r--r--sources/plugins/forms/lang/ka.js71
-rw-r--r--sources/plugins/forms/lang/km.js71
-rw-r--r--sources/plugins/forms/lang/ko.js71
-rw-r--r--sources/plugins/forms/lang/ku.js71
-rw-r--r--sources/plugins/forms/lang/lt.js71
-rw-r--r--sources/plugins/forms/lang/lv.js71
-rw-r--r--sources/plugins/forms/lang/mk.js71
-rw-r--r--sources/plugins/forms/lang/mn.js71
-rw-r--r--sources/plugins/forms/lang/ms.js71
-rw-r--r--sources/plugins/forms/lang/nb.js71
-rw-r--r--sources/plugins/forms/lang/nl.js71
-rw-r--r--sources/plugins/forms/lang/no.js71
-rw-r--r--sources/plugins/forms/lang/pl.js71
-rw-r--r--sources/plugins/forms/lang/pt-br.js71
-rw-r--r--sources/plugins/forms/lang/pt.js71
-rw-r--r--sources/plugins/forms/lang/ro.js71
-rw-r--r--sources/plugins/forms/lang/ru.js71
-rw-r--r--sources/plugins/forms/lang/si.js71
-rw-r--r--sources/plugins/forms/lang/sk.js71
-rw-r--r--sources/plugins/forms/lang/sl.js71
-rw-r--r--sources/plugins/forms/lang/sq.js71
-rw-r--r--sources/plugins/forms/lang/sr-latn.js71
-rw-r--r--sources/plugins/forms/lang/sr.js71
-rw-r--r--sources/plugins/forms/lang/sv.js71
-rw-r--r--sources/plugins/forms/lang/th.js71
-rw-r--r--sources/plugins/forms/lang/tr.js71
-rw-r--r--sources/plugins/forms/lang/tt.js71
-rw-r--r--sources/plugins/forms/lang/ug.js71
-rw-r--r--sources/plugins/forms/lang/uk.js71
-rw-r--r--sources/plugins/forms/lang/vi.js71
-rw-r--r--sources/plugins/forms/lang/zh-cn.js71
-rw-r--r--sources/plugins/forms/lang/zh.js71
-rw-r--r--sources/plugins/forms/plugin.js279
-rw-r--r--sources/plugins/horizontalrule/icons/hidpi/horizontalrule.pngbin0 -> 939 bytes
-rw-r--r--sources/plugins/horizontalrule/icons/horizontalrule.pngbin0 -> 519 bytes
-rw-r--r--sources/plugins/horizontalrule/lang/af.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ar.js7
-rw-r--r--sources/plugins/horizontalrule/lang/bg.js7
-rw-r--r--sources/plugins/horizontalrule/lang/bn.js7
-rw-r--r--sources/plugins/horizontalrule/lang/bs.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ca.js7
-rw-r--r--sources/plugins/horizontalrule/lang/cs.js7
-rw-r--r--sources/plugins/horizontalrule/lang/cy.js7
-rw-r--r--sources/plugins/horizontalrule/lang/da.js7
-rw-r--r--sources/plugins/horizontalrule/lang/de.js7
-rw-r--r--sources/plugins/horizontalrule/lang/el.js7
-rw-r--r--sources/plugins/horizontalrule/lang/en-au.js7
-rw-r--r--sources/plugins/horizontalrule/lang/en-ca.js7
-rw-r--r--sources/plugins/horizontalrule/lang/en-gb.js7
-rw-r--r--sources/plugins/horizontalrule/lang/en.js7
-rw-r--r--sources/plugins/horizontalrule/lang/eo.js7
-rw-r--r--sources/plugins/horizontalrule/lang/es.js7
-rw-r--r--sources/plugins/horizontalrule/lang/et.js7
-rw-r--r--sources/plugins/horizontalrule/lang/eu.js7
-rw-r--r--sources/plugins/horizontalrule/lang/fa.js7
-rw-r--r--sources/plugins/horizontalrule/lang/fi.js7
-rw-r--r--sources/plugins/horizontalrule/lang/fo.js7
-rw-r--r--sources/plugins/horizontalrule/lang/fr-ca.js7
-rw-r--r--sources/plugins/horizontalrule/lang/fr.js7
-rw-r--r--sources/plugins/horizontalrule/lang/gl.js7
-rw-r--r--sources/plugins/horizontalrule/lang/gu.js7
-rw-r--r--sources/plugins/horizontalrule/lang/he.js7
-rw-r--r--sources/plugins/horizontalrule/lang/hi.js7
-rw-r--r--sources/plugins/horizontalrule/lang/hr.js7
-rw-r--r--sources/plugins/horizontalrule/lang/hu.js7
-rw-r--r--sources/plugins/horizontalrule/lang/id.js7
-rw-r--r--sources/plugins/horizontalrule/lang/is.js7
-rw-r--r--sources/plugins/horizontalrule/lang/it.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ja.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ka.js7
-rw-r--r--sources/plugins/horizontalrule/lang/km.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ko.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ku.js7
-rw-r--r--sources/plugins/horizontalrule/lang/lt.js7
-rw-r--r--sources/plugins/horizontalrule/lang/lv.js7
-rw-r--r--sources/plugins/horizontalrule/lang/mk.js7
-rw-r--r--sources/plugins/horizontalrule/lang/mn.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ms.js7
-rw-r--r--sources/plugins/horizontalrule/lang/nb.js7
-rw-r--r--sources/plugins/horizontalrule/lang/nl.js7
-rw-r--r--sources/plugins/horizontalrule/lang/no.js7
-rw-r--r--sources/plugins/horizontalrule/lang/pl.js7
-rw-r--r--sources/plugins/horizontalrule/lang/pt-br.js7
-rw-r--r--sources/plugins/horizontalrule/lang/pt.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ro.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ru.js7
-rw-r--r--sources/plugins/horizontalrule/lang/si.js7
-rw-r--r--sources/plugins/horizontalrule/lang/sk.js7
-rw-r--r--sources/plugins/horizontalrule/lang/sl.js7
-rw-r--r--sources/plugins/horizontalrule/lang/sq.js7
-rw-r--r--sources/plugins/horizontalrule/lang/sr-latn.js7
-rw-r--r--sources/plugins/horizontalrule/lang/sr.js7
-rw-r--r--sources/plugins/horizontalrule/lang/sv.js7
-rw-r--r--sources/plugins/horizontalrule/lang/th.js7
-rw-r--r--sources/plugins/horizontalrule/lang/tr.js7
-rw-r--r--sources/plugins/horizontalrule/lang/tt.js7
-rw-r--r--sources/plugins/horizontalrule/lang/ug.js7
-rw-r--r--sources/plugins/horizontalrule/lang/uk.js7
-rw-r--r--sources/plugins/horizontalrule/lang/vi.js7
-rw-r--r--sources/plugins/horizontalrule/lang/zh-cn.js7
-rw-r--r--sources/plugins/horizontalrule/lang/zh.js7
-rw-r--r--sources/plugins/horizontalrule/plugin.js43
-rw-r--r--sources/plugins/htmlwriter/plugin.js359
-rw-r--r--sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.flabin0 -> 85504 bytes
-rw-r--r--sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.swfbin0 -> 15571 bytes
-rw-r--r--sources/plugins/htmlwriter/samples/assets/outputforflash/swfobject.js5
-rw-r--r--sources/plugins/htmlwriter/samples/outputforflash.html283
-rw-r--r--sources/plugins/htmlwriter/samples/outputhtml.html224
-rw-r--r--sources/plugins/iframe/dialogs/iframe.js207
-rw-r--r--sources/plugins/iframe/icons/hidpi/iframe.pngbin0 -> 3091 bytes
-rw-r--r--sources/plugins/iframe/icons/iframe.pngbin0 -> 989 bytes
-rw-r--r--sources/plugins/iframe/images/placeholder.pngbin0 -> 265 bytes
-rw-r--r--sources/plugins/iframe/lang/af.js11
-rw-r--r--sources/plugins/iframe/lang/ar.js11
-rw-r--r--sources/plugins/iframe/lang/bg.js11
-rw-r--r--sources/plugins/iframe/lang/bn.js11
-rw-r--r--sources/plugins/iframe/lang/bs.js11
-rw-r--r--sources/plugins/iframe/lang/ca.js11
-rw-r--r--sources/plugins/iframe/lang/cs.js11
-rw-r--r--sources/plugins/iframe/lang/cy.js11
-rw-r--r--sources/plugins/iframe/lang/da.js11
-rw-r--r--sources/plugins/iframe/lang/de.js11
-rw-r--r--sources/plugins/iframe/lang/el.js11
-rw-r--r--sources/plugins/iframe/lang/en-au.js11
-rw-r--r--sources/plugins/iframe/lang/en-ca.js11
-rw-r--r--sources/plugins/iframe/lang/en-gb.js11
-rw-r--r--sources/plugins/iframe/lang/en.js11
-rw-r--r--sources/plugins/iframe/lang/eo.js11
-rw-r--r--sources/plugins/iframe/lang/es.js11
-rw-r--r--sources/plugins/iframe/lang/et.js11
-rw-r--r--sources/plugins/iframe/lang/eu.js11
-rw-r--r--sources/plugins/iframe/lang/fa.js11
-rw-r--r--sources/plugins/iframe/lang/fi.js11
-rw-r--r--sources/plugins/iframe/lang/fo.js11
-rw-r--r--sources/plugins/iframe/lang/fr-ca.js11
-rw-r--r--sources/plugins/iframe/lang/fr.js11
-rw-r--r--sources/plugins/iframe/lang/gl.js11
-rw-r--r--sources/plugins/iframe/lang/gu.js11
-rw-r--r--sources/plugins/iframe/lang/he.js11
-rw-r--r--sources/plugins/iframe/lang/hi.js11
-rw-r--r--sources/plugins/iframe/lang/hr.js11
-rw-r--r--sources/plugins/iframe/lang/hu.js11
-rw-r--r--sources/plugins/iframe/lang/id.js11
-rw-r--r--sources/plugins/iframe/lang/is.js11
-rw-r--r--sources/plugins/iframe/lang/it.js11
-rw-r--r--sources/plugins/iframe/lang/ja.js11
-rw-r--r--sources/plugins/iframe/lang/ka.js11
-rw-r--r--sources/plugins/iframe/lang/km.js11
-rw-r--r--sources/plugins/iframe/lang/ko.js11
-rw-r--r--sources/plugins/iframe/lang/ku.js11
-rw-r--r--sources/plugins/iframe/lang/lt.js11
-rw-r--r--sources/plugins/iframe/lang/lv.js11
-rw-r--r--sources/plugins/iframe/lang/mk.js11
-rw-r--r--sources/plugins/iframe/lang/mn.js11
-rw-r--r--sources/plugins/iframe/lang/ms.js11
-rw-r--r--sources/plugins/iframe/lang/nb.js11
-rw-r--r--sources/plugins/iframe/lang/nl.js11
-rw-r--r--sources/plugins/iframe/lang/no.js11
-rw-r--r--sources/plugins/iframe/lang/pl.js11
-rw-r--r--sources/plugins/iframe/lang/pt-br.js11
-rw-r--r--sources/plugins/iframe/lang/pt.js11
-rw-r--r--sources/plugins/iframe/lang/ro.js11
-rw-r--r--sources/plugins/iframe/lang/ru.js11
-rw-r--r--sources/plugins/iframe/lang/si.js11
-rw-r--r--sources/plugins/iframe/lang/sk.js11
-rw-r--r--sources/plugins/iframe/lang/sl.js11
-rw-r--r--sources/plugins/iframe/lang/sq.js11
-rw-r--r--sources/plugins/iframe/lang/sr-latn.js11
-rw-r--r--sources/plugins/iframe/lang/sr.js11
-rw-r--r--sources/plugins/iframe/lang/sv.js11
-rw-r--r--sources/plugins/iframe/lang/th.js11
-rw-r--r--sources/plugins/iframe/lang/tr.js11
-rw-r--r--sources/plugins/iframe/lang/tt.js11
-rw-r--r--sources/plugins/iframe/lang/ug.js11
-rw-r--r--sources/plugins/iframe/lang/uk.js11
-rw-r--r--sources/plugins/iframe/lang/vi.js11
-rw-r--r--sources/plugins/iframe/lang/zh-cn.js11
-rw-r--r--sources/plugins/iframe/lang/zh.js11
-rw-r--r--sources/plugins/iframe/plugin.js85
-rw-r--r--sources/plugins/image/dialogs/image.js1251
-rw-r--r--sources/plugins/image/icons/hidpi/image.pngbin0 -> 1745 bytes
-rw-r--r--sources/plugins/image/icons/image.pngbin0 -> 756 bytes
-rw-r--r--sources/plugins/image/images/noimage.pngbin0 -> 1610 bytes
-rw-r--r--sources/plugins/image/lang/af.js25
-rw-r--r--sources/plugins/image/lang/ar.js25
-rw-r--r--sources/plugins/image/lang/bg.js25
-rw-r--r--sources/plugins/image/lang/bn.js25
-rw-r--r--sources/plugins/image/lang/bs.js25
-rw-r--r--sources/plugins/image/lang/ca.js25
-rw-r--r--sources/plugins/image/lang/cs.js25
-rw-r--r--sources/plugins/image/lang/cy.js25
-rw-r--r--sources/plugins/image/lang/da.js25
-rw-r--r--sources/plugins/image/lang/de.js25
-rw-r--r--sources/plugins/image/lang/el.js25
-rw-r--r--sources/plugins/image/lang/en-au.js25
-rw-r--r--sources/plugins/image/lang/en-ca.js25
-rw-r--r--sources/plugins/image/lang/en-gb.js25
-rw-r--r--sources/plugins/image/lang/en.js25
-rw-r--r--sources/plugins/image/lang/eo.js25
-rw-r--r--sources/plugins/image/lang/es.js25
-rw-r--r--sources/plugins/image/lang/et.js25
-rw-r--r--sources/plugins/image/lang/eu.js25
-rw-r--r--sources/plugins/image/lang/fa.js25
-rw-r--r--sources/plugins/image/lang/fi.js25
-rw-r--r--sources/plugins/image/lang/fo.js25
-rw-r--r--sources/plugins/image/lang/fr-ca.js25
-rw-r--r--sources/plugins/image/lang/fr.js25
-rw-r--r--sources/plugins/image/lang/gl.js25
-rw-r--r--sources/plugins/image/lang/gu.js25
-rw-r--r--sources/plugins/image/lang/he.js25
-rw-r--r--sources/plugins/image/lang/hi.js25
-rw-r--r--sources/plugins/image/lang/hr.js25
-rw-r--r--sources/plugins/image/lang/hu.js25
-rw-r--r--sources/plugins/image/lang/id.js25
-rw-r--r--sources/plugins/image/lang/is.js25
-rw-r--r--sources/plugins/image/lang/it.js25
-rw-r--r--sources/plugins/image/lang/ja.js25
-rw-r--r--sources/plugins/image/lang/ka.js25
-rw-r--r--sources/plugins/image/lang/km.js25
-rw-r--r--sources/plugins/image/lang/ko.js25
-rw-r--r--sources/plugins/image/lang/ku.js25
-rw-r--r--sources/plugins/image/lang/lt.js25
-rw-r--r--sources/plugins/image/lang/lv.js25
-rw-r--r--sources/plugins/image/lang/mk.js25
-rw-r--r--sources/plugins/image/lang/mn.js25
-rw-r--r--sources/plugins/image/lang/ms.js25
-rw-r--r--sources/plugins/image/lang/nb.js25
-rw-r--r--sources/plugins/image/lang/nl.js25
-rw-r--r--sources/plugins/image/lang/no.js25
-rw-r--r--sources/plugins/image/lang/pl.js25
-rw-r--r--sources/plugins/image/lang/pt-br.js25
-rw-r--r--sources/plugins/image/lang/pt.js25
-rw-r--r--sources/plugins/image/lang/ro.js25
-rw-r--r--sources/plugins/image/lang/ru.js25
-rw-r--r--sources/plugins/image/lang/si.js25
-rw-r--r--sources/plugins/image/lang/sk.js25
-rw-r--r--sources/plugins/image/lang/sl.js25
-rw-r--r--sources/plugins/image/lang/sq.js25
-rw-r--r--sources/plugins/image/lang/sr-latn.js25
-rw-r--r--sources/plugins/image/lang/sr.js25
-rw-r--r--sources/plugins/image/lang/sv.js25
-rw-r--r--sources/plugins/image/lang/th.js25
-rw-r--r--sources/plugins/image/lang/tr.js25
-rw-r--r--sources/plugins/image/lang/tt.js25
-rw-r--r--sources/plugins/image/lang/ug.js25
-rw-r--r--sources/plugins/image/lang/uk.js25
-rw-r--r--sources/plugins/image/lang/vi.js25
-rw-r--r--sources/plugins/image/lang/zh-cn.js25
-rw-r--r--sources/plugins/image/lang/zh.js25
-rw-r--r--sources/plugins/image/plugin.js183
-rw-r--r--sources/plugins/imagebrowser/LICENSE.txt10
-rw-r--r--sources/plugins/imagebrowser/README.rst69
-rw-r--r--sources/plugins/imagebrowser/browser/browser.css62
-rw-r--r--sources/plugins/imagebrowser/browser/browser.html25
-rw-r--r--sources/plugins/imagebrowser/browser/browser.js136
-rw-r--r--sources/plugins/imagebrowser/browser/jquery-1.9.1.min.js5
-rw-r--r--sources/plugins/imagebrowser/plugin.js14
-rw-r--r--sources/plugins/indent/dev/indent.html284
-rw-r--r--sources/plugins/indent/icons/hidpi/indent-rtl.pngbin0 -> 1610 bytes
-rw-r--r--sources/plugins/indent/icons/hidpi/indent.pngbin0 -> 1573 bytes
-rw-r--r--sources/plugins/indent/icons/hidpi/outdent-rtl.pngbin0 -> 1584 bytes
-rw-r--r--sources/plugins/indent/icons/hidpi/outdent.pngbin0 -> 1598 bytes
-rw-r--r--sources/plugins/indent/icons/indent-rtl.pngbin0 -> 726 bytes
-rw-r--r--sources/plugins/indent/icons/indent.pngbin0 -> 711 bytes
-rw-r--r--sources/plugins/indent/icons/outdent-rtl.pngbin0 -> 708 bytes
-rw-r--r--sources/plugins/indent/icons/outdent.pngbin0 -> 699 bytes
-rw-r--r--sources/plugins/indent/lang/af.js8
-rw-r--r--sources/plugins/indent/lang/ar.js8
-rw-r--r--sources/plugins/indent/lang/bg.js8
-rw-r--r--sources/plugins/indent/lang/bn.js8
-rw-r--r--sources/plugins/indent/lang/bs.js8
-rw-r--r--sources/plugins/indent/lang/ca.js8
-rw-r--r--sources/plugins/indent/lang/cs.js8
-rw-r--r--sources/plugins/indent/lang/cy.js8
-rw-r--r--sources/plugins/indent/lang/da.js8
-rw-r--r--sources/plugins/indent/lang/de.js8
-rw-r--r--sources/plugins/indent/lang/el.js8
-rw-r--r--sources/plugins/indent/lang/en-au.js8
-rw-r--r--sources/plugins/indent/lang/en-ca.js8
-rw-r--r--sources/plugins/indent/lang/en-gb.js8
-rw-r--r--sources/plugins/indent/lang/en.js8
-rw-r--r--sources/plugins/indent/lang/eo.js8
-rw-r--r--sources/plugins/indent/lang/es.js8
-rw-r--r--sources/plugins/indent/lang/et.js8
-rw-r--r--sources/plugins/indent/lang/eu.js8
-rw-r--r--sources/plugins/indent/lang/fa.js8
-rw-r--r--sources/plugins/indent/lang/fi.js8
-rw-r--r--sources/plugins/indent/lang/fo.js8
-rw-r--r--sources/plugins/indent/lang/fr-ca.js8
-rw-r--r--sources/plugins/indent/lang/fr.js8
-rw-r--r--sources/plugins/indent/lang/gl.js8
-rw-r--r--sources/plugins/indent/lang/gu.js8
-rw-r--r--sources/plugins/indent/lang/he.js8
-rw-r--r--sources/plugins/indent/lang/hi.js8
-rw-r--r--sources/plugins/indent/lang/hr.js8
-rw-r--r--sources/plugins/indent/lang/hu.js8
-rw-r--r--sources/plugins/indent/lang/id.js8
-rw-r--r--sources/plugins/indent/lang/is.js8
-rw-r--r--sources/plugins/indent/lang/it.js8
-rw-r--r--sources/plugins/indent/lang/ja.js8
-rw-r--r--sources/plugins/indent/lang/ka.js8
-rw-r--r--sources/plugins/indent/lang/km.js8
-rw-r--r--sources/plugins/indent/lang/ko.js8
-rw-r--r--sources/plugins/indent/lang/ku.js8
-rw-r--r--sources/plugins/indent/lang/lt.js8
-rw-r--r--sources/plugins/indent/lang/lv.js8
-rw-r--r--sources/plugins/indent/lang/mk.js8
-rw-r--r--sources/plugins/indent/lang/mn.js8
-rw-r--r--sources/plugins/indent/lang/ms.js8
-rw-r--r--sources/plugins/indent/lang/nb.js8
-rw-r--r--sources/plugins/indent/lang/nl.js8
-rw-r--r--sources/plugins/indent/lang/no.js8
-rw-r--r--sources/plugins/indent/lang/pl.js8
-rw-r--r--sources/plugins/indent/lang/pt-br.js8
-rw-r--r--sources/plugins/indent/lang/pt.js8
-rw-r--r--sources/plugins/indent/lang/ro.js8
-rw-r--r--sources/plugins/indent/lang/ru.js8
-rw-r--r--sources/plugins/indent/lang/si.js8
-rw-r--r--sources/plugins/indent/lang/sk.js8
-rw-r--r--sources/plugins/indent/lang/sl.js8
-rw-r--r--sources/plugins/indent/lang/sq.js8
-rw-r--r--sources/plugins/indent/lang/sr-latn.js8
-rw-r--r--sources/plugins/indent/lang/sr.js8
-rw-r--r--sources/plugins/indent/lang/sv.js8
-rw-r--r--sources/plugins/indent/lang/th.js8
-rw-r--r--sources/plugins/indent/lang/tr.js8
-rw-r--r--sources/plugins/indent/lang/tt.js8
-rw-r--r--sources/plugins/indent/lang/ug.js8
-rw-r--r--sources/plugins/indent/lang/uk.js8
-rw-r--r--sources/plugins/indent/lang/vi.js8
-rw-r--r--sources/plugins/indent/lang/zh-cn.js8
-rw-r--r--sources/plugins/indent/lang/zh.js8
-rw-r--r--sources/plugins/indent/plugin.js461
-rw-r--r--sources/plugins/indentblock/plugin.js298
-rw-r--r--sources/plugins/indentlist/plugin.js318
-rw-r--r--sources/plugins/justify/icons/hidpi/justifyblock.pngbin0 -> 882 bytes
-rw-r--r--sources/plugins/justify/icons/hidpi/justifycenter.pngbin0 -> 1142 bytes
-rw-r--r--sources/plugins/justify/icons/hidpi/justifyleft.pngbin0 -> 1042 bytes
-rw-r--r--sources/plugins/justify/icons/hidpi/justifyright.pngbin0 -> 1048 bytes
-rw-r--r--sources/plugins/justify/icons/justifyblock.pngbin0 -> 496 bytes
-rw-r--r--sources/plugins/justify/icons/justifycenter.pngbin0 -> 609 bytes
-rw-r--r--sources/plugins/justify/icons/justifyleft.pngbin0 -> 558 bytes
-rw-r--r--sources/plugins/justify/icons/justifyright.pngbin0 -> 554 bytes
-rw-r--r--sources/plugins/justify/lang/af.js10
-rw-r--r--sources/plugins/justify/lang/ar.js10
-rw-r--r--sources/plugins/justify/lang/bg.js10
-rw-r--r--sources/plugins/justify/lang/bn.js10
-rw-r--r--sources/plugins/justify/lang/bs.js10
-rw-r--r--sources/plugins/justify/lang/ca.js10
-rw-r--r--sources/plugins/justify/lang/cs.js10
-rw-r--r--sources/plugins/justify/lang/cy.js10
-rw-r--r--sources/plugins/justify/lang/da.js10
-rw-r--r--sources/plugins/justify/lang/de.js10
-rw-r--r--sources/plugins/justify/lang/el.js10
-rw-r--r--sources/plugins/justify/lang/en-au.js10
-rw-r--r--sources/plugins/justify/lang/en-ca.js10
-rw-r--r--sources/plugins/justify/lang/en-gb.js10
-rw-r--r--sources/plugins/justify/lang/en.js10
-rw-r--r--sources/plugins/justify/lang/eo.js10
-rw-r--r--sources/plugins/justify/lang/es.js10
-rw-r--r--sources/plugins/justify/lang/et.js10
-rw-r--r--sources/plugins/justify/lang/eu.js10
-rw-r--r--sources/plugins/justify/lang/fa.js10
-rw-r--r--sources/plugins/justify/lang/fi.js10
-rw-r--r--sources/plugins/justify/lang/fo.js10
-rw-r--r--sources/plugins/justify/lang/fr-ca.js10
-rw-r--r--sources/plugins/justify/lang/fr.js10
-rw-r--r--sources/plugins/justify/lang/gl.js10
-rw-r--r--sources/plugins/justify/lang/gu.js10
-rw-r--r--sources/plugins/justify/lang/he.js10
-rw-r--r--sources/plugins/justify/lang/hi.js10
-rw-r--r--sources/plugins/justify/lang/hr.js10
-rw-r--r--sources/plugins/justify/lang/hu.js10
-rw-r--r--sources/plugins/justify/lang/id.js10
-rw-r--r--sources/plugins/justify/lang/is.js10
-rw-r--r--sources/plugins/justify/lang/it.js10
-rw-r--r--sources/plugins/justify/lang/ja.js10
-rw-r--r--sources/plugins/justify/lang/ka.js10
-rw-r--r--sources/plugins/justify/lang/km.js10
-rw-r--r--sources/plugins/justify/lang/ko.js10
-rw-r--r--sources/plugins/justify/lang/ku.js10
-rw-r--r--sources/plugins/justify/lang/lt.js10
-rw-r--r--sources/plugins/justify/lang/lv.js10
-rw-r--r--sources/plugins/justify/lang/mk.js10
-rw-r--r--sources/plugins/justify/lang/mn.js10
-rw-r--r--sources/plugins/justify/lang/ms.js10
-rw-r--r--sources/plugins/justify/lang/nb.js10
-rw-r--r--sources/plugins/justify/lang/nl.js10
-rw-r--r--sources/plugins/justify/lang/no.js10
-rw-r--r--sources/plugins/justify/lang/pl.js10
-rw-r--r--sources/plugins/justify/lang/pt-br.js10
-rw-r--r--sources/plugins/justify/lang/pt.js10
-rw-r--r--sources/plugins/justify/lang/ro.js10
-rw-r--r--sources/plugins/justify/lang/ru.js10
-rw-r--r--sources/plugins/justify/lang/si.js10
-rw-r--r--sources/plugins/justify/lang/sk.js10
-rw-r--r--sources/plugins/justify/lang/sl.js10
-rw-r--r--sources/plugins/justify/lang/sq.js10
-rw-r--r--sources/plugins/justify/lang/sr-latn.js10
-rw-r--r--sources/plugins/justify/lang/sr.js10
-rw-r--r--sources/plugins/justify/lang/sv.js10
-rw-r--r--sources/plugins/justify/lang/th.js10
-rw-r--r--sources/plugins/justify/lang/tr.js10
-rw-r--r--sources/plugins/justify/lang/tt.js10
-rw-r--r--sources/plugins/justify/lang/ug.js10
-rw-r--r--sources/plugins/justify/lang/uk.js10
-rw-r--r--sources/plugins/justify/lang/vi.js10
-rw-r--r--sources/plugins/justify/lang/zh-cn.js10
-rw-r--r--sources/plugins/justify/lang/zh.js10
-rw-r--r--sources/plugins/justify/plugin.js245
-rw-r--r--sources/plugins/link/dialogs/anchor.js105
-rw-r--r--sources/plugins/link/dialogs/link.js904
-rw-r--r--sources/plugins/link/icons/anchor-rtl.pngbin0 -> 764 bytes
-rw-r--r--sources/plugins/link/icons/anchor.pngbin0 -> 757 bytes
-rw-r--r--sources/plugins/link/icons/hidpi/anchor-rtl.pngbin0 -> 1654 bytes
-rw-r--r--sources/plugins/link/icons/hidpi/anchor.pngbin0 -> 1633 bytes
-rw-r--r--sources/plugins/link/icons/hidpi/link.pngbin0 -> 1620 bytes
-rw-r--r--sources/plugins/link/icons/hidpi/unlink.pngbin0 -> 2209 bytes
-rw-r--r--sources/plugins/link/icons/link.pngbin0 -> 656 bytes
-rw-r--r--sources/plugins/link/icons/unlink.pngbin0 -> 812 bytes
-rw-r--r--sources/plugins/link/images/anchor.pngbin0 -> 589 bytes
-rw-r--r--sources/plugins/link/images/hidpi/anchor.pngbin0 -> 1379 bytes
-rw-r--r--sources/plugins/link/lang/af.js65
-rw-r--r--sources/plugins/link/lang/ar.js65
-rw-r--r--sources/plugins/link/lang/bg.js65
-rw-r--r--sources/plugins/link/lang/bn.js65
-rw-r--r--sources/plugins/link/lang/bs.js65
-rw-r--r--sources/plugins/link/lang/ca.js65
-rw-r--r--sources/plugins/link/lang/cs.js65
-rw-r--r--sources/plugins/link/lang/cy.js65
-rw-r--r--sources/plugins/link/lang/da.js65
-rw-r--r--sources/plugins/link/lang/de.js65
-rw-r--r--sources/plugins/link/lang/el.js65
-rw-r--r--sources/plugins/link/lang/en-au.js65
-rw-r--r--sources/plugins/link/lang/en-ca.js65
-rw-r--r--sources/plugins/link/lang/en-gb.js65
-rw-r--r--sources/plugins/link/lang/en.js65
-rw-r--r--sources/plugins/link/lang/eo.js65
-rw-r--r--sources/plugins/link/lang/es.js65
-rw-r--r--sources/plugins/link/lang/et.js65
-rw-r--r--sources/plugins/link/lang/eu.js65
-rw-r--r--sources/plugins/link/lang/fa.js65
-rw-r--r--sources/plugins/link/lang/fi.js65
-rw-r--r--sources/plugins/link/lang/fo.js65
-rw-r--r--sources/plugins/link/lang/fr-ca.js65
-rw-r--r--sources/plugins/link/lang/fr.js65
-rw-r--r--sources/plugins/link/lang/gl.js65
-rw-r--r--sources/plugins/link/lang/gu.js65
-rw-r--r--sources/plugins/link/lang/he.js65
-rw-r--r--sources/plugins/link/lang/hi.js65
-rw-r--r--sources/plugins/link/lang/hr.js65
-rw-r--r--sources/plugins/link/lang/hu.js65
-rw-r--r--sources/plugins/link/lang/id.js65
-rw-r--r--sources/plugins/link/lang/is.js65
-rw-r--r--sources/plugins/link/lang/it.js65
-rw-r--r--sources/plugins/link/lang/ja.js65
-rw-r--r--sources/plugins/link/lang/ka.js65
-rw-r--r--sources/plugins/link/lang/km.js65
-rw-r--r--sources/plugins/link/lang/ko.js65
-rw-r--r--sources/plugins/link/lang/ku.js65
-rw-r--r--sources/plugins/link/lang/lt.js65
-rw-r--r--sources/plugins/link/lang/lv.js65
-rw-r--r--sources/plugins/link/lang/mk.js65
-rw-r--r--sources/plugins/link/lang/mn.js65
-rw-r--r--sources/plugins/link/lang/ms.js65
-rw-r--r--sources/plugins/link/lang/nb.js65
-rw-r--r--sources/plugins/link/lang/nl.js65
-rw-r--r--sources/plugins/link/lang/no.js65
-rw-r--r--sources/plugins/link/lang/pl.js65
-rw-r--r--sources/plugins/link/lang/pt-br.js65
-rw-r--r--sources/plugins/link/lang/pt.js65
-rw-r--r--sources/plugins/link/lang/ro.js65
-rw-r--r--sources/plugins/link/lang/ru.js65
-rw-r--r--sources/plugins/link/lang/si.js65
-rw-r--r--sources/plugins/link/lang/sk.js65
-rw-r--r--sources/plugins/link/lang/sl.js65
-rw-r--r--sources/plugins/link/lang/sq.js65
-rw-r--r--sources/plugins/link/lang/sr-latn.js65
-rw-r--r--sources/plugins/link/lang/sr.js65
-rw-r--r--sources/plugins/link/lang/sv.js65
-rw-r--r--sources/plugins/link/lang/th.js65
-rw-r--r--sources/plugins/link/lang/tr.js65
-rw-r--r--sources/plugins/link/lang/tt.js65
-rw-r--r--sources/plugins/link/lang/ug.js65
-rw-r--r--sources/plugins/link/lang/uk.js65
-rw-r--r--sources/plugins/link/lang/vi.js65
-rw-r--r--sources/plugins/link/lang/zh-cn.js65
-rw-r--r--sources/plugins/link/lang/zh.js65
-rw-r--r--sources/plugins/link/plugin.js787
-rw-r--r--sources/plugins/list/icons/bulletedlist-rtl.pngbin0 -> 647 bytes
-rw-r--r--sources/plugins/list/icons/bulletedlist.pngbin0 -> 646 bytes
-rw-r--r--sources/plugins/list/icons/hidpi/bulletedlist-rtl.pngbin0 -> 1451 bytes
-rw-r--r--sources/plugins/list/icons/hidpi/bulletedlist.pngbin0 -> 1441 bytes
-rw-r--r--sources/plugins/list/icons/hidpi/numberedlist-rtl.pngbin0 -> 1248 bytes
-rw-r--r--sources/plugins/list/icons/hidpi/numberedlist.pngbin0 -> 1218 bytes
-rw-r--r--sources/plugins/list/icons/numberedlist-rtl.pngbin0 -> 666 bytes
-rw-r--r--sources/plugins/list/icons/numberedlist.pngbin0 -> 645 bytes
-rw-r--r--sources/plugins/list/lang/af.js8
-rw-r--r--sources/plugins/list/lang/ar.js8
-rw-r--r--sources/plugins/list/lang/bg.js8
-rw-r--r--sources/plugins/list/lang/bn.js8
-rw-r--r--sources/plugins/list/lang/bs.js8
-rw-r--r--sources/plugins/list/lang/ca.js8
-rw-r--r--sources/plugins/list/lang/cs.js8
-rw-r--r--sources/plugins/list/lang/cy.js8
-rw-r--r--sources/plugins/list/lang/da.js8
-rw-r--r--sources/plugins/list/lang/de.js8
-rw-r--r--sources/plugins/list/lang/el.js8
-rw-r--r--sources/plugins/list/lang/en-au.js8
-rw-r--r--sources/plugins/list/lang/en-ca.js8
-rw-r--r--sources/plugins/list/lang/en-gb.js8
-rw-r--r--sources/plugins/list/lang/en.js8
-rw-r--r--sources/plugins/list/lang/eo.js8
-rw-r--r--sources/plugins/list/lang/es.js8
-rw-r--r--sources/plugins/list/lang/et.js8
-rw-r--r--sources/plugins/list/lang/eu.js8
-rw-r--r--sources/plugins/list/lang/fa.js8
-rw-r--r--sources/plugins/list/lang/fi.js8
-rw-r--r--sources/plugins/list/lang/fo.js8
-rw-r--r--sources/plugins/list/lang/fr-ca.js8
-rw-r--r--sources/plugins/list/lang/fr.js8
-rw-r--r--sources/plugins/list/lang/gl.js8
-rw-r--r--sources/plugins/list/lang/gu.js8
-rw-r--r--sources/plugins/list/lang/he.js8
-rw-r--r--sources/plugins/list/lang/hi.js8
-rw-r--r--sources/plugins/list/lang/hr.js8
-rw-r--r--sources/plugins/list/lang/hu.js8
-rw-r--r--sources/plugins/list/lang/id.js8
-rw-r--r--sources/plugins/list/lang/is.js8
-rw-r--r--sources/plugins/list/lang/it.js8
-rw-r--r--sources/plugins/list/lang/ja.js8
-rw-r--r--sources/plugins/list/lang/ka.js8
-rw-r--r--sources/plugins/list/lang/km.js8
-rw-r--r--sources/plugins/list/lang/ko.js8
-rw-r--r--sources/plugins/list/lang/ku.js8
-rw-r--r--sources/plugins/list/lang/lt.js8
-rw-r--r--sources/plugins/list/lang/lv.js8
-rw-r--r--sources/plugins/list/lang/mk.js8
-rw-r--r--sources/plugins/list/lang/mn.js8
-rw-r--r--sources/plugins/list/lang/ms.js8
-rw-r--r--sources/plugins/list/lang/nb.js8
-rw-r--r--sources/plugins/list/lang/nl.js8
-rw-r--r--sources/plugins/list/lang/no.js8
-rw-r--r--sources/plugins/list/lang/pl.js8
-rw-r--r--sources/plugins/list/lang/pt-br.js8
-rw-r--r--sources/plugins/list/lang/pt.js8
-rw-r--r--sources/plugins/list/lang/ro.js8
-rw-r--r--sources/plugins/list/lang/ru.js8
-rw-r--r--sources/plugins/list/lang/si.js8
-rw-r--r--sources/plugins/list/lang/sk.js8
-rw-r--r--sources/plugins/list/lang/sl.js8
-rw-r--r--sources/plugins/list/lang/sq.js8
-rw-r--r--sources/plugins/list/lang/sr-latn.js8
-rw-r--r--sources/plugins/list/lang/sr.js8
-rw-r--r--sources/plugins/list/lang/sv.js8
-rw-r--r--sources/plugins/list/lang/th.js8
-rw-r--r--sources/plugins/list/lang/tr.js8
-rw-r--r--sources/plugins/list/lang/tt.js8
-rw-r--r--sources/plugins/list/lang/ug.js8
-rw-r--r--sources/plugins/list/lang/uk.js8
-rw-r--r--sources/plugins/list/lang/vi.js8
-rw-r--r--sources/plugins/list/lang/zh-cn.js8
-rw-r--r--sources/plugins/list/lang/zh.js8
-rw-r--r--sources/plugins/list/plugin.js1111
-rw-r--r--sources/plugins/listblock/plugin.js241
-rw-r--r--sources/plugins/liststyle/dialogs/liststyle.js189
-rw-r--r--sources/plugins/liststyle/lang/af.js25
-rw-r--r--sources/plugins/liststyle/lang/ar.js25
-rw-r--r--sources/plugins/liststyle/lang/bg.js25
-rw-r--r--sources/plugins/liststyle/lang/bn.js25
-rw-r--r--sources/plugins/liststyle/lang/bs.js25
-rw-r--r--sources/plugins/liststyle/lang/ca.js25
-rw-r--r--sources/plugins/liststyle/lang/cs.js25
-rw-r--r--sources/plugins/liststyle/lang/cy.js25
-rw-r--r--sources/plugins/liststyle/lang/da.js25
-rw-r--r--sources/plugins/liststyle/lang/de.js25
-rw-r--r--sources/plugins/liststyle/lang/el.js25
-rw-r--r--sources/plugins/liststyle/lang/en-au.js25
-rw-r--r--sources/plugins/liststyle/lang/en-ca.js25
-rw-r--r--sources/plugins/liststyle/lang/en-gb.js25
-rw-r--r--sources/plugins/liststyle/lang/en.js25
-rw-r--r--sources/plugins/liststyle/lang/eo.js25
-rw-r--r--sources/plugins/liststyle/lang/es.js25
-rw-r--r--sources/plugins/liststyle/lang/et.js25
-rw-r--r--sources/plugins/liststyle/lang/eu.js25
-rw-r--r--sources/plugins/liststyle/lang/fa.js25
-rw-r--r--sources/plugins/liststyle/lang/fi.js25
-rw-r--r--sources/plugins/liststyle/lang/fo.js25
-rw-r--r--sources/plugins/liststyle/lang/fr-ca.js25
-rw-r--r--sources/plugins/liststyle/lang/fr.js25
-rw-r--r--sources/plugins/liststyle/lang/gl.js25
-rw-r--r--sources/plugins/liststyle/lang/gu.js25
-rw-r--r--sources/plugins/liststyle/lang/he.js25
-rw-r--r--sources/plugins/liststyle/lang/hi.js25
-rw-r--r--sources/plugins/liststyle/lang/hr.js25
-rw-r--r--sources/plugins/liststyle/lang/hu.js25
-rw-r--r--sources/plugins/liststyle/lang/id.js25
-rw-r--r--sources/plugins/liststyle/lang/is.js25
-rw-r--r--sources/plugins/liststyle/lang/it.js25
-rw-r--r--sources/plugins/liststyle/lang/ja.js25
-rw-r--r--sources/plugins/liststyle/lang/ka.js25
-rw-r--r--sources/plugins/liststyle/lang/km.js25
-rw-r--r--sources/plugins/liststyle/lang/ko.js25
-rw-r--r--sources/plugins/liststyle/lang/ku.js25
-rw-r--r--sources/plugins/liststyle/lang/lt.js25
-rw-r--r--sources/plugins/liststyle/lang/lv.js25
-rw-r--r--sources/plugins/liststyle/lang/mk.js25
-rw-r--r--sources/plugins/liststyle/lang/mn.js25
-rw-r--r--sources/plugins/liststyle/lang/ms.js25
-rw-r--r--sources/plugins/liststyle/lang/nb.js25
-rw-r--r--sources/plugins/liststyle/lang/nl.js25
-rw-r--r--sources/plugins/liststyle/lang/no.js25
-rw-r--r--sources/plugins/liststyle/lang/pl.js25
-rw-r--r--sources/plugins/liststyle/lang/pt-br.js25
-rw-r--r--sources/plugins/liststyle/lang/pt.js25
-rw-r--r--sources/plugins/liststyle/lang/ro.js25
-rw-r--r--sources/plugins/liststyle/lang/ru.js25
-rw-r--r--sources/plugins/liststyle/lang/si.js25
-rw-r--r--sources/plugins/liststyle/lang/sk.js25
-rw-r--r--sources/plugins/liststyle/lang/sl.js25
-rw-r--r--sources/plugins/liststyle/lang/sq.js25
-rw-r--r--sources/plugins/liststyle/lang/sr-latn.js25
-rw-r--r--sources/plugins/liststyle/lang/sr.js25
-rw-r--r--sources/plugins/liststyle/lang/sv.js25
-rw-r--r--sources/plugins/liststyle/lang/th.js25
-rw-r--r--sources/plugins/liststyle/lang/tr.js25
-rw-r--r--sources/plugins/liststyle/lang/tt.js25
-rw-r--r--sources/plugins/liststyle/lang/ug.js25
-rw-r--r--sources/plugins/liststyle/lang/uk.js25
-rw-r--r--sources/plugins/liststyle/lang/vi.js25
-rw-r--r--sources/plugins/liststyle/lang/zh-cn.js25
-rw-r--r--sources/plugins/liststyle/lang/zh.js25
-rw-r--r--sources/plugins/liststyle/plugin.js69
-rw-r--r--sources/plugins/magicline/dev/magicline.html594
-rw-r--r--sources/plugins/magicline/images/hidpi/icon-rtl.pngbin0 -> 176 bytes
-rw-r--r--sources/plugins/magicline/images/hidpi/icon.pngbin0 -> 199 bytes
-rw-r--r--sources/plugins/magicline/images/icon-rtl.pngbin0 -> 138 bytes
-rw-r--r--sources/plugins/magicline/images/icon.pngbin0 -> 133 bytes
-rw-r--r--sources/plugins/magicline/lang/af.js8
-rw-r--r--sources/plugins/magicline/lang/ar.js8
-rw-r--r--sources/plugins/magicline/lang/bg.js8
-rw-r--r--sources/plugins/magicline/lang/ca.js8
-rw-r--r--sources/plugins/magicline/lang/cs.js8
-rw-r--r--sources/plugins/magicline/lang/cy.js8
-rw-r--r--sources/plugins/magicline/lang/da.js8
-rw-r--r--sources/plugins/magicline/lang/de.js8
-rw-r--r--sources/plugins/magicline/lang/el.js8
-rw-r--r--sources/plugins/magicline/lang/en-gb.js8
-rw-r--r--sources/plugins/magicline/lang/en.js8
-rw-r--r--sources/plugins/magicline/lang/eo.js8
-rw-r--r--sources/plugins/magicline/lang/es.js8
-rw-r--r--sources/plugins/magicline/lang/et.js8
-rw-r--r--sources/plugins/magicline/lang/eu.js8
-rw-r--r--sources/plugins/magicline/lang/fa.js8
-rw-r--r--sources/plugins/magicline/lang/fi.js8
-rw-r--r--sources/plugins/magicline/lang/fr-ca.js8
-rw-r--r--sources/plugins/magicline/lang/fr.js8
-rw-r--r--sources/plugins/magicline/lang/gl.js8
-rw-r--r--sources/plugins/magicline/lang/he.js8
-rw-r--r--sources/plugins/magicline/lang/hr.js8
-rw-r--r--sources/plugins/magicline/lang/hu.js8
-rw-r--r--sources/plugins/magicline/lang/id.js8
-rw-r--r--sources/plugins/magicline/lang/it.js8
-rw-r--r--sources/plugins/magicline/lang/ja.js8
-rw-r--r--sources/plugins/magicline/lang/km.js8
-rw-r--r--sources/plugins/magicline/lang/ko.js8
-rw-r--r--sources/plugins/magicline/lang/ku.js8
-rw-r--r--sources/plugins/magicline/lang/lv.js8
-rw-r--r--sources/plugins/magicline/lang/nb.js8
-rw-r--r--sources/plugins/magicline/lang/nl.js8
-rw-r--r--sources/plugins/magicline/lang/no.js8
-rw-r--r--sources/plugins/magicline/lang/pl.js8
-rw-r--r--sources/plugins/magicline/lang/pt-br.js8
-rw-r--r--sources/plugins/magicline/lang/pt.js8
-rw-r--r--sources/plugins/magicline/lang/ru.js8
-rw-r--r--sources/plugins/magicline/lang/si.js8
-rw-r--r--sources/plugins/magicline/lang/sk.js8
-rw-r--r--sources/plugins/magicline/lang/sl.js8
-rw-r--r--sources/plugins/magicline/lang/sq.js8
-rw-r--r--sources/plugins/magicline/lang/sv.js8
-rw-r--r--sources/plugins/magicline/lang/tr.js8
-rw-r--r--sources/plugins/magicline/lang/tt.js8
-rw-r--r--sources/plugins/magicline/lang/ug.js8
-rw-r--r--sources/plugins/magicline/lang/uk.js8
-rw-r--r--sources/plugins/magicline/lang/vi.js8
-rw-r--r--sources/plugins/magicline/lang/zh-cn.js8
-rw-r--r--sources/plugins/magicline/lang/zh.js8
-rw-r--r--sources/plugins/magicline/plugin.js1874
-rw-r--r--sources/plugins/magicline/samples/magicline.html209
-rw-r--r--sources/plugins/maximize/icons/hidpi/maximize.pngbin0 -> 2462 bytes
-rw-r--r--sources/plugins/maximize/icons/maximize.pngbin0 -> 921 bytes
-rw-r--r--sources/plugins/maximize/lang/af.js8
-rw-r--r--sources/plugins/maximize/lang/ar.js8
-rw-r--r--sources/plugins/maximize/lang/bg.js8
-rw-r--r--sources/plugins/maximize/lang/bn.js8
-rw-r--r--sources/plugins/maximize/lang/bs.js8
-rw-r--r--sources/plugins/maximize/lang/ca.js8
-rw-r--r--sources/plugins/maximize/lang/cs.js8
-rw-r--r--sources/plugins/maximize/lang/cy.js8
-rw-r--r--sources/plugins/maximize/lang/da.js8
-rw-r--r--sources/plugins/maximize/lang/de.js8
-rw-r--r--sources/plugins/maximize/lang/el.js8
-rw-r--r--sources/plugins/maximize/lang/en-au.js8
-rw-r--r--sources/plugins/maximize/lang/en-ca.js8
-rw-r--r--sources/plugins/maximize/lang/en-gb.js8
-rw-r--r--sources/plugins/maximize/lang/en.js8
-rw-r--r--sources/plugins/maximize/lang/eo.js8
-rw-r--r--sources/plugins/maximize/lang/es.js8
-rw-r--r--sources/plugins/maximize/lang/et.js8
-rw-r--r--sources/plugins/maximize/lang/eu.js8
-rw-r--r--sources/plugins/maximize/lang/fa.js8
-rw-r--r--sources/plugins/maximize/lang/fi.js8
-rw-r--r--sources/plugins/maximize/lang/fo.js8
-rw-r--r--sources/plugins/maximize/lang/fr-ca.js8
-rw-r--r--sources/plugins/maximize/lang/fr.js8
-rw-r--r--sources/plugins/maximize/lang/gl.js8
-rw-r--r--sources/plugins/maximize/lang/gu.js8
-rw-r--r--sources/plugins/maximize/lang/he.js8
-rw-r--r--sources/plugins/maximize/lang/hi.js8
-rw-r--r--sources/plugins/maximize/lang/hr.js8
-rw-r--r--sources/plugins/maximize/lang/hu.js8
-rw-r--r--sources/plugins/maximize/lang/id.js8
-rw-r--r--sources/plugins/maximize/lang/is.js8
-rw-r--r--sources/plugins/maximize/lang/it.js8
-rw-r--r--sources/plugins/maximize/lang/ja.js8
-rw-r--r--sources/plugins/maximize/lang/ka.js8
-rw-r--r--sources/plugins/maximize/lang/km.js8
-rw-r--r--sources/plugins/maximize/lang/ko.js8
-rw-r--r--sources/plugins/maximize/lang/ku.js8
-rw-r--r--sources/plugins/maximize/lang/lt.js8
-rw-r--r--sources/plugins/maximize/lang/lv.js8
-rw-r--r--sources/plugins/maximize/lang/mk.js8
-rw-r--r--sources/plugins/maximize/lang/mn.js8
-rw-r--r--sources/plugins/maximize/lang/ms.js8
-rw-r--r--sources/plugins/maximize/lang/nb.js8
-rw-r--r--sources/plugins/maximize/lang/nl.js8
-rw-r--r--sources/plugins/maximize/lang/no.js8
-rw-r--r--sources/plugins/maximize/lang/pl.js8
-rw-r--r--sources/plugins/maximize/lang/pt-br.js8
-rw-r--r--sources/plugins/maximize/lang/pt.js8
-rw-r--r--sources/plugins/maximize/lang/ro.js8
-rw-r--r--sources/plugins/maximize/lang/ru.js8
-rw-r--r--sources/plugins/maximize/lang/si.js8
-rw-r--r--sources/plugins/maximize/lang/sk.js8
-rw-r--r--sources/plugins/maximize/lang/sl.js8
-rw-r--r--sources/plugins/maximize/lang/sq.js8
-rw-r--r--sources/plugins/maximize/lang/sr-latn.js8
-rw-r--r--sources/plugins/maximize/lang/sr.js8
-rw-r--r--sources/plugins/maximize/lang/sv.js8
-rw-r--r--sources/plugins/maximize/lang/th.js8
-rw-r--r--sources/plugins/maximize/lang/tr.js8
-rw-r--r--sources/plugins/maximize/lang/tt.js8
-rw-r--r--sources/plugins/maximize/lang/ug.js8
-rw-r--r--sources/plugins/maximize/lang/uk.js8
-rw-r--r--sources/plugins/maximize/lang/vi.js8
-rw-r--r--sources/plugins/maximize/lang/zh-cn.js8
-rw-r--r--sources/plugins/maximize/lang/zh.js8
-rw-r--r--sources/plugins/maximize/plugin.js314
-rw-r--r--sources/plugins/menu/plugin.js545
-rw-r--r--sources/plugins/menubutton/plugin.js101
-rw-r--r--sources/plugins/newpage/icons/hidpi/newpage-rtl.pngbin0 -> 1070 bytes
-rw-r--r--sources/plugins/newpage/icons/hidpi/newpage.pngbin0 -> 1112 bytes
-rw-r--r--sources/plugins/newpage/icons/newpage-rtl.pngbin0 -> 575 bytes
-rw-r--r--sources/plugins/newpage/icons/newpage.pngbin0 -> 580 bytes
-rw-r--r--sources/plugins/newpage/lang/af.js7
-rw-r--r--sources/plugins/newpage/lang/ar.js7
-rw-r--r--sources/plugins/newpage/lang/bg.js7
-rw-r--r--sources/plugins/newpage/lang/bn.js7
-rw-r--r--sources/plugins/newpage/lang/bs.js7
-rw-r--r--sources/plugins/newpage/lang/ca.js7
-rw-r--r--sources/plugins/newpage/lang/cs.js7
-rw-r--r--sources/plugins/newpage/lang/cy.js7
-rw-r--r--sources/plugins/newpage/lang/da.js7
-rw-r--r--sources/plugins/newpage/lang/de.js7
-rw-r--r--sources/plugins/newpage/lang/el.js7
-rw-r--r--sources/plugins/newpage/lang/en-au.js7
-rw-r--r--sources/plugins/newpage/lang/en-ca.js7
-rw-r--r--sources/plugins/newpage/lang/en-gb.js7
-rw-r--r--sources/plugins/newpage/lang/en.js7
-rw-r--r--sources/plugins/newpage/lang/eo.js7
-rw-r--r--sources/plugins/newpage/lang/es.js7
-rw-r--r--sources/plugins/newpage/lang/et.js7
-rw-r--r--sources/plugins/newpage/lang/eu.js7
-rw-r--r--sources/plugins/newpage/lang/fa.js7
-rw-r--r--sources/plugins/newpage/lang/fi.js7
-rw-r--r--sources/plugins/newpage/lang/fo.js7
-rw-r--r--sources/plugins/newpage/lang/fr-ca.js7
-rw-r--r--sources/plugins/newpage/lang/fr.js7
-rw-r--r--sources/plugins/newpage/lang/gl.js7
-rw-r--r--sources/plugins/newpage/lang/gu.js7
-rw-r--r--sources/plugins/newpage/lang/he.js7
-rw-r--r--sources/plugins/newpage/lang/hi.js7
-rw-r--r--sources/plugins/newpage/lang/hr.js7
-rw-r--r--sources/plugins/newpage/lang/hu.js7
-rw-r--r--sources/plugins/newpage/lang/id.js7
-rw-r--r--sources/plugins/newpage/lang/is.js7
-rw-r--r--sources/plugins/newpage/lang/it.js7
-rw-r--r--sources/plugins/newpage/lang/ja.js7
-rw-r--r--sources/plugins/newpage/lang/ka.js7
-rw-r--r--sources/plugins/newpage/lang/km.js7
-rw-r--r--sources/plugins/newpage/lang/ko.js7
-rw-r--r--sources/plugins/newpage/lang/ku.js7
-rw-r--r--sources/plugins/newpage/lang/lt.js7
-rw-r--r--sources/plugins/newpage/lang/lv.js7
-rw-r--r--sources/plugins/newpage/lang/mk.js7
-rw-r--r--sources/plugins/newpage/lang/mn.js7
-rw-r--r--sources/plugins/newpage/lang/ms.js7
-rw-r--r--sources/plugins/newpage/lang/nb.js7
-rw-r--r--sources/plugins/newpage/lang/nl.js7
-rw-r--r--sources/plugins/newpage/lang/no.js7
-rw-r--r--sources/plugins/newpage/lang/pl.js7
-rw-r--r--sources/plugins/newpage/lang/pt-br.js7
-rw-r--r--sources/plugins/newpage/lang/pt.js7
-rw-r--r--sources/plugins/newpage/lang/ro.js7
-rw-r--r--sources/plugins/newpage/lang/ru.js7
-rw-r--r--sources/plugins/newpage/lang/si.js7
-rw-r--r--sources/plugins/newpage/lang/sk.js7
-rw-r--r--sources/plugins/newpage/lang/sl.js7
-rw-r--r--sources/plugins/newpage/lang/sq.js7
-rw-r--r--sources/plugins/newpage/lang/sr-latn.js7
-rw-r--r--sources/plugins/newpage/lang/sr.js7
-rw-r--r--sources/plugins/newpage/lang/sv.js7
-rw-r--r--sources/plugins/newpage/lang/th.js7
-rw-r--r--sources/plugins/newpage/lang/tr.js7
-rw-r--r--sources/plugins/newpage/lang/tt.js7
-rw-r--r--sources/plugins/newpage/lang/ug.js7
-rw-r--r--sources/plugins/newpage/lang/uk.js7
-rw-r--r--sources/plugins/newpage/lang/vi.js7
-rw-r--r--sources/plugins/newpage/lang/zh-cn.js7
-rw-r--r--sources/plugins/newpage/lang/zh.js7
-rw-r--r--sources/plugins/newpage/plugin.js53
-rw-r--r--sources/plugins/pagebreak/icons/hidpi/pagebreak-rtl.pngbin0 -> 1318 bytes
-rw-r--r--sources/plugins/pagebreak/icons/hidpi/pagebreak.pngbin0 -> 1299 bytes
-rw-r--r--sources/plugins/pagebreak/icons/pagebreak-rtl.pngbin0 -> 629 bytes
-rw-r--r--sources/plugins/pagebreak/icons/pagebreak.pngbin0 -> 602 bytes
-rw-r--r--sources/plugins/pagebreak/images/pagebreak.gifbin0 -> 99 bytes
-rw-r--r--sources/plugins/pagebreak/lang/af.js8
-rw-r--r--sources/plugins/pagebreak/lang/ar.js8
-rw-r--r--sources/plugins/pagebreak/lang/bg.js8
-rw-r--r--sources/plugins/pagebreak/lang/bn.js8
-rw-r--r--sources/plugins/pagebreak/lang/bs.js8
-rw-r--r--sources/plugins/pagebreak/lang/ca.js8
-rw-r--r--sources/plugins/pagebreak/lang/cs.js8
-rw-r--r--sources/plugins/pagebreak/lang/cy.js8
-rw-r--r--sources/plugins/pagebreak/lang/da.js8
-rw-r--r--sources/plugins/pagebreak/lang/de.js8
-rw-r--r--sources/plugins/pagebreak/lang/el.js8
-rw-r--r--sources/plugins/pagebreak/lang/en-au.js8
-rw-r--r--sources/plugins/pagebreak/lang/en-ca.js8
-rw-r--r--sources/plugins/pagebreak/lang/en-gb.js8
-rw-r--r--sources/plugins/pagebreak/lang/en.js8
-rw-r--r--sources/plugins/pagebreak/lang/eo.js8
-rw-r--r--sources/plugins/pagebreak/lang/es.js8
-rw-r--r--sources/plugins/pagebreak/lang/et.js8
-rw-r--r--sources/plugins/pagebreak/lang/eu.js8
-rw-r--r--sources/plugins/pagebreak/lang/fa.js8
-rw-r--r--sources/plugins/pagebreak/lang/fi.js8
-rw-r--r--sources/plugins/pagebreak/lang/fo.js8
-rw-r--r--sources/plugins/pagebreak/lang/fr-ca.js8
-rw-r--r--sources/plugins/pagebreak/lang/fr.js8
-rw-r--r--sources/plugins/pagebreak/lang/gl.js8
-rw-r--r--sources/plugins/pagebreak/lang/gu.js8
-rw-r--r--sources/plugins/pagebreak/lang/he.js8
-rw-r--r--sources/plugins/pagebreak/lang/hi.js8
-rw-r--r--sources/plugins/pagebreak/lang/hr.js8
-rw-r--r--sources/plugins/pagebreak/lang/hu.js8
-rw-r--r--sources/plugins/pagebreak/lang/id.js8
-rw-r--r--sources/plugins/pagebreak/lang/is.js8
-rw-r--r--sources/plugins/pagebreak/lang/it.js8
-rw-r--r--sources/plugins/pagebreak/lang/ja.js8
-rw-r--r--sources/plugins/pagebreak/lang/ka.js8
-rw-r--r--sources/plugins/pagebreak/lang/km.js8
-rw-r--r--sources/plugins/pagebreak/lang/ko.js8
-rw-r--r--sources/plugins/pagebreak/lang/ku.js8
-rw-r--r--sources/plugins/pagebreak/lang/lt.js8
-rw-r--r--sources/plugins/pagebreak/lang/lv.js8
-rw-r--r--sources/plugins/pagebreak/lang/mk.js8
-rw-r--r--sources/plugins/pagebreak/lang/mn.js8
-rw-r--r--sources/plugins/pagebreak/lang/ms.js8
-rw-r--r--sources/plugins/pagebreak/lang/nb.js8
-rw-r--r--sources/plugins/pagebreak/lang/nl.js8
-rw-r--r--sources/plugins/pagebreak/lang/no.js8
-rw-r--r--sources/plugins/pagebreak/lang/pl.js8
-rw-r--r--sources/plugins/pagebreak/lang/pt-br.js8
-rw-r--r--sources/plugins/pagebreak/lang/pt.js8
-rw-r--r--sources/plugins/pagebreak/lang/ro.js8
-rw-r--r--sources/plugins/pagebreak/lang/ru.js8
-rw-r--r--sources/plugins/pagebreak/lang/si.js8
-rw-r--r--sources/plugins/pagebreak/lang/sk.js8
-rw-r--r--sources/plugins/pagebreak/lang/sl.js8
-rw-r--r--sources/plugins/pagebreak/lang/sq.js8
-rw-r--r--sources/plugins/pagebreak/lang/sr-latn.js8
-rw-r--r--sources/plugins/pagebreak/lang/sr.js8
-rw-r--r--sources/plugins/pagebreak/lang/sv.js8
-rw-r--r--sources/plugins/pagebreak/lang/th.js8
-rw-r--r--sources/plugins/pagebreak/lang/tr.js8
-rw-r--r--sources/plugins/pagebreak/lang/tt.js8
-rw-r--r--sources/plugins/pagebreak/lang/ug.js8
-rw-r--r--sources/plugins/pagebreak/lang/uk.js8
-rw-r--r--sources/plugins/pagebreak/lang/vi.js8
-rw-r--r--sources/plugins/pagebreak/lang/zh-cn.js8
-rw-r--r--sources/plugins/pagebreak/lang/zh.js8
-rw-r--r--sources/plugins/pagebreak/plugin.js160
-rw-r--r--sources/plugins/panel/plugin.js403
-rw-r--r--sources/plugins/panelbutton/plugin.js138
-rw-r--r--sources/plugins/pastefromword/filter/default.js1251
-rw-r--r--sources/plugins/pastefromword/icons/hidpi/pastefromword-rtl.pngbin0 -> 2090 bytes
-rw-r--r--sources/plugins/pastefromword/icons/hidpi/pastefromword.pngbin0 -> 2105 bytes
-rw-r--r--sources/plugins/pastefromword/icons/pastefromword-rtl.pngbin0 -> 720 bytes
-rw-r--r--sources/plugins/pastefromword/icons/pastefromword.pngbin0 -> 723 bytes
-rw-r--r--sources/plugins/pastefromword/lang/af.js10
-rw-r--r--sources/plugins/pastefromword/lang/ar.js10
-rw-r--r--sources/plugins/pastefromword/lang/bg.js10
-rw-r--r--sources/plugins/pastefromword/lang/bn.js10
-rw-r--r--sources/plugins/pastefromword/lang/bs.js10
-rw-r--r--sources/plugins/pastefromword/lang/ca.js10
-rw-r--r--sources/plugins/pastefromword/lang/cs.js10
-rw-r--r--sources/plugins/pastefromword/lang/cy.js10
-rw-r--r--sources/plugins/pastefromword/lang/da.js10
-rw-r--r--sources/plugins/pastefromword/lang/de.js10
-rw-r--r--sources/plugins/pastefromword/lang/el.js10
-rw-r--r--sources/plugins/pastefromword/lang/en-au.js10
-rw-r--r--sources/plugins/pastefromword/lang/en-ca.js10
-rw-r--r--sources/plugins/pastefromword/lang/en-gb.js10
-rw-r--r--sources/plugins/pastefromword/lang/en.js10
-rw-r--r--sources/plugins/pastefromword/lang/eo.js10
-rw-r--r--sources/plugins/pastefromword/lang/es.js10
-rw-r--r--sources/plugins/pastefromword/lang/et.js10
-rw-r--r--sources/plugins/pastefromword/lang/eu.js10
-rw-r--r--sources/plugins/pastefromword/lang/fa.js10
-rw-r--r--sources/plugins/pastefromword/lang/fi.js10
-rw-r--r--sources/plugins/pastefromword/lang/fo.js10
-rw-r--r--sources/plugins/pastefromword/lang/fr-ca.js10
-rw-r--r--sources/plugins/pastefromword/lang/fr.js10
-rw-r--r--sources/plugins/pastefromword/lang/gl.js10
-rw-r--r--sources/plugins/pastefromword/lang/gu.js10
-rw-r--r--sources/plugins/pastefromword/lang/he.js10
-rw-r--r--sources/plugins/pastefromword/lang/hi.js10
-rw-r--r--sources/plugins/pastefromword/lang/hr.js10
-rw-r--r--sources/plugins/pastefromword/lang/hu.js10
-rw-r--r--sources/plugins/pastefromword/lang/id.js10
-rw-r--r--sources/plugins/pastefromword/lang/is.js10
-rw-r--r--sources/plugins/pastefromword/lang/it.js10
-rw-r--r--sources/plugins/pastefromword/lang/ja.js10
-rw-r--r--sources/plugins/pastefromword/lang/ka.js10
-rw-r--r--sources/plugins/pastefromword/lang/km.js10
-rw-r--r--sources/plugins/pastefromword/lang/ko.js10
-rw-r--r--sources/plugins/pastefromword/lang/ku.js10
-rw-r--r--sources/plugins/pastefromword/lang/lt.js10
-rw-r--r--sources/plugins/pastefromword/lang/lv.js10
-rw-r--r--sources/plugins/pastefromword/lang/mk.js10
-rw-r--r--sources/plugins/pastefromword/lang/mn.js10
-rw-r--r--sources/plugins/pastefromword/lang/ms.js10
-rw-r--r--sources/plugins/pastefromword/lang/nb.js10
-rw-r--r--sources/plugins/pastefromword/lang/nl.js10
-rw-r--r--sources/plugins/pastefromword/lang/no.js10
-rw-r--r--sources/plugins/pastefromword/lang/pl.js10
-rw-r--r--sources/plugins/pastefromword/lang/pt-br.js10
-rw-r--r--sources/plugins/pastefromword/lang/pt.js10
-rw-r--r--sources/plugins/pastefromword/lang/ro.js10
-rw-r--r--sources/plugins/pastefromword/lang/ru.js10
-rw-r--r--sources/plugins/pastefromword/lang/si.js10
-rw-r--r--sources/plugins/pastefromword/lang/sk.js10
-rw-r--r--sources/plugins/pastefromword/lang/sl.js10
-rw-r--r--sources/plugins/pastefromword/lang/sq.js10
-rw-r--r--sources/plugins/pastefromword/lang/sr-latn.js10
-rw-r--r--sources/plugins/pastefromword/lang/sr.js10
-rw-r--r--sources/plugins/pastefromword/lang/sv.js10
-rw-r--r--sources/plugins/pastefromword/lang/th.js10
-rw-r--r--sources/plugins/pastefromword/lang/tr.js10
-rw-r--r--sources/plugins/pastefromword/lang/tt.js10
-rw-r--r--sources/plugins/pastefromword/lang/ug.js10
-rw-r--r--sources/plugins/pastefromword/lang/uk.js10
-rw-r--r--sources/plugins/pastefromword/lang/vi.js10
-rw-r--r--sources/plugins/pastefromword/lang/zh-cn.js10
-rw-r--r--sources/plugins/pastefromword/lang/zh.js10
-rw-r--r--sources/plugins/pastefromword/plugin.js149
-rw-r--r--sources/plugins/pastetext/icons/hidpi/pastetext-rtl.pngbin0 -> 1950 bytes
-rw-r--r--sources/plugins/pastetext/icons/hidpi/pastetext.pngbin0 -> 1963 bytes
-rw-r--r--sources/plugins/pastetext/icons/pastetext-rtl.pngbin0 -> 752 bytes
-rw-r--r--sources/plugins/pastetext/icons/pastetext.pngbin0 -> 750 bytes
-rw-r--r--sources/plugins/pastetext/lang/af.js8
-rw-r--r--sources/plugins/pastetext/lang/ar.js8
-rw-r--r--sources/plugins/pastetext/lang/bg.js8
-rw-r--r--sources/plugins/pastetext/lang/bn.js8
-rw-r--r--sources/plugins/pastetext/lang/bs.js8
-rw-r--r--sources/plugins/pastetext/lang/ca.js8
-rw-r--r--sources/plugins/pastetext/lang/cs.js8
-rw-r--r--sources/plugins/pastetext/lang/cy.js8
-rw-r--r--sources/plugins/pastetext/lang/da.js8
-rw-r--r--sources/plugins/pastetext/lang/de.js8
-rw-r--r--sources/plugins/pastetext/lang/el.js8
-rw-r--r--sources/plugins/pastetext/lang/en-au.js8
-rw-r--r--sources/plugins/pastetext/lang/en-ca.js8
-rw-r--r--sources/plugins/pastetext/lang/en-gb.js8
-rw-r--r--sources/plugins/pastetext/lang/en.js8
-rw-r--r--sources/plugins/pastetext/lang/eo.js8
-rw-r--r--sources/plugins/pastetext/lang/es.js8
-rw-r--r--sources/plugins/pastetext/lang/et.js8
-rw-r--r--sources/plugins/pastetext/lang/eu.js8
-rw-r--r--sources/plugins/pastetext/lang/fa.js8
-rw-r--r--sources/plugins/pastetext/lang/fi.js8
-rw-r--r--sources/plugins/pastetext/lang/fo.js8
-rw-r--r--sources/plugins/pastetext/lang/fr-ca.js8
-rw-r--r--sources/plugins/pastetext/lang/fr.js8
-rw-r--r--sources/plugins/pastetext/lang/gl.js8
-rw-r--r--sources/plugins/pastetext/lang/gu.js8
-rw-r--r--sources/plugins/pastetext/lang/he.js8
-rw-r--r--sources/plugins/pastetext/lang/hi.js8
-rw-r--r--sources/plugins/pastetext/lang/hr.js8
-rw-r--r--sources/plugins/pastetext/lang/hu.js8
-rw-r--r--sources/plugins/pastetext/lang/id.js8
-rw-r--r--sources/plugins/pastetext/lang/is.js8
-rw-r--r--sources/plugins/pastetext/lang/it.js8
-rw-r--r--sources/plugins/pastetext/lang/ja.js8
-rw-r--r--sources/plugins/pastetext/lang/ka.js8
-rw-r--r--sources/plugins/pastetext/lang/km.js8
-rw-r--r--sources/plugins/pastetext/lang/ko.js8
-rw-r--r--sources/plugins/pastetext/lang/ku.js8
-rw-r--r--sources/plugins/pastetext/lang/lt.js8
-rw-r--r--sources/plugins/pastetext/lang/lv.js8
-rw-r--r--sources/plugins/pastetext/lang/mk.js8
-rw-r--r--sources/plugins/pastetext/lang/mn.js8
-rw-r--r--sources/plugins/pastetext/lang/ms.js8
-rw-r--r--sources/plugins/pastetext/lang/nb.js8
-rw-r--r--sources/plugins/pastetext/lang/nl.js8
-rw-r--r--sources/plugins/pastetext/lang/no.js8
-rw-r--r--sources/plugins/pastetext/lang/pl.js8
-rw-r--r--sources/plugins/pastetext/lang/pt-br.js8
-rw-r--r--sources/plugins/pastetext/lang/pt.js8
-rw-r--r--sources/plugins/pastetext/lang/ro.js8
-rw-r--r--sources/plugins/pastetext/lang/ru.js8
-rw-r--r--sources/plugins/pastetext/lang/si.js8
-rw-r--r--sources/plugins/pastetext/lang/sk.js8
-rw-r--r--sources/plugins/pastetext/lang/sl.js8
-rw-r--r--sources/plugins/pastetext/lang/sq.js8
-rw-r--r--sources/plugins/pastetext/lang/sr-latn.js8
-rw-r--r--sources/plugins/pastetext/lang/sr.js8
-rw-r--r--sources/plugins/pastetext/lang/sv.js8
-rw-r--r--sources/plugins/pastetext/lang/th.js8
-rw-r--r--sources/plugins/pastetext/lang/tr.js8
-rw-r--r--sources/plugins/pastetext/lang/tt.js8
-rw-r--r--sources/plugins/pastetext/lang/ug.js8
-rw-r--r--sources/plugins/pastetext/lang/uk.js8
-rw-r--r--sources/plugins/pastetext/lang/vi.js8
-rw-r--r--sources/plugins/pastetext/lang/zh-cn.js8
-rw-r--r--sources/plugins/pastetext/lang/zh.js8
-rw-r--r--sources/plugins/pastetext/plugin.js83
-rw-r--r--sources/plugins/popup/plugin.js65
-rw-r--r--sources/plugins/preview/icons/hidpi/preview-rtl.pngbin0 -> 2145 bytes
-rw-r--r--sources/plugins/preview/icons/hidpi/preview.pngbin0 -> 2204 bytes
-rw-r--r--sources/plugins/preview/icons/preview-rtl.pngbin0 -> 850 bytes
-rw-r--r--sources/plugins/preview/icons/preview.pngbin0 -> 855 bytes
-rw-r--r--sources/plugins/preview/lang/af.js7
-rw-r--r--sources/plugins/preview/lang/ar.js7
-rw-r--r--sources/plugins/preview/lang/bg.js7
-rw-r--r--sources/plugins/preview/lang/bn.js7
-rw-r--r--sources/plugins/preview/lang/bs.js7
-rw-r--r--sources/plugins/preview/lang/ca.js7
-rw-r--r--sources/plugins/preview/lang/cs.js7
-rw-r--r--sources/plugins/preview/lang/cy.js7
-rw-r--r--sources/plugins/preview/lang/da.js7
-rw-r--r--sources/plugins/preview/lang/de.js7
-rw-r--r--sources/plugins/preview/lang/el.js7
-rw-r--r--sources/plugins/preview/lang/en-au.js7
-rw-r--r--sources/plugins/preview/lang/en-ca.js7
-rw-r--r--sources/plugins/preview/lang/en-gb.js7
-rw-r--r--sources/plugins/preview/lang/en.js7
-rw-r--r--sources/plugins/preview/lang/eo.js7
-rw-r--r--sources/plugins/preview/lang/es.js7
-rw-r--r--sources/plugins/preview/lang/et.js7
-rw-r--r--sources/plugins/preview/lang/eu.js7
-rw-r--r--sources/plugins/preview/lang/fa.js7
-rw-r--r--sources/plugins/preview/lang/fi.js7
-rw-r--r--sources/plugins/preview/lang/fo.js7
-rw-r--r--sources/plugins/preview/lang/fr-ca.js7
-rw-r--r--sources/plugins/preview/lang/fr.js7
-rw-r--r--sources/plugins/preview/lang/gl.js7
-rw-r--r--sources/plugins/preview/lang/gu.js7
-rw-r--r--sources/plugins/preview/lang/he.js7
-rw-r--r--sources/plugins/preview/lang/hi.js7
-rw-r--r--sources/plugins/preview/lang/hr.js7
-rw-r--r--sources/plugins/preview/lang/hu.js7
-rw-r--r--sources/plugins/preview/lang/id.js7
-rw-r--r--sources/plugins/preview/lang/is.js7
-rw-r--r--sources/plugins/preview/lang/it.js7
-rw-r--r--sources/plugins/preview/lang/ja.js7
-rw-r--r--sources/plugins/preview/lang/ka.js7
-rw-r--r--sources/plugins/preview/lang/km.js7
-rw-r--r--sources/plugins/preview/lang/ko.js7
-rw-r--r--sources/plugins/preview/lang/ku.js7
-rw-r--r--sources/plugins/preview/lang/lt.js7
-rw-r--r--sources/plugins/preview/lang/lv.js7
-rw-r--r--sources/plugins/preview/lang/mk.js7
-rw-r--r--sources/plugins/preview/lang/mn.js7
-rw-r--r--sources/plugins/preview/lang/ms.js7
-rw-r--r--sources/plugins/preview/lang/nb.js7
-rw-r--r--sources/plugins/preview/lang/nl.js7
-rw-r--r--sources/plugins/preview/lang/no.js7
-rw-r--r--sources/plugins/preview/lang/pl.js7
-rw-r--r--sources/plugins/preview/lang/pt-br.js7
-rw-r--r--sources/plugins/preview/lang/pt.js7
-rw-r--r--sources/plugins/preview/lang/ro.js7
-rw-r--r--sources/plugins/preview/lang/ru.js7
-rw-r--r--sources/plugins/preview/lang/si.js7
-rw-r--r--sources/plugins/preview/lang/sk.js7
-rw-r--r--sources/plugins/preview/lang/sl.js7
-rw-r--r--sources/plugins/preview/lang/sq.js7
-rw-r--r--sources/plugins/preview/lang/sr-latn.js7
-rw-r--r--sources/plugins/preview/lang/sr.js7
-rw-r--r--sources/plugins/preview/lang/sv.js7
-rw-r--r--sources/plugins/preview/lang/th.js7
-rw-r--r--sources/plugins/preview/lang/tr.js7
-rw-r--r--sources/plugins/preview/lang/tt.js7
-rw-r--r--sources/plugins/preview/lang/ug.js7
-rw-r--r--sources/plugins/preview/lang/uk.js7
-rw-r--r--sources/plugins/preview/lang/vi.js7
-rw-r--r--sources/plugins/preview/lang/zh-cn.js7
-rw-r--r--sources/plugins/preview/lang/zh.js7
-rw-r--r--sources/plugins/preview/plugin.js145
-rw-r--r--sources/plugins/preview/preview.html13
-rw-r--r--sources/plugins/print/icons/hidpi/print.pngbin0 -> 1648 bytes
-rw-r--r--sources/plugins/print/icons/print.pngbin0 -> 765 bytes
-rw-r--r--sources/plugins/print/lang/af.js7
-rw-r--r--sources/plugins/print/lang/ar.js7
-rw-r--r--sources/plugins/print/lang/bg.js7
-rw-r--r--sources/plugins/print/lang/bn.js7
-rw-r--r--sources/plugins/print/lang/bs.js7
-rw-r--r--sources/plugins/print/lang/ca.js7
-rw-r--r--sources/plugins/print/lang/cs.js7
-rw-r--r--sources/plugins/print/lang/cy.js7
-rw-r--r--sources/plugins/print/lang/da.js7
-rw-r--r--sources/plugins/print/lang/de.js7
-rw-r--r--sources/plugins/print/lang/el.js7
-rw-r--r--sources/plugins/print/lang/en-au.js7
-rw-r--r--sources/plugins/print/lang/en-ca.js7
-rw-r--r--sources/plugins/print/lang/en-gb.js7
-rw-r--r--sources/plugins/print/lang/en.js7
-rw-r--r--sources/plugins/print/lang/eo.js7
-rw-r--r--sources/plugins/print/lang/es.js7
-rw-r--r--sources/plugins/print/lang/et.js7
-rw-r--r--sources/plugins/print/lang/eu.js7
-rw-r--r--sources/plugins/print/lang/fa.js7
-rw-r--r--sources/plugins/print/lang/fi.js7
-rw-r--r--sources/plugins/print/lang/fo.js7
-rw-r--r--sources/plugins/print/lang/fr-ca.js7
-rw-r--r--sources/plugins/print/lang/fr.js7
-rw-r--r--sources/plugins/print/lang/gl.js7
-rw-r--r--sources/plugins/print/lang/gu.js7
-rw-r--r--sources/plugins/print/lang/he.js7
-rw-r--r--sources/plugins/print/lang/hi.js7
-rw-r--r--sources/plugins/print/lang/hr.js7
-rw-r--r--sources/plugins/print/lang/hu.js7
-rw-r--r--sources/plugins/print/lang/id.js7
-rw-r--r--sources/plugins/print/lang/is.js7
-rw-r--r--sources/plugins/print/lang/it.js7
-rw-r--r--sources/plugins/print/lang/ja.js7
-rw-r--r--sources/plugins/print/lang/ka.js7
-rw-r--r--sources/plugins/print/lang/km.js7
-rw-r--r--sources/plugins/print/lang/ko.js7
-rw-r--r--sources/plugins/print/lang/ku.js7
-rw-r--r--sources/plugins/print/lang/lt.js7
-rw-r--r--sources/plugins/print/lang/lv.js7
-rw-r--r--sources/plugins/print/lang/mk.js7
-rw-r--r--sources/plugins/print/lang/mn.js7
-rw-r--r--sources/plugins/print/lang/ms.js7
-rw-r--r--sources/plugins/print/lang/nb.js7
-rw-r--r--sources/plugins/print/lang/nl.js7
-rw-r--r--sources/plugins/print/lang/no.js7
-rw-r--r--sources/plugins/print/lang/pl.js7
-rw-r--r--sources/plugins/print/lang/pt-br.js7
-rw-r--r--sources/plugins/print/lang/pt.js7
-rw-r--r--sources/plugins/print/lang/ro.js7
-rw-r--r--sources/plugins/print/lang/ru.js7
-rw-r--r--sources/plugins/print/lang/si.js7
-rw-r--r--sources/plugins/print/lang/sk.js7
-rw-r--r--sources/plugins/print/lang/sl.js7
-rw-r--r--sources/plugins/print/lang/sq.js7
-rw-r--r--sources/plugins/print/lang/sr-latn.js7
-rw-r--r--sources/plugins/print/lang/sr.js7
-rw-r--r--sources/plugins/print/lang/sv.js7
-rw-r--r--sources/plugins/print/lang/th.js7
-rw-r--r--sources/plugins/print/lang/tr.js7
-rw-r--r--sources/plugins/print/lang/tt.js7
-rw-r--r--sources/plugins/print/lang/ug.js7
-rw-r--r--sources/plugins/print/lang/uk.js7
-rw-r--r--sources/plugins/print/lang/vi.js7
-rw-r--r--sources/plugins/print/lang/zh-cn.js7
-rw-r--r--sources/plugins/print/lang/zh.js7
-rw-r--r--sources/plugins/print/plugin.js46
-rw-r--r--sources/plugins/removeformat/icons/hidpi/removeformat.pngbin0 -> 2119 bytes
-rw-r--r--sources/plugins/removeformat/icons/removeformat.pngbin0 -> 871 bytes
-rw-r--r--sources/plugins/removeformat/lang/af.js7
-rw-r--r--sources/plugins/removeformat/lang/ar.js7
-rw-r--r--sources/plugins/removeformat/lang/bg.js7
-rw-r--r--sources/plugins/removeformat/lang/bn.js7
-rw-r--r--sources/plugins/removeformat/lang/bs.js7
-rw-r--r--sources/plugins/removeformat/lang/ca.js7
-rw-r--r--sources/plugins/removeformat/lang/cs.js7
-rw-r--r--sources/plugins/removeformat/lang/cy.js7
-rw-r--r--sources/plugins/removeformat/lang/da.js7
-rw-r--r--sources/plugins/removeformat/lang/de.js7
-rw-r--r--sources/plugins/removeformat/lang/el.js7
-rw-r--r--sources/plugins/removeformat/lang/en-au.js7
-rw-r--r--sources/plugins/removeformat/lang/en-ca.js7
-rw-r--r--sources/plugins/removeformat/lang/en-gb.js7
-rw-r--r--sources/plugins/removeformat/lang/en.js7
-rw-r--r--sources/plugins/removeformat/lang/eo.js7
-rw-r--r--sources/plugins/removeformat/lang/es.js7
-rw-r--r--sources/plugins/removeformat/lang/et.js7
-rw-r--r--sources/plugins/removeformat/lang/eu.js7
-rw-r--r--sources/plugins/removeformat/lang/fa.js7
-rw-r--r--sources/plugins/removeformat/lang/fi.js7
-rw-r--r--sources/plugins/removeformat/lang/fo.js7
-rw-r--r--sources/plugins/removeformat/lang/fr-ca.js7
-rw-r--r--sources/plugins/removeformat/lang/fr.js7
-rw-r--r--sources/plugins/removeformat/lang/gl.js7
-rw-r--r--sources/plugins/removeformat/lang/gu.js7
-rw-r--r--sources/plugins/removeformat/lang/he.js7
-rw-r--r--sources/plugins/removeformat/lang/hi.js7
-rw-r--r--sources/plugins/removeformat/lang/hr.js7
-rw-r--r--sources/plugins/removeformat/lang/hu.js7
-rw-r--r--sources/plugins/removeformat/lang/id.js7
-rw-r--r--sources/plugins/removeformat/lang/is.js7
-rw-r--r--sources/plugins/removeformat/lang/it.js7
-rw-r--r--sources/plugins/removeformat/lang/ja.js7
-rw-r--r--sources/plugins/removeformat/lang/ka.js7
-rw-r--r--sources/plugins/removeformat/lang/km.js7
-rw-r--r--sources/plugins/removeformat/lang/ko.js7
-rw-r--r--sources/plugins/removeformat/lang/ku.js7
-rw-r--r--sources/plugins/removeformat/lang/lt.js7
-rw-r--r--sources/plugins/removeformat/lang/lv.js7
-rw-r--r--sources/plugins/removeformat/lang/mk.js7
-rw-r--r--sources/plugins/removeformat/lang/mn.js7
-rw-r--r--sources/plugins/removeformat/lang/ms.js7
-rw-r--r--sources/plugins/removeformat/lang/nb.js7
-rw-r--r--sources/plugins/removeformat/lang/nl.js7
-rw-r--r--sources/plugins/removeformat/lang/no.js7
-rw-r--r--sources/plugins/removeformat/lang/pl.js7
-rw-r--r--sources/plugins/removeformat/lang/pt-br.js7
-rw-r--r--sources/plugins/removeformat/lang/pt.js7
-rw-r--r--sources/plugins/removeformat/lang/ro.js7
-rw-r--r--sources/plugins/removeformat/lang/ru.js7
-rw-r--r--sources/plugins/removeformat/lang/si.js7
-rw-r--r--sources/plugins/removeformat/lang/sk.js7
-rw-r--r--sources/plugins/removeformat/lang/sl.js7
-rw-r--r--sources/plugins/removeformat/lang/sq.js7
-rw-r--r--sources/plugins/removeformat/lang/sr-latn.js7
-rw-r--r--sources/plugins/removeformat/lang/sr.js7
-rw-r--r--sources/plugins/removeformat/lang/sv.js7
-rw-r--r--sources/plugins/removeformat/lang/th.js7
-rw-r--r--sources/plugins/removeformat/lang/tr.js7
-rw-r--r--sources/plugins/removeformat/lang/tt.js7
-rw-r--r--sources/plugins/removeformat/lang/ug.js7
-rw-r--r--sources/plugins/removeformat/lang/uk.js7
-rw-r--r--sources/plugins/removeformat/lang/vi.js7
-rw-r--r--sources/plugins/removeformat/lang/zh-cn.js7
-rw-r--r--sources/plugins/removeformat/lang/zh.js7
-rw-r--r--sources/plugins/removeformat/plugin.js193
-rw-r--r--sources/plugins/resize/plugin.js187
-rw-r--r--sources/plugins/richcombo/plugin.js434
-rw-r--r--sources/plugins/save/icons/hidpi/save.pngbin0 -> 1648 bytes
-rw-r--r--sources/plugins/save/icons/save.pngbin0 -> 716 bytes
-rw-r--r--sources/plugins/save/lang/af.js7
-rw-r--r--sources/plugins/save/lang/ar.js7
-rw-r--r--sources/plugins/save/lang/bg.js7
-rw-r--r--sources/plugins/save/lang/bn.js7
-rw-r--r--sources/plugins/save/lang/bs.js7
-rw-r--r--sources/plugins/save/lang/ca.js7
-rw-r--r--sources/plugins/save/lang/cs.js7
-rw-r--r--sources/plugins/save/lang/cy.js7
-rw-r--r--sources/plugins/save/lang/da.js7
-rw-r--r--sources/plugins/save/lang/de.js7
-rw-r--r--sources/plugins/save/lang/el.js7
-rw-r--r--sources/plugins/save/lang/en-au.js7
-rw-r--r--sources/plugins/save/lang/en-ca.js7
-rw-r--r--sources/plugins/save/lang/en-gb.js7
-rw-r--r--sources/plugins/save/lang/en.js7
-rw-r--r--sources/plugins/save/lang/eo.js7
-rw-r--r--sources/plugins/save/lang/es.js7
-rw-r--r--sources/plugins/save/lang/et.js7
-rw-r--r--sources/plugins/save/lang/eu.js7
-rw-r--r--sources/plugins/save/lang/fa.js7
-rw-r--r--sources/plugins/save/lang/fi.js7
-rw-r--r--sources/plugins/save/lang/fo.js7
-rw-r--r--sources/plugins/save/lang/fr-ca.js7
-rw-r--r--sources/plugins/save/lang/fr.js7
-rw-r--r--sources/plugins/save/lang/gl.js7
-rw-r--r--sources/plugins/save/lang/gu.js7
-rw-r--r--sources/plugins/save/lang/he.js7
-rw-r--r--sources/plugins/save/lang/hi.js7
-rw-r--r--sources/plugins/save/lang/hr.js7
-rw-r--r--sources/plugins/save/lang/hu.js7
-rw-r--r--sources/plugins/save/lang/id.js7
-rw-r--r--sources/plugins/save/lang/is.js7
-rw-r--r--sources/plugins/save/lang/it.js7
-rw-r--r--sources/plugins/save/lang/ja.js7
-rw-r--r--sources/plugins/save/lang/ka.js7
-rw-r--r--sources/plugins/save/lang/km.js7
-rw-r--r--sources/plugins/save/lang/ko.js7
-rw-r--r--sources/plugins/save/lang/ku.js7
-rw-r--r--sources/plugins/save/lang/lt.js7
-rw-r--r--sources/plugins/save/lang/lv.js7
-rw-r--r--sources/plugins/save/lang/mk.js7
-rw-r--r--sources/plugins/save/lang/mn.js7
-rw-r--r--sources/plugins/save/lang/ms.js7
-rw-r--r--sources/plugins/save/lang/nb.js7
-rw-r--r--sources/plugins/save/lang/nl.js7
-rw-r--r--sources/plugins/save/lang/no.js7
-rw-r--r--sources/plugins/save/lang/pl.js7
-rw-r--r--sources/plugins/save/lang/pt-br.js7
-rw-r--r--sources/plugins/save/lang/pt.js7
-rw-r--r--sources/plugins/save/lang/ro.js7
-rw-r--r--sources/plugins/save/lang/ru.js7
-rw-r--r--sources/plugins/save/lang/si.js7
-rw-r--r--sources/plugins/save/lang/sk.js7
-rw-r--r--sources/plugins/save/lang/sl.js7
-rw-r--r--sources/plugins/save/lang/sq.js7
-rw-r--r--sources/plugins/save/lang/sr-latn.js7
-rw-r--r--sources/plugins/save/lang/sr.js7
-rw-r--r--sources/plugins/save/lang/sv.js7
-rw-r--r--sources/plugins/save/lang/th.js7
-rw-r--r--sources/plugins/save/lang/tr.js7
-rw-r--r--sources/plugins/save/lang/tt.js7
-rw-r--r--sources/plugins/save/lang/ug.js7
-rw-r--r--sources/plugins/save/lang/uk.js7
-rw-r--r--sources/plugins/save/lang/vi.js7
-rw-r--r--sources/plugins/save/lang/zh-cn.js7
-rw-r--r--sources/plugins/save/lang/zh.js7
-rw-r--r--sources/plugins/save/plugin.js67
-rw-r--r--sources/plugins/scayt/CHANGELOG.md20
-rw-r--r--sources/plugins/scayt/LICENSE.md28
-rw-r--r--sources/plugins/scayt/README.md25
-rw-r--r--sources/plugins/scayt/dialogs/options.js573
-rw-r--r--sources/plugins/scayt/dialogs/toolbar.css71
-rw-r--r--sources/plugins/scayt/icons/hidpi/scayt.pngbin0 -> 2816 bytes
-rw-r--r--sources/plugins/scayt/icons/scayt.pngbin0 -> 839 bytes
-rw-r--r--sources/plugins/scayt/lang/af.js13
-rw-r--r--sources/plugins/scayt/lang/ar.js13
-rw-r--r--sources/plugins/scayt/lang/bg.js13
-rw-r--r--sources/plugins/scayt/lang/bn.js13
-rw-r--r--sources/plugins/scayt/lang/bs.js13
-rw-r--r--sources/plugins/scayt/lang/ca.js13
-rw-r--r--sources/plugins/scayt/lang/cs.js13
-rw-r--r--sources/plugins/scayt/lang/cy.js13
-rw-r--r--sources/plugins/scayt/lang/da.js13
-rw-r--r--sources/plugins/scayt/lang/de.js13
-rw-r--r--sources/plugins/scayt/lang/el.js13
-rw-r--r--sources/plugins/scayt/lang/en-au.js13
-rw-r--r--sources/plugins/scayt/lang/en-ca.js13
-rw-r--r--sources/plugins/scayt/lang/en-gb.js13
-rw-r--r--sources/plugins/scayt/lang/en.js13
-rw-r--r--sources/plugins/scayt/lang/eo.js13
-rw-r--r--sources/plugins/scayt/lang/es.js13
-rw-r--r--sources/plugins/scayt/lang/et.js13
-rw-r--r--sources/plugins/scayt/lang/eu.js13
-rw-r--r--sources/plugins/scayt/lang/fa.js13
-rw-r--r--sources/plugins/scayt/lang/fi.js13
-rw-r--r--sources/plugins/scayt/lang/fo.js13
-rw-r--r--sources/plugins/scayt/lang/fr-ca.js13
-rw-r--r--sources/plugins/scayt/lang/fr.js13
-rw-r--r--sources/plugins/scayt/lang/gl.js13
-rw-r--r--sources/plugins/scayt/lang/gu.js13
-rw-r--r--sources/plugins/scayt/lang/he.js13
-rw-r--r--sources/plugins/scayt/lang/hi.js13
-rw-r--r--sources/plugins/scayt/lang/hr.js13
-rw-r--r--sources/plugins/scayt/lang/hu.js13
-rw-r--r--sources/plugins/scayt/lang/is.js13
-rw-r--r--sources/plugins/scayt/lang/it.js13
-rw-r--r--sources/plugins/scayt/lang/ja.js13
-rw-r--r--sources/plugins/scayt/lang/ka.js13
-rw-r--r--sources/plugins/scayt/lang/km.js13
-rw-r--r--sources/plugins/scayt/lang/ko.js13
-rw-r--r--sources/plugins/scayt/lang/ku.js13
-rw-r--r--sources/plugins/scayt/lang/lt.js13
-rw-r--r--sources/plugins/scayt/lang/lv.js13
-rw-r--r--sources/plugins/scayt/lang/mk.js13
-rw-r--r--sources/plugins/scayt/lang/mn.js13
-rw-r--r--sources/plugins/scayt/lang/ms.js13
-rw-r--r--sources/plugins/scayt/lang/nb.js13
-rw-r--r--sources/plugins/scayt/lang/nl.js13
-rw-r--r--sources/plugins/scayt/lang/no.js13
-rw-r--r--sources/plugins/scayt/lang/pl.js13
-rw-r--r--sources/plugins/scayt/lang/pt-br.js13
-rw-r--r--sources/plugins/scayt/lang/pt.js13
-rw-r--r--sources/plugins/scayt/lang/ro.js13
-rw-r--r--sources/plugins/scayt/lang/ru.js13
-rw-r--r--sources/plugins/scayt/lang/sk.js13
-rw-r--r--sources/plugins/scayt/lang/sl.js13
-rw-r--r--sources/plugins/scayt/lang/sr-latn.js13
-rw-r--r--sources/plugins/scayt/lang/sr.js13
-rw-r--r--sources/plugins/scayt/lang/sv.js13
-rw-r--r--sources/plugins/scayt/lang/th.js13
-rw-r--r--sources/plugins/scayt/lang/tr.js13
-rw-r--r--sources/plugins/scayt/lang/ug.js13
-rw-r--r--sources/plugins/scayt/lang/uk.js13
-rw-r--r--sources/plugins/scayt/lang/vi.js13
-rw-r--r--sources/plugins/scayt/lang/zh-cn.js13
-rw-r--r--sources/plugins/scayt/lang/zh.js13
-rw-r--r--sources/plugins/scayt/plugin.js1800
-rw-r--r--sources/plugins/selectall/icons/hidpi/selectall.pngbin0 -> 1093 bytes
-rw-r--r--sources/plugins/selectall/icons/selectall.pngbin0 -> 665 bytes
-rw-r--r--sources/plugins/selectall/lang/af.js7
-rw-r--r--sources/plugins/selectall/lang/ar.js7
-rw-r--r--sources/plugins/selectall/lang/bg.js7
-rw-r--r--sources/plugins/selectall/lang/bn.js7
-rw-r--r--sources/plugins/selectall/lang/bs.js7
-rw-r--r--sources/plugins/selectall/lang/ca.js7
-rw-r--r--sources/plugins/selectall/lang/cs.js7
-rw-r--r--sources/plugins/selectall/lang/cy.js7
-rw-r--r--sources/plugins/selectall/lang/da.js7
-rw-r--r--sources/plugins/selectall/lang/de.js7
-rw-r--r--sources/plugins/selectall/lang/el.js7
-rw-r--r--sources/plugins/selectall/lang/en-au.js7
-rw-r--r--sources/plugins/selectall/lang/en-ca.js7
-rw-r--r--sources/plugins/selectall/lang/en-gb.js7
-rw-r--r--sources/plugins/selectall/lang/en.js7
-rw-r--r--sources/plugins/selectall/lang/eo.js7
-rw-r--r--sources/plugins/selectall/lang/es.js7
-rw-r--r--sources/plugins/selectall/lang/et.js7
-rw-r--r--sources/plugins/selectall/lang/eu.js7
-rw-r--r--sources/plugins/selectall/lang/fa.js7
-rw-r--r--sources/plugins/selectall/lang/fi.js7
-rw-r--r--sources/plugins/selectall/lang/fo.js7
-rw-r--r--sources/plugins/selectall/lang/fr-ca.js7
-rw-r--r--sources/plugins/selectall/lang/fr.js7
-rw-r--r--sources/plugins/selectall/lang/gl.js7
-rw-r--r--sources/plugins/selectall/lang/gu.js7
-rw-r--r--sources/plugins/selectall/lang/he.js7
-rw-r--r--sources/plugins/selectall/lang/hi.js7
-rw-r--r--sources/plugins/selectall/lang/hr.js7
-rw-r--r--sources/plugins/selectall/lang/hu.js7
-rw-r--r--sources/plugins/selectall/lang/id.js7
-rw-r--r--sources/plugins/selectall/lang/is.js7
-rw-r--r--sources/plugins/selectall/lang/it.js7
-rw-r--r--sources/plugins/selectall/lang/ja.js7
-rw-r--r--sources/plugins/selectall/lang/ka.js7
-rw-r--r--sources/plugins/selectall/lang/km.js7
-rw-r--r--sources/plugins/selectall/lang/ko.js7
-rw-r--r--sources/plugins/selectall/lang/ku.js7
-rw-r--r--sources/plugins/selectall/lang/lt.js7
-rw-r--r--sources/plugins/selectall/lang/lv.js7
-rw-r--r--sources/plugins/selectall/lang/mk.js7
-rw-r--r--sources/plugins/selectall/lang/mn.js7
-rw-r--r--sources/plugins/selectall/lang/ms.js7
-rw-r--r--sources/plugins/selectall/lang/nb.js7
-rw-r--r--sources/plugins/selectall/lang/nl.js7
-rw-r--r--sources/plugins/selectall/lang/no.js7
-rw-r--r--sources/plugins/selectall/lang/pl.js7
-rw-r--r--sources/plugins/selectall/lang/pt-br.js7
-rw-r--r--sources/plugins/selectall/lang/pt.js7
-rw-r--r--sources/plugins/selectall/lang/ro.js7
-rw-r--r--sources/plugins/selectall/lang/ru.js7
-rw-r--r--sources/plugins/selectall/lang/si.js7
-rw-r--r--sources/plugins/selectall/lang/sk.js7
-rw-r--r--sources/plugins/selectall/lang/sl.js7
-rw-r--r--sources/plugins/selectall/lang/sq.js7
-rw-r--r--sources/plugins/selectall/lang/sr-latn.js7
-rw-r--r--sources/plugins/selectall/lang/sr.js7
-rw-r--r--sources/plugins/selectall/lang/sv.js7
-rw-r--r--sources/plugins/selectall/lang/th.js7
-rw-r--r--sources/plugins/selectall/lang/tr.js7
-rw-r--r--sources/plugins/selectall/lang/tt.js7
-rw-r--r--sources/plugins/selectall/lang/ug.js7
-rw-r--r--sources/plugins/selectall/lang/uk.js7
-rw-r--r--sources/plugins/selectall/lang/vi.js7
-rw-r--r--sources/plugins/selectall/lang/zh-cn.js7
-rw-r--r--sources/plugins/selectall/lang/zh.js7
-rw-r--r--sources/plugins/selectall/plugin.js60
-rw-r--r--sources/plugins/showblocks/icons/hidpi/showblocks-rtl.pngbin0 -> 1853 bytes
-rw-r--r--sources/plugins/showblocks/icons/hidpi/showblocks.pngbin0 -> 1895 bytes
-rw-r--r--sources/plugins/showblocks/icons/showblocks-rtl.pngbin0 -> 691 bytes
-rw-r--r--sources/plugins/showblocks/icons/showblocks.pngbin0 -> 701 bytes
-rw-r--r--sources/plugins/showblocks/images/block_address.pngbin0 -> 152 bytes
-rw-r--r--sources/plugins/showblocks/images/block_blockquote.pngbin0 -> 154 bytes
-rw-r--r--sources/plugins/showblocks/images/block_div.pngbin0 -> 127 bytes
-rw-r--r--sources/plugins/showblocks/images/block_h1.pngbin0 -> 120 bytes
-rw-r--r--sources/plugins/showblocks/images/block_h2.pngbin0 -> 127 bytes
-rw-r--r--sources/plugins/showblocks/images/block_h3.pngbin0 -> 123 bytes
-rw-r--r--sources/plugins/showblocks/images/block_h4.pngbin0 -> 123 bytes
-rw-r--r--sources/plugins/showblocks/images/block_h5.pngbin0 -> 126 bytes
-rw-r--r--sources/plugins/showblocks/images/block_h6.pngbin0 -> 123 bytes
-rw-r--r--sources/plugins/showblocks/images/block_p.pngbin0 -> 115 bytes
-rw-r--r--sources/plugins/showblocks/images/block_pre.pngbin0 -> 128 bytes
-rw-r--r--sources/plugins/showblocks/lang/af.js7
-rw-r--r--sources/plugins/showblocks/lang/ar.js7
-rw-r--r--sources/plugins/showblocks/lang/bg.js7
-rw-r--r--sources/plugins/showblocks/lang/bn.js7
-rw-r--r--sources/plugins/showblocks/lang/bs.js7
-rw-r--r--sources/plugins/showblocks/lang/ca.js7
-rw-r--r--sources/plugins/showblocks/lang/cs.js7
-rw-r--r--sources/plugins/showblocks/lang/cy.js7
-rw-r--r--sources/plugins/showblocks/lang/da.js7
-rw-r--r--sources/plugins/showblocks/lang/de.js7
-rw-r--r--sources/plugins/showblocks/lang/el.js7
-rw-r--r--sources/plugins/showblocks/lang/en-au.js7
-rw-r--r--sources/plugins/showblocks/lang/en-ca.js7
-rw-r--r--sources/plugins/showblocks/lang/en-gb.js7
-rw-r--r--sources/plugins/showblocks/lang/en.js7
-rw-r--r--sources/plugins/showblocks/lang/eo.js7
-rw-r--r--sources/plugins/showblocks/lang/es.js7
-rw-r--r--sources/plugins/showblocks/lang/et.js7
-rw-r--r--sources/plugins/showblocks/lang/eu.js7
-rw-r--r--sources/plugins/showblocks/lang/fa.js7
-rw-r--r--sources/plugins/showblocks/lang/fi.js7
-rw-r--r--sources/plugins/showblocks/lang/fo.js7
-rw-r--r--sources/plugins/showblocks/lang/fr-ca.js7
-rw-r--r--sources/plugins/showblocks/lang/fr.js7
-rw-r--r--sources/plugins/showblocks/lang/gl.js7
-rw-r--r--sources/plugins/showblocks/lang/gu.js7
-rw-r--r--sources/plugins/showblocks/lang/he.js7
-rw-r--r--sources/plugins/showblocks/lang/hi.js7
-rw-r--r--sources/plugins/showblocks/lang/hr.js7
-rw-r--r--sources/plugins/showblocks/lang/hu.js7
-rw-r--r--sources/plugins/showblocks/lang/id.js7
-rw-r--r--sources/plugins/showblocks/lang/is.js7
-rw-r--r--sources/plugins/showblocks/lang/it.js7
-rw-r--r--sources/plugins/showblocks/lang/ja.js7
-rw-r--r--sources/plugins/showblocks/lang/ka.js7
-rw-r--r--sources/plugins/showblocks/lang/km.js7
-rw-r--r--sources/plugins/showblocks/lang/ko.js7
-rw-r--r--sources/plugins/showblocks/lang/ku.js7
-rw-r--r--sources/plugins/showblocks/lang/lt.js7
-rw-r--r--sources/plugins/showblocks/lang/lv.js7
-rw-r--r--sources/plugins/showblocks/lang/mk.js7
-rw-r--r--sources/plugins/showblocks/lang/mn.js7
-rw-r--r--sources/plugins/showblocks/lang/ms.js7
-rw-r--r--sources/plugins/showblocks/lang/nb.js7
-rw-r--r--sources/plugins/showblocks/lang/nl.js7
-rw-r--r--sources/plugins/showblocks/lang/no.js7
-rw-r--r--sources/plugins/showblocks/lang/pl.js7
-rw-r--r--sources/plugins/showblocks/lang/pt-br.js7
-rw-r--r--sources/plugins/showblocks/lang/pt.js7
-rw-r--r--sources/plugins/showblocks/lang/ro.js7
-rw-r--r--sources/plugins/showblocks/lang/ru.js7
-rw-r--r--sources/plugins/showblocks/lang/si.js7
-rw-r--r--sources/plugins/showblocks/lang/sk.js7
-rw-r--r--sources/plugins/showblocks/lang/sl.js7
-rw-r--r--sources/plugins/showblocks/lang/sq.js7
-rw-r--r--sources/plugins/showblocks/lang/sr-latn.js7
-rw-r--r--sources/plugins/showblocks/lang/sr.js7
-rw-r--r--sources/plugins/showblocks/lang/sv.js7
-rw-r--r--sources/plugins/showblocks/lang/th.js7
-rw-r--r--sources/plugins/showblocks/lang/tr.js7
-rw-r--r--sources/plugins/showblocks/lang/tt.js7
-rw-r--r--sources/plugins/showblocks/lang/ug.js7
-rw-r--r--sources/plugins/showblocks/lang/uk.js7
-rw-r--r--sources/plugins/showblocks/lang/vi.js7
-rw-r--r--sources/plugins/showblocks/lang/zh-cn.js7
-rw-r--r--sources/plugins/showblocks/lang/zh.js7
-rw-r--r--sources/plugins/showblocks/plugin.js153
-rw-r--r--sources/plugins/showborders/plugin.js174
-rw-r--r--sources/plugins/smiley/dialogs/smiley.js193
-rw-r--r--sources/plugins/smiley/icons/hidpi/smiley.pngbin0 -> 3073 bytes
-rw-r--r--sources/plugins/smiley/icons/smiley.pngbin0 -> 916 bytes
-rw-r--r--sources/plugins/smiley/images/angel_smile.gifbin0 -> 1245 bytes
-rw-r--r--sources/plugins/smiley/images/angel_smile.pngbin0 -> 1172 bytes
-rw-r--r--sources/plugins/smiley/images/angry_smile.gifbin0 -> 1219 bytes
-rw-r--r--sources/plugins/smiley/images/angry_smile.pngbin0 -> 1220 bytes
-rw-r--r--sources/plugins/smiley/images/broken_heart.gifbin0 -> 732 bytes
-rw-r--r--sources/plugins/smiley/images/broken_heart.pngbin0 -> 1139 bytes
-rw-r--r--sources/plugins/smiley/images/confused_smile.gifbin0 -> 1202 bytes
-rw-r--r--sources/plugins/smiley/images/confused_smile.pngbin0 -> 1101 bytes
-rw-r--r--sources/plugins/smiley/images/cry_smile.gifbin0 -> 795 bytes
-rw-r--r--sources/plugins/smiley/images/cry_smile.pngbin0 -> 1214 bytes
-rw-r--r--sources/plugins/smiley/images/devil_smile.gifbin0 -> 1239 bytes
-rw-r--r--sources/plugins/smiley/images/devil_smile.pngbin0 -> 1220 bytes
-rw-r--r--sources/plugins/smiley/images/embaressed_smile.gifbin0 -> 786 bytes
-rw-r--r--sources/plugins/smiley/images/embarrassed_smile.gifbin0 -> 786 bytes
-rw-r--r--sources/plugins/smiley/images/embarrassed_smile.pngbin0 -> 1145 bytes
-rw-r--r--sources/plugins/smiley/images/envelope.gifbin0 -> 506 bytes
-rw-r--r--sources/plugins/smiley/images/envelope.pngbin0 -> 760 bytes
-rw-r--r--sources/plugins/smiley/images/heart.gifbin0 -> 692 bytes
-rw-r--r--sources/plugins/smiley/images/heart.pngbin0 -> 999 bytes
-rw-r--r--sources/plugins/smiley/images/kiss.gifbin0 -> 683 bytes
-rw-r--r--sources/plugins/smiley/images/kiss.pngbin0 -> 1003 bytes
-rw-r--r--sources/plugins/smiley/images/lightbulb.gifbin0 -> 660 bytes
-rw-r--r--sources/plugins/smiley/images/lightbulb.pngbin0 -> 919 bytes
-rw-r--r--sources/plugins/smiley/images/omg_smile.gifbin0 -> 820 bytes
-rw-r--r--sources/plugins/smiley/images/omg_smile.pngbin0 -> 1122 bytes
-rw-r--r--sources/plugins/smiley/images/regular_smile.gifbin0 -> 1209 bytes
-rw-r--r--sources/plugins/smiley/images/regular_smile.pngbin0 -> 1084 bytes
-rw-r--r--sources/plugins/smiley/images/sad_smile.gifbin0 -> 782 bytes
-rw-r--r--sources/plugins/smiley/images/sad_smile.pngbin0 -> 1115 bytes
-rw-r--r--sources/plugins/smiley/images/shades_smile.gifbin0 -> 1231 bytes
-rw-r--r--sources/plugins/smiley/images/shades_smile.pngbin0 -> 1204 bytes
-rw-r--r--sources/plugins/smiley/images/teeth_smile.gifbin0 -> 1201 bytes
-rw-r--r--sources/plugins/smiley/images/teeth_smile.pngbin0 -> 1183 bytes
-rw-r--r--sources/plugins/smiley/images/thumbs_down.gifbin0 -> 715 bytes
-rw-r--r--sources/plugins/smiley/images/thumbs_down.pngbin0 -> 985 bytes
-rw-r--r--sources/plugins/smiley/images/thumbs_up.gifbin0 -> 714 bytes
-rw-r--r--sources/plugins/smiley/images/thumbs_up.pngbin0 -> 959 bytes
-rw-r--r--sources/plugins/smiley/images/tongue_smile.gifbin0 -> 1210 bytes
-rw-r--r--sources/plugins/smiley/images/tongue_smile.pngbin0 -> 1132 bytes
-rw-r--r--sources/plugins/smiley/images/tounge_smile.gifbin0 -> 1210 bytes
-rw-r--r--sources/plugins/smiley/images/whatchutalkingabout_smile.gifbin0 -> 775 bytes
-rw-r--r--sources/plugins/smiley/images/whatchutalkingabout_smile.pngbin0 -> 1039 bytes
-rw-r--r--sources/plugins/smiley/images/wink_smile.gifbin0 -> 1202 bytes
-rw-r--r--sources/plugins/smiley/images/wink_smile.pngbin0 -> 1114 bytes
-rw-r--r--sources/plugins/smiley/lang/af.js9
-rw-r--r--sources/plugins/smiley/lang/ar.js9
-rw-r--r--sources/plugins/smiley/lang/bg.js9
-rw-r--r--sources/plugins/smiley/lang/bn.js9
-rw-r--r--sources/plugins/smiley/lang/bs.js9
-rw-r--r--sources/plugins/smiley/lang/ca.js9
-rw-r--r--sources/plugins/smiley/lang/cs.js9
-rw-r--r--sources/plugins/smiley/lang/cy.js9
-rw-r--r--sources/plugins/smiley/lang/da.js9
-rw-r--r--sources/plugins/smiley/lang/de.js9
-rw-r--r--sources/plugins/smiley/lang/el.js9
-rw-r--r--sources/plugins/smiley/lang/en-au.js9
-rw-r--r--sources/plugins/smiley/lang/en-ca.js9
-rw-r--r--sources/plugins/smiley/lang/en-gb.js9
-rw-r--r--sources/plugins/smiley/lang/en.js9
-rw-r--r--sources/plugins/smiley/lang/eo.js9
-rw-r--r--sources/plugins/smiley/lang/es.js9
-rw-r--r--sources/plugins/smiley/lang/et.js9
-rw-r--r--sources/plugins/smiley/lang/eu.js9
-rw-r--r--sources/plugins/smiley/lang/fa.js9
-rw-r--r--sources/plugins/smiley/lang/fi.js9
-rw-r--r--sources/plugins/smiley/lang/fo.js9
-rw-r--r--sources/plugins/smiley/lang/fr-ca.js9
-rw-r--r--sources/plugins/smiley/lang/fr.js9
-rw-r--r--sources/plugins/smiley/lang/gl.js9
-rw-r--r--sources/plugins/smiley/lang/gu.js9
-rw-r--r--sources/plugins/smiley/lang/he.js9
-rw-r--r--sources/plugins/smiley/lang/hi.js9
-rw-r--r--sources/plugins/smiley/lang/hr.js9
-rw-r--r--sources/plugins/smiley/lang/hu.js9
-rw-r--r--sources/plugins/smiley/lang/id.js9
-rw-r--r--sources/plugins/smiley/lang/is.js9
-rw-r--r--sources/plugins/smiley/lang/it.js9
-rw-r--r--sources/plugins/smiley/lang/ja.js9
-rw-r--r--sources/plugins/smiley/lang/ka.js9
-rw-r--r--sources/plugins/smiley/lang/km.js9
-rw-r--r--sources/plugins/smiley/lang/ko.js9
-rw-r--r--sources/plugins/smiley/lang/ku.js9
-rw-r--r--sources/plugins/smiley/lang/lt.js9
-rw-r--r--sources/plugins/smiley/lang/lv.js9
-rw-r--r--sources/plugins/smiley/lang/mk.js9
-rw-r--r--sources/plugins/smiley/lang/mn.js9
-rw-r--r--sources/plugins/smiley/lang/ms.js9
-rw-r--r--sources/plugins/smiley/lang/nb.js9
-rw-r--r--sources/plugins/smiley/lang/nl.js9
-rw-r--r--sources/plugins/smiley/lang/no.js9
-rw-r--r--sources/plugins/smiley/lang/pl.js9
-rw-r--r--sources/plugins/smiley/lang/pt-br.js9
-rw-r--r--sources/plugins/smiley/lang/pt.js9
-rw-r--r--sources/plugins/smiley/lang/ro.js9
-rw-r--r--sources/plugins/smiley/lang/ru.js9
-rw-r--r--sources/plugins/smiley/lang/si.js9
-rw-r--r--sources/plugins/smiley/lang/sk.js9
-rw-r--r--sources/plugins/smiley/lang/sl.js9
-rw-r--r--sources/plugins/smiley/lang/sq.js9
-rw-r--r--sources/plugins/smiley/lang/sr-latn.js9
-rw-r--r--sources/plugins/smiley/lang/sr.js9
-rw-r--r--sources/plugins/smiley/lang/sv.js9
-rw-r--r--sources/plugins/smiley/lang/th.js9
-rw-r--r--sources/plugins/smiley/lang/tr.js9
-rw-r--r--sources/plugins/smiley/lang/tt.js9
-rw-r--r--sources/plugins/smiley/lang/ug.js9
-rw-r--r--sources/plugins/smiley/lang/uk.js9
-rw-r--r--sources/plugins/smiley/lang/vi.js9
-rw-r--r--sources/plugins/smiley/lang/zh-cn.js9
-rw-r--r--sources/plugins/smiley/lang/zh.js9
-rw-r--r--sources/plugins/smiley/plugin.js98
-rw-r--r--sources/plugins/sourcearea/icons/hidpi/source-rtl.pngbin0 -> 1968 bytes
-rw-r--r--sources/plugins/sourcearea/icons/hidpi/source.pngbin0 -> 1999 bytes
-rw-r--r--sources/plugins/sourcearea/icons/source-rtl.pngbin0 -> 762 bytes
-rw-r--r--sources/plugins/sourcearea/icons/source.pngbin0 -> 764 bytes
-rw-r--r--sources/plugins/sourcearea/lang/af.js7
-rw-r--r--sources/plugins/sourcearea/lang/ar.js7
-rw-r--r--sources/plugins/sourcearea/lang/bg.js7
-rw-r--r--sources/plugins/sourcearea/lang/bn.js7
-rw-r--r--sources/plugins/sourcearea/lang/bs.js7
-rw-r--r--sources/plugins/sourcearea/lang/ca.js7
-rw-r--r--sources/plugins/sourcearea/lang/cs.js7
-rw-r--r--sources/plugins/sourcearea/lang/cy.js7
-rw-r--r--sources/plugins/sourcearea/lang/da.js7
-rw-r--r--sources/plugins/sourcearea/lang/de.js7
-rw-r--r--sources/plugins/sourcearea/lang/el.js7
-rw-r--r--sources/plugins/sourcearea/lang/en-au.js7
-rw-r--r--sources/plugins/sourcearea/lang/en-ca.js7
-rw-r--r--sources/plugins/sourcearea/lang/en-gb.js7
-rw-r--r--sources/plugins/sourcearea/lang/en.js7
-rw-r--r--sources/plugins/sourcearea/lang/eo.js7
-rw-r--r--sources/plugins/sourcearea/lang/es.js7
-rw-r--r--sources/plugins/sourcearea/lang/et.js7
-rw-r--r--sources/plugins/sourcearea/lang/eu.js7
-rw-r--r--sources/plugins/sourcearea/lang/fa.js7
-rw-r--r--sources/plugins/sourcearea/lang/fi.js7
-rw-r--r--sources/plugins/sourcearea/lang/fo.js7
-rw-r--r--sources/plugins/sourcearea/lang/fr-ca.js7
-rw-r--r--sources/plugins/sourcearea/lang/fr.js7
-rw-r--r--sources/plugins/sourcearea/lang/gl.js7
-rw-r--r--sources/plugins/sourcearea/lang/gu.js7
-rw-r--r--sources/plugins/sourcearea/lang/he.js7
-rw-r--r--sources/plugins/sourcearea/lang/hi.js7
-rw-r--r--sources/plugins/sourcearea/lang/hr.js7
-rw-r--r--sources/plugins/sourcearea/lang/hu.js7
-rw-r--r--sources/plugins/sourcearea/lang/id.js7
-rw-r--r--sources/plugins/sourcearea/lang/is.js7
-rw-r--r--sources/plugins/sourcearea/lang/it.js7
-rw-r--r--sources/plugins/sourcearea/lang/ja.js7
-rw-r--r--sources/plugins/sourcearea/lang/ka.js7
-rw-r--r--sources/plugins/sourcearea/lang/km.js7
-rw-r--r--sources/plugins/sourcearea/lang/ko.js7
-rw-r--r--sources/plugins/sourcearea/lang/ku.js7
-rw-r--r--sources/plugins/sourcearea/lang/lt.js7
-rw-r--r--sources/plugins/sourcearea/lang/lv.js7
-rw-r--r--sources/plugins/sourcearea/lang/mk.js7
-rw-r--r--sources/plugins/sourcearea/lang/mn.js7
-rw-r--r--sources/plugins/sourcearea/lang/ms.js7
-rw-r--r--sources/plugins/sourcearea/lang/nb.js7
-rw-r--r--sources/plugins/sourcearea/lang/nl.js7
-rw-r--r--sources/plugins/sourcearea/lang/no.js7
-rw-r--r--sources/plugins/sourcearea/lang/pl.js7
-rw-r--r--sources/plugins/sourcearea/lang/pt-br.js7
-rw-r--r--sources/plugins/sourcearea/lang/pt.js7
-rw-r--r--sources/plugins/sourcearea/lang/ro.js7
-rw-r--r--sources/plugins/sourcearea/lang/ru.js7
-rw-r--r--sources/plugins/sourcearea/lang/si.js7
-rw-r--r--sources/plugins/sourcearea/lang/sk.js7
-rw-r--r--sources/plugins/sourcearea/lang/sl.js7
-rw-r--r--sources/plugins/sourcearea/lang/sq.js7
-rw-r--r--sources/plugins/sourcearea/lang/sr-latn.js7
-rw-r--r--sources/plugins/sourcearea/lang/sr.js7
-rw-r--r--sources/plugins/sourcearea/lang/sv.js7
-rw-r--r--sources/plugins/sourcearea/lang/th.js7
-rw-r--r--sources/plugins/sourcearea/lang/tr.js7
-rw-r--r--sources/plugins/sourcearea/lang/tt.js7
-rw-r--r--sources/plugins/sourcearea/lang/ug.js7
-rw-r--r--sources/plugins/sourcearea/lang/uk.js7
-rw-r--r--sources/plugins/sourcearea/lang/vi.js7
-rw-r--r--sources/plugins/sourcearea/lang/zh-cn.js7
-rw-r--r--sources/plugins/sourcearea/lang/zh.js7
-rw-r--r--sources/plugins/sourcearea/plugin.js168
-rw-r--r--sources/plugins/specialchar/dialogs/lang/_translationstatus.txt20
-rw-r--r--sources/plugins/specialchar/dialogs/lang/af.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ar.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/bg.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ca.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/cs.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/cy.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/da.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/de.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/el.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/en-gb.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/en.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/eo.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/es.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/et.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/eu.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/fa.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/fi.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/fr-ca.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/fr.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/gl.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/he.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/hr.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/hu.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/id.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/it.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ja.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/km.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ko.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ku.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/lt.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/lv.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/nb.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/nl.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/no.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/pl.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/pt-br.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/pt.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ru.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/si.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/sk.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/sl.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/sq.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/sv.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/th.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/tr.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/tt.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/ug.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/uk.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/vi.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/zh-cn.js125
-rw-r--r--sources/plugins/specialchar/dialogs/lang/zh.js125
-rw-r--r--sources/plugins/specialchar/dialogs/specialchar.js297
-rw-r--r--sources/plugins/specialchar/icons/hidpi/specialchar.pngbin0 -> 2615 bytes
-rw-r--r--sources/plugins/specialchar/icons/specialchar.pngbin0 -> 970 bytes
-rw-r--r--sources/plugins/specialchar/lang/_translationstatus.txt63
-rw-r--r--sources/plugins/specialchar/lang/af.js9
-rw-r--r--sources/plugins/specialchar/lang/ar.js9
-rw-r--r--sources/plugins/specialchar/lang/bg.js9
-rw-r--r--sources/plugins/specialchar/lang/bn.js9
-rw-r--r--sources/plugins/specialchar/lang/bs.js9
-rw-r--r--sources/plugins/specialchar/lang/ca.js9
-rw-r--r--sources/plugins/specialchar/lang/cs.js9
-rw-r--r--sources/plugins/specialchar/lang/cy.js9
-rw-r--r--sources/plugins/specialchar/lang/da.js9
-rw-r--r--sources/plugins/specialchar/lang/de.js9
-rw-r--r--sources/plugins/specialchar/lang/el.js9
-rw-r--r--sources/plugins/specialchar/lang/en-au.js9
-rw-r--r--sources/plugins/specialchar/lang/en-ca.js9
-rw-r--r--sources/plugins/specialchar/lang/en-gb.js9
-rw-r--r--sources/plugins/specialchar/lang/en.js9
-rw-r--r--sources/plugins/specialchar/lang/eo.js9
-rw-r--r--sources/plugins/specialchar/lang/es.js9
-rw-r--r--sources/plugins/specialchar/lang/et.js9
-rw-r--r--sources/plugins/specialchar/lang/eu.js9
-rw-r--r--sources/plugins/specialchar/lang/fa.js9
-rw-r--r--sources/plugins/specialchar/lang/fi.js9
-rw-r--r--sources/plugins/specialchar/lang/fo.js9
-rw-r--r--sources/plugins/specialchar/lang/fr-ca.js9
-rw-r--r--sources/plugins/specialchar/lang/fr.js9
-rw-r--r--sources/plugins/specialchar/lang/gl.js9
-rw-r--r--sources/plugins/specialchar/lang/gu.js9
-rw-r--r--sources/plugins/specialchar/lang/he.js9
-rw-r--r--sources/plugins/specialchar/lang/hi.js9
-rw-r--r--sources/plugins/specialchar/lang/hr.js9
-rw-r--r--sources/plugins/specialchar/lang/hu.js9
-rw-r--r--sources/plugins/specialchar/lang/id.js9
-rw-r--r--sources/plugins/specialchar/lang/is.js9
-rw-r--r--sources/plugins/specialchar/lang/it.js9
-rw-r--r--sources/plugins/specialchar/lang/ja.js9
-rw-r--r--sources/plugins/specialchar/lang/ka.js9
-rw-r--r--sources/plugins/specialchar/lang/km.js9
-rw-r--r--sources/plugins/specialchar/lang/ko.js9
-rw-r--r--sources/plugins/specialchar/lang/ku.js9
-rw-r--r--sources/plugins/specialchar/lang/lt.js9
-rw-r--r--sources/plugins/specialchar/lang/lv.js9
-rw-r--r--sources/plugins/specialchar/lang/mk.js9
-rw-r--r--sources/plugins/specialchar/lang/mn.js9
-rw-r--r--sources/plugins/specialchar/lang/ms.js9
-rw-r--r--sources/plugins/specialchar/lang/nb.js9
-rw-r--r--sources/plugins/specialchar/lang/nl.js9
-rw-r--r--sources/plugins/specialchar/lang/no.js9
-rw-r--r--sources/plugins/specialchar/lang/pl.js9
-rw-r--r--sources/plugins/specialchar/lang/pt-br.js9
-rw-r--r--sources/plugins/specialchar/lang/pt.js9
-rw-r--r--sources/plugins/specialchar/lang/ro.js9
-rw-r--r--sources/plugins/specialchar/lang/ru.js9
-rw-r--r--sources/plugins/specialchar/lang/si.js9
-rw-r--r--sources/plugins/specialchar/lang/sk.js9
-rw-r--r--sources/plugins/specialchar/lang/sl.js9
-rw-r--r--sources/plugins/specialchar/lang/sq.js9
-rw-r--r--sources/plugins/specialchar/lang/sr-latn.js9
-rw-r--r--sources/plugins/specialchar/lang/sr.js9
-rw-r--r--sources/plugins/specialchar/lang/sv.js9
-rw-r--r--sources/plugins/specialchar/lang/th.js9
-rw-r--r--sources/plugins/specialchar/lang/tr.js9
-rw-r--r--sources/plugins/specialchar/lang/tt.js9
-rw-r--r--sources/plugins/specialchar/lang/ug.js9
-rw-r--r--sources/plugins/specialchar/lang/uk.js9
-rw-r--r--sources/plugins/specialchar/lang/vi.js9
-rw-r--r--sources/plugins/specialchar/lang/zh-cn.js9
-rw-r--r--sources/plugins/specialchar/lang/zh.js9
-rw-r--r--sources/plugins/specialchar/plugin.js83
-rw-r--r--sources/plugins/stylescombo/lang/af.js11
-rw-r--r--sources/plugins/stylescombo/lang/ar.js11
-rw-r--r--sources/plugins/stylescombo/lang/bg.js11
-rw-r--r--sources/plugins/stylescombo/lang/bn.js11
-rw-r--r--sources/plugins/stylescombo/lang/bs.js11
-rw-r--r--sources/plugins/stylescombo/lang/ca.js11
-rw-r--r--sources/plugins/stylescombo/lang/cs.js11
-rw-r--r--sources/plugins/stylescombo/lang/cy.js11
-rw-r--r--sources/plugins/stylescombo/lang/da.js11
-rw-r--r--sources/plugins/stylescombo/lang/de.js11
-rw-r--r--sources/plugins/stylescombo/lang/el.js11
-rw-r--r--sources/plugins/stylescombo/lang/en-au.js11
-rw-r--r--sources/plugins/stylescombo/lang/en-ca.js11
-rw-r--r--sources/plugins/stylescombo/lang/en-gb.js11
-rw-r--r--sources/plugins/stylescombo/lang/en.js11
-rw-r--r--sources/plugins/stylescombo/lang/eo.js11
-rw-r--r--sources/plugins/stylescombo/lang/es.js11
-rw-r--r--sources/plugins/stylescombo/lang/et.js11
-rw-r--r--sources/plugins/stylescombo/lang/eu.js11
-rw-r--r--sources/plugins/stylescombo/lang/fa.js11
-rw-r--r--sources/plugins/stylescombo/lang/fi.js11
-rw-r--r--sources/plugins/stylescombo/lang/fo.js11
-rw-r--r--sources/plugins/stylescombo/lang/fr-ca.js11
-rw-r--r--sources/plugins/stylescombo/lang/fr.js11
-rw-r--r--sources/plugins/stylescombo/lang/gl.js11
-rw-r--r--sources/plugins/stylescombo/lang/gu.js11
-rw-r--r--sources/plugins/stylescombo/lang/he.js11
-rw-r--r--sources/plugins/stylescombo/lang/hi.js11
-rw-r--r--sources/plugins/stylescombo/lang/hr.js11
-rw-r--r--sources/plugins/stylescombo/lang/hu.js11
-rw-r--r--sources/plugins/stylescombo/lang/id.js11
-rw-r--r--sources/plugins/stylescombo/lang/is.js11
-rw-r--r--sources/plugins/stylescombo/lang/it.js11
-rw-r--r--sources/plugins/stylescombo/lang/ja.js11
-rw-r--r--sources/plugins/stylescombo/lang/ka.js11
-rw-r--r--sources/plugins/stylescombo/lang/km.js11
-rw-r--r--sources/plugins/stylescombo/lang/ko.js11
-rw-r--r--sources/plugins/stylescombo/lang/ku.js11
-rw-r--r--sources/plugins/stylescombo/lang/lt.js11
-rw-r--r--sources/plugins/stylescombo/lang/lv.js11
-rw-r--r--sources/plugins/stylescombo/lang/mk.js11
-rw-r--r--sources/plugins/stylescombo/lang/mn.js11
-rw-r--r--sources/plugins/stylescombo/lang/ms.js11
-rw-r--r--sources/plugins/stylescombo/lang/nb.js11
-rw-r--r--sources/plugins/stylescombo/lang/nl.js11
-rw-r--r--sources/plugins/stylescombo/lang/no.js11
-rw-r--r--sources/plugins/stylescombo/lang/pl.js11
-rw-r--r--sources/plugins/stylescombo/lang/pt-br.js11
-rw-r--r--sources/plugins/stylescombo/lang/pt.js11
-rw-r--r--sources/plugins/stylescombo/lang/ro.js11
-rw-r--r--sources/plugins/stylescombo/lang/ru.js11
-rw-r--r--sources/plugins/stylescombo/lang/si.js11
-rw-r--r--sources/plugins/stylescombo/lang/sk.js11
-rw-r--r--sources/plugins/stylescombo/lang/sl.js11
-rw-r--r--sources/plugins/stylescombo/lang/sq.js11
-rw-r--r--sources/plugins/stylescombo/lang/sr-latn.js11
-rw-r--r--sources/plugins/stylescombo/lang/sr.js11
-rw-r--r--sources/plugins/stylescombo/lang/sv.js11
-rw-r--r--sources/plugins/stylescombo/lang/th.js11
-rw-r--r--sources/plugins/stylescombo/lang/tr.js11
-rw-r--r--sources/plugins/stylescombo/lang/tt.js11
-rw-r--r--sources/plugins/stylescombo/lang/ug.js11
-rw-r--r--sources/plugins/stylescombo/lang/uk.js11
-rw-r--r--sources/plugins/stylescombo/lang/vi.js11
-rw-r--r--sources/plugins/stylescombo/lang/zh-cn.js11
-rw-r--r--sources/plugins/stylescombo/lang/zh.js11
-rw-r--r--sources/plugins/stylescombo/plugin.js193
-rw-r--r--sources/plugins/tab/plugin.js302
-rw-r--r--sources/plugins/table/dialogs/table.js541
-rw-r--r--sources/plugins/table/icons/hidpi/table.pngbin0 -> 1006 bytes
-rw-r--r--sources/plugins/table/icons/table.pngbin0 -> 535 bytes
-rw-r--r--sources/plugins/table/lang/af.js74
-rw-r--r--sources/plugins/table/lang/ar.js74
-rw-r--r--sources/plugins/table/lang/bg.js74
-rw-r--r--sources/plugins/table/lang/bn.js74
-rw-r--r--sources/plugins/table/lang/bs.js74
-rw-r--r--sources/plugins/table/lang/ca.js74
-rw-r--r--sources/plugins/table/lang/cs.js74
-rw-r--r--sources/plugins/table/lang/cy.js74
-rw-r--r--sources/plugins/table/lang/da.js74
-rw-r--r--sources/plugins/table/lang/de.js74
-rw-r--r--sources/plugins/table/lang/el.js74
-rw-r--r--sources/plugins/table/lang/en-au.js74
-rw-r--r--sources/plugins/table/lang/en-ca.js74
-rw-r--r--sources/plugins/table/lang/en-gb.js74
-rw-r--r--sources/plugins/table/lang/en.js74
-rw-r--r--sources/plugins/table/lang/eo.js74
-rw-r--r--sources/plugins/table/lang/es.js74
-rw-r--r--sources/plugins/table/lang/et.js74
-rw-r--r--sources/plugins/table/lang/eu.js74
-rw-r--r--sources/plugins/table/lang/fa.js74
-rw-r--r--sources/plugins/table/lang/fi.js74
-rw-r--r--sources/plugins/table/lang/fo.js74
-rw-r--r--sources/plugins/table/lang/fr-ca.js74
-rw-r--r--sources/plugins/table/lang/fr.js74
-rw-r--r--sources/plugins/table/lang/gl.js74
-rw-r--r--sources/plugins/table/lang/gu.js74
-rw-r--r--sources/plugins/table/lang/he.js74
-rw-r--r--sources/plugins/table/lang/hi.js74
-rw-r--r--sources/plugins/table/lang/hr.js74
-rw-r--r--sources/plugins/table/lang/hu.js74
-rw-r--r--sources/plugins/table/lang/id.js74
-rw-r--r--sources/plugins/table/lang/is.js74
-rw-r--r--sources/plugins/table/lang/it.js74
-rw-r--r--sources/plugins/table/lang/ja.js74
-rw-r--r--sources/plugins/table/lang/ka.js74
-rw-r--r--sources/plugins/table/lang/km.js74
-rw-r--r--sources/plugins/table/lang/ko.js74
-rw-r--r--sources/plugins/table/lang/ku.js74
-rw-r--r--sources/plugins/table/lang/lt.js74
-rw-r--r--sources/plugins/table/lang/lv.js74
-rw-r--r--sources/plugins/table/lang/mk.js74
-rw-r--r--sources/plugins/table/lang/mn.js74
-rw-r--r--sources/plugins/table/lang/ms.js74
-rw-r--r--sources/plugins/table/lang/nb.js74
-rw-r--r--sources/plugins/table/lang/nl.js74
-rw-r--r--sources/plugins/table/lang/no.js74
-rw-r--r--sources/plugins/table/lang/pl.js74
-rw-r--r--sources/plugins/table/lang/pt-br.js74
-rw-r--r--sources/plugins/table/lang/pt.js74
-rw-r--r--sources/plugins/table/lang/ro.js74
-rw-r--r--sources/plugins/table/lang/ru.js74
-rw-r--r--sources/plugins/table/lang/si.js74
-rw-r--r--sources/plugins/table/lang/sk.js74
-rw-r--r--sources/plugins/table/lang/sl.js74
-rw-r--r--sources/plugins/table/lang/sq.js74
-rw-r--r--sources/plugins/table/lang/sr-latn.js74
-rw-r--r--sources/plugins/table/lang/sr.js74
-rw-r--r--sources/plugins/table/lang/sv.js74
-rw-r--r--sources/plugins/table/lang/th.js74
-rw-r--r--sources/plugins/table/lang/tr.js74
-rw-r--r--sources/plugins/table/lang/tt.js74
-rw-r--r--sources/plugins/table/lang/ug.js74
-rw-r--r--sources/plugins/table/lang/uk.js74
-rw-r--r--sources/plugins/table/lang/vi.js74
-rw-r--r--sources/plugins/table/lang/zh-cn.js74
-rw-r--r--sources/plugins/table/lang/zh.js74
-rw-r--r--sources/plugins/table/plugin.js109
-rw-r--r--sources/plugins/tabletools/dialogs/tableCell.js474
-rw-r--r--sources/plugins/tabletools/plugin.js1005
-rw-r--r--sources/plugins/templates/dialogs/templates.css84
-rw-r--r--sources/plugins/templates/dialogs/templates.js199
-rw-r--r--sources/plugins/templates/icons/hidpi/templates-rtl.pngbin0 -> 1387 bytes
-rw-r--r--sources/plugins/templates/icons/hidpi/templates.pngbin0 -> 1387 bytes
-rw-r--r--sources/plugins/templates/icons/templates-rtl.pngbin0 -> 639 bytes
-rw-r--r--sources/plugins/templates/icons/templates.pngbin0 -> 639 bytes
-rw-r--r--sources/plugins/templates/lang/af.js12
-rw-r--r--sources/plugins/templates/lang/ar.js12
-rw-r--r--sources/plugins/templates/lang/bg.js12
-rw-r--r--sources/plugins/templates/lang/bn.js12
-rw-r--r--sources/plugins/templates/lang/bs.js12
-rw-r--r--sources/plugins/templates/lang/ca.js12
-rw-r--r--sources/plugins/templates/lang/cs.js12
-rw-r--r--sources/plugins/templates/lang/cy.js12
-rw-r--r--sources/plugins/templates/lang/da.js12
-rw-r--r--sources/plugins/templates/lang/de.js12
-rw-r--r--sources/plugins/templates/lang/el.js12
-rw-r--r--sources/plugins/templates/lang/en-au.js12
-rw-r--r--sources/plugins/templates/lang/en-ca.js12
-rw-r--r--sources/plugins/templates/lang/en-gb.js12
-rw-r--r--sources/plugins/templates/lang/en.js12
-rw-r--r--sources/plugins/templates/lang/eo.js12
-rw-r--r--sources/plugins/templates/lang/es.js12
-rw-r--r--sources/plugins/templates/lang/et.js12
-rw-r--r--sources/plugins/templates/lang/eu.js12
-rw-r--r--sources/plugins/templates/lang/fa.js12
-rw-r--r--sources/plugins/templates/lang/fi.js12
-rw-r--r--sources/plugins/templates/lang/fo.js12
-rw-r--r--sources/plugins/templates/lang/fr-ca.js12
-rw-r--r--sources/plugins/templates/lang/fr.js12
-rw-r--r--sources/plugins/templates/lang/gl.js12
-rw-r--r--sources/plugins/templates/lang/gu.js12
-rw-r--r--sources/plugins/templates/lang/he.js12
-rw-r--r--sources/plugins/templates/lang/hi.js12
-rw-r--r--sources/plugins/templates/lang/hr.js12
-rw-r--r--sources/plugins/templates/lang/hu.js12
-rw-r--r--sources/plugins/templates/lang/id.js12
-rw-r--r--sources/plugins/templates/lang/is.js12
-rw-r--r--sources/plugins/templates/lang/it.js12
-rw-r--r--sources/plugins/templates/lang/ja.js12
-rw-r--r--sources/plugins/templates/lang/ka.js12
-rw-r--r--sources/plugins/templates/lang/km.js12
-rw-r--r--sources/plugins/templates/lang/ko.js12
-rw-r--r--sources/plugins/templates/lang/ku.js12
-rw-r--r--sources/plugins/templates/lang/lt.js12
-rw-r--r--sources/plugins/templates/lang/lv.js12
-rw-r--r--sources/plugins/templates/lang/mk.js12
-rw-r--r--sources/plugins/templates/lang/mn.js12
-rw-r--r--sources/plugins/templates/lang/ms.js12
-rw-r--r--sources/plugins/templates/lang/nb.js12
-rw-r--r--sources/plugins/templates/lang/nl.js12
-rw-r--r--sources/plugins/templates/lang/no.js12
-rw-r--r--sources/plugins/templates/lang/pl.js12
-rw-r--r--sources/plugins/templates/lang/pt-br.js12
-rw-r--r--sources/plugins/templates/lang/pt.js12
-rw-r--r--sources/plugins/templates/lang/ro.js12
-rw-r--r--sources/plugins/templates/lang/ru.js12
-rw-r--r--sources/plugins/templates/lang/si.js12
-rw-r--r--sources/plugins/templates/lang/sk.js12
-rw-r--r--sources/plugins/templates/lang/sl.js12
-rw-r--r--sources/plugins/templates/lang/sq.js12
-rw-r--r--sources/plugins/templates/lang/sr-latn.js12
-rw-r--r--sources/plugins/templates/lang/sr.js12
-rw-r--r--sources/plugins/templates/lang/sv.js12
-rw-r--r--sources/plugins/templates/lang/th.js12
-rw-r--r--sources/plugins/templates/lang/tr.js12
-rw-r--r--sources/plugins/templates/lang/tt.js12
-rw-r--r--sources/plugins/templates/lang/ug.js12
-rw-r--r--sources/plugins/templates/lang/uk.js12
-rw-r--r--sources/plugins/templates/lang/vi.js12
-rw-r--r--sources/plugins/templates/lang/zh-cn.js12
-rw-r--r--sources/plugins/templates/lang/zh.js12
-rw-r--r--sources/plugins/templates/plugin.js93
-rw-r--r--sources/plugins/templates/templates/default.js87
-rw-r--r--sources/plugins/templates/templates/images/template1.gifbin0 -> 375 bytes
-rw-r--r--sources/plugins/templates/templates/images/template2.gifbin0 -> 333 bytes
-rw-r--r--sources/plugins/templates/templates/images/template3.gifbin0 -> 422 bytes
-rw-r--r--sources/plugins/toolbar/lang/af.js22
-rw-r--r--sources/plugins/toolbar/lang/ar.js22
-rw-r--r--sources/plugins/toolbar/lang/bg.js22
-rw-r--r--sources/plugins/toolbar/lang/bn.js22
-rw-r--r--sources/plugins/toolbar/lang/bs.js22
-rw-r--r--sources/plugins/toolbar/lang/ca.js22
-rw-r--r--sources/plugins/toolbar/lang/cs.js22
-rw-r--r--sources/plugins/toolbar/lang/cy.js22
-rw-r--r--sources/plugins/toolbar/lang/da.js22
-rw-r--r--sources/plugins/toolbar/lang/de.js22
-rw-r--r--sources/plugins/toolbar/lang/el.js22
-rw-r--r--sources/plugins/toolbar/lang/en-au.js22
-rw-r--r--sources/plugins/toolbar/lang/en-ca.js22
-rw-r--r--sources/plugins/toolbar/lang/en-gb.js22
-rw-r--r--sources/plugins/toolbar/lang/en.js22
-rw-r--r--sources/plugins/toolbar/lang/eo.js22
-rw-r--r--sources/plugins/toolbar/lang/es.js22
-rw-r--r--sources/plugins/toolbar/lang/et.js22
-rw-r--r--sources/plugins/toolbar/lang/eu.js22
-rw-r--r--sources/plugins/toolbar/lang/fa.js22
-rw-r--r--sources/plugins/toolbar/lang/fi.js22
-rw-r--r--sources/plugins/toolbar/lang/fo.js22
-rw-r--r--sources/plugins/toolbar/lang/fr-ca.js22
-rw-r--r--sources/plugins/toolbar/lang/fr.js22
-rw-r--r--sources/plugins/toolbar/lang/gl.js22
-rw-r--r--sources/plugins/toolbar/lang/gu.js22
-rw-r--r--sources/plugins/toolbar/lang/he.js22
-rw-r--r--sources/plugins/toolbar/lang/hi.js22
-rw-r--r--sources/plugins/toolbar/lang/hr.js22
-rw-r--r--sources/plugins/toolbar/lang/hu.js22
-rw-r--r--sources/plugins/toolbar/lang/id.js22
-rw-r--r--sources/plugins/toolbar/lang/is.js22
-rw-r--r--sources/plugins/toolbar/lang/it.js22
-rw-r--r--sources/plugins/toolbar/lang/ja.js22
-rw-r--r--sources/plugins/toolbar/lang/ka.js22
-rw-r--r--sources/plugins/toolbar/lang/km.js22
-rw-r--r--sources/plugins/toolbar/lang/ko.js22
-rw-r--r--sources/plugins/toolbar/lang/ku.js22
-rw-r--r--sources/plugins/toolbar/lang/lt.js22
-rw-r--r--sources/plugins/toolbar/lang/lv.js22
-rw-r--r--sources/plugins/toolbar/lang/mk.js22
-rw-r--r--sources/plugins/toolbar/lang/mn.js22
-rw-r--r--sources/plugins/toolbar/lang/ms.js22
-rw-r--r--sources/plugins/toolbar/lang/nb.js22
-rw-r--r--sources/plugins/toolbar/lang/nl.js22
-rw-r--r--sources/plugins/toolbar/lang/no.js22
-rw-r--r--sources/plugins/toolbar/lang/pl.js22
-rw-r--r--sources/plugins/toolbar/lang/pt-br.js22
-rw-r--r--sources/plugins/toolbar/lang/pt.js22
-rw-r--r--sources/plugins/toolbar/lang/ro.js22
-rw-r--r--sources/plugins/toolbar/lang/ru.js22
-rw-r--r--sources/plugins/toolbar/lang/si.js22
-rw-r--r--sources/plugins/toolbar/lang/sk.js22
-rw-r--r--sources/plugins/toolbar/lang/sl.js22
-rw-r--r--sources/plugins/toolbar/lang/sq.js22
-rw-r--r--sources/plugins/toolbar/lang/sr-latn.js22
-rw-r--r--sources/plugins/toolbar/lang/sr.js22
-rw-r--r--sources/plugins/toolbar/lang/sv.js22
-rw-r--r--sources/plugins/toolbar/lang/th.js22
-rw-r--r--sources/plugins/toolbar/lang/tr.js22
-rw-r--r--sources/plugins/toolbar/lang/tt.js22
-rw-r--r--sources/plugins/toolbar/lang/ug.js22
-rw-r--r--sources/plugins/toolbar/lang/uk.js22
-rw-r--r--sources/plugins/toolbar/lang/vi.js22
-rw-r--r--sources/plugins/toolbar/lang/zh-cn.js22
-rw-r--r--sources/plugins/toolbar/lang/zh.js22
-rw-r--r--sources/plugins/toolbar/plugin.js803
-rw-r--r--sources/plugins/toolbar/samples/toolbar.html235
-rw-r--r--sources/plugins/undo/dev/snapshot.html86
-rw-r--r--sources/plugins/undo/icons/hidpi/redo-rtl.pngbin0 -> 1869 bytes
-rw-r--r--sources/plugins/undo/icons/hidpi/redo.pngbin0 -> 1783 bytes
-rw-r--r--sources/plugins/undo/icons/hidpi/undo-rtl.pngbin0 -> 1783 bytes
-rw-r--r--sources/plugins/undo/icons/hidpi/undo.pngbin0 -> 1869 bytes
-rw-r--r--sources/plugins/undo/icons/redo-rtl.pngbin0 -> 849 bytes
-rw-r--r--sources/plugins/undo/icons/redo.pngbin0 -> 842 bytes
-rw-r--r--sources/plugins/undo/icons/undo-rtl.pngbin0 -> 842 bytes
-rw-r--r--sources/plugins/undo/icons/undo.pngbin0 -> 850 bytes
-rw-r--r--sources/plugins/undo/lang/af.js8
-rw-r--r--sources/plugins/undo/lang/ar.js8
-rw-r--r--sources/plugins/undo/lang/bg.js8
-rw-r--r--sources/plugins/undo/lang/bn.js8
-rw-r--r--sources/plugins/undo/lang/bs.js8
-rw-r--r--sources/plugins/undo/lang/ca.js8
-rw-r--r--sources/plugins/undo/lang/cs.js8
-rw-r--r--sources/plugins/undo/lang/cy.js8
-rw-r--r--sources/plugins/undo/lang/da.js8
-rw-r--r--sources/plugins/undo/lang/de.js8
-rw-r--r--sources/plugins/undo/lang/el.js8
-rw-r--r--sources/plugins/undo/lang/en-au.js8
-rw-r--r--sources/plugins/undo/lang/en-ca.js8
-rw-r--r--sources/plugins/undo/lang/en-gb.js8
-rw-r--r--sources/plugins/undo/lang/en.js8
-rw-r--r--sources/plugins/undo/lang/eo.js8
-rw-r--r--sources/plugins/undo/lang/es.js8
-rw-r--r--sources/plugins/undo/lang/et.js8
-rw-r--r--sources/plugins/undo/lang/eu.js8
-rw-r--r--sources/plugins/undo/lang/fa.js8
-rw-r--r--sources/plugins/undo/lang/fi.js8
-rw-r--r--sources/plugins/undo/lang/fo.js8
-rw-r--r--sources/plugins/undo/lang/fr-ca.js8
-rw-r--r--sources/plugins/undo/lang/fr.js8
-rw-r--r--sources/plugins/undo/lang/gl.js8
-rw-r--r--sources/plugins/undo/lang/gu.js8
-rw-r--r--sources/plugins/undo/lang/he.js8
-rw-r--r--sources/plugins/undo/lang/hi.js8
-rw-r--r--sources/plugins/undo/lang/hr.js8
-rw-r--r--sources/plugins/undo/lang/hu.js8
-rw-r--r--sources/plugins/undo/lang/id.js8
-rw-r--r--sources/plugins/undo/lang/is.js8
-rw-r--r--sources/plugins/undo/lang/it.js8
-rw-r--r--sources/plugins/undo/lang/ja.js8
-rw-r--r--sources/plugins/undo/lang/ka.js8
-rw-r--r--sources/plugins/undo/lang/km.js8
-rw-r--r--sources/plugins/undo/lang/ko.js8
-rw-r--r--sources/plugins/undo/lang/ku.js8
-rw-r--r--sources/plugins/undo/lang/lt.js8
-rw-r--r--sources/plugins/undo/lang/lv.js8
-rw-r--r--sources/plugins/undo/lang/mk.js8
-rw-r--r--sources/plugins/undo/lang/mn.js8
-rw-r--r--sources/plugins/undo/lang/ms.js8
-rw-r--r--sources/plugins/undo/lang/nb.js8
-rw-r--r--sources/plugins/undo/lang/nl.js8
-rw-r--r--sources/plugins/undo/lang/no.js8
-rw-r--r--sources/plugins/undo/lang/pl.js8
-rw-r--r--sources/plugins/undo/lang/pt-br.js8
-rw-r--r--sources/plugins/undo/lang/pt.js8
-rw-r--r--sources/plugins/undo/lang/ro.js8
-rw-r--r--sources/plugins/undo/lang/ru.js8
-rw-r--r--sources/plugins/undo/lang/si.js8
-rw-r--r--sources/plugins/undo/lang/sk.js8
-rw-r--r--sources/plugins/undo/lang/sl.js8
-rw-r--r--sources/plugins/undo/lang/sq.js8
-rw-r--r--sources/plugins/undo/lang/sr-latn.js8
-rw-r--r--sources/plugins/undo/lang/sr.js8
-rw-r--r--sources/plugins/undo/lang/sv.js8
-rw-r--r--sources/plugins/undo/lang/th.js8
-rw-r--r--sources/plugins/undo/lang/tr.js8
-rw-r--r--sources/plugins/undo/lang/tt.js8
-rw-r--r--sources/plugins/undo/lang/ug.js8
-rw-r--r--sources/plugins/undo/lang/uk.js8
-rw-r--r--sources/plugins/undo/lang/vi.js8
-rw-r--r--sources/plugins/undo/lang/zh-cn.js8
-rw-r--r--sources/plugins/undo/lang/zh.js8
-rw-r--r--sources/plugins/undo/plugin.js1328
-rw-r--r--sources/plugins/wsc/LICENSE.md28
-rw-r--r--sources/plugins/wsc/README.md25
-rw-r--r--sources/plugins/wsc/dialogs/ciframe.html66
-rw-r--r--sources/plugins/wsc/dialogs/tmpFrameset.html52
-rw-r--r--sources/plugins/wsc/dialogs/wsc.css82
-rw-r--r--sources/plugins/wsc/dialogs/wsc.js3152
-rw-r--r--sources/plugins/wsc/dialogs/wsc_ie.js176
-rw-r--r--sources/plugins/wsc/icons/hidpi/spellchecker.pngbin0 -> 2816 bytes
-rw-r--r--sources/plugins/wsc/icons/spellchecker.pngbin0 -> 836 bytes
-rw-r--r--sources/plugins/wsc/lang/af.js24
-rw-r--r--sources/plugins/wsc/lang/ar.js24
-rw-r--r--sources/plugins/wsc/lang/bg.js24
-rw-r--r--sources/plugins/wsc/lang/bn.js24
-rw-r--r--sources/plugins/wsc/lang/bs.js24
-rw-r--r--sources/plugins/wsc/lang/ca.js24
-rw-r--r--sources/plugins/wsc/lang/cs.js24
-rw-r--r--sources/plugins/wsc/lang/cy.js24
-rw-r--r--sources/plugins/wsc/lang/da.js24
-rw-r--r--sources/plugins/wsc/lang/de.js24
-rw-r--r--sources/plugins/wsc/lang/el.js24
-rw-r--r--sources/plugins/wsc/lang/en-au.js24
-rw-r--r--sources/plugins/wsc/lang/en-ca.js24
-rw-r--r--sources/plugins/wsc/lang/en-gb.js24
-rw-r--r--sources/plugins/wsc/lang/en.js24
-rw-r--r--sources/plugins/wsc/lang/eo.js24
-rw-r--r--sources/plugins/wsc/lang/es.js24
-rw-r--r--sources/plugins/wsc/lang/et.js24
-rw-r--r--sources/plugins/wsc/lang/eu.js24
-rw-r--r--sources/plugins/wsc/lang/fa.js24
-rw-r--r--sources/plugins/wsc/lang/fi.js24
-rw-r--r--sources/plugins/wsc/lang/fo.js24
-rw-r--r--sources/plugins/wsc/lang/fr-ca.js24
-rw-r--r--sources/plugins/wsc/lang/fr.js24
-rw-r--r--sources/plugins/wsc/lang/gl.js24
-rw-r--r--sources/plugins/wsc/lang/gu.js24
-rw-r--r--sources/plugins/wsc/lang/he.js24
-rw-r--r--sources/plugins/wsc/lang/hi.js24
-rw-r--r--sources/plugins/wsc/lang/hr.js24
-rw-r--r--sources/plugins/wsc/lang/hu.js24
-rw-r--r--sources/plugins/wsc/lang/is.js24
-rw-r--r--sources/plugins/wsc/lang/it.js24
-rw-r--r--sources/plugins/wsc/lang/ja.js24
-rw-r--r--sources/plugins/wsc/lang/ka.js24
-rw-r--r--sources/plugins/wsc/lang/km.js24
-rw-r--r--sources/plugins/wsc/lang/ko.js24
-rw-r--r--sources/plugins/wsc/lang/ku.js24
-rw-r--r--sources/plugins/wsc/lang/lt.js24
-rw-r--r--sources/plugins/wsc/lang/lv.js24
-rw-r--r--sources/plugins/wsc/lang/mk.js24
-rw-r--r--sources/plugins/wsc/lang/mn.js24
-rw-r--r--sources/plugins/wsc/lang/ms.js24
-rw-r--r--sources/plugins/wsc/lang/nb.js24
-rw-r--r--sources/plugins/wsc/lang/nl.js24
-rw-r--r--sources/plugins/wsc/lang/no.js24
-rw-r--r--sources/plugins/wsc/lang/pl.js24
-rw-r--r--sources/plugins/wsc/lang/pt-br.js24
-rw-r--r--sources/plugins/wsc/lang/pt.js24
-rw-r--r--sources/plugins/wsc/lang/ro.js24
-rw-r--r--sources/plugins/wsc/lang/ru.js24
-rw-r--r--sources/plugins/wsc/lang/sk.js24
-rw-r--r--sources/plugins/wsc/lang/sl.js24
-rw-r--r--sources/plugins/wsc/lang/sr-latn.js24
-rw-r--r--sources/plugins/wsc/lang/sr.js24
-rw-r--r--sources/plugins/wsc/lang/sv.js24
-rw-r--r--sources/plugins/wsc/lang/th.js24
-rw-r--r--sources/plugins/wsc/lang/tr.js24
-rw-r--r--sources/plugins/wsc/lang/ug.js24
-rw-r--r--sources/plugins/wsc/lang/uk.js24
-rw-r--r--sources/plugins/wsc/lang/vi.js24
-rw-r--r--sources/plugins/wsc/lang/zh-cn.js24
-rw-r--r--sources/plugins/wsc/lang/zh.js24
-rw-r--r--sources/plugins/wsc/plugin.js142
-rw-r--r--sources/plugins/wysiwygarea/plugin.js708
-rw-r--r--sources/plugins/wysiwygarea/samples/fullpage.html80
3543 files changed, 114237 insertions, 0 deletions
diff --git a/sources/plugins/a11yhelp/dialogs/a11yhelp.js b/sources/plugins/a11yhelp/dialogs/a11yhelp.js
new file mode 100644
index 00000000..60ce9f86
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/a11yhelp.js
@@ -0,0 +1,216 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'a11yHelp', function( editor ) {
7 var lang = editor.lang.a11yhelp,
8 id = CKEDITOR.tools.getNextId();
9
10 // CharCode <-> KeyChar.
11 var keyMap = {
12 8: lang.backspace,
13 9: lang.tab,
14 13: lang.enter,
15 16: lang.shift,
16 17: lang.ctrl,
17 18: lang.alt,
18 19: lang.pause,
19 20: lang.capslock,
20 27: lang.escape,
21 33: lang.pageUp,
22 34: lang.pageDown,
23 35: lang.end,
24 36: lang.home,
25 37: lang.leftArrow,
26 38: lang.upArrow,
27 39: lang.rightArrow,
28 40: lang.downArrow,
29 45: lang.insert,
30 46: lang[ 'delete' ],
31 91: lang.leftWindowKey,
32 92: lang.rightWindowKey,
33 93: lang.selectKey,
34 96: lang.numpad0,
35 97: lang.numpad1,
36 98: lang.numpad2,
37 99: lang.numpad3,
38 100: lang.numpad4,
39 101: lang.numpad5,
40 102: lang.numpad6,
41 103: lang.numpad7,
42 104: lang.numpad8,
43 105: lang.numpad9,
44 106: lang.multiply,
45 107: lang.add,
46 109: lang.subtract,
47 110: lang.decimalPoint,
48 111: lang.divide,
49 112: lang.f1,
50 113: lang.f2,
51 114: lang.f3,
52 115: lang.f4,
53 116: lang.f5,
54 117: lang.f6,
55 118: lang.f7,
56 119: lang.f8,
57 120: lang.f9,
58 121: lang.f10,
59 122: lang.f11,
60 123: lang.f12,
61 144: lang.numLock,
62 145: lang.scrollLock,
63 186: lang.semiColon,
64 187: lang.equalSign,
65 188: lang.comma,
66 189: lang.dash,
67 190: lang.period,
68 191: lang.forwardSlash,
69 192: lang.graveAccent,
70 219: lang.openBracket,
71 220: lang.backSlash,
72 221: lang.closeBracket,
73 222: lang.singleQuote
74 };
75
76 // Modifier keys override.
77 keyMap[ CKEDITOR.ALT ] = lang.alt;
78 keyMap[ CKEDITOR.SHIFT ] = lang.shift;
79 keyMap[ CKEDITOR.CTRL ] = lang.ctrl;
80
81 // Sort in desc.
82 var modifiers = [ CKEDITOR.ALT, CKEDITOR.SHIFT, CKEDITOR.CTRL ];
83
84 function representKeyStroke( keystroke ) {
85 var quotient, modifier,
86 presentation = [];
87
88 for ( var i = 0; i < modifiers.length; i++ ) {
89 modifier = modifiers[ i ];
90 quotient = keystroke / modifiers[ i ];
91 if ( quotient > 1 && quotient <= 2 ) {
92 keystroke -= modifier;
93 presentation.push( keyMap[ modifier ] );
94 }
95 }
96
97 presentation.push( keyMap[ keystroke ] || String.fromCharCode( keystroke ) );
98
99 return presentation.join( '+' );
100 }
101
102 var variablesPattern = /\$\{(.*?)\}/g;
103
104 var replaceVariables = ( function() {
105 // Swaps keystrokes with their commands in object literal.
106 // This makes searching keystrokes by command much easier.
107 var keystrokesByCode = editor.keystrokeHandler.keystrokes,
108 keystrokesByName = {};
109
110 for ( var i in keystrokesByCode )
111 keystrokesByName[ keystrokesByCode[ i ] ] = i;
112
113 return function( match, name ) {
114 // Return the keystroke representation or leave match untouched
115 // if there's no keystroke for such command.
116 return keystrokesByName[ name ] ? representKeyStroke( keystrokesByName[ name ] ) : match;
117 };
118 } )();
119
120 // Create the help list directly from lang file entries.
121 function buildHelpContents() {
122 var pageTpl = '<div class="cke_accessibility_legend" role="document" aria-labelledby="' + id + '_arialbl" tabIndex="-1">%1</div>' +
123 '<span id="' + id + '_arialbl" class="cke_voice_label">' + lang.contents + ' </span>',
124 sectionTpl = '<h1>%1</h1><dl>%2</dl>',
125 itemTpl = '<dt>%1</dt><dd>%2</dd>';
126
127 var pageHtml = [],
128 sections = lang.legend,
129 sectionLength = sections.length;
130
131 for ( var i = 0; i < sectionLength; i++ ) {
132 var section = sections[ i ],
133 sectionHtml = [],
134 items = section.items,
135 itemsLength = items.length;
136
137 for ( var j = 0; j < itemsLength; j++ ) {
138 var item = items[ j ],
139 itemLegend = item.legend.replace( variablesPattern, replaceVariables );
140
141 // (#9765) If some commands haven't been replaced in the legend,
142 // most likely their keystrokes are unavailable and we shouldn't include
143 // them in our help list.
144 if ( itemLegend.match( variablesPattern ) )
145 continue;
146
147 sectionHtml.push( itemTpl.replace( '%1', item.name ).replace( '%2', itemLegend ) );
148 }
149
150 pageHtml.push( sectionTpl.replace( '%1', section.name ).replace( '%2', sectionHtml.join( '' ) ) );
151 }
152
153 return pageTpl.replace( '%1', pageHtml.join( '' ) );
154 }
155
156 return {
157 title: lang.title,
158 minWidth: 600,
159 minHeight: 400,
160 contents: [ {
161 id: 'info',
162 label: editor.lang.common.generalTab,
163 expand: true,
164 elements: [
165 {
166 type: 'html',
167 id: 'legends',
168 style: 'white-space:normal;',
169 focus: function() {
170 this.getElement().focus();
171 },
172 html: buildHelpContents() + '<style type="text/css">' +
173 '.cke_accessibility_legend' +
174 '{' +
175 'width:600px;' +
176 'height:400px;' +
177 'padding-right:5px;' +
178 'overflow-y:auto;' +
179 'overflow-x:hidden;' +
180 '}' +
181 // Some adjustments are to be done for Quirks to work "properly" (#5757)
182 '.cke_browser_quirks .cke_accessibility_legend,' +
183 '{' +
184 'height:390px' +
185 '}' +
186 // Override non-wrapping white-space rule in reset css.
187 '.cke_accessibility_legend *' +
188 '{' +
189 'white-space:normal;' +
190 '}' +
191 '.cke_accessibility_legend h1' +
192 '{' +
193 'font-size: 20px;' +
194 'border-bottom: 1px solid #AAA;' +
195 'margin: 5px 0px 15px;' +
196 '}' +
197 '.cke_accessibility_legend dl' +
198 '{' +
199 'margin-left: 5px;' +
200 '}' +
201 '.cke_accessibility_legend dt' +
202 '{' +
203 'font-size: 13px;' +
204 'font-weight: bold;' +
205 '}' +
206 '.cke_accessibility_legend dd' +
207 '{' +
208 'margin:10px' +
209 '}' +
210 '</style>'
211 }
212 ]
213 } ],
214 buttons: [ CKEDITOR.dialog.cancelButton ]
215 };
216} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
new file mode 100644
index 00000000..a7cc6699
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,25 @@
1Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
2For licensing, see LICENSE.md or http://ckeditor.com/license
3
4cs.js Found: 30 Missing: 0
5cy.js Found: 30 Missing: 0
6da.js Found: 12 Missing: 18
7de.js Found: 30 Missing: 0
8el.js Found: 25 Missing: 5
9eo.js Found: 30 Missing: 0
10fa.js Found: 30 Missing: 0
11fi.js Found: 30 Missing: 0
12fr.js Found: 30 Missing: 0
13gu.js Found: 12 Missing: 18
14he.js Found: 30 Missing: 0
15it.js Found: 30 Missing: 0
16mk.js Found: 5 Missing: 25
17nb.js Found: 30 Missing: 0
18nl.js Found: 30 Missing: 0
19no.js Found: 30 Missing: 0
20pt-br.js Found: 30 Missing: 0
21ro.js Found: 6 Missing: 24
22tr.js Found: 30 Missing: 0
23ug.js Found: 27 Missing: 3
24vi.js Found: 6 Missing: 24
25zh-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 00000000..8d36d9cb
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/af.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'af', {
7 title: 'Toeganglikheid instruksies',
8 contents: 'Hulp inhoud. Druk ESC om toe te maak.',
9 legend: [
10 {
11 name: 'Algemeen',
12 items: [
13 {
14 name: 'Bewerker balk',
15 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.'
16 },
17
18 {
19 name: 'Bewerker dialoog',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Bewerkerinhoudmenu',
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pouse',
93 capslock: 'Hoofletterslot',
94 escape: 'Ontsnap',
95 pageUp: 'Blaaiop',
96 pageDown: 'Blaaiaf',
97 end: 'Einde',
98 home: 'Tuis',
99 leftArrow: 'Linkspyl',
100 upArrow: 'Oppyl',
101 rightArrow: 'Regterpyl',
102 downArrow: 'Afpyl',
103 insert: 'Toevoeg',
104 'delete': 'Verwyder',
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Nommerblok 0',
109 numpad1: 'Nommerblok 1',
110 numpad2: 'Nommerblok 2',
111 numpad3: 'Nommerblok 3',
112 numpad4: 'Nommerblok 4',
113 numpad5: 'Nommerblok 5',
114 numpad6: 'Nommerblok 6',
115 numpad7: 'Nommerblok 7',
116 numpad8: 'Nommerblok 8',
117 numpad9: 'Nommerblok 9',
118 multiply: 'Maal',
119 add: 'Plus',
120 subtract: 'Minus',
121 decimalPoint: 'Desimaalepunt',
122 divide: 'Gedeeldeur',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Nommervergrendel',
136 scrollLock: 'Rolvergrendel',
137 semiColon: 'Kommapunt',
138 equalSign: 'Isgelykaan',
139 comma: 'Komma',
140 dash: 'Koppelteken',
141 period: 'Punt',
142 forwardSlash: 'Skuinsstreep',
143 graveAccent: 'Aksentteken',
144 openBracket: 'Oopblokhakkie',
145 backSlash: 'Trustreep',
146 closeBracket: 'Toeblokhakkie',
147 singleQuote: 'Enkelaanhaalingsteken'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ar.js b/sources/plugins/a11yhelp/dialogs/lang/ar.js
new file mode 100644
index 00000000..2131ed77
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ar.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ar', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'عام',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'إضافة',
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'تقسيم',
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'فاصلة',
140 dash: 'Dash', // MISSING
141 period: 'نقطة',
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/bg.js b/sources/plugins/a11yhelp/dialogs/lang/bg.js
new file mode 100644
index 00000000..605d5922
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/bg.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'bg', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'Общо',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ca.js b/sources/plugins/a11yhelp/dialogs/lang/ca.js
new file mode 100644
index 00000000..bd224f9b
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ca.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ca', {
7 title: 'Instruccions d\'Accessibilitat',
8 contents: 'Continguts de l\'Ajuda. Per tancar aquest quadre de diàleg premi ESC.',
9 legend: [
10 {
11 name: 'General',
12 items: [
13 {
14 name: 'Editor de barra d\'eines',
15 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.'
16 },
17
18 {
19 name: 'Editor de quadre de diàleg',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor de menú contextual',
26 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.'
27 },
28
29 {
30 name: 'Editor de caixa de llista',
31 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.'
32 },
33
34 {
35 name: 'Editor de barra de ruta de l\'element',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Ordres',
42 items: [
43 {
44 name: 'Desfer ordre',
45 legend: 'Premi ${undo}'
46 },
47 {
48 name: 'Refer ordre',
49 legend: 'Premi ${redo}'
50 },
51 {
52 name: 'Ordre negreta',
53 legend: 'Premi ${bold}'
54 },
55 {
56 name: 'Ordre cursiva',
57 legend: 'Premi ${italic}'
58 },
59 {
60 name: 'Ordre subratllat',
61 legend: 'Premi ${underline}'
62 },
63 {
64 name: 'Ordre enllaç',
65 legend: 'Premi ${link}'
66 },
67 {
68 name: 'Ordre amagar barra d\'eines',
69 legend: 'Premi ${toolbarCollapse}'
70 },
71 {
72 name: 'Ordre per accedir a l\'anterior espai enfocat',
73 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.'
74 },
75 {
76 name: 'Ordre per accedir al següent espai enfocat',
77 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.'
78 },
79 {
80 name: 'Ajuda d\'accessibilitat',
81 legend: 'Premi ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Retrocés',
87 tab: 'Tabulació',
88 enter: 'Intro',
89 shift: 'Majúscules',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pausa',
93 capslock: 'Bloqueig de majúscules',
94 escape: 'Escape',
95 pageUp: 'Pàgina Amunt',
96 pageDown: 'Pàgina Avall',
97 end: 'Fi',
98 home: 'Inici',
99 leftArrow: 'Fletxa Esquerra',
100 upArrow: 'Fletxa Amunt',
101 rightArrow: 'Fletxa Dreta',
102 downArrow: 'Fletxa Avall',
103 insert: 'Inserir',
104 'delete': 'Eliminar',
105 leftWindowKey: 'Tecla Windows Esquerra',
106 rightWindowKey: 'Tecla Windows Dreta',
107 selectKey: 'Tecla Seleccionar',
108 numpad0: 'Teclat Numèric 0',
109 numpad1: 'Teclat Numèric 1',
110 numpad2: 'Teclat Numèric 2',
111 numpad3: 'Teclat Numèric 3',
112 numpad4: 'Teclat Numèric 4',
113 numpad5: 'Teclat Numèric 5',
114 numpad6: 'Teclat Numèric 6',
115 numpad7: 'Teclat Numèric 7',
116 numpad8: 'Teclat Numèric 8',
117 numpad9: 'Teclat Numèric 9',
118 multiply: 'Multiplicació',
119 add: 'Suma',
120 subtract: 'Resta',
121 decimalPoint: 'Punt Decimal',
122 divide: 'Divisió',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Bloqueig Teclat Numèric',
136 scrollLock: 'Bloqueig de Desplaçament',
137 semiColon: 'Punt i Coma',
138 equalSign: 'Símbol Igual',
139 comma: 'Coma',
140 dash: 'Guió',
141 period: 'Punt',
142 forwardSlash: 'Barra Diagonal',
143 graveAccent: 'Accent Obert',
144 openBracket: 'Claudàtor Obert',
145 backSlash: 'Barra Invertida',
146 closeBracket: 'Claudàtor Tancat',
147 singleQuote: 'Cometa Simple'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/cs.js b/sources/plugins/a11yhelp/dialogs/lang/cs.js
new file mode 100644
index 00000000..ceb45767
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/cs.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'cs', {
7 title: 'Instrukce pro přístupnost',
8 contents: 'Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.',
9 legend: [
10 {
11 name: 'Obecné',
12 items: [
13 {
14 name: 'Panel nástrojů editoru',
15 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.'
16 },
17
18 {
19 name: 'Dialogové okno editoru',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Kontextové menu editoru',
26 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.'
27 },
28
29 {
30 name: 'Rámeček seznamu editoru',
31 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.'
32 },
33
34 {
35 name: 'Lišta cesty prvku v editoru',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Příkazy',
42 items: [
43 {
44 name: ' Příkaz Zpět',
45 legend: 'Stiskněte ${undo}'
46 },
47 {
48 name: ' Příkaz Znovu',
49 legend: 'Stiskněte ${redo}'
50 },
51 {
52 name: ' Příkaz Tučné',
53 legend: 'Stiskněte ${bold}'
54 },
55 {
56 name: ' Příkaz Kurzíva',
57 legend: 'Stiskněte ${italic}'
58 },
59 {
60 name: ' Příkaz Podtržení',
61 legend: 'Stiskněte ${underline}'
62 },
63 {
64 name: ' Příkaz Odkaz',
65 legend: 'Stiskněte ${link}'
66 },
67 {
68 name: ' Příkaz Skrýt panel nástrojů',
69 legend: 'Stiskněte ${toolbarCollapse}'
70 },
71 {
72 name: 'Příkaz pro přístup k předchozímu prostoru zaměření',
73 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.'
74 },
75 {
76 name: 'Příkaz pro přístup k dalšímu prostoru zaměření',
77 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.'
78 },
79 {
80 name: ' Nápověda přístupnosti',
81 legend: 'Stiskněte ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tabulátor',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pauza',
93 capslock: 'Caps lock',
94 escape: 'Escape',
95 pageUp: 'Stránka nahoru',
96 pageDown: 'Stránka dolů',
97 end: 'Konec',
98 home: 'Domů',
99 leftArrow: 'Šipka vlevo',
100 upArrow: 'Šipka nahoru',
101 rightArrow: 'Šipka vpravo',
102 downArrow: 'Šipka dolů',
103 insert: 'Vložit',
104 'delete': 'Smazat',
105 leftWindowKey: 'Levá klávesa Windows',
106 rightWindowKey: 'Pravá klávesa Windows',
107 selectKey: 'Vyberte klávesu',
108 numpad0: 'Numerická klávesa 0',
109 numpad1: 'Numerická klávesa 1',
110 numpad2: 'Numerická klávesa 2',
111 numpad3: 'Numerická klávesa 3',
112 numpad4: 'Numerická klávesa 4',
113 numpad5: 'Numerická klávesa 5',
114 numpad6: 'Numerická klávesa 6',
115 numpad7: 'Numerická klávesa 7',
116 numpad8: 'Numerická klávesa 8',
117 numpad9: 'Numerická klávesa 9',
118 multiply: 'Numerická klávesa násobení',
119 add: 'Přidat',
120 subtract: 'Numerická klávesa odečítání',
121 decimalPoint: 'Desetinná tečka',
122 divide: 'Numerická klávesa dělení',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num lock',
136 scrollLock: 'Scroll lock',
137 semiColon: 'Středník',
138 equalSign: 'Rovnítko',
139 comma: 'Čárka',
140 dash: 'Pomlčka',
141 period: 'Tečka',
142 forwardSlash: 'Lomítko',
143 graveAccent: 'Přízvuk',
144 openBracket: 'Otevřená hranatá závorka',
145 backSlash: 'Obrácené lomítko',
146 closeBracket: 'Uzavřená hranatá závorka',
147 singleQuote: 'Jednoduchá uvozovka'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/cy.js b/sources/plugins/a11yhelp/dialogs/lang/cy.js
new file mode 100644
index 00000000..2d8fbb35
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/cy.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'cy', {
7 title: 'Canllawiau Hygyrchedd',
8 contents: 'Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.',
9 legend: [
10 {
11 name: 'Cyffredinol',
12 items: [
13 {
14 name: 'Bar Offer y Golygydd',
15 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.'
16 },
17
18 {
19 name: 'Deialog y Golygydd',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Dewislen Cyd-destun y Golygydd',
26 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.'
27 },
28
29 {
30 name: 'Blwch Rhestr y Golygydd',
31 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.'
32 },
33
34 {
35 name: 'Bar Llwybr Elfen y Golygydd',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Gorchmynion',
42 items: [
43 {
44 name: 'Gorchymyn dadwneud',
45 legend: 'Pwyswch ${undo}'
46 },
47 {
48 name: 'Gorchymyn ailadrodd',
49 legend: 'Pwyswch ${redo}'
50 },
51 {
52 name: 'Gorchymyn Bras',
53 legend: 'Pwyswch ${bold}'
54 },
55 {
56 name: 'Gorchymyn italig',
57 legend: 'Pwyswch ${italig}'
58 },
59 {
60 name: 'Gorchymyn tanlinellu',
61 legend: 'Pwyso ${underline}'
62 },
63 {
64 name: 'Gorchymyn dolen',
65 legend: 'Pwyswch ${link}'
66 },
67 {
68 name: 'Gorchymyn Cwympo\'r Dewislen',
69 legend: 'Pwyswch ${toolbarCollapse}'
70 },
71 {
72 name: 'Myned i orchymyn bwlch ffocws blaenorol',
73 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.'
74 },
75 {
76 name: 'Ewch i\'r gorchymyn blwch ffocws nesaf',
77 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.'
78 },
79 {
80 name: 'Cymorth Hygyrchedd',
81 legend: 'Pwyswch ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape',
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/da.js b/sources/plugins/a11yhelp/dialogs/lang/da.js
new file mode 100644
index 00000000..e13b6ece
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/da.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'da', {
7 title: 'Tilgængelighedsinstrukser',
8 contents: 'Onlinehjælp. For at lukke dette vindue klik ESC',
9 legend: [
10 {
11 name: 'Generelt',
12 items: [
13 {
14 name: 'Editor værktøjslinje',
15 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.'
16 },
17
18 {
19 name: 'Editor dialogboks',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Kommandoer',
42 items: [
43 {
44 name: 'Fortryd kommando',
45 legend: 'Klik på ${undo}'
46 },
47 {
48 name: 'Gentag kommando',
49 legend: 'Klik ${redo}'
50 },
51 {
52 name: 'Fed kommando',
53 legend: 'Klik ${bold}'
54 },
55 {
56 name: 'Kursiv kommando',
57 legend: 'Klik ${italic}'
58 },
59 {
60 name: 'Understregnings kommando',
61 legend: 'Klik ${underline}'
62 },
63 {
64 name: 'Link kommando',
65 legend: 'Klik ${link}'
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Klik ${toolbarCollapse}'
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: 'Tilgængelighedshjælp',
81 legend: 'Kilk ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Venstre pil',
100 upArrow: 'Pil op',
101 rightArrow: 'Højre pil',
102 downArrow: 'Pil ned',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Venstre Windows tast',
106 rightWindowKey: 'Højre Windows tast',
107 selectKey: 'Select-knap',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Gange',
119 add: 'Plus',
120 subtract: 'Minus',
121 decimalPoint: 'Komma',
122 divide: 'Divider',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semikolon',
138 equalSign: 'Lighedstegn',
139 comma: 'Komma',
140 dash: 'Bindestreg',
141 period: 'Punktum',
142 forwardSlash: 'Skråstreg',
143 graveAccent: 'Accent grave',
144 openBracket: 'Start klamme',
145 backSlash: 'Omvendt skråstreg',
146 closeBracket: 'Slut klamme',
147 singleQuote: 'Enkelt citationstegn'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/de.js b/sources/plugins/a11yhelp/dialogs/lang/de.js
new file mode 100644
index 00000000..16561978
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/de.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'de', {
7 title: 'Barrierefreiheitinformationen',
8 contents: 'Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.',
9 legend: [
10 {
11 name: 'Allgemein',
12 items: [
13 {
14 name: 'Editorwerkzeugleiste',
15 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.'
16 },
17
18 {
19 name: 'Editordialog',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor-Kontextmenü',
26 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.'
27 },
28
29 {
30 name: 'Editor-Listenbox',
31 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.'
32 },
33
34 {
35 name: 'Editor-Elementpfadleiste',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Befehle',
42 items: [
43 {
44 name: 'Rückgängig-Befehl',
45 legend: 'Drücken Sie ${undo}'
46 },
47 {
48 name: 'Wiederherstellen-Befehl',
49 legend: 'Drücken Sie ${redo}'
50 },
51 {
52 name: 'Fettschrift-Befehl',
53 legend: 'Drücken Sie ${bold}'
54 },
55 {
56 name: 'Kursiv-Befehl',
57 legend: 'Drücken Sie ${italic}'
58 },
59 {
60 name: 'Unterstreichen-Befehl',
61 legend: 'Drücken Sie ${underline}'
62 },
63 {
64 name: 'Link-Befehl',
65 legend: 'Drücken Sie ${link}'
66 },
67 {
68 name: 'Werkzeugleiste einklappen-Befehl',
69 legend: 'Drücken Sie ${toolbarCollapse}'
70 },
71 {
72 name: 'Zugang bisheriger Fokussierung Raumbefehl ',
73 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. '
74 },
75 {
76 name: 'Zugang nächster Schwerpunkt Raumbefehl ',
77 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. '
78 },
79 {
80 name: 'Eingabehilfen',
81 legend: 'Drücken Sie ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Rücktaste',
87 tab: 'Tab',
88 enter: 'Eingabe',
89 shift: 'Umschalt',
90 ctrl: 'Strg',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Feststell',
94 escape: 'Escape',
95 pageUp: 'Bild auf',
96 pageDown: 'Bild ab',
97 end: 'Ende',
98 home: 'Pos1',
99 leftArrow: 'Linke Pfeiltaste',
100 upArrow: 'Obere Pfeiltaste',
101 rightArrow: 'Rechte Pfeiltaste',
102 downArrow: 'Untere Pfeiltaste',
103 insert: 'Einfügen',
104 'delete': 'Entfernen',
105 leftWindowKey: 'Linke Windowstaste',
106 rightWindowKey: 'Rechte Windowstaste',
107 selectKey: 'Taste auswählen',
108 numpad0: 'Ziffernblock 0',
109 numpad1: 'Ziffernblock 1',
110 numpad2: 'Ziffernblock 2',
111 numpad3: 'Ziffernblock 3',
112 numpad4: 'Ziffernblock 4',
113 numpad5: 'Ziffernblock 5',
114 numpad6: 'Ziffernblock 6',
115 numpad7: 'Ziffernblock 7',
116 numpad8: 'Ziffernblock 8',
117 numpad9: 'Ziffernblock 9',
118 multiply: 'Multiplizieren',
119 add: 'Addieren',
120 subtract: 'Subtrahieren',
121 decimalPoint: 'Punkt',
122 divide: 'Dividieren',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Ziffernblock feststellen',
136 scrollLock: 'Rollen',
137 semiColon: 'Semikolon',
138 equalSign: 'Gleichheitszeichen',
139 comma: 'Komma',
140 dash: 'Bindestrich',
141 period: 'Punkt',
142 forwardSlash: 'Schrägstrich',
143 graveAccent: 'Gravis',
144 openBracket: 'Öffnende eckige Klammer',
145 backSlash: 'Rückwärtsgewandter Schrägstrich',
146 closeBracket: 'Schließende eckige Klammer',
147 singleQuote: 'Einfaches Anführungszeichen'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/el.js b/sources/plugins/a11yhelp/dialogs/lang/el.js
new file mode 100644
index 00000000..a9a39f4e
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/el.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'el', {
7 title: 'Οδηγίες Προσβασιμότητας',
8 contents: 'Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.',
9 legend: [
10 {
11 name: 'Γενικά',
12 items: [
13 {
14 name: 'Εργαλειοθήκη Επεξεργαστή',
15 legend: 'Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και SHIFT+TAB. Μετακινηθείτε ανάμεσα στα κουμπιά εργαλείων με το ΔΕΞΙ ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου.'
16 },
17
18 {
19 name: 'Παράθυρο Διαλόγου Επεξεργαστή',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Αναδυόμενο Μενού Επεξεργαστή',
26 legend: 'Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με το ESC ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC.'
27 },
28
29 {
30 name: 'Κουτί Λίστας Επεξεργαστών',
31 legend: 'Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας.'
32 },
33
34 {
35 name: 'Μπάρα Διαδρομών Στοιχείων Επεξεργαστή',
36 legend: 'Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή.'
37 }
38 ]
39 },
40 {
41 name: 'Εντολές',
42 items: [
43 {
44 name: 'Εντολή αναίρεσης',
45 legend: 'Πατήστε ${undo}'
46 },
47 {
48 name: 'Εντολή επανάληψης',
49 legend: 'Πατήστε ${redo}'
50 },
51 {
52 name: 'Εντολή έντονης γραφής',
53 legend: 'Πατήστε ${bold}'
54 },
55 {
56 name: 'Εντολή πλάγιας γραφής',
57 legend: 'Πατήστε ${italic}'
58 },
59 {
60 name: 'Εντολή υπογράμμισης',
61 legend: 'Πατήστε ${underline}'
62 },
63 {
64 name: 'Εντολή συνδέσμου',
65 legend: 'Πατήστε ${link}'
66 },
67 {
68 name: 'Εντολή Σύμπτηξης Εργαλειοθήκης',
69 legend: 'Πατήστε ${toolbarCollapse}'
70 },
71 {
72 name: 'Πρόσβαση στην προηγούμενη εντολή του χώρου εστίασης ',
73 legend: 'Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. '
74 },
75 {
76 name: 'Πρόσβαση στην επόμενη εντολή του χώρου εστίασης',
77 legend: 'Πατήστε ${accessNextSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. '
78 },
79 {
80 name: 'Βοήθεια Προσβασιμότητας',
81 legend: 'Πατήστε ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Αριστερό Βέλος',
100 upArrow: 'Πάνω Βέλος',
101 rightArrow: 'Δεξί Βέλος',
102 downArrow: 'Κάτω Βέλος',
103 insert: 'Insert ',
104 'delete': 'Delete',
105 leftWindowKey: 'Αριστερό Πλήκτρο Windows',
106 rightWindowKey: 'Δεξί Πλήκτρο Windows',
107 selectKey: 'Πλήκτρο Select',
108 numpad0: 'Αριθμητικό πληκτρολόγιο 0',
109 numpad1: 'Αριθμητικό Πληκτρολόγιο 1',
110 numpad2: 'Αριθμητικό πληκτρολόγιο 2',
111 numpad3: 'Αριθμητικό πληκτρολόγιο 3',
112 numpad4: 'Αριθμητικό πληκτρολόγιο 4',
113 numpad5: 'Αριθμητικό πληκτρολόγιο 5',
114 numpad6: 'Αριθμητικό πληκτρολόγιο 6',
115 numpad7: 'Αριθμητικό πληκτρολόγιο 7',
116 numpad8: 'Αριθμητικό πληκτρολόγιο 8',
117 numpad9: 'Αριθμητικό πληκτρολόγιο 9',
118 multiply: 'Πολλαπλασιασμός',
119 add: 'Πρόσθεση',
120 subtract: 'Αφαίρεση',
121 decimalPoint: 'Υποδιαστολή',
122 divide: 'Διαίρεση',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: '6',
129 f7: '7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Ερωτηματικό',
138 equalSign: 'Σύμβολο Ισότητας',
139 comma: 'Κόμμα',
140 dash: 'Παύλα',
141 period: 'Τελεία',
142 forwardSlash: 'Κάθετος',
143 graveAccent: 'Βαρεία',
144 openBracket: 'Άνοιγμα Παρένθεσης',
145 backSlash: 'Ανάστροφη Κάθετος',
146 closeBracket: 'Κλείσιμο Παρένθεσης',
147 singleQuote: 'Απόστροφος'
148} );
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 00000000..800d0577
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/en-gb.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'en-gb', {
7 title: 'Accessibility Instructions',
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'General',
12 items: [
13 {
14 name: 'Editor Toolbar',
15 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
16 },
17
18 {
19 name: 'Editor Dialog',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu',
26 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
27 },
28
29 {
30 name: 'Editor List Box',
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar',
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands',
42 items: [
43 {
44 name: ' Undo command',
45 legend: 'Press ${undo}'
46 },
47 {
48 name: ' Redo command',
49 legend: 'Press ${redo}'
50 },
51 {
52 name: ' Bold command',
53 legend: 'Press ${bold}'
54 },
55 {
56 name: ' Italic command',
57 legend: 'Press ${italic}'
58 },
59 {
60 name: ' Underline command',
61 legend: 'Press ${underline}'
62 },
63 {
64 name: ' Link command',
65 legend: 'Press ${link}'
66 },
67 {
68 name: ' Toolbar Collapse command',
69 legend: 'Press ${toolbarCollapse}'
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help',
81 legend: 'Press ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Left Arrow',
100 upArrow: 'Up Arrow',
101 rightArrow: 'Right Arrow',
102 downArrow: 'Down Arrow',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Left Windows key',
106 rightWindowKey: 'Right Windows key',
107 selectKey: 'Select key',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Multiply',
119 add: 'Add',
120 subtract: 'Subtract',
121 decimalPoint: 'Decimal Point',
122 divide: 'Divide',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semicolon',
138 equalSign: 'Equal Sign',
139 comma: 'Comma',
140 dash: 'Dash',
141 period: 'Period',
142 forwardSlash: 'Forward Slash',
143 graveAccent: 'Grave Accent',
144 openBracket: 'Open Bracket',
145 backSlash: 'Backslash',
146 closeBracket: 'Close Bracket',
147 singleQuote: 'Single Quote'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/en.js b/sources/plugins/a11yhelp/dialogs/lang/en.js
new file mode 100644
index 00000000..f18aff7b
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/en.js
@@ -0,0 +1,167 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'en', {
7 title: 'Accessibility Instructions',
8 contents: 'Help Contents. To close this dialog press ESC.',
9 legend: [
10 {
11 name: 'General',
12 items: [
13 {
14 name: 'Editor Toolbar',
15 legend: 'Press ${toolbarFocus} to navigate to the toolbar. ' +
16 'Move to the next and previous toolbar group with TAB and SHIFT+TAB. ' +
17 'Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. ' +
18 'Press SPACE or ENTER to activate the toolbar button.'
19 },
20
21 {
22 name: 'Editor Dialog',
23 legend:
24 '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. ' +
25 '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. ' +
26 'With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.'
27 },
28
29 {
30 name: 'Editor Context Menu',
31 legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. ' +
32 'Then move to next menu option with TAB or DOWN ARROW. ' +
33 'Move to previous option with SHIFT+TAB or UP ARROW. ' +
34 'Press SPACE or ENTER to select the menu option. ' +
35 'Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. ' +
36 'Go back to parent menu item with ESC or LEFT ARROW. ' +
37 'Close context menu with ESC.'
38 },
39
40 {
41 name: 'Editor List Box',
42 legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. ' +
43 'Move to previous list item with SHIFT+TAB or UP ARROW. ' +
44 'Press SPACE or ENTER to select the list option. ' +
45 'Press ESC to close the list-box.'
46 },
47
48 {
49 name: 'Editor Element Path Bar',
50 legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. ' +
51 'Move to next element button with TAB or RIGHT ARROW. ' +
52 'Move to previous button with SHIFT+TAB or LEFT ARROW. ' +
53 'Press SPACE or ENTER to select the element in editor.'
54 }
55 ]
56 },
57 {
58 name: 'Commands',
59 items: [
60 {
61 name: ' Undo command',
62 legend: 'Press ${undo}'
63 },
64 {
65 name: ' Redo command',
66 legend: 'Press ${redo}'
67 },
68 {
69 name: ' Bold command',
70 legend: 'Press ${bold}'
71 },
72 {
73 name: ' Italic command',
74 legend: 'Press ${italic}'
75 },
76 {
77 name: ' Underline command',
78 legend: 'Press ${underline}'
79 },
80 {
81 name: ' Link command',
82 legend: 'Press ${link}'
83 },
84 {
85 name: ' Toolbar Collapse command',
86 legend: 'Press ${toolbarCollapse}'
87 },
88 {
89 name: ' Access previous focus space command',
90 legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, ' +
91 'for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.'
92 },
93 {
94 name: ' Access next focus space command',
95 legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, ' +
96 'for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.'
97 },
98 {
99 name: ' Accessibility Help',
100 legend: 'Press ${a11yHelp}'
101 }
102 ]
103 }
104 ],
105 backspace: 'Backspace',
106 tab: 'Tab',
107 enter: 'Enter',
108 shift: 'Shift',
109 ctrl: 'Ctrl',
110 alt: 'Alt',
111 pause: 'Pause',
112 capslock: 'Caps Lock',
113 escape: 'Escape',
114 pageUp: 'Page Up',
115 pageDown: 'Page Down',
116 end: 'End',
117 home: 'Home',
118 leftArrow: 'Left Arrow',
119 upArrow: 'Up Arrow',
120 rightArrow: 'Right Arrow',
121 downArrow: 'Down Arrow',
122 insert: 'Insert',
123 'delete': 'Delete',
124 leftWindowKey: 'Left Windows key',
125 rightWindowKey: 'Right Windows key',
126 selectKey: 'Select key',
127 numpad0: 'Numpad 0',
128 numpad1: 'Numpad 1',
129 numpad2: 'Numpad 2',
130 numpad3: 'Numpad 3',
131 numpad4: 'Numpad 4',
132 numpad5: 'Numpad 5',
133 numpad6: 'Numpad 6',
134 numpad7: 'Numpad 7',
135 numpad8: 'Numpad 8',
136 numpad9: 'Numpad 9',
137 multiply: 'Multiply',
138 add: 'Add',
139 subtract: 'Subtract',
140 decimalPoint: 'Decimal Point',
141 divide: 'Divide',
142 f1: 'F1',
143 f2: 'F2',
144 f3: 'F3',
145 f4: 'F4',
146 f5: 'F5',
147 f6: 'F6',
148 f7: 'F7',
149 f8: 'F8',
150 f9: 'F9',
151 f10: 'F10',
152 f11: 'F11',
153 f12: 'F12',
154 numLock: 'Num Lock',
155 scrollLock: 'Scroll Lock',
156 semiColon: 'Semicolon',
157 equalSign: 'Equal Sign',
158 comma: 'Comma',
159 dash: 'Dash',
160 period: 'Period',
161 forwardSlash: 'Forward Slash',
162 graveAccent: 'Grave Accent',
163 openBracket: 'Open Bracket',
164 backSlash: 'Backslash',
165 closeBracket: 'Close Bracket',
166 singleQuote: 'Single Quote'
167} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/eo.js b/sources/plugins/a11yhelp/dialogs/lang/eo.js
new file mode 100644
index 00000000..66df8c3d
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/eo.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'eo', {
7 title: 'Uzindikoj pri atingeblo',
8 contents: 'Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.',
9 legend: [
10 {
11 name: 'Ĝeneralaĵoj',
12 items: [
13 {
14 name: 'Ilbreto de la redaktilo',
15 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.'
16 },
17
18 {
19 name: 'Redaktildialogo',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Kunteksta menuo de la redaktilo',
26 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.'
27 },
28
29 {
30 name: 'Fallisto de la redaktilo',
31 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.'
32 },
33
34 {
35 name: 'Breto indikanta la vojon al la redaktilelementoj',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Komandoj',
42 items: [
43 {
44 name: 'Komando malfari',
45 legend: 'Premu ${undo}'
46 },
47 {
48 name: 'Komando refari',
49 legend: 'Premu ${redo}'
50 },
51 {
52 name: 'Komando grasa',
53 legend: 'Premu ${bold}'
54 },
55 {
56 name: 'Komando kursiva',
57 legend: 'Premu ${italic}'
58 },
59 {
60 name: 'Komando substreki',
61 legend: 'Premu ${underline}'
62 },
63 {
64 name: 'Komando ligilo',
65 legend: 'Premu ${link}'
66 },
67 {
68 name: 'Komando faldi la ilbreton',
69 legend: 'Premu ${toolbarCollapse}'
70 },
71 {
72 name: 'Komando por atingi la antaŭan fokusan spacon',
73 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.'
74 },
75 {
76 name: 'Komando por atingi la sekvan fokusan spacon',
77 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'
78 },
79 {
80 name: 'Helpilo pri atingeblo',
81 legend: 'Premu ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Retropaŝo',
87 tab: 'Tabo',
88 enter: 'Enigi',
89 shift: 'Registrumo',
90 ctrl: 'Stirklavo',
91 alt: 'Alt-klavo',
92 pause: 'Paŭzo',
93 capslock: 'Majuskla baskulo',
94 escape: 'Eskapa klavo',
95 pageUp: 'Antaŭa Paĝo',
96 pageDown: 'Sekva Paĝo',
97 end: 'Fino',
98 home: 'Hejmo',
99 leftArrow: 'Sago Maldekstren',
100 upArrow: 'Sago Supren',
101 rightArrow: 'Sago Dekstren',
102 downArrow: 'Sago Suben',
103 insert: 'Enmeti',
104 'delete': 'Forigi',
105 leftWindowKey: 'Maldekstra Windows-klavo',
106 rightWindowKey: 'Dekstra Windows-klavo',
107 selectKey: 'Selektklavo',
108 numpad0: 'Nombra Klavaro 0',
109 numpad1: 'Nombra Klavaro 1',
110 numpad2: 'Nombra Klavaro 2',
111 numpad3: 'Nombra Klavaro 3',
112 numpad4: 'Nombra Klavaro 4',
113 numpad5: 'Nombra Klavaro 5',
114 numpad6: 'Nombra Klavaro 6',
115 numpad7: 'Nombra Klavaro 7',
116 numpad8: 'Nombra Klavaro 8',
117 numpad9: 'Nombra Klavaro 9',
118 multiply: 'Obligi',
119 add: 'Almeti',
120 subtract: 'Subtrahi',
121 decimalPoint: 'Dekuma Punkto',
122 divide: 'Dividi',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Nombra Baskulo',
136 scrollLock: 'Ruluma Baskulo',
137 semiColon: 'Punktokomo',
138 equalSign: 'Egalsigno',
139 comma: 'Komo',
140 dash: 'Haltostreko',
141 period: 'Punkto',
142 forwardSlash: 'Oblikvo',
143 graveAccent: 'Malakuto',
144 openBracket: 'Malferma Krampo',
145 backSlash: 'Retroklino',
146 closeBracket: 'Ferma Krampo',
147 singleQuote: 'Citilo'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/es.js b/sources/plugins/a11yhelp/dialogs/lang/es.js
new file mode 100644
index 00000000..7b4e8b48
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/es.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'es', {
7 title: 'Instrucciones de accesibilidad',
8 contents: 'Ayuda. Para cerrar presione ESC.',
9 legend: [
10 {
11 name: 'General',
12 items: [
13 {
14 name: 'Barra de herramientas del editor',
15 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.'
16 },
17
18 {
19 name: 'Editor de diálogo',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor del menú contextual',
26 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.'
27 },
28
29 {
30 name: 'Lista del Editor',
31 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.'
32 },
33
34 {
35 name: 'Barra de Ruta del Elemento en el Editor',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Comandos',
42 items: [
43 {
44 name: 'Comando deshacer',
45 legend: 'Presiona ${undo}'
46 },
47 {
48 name: 'Comando rehacer',
49 legend: 'Presiona ${redo}'
50 },
51 {
52 name: 'Comando negrita',
53 legend: 'Presiona ${bold}'
54 },
55 {
56 name: 'Comando itálica',
57 legend: 'Presiona ${italic}'
58 },
59 {
60 name: 'Comando subrayar',
61 legend: 'Presiona ${underline}'
62 },
63 {
64 name: 'Comando liga',
65 legend: 'Presiona ${liga}'
66 },
67 {
68 name: 'Comando colapsar barra de herramientas',
69 legend: 'Presiona ${toolbarCollapse}'
70 },
71 {
72 name: 'Comando accesar el anterior espacio de foco',
73 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.'
74 },
75 {
76 name: 'Comando accesar el siguiente spacio de foco',
77 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.'
78 },
79 {
80 name: 'Ayuda de Accesibilidad',
81 legend: 'Presiona ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Retroceso',
87 tab: 'Tabulador',
88 enter: 'Ingresar',
89 shift: 'Mayús.',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pausa',
93 capslock: 'Bloq. Mayús.',
94 escape: 'Escape',
95 pageUp: 'Regresar Página',
96 pageDown: 'Avanzar Página',
97 end: 'Fin',
98 home: 'Inicio',
99 leftArrow: 'Flecha Izquierda',
100 upArrow: 'Flecha Arriba',
101 rightArrow: 'Flecha Derecha',
102 downArrow: 'Flecha Abajo',
103 insert: 'Insertar',
104 'delete': 'Suprimir',
105 leftWindowKey: 'Tecla Windows Izquierda',
106 rightWindowKey: 'Tecla Windows Derecha',
107 selectKey: 'Tecla de Selección',
108 numpad0: 'Tecla 0 del teclado numérico',
109 numpad1: 'Tecla 1 del teclado numérico',
110 numpad2: 'Tecla 2 del teclado numérico',
111 numpad3: 'Tecla 3 del teclado numérico',
112 numpad4: 'Tecla 4 del teclado numérico',
113 numpad5: 'Tecla 5 del teclado numérico',
114 numpad6: 'Tecla 6 del teclado numérico',
115 numpad7: 'Tecla 7 del teclado numérico',
116 numpad8: 'Tecla 8 del teclado numérico',
117 numpad9: 'Tecla 9 del teclado numérico',
118 multiply: 'Multiplicar',
119 add: 'Sumar',
120 subtract: 'Restar',
121 decimalPoint: 'Punto Decimal',
122 divide: 'Dividir',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Punto y coma',
138 equalSign: 'Signo de Igual',
139 comma: 'Coma',
140 dash: 'Guión',
141 period: 'Punto',
142 forwardSlash: 'Diagonal',
143 graveAccent: 'Acento Grave',
144 openBracket: 'Abrir llave',
145 backSlash: 'Diagonal Invertida',
146 closeBracket: 'Cerrar llave',
147 singleQuote: 'Comillas simples'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/et.js b/sources/plugins/a11yhelp/dialogs/lang/et.js
new file mode 100644
index 00000000..4c98a568
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/et.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'et', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.',
9 legend: [
10 {
11 name: 'Üldine',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/eu.js b/sources/plugins/a11yhelp/dialogs/lang/eu.js
new file mode 100644
index 00000000..5d879bd4
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/eu.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'eu', {
7 title: 'Erabilerraztasunaren argibideak',
8 contents: 'Laguntzaren edukiak. Elkarrizketa-koadro hau ixteko sakatu ESC.',
9 legend: [
10 {
11 name: 'Orokorra',
12 items: [
13 {
14 name: 'Editorearen tresna-barra',
15 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.'
16 },
17
18 {
19 name: 'Editorearen elkarrizketa-koadroa',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Editorearen testuinguru-menua',
26 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.'
27 },
28
29 {
30 name: 'Editorearen zerrenda-koadroa',
31 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.'
32 },
33
34 {
35 name: 'Editorearen elementuaren bide-barra',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Komandoak',
42 items: [
43 {
44 name: 'Desegin komandoa',
45 legend: 'Sakatu ${undo}'
46 },
47 {
48 name: 'Berregin komandoa',
49 legend: 'Sakatu ${redo}'
50 },
51 {
52 name: 'Lodia komandoa',
53 legend: 'Sakatu ${bold}'
54 },
55 {
56 name: 'Etzana komandoa',
57 legend: 'Sakatu ${italic}'
58 },
59 {
60 name: 'Azpimarratu komandoa',
61 legend: 'Sakatu ${underline}'
62 },
63 {
64 name: 'Esteka komandoa',
65 legend: 'Sakatu ${link}'
66 },
67 {
68 name: 'Tolestu tresna-barra komandoa',
69 legend: 'Sakatu ${toolbarCollapse}'
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: 'Erabilerraztasunaren laguntza',
81 legend: 'Sakatu ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Atzera tekla',
87 tab: 'Tabuladorea',
88 enter: 'Sartu',
89 shift: 'Maius',
90 ctrl: 'Ktrl',
91 alt: 'Alt',
92 pause: 'Pausatu',
93 capslock: 'Blok Maius',
94 escape: 'Ihes',
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'Buka',
98 home: 'Etxea',
99 leftArrow: 'Ezker-gezia',
100 upArrow: 'Gora gezia',
101 rightArrow: 'Eskuin-gezia',
102 downArrow: 'Behera gezia',
103 insert: 'Txertatu',
104 'delete': 'Ezabatu',
105 leftWindowKey: 'Ezkerreko Windows tekla',
106 rightWindowKey: 'Eskuineko Windows tekla',
107 selectKey: 'Hautatu tekla',
108 numpad0: 'Zenbakizko teklatua 0',
109 numpad1: 'Zenbakizko teklatua 1',
110 numpad2: 'Zenbakizko teklatua 2',
111 numpad3: 'Zenbakizko teklatua 3',
112 numpad4: 'Zenbakizko teklatua 4',
113 numpad5: 'Zenbakizko teklatua 5',
114 numpad6: 'Zenbakizko teklatua 6',
115 numpad7: 'Zenbakizko teklatua 7',
116 numpad8: 'Zenbakizko teklatua 8',
117 numpad9: 'Zenbakizko teklatua 9',
118 multiply: 'Biderkatu',
119 add: 'Gehitu',
120 subtract: 'Kendu',
121 decimalPoint: 'Koma hamartarra',
122 divide: 'Zatitu',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Blok Zenb',
136 scrollLock: 'Blok Korr',
137 semiColon: 'Puntu eta koma',
138 equalSign: 'Berdin zeinua',
139 comma: 'Koma',
140 dash: 'Marratxoa',
141 period: 'Puntua',
142 forwardSlash: 'Barra',
143 graveAccent: 'Azentu kamutsa',
144 openBracket: 'Parentesia ireki',
145 backSlash: 'Alderantzizko barra',
146 closeBracket: 'Itxi parentesia',
147 singleQuote: 'Komatxo bakuna'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/fa.js b/sources/plugins/a11yhelp/dialogs/lang/fa.js
new file mode 100644
index 00000000..9d2802fa
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/fa.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'fa', {
7 title: 'دستورالعمل‌های دسترسی',
8 contents: 'راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.',
9 legend: [
10 {
11 name: 'عمومی',
12 items: [
13 {
14 name: 'نوار ابزار ویرایشگر',
15 legend: '${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shift+Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهت‌نمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید.'
16 },
17
18 {
19 name: 'پنجره محاورهای ویرایشگر',
20 legend:
21 '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
22 },
23
24 {
25 name: 'منوی متنی ویرایشگر',
26 legend: '${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc.'
27 },
28
29 {
30 name: 'جعبه فهرست ویرایشگر',
31 legend: 'در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید.'
32 },
33
34 {
35 name: 'ویرایشگر عنصر نوار راه',
36 legend: 'برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر.'
37 }
38 ]
39 },
40 {
41 name: 'فرمان‌ها',
42 items: [
43 {
44 name: 'بازگشت به آخرین فرمان',
45 legend: 'فشردن ${undo}'
46 },
47 {
48 name: 'انجام مجدد فرمان',
49 legend: 'فشردن ${redo}'
50 },
51 {
52 name: 'فرمان درشت کردن متن',
53 legend: 'فشردن ${bold}'
54 },
55 {
56 name: 'فرمان کج کردن متن',
57 legend: 'فشردن ${italic}'
58 },
59 {
60 name: 'فرمان زیرخطدار کردن متن',
61 legend: 'فشردن ${underline}'
62 },
63 {
64 name: 'فرمان پیوند دادن',
65 legend: 'فشردن ${link}'
66 },
67 {
68 name: 'بستن نوار ابزار فرمان',
69 legend: 'فشردن ${toolbarCollapse}'
70 },
71 {
72 name: 'دسترسی به فرمان محل تمرکز قبلی',
73 legend: 'فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور.'
74 },
75 {
76 name: 'دسترسی به فضای دستور بعدی',
77 legend: 'برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال: دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید.'
78 },
79 {
80 name: 'راهنمای دسترسی',
81 legend: 'فشردن ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'عقبگرد',
87 tab: 'برگه',
88 enter: 'ورود',
89 shift: 'تعویض',
90 ctrl: 'کنترل',
91 alt: 'دگرساز',
92 pause: 'توقف',
93 capslock: 'Caps Lock',
94 escape: 'گریز',
95 pageUp: 'صفحه به بالا',
96 pageDown: 'صفحه به پایین',
97 end: 'پایان',
98 home: 'خانه',
99 leftArrow: 'پیکان چپ',
100 upArrow: 'پیکان بالا',
101 rightArrow: 'پیکان راست',
102 downArrow: 'پیکان پایین',
103 insert: 'ورود',
104 'delete': 'حذف',
105 leftWindowKey: 'کلید چپ ویندوز',
106 rightWindowKey: 'کلید راست ویندوز',
107 selectKey: 'انتخاب کلید',
108 numpad0: 'کلید شماره 0',
109 numpad1: 'کلید شماره 1',
110 numpad2: 'کلید شماره 2',
111 numpad3: 'کلید شماره 3',
112 numpad4: 'کلید شماره 4',
113 numpad5: 'کلید شماره 5',
114 numpad6: 'کلید شماره 6',
115 numpad7: 'کلید شماره 7',
116 numpad8: 'کلید شماره 8',
117 numpad9: 'کلید شماره 9',
118 multiply: 'ضرب',
119 add: 'افزودن',
120 subtract: 'تفریق',
121 decimalPoint: 'نقطه‌ی اعشار',
122 divide: 'جدا کردن',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semicolon',
138 equalSign: 'علامت تساوی',
139 comma: 'کاما',
140 dash: 'خط تیره',
141 period: 'دوره',
142 forwardSlash: 'Forward Slash',
143 graveAccent: 'Grave Accent',
144 openBracket: 'Open Bracket',
145 backSlash: 'Backslash',
146 closeBracket: 'Close Bracket',
147 singleQuote: 'Single Quote'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/fi.js b/sources/plugins/a11yhelp/dialogs/lang/fi.js
new file mode 100644
index 00000000..fce42284
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/fi.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'fi', {
7 title: 'Saavutettavuus ohjeet',
8 contents: 'Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.',
9 legend: [
10 {
11 name: 'Yleinen',
12 items: [
13 {
14 name: 'Editorin työkalupalkki',
15 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.'
16 },
17
18 {
19 name: 'Editorin dialogi',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editorin oheisvalikko',
26 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.'
27 },
28
29 {
30 name: 'Editorin listalaatikko',
31 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.'
32 },
33
34 {
35 name: 'Editorin elementtipolun palkki',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Komennot',
42 items: [
43 {
44 name: 'Peruuta komento',
45 legend: 'Paina ${undo}'
46 },
47 {
48 name: 'Tee uudelleen komento',
49 legend: 'Paina ${redo}'
50 },
51 {
52 name: 'Lihavoi komento',
53 legend: 'Paina ${bold}'
54 },
55 {
56 name: 'Kursivoi komento',
57 legend: 'Paina ${italic}'
58 },
59 {
60 name: 'Alleviivaa komento',
61 legend: 'Paina ${underline}'
62 },
63 {
64 name: 'Linkki komento',
65 legend: 'Paina ${link}'
66 },
67 {
68 name: 'Pienennä työkalupalkki komento',
69 legend: 'Paina ${toolbarCollapse}'
70 },
71 {
72 name: 'Siirry aiempaan fokustilaan komento',
73 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.'
74 },
75 {
76 name: 'Siirry seuraavaan fokustilaan komento',
77 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.'
78 },
79 {
80 name: 'Saavutettavuus ohjeet',
81 legend: 'Paina ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numeronäppäimistö 0',
109 numpad1: 'Numeronäppäimistö 1',
110 numpad2: 'Numeronäppäimistö 2',
111 numpad3: 'Numeronäppäimistö 3',
112 numpad4: 'Numeronäppäimistö 4',
113 numpad5: 'Numeronäppäimistö 5',
114 numpad6: 'Numeronäppäimistö 6',
115 numpad7: 'Numeronäppäimistö 7',
116 numpad8: 'Numeronäppäimistö 8',
117 numpad9: 'Numeronäppäimistö 9',
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Puolipiste',
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Pilkku',
140 dash: 'Dash', // MISSING
141 period: 'Piste',
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/fo.js b/sources/plugins/a11yhelp/dialogs/lang/fo.js
new file mode 100644
index 00000000..26b1739a
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/fo.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'fo', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'General', // MISSING
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Falda',
119 add: 'Pluss',
120 subtract: 'Frádráttar',
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Býta',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semikolon',
138 equalSign: 'Javnatekn',
139 comma: 'Komma',
140 dash: 'Dash', // MISSING
141 period: 'Punktum',
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
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 00000000..d37e497a
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/fr-ca.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'fr-ca', {
7 title: 'Instructions d\'accessibilité',
8 contents: 'Contenu de l\'aide. Pour fermer cette fenêtre, appuyez sur ESC.',
9 legend: [
10 {
11 name: 'Général',
12 items: [
13 {
14 name: 'Barre d\'outil de l\'éditeur',
15 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.'
16 },
17
18 {
19 name: 'Dialogue de l\'éditeur',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Menu contextuel de l\'éditeur',
26 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.'
27 },
28
29 {
30 name: 'Menu déroulant de l\'éditeur',
31 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.'
32 },
33
34 {
35 name: 'Barre d\'emplacement des éléments de l\'éditeur',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Commandes',
42 items: [
43 {
44 name: 'Annuler',
45 legend: 'Appuyer sur ${undo}'
46 },
47 {
48 name: 'Refaire',
49 legend: 'Appuyer sur ${redo}'
50 },
51 {
52 name: 'Gras',
53 legend: 'Appuyer sur ${bold}'
54 },
55 {
56 name: 'Italique',
57 legend: 'Appuyer sur ${italic}'
58 },
59 {
60 name: 'Souligné',
61 legend: 'Appuyer sur ${underline}'
62 },
63 {
64 name: 'Lien',
65 legend: 'Appuyer sur ${link}'
66 },
67 {
68 name: 'Enrouler la barre d\'outils',
69 legend: 'Appuyer sur ${toolbarCollapse}'
70 },
71 {
72 name: 'Accéder à l\'objet de focus précédent',
73 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.'
74 },
75 {
76 name: 'Accéder au prochain objet de focus',
77 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.'
78 },
79 {
80 name: 'Aide d\'accessibilité',
81 legend: 'Appuyer sur ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/fr.js b/sources/plugins/a11yhelp/dialogs/lang/fr.js
new file mode 100644
index 00000000..db7ac476
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/fr.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'fr', {
7 title: 'Instructions d\'accessibilité',
8 contents: 'Contenu de l\'aide. Pour fermer ce dialogue, appuyez sur la touche ÉCHAP (Echappement).',
9 legend: [
10 {
11 name: 'Général',
12 items: [
13 {
14 name: 'Barre d\'outils de l\'éditeur',
15 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 MAJ et MAJ+TAB. Se déplacer vers les boutons 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.'
16 },
17
18 {
19 name: 'Dialogue de l\'éditeur',
20 legend:
21 'Dans un dialogue, appuyer sur TAB pour aller à l\'élément suivant du dialogue, appuyer sur MAJ+TAB pour aller à l\'élément précédent du dialogue, appuyer sur ECHAP pour annuler le dialogue. Quand un dialogue a de multiples onglets, on peut accéder à la liste des onglets avec ALT+F10 ou avec TAB. Dans la liste des onglets, se déplacer vers le suivant ou le précédent avec les FLECHES DROITE et GAUCHE respectivement.'
22 },
23
24 {
25 name: 'Menu contextuel de l\'éditeur',
26 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 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. Oovrir le sous-menu de l\'option courante avec la BARRE D\'ESPACE ou les touches ENTRÉE ou FLÈCHE DROITE. Revenir à l\'élément de menu parent avec les touches ÉCHAP ou FLÈCHE GAUCHE. Fermer le menu contextuel avec ÉCHAP.'
27 },
28
29 {
30 name: 'Zone de liste de l\'éditeur',
31 legend: 'Dans la 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.'
32 },
33
34 {
35 name: 'Barre d\'emplacement des éléments de l\'éditeur',
36 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 FLÈCHE DROITE. Se déplacer vers le bouton d\'élément 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.'
37 }
38 ]
39 },
40 {
41 name: 'Commandes',
42 items: [
43 {
44 name: ' Annuler la commande',
45 legend: 'Appuyer sur ${undo}'
46 },
47 {
48 name: 'Refaire la commande',
49 legend: 'Appuyer sur ${redo}'
50 },
51 {
52 name: ' Commande gras',
53 legend: 'Appuyer sur ${bold}'
54 },
55 {
56 name: ' Commande italique',
57 legend: 'Appuyer sur ${italic}'
58 },
59 {
60 name: ' Commande souligné',
61 legend: 'Appuyer sur ${underline}'
62 },
63 {
64 name: ' Commande lien',
65 legend: 'Appuyer sur ${link}'
66 },
67 {
68 name: ' Commande enrouler la barre d\'outils',
69 legend: 'Appuyer sur ${toolbarCollapse}'
70 },
71 {
72 name: 'Accéder à la précédente commande d\'espace de mise au point',
73 legend: 'Appuyez sur ${accessPreviousSpace} pour accéder à l\'espace hors d\'atteinte le plus proche avant le caret, par exemple: deux éléments HR adjacents. Répétez la combinaison de touches pour atteindre les espaces de mise au point distants.'
74 },
75 {
76 name: 'Accès à la prochaine commande de l\'espace de mise au point',
77 legend: 'Appuyez sur ${accessNextSpace} pour accéder au plus proche espace de mise au point hors d\'atteinte après le caret, par exemple: deux éléments HR adjacents. répétez la combinaison de touches pour atteindre les espace de mise au point distants.'
78 },
79 {
80 name: ' Aide Accessibilité',
81 legend: 'Appuyer sur ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Retour arrière',
87 tab: 'Tabulation',
88 enter: 'Entrée',
89 shift: 'Majuscule',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Verr. Maj.',
94 escape: 'Échap',
95 pageUp: 'Page supérieure',
96 pageDown: 'Page inférieure',
97 end: 'Fin',
98 home: 'Retour',
99 leftArrow: 'Flèche gauche',
100 upArrow: 'Flèche haute',
101 rightArrow: 'Flèche droite',
102 downArrow: 'Flèche basse',
103 insert: 'Insertion',
104 'delete': 'Supprimer',
105 leftWindowKey: 'Touche Windows gauche',
106 rightWindowKey: 'Touche Windows droite',
107 selectKey: 'Touche menu',
108 numpad0: 'Pavé numérique 0',
109 numpad1: 'Pavé numérique 1',
110 numpad2: 'Pavé numérique 2',
111 numpad3: 'Pavé numérique 3',
112 numpad4: 'Pavé numérique 4',
113 numpad5: 'Pavé numérique 5',
114 numpad6: 'Pavé numérique 6',
115 numpad7: 'Pavé numérique 7',
116 numpad8: 'Pavé numérique 8',
117 numpad9: 'Pavé numérique 9',
118 multiply: 'Multiplier',
119 add: 'Addition',
120 subtract: 'Soustraire',
121 decimalPoint: 'Point décimal',
122 divide: 'Diviser',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Verrouillage numérique',
136 scrollLock: 'Arrêt défilement',
137 semiColon: 'Point virgule',
138 equalSign: 'Signe égal',
139 comma: 'Virgule',
140 dash: 'Tiret',
141 period: 'Point',
142 forwardSlash: 'Barre oblique',
143 graveAccent: 'Accent grave',
144 openBracket: 'Parenthèse ouvrante',
145 backSlash: 'Barre oblique inverse',
146 closeBracket: 'Parenthèse fermante',
147 singleQuote: 'Apostrophe'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/gl.js b/sources/plugins/a11yhelp/dialogs/lang/gl.js
new file mode 100644
index 00000000..c7090d9f
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/gl.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'gl', {
7 title: 'Instrucións de accesibilidade',
8 contents: 'Axuda. Para pechar este diálogo prema ESC.',
9 legend: [
10 {
11 name: 'Xeral',
12 items: [
13 {
14 name: 'Barra de ferramentas do editor',
15 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.'
16 },
17
18 {
19 name: 'Editor de diálogo',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor do menú contextual',
26 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.'
27 },
28
29 {
30 name: 'Lista do editor',
31 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.'
32 },
33
34 {
35 name: 'Barra da ruta ao elemento no editor',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Ordes',
42 items: [
43 {
44 name: 'Orde «desfacer»',
45 legend: 'Prema ${undo}'
46 },
47 {
48 name: 'Orde «refacer»',
49 legend: 'Prema ${redo}'
50 },
51 {
52 name: 'Orde «negra»',
53 legend: 'Prema ${bold}'
54 },
55 {
56 name: 'Orde «cursiva»',
57 legend: 'Prema ${italic}'
58 },
59 {
60 name: 'Orde «subliñar»',
61 legend: 'Prema ${underline}'
62 },
63 {
64 name: 'Orde «ligazón»',
65 legend: 'Prema ${link}'
66 },
67 {
68 name: 'Orde «contraer a barra de ferramentas»',
69 legend: 'Prema ${toolbarCollapse}'
70 },
71 {
72 name: 'Orde «acceder ao anterior espazo en foco»',
73 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.'
74 },
75 {
76 name: 'Orde «acceder ao seguinte espazo en foco»',
77 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.'
78 },
79 {
80 name: 'Axuda da accesibilidade',
81 legend: 'Prema ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Ir atrás',
87 tab: 'Tabulador',
88 enter: 'Intro',
89 shift: 'Maiús',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pausa',
93 capslock: 'Bloq. Maiús',
94 escape: 'Escape',
95 pageUp: 'Páxina arriba',
96 pageDown: 'Páxina abaixo',
97 end: 'Fin',
98 home: 'Inicio',
99 leftArrow: 'Frecha esquerda',
100 upArrow: 'Frecha arriba',
101 rightArrow: 'Frecha dereita',
102 downArrow: 'Frecha abaixo',
103 insert: 'Inserir',
104 'delete': 'Supr',
105 leftWindowKey: 'Tecla Windows esquerda',
106 rightWindowKey: 'Tecla Windows dereita',
107 selectKey: 'Escolla a tecla',
108 numpad0: 'Tec. numérico 0',
109 numpad1: 'Tec. numérico 1',
110 numpad2: 'Tec. numérico 2',
111 numpad3: 'Tec. numérico 3',
112 numpad4: 'Tec. numérico 4',
113 numpad5: 'Tec. numérico 5',
114 numpad6: 'Tec. numérico 6',
115 numpad7: 'Tec. numérico 7',
116 numpad8: 'Tec. numérico 8',
117 numpad9: 'Tec. numérico 9',
118 multiply: 'Multiplicar',
119 add: 'Sumar',
120 subtract: 'Restar',
121 decimalPoint: 'Punto decimal',
122 divide: 'Dividir',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Bloq. num.',
136 scrollLock: 'Bloq. despraz.',
137 semiColon: 'Punto e coma',
138 equalSign: 'Signo igual',
139 comma: 'Coma',
140 dash: 'Guión',
141 period: 'Punto',
142 forwardSlash: 'Barra inclinada',
143 graveAccent: 'Acento grave',
144 openBracket: 'Abrir corchete',
145 backSlash: 'Barra invertida',
146 closeBracket: 'Pechar corchete',
147 singleQuote: 'Comiña simple'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/gu.js b/sources/plugins/a11yhelp/dialogs/lang/gu.js
new file mode 100644
index 00000000..eaa762cc
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/gu.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'gu', {
7 title: 'એક્ક્ષેબિલિટી ની વિગતો',
8 contents: 'હેલ્પ. આ બંધ કરવા ESC દબાવો.',
9 legend: [
10 {
11 name: 'જનરલ',
12 items: [
13 {
14 name: 'એડિટર ટૂલબાર',
15 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
16 },
17
18 {
19 name: 'એડિટર ડાયલોગ',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'કમાંડસ',
42 items: [
43 {
44 name: 'અન્ડું કમાંડ',
45 legend: '$ દબાવો {undo}'
46 },
47 {
48 name: 'ફરી કરો કમાંડ',
49 legend: '$ દબાવો {redo}'
50 },
51 {
52 name: 'બોલ્દનો કમાંડ',
53 legend: '$ દબાવો {bold}'
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/he.js b/sources/plugins/a11yhelp/dialogs/lang/he.js
new file mode 100644
index 00000000..7e2f4009
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/he.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'he', {
7 title: 'הוראות נגישות',
8 contents: 'הוראות נגישות. לסגירה לחץ אסקייפ (ESC).',
9 legend: [
10 {
11 name: 'כללי',
12 items: [
13 {
14 name: 'סרגל הכלים',
15 legend: 'לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר.'
16 },
17
18 {
19 name: 'דיאלוגים (חלונות תשאול)',
20 legend:
21 '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
22 },
23
24 {
25 name: 'תפריט ההקשר (Context Menu)',
26 legend: 'לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC).'
27 },
28
29 {
30 name: 'תפריטים צפים (List boxes)',
31 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
32 },
33
34 {
35 name: 'עץ אלמנטים (Elements Path)',
36 legend: 'לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך.'
37 }
38 ]
39 },
40 {
41 name: 'פקודות',
42 items: [
43 {
44 name: ' ביטול צעד אחרון',
45 legend: 'לחץ ${undo}'
46 },
47 {
48 name: ' חזרה על צעד אחרון',
49 legend: 'לחץ ${redo}'
50 },
51 {
52 name: ' הדגשה',
53 legend: 'לחץ ${bold}'
54 },
55 {
56 name: ' הטייה',
57 legend: 'לחץ ${italic}'
58 },
59 {
60 name: ' הוספת קו תחתון',
61 legend: 'לחץ ${underline}'
62 },
63 {
64 name: ' הוספת לינק',
65 legend: 'לחץ ${link}'
66 },
67 {
68 name: ' כיווץ סרגל הכלים',
69 legend: 'לחץ ${toolbarCollapse}'
70 },
71 {
72 name: 'גישה למיקום המיקוד הקודם',
73 legend: 'לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.'
74 },
75 {
76 name: 'גישה למיקום המיקוד הבא',
77 legend: 'לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.'
78 },
79 {
80 name: ' הוראות נגישות',
81 legend: 'לחץ ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'חץ שמאלה',
100 upArrow: 'חץ למעלה',
101 rightArrow: 'חץ ימינה',
102 downArrow: 'חץ למטה',
103 insert: 'הכנס',
104 'delete': 'מחק',
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'בחר מקש',
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'הוסף',
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'סלאש',
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'סלאש הפוך',
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'ציטוט יחיד'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/hi.js b/sources/plugins/a11yhelp/dialogs/lang/hi.js
new file mode 100644
index 00000000..16fd5040
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/hi.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'hi', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'सामान्य',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/hr.js b/sources/plugins/a11yhelp/dialogs/lang/hr.js
new file mode 100644
index 00000000..aa42c0a1
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/hr.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'hr', {
7 title: 'Upute dostupnosti',
8 contents: 'Sadržaj pomoći. Za zatvaranje pritisnite ESC.',
9 legend: [
10 {
11 name: 'Općenito',
12 items: [
13 {
14 name: 'Alatna traka',
15 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.'
16 },
17
18 {
19 name: 'Dijalog',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Kontekstni izbornik',
26 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.'
27 },
28
29 {
30 name: 'Lista',
31 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.'
32 },
33
34 {
35 name: 'Traka putanje elemenata',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Naredbe',
42 items: [
43 {
44 name: 'Vrati naredbu',
45 legend: 'Pritisni ${undo}'
46 },
47 {
48 name: 'Ponovi naredbu',
49 legend: 'Pritisni ${redo}'
50 },
51 {
52 name: 'Bold naredba',
53 legend: 'Pritisni ${bold}'
54 },
55 {
56 name: 'Italic naredba',
57 legend: 'Pritisni ${italic}'
58 },
59 {
60 name: 'Underline naredba',
61 legend: 'Pritisni ${underline}'
62 },
63 {
64 name: 'Link naredba',
65 legend: 'Pritisni ${link}'
66 },
67 {
68 name: 'Smanji alatnu traku naredba',
69 legend: 'Pritisni ${toolbarCollapse}'
70 },
71 {
72 name: 'Access previous focus space naredba',
73 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.'
74 },
75 {
76 name: 'Access next focus space naredba',
77 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.'
78 },
79 {
80 name: 'Pomoć za dostupnost',
81 legend: 'Pritisni ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/hu.js b/sources/plugins/a11yhelp/dialogs/lang/hu.js
new file mode 100644
index 00000000..7760f93a
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/hu.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'hu', {
7 title: 'Kisegítő utasítások',
8 contents: 'Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.',
9 legend: [
10 {
11 name: 'Általános',
12 items: [
13 {
14 name: 'Szerkesztő Eszköztár',
15 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.'
16 },
17
18 {
19 name: 'Szerkesző párbeszéd ablak',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Szerkesztő helyi menü',
26 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.'
27 },
28
29 {
30 name: 'Szerkesztő lista',
31 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.'
32 },
33
34 {
35 name: 'Szerkesztő elem utak sáv',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Parancsok',
42 items: [
43 {
44 name: 'Parancs visszavonása',
45 legend: 'Nyomj ${undo}'
46 },
47 {
48 name: 'Parancs megismétlése',
49 legend: 'Nyomjon ${redo}'
50 },
51 {
52 name: 'Félkövér parancs',
53 legend: 'Nyomjon ${bold}'
54 },
55 {
56 name: 'Dőlt parancs',
57 legend: 'Nyomjon ${italic}'
58 },
59 {
60 name: 'Aláhúzott parancs',
61 legend: 'Nyomjon ${underline}'
62 },
63 {
64 name: 'Link parancs',
65 legend: 'Nyomjon ${link}'
66 },
67 {
68 name: 'Szerkesztősáv összecsukása parancs',
69 legend: 'Nyomjon ${toolbarCollapse}'
70 },
71 {
72 name: 'Hozzáférés az előző fókusz helyhez parancs',
73 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.'
74 },
75 {
76 name: 'Hozzáférés a következő fókusz helyhez parancs',
77 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.'
78 },
79 {
80 name: 'Kisegítő súgó',
81 legend: 'Nyomjon ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'balra nyíl',
100 upArrow: 'felfelé nyíl',
101 rightArrow: 'jobbra nyíl',
102 downArrow: 'lefelé nyíl',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'bal Windows-billentyű',
106 rightWindowKey: 'jobb Windows-billentyű',
107 selectKey: 'Billentyű választása',
108 numpad0: 'Számbillentyűk 0',
109 numpad1: 'Számbillentyűk 1',
110 numpad2: 'Számbillentyűk 2',
111 numpad3: 'Számbillentyűk 3',
112 numpad4: 'Számbillentyűk 4',
113 numpad5: 'Számbillentyűk 5',
114 numpad6: 'Számbillentyűk 6',
115 numpad7: 'Számbillentyűk 7',
116 numpad8: 'Számbillentyűk 8',
117 numpad9: 'Számbillentyűk 9',
118 multiply: 'Szorzás',
119 add: 'Hozzáadás',
120 subtract: 'Kivonás',
121 decimalPoint: 'Tizedespont',
122 divide: 'Osztás',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Pontosvessző',
138 equalSign: 'Egyenlőségjel',
139 comma: 'Vessző',
140 dash: 'Kötőjel',
141 period: 'Pont',
142 forwardSlash: 'Perjel',
143 graveAccent: 'Visszafelé dőlő ékezet',
144 openBracket: 'Nyitó szögletes zárójel',
145 backSlash: 'fordított perjel',
146 closeBracket: 'Záró szögletes zárójel',
147 singleQuote: 'szimpla idézőjel'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/id.js b/sources/plugins/a11yhelp/dialogs/lang/id.js
new file mode 100644
index 00000000..4f33bff5
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/id.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'id', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Bantuan. Tekan ESC untuk menutup dialog ini.',
9 legend: [
10 {
11 name: 'Umum',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/it.js b/sources/plugins/a11yhelp/dialogs/lang/it.js
new file mode 100644
index 00000000..62359ebe
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/it.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'it', {
7 title: 'Istruzioni di Accessibilità',
8 contents: 'Contenuti di Aiuto. Per chiudere questa finestra premi ESC.',
9 legend: [
10 {
11 name: 'Generale',
12 items: [
13 {
14 name: 'Barra degli strumenti Editor',
15 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.'
16 },
17
18 {
19 name: 'Finestra Editor',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Menù contestuale Editor',
26 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.'
27 },
28
29 {
30 name: 'Box Lista Editor',
31 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.'
32 },
33
34 {
35 name: 'Barra percorso elementi editor',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Comandi',
42 items: [
43 {
44 name: ' Annulla comando',
45 legend: 'Premi ${undo}'
46 },
47 {
48 name: ' Ripeti comando',
49 legend: 'Premi ${redo}'
50 },
51 {
52 name: ' Comando Grassetto',
53 legend: 'Premi ${bold}'
54 },
55 {
56 name: ' Comando Corsivo',
57 legend: 'Premi ${italic}'
58 },
59 {
60 name: ' Comando Sottolineato',
61 legend: 'Premi ${underline}'
62 },
63 {
64 name: ' Comando Link',
65 legend: 'Premi ${link}'
66 },
67 {
68 name: ' Comando riduci barra degli strumenti',
69 legend: 'Premi ${toolbarCollapse}'
70 },
71 {
72 name: 'Comando di accesso al precedente spazio di focus',
73 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.'
74 },
75 {
76 name: 'Comando di accesso al prossimo spazio di focus',
77 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.'
78 },
79 {
80 name: ' Aiuto Accessibilità',
81 legend: 'Premi ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Invio',
89 shift: 'Maiusc',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pausa',
93 capslock: 'Bloc Maiusc',
94 escape: 'Esc',
95 pageUp: 'Pagina sù',
96 pageDown: 'Pagina giù',
97 end: 'Fine',
98 home: 'Inizio',
99 leftArrow: 'Freccia sinistra',
100 upArrow: 'Freccia su',
101 rightArrow: 'Freccia destra',
102 downArrow: 'Freccia giù',
103 insert: 'Ins',
104 'delete': 'Canc',
105 leftWindowKey: 'Tasto di Windows sinistro',
106 rightWindowKey: 'Tasto di Windows destro',
107 selectKey: 'Tasto di selezione',
108 numpad0: '0 sul tastierino numerico',
109 numpad1: '1 sul tastierino numerico',
110 numpad2: '2 sul tastierino numerico',
111 numpad3: '3 sul tastierino numerico',
112 numpad4: '4 sul tastierino numerico',
113 numpad5: '5 sul tastierino numerico',
114 numpad6: '6 sul tastierino numerico',
115 numpad7: '7 sul tastierino numerico',
116 numpad8: '8 sul tastierino numerico',
117 numpad9: '9 sul tastierino numerico',
118 multiply: 'Moltiplicazione',
119 add: 'Più',
120 subtract: 'Sottrazione',
121 decimalPoint: 'Punto decimale',
122 divide: 'Divisione',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Bloc Num',
136 scrollLock: 'Bloc Scorr',
137 semiColon: 'Punto-e-virgola',
138 equalSign: 'Segno di uguale',
139 comma: 'Virgola',
140 dash: 'Trattino',
141 period: 'Punto',
142 forwardSlash: 'Barra',
143 graveAccent: 'Accento grave',
144 openBracket: 'Parentesi quadra aperta',
145 backSlash: 'Barra rovesciata',
146 closeBracket: 'Parentesi quadra chiusa',
147 singleQuote: 'Apostrofo'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ja.js b/sources/plugins/a11yhelp/dialogs/lang/ja.js
new file mode 100644
index 00000000..a4db94e2
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ja.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ja', {
7 title: 'ユーザー補助の説明',
8 contents: 'ヘルプ このダイアログを閉じるには ESCを押してください。',
9 legend: [
10 {
11 name: '全般',
12 items: [
13 {
14 name: 'エディターツールバー',
15 legend: '${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。'
16 },
17
18 {
19 name: '編集ダイアログ',
20 legend:
21 '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
22 },
23
24 {
25 name: 'エディターのメニュー',
26 legend: '${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。'
27 },
28
29 {
30 name: 'エディターリストボックス',
31 legend: 'リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。'
32 },
33
34 {
35 name: 'エディター要素パスバー',
36 legend: '${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。'
37 }
38 ]
39 },
40 {
41 name: 'コマンド',
42 items: [
43 {
44 name: '元に戻す',
45 legend: '${undo} をクリック'
46 },
47 {
48 name: 'やり直し',
49 legend: '${redo} をクリック'
50 },
51 {
52 name: '太字',
53 legend: '${bold} をクリック'
54 },
55 {
56 name: '斜体 ',
57 legend: '${italic} をクリック'
58 },
59 {
60 name: '下線',
61 legend: '${underline} をクリック'
62 },
63 {
64 name: 'リンク',
65 legend: '${link} をクリック'
66 },
67 {
68 name: 'ツールバーを縮める',
69 legend: '${toolbarCollapse} をクリック'
70 },
71 {
72 name: '前のカーソル移動のできないポイントへ',
73 legend: '${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。'
74 },
75 {
76 name: '次のカーソル移動のできないポイントへ',
77 legend: '${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。'
78 },
79 {
80 name: 'ユーザー補助ヘルプ',
81 legend: '${a11yHelp} をクリック'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: '左矢印',
100 upArrow: '上矢印',
101 rightArrow: '右矢印',
102 downArrow: '下矢印',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: '左Windowキー',
106 rightWindowKey: '右のWindowキー',
107 selectKey: 'Select',
108 numpad0: 'Num 0',
109 numpad1: 'Num 1',
110 numpad2: 'Num 2',
111 numpad3: 'Num 3',
112 numpad4: 'Num 4',
113 numpad5: 'Num 5',
114 numpad6: 'Num 6',
115 numpad7: 'Num 7',
116 numpad8: 'Num 8',
117 numpad9: 'Num 9',
118 multiply: '掛ける',
119 add: '足す',
120 subtract: '引く',
121 decimalPoint: '小数点',
122 divide: '割る',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'セミコロン',
138 equalSign: 'イコール記号',
139 comma: 'カンマ',
140 dash: 'ダッシュ',
141 period: 'ピリオド',
142 forwardSlash: 'フォワードスラッシュ',
143 graveAccent: 'グレイヴアクセント',
144 openBracket: '開きカッコ',
145 backSlash: 'バックスラッシュ',
146 closeBracket: '閉じカッコ',
147 singleQuote: 'シングルクォート'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/km.js b/sources/plugins/a11yhelp/dialogs/lang/km.js
new file mode 100644
index 00000000..11dee319
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/km.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'km', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'មាតិកា​ជំនួយ។ ដើម្បី​បិទ​ផ្ទាំង​នេះ សូម​ចុច ESC ។',
9 legend: [
10 {
11 name: 'ទូទៅ',
12 items: [
13 {
14 name: 'របារ​ឧបករណ៍​កម្មវិធី​និពន្ធ',
15 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
16 },
17
18 {
19 name: 'ផ្ទាំង​កម្មវិធីនិពន្ធ',
20 legend:
21 '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
22 },
23
24 {
25 name: 'ម៉ីនុយបរិបទអ្នកកែសម្រួល',
26 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
27 },
28
29 {
30 name: 'ប្រអប់បញ្ជីអ្នកកែសម្រួល',
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'ពាក្យបញ្ជា',
42 items: [
43 {
44 name: 'ការ​បញ្ជា​មិនធ្វើវិញ',
45 legend: 'ចុច ${undo}'
46 },
47 {
48 name: 'ការបញ្ជា​ធ្វើវិញ',
49 legend: 'ចុច ${redo}'
50 },
51 {
52 name: 'ការបញ្ជា​អក្សរ​ដិត',
53 legend: 'ចុច ${bold}'
54 },
55 {
56 name: 'ការបញ្ជា​អក្សរ​ទ្រេត',
57 legend: 'ចុច ${italic}'
58 },
59 {
60 name: 'ពាក្យបញ្ជា​បន្ទាត់​ពីក្រោម',
61 legend: 'ចុច ${underline}'
62 },
63 {
64 name: 'ពាក្យបញ្ជា​តំណ',
65 legend: 'ចុច ${link}'
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: 'ជំនួយ​ពី​ភាព​ងាយស្រួល',
81 legend: 'ជួយ ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'លុបថយក្រោយ',
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'ផ្អាក',
93 capslock: 'Caps Lock', // MISSING
94 escape: 'ចាកចេញ',
95 pageUp: 'ទំព័រ​លើ',
96 pageDown: 'ទំព័រ​ក្រោម',
97 end: 'ចុង',
98 home: 'ផ្ទះ',
99 leftArrow: 'ព្រួញ​ឆ្វេង',
100 upArrow: 'ព្រួញ​លើ',
101 rightArrow: 'ព្រួញ​ស្ដាំ',
102 downArrow: 'ព្រួញ​ក្រោម',
103 insert: 'បញ្ចូល',
104 'delete': 'លុប',
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'ជ្រើស​គ្រាប់​ចុច',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'គុណ',
119 add: 'បន្ថែម',
120 subtract: 'ដក',
121 decimalPoint: 'ចំណុចទសភាគ',
122 divide: 'ចែក',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'បិទ​រំកិល',
137 semiColon: 'ចុច​ក្បៀស',
138 equalSign: 'សញ្ញា​អឺរ៉ូ',
139 comma: 'ក្បៀស',
140 dash: 'Dash', // MISSING
141 period: 'ចុច',
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'តង្កៀប​បើក',
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'តង្កៀប​បិទ',
147 singleQuote: 'បន្តក់​មួយ'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ko.js b/sources/plugins/a11yhelp/dialogs/lang/ko.js
new file mode 100644
index 00000000..772af2b9
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ko.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ko', {
7 title: '접근성 설명',
8 contents: '도움말. 이 창을 닫으시려면 ESC 를 누르세요.',
9 legend: [
10 {
11 name: '일반',
12 items: [
13 {
14 name: '편집기 툴바',
15 legend: '툴바를 탐색하시려면 ${toolbarFocus} 를 투르세요. 이전/다음 툴바 그룹으로 이동하시려면 TAB 키 또는 SHIFT+TAB 키를 누르세요. 이전/다음 툴바 버튼으로 이동하시려면 오른쪽 화살표 키 또는 왼쪽 화살표 키를 누르세요. 툴바 버튼을 활성화 하려면 SPACE 키 또는 ENTER 키를 누르세요.'
16 },
17
18 {
19 name: '편집기 다이얼로그',
20 legend:
21 'TAB 키를 누르면 다음 대화상자로 이동하고, SHIFT+TAB 키를 누르면 이전 대화상자로 이동합니다. 대화상자를 제출하려면 ENTER 키를 누르고, ESC 키를 누르면 대화상자를 취소합니다. 대화상자에 탭이 여러개 있을 때, ALT+F10 키 또는 TAB 키를 누르면 순서에 따라 탭 목록에 도달할 수 있습니다. 탭 목록에 초점이 맞을 때, 오른쪽과 왼쪽 화살표 키를 이용하면 각각 다음과 이전 탭으로 이동할 수 있습니다.'
22 },
23
24 {
25 name: '편집기 환경 메뉴',
26 legend: '${contextMenu} 또는 어플리케이션 키를 누르면 환경-메뉴를 열 수 있습니다. 환경-메뉴에서 TAB 키 또는 아래 화살표 키를 누르면 다음 메뉴 옵션으로 이동할 수 있습니다. 이전 옵션으로 이동은 SHIFT+TAB 키 또는 위 화살표 키를 눌러서 할 수 있습니다. 스페이스 키 또는 ENTER 키를 눌러서 메뉴 옵션을 선택할 수 있습니다. 스페이스 키 또는 ENTER 키 또는 오른쪽 화살표 키를 눌러서 하위 메뉴를 열 수 있습니다. 부모 메뉴 항목으로 돌아가려면 ESC 키 또는 왼쪽 화살표 키를 누릅니다. ESC 키를 눌러서 환경-메뉴를 닫습니다.'
27 },
28
29 {
30 name: '편집기 목록 박스',
31 legend: '리스트-박스 내에서, 목록의 다음 항목으로 이동하려면 TAB 키 또는 아래쪽 화살표 키를 누릅니다. 목록의 이전 항목으로 이동하려면 SHIFT+TAB 키 또는 위쪽 화살표 키를 누릅니다. 스페이스 키 또는 ENTER 키를 누르면 목록의 해당 옵션을 선택합니다. ESC 키를 눌러서 리스트-박스를 닫을 수 있습니다.'
32 },
33
34 {
35 name: '편집기 요소 경로 막대',
36 legend: '${elementsPathFocus}를 눌러서 요소 경로 막대를 탐색할 수 있습니다. 다음 요소로 이동하려면 TAB 키 또는 오른쪽 화살표 키를 누릅니다. SHIFT+TAB 키 또는 왼쪽 화살표 키를 누르면 이전 버튼으로 이동할 수 있습니다. 스페이스 키나 ENTER 키를 누르면 편집기의 해당 항목을 선택합니다.'
37 }
38 ]
39 },
40 {
41 name: '명령',
42 items: [
43 {
44 name: ' 명령 실행 취소',
45 legend: '${undo} 누르시오'
46 },
47 {
48 name: ' 명령 다시 실행',
49 legend: '${redo} 누르시오'
50 },
51 {
52 name: ' 굵게 명령',
53 legend: '${bold} 누르시오'
54 },
55 {
56 name: ' 기울임 꼴 명령',
57 legend: '${italic} 누르시오'
58 },
59 {
60 name: ' 밑줄 명령',
61 legend: '${underline} 누르시오'
62 },
63 {
64 name: ' 링크 명령',
65 legend: '${link} 누르시오'
66 },
67 {
68 name: ' 툴바 줄이기 명령',
69 legend: '${toolbarCollapse} 누르시오'
70 },
71 {
72 name: ' 이전 포커스 공간 접근 명령',
73 legend: '탈자 기호(^) 이전에 ${accessPreviousSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다.'
74 },
75 {
76 name: '다음 포커스 공간 접근 명령',
77 legend: '탈자 기호(^) 다음에 ${accessNextSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다. '
78 },
79 {
80 name: ' 접근성 도움말',
81 legend: '${a11yHelp} 누르시오'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace 키',
87 tab: '탭 키',
88 enter: '엔터 키',
89 shift: '시프트 키',
90 ctrl: '컨트롤 키',
91 alt: '알트 키',
92 pause: '일시정지 키',
93 capslock: '캡스 록 키',
94 escape: '이스케이프 키',
95 pageUp: '페이지 업 키',
96 pageDown: '페이지 다운 키',
97 end: '엔드 키',
98 home: '홈 키',
99 leftArrow: '왼쪽 화살표 키',
100 upArrow: '위쪽 화살표 키',
101 rightArrow: '오른쪽 화살표 키',
102 downArrow: '아래쪽 화살표 키',
103 insert: '인서트 키',
104 'delete': '삭제 키',
105 leftWindowKey: '왼쪽 윈도우 키',
106 rightWindowKey: '오른쪽 윈도우 키',
107 selectKey: '셀렉트 키',
108 numpad0: '숫자 패드 0 키',
109 numpad1: '숫자 패드 1 키',
110 numpad2: '숫자 패드 2 키',
111 numpad3: '숫자 패드 3 키',
112 numpad4: '숫자 패드 4 키',
113 numpad5: '숫자 패드 5 키',
114 numpad6: '숫자 패드 6 키',
115 numpad7: '숫자 패드 7 키',
116 numpad8: '숫자 패드 8 키',
117 numpad9: '숫자 패드 9 키',
118 multiply: '곱셈(*) 키',
119 add: '덧셈(+) 키',
120 subtract: '뺄셈(-) 키',
121 decimalPoint: '온점(.) 키',
122 divide: '나눗셈(/) 키',
123 f1: 'F1 키',
124 f2: 'F2 키',
125 f3: 'F3 키',
126 f4: 'F4 키',
127 f5: 'F5 키',
128 f6: 'F6 키',
129 f7: 'F7 키',
130 f8: 'F8 키',
131 f9: 'F9 키',
132 f10: 'F10 키',
133 f11: 'F11 키',
134 f12: 'F12 키',
135 numLock: 'Num Lock 키',
136 scrollLock: 'Scroll Lock 키',
137 semiColon: '세미콜론(;) 키',
138 equalSign: '등호(=) 키',
139 comma: '쉼표(,) 키',
140 dash: '대시(-) 키',
141 period: '온점(.) 키',
142 forwardSlash: '슬래시(/) 키',
143 graveAccent: '억음 악센트(`) 키',
144 openBracket: '브라켓 열기([) 키',
145 backSlash: '역슬래시(\\\\) 키',
146 closeBracket: '브라켓 닫기(]) 키',
147 singleQuote: '외 따옴표(\') 키'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ku.js b/sources/plugins/a11yhelp/dialogs/lang/ku.js
new file mode 100644
index 00000000..4eda3fc7
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ku.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ku', {
7 title: 'ڕێنمای لەبەردەستدابوون',
8 contents: 'پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.',
9 legend: [
10 {
11 name: 'گشتی',
12 items: [
13 {
14 name: 'تووڵامرازی دەستكاریكەر',
15 legend: 'کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT+TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز.'
16 },
17
18 {
19 name: 'دیالۆگی دەستكاریكەر',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'پێڕستی سەرنووسەر',
26 legend: 'کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە.'
27 },
28
29 {
30 name: 'لیستی سنووقی سەرنووسەر',
31 legend: 'لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست.'
32 },
33
34 {
35 name: 'تووڵامرازی توخم',
36 legend: 'کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه.'
37 }
38 ]
39 },
40 {
41 name: 'فەرمانەکان',
42 items: [
43 {
44 name: 'پووچکردنەوەی فەرمان',
45 legend: 'کلیك ${undo}'
46 },
47 {
48 name: 'هەڵگەڕانەوەی فەرمان',
49 legend: 'کلیك ${redo}'
50 },
51 {
52 name: 'فەرمانی دەقی قەڵەو',
53 legend: 'کلیك ${bold}'
54 },
55 {
56 name: 'فەرمانی دەقی لار',
57 legend: 'کلیك ${italic}'
58 },
59 {
60 name: 'فەرمانی ژێرهێڵ',
61 legend: 'کلیك ${underline}'
62 },
63 {
64 name: 'فەرمانی به‌ستەر',
65 legend: 'کلیك ${link}'
66 },
67 {
68 name: 'شاردەنەوەی تووڵامراز',
69 legend: 'کلیك ${toolbarCollapse}'
70 },
71 {
72 name: 'چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی',
73 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.'
74 },
75 {
76 name: 'چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی',
77 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.'
78 },
79 {
80 name: 'دەستپێگەیشتنی یارمەتی',
81 legend: 'کلیك ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Left Arrow',
100 upArrow: 'Up Arrow',
101 rightArrow: 'Right Arrow',
102 downArrow: 'Down Arrow',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'پەنجەرەی چەپ',
106 rightWindowKey: 'پەنجەرەی ڕاست',
107 selectKey: 'Select',
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: '1',
110 numpad2: '2',
111 numpad3: '3',
112 numpad4: '4',
113 numpad5: '5',
114 numpad6: '6',
115 numpad7: '7',
116 numpad8: '8',
117 numpad9: '9',
118 multiply: '*',
119 add: '+',
120 subtract: '-',
121 decimalPoint: '.',
122 divide: '/',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: ';',
138 equalSign: '=',
139 comma: ',',
140 dash: '-',
141 period: '.',
142 forwardSlash: '/',
143 graveAccent: '`',
144 openBracket: '[',
145 backSlash: '\\\\',
146 closeBracket: '}',
147 singleQuote: '\''
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/lt.js b/sources/plugins/a11yhelp/dialogs/lang/lt.js
new file mode 100644
index 00000000..c4b4ac20
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/lt.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'lt', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'Bendros savybės',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/lv.js b/sources/plugins/a11yhelp/dialogs/lang/lv.js
new file mode 100644
index 00000000..42f635bf
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/lv.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'lv', {
7 title: 'Pieejamības instrukcija',
8 contents: 'Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.',
9 legend: [
10 {
11 name: 'Galvenais',
12 items: [
13 {
14 name: 'Redaktora rīkjosla',
15 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.'
16 },
17
18 {
19 name: 'Redaktora dialoga logs',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Redaktora satura izvēle',
26 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.'
27 },
28
29 {
30 name: 'Redaktora saraksta lauks',
31 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.'
32 },
33
34 {
35 name: 'Redaktora elementa ceļa josla',
36 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ā.'
37 }
38 ]
39 },
40 {
41 name: 'Komandas',
42 items: [
43 {
44 name: 'Komanda atcelt darbību',
45 legend: 'Nospiediet ${undo}'
46 },
47 {
48 name: 'Komanda atkārtot darbību',
49 legend: 'Nospiediet ${redo}'
50 },
51 {
52 name: 'Treknraksta komanda',
53 legend: 'Nospiediet ${bold}'
54 },
55 {
56 name: 'Kursīva komanda',
57 legend: 'Nospiediet ${italic}'
58 },
59 {
60 name: 'Apakšsvītras komanda ',
61 legend: 'Nospiediet ${underline}'
62 },
63 {
64 name: 'Hipersaites komanda',
65 legend: 'Nospiediet ${link}'
66 },
67 {
68 name: 'Rīkjoslas aizvēršanas komanda',
69 legend: 'Nospiediet ${toolbarCollapse}'
70 },
71 {
72 name: 'Piekļūt iepriekšējai fokusa vietas komandai',
73 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.'
74 },
75 {
76 name: 'Piekļūt nākošā fokusa apgabala komandai',
77 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.'
78 },
79 {
80 name: 'Pieejamības palīdzība',
81 legend: 'Nospiediet ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/mk.js b/sources/plugins/a11yhelp/dialogs/lang/mk.js
new file mode 100644
index 00000000..124198e9
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/mk.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'mk', {
7 title: 'Инструкции за пристапност',
8 contents: 'Содржина на делот за помош. За да го затворите овој дијалот притиснете ESC.',
9 legend: [
10 {
11 name: 'Општо',
12 items: [
13 {
14 name: 'Мени за едиторот',
15 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
16 },
17
18 {
19 name: 'Дијалот за едиторот',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/mn.js b/sources/plugins/a11yhelp/dialogs/lang/mn.js
new file mode 100644
index 00000000..9e22c7b6
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/mn.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'mn', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'Ерөнхий',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/nb.js b/sources/plugins/a11yhelp/dialogs/lang/nb.js
new file mode 100644
index 00000000..2fb6c853
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/nb.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'nb', {
7 title: 'Instruksjoner for tilgjengelighet',
8 contents: 'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.',
9 legend: [
10 {
11 name: 'Generelt',
12 items: [
13 {
14 name: 'Verktøylinje for editor',
15 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.'
16 },
17
18 {
19 name: 'Dialog for editor',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Kontekstmeny for editor',
26 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.'
27 },
28
29 {
30 name: 'Listeboks for editor',
31 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.'
32 },
33
34 {
35 name: 'Verktøylinje for elementsti',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Hurtigtaster',
42 items: [
43 {
44 name: 'Angre',
45 legend: 'Trykk ${undo}'
46 },
47 {
48 name: 'Gjør om',
49 legend: 'Trykk ${redo}'
50 },
51 {
52 name: 'Fet tekst',
53 legend: 'Trykk ${bold}'
54 },
55 {
56 name: 'Kursiv tekst',
57 legend: 'Trykk ${italic}'
58 },
59 {
60 name: 'Understreking',
61 legend: 'Trykk ${underline}'
62 },
63 {
64 name: 'Lenke',
65 legend: 'Trykk ${link}'
66 },
67 {
68 name: 'Skjul verktøylinje',
69 legend: 'Trykk ${toolbarCollapse}'
70 },
71 {
72 name: 'Gå til forrige fokusområde',
73 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.'
74 },
75 {
76 name: 'Gå til neste fokusområde',
77 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.'
78 },
79 {
80 name: 'Hjelp for tilgjengelighet',
81 legend: 'Trykk ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tabulator',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Venstre piltast',
100 upArrow: 'Opp-piltast',
101 rightArrow: 'Høyre piltast',
102 downArrow: 'Ned-piltast',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Venstre Windows-tast',
106 rightWindowKey: 'Høyre Windows-tast',
107 selectKey: 'Velg nøkkel',
108 numpad0: 'Numerisk tastatur 0',
109 numpad1: 'Numerisk tastatur 1',
110 numpad2: 'Numerisk tastatur 2',
111 numpad3: 'Numerisk tastatur 3',
112 numpad4: 'Numerisk tastatur 4',
113 numpad5: 'Numerisk tastatur 5',
114 numpad6: 'Numerisk tastatur 6',
115 numpad7: 'Numerisk tastatur 7',
116 numpad8: 'Numerisk tastatur 8',
117 numpad9: 'Numerisk tastatur 9',
118 multiply: 'Multipliser',
119 add: 'Legg til',
120 subtract: 'Trekk fra',
121 decimalPoint: 'Desimaltegn',
122 divide: 'Divider',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semikolon',
138 equalSign: 'Likhetstegn',
139 comma: 'Komma',
140 dash: 'Bindestrek',
141 period: 'Punktum',
142 forwardSlash: 'Forover skråstrek',
143 graveAccent: 'Grav aksent',
144 openBracket: 'Åpne parentes',
145 backSlash: 'Bakover skråstrek',
146 closeBracket: 'Lukk parentes',
147 singleQuote: 'Enkelt sitattegn'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/nl.js b/sources/plugins/a11yhelp/dialogs/lang/nl.js
new file mode 100644
index 00000000..bd39e4aa
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/nl.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'nl', {
7 title: 'Toegankelijkheidsinstructies',
8 contents: 'Help-inhoud. Druk op ESC om dit dialoog te sluiten.',
9 legend: [
10 {
11 name: 'Algemeen',
12 items: [
13 {
14 name: 'Werkbalk tekstverwerker',
15 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.'
16 },
17
18 {
19 name: 'Dialoog tekstverwerker',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Contextmenu tekstverwerker',
26 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.'
27 },
28
29 {
30 name: 'Keuzelijst tekstverwerker',
31 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.'
32 },
33
34 {
35 name: 'Elementenpad werkbalk tekstverwerker',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Opdrachten',
42 items: [
43 {
44 name: 'Ongedaan maken opdracht',
45 legend: 'Druk op ${undo}'
46 },
47 {
48 name: 'Opnieuw uitvoeren opdracht',
49 legend: 'Druk op ${redo}'
50 },
51 {
52 name: 'Vetgedrukt opdracht',
53 legend: 'Druk op ${bold}'
54 },
55 {
56 name: 'Cursief opdracht',
57 legend: 'Druk op ${italic}'
58 },
59 {
60 name: 'Onderstrepen opdracht',
61 legend: 'Druk op ${underline}'
62 },
63 {
64 name: 'Link opdracht',
65 legend: 'Druk op ${link}'
66 },
67 {
68 name: 'Werkbalk inklappen opdracht',
69 legend: 'Druk op ${toolbarCollapse}'
70 },
71 {
72 name: 'Ga naar vorige focus spatie commando',
73 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.'
74 },
75 {
76 name: 'Ga naar volgende focus spatie commando',
77 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.'
78 },
79 {
80 name: 'Toegankelijkheidshulp',
81 legend: 'Druk op ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Pijl naar links',
100 upArrow: 'Pijl omhoog',
101 rightArrow: 'Pijl naar rechts',
102 downArrow: 'Pijl naar beneden',
103 insert: 'Invoegen',
104 'delete': 'Verwijderen',
105 leftWindowKey: 'Linker Windows-toets',
106 rightWindowKey: 'Rechter Windows-toets',
107 selectKey: 'Selecteer toets',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Vermenigvuldigen',
119 add: 'Toevoegen',
120 subtract: 'Aftrekken',
121 decimalPoint: 'Decimaalteken',
122 divide: 'Delen',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Puntkomma',
138 equalSign: 'Is gelijk-teken',
139 comma: 'Komma',
140 dash: 'Koppelteken',
141 period: 'Punt',
142 forwardSlash: 'Slash',
143 graveAccent: 'Accent grave',
144 openBracket: 'Vierkant haakje openen',
145 backSlash: 'Backslash',
146 closeBracket: 'Vierkant haakje sluiten',
147 singleQuote: 'Apostrof'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/no.js b/sources/plugins/a11yhelp/dialogs/lang/no.js
new file mode 100644
index 00000000..bf30a580
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/no.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'no', {
7 title: 'Instruksjoner for tilgjengelighet',
8 contents: 'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.',
9 legend: [
10 {
11 name: 'Generelt',
12 items: [
13 {
14 name: 'Verktøylinje for editor',
15 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.'
16 },
17
18 {
19 name: 'Dialog for editor',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Kontekstmeny for editor',
26 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.'
27 },
28
29 {
30 name: 'Listeboks for editor',
31 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.'
32 },
33
34 {
35 name: 'Verktøylinje for elementsti',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Kommandoer',
42 items: [
43 {
44 name: 'Angre',
45 legend: 'Trykk ${undo}'
46 },
47 {
48 name: 'Gjør om',
49 legend: 'Trykk ${redo}'
50 },
51 {
52 name: 'Fet tekst',
53 legend: 'Trykk ${bold}'
54 },
55 {
56 name: 'Kursiv tekst',
57 legend: 'Trykk ${italic}'
58 },
59 {
60 name: 'Understreking',
61 legend: 'Trykk ${underline}'
62 },
63 {
64 name: 'Link',
65 legend: 'Trykk ${link}'
66 },
67 {
68 name: 'Skjul verktøylinje',
69 legend: 'Trykk ${toolbarCollapse}'
70 },
71 {
72 name: 'Gå til forrige fokusområde',
73 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.'
74 },
75 {
76 name: 'Gå til neste fokusområde',
77 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.'
78 },
79 {
80 name: 'Hjelp for tilgjengelighet',
81 legend: 'Trykk ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/pl.js b/sources/plugins/a11yhelp/dialogs/lang/pl.js
new file mode 100644
index 00000000..aeae9963
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/pl.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'pl', {
7 title: 'Instrukcje dotyczące dostępności',
8 contents: 'Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.',
9 legend: [
10 {
11 name: 'Informacje ogólne',
12 items: [
13 {
14 name: 'Pasek narzędzi edytora',
15 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.'
16 },
17
18 {
19 name: 'Okno dialogowe edytora',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Menu kontekstowe edytora',
26 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.'
27 },
28
29 {
30 name: 'Lista w edytorze',
31 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ę.'
32 },
33
34 {
35 name: 'Pasek ścieżki elementów edytora',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Polecenia',
42 items: [
43 {
44 name: 'Polecenie Cofnij',
45 legend: 'Naciśnij ${undo}'
46 },
47 {
48 name: 'Polecenie Ponów',
49 legend: 'Naciśnij ${redo}'
50 },
51 {
52 name: 'Polecenie Pogrubienie',
53 legend: 'Naciśnij ${bold}'
54 },
55 {
56 name: 'Polecenie Kursywa',
57 legend: 'Naciśnij ${italic}'
58 },
59 {
60 name: 'Polecenie Podkreślenie',
61 legend: 'Naciśnij ${underline}'
62 },
63 {
64 name: 'Polecenie Wstaw/ edytuj odnośnik',
65 legend: 'Naciśnij ${link}'
66 },
67 {
68 name: 'Polecenie schowaj pasek narzędzi',
69 legend: 'Naciśnij ${toolbarCollapse}'
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: 'Pomoc dotycząca dostępności',
81 legend: 'Naciśnij ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Strzałka w lewo',
100 upArrow: 'Strzałka w górę',
101 rightArrow: 'Strzałka w prawo',
102 downArrow: 'Strzałka w dół',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Lewy klawisz Windows',
106 rightWindowKey: 'Prawy klawisz Windows',
107 selectKey: 'Klawisz wyboru',
108 numpad0: 'Klawisz 0 na klawiaturze numerycznej',
109 numpad1: 'Klawisz 1 na klawiaturze numerycznej',
110 numpad2: 'Klawisz 2 na klawiaturze numerycznej',
111 numpad3: 'Klawisz 3 na klawiaturze numerycznej',
112 numpad4: 'Klawisz 4 na klawiaturze numerycznej',
113 numpad5: 'Klawisz 5 na klawiaturze numerycznej',
114 numpad6: 'Klawisz 6 na klawiaturze numerycznej',
115 numpad7: 'Klawisz 7 na klawiaturze numerycznej',
116 numpad8: 'Klawisz 8 na klawiaturze numerycznej',
117 numpad9: 'Klawisz 9 na klawiaturze numerycznej',
118 multiply: 'Przemnóż',
119 add: 'Plus',
120 subtract: 'Minus',
121 decimalPoint: 'Separator dziesiętny',
122 divide: 'Podziel',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Średnik',
138 equalSign: 'Znak równości',
139 comma: 'Przecinek',
140 dash: 'Pauza',
141 period: 'Kropka',
142 forwardSlash: 'Ukośnik prawy',
143 graveAccent: 'Akcent słaby',
144 openBracket: 'Nawias kwadratowy otwierający',
145 backSlash: 'Ukośnik lewy',
146 closeBracket: 'Nawias kwadratowy zamykający',
147 singleQuote: 'Apostrof'
148} );
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 00000000..2070b8ef
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/pt-br.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'pt-br', {
7 title: 'Instruções de Acessibilidade',
8 contents: 'Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.',
9 legend: [
10 {
11 name: 'Geral',
12 items: [
13 {
14 name: 'Barra de Ferramentas do Editor',
15 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.'
16 },
17
18 {
19 name: 'Diálogo do Editor',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Menu de Contexto do Editor',
26 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.'
27 },
28
29 {
30 name: 'Caixa de Lista do Editor',
31 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.'
32 },
33
34 {
35 name: 'Barra de Caminho do Elementos do Editor',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Comandos',
42 items: [
43 {
44 name: ' Comando Desfazer',
45 legend: 'Pressione ${undo}'
46 },
47 {
48 name: ' Comando Refazer',
49 legend: 'Pressione ${redo}'
50 },
51 {
52 name: ' Comando Negrito',
53 legend: 'Pressione ${bold}'
54 },
55 {
56 name: ' Comando Itálico',
57 legend: 'Pressione ${italic}'
58 },
59 {
60 name: ' Comando Sublinhado',
61 legend: 'Pressione ${underline}'
62 },
63 {
64 name: ' Comando Link',
65 legend: 'Pressione ${link}'
66 },
67 {
68 name: ' Comando Fechar Barra de Ferramentas',
69 legend: 'Pressione ${toolbarCollapse}'
70 },
71 {
72 name: 'Acessar o comando anterior de spaço de foco',
73 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.'
74 },
75 {
76 name: 'Acessar próximo fomando de spaço de foco',
77 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.'
78 },
79 {
80 name: ' Ajuda de Acessibilidade',
81 legend: 'Pressione ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Tecla Backspace',
87 tab: 'Tecla Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Seta à Esquerda',
100 upArrow: 'Seta à Cima',
101 rightArrow: 'Seta à Direita',
102 downArrow: 'Seta à Baixo',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Tecla do Windows Esquerda',
106 rightWindowKey: 'Tecla do Windows Direita',
107 selectKey: 'Tecla Selecionar',
108 numpad0: '0 do Teclado Numérico',
109 numpad1: '1 do Teclado Numérico',
110 numpad2: '2 do Teclado Numérico',
111 numpad3: '3 do Teclado Numérico',
112 numpad4: '4 do Teclado Numérico',
113 numpad5: '5 do Teclado Numérico',
114 numpad6: '6 do Teclado Numérico',
115 numpad7: '7 do Teclado Numérico',
116 numpad8: '8 do Teclado Numérico',
117 numpad9: '9 do Teclado Numérico',
118 multiply: 'Multiplicar',
119 add: 'Mais',
120 subtract: 'Subtrair',
121 decimalPoint: 'Ponto',
122 divide: 'Dividir',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Ponto-e-vírgula',
138 equalSign: 'Igual',
139 comma: 'Vírgula',
140 dash: 'Hífen',
141 period: 'Ponto',
142 forwardSlash: 'Barra',
143 graveAccent: 'Acento Grave',
144 openBracket: 'Abrir Conchetes',
145 backSlash: 'Contra-barra',
146 closeBracket: 'Fechar Colchetes',
147 singleQuote: 'Aspas Simples'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/pt.js b/sources/plugins/a11yhelp/dialogs/lang/pt.js
new file mode 100644
index 00000000..cddb9a7e
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/pt.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'pt', {
7 title: 'Instruções de acessibilidade',
8 contents: 'Conteúdo de ajuda. Use a tecla ESC para fechar esta janela.',
9 legend: [
10 {
11 name: 'Geral',
12 items: [
13 {
14 name: 'Barra de ferramentas do editor',
15 legend: 'Clique em ${toolbarFocus} para navegar para a barra de ferramentas. Vá para o grupo da barra de ferramentas anterior e seguinte com TAB e SHIFT+TAB. Vá para o botão da barra de ferramentas anterior com a SETA DIREITA ou ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.'
16 },
17
18 {
19 name: 'Janela do Editor',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Menu de Contexto do Editor',
26 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.'
27 },
28
29 {
30 name: 'Editor de caixa em lista',
31 legend: 'Dentro da caixa da lista, vá para o itemda lista seguinte com TAB ou SETA PARA BAIXO. Move Vá parao item da lista anterior com SHIFT+TAB ou SETA PARA BAIXO. Pressione ESPAÇO ou ENTER para selecionar a opção da lista. Pressione ESC para fechar a caisa da lista.'
32 },
33
34 {
35 name: 'Caminho Barra Elemento Editor',
36 legend: 'Clique em ${elementsPathFocus} para navegar para a barra do caminho dos elementos. Vá para o botão do elemento seguinte com TAB ou SETA DIREITA. Vá para o botão anterior com SHIFT+TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.'
37 }
38 ]
39 },
40 {
41 name: 'Comandos',
42 items: [
43 {
44 name: 'Comando de Anular',
45 legend: 'Carregar ${undo}'
46 },
47 {
48 name: 'Comando de Refazer',
49 legend: 'Pressione ${redo}'
50 },
51 {
52 name: 'Comando de Negrito',
53 legend: 'Pressione ${bold}'
54 },
55 {
56 name: 'Comando de Itálico',
57 legend: 'Pressione ${italic}'
58 },
59 {
60 name: 'Comando de Sublinhado',
61 legend: 'Pressione ${underline}'
62 },
63 {
64 name: 'Comando de Hiperligação',
65 legend: 'Pressione ${link}'
66 },
67 {
68 name: 'Comando de Ocultar Barra de Ferramentas',
69 legend: 'Pressione ${toolbarCollapse}'
70 },
71 {
72 name: 'Acesso comando do espaço focus anterior',
73 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.'
74 },
75 {
76 name: 'Acesso comando do espaço focus seguinte',
77 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.'
78 },
79 {
80 name: 'Ajuda a acessibilidade',
81 legend: 'Pressione ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pausa',
93 capslock: 'Maiúsculas',
94 escape: 'Esc',
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'Fim',
98 home: 'Entrada',
99 leftArrow: 'Seta esquerda',
100 upArrow: 'Seta para cima',
101 rightArrow: 'Seta direita',
102 downArrow: 'Seta para baixo',
103 insert: 'Inserir',
104 'delete': 'Eliminar',
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiplicar',
119 add: 'Adicionar',
120 subtract: 'Subtrair',
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Vírgula',
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Acento grave',
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ro.js b/sources/plugins/a11yhelp/dialogs/lang/ro.js
new file mode 100644
index 00000000..e6702dd6
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ro.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ro', {
7 title: 'Instrucțiuni de accesibilitate',
8 contents: 'Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.',
9 legend: [
10 {
11 name: 'General',
12 items: [
13 {
14 name: 'Editează bara instrumente.',
15 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.'
16 },
17
18 {
19 name: 'Dialog editor',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor meniu contextual',
26 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.'
27 },
28
29 {
30 name: 'Editor Casetă Listă',
31 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.'
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Comenzi',
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Apasă ${undo}'
46 },
47 {
48 name: 'Comanda precedentă',
49 legend: 'Apasă ${redo}'
50 },
51 {
52 name: 'Comanda Îngroșat',
53 legend: 'Apasă ${bold}'
54 },
55 {
56 name: 'Comanda Inclinat',
57 legend: 'Apasă ${italic}'
58 },
59 {
60 name: 'Comanda Subliniere',
61 legend: 'Apasă ${underline}'
62 },
63 {
64 name: 'Comanda Legatură',
65 legend: 'Apasă ${link}'
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ru.js b/sources/plugins/a11yhelp/dialogs/lang/ru.js
new file mode 100644
index 00000000..7e9075a2
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ru.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ru', {
7 title: 'Горячие клавиши',
8 contents: 'Помощь. Для закрытия этого окна нажмите ESC.',
9 legend: [
10 {
11 name: 'Основное',
12 items: [
13 {
14 name: 'Панель инструментов',
15 legend: 'Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT+TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов.'
16 },
17
18 {
19 name: 'Диалоги',
20 legend:
21 'Внутри диалога, нажмите TAB чтобы перейти к следующему элементу диалога, нажмите SHIFT+TAB чтобы перейти к предыдущему элементу диалога, нажмите ENTER чтобы отправить диалог, нажмите ESC чтобы отменить диалог. Когда диалоговое окно имеет несколько вкладок, получить доступ к панели вкладок как части диалога можно нажатием или сочетания ALT+F10 или TAB, при этом активные элементы диалога будут перебираться с учетом порядка табуляции. При активной панели вкладок, переход к следующей или предыдущей вкладке осуществляется нажатием стрелки "ВПРАВО" или стрелки "ВЛЕВО" соответственно.'
22 },
23
24 {
25 name: 'Контекстное меню',
26 legend: 'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой "ВНИЗ". Переход к предыдущей опции - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой "ВПРАВО". Возврат к родительскому пункту меню - ESC или стрелкой "ВЛЕВО". Закрытие контекстного меню - ESC.'
27 },
28
29 {
30 name: 'Редактор списка',
31 legend: 'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой "ВНИЗ". Переход к предыдущему пункту списка - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.'
32 },
33
34 {
35 name: 'Путь к элементу',
36 legend: 'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой "ВПРАВО". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой "ВЛЕВО". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.'
37 }
38 ]
39 },
40 {
41 name: 'Команды',
42 items: [
43 {
44 name: 'Отменить',
45 legend: 'Нажмите ${undo}'
46 },
47 {
48 name: 'Повторить',
49 legend: 'Нажмите ${redo}'
50 },
51 {
52 name: 'Полужирный',
53 legend: 'Нажмите ${bold}'
54 },
55 {
56 name: 'Курсив',
57 legend: 'Нажмите ${italic}'
58 },
59 {
60 name: 'Подчеркнутый',
61 legend: 'Нажмите ${underline}'
62 },
63 {
64 name: 'Гиперссылка',
65 legend: 'Нажмите ${link}'
66 },
67 {
68 name: 'Свернуть панель инструментов',
69 legend: 'Нажмите ${toolbarCollapse}'
70 },
71 {
72 name: 'Команды доступа к предыдущему фокусному пространству',
73 legend: 'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом "^", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.'
74 },
75 {
76 name: 'Команды доступа к следующему фокусному пространству',
77 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.'
78 },
79 {
80 name: 'Справка по горячим клавишам',
81 legend: 'Нажмите ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Esc',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Стрелка влево',
100 upArrow: 'Стрелка вверх',
101 rightArrow: 'Стрелка вправо',
102 downArrow: 'Стрелка вниз',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Левая клавиша Windows',
106 rightWindowKey: 'Правая клавиша Windows',
107 selectKey: 'Выбрать',
108 numpad0: 'Цифра 0',
109 numpad1: 'Цифра 1',
110 numpad2: 'Цифра 2',
111 numpad3: 'Цифра 3',
112 numpad4: 'Цифра 4',
113 numpad5: 'Цифра 5',
114 numpad6: 'Цифра 6',
115 numpad7: 'Цифра 7',
116 numpad8: 'Цифра 8',
117 numpad9: 'Цифра 9',
118 multiply: 'Умножить',
119 add: 'Плюс',
120 subtract: 'Вычесть',
121 decimalPoint: 'Десятичная точка',
122 divide: 'Делить',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Точка с запятой',
138 equalSign: 'Равно',
139 comma: 'Запятая',
140 dash: 'Тире',
141 period: 'Точка',
142 forwardSlash: 'Наклонная черта',
143 graveAccent: 'Апостроф',
144 openBracket: 'Открыть скобку',
145 backSlash: 'Обратная наклонная черта',
146 closeBracket: 'Закрыть скобку',
147 singleQuote: 'Одинарная кавычка'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/si.js b/sources/plugins/a11yhelp/dialogs/lang/si.js
new file mode 100644
index 00000000..62d605c1
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/si.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'si', {
7 title: 'ළඟා වියහැකි ',
8 contents: 'උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න',
9 legend: [
10 {
11 name: 'පොදු කරුණු',
12 items: [
13 {
14 name: 'සංස්කරණ මෙවලම් ',
15 legend: 'ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.'
16 },
17
18 {
19 name: 'සංස්කරණ ',
20 legend:
21 '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
22 },
23
24 {
25 name: 'සංස්කරණ අඩංගුවට ',
26 legend: 'ඔබන්න ${අන්තර්ගත මෙනුව} හෝ APPLICATION KEY අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද, දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට ESC හෝ LEFT ARROW බොත්තම ද. අන්තර්ගත-මෙනුව වැසීමට ESC බොත්තම ද ඔබන්න.'
27 },
28
29 {
30 name: 'සංස්කරණ තේරුම් ',
31 legend: 'තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට SHIFT+TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට SPACE හෝ ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න.'
32 },
33
34 {
35 name: 'සංස්කරණ අංග සහිත ',
36 legend: 'ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.'
37 }
38 ]
39 },
40 {
41 name: 'විධාන',
42 items: [
43 {
44 name: 'විධානය වෙනස් ',
45 legend: 'ඔබන්න ${වෙනස් කිරීම}'
46 },
47 {
48 name: 'විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.',
49 legend: 'ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}'
50 },
51 {
52 name: 'තද අකුරින් විධාන',
53 legend: 'ඔබන්න ${තද }'
54 },
55 {
56 name: 'බැධී අකුරු විධාන',
57 legend: 'ඔබන්න ${බැධී අකුරු }'
58 },
59 {
60 name: 'යටින් ඉරි ඇද ඇති විධාන.',
61 legend: 'ඔබන්න ${යටින් ඉරි ඇද ඇති}'
62 },
63 {
64 name: 'සම්බන්ධිත විධාන',
65 legend: 'ඔබන්න ${සම්බන්ධ }'
66 },
67 {
68 name: 'මෙවලම් තීරු හැකුලුම් විධාන',
69 legend: 'ඔබන්න ${මෙවලම් තීරු හැකුලුම් }'
70 },
71 {
72 name: 'යොමුවීමට පෙර වැදගත් විධාන',
73 legend: 'ඔබන්න ${යොමුවීමට ඊළඟ }'
74 },
75 {
76 name: 'යොමුවීමට ඊළග වැදගත් විධාන',
77 legend: 'ඔබන්න ${යොමුවීමට ඊළඟ }'
78 },
79 {
80 name: 'ප්‍රවේශ ',
81 legend: 'ඔබන්න ${a11y }'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/sk.js b/sources/plugins/a11yhelp/dialogs/lang/sk.js
new file mode 100644
index 00000000..1267e8b7
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/sk.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'sk', {
7 title: 'Inštrukcie prístupnosti',
8 contents: 'Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.',
9 legend: [
10 {
11 name: 'Všeobecne',
12 items: [
13 {
14 name: 'Lišta nástrojov editora',
15 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.'
16 },
17
18 {
19 name: 'Editorový dialóg',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editorové kontextové menu',
26 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.'
27 },
28
29 {
30 name: 'Editorov box zoznamu',
31 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.'
32 },
33
34 {
35 name: 'Editorove pásmo cesty prvku',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Príkazy',
42 items: [
43 {
44 name: 'Vrátiť príkazy',
45 legend: 'Stlačte ${undo}'
46 },
47 {
48 name: 'Nanovo vrátiť príkaz',
49 legend: 'Stlačte ${redo}'
50 },
51 {
52 name: 'Príkaz na stučnenie',
53 legend: 'Stlačte ${bold}'
54 },
55 {
56 name: 'Príkaz na kurzívu',
57 legend: 'Stlačte ${italic}'
58 },
59 {
60 name: 'Príkaz na podčiarknutie',
61 legend: 'Stlačte ${underline}'
62 },
63 {
64 name: 'Príkaz na odkaz',
65 legend: 'Stlačte ${link}'
66 },
67 {
68 name: 'Príkaz na zbalenie lišty nástrojov',
69 legend: 'Stlačte ${toolbarCollapse}'
70 },
71 {
72 name: 'Prejsť na predchádzajúcu zamerateľnú medzeru príkazu',
73 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.'
74 },
75 {
76 name: 'Prejsť na ďalší ',
77 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.'
78 },
79 {
80 name: 'Pomoc prístupnosti',
81 legend: 'Stlačte ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Stránka hore',
96 pageDown: 'Stránka dole',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Šípka naľavo',
100 upArrow: 'Šípka hore',
101 rightArrow: 'Šípka napravo',
102 downArrow: 'Šípka dole',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Ľavé Windows tlačidlo',
106 rightWindowKey: 'Pravé Windows tlačidlo',
107 selectKey: 'Tlačidlo Select',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Násobenie',
119 add: 'Sčítanie',
120 subtract: 'Odčítanie',
121 decimalPoint: 'Desatinná čiarka',
122 divide: 'Delenie',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Bodkočiarka',
138 equalSign: 'Rovná sa',
139 comma: 'Čiarka',
140 dash: 'Pomĺčka',
141 period: 'Bodka',
142 forwardSlash: 'Lomítko',
143 graveAccent: 'Zdôrazňovanie prízvuku',
144 openBracket: 'Hranatá zátvorka otváracia',
145 backSlash: 'Backslash',
146 closeBracket: 'Hranatá zátvorka zatváracia',
147 singleQuote: 'Jednoduché úvodzovky'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/sl.js b/sources/plugins/a11yhelp/dialogs/lang/sl.js
new file mode 100644
index 00000000..40fb244f
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/sl.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'sl', {
7 title: 'Navodila Dostopnosti',
8 contents: 'Vsebina Pomoči. Če želite zapreti to pogovorno okno pritisnite ESC.',
9 legend: [
10 {
11 name: 'Splošno',
12 items: [
13 {
14 name: 'Urejevalna Orodna Vrstica',
15 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.'
16 },
17
18 {
19 name: 'Urejevalno Pogovorno Okno',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Urejevalni Kontekstni Meni',
26 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.'
27 },
28
29 {
30 name: 'Urejevalno Seznamsko Polje',
31 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.'
32 },
33
34 {
35 name: 'Urejevalna vrstica poti elementa',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Ukazi',
42 items: [
43 {
44 name: 'Razveljavi ukaz',
45 legend: 'Pritisnite ${undo}'
46 },
47 {
48 name: 'Ponovi ukaz',
49 legend: 'Pritisnite ${redo}'
50 },
51 {
52 name: 'Krepki ukaz',
53 legend: 'Pritisnite ${bold}'
54 },
55 {
56 name: 'Ležeči ukaz',
57 legend: 'Pritisnite ${italic}'
58 },
59 {
60 name: 'Poudarni ukaz',
61 legend: 'Pritisnite ${underline}'
62 },
63 {
64 name: 'Ukaz povezave',
65 legend: 'Pritisnite ${link}'
66 },
67 {
68 name: 'Skrči Orodno Vrstico Ukaz',
69 legend: 'Pritisnite ${toolbarCollapse}'
70 },
71 {
72 name: 'Dostop do prejšnjega ukaza ostrenja',
73 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.'
74 },
75 {
76 name: 'Dostop do naslednjega ukaza ostrenja',
77 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.'
78 },
79 {
80 name: 'Pomoč Dostopnosti',
81 legend: 'Pritisnite ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Levo puščica',
100 upArrow: 'Gor puščica',
101 rightArrow: 'Desno puščica',
102 downArrow: 'Dol puščica',
103 insert: 'Insert',
104 'delete': 'Delete',
105 leftWindowKey: 'Leva Windows tipka',
106 rightWindowKey: 'Desna Windows tipka',
107 selectKey: 'Select tipka',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Zmnoži',
119 add: 'Dodaj',
120 subtract: 'Odštej',
121 decimalPoint: 'Decimalna vejica',
122 divide: 'Deli',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Podpičje',
138 equalSign: 'enačaj',
139 comma: 'Vejica',
140 dash: 'Vezaj',
141 period: 'Pika',
142 forwardSlash: 'Desna poševnica',
143 graveAccent: 'Krativec',
144 openBracket: 'Oklepaj',
145 backSlash: 'Leva poševnica',
146 closeBracket: 'Oklepaj',
147 singleQuote: 'Opuščaj'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/sq.js b/sources/plugins/a11yhelp/dialogs/lang/sq.js
new file mode 100644
index 00000000..9c634da5
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/sq.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'sq', {
7 title: 'Udhëzimet e Qasjes',
8 contents: 'Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.',
9 legend: [
10 {
11 name: 'Të përgjithshme',
12 items: [
13 {
14 name: 'Shiriti i Redaktuesit',
15 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
16 },
17
18 {
19 name: 'Dialogu i Redaktuesit',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Komandat',
42 items: [
43 {
44 name: 'Rikthe komandën',
45 legend: 'Shtyp ${undo}'
46 },
47 {
48 name: 'Ribëj komandën',
49 legend: 'Shtyp ${redo}'
50 },
51 {
52 name: 'Komanda e trashjes së tekstit',
53 legend: 'Shtyp ${bold}'
54 },
55 {
56 name: 'Komanda kursive',
57 legend: 'Shtyp ${italic}'
58 },
59 {
60 name: 'Komanda e nënvijëzimit',
61 legend: 'Shtyp ${underline}'
62 },
63 {
64 name: 'Komanda e Nyjes',
65 legend: 'Shtyp ${link}'
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Shtyp ${toolbarCollapse}'
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: 'Ndihmë Qasjeje',
81 legend: 'Shtyp ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Prapa',
87 tab: 'Fletë',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Shenja majtas',
100 upArrow: 'Shenja sipër',
101 rightArrow: 'Shenja djathtas',
102 downArrow: 'Shenja poshtë',
103 insert: 'Shto',
104 'delete': 'Grise',
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Shto',
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semicolon',
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Presje',
140 dash: 'vizë',
141 period: 'Pikë',
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Hape kllapën',
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Mbylle kllapën',
147 singleQuote: 'Single Quote' // MISSING
148} );
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 00000000..9f813980
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/sr-latn.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'sr-latn', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'Opšte',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/sr.js b/sources/plugins/a11yhelp/dialogs/lang/sr.js
new file mode 100644
index 00000000..f2e37cc7
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/sr.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'sr', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'Опште',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Commands', // MISSING
42 items: [
43 {
44 name: ' Undo command', // MISSING
45 legend: 'Press ${undo}' // MISSING
46 },
47 {
48 name: ' Redo command', // MISSING
49 legend: 'Press ${redo}' // MISSING
50 },
51 {
52 name: ' Bold command', // MISSING
53 legend: 'Press ${bold}' // MISSING
54 },
55 {
56 name: ' Italic command', // MISSING
57 legend: 'Press ${italic}' // MISSING
58 },
59 {
60 name: ' Underline command', // MISSING
61 legend: 'Press ${underline}' // MISSING
62 },
63 {
64 name: ' Link command', // MISSING
65 legend: 'Press ${link}' // MISSING
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/sv.js b/sources/plugins/a11yhelp/dialogs/lang/sv.js
new file mode 100644
index 00000000..27941d9b
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/sv.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'sv', {
7 title: 'Hjälpmedelsinstruktioner',
8 contents: 'Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.',
9 legend: [
10 {
11 name: 'Allmänt',
12 items: [
13 {
14 name: 'Editor verktygsfält',
15 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.'
16 },
17
18 {
19 name: 'Dialogeditor',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'Editor för innehållsmeny',
26 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.'
27 },
28
29 {
30 name: 'Editor för list-box',
31 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.'
32 },
33
34 {
35 name: 'Editor för elementens sökväg',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Kommandon',
42 items: [
43 {
44 name: 'Ångra kommando',
45 legend: 'Tryck på ${undo}'
46 },
47 {
48 name: 'Gör om kommando',
49 legend: 'Tryck på ${redo}'
50 },
51 {
52 name: 'Kommandot fet stil',
53 legend: 'Tryck på ${bold}'
54 },
55 {
56 name: 'Kommandot kursiv',
57 legend: 'Tryck på ${italic}'
58 },
59 {
60 name: 'Kommandot understruken',
61 legend: 'Tryck på ${underline}'
62 },
63 {
64 name: 'Kommandot länk',
65 legend: 'Tryck på ${link}'
66 },
67 {
68 name: 'Verktygsfält Dölj kommandot',
69 legend: 'Tryck på ${toolbarCollapse}'
70 },
71 {
72 name: 'Gå till föregående fokus plats',
73 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.'
74 },
75 {
76 name: 'Tillgå nästa fokuskommandots utrymme',
77 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.'
78 },
79 {
80 name: 'Hjälp om tillgänglighet',
81 legend: 'Tryck ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backsteg',
87 tab: 'Tab',
88 enter: 'Retur',
89 shift: 'Skift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Paus',
93 capslock: 'Caps lock',
94 escape: 'Escape',
95 pageUp: 'Sida Up',
96 pageDown: 'Sida Ned',
97 end: 'Slut',
98 home: 'Hem',
99 leftArrow: 'Vänsterpil',
100 upArrow: 'Uppil',
101 rightArrow: 'Högerpil',
102 downArrow: 'Nedåtpil',
103 insert: 'Infoga',
104 'delete': 'Radera',
105 leftWindowKey: 'Vänster Windowstangent',
106 rightWindowKey: 'Höger Windowstangent',
107 selectKey: 'Välj tangent',
108 numpad0: 'Nummer 0',
109 numpad1: 'Nummer 1',
110 numpad2: 'Nummer 2',
111 numpad3: 'Nummer 3',
112 numpad4: 'Nummer 4',
113 numpad5: 'Nummer 5',
114 numpad6: 'Nummer 6',
115 numpad7: 'Nummer 7',
116 numpad8: 'Nummer 8',
117 numpad9: 'Nummer 9',
118 multiply: 'Multiplicera',
119 add: 'Addera',
120 subtract: 'Minus',
121 decimalPoint: 'Decimalpunkt',
122 divide: 'Dividera',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Semikolon',
138 equalSign: 'Lika med tecken',
139 comma: 'Komma',
140 dash: 'Minus',
141 period: 'Punkt',
142 forwardSlash: 'Snedstreck framåt',
143 graveAccent: 'Accent',
144 openBracket: 'Öppningsparentes',
145 backSlash: 'Snedstreck bakåt',
146 closeBracket: 'Slutparentes',
147 singleQuote: 'Enkelt Citattecken'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/th.js b/sources/plugins/a11yhelp/dialogs/lang/th.js
new file mode 100644
index 00000000..c201bd9c
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/th.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'th', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'ทั่วไป',
12 items: [
13 {
14 name: 'แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์',
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'คำสั่ง',
42 items: [
43 {
44 name: 'เลิกทำคำสั่ง',
45 legend: 'วาง ${undo}'
46 },
47 {
48 name: 'คำสั่งสำหรับทำซ้ำ',
49 legend: 'วาง ${redo}'
50 },
51 {
52 name: 'คำสั่งสำหรับตัวหนา',
53 legend: 'วาง ${bold}'
54 },
55 {
56 name: 'คำสั่งสำหรับตัวเอียง',
57 legend: 'วาง ${italic}'
58 },
59 {
60 name: 'คำสั่งสำหรับขีดเส้นใต้',
61 legend: 'วาง ${underline}'
62 },
63 {
64 name: 'คำสั่งสำหรับลิงก์',
65 legend: 'วาง ${link}'
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: 'Press ${toolbarCollapse}' // MISSING
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: 'Press ${a11yHelp}' // MISSING
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace', // MISSING
87 tab: 'Tab', // MISSING
88 enter: 'Enter', // MISSING
89 shift: 'Shift', // MISSING
90 ctrl: 'Ctrl', // MISSING
91 alt: 'Alt', // MISSING
92 pause: 'Pause', // MISSING
93 capslock: 'Caps Lock', // MISSING
94 escape: 'Escape', // MISSING
95 pageUp: 'Page Up', // MISSING
96 pageDown: 'Page Down', // MISSING
97 end: 'End', // MISSING
98 home: 'Home', // MISSING
99 leftArrow: 'Left Arrow', // MISSING
100 upArrow: 'Up Arrow', // MISSING
101 rightArrow: 'Right Arrow', // MISSING
102 downArrow: 'Down Arrow', // MISSING
103 insert: 'Insert', // MISSING
104 'delete': 'Delete', // MISSING
105 leftWindowKey: 'Left Windows key', // MISSING
106 rightWindowKey: 'Right Windows key', // MISSING
107 selectKey: 'Select key', // MISSING
108 numpad0: 'Numpad 0', // MISSING
109 numpad1: 'Numpad 1', // MISSING
110 numpad2: 'Numpad 2', // MISSING
111 numpad3: 'Numpad 3', // MISSING
112 numpad4: 'Numpad 4', // MISSING
113 numpad5: 'Numpad 5', // MISSING
114 numpad6: 'Numpad 6', // MISSING
115 numpad7: 'Numpad 7', // MISSING
116 numpad8: 'Numpad 8', // MISSING
117 numpad9: 'Numpad 9', // MISSING
118 multiply: 'Multiply', // MISSING
119 add: 'Add', // MISSING
120 subtract: 'Subtract', // MISSING
121 decimalPoint: 'Decimal Point', // MISSING
122 divide: 'Divide', // MISSING
123 f1: 'F1', // MISSING
124 f2: 'F2', // MISSING
125 f3: 'F3', // MISSING
126 f4: 'F4', // MISSING
127 f5: 'F5', // MISSING
128 f6: 'F6', // MISSING
129 f7: 'F7', // MISSING
130 f8: 'F8', // MISSING
131 f9: 'F9', // MISSING
132 f10: 'F10', // MISSING
133 f11: 'F11', // MISSING
134 f12: 'F12', // MISSING
135 numLock: 'Num Lock', // MISSING
136 scrollLock: 'Scroll Lock', // MISSING
137 semiColon: 'Semicolon', // MISSING
138 equalSign: 'Equal Sign', // MISSING
139 comma: 'Comma', // MISSING
140 dash: 'Dash', // MISSING
141 period: 'Period', // MISSING
142 forwardSlash: 'Forward Slash', // MISSING
143 graveAccent: 'Grave Accent', // MISSING
144 openBracket: 'Open Bracket', // MISSING
145 backSlash: 'Backslash', // MISSING
146 closeBracket: 'Close Bracket', // MISSING
147 singleQuote: 'Single Quote' // MISSING
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/tr.js b/sources/plugins/a11yhelp/dialogs/lang/tr.js
new file mode 100644
index 00000000..ce080eda
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/tr.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'tr', {
7 title: 'Erişilebilirlik Talimatları',
8 contents: 'Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.',
9 legend: [
10 {
11 name: 'Genel',
12 items: [
13 {
14 name: 'Düzenleyici Araç Çubuğu',
15 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.'
16 },
17
18 {
19 name: 'Diyalog Düzenleyici',
20 legend:
21 '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.'
22 },
23
24 {
25 name: 'İçerik Menü Editörü',
26 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.'
27 },
28
29 {
30 name: 'Liste Kutusu Editörü',
31 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.'
32 },
33
34 {
35 name: 'Element Yol Çubuğu Editörü',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Komutlar',
42 items: [
43 {
44 name: 'Komutu geri al',
45 legend: '$(undo)\'ya basın'
46 },
47 {
48 name: 'Komutu geri al',
49 legend: '${redo} basın'
50 },
51 {
52 name: ' Kalın komut',
53 legend: '${bold} basın'
54 },
55 {
56 name: ' İtalik komutu',
57 legend: '${italic} basın'
58 },
59 {
60 name: ' Alttan çizgi komutu',
61 legend: '${underline} basın'
62 },
63 {
64 name: ' Bağlantı komutu',
65 legend: '${link} basın'
66 },
67 {
68 name: ' Araç çubuğu Toplama komutu',
69 legend: '${toolbarCollapse} basın'
70 },
71 {
72 name: 'Önceki komut alanına odaklan',
73 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.'
74 },
75 {
76 name: 'Sonraki komut alanına odaklan',
77 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.'
78 },
79 {
80 name: 'Erişilebilirlik Yardımı',
81 legend: '${a11yHelp}\'e basın'
82 }
83 ]
84 }
85 ],
86 backspace: 'Silme',
87 tab: 'Sekme tuşu',
88 enter: 'Gir tuşu',
89 shift: '"Shift" Kaydırma tuşu',
90 ctrl: '"Ctrl" Kontrol tuşu',
91 alt: '"Alt" Anahtar tuşu',
92 pause: 'Durdurma tuşu',
93 capslock: 'Büyük harf tuşu',
94 escape: 'Vazgeç tuşu',
95 pageUp: 'Sayfa Yukarı',
96 pageDown: 'Sayfa Aşağı',
97 end: 'Sona',
98 home: 'En başa',
99 leftArrow: 'Sol ok',
100 upArrow: 'Yukarı ok',
101 rightArrow: 'Sağ ok',
102 downArrow: 'Aşağı ok',
103 insert: 'Araya gir',
104 'delete': 'Silme',
105 leftWindowKey: 'Sol windows tuşu',
106 rightWindowKey: 'Sağ windows tuşu',
107 selectKey: 'Seçme tuşu',
108 numpad0: 'Nümerik 0',
109 numpad1: 'Nümerik 1',
110 numpad2: 'Nümerik 2',
111 numpad3: 'Nümerik 3',
112 numpad4: 'Nümerik 4',
113 numpad5: 'Nümerik 5',
114 numpad6: 'Nümerik 6',
115 numpad7: 'Nümerik 7',
116 numpad8: 'Nümerik 8',
117 numpad9: 'Nümerik 9',
118 multiply: 'Çarpma',
119 add: 'Toplama',
120 subtract: 'Çıkarma',
121 decimalPoint: 'Ondalık işareti',
122 divide: 'Bölme',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lk',
136 scrollLock: 'Scr Lk',
137 semiColon: 'Noktalı virgül',
138 equalSign: 'Eşittir',
139 comma: 'Virgül',
140 dash: 'Eksi',
141 period: 'Nokta',
142 forwardSlash: 'İleri eğik çizgi',
143 graveAccent: 'Üst tırnak',
144 openBracket: 'Parantez aç',
145 backSlash: 'Ters eğik çizgi',
146 closeBracket: 'Parantez kapa',
147 singleQuote: 'Tek tırnak'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/tt.js b/sources/plugins/a11yhelp/dialogs/lang/tt.js
new file mode 100644
index 00000000..e59845ea
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/tt.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'tt', {
7 title: 'Accessibility Instructions', // MISSING
8 contents: 'Help Contents. To close this dialog press ESC.', // MISSING
9 legend: [
10 {
11 name: 'Гомуми',
12 items: [
13 {
14 name: 'Editor Toolbar', // MISSING
15 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
16 },
17
18 {
19 name: 'Editor Dialog', // MISSING
20 legend:
21 '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
22 },
23
24 {
25 name: 'Editor Context Menu', // MISSING
26 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
27 },
28
29 {
30 name: 'Editor List Box', // MISSING
31 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
32 },
33
34 {
35 name: 'Editor Element Path Bar', // MISSING
36 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
37 }
38 ]
39 },
40 {
41 name: 'Командалар',
42 items: [
43 {
44 name: 'Кайтару',
45 legend: '${undo} басыгыз'
46 },
47 {
48 name: 'Кабатлау',
49 legend: '${redo} басыгыз'
50 },
51 {
52 name: 'Калын',
53 legend: '${bold} басыгыз'
54 },
55 {
56 name: 'Курсив',
57 legend: '${italic} басыгыз'
58 },
59 {
60 name: 'Астына сызылган',
61 legend: '${underline} басыгыз'
62 },
63 {
64 name: 'Сылталама',
65 legend: '${link} басыгыз'
66 },
67 {
68 name: ' Toolbar Collapse command', // MISSING
69 legend: '${toolbarCollapse} басыгыз'
70 },
71 {
72 name: ' Access previous focus space command', // MISSING
73 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
74 },
75 {
76 name: ' Access next focus space command', // MISSING
77 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
78 },
79 {
80 name: ' Accessibility Help', // MISSING
81 legend: '${a11yHelp} басыгыз'
82 }
83 ]
84 }
85 ],
86 backspace: 'Кайтару',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Тыныш',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Сул якка ук',
100 upArrow: 'Өскә таба ук',
101 rightArrow: 'Уң якка ук',
102 downArrow: 'Аска таба ук',
103 insert: 'Өстәү',
104 'delete': 'Бетерү',
105 leftWindowKey: 'Сул Windows төймəсе',
106 rightWindowKey: 'Уң Windows төймəсе',
107 selectKey: 'Select төймəсе',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Тапкырлау',
119 add: 'Кушу',
120 subtract: 'Алу',
121 decimalPoint: 'Унарлы нокта',
122 divide: 'Бүлү',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Нокталы өтер',
138 equalSign: 'Тигезлек билгесе',
139 comma: 'Өтер',
140 dash: 'Сызык',
141 period: 'Дәрәҗә',
142 forwardSlash: 'Кыек сызык',
143 graveAccent: 'Гравис',
144 openBracket: 'Җәя ачу',
145 backSlash: 'Кире кыек сызык',
146 closeBracket: 'Җәя ябу',
147 singleQuote: 'Бер иңле куштырнаклар'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/ug.js b/sources/plugins/a11yhelp/dialogs/lang/ug.js
new file mode 100644
index 00000000..1852daf5
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/ug.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'ug', {
7 title: 'قوشۇمچە چۈشەندۈرۈش',
8 contents: 'ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.',
9 legend: [
10 {
11 name: 'ئادەتتىكى',
12 items: [
13 {
14 name: 'قورال بالداق تەھرىر',
15 legend: '${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ.'
16 },
17
18 {
19 name: 'تەھرىرلىگۈچ سۆزلەشكۈسى',
20 legend:
21 'سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT+TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT+F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛SHIFT+ TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ.'
22 },
23
24 {
25 name: 'تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى',
26 legend: '${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ.'
27 },
28
29 {
30 name: 'تەھرىرلىگۈچ تىزىمى',
31 legend: 'تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ.'
32 },
33
34 {
35 name: 'تەھرىرلىگۈچ ئېلېمېنت يول بالداق',
36 legend: '${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ.'
37 }
38 ]
39 },
40 {
41 name: 'بۇيرۇق',
42 items: [
43 {
44 name: 'بۇيرۇقتىن يېنىۋال',
45 legend: '${undo} نى بېسىڭ'
46 },
47 {
48 name: 'قايتىلاش بۇيرۇقى',
49 legend: '${redo} نى بېسىڭ'
50 },
51 {
52 name: 'توملىتىش بۇيرۇقى',
53 legend: '${bold} نى بېسىڭ'
54 },
55 {
56 name: 'يانتۇ بۇيرۇقى',
57 legend: '${italic} نى بېسىڭ'
58 },
59 {
60 name: 'ئاستى سىزىق بۇيرۇقى',
61 legend: '${underline} نى بېسىڭ'
62 },
63 {
64 name: 'ئۇلانما بۇيرۇقى',
65 legend: '${link} نى بېسىڭ'
66 },
67 {
68 name: 'قورال بالداق قاتلاش بۇيرۇقى',
69 legend: '${toolbarCollapse} نى بېسىڭ'
70 },
71 {
72 name: 'ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق',
73 legend: '${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.'
74 },
75 {
76 name: 'كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق',
77 legend: '${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.'
78 },
79 {
80 name: 'توسالغۇسىز لايىھە چۈشەندۈرۈشى',
81 legend: '${a11yHelp} نى بېسىڭ'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Escape',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'سول يا ئوق',
100 upArrow: 'ئۈستى يا ئوق',
101 rightArrow: 'ئوڭ يا ئوق',
102 downArrow: 'ئاستى يا ئوق',
103 insert: 'قىستۇر',
104 'delete': 'ئۆچۈر',
105 leftWindowKey: 'سول Windows كۇنۇپكىسى',
106 rightWindowKey: 'ئوڭ Windows كۇنۇپكىسى',
107 selectKey: 'تاللاش كۇنۇپكىسى',
108 numpad0: 'سان تاختا 0',
109 numpad1: 'سان تاختا 1',
110 numpad2: 'سان تاختا 2',
111 numpad3: 'سان تاختا 3',
112 numpad4: 'سان تاختا 4',
113 numpad5: 'سان تاختا 5',
114 numpad6: 'سان تاختا 6',
115 numpad7: 'سان تاختا 7',
116 numpad8: 'سان تاختا 8',
117 numpad9: 'سان تاختا 9',
118 multiply: 'يۇلتۇز كۇنۇپكىسى',
119 add: 'قوشۇش',
120 subtract: 'ئېلىش',
121 decimalPoint: 'كەسىر چېكىت',
122 divide: 'بۆلۈش',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'سان قۇلۇپ كۇنۇپكىسى',
136 scrollLock: 'سۈرگۈچ قۇلۇپ كۇنۇپكىسى',
137 semiColon: 'چېكىتلىك پەش',
138 equalSign: 'تەڭلىك بەلگىسى',
139 comma: 'پەش',
140 dash: 'سىزىقچە',
141 period: 'چېكىت',
142 forwardSlash: 'سولغا يانتۇ سىزىق',
143 graveAccent: 'ئۇرغۇ بەلگىسى',
144 openBracket: 'ئېچىلغان تىرناق',
145 backSlash: 'ئوڭغا يانتۇ سىزىق',
146 closeBracket: 'يېپىلغان تىرناق',
147 singleQuote: 'يالاڭ پەش'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/uk.js b/sources/plugins/a11yhelp/dialogs/lang/uk.js
new file mode 100644
index 00000000..a290f296
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/uk.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'uk', {
7 title: 'Спеціальні Інструкції',
8 contents: 'Довідка. Натисніть ESC і вона зникне.',
9 legend: [
10 {
11 name: 'Основне',
12 items: [
13 {
14 name: 'Панель Редактора',
15 legend: 'Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT+TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів.'
16 },
17
18 {
19 name: 'Діалог Редактора',
20 legend:
21 'Усередині діалогу, натисніть TAB щоб перейти до наступного елементу діалогу, натисніть SHIFT+TAB щоб перейти до попереднього елемента діалогу, натисніть ENTER щоб відправити діалог, натисніть ESC щоб скасувати діалог. Коли діалогове вікно має декілька вкладок, отримати доступ до панелі вкладок як частині діалогу можна натисканням або поєднання ALT+F10 або TAB, при цьому активні елементи діалогу будуть перебиратися з урахуванням порядку табуляції. При активній панелі вкладок, перехід до наступної або попередньої вкладці здійснюється натисканням стрілки "ВПРАВО" або стрілки "ВЛЕВО" відповідно.'
22 },
23
24 {
25 name: 'Контекстне Меню Редактора',
26 legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC.'
27 },
28
29 {
30 name: 'Скринька Списків Редактора',
31 legend: 'Усередині списку, перехід до наступного пункту списку виконується клавішею TAB або СТРІЛКА ВНИЗ. Перехід до попереднього елемента списку клавішею SHIFT+TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список.'
32 },
33
34 {
35 name: 'Шлях до елемента редактора',
36 legend: 'Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі.'
37 }
38 ]
39 },
40 {
41 name: 'Команди',
42 items: [
43 {
44 name: 'Відмінити команду',
45 legend: 'Натисніть ${undo}'
46 },
47 {
48 name: 'Повторити',
49 legend: 'Натисніть ${redo}'
50 },
51 {
52 name: 'Жирний',
53 legend: 'Натисніть ${bold}'
54 },
55 {
56 name: 'Курсив',
57 legend: 'Натисніть ${italic}'
58 },
59 {
60 name: 'Підкреслений',
61 legend: 'Натисніть ${underline}'
62 },
63 {
64 name: 'Посилання',
65 legend: 'Натисніть ${link}'
66 },
67 {
68 name: 'Згорнути панель інструментів',
69 legend: 'Натисніть ${toolbarCollapse}'
70 },
71 {
72 name: 'Доступ до попереднього місця фокусування',
73 legend: 'Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.'
74 },
75 {
76 name: 'Доступ до наступного місця фокусування',
77 legend: 'Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.'
78 },
79 {
80 name: 'Допомога з доступності',
81 legend: 'Натисніть ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Backspace',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Esc',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: 'Ліва стрілка',
100 upArrow: 'Стрілка вгору',
101 rightArrow: 'Права стрілка',
102 downArrow: 'Стрілка вниз',
103 insert: 'Вставити',
104 'delete': 'Видалити',
105 leftWindowKey: 'Ліва клавіша Windows',
106 rightWindowKey: 'Права клавіша Windows',
107 selectKey: 'Виберіть клавішу',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: 'Множення',
119 add: 'Додати',
120 subtract: 'Віднімання',
121 decimalPoint: 'Десяткова кома',
122 divide: 'Ділення',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Крапка з комою',
138 equalSign: 'Знак рівності',
139 comma: 'Кома',
140 dash: 'Тире',
141 period: 'Період',
142 forwardSlash: 'Коса риска',
143 graveAccent: 'Гравіс',
144 openBracket: 'Відкрити дужку',
145 backSlash: 'Зворотна коса риска',
146 closeBracket: 'Закрити дужку',
147 singleQuote: 'Одинарні лапки'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/vi.js b/sources/plugins/a11yhelp/dialogs/lang/vi.js
new file mode 100644
index 00000000..91edc02d
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/vi.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'vi', {
7 title: 'Hướng dẫn trợ năng',
8 contents: 'Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.',
9 legend: [
10 {
11 name: 'Chung',
12 items: [
13 {
14 name: 'Thanh công cụ soạn thảo',
15 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ụ.'
16 },
17
18 {
19 name: 'Hộp thoại Biên t',
20 legend:
21 '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
22 },
23
24 {
25 name: 'Trình đơn Ngữ cảnh cBộ soạn thảo',
26 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.'
27 },
28
29 {
30 name: 'Hộp danh sách trình biên tập',
31 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.'
32 },
33
34 {
35 name: 'Thanh đường dẫn các đối tượng',
36 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.'
37 }
38 ]
39 },
40 {
41 name: 'Lệnh',
42 items: [
43 {
44 name: 'Làm lại lện',
45 legend: 'Ấn ${undo}'
46 },
47 {
48 name: 'Làm lại lệnh',
49 legend: 'Ấn ${redo}'
50 },
51 {
52 name: 'Lệnh in đậm',
53 legend: 'Ấn ${bold}'
54 },
55 {
56 name: 'Lệnh in nghiêng',
57 legend: 'Ấn ${italic}'
58 },
59 {
60 name: 'Lệnh gạch dưới',
61 legend: 'Ấn ${underline}'
62 },
63 {
64 name: 'Lệnh liên kết',
65 legend: 'Nhấn ${link}'
66 },
67 {
68 name: 'Lệnh hiển thị thanh công cụ',
69 legend: 'Nhấn${toolbarCollapse}'
70 },
71 {
72 name: 'Truy cập đến lệnh tập trung vào khoảng cách trước đó',
73 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.'
74 },
75 {
76 name: 'Truy cập phần đối tượng lệnh khoảng trống',
77 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.'
78 },
79 {
80 name: 'Trợ giúp liên quan',
81 legend: 'Nhấn ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: 'Phím Backspace',
87 tab: 'Phím Tab',
88 enter: 'Phím Tab',
89 shift: 'Phím Shift',
90 ctrl: 'Phím Ctrl',
91 alt: 'Phím Alt',
92 pause: 'Phím Pause',
93 capslock: 'Phím Caps Lock',
94 escape: 'Phím Escape',
95 pageUp: 'Phím Page Up',
96 pageDown: 'Phím Page Down',
97 end: 'Phím End',
98 home: 'Phím Home',
99 leftArrow: 'Phím Left Arrow',
100 upArrow: 'Phím Up Arrow',
101 rightArrow: 'Phím Right Arrow',
102 downArrow: 'Phím Down Arrow',
103 insert: 'Chèn',
104 'delete': 'Xóa',
105 leftWindowKey: 'Phím Left Windows',
106 rightWindowKey: 'Phím Right Windows ',
107 selectKey: 'Chọn phím',
108 numpad0: 'Phím 0',
109 numpad1: 'Phím 1',
110 numpad2: 'Phím 2',
111 numpad3: 'Phím 3',
112 numpad4: 'Phím 4',
113 numpad5: 'Phím 5',
114 numpad6: 'Phím 6',
115 numpad7: 'Phím 7',
116 numpad8: 'Phím 8',
117 numpad9: 'Phím 9',
118 multiply: 'Nhân',
119 add: 'Thêm',
120 subtract: 'Trừ',
121 decimalPoint: 'Điểm số thập phân',
122 divide: 'Chia',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: 'Dấu chấm phẩy',
138 equalSign: 'Đăng nhập bằng',
139 comma: 'Dấu phẩy',
140 dash: 'Dấu gạch ngang',
141 period: 'Phím .',
142 forwardSlash: 'Phím /',
143 graveAccent: 'Phím `',
144 openBracket: 'Open Bracket',
145 backSlash: 'Dấu gạch chéo ngược',
146 closeBracket: 'Gần giá đỡ',
147 singleQuote: 'Trích dẫn'
148} );
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 00000000..829968ff
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/zh-cn.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'zh-cn', {
7 title: '辅助功能说明',
8 contents: '帮助内容。要关闭此对话框请按 ESC 键。',
9 legend: [
10 {
11 name: '常规',
12 items: [
13 {
14 name: '编辑器工具栏',
15 legend: '按 ${toolbarFocus} 切换到工具栏,使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个或下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。'
16 },
17
18 {
19 name: '编辑器对话框',
20 legend:
21 '在对话框内,按 TAB 键移动到下一个字段,按 SHIFT + TAB 组合键移动到上一个字段,按 ENTER 键提交对话框,按 ESC 键取消对话框。对于有多选项卡的对话框,可以按 ALT + F10 直接切换到或者按 TAB 键逐步移到选项卡列表,当焦点移到选项卡列表时可以用左右箭头键来移动到前后的选项卡。'
22 },
23
24 {
25 name: '编辑器上下文菜单',
26 legend: '用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项;SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键,ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。'
27 },
28
29 {
30 name: '编辑器列表框',
31 legend: '在列表框中,移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT+TAB 组合键或者上箭头键,用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。'
32 },
33
34 {
35 name: '编辑器元素路径栏',
36 legend: '按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。'
37 }
38 ]
39 },
40 {
41 name: '命令',
42 items: [
43 {
44 name: ' 撤消命令',
45 legend: '按 ${undo}'
46 },
47 {
48 name: ' 重做命令',
49 legend: '按 ${redo}'
50 },
51 {
52 name: ' 加粗命令',
53 legend: '按 ${bold}'
54 },
55 {
56 name: ' 倾斜命令',
57 legend: '按 ${italic}'
58 },
59 {
60 name: ' 下划线命令',
61 legend: '按 ${underline}'
62 },
63 {
64 name: ' 链接命令',
65 legend: '按 ${link}'
66 },
67 {
68 name: ' 工具栏折叠命令',
69 legend: '按 ${toolbarCollapse}'
70 },
71 {
72 name: '访问前一个焦点区域的命令',
73 legend: '按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域,例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。'
74 },
75 {
76 name: '访问下一个焦点区域命令',
77 legend: '按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。'
78 },
79 {
80 name: '辅助功能帮助',
81 legend: '按 ${a11yHelp}'
82 }
83 ]
84 }
85 ],
86 backspace: '退格键',
87 tab: 'Tab 键',
88 enter: '回车键',
89 shift: 'Shift 键',
90 ctrl: 'Ctrl 键',
91 alt: 'Alt 键',
92 pause: '暂停键',
93 capslock: '大写锁定键',
94 escape: 'Esc 键',
95 pageUp: '上翻页键',
96 pageDown: '下翻页键',
97 end: '行尾键',
98 home: '行首键',
99 leftArrow: '向左箭头键',
100 upArrow: '向上箭头键',
101 rightArrow: '向右箭头键',
102 downArrow: '向下箭头键',
103 insert: '插入键',
104 'delete': '删除键',
105 leftWindowKey: '左 WIN 键',
106 rightWindowKey: '右 WIN 键',
107 selectKey: '选择键',
108 numpad0: '小键盘 0 键',
109 numpad1: '小键盘 1 键',
110 numpad2: '小键盘 2 键',
111 numpad3: '小键盘 3 键',
112 numpad4: '小键盘 4 键',
113 numpad5: '小键盘 5 键',
114 numpad6: '小键盘 6 键',
115 numpad7: '小键盘 7 键',
116 numpad8: '小键盘 8 键',
117 numpad9: '小键盘 9 键',
118 multiply: '星号键',
119 add: '加号键',
120 subtract: '减号键',
121 decimalPoint: '小数点键',
122 divide: '除号键',
123 f1: 'F1 键',
124 f2: 'F2 键',
125 f3: 'F3 键',
126 f4: 'F4 键',
127 f5: 'F5 键',
128 f6: 'F6 键',
129 f7: 'F7 键',
130 f8: 'F8 键',
131 f9: 'F9 键',
132 f10: 'F10 键',
133 f11: 'F11 键',
134 f12: 'F12 键',
135 numLock: '数字锁定键',
136 scrollLock: '滚动锁定键',
137 semiColon: '分号键',
138 equalSign: '等号键',
139 comma: '逗号键',
140 dash: '短划线键',
141 period: '句号键',
142 forwardSlash: '斜杠键',
143 graveAccent: '重音符键',
144 openBracket: '左中括号键',
145 backSlash: '反斜杠键',
146 closeBracket: '右中括号键',
147 singleQuote: '单引号键'
148} );
diff --git a/sources/plugins/a11yhelp/dialogs/lang/zh.js b/sources/plugins/a11yhelp/dialogs/lang/zh.js
new file mode 100644
index 00000000..70061d33
--- /dev/null
+++ b/sources/plugins/a11yhelp/dialogs/lang/zh.js
@@ -0,0 +1,148 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'a11yhelp', 'zh', {
7 title: '輔助工具指南',
8 contents: '說明內容。若要關閉此對話框請按「ESC」。',
9 legend: [
10 {
11 name: '一般',
12 items: [
13 {
14 name: '編輯器工具列',
15 legend: '請按 ${toolbarFocus} 以導覽到工具列。利用 TAB 或 SHIFT+TAB 以便移動到下一個及前一個工具列群組。利用右方向鍵或左方向鍵以便移動到下一個及上一個工具列按鈕。按下空白鍵或 ENTER 鍵啟用工具列按鈕。'
16 },
17
18 {
19 name: '編輯器對話方塊',
20 legend:
21 '在對話框中,按下 TAB 鍵以導覽到下一個對話框元素,按下 SHIFT+TAB 以移動到上一個對話框元素,按下 ENTER 以遞交對話框,按下 ESC 以取消對話框。當對話框有多個分頁時,可以使用 ALT+F10 或是在對話框分頁順序中的一部份按下 TAB 以使用分頁列表。焦點在分頁列表上時,分別使用右方向鍵及左方向鍵移動到下一個及上一個分頁。'
22 },
23
24 {
25 name: '編輯器內容功能表',
26 legend: '請按下「${contextMenu}」或是「應用程式鍵」以開啟內容選單。以「TAB」或是「↓」鍵移動到下一個選單選項。以「SHIFT + TAB」或是「↑」鍵移動到上一個選單選項。按下「空白鍵」或是「ENTER」鍵以選取選單選項。以「空白鍵」或「ENTER」或「→」開啟目前選項之子選單。以「ESC」或「←」回到父選單。以「ESC」鍵關閉內容選單」。'
27 },
28
29 {
30 name: '編輯器清單方塊',
31 legend: '在清單方塊中,使用 TAB 或下方向鍵移動到下一個列表項目。使用 SHIFT+TAB 或上方向鍵移動到上一個列表項目。按下空白鍵或 ENTER 以選取列表選項。按下 ESC 以關閉清單方塊。'
32 },
33
34 {
35 name: '編輯器元件路徑工具列',
36 legend: '請按 ${elementsPathFocus} 以瀏覽元素路徑列。利用 TAB 或右方向鍵以便移動到下一個元素按鈕。利用 SHIFT 或左方向鍵以便移動到上一個按鈕。按下空白鍵或 ENTER 鍵來選取在編輯器中的元素。'
37 }
38 ]
39 },
40 {
41 name: '命令',
42 items: [
43 {
44 name: '復原命令',
45 legend: '請按下「${undo}」'
46 },
47 {
48 name: '重複命令',
49 legend: '請按下「 ${redo}」'
50 },
51 {
52 name: '粗體命令',
53 legend: '請按下「${bold}」'
54 },
55 {
56 name: '斜體',
57 legend: '請按下「${italic}」'
58 },
59 {
60 name: '底線命令',
61 legend: '請按下「${underline}」'
62 },
63 {
64 name: '連結',
65 legend: '請按下「${link}」'
66 },
67 {
68 name: '隱藏工具列',
69 legend: '請按下「${toolbarCollapse}」'
70 },
71 {
72 name: '存取前一個焦點空間命令',
73 legend: '請按下 ${accessPreviousSpace} 以存取最近但無法靠近之插字符號前的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。'
74 },
75 {
76 name: '存取下一個焦點空間命令',
77 legend: '請按下 ${accessNextSpace} 以存取最近但無法靠近之插字符號後的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。'
78 },
79 {
80 name: '協助工具說明',
81 legend: '請按下「${a11yHelp}」'
82 }
83 ]
84 }
85 ],
86 backspace: '退格鍵',
87 tab: 'Tab',
88 enter: 'Enter',
89 shift: 'Shift',
90 ctrl: 'Ctrl',
91 alt: 'Alt',
92 pause: 'Pause',
93 capslock: 'Caps Lock',
94 escape: 'Esc',
95 pageUp: 'Page Up',
96 pageDown: 'Page Down',
97 end: 'End',
98 home: 'Home',
99 leftArrow: '向左箭號',
100 upArrow: '向上鍵號',
101 rightArrow: '向右鍵號',
102 downArrow: '向下鍵號',
103 insert: '插入',
104 'delete': '刪除',
105 leftWindowKey: '左方 Windows 鍵',
106 rightWindowKey: '右方 Windows 鍵',
107 selectKey: '選擇鍵',
108 numpad0: 'Numpad 0',
109 numpad1: 'Numpad 1',
110 numpad2: 'Numpad 2',
111 numpad3: 'Numpad 3',
112 numpad4: 'Numpad 4',
113 numpad5: 'Numpad 5',
114 numpad6: 'Numpad 6',
115 numpad7: 'Numpad 7',
116 numpad8: 'Numpad 8',
117 numpad9: 'Numpad 9',
118 multiply: '乘號',
119 add: '新增',
120 subtract: '減號',
121 decimalPoint: '小數點',
122 divide: '除號',
123 f1: 'F1',
124 f2: 'F2',
125 f3: 'F3',
126 f4: 'F4',
127 f5: 'F5',
128 f6: 'F6',
129 f7: 'F7',
130 f8: 'F8',
131 f9: 'F9',
132 f10: 'F10',
133 f11: 'F11',
134 f12: 'F12',
135 numLock: 'Num Lock',
136 scrollLock: 'Scroll Lock',
137 semiColon: '分號',
138 equalSign: '等號',
139 comma: '逗號',
140 dash: '虛線',
141 period: '句點',
142 forwardSlash: '斜線',
143 graveAccent: '抑音符號',
144 openBracket: '左方括號',
145 backSlash: '反斜線',
146 closeBracket: '右方括號',
147 singleQuote: '單引號'
148} );
diff --git a/sources/plugins/a11yhelp/plugin.js b/sources/plugins/a11yhelp/plugin.js
new file mode 100644
index 00000000..0a7807c5
--- /dev/null
+++ b/sources/plugins/a11yhelp/plugin.js
@@ -0,0 +1,51 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Plugin definition for the a11yhelp, which provides a dialog
8 * with accessibility related help.
9 */
10
11( function() {
12 var pluginName = 'a11yhelp',
13 commandName = 'a11yHelp';
14
15 CKEDITOR.plugins.add( pluginName, {
16 requires: 'dialog',
17
18 // List of available localizations.
19 // jscs:disable
20 availableLangs: { af:1,ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de: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,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 },
21 // jscs:enable
22
23 init: function( editor ) {
24 var plugin = this;
25 editor.addCommand( commandName, {
26 exec: function() {
27 var langCode = editor.langCode;
28 langCode =
29 plugin.availableLangs[ langCode ] ? langCode :
30 plugin.availableLangs[ langCode.replace( /-.*/, '' ) ] ? langCode.replace( /-.*/, '' ) :
31 'en';
32
33 CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( plugin.path + 'dialogs/lang/' + langCode + '.js' ), function() {
34 editor.lang.a11yhelp = plugin.langEntries[ langCode ];
35 editor.openDialog( commandName );
36 } );
37 },
38 modes: { wysiwyg: 1, source: 1 },
39 readOnly: 1,
40 canUndo: false
41 } );
42
43 editor.setKeystroke( CKEDITOR.ALT + 48 /*0*/, 'a11yHelp' );
44 CKEDITOR.dialog.add( commandName, this.path + 'dialogs/a11yhelp.js' );
45
46 editor.on( 'ariaEditorHelpLabel', function( evt ) {
47 evt.data.label = editor.lang.common.editorHelp;
48 } );
49 }
50 } );
51} )();
diff --git a/sources/plugins/about/dialogs/about.js b/sources/plugins/about/dialogs/about.js
new file mode 100644
index 00000000..600bb3ac
--- /dev/null
+++ b/sources/plugins/about/dialogs/about.js
@@ -0,0 +1,73 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'about', function( editor ) {
7 var lang = editor.lang.about,
8 imagePath = CKEDITOR.getUrl( CKEDITOR.plugins.get( 'about' ).path + 'dialogs/' + ( CKEDITOR.env.hidpi ? 'hidpi/' : '' ) + 'logo_ckeditor.png' );
9
10 return {
11 title: CKEDITOR.env.ie ? lang.dlgTitle : lang.title,
12 minWidth: 390,
13 minHeight: 230,
14 contents: [ {
15 id: 'tab1',
16 label: '',
17 title: '',
18 expand: true,
19 padding: 0,
20 elements: [
21 {
22 type: 'html',
23 html: '<style type="text/css">' +
24 '.cke_about_container' +
25 '{' +
26 'color:#000 !important;' +
27 'padding:10px 10px 0;' +
28 'margin-top:5px' +
29 '}' +
30 '.cke_about_container p' +
31 '{' +
32 'margin: 0 0 10px;' +
33 '}' +
34 '.cke_about_container .cke_about_logo' +
35 '{' +
36 'height:81px;' +
37 'background-color:#fff;' +
38 'background-image:url(' + imagePath + ');' +
39 ( CKEDITOR.env.hidpi ? 'background-size:163px 58px;' : '' ) +
40 'background-position:center; ' +
41 'background-repeat:no-repeat;' +
42 'margin-bottom:10px;' +
43 '}' +
44 '.cke_about_container a' +
45 '{' +
46 'cursor:pointer !important;' +
47 'color:#00B2CE !important;' +
48 'text-decoration:underline !important;' +
49 '}' +
50 '</style>' +
51 '<div class="cke_about_container">' +
52 '<div class="cke_about_logo"></div>' +
53 '<p>' +
54 'CKEditor ' + CKEDITOR.version + ' (revision ' + CKEDITOR.revision + ')<br>' +
55 '<a target="_blank" href="http://ckeditor.com/">http://ckeditor.com</a>' +
56 '</p>' +
57 '<p>' +
58 lang.help.replace( '$1', '<a target="_blank" href="http://docs.ckeditor.com/user">' + lang.userGuide + '</a>' ) +
59 '</p>' +
60 '<p>' +
61 lang.moreInfo + '<br>' +
62 '<a target="_blank" href="http://ckeditor.com/about/license">http://ckeditor.com/about/license</a>' +
63 '</p>' +
64 '<p>' +
65 lang.copy.replace( '$1', '<a target="_blank" href="http://cksource.com/">CKSource</a> - Frederico Knabben' ) +
66 '</p>' +
67 '</div>'
68 }
69 ]
70 } ],
71 buttons: [ CKEDITOR.dialog.cancelButton ]
72 };
73} );
diff --git a/sources/plugins/about/dialogs/hidpi/logo_ckeditor.png b/sources/plugins/about/dialogs/hidpi/logo_ckeditor.png
new file mode 100644
index 00000000..10cc7368
--- /dev/null
+++ b/sources/plugins/about/dialogs/hidpi/logo_ckeditor.png
Binary files differ
diff --git a/sources/plugins/about/dialogs/logo_ckeditor.png b/sources/plugins/about/dialogs/logo_ckeditor.png
new file mode 100644
index 00000000..f186eb87
--- /dev/null
+++ b/sources/plugins/about/dialogs/logo_ckeditor.png
Binary files differ
diff --git a/sources/plugins/about/icons/about.png b/sources/plugins/about/icons/about.png
new file mode 100644
index 00000000..a087ac15
--- /dev/null
+++ b/sources/plugins/about/icons/about.png
Binary files differ
diff --git a/sources/plugins/about/icons/hidpi/about.png b/sources/plugins/about/icons/hidpi/about.png
new file mode 100644
index 00000000..8cc0e9fb
--- /dev/null
+++ b/sources/plugins/about/icons/hidpi/about.png
Binary files differ
diff --git a/sources/plugins/about/lang/af.js b/sources/plugins/about/lang/af.js
new file mode 100644
index 00000000..1c05504b
--- /dev/null
+++ b/sources/plugins/about/lang/af.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'af', {
6 copy: 'Kopiereg &copy; $1. Alle regte voorbehou.',
7 dlgTitle: 'Meer oor CKEditor',
8 help: 'Slaan $1 na vir hulp.',
9 moreInfo: 'Vir lisensie-informasie, besoek asb. ons webwerf:',
10 title: 'Meer oor CKEditor',
11 userGuide: 'CKEditor Gebruikers gits'
12} );
diff --git a/sources/plugins/about/lang/ar.js b/sources/plugins/about/lang/ar.js
new file mode 100644
index 00000000..23fdd952
--- /dev/null
+++ b/sources/plugins/about/lang/ar.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ar', {
6 copy: 'حقوق النشر &copy; $1. جميع الحقوق محفوظة.',
7 dlgTitle: 'عن CKEditor',
8 help: 'راجع $1 من أجل المساعدة',
9 moreInfo: 'للحصول على معلومات الترخيص ، يرجى زيارة موقعنا:',
10 title: 'عن CKEditor',
11 userGuide: 'دليل مستخدم CKEditor.'
12} );
diff --git a/sources/plugins/about/lang/bg.js b/sources/plugins/about/lang/bg.js
new file mode 100644
index 00000000..6d463ad3
--- /dev/null
+++ b/sources/plugins/about/lang/bg.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'bg', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'Относно CKEditor',
8 help: 'Проверете $1 за помощ.',
9 moreInfo: 'За лицензионна информация моля посетете сайта ни:',
10 title: 'Относно CKEditor',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/bn.js b/sources/plugins/about/lang/bn.js
new file mode 100644
index 00000000..a476261a
--- /dev/null
+++ b/sources/plugins/about/lang/bn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'bn', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide' // MISSING
12} );
diff --git a/sources/plugins/about/lang/bs.js b/sources/plugins/about/lang/bs.js
new file mode 100644
index 00000000..88056e1b
--- /dev/null
+++ b/sources/plugins/about/lang/bs.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'bs', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/ca.js b/sources/plugins/about/lang/ca.js
new file mode 100644
index 00000000..c6685105
--- /dev/null
+++ b/sources/plugins/about/lang/ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ca', {
6 copy: 'Copyright &copy; $1. Tots els drets reservats.',
7 dlgTitle: 'Quant al CKEditor',
8 help: 'Premi $1 per obtenir ajuda.',
9 moreInfo: 'Per informació sobre llicències visiteu el nostre lloc web:',
10 title: 'Quant al CKEditor',
11 userGuide: 'Manual d\'usuari de CKEditor'
12} );
diff --git a/sources/plugins/about/lang/cs.js b/sources/plugins/about/lang/cs.js
new file mode 100644
index 00000000..8a0a4b25
--- /dev/null
+++ b/sources/plugins/about/lang/cs.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'cs', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'O aplikaci CKEditor',
8 help: 'Prohlédněte si $1 pro nápovědu.',
9 moreInfo: 'Pro informace o lincenci navštivte naši webovou stránku:',
10 title: 'O aplikaci CKEditor',
11 userGuide: 'Uživatelská příručka CKEditor'
12} );
diff --git a/sources/plugins/about/lang/cy.js b/sources/plugins/about/lang/cy.js
new file mode 100644
index 00000000..a9c1e6d4
--- /dev/null
+++ b/sources/plugins/about/lang/cy.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'cy', {
6 copy: 'Hawlfraint &copy; $1. Cedwir pob hawl.',
7 dlgTitle: 'Ynghylch CKEditor',
8 help: 'Gwirio $1 am gymorth.',
9 moreInfo: 'Am wybodaeth ynghylch trwyddedau, ewch i\'n gwefan:',
10 title: 'Ynghylch CKEditor',
11 userGuide: 'Canllawiau Defnyddiwr CKEditor'
12} );
diff --git a/sources/plugins/about/lang/da.js b/sources/plugins/about/lang/da.js
new file mode 100644
index 00000000..75700f3e
--- /dev/null
+++ b/sources/plugins/about/lang/da.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'da', {
6 copy: 'Copyright &copy; $1. Alle rettigheder forbeholdes.',
7 dlgTitle: 'Om CKEditor',
8 help: 'Se $1 for at få hjælp.',
9 moreInfo: 'For informationer omkring licens, se venligst vores hjemmeside (på engelsk):',
10 title: 'Om CKEditor',
11 userGuide: 'CKEditor-brugermanual'
12} );
diff --git a/sources/plugins/about/lang/de.js b/sources/plugins/about/lang/de.js
new file mode 100644
index 00000000..7427c4b7
--- /dev/null
+++ b/sources/plugins/about/lang/de.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'de', {
6 copy: 'Copyright &copy; $1. Alle Rechte vorbehalten.',
7 dlgTitle: 'Über CKEditor',
8 help: 'Prüfen Sie $1 für Hilfe.',
9 moreInfo: 'Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:',
10 title: 'Über CKEditor',
11 userGuide: 'CKEditor Benutzerhandbuch'
12} );
diff --git a/sources/plugins/about/lang/el.js b/sources/plugins/about/lang/el.js
new file mode 100644
index 00000000..5d20365d
--- /dev/null
+++ b/sources/plugins/about/lang/el.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'el', {
6 copy: 'Πνευματικά δικαιώματα &copy; $1 Με επιφύλαξη παντός δικαιώματος.',
7 dlgTitle: 'Περί του CKEditor',
8 help: 'Ελέγξτε τις $1 για βοήθεια.',
9 moreInfo: 'Για πληροφορίες σχετικές με την άδεια χρήσης, παρακαλούμε επισκεφθείτε την ιστοσελίδα μας:',
10 title: 'Περί του CKEditor',
11 userGuide: 'Οδηγίες Χρήστη CKEditor'
12} );
diff --git a/sources/plugins/about/lang/en-au.js b/sources/plugins/about/lang/en-au.js
new file mode 100644
index 00000000..b473809b
--- /dev/null
+++ b/sources/plugins/about/lang/en-au.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'en-au', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'About CKEditor',
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:',
10 title: 'About CKEditor',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/en-ca.js b/sources/plugins/about/lang/en-ca.js
new file mode 100644
index 00000000..d709fc5c
--- /dev/null
+++ b/sources/plugins/about/lang/en-ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'en-ca', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'About CKEditor',
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:',
10 title: 'About CKEditor',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/en-gb.js b/sources/plugins/about/lang/en-gb.js
new file mode 100644
index 00000000..eb625945
--- /dev/null
+++ b/sources/plugins/about/lang/en-gb.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'en-gb', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'About CKEditor',
8 help: 'Check $1 for help.',
9 moreInfo: 'For licensing information please visit our web site:',
10 title: 'About CKEditor',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/en.js b/sources/plugins/about/lang/en.js
new file mode 100644
index 00000000..bd8c1045
--- /dev/null
+++ b/sources/plugins/about/lang/en.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'en', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'About CKEditor',
8 help: 'Check $1 for help.',
9 moreInfo: 'For licensing information please visit our web site:',
10 title: 'About CKEditor',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/eo.js b/sources/plugins/about/lang/eo.js
new file mode 100644
index 00000000..c26535d8
--- /dev/null
+++ b/sources/plugins/about/lang/eo.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'eo', {
6 copy: 'Copyright &copy; $1. Ĉiuj rajtoj rezervitaj.',
7 dlgTitle: 'Pri CKEditor',
8 help: 'Kontroli $1 por helpo.',
9 moreInfo: 'Por informoj pri licenco, bonvolu viziti nian retpaĝaron:',
10 title: 'Pri CKEditor',
11 userGuide: 'CKEditor Uzindikoj'
12} );
diff --git a/sources/plugins/about/lang/es.js b/sources/plugins/about/lang/es.js
new file mode 100644
index 00000000..f350cfce
--- /dev/null
+++ b/sources/plugins/about/lang/es.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'es', {
6 copy: 'Copyright &copy; $1. Todos los derechos reservados.',
7 dlgTitle: 'Acerca de CKEditor',
8 help: 'Lea la $1 para resolver sus dudas.',
9 moreInfo: 'Para información de licencia, por favor visite nuestro sitio web:',
10 title: 'Acerca de CKEditor',
11 userGuide: 'Guía de usuario de CKEditor'
12} );
diff --git a/sources/plugins/about/lang/et.js b/sources/plugins/about/lang/et.js
new file mode 100644
index 00000000..21ad65ac
--- /dev/null
+++ b/sources/plugins/about/lang/et.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'et', {
6 copy: 'Copyright &copy; $1. Kõik õigused kaitstud.',
7 dlgTitle: 'CKEditorist',
8 help: 'Abi jaoks vaata $1.',
9 moreInfo: 'Litsentsi andmed leiab meie veebilehelt:',
10 title: 'CKEditorist',
11 userGuide: 'CKEditori kasutusjuhendit'
12} );
diff --git a/sources/plugins/about/lang/eu.js b/sources/plugins/about/lang/eu.js
new file mode 100644
index 00000000..e2ed0309
--- /dev/null
+++ b/sources/plugins/about/lang/eu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'eu', {
6 copy: 'Copyright &copy; $1. Eskubide guztiak erreserbaturik.',
7 dlgTitle: 'CKEditor-i buruz',
8 help: 'Begiratu $1 laguntzarako.',
9 moreInfo: 'Lizentziari buruzko informazioa gure webgunean:',
10 title: 'CKEditor-i buruz',
11 userGuide: 'CKEditor-en erabiltzaile-gida'
12} );
diff --git a/sources/plugins/about/lang/fa.js b/sources/plugins/about/lang/fa.js
new file mode 100644
index 00000000..2b818dbd
--- /dev/null
+++ b/sources/plugins/about/lang/fa.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'fa', {
6 copy: 'حق نشر &copy; $1. کلیه حقوق محفوظ است.',
7 dlgTitle: 'درباره CKEditor',
8 help: ' برای راهنمایی $1 را ملاحظه کنید.',
9 moreInfo: 'برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:',
10 title: 'درباره CKEditor',
11 userGuide: 'راهنمای کاربران CKEditor'
12} );
diff --git a/sources/plugins/about/lang/fi.js b/sources/plugins/about/lang/fi.js
new file mode 100644
index 00000000..58804730
--- /dev/null
+++ b/sources/plugins/about/lang/fi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'fi', {
6 copy: 'Copyright &copy; $1. Kaikki oikeuden pidätetään.',
7 dlgTitle: 'Tietoa CKEditorista',
8 help: 'Katso ohjeet: $1.',
9 moreInfo: 'Lisenssitiedot löytyvät kotisivuiltamme:',
10 title: 'Tietoa CKEditorista',
11 userGuide: 'CKEditorin käyttäjäopas'
12} );
diff --git a/sources/plugins/about/lang/fo.js b/sources/plugins/about/lang/fo.js
new file mode 100644
index 00000000..cf2c2640
--- /dev/null
+++ b/sources/plugins/about/lang/fo.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'fo', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'Um CKEditor',
8 help: 'Kekka $1 fyri hjálp.',
9 moreInfo: 'Licens upplýsingar finnast á heimasíðu okkara:',
10 title: 'Um CKEditor',
11 userGuide: 'CKEditor Brúkaravegleiðing'
12} );
diff --git a/sources/plugins/about/lang/fr-ca.js b/sources/plugins/about/lang/fr-ca.js
new file mode 100644
index 00000000..8c027217
--- /dev/null
+++ b/sources/plugins/about/lang/fr-ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'fr-ca', {
6 copy: 'Copyright &copy; $1. Tous droits réservés.',
7 dlgTitle: 'À propos de CKEditor',
8 help: 'Consulter $1 pour l\'aide.',
9 moreInfo: 'Pour les informations de licence, consulter notre site internet:',
10 title: 'À propos de CKEditor',
11 userGuide: 'Guide utilisateur de CKEditor'
12} );
diff --git a/sources/plugins/about/lang/fr.js b/sources/plugins/about/lang/fr.js
new file mode 100644
index 00000000..b3356aaa
--- /dev/null
+++ b/sources/plugins/about/lang/fr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'fr', {
6 copy: 'Copyright &copy; $1. Tous droits réservés.',
7 dlgTitle: 'À propos de CKEditor',
8 help: 'Consulter $1 pour l\'aide.',
9 moreInfo: 'Pour les informations de licence, veuillez visiter notre site web:',
10 title: 'À propos de CKEditor',
11 userGuide: 'Guide de l\'utilisateur CKEditor en anglais'
12} );
diff --git a/sources/plugins/about/lang/gl.js b/sources/plugins/about/lang/gl.js
new file mode 100644
index 00000000..f6ee3b37
--- /dev/null
+++ b/sources/plugins/about/lang/gl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'gl', {
6 copy: 'Copyright &copy; $1. Todos os dereitos reservados.',
7 dlgTitle: 'Sobre o CKEditor',
8 help: 'Consulte $1 para obter axuda.',
9 moreInfo: 'Para obter información sobre a licenza, visite o noso sitio web:',
10 title: 'Sobre o CKEditor',
11 userGuide: 'Guía do usuario do CKEditor'
12} );
diff --git a/sources/plugins/about/lang/gu.js b/sources/plugins/about/lang/gu.js
new file mode 100644
index 00000000..b71ff79d
--- /dev/null
+++ b/sources/plugins/about/lang/gu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'gu', {
6 copy: 'કોપીરાઈટ &copy; $1. ઓલ રાઈટ્સ ',
7 dlgTitle: 'CKEditor વિષે',
8 help: 'મદદ માટે $1 તપાસો',
9 moreInfo: 'લાયસનસની માહિતી માટે અમારી વેબ સાઈટ',
10 title: 'CKEditor વિષે',
11 userGuide: 'CKEditor યુઝર્સ ગાઈડ'
12} );
diff --git a/sources/plugins/about/lang/he.js b/sources/plugins/about/lang/he.js
new file mode 100644
index 00000000..48872191
--- /dev/null
+++ b/sources/plugins/about/lang/he.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'he', {
6 copy: 'Copyright &copy; $1. כל הזכויות שמורות.',
7 dlgTitle: 'אודות CKEditor',
8 help: 'היכנסו ל$1 לעזרה.',
9 moreInfo: 'למידע נוסף בקרו באתרנו:',
10 title: 'אודות CKEditor',
11 userGuide: 'מדריך המשתמש של CKEditor'
12} );
diff --git a/sources/plugins/about/lang/hi.js b/sources/plugins/about/lang/hi.js
new file mode 100644
index 00000000..c6911fe5
--- /dev/null
+++ b/sources/plugins/about/lang/hi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'hi', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/hr.js b/sources/plugins/about/lang/hr.js
new file mode 100644
index 00000000..492b1fa4
--- /dev/null
+++ b/sources/plugins/about/lang/hr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'hr', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'O CKEditoru',
8 help: 'Provjeri $1 za pomoć.',
9 moreInfo: 'Za informacije o licencama posjetite našu web stranicu:',
10 title: 'O CKEditoru',
11 userGuide: 'Vodič za CKEditor korisnike'
12} );
diff --git a/sources/plugins/about/lang/hu.js b/sources/plugins/about/lang/hu.js
new file mode 100644
index 00000000..ee9174d0
--- /dev/null
+++ b/sources/plugins/about/lang/hu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'hu', {
6 copy: 'Copyright &copy; $1. Minden jog fenntartva.',
7 dlgTitle: 'CKEditor névjegy',
8 help: 'Itt találsz segítséget: $1',
9 moreInfo: 'Licenszelési információkért kérjük látogassa meg weboldalunkat:',
10 title: 'CKEditor névjegy',
11 userGuide: 'CKEditor Felhasználói útmutató'
12} );
diff --git a/sources/plugins/about/lang/id.js b/sources/plugins/about/lang/id.js
new file mode 100644
index 00000000..21378d1b
--- /dev/null
+++ b/sources/plugins/about/lang/id.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'id', {
6 copy: 'Hak cipta &copy; $1. All rights reserved.',
7 dlgTitle: 'Tentang CKEditor',
8 help: 'Cel $1 untuk bantuan.',
9 moreInfo: 'Untuk informasi lisensi silahkan kunjungi web site kami:',
10 title: 'Tentang CKEditor',
11 userGuide: 'Petunjuk Pengguna CKEditor'
12} );
diff --git a/sources/plugins/about/lang/is.js b/sources/plugins/about/lang/is.js
new file mode 100644
index 00000000..fe455c53
--- /dev/null
+++ b/sources/plugins/about/lang/is.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'is', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide' // MISSING
12} );
diff --git a/sources/plugins/about/lang/it.js b/sources/plugins/about/lang/it.js
new file mode 100644
index 00000000..6bf1dbc0
--- /dev/null
+++ b/sources/plugins/about/lang/it.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'it', {
6 copy: 'Copyright &copy; $1. Tutti i diritti riservati.',
7 dlgTitle: 'Riguardo CKEditor',
8 help: 'Vedi $1 per l\'aiuto.',
9 moreInfo: 'Per le informazioni sulla licenza si prega di visitare il nostro sito:',
10 title: 'Riguardo CKEditor',
11 userGuide: 'Guida Utente CKEditor'
12} );
diff --git a/sources/plugins/about/lang/ja.js b/sources/plugins/about/lang/ja.js
new file mode 100644
index 00000000..3fa2e9f7
--- /dev/null
+++ b/sources/plugins/about/lang/ja.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ja', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: 'CKEditorについて',
8 help: '$1 のヘルプを見てください。',
9 moreInfo: 'ライセンス情報の詳細はウェブサイトにて確認してください:',
10 title: 'CKEditorについて',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/ka.js b/sources/plugins/about/lang/ka.js
new file mode 100644
index 00000000..af55a888
--- /dev/null
+++ b/sources/plugins/about/lang/ka.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ka', {
6 copy: 'Copyright &copy; $1. ყველა უფლება დაცულია.',
7 dlgTitle: 'CKEditor-ის შესახებ',
8 help: 'დახმარებისთვის იხილეთ $1.',
9 moreInfo: 'ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:',
10 title: 'CKEditor-ის შესახებ',
11 userGuide: 'CKEditor-ის მომხმარებლის სახელმძღვანელო'
12} );
diff --git a/sources/plugins/about/lang/km.js b/sources/plugins/about/lang/km.js
new file mode 100644
index 00000000..32f052c8
--- /dev/null
+++ b/sources/plugins/about/lang/km.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'km', {
6 copy: 'រក្សាសិទ្ធិ &copy; $1។ រក្សា​សិទ្ធិ​គ្រប់​បែប​យ៉ាង។',
7 dlgTitle: 'អំពី CKEditor',
8 help: 'ពិនិត្យ $1 សម្រាប់​ជំនួយ។',
9 moreInfo: 'សម្រាប់​ព័ត៌មាន​អំពី​អាជ្ញាបណញណ សូម​មើល​ក្នុង​គេហទំព័រ​របស់​យើង៖',
10 title: 'អំពី CKEditor',
11 userGuide: 'វិធី​ប្រើ​ប្រាស់ CKEditor'
12} );
diff --git a/sources/plugins/about/lang/ko.js b/sources/plugins/about/lang/ko.js
new file mode 100644
index 00000000..7559ffa1
--- /dev/null
+++ b/sources/plugins/about/lang/ko.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ko', {
6 copy: '저작권 &copy; $1 . 판권 소유.',
7 dlgTitle: 'CKEditor 에 대하여',
8 help: '도움이 필요하시면 $1 를 확인하세요.',
9 moreInfo: '라이선스에 대한 정보는 저희 웹 사이트를 참고하세요:',
10 title: 'CKEditor에 대하여',
11 userGuide: 'CKEditor 사용설명서'
12} );
diff --git a/sources/plugins/about/lang/ku.js b/sources/plugins/about/lang/ku.js
new file mode 100644
index 00000000..b9ae3c3e
--- /dev/null
+++ b/sources/plugins/about/lang/ku.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ku', {
6 copy: 'مافی لەبەرگەرتنەوەی &copy; $1. گشتی پارێزراوه. ورگێڕانی بۆ کوردی لەلایەن هۆژە کۆیی.',
7 dlgTitle: 'دەربارەی CKEditor',
8 help: 'سەیری $1 بکه بۆ یارمەتی.',
9 moreInfo: 'بۆ زانیاری زیاتر دەربارەی مۆڵەتی بەکارهێنان، تکایه سەردانی ماڵپەڕەکەمان بکه:',
10 title: 'دەربارەی CKEditor',
11 userGuide: 'ڕێپیشاندەری CKEditors'
12} );
diff --git a/sources/plugins/about/lang/lt.js b/sources/plugins/about/lang/lt.js
new file mode 100644
index 00000000..c08b0453
--- /dev/null
+++ b/sources/plugins/about/lang/lt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'lt', {
6 copy: 'Copyright &copy; $1. Visos teiss saugomos.',
7 dlgTitle: 'Apie CKEditor',
8 help: 'Patikrinkite $1 dėl pagalbos.',
9 moreInfo: 'Dėl licencijavimo apsilankykite mūsų svetainėje:',
10 title: 'Apie CKEditor',
11 userGuide: 'CKEditor Vartotojo Gidas'
12} );
diff --git a/sources/plugins/about/lang/lv.js b/sources/plugins/about/lang/lv.js
new file mode 100644
index 00000000..a53d277b
--- /dev/null
+++ b/sources/plugins/about/lang/lv.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'lv', {
6 copy: 'Kopēšanas tiesības &copy; $1. Visas tiesības rezervētas.',
7 dlgTitle: 'Par CKEditor',
8 help: 'Pārbaudiet $1 palīdzībai.',
9 moreInfo: 'Informācijai par licenzēšanu apmeklējiet mūsu mājas lapu:',
10 title: 'Par CKEditor',
11 userGuide: 'CKEditor Lietotāja pamācība'
12} );
diff --git a/sources/plugins/about/lang/mk.js b/sources/plugins/about/lang/mk.js
new file mode 100644
index 00000000..930b831f
--- /dev/null
+++ b/sources/plugins/about/lang/mk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'mk', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide' // MISSING
12} );
diff --git a/sources/plugins/about/lang/mn.js b/sources/plugins/about/lang/mn.js
new file mode 100644
index 00000000..2f74de78
--- /dev/null
+++ b/sources/plugins/about/lang/mn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'mn', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/ms.js b/sources/plugins/about/lang/ms.js
new file mode 100644
index 00000000..1032088f
--- /dev/null
+++ b/sources/plugins/about/lang/ms.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ms', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide' // MISSING
12} );
diff --git a/sources/plugins/about/lang/nb.js b/sources/plugins/about/lang/nb.js
new file mode 100644
index 00000000..2562d782
--- /dev/null
+++ b/sources/plugins/about/lang/nb.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'nb', {
6 copy: 'Copyright &copy; $1. Alle rettigheter reservert.',
7 dlgTitle: 'Om CKEditor',
8 help: 'Se $1 for hjelp.',
9 moreInfo: 'For lisensieringsinformasjon, vennligst besøk vårt nettsted:',
10 title: 'Om CKEditor',
11 userGuide: 'CKEditors brukerveiledning'
12} );
diff --git a/sources/plugins/about/lang/nl.js b/sources/plugins/about/lang/nl.js
new file mode 100644
index 00000000..9298cb44
--- /dev/null
+++ b/sources/plugins/about/lang/nl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'nl', {
6 copy: 'Copyright &copy; $1. Alle rechten voorbehouden.',
7 dlgTitle: 'Over CKEditor',
8 help: 'Bekijk de $1 voor hulp.',
9 moreInfo: 'Bezoek onze website voor licentieinformatie:',
10 title: 'Over CKEditor',
11 userGuide: 'CKEditor gebruiksaanwijzing'
12} );
diff --git a/sources/plugins/about/lang/no.js b/sources/plugins/about/lang/no.js
new file mode 100644
index 00000000..a2cc6d75
--- /dev/null
+++ b/sources/plugins/about/lang/no.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'no', {
6 copy: 'Copyright &copy; $1. Alle rettigheter reservert.',
7 dlgTitle: 'Om CKEditor',
8 help: 'Se $1 for hjelp.',
9 moreInfo: 'For lisensieringsinformasjon, vennligst besøk vårt nettsted:',
10 title: 'Om CKEditor',
11 userGuide: 'CKEditors brukerveiledning'
12} );
diff --git a/sources/plugins/about/lang/pl.js b/sources/plugins/about/lang/pl.js
new file mode 100644
index 00000000..5dbcd44d
--- /dev/null
+++ b/sources/plugins/about/lang/pl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'pl', {
6 copy: 'Copyright &copy; $1. Wszelkie prawa zastrzeżone.',
7 dlgTitle: 'Informacje o programie CKEditor',
8 help: 'Pomoc znajdziesz w $1.',
9 moreInfo: 'Informacje na temat licencji można znaleźć na naszej stronie:',
10 title: 'Informacje o programie CKEditor',
11 userGuide: 'podręczniku użytkownika programu CKEditor'
12} );
diff --git a/sources/plugins/about/lang/pt-br.js b/sources/plugins/about/lang/pt-br.js
new file mode 100644
index 00000000..773da19a
--- /dev/null
+++ b/sources/plugins/about/lang/pt-br.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'pt-br', {
6 copy: 'Copyright &copy; $1. Todos os direitos reservados.',
7 dlgTitle: 'Sobre o CKEditor',
8 help: 'Verifique o $1 para obter ajuda.',
9 moreInfo: 'Para informações sobre a licença por favor visite o nosso site:',
10 title: 'Sobre o CKEditor',
11 userGuide: 'Guia do Usuário do CKEditor'
12} );
diff --git a/sources/plugins/about/lang/pt.js b/sources/plugins/about/lang/pt.js
new file mode 100644
index 00000000..7f78e0b9
--- /dev/null
+++ b/sources/plugins/about/lang/pt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'pt', {
6 copy: 'Direitos de Autor &copy; $1. Todos os direitos reservados.',
7 dlgTitle: 'Sobre o CKEditor',
8 help: 'Doar $1 para ajudar.',
9 moreInfo: 'Para informação sobre licenciamento visite o nosso sítio web:',
10 title: 'Sobre o CKEditor',
11 userGuide: 'CKEditor - Guia do Utilizador'
12} );
diff --git a/sources/plugins/about/lang/ro.js b/sources/plugins/about/lang/ro.js
new file mode 100644
index 00000000..770146a1
--- /dev/null
+++ b/sources/plugins/about/lang/ro.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ro', {
6 copy: 'Copyright &copy; $1. Toate drepturile rezervate.',
7 dlgTitle: 'Despre CKEeditor',
8 help: 'Citește $1 pentru ajutor.',
9 moreInfo: 'Pentru informații despre licență, vă rugăm vizitați web site-ul nostru:',
10 title: 'Despre CKEditor',
11 userGuide: 'CKEditor Ghid Utilizator'
12} );
diff --git a/sources/plugins/about/lang/ru.js b/sources/plugins/about/lang/ru.js
new file mode 100644
index 00000000..a1d4c70f
--- /dev/null
+++ b/sources/plugins/about/lang/ru.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ru', {
6 copy: 'Copyright &copy; $1. Все права защищены.',
7 dlgTitle: 'О CKEditor',
8 help: '$1 содержит подробную справку по использованию.',
9 moreInfo: 'Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:',
10 title: 'О CKEditor',
11 userGuide: 'Руководство пользователя CKEditor'
12} );
diff --git a/sources/plugins/about/lang/si.js b/sources/plugins/about/lang/si.js
new file mode 100644
index 00000000..2d606d90
--- /dev/null
+++ b/sources/plugins/about/lang/si.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'si', {
6 copy: 'පිටපත් අයිතිය සහ පිටපත් කිරීම;$1 .සියලුම හිමිකම් ඇවිරිණි.',
7 dlgTitle: 'CKEditor ගැන විස්තර',
8 help: 'උදව් සඳහා $1 ',
9 moreInfo: 'බලපත්‍ර තොරතුරු සදහා කරුණාකර අපගේ විද්‍යුත් ලිපිනයට පිවිසෙන්න:',
10 title: 'CKEditor ගැන විස්තර',
11 userGuide: 'CKEditor භාවිතා කිරීම පිළිබඳ '
12} );
diff --git a/sources/plugins/about/lang/sk.js b/sources/plugins/about/lang/sk.js
new file mode 100644
index 00000000..eb114ad6
--- /dev/null
+++ b/sources/plugins/about/lang/sk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'sk', {
6 copy: 'Copyright &copy; $1. Všetky práva vyhradené.',
7 dlgTitle: 'O CKEditor-e',
8 help: 'Zaškrtnite $1 pre pomoc.',
9 moreInfo: 'Pre informácie o licenciách, prosíme, navštívte našu web stránku:',
10 title: 'O CKEditor-e',
11 userGuide: 'Používateľská príručka KCEditor-a'
12} );
diff --git a/sources/plugins/about/lang/sl.js b/sources/plugins/about/lang/sl.js
new file mode 100644
index 00000000..6c970c71
--- /dev/null
+++ b/sources/plugins/about/lang/sl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'sl', {
6 copy: 'Copyright &copy; $1. Vse pravice pridržane.',
7 dlgTitle: 'O programu CKEditor',
8 help: 'Preverite $1 za pomoč.',
9 moreInfo: 'Za informacijo o licenci prosim obiščite našo spletno stran:',
10 title: 'O programu CKEditor',
11 userGuide: 'CKEditor Navodila za Uporabo'
12} );
diff --git a/sources/plugins/about/lang/sq.js b/sources/plugins/about/lang/sq.js
new file mode 100644
index 00000000..856e2c47
--- /dev/null
+++ b/sources/plugins/about/lang/sq.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'sq', {
6 copy: 'Të drejtat e kopjimit &copy; $1. Të gjitha të drejtat e rezervuara.',
7 dlgTitle: 'Rreth CKEditor',
8 help: 'Kontrollo $1 për ndihmë.',
9 moreInfo: 'Për informacione rreth licencave shih faqen tonë:',
10 title: 'Rreth CKEditor',
11 userGuide: 'Udhëzuesi i Shfrytëzuesit të CKEditor'
12} );
diff --git a/sources/plugins/about/lang/sr-latn.js b/sources/plugins/about/lang/sr-latn.js
new file mode 100644
index 00000000..8d65ec98
--- /dev/null
+++ b/sources/plugins/about/lang/sr-latn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'sr-latn', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide' // MISSING
12} );
diff --git a/sources/plugins/about/lang/sr.js b/sources/plugins/about/lang/sr.js
new file mode 100644
index 00000000..b726d9e8
--- /dev/null
+++ b/sources/plugins/about/lang/sr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'sr', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide' // MISSING
12} );
diff --git a/sources/plugins/about/lang/sv.js b/sources/plugins/about/lang/sv.js
new file mode 100644
index 00000000..4f70f4b3
--- /dev/null
+++ b/sources/plugins/about/lang/sv.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'sv', {
6 copy: 'Copyright &copy; $1. Alla rättigheter reserverade.',
7 dlgTitle: 'Om CKEditor',
8 help: 'Se $1 för hjälp.',
9 moreInfo: 'För information av licensiering besök vår hemsida:',
10 title: 'Om CKEditor',
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/th.js b/sources/plugins/about/lang/th.js
new file mode 100644
index 00000000..bac332d6
--- /dev/null
+++ b/sources/plugins/about/lang/th.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'th', {
6 copy: 'Copyright &copy; $1. All rights reserved.', // MISSING
7 dlgTitle: 'About CKEditor', // MISSING
8 help: 'Check $1 for help.', // MISSING
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'About CKEditor', // MISSING
11 userGuide: 'CKEditor User\'s Guide'
12} );
diff --git a/sources/plugins/about/lang/tr.js b/sources/plugins/about/lang/tr.js
new file mode 100644
index 00000000..f16db121
--- /dev/null
+++ b/sources/plugins/about/lang/tr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'tr', {
6 copy: 'Copyright &copy; $1. Tüm hakları saklıdır.',
7 dlgTitle: 'CKEditor Hakkında',
8 help: 'Yardım için $1 kontrol edin.',
9 moreInfo: 'Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:',
10 title: 'CKEditor Hakkında',
11 userGuide: 'CKEditor Kullanıcı Kılavuzu'
12} );
diff --git a/sources/plugins/about/lang/tt.js b/sources/plugins/about/lang/tt.js
new file mode 100644
index 00000000..17441c3e
--- /dev/null
+++ b/sources/plugins/about/lang/tt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'tt', {
6 copy: 'Copyright &copy; $1. Бар хокуклар сакланган',
7 dlgTitle: 'CKEditor турында',
8 help: 'Ярдәм өчен $1 тикшереп карагыз.',
9 moreInfo: 'For licensing information please visit our web site:', // MISSING
10 title: 'CKEditor турында',
11 userGuide: 'CKEditor кулланмасы'
12} );
diff --git a/sources/plugins/about/lang/ug.js b/sources/plugins/about/lang/ug.js
new file mode 100644
index 00000000..482f5012
--- /dev/null
+++ b/sources/plugins/about/lang/ug.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'ug', {
6 copy: 'Copyright &copy; $1. نەشر ھوقۇقىغا ئىگە',
7 dlgTitle: 'CKEditor ھەققىدە',
8 help: '$1 نى زىيارەت قىلىپ ياردەمگە ئېرىشىڭ',
9 moreInfo: 'تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ',
10 title: 'CKEditor ھەققىدە',
11 userGuide: 'CKEditor ئىشلەتكۈچى قوللانمىسى'
12} );
diff --git a/sources/plugins/about/lang/uk.js b/sources/plugins/about/lang/uk.js
new file mode 100644
index 00000000..9acad4cf
--- /dev/null
+++ b/sources/plugins/about/lang/uk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'uk', {
6 copy: 'Copyright &copy; $1. Всі права застережено.',
7 dlgTitle: 'Про CKEditor',
8 help: 'Перевірте $1 для допомоги.',
9 moreInfo: 'Щодо інформації з ліцензування завітайте на наш сайт:',
10 title: 'Про CKEditor',
11 userGuide: 'Інструкція Користувача для CKEditor'
12} );
diff --git a/sources/plugins/about/lang/vi.js b/sources/plugins/about/lang/vi.js
new file mode 100644
index 00000000..a72559d4
--- /dev/null
+++ b/sources/plugins/about/lang/vi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'vi', {
6 copy: 'Bản quyền &copy; $1. Giữ toàn quyền.',
7 dlgTitle: 'Thông tin về CKEditor',
8 help: 'Kiểm tra $1 để được giúp đỡ.',
9 moreInfo: 'Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:',
10 title: 'Thông tin về CKEditor',
11 userGuide: 'Hướng dẫn sử dụng CKEditor'
12} );
diff --git a/sources/plugins/about/lang/zh-cn.js b/sources/plugins/about/lang/zh-cn.js
new file mode 100644
index 00000000..e5548b29
--- /dev/null
+++ b/sources/plugins/about/lang/zh-cn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'zh-cn', {
6 copy: '版权所有 &copy; $1。<br />保留所有权利。',
7 dlgTitle: '关于 CKEditor',
8 help: '访问 $1 以获取帮助。',
9 moreInfo: '相关授权许可信息请访问我们的网站:',
10 title: '关于 CKEditor',
11 userGuide: 'CKEditor 用户向导'
12} );
diff --git a/sources/plugins/about/lang/zh.js b/sources/plugins/about/lang/zh.js
new file mode 100644
index 00000000..955546d9
--- /dev/null
+++ b/sources/plugins/about/lang/zh.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'about', 'zh', {
6 copy: 'Copyright &copy; $1. All rights reserved.',
7 dlgTitle: '關於 CKEditor',
8 help: '檢閱 $1 尋求幫助。',
9 moreInfo: '關於授權資訊,請參閱我們的網站:',
10 title: '關於 CKEditor',
11 userGuide: 'CKEditor 使用者手冊'
12} );
diff --git a/sources/plugins/about/plugin.js b/sources/plugins/about/plugin.js
new file mode 100644
index 00000000..09dd4bc7
--- /dev/null
+++ b/sources/plugins/about/plugin.js
@@ -0,0 +1,27 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'about', {
7 requires: 'dialog',
8 // jscs:disable maximumLineLength
9 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
10 // jscs:enable maximumLineLength
11 icons: 'about', // %REMOVE_LINE_CORE%
12 hidpi: true, // %REMOVE_LINE_CORE%
13 init: function( editor ) {
14 var command = editor.addCommand( 'about', new CKEDITOR.dialogCommand( 'about' ) );
15 command.modes = { wysiwyg: 1, source: 1 };
16 command.canUndo = false;
17 command.readOnly = 1;
18
19 editor.ui.addButton && editor.ui.addButton( 'About', {
20 label: editor.lang.about.title,
21 command: 'about',
22 toolbar: 'about'
23 } );
24
25 CKEDITOR.dialog.add( 'about', this.path + 'dialogs/about.js' );
26 }
27} );
diff --git a/sources/plugins/basicstyles/icons/bold.png b/sources/plugins/basicstyles/icons/bold.png
new file mode 100644
index 00000000..5ff84fec
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/bold.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/hidpi/bold.png b/sources/plugins/basicstyles/icons/hidpi/bold.png
new file mode 100644
index 00000000..65acb293
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/hidpi/bold.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/hidpi/italic.png b/sources/plugins/basicstyles/icons/hidpi/italic.png
new file mode 100644
index 00000000..2b0f44e7
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/hidpi/italic.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/hidpi/strike.png b/sources/plugins/basicstyles/icons/hidpi/strike.png
new file mode 100644
index 00000000..ef045c84
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/hidpi/strike.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/hidpi/subscript.png b/sources/plugins/basicstyles/icons/hidpi/subscript.png
new file mode 100644
index 00000000..f12f4be2
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/hidpi/subscript.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/hidpi/superscript.png b/sources/plugins/basicstyles/icons/hidpi/superscript.png
new file mode 100644
index 00000000..4f7b762f
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/hidpi/superscript.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/hidpi/underline.png b/sources/plugins/basicstyles/icons/hidpi/underline.png
new file mode 100644
index 00000000..79702f69
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/hidpi/underline.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/italic.png b/sources/plugins/basicstyles/icons/italic.png
new file mode 100644
index 00000000..64d1332c
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/italic.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/strike.png b/sources/plugins/basicstyles/icons/strike.png
new file mode 100644
index 00000000..31ea47a1
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/strike.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/subscript.png b/sources/plugins/basicstyles/icons/subscript.png
new file mode 100644
index 00000000..bfe5420e
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/subscript.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/superscript.png b/sources/plugins/basicstyles/icons/superscript.png
new file mode 100644
index 00000000..a1eb2f1e
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/superscript.png
Binary files differ
diff --git a/sources/plugins/basicstyles/icons/underline.png b/sources/plugins/basicstyles/icons/underline.png
new file mode 100644
index 00000000..1dd0c593
--- /dev/null
+++ b/sources/plugins/basicstyles/icons/underline.png
Binary files differ
diff --git a/sources/plugins/basicstyles/lang/af.js b/sources/plugins/basicstyles/lang/af.js
new file mode 100644
index 00000000..bc781641
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/af.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'af', {
6 bold: 'Vet',
7 italic: 'Skuins',
8 strike: 'Deurgestreep',
9 subscript: 'Onderskrif',
10 superscript: 'Bo-skrif',
11 underline: 'Onderstreep'
12} );
diff --git a/sources/plugins/basicstyles/lang/ar.js b/sources/plugins/basicstyles/lang/ar.js
new file mode 100644
index 00000000..cb975e34
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ar.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ar', {
6 bold: 'عريض',
7 italic: 'مائل',
8 strike: 'يتوسطه خط',
9 subscript: 'منخفض',
10 superscript: 'مرتفع',
11 underline: 'تسطير'
12} );
diff --git a/sources/plugins/basicstyles/lang/bg.js b/sources/plugins/basicstyles/lang/bg.js
new file mode 100644
index 00000000..da72e4a5
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/bg.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'bg', {
6 bold: 'Удебелен',
7 italic: 'Наклонен',
8 strike: 'Зачертан текст',
9 subscript: 'Индексиран текст',
10 superscript: 'Суперскрипт',
11 underline: 'Подчертан'
12} );
diff --git a/sources/plugins/basicstyles/lang/bn.js b/sources/plugins/basicstyles/lang/bn.js
new file mode 100644
index 00000000..85992c3b
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/bn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'bn', {
6 bold: 'বোল্ড',
7 italic: 'ইটালিক',
8 strike: 'স্ট্রাইক থ্রু',
9 subscript: 'অধোলেখ',
10 superscript: 'অভিলেখ',
11 underline: 'আন্ডারলাইন'
12} );
diff --git a/sources/plugins/basicstyles/lang/bs.js b/sources/plugins/basicstyles/lang/bs.js
new file mode 100644
index 00000000..5e1c7f24
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/bs.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'bs', {
6 bold: 'Boldiraj',
7 italic: 'Ukosi',
8 strike: 'Precrtaj',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Podvuci'
12} );
diff --git a/sources/plugins/basicstyles/lang/ca.js b/sources/plugins/basicstyles/lang/ca.js
new file mode 100644
index 00000000..3c81cc11
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ca', {
6 bold: 'Negreta',
7 italic: 'Cursiva',
8 strike: 'Ratllat',
9 subscript: 'Subíndex',
10 superscript: 'Superíndex',
11 underline: 'Subratllat'
12} );
diff --git a/sources/plugins/basicstyles/lang/cs.js b/sources/plugins/basicstyles/lang/cs.js
new file mode 100644
index 00000000..73b1267c
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/cs.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'cs', {
6 bold: 'Tučné',
7 italic: 'Kurzíva',
8 strike: 'Přeškrtnuté',
9 subscript: 'Dolní index',
10 superscript: 'Horní index',
11 underline: 'Podtržené'
12} );
diff --git a/sources/plugins/basicstyles/lang/cy.js b/sources/plugins/basicstyles/lang/cy.js
new file mode 100644
index 00000000..e0ac3af3
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/cy.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'cy', {
6 bold: 'Bras',
7 italic: 'Italig',
8 strike: 'Llinell Trwyddo',
9 subscript: 'Is-sgript',
10 superscript: 'Uwchsgript',
11 underline: 'Tanlinellu'
12} );
diff --git a/sources/plugins/basicstyles/lang/da.js b/sources/plugins/basicstyles/lang/da.js
new file mode 100644
index 00000000..e9721830
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/da.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'da', {
6 bold: 'Fed',
7 italic: 'Kursiv',
8 strike: 'Gennemstreget',
9 subscript: 'Sænket skrift',
10 superscript: 'Hævet skrift',
11 underline: 'Understreget'
12} );
diff --git a/sources/plugins/basicstyles/lang/de.js b/sources/plugins/basicstyles/lang/de.js
new file mode 100644
index 00000000..c86554d7
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/de.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'de', {
6 bold: 'Fett',
7 italic: 'Kursiv',
8 strike: 'Durchgestrichen',
9 subscript: 'Tiefgestellt',
10 superscript: 'Hochgestellt',
11 underline: 'Unterstrichen'
12} );
diff --git a/sources/plugins/basicstyles/lang/el.js b/sources/plugins/basicstyles/lang/el.js
new file mode 100644
index 00000000..8cc2faec
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/el.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'el', {
6 bold: 'Έντονη',
7 italic: 'Πλάγια',
8 strike: 'Διακριτή Διαγραφή',
9 subscript: 'Δείκτης',
10 superscript: 'Εκθέτης',
11 underline: 'Υπογράμμιση'
12} );
diff --git a/sources/plugins/basicstyles/lang/en-au.js b/sources/plugins/basicstyles/lang/en-au.js
new file mode 100644
index 00000000..a989ed0f
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/en-au.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'en-au', {
6 bold: 'Bold',
7 italic: 'Italic',
8 strike: 'Strike Through',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Underline'
12} );
diff --git a/sources/plugins/basicstyles/lang/en-ca.js b/sources/plugins/basicstyles/lang/en-ca.js
new file mode 100644
index 00000000..ae09008b
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/en-ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'en-ca', {
6 bold: 'Bold',
7 italic: 'Italic',
8 strike: 'Strike Through',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Underline'
12} );
diff --git a/sources/plugins/basicstyles/lang/en-gb.js b/sources/plugins/basicstyles/lang/en-gb.js
new file mode 100644
index 00000000..c3df8993
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/en-gb.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'en-gb', {
6 bold: 'Bold',
7 italic: 'Italic',
8 strike: 'Strike Through',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Underline'
12} );
diff --git a/sources/plugins/basicstyles/lang/en.js b/sources/plugins/basicstyles/lang/en.js
new file mode 100644
index 00000000..1ccbfb88
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/en.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'en', {
6 bold: 'Bold',
7 italic: 'Italic',
8 strike: 'Strikethrough',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Underline'
12} );
diff --git a/sources/plugins/basicstyles/lang/eo.js b/sources/plugins/basicstyles/lang/eo.js
new file mode 100644
index 00000000..41b8570d
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/eo.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'eo', {
6 bold: 'Grasa',
7 italic: 'Kursiva',
8 strike: 'Trastreko',
9 subscript: 'Suba indico',
10 superscript: 'Supra indico',
11 underline: 'Substreko'
12} );
diff --git a/sources/plugins/basicstyles/lang/es.js b/sources/plugins/basicstyles/lang/es.js
new file mode 100644
index 00000000..196f1d04
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/es.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'es', {
6 bold: 'Negrita',
7 italic: 'Cursiva',
8 strike: 'Tachado',
9 subscript: 'Subíndice',
10 superscript: 'Superíndice',
11 underline: 'Subrayado'
12} );
diff --git a/sources/plugins/basicstyles/lang/et.js b/sources/plugins/basicstyles/lang/et.js
new file mode 100644
index 00000000..9cd8c7a0
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/et.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'et', {
6 bold: 'Paks',
7 italic: 'Kursiiv',
8 strike: 'Läbijoonitud',
9 subscript: 'Allindeks',
10 superscript: 'Ülaindeks',
11 underline: 'Allajoonitud'
12} );
diff --git a/sources/plugins/basicstyles/lang/eu.js b/sources/plugins/basicstyles/lang/eu.js
new file mode 100644
index 00000000..84a2d4e2
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/eu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'eu', {
6 bold: 'Lodia',
7 italic: 'Etzana',
8 strike: 'Marratua',
9 subscript: 'Azpi-indizea',
10 superscript: 'Goi-indizea',
11 underline: 'Azpimarratu'
12} );
diff --git a/sources/plugins/basicstyles/lang/fa.js b/sources/plugins/basicstyles/lang/fa.js
new file mode 100644
index 00000000..8cea19a5
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/fa.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'fa', {
6 bold: 'درشت',
7 italic: 'خمیده',
8 strike: 'خط‌خورده',
9 subscript: 'زیرنویس',
10 superscript: 'بالانویس',
11 underline: 'زیرخط‌دار'
12} );
diff --git a/sources/plugins/basicstyles/lang/fi.js b/sources/plugins/basicstyles/lang/fi.js
new file mode 100644
index 00000000..b011b41f
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/fi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'fi', {
6 bold: 'Lihavoitu',
7 italic: 'Kursivoitu',
8 strike: 'Yliviivattu',
9 subscript: 'Alaindeksi',
10 superscript: 'Yläindeksi',
11 underline: 'Alleviivattu'
12} );
diff --git a/sources/plugins/basicstyles/lang/fo.js b/sources/plugins/basicstyles/lang/fo.js
new file mode 100644
index 00000000..7d293076
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/fo.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'fo', {
6 bold: 'Feit skrift',
7 italic: 'Skráskrift',
8 strike: 'Yvirstrikað',
9 subscript: 'Lækkað skrift',
10 superscript: 'Hækkað skrift',
11 underline: 'Undirstrikað'
12} );
diff --git a/sources/plugins/basicstyles/lang/fr-ca.js b/sources/plugins/basicstyles/lang/fr-ca.js
new file mode 100644
index 00000000..3f82c9af
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/fr-ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'fr-ca', {
6 bold: 'Gras',
7 italic: 'Italique',
8 strike: 'Barré',
9 subscript: 'Indice',
10 superscript: 'Exposant',
11 underline: 'Souligné'
12} );
diff --git a/sources/plugins/basicstyles/lang/fr.js b/sources/plugins/basicstyles/lang/fr.js
new file mode 100644
index 00000000..44349e34
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/fr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'fr', {
6 bold: 'Gras',
7 italic: 'Italique',
8 strike: 'Barré',
9 subscript: 'Indice',
10 superscript: 'Exposant',
11 underline: 'Souligné'
12} );
diff --git a/sources/plugins/basicstyles/lang/gl.js b/sources/plugins/basicstyles/lang/gl.js
new file mode 100644
index 00000000..7e7379a2
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/gl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'gl', {
6 bold: 'Negra',
7 italic: 'Cursiva',
8 strike: 'Riscado',
9 subscript: 'Subíndice',
10 superscript: 'Superíndice',
11 underline: 'Subliñado'
12} );
diff --git a/sources/plugins/basicstyles/lang/gu.js b/sources/plugins/basicstyles/lang/gu.js
new file mode 100644
index 00000000..90619039
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/gu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'gu', {
6 bold: 'બોલ્ડ/સ્પષ્ટ',
7 italic: 'ઇટેલિક, ત્રાંસા',
8 strike: 'છેકી નાખવું',
9 subscript: 'એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન',
10 superscript: 'એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.',
11 underline: 'અન્ડર્લાઇન, નીચે લીટી'
12} );
diff --git a/sources/plugins/basicstyles/lang/he.js b/sources/plugins/basicstyles/lang/he.js
new file mode 100644
index 00000000..e5279b6e
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/he.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'he', {
6 bold: 'מודגש',
7 italic: 'נטוי',
8 strike: 'כתיב מחוק',
9 subscript: 'כתיב תחתון',
10 superscript: 'כתיב עליון',
11 underline: 'קו תחתון'
12} );
diff --git a/sources/plugins/basicstyles/lang/hi.js b/sources/plugins/basicstyles/lang/hi.js
new file mode 100644
index 00000000..daacb67d
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/hi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'hi', {
6 bold: 'बोल्ड',
7 italic: 'इटैलिक',
8 strike: 'स्ट्राइक थ्रू',
9 subscript: 'अधोलेख',
10 superscript: 'अभिलेख',
11 underline: 'रेखांकण'
12} );
diff --git a/sources/plugins/basicstyles/lang/hr.js b/sources/plugins/basicstyles/lang/hr.js
new file mode 100644
index 00000000..d3f16468
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/hr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'hr', {
6 bold: 'Podebljaj',
7 italic: 'Ukosi',
8 strike: 'Precrtano',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Potcrtano'
12} );
diff --git a/sources/plugins/basicstyles/lang/hu.js b/sources/plugins/basicstyles/lang/hu.js
new file mode 100644
index 00000000..9d18d3b4
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/hu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'hu', {
6 bold: 'Félkövér',
7 italic: 'Dőlt',
8 strike: 'Áthúzott',
9 subscript: 'Alsó index',
10 superscript: 'Felső index',
11 underline: 'Aláhúzott'
12} );
diff --git a/sources/plugins/basicstyles/lang/id.js b/sources/plugins/basicstyles/lang/id.js
new file mode 100644
index 00000000..146b1a78
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/id.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'id', {
6 bold: 'Huruf Tebal',
7 italic: 'Huruf Miring',
8 strike: 'Strikethrough', // MISSING
9 subscript: 'Subscript', // MISSING
10 superscript: 'Superscript', // MISSING
11 underline: 'Garis Bawah'
12} );
diff --git a/sources/plugins/basicstyles/lang/is.js b/sources/plugins/basicstyles/lang/is.js
new file mode 100644
index 00000000..ccef9cd3
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/is.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'is', {
6 bold: 'Feitletrað',
7 italic: 'Skáletrað',
8 strike: 'Yfirstrikað',
9 subscript: 'Niðurskrifað',
10 superscript: 'Uppskrifað',
11 underline: 'Undirstrikað'
12} );
diff --git a/sources/plugins/basicstyles/lang/it.js b/sources/plugins/basicstyles/lang/it.js
new file mode 100644
index 00000000..d3f02488
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/it.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'it', {
6 bold: 'Grassetto',
7 italic: 'Corsivo',
8 strike: 'Barrato',
9 subscript: 'Pedice',
10 superscript: 'Apice',
11 underline: 'Sottolineato'
12} );
diff --git a/sources/plugins/basicstyles/lang/ja.js b/sources/plugins/basicstyles/lang/ja.js
new file mode 100644
index 00000000..38c0a0a4
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ja.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ja', {
6 bold: '太字',
7 italic: '斜体',
8 strike: '打ち消し線',
9 subscript: '下付き',
10 superscript: '上付き',
11 underline: '下線'
12} );
diff --git a/sources/plugins/basicstyles/lang/ka.js b/sources/plugins/basicstyles/lang/ka.js
new file mode 100644
index 00000000..70c1bc38
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ka.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ka', {
6 bold: 'მსხვილი',
7 italic: 'დახრილი',
8 strike: 'გადახაზული',
9 subscript: 'ინდექსი',
10 superscript: 'ხარისხი',
11 underline: 'გახაზული'
12} );
diff --git a/sources/plugins/basicstyles/lang/km.js b/sources/plugins/basicstyles/lang/km.js
new file mode 100644
index 00000000..29d87369
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/km.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'km', {
6 bold: 'ដិត',
7 italic: 'ទ្រេត',
8 strike: 'គូស​បន្ទាត់​ចំ​កណ្ដាល',
9 subscript: 'អក្សរតូចក្រោម',
10 superscript: 'អក្សរតូចលើ',
11 underline: 'គូស​បន្ទាត់​ក្រោម'
12} );
diff --git a/sources/plugins/basicstyles/lang/ko.js b/sources/plugins/basicstyles/lang/ko.js
new file mode 100644
index 00000000..53c2be18
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ko.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ko', {
6 bold: '굵게',
7 italic: '기울임꼴',
8 strike: '취소선',
9 subscript: '아래 첨자',
10 superscript: '위 첨자',
11 underline: '밑줄'
12} );
diff --git a/sources/plugins/basicstyles/lang/ku.js b/sources/plugins/basicstyles/lang/ku.js
new file mode 100644
index 00000000..6dc67666
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ku.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ku', {
6 bold: 'قەڵەو',
7 italic: 'لار',
8 strike: 'لێدان',
9 subscript: 'ژێرنووس',
10 superscript: 'سەرنووس',
11 underline: 'ژێرهێڵ'
12} );
diff --git a/sources/plugins/basicstyles/lang/lt.js b/sources/plugins/basicstyles/lang/lt.js
new file mode 100644
index 00000000..c42a74aa
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/lt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'lt', {
6 bold: 'Pusjuodis',
7 italic: 'Kursyvas',
8 strike: 'Perbrauktas',
9 subscript: 'Apatinis indeksas',
10 superscript: 'Viršutinis indeksas',
11 underline: 'Pabrauktas'
12} );
diff --git a/sources/plugins/basicstyles/lang/lv.js b/sources/plugins/basicstyles/lang/lv.js
new file mode 100644
index 00000000..227953ae
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/lv.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'lv', {
6 bold: 'Treknināts',
7 italic: 'Kursīvs',
8 strike: 'Pārsvītrots',
9 subscript: 'Apakšrakstā',
10 superscript: 'Augšrakstā',
11 underline: 'Pasvītrots'
12} );
diff --git a/sources/plugins/basicstyles/lang/mk.js b/sources/plugins/basicstyles/lang/mk.js
new file mode 100644
index 00000000..a70ec268
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/mk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'mk', {
6 bold: 'Bold', // MISSING
7 italic: 'Italic', // MISSING
8 strike: 'Strikethrough', // MISSING
9 subscript: 'Subscript', // MISSING
10 superscript: 'Superscript', // MISSING
11 underline: 'Underline' // MISSING
12} );
diff --git a/sources/plugins/basicstyles/lang/mn.js b/sources/plugins/basicstyles/lang/mn.js
new file mode 100644
index 00000000..262cf104
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/mn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'mn', {
6 bold: 'Тод бүдүүн',
7 italic: 'Налуу',
8 strike: 'Дундуур нь зураастай болгох',
9 subscript: 'Суурь болгох',
10 superscript: 'Зэрэг болгох',
11 underline: 'Доогуур нь зураастай болгох'
12} );
diff --git a/sources/plugins/basicstyles/lang/ms.js b/sources/plugins/basicstyles/lang/ms.js
new file mode 100644
index 00000000..114b8e55
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ms.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ms', {
6 bold: 'Bold',
7 italic: 'Italic',
8 strike: 'Strike Through',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Underline'
12} );
diff --git a/sources/plugins/basicstyles/lang/nb.js b/sources/plugins/basicstyles/lang/nb.js
new file mode 100644
index 00000000..460de348
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/nb.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'nb', {
6 bold: 'Fet',
7 italic: 'Kursiv',
8 strike: 'Gjennomstreking',
9 subscript: 'Senket skrift',
10 superscript: 'Hevet skrift',
11 underline: 'Understreking'
12} );
diff --git a/sources/plugins/basicstyles/lang/nl.js b/sources/plugins/basicstyles/lang/nl.js
new file mode 100644
index 00000000..43a6aa69
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/nl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'nl', {
6 bold: 'Vet',
7 italic: 'Cursief',
8 strike: 'Doorhalen',
9 subscript: 'Subscript',
10 superscript: 'Superscript',
11 underline: 'Onderstrepen'
12} );
diff --git a/sources/plugins/basicstyles/lang/no.js b/sources/plugins/basicstyles/lang/no.js
new file mode 100644
index 00000000..753d90a3
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/no.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'no', {
6 bold: 'Fet',
7 italic: 'Kursiv',
8 strike: 'Gjennomstreking',
9 subscript: 'Senket skrift',
10 superscript: 'Hevet skrift',
11 underline: 'Understreking'
12} );
diff --git a/sources/plugins/basicstyles/lang/pl.js b/sources/plugins/basicstyles/lang/pl.js
new file mode 100644
index 00000000..256630d5
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/pl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'pl', {
6 bold: 'Pogrubienie',
7 italic: 'Kursywa',
8 strike: 'Przekreślenie',
9 subscript: 'Indeks dolny',
10 superscript: 'Indeks górny',
11 underline: 'Podkreślenie'
12} );
diff --git a/sources/plugins/basicstyles/lang/pt-br.js b/sources/plugins/basicstyles/lang/pt-br.js
new file mode 100644
index 00000000..655c5971
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/pt-br.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'pt-br', {
6 bold: 'Negrito',
7 italic: 'Itálico',
8 strike: 'Tachado',
9 subscript: 'Subscrito',
10 superscript: 'Sobrescrito',
11 underline: 'Sublinhado'
12} );
diff --git a/sources/plugins/basicstyles/lang/pt.js b/sources/plugins/basicstyles/lang/pt.js
new file mode 100644
index 00000000..c25ceb2e
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/pt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'pt', {
6 bold: 'Negrito',
7 italic: 'Itálico',
8 strike: 'Rasurado',
9 subscript: 'Superior à linha',
10 superscript: 'Inferior à Linha',
11 underline: 'Sublinhado'
12} );
diff --git a/sources/plugins/basicstyles/lang/ro.js b/sources/plugins/basicstyles/lang/ro.js
new file mode 100644
index 00000000..59c2483d
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ro.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ro', {
6 bold: 'Îngroşat (bold)',
7 italic: 'Înclinat (italic)',
8 strike: 'Tăiat (strike through)',
9 subscript: 'Indice (subscript)',
10 superscript: 'Putere (superscript)',
11 underline: 'Subliniat (underline)'
12} );
diff --git a/sources/plugins/basicstyles/lang/ru.js b/sources/plugins/basicstyles/lang/ru.js
new file mode 100644
index 00000000..f87bea18
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ru.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ru', {
6 bold: 'Полужирный',
7 italic: 'Курсив',
8 strike: 'Зачеркнутый',
9 subscript: 'Подстрочный индекс',
10 superscript: 'Надстрочный индекс',
11 underline: 'Подчеркнутый'
12} );
diff --git a/sources/plugins/basicstyles/lang/si.js b/sources/plugins/basicstyles/lang/si.js
new file mode 100644
index 00000000..8f7db5da
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/si.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'si', {
6 bold: 'තද අකුරින් ලියනලද',
7 italic: 'බැධීඅකුරින් ලියන ලද',
8 strike: 'Strikethrough', // MISSING
9 subscript: 'Subscript', // MISSING
10 superscript: 'Superscript', // MISSING
11 underline: 'යටින් ඉරි අදින ලද'
12} );
diff --git a/sources/plugins/basicstyles/lang/sk.js b/sources/plugins/basicstyles/lang/sk.js
new file mode 100644
index 00000000..5d038c6d
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/sk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'sk', {
6 bold: 'Tučné',
7 italic: 'Kurzíva',
8 strike: 'Prečiarknuté',
9 subscript: 'Dolný index',
10 superscript: 'Horný index',
11 underline: 'Podčiarknuté'
12} );
diff --git a/sources/plugins/basicstyles/lang/sl.js b/sources/plugins/basicstyles/lang/sl.js
new file mode 100644
index 00000000..1397a700
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/sl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'sl', {
6 bold: 'Krepko',
7 italic: 'Ležeče',
8 strike: 'Prečrtano',
9 subscript: 'Podpisano',
10 superscript: 'Nadpisano',
11 underline: 'Podčrtano'
12} );
diff --git a/sources/plugins/basicstyles/lang/sq.js b/sources/plugins/basicstyles/lang/sq.js
new file mode 100644
index 00000000..82242b26
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/sq.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'sq', {
6 bold: 'Trash',
7 italic: 'Pjerrët',
8 strike: 'Nëpërmes',
9 subscript: 'Nën-skriptë',
10 superscript: 'Super-skriptë',
11 underline: 'Nënvijëzuar'
12} );
diff --git a/sources/plugins/basicstyles/lang/sr-latn.js b/sources/plugins/basicstyles/lang/sr-latn.js
new file mode 100644
index 00000000..62f51edd
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/sr-latn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'sr-latn', {
6 bold: 'Podebljano',
7 italic: 'Kurziv',
8 strike: 'Precrtano',
9 subscript: 'Indeks',
10 superscript: 'Stepen',
11 underline: 'Podvučeno'
12} );
diff --git a/sources/plugins/basicstyles/lang/sr.js b/sources/plugins/basicstyles/lang/sr.js
new file mode 100644
index 00000000..59e6105b
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/sr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'sr', {
6 bold: 'Подебљано',
7 italic: 'Курзив',
8 strike: 'Прецртано',
9 subscript: 'Индекс',
10 superscript: 'Степен',
11 underline: 'Подвучено'
12} );
diff --git a/sources/plugins/basicstyles/lang/sv.js b/sources/plugins/basicstyles/lang/sv.js
new file mode 100644
index 00000000..afcbf3ff
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/sv.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'sv', {
6 bold: 'Fet',
7 italic: 'Kursiv',
8 strike: 'Genomstruken',
9 subscript: 'Nedsänkta tecken',
10 superscript: 'Upphöjda tecken',
11 underline: 'Understruken'
12} );
diff --git a/sources/plugins/basicstyles/lang/th.js b/sources/plugins/basicstyles/lang/th.js
new file mode 100644
index 00000000..61700f54
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/th.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'th', {
6 bold: 'ตัวหนา',
7 italic: 'ตัวเอียง',
8 strike: 'ตัวขีดเส้นทับ',
9 subscript: 'ตัวห้อย',
10 superscript: 'ตัวยก',
11 underline: 'ตัวขีดเส้นใต้'
12} );
diff --git a/sources/plugins/basicstyles/lang/tr.js b/sources/plugins/basicstyles/lang/tr.js
new file mode 100644
index 00000000..0e226b89
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/tr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'tr', {
6 bold: 'Kalın',
7 italic: 'İtalik',
8 strike: 'Üstü Çizgili',
9 subscript: 'Alt Simge',
10 superscript: 'Üst Simge',
11 underline: 'Altı Çizgili'
12} );
diff --git a/sources/plugins/basicstyles/lang/tt.js b/sources/plugins/basicstyles/lang/tt.js
new file mode 100644
index 00000000..6c4eb03f
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/tt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'tt', {
6 bold: 'Калын',
7 italic: 'Курсив',
8 strike: 'Сызылган',
9 subscript: 'Аскы индекс',
10 superscript: 'Өске индекс',
11 underline: 'Астына сызылган'
12} );
diff --git a/sources/plugins/basicstyles/lang/ug.js b/sources/plugins/basicstyles/lang/ug.js
new file mode 100644
index 00000000..10d42cdd
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/ug.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'ug', {
6 bold: 'توم',
7 italic: 'يانتۇ',
8 strike: 'ئۆچۈرۈش سىزىقى',
9 subscript: 'تۆۋەن ئىندېكس',
10 superscript: 'يۇقىرى ئىندېكس',
11 underline: 'ئاستى سىزىق'
12} );
diff --git a/sources/plugins/basicstyles/lang/uk.js b/sources/plugins/basicstyles/lang/uk.js
new file mode 100644
index 00000000..7d5d84d9
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/uk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'uk', {
6 bold: 'Жирний',
7 italic: 'Курсив',
8 strike: 'Закреслений',
9 subscript: 'Нижній індекс',
10 superscript: 'Верхній індекс',
11 underline: 'Підкреслений'
12} );
diff --git a/sources/plugins/basicstyles/lang/vi.js b/sources/plugins/basicstyles/lang/vi.js
new file mode 100644
index 00000000..cc1dfaac
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/vi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'vi', {
6 bold: 'Đậm',
7 italic: 'Nghiêng',
8 strike: 'Gạch xuyên ngang',
9 subscript: 'Chỉ số dưới',
10 superscript: 'Chỉ số trên',
11 underline: 'Gạch chân'
12} );
diff --git a/sources/plugins/basicstyles/lang/zh-cn.js b/sources/plugins/basicstyles/lang/zh-cn.js
new file mode 100644
index 00000000..538c36d2
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/zh-cn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'zh-cn', {
6 bold: '加粗',
7 italic: '倾斜',
8 strike: '删除线',
9 subscript: '下标',
10 superscript: '上标',
11 underline: '下划线'
12} );
diff --git a/sources/plugins/basicstyles/lang/zh.js b/sources/plugins/basicstyles/lang/zh.js
new file mode 100644
index 00000000..c73c4d3f
--- /dev/null
+++ b/sources/plugins/basicstyles/lang/zh.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'basicstyles', 'zh', {
6 bold: '粗體',
7 italic: '斜體',
8 strike: '刪除線',
9 subscript: '下標',
10 superscript: '上標',
11 underline: '底線'
12} );
diff --git a/sources/plugins/basicstyles/plugin.js b/sources/plugins/basicstyles/plugin.js
new file mode 100644
index 00000000..3fa96373
--- /dev/null
+++ b/sources/plugins/basicstyles/plugin.js
@@ -0,0 +1,209 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'basicstyles', {
7 // jscs:disable maximumLineLength
8 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
9 // jscs:enable maximumLineLength
10 icons: 'bold,italic,underline,strike,subscript,superscript', // %REMOVE_LINE_CORE%
11 hidpi: true, // %REMOVE_LINE_CORE%
12 init: function( editor ) {
13 var order = 0;
14 // All buttons use the same code to register. So, to avoid
15 // duplications, let's use this tool function.
16 var addButtonCommand = function( buttonName, buttonLabel, commandName, styleDefiniton ) {
17 // Disable the command if no definition is configured.
18 if ( !styleDefiniton )
19 return;
20
21 var style = new CKEDITOR.style( styleDefiniton ),
22 forms = contentForms[ commandName ];
23
24 // Put the style as the most important form.
25 forms.unshift( style );
26
27 // Listen to contextual style activation.
28 editor.attachStyleStateChange( style, function( state ) {
29 !editor.readOnly && editor.getCommand( commandName ).setState( state );
30 } );
31
32 // Create the command that can be used to apply the style.
33 editor.addCommand( commandName, new CKEDITOR.styleCommand( style, {
34 contentForms: forms
35 } ) );
36
37 // Register the button, if the button plugin is loaded.
38 if ( editor.ui.addButton ) {
39 editor.ui.addButton( buttonName, {
40 label: buttonLabel,
41 command: commandName,
42 toolbar: 'basicstyles,' + ( order += 10 )
43 } );
44 }
45 };
46
47 var contentForms = {
48 bold: [
49 'strong',
50 'b',
51 [ 'span', function( el ) {
52 var fw = el.styles[ 'font-weight' ];
53 return fw == 'bold' || +fw >= 700;
54 } ]
55 ],
56
57 italic: [
58 'em',
59 'i',
60 [ 'span', function( el ) {
61 return el.styles[ 'font-style' ] == 'italic';
62 } ]
63 ],
64
65 underline: [
66 'u',
67 [ 'span', function( el ) {
68 return el.styles[ 'text-decoration' ] == 'underline';
69 } ]
70 ],
71
72 strike: [
73 's',
74 'strike',
75 [ 'span', function( el ) {
76 return el.styles[ 'text-decoration' ] == 'line-through';
77 } ]
78 ],
79
80 subscript: [
81 'sub'
82 ],
83
84 superscript: [
85 'sup'
86 ]
87 },
88 config = editor.config,
89 lang = editor.lang.basicstyles;
90
91 addButtonCommand( 'Bold', lang.bold, 'bold', config.coreStyles_bold );
92 addButtonCommand( 'Italic', lang.italic, 'italic', config.coreStyles_italic );
93 addButtonCommand( 'Underline', lang.underline, 'underline', config.coreStyles_underline );
94 addButtonCommand( 'Strike', lang.strike, 'strike', config.coreStyles_strike );
95 addButtonCommand( 'Subscript', lang.subscript, 'subscript', config.coreStyles_subscript );
96 addButtonCommand( 'Superscript', lang.superscript, 'superscript', config.coreStyles_superscript );
97
98 editor.setKeystroke( [
99 [ CKEDITOR.CTRL + 66 /*B*/, 'bold' ],
100 [ CKEDITOR.CTRL + 73 /*I*/, 'italic' ],
101 [ CKEDITOR.CTRL + 85 /*U*/, 'underline' ]
102 ] );
103 }
104} );
105
106// Basic Inline Styles.
107
108/**
109 * The style definition that applies the **bold** style to the text.
110 *
111 * Read more in the [documentation](#!/guide/dev_basicstyles)
112 * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html).
113 *
114 * config.coreStyles_bold = { element: 'b', overrides: 'strong' };
115 *
116 * config.coreStyles_bold = {
117 * element: 'span',
118 * attributes: { 'class': 'Bold' }
119 * };
120 *
121 * @cfg
122 * @member CKEDITOR.config
123 */
124CKEDITOR.config.coreStyles_bold = { element: 'strong', overrides: 'b' };
125
126/**
127 * The style definition that applies the *italics* style to the text.
128 *
129 * Read more in the [documentation](#!/guide/dev_basicstyles)
130 * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html).
131 *
132 * config.coreStyles_italic = { element: 'i', overrides: 'em' };
133 *
134 * CKEDITOR.config.coreStyles_italic = {
135 * element: 'span',
136 * attributes: { 'class': 'Italic' }
137 * };
138 *
139 * @cfg
140 * @member CKEDITOR.config
141 */
142CKEDITOR.config.coreStyles_italic = { element: 'em', overrides: 'i' };
143
144/**
145 * The style definition that applies the <u>underline</u> style to the text.
146 *
147 * Read more in the [documentation](#!/guide/dev_basicstyles)
148 * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html).
149 *
150 * CKEDITOR.config.coreStyles_underline = {
151 * element: 'span',
152 * attributes: { 'class': 'Underline' }
153 * };
154 *
155 * @cfg
156 * @member CKEDITOR.config
157 */
158CKEDITOR.config.coreStyles_underline = { element: 'u' };
159
160/**
161 * The style definition that applies the <strike>strikethrough</strike> style to the text.
162 *
163 * Read more in the [documentation](#!/guide/dev_basicstyles)
164 * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html).
165 *
166 * CKEDITOR.config.coreStyles_strike = {
167 * element: 'span',
168 * attributes: { 'class': 'Strikethrough' },
169 * overrides: 'strike'
170 * };
171 *
172 * @cfg
173 * @member CKEDITOR.config
174 */
175CKEDITOR.config.coreStyles_strike = { element: 's', overrides: 'strike' };
176
177/**
178 * The style definition that applies the subscript style to the text.
179 *
180 * Read more in the [documentation](#!/guide/dev_basicstyles)
181 * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html).
182 *
183 * CKEDITOR.config.coreStyles_subscript = {
184 * element: 'span',
185 * attributes: { 'class': 'Subscript' },
186 * overrides: 'sub'
187 * };
188 *
189 * @cfg
190 * @member CKEDITOR.config
191 */
192CKEDITOR.config.coreStyles_subscript = { element: 'sub' };
193
194/**
195 * The style definition that applies the superscript style to the text.
196 *
197 * Read more in the [documentation](#!/guide/dev_basicstyles)
198 * and see the [SDK sample](http://sdk.ckeditor.com/samples/basicstyles.html).
199 *
200 * CKEDITOR.config.coreStyles_superscript = {
201 * element: 'span',
202 * attributes: { 'class': 'Superscript' },
203 * overrides: 'sup'
204 * };
205 *
206 * @cfg
207 * @member CKEDITOR.config
208 */
209CKEDITOR.config.coreStyles_superscript = { element: 'sup' };
diff --git a/sources/plugins/bidi/icons/bidiltr.png b/sources/plugins/bidi/icons/bidiltr.png
new file mode 100644
index 00000000..a909c010
--- /dev/null
+++ b/sources/plugins/bidi/icons/bidiltr.png
Binary files differ
diff --git a/sources/plugins/bidi/icons/bidirtl.png b/sources/plugins/bidi/icons/bidirtl.png
new file mode 100644
index 00000000..7dbad48c
--- /dev/null
+++ b/sources/plugins/bidi/icons/bidirtl.png
Binary files differ
diff --git a/sources/plugins/bidi/icons/hidpi/bidiltr.png b/sources/plugins/bidi/icons/hidpi/bidiltr.png
new file mode 100644
index 00000000..c5998e00
--- /dev/null
+++ b/sources/plugins/bidi/icons/hidpi/bidiltr.png
Binary files differ
diff --git a/sources/plugins/bidi/icons/hidpi/bidirtl.png b/sources/plugins/bidi/icons/hidpi/bidirtl.png
new file mode 100644
index 00000000..8aa2adc8
--- /dev/null
+++ b/sources/plugins/bidi/icons/hidpi/bidirtl.png
Binary files differ
diff --git a/sources/plugins/bidi/lang/af.js b/sources/plugins/bidi/lang/af.js
new file mode 100644
index 00000000..048140a1
--- /dev/null
+++ b/sources/plugins/bidi/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'af', {
6 ltr: 'Skryfrigting van links na regs',
7 rtl: 'Skryfrigting van regs na links'
8} );
diff --git a/sources/plugins/bidi/lang/ar.js b/sources/plugins/bidi/lang/ar.js
new file mode 100644
index 00000000..78297ecb
--- /dev/null
+++ b/sources/plugins/bidi/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ar', {
6 ltr: 'إتجاه النص من اليسار إلى اليمين',
7 rtl: 'إتجاه النص من اليمين إلى اليسار'
8} );
diff --git a/sources/plugins/bidi/lang/bg.js b/sources/plugins/bidi/lang/bg.js
new file mode 100644
index 00000000..b81ab861
--- /dev/null
+++ b/sources/plugins/bidi/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'bg', {
6 ltr: 'Посока на текста от ляво на дясно',
7 rtl: 'Посока на текста от дясно на ляво'
8} );
diff --git a/sources/plugins/bidi/lang/bn.js b/sources/plugins/bidi/lang/bn.js
new file mode 100644
index 00000000..2c35288e
--- /dev/null
+++ b/sources/plugins/bidi/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'bn', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/bs.js b/sources/plugins/bidi/lang/bs.js
new file mode 100644
index 00000000..13f8ac49
--- /dev/null
+++ b/sources/plugins/bidi/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'bs', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/ca.js b/sources/plugins/bidi/lang/ca.js
new file mode 100644
index 00000000..801a18f4
--- /dev/null
+++ b/sources/plugins/bidi/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ca', {
6 ltr: 'Direcció del text d\'esquerra a dreta',
7 rtl: 'Direcció del text de dreta a esquerra'
8} );
diff --git a/sources/plugins/bidi/lang/cs.js b/sources/plugins/bidi/lang/cs.js
new file mode 100644
index 00000000..b0852c0a
--- /dev/null
+++ b/sources/plugins/bidi/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'cs', {
6 ltr: 'Směr textu zleva doprava',
7 rtl: 'Směr textu zprava doleva'
8} );
diff --git a/sources/plugins/bidi/lang/cy.js b/sources/plugins/bidi/lang/cy.js
new file mode 100644
index 00000000..17e9d3bb
--- /dev/null
+++ b/sources/plugins/bidi/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'cy', {
6 ltr: 'Cyfeiriad testun o\'r chwith i\'r dde',
7 rtl: 'Cyfeiriad testun o\'r dde i\'r chwith'
8} );
diff --git a/sources/plugins/bidi/lang/da.js b/sources/plugins/bidi/lang/da.js
new file mode 100644
index 00000000..a53fbf7b
--- /dev/null
+++ b/sources/plugins/bidi/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'da', {
6 ltr: 'Tekstretning fra venstre til højre',
7 rtl: 'Tekstretning fra højre til venstre'
8} );
diff --git a/sources/plugins/bidi/lang/de.js b/sources/plugins/bidi/lang/de.js
new file mode 100644
index 00000000..043fbc8b
--- /dev/null
+++ b/sources/plugins/bidi/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'de', {
6 ltr: 'Leserichtung von Links nach Rechts',
7 rtl: 'Leserichtung von Rechts nach Links'
8} );
diff --git a/sources/plugins/bidi/lang/el.js b/sources/plugins/bidi/lang/el.js
new file mode 100644
index 00000000..7c38e8d7
--- /dev/null
+++ b/sources/plugins/bidi/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'el', {
6 ltr: 'Διεύθυνση κειμένου από αριστερά στα δεξιά',
7 rtl: 'Διεύθυνση κειμένου από δεξιά στα αριστερά'
8} );
diff --git a/sources/plugins/bidi/lang/en-au.js b/sources/plugins/bidi/lang/en-au.js
new file mode 100644
index 00000000..a5fe457e
--- /dev/null
+++ b/sources/plugins/bidi/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'en-au', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/en-ca.js b/sources/plugins/bidi/lang/en-ca.js
new file mode 100644
index 00000000..8424bf67
--- /dev/null
+++ b/sources/plugins/bidi/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'en-ca', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/en-gb.js b/sources/plugins/bidi/lang/en-gb.js
new file mode 100644
index 00000000..60c192fb
--- /dev/null
+++ b/sources/plugins/bidi/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'en-gb', {
6 ltr: 'Text direction from left to right',
7 rtl: 'Text direction from right to left'
8} );
diff --git a/sources/plugins/bidi/lang/en.js b/sources/plugins/bidi/lang/en.js
new file mode 100644
index 00000000..a685a87d
--- /dev/null
+++ b/sources/plugins/bidi/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'en', {
6 ltr: 'Text direction from left to right',
7 rtl: 'Text direction from right to left'
8} );
diff --git a/sources/plugins/bidi/lang/eo.js b/sources/plugins/bidi/lang/eo.js
new file mode 100644
index 00000000..c63e15bb
--- /dev/null
+++ b/sources/plugins/bidi/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'eo', {
6 ltr: 'Tekstdirekto de maldekstre dekstren',
7 rtl: 'Tekstdirekto de dekstre maldekstren'
8} );
diff --git a/sources/plugins/bidi/lang/es.js b/sources/plugins/bidi/lang/es.js
new file mode 100644
index 00000000..6ea13209
--- /dev/null
+++ b/sources/plugins/bidi/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'es', {
6 ltr: 'Dirección del texto de izquierda a derecha',
7 rtl: 'Dirección del texto de derecha a izquierda'
8} );
diff --git a/sources/plugins/bidi/lang/et.js b/sources/plugins/bidi/lang/et.js
new file mode 100644
index 00000000..4f8517d6
--- /dev/null
+++ b/sources/plugins/bidi/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'et', {
6 ltr: 'Teksti suund vasakult paremale',
7 rtl: 'Teksti suund paremalt vasakule'
8} );
diff --git a/sources/plugins/bidi/lang/eu.js b/sources/plugins/bidi/lang/eu.js
new file mode 100644
index 00000000..8b46a9c4
--- /dev/null
+++ b/sources/plugins/bidi/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'eu', {
6 ltr: 'Testuaren norantza ezkerretik eskuinera',
7 rtl: 'Testuaren norantza eskuinetik ezkerrera'
8} );
diff --git a/sources/plugins/bidi/lang/fa.js b/sources/plugins/bidi/lang/fa.js
new file mode 100644
index 00000000..5d9a6eac
--- /dev/null
+++ b/sources/plugins/bidi/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'fa', {
6 ltr: 'جهت متن از چپ به راست',
7 rtl: 'جهت متن از راست به چپ'
8} );
diff --git a/sources/plugins/bidi/lang/fi.js b/sources/plugins/bidi/lang/fi.js
new file mode 100644
index 00000000..805f5b10
--- /dev/null
+++ b/sources/plugins/bidi/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'fi', {
6 ltr: 'Tekstin suunta vasemmalta oikealle',
7 rtl: 'Tekstin suunta oikealta vasemmalle'
8} );
diff --git a/sources/plugins/bidi/lang/fo.js b/sources/plugins/bidi/lang/fo.js
new file mode 100644
index 00000000..4e1c9408
--- /dev/null
+++ b/sources/plugins/bidi/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'fo', {
6 ltr: 'Tekstkós frá vinstru til høgru',
7 rtl: 'Tekstkós frá høgru til vinstru'
8} );
diff --git a/sources/plugins/bidi/lang/fr-ca.js b/sources/plugins/bidi/lang/fr-ca.js
new file mode 100644
index 00000000..184ed8ef
--- /dev/null
+++ b/sources/plugins/bidi/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'fr-ca', {
6 ltr: 'Direction du texte de gauche à droite',
7 rtl: 'Direction du texte de droite à gauche'
8} );
diff --git a/sources/plugins/bidi/lang/fr.js b/sources/plugins/bidi/lang/fr.js
new file mode 100644
index 00000000..549a465d
--- /dev/null
+++ b/sources/plugins/bidi/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'fr', {
6 ltr: 'Direction du texte de la gauche vers la droite',
7 rtl: 'Direction du texte de la droite vers la gauche'
8} );
diff --git a/sources/plugins/bidi/lang/gl.js b/sources/plugins/bidi/lang/gl.js
new file mode 100644
index 00000000..cb753e3f
--- /dev/null
+++ b/sources/plugins/bidi/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'gl', {
6 ltr: 'Dirección do texto de esquerda a dereita',
7 rtl: 'Dirección do texto de dereita a esquerda'
8} );
diff --git a/sources/plugins/bidi/lang/gu.js b/sources/plugins/bidi/lang/gu.js
new file mode 100644
index 00000000..a75d98a8
--- /dev/null
+++ b/sources/plugins/bidi/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'gu', {
6 ltr: 'ટેક્ષ્ત્ ની દિશા ડાબે થી જમણે',
7 rtl: 'ટેક્ષ્ત્ ની દિશા જમણે થી ડાબે'
8} );
diff --git a/sources/plugins/bidi/lang/he.js b/sources/plugins/bidi/lang/he.js
new file mode 100644
index 00000000..89840cd9
--- /dev/null
+++ b/sources/plugins/bidi/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'he', {
6 ltr: 'כיוון טקסט משמאל לימין (LTR)',
7 rtl: 'כיוון טקסט מימין לשמאל (RTL)'
8} );
diff --git a/sources/plugins/bidi/lang/hi.js b/sources/plugins/bidi/lang/hi.js
new file mode 100644
index 00000000..66697cc8
--- /dev/null
+++ b/sources/plugins/bidi/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'hi', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/hr.js b/sources/plugins/bidi/lang/hr.js
new file mode 100644
index 00000000..0be7b34c
--- /dev/null
+++ b/sources/plugins/bidi/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'hr', {
6 ltr: 'Smjer teksta s lijeva na desno',
7 rtl: 'Smjer teksta s desna na lijevo'
8} );
diff --git a/sources/plugins/bidi/lang/hu.js b/sources/plugins/bidi/lang/hu.js
new file mode 100644
index 00000000..58797e5d
--- /dev/null
+++ b/sources/plugins/bidi/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'hu', {
6 ltr: 'Szöveg iránya balról jobbra',
7 rtl: 'Szöveg iránya jobbról balra'
8} );
diff --git a/sources/plugins/bidi/lang/id.js b/sources/plugins/bidi/lang/id.js
new file mode 100644
index 00000000..2be45ac8
--- /dev/null
+++ b/sources/plugins/bidi/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'id', {
6 ltr: 'Arah penulisan dari kiri ke kanan.',
7 rtl: 'Arah penulisan dari kanan ke kiri.'
8} );
diff --git a/sources/plugins/bidi/lang/is.js b/sources/plugins/bidi/lang/is.js
new file mode 100644
index 00000000..cd41df26
--- /dev/null
+++ b/sources/plugins/bidi/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'is', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/it.js b/sources/plugins/bidi/lang/it.js
new file mode 100644
index 00000000..d4e9de6a
--- /dev/null
+++ b/sources/plugins/bidi/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'it', {
6 ltr: 'Direzione del testo da sinistra verso destra',
7 rtl: 'Direzione del testo da destra verso sinistra'
8} );
diff --git a/sources/plugins/bidi/lang/ja.js b/sources/plugins/bidi/lang/ja.js
new file mode 100644
index 00000000..c79e1b64
--- /dev/null
+++ b/sources/plugins/bidi/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ja', {
6 ltr: 'テキストの向き : 左から右へ',
7 rtl: 'テキストの向き : 右から左へ'
8} );
diff --git a/sources/plugins/bidi/lang/ka.js b/sources/plugins/bidi/lang/ka.js
new file mode 100644
index 00000000..cf731816
--- /dev/null
+++ b/sources/plugins/bidi/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ka', {
6 ltr: 'ტექსტის მიმართულება მარცხნიდან მარჯვნივ',
7 rtl: 'ტექსტის მიმართულება მარჯვნიდან მარცხნივ'
8} );
diff --git a/sources/plugins/bidi/lang/km.js b/sources/plugins/bidi/lang/km.js
new file mode 100644
index 00000000..b28d330a
--- /dev/null
+++ b/sources/plugins/bidi/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'km', {
6 ltr: 'ទិស​ដៅ​អក្សរ​ពី​ឆ្វេង​ទៅ​ស្ដាំ',
7 rtl: 'ទិស​ដៅ​អក្សរ​ពី​ស្ដាំ​ទៅ​ឆ្វេង'
8} );
diff --git a/sources/plugins/bidi/lang/ko.js b/sources/plugins/bidi/lang/ko.js
new file mode 100644
index 00000000..923f70ce
--- /dev/null
+++ b/sources/plugins/bidi/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ko', {
6 ltr: '텍스트 방향이 왼쪽에서 오른쪽으로 ',
7 rtl: '텍스트 방향이 오른쪽에서 왼쪽으로'
8} );
diff --git a/sources/plugins/bidi/lang/ku.js b/sources/plugins/bidi/lang/ku.js
new file mode 100644
index 00000000..0d563c76
--- /dev/null
+++ b/sources/plugins/bidi/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ku', {
6 ltr: 'ئاراستەی نووسە لە چەپ بۆ ڕاست',
7 rtl: 'ئاراستەی نووسە لە ڕاست بۆ چەپ'
8} );
diff --git a/sources/plugins/bidi/lang/lt.js b/sources/plugins/bidi/lang/lt.js
new file mode 100644
index 00000000..e455b52b
--- /dev/null
+++ b/sources/plugins/bidi/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'lt', {
6 ltr: 'Tekstas iš kairės į dešinę',
7 rtl: 'Tekstas iš dešinės į kairę'
8} );
diff --git a/sources/plugins/bidi/lang/lv.js b/sources/plugins/bidi/lang/lv.js
new file mode 100644
index 00000000..b9e7d130
--- /dev/null
+++ b/sources/plugins/bidi/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'lv', {
6 ltr: 'Teksta virziens no kreisās uz labo',
7 rtl: 'Teksta virziens no labās uz kreiso'
8} );
diff --git a/sources/plugins/bidi/lang/mk.js b/sources/plugins/bidi/lang/mk.js
new file mode 100644
index 00000000..f7771932
--- /dev/null
+++ b/sources/plugins/bidi/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'mk', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/mn.js b/sources/plugins/bidi/lang/mn.js
new file mode 100644
index 00000000..acade9af
--- /dev/null
+++ b/sources/plugins/bidi/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'mn', {
6 ltr: 'Зүүнээс баруун тийш бичлэг',
7 rtl: 'Баруунаас зүүн тийш бичлэг'
8} );
diff --git a/sources/plugins/bidi/lang/ms.js b/sources/plugins/bidi/lang/ms.js
new file mode 100644
index 00000000..a86971b6
--- /dev/null
+++ b/sources/plugins/bidi/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ms', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/nb.js b/sources/plugins/bidi/lang/nb.js
new file mode 100644
index 00000000..3a1225b9
--- /dev/null
+++ b/sources/plugins/bidi/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'nb', {
6 ltr: 'Tekstretning fra venstre til høyre',
7 rtl: 'Tekstretning fra høyre til venstre'
8} );
diff --git a/sources/plugins/bidi/lang/nl.js b/sources/plugins/bidi/lang/nl.js
new file mode 100644
index 00000000..d9cf8f7c
--- /dev/null
+++ b/sources/plugins/bidi/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'nl', {
6 ltr: 'Schrijfrichting van links naar rechts',
7 rtl: 'Schrijfrichting van rechts naar links'
8} );
diff --git a/sources/plugins/bidi/lang/no.js b/sources/plugins/bidi/lang/no.js
new file mode 100644
index 00000000..309a7474
--- /dev/null
+++ b/sources/plugins/bidi/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'no', {
6 ltr: 'Tekstretning fra venstre til høyre',
7 rtl: 'Tekstretning fra høyre til venstre'
8} );
diff --git a/sources/plugins/bidi/lang/pl.js b/sources/plugins/bidi/lang/pl.js
new file mode 100644
index 00000000..b9ad7eb9
--- /dev/null
+++ b/sources/plugins/bidi/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'pl', {
6 ltr: 'Kierunek tekstu od lewej strony do prawej',
7 rtl: 'Kierunek tekstu od prawej strony do lewej'
8} );
diff --git a/sources/plugins/bidi/lang/pt-br.js b/sources/plugins/bidi/lang/pt-br.js
new file mode 100644
index 00000000..f97f3db1
--- /dev/null
+++ b/sources/plugins/bidi/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'pt-br', {
6 ltr: 'Direção do texto da esquerda para a direita',
7 rtl: 'Direção do texto da direita para a esquerda'
8} );
diff --git a/sources/plugins/bidi/lang/pt.js b/sources/plugins/bidi/lang/pt.js
new file mode 100644
index 00000000..5dd99b3a
--- /dev/null
+++ b/sources/plugins/bidi/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'pt', {
6 ltr: 'Direção do texto da esquerda para a direita',
7 rtl: 'Direção do texto da direita para a esquerda'
8} );
diff --git a/sources/plugins/bidi/lang/ro.js b/sources/plugins/bidi/lang/ro.js
new file mode 100644
index 00000000..13a560b0
--- /dev/null
+++ b/sources/plugins/bidi/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ro', {
6 ltr: 'Direcția textului de la stânga la dreapta',
7 rtl: 'Direcția textului de la dreapta la stânga'
8} );
diff --git a/sources/plugins/bidi/lang/ru.js b/sources/plugins/bidi/lang/ru.js
new file mode 100644
index 00000000..e3dc391b
--- /dev/null
+++ b/sources/plugins/bidi/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ru', {
6 ltr: 'Направление текста слева направо',
7 rtl: 'Направление текста справа налево'
8} );
diff --git a/sources/plugins/bidi/lang/si.js b/sources/plugins/bidi/lang/si.js
new file mode 100644
index 00000000..5260df1a
--- /dev/null
+++ b/sources/plugins/bidi/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'si', {
6 ltr: 'වගන්ති දිශාව වමේ සිට දකුණට',
7 rtl: 'වගන්ති දිශාව දකුණේ සිට වමට'
8} );
diff --git a/sources/plugins/bidi/lang/sk.js b/sources/plugins/bidi/lang/sk.js
new file mode 100644
index 00000000..8f4a3587
--- /dev/null
+++ b/sources/plugins/bidi/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'sk', {
6 ltr: 'Smer textu zľava doprava',
7 rtl: 'Smer textu sprava doľava'
8} );
diff --git a/sources/plugins/bidi/lang/sl.js b/sources/plugins/bidi/lang/sl.js
new file mode 100644
index 00000000..972d355c
--- /dev/null
+++ b/sources/plugins/bidi/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'sl', {
6 ltr: 'Smer besedila od leve proti desni',
7 rtl: 'Smer besedila od desne proti levi'
8} );
diff --git a/sources/plugins/bidi/lang/sq.js b/sources/plugins/bidi/lang/sq.js
new file mode 100644
index 00000000..55a2152b
--- /dev/null
+++ b/sources/plugins/bidi/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'sq', {
6 ltr: 'Drejtimi i tekstit nga e majta në të djathtë',
7 rtl: 'Drejtimi i tekstit nga e djathta në të majtë'
8} );
diff --git a/sources/plugins/bidi/lang/sr-latn.js b/sources/plugins/bidi/lang/sr-latn.js
new file mode 100644
index 00000000..bf349403
--- /dev/null
+++ b/sources/plugins/bidi/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'sr-latn', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/sr.js b/sources/plugins/bidi/lang/sr.js
new file mode 100644
index 00000000..c8cff445
--- /dev/null
+++ b/sources/plugins/bidi/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'sr', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/sv.js b/sources/plugins/bidi/lang/sv.js
new file mode 100644
index 00000000..b2056407
--- /dev/null
+++ b/sources/plugins/bidi/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'sv', {
6 ltr: 'Text riktning från vänster till höger',
7 rtl: 'Text riktning från höger till vänster'
8} );
diff --git a/sources/plugins/bidi/lang/th.js b/sources/plugins/bidi/lang/th.js
new file mode 100644
index 00000000..fefb49c7
--- /dev/null
+++ b/sources/plugins/bidi/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'th', {
6 ltr: 'Text direction from left to right', // MISSING
7 rtl: 'Text direction from right to left' // MISSING
8} );
diff --git a/sources/plugins/bidi/lang/tr.js b/sources/plugins/bidi/lang/tr.js
new file mode 100644
index 00000000..11cde918
--- /dev/null
+++ b/sources/plugins/bidi/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'tr', {
6 ltr: 'Metin yönü soldan sağa',
7 rtl: 'Metin yönü sağdan sola'
8} );
diff --git a/sources/plugins/bidi/lang/tt.js b/sources/plugins/bidi/lang/tt.js
new file mode 100644
index 00000000..b60b3b28
--- /dev/null
+++ b/sources/plugins/bidi/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'tt', {
6 ltr: 'Сулдан уңга язылыш',
7 rtl: 'Уңнан сулга язылыш'
8} );
diff --git a/sources/plugins/bidi/lang/ug.js b/sources/plugins/bidi/lang/ug.js
new file mode 100644
index 00000000..b17d36cc
--- /dev/null
+++ b/sources/plugins/bidi/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'ug', {
6 ltr: 'تېكىست يۆنىلىشى سولدىن ئوڭغا',
7 rtl: 'تېكىست يۆنىلىشى ئوڭدىن سولغا'
8} );
diff --git a/sources/plugins/bidi/lang/uk.js b/sources/plugins/bidi/lang/uk.js
new file mode 100644
index 00000000..a74f09fc
--- /dev/null
+++ b/sources/plugins/bidi/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'uk', {
6 ltr: 'Напрямок тексту зліва направо',
7 rtl: 'Напрямок тексту справа наліво'
8} );
diff --git a/sources/plugins/bidi/lang/vi.js b/sources/plugins/bidi/lang/vi.js
new file mode 100644
index 00000000..cc6fd7b0
--- /dev/null
+++ b/sources/plugins/bidi/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'vi', {
6 ltr: 'Văn bản hướng từ trái sang phải',
7 rtl: 'Văn bản hướng từ phải sang trái'
8} );
diff --git a/sources/plugins/bidi/lang/zh-cn.js b/sources/plugins/bidi/lang/zh-cn.js
new file mode 100644
index 00000000..d56019e2
--- /dev/null
+++ b/sources/plugins/bidi/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'zh-cn', {
6 ltr: '文字方向为从左至右',
7 rtl: '文字方向为从右至左'
8} );
diff --git a/sources/plugins/bidi/lang/zh.js b/sources/plugins/bidi/lang/zh.js
new file mode 100644
index 00000000..ff5db4f9
--- /dev/null
+++ b/sources/plugins/bidi/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'bidi', 'zh', {
6 ltr: '文字方向從左至右',
7 rtl: '文字方向從右至左'
8} );
diff --git a/sources/plugins/bidi/plugin.js b/sources/plugins/bidi/plugin.js
new file mode 100644
index 00000000..bfe3ffcb
--- /dev/null
+++ b/sources/plugins/bidi/plugin.js
@@ -0,0 +1,320 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var guardElements = { table: 1, ul: 1, ol: 1, blockquote: 1, div: 1 },
8 directSelectionGuardElements = {},
9 // All guard elements which can have a direction applied on them.
10 allGuardElements = {};
11 CKEDITOR.tools.extend( directSelectionGuardElements, guardElements, { tr: 1, p: 1, div: 1, li: 1 } );
12 CKEDITOR.tools.extend( allGuardElements, directSelectionGuardElements, { td: 1 } );
13
14 function setToolbarStates( editor, path ) {
15 var useComputedState = editor.config.useComputedState,
16 selectedElement;
17
18 useComputedState = useComputedState === undefined || useComputedState;
19
20 // We can use computedState provided by the browser or traverse parents manually.
21 if ( !useComputedState )
22 selectedElement = getElementForDirection( path.lastElement, editor.editable() );
23
24 selectedElement = selectedElement || path.block || path.blockLimit;
25
26 // If we're having BODY here, user probably done CTRL+A, let's try to get the enclosed node, if any.
27 if ( selectedElement.equals( editor.editable() ) ) {
28 var enclosedNode = editor.getSelection().getRanges()[ 0 ].getEnclosedNode();
29 enclosedNode && enclosedNode.type == CKEDITOR.NODE_ELEMENT && ( selectedElement = enclosedNode );
30 }
31
32 if ( !selectedElement )
33 return;
34
35 var selectionDir = useComputedState ? selectedElement.getComputedStyle( 'direction' ) : selectedElement.getStyle( 'direction' ) || selectedElement.getAttribute( 'dir' );
36
37 editor.getCommand( 'bidirtl' ).setState( selectionDir == 'rtl' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
38 editor.getCommand( 'bidiltr' ).setState( selectionDir == 'ltr' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
39 }
40
41 function handleMixedDirContent( editor, path ) {
42 var directionNode = path.block || path.blockLimit || editor.editable();
43 var pathDir = directionNode.getDirection( 1 );
44 if ( pathDir != ( editor._.selDir || editor.lang.dir ) ) {
45 editor._.selDir = pathDir;
46 editor.fire( 'contentDirChanged', pathDir );
47 }
48 }
49
50 // Returns element with possibility of applying the direction.
51 // @param node
52 function getElementForDirection( node, root ) {
53 while ( node && !( node.getName() in allGuardElements || node.equals( root ) ) ) {
54 var parent = node.getParent();
55 if ( !parent )
56 break;
57
58 node = parent;
59 }
60
61 return node;
62 }
63
64 function switchDir( element, dir, editor, database ) {
65 if ( element.isReadOnly() || element.equals( editor.editable() ) )
66 return;
67
68 // Mark this element as processed by switchDir.
69 CKEDITOR.dom.element.setMarker( database, element, 'bidi_processed', 1 );
70
71 // Check whether one of the ancestors has already been styled.
72 var parent = element,
73 editable = editor.editable();
74 while ( ( parent = parent.getParent() ) && !parent.equals( editable ) ) {
75 if ( parent.getCustomData( 'bidi_processed' ) ) {
76 // Ancestor style must dominate.
77 element.removeStyle( 'direction' );
78 element.removeAttribute( 'dir' );
79 return;
80 }
81 }
82
83 var useComputedState = ( 'useComputedState' in editor.config ) ? editor.config.useComputedState : 1;
84
85 var elementDir = useComputedState ? element.getComputedStyle( 'direction' ) : element.getStyle( 'direction' ) || element.hasAttribute( 'dir' );
86
87 // Stop if direction is same as present.
88 if ( elementDir == dir )
89 return;
90
91 // Clear direction on this element.
92 element.removeStyle( 'direction' );
93
94 // Do the second check when computed state is ON, to check
95 // if we need to apply explicit direction on this element.
96 if ( useComputedState ) {
97 element.removeAttribute( 'dir' );
98 if ( dir != element.getComputedStyle( 'direction' ) ) {
99 element.setAttribute( 'dir', dir );
100 }
101 } else {
102 // Set new direction for this element.
103 element.setAttribute( 'dir', dir );
104 }
105
106 editor.forceNextSelectionCheck();
107
108 return;
109 }
110
111 function getFullySelected( range, elements, enterMode ) {
112 var ancestor = range.getCommonAncestor( false, true );
113
114 range = range.clone();
115 range.enlarge( enterMode == CKEDITOR.ENTER_BR ? CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS );
116
117 if ( range.checkBoundaryOfElement( ancestor, CKEDITOR.START ) && range.checkBoundaryOfElement( ancestor, CKEDITOR.END ) ) {
118 var parent;
119 while ( ancestor && ancestor.type == CKEDITOR.NODE_ELEMENT && ( parent = ancestor.getParent() ) && parent.getChildCount() == 1 && !( ancestor.getName() in elements ) )
120 ancestor = parent;
121
122 return ancestor.type == CKEDITOR.NODE_ELEMENT && ( ancestor.getName() in elements ) && ancestor;
123 }
124 }
125
126 function bidiCommand( dir ) {
127 return {
128 // It applies to a "block-like" context.
129 context: 'p',
130 allowedContent: {
131 'h1 h2 h3 h4 h5 h6 table ul ol blockquote div tr p div li td': {
132 propertiesOnly: true,
133 attributes: 'dir'
134 }
135 },
136 requiredContent: 'p[dir]',
137 refresh: function( editor, path ) {
138 setToolbarStates( editor, path );
139 handleMixedDirContent( editor, path );
140 },
141 exec: function( editor ) {
142 var selection = editor.getSelection(),
143 enterMode = editor.config.enterMode,
144 ranges = selection.getRanges();
145
146 if ( ranges && ranges.length ) {
147 var database = {};
148
149 // Creates bookmarks for selection, as we may split some blocks.
150 var bookmarks = selection.createBookmarks();
151
152 var rangeIterator = ranges.createIterator(),
153 range,
154 i = 0;
155
156 while ( ( range = rangeIterator.getNextRange( 1 ) ) ) {
157 // Apply do directly selected elements from guardElements.
158 var selectedElement = range.getEnclosedNode();
159
160 // If this is not our element of interest, apply to fully selected elements from guardElements.
161 if ( !selectedElement || selectedElement && !( selectedElement.type == CKEDITOR.NODE_ELEMENT && selectedElement.getName() in directSelectionGuardElements ) )
162 selectedElement = getFullySelected( range, guardElements, enterMode );
163
164 selectedElement && switchDir( selectedElement, dir, editor, database );
165
166 var iterator, block;
167
168 // Walker searching for guardElements.
169 var walker = new CKEDITOR.dom.walker( range );
170
171 var start = bookmarks[ i ].startNode,
172 end = bookmarks[ i++ ].endNode;
173
174 walker.evaluator = function( node ) {
175 var enterTagName = ( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
176
177 function isNodeElement( node ) {
178 return node ? ( node.type == CKEDITOR.NODE_ELEMENT ) : false;
179 }
180
181 function isGuard( node ) {
182 return node.getName() in guardElements;
183 }
184
185 return !!( isNodeElement( node ) && isGuard( node ) && !( node.is( enterTagName ) && isNodeElement( node.getParent() ) && node.getParent().is( 'blockquote' ) ) &&
186 // Element must be fully included in the range as well. (#6485).
187 node.getPosition( start ) & CKEDITOR.POSITION_FOLLOWING &&
188 ( ( node.getPosition( end ) & CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_CONTAINS ) == CKEDITOR.POSITION_PRECEDING ) );
189 };
190
191 while ( ( block = walker.next() ) )
192 switchDir( block, dir, editor, database );
193
194 iterator = range.createIterator();
195 iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
196
197 while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
198 switchDir( block, dir, editor, database );
199 }
200
201 CKEDITOR.dom.element.clearAllMarkers( database );
202
203 editor.forceNextSelectionCheck();
204 // Restore selection position.
205 selection.selectBookmarks( bookmarks );
206
207 editor.focus();
208 }
209 }
210 };
211 }
212
213 CKEDITOR.plugins.add( 'bidi', {
214 // jscs:disable maximumLineLength
215 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
216 // jscs:enable maximumLineLength
217 icons: 'bidiltr,bidirtl', // %REMOVE_LINE_CORE%
218 hidpi: true, // %REMOVE_LINE_CORE%
219 init: function( editor ) {
220 if ( editor.blockless )
221 return;
222
223 // All buttons use the same code to register. So, to avoid
224 // duplications, let's use this tool function.
225 function addButtonCommand( buttonName, buttonLabel, commandName, commandDef, order ) {
226 editor.addCommand( commandName, new CKEDITOR.command( editor, commandDef ) );
227
228 if ( editor.ui.addButton ) {
229 editor.ui.addButton( buttonName, {
230 label: buttonLabel,
231 command: commandName,
232 toolbar: 'bidi,' + order
233 } );
234 }
235 }
236
237 var lang = editor.lang.bidi;
238
239 addButtonCommand( 'BidiLtr', lang.ltr, 'bidiltr', bidiCommand( 'ltr' ), 10 );
240 addButtonCommand( 'BidiRtl', lang.rtl, 'bidirtl', bidiCommand( 'rtl' ), 20 );
241
242 editor.on( 'contentDom', function() {
243 editor.document.on( 'dirChanged', function( evt ) {
244 editor.fire( 'dirChanged', {
245 node: evt.data,
246 dir: evt.data.getDirection( 1 )
247 } );
248 } );
249 } );
250
251 // Indicate that the current selection is in different direction than the UI.
252 editor.on( 'contentDirChanged', function( evt ) {
253 var func = ( editor.lang.dir != evt.data ? 'add' : 'remove' ) + 'Class';
254 var toolbar = editor.ui.space( editor.config.toolbarLocation );
255 if ( toolbar )
256 toolbar[ func ]( 'cke_mixed_dir_content' );
257 } );
258 }
259 } );
260
261 // If the element direction changed, we need to switch the margins of
262 // the element and all its children, so it will get really reflected
263 // like a mirror. (#5910)
264 function isOffline( el ) {
265 var html = el.getDocument().getBody().getParent();
266 while ( el ) {
267 if ( el.equals( html ) )
268 return false;
269 el = el.getParent();
270 }
271 return true;
272 }
273
274 function dirChangeNotifier( org ) {
275 var isAttribute = org == elementProto.setAttribute,
276 isRemoveAttribute = org == elementProto.removeAttribute,
277 dirStyleRegexp = /\bdirection\s*:\s*(.*?)\s*(:?$|;)/;
278
279 return function( name, val ) {
280 if ( !this.isReadOnly() ) {
281 var orgDir;
282 if ( ( name == ( isAttribute || isRemoveAttribute ? 'dir' : 'direction' ) || name == 'style' && ( isRemoveAttribute || dirStyleRegexp.test( val ) ) ) && !isOffline( this ) ) {
283 orgDir = this.getDirection( 1 );
284 var retval = org.apply( this, arguments );
285 if ( orgDir != this.getDirection( 1 ) ) {
286 this.getDocument().fire( 'dirChanged', this );
287 return retval;
288 }
289 }
290 }
291
292 return org.apply( this, arguments );
293 };
294 }
295
296 var elementProto = CKEDITOR.dom.element.prototype,
297 methods = [ 'setStyle', 'removeStyle', 'setAttribute', 'removeAttribute' ];
298 for ( var i = 0; i < methods.length; i++ )
299 elementProto[ methods[ i ] ] = CKEDITOR.tools.override( elementProto[ methods[ i ] ], dirChangeNotifier );
300} )();
301
302/**
303 * Fired when the language direction of an element is changed.
304 *
305 * @event dirChanged
306 * @member CKEDITOR.editor
307 * @param {CKEDITOR.editor} editor This editor instance.
308 * @param data
309 * @param {CKEDITOR.dom.node} data.node The element that is being changed.
310 * @param {String} data.dir The new direction.
311 */
312
313/**
314 * Fired when the language direction in the specific cursor position is changed
315 *
316 * @event contentDirChanged
317 * @member CKEDITOR.editor
318 * @param {CKEDITOR.editor} editor This editor instance.
319 * @param {String} data The direction in the current position.
320 */
diff --git a/sources/plugins/blockquote/icons/blockquote.png b/sources/plugins/blockquote/icons/blockquote.png
new file mode 100644
index 00000000..95293e25
--- /dev/null
+++ b/sources/plugins/blockquote/icons/blockquote.png
Binary files differ
diff --git a/sources/plugins/blockquote/icons/hidpi/blockquote.png b/sources/plugins/blockquote/icons/hidpi/blockquote.png
new file mode 100644
index 00000000..50c23b9f
--- /dev/null
+++ b/sources/plugins/blockquote/icons/hidpi/blockquote.png
Binary files differ
diff --git a/sources/plugins/blockquote/lang/af.js b/sources/plugins/blockquote/lang/af.js
new file mode 100644
index 00000000..e615381f
--- /dev/null
+++ b/sources/plugins/blockquote/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'af', {
6 toolbar: 'Sitaatblok'
7} );
diff --git a/sources/plugins/blockquote/lang/ar.js b/sources/plugins/blockquote/lang/ar.js
new file mode 100644
index 00000000..eb22b93e
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ar', {
6 toolbar: 'اقتباس'
7} );
diff --git a/sources/plugins/blockquote/lang/bg.js b/sources/plugins/blockquote/lang/bg.js
new file mode 100644
index 00000000..97e6f126
--- /dev/null
+++ b/sources/plugins/blockquote/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'bg', {
6 toolbar: 'Блок за цитат'
7} );
diff --git a/sources/plugins/blockquote/lang/bn.js b/sources/plugins/blockquote/lang/bn.js
new file mode 100644
index 00000000..02ab2002
--- /dev/null
+++ b/sources/plugins/blockquote/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'bn', {
6 toolbar: 'Block Quote' // MISSING
7} );
diff --git a/sources/plugins/blockquote/lang/bs.js b/sources/plugins/blockquote/lang/bs.js
new file mode 100644
index 00000000..3a4d3f38
--- /dev/null
+++ b/sources/plugins/blockquote/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'bs', {
6 toolbar: 'Block Quote' // MISSING
7} );
diff --git a/sources/plugins/blockquote/lang/ca.js b/sources/plugins/blockquote/lang/ca.js
new file mode 100644
index 00000000..41bfbc73
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ca', {
6 toolbar: 'Bloc de cita'
7} );
diff --git a/sources/plugins/blockquote/lang/cs.js b/sources/plugins/blockquote/lang/cs.js
new file mode 100644
index 00000000..7c63ff53
--- /dev/null
+++ b/sources/plugins/blockquote/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'cs', {
6 toolbar: 'Citace'
7} );
diff --git a/sources/plugins/blockquote/lang/cy.js b/sources/plugins/blockquote/lang/cy.js
new file mode 100644
index 00000000..a47b50ab
--- /dev/null
+++ b/sources/plugins/blockquote/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'cy', {
6 toolbar: 'Dyfyniad bloc'
7} );
diff --git a/sources/plugins/blockquote/lang/da.js b/sources/plugins/blockquote/lang/da.js
new file mode 100644
index 00000000..e1f8de13
--- /dev/null
+++ b/sources/plugins/blockquote/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'da', {
6 toolbar: 'Blokcitat'
7} );
diff --git a/sources/plugins/blockquote/lang/de.js b/sources/plugins/blockquote/lang/de.js
new file mode 100644
index 00000000..e5c47e5f
--- /dev/null
+++ b/sources/plugins/blockquote/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'de', {
6 toolbar: 'Zitatblock'
7} );
diff --git a/sources/plugins/blockquote/lang/el.js b/sources/plugins/blockquote/lang/el.js
new file mode 100644
index 00000000..af7cde55
--- /dev/null
+++ b/sources/plugins/blockquote/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'el', {
6 toolbar: 'Περιοχή Παράθεσης'
7} );
diff --git a/sources/plugins/blockquote/lang/en-au.js b/sources/plugins/blockquote/lang/en-au.js
new file mode 100644
index 00000000..9f70e6ce
--- /dev/null
+++ b/sources/plugins/blockquote/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'en-au', {
6 toolbar: 'Block Quote'
7} );
diff --git a/sources/plugins/blockquote/lang/en-ca.js b/sources/plugins/blockquote/lang/en-ca.js
new file mode 100644
index 00000000..7caafa22
--- /dev/null
+++ b/sources/plugins/blockquote/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'en-ca', {
6 toolbar: 'Block Quote'
7} );
diff --git a/sources/plugins/blockquote/lang/en-gb.js b/sources/plugins/blockquote/lang/en-gb.js
new file mode 100644
index 00000000..f894911a
--- /dev/null
+++ b/sources/plugins/blockquote/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'en-gb', {
6 toolbar: 'Block Quote'
7} );
diff --git a/sources/plugins/blockquote/lang/en.js b/sources/plugins/blockquote/lang/en.js
new file mode 100644
index 00000000..33c50694
--- /dev/null
+++ b/sources/plugins/blockquote/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'en', {
6 toolbar: 'Block Quote'
7} );
diff --git a/sources/plugins/blockquote/lang/eo.js b/sources/plugins/blockquote/lang/eo.js
new file mode 100644
index 00000000..b33c6f18
--- /dev/null
+++ b/sources/plugins/blockquote/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'eo', {
6 toolbar: 'Citaĵo'
7} );
diff --git a/sources/plugins/blockquote/lang/es.js b/sources/plugins/blockquote/lang/es.js
new file mode 100644
index 00000000..fb4e834e
--- /dev/null
+++ b/sources/plugins/blockquote/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'es', {
6 toolbar: 'Cita'
7} );
diff --git a/sources/plugins/blockquote/lang/et.js b/sources/plugins/blockquote/lang/et.js
new file mode 100644
index 00000000..eb9eaa55
--- /dev/null
+++ b/sources/plugins/blockquote/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'et', {
6 toolbar: 'Blokktsitaat'
7} );
diff --git a/sources/plugins/blockquote/lang/eu.js b/sources/plugins/blockquote/lang/eu.js
new file mode 100644
index 00000000..6320397b
--- /dev/null
+++ b/sources/plugins/blockquote/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'eu', {
6 toolbar: 'Aipamen blokea'
7} );
diff --git a/sources/plugins/blockquote/lang/fa.js b/sources/plugins/blockquote/lang/fa.js
new file mode 100644
index 00000000..2f12a50e
--- /dev/null
+++ b/sources/plugins/blockquote/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'fa', {
6 toolbar: 'بلوک نقل قول'
7} );
diff --git a/sources/plugins/blockquote/lang/fi.js b/sources/plugins/blockquote/lang/fi.js
new file mode 100644
index 00000000..44924d0a
--- /dev/null
+++ b/sources/plugins/blockquote/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'fi', {
6 toolbar: 'Lainaus'
7} );
diff --git a/sources/plugins/blockquote/lang/fo.js b/sources/plugins/blockquote/lang/fo.js
new file mode 100644
index 00000000..0557b99c
--- /dev/null
+++ b/sources/plugins/blockquote/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'fo', {
6 toolbar: 'Blockquote'
7} );
diff --git a/sources/plugins/blockquote/lang/fr-ca.js b/sources/plugins/blockquote/lang/fr-ca.js
new file mode 100644
index 00000000..0ae3f2b2
--- /dev/null
+++ b/sources/plugins/blockquote/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'fr-ca', {
6 toolbar: 'Citation'
7} );
diff --git a/sources/plugins/blockquote/lang/fr.js b/sources/plugins/blockquote/lang/fr.js
new file mode 100644
index 00000000..21710d24
--- /dev/null
+++ b/sources/plugins/blockquote/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'fr', {
6 toolbar: 'Citation'
7} );
diff --git a/sources/plugins/blockquote/lang/gl.js b/sources/plugins/blockquote/lang/gl.js
new file mode 100644
index 00000000..0ace64eb
--- /dev/null
+++ b/sources/plugins/blockquote/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'gl', {
6 toolbar: 'Cita'
7} );
diff --git a/sources/plugins/blockquote/lang/gu.js b/sources/plugins/blockquote/lang/gu.js
new file mode 100644
index 00000000..9fc65baa
--- /dev/null
+++ b/sources/plugins/blockquote/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'gu', {
6 toolbar: 'બ્લૉક-કોટ, અવતરણચિહ્નો'
7} );
diff --git a/sources/plugins/blockquote/lang/he.js b/sources/plugins/blockquote/lang/he.js
new file mode 100644
index 00000000..a10d7e40
--- /dev/null
+++ b/sources/plugins/blockquote/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'he', {
6 toolbar: 'בלוק ציטוט'
7} );
diff --git a/sources/plugins/blockquote/lang/hi.js b/sources/plugins/blockquote/lang/hi.js
new file mode 100644
index 00000000..b7481e24
--- /dev/null
+++ b/sources/plugins/blockquote/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'hi', {
6 toolbar: 'ब्लॉक-कोट'
7} );
diff --git a/sources/plugins/blockquote/lang/hr.js b/sources/plugins/blockquote/lang/hr.js
new file mode 100644
index 00000000..421ffd57
--- /dev/null
+++ b/sources/plugins/blockquote/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'hr', {
6 toolbar: 'Blockquote'
7} );
diff --git a/sources/plugins/blockquote/lang/hu.js b/sources/plugins/blockquote/lang/hu.js
new file mode 100644
index 00000000..5bf22703
--- /dev/null
+++ b/sources/plugins/blockquote/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'hu', {
6 toolbar: 'Idézet blokk'
7} );
diff --git a/sources/plugins/blockquote/lang/id.js b/sources/plugins/blockquote/lang/id.js
new file mode 100644
index 00000000..3cab0ac3
--- /dev/null
+++ b/sources/plugins/blockquote/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'id', {
6 toolbar: 'Kutipan Blok'
7} );
diff --git a/sources/plugins/blockquote/lang/is.js b/sources/plugins/blockquote/lang/is.js
new file mode 100644
index 00000000..04f13a9b
--- /dev/null
+++ b/sources/plugins/blockquote/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'is', {
6 toolbar: 'Inndráttur'
7} );
diff --git a/sources/plugins/blockquote/lang/it.js b/sources/plugins/blockquote/lang/it.js
new file mode 100644
index 00000000..77de24eb
--- /dev/null
+++ b/sources/plugins/blockquote/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'it', {
6 toolbar: 'Citazione'
7} );
diff --git a/sources/plugins/blockquote/lang/ja.js b/sources/plugins/blockquote/lang/ja.js
new file mode 100644
index 00000000..d6155ea0
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ja', {
6 toolbar: 'ブロック引用文'
7} );
diff --git a/sources/plugins/blockquote/lang/ka.js b/sources/plugins/blockquote/lang/ka.js
new file mode 100644
index 00000000..826113bb
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ka', {
6 toolbar: 'ციტატა'
7} );
diff --git a/sources/plugins/blockquote/lang/km.js b/sources/plugins/blockquote/lang/km.js
new file mode 100644
index 00000000..a29f072c
--- /dev/null
+++ b/sources/plugins/blockquote/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'km', {
6 toolbar: 'ប្លក់​ពាក្យ​សម្រង់'
7} );
diff --git a/sources/plugins/blockquote/lang/ko.js b/sources/plugins/blockquote/lang/ko.js
new file mode 100644
index 00000000..f27c777d
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ko', {
6 toolbar: '인용 단락'
7} );
diff --git a/sources/plugins/blockquote/lang/ku.js b/sources/plugins/blockquote/lang/ku.js
new file mode 100644
index 00000000..c6e22aa6
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ku', {
6 toolbar: 'بەربەستکردنی ووتەی وەرگیراو'
7} );
diff --git a/sources/plugins/blockquote/lang/lt.js b/sources/plugins/blockquote/lang/lt.js
new file mode 100644
index 00000000..775232a0
--- /dev/null
+++ b/sources/plugins/blockquote/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'lt', {
6 toolbar: 'Citata'
7} );
diff --git a/sources/plugins/blockquote/lang/lv.js b/sources/plugins/blockquote/lang/lv.js
new file mode 100644
index 00000000..006ec477
--- /dev/null
+++ b/sources/plugins/blockquote/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'lv', {
6 toolbar: 'Bloka citāts'
7} );
diff --git a/sources/plugins/blockquote/lang/mk.js b/sources/plugins/blockquote/lang/mk.js
new file mode 100644
index 00000000..87167bae
--- /dev/null
+++ b/sources/plugins/blockquote/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'mk', {
6 toolbar: 'Block Quote' // MISSING
7} );
diff --git a/sources/plugins/blockquote/lang/mn.js b/sources/plugins/blockquote/lang/mn.js
new file mode 100644
index 00000000..a18eb38c
--- /dev/null
+++ b/sources/plugins/blockquote/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'mn', {
6 toolbar: 'Ишлэл хэсэг'
7} );
diff --git a/sources/plugins/blockquote/lang/ms.js b/sources/plugins/blockquote/lang/ms.js
new file mode 100644
index 00000000..4c7e7b47
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ms', {
6 toolbar: 'Block Quote' // MISSING
7} );
diff --git a/sources/plugins/blockquote/lang/nb.js b/sources/plugins/blockquote/lang/nb.js
new file mode 100644
index 00000000..154c2609
--- /dev/null
+++ b/sources/plugins/blockquote/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'nb', {
6 toolbar: 'Blokksitat'
7} );
diff --git a/sources/plugins/blockquote/lang/nl.js b/sources/plugins/blockquote/lang/nl.js
new file mode 100644
index 00000000..ef45be9a
--- /dev/null
+++ b/sources/plugins/blockquote/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'nl', {
6 toolbar: 'Citaatblok'
7} );
diff --git a/sources/plugins/blockquote/lang/no.js b/sources/plugins/blockquote/lang/no.js
new file mode 100644
index 00000000..79388492
--- /dev/null
+++ b/sources/plugins/blockquote/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'no', {
6 toolbar: 'Blokksitat'
7} );
diff --git a/sources/plugins/blockquote/lang/pl.js b/sources/plugins/blockquote/lang/pl.js
new file mode 100644
index 00000000..ebaab5db
--- /dev/null
+++ b/sources/plugins/blockquote/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'pl', {
6 toolbar: 'Cytat'
7} );
diff --git a/sources/plugins/blockquote/lang/pt-br.js b/sources/plugins/blockquote/lang/pt-br.js
new file mode 100644
index 00000000..8fbe5004
--- /dev/null
+++ b/sources/plugins/blockquote/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'pt-br', {
6 toolbar: 'Citação'
7} );
diff --git a/sources/plugins/blockquote/lang/pt.js b/sources/plugins/blockquote/lang/pt.js
new file mode 100644
index 00000000..98c65b03
--- /dev/null
+++ b/sources/plugins/blockquote/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'pt', {
6 toolbar: 'Bloco de citação'
7} );
diff --git a/sources/plugins/blockquote/lang/ro.js b/sources/plugins/blockquote/lang/ro.js
new file mode 100644
index 00000000..699ee2cd
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ro', {
6 toolbar: 'Citat'
7} );
diff --git a/sources/plugins/blockquote/lang/ru.js b/sources/plugins/blockquote/lang/ru.js
new file mode 100644
index 00000000..b7ddbb46
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ru', {
6 toolbar: 'Цитата'
7} );
diff --git a/sources/plugins/blockquote/lang/si.js b/sources/plugins/blockquote/lang/si.js
new file mode 100644
index 00000000..0cf851aa
--- /dev/null
+++ b/sources/plugins/blockquote/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'si', {
6 toolbar: 'උද්ධෘත කොටස'
7} );
diff --git a/sources/plugins/blockquote/lang/sk.js b/sources/plugins/blockquote/lang/sk.js
new file mode 100644
index 00000000..3ee34ea8
--- /dev/null
+++ b/sources/plugins/blockquote/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'sk', {
6 toolbar: 'Citácia'
7} );
diff --git a/sources/plugins/blockquote/lang/sl.js b/sources/plugins/blockquote/lang/sl.js
new file mode 100644
index 00000000..50201069
--- /dev/null
+++ b/sources/plugins/blockquote/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'sl', {
6 toolbar: 'Citat'
7} );
diff --git a/sources/plugins/blockquote/lang/sq.js b/sources/plugins/blockquote/lang/sq.js
new file mode 100644
index 00000000..3e99a148
--- /dev/null
+++ b/sources/plugins/blockquote/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'sq', {
6 toolbar: 'Citatet'
7} );
diff --git a/sources/plugins/blockquote/lang/sr-latn.js b/sources/plugins/blockquote/lang/sr-latn.js
new file mode 100644
index 00000000..8372a930
--- /dev/null
+++ b/sources/plugins/blockquote/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'sr-latn', {
6 toolbar: 'Block Quote' // MISSING
7} );
diff --git a/sources/plugins/blockquote/lang/sr.js b/sources/plugins/blockquote/lang/sr.js
new file mode 100644
index 00000000..afbb2b6a
--- /dev/null
+++ b/sources/plugins/blockquote/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'sr', {
6 toolbar: 'Block Quote' // MISSING
7} );
diff --git a/sources/plugins/blockquote/lang/sv.js b/sources/plugins/blockquote/lang/sv.js
new file mode 100644
index 00000000..6002c515
--- /dev/null
+++ b/sources/plugins/blockquote/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'sv', {
6 toolbar: 'Blockcitat'
7} );
diff --git a/sources/plugins/blockquote/lang/th.js b/sources/plugins/blockquote/lang/th.js
new file mode 100644
index 00000000..dbda0a53
--- /dev/null
+++ b/sources/plugins/blockquote/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'th', {
6 toolbar: 'Block Quote'
7} );
diff --git a/sources/plugins/blockquote/lang/tr.js b/sources/plugins/blockquote/lang/tr.js
new file mode 100644
index 00000000..db22c313
--- /dev/null
+++ b/sources/plugins/blockquote/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'tr', {
6 toolbar: 'Blok Oluştur'
7} );
diff --git a/sources/plugins/blockquote/lang/tt.js b/sources/plugins/blockquote/lang/tt.js
new file mode 100644
index 00000000..4dc271e3
--- /dev/null
+++ b/sources/plugins/blockquote/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'tt', {
6 toolbar: 'Өземтә блогы'
7} );
diff --git a/sources/plugins/blockquote/lang/ug.js b/sources/plugins/blockquote/lang/ug.js
new file mode 100644
index 00000000..5be430bf
--- /dev/null
+++ b/sources/plugins/blockquote/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'ug', {
6 toolbar: 'بۆلەك نەقىل'
7} );
diff --git a/sources/plugins/blockquote/lang/uk.js b/sources/plugins/blockquote/lang/uk.js
new file mode 100644
index 00000000..b425fdaa
--- /dev/null
+++ b/sources/plugins/blockquote/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'uk', {
6 toolbar: 'Цитата'
7} );
diff --git a/sources/plugins/blockquote/lang/vi.js b/sources/plugins/blockquote/lang/vi.js
new file mode 100644
index 00000000..e4eb496b
--- /dev/null
+++ b/sources/plugins/blockquote/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'vi', {
6 toolbar: 'Khối trích dẫn'
7} );
diff --git a/sources/plugins/blockquote/lang/zh-cn.js b/sources/plugins/blockquote/lang/zh-cn.js
new file mode 100644
index 00000000..76a92636
--- /dev/null
+++ b/sources/plugins/blockquote/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'zh-cn', {
6 toolbar: '块引用'
7} );
diff --git a/sources/plugins/blockquote/lang/zh.js b/sources/plugins/blockquote/lang/zh.js
new file mode 100644
index 00000000..7f892984
--- /dev/null
+++ b/sources/plugins/blockquote/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'blockquote', 'zh', {
6 toolbar: '引用段落'
7} );
diff --git a/sources/plugins/blockquote/plugin.js b/sources/plugins/blockquote/plugin.js
new file mode 100644
index 00000000..0b2bf332
--- /dev/null
+++ b/sources/plugins/blockquote/plugin.js
@@ -0,0 +1,251 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 function noBlockLeft( bqBlock ) {
8 for ( var i = 0, length = bqBlock.getChildCount(), child; i < length && ( child = bqBlock.getChild( i ) ); i++ ) {
9 if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() )
10 return false;
11 }
12 return true;
13 }
14
15 var commandObject = {
16 exec: function( editor ) {
17 var state = editor.getCommand( 'blockquote' ).state,
18 selection = editor.getSelection(),
19 range = selection && selection.getRanges()[ 0 ];
20
21 if ( !range )
22 return;
23
24 var bookmarks = selection.createBookmarks();
25
26 // Kludge for #1592: if the bookmark nodes are in the beginning of
27 // blockquote, then move them to the nearest block element in the
28 // blockquote.
29 if ( CKEDITOR.env.ie ) {
30 var bookmarkStart = bookmarks[ 0 ].startNode,
31 bookmarkEnd = bookmarks[ 0 ].endNode,
32 cursor;
33
34 if ( bookmarkStart && bookmarkStart.getParent().getName() == 'blockquote' ) {
35 cursor = bookmarkStart;
36 while ( ( cursor = cursor.getNext() ) ) {
37 if ( cursor.type == CKEDITOR.NODE_ELEMENT && cursor.isBlockBoundary() ) {
38 bookmarkStart.move( cursor, true );
39 break;
40 }
41 }
42 }
43
44 if ( bookmarkEnd && bookmarkEnd.getParent().getName() == 'blockquote' ) {
45 cursor = bookmarkEnd;
46 while ( ( cursor = cursor.getPrevious() ) ) {
47 if ( cursor.type == CKEDITOR.NODE_ELEMENT && cursor.isBlockBoundary() ) {
48 bookmarkEnd.move( cursor );
49 break;
50 }
51 }
52 }
53 }
54
55 var iterator = range.createIterator(),
56 block;
57 iterator.enlargeBr = editor.config.enterMode != CKEDITOR.ENTER_BR;
58
59 if ( state == CKEDITOR.TRISTATE_OFF ) {
60 var paragraphs = [];
61 while ( ( block = iterator.getNextParagraph() ) )
62 paragraphs.push( block );
63
64 // If no paragraphs, create one from the current selection position.
65 if ( paragraphs.length < 1 ) {
66 var para = editor.document.createElement( editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ),
67 firstBookmark = bookmarks.shift();
68 range.insertNode( para );
69 para.append( new CKEDITOR.dom.text( '\ufeff', editor.document ) );
70 range.moveToBookmark( firstBookmark );
71 range.selectNodeContents( para );
72 range.collapse( true );
73 firstBookmark = range.createBookmark();
74 paragraphs.push( para );
75 bookmarks.unshift( firstBookmark );
76 }
77
78 // Make sure all paragraphs have the same parent.
79 var commonParent = paragraphs[ 0 ].getParent(),
80 tmp = [];
81 for ( var i = 0; i < paragraphs.length; i++ ) {
82 block = paragraphs[ i ];
83 commonParent = commonParent.getCommonAncestor( block.getParent() );
84 }
85
86 // The common parent must not be the following tags: table, tbody, tr, ol, ul.
87 var denyTags = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 };
88 while ( denyTags[ commonParent.getName() ] )
89 commonParent = commonParent.getParent();
90
91 // Reconstruct the block list to be processed such that all resulting blocks
92 // satisfy parentNode.equals( commonParent ).
93 var lastBlock = null;
94 while ( paragraphs.length > 0 ) {
95 block = paragraphs.shift();
96 while ( !block.getParent().equals( commonParent ) )
97 block = block.getParent();
98 if ( !block.equals( lastBlock ) )
99 tmp.push( block );
100 lastBlock = block;
101 }
102
103 // If any of the selected blocks is a blockquote, remove it to prevent
104 // nested blockquotes.
105 while ( tmp.length > 0 ) {
106 block = tmp.shift();
107 if ( block.getName() == 'blockquote' ) {
108 var docFrag = new CKEDITOR.dom.documentFragment( editor.document );
109 while ( block.getFirst() ) {
110 docFrag.append( block.getFirst().remove() );
111 paragraphs.push( docFrag.getLast() );
112 }
113
114 docFrag.replace( block );
115 } else {
116 paragraphs.push( block );
117 }
118 }
119
120 // Now we have all the blocks to be included in a new blockquote node.
121 var bqBlock = editor.document.createElement( 'blockquote' );
122 bqBlock.insertBefore( paragraphs[ 0 ] );
123 while ( paragraphs.length > 0 ) {
124 block = paragraphs.shift();
125 bqBlock.append( block );
126 }
127 } else if ( state == CKEDITOR.TRISTATE_ON ) {
128 var moveOutNodes = [],
129 database = {};
130
131 while ( ( block = iterator.getNextParagraph() ) ) {
132 var bqParent = null,
133 bqChild = null;
134 while ( block.getParent() ) {
135 if ( block.getParent().getName() == 'blockquote' ) {
136 bqParent = block.getParent();
137 bqChild = block;
138 break;
139 }
140 block = block.getParent();
141 }
142
143 // Remember the blocks that were recorded down in the moveOutNodes array
144 // to prevent duplicates.
145 if ( bqParent && bqChild && !bqChild.getCustomData( 'blockquote_moveout' ) ) {
146 moveOutNodes.push( bqChild );
147 CKEDITOR.dom.element.setMarker( database, bqChild, 'blockquote_moveout', true );
148 }
149 }
150
151 CKEDITOR.dom.element.clearAllMarkers( database );
152
153 var movedNodes = [],
154 processedBlockquoteBlocks = [];
155
156 database = {};
157 while ( moveOutNodes.length > 0 ) {
158 var node = moveOutNodes.shift();
159 bqBlock = node.getParent();
160
161 // If the node is located at the beginning or the end, just take it out
162 // without splitting. Otherwise, split the blockquote node and move the
163 // paragraph in between the two blockquote nodes.
164 if ( !node.getPrevious() )
165 node.remove().insertBefore( bqBlock );
166 else if ( !node.getNext() )
167 node.remove().insertAfter( bqBlock );
168 else {
169 node.breakParent( node.getParent() );
170 processedBlockquoteBlocks.push( node.getNext() );
171 }
172
173 // Remember the blockquote node so we can clear it later (if it becomes empty).
174 if ( !bqBlock.getCustomData( 'blockquote_processed' ) ) {
175 processedBlockquoteBlocks.push( bqBlock );
176 CKEDITOR.dom.element.setMarker( database, bqBlock, 'blockquote_processed', true );
177 }
178
179 movedNodes.push( node );
180 }
181
182 CKEDITOR.dom.element.clearAllMarkers( database );
183
184 // Clear blockquote nodes that have become empty.
185 for ( i = processedBlockquoteBlocks.length - 1; i >= 0; i-- ) {
186 bqBlock = processedBlockquoteBlocks[ i ];
187 if ( noBlockLeft( bqBlock ) )
188 bqBlock.remove();
189 }
190
191 if ( editor.config.enterMode == CKEDITOR.ENTER_BR ) {
192 var firstTime = true;
193 while ( movedNodes.length ) {
194 node = movedNodes.shift();
195
196 if ( node.getName() == 'div' ) {
197 docFrag = new CKEDITOR.dom.documentFragment( editor.document );
198 var needBeginBr = firstTime && node.getPrevious() && !( node.getPrevious().type == CKEDITOR.NODE_ELEMENT && node.getPrevious().isBlockBoundary() );
199 if ( needBeginBr )
200 docFrag.append( editor.document.createElement( 'br' ) );
201
202 var needEndBr = node.getNext() && !( node.getNext().type == CKEDITOR.NODE_ELEMENT && node.getNext().isBlockBoundary() );
203 while ( node.getFirst() )
204 node.getFirst().remove().appendTo( docFrag );
205
206 if ( needEndBr )
207 docFrag.append( editor.document.createElement( 'br' ) );
208
209 docFrag.replace( node );
210 firstTime = false;
211 }
212 }
213 }
214 }
215
216 selection.selectBookmarks( bookmarks );
217 editor.focus();
218 },
219
220 refresh: function( editor, path ) {
221 // Check if inside of blockquote.
222 var firstBlock = path.block || path.blockLimit;
223 this.setState( editor.elementPath( firstBlock ).contains( 'blockquote', 1 ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
224 },
225
226 context: 'blockquote',
227
228 allowedContent: 'blockquote',
229 requiredContent: 'blockquote'
230 };
231
232 CKEDITOR.plugins.add( 'blockquote', {
233 // jscs:disable maximumLineLength
234 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
235 // jscs:enable maximumLineLength
236 icons: 'blockquote', // %REMOVE_LINE_CORE%
237 hidpi: true, // %REMOVE_LINE_CORE%
238 init: function( editor ) {
239 if ( editor.blockless )
240 return;
241
242 editor.addCommand( 'blockquote', commandObject );
243
244 editor.ui.addButton && editor.ui.addButton( 'Blockquote', {
245 label: editor.lang.blockquote.toolbar,
246 command: 'blockquote',
247 toolbar: 'blocks,10'
248 } );
249 }
250 } );
251} )();
diff --git a/sources/plugins/button/lang/af.js b/sources/plugins/button/lang/af.js
new file mode 100644
index 00000000..03c8ec2c
--- /dev/null
+++ b/sources/plugins/button/lang/af.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'af', {
7 selectedLabel: '%1 uitgekies'
8} );
diff --git a/sources/plugins/button/lang/ar.js b/sources/plugins/button/lang/ar.js
new file mode 100644
index 00000000..06ac9de3
--- /dev/null
+++ b/sources/plugins/button/lang/ar.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ar', {
7 selectedLabel: '%1 (محدد)'
8} );
diff --git a/sources/plugins/button/lang/bg.js b/sources/plugins/button/lang/bg.js
new file mode 100644
index 00000000..11b356ee
--- /dev/null
+++ b/sources/plugins/button/lang/bg.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'bg', {
7 selectedLabel: '%1 (Избрано)'
8} );
diff --git a/sources/plugins/button/lang/ca.js b/sources/plugins/button/lang/ca.js
new file mode 100644
index 00000000..9b0aadac
--- /dev/null
+++ b/sources/plugins/button/lang/ca.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ca', {
7 selectedLabel: '%1 (Seleccionat)'
8} );
diff --git a/sources/plugins/button/lang/cs.js b/sources/plugins/button/lang/cs.js
new file mode 100644
index 00000000..172f712a
--- /dev/null
+++ b/sources/plugins/button/lang/cs.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'cs', {
7 selectedLabel: '%1 (Vybráno)'
8} );
diff --git a/sources/plugins/button/lang/da.js b/sources/plugins/button/lang/da.js
new file mode 100644
index 00000000..16f2f6bf
--- /dev/null
+++ b/sources/plugins/button/lang/da.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'da', {
7 selectedLabel: '%1 (Valgt)'
8} );
diff --git a/sources/plugins/button/lang/de.js b/sources/plugins/button/lang/de.js
new file mode 100644
index 00000000..a1c07a0b
--- /dev/null
+++ b/sources/plugins/button/lang/de.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'de', {
7 selectedLabel: '%1 (Ausgewählt)'
8} );
diff --git a/sources/plugins/button/lang/el.js b/sources/plugins/button/lang/el.js
new file mode 100644
index 00000000..37aa384d
--- /dev/null
+++ b/sources/plugins/button/lang/el.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'el', {
7 selectedLabel: '%1 (Επιλεγμένο)'
8} );
diff --git a/sources/plugins/button/lang/en-gb.js b/sources/plugins/button/lang/en-gb.js
new file mode 100644
index 00000000..cd7c4a19
--- /dev/null
+++ b/sources/plugins/button/lang/en-gb.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'en-gb', {
7 selectedLabel: '%1 (Selected)'
8} );
diff --git a/sources/plugins/button/lang/en.js b/sources/plugins/button/lang/en.js
new file mode 100644
index 00000000..cb07e4fc
--- /dev/null
+++ b/sources/plugins/button/lang/en.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'en', {
7 selectedLabel: '%1 (Selected)'
8} );
diff --git a/sources/plugins/button/lang/eo.js b/sources/plugins/button/lang/eo.js
new file mode 100644
index 00000000..ef12a0b6
--- /dev/null
+++ b/sources/plugins/button/lang/eo.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'eo', {
7 selectedLabel: '%1 (Selektita)'
8} );
diff --git a/sources/plugins/button/lang/es.js b/sources/plugins/button/lang/es.js
new file mode 100644
index 00000000..0a272085
--- /dev/null
+++ b/sources/plugins/button/lang/es.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'es', {
7 selectedLabel: '%1 (Seleccionado)'
8} );
diff --git a/sources/plugins/button/lang/eu.js b/sources/plugins/button/lang/eu.js
new file mode 100644
index 00000000..d932a7d8
--- /dev/null
+++ b/sources/plugins/button/lang/eu.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'eu', {
7 selectedLabel: '%1 (hautatuta)'
8} );
diff --git a/sources/plugins/button/lang/fa.js b/sources/plugins/button/lang/fa.js
new file mode 100644
index 00000000..73d37e66
--- /dev/null
+++ b/sources/plugins/button/lang/fa.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'fa', {
7 selectedLabel: '%1 (انتخاب شده)'
8} );
diff --git a/sources/plugins/button/lang/fi.js b/sources/plugins/button/lang/fi.js
new file mode 100644
index 00000000..dd706fa1
--- /dev/null
+++ b/sources/plugins/button/lang/fi.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'fi', {
7 selectedLabel: '%1 (Valittu)'
8} );
diff --git a/sources/plugins/button/lang/fr.js b/sources/plugins/button/lang/fr.js
new file mode 100644
index 00000000..86dd735d
--- /dev/null
+++ b/sources/plugins/button/lang/fr.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'fr', {
7 selectedLabel: '%1 (Sélectionné)'
8} );
diff --git a/sources/plugins/button/lang/gl.js b/sources/plugins/button/lang/gl.js
new file mode 100644
index 00000000..f34d2f3f
--- /dev/null
+++ b/sources/plugins/button/lang/gl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'gl', {
7 selectedLabel: '%1 (seleccionado)'
8} );
diff --git a/sources/plugins/button/lang/he.js b/sources/plugins/button/lang/he.js
new file mode 100644
index 00000000..5911f30f
--- /dev/null
+++ b/sources/plugins/button/lang/he.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'he', {
7 selectedLabel: '1% (סומן)'
8} );
diff --git a/sources/plugins/button/lang/hu.js b/sources/plugins/button/lang/hu.js
new file mode 100644
index 00000000..ecfbf0ae
--- /dev/null
+++ b/sources/plugins/button/lang/hu.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'hu', {
7 selectedLabel: '%1 (Kiválasztva)'
8} );
diff --git a/sources/plugins/button/lang/id.js b/sources/plugins/button/lang/id.js
new file mode 100644
index 00000000..29d04a0a
--- /dev/null
+++ b/sources/plugins/button/lang/id.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'id', {
7 selectedLabel: '%1(Dipilih)'
8} );
diff --git a/sources/plugins/button/lang/it.js b/sources/plugins/button/lang/it.js
new file mode 100644
index 00000000..e563591e
--- /dev/null
+++ b/sources/plugins/button/lang/it.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'it', {
7 selectedLabel: '%1 (selezionato)'
8} );
diff --git a/sources/plugins/button/lang/ja.js b/sources/plugins/button/lang/ja.js
new file mode 100644
index 00000000..fdac0604
--- /dev/null
+++ b/sources/plugins/button/lang/ja.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ja', {
7 selectedLabel: '%1 (選択中)'
8} );
diff --git a/sources/plugins/button/lang/km.js b/sources/plugins/button/lang/km.js
new file mode 100644
index 00000000..830061fb
--- /dev/null
+++ b/sources/plugins/button/lang/km.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'km', {
7 selectedLabel: '%1 (បាន​ជ្រើស​រើស)'
8} );
diff --git a/sources/plugins/button/lang/ko.js b/sources/plugins/button/lang/ko.js
new file mode 100644
index 00000000..ed1ecc2e
--- /dev/null
+++ b/sources/plugins/button/lang/ko.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ko', {
7 selectedLabel: '%1 (선택됨)'
8} );
diff --git a/sources/plugins/button/lang/ku.js b/sources/plugins/button/lang/ku.js
new file mode 100644
index 00000000..9920be19
--- /dev/null
+++ b/sources/plugins/button/lang/ku.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ku', {
7 selectedLabel: '%1 (هەڵبژێردراو)'
8} );
diff --git a/sources/plugins/button/lang/lt.js b/sources/plugins/button/lang/lt.js
new file mode 100644
index 00000000..1f30aa94
--- /dev/null
+++ b/sources/plugins/button/lang/lt.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'lt', {
7 selectedLabel: '%1 (Pasirinkta)'
8} );
diff --git a/sources/plugins/button/lang/nb.js b/sources/plugins/button/lang/nb.js
new file mode 100644
index 00000000..2d866303
--- /dev/null
+++ b/sources/plugins/button/lang/nb.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'nb', {
7 selectedLabel: '%1 (Valgt)'
8} );
diff --git a/sources/plugins/button/lang/nl.js b/sources/plugins/button/lang/nl.js
new file mode 100644
index 00000000..c750f638
--- /dev/null
+++ b/sources/plugins/button/lang/nl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'nl', {
7 selectedLabel: '%1 (Geselecteerd)'
8} );
diff --git a/sources/plugins/button/lang/pl.js b/sources/plugins/button/lang/pl.js
new file mode 100644
index 00000000..661f372a
--- /dev/null
+++ b/sources/plugins/button/lang/pl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'pl', {
7 selectedLabel: '%1 (Wybrany)'
8} );
diff --git a/sources/plugins/button/lang/pt-br.js b/sources/plugins/button/lang/pt-br.js
new file mode 100644
index 00000000..18c09381
--- /dev/null
+++ b/sources/plugins/button/lang/pt-br.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'pt-br', {
7 selectedLabel: '%1 (Selecionado)'
8} );
diff --git a/sources/plugins/button/lang/pt.js b/sources/plugins/button/lang/pt.js
new file mode 100644
index 00000000..af7e673d
--- /dev/null
+++ b/sources/plugins/button/lang/pt.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'pt', {
7 selectedLabel: '%1 (Selecionado)'
8} );
diff --git a/sources/plugins/button/lang/ro.js b/sources/plugins/button/lang/ro.js
new file mode 100644
index 00000000..44dee158
--- /dev/null
+++ b/sources/plugins/button/lang/ro.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ro', {
7 selectedLabel: '%1 (Selectat)'
8} );
diff --git a/sources/plugins/button/lang/ru.js b/sources/plugins/button/lang/ru.js
new file mode 100644
index 00000000..bbfa42be
--- /dev/null
+++ b/sources/plugins/button/lang/ru.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ru', {
7 selectedLabel: '%1 (Выбрано)'
8} );
diff --git a/sources/plugins/button/lang/sk.js b/sources/plugins/button/lang/sk.js
new file mode 100644
index 00000000..b4f35aa8
--- /dev/null
+++ b/sources/plugins/button/lang/sk.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'sk', {
7 selectedLabel: '%1 (Vybrané)'
8} );
diff --git a/sources/plugins/button/lang/sl.js b/sources/plugins/button/lang/sl.js
new file mode 100644
index 00000000..4faf3c55
--- /dev/null
+++ b/sources/plugins/button/lang/sl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'sl', {
7 selectedLabel: '%1 (Izbrano)'
8} );
diff --git a/sources/plugins/button/lang/sq.js b/sources/plugins/button/lang/sq.js
new file mode 100644
index 00000000..e67b12ad
--- /dev/null
+++ b/sources/plugins/button/lang/sq.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'sq', {
7 selectedLabel: '%1 (Përzgjedhur)'
8} );
diff --git a/sources/plugins/button/lang/sv.js b/sources/plugins/button/lang/sv.js
new file mode 100644
index 00000000..9e714be3
--- /dev/null
+++ b/sources/plugins/button/lang/sv.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'sv', {
7 selectedLabel: '%1 (Vald)'
8} );
diff --git a/sources/plugins/button/lang/tr.js b/sources/plugins/button/lang/tr.js
new file mode 100644
index 00000000..06ad32b0
--- /dev/null
+++ b/sources/plugins/button/lang/tr.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'tr', {
7 selectedLabel: '%1 (Seçilmiş)'
8} );
diff --git a/sources/plugins/button/lang/tt.js b/sources/plugins/button/lang/tt.js
new file mode 100644
index 00000000..5572afac
--- /dev/null
+++ b/sources/plugins/button/lang/tt.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'tt', {
7 selectedLabel: '%1 (Сайланган)'
8} );
diff --git a/sources/plugins/button/lang/ug.js b/sources/plugins/button/lang/ug.js
new file mode 100644
index 00000000..a2ceef5b
--- /dev/null
+++ b/sources/plugins/button/lang/ug.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'ug', {
7 selectedLabel: '%1 (تاللاندى)'
8} );
diff --git a/sources/plugins/button/lang/uk.js b/sources/plugins/button/lang/uk.js
new file mode 100644
index 00000000..ddec74ae
--- /dev/null
+++ b/sources/plugins/button/lang/uk.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'uk', {
7 selectedLabel: '%1 (Вибрано)'
8} );
diff --git a/sources/plugins/button/lang/vi.js b/sources/plugins/button/lang/vi.js
new file mode 100644
index 00000000..7a7adc01
--- /dev/null
+++ b/sources/plugins/button/lang/vi.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'vi', {
7 selectedLabel: '%1 (Đã chọn)'
8} );
diff --git a/sources/plugins/button/lang/zh-cn.js b/sources/plugins/button/lang/zh-cn.js
new file mode 100644
index 00000000..726a3dc7
--- /dev/null
+++ b/sources/plugins/button/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'zh-cn', {
7 selectedLabel: '已选中 %1 项'
8} );
diff --git a/sources/plugins/button/lang/zh.js b/sources/plugins/button/lang/zh.js
new file mode 100644
index 00000000..95949474
--- /dev/null
+++ b/sources/plugins/button/lang/zh.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'button', 'zh', {
7 selectedLabel: '%1 (已選取)'
8} );
diff --git a/sources/plugins/button/plugin.js b/sources/plugins/button/plugin.js
new file mode 100644
index 00000000..2338229c
--- /dev/null
+++ b/sources/plugins/button/plugin.js
@@ -0,0 +1,377 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var template = '<a id="{id}"' +
8 ' class="cke_button cke_button__{name} cke_button_{state} {cls}"' +
9 ( CKEDITOR.env.gecko && !CKEDITOR.env.hc ? '' : ' href="javascript:void(\'{titleJs}\')"' ) +
10 ' title="{title}"' +
11 ' tabindex="-1"' +
12 ' hidefocus="true"' +
13 ' role="button"' +
14 ' aria-labelledby="{id}_label"' +
15 ' aria-haspopup="{hasArrow}"' +
16 ' aria-disabled="{ariaDisabled}"';
17
18 // Some browsers don't cancel key events in the keydown but in the
19 // keypress.
20 // TODO: Check if really needed.
21 if ( CKEDITOR.env.gecko && CKEDITOR.env.mac )
22 template += ' onkeypress="return false;"';
23
24 // With Firefox, we need to force the button to redraw, otherwise it
25 // will remain in the focus state.
26 if ( CKEDITOR.env.gecko )
27 template += ' onblur="this.style.cssText = this.style.cssText;"';
28
29 template += ' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);"' +
30 ' onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" ' +
31 ( CKEDITOR.env.ie ? 'onclick="return false;" onmouseup' : 'onclick' ) + // #188
32 '="CKEDITOR.tools.callFunction({clickFn},this);return false;">' +
33 '<span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"';
34
35
36 template += '>&nbsp;</span>' +
37 '<span id="{id}_label" class="cke_button_label cke_button__{name}_label" aria-hidden="false">{label}</span>' +
38 '{arrowHtml}' +
39 '</a>';
40
41 var templateArrow = '<span class="cke_button_arrow">' +
42 // BLACK DOWN-POINTING TRIANGLE
43 ( CKEDITOR.env.hc ? '&#9660;' : '' ) +
44 '</span>';
45
46 var btnArrowTpl = CKEDITOR.addTemplate( 'buttonArrow', templateArrow ),
47 btnTpl = CKEDITOR.addTemplate( 'button', template );
48
49 CKEDITOR.plugins.add( 'button', {
50 lang: 'af,ar,bg,ca,cs,da,de,el,en,en-gb,eo,es,eu,fa,fi,fr,gl,he,hu,id,it,ja,km,ko,ku,lt,nb,nl,pl,pt,pt-br,ro,ru,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
51 beforeInit: function( editor ) {
52 editor.ui.addHandler( CKEDITOR.UI_BUTTON, CKEDITOR.ui.button.handler );
53 }
54 } );
55
56 /**
57 * Button UI element.
58 *
59 * @readonly
60 * @property {String} [='button']
61 * @member CKEDITOR
62 */
63 CKEDITOR.UI_BUTTON = 'button';
64
65 /**
66 * Represents a button UI element. This class should not be called directly. To
67 * create new buttons use {@link CKEDITOR.ui#addButton} instead.
68 *
69 * @class
70 * @constructor Creates a button class instance.
71 * @param {Object} definition The button definition.
72 */
73 CKEDITOR.ui.button = function( definition ) {
74 CKEDITOR.tools.extend( this, definition,
75 // Set defaults.
76 {
77 title: definition.label,
78 click: definition.click ||
79 function( editor ) {
80 editor.execCommand( definition.command );
81 }
82 } );
83
84 this._ = {};
85 };
86
87 /**
88 * Represents the button handler object.
89 *
90 * @class
91 * @singleton
92 * @extends CKEDITOR.ui.handlerDefinition
93 */
94 CKEDITOR.ui.button.handler = {
95 /**
96 * Transforms a button definition in a {@link CKEDITOR.ui.button} instance.
97 *
98 * @member CKEDITOR.ui.button.handler
99 * @param {Object} definition
100 * @returns {CKEDITOR.ui.button}
101 */
102 create: function( definition ) {
103 return new CKEDITOR.ui.button( definition );
104 }
105 };
106
107 /** @class CKEDITOR.ui.button */
108 CKEDITOR.ui.button.prototype = {
109 /**
110 * Renders the button.
111 *
112 * @param {CKEDITOR.editor} editor The editor instance which this button is
113 * to be used by.
114 * @param {Array} output The output array to which the HTML code related to
115 * this button should be appended.
116 */
117 render: function( editor, output ) {
118 function updateState() {
119 // "this" is a CKEDITOR.ui.button instance.
120 var mode = editor.mode;
121
122 if ( mode ) {
123 // Restore saved button state.
124 var state = this.modes[ mode ] ? modeStates[ mode ] !== undefined ? modeStates[ mode ] : CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
125
126 state = editor.readOnly && !this.readOnly ? CKEDITOR.TRISTATE_DISABLED : state;
127
128 this.setState( state );
129
130 // Let plugin to disable button.
131 if ( this.refresh )
132 this.refresh();
133 }
134 }
135
136 var env = CKEDITOR.env,
137 id = this._.id = CKEDITOR.tools.getNextId(),
138 stateName = '',
139 command = this.command,
140 // Get the command name.
141 clickFn;
142
143 this._.editor = editor;
144
145 var instance = {
146 id: id,
147 button: this,
148 editor: editor,
149 focus: function() {
150 var element = CKEDITOR.document.getById( id );
151 element.focus();
152 },
153 execute: function() {
154 this.button.click( editor );
155 },
156 attach: function( editor ) {
157 this.button.attach( editor );
158 }
159 };
160
161 var keydownFn = CKEDITOR.tools.addFunction( function( ev ) {
162 if ( instance.onkey ) {
163 ev = new CKEDITOR.dom.event( ev );
164 return ( instance.onkey( instance, ev.getKeystroke() ) !== false );
165 }
166 } );
167
168 var focusFn = CKEDITOR.tools.addFunction( function( ev ) {
169 var retVal;
170
171 if ( instance.onfocus )
172 retVal = ( instance.onfocus( instance, new CKEDITOR.dom.event( ev ) ) !== false );
173
174 return retVal;
175 } );
176
177 var selLocked = 0;
178
179 instance.clickFn = clickFn = CKEDITOR.tools.addFunction( function() {
180
181 // Restore locked selection in Opera.
182 if ( selLocked ) {
183 editor.unlockSelection( 1 );
184 selLocked = 0;
185 }
186 instance.execute();
187
188 // Fixed iOS focus issue when your press disabled button (#12381).
189 if ( env.iOS ) {
190 editor.focus();
191 }
192 } );
193
194
195 // Indicate a mode sensitive button.
196 if ( this.modes ) {
197 var modeStates = {};
198
199 editor.on( 'beforeModeUnload', function() {
200 if ( editor.mode && this._.state != CKEDITOR.TRISTATE_DISABLED )
201 modeStates[ editor.mode ] = this._.state;
202 }, this );
203
204 // Update status when activeFilter, mode or readOnly changes.
205 editor.on( 'activeFilterChange', updateState, this );
206 editor.on( 'mode', updateState, this );
207 // If this button is sensitive to readOnly state, update it accordingly.
208 !this.readOnly && editor.on( 'readOnly', updateState, this );
209
210 } else if ( command ) {
211 // Get the command instance.
212 command = editor.getCommand( command );
213
214 if ( command ) {
215 command.on( 'state', function() {
216 this.setState( command.state );
217 }, this );
218
219 stateName += ( command.state == CKEDITOR.TRISTATE_ON ? 'on' : command.state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' : 'off' );
220 }
221 }
222
223 // For button that has text-direction awareness on selection path.
224 if ( this.directional ) {
225 editor.on( 'contentDirChanged', function( evt ) {
226 var el = CKEDITOR.document.getById( this._.id ),
227 icon = el.getFirst();
228
229 var pathDir = evt.data;
230
231 // Make a minor direction change to become style-able for the skin icon.
232 if ( pathDir != editor.lang.dir )
233 el.addClass( 'cke_' + pathDir );
234 else
235 el.removeClass( 'cke_ltr' ).removeClass( 'cke_rtl' );
236
237 // Inline style update for the plugin icon.
238 icon.setAttribute( 'style', CKEDITOR.skin.getIconStyle( iconName, pathDir == 'rtl', this.icon, this.iconOffset ) );
239 }, this );
240 }
241
242 if ( !command )
243 stateName += 'off';
244
245 var name = this.name || this.command,
246 iconName = name;
247
248 // Check if we're pointing to an icon defined by another command. (#9555)
249 if ( this.icon && !( /\./ ).test( this.icon ) ) {
250 iconName = this.icon;
251 this.icon = null;
252 }
253
254 var params = {
255 id: id,
256 name: name,
257 iconName: iconName,
258 label: this.label,
259 cls: this.className || '',
260 state: stateName,
261 ariaDisabled: stateName == 'disabled' ? 'true' : 'false',
262 title: this.title,
263 titleJs: env.gecko && !env.hc ? '' : ( this.title || '' ).replace( "'", '' ),
264 hasArrow: this.hasArrow ? 'true' : 'false',
265 keydownFn: keydownFn,
266 focusFn: focusFn,
267 clickFn: clickFn,
268 style: CKEDITOR.skin.getIconStyle( iconName, ( editor.lang.dir == 'rtl' ), this.icon, this.iconOffset ),
269 arrowHtml: this.hasArrow ? btnArrowTpl.output() : ''
270 };
271
272 btnTpl.output( params, output );
273
274 if ( this.onRender )
275 this.onRender();
276
277 return instance;
278 },
279
280 /**
281 * Sets the button state.
282 *
283 * @param {Number} state Indicates the button state. One of {@link CKEDITOR#TRISTATE_ON},
284 * {@link CKEDITOR#TRISTATE_OFF}, or {@link CKEDITOR#TRISTATE_DISABLED}.
285 */
286 setState: function( state ) {
287 if ( this._.state == state )
288 return false;
289
290 this._.state = state;
291
292 var element = CKEDITOR.document.getById( this._.id );
293
294 if ( element ) {
295 element.setState( state, 'cke_button' );
296
297 state == CKEDITOR.TRISTATE_DISABLED ?
298 element.setAttribute( 'aria-disabled', true ) :
299 element.removeAttribute( 'aria-disabled' );
300
301 if ( !this.hasArrow ) {
302 // Note: aria-pressed attribute should not be added to menuButton instances. (#11331)
303 state == CKEDITOR.TRISTATE_ON ?
304 element.setAttribute( 'aria-pressed', true ) :
305 element.removeAttribute( 'aria-pressed' );
306 } else {
307 var newLabel = state == CKEDITOR.TRISTATE_ON ?
308 this._.editor.lang.button.selectedLabel.replace( /%1/g, this.label ) : this.label;
309 CKEDITOR.document.getById( this._.id + '_label' ).setText( newLabel );
310 }
311
312 return true;
313 } else {
314 return false;
315 }
316 },
317
318 /**
319 * Gets the button state.
320 *
321 * @returns {Number} The button state. One of {@link CKEDITOR#TRISTATE_ON},
322 * {@link CKEDITOR#TRISTATE_OFF}, or {@link CKEDITOR#TRISTATE_DISABLED}.
323 */
324 getState: function() {
325 return this._.state;
326 },
327
328 /**
329 * Returns this button's {@link CKEDITOR.feature} instance.
330 *
331 * It may be this button instance if it has at least one of
332 * `allowedContent` and `requiredContent` properties. Otherwise,
333 * if a command is bound to this button by the `command` property, then
334 * that command will be returned.
335 *
336 * This method implements the {@link CKEDITOR.feature#toFeature} interface method.
337 *
338 * @since 4.1
339 * @param {CKEDITOR.editor} Editor instance.
340 * @returns {CKEDITOR.feature} The feature.
341 */
342 toFeature: function( editor ) {
343 if ( this._.feature )
344 return this._.feature;
345
346 var feature = this;
347
348 // If button isn't a feature, return command if is bound.
349 if ( !this.allowedContent && !this.requiredContent && this.command )
350 feature = editor.getCommand( this.command ) || feature;
351
352 return this._.feature = feature;
353 }
354 };
355
356 /**
357 * Adds a button definition to the UI elements list.
358 *
359 * editorInstance.ui.addButton( 'MyBold', {
360 * label: 'My Bold',
361 * command: 'bold',
362 * toolbar: 'basicstyles,1'
363 * } );
364 *
365 * @member CKEDITOR.ui
366 * @param {String} name The button name.
367 * @param {Object} definition The button definition.
368 * @param {String} definition.label The textual part of the button (if visible) and its tooltip.
369 * @param {String} definition.command The command to be executed once the button is activated.
370 * @param {String} definition.toolbar The {@link CKEDITOR.config#toolbarGroups toolbar group} into which
371 * the button will be added. An optional index value (separated by a comma) determines the button position within the group.
372 */
373 CKEDITOR.ui.prototype.addButton = function( name, definition ) {
374 this.add( name, CKEDITOR.UI_BUTTON, definition );
375 };
376
377} )();
diff --git a/sources/plugins/clipboard/dev/clipboard.html b/sources/plugins/clipboard/dev/clipboard.html
new file mode 100644
index 00000000..00a073f8
--- /dev/null
+++ b/sources/plugins/clipboard/dev/clipboard.html
@@ -0,0 +1,190 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Clipboard playground &ndash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <link href="../../../samples/old/sample.css" rel="stylesheet">
12 <style>
13body {
14 margin: 0;
15}
16
17#editables, #console
18{
19 width: 48%;
20}
21#editable {
22 padding: 5px 10px;
23}
24
25#console {
26 position: fixed;
27 top: 10px;
28 right: 30px;
29 height: 500px;
30 border: solid 3px #555;
31 overflow: auto;
32}
33#console > p {
34 border-bottom: solid 1px #555;
35 margin: 0;
36 padding: 0 5px;
37 background: rgba(0, 0, 0, 0.25);
38 transition: background-color 1s;
39}
40#console > p.old {
41 background: rgba(0, 0, 0, 0);
42}
43#console time, #console .prompt {
44 padding: 0 5px;
45 display: inline-block;
46}
47#console time {
48 background: #999;
49 background: rgba(0, 0, 0, 0.5 );
50 color: #FFF;
51 margin-left: -5px;
52}
53#console .prompt {
54 background: #DDD;
55 background: rgba(0, 0, 0, 0.1 );
56 min-width: 200px;
57}
58.someClass {
59 color: blue;
60}
61.specChar {
62 color: #777;
63 background-color: #EEE;
64 background-color: rgba(0, 0, 0, 0.1);
65 font-size: 0.8em;
66 border-radius: 2px;
67 padding: 1px;
68}
69 </style>
70</head>
71<body>
72 <h1 class="samples">
73 CKEditor Sample &mdash; clipboard plugin playground
74 </h1>
75 <div id="editables">
76 <p>
77 <label for="editor1">
78 Editor 1:</label>
79 <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
80 </p>
81 <p>
82 <label for="editor2">
83 Editor 2:</label>
84 <textarea cols="80" id="editor2" name="editor2" rows="10">&lt;p&gt;This is more &lt;strong class="MsoNormal"&gt;sample text&lt;/strong&gt;.&lt;/p&gt;</textarea>
85 </p>
86 <p>
87 <label for="editor3">
88 Editor 3:</label>
89 <textarea cols="80" id="editor3" name="editor3" rows="10">&lt;p&gt;This editor &lt;strong&gt;forces pasting in text mode&lt;/strong&gt; by listening for "beforePaste" event.&lt;/p&gt;</textarea>
90 </p>
91 <p>
92 <label for="editor4">
93 Editor 4:</label>
94 <textarea cols="80" id="editor4" name="editor4" rows="10">&lt;p&gt;This editor &lt;strong&gt;forces pasting in text mode&lt;/strong&gt; by "forcePasteAsPlainText" config option.&lt;/p&gt;</textarea>
95 </p>
96 <p>
97 <label for="editor5">
98 Editor 5:</label>
99 <textarea cols="80" id="editor5" name="editor5" rows="10">Editor with autoParagraphing set to off.</textarea>
100 </p>
101 <div id="editor6" contenteditable="true" style="font-family: Georgia; font-size: 14px">
102 <h1>Editor 6</h1>
103 <p>Content content content.</p>
104 <p class="someClass">Styled by <code>.someClass</code>.</p>
105 </div>
106 </div>
107 <div id="console">
108 </div>
109 <script>
110( function()
111{
112 'use strict';
113
114 var log = window.__log = function( title, msg ) {
115 var msgEl = new CKEDITOR.dom.element( 'p' ),
116 consoleEl = CKEDITOR.document.getById( 'console' ),
117 time = new Date().toString().match( /\d\d:\d\d:\d\d/ )[ 0 ],
118 format = function( tpl ) {
119 return tpl.replace( /{time}/g, time ).replace( '{title}', title ).replace( '{msg}', msg || '' );
120 };
121
122 window.console && console.log && console.log( format( '[{time}] {title}: {msg}' ) );
123
124 msg = ( msg || '' ).replace( /\r/g, '{\\r}' ).replace( /\n/g, '{\\n}' ).replace( /\t/g, '{\\t}' );
125 msg = CKEDITOR.tools.htmlEncode( msg );
126 msg = msg.replace( /\{(\\\w)\}/g, '<code class="specChar">$1</code>' );
127
128 msgEl.setHtml( format( '<time datetime="{time}">{time}</time><span class="prompt">{title}</span> {msg}' ) );
129 consoleEl.append( msgEl );
130 consoleEl.$.scrollTop = consoleEl.$.scrollHeight;
131 setTimeout( function() { msgEl.addClass( 'old' ); }, 250 );
132 };
133
134 var observe = function( editor, num ) {
135 var p = 'EDITOR ' + num + ' > ';
136
137 editor.on( 'paste', function( event ) {
138 log( p + 'paste(prior:-1)', event.data.type + ' - "' + event.data.dataValue + '"' );
139 }, null, null, -1 );
140 editor.on( 'paste', function( event ) {
141 log( p + 'paste(prior:10)', event.data.type + ' - "' + event.data.dataValue + '"' );
142 } );
143 editor.on( 'paste', function( event ) {
144 log( p + 'paste(prior:999)', event.data.type + ' - "' + event.data.dataValue + '"' );
145 }, null, null, 999 );
146 editor.on( 'beforePaste', function( event ) {
147 log( p + 'beforePaste', event.data.type );
148 } );
149 editor.on( 'beforePaste', function( event ) {
150 log( p + 'beforePaste(prior:999)', event.data.type );
151 }, null, null, 999 );
152 editor.on( 'afterPaste', function( event ) {
153 log( p + 'afterPaste' );
154 } );
155 editor.on( 'copy', function( event ) {
156 log( p + 'copy' );
157 } );
158 editor.on( 'cut', function( event ) {
159 log( p + 'cut' );
160 } );
161 };
162
163 CKEDITOR.disableAutoInline = true;
164 var config = {
165 height: 120,
166 toolbar: [ [ 'Source' ] ],
167 allowedContent: true
168 },
169 editor1 = CKEDITOR.replace( 'editor1', config ),
170 editor2 = CKEDITOR.replace( 'editor2', config ),
171 editor3 = CKEDITOR.replace( 'editor3', config ),
172 editor4 = CKEDITOR.replace( 'editor4', CKEDITOR.tools.extend( { forcePasteAsPlainText: true }, config ) ),
173 editor5 = CKEDITOR.replace( 'editor5', CKEDITOR.tools.extend( { autoParagraph: false }, config ) ),
174 editor6 = CKEDITOR.inline( document.getElementById( 'editor6' ), config );
175
176 editor3.on( 'beforePaste', function( evt ) {
177 evt.data.type = 'text';
178 } );
179
180 observe( editor1, 1 );
181 observe( editor2, 2 );
182 observe( editor3, 3 );
183 observe( editor4, 4 );
184 observe( editor5, 5 );
185 observe( editor6, 6 );
186
187})();
188 </script>
189</body>
190</html>
diff --git a/sources/plugins/clipboard/dev/console.js b/sources/plugins/clipboard/dev/console.js
new file mode 100644
index 00000000..f0cc92db
--- /dev/null
+++ b/sources/plugins/clipboard/dev/console.js
@@ -0,0 +1,49 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/* global CKCONSOLE */
7
8'use strict';
9
10( function() {
11 var pasteType, pasteValue;
12
13 CKCONSOLE.add( 'paste', {
14 panels: [
15 {
16 type: 'box',
17 content:
18 '<ul class="ckconsole_list">' +
19 '<li>type: <span class="ckconsole_value" data-value="type"></span></li>' +
20 '<li>value: <span class="ckconsole_value" data-value="value"></span></li>' +
21 '</ul>',
22
23 refresh: function() {
24 return {
25 header: 'Paste',
26 type: pasteType,
27 value: pasteValue
28 };
29 },
30
31 refreshOn: function( editor, refresh ) {
32 editor.on( 'paste', function( evt ) {
33 pasteType = evt.data.type;
34 pasteValue = CKEDITOR.tools.htmlEncode( evt.data.dataValue );
35 refresh();
36 } );
37 }
38 },
39 {
40 type: 'log',
41 on: function( editor, log, logFn ) {
42 editor.on( 'paste', function( evt ) {
43 logFn( 'paste; type:' + evt.data.type )();
44 } );
45 }
46 }
47 ]
48 } );
49} )();
diff --git a/sources/plugins/clipboard/dev/dnd.html b/sources/plugins/clipboard/dev/dnd.html
new file mode 100644
index 00000000..3a1845d1
--- /dev/null
+++ b/sources/plugins/clipboard/dev/dnd.html
@@ -0,0 +1,185 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Manual test for #11460</title>
10 <script src="../../../ckeditor.js"></script>
11 <script src="../../../dev/console/console.js"></script>
12 <script src="../../../plugins/clipboard/dev/console.js"></script>
13 <link rel="stylesheet" href="../../../samples/old/sample.css">
14 <style type="text/css">
15 h2 {
16 margin: 10px 0px 4px 0px;
17 padding: 0;
18 font-size: 14px;
19 }
20 h3 {
21 margin: 5px 0px 2px 0px;
22 padding: 0;
23 font-size: 12px;
24 }
25 </style>
26</head>
27<body>
28 <h1 class="samples">
29 Manual test for #11460
30 </h1>
31 <h2>Description (<a href="javascript:hideshow('description');">hide/show</a>)</h2>
32 <div id="description" class="description">
33 <p>Test internal D&amp;D in the editor, dropping content from an external source (helpers, MS Word) and D&amp;D between editors. Keep in mind that internal D&amp;D is the most complex operation because editor have to handle two ranges at the same time.</p>
34 <h3>Expected behavior:</h3>
35 <ul>
36 <li>proper drop position,</li>
37 <li>in the internal and cross editor D&amp;D: dragged content should be removed,</li>
38 <li>dropped content should be (more less) the same as dragged content,</li>
39 <li>paste event should be fired,</li>
40 <li>undo should work properly (one undo operation for one D&amp;D),</li>
41 <li>no crashes, nor errors,</li>
42 </ul>
43 <h3>Drag scenarios:</h3>
44 <ul>
45 <li>drag simple text,</li>
46 <li>drag table cell/cells,</li>
47 <li>drag link,</li>
48 <li>drag helpers textarea content,</li>
49 <li>drag helpers html content,</li>
50 <li>drag content from MS Word.</li>
51 </ul>
52 <h3>Drop scenarios:</h3>
53 <ul>
54 <li>drop in the different paragraph (before and after),</li>
55 <li>drop in the same paragraph (before and after),</li>
56 <li>drop in the same text node (before and after),</li>
57 <li>drop between text lines,</li>
58 <li>drop on the whitespace next to the header,</li>
59 <li>drop on the whitespace on the left side from the quote,</li>
60 <li>drop into a cell.</li>
61 </ul>
62 <h3>Known issues (not part of this ticket):</h3>
63 <ul>
64 <li>because of <a href="http://dev.ckeditor.com/ticket/11636">#11636</a> dragged content is not correct in some cases (e.g. when you drag part of the link),</li>
65 <li>drag position needs clean up after D&amp;D (e.g. remove empty paragraphs, fix table),</li>
66 <li>drop position needs clean up after D&amp;D (e.g. add spaces before/after dropped content, apply parents styles, break paragraph when one paragraph is dropped at the end to the other paragraph),</li>
67 <li>in the external D&amp;D: Chrome add plenty of addition tags.</li>
68 </ul>
69 </div>
70 <div>
71 <h2>Helpers (<a href="javascript:hideshow('helpers');">hide/show</a>)</h2>
72 <div id="helpers">
73 <textarea style="width:49%; height:50px; float: left;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. In commodo vulputate tempor. Sed <b>at</b> elit.</textarea>
74 <div style="width:49%; height:50px; float: right;">
75 Lorem ipsum <b>dolor</b> sit <i>amet</i>, consectetur adipiscing elit. In commodo vulputate tempor. Sed &lt;b&gt;at elit&lt;/b&gt; vel ligula mollis aliquet a ac odio.
76 <pre>
77Aenean cursus egestas ipsum.
78 </pre>
79 </div>
80 <div style="clear:both;"></div>
81 </div>
82 </div>
83 <div>
84 <h2>Classic editor (<a href="javascript:hideshow('classic-editor');">hide/show</a>)</h2>
85 <div id="classic-editor">
86 <textarea cols="80" id="classic" name="classic" rows="10">
87 &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;../../../samples/assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, 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.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;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 &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. 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 &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
88 </textarea>
89 </div>
90 </div>
91 <div>
92 <h2>Inline editor (<a href="javascript:hideshow('inline');">hide/show</a>)</h2>
93 <div id="inline" contenteditable="true">
94 <h1><img alt="Saturn V carrying Apollo 11" class="right" src="../../../samples/assets/sample.jpg" /> Apollo 11</h1>
95
96 <p><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, 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.</p>
97
98 <p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third member of the mission, <a href="http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)" title="Michael Collins (astronaut)">Michael Collins</a>, piloted the <a href="http://en.wikipedia.org/wiki/Apollo_Command/Service_Module" title="Apollo Command/Service Module">command</a> spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.</p>
99
100 <h2>Broadcasting and <em>quotes</em> <a id="quotes" name="quotes"></a></h2>
101
102 <p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:</p>
103
104 <blockquote>
105 <p>One small step for [a] man, one giant leap for mankind.</p>
106 </blockquote>
107
108 <p>Apollo 11 effectively ended the <a href="http://en.wikipedia.org/wiki/Space_Race" title="Space Race">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a href="http://en.wikipedia.org/wiki/John_F._Kennedy" title="John F. Kennedy">John F. Kennedy</a> in a speech before the United States Congress:</p>
109
110 <blockquote>
111 <p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p>
112 </blockquote>
113
114 <h2>Technical details <a id="tech-details" name="tech-details"></a></h2>
115
116 <table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0" style="border-collapse:collapse;margin:10px 0 10px 15px;">
117 <caption><strong>Mission crew</strong></caption>
118 <thead>
119 <tr>
120 <th scope="col">Position</th>
121 <th scope="col">Astronaut</th>
122 </tr>
123 </thead>
124 <tbody>
125 <tr>
126 <td>Commander</td>
127 <td>Neil A. Armstrong</td>
128 </tr>
129 <tr>
130 <td>Command Module Pilot</td>
131 <td>Michael Collins</td>
132 </tr>
133 <tr>
134 <td>Lunar Module Pilot</td>
135 <td>Edwin &quot;Buzz&quot; E. Aldrin, Jr.</td>
136 </tr>
137 </tbody>
138 </table>
139
140 <p>Launched by a <strong>Saturn V</strong> rocket from <a href="http://en.wikipedia.org/wiki/Kennedy_Space_Center" title="Kennedy Space Center">Kennedy Space Center</a> in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of <a href="http://en.wikipedia.org/wiki/NASA" title="NASA">NASA</a>&#39;s Apollo program. The Apollo spacecraft had three parts:</p>
141
142 <ol>
143 <li><strong>Command Module</strong> with a cabin for the three astronauts which was the only part which landed back on Earth</li>
144 <li><strong>Service Module</strong> which supported the Command Module with propulsion, electrical power, oxygen and water</li>
145 <li><strong>Lunar Module</strong> for landing on the Moon.</li>
146 </ol>
147
148 <p>After being sent to the Moon by the Saturn V&#39;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 <a href="http://en.wikipedia.org/wiki/Mare_Tranquillitatis" title="Mare Tranquillitatis">Sea of Tranquility</a>. 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 <a href="http://en.wikipedia.org/wiki/Pacific_Ocean" title="Pacific Ocean">Pacific Ocean</a> on July 24.</p>
149
150 <hr />
151 <p style="text-align: right;"><small>Source: <a href="http://en.wikipedia.org/wiki/Apollo_11">Wikipedia.org</a></small></p>
152 </div>
153 </div>
154 <script type="text/javascript">
155 CKEDITOR.disableAutoInline = true;
156
157 function hideshow( id ) {
158 var element = CKEDITOR.document.getById( id );
159
160 if( element.getStyle( 'display' ) == 'none' )
161 element.show();
162 else
163 element.hide();
164 }
165
166 CKEDITOR.replace( 'classic' );
167 CKEDITOR.inline( 'inline' );
168
169 CKCONSOLE.addEventPanel( 'dragstart', [ '$', 'target', 'dataTransfer' ] );
170 CKCONSOLE.addEventPanel( 'dragend', [ '$', 'target', 'dataTransfer' ] );
171 CKCONSOLE.addEventPanel( 'drop',
172 [ '$', 'target', 'dataTransfer', 'dragRange', 'dropRange' ] );
173
174 CKCONSOLE.create( 'dragstart', { editor: 'classic' } );
175 CKCONSOLE.create( 'drop', { editor: 'classic' } );
176 CKCONSOLE.create( 'paste', { editor: 'classic' } );
177 CKCONSOLE.create( 'dragend', { editor: 'classic' } );
178
179 CKCONSOLE.create( 'dragstart', { editor: 'inline' } );
180 CKCONSOLE.create( 'drop', { editor: 'inline' } );
181 CKCONSOLE.create( 'paste', { editor: 'inline' } );
182 CKCONSOLE.create( 'dragend', { editor: 'inline' } );
183 </script>
184</body>
185</html>
diff --git a/sources/plugins/clipboard/dialogs/paste.js b/sources/plugins/clipboard/dialogs/paste.js
new file mode 100644
index 00000000..369decf7
--- /dev/null
+++ b/sources/plugins/clipboard/dialogs/paste.js
@@ -0,0 +1,254 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'paste', function( editor ) {
7 var lang = editor.lang.clipboard,
8 clipboard = CKEDITOR.plugins.clipboard,
9 lastDataTransfer;
10
11 function onPasteFrameLoad( win ) {
12 var doc = new CKEDITOR.dom.document( win.document ),
13 body = doc.getBody(),
14 script = doc.getById( 'cke_actscrpt' );
15
16 script && script.remove();
17
18 body.setAttribute( 'contenteditable', true );
19
20 // Forward dataTransfer (#13883).
21 body.on( clipboard.mainPasteEvent, function( evt ) {
22 var dataTransfer = clipboard.initPasteDataTransfer( evt );
23
24 if ( !lastDataTransfer ) {
25 lastDataTransfer = dataTransfer;
26 } else
27 // For two paste with the same dataTransfer we can use that dataTransfer (two internal pastes are
28 // considered as an internal paste).
29 if ( dataTransfer != lastDataTransfer ) {
30 // If there were two paste with different DataTransfer objects create a new, empty, data transfer
31 // and use it (one internal and one external paste are considered as external paste).
32 lastDataTransfer = clipboard.initPasteDataTransfer();
33 }
34 } );
35
36 // IE before version 8 will leave cursor blinking inside the document after
37 // editor blurred unless we clean up the selection. (#4716)
38 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) {
39 doc.getWindow().on( 'blur', function() {
40 doc.$.selection.empty();
41 } );
42 }
43
44 doc.on( 'keydown', function( e ) {
45 var domEvent = e.data,
46 key = domEvent.getKeystroke(),
47 processed;
48
49 switch ( key ) {
50 case 27:
51 this.hide();
52 processed = 1;
53 break;
54
55 case 9:
56 case CKEDITOR.SHIFT + 9:
57 this.changeFocus( 1 );
58 processed = 1;
59 }
60
61 processed && domEvent.preventDefault();
62 }, this );
63
64 editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) );
65
66 // Handle pending focus.
67 if ( doc.getWindow().getFrame().removeCustomData( 'pendingFocus' ) )
68 body.focus();
69 }
70
71 // If pasteDialogCommit wasn't canceled by e.g. editor.getClipboardData
72 // then fire paste event.
73 // Do not use editor#paste, because it would start from beforePaste event.
74 editor.on( 'pasteDialogCommit', function( evt ) {
75 if ( evt.data )
76 editor.fire( 'paste', {
77 type: 'auto',
78 dataValue: evt.data.dataValue,
79 method: 'paste',
80 dataTransfer: evt.data.dataTransfer || clipboard.initPasteDataTransfer()
81 } );
82 }, null, null, 1000 );
83
84 return {
85 title: lang.title,
86
87 minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
88 minHeight: CKEDITOR.env.quirks ? 250 : 245,
89 onShow: function() {
90 // FIREFOX BUG: Force the browser to render the dialog to make the to-be-
91 // inserted iframe editable. (#3366)
92 this.parts.dialog.$.offsetHeight;
93
94 this.setupContent();
95
96 // Set dialog title to the custom value (set e.g. in editor.openDialog callback) and reset this value.
97 // If custom title not set, use default one.
98 this.parts.title.setHtml( this.customTitle || lang.title );
99 this.customTitle = null;
100 },
101
102 onLoad: function() {
103 if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )
104 this.parts.contents.setStyle( 'overflow', 'hidden' );
105 },
106
107 onOk: function() {
108 this.commitContent();
109 },
110
111 contents: [ {
112 id: 'general',
113 label: editor.lang.common.generalTab,
114 elements: [
115 {
116 type: 'html',
117 id: 'securityMsg',
118 html: '<div style="white-space:normal;width:340px">' + lang.securityMsg + '</div>'
119 },
120 {
121 type: 'html',
122 id: 'pasteMsg',
123 html: '<div style="white-space:normal;width:340px">' + lang.pasteMsg + '</div>'
124 },
125 {
126 type: 'html',
127 id: 'editing_area',
128 style: 'width:100%;height:100%',
129 html: '',
130 focus: function() {
131 var iframe = this.getInputElement(),
132 doc = iframe.getFrameDocument(),
133 body = doc.getBody();
134
135 // Frame content may not loaded at the moment.
136 if ( !body || body.isReadOnly() )
137 iframe.setCustomData( 'pendingFocus', 1 );
138 else
139 body.focus();
140 },
141 setup: function() {
142 var dialog = this.getDialog();
143 var htmlToLoad = '<html dir="' + editor.config.contentsLangDirection + '"' +
144 ' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +
145 '<head><style>body{margin:3px;height:95%;word-break:break-all;}</style></head><body>' +
146 '<script id="cke_actscrpt" type="text/javascript">' +
147 'window.parent.CKEDITOR.tools.callFunction(' + CKEDITOR.tools.addFunction( onPasteFrameLoad, dialog ) + ',this);' +
148 '</script></body>' +
149 '</html>';
150
151 var src =
152 CKEDITOR.env.air ?
153 'javascript:void(0)' : // jshint ignore:line
154 ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ?
155 'javascript:void((function(){' + encodeURIComponent( // jshint ignore:line
156 'document.open();' +
157 '(' + CKEDITOR.tools.fixDomain + ')();' +
158 'document.close();'
159 ) + '})())"'
160 : '';
161
162 var iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
163 ' class="cke_pasteframe"' +
164 ' frameborder="0" ' +
165 ' allowTransparency="true"' +
166 ' src="' + src + '"' +
167 ' aria-label="' + lang.pasteArea + '"' +
168 ' aria-describedby="' + dialog.getContentElement( 'general', 'pasteMsg' ).domId + '"' +
169 '></iframe>' );
170
171 // Reset last data transfer.
172 lastDataTransfer = null;
173
174 iframe.on( 'load', function( e ) {
175 e.removeListener();
176
177 var doc = iframe.getFrameDocument();
178 doc.write( htmlToLoad );
179
180 editor.focusManager.add( doc.getBody() );
181
182 if ( CKEDITOR.env.air )
183 onPasteFrameLoad.call( this, doc.getWindow().$ );
184 }, dialog );
185
186 iframe.setCustomData( 'dialog', dialog );
187
188 var container = this.getElement();
189 container.setHtml( '' );
190 container.append( iframe );
191
192 // IE need a redirect on focus to make
193 // the cursor blinking inside iframe. (#5461)
194 if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) {
195 var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute" role="presentation"></span>' );
196 focusGrabber.on( 'focus', function() {
197 // Since fixDomain is called in src attribute,
198 // IE needs some slight delay to correctly move focus.
199 setTimeout( function() {
200 iframe.$.contentWindow.focus();
201 } );
202 } );
203 container.append( focusGrabber );
204
205 // Override focus handler on field.
206 this.focus = function() {
207 focusGrabber.focus();
208 this.fire( 'focus' );
209 };
210 }
211
212 this.getInputElement = function() {
213 return iframe;
214 };
215
216 // Force container to scale in IE.
217 if ( CKEDITOR.env.ie ) {
218 container.setStyle( 'display', 'block' );
219 container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );
220 }
221 },
222 commit: function() {
223 var editor = this.getDialog().getParentEditor(),
224 body = this.getInputElement().getFrameDocument().getBody(),
225 bogus = body.getBogus(),
226 html;
227 bogus && bogus.remove();
228
229 // Saving the contents so changes until paste is complete will not take place (#7500)
230 html = body.getHtml();
231
232 // Opera needs some time to think about what has happened and what it should do now.
233 setTimeout( function() {
234 editor.fire( 'pasteDialogCommit', {
235 dataValue: html,
236 // Avoid error if there was no paste so lastDataTransfer is null.
237 dataTransfer: lastDataTransfer || clipboard.initPasteDataTransfer()
238 } );
239 }, 0 );
240 }
241 }
242 ]
243 } ]
244 };
245} );
246
247/**
248 * Internal event to pass paste dialog's data to the listeners.
249 *
250 * @private
251 * @event pasteDialogCommit
252 * @member CKEDITOR.editor
253 * @param {CKEDITOR.editor} editor This editor instance.
254 */
diff --git a/sources/plugins/clipboard/icons/copy-rtl.png b/sources/plugins/clipboard/icons/copy-rtl.png
new file mode 100644
index 00000000..ef724460
--- /dev/null
+++ b/sources/plugins/clipboard/icons/copy-rtl.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/copy.png b/sources/plugins/clipboard/icons/copy.png
new file mode 100644
index 00000000..ef724460
--- /dev/null
+++ b/sources/plugins/clipboard/icons/copy.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/cut-rtl.png b/sources/plugins/clipboard/icons/cut-rtl.png
new file mode 100644
index 00000000..0b719653
--- /dev/null
+++ b/sources/plugins/clipboard/icons/cut-rtl.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/cut.png b/sources/plugins/clipboard/icons/cut.png
new file mode 100644
index 00000000..0b719653
--- /dev/null
+++ b/sources/plugins/clipboard/icons/cut.png
Binary files 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 00000000..29026cc0
--- /dev/null
+++ b/sources/plugins/clipboard/icons/hidpi/copy-rtl.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/hidpi/copy.png b/sources/plugins/clipboard/icons/hidpi/copy.png
new file mode 100644
index 00000000..29026cc0
--- /dev/null
+++ b/sources/plugins/clipboard/icons/hidpi/copy.png
Binary files 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 00000000..bfec0cfb
--- /dev/null
+++ b/sources/plugins/clipboard/icons/hidpi/cut-rtl.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/hidpi/cut.png b/sources/plugins/clipboard/icons/hidpi/cut.png
new file mode 100644
index 00000000..bfec0cfb
--- /dev/null
+++ b/sources/plugins/clipboard/icons/hidpi/cut.png
Binary files 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 00000000..f18dac37
--- /dev/null
+++ b/sources/plugins/clipboard/icons/hidpi/paste-rtl.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/hidpi/paste.png b/sources/plugins/clipboard/icons/hidpi/paste.png
new file mode 100644
index 00000000..f18dac37
--- /dev/null
+++ b/sources/plugins/clipboard/icons/hidpi/paste.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/paste-rtl.png b/sources/plugins/clipboard/icons/paste-rtl.png
new file mode 100644
index 00000000..b2bfef20
--- /dev/null
+++ b/sources/plugins/clipboard/icons/paste-rtl.png
Binary files differ
diff --git a/sources/plugins/clipboard/icons/paste.png b/sources/plugins/clipboard/icons/paste.png
new file mode 100644
index 00000000..b2bfef20
--- /dev/null
+++ b/sources/plugins/clipboard/icons/paste.png
Binary files differ
diff --git a/sources/plugins/clipboard/lang/af.js b/sources/plugins/clipboard/lang/af.js
new file mode 100644
index 00000000..b7dbddc5
--- /dev/null
+++ b/sources/plugins/clipboard/lang/af.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'af', {
6 copy: 'Kopiëer',
7 copyError: 'U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).',
8 cut: 'Knip',
9 cutError: 'U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).',
10 paste: 'Plak',
11 pasteArea: 'Plak-area',
12 pasteMsg: 'Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.',
13 securityMsg: 'Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.',
14 title: 'Byvoeg'
15} );
diff --git a/sources/plugins/clipboard/lang/ar.js b/sources/plugins/clipboard/lang/ar.js
new file mode 100644
index 00000000..c6b6613d
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ar.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ar', {
6 copy: 'نسخ',
7 copyError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).',
8 cut: 'قص',
9 cutError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).',
10 paste: 'لصق',
11 pasteArea: 'منطقة اللصق',
12 pasteMsg: 'الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) في لوحة المفاتيح، ثم اضغط زر <STRONG>موافق</STRONG>.',
13 securityMsg: 'نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.',
14 title: 'لصق'
15} );
diff --git a/sources/plugins/clipboard/lang/bg.js b/sources/plugins/clipboard/lang/bg.js
new file mode 100644
index 00000000..c700865d
--- /dev/null
+++ b/sources/plugins/clipboard/lang/bg.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'bg', {
6 copy: 'Копирай',
7 copyError: 'Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни запаметяването. За целта използвайте клавиатурата (Ctrl/Cmd+C).',
8 cut: 'Отрежи',
9 cutError: 'Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).',
10 paste: 'Вмъкни',
11 pasteArea: 'Зона за вмъкване',
12 pasteMsg: 'Вмъкнете тук съдъжанието с клавиатуарата (<STRONG>Ctrl/Cmd+V</STRONG>) и натиснете <STRONG>OK</STRONG>.',
13 securityMsg: 'Заради настройките за сигурност на Вашия браузър, редакторът не може да прочете данните от клипборда коректно.',
14 title: 'Вмъкни'
15} );
diff --git a/sources/plugins/clipboard/lang/bn.js b/sources/plugins/clipboard/lang/bn.js
new file mode 100644
index 00000000..5df653c6
--- /dev/null
+++ b/sources/plugins/clipboard/lang/bn.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'bn', {
6 copy: 'কপি',
7 copyError: 'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।',
8 cut: 'কাট',
9 cutError: 'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।',
10 paste: 'পেস্ট',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন',
13 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
14 title: 'পেস্ট'
15} );
diff --git a/sources/plugins/clipboard/lang/bs.js b/sources/plugins/clipboard/lang/bs.js
new file mode 100644
index 00000000..e6c11949
--- /dev/null
+++ b/sources/plugins/clipboard/lang/bs.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'bs', {
6 copy: 'Kopiraj',
7 copyError: 'Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).',
8 cut: 'Izreži',
9 cutError: 'Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).',
10 paste: 'Zalijepi',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK', // MISSING
13 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
14 title: 'Zalijepi'
15} );
diff --git a/sources/plugins/clipboard/lang/ca.js b/sources/plugins/clipboard/lang/ca.js
new file mode 100644
index 00000000..0445e697
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ca.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ca', {
6 copy: 'Copiar',
7 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).',
8 cut: 'Retallar',
9 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).',
10 paste: 'Enganxar',
11 pasteArea: 'Àrea d\'enganxat',
12 pasteMsg: 'Si us plau, enganxi dins del següent camp utilitzant el teclat (<strong>Ctrl/Cmd+V</strong>) i premi OK.',
13 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.',
14 title: 'Enganxar'
15} );
diff --git a/sources/plugins/clipboard/lang/cs.js b/sources/plugins/clipboard/lang/cs.js
new file mode 100644
index 00000000..f32f1be6
--- /dev/null
+++ b/sources/plugins/clipboard/lang/cs.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'cs', {
6 copy: 'Kopírovat',
7 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).',
8 cut: 'Vyjmout',
9 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).',
10 paste: 'Vložit',
11 pasteArea: 'Oblast vkládání',
12 pasteMsg: 'Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Vložit'
15} );
diff --git a/sources/plugins/clipboard/lang/cy.js b/sources/plugins/clipboard/lang/cy.js
new file mode 100644
index 00000000..65e71254
--- /dev/null
+++ b/sources/plugins/clipboard/lang/cy.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'cy', {
6 copy: 'Copïo',
7 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).',
8 cut: 'Torri',
9 cutError: 'Nid yw gosodiadau diogelwch eich porwr yn caniatàu\'r golygydd i gynnal \'gweithredoedd torri\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).',
10 paste: 'Gludo',
11 pasteArea: 'Ardal Gludo',
12 pasteMsg: 'Gludwch i mewn i\'r blwch canlynol gan ddefnyddio\'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.',
13 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.',
14 title: 'Gludo'
15} );
diff --git a/sources/plugins/clipboard/lang/da.js b/sources/plugins/clipboard/lang/da.js
new file mode 100644
index 00000000..41f73069
--- /dev/null
+++ b/sources/plugins/clipboard/lang/da.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'da', {
6 copy: 'Kopiér',
7 copyError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).',
8 cut: 'Klip',
9 cutError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).',
10 paste: 'Indsæt',
11 pasteArea: 'Indsæt område',
12 pasteMsg: 'Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.',
13 securityMsg: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.',
14 title: 'Indsæt'
15} );
diff --git a/sources/plugins/clipboard/lang/de.js b/sources/plugins/clipboard/lang/de.js
new file mode 100644
index 00000000..baeb6528
--- /dev/null
+++ b/sources/plugins/clipboard/lang/de.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'de', {
6 copy: 'Kopieren',
7 copyError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).',
8 cut: 'Ausschneiden',
9 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).',
10 paste: 'Einfügen',
11 pasteArea: 'Einfügebereich',
12 pasteMsg: 'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Einfügen'
15} );
diff --git a/sources/plugins/clipboard/lang/el.js b/sources/plugins/clipboard/lang/el.js
new file mode 100644
index 00000000..57158663
--- /dev/null
+++ b/sources/plugins/clipboard/lang/el.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'el', {
6 copy: 'Αντιγραφή',
7 copyError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).',
8 cut: 'Αποκοπή',
9 cutError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).',
10 paste: 'Επικόλληση',
11 pasteArea: 'Περιοχή Επικόλλησης',
12 pasteMsg: 'Παρακαλώ επικολλήστε στο ακόλουθο κουτί χρησιμοποιώντας το πληκτρολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.',
13 securityMsg: 'Λόγων των ρυθμίσεων ασφάλειας του περιηγητή σας, ο επεξεργαστής δεν μπορεί να έχει πρόσβαση στην μνήμη επικόλλησης. Χρειάζεται να επικολλήσετε ξανά σε αυτό το παράθυρο.',
14 title: 'Επικόλληση'
15} );
diff --git a/sources/plugins/clipboard/lang/en-au.js b/sources/plugins/clipboard/lang/en-au.js
new file mode 100644
index 00000000..6c895f82
--- /dev/null
+++ b/sources/plugins/clipboard/lang/en-au.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'en-au', {
6 copy: 'Copy',
7 copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).',
8 cut: 'Cut',
9 cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).',
10 paste: 'Paste',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',
13 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.',
14 title: 'Paste'
15} );
diff --git a/sources/plugins/clipboard/lang/en-ca.js b/sources/plugins/clipboard/lang/en-ca.js
new file mode 100644
index 00000000..4f1220e0
--- /dev/null
+++ b/sources/plugins/clipboard/lang/en-ca.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'en-ca', {
6 copy: 'Copy',
7 copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).',
8 cut: 'Cut',
9 cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).',
10 paste: 'Paste',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',
13 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.',
14 title: 'Paste'
15} );
diff --git a/sources/plugins/clipboard/lang/en-gb.js b/sources/plugins/clipboard/lang/en-gb.js
new file mode 100644
index 00000000..a460489e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/en-gb.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'en-gb', {
6 copy: 'Copy',
7 copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).',
8 cut: 'Cut',
9 cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).',
10 paste: 'Paste',
11 pasteArea: 'Paste Area',
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',
13 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.',
14 title: 'Paste'
15} );
diff --git a/sources/plugins/clipboard/lang/en.js b/sources/plugins/clipboard/lang/en.js
new file mode 100644
index 00000000..db5dd596
--- /dev/null
+++ b/sources/plugins/clipboard/lang/en.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'en', {
6 copy: 'Copy',
7 copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).',
8 cut: 'Cut',
9 cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).',
10 paste: 'Paste',
11 pasteArea: 'Paste Area',
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',
13 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.',
14 title: 'Paste'
15} );
diff --git a/sources/plugins/clipboard/lang/eo.js b/sources/plugins/clipboard/lang/eo.js
new file mode 100644
index 00000000..55a62ef3
--- /dev/null
+++ b/sources/plugins/clipboard/lang/eo.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'eo', {
6 copy: 'Kopii',
7 copyError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).',
8 cut: 'Eltondi',
9 cutError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).',
10 paste: 'Interglui',
11 pasteArea: 'Intergluoareo',
12 pasteMsg: 'Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (<strong>Ctrl/Cmd+V</strong>) kaj premu OK',
13 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.',
14 title: 'Interglui'
15} );
diff --git a/sources/plugins/clipboard/lang/es.js b/sources/plugins/clipboard/lang/es.js
new file mode 100644
index 00000000..346265af
--- /dev/null
+++ b/sources/plugins/clipboard/lang/es.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'es', {
6 copy: 'Copiar',
7 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).',
8 cut: 'Cortar',
9 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).',
10 paste: 'Pegar',
11 pasteArea: 'Zona de pegado',
12 pasteMsg: 'Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.',
13 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.',
14 title: 'Pegar'
15} );
diff --git a/sources/plugins/clipboard/lang/et.js b/sources/plugins/clipboard/lang/et.js
new file mode 100644
index 00000000..34dc3bc7
--- /dev/null
+++ b/sources/plugins/clipboard/lang/et.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'et', {
6 copy: 'Kopeeri',
7 copyError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).',
8 cut: 'Lõika',
9 cutError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).',
10 paste: 'Aseta',
11 pasteArea: 'Asetamise ala',
12 pasteMsg: 'Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.',
13 securityMsg: 'Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.',
14 title: 'Asetamine'
15} );
diff --git a/sources/plugins/clipboard/lang/eu.js b/sources/plugins/clipboard/lang/eu.js
new file mode 100644
index 00000000..6683130a
--- /dev/null
+++ b/sources/plugins/clipboard/lang/eu.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'eu', {
6 copy: 'Kopiatu',
7 copyError: 'Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki kopiatzea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+C).',
8 cut: 'Ebaki',
9 cutError: 'Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki moztea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+X).',
10 paste: 'Itsatsi',
11 pasteArea: 'Itsasteko area',
12 pasteMsg: 'Mesedez teklatua erabiliz (<strong>Ctrl/Cmd+V</strong>) ondorengo eremuan testua itsatsi eta sakatu <strong>Ados</strong>.',
13 securityMsg: 'Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.',
14 title: 'Itsatsi'
15} );
diff --git a/sources/plugins/clipboard/lang/fa.js b/sources/plugins/clipboard/lang/fa.js
new file mode 100644
index 00000000..2bf8ae48
--- /dev/null
+++ b/sources/plugins/clipboard/lang/fa.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'fa', {
6 copy: 'رونوشت',
7 copyError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).',
8 cut: 'برش',
9 cutError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).',
10 paste: 'چسباندن',
11 pasteArea: 'محل چسباندن',
12 pasteMsg: 'لطفا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.',
13 securityMsg: 'به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.',
14 title: 'چسباندن'
15} );
diff --git a/sources/plugins/clipboard/lang/fi.js b/sources/plugins/clipboard/lang/fi.js
new file mode 100644
index 00000000..60f63956
--- /dev/null
+++ b/sources/plugins/clipboard/lang/fi.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'fi', {
6 copy: 'Kopioi',
7 copyError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).',
8 cut: 'Leikkaa',
9 cutError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).',
10 paste: 'Liitä',
11 pasteArea: 'Leikealue',
12 pasteMsg: 'Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.',
13 securityMsg: 'Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.',
14 title: 'Liitä'
15} );
diff --git a/sources/plugins/clipboard/lang/fo.js b/sources/plugins/clipboard/lang/fo.js
new file mode 100644
index 00000000..1298d096
--- /dev/null
+++ b/sources/plugins/clipboard/lang/fo.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'fo', {
6 copy: 'Avrita',
7 copyError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).',
8 cut: 'Kvett',
9 cutError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).',
10 paste: 'Innrita',
11 pasteArea: 'Avritingarumráði',
12 pasteMsg: 'Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.',
13 securityMsg: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.',
14 title: 'Innrita'
15} );
diff --git a/sources/plugins/clipboard/lang/fr-ca.js b/sources/plugins/clipboard/lang/fr-ca.js
new file mode 100644
index 00000000..2c01ed4e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/fr-ca.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'fr-ca', {
6 copy: 'Copier',
7 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).',
8 cut: 'Couper',
9 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).',
10 paste: 'Coller',
11 pasteArea: 'Coller la zone',
12 pasteMsg: 'Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Coller'
15} );
diff --git a/sources/plugins/clipboard/lang/fr.js b/sources/plugins/clipboard/lang/fr.js
new file mode 100644
index 00000000..a8dc5f9e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/fr.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'fr', {
6 copy: 'Copier',
7 copyError: 'Les paramètres de sécurité de votre navigateur ne permettent pas à l\'éditeur d\'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).',
8 cut: 'Couper',
9 cutError: 'Les paramètres de sécurité de votre navigateur ne permettent pas à l\'éditeur d\'exécuter automatiquement l\'opération "couper". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).',
10 paste: 'Coller',
11 pasteArea: 'Coller la zone',
12 pasteMsg: 'Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.',
13 securityMsg: 'A cause des paramètres de sécurité de votre navigateur, l\'éditeur n\'est pas en mesure d\'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.',
14 title: 'Coller'
15} );
diff --git a/sources/plugins/clipboard/lang/gl.js b/sources/plugins/clipboard/lang/gl.js
new file mode 100644
index 00000000..7fc6b465
--- /dev/null
+++ b/sources/plugins/clipboard/lang/gl.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'gl', {
6 copy: 'Copiar',
7 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).',
8 cut: 'Cortar',
9 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).',
10 paste: 'Pegar',
11 pasteArea: 'Zona de pegado',
12 pasteMsg: 'Pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prema en Aceptar',
13 securityMsg: 'Por mor da configuración de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.',
14 title: 'Pegar'
15} );
diff --git a/sources/plugins/clipboard/lang/gu.js b/sources/plugins/clipboard/lang/gu.js
new file mode 100644
index 00000000..a513482f
--- /dev/null
+++ b/sources/plugins/clipboard/lang/gu.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'gu', {
6 copy: 'નકલ',
7 copyError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।',
8 cut: 'કાપવું',
9 cutError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.',
10 paste: 'પેસ્ટ',
11 pasteArea: 'પેસ્ટ કરવાની જગ્યા',
12 pasteMsg: 'Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો',
13 securityMsg: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.',
14 title: 'પેસ્ટ'
15} );
diff --git a/sources/plugins/clipboard/lang/he.js b/sources/plugins/clipboard/lang/he.js
new file mode 100644
index 00000000..d91fee0d
--- /dev/null
+++ b/sources/plugins/clipboard/lang/he.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'he', {
6 copy: 'העתקה',
7 copyError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).',
8 cut: 'גזירה',
9 cutError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).',
10 paste: 'הדבקה',
11 pasteArea: 'איזור הדבקה',
12 pasteMsg: 'נא להדביק בתוך הקופסה באמצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>אישור</b>.',
13 securityMsg: 'עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.',
14 title: 'הדבקה'
15} );
diff --git a/sources/plugins/clipboard/lang/hi.js b/sources/plugins/clipboard/lang/hi.js
new file mode 100644
index 00000000..3660fb19
--- /dev/null
+++ b/sources/plugins/clipboard/lang/hi.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'hi', {
6 copy: 'कॉपी',
7 copyError: 'आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।',
8 cut: 'कट',
9 cutError: 'आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।',
10 paste: 'पेस्ट',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.',
13 securityMsg: 'आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.',
14 title: 'पेस्ट'
15} );
diff --git a/sources/plugins/clipboard/lang/hr.js b/sources/plugins/clipboard/lang/hr.js
new file mode 100644
index 00000000..b820eb9e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/hr.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'hr', {
6 copy: 'Kopiraj',
7 copyError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).',
8 cut: 'Izreži',
9 cutError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).',
10 paste: 'Zalijepi',
11 pasteArea: 'Prostor za ljepljenje',
12 pasteMsg: 'Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Zalijepi'
15} );
diff --git a/sources/plugins/clipboard/lang/hu.js b/sources/plugins/clipboard/lang/hu.js
new file mode 100644
index 00000000..61829ca9
--- /dev/null
+++ b/sources/plugins/clipboard/lang/hu.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'hu', {
6 copy: 'Másolás',
7 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).',
8 cut: 'Kivágás',
9 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).',
10 paste: 'Beillesztés',
11 pasteArea: 'Beszúrás mező',
12 pasteMsg: 'Másolja be az alábbi mezőbe a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.',
13 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.',
14 title: 'Beillesztés'
15} );
diff --git a/sources/plugins/clipboard/lang/id.js b/sources/plugins/clipboard/lang/id.js
new file mode 100644
index 00000000..eca3852a
--- /dev/null
+++ b/sources/plugins/clipboard/lang/id.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'id', {
6 copy: 'Salin',
7 copyError: 'Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)',
8 cut: 'Potong',
9 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
10 paste: 'Tempel',
11 pasteArea: 'Area Tempel',
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK', // MISSING
13 securityMsg: 'Karena pengaturan keamanan peramban anda, editor tida dapat mengakses data clipboard anda secara langsung. Anda harus mem-paste kembali pada halaman ini',
14 title: 'Tempel'
15} );
diff --git a/sources/plugins/clipboard/lang/is.js b/sources/plugins/clipboard/lang/is.js
new file mode 100644
index 00000000..bdf5862f
--- /dev/null
+++ b/sources/plugins/clipboard/lang/is.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'is', {
6 copy: 'Afrita',
7 copyError: 'Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).',
8 cut: 'Klippa',
9 cutError: 'Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).',
10 paste: 'Líma',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Líma'
15} );
diff --git a/sources/plugins/clipboard/lang/it.js b/sources/plugins/clipboard/lang/it.js
new file mode 100644
index 00000000..443fdf2e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/it.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'it', {
6 copy: 'Copia',
7 copyError: 'Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).',
8 cut: 'Taglia',
9 cutError: 'Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).',
10 paste: 'Incolla',
11 pasteArea: 'Incolla',
12 pasteMsg: 'Incolla il testo all\'interno dell\'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Incolla'
15} );
diff --git a/sources/plugins/clipboard/lang/ja.js b/sources/plugins/clipboard/lang/ja.js
new file mode 100644
index 00000000..5697cbb7
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ja.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ja', {
6 copy: 'コピー',
7 copyError: 'ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。',
8 cut: '切り取り',
9 cutError: 'ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。',
10 paste: '貼り付け',
11 pasteArea: '貼り付け場所',
12 pasteMsg: 'キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用して、次の入力エリア内で貼り付けて、<STRONG>OK</STRONG>を押してください。',
13 securityMsg: 'ブラウザのセキュリティ設定により、エディタはクリップボードデータに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。',
14 title: '貼り付け'
15} );
diff --git a/sources/plugins/clipboard/lang/ka.js b/sources/plugins/clipboard/lang/ka.js
new file mode 100644
index 00000000..021fe08e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ka.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ka', {
6 copy: 'ასლი',
7 copyError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).',
8 cut: 'ამოჭრა',
9 cutError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).',
10 paste: 'ჩასმა',
11 pasteArea: 'ჩასმის არე',
12 pasteMsg: 'ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (<strong>Ctrl/Cmd+V</strong>) და დააჭირეთ OK-ს',
13 securityMsg: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.',
14 title: 'ჩასმა'
15} );
diff --git a/sources/plugins/clipboard/lang/km.js b/sources/plugins/clipboard/lang/km.js
new file mode 100644
index 00000000..0baa9d8b
--- /dev/null
+++ b/sources/plugins/clipboard/lang/km.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'km', {
6 copy: 'ចម្លង',
7 copyError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។',
8 cut: 'កាត់យក',
9 cutError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។',
10 paste: 'បិទ​ភ្ជាប់',
11 pasteArea: 'តំបន់​បិទ​ភ្ជាប់',
12 pasteMsg: 'សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី ​(<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។',
13 securityMsg: 'ព្រោះតែ​ការកំណត់​សុវត្ថិភាព ប្រអប់សរសេរ​មិន​អាចចាប់​យកទិន្នន័យពីក្តារតម្បៀតខ្ទាស់​អ្នក​​ដោយផ្ទាល់​បានទេ។ អ្នក​ត្រូវចំលង​ដាក់វាម្តង​ទៀត ក្នុងផ្ទាំងនេះ។',
14 title: 'បិទ​ភ្ជាប់'
15} );
diff --git a/sources/plugins/clipboard/lang/ko.js b/sources/plugins/clipboard/lang/ko.js
new file mode 100644
index 00000000..6db8caba
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ko.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ko', {
6 copy: '복사',
7 copyError: '브라우저의 보안설정 때문에 복사할 수 없습니다. 키보드(Ctrl/Cmd+C)를 이용해서 복사하십시오.',
8 cut: '잘라내기',
9 cutError: '브라우저의 보안설정 때문에 잘라내기 기능을 실행할 수 없습니다. 키보드(Ctrl/Cmd+X)를 이용해서 잘라내기 하십시오',
10 paste: '붙여넣기',
11 pasteArea: '붙여넣기 범위',
12 pasteMsg: '키보드(<strong>Ctrl/Cmd+V</strong>)를 이용해서 상자안에 붙여넣고 <strong>확인</strong> 를 누르세요.',
13 securityMsg: '브라우저 보안 설정으로 인해, 클립보드에 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.',
14 title: '붙여넣기'
15} );
diff --git a/sources/plugins/clipboard/lang/ku.js b/sources/plugins/clipboard/lang/ku.js
new file mode 100644
index 00000000..91b77671
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ku.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ku', {
6 copy: 'لەبەرگرتنەوە',
7 copyError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).',
8 cut: 'بڕین',
9 cutError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).',
10 paste: 'لکاندن',
11 pasteArea: 'ناوچەی لکاندن',
12 pasteMsg: 'تکایە بیلکێنە لەناوەوەی ئەم سنوقە لەڕێی تەختەکلیلەکەت بە بەکارهێنانی کلیلی (<STRONG>Ctrl/Cmd+V</STRONG>) دووای کلیکی باشە بکە.',
13 securityMsg: 'بەهۆی شێوەپێدانی پارێزی وێبگەڕەکەت، سەرنووسەکه ناتوانێت دەستبگەیەنێت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه پێویسته دووباره بیلکێنیت لەم پەنجەرەیه.',
14 title: 'لکاندن'
15} );
diff --git a/sources/plugins/clipboard/lang/lt.js b/sources/plugins/clipboard/lang/lt.js
new file mode 100644
index 00000000..ef57ed48
--- /dev/null
+++ b/sources/plugins/clipboard/lang/lt.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'lt', {
6 copy: 'Kopijuoti',
7 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).',
8 cut: 'Iškirpti',
9 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).',
10 paste: 'Įdėti',
11 pasteArea: 'Įkelti dalį',
12 pasteMsg: 'Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.',
13 securityMsg: 'Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.',
14 title: 'Įdėti'
15} );
diff --git a/sources/plugins/clipboard/lang/lv.js b/sources/plugins/clipboard/lang/lv.js
new file mode 100644
index 00000000..f347cc4f
--- /dev/null
+++ b/sources/plugins/clipboard/lang/lv.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'lv', {
6 copy: 'Kopēt',
7 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.',
8 cut: 'Izgriezt',
9 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.',
10 paste: 'Ielīmēt',
11 pasteArea: 'Ielīmēšanas zona',
12 pasteMsg: 'Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.',
13 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ā.',
14 title: 'Ievietot'
15} );
diff --git a/sources/plugins/clipboard/lang/mk.js b/sources/plugins/clipboard/lang/mk.js
new file mode 100644
index 00000000..3fbb5718
--- /dev/null
+++ b/sources/plugins/clipboard/lang/mk.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'mk', {
6 copy: 'Copy', // MISSING
7 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
8 cut: 'Cut', // MISSING
9 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
10 paste: 'Paste', // MISSING
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK', // MISSING
13 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
14 title: 'Paste' // MISSING
15} );
diff --git a/sources/plugins/clipboard/lang/mn.js b/sources/plugins/clipboard/lang/mn.js
new file mode 100644
index 00000000..68c3f77e
--- /dev/null
+++ b/sources/plugins/clipboard/lang/mn.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'mn', {
6 copy: 'Хуулах',
7 copyError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.',
8 cut: 'Хайчлах',
9 cutError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.',
10 paste: 'Буулгах',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: '(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.',
13 securityMsg: 'Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.',
14 title: 'Буулгах'
15} );
diff --git a/sources/plugins/clipboard/lang/ms.js b/sources/plugins/clipboard/lang/ms.js
new file mode 100644
index 00000000..4381f047
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ms.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ms', {
6 copy: 'Salin',
7 copyError: 'Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).',
8 cut: 'Potong',
9 cutError: 'Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).',
10 paste: 'Tampal',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK', // MISSING
13 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
14 title: 'Tampal'
15} );
diff --git a/sources/plugins/clipboard/lang/nb.js b/sources/plugins/clipboard/lang/nb.js
new file mode 100644
index 00000000..d2dedbfc
--- /dev/null
+++ b/sources/plugins/clipboard/lang/nb.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'nb', {
6 copy: 'Kopier',
7 copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).',
8 cut: 'Klipp ut',
9 cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).',
10 paste: 'Lim inn',
11 pasteArea: 'Innlimingsområde',
12 pasteMsg: 'Vennligst lim inn i følgende boks med tastaturet (<strong>Ctrl/Cmd+V</strong>) og trykk <strong>OK</strong>.',
13 securityMsg: 'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.',
14 title: 'Lim inn'
15} );
diff --git a/sources/plugins/clipboard/lang/nl.js b/sources/plugins/clipboard/lang/nl.js
new file mode 100644
index 00000000..b9829c53
--- /dev/null
+++ b/sources/plugins/clipboard/lang/nl.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'nl', {
6 copy: 'Kopiëren',
7 copyError: 'De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.',
8 cut: 'Knippen',
9 cutError: 'De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.',
10 paste: 'Plakken',
11 pasteArea: 'Plakgebied',
12 pasteMsg: 'Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.',
13 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.',
14 title: 'Plakken'
15} );
diff --git a/sources/plugins/clipboard/lang/no.js b/sources/plugins/clipboard/lang/no.js
new file mode 100644
index 00000000..d883f6c2
--- /dev/null
+++ b/sources/plugins/clipboard/lang/no.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'no', {
6 copy: 'Kopier',
7 copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).',
8 cut: 'Klipp ut',
9 cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).',
10 paste: 'Lim inn',
11 pasteArea: 'Innlimingsområde',
12 pasteMsg: 'Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.',
13 securityMsg: 'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.',
14 title: 'Lim inn'
15} );
diff --git a/sources/plugins/clipboard/lang/pl.js b/sources/plugins/clipboard/lang/pl.js
new file mode 100644
index 00000000..ca45bd03
--- /dev/null
+++ b/sources/plugins/clipboard/lang/pl.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'pl', {
6 copy: 'Kopiuj',
7 copyError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.',
8 cut: 'Wytnij',
9 cutError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.',
10 paste: 'Wklej',
11 pasteArea: 'Obszar wklejania',
12 pasteMsg: 'Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.',
13 securityMsg: 'Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.',
14 title: 'Wklej'
15} );
diff --git a/sources/plugins/clipboard/lang/pt-br.js b/sources/plugins/clipboard/lang/pt-br.js
new file mode 100644
index 00000000..895ff3db
--- /dev/null
+++ b/sources/plugins/clipboard/lang/pt-br.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'pt-br', {
6 copy: 'Copiar',
7 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).',
8 cut: 'Recortar',
9 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).',
10 paste: 'Colar',
11 pasteArea: 'Área para Colar',
12 pasteMsg: 'Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Colar'
15} );
diff --git a/sources/plugins/clipboard/lang/pt.js b/sources/plugins/clipboard/lang/pt.js
new file mode 100644
index 00000000..40bf99bd
--- /dev/null
+++ b/sources/plugins/clipboard/lang/pt.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'pt', {
6 copy: 'Copiar',
7 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).',
8 cut: 'Cortar',
9 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).',
10 paste: 'Colar',
11 pasteArea: 'Colar área',
12 pasteMsg: 'Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Colar'
15} );
diff --git a/sources/plugins/clipboard/lang/ro.js b/sources/plugins/clipboard/lang/ro.js
new file mode 100644
index 00000000..2b34ef74
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ro.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ro', {
6 copy: 'Copiază',
7 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).',
8 cut: 'Taie',
9 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).',
10 paste: 'Adaugă',
11 pasteArea: 'Suprafața de adăugare',
12 pasteMsg: 'Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK',
13 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ă.',
14 title: 'Adaugă'
15} );
diff --git a/sources/plugins/clipboard/lang/ru.js b/sources/plugins/clipboard/lang/ru.js
new file mode 100644
index 00000000..9790f01d
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ru.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ru', {
6 copy: 'Копировать',
7 copyError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).',
8 cut: 'Вырезать',
9 cutError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).',
10 paste: 'Вставить',
11 pasteArea: 'Зона для вставки',
12 pasteMsg: 'Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку "OK".',
13 securityMsg: 'Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.',
14 title: 'Вставить'
15} );
diff --git a/sources/plugins/clipboard/lang/si.js b/sources/plugins/clipboard/lang/si.js
new file mode 100644
index 00000000..37dd1248
--- /dev/null
+++ b/sources/plugins/clipboard/lang/si.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'si', {
6 copy: 'පිටපත් කරන්න',
7 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
8 cut: 'කපාගන්න',
9 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
10 paste: 'අලවන්න',
11 pasteArea: 'අලවන ප්‍රදේශ',
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK', // MISSING
13 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
14 title: 'අලවන්න'
15} );
diff --git a/sources/plugins/clipboard/lang/sk.js b/sources/plugins/clipboard/lang/sk.js
new file mode 100644
index 00000000..4f9e97a7
--- /dev/null
+++ b/sources/plugins/clipboard/lang/sk.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'sk', {
6 copy: 'Kopírovať',
7 copyError: 'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Prosím, použite na to klávesnicu (Ctrl/Cmd+C).',
8 cut: 'Vystrihnúť',
9 cutError: 'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Prosím, použite na to klávesnicu (Ctrl/Cmd+X).',
10 paste: 'Vložiť',
11 pasteArea: 'Miesto pre vloženie',
12 pasteMsg: 'Prosím, vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlačte OK.',
13 securityMsg: 'Kvôli vašim bezpečnostným nastaveniam prehliadača editor nie je schopný pristupovať k vašej schránke na kopírovanie priamo. Vložte to preto do tohto okna.',
14 title: 'Vložiť'
15} );
diff --git a/sources/plugins/clipboard/lang/sl.js b/sources/plugins/clipboard/lang/sl.js
new file mode 100644
index 00000000..4bb3b6c8
--- /dev/null
+++ b/sources/plugins/clipboard/lang/sl.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'sl', {
6 copy: 'Kopiraj',
7 copyError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).',
8 cut: 'Izreži',
9 cutError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).',
10 paste: 'Prilepi',
11 pasteArea: 'Prilepi Prostor',
12 pasteMsg: 'Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.',
13 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.',
14 title: 'Prilepi'
15} );
diff --git a/sources/plugins/clipboard/lang/sq.js b/sources/plugins/clipboard/lang/sq.js
new file mode 100644
index 00000000..e5be3c6c
--- /dev/null
+++ b/sources/plugins/clipboard/lang/sq.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'sq', {
6 copy: 'Kopjo',
7 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).',
8 cut: 'Preje',
9 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).',
10 paste: 'Hidhe',
11 pasteArea: 'Hapësira Hedhëse',
12 pasteMsg: 'Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (<strong>Ctrl/Cmd+V</strong>) dhe shtypni Mirë.',
13 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.',
14 title: 'Hidhe'
15} );
diff --git a/sources/plugins/clipboard/lang/sr-latn.js b/sources/plugins/clipboard/lang/sr-latn.js
new file mode 100644
index 00000000..02a2fbe5
--- /dev/null
+++ b/sources/plugins/clipboard/lang/sr-latn.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'sr-latn', {
6 copy: 'Kopiraj',
7 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).',
8 cut: 'Iseci',
9 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).',
10 paste: 'Zalepi',
11 pasteArea: 'Prostor za lepljenje',
12 pasteMsg: 'Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.',
13 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.',
14 title: 'Zalepi'
15} );
diff --git a/sources/plugins/clipboard/lang/sr.js b/sources/plugins/clipboard/lang/sr.js
new file mode 100644
index 00000000..51055eb2
--- /dev/null
+++ b/sources/plugins/clipboard/lang/sr.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'sr', {
6 copy: 'Копирај',
7 copyError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).',
8 cut: 'Исеци',
9 cutError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).',
10 paste: 'Залепи',
11 pasteArea: 'Залепи зону',
12 pasteMsg: 'Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.',
13 securityMsg: 'Због сигурносних подешавања претраживача, едитор не може да приступи оставу. Требате да га поново залепите у овом прозору.',
14 title: 'Залепи'
15} );
diff --git a/sources/plugins/clipboard/lang/sv.js b/sources/plugins/clipboard/lang/sv.js
new file mode 100644
index 00000000..747a1cb2
--- /dev/null
+++ b/sources/plugins/clipboard/lang/sv.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'sv', {
6 copy: 'Kopiera',
7 copyError: 'Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.',
8 cut: 'Klipp ut',
9 cutError: 'Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.',
10 paste: 'Klistra in',
11 pasteArea: 'Paste Area',
12 pasteMsg: 'Var god och klistra in Er text i rutan nedan genom att använda (<strong>Ctrl/Cmd+V</strong>) klicka sen på OK.',
13 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.',
14 title: 'Klistra in'
15} );
diff --git a/sources/plugins/clipboard/lang/th.js b/sources/plugins/clipboard/lang/th.js
new file mode 100644
index 00000000..2ece4685
--- /dev/null
+++ b/sources/plugins/clipboard/lang/th.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'th', {
6 copy: 'สำเนา',
7 copyError: 'ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).',
8 cut: 'ตัด',
9 cutError: 'ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).',
10 paste: 'วาง',
11 pasteArea: 'Paste Area', // MISSING
12 pasteMsg: 'กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl/Cmd และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.',
13 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
14 title: 'วาง'
15} );
diff --git a/sources/plugins/clipboard/lang/tr.js b/sources/plugins/clipboard/lang/tr.js
new file mode 100644
index 00000000..a960cbfe
--- /dev/null
+++ b/sources/plugins/clipboard/lang/tr.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'tr', {
6 copy: 'Kopyala',
7 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.',
8 cut: 'Kes',
9 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.',
10 paste: 'Yapıştır',
11 pasteArea: 'Yapıştırma Alanı',
12 pasteMsg: 'Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.',
13 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..',
14 title: 'Yapıştır'
15} );
diff --git a/sources/plugins/clipboard/lang/tt.js b/sources/plugins/clipboard/lang/tt.js
new file mode 100644
index 00000000..3921b895
--- /dev/null
+++ b/sources/plugins/clipboard/lang/tt.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'tt', {
6 copy: 'Күчермәләү',
7 copyError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.',
8 cut: 'Кисеп алу',
9 cutError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.',
10 paste: 'Өстәү',
11 pasteArea: 'Өстәү мәйданы',
12 pasteMsg: 'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK', // MISSING
13 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
14 title: 'Өстәү'
15} );
diff --git a/sources/plugins/clipboard/lang/ug.js b/sources/plugins/clipboard/lang/ug.js
new file mode 100644
index 00000000..6b0f0851
--- /dev/null
+++ b/sources/plugins/clipboard/lang/ug.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'ug', {
6 copy: 'نەشر ھوقۇقىغا ئىگە بەلگىسى',
7 copyError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ',
8 cut: 'كەس',
9 cutError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ',
10 paste: 'چاپلا',
11 pasteArea: 'چاپلاش دائىرىسى',
12 pasteMsg: 'ھەرپتاختا تېز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بېسىڭ',
13 securityMsg: 'توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.',
14 title: 'چاپلا'
15} );
diff --git a/sources/plugins/clipboard/lang/uk.js b/sources/plugins/clipboard/lang/uk.js
new file mode 100644
index 00000000..666be54c
--- /dev/null
+++ b/sources/plugins/clipboard/lang/uk.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'uk', {
6 copy: 'Копіювати',
7 copyError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).',
8 cut: 'Вирізати',
9 cutError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)',
10 paste: 'Вставити',
11 pasteArea: 'Область вставки',
12 pasteMsg: 'Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.',
13 securityMsg: 'Редактор не може отримати прямий доступ до буферу обміну у зв\'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.',
14 title: 'Вставити'
15} );
diff --git a/sources/plugins/clipboard/lang/vi.js b/sources/plugins/clipboard/lang/vi.js
new file mode 100644
index 00000000..dfbc8210
--- /dev/null
+++ b/sources/plugins/clipboard/lang/vi.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'vi', {
6 copy: 'Sao chép',
7 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).',
8 cut: 'Cắt',
9 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).',
10 paste: 'Dán',
11 pasteArea: 'Khu vực dán',
12 pasteMsg: 'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.',
13 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.',
14 title: 'Dán'
15} );
diff --git a/sources/plugins/clipboard/lang/zh-cn.js b/sources/plugins/clipboard/lang/zh-cn.js
new file mode 100644
index 00000000..426e4072
--- /dev/null
+++ b/sources/plugins/clipboard/lang/zh-cn.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'zh-cn', {
6 copy: '复制',
7 copyError: '您的浏览器安全设置不允许编辑器自动执行复制操作,请使用键盘快捷键(Ctrl/Cmd+C)来完成。',
8 cut: '剪切',
9 cutError: '您的浏览器安全设置不允许编辑器自动执行剪切操作,请使用键盘快捷键(Ctrl/Cmd+X)来完成。',
10 paste: '粘贴',
11 pasteArea: '粘贴区域',
12 pasteMsg: '请使用键盘快捷键(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下面的方框里,再按 <STRONG>确定</STRONG>',
13 securityMsg: '因为您的浏览器的安全设置原因,本编辑器不能直接访问您的剪贴板内容,你需要在本窗口重新粘贴一次。',
14 title: '粘贴'
15} );
diff --git a/sources/plugins/clipboard/lang/zh.js b/sources/plugins/clipboard/lang/zh.js
new file mode 100644
index 00000000..116ab664
--- /dev/null
+++ b/sources/plugins/clipboard/lang/zh.js
@@ -0,0 +1,15 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'clipboard', 'zh', {
6 copy: '複製',
7 copyError: '瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用鍵盤快捷鍵 (Ctrl/Cmd+C) 複製。',
8 cut: '剪下',
9 cutError: '瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用鏐盤快捷鍵 (Ctrl/Cmd+X) 剪下。',
10 paste: '貼上',
11 pasteArea: '貼上區',
12 pasteMsg: '請使用鍵盤快捷鍵 (<strong>Ctrl/Cmd+V</strong>) 貼到下方區域中並按下「確定」。',
13 securityMsg: '因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。',
14 title: '貼上'
15} );
diff --git a/sources/plugins/clipboard/plugin.js b/sources/plugins/clipboard/plugin.js
new file mode 100644
index 00000000..e3bc5f09
--- /dev/null
+++ b/sources/plugins/clipboard/plugin.js
@@ -0,0 +1,2723 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @ignore
8 * File overview: Clipboard support.
9 */
10
11//
12// COPY & PASTE EXECUTION FLOWS:
13// -- CTRL+C
14// * if ( isCustomCopyCutSupported )
15// * dataTransfer.setData( 'text/html', getSelectedHtml )
16// * else
17// * browser's default behavior
18// -- CTRL+X
19// * listen onKey (onkeydown)
20// * fire 'saveSnapshot' on editor
21// * if ( isCustomCopyCutSupported )
22// * dataTransfer.setData( 'text/html', getSelectedHtml )
23// * extractSelectedHtml // remove selected contents
24// * else
25// * browser's default behavior
26// * deferred second 'saveSnapshot' event
27// -- CTRL+V
28// * listen onKey (onkeydown)
29// * simulate 'beforepaste' for non-IEs on editable
30// * listen 'onpaste' on editable ('onbeforepaste' for IE)
31// * fire 'beforePaste' on editor
32// * if ( !canceled && ( htmlInDataTransfer || !external paste) && dataTransfer is not empty ) getClipboardDataByPastebin
33// * fire 'paste' on editor
34// * !canceled && fire 'afterPaste' on editor
35// -- Copy command
36// * tryToCutCopy
37// * execCommand
38// * !success && notification
39// -- Cut command
40// * fixCut
41// * tryToCutCopy
42// * execCommand
43// * !success && notification
44// -- Paste command
45// * fire 'paste' on editable ('beforepaste' for IE)
46// * !canceled && execCommand 'paste'
47// * !success && fire 'pasteDialog' on editor
48// -- Paste from native context menu & menubar
49// (Fx & Webkits are handled in 'paste' default listener.
50// Opera cannot be handled at all because it doesn't fire any events
51// Special treatment is needed for IE, for which is this part of doc)
52// * listen 'onpaste'
53// * cancel native event
54// * fire 'beforePaste' on editor
55// * if ( !canceled && ( htmlInDataTransfer || !external paste) && dataTransfer is not empty ) getClipboardDataByPastebin
56// * execIECommand( 'paste' ) -> this fires another 'paste' event, so cancel it
57// * fire 'paste' on editor
58// * !canceled && fire 'afterPaste' on editor
59//
60//
61// PASTE EVENT - PREPROCESSING:
62// -- Possible dataValue types: auto, text, html.
63// -- Possible dataValue contents:
64// * text (possible \n\r)
65// * htmlified text (text + br,div,p - no presentational markup & attrs - depends on browser)
66// * html
67// -- Possible flags:
68// * htmlified - if true then content is a HTML even if no markup inside. This flag is set
69// for content from editable pastebins, because they 'htmlify' pasted content.
70//
71// -- Type: auto:
72// * content: htmlified text -> filter, unify text markup (brs, ps, divs), set type: text
73// * content: html -> filter, set type: html
74// -- Type: text:
75// * content: htmlified text -> filter, unify text markup
76// * content: html -> filter, strip presentational markup, unify text markup
77// -- Type: html:
78// * content: htmlified text -> filter, unify text markup
79// * content: html -> filter
80//
81// -- Phases:
82// * if dataValue is empty copy data from dataTransfer to dataValue (priority 1)
83// * filtering (priorities 3-5) - e.g. pastefromword filters
84// * content type sniffing (priority 6)
85// * markup transformations for text (priority 6)
86//
87// DRAG & DROP EXECUTION FLOWS:
88// -- Drag
89// * save to the global object:
90// * drag timestamp (with 'cke-' prefix),
91// * selected html,
92// * drag range,
93// * editor instance.
94// * put drag timestamp into event.dataTransfer.text
95// -- Drop
96// * if events text == saved timestamp && editor == saved editor
97// internal drag & drop occurred
98// * getRangeAtDropPosition
99// * create bookmarks for drag and drop ranges starting from the end of the document
100// * dragRange.deleteContents()
101// * fire 'paste' with saved html and drop range
102// * if events text == saved timestamp && editor != saved editor
103// cross editor drag & drop occurred
104// * getRangeAtDropPosition
105// * fire 'paste' with saved html
106// * dragRange.deleteContents()
107// * FF: refreshCursor on afterPaste
108// * if events text != saved timestamp
109// drop form external source occurred
110// * getRangeAtDropPosition
111// * if event contains html data then fire 'paste' with html
112// * else if event contains text data then fire 'paste' with encoded text
113// * FF: refreshCursor on afterPaste
114
115'use strict';
116
117( function() {
118 // Register the plugin.
119 CKEDITOR.plugins.add( 'clipboard', {
120 requires: 'dialog',
121 // jscs:disable maximumLineLength
122 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
123 // jscs:enable maximumLineLength
124 icons: 'copy,copy-rtl,cut,cut-rtl,paste,paste-rtl', // %REMOVE_LINE_CORE%
125 hidpi: true, // %REMOVE_LINE_CORE%
126 init: function( editor ) {
127 var filterType,
128 filtersFactory = filtersFactoryFactory();
129
130 if ( editor.config.forcePasteAsPlainText ) {
131 filterType = 'plain-text';
132 } else if ( editor.config.pasteFilter ) {
133 filterType = editor.config.pasteFilter;
134 }
135 // On Webkit the pasteFilter defaults 'semantic-content' because pasted data is so terrible
136 // that it must be always filtered.
137 else if ( CKEDITOR.env.webkit && !( 'pasteFilter' in editor.config ) ) {
138 filterType = 'semantic-content';
139 }
140
141 editor.pasteFilter = filtersFactory.get( filterType );
142
143 initPasteClipboard( editor );
144 initDragDrop( editor );
145
146 CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) );
147
148 editor.on( 'paste', function( evt ) {
149 // Init `dataTransfer` if `paste` event was fired without it, so it will be always available.
150 if ( !evt.data.dataTransfer ) {
151 evt.data.dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer();
152 }
153
154 // If dataValue is already set (manually or by paste bin), so do not override it.
155 if ( evt.data.dataValue ) {
156 return;
157 }
158
159 var dataTransfer = evt.data.dataTransfer,
160 // IE support only text data and throws exception if we try to get html data.
161 // This html data object may also be empty if we drag content of the textarea.
162 value = dataTransfer.getData( 'text/html' );
163
164 if ( value ) {
165 evt.data.dataValue = value;
166 evt.data.type = 'html';
167 } else {
168 // Try to get text data otherwise.
169 value = dataTransfer.getData( 'text/plain' );
170
171 if ( value ) {
172 evt.data.dataValue = editor.editable().transformPlainTextToHtml( value );
173 evt.data.type = 'text';
174 }
175 }
176 }, null, null, 1 );
177
178 editor.on( 'paste', function( evt ) {
179 var data = evt.data.dataValue,
180 blockElements = CKEDITOR.dtd.$block;
181
182 // Filter webkit garbage.
183 if ( data.indexOf( 'Apple-' ) > -1 ) {
184 // Replace special webkit's &nbsp; with simple space, because webkit
185 // produces them even for normal spaces.
186 data = data.replace( /<span class="Apple-converted-space">&nbsp;<\/span>/gi, ' ' );
187
188 // Strip <span> around white-spaces when not in forced 'html' content type.
189 // This spans are created only when pasting plain text into Webkit,
190 // but for safety reasons remove them always.
191 if ( evt.data.type != 'html' ) {
192 data = data.replace( /<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi, function( all, spaces ) {
193 // Replace tabs with 4 spaces like Fx does.
194 return spaces.replace( /\t/g, '&nbsp;&nbsp; &nbsp;' );
195 } );
196 }
197
198 // This br is produced only when copying & pasting HTML content.
199 if ( data.indexOf( '<br class="Apple-interchange-newline">' ) > -1 ) {
200 evt.data.startsWithEOL = 1;
201 evt.data.preSniffing = 'html'; // Mark as not text.
202 data = data.replace( /<br class="Apple-interchange-newline">/, '' );
203 }
204
205 // Remove all other classes.
206 data = data.replace( /(<[^>]+) class="Apple-[^"]*"/gi, '$1' );
207 }
208
209 // Strip editable that was copied from inside. (#9534)
210 if ( data.match( /^<[^<]+cke_(editable|contents)/i ) ) {
211 var tmp,
212 editable_wrapper,
213 wrapper = new CKEDITOR.dom.element( 'div' );
214
215 wrapper.setHtml( data );
216 // Verify for sure and check for nested editor UI parts. (#9675)
217 while ( wrapper.getChildCount() == 1 &&
218 ( tmp = wrapper.getFirst() ) &&
219 tmp.type == CKEDITOR.NODE_ELEMENT && // Make sure first-child is element.
220 ( tmp.hasClass( 'cke_editable' ) || tmp.hasClass( 'cke_contents' ) ) ) {
221 wrapper = editable_wrapper = tmp;
222 }
223
224 // If editable wrapper was found strip it and bogus <br> (added on FF).
225 if ( editable_wrapper )
226 data = editable_wrapper.getHtml().replace( /<br>$/i, '' );
227 }
228
229 if ( CKEDITOR.env.ie ) {
230 // &nbsp; <p> -> <p> (br.cke-pasted-remove will be removed later)
231 data = data.replace( /^&nbsp;(?: |\r\n)?<(\w+)/g, function( match, elementName ) {
232 if ( elementName.toLowerCase() in blockElements ) {
233 evt.data.preSniffing = 'html'; // Mark as not a text.
234 return '<' + elementName;
235 }
236 return match;
237 } );
238 } else if ( CKEDITOR.env.webkit ) {
239 // </p><div><br></div> -> </p><br>
240 // We don't mark br, because this situation can happen for htmlified text too.
241 data = data.replace( /<\/(\w+)><div><br><\/div>$/, function( match, elementName ) {
242 if ( elementName in blockElements ) {
243 evt.data.endsWithEOL = 1;
244 return '</' + elementName + '>';
245 }
246 return match;
247 } );
248 } else if ( CKEDITOR.env.gecko ) {
249 // Firefox adds bogus <br> when user pasted text followed by space(s).
250 data = data.replace( /(\s)<br>$/, '$1' );
251 }
252
253 evt.data.dataValue = data;
254 }, null, null, 3 );
255
256 editor.on( 'paste', function( evt ) {
257 var dataObj = evt.data,
258 type = dataObj.type,
259 data = dataObj.dataValue,
260 trueType,
261 // Default is 'html'.
262 defaultType = editor.config.clipboard_defaultContentType || 'html',
263 transferType = dataObj.dataTransfer.getTransferType( editor );
264
265 // If forced type is 'html' we don't need to know true data type.
266 if ( type == 'html' || dataObj.preSniffing == 'html' ) {
267 trueType = 'html';
268 } else {
269 trueType = recogniseContentType( data );
270 }
271
272 // Unify text markup.
273 if ( trueType == 'htmlifiedtext' ) {
274 data = htmlifiedTextHtmlification( editor.config, data );
275 }
276
277 // Strip presentational markup & unify text markup.
278 // Forced plain text (dialog or forcePAPT).
279 // Note: we do not check dontFilter option in this case, because forcePAPT was implemented
280 // before pasteFilter and pasteFilter is automatically used on Webkit&Blink since 4.5, so
281 // forcePAPT should have priority as it had before 4.5.
282 if ( type == 'text' && trueType == 'html' ) {
283 data = filterContent( editor, data, filtersFactory.get( 'plain-text' ) );
284 }
285 // External paste and pasteFilter exists and filtering isn't disabled.
286 else if ( transferType == CKEDITOR.DATA_TRANSFER_EXTERNAL && editor.pasteFilter && !dataObj.dontFilter ) {
287 data = filterContent( editor, data, editor.pasteFilter );
288 }
289
290 if ( dataObj.startsWithEOL ) {
291 data = '<br data-cke-eol="1">' + data;
292 }
293 if ( dataObj.endsWithEOL ) {
294 data += '<br data-cke-eol="1">';
295 }
296
297 if ( type == 'auto' ) {
298 type = ( trueType == 'html' || defaultType == 'html' ) ? 'html' : 'text';
299 }
300
301 dataObj.type = type;
302 dataObj.dataValue = data;
303 delete dataObj.preSniffing;
304 delete dataObj.startsWithEOL;
305 delete dataObj.endsWithEOL;
306 }, null, null, 6 );
307
308 // Inserts processed data into the editor at the end of the
309 // events chain.
310 editor.on( 'paste', function( evt ) {
311 var data = evt.data;
312
313 if ( data.dataValue ) {
314 editor.insertHtml( data.dataValue, data.type, data.range );
315
316 // Defer 'afterPaste' so all other listeners for 'paste' will be fired first.
317 // Fire afterPaste only if paste inserted some HTML.
318 setTimeout( function() {
319 editor.fire( 'afterPaste' );
320 }, 0 );
321 }
322 }, null, null, 1000 );
323
324 editor.on( 'pasteDialog', function( evt ) {
325 // TODO it's possible that this setTimeout is not needed any more,
326 // because of changes introduced in the same commit as this comment.
327 // Editor.getClipboardData adds listener to the dialog's events which are
328 // fired after a while (not like 'showDialog').
329 setTimeout( function() {
330 // Open default paste dialog.
331 editor.openDialog( 'paste', evt.data );
332 }, 0 );
333 } );
334 }
335 } );
336
337 function firePasteEvents( editor, data, withBeforePaste ) {
338 if ( !data.type ) {
339 data.type = 'auto';
340 }
341
342 if ( withBeforePaste ) {
343 // Fire 'beforePaste' event so clipboard flavor get customized
344 // by other plugins.
345 if ( editor.fire( 'beforePaste', data ) === false )
346 return false; // Event canceled
347 }
348
349 // Do not fire paste if there is no data (dataValue and dataTranfser are empty).
350 // This check should be done after firing 'beforePaste' because for native paste
351 // 'beforePaste' is by default fired even for empty clipboard.
352 if ( !data.dataValue && data.dataTransfer.isEmpty() ) {
353 return false;
354 }
355
356 if ( !data.dataValue ) {
357 data.dataValue = '';
358 }
359
360 // Because of FF bug we need to use this hack, otherwise cursor is hidden
361 // or it is not possible to move it (#12420).
362 // Also, check that editor.toolbox exists, because the toolbar plugin might not be loaded (#13305).
363 if ( CKEDITOR.env.gecko && data.method == 'drop' && editor.toolbox ) {
364 editor.once( 'afterPaste', function() {
365 editor.toolbox.focus();
366 } );
367 }
368
369 return editor.fire( 'paste', data );
370 }
371
372 function initPasteClipboard( editor ) {
373 var clipboard = CKEDITOR.plugins.clipboard,
374 preventBeforePasteEvent = 0,
375 preventPasteEvent = 0,
376 inReadOnly = 0;
377
378 addListeners();
379 addButtonsCommands();
380
381 /**
382 * Gets clipboard data by directly accessing the clipboard (IE only) or opening the paste dialog window.
383 *
384 * editor.getClipboardData( { title: 'Get my data' }, function( data ) {
385 * if ( data )
386 * alert( data.type + ' ' + data.dataValue );
387 * } );
388 *
389 * @member CKEDITOR.editor
390 * @param {Object} options
391 * @param {String} [options.title] The title of the paste dialog window.
392 * @param {Function} callback A function that will be executed with `data.type` and `data.dataValue`
393 * or `null` if none of the capturing methods succeeded.
394 */
395 editor.getClipboardData = function( options, callback ) {
396 var beforePasteNotCanceled = false,
397 dataType = 'auto',
398 dialogCommited = false;
399
400 // Options are optional - args shift.
401 if ( !callback ) {
402 callback = options;
403 options = null;
404 }
405
406 // Listen with maximum priority to handle content before everyone else.
407 // This callback will handle paste event that will be fired if direct
408 // access to the clipboard succeed in IE.
409 editor.on( 'paste', onPaste, null, null, 0 );
410
411 // Listen at the end of listeners chain to see if event wasn't canceled
412 // and to retrieve modified data.type.
413 editor.on( 'beforePaste', onBeforePaste, null, null, 1000 );
414
415 // getClipboardDataDirectly() will fire 'beforePaste' synchronously, so we can
416 // check if it was canceled and if any listener modified data.type.
417
418 // If command didn't succeed (only IE allows to access clipboard and only if
419 // user agrees) open and handle paste dialog.
420 if ( getClipboardDataDirectly() === false ) {
421 // Direct access to the clipboard wasn't successful so remove listener.
422 editor.removeListener( 'paste', onPaste );
423
424 // If beforePaste was canceled do not open dialog.
425 // Add listeners only if dialog really opened. 'pasteDialog' can be canceled.
426 if ( beforePasteNotCanceled && editor.fire( 'pasteDialog', onDialogOpen ) ) {
427 editor.on( 'pasteDialogCommit', onDialogCommit );
428
429 // 'dialogHide' will be fired after 'pasteDialogCommit'.
430 editor.on( 'dialogHide', function( evt ) {
431 evt.removeListener();
432 evt.data.removeListener( 'pasteDialogCommit', onDialogCommit );
433
434 // Because Opera has to wait a while in pasteDialog we have to wait here.
435 setTimeout( function() {
436 // Notify even if user canceled dialog (clicked 'cancel', ESC, etc).
437 if ( !dialogCommited )
438 callback( null );
439 }, 10 );
440 } );
441 } else {
442 callback( null );
443 }
444 }
445
446 function onPaste( evt ) {
447 evt.removeListener();
448 evt.cancel();
449 callback( evt.data );
450 }
451
452 function onBeforePaste( evt ) {
453 evt.removeListener();
454 beforePasteNotCanceled = true;
455 dataType = evt.data.type;
456 }
457
458 function onDialogCommit( evt ) {
459 evt.removeListener();
460 // Cancel pasteDialogCommit so paste dialog won't automatically fire
461 // 'paste' evt by itself.
462 evt.cancel();
463 dialogCommited = true;
464 callback( {
465 type: dataType,
466 dataValue: evt.data.dataValue,
467 dataTransfer: evt.data.dataTransfer,
468 method: 'paste'
469 } );
470 }
471
472 function onDialogOpen() {
473 this.customTitle = ( options && options.title );
474 }
475 };
476
477 function addButtonsCommands() {
478 addButtonCommand( 'Cut', 'cut', createCutCopyCmd( 'cut' ), 10, 1 );
479 addButtonCommand( 'Copy', 'copy', createCutCopyCmd( 'copy' ), 20, 4 );
480 addButtonCommand( 'Paste', 'paste', createPasteCmd(), 30, 8 );
481
482 function addButtonCommand( buttonName, commandName, command, toolbarOrder, ctxMenuOrder ) {
483 var lang = editor.lang.clipboard[ commandName ];
484
485 editor.addCommand( commandName, command );
486 editor.ui.addButton && editor.ui.addButton( buttonName, {
487 label: lang,
488 command: commandName,
489 toolbar: 'clipboard,' + toolbarOrder
490 } );
491
492 // If the "menu" plugin is loaded, register the menu item.
493 if ( editor.addMenuItems ) {
494 editor.addMenuItem( commandName, {
495 label: lang,
496 command: commandName,
497 group: 'clipboard',
498 order: ctxMenuOrder
499 } );
500 }
501 }
502 }
503
504 function addListeners() {
505 editor.on( 'key', onKey );
506 editor.on( 'contentDom', addPasteListenersToEditable );
507
508 // For improved performance, we're checking the readOnly state on selectionChange instead of hooking a key event for that.
509 editor.on( 'selectionChange', function( evt ) {
510 inReadOnly = evt.data.selection.getRanges()[ 0 ].checkReadOnly();
511 setToolbarStates();
512 } );
513
514 // If the "contextmenu" plugin is loaded, register the listeners.
515 if ( editor.contextMenu ) {
516 editor.contextMenu.addListener( function( element, selection ) {
517 inReadOnly = selection.getRanges()[ 0 ].checkReadOnly();
518 return {
519 cut: stateFromNamedCommand( 'cut' ),
520 copy: stateFromNamedCommand( 'copy' ),
521 paste: stateFromNamedCommand( 'paste' )
522 };
523 } );
524 }
525 }
526
527 // Add events listeners to editable.
528 function addPasteListenersToEditable() {
529 var editable = editor.editable();
530
531 if ( CKEDITOR.plugins.clipboard.isCustomCopyCutSupported ) {
532 var initOnCopyCut = function( evt ) {
533 // If user tries to cut in read-only editor, we must prevent default action. (#13872)
534 if ( !editor.readOnly || evt.name != 'cut' ) {
535 clipboard.initPasteDataTransfer( evt, editor );
536 }
537 evt.data.preventDefault();
538 };
539
540 editable.on( 'copy', initOnCopyCut );
541 editable.on( 'cut', initOnCopyCut );
542
543 // Delete content with the low priority so one can overwrite cut data.
544 editable.on( 'cut', function() {
545 // If user tries to cut in read-only editor, we must prevent default action. (#13872)
546 if ( !editor.readOnly ) {
547 editor.extractSelectedHtml();
548 }
549 }, null, null, 999 );
550 }
551
552 // We'll be catching all pasted content in one line, regardless of whether
553 // it's introduced by a document command execution (e.g. toolbar buttons) or
554 // user paste behaviors (e.g. CTRL+V).
555 editable.on( clipboard.mainPasteEvent, function( evt ) {
556 if ( clipboard.mainPasteEvent == 'beforepaste' && preventBeforePasteEvent ) {
557 return;
558 }
559
560 // If you've just asked yourself why preventPasteEventNow() is not here, but
561 // in listener for CTRL+V and exec method of 'paste' command
562 // you've asked the same question we did.
563 //
564 // THE ANSWER:
565 //
566 // First thing to notice - this answer makes sense only for IE,
567 // because other browsers don't listen for 'paste' event.
568 //
569 // What would happen if we move preventPasteEventNow() here?
570 // For:
571 // * CTRL+V - IE fires 'beforepaste', so we prevent 'paste' and pasteDataFromClipboard(). OK.
572 // * editor.execCommand( 'paste' ) - we fire 'beforepaste', so we prevent
573 // 'paste' and pasteDataFromClipboard() and doc.execCommand( 'Paste' ). OK.
574 // * native context menu - IE fires 'beforepaste', so we prevent 'paste', but unfortunately
575 // on IE we fail with pasteDataFromClipboard() here, because of... we don't know why, but
576 // we just fail, so... we paste nothing. FAIL.
577 // * native menu bar - the same as for native context menu.
578 //
579 // But don't you know any way to distinguish first two cases from last two?
580 // Only one - special flag set in CTRL+V handler and exec method of 'paste'
581 // command. And that's what we did using preventPasteEventNow().
582
583 pasteDataFromClipboard( evt );
584 } );
585
586 // It's not possible to clearly handle all four paste methods (ctrl+v, native menu bar
587 // native context menu, editor's command) in one 'paste/beforepaste' event in IE.
588 //
589 // For ctrl+v & editor's command it's easy to handle pasting in 'beforepaste' listener,
590 // so we do this. For another two methods it's better to use 'paste' event.
591 //
592 // 'paste' is always being fired after 'beforepaste' (except of weird one on opening native
593 // context menu), so for two methods handled in 'beforepaste' we're canceling 'paste'
594 // using preventPasteEvent state.
595 //
596 // 'paste' event in IE is being fired before getClipboardDataByPastebin executes its callback.
597 //
598 // QUESTION: Why didn't you handle all 4 paste methods in handler for 'paste'?
599 // Wouldn't this just be simpler?
600 // ANSWER: Then we would have to evt.data.preventDefault() only for native
601 // context menu and menu bar pastes. The same with execIECommand().
602 // That would force us to mark CTRL+V and editor's paste command with
603 // special flag, other than preventPasteEvent. But we still would have to
604 // have preventPasteEvent for the second event fired by execIECommand.
605 // Code would be longer and not cleaner.
606 if ( clipboard.mainPasteEvent == 'beforepaste' ) {
607 editable.on( 'paste', function( evt ) {
608 if ( preventPasteEvent ) {
609 return;
610 }
611
612 // Cancel next 'paste' event fired by execIECommand( 'paste' )
613 // at the end of this callback.
614 preventPasteEventNow();
615
616 // Prevent native paste.
617 evt.data.preventDefault();
618
619 pasteDataFromClipboard( evt );
620
621 // Force IE to paste content into pastebin so pasteDataFromClipboard will work.
622 if ( !execIECommand( 'paste' ) ) {
623 editor.openDialog( 'paste' );
624 }
625 } );
626
627 // If mainPasteEvent is 'beforePaste' (IE before Edge),
628 // dismiss the (wrong) 'beforepaste' event fired on context/toolbar menu open. (#7953)
629 editable.on( 'contextmenu', preventBeforePasteEventNow, null, null, 0 );
630
631 editable.on( 'beforepaste', function( evt ) {
632 // Do not prevent event on CTRL+V and SHIFT+INS because it blocks paste (#11970).
633 if ( evt.data && !evt.data.$.ctrlKey && !evt.data.$.shiftKey )
634 preventBeforePasteEventNow();
635 }, null, null, 0 );
636 }
637
638 editable.on( 'beforecut', function() {
639 !preventBeforePasteEvent && fixCut( editor );
640 } );
641
642 var mouseupTimeout;
643
644 // Use editor.document instead of editable in non-IEs for observing mouseup
645 // since editable won't fire the event if selection process started within
646 // iframe and ended out of the editor (#9851).
647 editable.attachListener( CKEDITOR.env.ie ? editable : editor.document.getDocumentElement(), 'mouseup', function() {
648 mouseupTimeout = setTimeout( function() {
649 setToolbarStates();
650 }, 0 );
651 } );
652
653 // Make sure that deferred mouseup callback isn't executed after editor instance
654 // had been destroyed. This may happen when editor.destroy() is called in parallel
655 // with mouseup event (i.e. a button with onclick callback) (#10219).
656 editor.on( 'destroy', function() {
657 clearTimeout( mouseupTimeout );
658 } );
659
660 editable.on( 'keyup', setToolbarStates );
661 }
662
663 // Create object representing Cut or Copy commands.
664 function createCutCopyCmd( type ) {
665 return {
666 type: type,
667 canUndo: type == 'cut', // We can't undo copy to clipboard.
668 startDisabled: true,
669 exec: function() {
670 // Attempts to execute the Cut and Copy operations.
671 function tryToCutCopy( type ) {
672 if ( CKEDITOR.env.ie )
673 return execIECommand( type );
674
675 // non-IEs part
676 try {
677 // Other browsers throw an error if the command is disabled.
678 return editor.document.$.execCommand( type, false, null );
679 } catch ( e ) {
680 return false;
681 }
682 }
683
684 this.type == 'cut' && fixCut();
685
686 var success = tryToCutCopy( this.type );
687
688 if ( !success ) {
689 // Show cutError or copyError.
690 editor.showNotification( editor.lang.clipboard[ this.type + 'Error' ] ); // jshint ignore:line
691 }
692
693 return success;
694 }
695 };
696 }
697
698 function createPasteCmd() {
699 return {
700 // Snapshots are done manually by editable.insertXXX methods.
701 canUndo: false,
702 async: true,
703
704 exec: function( editor, data ) {
705 var fire = function( data, withBeforePaste ) {
706 data && firePasteEvents( editor, data, !!withBeforePaste );
707
708 editor.fire( 'afterCommandExec', {
709 name: 'paste',
710 command: cmd,
711 returnValue: !!data
712 } );
713 },
714 cmd = this;
715
716 // Check data precisely - don't open dialog on empty string.
717 if ( typeof data == 'string' )
718 fire( {
719 dataValue: data,
720 method: 'paste',
721 dataTransfer: clipboard.initPasteDataTransfer()
722 }, 1 );
723 else
724 editor.getClipboardData( fire );
725 }
726 };
727 }
728
729 function preventPasteEventNow() {
730 preventPasteEvent = 1;
731 // For safety reason we should wait longer than 0/1ms.
732 // We don't know how long execution of quite complex getClipboardData will take
733 // and in for example 'paste' listener execCommand() (which fires 'paste') is called
734 // after getClipboardData finishes.
735 // Luckily, it's impossible to immediately fire another 'paste' event we want to handle,
736 // because we only handle there native context menu and menu bar.
737 setTimeout( function() {
738 preventPasteEvent = 0;
739 }, 100 );
740 }
741
742 function preventBeforePasteEventNow() {
743 preventBeforePasteEvent = 1;
744 setTimeout( function() {
745 preventBeforePasteEvent = 0;
746 }, 10 );
747 }
748
749 // Tries to execute any of the paste, cut or copy commands in IE. Returns a
750 // boolean indicating that the operation succeeded.
751 // @param {String} command *LOWER CASED* name of command ('paste', 'cut', 'copy').
752 function execIECommand( command ) {
753 var doc = editor.document,
754 body = doc.getBody(),
755 enabled = false,
756 onExec = function() {
757 enabled = true;
758 };
759
760 // The following seems to be the only reliable way to detect that
761 // clipboard commands are enabled in IE. It will fire the
762 // onpaste/oncut/oncopy events only if the security settings allowed
763 // the command to execute.
764 body.on( command, onExec );
765
766 // IE7: document.execCommand has problem to paste into positioned element.
767 if ( CKEDITOR.env.version > 7 ) {
768 doc.$.execCommand( command );
769 } else {
770 doc.$.selection.createRange().execCommand( command );
771 }
772
773 body.removeListener( command, onExec );
774
775 return enabled;
776 }
777
778 // Cutting off control type element in IE standards breaks the selection entirely. (#4881)
779 function fixCut() {
780 if ( !CKEDITOR.env.ie || CKEDITOR.env.quirks )
781 return;
782
783 var sel = editor.getSelection(),
784 control, range, dummy;
785
786 if ( ( sel.getType() == CKEDITOR.SELECTION_ELEMENT ) && ( control = sel.getSelectedElement() ) ) {
787 range = sel.getRanges()[ 0 ];
788 dummy = editor.document.createText( '' );
789 dummy.insertBefore( control );
790 range.setStartBefore( dummy );
791 range.setEndAfter( control );
792 sel.selectRanges( [ range ] );
793
794 // Clear up the fix if the paste wasn't succeeded.
795 setTimeout( function() {
796 // Element still online?
797 if ( control.getParent() ) {
798 dummy.remove();
799 sel.selectElement( control );
800 }
801 }, 0 );
802 }
803 }
804
805 // Allow to peek clipboard content by redirecting the
806 // pasting content into a temporary bin and grab the content of it.
807 function getClipboardDataByPastebin( evt, callback ) {
808 var doc = editor.document,
809 editable = editor.editable(),
810 cancel = function( evt ) {
811 evt.cancel();
812 },
813 blurListener;
814
815 // Avoid recursions on 'paste' event or consequent paste too fast. (#5730)
816 if ( doc.getById( 'cke_pastebin' ) )
817 return;
818
819 var sel = editor.getSelection();
820 var bms = sel.createBookmarks();
821
822 // #11384. On IE9+ we use native selectionchange (i.e. editor#selectionCheck) to cache the most
823 // recent selection which we then lock on editable blur. See selection.js for more info.
824 // selectionchange fired before getClipboardDataByPastebin() cached selection
825 // before creating bookmark (cached selection will be invalid, because bookmarks modified the DOM),
826 // so we need to fire selectionchange one more time, to store current seleciton.
827 // Selection will be locked when we focus pastebin.
828 if ( CKEDITOR.env.ie )
829 sel.root.fire( 'selectionchange' );
830
831 // Create container to paste into.
832 // For rich content we prefer to use "body" since it holds
833 // the least possibility to be splitted by pasted content, while this may
834 // breaks the text selection on a frame-less editable, "div" would be
835 // the best one in that case.
836 // In another case on old IEs moving the selection into a "body" paste bin causes error panic.
837 // Body can't be also used for Opera which fills it with <br>
838 // what is indistinguishable from pasted <br> (copying <br> in Opera isn't possible,
839 // but it can be copied from other browser).
840 var pastebin = new CKEDITOR.dom.element(
841 ( CKEDITOR.env.webkit || editable.is( 'body' ) ) && !CKEDITOR.env.ie ? 'body' : 'div', doc );
842
843 pastebin.setAttributes( {
844 id: 'cke_pastebin',
845 'data-cke-temp': '1'
846 } );
847
848 var containerOffset = 0,
849 offsetParent,
850 win = doc.getWindow();
851
852 if ( CKEDITOR.env.webkit ) {
853 // It's better to paste close to the real paste destination, so inherited styles
854 // (which Webkits will try to compensate by styling span) differs less from the destination's one.
855 editable.append( pastebin );
856 // Style pastebin like .cke_editable, to minimize differences between origin and destination. (#9754)
857 pastebin.addClass( 'cke_editable' );
858
859 // Compensate position of offsetParent.
860 if ( !editable.is( 'body' ) ) {
861 // We're not able to get offsetParent from pastebin (body element), so check whether
862 // its parent (editable) is positioned.
863 if ( editable.getComputedStyle( 'position' ) != 'static' )
864 offsetParent = editable;
865 // And if not - safely get offsetParent from editable.
866 else
867 offsetParent = CKEDITOR.dom.element.get( editable.$.offsetParent );
868
869 containerOffset = offsetParent.getDocumentPosition().y;
870 }
871 } else {
872 // Opera and IE doesn't allow to append to html element.
873 editable.getAscendant( CKEDITOR.env.ie ? 'body' : 'html', 1 ).append( pastebin );
874 }
875
876 pastebin.setStyles( {
877 position: 'absolute',
878 // Position the bin at the top (+10 for safety) of viewport to avoid any subsequent document scroll.
879 top: ( win.getScrollPosition().y - containerOffset + 10 ) + 'px',
880 width: '1px',
881 // Caret has to fit in that height, otherwise browsers like Chrome & Opera will scroll window to show it.
882 // Set height equal to viewport's height - 20px (safety gaps), minimum 1px.
883 height: Math.max( 1, win.getViewPaneSize().height - 20 ) + 'px',
884 overflow: 'hidden',
885 // Reset styles that can mess up pastebin position.
886 margin: 0,
887 padding: 0
888 } );
889
890 // Paste fails in Safari when the body tag has 'user-select: none'. (#12506)
891 if ( CKEDITOR.env.safari )
892 pastebin.setStyles( CKEDITOR.tools.cssVendorPrefix( 'user-select', 'text' ) );
893
894 // Check if the paste bin now establishes new editing host.
895 var isEditingHost = pastebin.getParent().isReadOnly();
896
897 if ( isEditingHost ) {
898 // Hide the paste bin.
899 pastebin.setOpacity( 0 );
900 // And make it editable.
901 pastebin.setAttribute( 'contenteditable', true );
902 }
903 // Transparency is not enough since positioned non-editing host always shows
904 // resize handler, pull it off the screen instead.
905 else {
906 pastebin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-1000px' );
907 }
908
909 editor.on( 'selectionChange', cancel, null, null, 0 );
910
911 // Webkit fill fire blur on editable when moving selection to
912 // pastebin (if body is used). Cancel it because it causes incorrect
913 // selection lock in case of inline editor (#10644).
914 // The same seems to apply to Firefox (#10787).
915 if ( CKEDITOR.env.webkit || CKEDITOR.env.gecko )
916 blurListener = editable.once( 'blur', cancel, null, null, -100 );
917
918 // Temporarily move selection to the pastebin.
919 isEditingHost && pastebin.focus();
920 var range = new CKEDITOR.dom.range( pastebin );
921 range.selectNodeContents( pastebin );
922 var selPastebin = range.select();
923
924 // If non-native paste is executed, IE will open security alert and blur editable.
925 // Editable will then lock selection inside itself and after accepting security alert
926 // this selection will be restored. We overwrite stored selection, so it's restored
927 // in pastebin. (#9552)
928 if ( CKEDITOR.env.ie ) {
929 blurListener = editable.once( 'blur', function() {
930 editor.lockSelection( selPastebin );
931 } );
932 }
933
934 var scrollTop = CKEDITOR.document.getWindow().getScrollPosition().y;
935
936 // Wait a while and grab the pasted contents.
937 setTimeout( function() {
938 // Restore main window's scroll position which could have been changed
939 // by browser in cases described in #9771.
940 if ( CKEDITOR.env.webkit )
941 CKEDITOR.document.getBody().$.scrollTop = scrollTop;
942
943 // Blur will be fired only on non-native paste. In other case manually remove listener.
944 blurListener && blurListener.removeListener();
945
946 // Restore properly the document focus. (#8849)
947 if ( CKEDITOR.env.ie )
948 editable.focus();
949
950 // IE7: selection must go before removing pastebin. (#8691)
951 sel.selectBookmarks( bms );
952 pastebin.remove();
953
954 // Grab the HTML contents.
955 // We need to look for a apple style wrapper on webkit it also adds
956 // a div wrapper if you copy/paste the body of the editor.
957 // Remove hidden div and restore selection.
958 var bogusSpan;
959 if ( CKEDITOR.env.webkit && ( bogusSpan = pastebin.getFirst() ) && ( bogusSpan.is && bogusSpan.hasClass( 'Apple-style-span' ) ) )
960 pastebin = bogusSpan;
961
962 editor.removeListener( 'selectionChange', cancel );
963 callback( pastebin.getHtml() );
964 }, 0 );
965 }
966
967 // Try to get content directly on IE from clipboard, without native event
968 // being fired before. In other words - synthetically get clipboard data, if it's possible.
969 // mainPasteEvent will be fired, so if forced native paste:
970 // * worked, getClipboardDataByPastebin will grab it,
971 // * didn't work, dataValue and dataTransfer will be empty and editor#paste won't be fired.
972 // Clipboard data can be accessed directly only on IEs older than Edge.
973 // On other browsers we should fire beforePaste event and return false.
974 function getClipboardDataDirectly() {
975 if ( clipboard.mainPasteEvent == 'paste' ) {
976 // beforePaste should be fired when dialog open so it can be canceled.
977 editor.fire( 'beforePaste', { type: 'auto', method: 'paste' } );
978 return false;
979 }
980
981 // Prevent IE from pasting at the begining of the document.
982 editor.focus();
983
984 // Command will be handled by 'beforepaste', but as
985 // execIECommand( 'paste' ) will fire also 'paste' event
986 // we're canceling it.
987 preventPasteEventNow();
988
989 // #9247: Lock focus to prevent IE from hiding toolbar for inline editor.
990 var focusManager = editor.focusManager;
991 focusManager.lock();
992
993 if ( editor.editable().fire( clipboard.mainPasteEvent ) && !execIECommand( 'paste' ) ) {
994 focusManager.unlock();
995 return false;
996 }
997 focusManager.unlock();
998
999 return true;
1000 }
1001
1002 // Listens for some clipboard related keystrokes, so they get customized.
1003 // Needs to be bind to keydown event.
1004 function onKey( event ) {
1005 if ( editor.mode != 'wysiwyg' )
1006 return;
1007
1008 switch ( event.data.keyCode ) {
1009 // Paste
1010 case CKEDITOR.CTRL + 86: // CTRL+V
1011 case CKEDITOR.SHIFT + 45: // SHIFT+INS
1012 var editable = editor.editable();
1013
1014 // Cancel 'paste' event because ctrl+v is for IE handled
1015 // by 'beforepaste'.
1016 preventPasteEventNow();
1017
1018 // Simulate 'beforepaste' event for all browsers using 'paste' as main event.
1019 if ( clipboard.mainPasteEvent == 'paste' ) {
1020 editable.fire( 'beforepaste' );
1021 }
1022
1023 return;
1024
1025 // Cut
1026 case CKEDITOR.CTRL + 88: // CTRL+X
1027 case CKEDITOR.SHIFT + 46: // SHIFT+DEL
1028 // Save Undo snapshot.
1029 editor.fire( 'saveSnapshot' ); // Save before cut
1030 setTimeout( function() {
1031 editor.fire( 'saveSnapshot' ); // Save after cut
1032 }, 50 ); // OSX is slow (#11416).
1033 }
1034 }
1035
1036 function pasteDataFromClipboard( evt ) {
1037 // Default type is 'auto', but can be changed by beforePaste listeners.
1038 var eventData = {
1039 type: 'auto',
1040 method: 'paste',
1041 dataTransfer: clipboard.initPasteDataTransfer( evt )
1042 };
1043
1044 eventData.dataTransfer.cacheData();
1045
1046 // Fire 'beforePaste' event so clipboard flavor get customized by other plugins.
1047 // If 'beforePaste' is canceled continue executing getClipboardDataByPastebin and then do nothing
1048 // (do not fire 'paste', 'afterPaste' events). This way we can grab all - synthetically
1049 // and natively pasted content and prevent its insertion into editor
1050 // after canceling 'beforePaste' event.
1051 var beforePasteNotCanceled = editor.fire( 'beforePaste', eventData ) !== false;
1052
1053 // Do not use paste bin if the browser let us get HTML or files from dataTranfer.
1054 if ( beforePasteNotCanceled && clipboard.canClipboardApiBeTrusted( eventData.dataTransfer, editor ) ) {
1055 evt.data.preventDefault();
1056 setTimeout( function() {
1057 firePasteEvents( editor, eventData );
1058 }, 0 );
1059 } else {
1060 getClipboardDataByPastebin( evt, function( data ) {
1061 // Clean up.
1062 eventData.dataValue = data.replace( /<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig, '' );
1063
1064 // Fire remaining events (without beforePaste)
1065 beforePasteNotCanceled && firePasteEvents( editor, eventData );
1066 } );
1067 }
1068 }
1069
1070 function setToolbarStates() {
1071 if ( editor.mode != 'wysiwyg' )
1072 return;
1073
1074 var pasteState = stateFromNamedCommand( 'paste' );
1075
1076 editor.getCommand( 'cut' ).setState( stateFromNamedCommand( 'cut' ) );
1077 editor.getCommand( 'copy' ).setState( stateFromNamedCommand( 'copy' ) );
1078 editor.getCommand( 'paste' ).setState( pasteState );
1079 editor.fire( 'pasteState', pasteState );
1080 }
1081
1082 function stateFromNamedCommand( command ) {
1083 if ( inReadOnly && command in { paste: 1, cut: 1 } )
1084 return CKEDITOR.TRISTATE_DISABLED;
1085
1086 if ( command == 'paste' )
1087 return CKEDITOR.TRISTATE_OFF;
1088
1089 // Cut, copy - check if the selection is not empty.
1090 var sel = editor.getSelection(),
1091 ranges = sel.getRanges(),
1092 selectionIsEmpty = sel.getType() == CKEDITOR.SELECTION_NONE || ( ranges.length == 1 && ranges[ 0 ].collapsed );
1093
1094 return selectionIsEmpty ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_OFF;
1095 }
1096 }
1097
1098 // Returns:
1099 // * 'htmlifiedtext' if content looks like transformed by browser from plain text.
1100 // See clipboard/paste.html TCs for more info.
1101 // * 'html' if it is not 'htmlifiedtext'.
1102 function recogniseContentType( data ) {
1103 if ( CKEDITOR.env.webkit ) {
1104 // Plain text or ( <div><br></div> and text inside <div> ).
1105 if ( !data.match( /^[^<]*$/g ) && !data.match( /^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi ) )
1106 return 'html';
1107 } else if ( CKEDITOR.env.ie ) {
1108 // Text and <br> or ( text and <br> in <p> - paragraphs can be separated by new \r\n ).
1109 if ( !data.match( /^([^<]|<br( ?\/)?>)*$/gi ) && !data.match( /^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi ) )
1110 return 'html';
1111 } else if ( CKEDITOR.env.gecko ) {
1112 // Text or <br>.
1113 if ( !data.match( /^([^<]|<br( ?\/)?>)*$/gi ) )
1114 return 'html';
1115 } else {
1116 return 'html';
1117 }
1118
1119 return 'htmlifiedtext';
1120 }
1121
1122 // This function transforms what browsers produce when
1123 // pasting plain text into editable element (see clipboard/paste.html TCs
1124 // for more info) into correct HTML (similar to that produced by text2Html).
1125 function htmlifiedTextHtmlification( config, data ) {
1126 function repeatParagraphs( repeats ) {
1127 // Repeat blocks floor((n+1)/2) times.
1128 // Even number of repeats - add <br> at the beginning of last <p>.
1129 return CKEDITOR.tools.repeat( '</p><p>', ~~( repeats / 2 ) ) + ( repeats % 2 == 1 ? '<br>' : '' );
1130 }
1131
1132 // Replace adjacent white-spaces (EOLs too - Fx sometimes keeps them) with one space.
1133 data = data.replace( /\s+/g, ' ' )
1134 // Remove spaces from between tags.
1135 .replace( /> +</g, '><' )
1136 // Normalize XHTML syntax and upper cased <br> tags.
1137 .replace( /<br ?\/>/gi, '<br>' );
1138
1139 // IE - lower cased tags.
1140 data = data.replace( /<\/?[A-Z]+>/g, function( match ) {
1141 return match.toLowerCase();
1142 } );
1143
1144 // Don't touch single lines (no <br|p|div>) - nothing to do here.
1145 if ( data.match( /^[^<]$/ ) )
1146 return data;
1147
1148 // Webkit.
1149 if ( CKEDITOR.env.webkit && data.indexOf( '<div>' ) > -1 ) {
1150 // One line break at the beginning - insert <br>
1151 data = data.replace( /^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g, '<br>' )
1152 // Two or more - reduce number of new lines by one.
1153 .replace( /^(<div>(<br>|)<\/div>){2}(?!$)/g, '<div></div>' );
1154
1155 // Two line breaks create one paragraph in Webkit.
1156 if ( data.match( /<div>(<br>|)<\/div>/ ) ) {
1157 data = '<p>' + data.replace( /(<div>(<br>|)<\/div>)+/g, function( match ) {
1158 return repeatParagraphs( match.split( '</div><div>' ).length + 1 );
1159 } ) + '</p>';
1160 }
1161
1162 // One line break create br.
1163 data = data.replace( /<\/div><div>/g, '<br>' );
1164
1165 // Remove remaining divs.
1166 data = data.replace( /<\/?div>/g, '' );
1167 }
1168
1169 // Opera and Firefox and enterMode != BR.
1170 if ( CKEDITOR.env.gecko && config.enterMode != CKEDITOR.ENTER_BR ) {
1171 // Remove bogus <br> - Fx generates two <brs> for one line break.
1172 // For two line breaks it still produces two <brs>, but it's better to ignore this case than the first one.
1173 if ( CKEDITOR.env.gecko )
1174 data = data.replace( /^<br><br>$/, '<br>' );
1175
1176 // This line satisfy edge case when for Opera we have two line breaks
1177 //data = data.replace( /)
1178
1179 if ( data.indexOf( '<br><br>' ) > -1 ) {
1180 // Two line breaks create one paragraph, three - 2, four - 3, etc.
1181 data = '<p>' + data.replace( /(<br>){2,}/g, function( match ) {
1182 return repeatParagraphs( match.length / 4 );
1183 } ) + '</p>';
1184 }
1185 }
1186
1187 return switchEnterMode( config, data );
1188 }
1189
1190 function filtersFactoryFactory() {
1191 var filters = {};
1192
1193 function setUpTags() {
1194 var tags = {};
1195
1196 for ( var tag in CKEDITOR.dtd ) {
1197 if ( tag.charAt( 0 ) != '$' && tag != 'div' && tag != 'span' ) {
1198 tags[ tag ] = 1;
1199 }
1200 }
1201
1202 return tags;
1203 }
1204
1205 function createSemanticContentFilter() {
1206 var filter = new CKEDITOR.filter();
1207
1208 filter.allow( {
1209 $1: {
1210 elements: setUpTags(),
1211 attributes: true,
1212 styles: false,
1213 classes: false
1214 }
1215 } );
1216
1217 return filter;
1218 }
1219
1220 return {
1221 get: function( type ) {
1222 if ( type == 'plain-text' ) {
1223 // Does this look confusing to you? Did we forget about enter mode?
1224 // It is a trick that let's us creating one filter for edidtor, regardless of its
1225 // activeEnterMode (which as the name indicates can change during runtime).
1226 //
1227 // How does it work?
1228 // The active enter mode is passed to the filter.applyTo method.
1229 // The filter first marks all elements except <br> as disallowed and then tries to remove
1230 // them. However, it cannot remove e.g. a <p> element completely, because it's a basic structural element,
1231 // so it tries to replace it with an element created based on the active enter mode, eventually doing nothing.
1232 //
1233 // Now you can sleep well.
1234 return filters.plainText || ( filters.plainText = new CKEDITOR.filter( 'br' ) );
1235 } else if ( type == 'semantic-content' ) {
1236 return filters.semanticContent || ( filters.semanticContent = createSemanticContentFilter() );
1237 } else if ( type ) {
1238 // Create filter based on rules (string or object).
1239 return new CKEDITOR.filter( type );
1240 }
1241
1242 return null;
1243 }
1244 };
1245 }
1246
1247 function filterContent( editor, data, filter ) {
1248 var fragment = CKEDITOR.htmlParser.fragment.fromHtml( data ),
1249 writer = new CKEDITOR.htmlParser.basicWriter();
1250
1251 filter.applyTo( fragment, true, false, editor.activeEnterMode );
1252 fragment.writeHtml( writer );
1253
1254 return writer.getHtml();
1255 }
1256
1257 function switchEnterMode( config, data ) {
1258 if ( config.enterMode == CKEDITOR.ENTER_BR ) {
1259 data = data.replace( /(<\/p><p>)+/g, function( match ) {
1260 return CKEDITOR.tools.repeat( '<br>', match.length / 7 * 2 );
1261 } ).replace( /<\/?p>/g, '' );
1262 } else if ( config.enterMode == CKEDITOR.ENTER_DIV ) {
1263 data = data.replace( /<(\/)?p>/g, '<$1div>' );
1264 }
1265
1266 return data;
1267 }
1268
1269 function preventDefaultSetDropEffectToNone( evt ) {
1270 evt.data.preventDefault();
1271 evt.data.$.dataTransfer.dropEffect = 'none';
1272 }
1273
1274 function initDragDrop( editor ) {
1275 var clipboard = CKEDITOR.plugins.clipboard;
1276
1277 editor.on( 'contentDom', function() {
1278 var editable = editor.editable(),
1279 dropTarget = CKEDITOR.plugins.clipboard.getDropTarget( editor ),
1280 top = editor.ui.space( 'top' ),
1281 bottom = editor.ui.space( 'bottom' );
1282
1283 // -------------- DRAGOVER TOP & BOTTOM --------------
1284
1285 // Not allowing dragging on toolbar and bottom (#12613).
1286 clipboard.preventDefaultDropOnElement( top );
1287 clipboard.preventDefaultDropOnElement( bottom );
1288
1289 // -------------- DRAGSTART --------------
1290 // Listed on dragstart to mark internal and cross-editor drag & drop
1291 // and save range and selected HTML.
1292
1293 editable.attachListener( dropTarget, 'dragstart', fireDragEvent );
1294
1295 // Make sure to reset data transfer (in case dragend was not called or was canceled).
1296 editable.attachListener( editor, 'dragstart', clipboard.resetDragDataTransfer, clipboard, null, 1 );
1297
1298 // Create a dataTransfer object and save it globally.
1299 editable.attachListener( editor, 'dragstart', function( evt ) {
1300 clipboard.initDragDataTransfer( evt, editor );
1301 }, null, null, 2 );
1302
1303 editable.attachListener( editor, 'dragstart', function() {
1304 // Save drag range globally for cross editor D&D.
1305 var dragRange = clipboard.dragRange = editor.getSelection().getRanges()[ 0 ];
1306
1307 // Store number of children, so we can later tell if any text node was split on drop. (#13011, #13447)
1308 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
1309 clipboard.dragStartContainerChildCount = dragRange ? getContainerChildCount( dragRange.startContainer ) : null;
1310 clipboard.dragEndContainerChildCount = dragRange ? getContainerChildCount( dragRange.endContainer ) : null;
1311 }
1312 }, null, null, 100 );
1313
1314 // -------------- DRAGEND --------------
1315 // Clean up on dragend.
1316
1317 editable.attachListener( dropTarget, 'dragend', fireDragEvent );
1318
1319 // Init data transfer if someone wants to use it in dragend.
1320 editable.attachListener( editor, 'dragend', clipboard.initDragDataTransfer, clipboard, null, 1 );
1321
1322 // When drag & drop is done we need to reset dataTransfer so the future
1323 // external drop will be not recognize as internal.
1324 editable.attachListener( editor, 'dragend', clipboard.resetDragDataTransfer, clipboard, null, 100 );
1325
1326 // -------------- DRAGOVER --------------
1327 // We need to call preventDefault on dragover because otherwise if
1328 // we drop image it will overwrite document.
1329
1330 editable.attachListener( dropTarget, 'dragover', function( evt ) {
1331 var target = evt.data.getTarget();
1332
1333 // Prevent reloading page when dragging image on empty document (#12619).
1334 if ( target && target.is && target.is( 'html' ) ) {
1335 evt.data.preventDefault();
1336 return;
1337 }
1338
1339 // If we do not prevent default dragover on IE the file path
1340 // will be loaded and we will lose content. On the other hand
1341 // if we prevent it the cursor will not we shown, so we prevent
1342 // dragover only on IE, on versions which support file API and only
1343 // if the event contains files.
1344 if ( CKEDITOR.env.ie &&
1345 CKEDITOR.plugins.clipboard.isFileApiSupported &&
1346 evt.data.$.dataTransfer.types.contains( 'Files' ) ) {
1347 evt.data.preventDefault();
1348 }
1349 } );
1350
1351 // -------------- DROP --------------
1352
1353 editable.attachListener( dropTarget, 'drop', function( evt ) {
1354 // Do nothing if event was already prevented. (#13879)
1355 if ( evt.data.$.defaultPrevented ) {
1356 return;
1357 }
1358
1359 // Cancel native drop.
1360 evt.data.preventDefault();
1361
1362 var target = evt.data.getTarget(),
1363 readOnly = target.isReadOnly();
1364
1365 // Do nothing if drop on non editable element (#13015).
1366 // The <html> tag isn't editable (body is), but we want to allow drop on it
1367 // (so it is possible to drop below editor contents).
1368 if ( readOnly && !( target.type == CKEDITOR.NODE_ELEMENT && target.is( 'html' ) ) ) {
1369 return;
1370 }
1371
1372 // Getting drop position is one of the most complex parts.
1373 var dropRange = clipboard.getRangeAtDropPosition( evt, editor ),
1374 dragRange = clipboard.dragRange;
1375
1376 // Do nothing if it was not possible to get drop range.
1377 if ( !dropRange ) {
1378 return;
1379 }
1380
1381 // Fire drop.
1382 fireDragEvent( evt, dragRange, dropRange );
1383 }, null, null, 9999 );
1384
1385 // Create dataTransfer or get it, if it was created before.
1386 editable.attachListener( editor, 'drop', clipboard.initDragDataTransfer, clipboard, null, 1 );
1387
1388 // Execute drop action, fire paste.
1389 editable.attachListener( editor, 'drop', function( evt ) {
1390 var data = evt.data;
1391
1392 if ( !data ) {
1393 return;
1394 }
1395
1396 // Let user modify drag and drop range.
1397 var dropRange = data.dropRange,
1398 dragRange = data.dragRange,
1399 dataTransfer = data.dataTransfer;
1400
1401 if ( dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_INTERNAL ) {
1402 // Execute drop with a timeout because otherwise selection, after drop,
1403 // on IE is in the drag position, instead of drop position.
1404 setTimeout( function() {
1405 clipboard.internalDrop( dragRange, dropRange, dataTransfer, editor );
1406 }, 0 );
1407 } else if ( dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_CROSS_EDITORS ) {
1408 crossEditorDrop( dragRange, dropRange, dataTransfer );
1409 } else {
1410 externalDrop( dropRange, dataTransfer );
1411 }
1412 }, null, null, 9999 );
1413
1414 // Cross editor drag and drop (drag in one Editor and drop in the other).
1415 function crossEditorDrop( dragRange, dropRange, dataTransfer ) {
1416 // Paste event should be fired before delete contents because otherwise
1417 // Chrome have a problem with drop range (Chrome split the drop
1418 // range container so the offset is bigger then container length).
1419 dropRange.select();
1420 firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop' }, 1 );
1421
1422 // Remove dragged content and make a snapshot.
1423 dataTransfer.sourceEditor.fire( 'saveSnapshot' );
1424
1425 dataTransfer.sourceEditor.editable().extractHtmlFromRange( dragRange );
1426
1427 // Make some selection before saving snapshot, otherwise error will be thrown, because
1428 // there will be no valid selection after content is removed.
1429 dataTransfer.sourceEditor.getSelection().selectRanges( [ dragRange ] );
1430 dataTransfer.sourceEditor.fire( 'saveSnapshot' );
1431 }
1432
1433 // Drop from external source.
1434 function externalDrop( dropRange, dataTransfer ) {
1435 // Paste content into the drop position.
1436 dropRange.select();
1437
1438 firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop' }, 1 );
1439
1440 // Usually we reset DataTranfer on dragend,
1441 // but dragend is called on the same element as dragstart
1442 // so it will not be called on on external drop.
1443 clipboard.resetDragDataTransfer();
1444 }
1445
1446 // Fire drag/drop events (dragstart, dragend, drop).
1447 function fireDragEvent( evt, dragRange, dropRange ) {
1448 var eventData = {
1449 $: evt.data.$,
1450 target: evt.data.getTarget()
1451 };
1452
1453 if ( dragRange ) {
1454 eventData.dragRange = dragRange;
1455 }
1456 if ( dropRange ) {
1457 eventData.dropRange = dropRange;
1458 }
1459
1460 if ( editor.fire( evt.name, eventData ) === false ) {
1461 evt.data.preventDefault();
1462 }
1463 }
1464
1465 function getContainerChildCount( container ) {
1466 if ( container.type != CKEDITOR.NODE_ELEMENT ) {
1467 container = container.getParent();
1468 }
1469
1470 return container.getChildCount();
1471 }
1472 } );
1473 }
1474
1475 /**
1476 * @singleton
1477 * @class CKEDITOR.plugins.clipboard
1478 */
1479 CKEDITOR.plugins.clipboard = {
1480 /**
1481 * True if the environment allows to set data on copy or cut manually. This value is false in IE, because this browser
1482 * shows the security dialog window when the script tries to set clipboard data and on iOS, because custom data is
1483 * not saved to clipboard there.
1484 *
1485 * @since 4.5
1486 * @readonly
1487 * @property {Boolean}
1488 */
1489 isCustomCopyCutSupported: !CKEDITOR.env.ie && !CKEDITOR.env.iOS,
1490
1491 /**
1492 * True if the environment supports MIME types and custom data types in dataTransfer/cliboardData getData/setData methods.
1493 *
1494 * @since 4.5
1495 * @readonly
1496 * @property {Boolean}
1497 */
1498 isCustomDataTypesSupported: !CKEDITOR.env.ie,
1499
1500 /**
1501 * True if the environment supports File API.
1502 *
1503 * @since 4.5
1504 * @readonly
1505 * @property {Boolean}
1506 */
1507 isFileApiSupported: !CKEDITOR.env.ie || CKEDITOR.env.version > 9,
1508
1509 /**
1510 * Main native paste event editable should listen to.
1511 *
1512 * **Note:** Safari does not like the {@link CKEDITOR.editor#beforePaste} event &mdash; it sometimes does not
1513 * handle <kbd>Ctrl+C</kbd> properly. This is probably caused by some race condition between events.
1514 * Chrome, Firefox and Edge work well with both events, so it is better to use {@link CKEDITOR.editor#paste}
1515 * which will handle pasting from e.g. browsers' menu bars.
1516 * IE7/8 does not like the {@link CKEDITOR.editor#paste} event for which it is throwing random errors.
1517 *
1518 * @since 4.5
1519 * @readonly
1520 * @property {String}
1521 */
1522 mainPasteEvent: ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ? 'beforepaste' : 'paste',
1523
1524 /**
1525 * Returns `true` if it is expected that a browser provides HTML data through the Clipboard API.
1526 * If not, this method returns `false` and as a result CKEditor will use the paste bin. Read more in
1527 * the [Clipboard Integration](http://docs.ckeditor.com/#!/guide/dev_clipboard-section-clipboard-api) guide.
1528 *
1529 * @since 4.5.2
1530 * @returns {Boolean}
1531 */
1532 canClipboardApiBeTrusted: function( dataTransfer, editor ) {
1533 // If it's an internal or cross-editor data transfer, then it means that custom cut/copy/paste support works
1534 // and that the data were put manually on the data transfer so we can be sure that it's available.
1535 if ( dataTransfer.getTransferType( editor ) != CKEDITOR.DATA_TRANSFER_EXTERNAL ) {
1536 return true;
1537 }
1538
1539 // In Chrome we can trust Clipboard API, with the exception of Chrome on Android (in both - mobile and desktop modes), where
1540 // clipboard API is not available so we need to check it (#13187).
1541 if ( CKEDITOR.env.chrome && !dataTransfer.isEmpty() ) {
1542 return true;
1543 }
1544
1545 // Because of a Firefox bug HTML data are not available in some cases (e.g. paste from Word), in such cases we
1546 // need to use the pastebin (#13528, https://bugzilla.mozilla.org/show_bug.cgi?id=1183686).
1547 if ( CKEDITOR.env.gecko && ( dataTransfer.getData( 'text/html' ) || dataTransfer.getFilesCount() ) ) {
1548 return true;
1549 }
1550
1551 // In Safari and IE HTML data is not available though the Clipboard API.
1552 // In Edge things are a bit messy at the moment -
1553 // https://connect.microsoft.com/IE/feedback/details/1572456/edge-clipboard-api-text-html-content-messed-up-in-event-clipboarddata
1554 // It is safer to use the paste bin in unknown cases.
1555 return false;
1556 },
1557
1558 /**
1559 * Returns the element that should be used as the target for the drop event.
1560 *
1561 * @since 4.5
1562 * @param {CKEDITOR.editor} editor The editor instance.
1563 * @returns {CKEDITOR.dom.domObject} the element that should be used as the target for the drop event.
1564 */
1565 getDropTarget: function( editor ) {
1566 var editable = editor.editable();
1567
1568 // #11123 Firefox needs to listen on document, because otherwise event won't be fired.
1569 // #11086 IE8 cannot listen on document.
1570 if ( ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) || editable.isInline() ) {
1571 return editable;
1572 } else {
1573 return editor.document;
1574 }
1575 },
1576
1577 /**
1578 * IE 8 & 9 split text node on drop so the first node contains the
1579 * text before the drop position and the second contains the rest. If you
1580 * drag the content from the same node you will be not be able to get
1581 * it (the range becomes invalid), so you need to join them back.
1582 *
1583 * Note that the first node in IE 8 & 9 is the original node object
1584 * but with shortened content.
1585 *
1586 * Before:
1587 * --- Text Node A ----------------------------------
1588 * /\
1589 * Drag position
1590 *
1591 * After (IE 8 & 9):
1592 * --- Text Node A ----- --- Text Node B -----------
1593 * /\ /\
1594 * Drop position Drag position
1595 * (invalid)
1596 *
1597 * After (other browsers):
1598 * --- Text Node A ----------------------------------
1599 * /\ /\
1600 * Drop position Drag position
1601 *
1602 * **Note:** This function is in the public scope for tests usage only.
1603 *
1604 * @since 4.5
1605 * @private
1606 * @param {CKEDITOR.dom.range} dragRange The drag range.
1607 * @param {CKEDITOR.dom.range} dropRange The drop range.
1608 * @param {Number} preDragStartContainerChildCount The number of children of the drag range start container before the drop.
1609 * @param {Number} preDragEndContainerChildCount The number of children of the drag range end container before the drop.
1610 */
1611 fixSplitNodesAfterDrop: function( dragRange, dropRange, preDragStartContainerChildCount, preDragEndContainerChildCount ) {
1612 var dropContainer = dropRange.startContainer;
1613
1614 if (
1615 typeof preDragEndContainerChildCount != 'number' ||
1616 typeof preDragStartContainerChildCount != 'number'
1617 ) {
1618 return;
1619 }
1620
1621 // We are only concerned about ranges anchored in elements.
1622 if ( dropContainer.type != CKEDITOR.NODE_ELEMENT ) {
1623 return;
1624 }
1625
1626 if ( handleContainer( dragRange.startContainer, dropContainer, preDragStartContainerChildCount ) ) {
1627 return;
1628 }
1629
1630 if ( handleContainer( dragRange.endContainer, dropContainer, preDragEndContainerChildCount ) ) {
1631 return;
1632 }
1633
1634 function handleContainer( dragContainer, dropContainer, preChildCount ) {
1635 var dragElement = dragContainer;
1636 if ( dragElement.type == CKEDITOR.NODE_TEXT ) {
1637 dragElement = dragContainer.getParent();
1638 }
1639
1640 if ( dragElement.equals( dropContainer ) && preChildCount != dropContainer.getChildCount() ) {
1641 applyFix( dropRange );
1642 return true;
1643 }
1644 }
1645
1646 function applyFix( dropRange ) {
1647 var nodeBefore = dropRange.startContainer.getChild( dropRange.startOffset - 1 ),
1648 nodeAfter = dropRange.startContainer.getChild( dropRange.startOffset );
1649
1650 if (
1651 nodeBefore && nodeBefore.type == CKEDITOR.NODE_TEXT &&
1652 nodeAfter && nodeAfter.type == CKEDITOR.NODE_TEXT
1653 ) {
1654 var offset = nodeBefore.getLength();
1655
1656 nodeBefore.setText( nodeBefore.getText() + nodeAfter.getText() );
1657 nodeAfter.remove();
1658
1659 dropRange.setStart( nodeBefore, offset );
1660 dropRange.collapse( true );
1661 }
1662 }
1663 },
1664
1665 /**
1666 * Checks whether turning the drag range into bookmarks will invalidate the drop range.
1667 * This usually happens when the drop range shares the container with the drag range and is
1668 * located after the drag range, but there are countless edge cases.
1669 *
1670 * This function is stricly related to {@link #internalDrop} which toggles
1671 * order in which it creates bookmarks for both ranges based on a value returned
1672 * by this method. In some cases this method returns a value which is not necessarily
1673 * true in terms of what it was meant to check, but it is convenient, because
1674 * we know how it is interpreted in {@link #internalDrop}, so the correct
1675 * behavior of the entire algorithm is assured.
1676 *
1677 * **Note:** This function is in the public scope for tests usage only.
1678 *
1679 * @since 4.5
1680 * @private
1681 * @param {CKEDITOR.dom.range} dragRange The first range to compare.
1682 * @param {CKEDITOR.dom.range} dropRange The second range to compare.
1683 * @returns {Boolean} `true` if the first range is before the second range.
1684 */
1685 isDropRangeAffectedByDragRange: function( dragRange, dropRange ) {
1686 var dropContainer = dropRange.startContainer,
1687 dropOffset = dropRange.endOffset;
1688
1689 // Both containers are the same and drop offset is at the same position or later.
1690 // " A L] A " " M A "
1691 // ^ ^
1692 if ( dragRange.endContainer.equals( dropContainer ) && dragRange.endOffset <= dropOffset ) {
1693 return true;
1694 }
1695
1696 // Bookmark for drag start container will mess up with offsets.
1697 // " O [L A " " M A "
1698 // ^ ^
1699 if (
1700 dragRange.startContainer.getParent().equals( dropContainer ) &&
1701 dragRange.startContainer.getIndex() < dropOffset
1702 ) {
1703 return true;
1704 }
1705
1706 // Bookmark for drag end container will mess up with offsets.
1707 // " O] L A " " M A "
1708 // ^ ^
1709 if (
1710 dragRange.endContainer.getParent().equals( dropContainer ) &&
1711 dragRange.endContainer.getIndex() < dropOffset
1712 ) {
1713 return true;
1714 }
1715
1716 return false;
1717 },
1718
1719 /**
1720 * Internal drag and drop (drag and drop in the same editor instance).
1721 *
1722 * **Note:** This function is in the public scope for tests usage only.
1723 *
1724 * @since 4.5
1725 * @private
1726 * @param {CKEDITOR.dom.range} dragRange The first range to compare.
1727 * @param {CKEDITOR.dom.range} dropRange The second range to compare.
1728 * @param {CKEDITOR.plugins.clipboard.dataTransfer} dataTransfer
1729 * @param {CKEDITOR.editor} editor
1730 */
1731 internalDrop: function( dragRange, dropRange, dataTransfer, editor ) {
1732 var clipboard = CKEDITOR.plugins.clipboard,
1733 editable = editor.editable(),
1734 dragBookmark, dropBookmark, isDropRangeAffected;
1735
1736 // Save and lock snapshot so there will be only
1737 // one snapshot for both remove and insert content.
1738 editor.fire( 'saveSnapshot' );
1739 editor.fire( 'lockSnapshot', { dontUpdate: 1 } );
1740
1741 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
1742 this.fixSplitNodesAfterDrop(
1743 dragRange,
1744 dropRange,
1745 clipboard.dragStartContainerChildCount,
1746 clipboard.dragEndContainerChildCount
1747 );
1748 }
1749
1750 // Because we manipulate multiple ranges we need to do it carefully,
1751 // changing one range (event creating a bookmark) may make other invalid.
1752 // We need to change ranges into bookmarks so we can manipulate them easily in the future.
1753 // We can change the range which is later in the text before we change the preceding range.
1754 // We call isDropRangeAffectedByDragRange to test the order of ranges.
1755 isDropRangeAffected = this.isDropRangeAffectedByDragRange( dragRange, dropRange );
1756 if ( !isDropRangeAffected ) {
1757 dragBookmark = dragRange.createBookmark( false );
1758 }
1759 dropBookmark = dropRange.clone().createBookmark( false );
1760 if ( isDropRangeAffected ) {
1761 dragBookmark = dragRange.createBookmark( false );
1762 }
1763
1764 // Check if drop range is inside range.
1765 // This is an edge case when we drop something on editable's margin/padding.
1766 // That space is not treated as a part of the range we drag, so it is possible to drop there.
1767 // When we drop, browser tries to find closest drop position and it finds it inside drag range. (#13453)
1768 var startNode = dragBookmark.startNode,
1769 endNode = dragBookmark.endNode,
1770 dropNode = dropBookmark.startNode,
1771 dropInsideDragRange =
1772 // Must check endNode because dragRange could be collapsed in some edge cases (simulated DnD).
1773 endNode &&
1774 ( startNode.getPosition( dropNode ) & CKEDITOR.POSITION_PRECEDING ) &&
1775 ( endNode.getPosition( dropNode ) & CKEDITOR.POSITION_FOLLOWING );
1776
1777 // If the drop range happens to be inside drag range change it's position to the beginning of the drag range.
1778 if ( dropInsideDragRange ) {
1779 // We only change position of bookmark span that is connected with dropBookmark.
1780 // dropRange will be overwritten and set to the dropBookmark later.
1781 dropNode.insertBefore( startNode );
1782 }
1783
1784 // No we can safely delete content for the drag range...
1785 dragRange = editor.createRange();
1786 dragRange.moveToBookmark( dragBookmark );
1787 editable.extractHtmlFromRange( dragRange, 1 );
1788
1789 // ...and paste content into the drop position.
1790 dropRange = editor.createRange();
1791 dropRange.moveToBookmark( dropBookmark );
1792
1793 // We do not select drop range, because of may be in the place we can not set the selection
1794 // (e.g. between blocks, in case of block widget D&D). We put range to the paste event instead.
1795 firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop', range: dropRange }, 1 );
1796
1797 editor.fire( 'unlockSnapshot' );
1798 },
1799
1800 /**
1801 * Gets the range from the `drop` event.
1802 *
1803 * @since 4.5
1804 * @param {Object} domEvent A native DOM drop event object.
1805 * @param {CKEDITOR.editor} editor The source editor instance.
1806 * @returns {CKEDITOR.dom.range} range at drop position.
1807 */
1808 getRangeAtDropPosition: function( dropEvt, editor ) {
1809 var $evt = dropEvt.data.$,
1810 x = $evt.clientX,
1811 y = $evt.clientY,
1812 $range,
1813 defaultRange = editor.getSelection( true ).getRanges()[ 0 ],
1814 range = editor.createRange();
1815
1816 // Make testing possible.
1817 if ( dropEvt.data.testRange )
1818 return dropEvt.data.testRange;
1819
1820 // Webkits.
1821 if ( document.caretRangeFromPoint ) {
1822 $range = editor.document.$.caretRangeFromPoint( x, y );
1823 range.setStart( CKEDITOR.dom.node( $range.startContainer ), $range.startOffset );
1824 range.collapse( true );
1825 }
1826 // FF.
1827 else if ( $evt.rangeParent ) {
1828 range.setStart( CKEDITOR.dom.node( $evt.rangeParent ), $evt.rangeOffset );
1829 range.collapse( true );
1830 }
1831 // IEs 9+.
1832 // We check if editable is focused to make sure that it's an internal DnD. External DnD must use the second
1833 // mechanism because of http://dev.ckeditor.com/ticket/13472#comment:6.
1834 else if ( CKEDITOR.env.ie && CKEDITOR.env.version > 8 && defaultRange && editor.editable().hasFocus ) {
1835 // On IE 9+ range by default is where we expected it.
1836 // defaultRange may be undefined if dragover was canceled (file drop).
1837 return defaultRange;
1838 }
1839 // IE 8 and all IEs if !defaultRange or external DnD.
1840 else if ( document.body.createTextRange ) {
1841 // To use this method we need a focus (which may be somewhere else in case of external drop).
1842 editor.focus();
1843
1844 $range = editor.document.getBody().$.createTextRange();
1845 try {
1846 var sucess = false;
1847
1848 // If user drop between text line IEs moveToPoint throws exception:
1849 //
1850 // Lorem ipsum pulvinar purus et euismod
1851 //
1852 // dolor sit amet,| consectetur adipiscing
1853 // *
1854 // vestibulum tincidunt augue eget tempus.
1855 //
1856 // * - drop position
1857 // | - expected cursor position
1858 //
1859 // So we try to call moveToPoint with +-1px up to +-20px above or
1860 // below original drop position to find nearest good drop position.
1861 for ( var i = 0; i < 20 && !sucess; i++ ) {
1862 if ( !sucess ) {
1863 try {
1864 $range.moveToPoint( x, y - i );
1865 sucess = true;
1866 } catch ( err ) {
1867 }
1868 }
1869 if ( !sucess ) {
1870 try {
1871 $range.moveToPoint( x, y + i );
1872 sucess = true;
1873 } catch ( err ) {
1874 }
1875 }
1876 }
1877
1878 if ( sucess ) {
1879 var id = 'cke-temp-' + ( new Date() ).getTime();
1880 $range.pasteHTML( '<span id="' + id + '">\u200b</span>' );
1881
1882 var span = editor.document.getById( id );
1883 range.moveToPosition( span, CKEDITOR.POSITION_BEFORE_START );
1884 span.remove();
1885 } else {
1886 // If the fist method does not succeed we might be next to
1887 // the short element (like header):
1888 //
1889 // Lorem ipsum pulvinar purus et euismod.
1890 //
1891 //
1892 // SOME HEADER| *
1893 //
1894 //
1895 // vestibulum tincidunt augue eget tempus.
1896 //
1897 // * - drop position
1898 // | - expected cursor position
1899 //
1900 // In such situation elementFromPoint returns proper element. Using getClientRect
1901 // it is possible to check if the cursor should be at the beginning or at the end
1902 // of paragraph.
1903 var $element = editor.document.$.elementFromPoint( x, y ),
1904 element = new CKEDITOR.dom.element( $element ),
1905 rect;
1906
1907 if ( !element.equals( editor.editable() ) && element.getName() != 'html' ) {
1908 rect = element.getClientRect();
1909
1910 if ( x < rect.left ) {
1911 range.setStartAt( element, CKEDITOR.POSITION_AFTER_START );
1912 range.collapse( true );
1913 } else {
1914 range.setStartAt( element, CKEDITOR.POSITION_BEFORE_END );
1915 range.collapse( true );
1916 }
1917 }
1918 // If drop happens on no element elementFromPoint returns html or body.
1919 //
1920 // * |Lorem ipsum pulvinar purus et euismod.
1921 //
1922 // vestibulum tincidunt augue eget tempus.
1923 //
1924 // * - drop position
1925 // | - expected cursor position
1926 //
1927 // In such case we can try to use default selection. If startContainer is not
1928 // 'editable' element it is probably proper selection.
1929 else if ( defaultRange && defaultRange.startContainer &&
1930 !defaultRange.startContainer.equals( editor.editable() ) ) {
1931 return defaultRange;
1932
1933 // Otherwise we can not find any drop position and we have to return null
1934 // and cancel drop event.
1935 } else {
1936 return null;
1937 }
1938
1939 }
1940 } catch ( err ) {
1941 return null;
1942 }
1943 } else {
1944 return null;
1945 }
1946
1947 return range;
1948 },
1949
1950 /**
1951 * This function tries to link the `evt.data.dataTransfer` property of the {@link CKEDITOR.editor#dragstart},
1952 * {@link CKEDITOR.editor#dragend} and {@link CKEDITOR.editor#drop} events to a single
1953 * {@link CKEDITOR.plugins.clipboard.dataTransfer} object.
1954 *
1955 * This method is automatically used by the core of the drag and drop functionality and
1956 * usually does not have to be called manually when using the drag and drop events.
1957 *
1958 * This method behaves differently depending on whether the drag and drop events were fired
1959 * artificially (to represent a non-native drag and drop) or whether they were caused by the native drag and drop.
1960 *
1961 * If the native event is not available, then it will create a new {@link CKEDITOR.plugins.clipboard.dataTransfer}
1962 * instance (if it does not exist already) and will link it to this and all following event objects until
1963 * the {@link #resetDragDataTransfer} method is called. It means that all three drag and drop events must be fired
1964 * in order to ensure that the data transfer is bound correctly.
1965 *
1966 * If the native event is available, then the {@link CKEDITOR.plugins.clipboard.dataTransfer} is identified
1967 * by its ID and a new instance is assigned to the `evt.data.dataTransfer` only if the ID changed or
1968 * the {@link #resetDragDataTransfer} method was called.
1969 *
1970 * @since 4.5
1971 * @param {CKEDITOR.dom.event} [evt] A drop event object.
1972 * @param {CKEDITOR.editor} [sourceEditor] The source editor instance.
1973 */
1974 initDragDataTransfer: function( evt, sourceEditor ) {
1975 // Create a new dataTransfer object based on the drop event.
1976 // If this event was used on dragstart to create dataTransfer
1977 // both dataTransfer objects will have the same id.
1978 var nativeDataTransfer = evt.data.$ ? evt.data.$.dataTransfer : null,
1979 dataTransfer = new this.dataTransfer( nativeDataTransfer, sourceEditor );
1980
1981 if ( !nativeDataTransfer ) {
1982 // No native event.
1983 if ( this.dragData ) {
1984 dataTransfer = this.dragData;
1985 } else {
1986 this.dragData = dataTransfer;
1987 }
1988 } else {
1989 // Native event. If there is the same id we will replace dataTransfer with the one
1990 // created on drag, because it contains drag editor, drag content and so on.
1991 // Otherwise (in case of drag from external source) we save new object to
1992 // the global clipboard.dragData.
1993 if ( this.dragData && dataTransfer.id == this.dragData.id ) {
1994 dataTransfer = this.dragData;
1995 } else {
1996 this.dragData = dataTransfer;
1997 }
1998 }
1999
2000 evt.data.dataTransfer = dataTransfer;
2001 },
2002
2003 /**
2004 * Removes the global {@link #dragData} so the next call to {@link #initDragDataTransfer}
2005 * always creates a new instance of {@link CKEDITOR.plugins.clipboard.dataTransfer}.
2006 *
2007 * @since 4.5
2008 */
2009 resetDragDataTransfer: function() {
2010 this.dragData = null;
2011 },
2012
2013 /**
2014 * Global object storing the data transfer of the current drag and drop operation.
2015 * Do not use it directly, use {@link #initDragDataTransfer} and {@link #resetDragDataTransfer}.
2016 *
2017 * Note: This object is global (meaning that it is not related to a single editor instance)
2018 * in order to handle drag and drop from one editor into another.
2019 *
2020 * @since 4.5
2021 * @private
2022 * @property {CKEDITOR.plugins.clipboard.dataTransfer} dragData
2023 */
2024
2025 /**
2026 * Range object to save the drag range and remove its content after the drop.
2027 *
2028 * @since 4.5
2029 * @private
2030 * @property {CKEDITOR.dom.range} dragRange
2031 */
2032
2033 /**
2034 * Initializes and links data transfer objects based on the paste event. If the data
2035 * transfer object was already initialized on this event, the function will
2036 * return that object. In IE it is not possible to link copy/cut and paste events
2037 * so the method always returns a new object. The same happens if there is no paste event
2038 * passed to the method.
2039 *
2040 * @since 4.5
2041 * @param {CKEDITOR.dom.event} [evt] A paste event object.
2042 * @param {CKEDITOR.editor} [sourceEditor] The source editor instance.
2043 * @returns {CKEDITOR.plugins.clipboard.dataTransfer} The data transfer object.
2044 */
2045 initPasteDataTransfer: function( evt, sourceEditor ) {
2046 if ( !this.isCustomCopyCutSupported ) {
2047 return new this.dataTransfer( null, sourceEditor );
2048 } else if ( evt && evt.data && evt.data.$ ) {
2049 var dataTransfer = new this.dataTransfer( evt.data.$.clipboardData, sourceEditor );
2050
2051 if ( this.copyCutData && dataTransfer.id == this.copyCutData.id ) {
2052 dataTransfer = this.copyCutData;
2053 dataTransfer.$ = evt.data.$.clipboardData;
2054 } else {
2055 this.copyCutData = dataTransfer;
2056 }
2057
2058 return dataTransfer;
2059 } else {
2060 return new this.dataTransfer( null, sourceEditor );
2061 }
2062 },
2063
2064 /**
2065 * Prevents dropping on the specified element.
2066 *
2067 * @since 4.5
2068 * @param {CKEDITOR.dom.element} element The element on which dropping should be disabled.
2069 */
2070 preventDefaultDropOnElement: function( element ) {
2071 element && element.on( 'dragover', preventDefaultSetDropEffectToNone );
2072 }
2073 };
2074
2075 // Data type used to link drag and drop events.
2076 //
2077 // In IE URL data type is buggie and there is no way to mark drag & drop without
2078 // modifying text data (which would be displayed if user drop content to the textarea)
2079 // so we just read dragged text.
2080 //
2081 // In Chrome and Firefox we can use custom data types.
2082 var clipboardIdDataType = CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ? 'cke/id' : 'Text';
2083 /**
2084 * Facade for the native `dataTransfer`/`clipboadData` object to hide all differences
2085 * between browsers.
2086 *
2087 * @since 4.5
2088 * @class CKEDITOR.plugins.clipboard.dataTransfer
2089 * @constructor Creates a class instance.
2090 * @param {Object} [nativeDataTransfer] A native data transfer object.
2091 * @param {CKEDITOR.editor} [editor] The source editor instance. If the editor is defined, dataValue will
2092 * be created based on the editor content and the type will be 'html'.
2093 */
2094 CKEDITOR.plugins.clipboard.dataTransfer = function( nativeDataTransfer, editor ) {
2095 if ( nativeDataTransfer ) {
2096 this.$ = nativeDataTransfer;
2097 }
2098
2099 this._ = {
2100 metaRegExp: /^<meta.*?>/i,
2101 bodyRegExp: /<body(?:[\s\S]*?)>([\s\S]*)<\/body>/i,
2102 fragmentRegExp: /<!--(?:Start|End)Fragment-->/g,
2103
2104 data: {},
2105 files: [],
2106
2107 normalizeType: function( type ) {
2108 type = type.toLowerCase();
2109
2110 if ( type == 'text' || type == 'text/plain' ) {
2111 return 'Text'; // IE support only Text and URL;
2112 } else if ( type == 'url' ) {
2113 return 'URL'; // IE support only Text and URL;
2114 } else {
2115 return type;
2116 }
2117 }
2118 };
2119
2120 // Check if ID is already created.
2121 this.id = this.getData( clipboardIdDataType );
2122
2123 // If there is no ID we need to create it. Different browsers needs different ID.
2124 if ( !this.id ) {
2125 if ( clipboardIdDataType == 'Text' ) {
2126 // For IE10+ only Text data type is supported and we have to compare dragged
2127 // and dropped text. If the ID is not set it means that empty string was dragged
2128 // (ex. image with no alt). We change null to empty string.
2129 this.id = '';
2130 } else {
2131 // String for custom data type.
2132 this.id = 'cke-' + CKEDITOR.tools.getUniqueId();
2133 }
2134 }
2135
2136 // In IE10+ we can not use any data type besides text, so we do not call setData.
2137 if ( clipboardIdDataType != 'Text' ) {
2138 // Try to set ID so it will be passed from the drag to the drop event.
2139 // On some browsers with some event it is not possible to setData so we
2140 // need to catch exceptions.
2141 try {
2142 this.$.setData( clipboardIdDataType, this.id );
2143 } catch ( err ) {}
2144 }
2145
2146 if ( editor ) {
2147 this.sourceEditor = editor;
2148
2149 this.setData( 'text/html', editor.getSelectedHtml( 1 ) );
2150
2151 // Without setData( 'text', ... ) on dragstart there is no drop event in Safari.
2152 // Also 'text' data is empty as drop to the textarea does not work if we do not put there text.
2153 if ( clipboardIdDataType != 'Text' && !this.getData( 'text/plain' ) ) {
2154 this.setData( 'text/plain', editor.getSelection().getSelectedText() );
2155 }
2156 }
2157
2158 /**
2159 * Data transfer ID used to bind all dataTransfer
2160 * objects based on the same event (e.g. in drag and drop events).
2161 *
2162 * @readonly
2163 * @property {String} id
2164 */
2165
2166 /**
2167 * A native DOM event object.
2168 *
2169 * @readonly
2170 * @property {Object} $
2171 */
2172
2173 /**
2174 * Source editor &mdash; the editor where the drag starts.
2175 * Might be undefined if the drag starts outside the editor (e.g. when dropping files to the editor).
2176 *
2177 * @readonly
2178 * @property {CKEDITOR.editor} sourceEditor
2179 */
2180
2181 /**
2182 * Private properties and methods.
2183 *
2184 * @private
2185 * @property {Object} _
2186 */
2187 };
2188
2189 /**
2190 * Data transfer operation (drag and drop or copy and paste) started and ended in the same
2191 * editor instance.
2192 *
2193 * @since 4.5
2194 * @readonly
2195 * @property {Number} [=1]
2196 * @member CKEDITOR
2197 */
2198 CKEDITOR.DATA_TRANSFER_INTERNAL = 1;
2199
2200 /**
2201 * Data transfer operation (drag and drop or copy and paste) started in one editor
2202 * instance and ended in another.
2203 *
2204 * @since 4.5
2205 * @readonly
2206 * @property {Number} [=2]
2207 * @member CKEDITOR
2208 */
2209 CKEDITOR.DATA_TRANSFER_CROSS_EDITORS = 2;
2210
2211 /**
2212 * Data transfer operation (drag and drop or copy and paste) started outside of the editor.
2213 * The source of the data may be a textarea, HTML, another application, etc.
2214 *
2215 * @since 4.5
2216 * @readonly
2217 * @property {Number} [=3]
2218 * @member CKEDITOR
2219 */
2220 CKEDITOR.DATA_TRANSFER_EXTERNAL = 3;
2221
2222 CKEDITOR.plugins.clipboard.dataTransfer.prototype = {
2223 /**
2224 * Facade for the native `getData` method.
2225 *
2226 * @param {String} type The type of data to retrieve.
2227 * @returns {String} type Stored data for the given type or an empty string if the data for that type does not exist.
2228 */
2229 getData: function( type ) {
2230 function isEmpty( data ) {
2231 return data === undefined || data === null || data === '';
2232 }
2233
2234 type = this._.normalizeType( type );
2235
2236 var data = this._.data[ type ],
2237 result;
2238
2239 if ( isEmpty( data ) ) {
2240 try {
2241 data = this.$.getData( type );
2242 } catch ( e ) {}
2243 }
2244
2245 if ( isEmpty( data ) ) {
2246 data = '';
2247 }
2248
2249 // Some browsers add <meta http-equiv="content-type" content="text/html; charset=utf-8"> at the begging of the HTML data
2250 // or surround it with <html><head>...</head><body>(some content)<!--StartFragment--> and <!--EndFragment-->(some content)</body></html>
2251 // This code removes meta tags and returns only the contents of the <body> element if found. Note that
2252 // some significant content may be placed outside Start/EndFragment comments so it's kept.
2253 //
2254 // See #13583 for more details.
2255 if ( type == 'text/html' ) {
2256 data = data.replace( this._.metaRegExp, '' );
2257
2258 // Keep only contents of the <body> element
2259 result = this._.bodyRegExp.exec( data );
2260 if ( result && result.length ) {
2261 data = result[ 1 ];
2262
2263 // Remove also comments.
2264 data = data.replace( this._.fragmentRegExp, '' );
2265 }
2266 }
2267 // Firefox on Linux put files paths as a text/plain data if there are files
2268 // in the dataTransfer object. We need to hide it, because files should be
2269 // handled on paste only if dataValue is empty.
2270 else if ( type == 'Text' && CKEDITOR.env.gecko && this.getFilesCount() &&
2271 data.substring( 0, 7 ) == 'file://' ) {
2272 data = '';
2273 }
2274
2275 return data;
2276 },
2277
2278 /**
2279 * Facade for the native `setData` method.
2280 *
2281 * @param {String} type The type of data to retrieve.
2282 * @param {String} value The data to add.
2283 */
2284 setData: function( type, value ) {
2285 type = this._.normalizeType( type );
2286
2287 this._.data[ type ] = value;
2288
2289 // There is "Unexpected call to method or property access." error if you try
2290 // to set data of unsupported type on IE.
2291 if ( !CKEDITOR.plugins.clipboard.isCustomDataTypesSupported && type != 'URL' && type != 'Text' ) {
2292 return;
2293 }
2294
2295 // If we use the text type to bind the ID, then if someone tries to set the text, we must also
2296 // update ID accordingly. #13468.
2297 if ( clipboardIdDataType == 'Text' && type == 'Text' ) {
2298 this.id = value;
2299 }
2300
2301 try {
2302 this.$.setData( type, value );
2303 } catch ( e ) {}
2304 },
2305
2306 /**
2307 * Gets the data transfer type.
2308 *
2309 * @param {CKEDITOR.editor} targetEditor The drop/paste target editor instance.
2310 * @returns {Number} Possible values: {@link CKEDITOR#DATA_TRANSFER_INTERNAL},
2311 * {@link CKEDITOR#DATA_TRANSFER_CROSS_EDITORS}, {@link CKEDITOR#DATA_TRANSFER_EXTERNAL}.
2312 */
2313 getTransferType: function( targetEditor ) {
2314 if ( !this.sourceEditor ) {
2315 return CKEDITOR.DATA_TRANSFER_EXTERNAL;
2316 } else if ( this.sourceEditor == targetEditor ) {
2317 return CKEDITOR.DATA_TRANSFER_INTERNAL;
2318 } else {
2319 return CKEDITOR.DATA_TRANSFER_CROSS_EDITORS;
2320 }
2321 },
2322
2323 /**
2324 * Copies the data from the native data transfer to a private cache.
2325 * This function is needed because the data from the native data transfer
2326 * is available only synchronously to the event listener. It is not possible
2327 * to get the data asynchronously, after a timeout, and the {@link CKEDITOR.editor#paste}
2328 * event is fired asynchronously &mdash; hence the need for caching the data.
2329 */
2330 cacheData: function() {
2331 if ( !this.$ ) {
2332 return;
2333 }
2334
2335 var that = this,
2336 i, file;
2337
2338 function getAndSetData( type ) {
2339 type = that._.normalizeType( type );
2340
2341 var data = that.getData( type );
2342 if ( data ) {
2343 that._.data[ type ] = data;
2344 }
2345 }
2346
2347 // Copy data.
2348 if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) {
2349 if ( this.$.types ) {
2350 for ( i = 0; i < this.$.types.length; i++ ) {
2351 getAndSetData( this.$.types[ i ] );
2352 }
2353 }
2354 } else {
2355 getAndSetData( 'Text' );
2356 getAndSetData( 'URL' );
2357 }
2358
2359 // Copy files references.
2360 file = this._getImageFromClipboard();
2361 if ( ( this.$ && this.$.files ) || file ) {
2362 this._.files = [];
2363
2364 for ( i = 0; i < this.$.files.length; i++ ) {
2365 this._.files.push( this.$.files[ i ] );
2366 }
2367
2368 // Don't include $.items if both $.files and $.items contains files, because,
2369 // according to spec and browsers behavior, they contain the same files.
2370 if ( this._.files.length === 0 && file ) {
2371 this._.files.push( file );
2372 }
2373 }
2374 },
2375
2376 /**
2377 * Gets the number of files in the dataTransfer object.
2378 *
2379 * @returns {Number} The number of files.
2380 */
2381 getFilesCount: function() {
2382 if ( this._.files.length ) {
2383 return this._.files.length;
2384 }
2385
2386 if ( this.$ && this.$.files && this.$.files.length ) {
2387 return this.$.files.length;
2388 }
2389
2390 return this._getImageFromClipboard() ? 1 : 0;
2391 },
2392
2393 /**
2394 * Gets the file at the index given.
2395 *
2396 * @param {Number} i Index.
2397 * @returns {File} File instance.
2398 */
2399 getFile: function( i ) {
2400 if ( this._.files.length ) {
2401 return this._.files[ i ];
2402 }
2403
2404 if ( this.$ && this.$.files && this.$.files.length ) {
2405 return this.$.files[ i ];
2406 }
2407
2408 // File or null if the file was not found.
2409 return i === 0 ? this._getImageFromClipboard() : undefined;
2410 },
2411
2412 /**
2413 * Checks if the data transfer contains any data.
2414 *
2415 * @returns {Boolean} `true` if the object contains no data.
2416 */
2417 isEmpty: function() {
2418 var typesToCheck = {},
2419 type;
2420
2421 // If dataTransfer contains files it is not empty.
2422 if ( this.getFilesCount() ) {
2423 return false;
2424 }
2425
2426 // Add custom types.
2427 for ( type in this._.data ) {
2428 typesToCheck[ type ] = 1;
2429 }
2430
2431 // Add native types.
2432 if ( this.$ ) {
2433 if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) {
2434 if ( this.$.types ) {
2435 for ( var i = 0; i < this.$.types.length; i++ ) {
2436 typesToCheck[ this.$.types[ i ] ] = 1;
2437 }
2438 }
2439 } else {
2440 typesToCheck.Text = 1;
2441 typesToCheck.URL = 1;
2442 }
2443 }
2444
2445 // Remove ID.
2446 if ( clipboardIdDataType != 'Text' ) {
2447 typesToCheck[ clipboardIdDataType ] = 0;
2448 }
2449
2450 for ( type in typesToCheck ) {
2451 if ( typesToCheck[ type ] && this.getData( type ) !== '' ) {
2452 return false;
2453 }
2454 }
2455
2456 return true;
2457 },
2458
2459 /**
2460 * When the content of the clipboard is pasted in Chrome, the clipboard data object has an empty `files` property,
2461 * but it is possible to get the file as `items[0].getAsFile();` (#12961).
2462 *
2463 * @private
2464 * @returns {File} File instance or `null` if not found.
2465 */
2466 _getImageFromClipboard: function() {
2467 var file;
2468
2469 if ( this.$ && this.$.items && this.$.items[ 0 ] ) {
2470 try {
2471 file = this.$.items[ 0 ].getAsFile();
2472 // Duck typing
2473 if ( file && file.type ) {
2474 return file;
2475 }
2476 } catch ( err ) {
2477 // noop
2478 }
2479 }
2480
2481 return undefined;
2482 }
2483 };
2484} )();
2485
2486/**
2487 * The default content type that is used when pasted data cannot be clearly recognized as HTML or text.
2488 *
2489 * For example: `'foo'` may come from a plain text editor or a website. It is not possible to recognize the content
2490 * type in this case, so the default type will be used. At the same time it is clear that `'<b>example</b> text'` is
2491 * HTML and its origin is a web page, email or another rich text editor.
2492 *
2493 * **Note:** If content type is text, then styles of the paste context are preserved.
2494 *
2495 * CKEDITOR.config.clipboard_defaultContentType = 'text';
2496 *
2497 * See also the {@link CKEDITOR.editor#paste} event and read more about the integration with clipboard
2498 * in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard).
2499 *
2500 * @since 4.0
2501 * @cfg {'html'/'text'} [clipboard_defaultContentType='html']
2502 * @member CKEDITOR.config
2503 */
2504
2505/**
2506 * Fired after the user initiated a paste action, but before the data is inserted into the editor.
2507 * The listeners to this event are able to process the content before its insertion into the document.
2508 *
2509 * Read more about the integration with clipboard in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard).
2510 *
2511 * See also:
2512 *
2513 * * the {@link CKEDITOR.config#pasteFilter} option,
2514 * * the {@link CKEDITOR.editor#drop} event,
2515 * * the {@link CKEDITOR.plugins.clipboard.dataTransfer} class.
2516 *
2517 * @since 3.1
2518 * @event paste
2519 * @member CKEDITOR.editor
2520 * @param {CKEDITOR.editor} editor This editor instance.
2521 * @param data
2522 * @param {String} data.type The type of data in `data.dataValue`. Usually `'html'` or `'text'`, but for listeners
2523 * with a priority smaller than `6` it may also be `'auto'` which means that the content type has not been recognised yet
2524 * (this will be done by the content type sniffer that listens with priority `6`).
2525 * @param {String} data.dataValue HTML to be pasted.
2526 * @param {String} data.method Indicates the data transfer method. It could be drag and drop or copy and paste.
2527 * Possible values: `'drop'`, `'paste'`. Introduced in CKEditor 4.5.
2528 * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer Facade for the native dataTransfer object
2529 * which provides access to various data types and files, and passes some data between linked events
2530 * (like drag and drop). Introduced in CKEditor 4.5.
2531 * @param {Boolean} [data.dontFilter=false] Whether the {@link CKEDITOR.editor#pasteFilter paste filter} should not
2532 * be applied to data. This option has no effect when `data.type` equals `'text'` which means that for instance
2533 * {@link CKEDITOR.config#forcePasteAsPlainText} has a higher priority. Introduced in CKEditor 4.5.
2534 */
2535
2536/**
2537 * Fired before the {@link #paste} event. Allows to preset data type.
2538 *
2539 * **Note:** This event is deprecated. Add a `0` priority listener for the
2540 * {@link #paste} event instead.
2541 *
2542 * @deprecated
2543 * @event beforePaste
2544 * @member CKEDITOR.editor
2545 */
2546
2547 /**
2548 * Fired after the {@link #paste} event if content was modified. Note that if the paste
2549 * event does not insert any data, the `afterPaste` event will not be fired.
2550 *
2551 * @event afterPaste
2552 * @member CKEDITOR.editor
2553 */
2554
2555/**
2556 * Internal event to open the Paste dialog window.
2557 *
2558 * @private
2559 * @event pasteDialog
2560 * @member CKEDITOR.editor
2561 * @param {CKEDITOR.editor} editor This editor instance.
2562 * @param {Function} [data] Callback that will be passed to {@link CKEDITOR.editor#openDialog}.
2563 */
2564
2565/**
2566 * Facade for the native `drop` event. Fired when the native `drop` event occurs.
2567 *
2568 * **Note:** To manipulate dropped data, use the {@link CKEDITOR.editor#paste} event.
2569 * Use the `drop` event only to control drag and drop operations (e.g. to prevent the ability to drop some content).
2570 *
2571 * Read more about integration with drag and drop in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard).
2572 *
2573 * See also:
2574 *
2575 * * The {@link CKEDITOR.editor#paste} event,
2576 * * The {@link CKEDITOR.editor#dragstart} and {@link CKEDITOR.editor#dragend} events,
2577 * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class.
2578 *
2579 * @since 4.5
2580 * @event drop
2581 * @member CKEDITOR.editor
2582 * @param {CKEDITOR.editor} editor This editor instance.
2583 * @param data
2584 * @param {Object} data.$ Native drop event.
2585 * @param {CKEDITOR.dom.node} data.target Drop target.
2586 * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade.
2587 * @param {CKEDITOR.dom.range} data.dragRange Drag range, lets you manipulate the drag range.
2588 * Note that dragged HTML is saved as `text/html` data on `dragstart` so if you change the drag range
2589 * on drop, dropped HTML will not change. You need to change it manually using
2590 * {@link CKEDITOR.plugins.clipboard.dataTransfer#setData dataTransfer.setData}.
2591 * @param {CKEDITOR.dom.range} data.dropRange Drop range, lets you manipulate the drop range.
2592 */
2593
2594/**
2595 * Facade for the native `dragstart` event. Fired when the native `dragstart` event occurs.
2596 *
2597 * 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
2598 * operation. For instance, the `widget` plugin uses this option to integrate its custom block widget drag and drop with
2599 * the entire system.
2600 *
2601 * Read more about integration with drag and drop in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard).
2602 *
2603 * See also:
2604 *
2605 * * The {@link CKEDITOR.editor#paste} event,
2606 * * The {@link CKEDITOR.editor#drop} and {@link CKEDITOR.editor#dragend} events,
2607 * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class.
2608 *
2609 * @since 4.5
2610 * @event dragstart
2611 * @member CKEDITOR.editor
2612 * @param {CKEDITOR.editor} editor This editor instance.
2613 * @param data
2614 * @param {Object} data.$ Native dragstart event.
2615 * @param {CKEDITOR.dom.node} data.target Drag target.
2616 * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade.
2617 */
2618
2619/**
2620 * Facade for the native `dragend` event. Fired when the native `dragend` event occurs.
2621 *
2622 * Read more about integration with drag and drop in the [Clipboard Deep Dive guide](#!/guide/dev_clipboard).
2623 *
2624 * See also:
2625 *
2626 * * The {@link CKEDITOR.editor#paste} event,
2627 * * The {@link CKEDITOR.editor#drop} and {@link CKEDITOR.editor#dragend} events,
2628 * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class.
2629 *
2630 * @since 4.5
2631 * @event dragend
2632 * @member CKEDITOR.editor
2633 * @param {CKEDITOR.editor} editor This editor instance.
2634 * @param data
2635 * @param {Object} data.$ Native dragend event.
2636 * @param {CKEDITOR.dom.node} data.target Drag target.
2637 * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade.
2638 */
2639
2640/**
2641 * Defines a filter which is applied to external data pasted or dropped into the editor. Possible values are:
2642 *
2643 * * `'plain-text'` &ndash; Content will be pasted as a plain text.
2644 * * `'semantic-content'` &ndash; Known tags (except `div`, `span`) with all attributes (except
2645 * `style` and `class`) will be kept.
2646 * * `'h1 h2 p div'` &ndash; Custom rules compatible with {@link CKEDITOR.filter}.
2647 * * `null` &ndash; Content will not be filtered by the paste filter (but it still may be filtered
2648 * by [Advanced Content Filter](#!/guide/dev_advanced_content_filter)). This value can be used to
2649 * disable the paste filter in Chrome and Safari, where this option defaults to `'semantic-content'`.
2650 *
2651 * Example:
2652 *
2653 * config.pasteFilter = 'plain-text';
2654 *
2655 * Custom setting:
2656 *
2657 * config.pasteFilter = 'h1 h2 p ul ol li; img[!src, alt]; a[!href]';
2658 *
2659 * Based on this configuration option, a proper {@link CKEDITOR.filter} instance will be defined and assigned to the editor
2660 * as a {@link CKEDITOR.editor#pasteFilter}. You can tweak the paste filter settings on the fly on this object
2661 * as well as delete or replace it.
2662 *
2663 * var editor = CKEDITOR.replace( 'editor', {
2664 * pasteFilter: 'semantic-content'
2665 * } );
2666 *
2667 * editor.on( 'instanceReady', function() {
2668 * // The result of this will be that all semantic content will be preserved
2669 * // except tables.
2670 * editor.pasteFilter.disallow( 'table' );
2671 * } );
2672 *
2673 * Note that the paste filter is applied only to **external** data. There are three data sources:
2674 *
2675 * * copied and pasted in the same editor (internal),
2676 * * copied from one editor and pasted into another (cross-editor),
2677 * * coming from all other sources like websites, MS Word, etc. (external).
2678 *
2679 * If {@link CKEDITOR.config#allowedContent Advanced Content Filter} is not disabled, then
2680 * it will also be applied to pasted and dropped data. The paste filter job is to "normalize"
2681 * external data which often needs to be handled differently than content produced by the editor.
2682 *
2683 * This setting defaults to `'semantic-content'` in Chrome, Opera and Safari (all Blink and Webkit based browsers)
2684 * due to messy HTML which these browsers keep in the clipboard. In other browsers it defaults to `null`.
2685 *
2686 * @since 4.5
2687 * @cfg {String} [pasteFilter='semantic-content' in Chrome and Safari and `null` in other browsers]
2688 * @member CKEDITOR.config
2689 */
2690
2691/**
2692 * {@link CKEDITOR.filter Content filter} which is used when external data is pasted or dropped into the editor
2693 * or a forced paste as plain text occurs.
2694 *
2695 * This object might be used on the fly to define rules for pasted external content.
2696 * This object is available and used if the {@link CKEDITOR.plugins.clipboard clipboard} plugin is enabled and
2697 * {@link CKEDITOR.config#pasteFilter} or {@link CKEDITOR.config#forcePasteAsPlainText} was defined.
2698 *
2699 * To enable the filter:
2700 *
2701 * var editor = CKEDITOR.replace( 'editor', {
2702 * pasteFilter: 'plain-text'
2703 * } );
2704 *
2705 * You can also modify the filter on the fly later on:
2706 *
2707 * editor.pasteFilter = new CKEDITOR.filter( 'p h1 h2; a[!href]' );
2708 *
2709 * Note that the paste filter is only applied to **external** data. There are three data sources:
2710 *
2711 * * copied and pasted in the same editor (internal),
2712 * * copied from one editor and pasted into another (cross-editor),
2713 * * coming from all other sources like websites, MS Word, etc. (external).
2714 *
2715 * If {@link CKEDITOR.config#allowedContent Advanced Content Filter} is not disabled, then
2716 * it will also be applied to pasted and dropped data. The paste filter job is to "normalize"
2717 * external data which often needs to be handled differently than content produced by the editor.
2718 *
2719 * @since 4.5
2720 * @readonly
2721 * @property {CKEDITOR.filter} [pasteFilter]
2722 * @member CKEDITOR.editor
2723 */
diff --git a/sources/plugins/colorbutton/icons/bgcolor.png b/sources/plugins/colorbutton/icons/bgcolor.png
new file mode 100644
index 00000000..a313938d
--- /dev/null
+++ b/sources/plugins/colorbutton/icons/bgcolor.png
Binary files differ
diff --git a/sources/plugins/colorbutton/icons/hidpi/bgcolor.png b/sources/plugins/colorbutton/icons/hidpi/bgcolor.png
new file mode 100644
index 00000000..54b3e18c
--- /dev/null
+++ b/sources/plugins/colorbutton/icons/hidpi/bgcolor.png
Binary files differ
diff --git a/sources/plugins/colorbutton/icons/hidpi/textcolor.png b/sources/plugins/colorbutton/icons/hidpi/textcolor.png
new file mode 100644
index 00000000..8fc56bcb
--- /dev/null
+++ b/sources/plugins/colorbutton/icons/hidpi/textcolor.png
Binary files differ
diff --git a/sources/plugins/colorbutton/icons/textcolor.png b/sources/plugins/colorbutton/icons/textcolor.png
new file mode 100644
index 00000000..0d8e4590
--- /dev/null
+++ b/sources/plugins/colorbutton/icons/textcolor.png
Binary files differ
diff --git a/sources/plugins/colorbutton/lang/af.js b/sources/plugins/colorbutton/lang/af.js
new file mode 100644
index 00000000..ed7a3378
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/af.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'af', {
6 auto: 'Outomaties',
7 bgColorTitle: 'Agtergrondkleur',
8 colors: {
9 '000': 'Swart',
10 '800000': 'Meroen',
11 '8B4513': 'Sjokoladebruin',
12 '2F4F4F': 'Donkerleisteengrys',
13 '008080': 'Blougroen',
14 '000080': 'Vlootblou',
15 '4B0082': 'Indigo',
16 '696969': 'Donkergrys',
17 B22222: 'Rooibaksteen',
18 A52A2A: 'Bruin',
19 DAA520: 'Donkergeel',
20 '006400': 'Donkergroen',
21 '40E0D0': 'Turkoois',
22 '0000CD': 'Middelblou',
23 '800080': 'Pers',
24 '808080': 'Grys',
25 F00: 'Rooi',
26 FF8C00: 'Donkeroranje',
27 FFD700: 'Goud',
28 '008000': 'Groen',
29 '0FF': 'Siaan',
30 '00F': 'Blou',
31 EE82EE: 'Viooltjieblou',
32 A9A9A9: 'Donkergrys',
33 FFA07A: 'Ligsalm',
34 FFA500: 'Oranje',
35 FFFF00: 'Geel',
36 '00FF00': 'Lemmetjie',
37 AFEEEE: 'Ligturkoois',
38 ADD8E6: 'Ligblou',
39 DDA0DD: 'Pruim',
40 D3D3D3: 'Liggrys',
41 FFF0F5: 'Linne',
42 FAEBD7: 'Ivoor',
43 FFFFE0: 'Liggeel',
44 F0FFF0: 'Heuningdou',
45 F0FFFF: 'Asuur',
46 F0F8FF: 'Ligte hemelsblou',
47 E6E6FA: 'Laventel',
48 FFF: 'Wit'
49 },
50 more: 'Meer Kleure...',
51 panelTitle: 'Kleure',
52 textColorTitle: 'Tekskleur'
53} );
diff --git a/sources/plugins/colorbutton/lang/ar.js b/sources/plugins/colorbutton/lang/ar.js
new file mode 100644
index 00000000..5203c4a4
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ar.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ar', {
6 auto: 'تلقائي',
7 bgColorTitle: 'لون الخلفية',
8 colors: {
9 '000': 'أسود',
10 '800000': 'كستنائي',
11 '8B4513': 'بني فاتح',
12 '2F4F4F': 'رمادي أردوازي غامق',
13 '008080': 'أزرق مخضر',
14 '000080': 'أزرق داكن',
15 '4B0082': 'كحلي',
16 '696969': 'رمادي داكن',
17 B22222: 'طوبي',
18 A52A2A: 'بني',
19 DAA520: 'ذهبي داكن',
20 '006400': 'أخضر داكن',
21 '40E0D0': 'فيروزي',
22 '0000CD': 'أزرق متوسط',
23 '800080': 'بنفسجي غامق',
24 '808080': 'رمادي',
25 F00: 'أحمر',
26 FF8C00: 'برتقالي داكن',
27 FFD700: 'ذهبي',
28 '008000': 'أخضر',
29 '0FF': 'تركواز',
30 '00F': 'أزرق',
31 EE82EE: 'بنفسجي',
32 A9A9A9: 'رمادي شاحب',
33 FFA07A: 'برتقالي وردي',
34 FFA500: 'برتقالي',
35 FFFF00: 'أصفر',
36 '00FF00': 'ليموني',
37 AFEEEE: 'فيروزي شاحب',
38 ADD8E6: 'أزرق فاتح',
39 DDA0DD: 'بنفسجي فاتح',
40 D3D3D3: 'رمادي فاتح',
41 FFF0F5: 'وردي فاتح',
42 FAEBD7: 'أبيض عتيق',
43 FFFFE0: 'أصفر فاتح',
44 F0FFF0: 'أبيض مائل للأخضر',
45 F0FFFF: 'سماوي',
46 F0F8FF: 'لبني',
47 E6E6FA: 'أرجواني',
48 FFF: 'أبيض'
49 },
50 more: 'ألوان إضافية...',
51 panelTitle: 'Colors',
52 textColorTitle: 'لون النص'
53} );
diff --git a/sources/plugins/colorbutton/lang/bg.js b/sources/plugins/colorbutton/lang/bg.js
new file mode 100644
index 00000000..9d0cec28
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/bg.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'bg', {
6 auto: 'Автоматично',
7 bgColorTitle: 'Фонов цвят',
8 colors: {
9 '000': 'Черно',
10 '800000': 'Кестеняво',
11 '8B4513': 'Светлокафяво',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Индиго',
16 '696969': 'Тъмно сиво',
17 B22222: 'Огнено червено',
18 A52A2A: 'Кафяво',
19 DAA520: 'Златисто',
20 '006400': 'Тъмно зелено',
21 '40E0D0': 'Тюркуазено',
22 '0000CD': 'Средно синьо',
23 '800080': 'Пурпурно',
24 '808080': 'Сиво',
25 F00: 'Червено',
26 FF8C00: 'Тъмно оранжево',
27 FFD700: 'Златно',
28 '008000': 'Зелено',
29 '0FF': 'Светло синьо',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Още цветове',
51 panelTitle: 'Цветове',
52 textColorTitle: 'Цвят на шрифт'
53} );
diff --git a/sources/plugins/colorbutton/lang/bn.js b/sources/plugins/colorbutton/lang/bn.js
new file mode 100644
index 00000000..66b4499f
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/bn.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'bn', {
6 auto: 'অটোমেটিক',
7 bgColorTitle: 'বেকগ্রাউন্ড রং',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'আরও রং...',
51 panelTitle: 'Colors',
52 textColorTitle: 'টেক্স্ট রং'
53} );
diff --git a/sources/plugins/colorbutton/lang/bs.js b/sources/plugins/colorbutton/lang/bs.js
new file mode 100644
index 00000000..de913f42
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/bs.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'bs', {
6 auto: 'Automatska',
7 bgColorTitle: 'Boja pozadine',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Više boja...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Boja teksta'
53} );
diff --git a/sources/plugins/colorbutton/lang/ca.js b/sources/plugins/colorbutton/lang/ca.js
new file mode 100644
index 00000000..84ad219f
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ca.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ca', {
6 auto: 'Automàtic',
7 bgColorTitle: 'Color de Fons',
8 colors: {
9 '000': 'Negre',
10 '800000': 'Grana',
11 '8B4513': 'Marró sella',
12 '2F4F4F': 'Gris pissarra fosca',
13 '008080': 'Blau xarxet',
14 '000080': 'Blau marí',
15 '4B0082': 'Indi',
16 '696969': 'Gris Fosc',
17 B22222: 'Foc Maó',
18 A52A2A: 'Marró',
19 DAA520: 'Solidago',
20 '006400': 'Verd Fosc',
21 '40E0D0': 'Turquesa',
22 '0000CD': 'Blau 1/2',
23 '800080': 'Lila',
24 '808080': 'Gris',
25 F00: 'Vermell',
26 FF8C00: 'Taronja Fosc',
27 FFD700: 'Or',
28 '008000': 'Verd',
29 '0FF': 'Cian',
30 '00F': 'Blau',
31 EE82EE: 'Violat',
32 A9A9A9: 'Gris clar',
33 FFA07A: 'Salmó clar',
34 FFA500: 'Taronja',
35 FFFF00: 'Groc',
36 '00FF00': 'Verd Llima',
37 AFEEEE: 'Turquesa Pàl·lid',
38 ADD8E6: 'Blau Clar',
39 DDA0DD: 'Pruna',
40 D3D3D3: 'Gris Clar',
41 FFF0F5: 'Lavanda rosat',
42 FAEBD7: 'Blanc Antic',
43 FFFFE0: 'Groc Clar',
44 F0FFF0: 'Verd Pàl·lid',
45 F0FFFF: 'Atzur',
46 F0F8FF: 'Cian pàlid',
47 E6E6FA: 'Lavanda',
48 FFF: 'Blanc'
49 },
50 more: 'Més Colors...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Color del Text'
53} );
diff --git a/sources/plugins/colorbutton/lang/cs.js b/sources/plugins/colorbutton/lang/cs.js
new file mode 100644
index 00000000..e266e02c
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/cs.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'cs', {
6 auto: 'Automaticky',
7 bgColorTitle: 'Barva pozadí',
8 colors: {
9 '000': 'Černá',
10 '800000': 'Kaštanová',
11 '8B4513': 'Sedlová hněď',
12 '2F4F4F': 'Tmavě bledě šedá',
13 '008080': 'Čírka',
14 '000080': 'Námořnická modř',
15 '4B0082': 'Inkoustová',
16 '696969': 'Tmavě šedá',
17 B22222: 'Pálená cihla',
18 A52A2A: 'Hnědá',
19 DAA520: 'Zlatý prut',
20 '006400': 'Tmavě zelená',
21 '40E0D0': 'Tyrkisová',
22 '0000CD': 'Středně modrá',
23 '800080': 'Purpurová',
24 '808080': 'Šedá',
25 F00: 'Červená',
26 FF8C00: 'Tmavě oranžová',
27 FFD700: 'Zlatá',
28 '008000': 'Zelená',
29 '0FF': 'Azurová',
30 '00F': 'Modrá',
31 EE82EE: 'Fialová',
32 A9A9A9: 'Kalně šedá',
33 FFA07A: 'Světle lososová',
34 FFA500: 'Oranžová',
35 FFFF00: 'Žlutá',
36 '00FF00': 'Limetková',
37 AFEEEE: 'Bledě tyrkisová',
38 ADD8E6: 'Světle modrá',
39 DDA0DD: 'Švestková',
40 D3D3D3: 'Světle šedá',
41 FFF0F5: 'Levandulově ruměnná',
42 FAEBD7: 'Antická bílá',
43 FFFFE0: 'Světle žlutá',
44 F0FFF0: 'Medová rosa',
45 F0FFFF: 'Azurová',
46 F0F8FF: 'Alenčina modrá',
47 E6E6FA: 'Levandulová',
48 FFF: 'Bílá'
49 },
50 more: 'Více barev...',
51 panelTitle: 'Barvy',
52 textColorTitle: 'Barva textu'
53} );
diff --git a/sources/plugins/colorbutton/lang/cy.js b/sources/plugins/colorbutton/lang/cy.js
new file mode 100644
index 00000000..6a02fc71
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/cy.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'cy', {
6 auto: 'Awtomatig',
7 bgColorTitle: 'Lliw Cefndir',
8 colors: {
9 '000': 'Du',
10 '800000': 'Marwn',
11 '8B4513': 'Brown Cyfrwy',
12 '2F4F4F': 'Llechen Tywyll',
13 '008080': 'Corhwyad',
14 '000080': 'Nefi',
15 '4B0082': 'Indigo',
16 '696969': 'Llwyd Tywyll',
17 B22222: 'Bric Tân',
18 A52A2A: 'Brown',
19 DAA520: 'Rhoden Aur',
20 '006400': 'Gwyrdd Tywyll',
21 '40E0D0': 'Gwyrddlas',
22 '0000CD': 'Glas Canolig',
23 '800080': 'Porffor',
24 '808080': 'Llwyd',
25 F00: 'Coch',
26 FF8C00: 'Oren Tywyll',
27 FFD700: 'Aur',
28 '008000': 'Gwyrdd',
29 '0FF': 'Cyan',
30 '00F': 'Glas',
31 EE82EE: 'Fioled',
32 A9A9A9: 'Llwyd Pwl',
33 FFA07A: 'Samwn Golau',
34 FFA500: 'Oren',
35 FFFF00: 'Melyn',
36 '00FF00': 'Leim',
37 AFEEEE: 'Gwyrddlas Golau',
38 ADD8E6: 'Glas Golau',
39 DDA0DD: 'Eirinen',
40 D3D3D3: 'Llwyd Golau',
41 FFF0F5: 'Gwrid Lafant',
42 FAEBD7: 'Gwyn Hynafol',
43 FFFFE0: 'Melyn Golau',
44 F0FFF0: 'Melwn Gwyrdd Golau',
45 F0FFFF: 'Aswr',
46 F0F8FF: 'Glas Alys',
47 E6E6FA: 'Lafant',
48 FFF: 'Gwyn'
49 },
50 more: 'Mwy o Liwiau...',
51 panelTitle: 'Lliwiau',
52 textColorTitle: 'Lliw Testun'
53} );
diff --git a/sources/plugins/colorbutton/lang/da.js b/sources/plugins/colorbutton/lang/da.js
new file mode 100644
index 00000000..01ed2c14
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/da.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'da', {
6 auto: 'Automatisk',
7 bgColorTitle: 'Baggrundsfarve',
8 colors: {
9 '000': 'Sort',
10 '800000': 'Mørkerød',
11 '8B4513': 'Mørk orange',
12 '2F4F4F': 'Dark Slate Grå',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Mørkegrå',
17 B22222: 'Scarlet / Rød',
18 A52A2A: 'Brun',
19 DAA520: 'Guld',
20 '006400': 'Mørkegrøn',
21 '40E0D0': 'Tyrkis',
22 '0000CD': 'Mellemblå',
23 '800080': 'Lilla',
24 '808080': 'Grå',
25 F00: 'Rød',
26 FF8C00: 'Mørk orange',
27 FFD700: 'Guld',
28 '008000': 'Grøn',
29 '0FF': 'Cyan',
30 '00F': 'Blå',
31 EE82EE: 'Violet',
32 A9A9A9: 'Matgrå',
33 FFA07A: 'Laksefarve',
34 FFA500: 'Orange',
35 FFFF00: 'Gul',
36 '00FF00': 'Lime',
37 AFEEEE: 'Mat tyrkis',
38 ADD8E6: 'Lyseblå',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Lysegrå',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antikhvid',
43 FFFFE0: 'Lysegul',
44 F0FFF0: 'Gul / Beige',
45 F0FFFF: 'Himmeblå',
46 F0F8FF: 'Alice blue',
47 E6E6FA: 'Lavendel',
48 FFF: 'Hvid'
49 },
50 more: 'Flere farver...',
51 panelTitle: 'Farver',
52 textColorTitle: 'Tekstfarve'
53} );
diff --git a/sources/plugins/colorbutton/lang/de.js b/sources/plugins/colorbutton/lang/de.js
new file mode 100644
index 00000000..7007f578
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/de.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'de', {
6 auto: 'Automatisch',
7 bgColorTitle: 'Hintergrundfarbe',
8 colors: {
9 '000': 'Schwarz',
10 '800000': 'Kastanienbraun',
11 '8B4513': 'Braun',
12 '2F4F4F': 'Dunkles Schiefergrau',
13 '008080': 'Blaugrün',
14 '000080': 'Marineblau',
15 '4B0082': 'Indigo',
16 '696969': 'Dunkelgrau',
17 B22222: 'Ziegelrot',
18 A52A2A: 'Braun',
19 DAA520: 'Goldgelb',
20 '006400': 'Dunkelgrün',
21 '40E0D0': 'Türkis',
22 '0000CD': 'Mittelblau',
23 '800080': 'Lila',
24 '808080': 'Grau',
25 F00: 'Rot',
26 FF8C00: 'Dunkelorange',
27 FFD700: 'Gold',
28 '008000': 'Grün',
29 '0FF': 'Cyan',
30 '00F': 'Blau',
31 EE82EE: 'Violett',
32 A9A9A9: 'Dunkelgrau',
33 FFA07A: 'Helles Lachsrosa',
34 FFA500: 'Orange',
35 FFFF00: 'Gelb',
36 '00FF00': 'Lime',
37 AFEEEE: 'Blasstürkis',
38 ADD8E6: 'Hellblau',
39 DDA0DD: 'Pflaumenblau',
40 D3D3D3: 'Hellgrau',
41 FFF0F5: 'Lavendel',
42 FAEBD7: 'Antik Weiß',
43 FFFFE0: 'Hellgelb',
44 F0FFF0: 'Honigtau',
45 F0FFFF: 'Azurblau',
46 F0F8FF: 'Alice Blau',
47 E6E6FA: 'Lavendel',
48 FFF: 'Weiß'
49 },
50 more: 'Weitere Farben...',
51 panelTitle: 'Farben',
52 textColorTitle: 'Textfarbe'
53} );
diff --git a/sources/plugins/colorbutton/lang/el.js b/sources/plugins/colorbutton/lang/el.js
new file mode 100644
index 00000000..5648438d
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/el.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'el', {
6 auto: 'Αυτόματα',
7 bgColorTitle: 'Χρώμα Φόντου',
8 colors: {
9 '000': 'Μαύρο',
10 '800000': 'Καστανέρυθρο',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Βαθυκύανο',
14 '000080': 'Μπλε μαρέν',
15 '4B0082': 'Ινδικό',
16 '696969': 'Σκούρο Γκρι',
17 B22222: 'Ανοικτό Κόκκινο',
18 A52A2A: 'Καφέ',
19 DAA520: 'Golden Rod',
20 '006400': 'Σκούρο Πράσινο',
21 '40E0D0': 'Τυρκουάζ',
22 '0000CD': 'Medium Blue',
23 '800080': 'Μοβ',
24 '808080': 'Γκρι',
25 F00: 'Κόκκινο',
26 FF8C00: 'Σκούρο Πορτοκαλί',
27 FFD700: 'Χρυσαφί',
28 '008000': 'Πράσινο',
29 '0FF': 'Κυανό',
30 '00F': 'Μπλε',
31 EE82EE: 'Μενεξεδί',
32 A9A9A9: 'Ποντικί',
33 FFA07A: 'Ανοικτό Σομόν',
34 FFA500: 'Πορτοκαλί',
35 FFFF00: 'Κίτρινο',
36 '00FF00': 'Μοσχολέμονο',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Γαλάζιο',
39 DDA0DD: 'Δαμασκηνί',
40 D3D3D3: 'Ανοικτό Γκρι',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Ανοικτό Κίτρινο',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Γαλανό',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Ελαφρός Ιώδες',
48 FFF: 'Λευκό'
49 },
50 more: 'Περισσότερα Χρώματα...',
51 panelTitle: 'Χρώματα',
52 textColorTitle: 'Χρώμα Κειμένου'
53} );
diff --git a/sources/plugins/colorbutton/lang/en-au.js b/sources/plugins/colorbutton/lang/en-au.js
new file mode 100644
index 00000000..2cba9f7c
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/en-au.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'en-au', {
6 auto: 'Automatic',
7 bgColorTitle: 'Background Colour',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'More Colours...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Text Colour'
53} );
diff --git a/sources/plugins/colorbutton/lang/en-ca.js b/sources/plugins/colorbutton/lang/en-ca.js
new file mode 100644
index 00000000..68752c0e
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/en-ca.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'en-ca', {
6 auto: 'Automatic',
7 bgColorTitle: 'Background Colour',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'More Colours...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Text Colour'
53} );
diff --git a/sources/plugins/colorbutton/lang/en-gb.js b/sources/plugins/colorbutton/lang/en-gb.js
new file mode 100644
index 00000000..6047ce61
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/en-gb.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'en-gb', {
6 auto: 'Automatic',
7 bgColorTitle: 'Background Colour',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Grey',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Grey',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Grey',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Grey',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'More Colours...',
51 panelTitle: 'Colours',
52 textColorTitle: 'Text Colour'
53} );
diff --git a/sources/plugins/colorbutton/lang/en.js b/sources/plugins/colorbutton/lang/en.js
new file mode 100644
index 00000000..c3292ae8
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/en.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'en', {
6 auto: 'Automatic',
7 bgColorTitle: 'Background Color',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'More Colors...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Text Color'
53} );
diff --git a/sources/plugins/colorbutton/lang/eo.js b/sources/plugins/colorbutton/lang/eo.js
new file mode 100644
index 00000000..289592e0
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/eo.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'eo', {
6 auto: 'Aŭtomata',
7 bgColorTitle: 'Fona Koloro',
8 colors: {
9 '000': 'Nigra',
10 '800000': 'Kaŝtankolora',
11 '8B4513': 'Mezbruna',
12 '2F4F4F': 'Ardezgriza',
13 '008080': 'Marĉanaskolora',
14 '000080': 'Maristblua',
15 '4B0082': 'Indigokolora',
16 '696969': 'Malhelgriza',
17 B22222: 'Brikruĝa',
18 A52A2A: 'Bruna',
19 DAA520: 'Senbrilorkolora',
20 '006400': 'Malhelverda',
21 '40E0D0': 'Turkisblua',
22 '0000CD': 'Reĝblua',
23 '800080': 'Purpura',
24 '808080': 'Griza',
25 F00: 'Ruĝa',
26 FF8C00: 'Malheloranĝkolora',
27 FFD700: 'Orkolora',
28 '008000': 'Verda',
29 '0FF': 'Verdblua',
30 '00F': 'Blua',
31 EE82EE: 'Viola',
32 A9A9A9: 'Mezgriza',
33 FFA07A: 'Salmokolora',
34 FFA500: 'Oranĝkolora',
35 FFFF00: 'Flava',
36 '00FF00': 'Limetkolora',
37 AFEEEE: 'Helturkiskolora',
38 ADD8E6: 'Helblua',
39 DDA0DD: 'Prunkolora',
40 D3D3D3: 'Helgriza',
41 FFF0F5: 'Lavendkolora vangoŝminko',
42 FAEBD7: 'Antikvablanka',
43 FFFFE0: 'Helflava',
44 F0FFF0: 'Vintromelonkolora',
45 F0FFFF: 'Lazura',
46 F0F8FF: 'Aliceblua',
47 E6E6FA: 'Lavendkolora',
48 FFF: 'Blanka'
49 },
50 more: 'Pli da Koloroj...',
51 panelTitle: 'Koloroj',
52 textColorTitle: 'Teksta Koloro'
53} );
diff --git a/sources/plugins/colorbutton/lang/es.js b/sources/plugins/colorbutton/lang/es.js
new file mode 100644
index 00000000..f5d5117a
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/es.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'es', {
6 auto: 'Automático',
7 bgColorTitle: 'Color de Fondo',
8 colors: {
9 '000': 'Negro',
10 '800000': 'Marrón oscuro',
11 '8B4513': 'Marrón tierra',
12 '2F4F4F': 'Pizarra Oscuro',
13 '008080': 'Azul verdoso',
14 '000080': 'Azul marino',
15 '4B0082': 'Añil',
16 '696969': 'Gris oscuro',
17 B22222: 'Ladrillo',
18 A52A2A: 'Marrón',
19 DAA520: 'Oro oscuro',
20 '006400': 'Verde oscuro',
21 '40E0D0': 'Turquesa',
22 '0000CD': 'Azul medio-oscuro',
23 '800080': 'Púrpura',
24 '808080': 'Gris',
25 F00: 'Rojo',
26 FF8C00: 'Naranja oscuro',
27 FFD700: 'Oro',
28 '008000': 'Verde',
29 '0FF': 'Cian',
30 '00F': 'Azul',
31 EE82EE: 'Violeta',
32 A9A9A9: 'Gris medio',
33 FFA07A: 'Salmón claro',
34 FFA500: 'Naranja',
35 FFFF00: 'Amarillo',
36 '00FF00': 'Lima',
37 AFEEEE: 'Turquesa claro',
38 ADD8E6: 'Azul claro',
39 DDA0DD: 'Violeta claro',
40 D3D3D3: 'Gris claro',
41 FFF0F5: 'Lavanda rojizo',
42 FAEBD7: 'Blanco antiguo',
43 FFFFE0: 'Amarillo claro',
44 F0FFF0: 'Miel',
45 F0FFFF: 'Azul celeste',
46 F0F8FF: 'Azul pálido',
47 E6E6FA: 'Lavanda',
48 FFF: 'Blanco'
49 },
50 more: 'Más Colores...',
51 panelTitle: 'Colores',
52 textColorTitle: 'Color de Texto'
53} );
diff --git a/sources/plugins/colorbutton/lang/et.js b/sources/plugins/colorbutton/lang/et.js
new file mode 100644
index 00000000..36f712e6
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/et.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'et', {
6 auto: 'Automaatne',
7 bgColorTitle: 'Tausta värv',
8 colors: {
9 '000': 'Must',
10 '800000': 'Kastanpruun',
11 '8B4513': 'Sadulapruun',
12 '2F4F4F': 'Tume paehall',
13 '008080': 'Sinakasroheline',
14 '000080': 'Meresinine',
15 '4B0082': 'Indigosinine',
16 '696969': 'Tumehall',
17 B22222: 'Šamottkivi',
18 A52A2A: 'Pruun',
19 DAA520: 'Kuldkollane',
20 '006400': 'Tumeroheline',
21 '40E0D0': 'Türkiissinine',
22 '0000CD': 'Keskmine sinine',
23 '800080': 'Lilla',
24 '808080': 'Hall',
25 F00: 'Punanae',
26 FF8C00: 'Tumeoranž',
27 FFD700: 'Kuldne',
28 '008000': 'Roheline',
29 '0FF': 'Tsüaniidsinine',
30 '00F': 'Sinine',
31 EE82EE: 'Violetne',
32 A9A9A9: 'Tuhm hall',
33 FFA07A: 'Hele lõhe',
34 FFA500: 'Oranž',
35 FFFF00: 'Kollane',
36 '00FF00': 'Lubja hall',
37 AFEEEE: 'Kahvatu türkiis',
38 ADD8E6: 'Helesinine',
39 DDA0DD: 'Ploomililla',
40 D3D3D3: 'Helehall',
41 FFF0F5: 'Lavendlipunane',
42 FAEBD7: 'Antiikvalge',
43 FFFFE0: 'Helekollane',
44 F0FFF0: 'Meloniroheline',
45 F0FFFF: 'Taevasinine',
46 F0F8FF: 'Beebisinine',
47 E6E6FA: 'Lavendel',
48 FFF: 'Valge'
49 },
50 more: 'Rohkem värve...',
51 panelTitle: 'Värvid',
52 textColorTitle: 'Teksti värv'
53} );
diff --git a/sources/plugins/colorbutton/lang/eu.js b/sources/plugins/colorbutton/lang/eu.js
new file mode 100644
index 00000000..f083f0b9
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/eu.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'eu', {
6 auto: 'Automatikoa',
7 bgColorTitle: 'Atzeko planoko kolorea',
8 colors: {
9 '000': 'Beltza',
10 '800000': 'Granatea',
11 '8B4513': 'Zela marroia',
12 '2F4F4F': 'Arbel gris iluna',
13 '008080': 'Urdin berdexka',
14 '000080': 'Urdin iluna',
15 '4B0082': 'Indigoa',
16 '696969': 'Gris iluna',
17 B22222: 'Adreilu erregogorra',
18 A52A2A: 'Marroia',
19 DAA520: 'Urrezko makila',
20 '006400': 'Berde iluna',
21 '40E0D0': 'Turkesa',
22 '0000CD': 'Urdin ertaina',
23 '800080': 'Morea',
24 '808080': 'Grisa',
25 F00: 'Gorria',
26 FF8C00: 'Laranja iluna',
27 FFD700: 'Urrea',
28 '008000': 'Berdea',
29 '0FF': 'Ziana',
30 '00F': 'Urdina',
31 EE82EE: 'Bioleta',
32 A9A9A9: 'Gris ahula',
33 FFA07A: 'Izokin-kolore argia',
34 FFA500: 'Laranja',
35 FFFF00: 'Horia',
36 '00FF00': 'Lima',
37 AFEEEE: 'Turkesa argia',
38 ADD8E6: 'Urdin argia',
39 DDA0DD: 'Aran-kolorea',
40 D3D3D3: 'Gris argia',
41 FFF0F5: 'Izpiliku-gorrixka',
42 FAEBD7: 'Zuri zaharra',
43 FFFFE0: 'Hori argia',
44 F0FFF0: 'Ezti-ihintza',
45 F0FFFF: 'Zeru-urdina',
46 F0F8FF: 'Alizia urdina',
47 E6E6FA: 'Izpilikua',
48 FFF: 'Zuria'
49 },
50 more: 'Kolore gehiago...',
51 panelTitle: 'Koloreak',
52 textColorTitle: 'Testu-kolorea'
53} );
diff --git a/sources/plugins/colorbutton/lang/fa.js b/sources/plugins/colorbutton/lang/fa.js
new file mode 100644
index 00000000..0cd00db3
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/fa.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'fa', {
6 auto: 'خودکار',
7 bgColorTitle: 'رنگ پس​زمینه',
8 colors: {
9 '000': 'سیاه',
10 '800000': 'خرمایی',
11 '8B4513': 'قهوه​ای شکلاتی',
12 '2F4F4F': 'ارغوانی مایل به خاکستری',
13 '008080': 'آبی مایل به خاکستری',
14 '000080': 'آبی سیر',
15 '4B0082': 'نیلی',
16 '696969': 'خاکستری تیره',
17 B22222: 'آتش آجری',
18 A52A2A: 'قهوه​ای',
19 DAA520: 'میله​ی طلایی',
20 '006400': 'سبز تیره',
21 '40E0D0': 'فیروزه​ای',
22 '0000CD': 'آبی روشن',
23 '800080': 'ارغوانی',
24 '808080': 'خاکستری',
25 F00: 'قرمز',
26 FF8C00: 'نارنجی پررنگ',
27 FFD700: 'طلایی',
28 '008000': 'سبز',
29 '0FF': 'آبی مایل به سبز',
30 '00F': 'آبی',
31 EE82EE: 'بنفش',
32 A9A9A9: 'خاکستری مات',
33 FFA07A: 'صورتی کدر روشن',
34 FFA500: 'نارنجی',
35 FFFF00: 'زرد',
36 '00FF00': 'فسفری',
37 AFEEEE: 'فیروزه​ای رنگ پریده',
38 ADD8E6: 'آبی کمرنگ',
39 DDA0DD: 'آلویی',
40 D3D3D3: 'خاکستری روشن',
41 FFF0F5: 'بنفش کمرنگ',
42 FAEBD7: 'عتیقه سفید',
43 FFFFE0: 'زرد روشن',
44 F0FFF0: 'عسلی',
45 F0FFFF: 'لاجوردی',
46 F0F8FF: 'آبی براق',
47 E6E6FA: 'بنفش کمرنگ',
48 FFF: 'سفید'
49 },
50 more: 'رنگ​های بیشتر...',
51 panelTitle: 'رنگها',
52 textColorTitle: 'رنگ متن'
53} );
diff --git a/sources/plugins/colorbutton/lang/fi.js b/sources/plugins/colorbutton/lang/fi.js
new file mode 100644
index 00000000..a25a0ffa
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/fi.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'fi', {
6 auto: 'Automaattinen',
7 bgColorTitle: 'Taustaväri',
8 colors: {
9 '000': 'Musta',
10 '800000': 'Kastanjanruskea',
11 '8B4513': 'Satulanruskea',
12 '2F4F4F': 'Tumma liuskekivenharmaa',
13 '008080': 'Sinivihreä',
14 '000080': 'Laivastonsininen',
15 '4B0082': 'Indigonsininen',
16 '696969': 'Tummanharmaa',
17 B22222: 'Tiili',
18 A52A2A: 'Ruskea',
19 DAA520: 'Kultapiisku',
20 '006400': 'Tummanvihreä',
21 '40E0D0': 'Turkoosi',
22 '0000CD': 'Keskisininen',
23 '800080': 'Purppura',
24 '808080': 'Harmaa',
25 F00: 'Punainen',
26 FF8C00: 'Tumma oranssi',
27 FFD700: 'Kulta',
28 '008000': 'Vihreä',
29 '0FF': 'Syaani',
30 '00F': 'Sininen',
31 EE82EE: 'Violetti',
32 A9A9A9: 'Tummanharmaa',
33 FFA07A: 'Vaaleanlohenpunainen',
34 FFA500: 'Oranssi',
35 FFFF00: 'Keltainen',
36 '00FF00': 'Limetin vihreä',
37 AFEEEE: 'Haalea turkoosi',
38 ADD8E6: 'Vaaleansininen',
39 DDA0DD: 'Luumu',
40 D3D3D3: 'Vaaleanharmaa',
41 FFF0F5: 'Laventelinpunainen',
42 FAEBD7: 'Antiikinvalkoinen',
43 FFFFE0: 'Vaaleankeltainen',
44 F0FFF0: 'Hunajameloni',
45 F0FFFF: 'Asurinsininen',
46 F0F8FF: 'Alice Blue -sininen',
47 E6E6FA: 'Lavanteli',
48 FFF: 'Valkoinen'
49 },
50 more: 'Lisää värejä...',
51 panelTitle: 'Värit',
52 textColorTitle: 'Tekstiväri'
53} );
diff --git a/sources/plugins/colorbutton/lang/fo.js b/sources/plugins/colorbutton/lang/fo.js
new file mode 100644
index 00000000..a361f8d2
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/fo.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'fo', {
6 auto: 'Automatiskt',
7 bgColorTitle: 'Bakgrundslitur',
8 colors: {
9 '000': 'Svart',
10 '800000': 'Maroon',
11 '8B4513': 'Saðilsbrúnt',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Myrkagrátt',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brúnt',
19 DAA520: 'Gullstavur',
20 '006400': 'Myrkagrønt',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Meðal blátt',
23 '800080': 'Purple',
24 '808080': 'Grátt',
25 F00: 'Reytt',
26 FF8C00: 'Myrkt appelsingult',
27 FFD700: 'Gull',
28 '008000': 'Grønt',
29 '0FF': 'Cyan',
30 '00F': 'Blátt',
31 EE82EE: 'Violet',
32 A9A9A9: 'Døkt grátt',
33 FFA07A: 'Ljósur laksur',
34 FFA500: 'Appelsingult',
35 FFFF00: 'Gult',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Ljósablátt',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Ljósagrátt',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Klassiskt hvítt',
43 FFFFE0: 'Ljósagult',
44 F0FFF0: 'Hunangsdøggur',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blátt',
47 E6E6FA: 'Lavender',
48 FFF: 'Hvítt'
49 },
50 more: 'Fleiri litir...',
51 panelTitle: 'Litir',
52 textColorTitle: 'Tekstlitur'
53} );
diff --git a/sources/plugins/colorbutton/lang/fr-ca.js b/sources/plugins/colorbutton/lang/fr-ca.js
new file mode 100644
index 00000000..4a512b0d
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/fr-ca.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'fr-ca', {
6 auto: 'Automatique',
7 bgColorTitle: 'Couleur de fond',
8 colors: {
9 '000': 'Noir',
10 '800000': 'Marron',
11 '8B4513': 'Brun foncé',
12 '2F4F4F': 'Gris ardoise foncé',
13 '008080': 'Sarcelle',
14 '000080': 'Marine',
15 '4B0082': 'Indigo',
16 '696969': 'Gris foncé',
17 B22222: 'Rouge brique',
18 A52A2A: 'Brun',
19 DAA520: 'Doré',
20 '006400': 'Vert foncé',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Bleu',
23 '800080': 'Mauve',
24 '808080': 'Gris',
25 F00: 'Rouge',
26 FF8C00: 'Orange foncé',
27 FFD700: 'Or',
28 '008000': 'Vert',
29 '0FF': 'Cyan',
30 '00F': 'Bleu',
31 EE82EE: 'Violet',
32 A9A9A9: 'Gris pâle',
33 FFA07A: 'Saumon clair',
34 FFA500: 'Orange',
35 FFFF00: 'Jaune',
36 '00FF00': 'Vert lime',
37 AFEEEE: 'Turquoise pâle',
38 ADD8E6: 'Bleu pâle',
39 DDA0DD: 'Prune',
40 D3D3D3: 'Gris pâle',
41 FFF0F5: 'Bleu lavande',
42 FAEBD7: 'Blanc antique',
43 FFFFE0: 'Jaune pâle',
44 F0FFF0: 'Miel doré',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Bleu alice',
47 E6E6FA: 'Lavande',
48 FFF: 'Blanc'
49 },
50 more: 'Plus de couleurs...',
51 panelTitle: 'Couleurs',
52 textColorTitle: 'Couleur de texte'
53} );
diff --git a/sources/plugins/colorbutton/lang/fr.js b/sources/plugins/colorbutton/lang/fr.js
new file mode 100644
index 00000000..dee76e5f
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/fr.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'fr', {
6 auto: 'Automatique',
7 bgColorTitle: 'Couleur d\'arrière plan',
8 colors: {
9 '000': 'Noir',
10 '800000': 'Marron',
11 '8B4513': 'Brun moyen',
12 '2F4F4F': 'Vert sombre',
13 '008080': 'Canard',
14 '000080': 'Bleu marine',
15 '4B0082': 'Indigo',
16 '696969': 'Gris foncé',
17 B22222: 'Rouge brique',
18 A52A2A: 'Brun',
19 DAA520: 'Or terni',
20 '006400': 'Vert foncé',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Bleu royal',
23 '800080': 'Pourpre',
24 '808080': 'Gris',
25 F00: 'Rouge',
26 FF8C00: 'Orange foncé',
27 FFD700: 'Or',
28 '008000': 'Vert',
29 '0FF': 'Cyan',
30 '00F': 'Bleu',
31 EE82EE: 'Violet',
32 A9A9A9: 'Gris moyen',
33 FFA07A: 'Saumon',
34 FFA500: 'Orange',
35 FFFF00: 'Jaune',
36 '00FF00': 'Lime',
37 AFEEEE: 'Turquoise clair',
38 ADD8E6: 'Bleu clair',
39 DDA0DD: 'Prune',
40 D3D3D3: 'Gris clair',
41 FFF0F5: 'Fard Lavande',
42 FAEBD7: 'Blanc antique',
43 FFFFE0: 'Jaune clair',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azur',
46 F0F8FF: 'Bleu Alice',
47 E6E6FA: 'Lavande',
48 FFF: 'Blanc'
49 },
50 more: 'Plus de couleurs...',
51 panelTitle: 'Couleurs',
52 textColorTitle: 'Couleur de texte'
53} );
diff --git a/sources/plugins/colorbutton/lang/gl.js b/sources/plugins/colorbutton/lang/gl.js
new file mode 100644
index 00000000..c2c3730b
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/gl.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'gl', {
6 auto: 'Automático',
7 bgColorTitle: 'Cor do fondo',
8 colors: {
9 '000': 'Negro',
10 '800000': 'Marrón escuro',
11 '8B4513': 'Ocre',
12 '2F4F4F': 'Pizarra escuro',
13 '008080': 'Verde azulado',
14 '000080': 'Azul mariño',
15 '4B0082': 'Índigo',
16 '696969': 'Gris escuro',
17 B22222: 'Ladrillo',
18 A52A2A: 'Marrón',
19 DAA520: 'Dourado escuro',
20 '006400': 'Verde escuro',
21 '40E0D0': 'Turquesa',
22 '0000CD': 'Azul medio',
23 '800080': 'Púrpura',
24 '808080': 'Gris',
25 F00: 'Vermello',
26 FF8C00: 'Laranxa escuro',
27 FFD700: 'Dourado',
28 '008000': 'Verde',
29 '0FF': 'Cian',
30 '00F': 'Azul',
31 EE82EE: 'Violeta',
32 A9A9A9: 'Gris medio',
33 FFA07A: 'Salmón claro',
34 FFA500: 'Laranxa',
35 FFFF00: 'Amarelo',
36 '00FF00': 'Lima',
37 AFEEEE: 'Turquesa pálido',
38 ADD8E6: 'Azul claro',
39 DDA0DD: 'Violeta pálido',
40 D3D3D3: 'Verde claro',
41 FFF0F5: 'Lavanda vermello',
42 FAEBD7: 'Branco antigo',
43 FFFFE0: 'Amarelo claro',
44 F0FFF0: 'Mel',
45 F0FFFF: 'Azul celeste',
46 F0F8FF: 'Azul pálido',
47 E6E6FA: 'Lavanda',
48 FFF: 'Branco'
49 },
50 more: 'Máis cores...',
51 panelTitle: 'Cores',
52 textColorTitle: 'Cor do texto'
53} );
diff --git a/sources/plugins/colorbutton/lang/gu.js b/sources/plugins/colorbutton/lang/gu.js
new file mode 100644
index 00000000..06dec6bf
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/gu.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'gu', {
6 auto: 'સ્વચાલિત',
7 bgColorTitle: 'બૅકગ્રાઉન્ડ રંગ,',
8 colors: {
9 '000': 'કાળો',
10 '800000': 'મરુન',
11 '8B4513': 'છીક',
12 '2F4F4F': 'ડાર્ક સ્લેટ ગ્રે ',
13 '008080': 'ટીલ',
14 '000080': 'નેવી',
15 '4B0082': 'જામલી',
16 '696969': 'ડાર્ક ગ્રે',
17 B22222: 'ઈટ',
18 A52A2A: 'બ્રાઉન',
19 DAA520: 'ગોલ્ડન રોડ',
20 '006400': 'ડાર્ક લીલો',
21 '40E0D0': 'ટ્રકોઈસ',
22 '0000CD': 'મધ્યમ વાદળી',
23 '800080': 'પર્પલ',
24 '808080': 'ગ્રે',
25 F00: 'લાલ',
26 FF8C00: 'ડાર્ક ઓરંજ',
27 FFD700: 'ગોલ્ડ',
28 '008000': 'ગ્રીન',
29 '0FF': 'સાયન',
30 '00F': 'વાદળી',
31 EE82EE: 'વાયોલેટ',
32 A9A9A9: 'ડીમ ',
33 FFA07A: 'લાઈટ સાલમન',
34 FFA500: 'ઓરંજ',
35 FFFF00: 'પીળો',
36 '00FF00': 'લાઈમ',
37 AFEEEE: 'પેલ કોઈસ',
38 ADD8E6: 'લાઈટ બ્લુ',
39 DDA0DD: 'પલ્મ',
40 D3D3D3: 'લાઈટ ગ્રે',
41 FFF0F5: 'લવંડર ',
42 FAEBD7: 'એન્ટીક સફેદ',
43 FFFFE0: 'લાઈટ પીળો',
44 F0FFF0: 'હનીડઉય',
45 F0FFFF: 'અઝુરે',
46 F0F8FF: 'એલીસ બ્લુ',
47 E6E6FA: 'લવંડર',
48 FFF: 'સફેદ'
49 },
50 more: 'ઔર રંગ...',
51 panelTitle: 'રંગ',
52 textColorTitle: 'શબ્દનો રંગ'
53} );
diff --git a/sources/plugins/colorbutton/lang/he.js b/sources/plugins/colorbutton/lang/he.js
new file mode 100644
index 00000000..f10eace9
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/he.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'he', {
6 auto: 'אוטומטי',
7 bgColorTitle: 'צבע רקע',
8 colors: {
9 '000': 'שחור',
10 '800000': 'סגול כהה',
11 '8B4513': 'חום בהיר',
12 '2F4F4F': 'אפור צפחה',
13 '008080': 'כחול-ירוק',
14 '000080': 'כחול-סגול',
15 '4B0082': 'אינדיגו',
16 '696969': 'אפור מעומעם',
17 B22222: 'אדום-חום',
18 A52A2A: 'חום',
19 DAA520: 'כתום זהב',
20 '006400': 'ירוק כהה',
21 '40E0D0': 'טורקיז',
22 '0000CD': 'כחול בינוני',
23 '800080': 'סגול',
24 '808080': 'אפור',
25 F00: 'אדום',
26 FF8C00: 'כתום כהה',
27 FFD700: 'זהב',
28 '008000': 'ירוק',
29 '0FF': 'ציאן',
30 '00F': 'כחול',
31 EE82EE: 'סגלגל',
32 A9A9A9: 'אפור כהה',
33 FFA07A: 'כתום-וורוד',
34 FFA500: 'כתום',
35 FFFF00: 'צהוב',
36 '00FF00': 'ליים',
37 AFEEEE: 'טורקיז בהיר',
38 ADD8E6: 'כחול בהיר',
39 DDA0DD: 'שזיף',
40 D3D3D3: 'אפור בהיר',
41 FFF0F5: 'לבנדר מסמיק',
42 FAEBD7: 'לבן עתיק',
43 FFFFE0: 'צהוב בהיר',
44 F0FFF0: 'טל דבש',
45 F0FFFF: 'תכלת',
46 F0F8FF: 'כחול טיפת מים',
47 E6E6FA: 'לבנדר',
48 FFF: 'לבן'
49 },
50 more: 'צבעים נוספים...',
51 panelTitle: 'צבעים',
52 textColorTitle: 'צבע טקסט'
53} );
diff --git a/sources/plugins/colorbutton/lang/hi.js b/sources/plugins/colorbutton/lang/hi.js
new file mode 100644
index 00000000..6440a6e1
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/hi.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'hi', {
6 auto: 'स्वचालित',
7 bgColorTitle: 'बैक्ग्राउन्ड रंग',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'और रंग...',
51 panelTitle: 'Colors',
52 textColorTitle: 'टेक्स्ट रंग'
53} );
diff --git a/sources/plugins/colorbutton/lang/hr.js b/sources/plugins/colorbutton/lang/hr.js
new file mode 100644
index 00000000..e5099d24
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/hr.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'hr', {
6 auto: 'Automatski',
7 bgColorTitle: 'Boja pozadine',
8 colors: {
9 '000': 'Crna',
10 '800000': 'Kesten',
11 '8B4513': 'Smeđa',
12 '2F4F4F': 'Tamno siva',
13 '008080': 'Teal',
14 '000080': 'Mornarska',
15 '4B0082': 'Indigo',
16 '696969': 'Tamno siva',
17 B22222: 'Vatrena cigla',
18 A52A2A: 'Smeđa',
19 DAA520: 'Zlatna',
20 '006400': 'Tamno zelena',
21 '40E0D0': 'Tirkizna',
22 '0000CD': 'Srednje plava',
23 '800080': 'Ljubičasta',
24 '808080': 'Siva',
25 F00: 'Crvena',
26 FF8C00: 'Tamno naranđasta',
27 FFD700: 'Zlatna',
28 '008000': 'Zelena',
29 '0FF': 'Cijan',
30 '00F': 'Plava',
31 EE82EE: 'Ljubičasta',
32 A9A9A9: 'Mutno siva',
33 FFA07A: 'Svijetli losos',
34 FFA500: 'Naranđasto',
35 FFFF00: 'Žuto',
36 '00FF00': 'Limun',
37 AFEEEE: 'Blijedo tirkizna',
38 ADD8E6: 'Svijetlo plava',
39 DDA0DD: 'Šljiva',
40 D3D3D3: 'Svijetlo siva',
41 FFF0F5: 'Lavanda rumeno',
42 FAEBD7: 'Antikno bijela',
43 FFFFE0: 'Svijetlo žuta',
44 F0FFF0: 'Med',
45 F0FFFF: 'Azurna',
46 F0F8FF: 'Alice plava',
47 E6E6FA: 'Lavanda',
48 FFF: 'Bijela'
49 },
50 more: 'Više boja...',
51 panelTitle: 'Boje',
52 textColorTitle: 'Boja teksta'
53} );
diff --git a/sources/plugins/colorbutton/lang/hu.js b/sources/plugins/colorbutton/lang/hu.js
new file mode 100644
index 00000000..4ff5d1d0
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/hu.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'hu', {
6 auto: 'Automatikus',
7 bgColorTitle: 'Háttérszín',
8 colors: {
9 '000': 'Fekete',
10 '800000': 'Bordó',
11 '8B4513': 'Barna',
12 '2F4F4F': 'Sötét türkiz',
13 '008080': 'Türkiz',
14 '000080': 'Király kék',
15 '4B0082': 'Indigó kék',
16 '696969': 'Szürke',
17 B22222: 'Tégla vörös',
18 A52A2A: 'Vörös',
19 DAA520: 'Arany sárga',
20 '006400': 'Sötét zöld',
21 '40E0D0': 'Türkiz',
22 '0000CD': 'Kék',
23 '800080': 'Lila',
24 '808080': 'Szürke',
25 F00: 'Piros',
26 FF8C00: 'Sötét narancs',
27 FFD700: 'Arany',
28 '008000': 'Zöld',
29 '0FF': 'Türkiz',
30 '00F': 'Kék',
31 EE82EE: 'Rózsaszín',
32 A9A9A9: 'Sötét szürke',
33 FFA07A: 'Lazac',
34 FFA500: 'Narancs',
35 FFFF00: 'Citromsárga',
36 '00FF00': 'Neon zöld',
37 AFEEEE: 'Világos türkiz',
38 ADD8E6: 'Világos kék',
39 DDA0DD: 'Világos lila',
40 D3D3D3: 'Világos szürke',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Törtfehér',
43 FFFFE0: 'Világos sárga',
44 F0FFF0: 'Menta',
45 F0FFFF: 'Azúr kék',
46 F0F8FF: 'Halvány kék',
47 E6E6FA: 'Lavender',
48 FFF: 'Fehér'
49 },
50 more: 'További színek...',
51 panelTitle: 'Színek',
52 textColorTitle: 'Betűszín'
53} );
diff --git a/sources/plugins/colorbutton/lang/id.js b/sources/plugins/colorbutton/lang/id.js
new file mode 100644
index 00000000..049a9def
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/id.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'id', {
6 auto: 'Automatic', // MISSING
7 bgColorTitle: 'Warna Latar Belakang',
8 colors: {
9 '000': 'Hitam',
10 '800000': 'Merah Tua',
11 '8B4513': 'Saddle Brown', // MISSING
12 '2F4F4F': 'Dark Slate Gray', // MISSING
13 '008080': 'Teal', // MISSING
14 '000080': 'Navy', // MISSING
15 '4B0082': 'Indigo', // MISSING
16 '696969': 'Abu-abu Gelap',
17 B22222: 'Merah Bata',
18 A52A2A: 'Coklat',
19 DAA520: 'Golden Rod', // MISSING
20 '006400': 'Hijau Gelap',
21 '40E0D0': 'Turquoise', // MISSING
22 '0000CD': 'Biru Sedang',
23 '800080': 'Ungu',
24 '808080': 'Abu-abu',
25 F00: 'Merah',
26 FF8C00: 'Jingga Gelap',
27 FFD700: 'Emas',
28 '008000': 'Hijau',
29 '0FF': 'Cyan', // MISSING
30 '00F': 'Biru',
31 EE82EE: 'Violet', // MISSING
32 A9A9A9: 'Abu-abu Redup',
33 FFA07A: 'Salmon Cerah',
34 FFA500: 'Jingga',
35 FFFF00: 'Kuning',
36 '00FF00': 'Jeruk Lemon',
37 AFEEEE: 'Biru Hijau Pucat',
38 ADD8E6: 'Biru Cerah',
39 DDA0DD: 'Plum', // MISSING
40 D3D3D3: 'Abu-abu Cerah',
41 FFF0F5: 'Lavender Blush', // MISSING
42 FAEBD7: 'Antique White', // MISSING
43 FFFFE0: 'Kuning Cerah',
44 F0FFF0: 'Honeydew', // MISSING
45 F0FFFF: 'Azure', // MISSING
46 F0F8FF: 'Alice Blue', // MISSING
47 E6E6FA: 'Lavender', // MISSING
48 FFF: 'Putih'
49 },
50 more: 'Warna lainnya...',
51 panelTitle: 'Warna',
52 textColorTitle: 'Warna Teks'
53} );
diff --git a/sources/plugins/colorbutton/lang/is.js b/sources/plugins/colorbutton/lang/is.js
new file mode 100644
index 00000000..dc3a4697
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/is.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'is', {
6 auto: 'Sjálfval',
7 bgColorTitle: 'Bakgrunnslitur',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Fleiri liti...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Litur texta'
53} );
diff --git a/sources/plugins/colorbutton/lang/it.js b/sources/plugins/colorbutton/lang/it.js
new file mode 100644
index 00000000..616de5dd
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/it.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'it', {
6 auto: 'Automatico',
7 bgColorTitle: 'Colore sfondo',
8 colors: {
9 '000': 'Nero',
10 '800000': 'Marrone Castagna',
11 '8B4513': 'Marrone Cuoio',
12 '2F4F4F': 'Grigio Fumo di Londra',
13 '008080': 'Acquamarina',
14 '000080': 'Blu Oceano',
15 '4B0082': 'Indigo',
16 '696969': 'Grigio Scuro',
17 B22222: 'Giallo Fiamma',
18 A52A2A: 'Marrone',
19 DAA520: 'Giallo Mimosa',
20 '006400': 'Verde Scuro',
21 '40E0D0': 'Turchese',
22 '0000CD': 'Blue Scuro',
23 '800080': 'Viola',
24 '808080': 'Grigio',
25 F00: 'Rosso',
26 FF8C00: 'Arancio Scuro',
27 FFD700: 'Oro',
28 '008000': 'Verde',
29 '0FF': 'Ciano',
30 '00F': 'Blu',
31 EE82EE: 'Violetto',
32 A9A9A9: 'Grigio Scuro',
33 FFA07A: 'Salmone',
34 FFA500: 'Arancio',
35 FFFF00: 'Giallo',
36 '00FF00': 'Lime',
37 AFEEEE: 'Turchese Chiaro',
38 ADD8E6: 'Blu Chiaro',
39 DDA0DD: 'Rosso Ciliegia',
40 D3D3D3: 'Grigio Chiaro',
41 FFF0F5: 'Lavanda Chiara',
42 FAEBD7: 'Bianco Antico',
43 FFFFE0: 'Giallo Chiaro',
44 F0FFF0: 'Verde Mela',
45 F0FFFF: 'Azzurro',
46 F0F8FF: 'Celeste',
47 E6E6FA: 'Lavanda',
48 FFF: 'Bianco'
49 },
50 more: 'Altri colori...',
51 panelTitle: 'Colori',
52 textColorTitle: 'Colore testo'
53} );
diff --git a/sources/plugins/colorbutton/lang/ja.js b/sources/plugins/colorbutton/lang/ja.js
new file mode 100644
index 00000000..b717d33a
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ja.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ja', {
6 auto: '自動',
7 bgColorTitle: '背景色',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'その他の色...',
51 panelTitle: '色',
52 textColorTitle: '文字色'
53} );
diff --git a/sources/plugins/colorbutton/lang/ka.js b/sources/plugins/colorbutton/lang/ka.js
new file mode 100644
index 00000000..0ea34a58
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ka.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ka', {
6 auto: 'ავტომატური',
7 bgColorTitle: 'ფონის ფერი',
8 colors: {
9 '000': 'შავი',
10 '800000': 'მუქი შინდისფერი',
11 '8B4513': 'ყავისფერი',
12 '2F4F4F': 'მოლურჯო ნაცრისფერი',
13 '008080': 'ჩამქრალი ლურჯი',
14 '000080': 'მუქი ლურჯი',
15 '4B0082': 'იასამნისფერი',
16 '696969': 'მუქი ნაცრისფერი',
17 B22222: 'აგურისფერი',
18 A52A2A: 'მუქი ყავისფერი',
19 DAA520: 'მოყვითალო',
20 '006400': 'მუქი მწვანე',
21 '40E0D0': 'ცისფერი',
22 '0000CD': 'ზომიერად ლურჯი',
23 '800080': 'იისფერი',
24 '808080': 'ნაცრისფერი',
25 F00: 'წითელი',
26 FF8C00: 'მუქი სტაფილოსფერი',
27 FFD700: 'ოქროსფერი',
28 '008000': 'მწვანე',
29 '0FF': 'ღია ცისფერი',
30 '00F': 'ლურჯი',
31 EE82EE: 'იისფერი',
32 A9A9A9: 'ბაცი ნაცრისფერი',
33 FFA07A: 'ჩამქრალი ვარდისფერი',
34 FFA500: 'სტაფილოსფერი',
35 FFFF00: 'ყვითელი',
36 '00FF00': 'ლურჯი',
37 AFEEEE: 'ცისფერი',
38 ADD8E6: 'ღია ლურჯი',
39 DDA0DD: 'ღია იისფერი',
40 D3D3D3: 'ღია ნაცრისფერი',
41 FFF0F5: 'ღია ვარდისფერი',
42 FAEBD7: 'ღია ყავისფერი',
43 FFFFE0: 'ნათელი ყვითელი',
44 F0FFF0: 'ღია მწვანე',
45 F0FFFF: 'ღია ცისფერი 2',
46 F0F8FF: 'ღია ცისფერი 3',
47 E6E6FA: 'ღია იისფერი 2',
48 FFF: 'თეთრი'
49 },
50 more: 'მეტი ფერი...',
51 panelTitle: 'ფერები',
52 textColorTitle: 'ტექსტის ფერი'
53} );
diff --git a/sources/plugins/colorbutton/lang/km.js b/sources/plugins/colorbutton/lang/km.js
new file mode 100644
index 00000000..e33727e8
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/km.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'km', {
6 auto: 'ស្វ័យប្រវត្តិ',
7 bgColorTitle: 'ពណ៌ផ្ទៃខាងក្រោយ',
8 colors: {
9 '000': 'ខ្មៅ',
10 '800000': 'ត្នោត​ចាស់',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'ខៀវ​ចាស់',
15 '4B0082': 'ធ្លះ',
16 '696969': 'ប្រផេះ​ក្រាស់',
17 B22222: 'Fire Brick',
18 A52A2A: 'ត្នោត',
19 DAA520: 'Golden Rod',
20 '006400': 'បៃតង​ចាស់',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'ប្រផេះ',
25 F00: 'ក្រហម',
26 FF8C00: 'ទឹក​ក្រូច​ចាស់',
27 FFD700: 'មាស',
28 '008000': 'បៃតង',
29 '0FF': 'Cyan',
30 '00F': 'ខៀវ',
31 EE82EE: 'ស្វាយ',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'ទឹក​ក្រូច',
35 FFFF00: 'លឿង',
36 '00FF00': 'ក្រូច​ឆ្មារ',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'លឿង​ស្ដើង',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'ផ្ទៃមេឃ',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'ឡាវិនដឺ',
48 FFF: 'ស'
49 },
50 more: 'ពណ៌​ផ្សេង​ទៀត..',
51 panelTitle: 'ពណ៌',
52 textColorTitle: 'ពណ៌អក្សរ'
53} );
diff --git a/sources/plugins/colorbutton/lang/ko.js b/sources/plugins/colorbutton/lang/ko.js
new file mode 100644
index 00000000..6bd833f2
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ko.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ko', {
6 auto: '기본 색상',
7 bgColorTitle: '배경 색상',
8 colors: {
9 '000': '검정',
10 '800000': '밤색',
11 '8B4513': '새들 브라운',
12 '2F4F4F': '다크 슬레이트 그레이',
13 '008080': '틸',
14 '000080': '네이비',
15 '4B0082': '남색',
16 '696969': '짙은 회색',
17 B22222: '벽돌색',
18 A52A2A: '갈색',
19 DAA520: '골든 로드',
20 '006400': '암록색',
21 '40E0D0': '터코이즈',
22 '0000CD': '미디엄 블루',
23 '800080': '보라',
24 '808080': '회색',
25 F00: '빨강',
26 FF8C00: '짙은 주황',
27 FFD700: '금색',
28 '008000': '녹색',
29 '0FF': '시안',
30 '00F': '파랑',
31 EE82EE: '남보라',
32 A9A9A9: '딤 그레이',
33 FFA07A: '라이트 새먼',
34 FFA500: '주황',
35 FFFF00: '노랑',
36 '00FF00': '라임',
37 AFEEEE: '패일 터코이즈',
38 ADD8E6: '연한 파랑',
39 DDA0DD: '자두',
40 D3D3D3: '연한 회색',
41 FFF0F5: '라벤더 블러쉬',
42 FAEBD7: '앤틱 화이트',
43 FFFFE0: '연한 노랑',
44 F0FFF0: '허니듀',
45 F0FFFF: '하늘색',
46 F0F8FF: '앨리스 블루',
47 E6E6FA: '라벤더',
48 FFF: '흰색'
49 },
50 more: '색상 선택...',
51 panelTitle: '색상',
52 textColorTitle: '글자 색상'
53} );
diff --git a/sources/plugins/colorbutton/lang/ku.js b/sources/plugins/colorbutton/lang/ku.js
new file mode 100644
index 00000000..79992f37
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ku.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ku', {
6 auto: 'خۆکار',
7 bgColorTitle: 'ڕەنگی پاشبنەما',
8 colors: {
9 '000': 'ڕەش',
10 '800000': 'سۆرو ماڕوونی',
11 '8B4513': 'ماڕوونی',
12 '2F4F4F': 'سەوزی تاریك',
13 '008080': 'سەوز و شین',
14 '000080': 'شینی تۆخ',
15 '4B0082': 'مۆری تۆخ',
16 '696969': 'ڕەساسی تۆخ',
17 B22222: 'سۆری تۆخ',
18 A52A2A: 'قاوەیی',
19 DAA520: 'قاوەیی بریسکەدار',
20 '006400': 'سەوزی تۆخ',
21 '40E0D0': 'شینی ناتۆخی بریسکەدار',
22 '0000CD': 'شینی مامناوەند',
23 '800080': 'پەمبەیی',
24 '808080': 'ڕەساسی',
25 F00: 'سۆر',
26 FF8C00: 'نارەنجی تۆخ',
27 FFD700: 'زەرد',
28 '008000': 'سەوز',
29 '0FF': 'شینی ئاسمانی',
30 '00F': 'شین',
31 EE82EE: 'پەمەیی',
32 A9A9A9: 'ڕەساسی ناتۆخ',
33 FFA07A: 'نارەنجی ناتۆخ',
34 FFA500: 'نارەنجی',
35 FFFF00: 'زەرد',
36 '00FF00': 'سەوز',
37 AFEEEE: 'شینی ناتۆخ',
38 ADD8E6: 'شینی زۆر ناتۆخ',
39 DDA0DD: 'پەمەیی ناتۆخ',
40 D3D3D3: 'ڕەساسی بریسکەدار',
41 FFF0F5: 'جەرگی زۆر ناتۆخ',
42 FAEBD7: 'جەرگی ناتۆخ',
43 FFFFE0: 'سپی ناتۆخ',
44 F0FFF0: 'هەنگوینی ناتۆخ',
45 F0FFFF: 'شینێکی زۆر ناتۆخ',
46 F0F8FF: 'شینێکی ئاسمانی زۆر ناتۆخ',
47 E6E6FA: 'شیری',
48 FFF: 'سپی'
49 },
50 more: 'ڕەنگی زیاتر...',
51 panelTitle: 'ڕەنگەکان',
52 textColorTitle: 'ڕەنگی دەق'
53} );
diff --git a/sources/plugins/colorbutton/lang/lt.js b/sources/plugins/colorbutton/lang/lt.js
new file mode 100644
index 00000000..be82ae89
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/lt.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'lt', {
6 auto: 'Automatinis',
7 bgColorTitle: 'Fono spalva',
8 colors: {
9 '000': 'Juoda',
10 '800000': 'Kaštoninė',
11 '8B4513': 'Tamsiai ruda',
12 '2F4F4F': 'Pilka tamsaus šiferio',
13 '008080': 'Teal',
14 '000080': 'Karinis',
15 '4B0082': 'Indigo',
16 '696969': 'Tamsiai pilka',
17 B22222: 'Ugnies',
18 A52A2A: 'Ruda',
19 DAA520: 'Aukso',
20 '006400': 'Tamsiai žalia',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Vidutinė mėlyna',
23 '800080': 'Violetinė',
24 '808080': 'Pilka',
25 F00: 'Raudona',
26 FF8C00: 'Tamsiai oranžinė',
27 FFD700: 'Auksinė',
28 '008000': 'Žalia',
29 '0FF': 'Žydra',
30 '00F': 'Mėlyna',
31 EE82EE: 'Violetinė',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Oranžinė',
35 FFFF00: 'Geltona',
36 '00FF00': 'Citrinų',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Šviesiai mėlyna',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Šviesiai pilka',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Šviesiai geltona',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'Balta'
49 },
50 more: 'Daugiau spalvų...',
51 panelTitle: 'Spalva',
52 textColorTitle: 'Teksto spalva'
53} );
diff --git a/sources/plugins/colorbutton/lang/lv.js b/sources/plugins/colorbutton/lang/lv.js
new file mode 100644
index 00000000..bd0cfd30
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/lv.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'lv', {
6 auto: 'Automātiska',
7 bgColorTitle: 'Fona krāsa',
8 colors: {
9 '000': 'Melns',
10 '800000': 'Sarkanbrūns',
11 '8B4513': 'Sedlu brūns',
12 '2F4F4F': 'Tumšas tāfeles pelēks',
13 '008080': 'Zili-zaļš',
14 '000080': 'Jūras',
15 '4B0082': 'Indigo',
16 '696969': 'Tumši pelēks',
17 B22222: 'Ķieģeļsarkans',
18 A52A2A: 'Brūns',
19 DAA520: 'Zelta',
20 '006400': 'Tumši zaļš',
21 '40E0D0': 'Tirkīzs',
22 '0000CD': 'Vidēji zils',
23 '800080': 'Purpurs',
24 '808080': 'Pelēks',
25 F00: 'Sarkans',
26 FF8C00: 'Tumši oranžs',
27 FFD700: 'Zelta',
28 '008000': 'Zaļš',
29 '0FF': 'Tumšzils',
30 '00F': 'Zils',
31 EE82EE: 'Violets',
32 A9A9A9: 'Pelēks',
33 FFA07A: 'Gaiši laškrāsas',
34 FFA500: 'Oranžs',
35 FFFF00: 'Dzeltens',
36 '00FF00': 'Laima',
37 AFEEEE: 'Gaiši tirkīza',
38 ADD8E6: 'Gaiši zils',
39 DDA0DD: 'Plūmju',
40 D3D3D3: 'Gaiši pelēks',
41 FFF0F5: 'Lavandas sārts',
42 FAEBD7: 'Antīki balts',
43 FFFFE0: 'Gaiši dzeltens',
44 F0FFF0: 'Meduspile',
45 F0FFFF: 'Debesszils',
46 F0F8FF: 'Alises zils',
47 E6E6FA: 'Lavanda',
48 FFF: 'Balts'
49 },
50 more: 'Plašāka palete...',
51 panelTitle: 'Krāsa',
52 textColorTitle: 'Teksta krāsa'
53} );
diff --git a/sources/plugins/colorbutton/lang/mk.js b/sources/plugins/colorbutton/lang/mk.js
new file mode 100644
index 00000000..139fea42
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/mk.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'mk', {
6 auto: 'Automatic', // MISSING
7 bgColorTitle: 'Background Color',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'More Colors...', // MISSING
51 panelTitle: 'Colors',
52 textColorTitle: 'Text Color' // MISSING
53} );
diff --git a/sources/plugins/colorbutton/lang/mn.js b/sources/plugins/colorbutton/lang/mn.js
new file mode 100644
index 00000000..c1999480
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/mn.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'mn', {
6 auto: 'Автоматаар',
7 bgColorTitle: 'Дэвсгэр өнгө',
8 colors: {
9 '000': 'Хар',
10 '800000': 'Хүрэн',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Саарал',
25 F00: 'Улаан',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Алт',
28 '008000': 'Ногоон',
29 '0FF': 'Цэнхэр',
30 '00F': 'Хөх',
31 EE82EE: 'Ягаан',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Улбар шар',
35 FFFF00: 'Шар',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Цайвар саарал',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'Цагаан'
49 },
50 more: 'Нэмэлт өнгөнүүд...',
51 panelTitle: 'Өнгөнүүд',
52 textColorTitle: 'Бичвэрийн өнгө'
53} );
diff --git a/sources/plugins/colorbutton/lang/ms.js b/sources/plugins/colorbutton/lang/ms.js
new file mode 100644
index 00000000..6fd19117
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ms.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ms', {
6 auto: 'Otomatik',
7 bgColorTitle: 'Warna Latarbelakang',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Warna lain-lain...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Warna Text'
53} );
diff --git a/sources/plugins/colorbutton/lang/nb.js b/sources/plugins/colorbutton/lang/nb.js
new file mode 100644
index 00000000..28906baa
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/nb.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'nb', {
6 auto: 'Automatisk',
7 bgColorTitle: 'Bakgrunnsfarge',
8 colors: {
9 '000': 'Svart',
10 '800000': 'Rødbrun',
11 '8B4513': 'Salbrun',
12 '2F4F4F': 'Grønnsvart',
13 '008080': 'Blågrønn',
14 '000080': 'Marineblått',
15 '4B0082': 'Indigo',
16 '696969': 'Mørk grå',
17 B22222: 'Mørkerød',
18 A52A2A: 'Brun',
19 DAA520: 'Lys brun',
20 '006400': 'Mørk grønn',
21 '40E0D0': 'Turkis',
22 '0000CD': 'Medium blå',
23 '800080': 'Purpur',
24 '808080': 'Grå',
25 F00: 'Rød',
26 FF8C00: 'Mørk oransje',
27 FFD700: 'Gull',
28 '008000': 'Grønn',
29 '0FF': 'Cyan',
30 '00F': 'Blå',
31 EE82EE: 'Fiolett',
32 A9A9A9: 'Svak grå',
33 FFA07A: 'Rosa-oransje',
34 FFA500: 'Oransje',
35 FFFF00: 'Gul',
36 '00FF00': 'Lime',
37 AFEEEE: 'Svak turkis',
38 ADD8E6: 'Lys Blå',
39 DDA0DD: 'Plomme',
40 D3D3D3: 'Lys grå',
41 FFF0F5: 'Svak lavendelrosa',
42 FAEBD7: 'Antikk-hvit',
43 FFFFE0: 'Lys gul',
44 F0FFF0: 'Honningmelon',
45 F0FFFF: 'Svakt asurblått',
46 F0F8FF: 'Svak cyan',
47 E6E6FA: 'Lavendel',
48 FFF: 'Hvit'
49 },
50 more: 'Flere farger...',
51 panelTitle: 'Farger',
52 textColorTitle: 'Tekstfarge'
53} );
diff --git a/sources/plugins/colorbutton/lang/nl.js b/sources/plugins/colorbutton/lang/nl.js
new file mode 100644
index 00000000..da2f57a4
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/nl.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'nl', {
6 auto: 'Automatisch',
7 bgColorTitle: 'Achtergrondkleur',
8 colors: {
9 '000': 'Zwart',
10 '800000': 'Kastanjebruin',
11 '8B4513': 'Chocoladebruin',
12 '2F4F4F': 'Donkerleigrijs',
13 '008080': 'Blauwgroen',
14 '000080': 'Marine',
15 '4B0082': 'Indigo',
16 '696969': 'Donkergrijs',
17 B22222: 'Baksteen',
18 A52A2A: 'Bruin',
19 DAA520: 'Donkergeel',
20 '006400': 'Donkergroen',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Middenblauw',
23 '800080': 'Paars',
24 '808080': 'Grijs',
25 F00: 'Rood',
26 FF8C00: 'Donkeroranje',
27 FFD700: 'Goud',
28 '008000': 'Groen',
29 '0FF': 'Cyaan',
30 '00F': 'Blauw',
31 EE82EE: 'Violet',
32 A9A9A9: 'Donkergrijs',
33 FFA07A: 'Lichtzalm',
34 FFA500: 'Oranje',
35 FFFF00: 'Geel',
36 '00FF00': 'Felgroen',
37 AFEEEE: 'Lichtturquoise',
38 ADD8E6: 'Lichtblauw',
39 DDA0DD: 'Pruim',
40 D3D3D3: 'Lichtgrijs',
41 FFF0F5: 'Linnen',
42 FAEBD7: 'Ivoor',
43 FFFFE0: 'Lichtgeel',
44 F0FFF0: 'Honingdauw',
45 F0FFFF: 'Azuur',
46 F0F8FF: 'Licht hemelsblauw',
47 E6E6FA: 'Lavendel',
48 FFF: 'Wit'
49 },
50 more: 'Meer kleuren...',
51 panelTitle: 'Kleuren',
52 textColorTitle: 'Tekstkleur'
53} );
diff --git a/sources/plugins/colorbutton/lang/no.js b/sources/plugins/colorbutton/lang/no.js
new file mode 100644
index 00000000..4c415991
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/no.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'no', {
6 auto: 'Automatisk',
7 bgColorTitle: 'Bakgrunnsfarge',
8 colors: {
9 '000': 'Svart',
10 '800000': 'Rødbrun',
11 '8B4513': 'Salbrun',
12 '2F4F4F': 'Grønnsvart',
13 '008080': 'Blågrønn',
14 '000080': 'Marineblått',
15 '4B0082': 'Indigo',
16 '696969': 'Mørk grå',
17 B22222: 'Mørkerød',
18 A52A2A: 'Brun',
19 DAA520: 'Lys brun',
20 '006400': 'Mørk grønn',
21 '40E0D0': 'Turkis',
22 '0000CD': 'Medium blå',
23 '800080': 'Purpur',
24 '808080': 'Grå',
25 F00: 'Rød',
26 FF8C00: 'Mørk oransje',
27 FFD700: 'Gull',
28 '008000': 'Grønn',
29 '0FF': 'Cyan',
30 '00F': 'Blå',
31 EE82EE: 'Fiolett',
32 A9A9A9: 'Svak grå',
33 FFA07A: 'Rosa-oransje',
34 FFA500: 'Oransje',
35 FFFF00: 'Gul',
36 '00FF00': 'Lime',
37 AFEEEE: 'Svak turkis',
38 ADD8E6: 'Lys Blå',
39 DDA0DD: 'Plomme',
40 D3D3D3: 'Lys grå',
41 FFF0F5: 'Svak lavendelrosa',
42 FAEBD7: 'Antikk-hvit',
43 FFFFE0: 'Lys gul',
44 F0FFF0: 'Honningmelon',
45 F0FFFF: 'Svakt asurblått',
46 F0F8FF: 'Svak cyan',
47 E6E6FA: 'Lavendel',
48 FFF: 'Hvit'
49 },
50 more: 'Flere farger...',
51 panelTitle: 'Farger',
52 textColorTitle: 'Tekstfarge'
53} );
diff --git a/sources/plugins/colorbutton/lang/pl.js b/sources/plugins/colorbutton/lang/pl.js
new file mode 100644
index 00000000..241ce758
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/pl.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'pl', {
6 auto: 'Automatycznie',
7 bgColorTitle: 'Kolor tła',
8 colors: {
9 '000': 'Czarny',
10 '800000': 'Kasztanowy',
11 '8B4513': 'Czekoladowy',
12 '2F4F4F': 'Ciemnografitowy',
13 '008080': 'Morski',
14 '000080': 'Granatowy',
15 '4B0082': 'Indygo',
16 '696969': 'Ciemnoszary',
17 B22222: 'Czerwień żelazowa',
18 A52A2A: 'Brązowy',
19 DAA520: 'Ciemnozłoty',
20 '006400': 'Ciemnozielony',
21 '40E0D0': 'Turkusowy',
22 '0000CD': 'Ciemnoniebieski',
23 '800080': 'Purpurowy',
24 '808080': 'Szary',
25 F00: 'Czerwony',
26 FF8C00: 'Ciemnopomarańczowy',
27 FFD700: 'Złoty',
28 '008000': 'Zielony',
29 '0FF': 'Cyjan',
30 '00F': 'Niebieski',
31 EE82EE: 'Fioletowy',
32 A9A9A9: 'Przygaszony szary',
33 FFA07A: 'Łososiowy',
34 FFA500: 'Pomarańczowy',
35 FFFF00: 'Żółty',
36 '00FF00': 'Limonkowy',
37 AFEEEE: 'Bladoturkusowy',
38 ADD8E6: 'Jasnoniebieski',
39 DDA0DD: 'Śliwkowy',
40 D3D3D3: 'Jasnoszary',
41 FFF0F5: 'Jasnolawendowy',
42 FAEBD7: 'Kremowobiały',
43 FFFFE0: 'Jasnożółty',
44 F0FFF0: 'Bladozielony',
45 F0FFFF: 'Jasnolazurowy',
46 F0F8FF: 'Jasnobłękitny',
47 E6E6FA: 'Lawendowy',
48 FFF: 'Biały'
49 },
50 more: 'Więcej kolorów...',
51 panelTitle: 'Kolory',
52 textColorTitle: 'Kolor tekstu'
53} );
diff --git a/sources/plugins/colorbutton/lang/pt-br.js b/sources/plugins/colorbutton/lang/pt-br.js
new file mode 100644
index 00000000..88b9090e
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/pt-br.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'pt-br', {
6 auto: 'Automático',
7 bgColorTitle: 'Cor do Plano de Fundo',
8 colors: {
9 '000': 'Preto',
10 '800000': 'Foquete',
11 '8B4513': 'Marrom 1',
12 '2F4F4F': 'Cinza 1',
13 '008080': 'Cerceta',
14 '000080': 'Azul Marinho',
15 '4B0082': 'Índigo',
16 '696969': 'Cinza 2',
17 B22222: 'Tijolo de Fogo',
18 A52A2A: 'Marrom 2',
19 DAA520: 'Vara Dourada',
20 '006400': 'Verde Escuro',
21 '40E0D0': 'Turquesa',
22 '0000CD': 'Azul Médio',
23 '800080': 'Roxo',
24 '808080': 'Cinza 3',
25 F00: 'Vermelho',
26 FF8C00: 'Laranja Escuro',
27 FFD700: 'Dourado',
28 '008000': 'Verde',
29 '0FF': 'Ciano',
30 '00F': 'Azul',
31 EE82EE: 'Violeta',
32 A9A9A9: 'Cinza Escuro',
33 FFA07A: 'Salmão Claro',
34 FFA500: 'Laranja',
35 FFFF00: 'Amarelo',
36 '00FF00': 'Lima',
37 AFEEEE: 'Turquesa Pálido',
38 ADD8E6: 'Azul Claro',
39 DDA0DD: 'Ameixa',
40 D3D3D3: 'Cinza Claro',
41 FFF0F5: 'Lavanda 1',
42 FAEBD7: 'Branco Antiguidade',
43 FFFFE0: 'Amarelo Claro',
44 F0FFF0: 'Orvalho',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Azul Alice',
47 E6E6FA: 'Lavanda 2',
48 FFF: 'Branco'
49 },
50 more: 'Mais Cores...',
51 panelTitle: 'Cores',
52 textColorTitle: 'Cor do Texto'
53} );
diff --git a/sources/plugins/colorbutton/lang/pt.js b/sources/plugins/colorbutton/lang/pt.js
new file mode 100644
index 00000000..c1fe458b
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/pt.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'pt', {
6 auto: 'Automático',
7 bgColorTitle: 'Cor de Fundo',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Cinza claro',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Branco velho',
43 FFFFE0: 'Amarelo claro',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'Branco'
49 },
50 more: 'Mais cores...',
51 panelTitle: 'Cores',
52 textColorTitle: 'Cor do texto'
53} );
diff --git a/sources/plugins/colorbutton/lang/ro.js b/sources/plugins/colorbutton/lang/ro.js
new file mode 100644
index 00000000..c1e7c1a0
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ro.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ro', {
6 auto: 'Automatic',
7 bgColorTitle: 'Coloarea fundalului',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Mai multe culori...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Culoarea textului'
53} );
diff --git a/sources/plugins/colorbutton/lang/ru.js b/sources/plugins/colorbutton/lang/ru.js
new file mode 100644
index 00000000..c2a017e2
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ru.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ru', {
6 auto: 'Автоматически',
7 bgColorTitle: 'Цвет фона',
8 colors: {
9 '000': 'Чёрный',
10 '800000': 'Бордовый',
11 '8B4513': 'Кожано-коричневый',
12 '2F4F4F': 'Темный синевато-серый',
13 '008080': 'Сине-зелёный',
14 '000080': 'Тёмно-синий',
15 '4B0082': 'Индиго',
16 '696969': 'Тёмно-серый',
17 B22222: 'Кирпичный',
18 A52A2A: 'Коричневый',
19 DAA520: 'Золотисто-берёзовый',
20 '006400': 'Темно-зелёный',
21 '40E0D0': 'Бирюзовый',
22 '0000CD': 'Умеренно синий',
23 '800080': 'Пурпурный',
24 '808080': 'Серый',
25 F00: 'Красный',
26 FF8C00: 'Темно-оранжевый',
27 FFD700: 'Золотистый',
28 '008000': 'Зелёный',
29 '0FF': 'Васильковый',
30 '00F': 'Синий',
31 EE82EE: 'Фиолетовый',
32 A9A9A9: 'Тускло-серый',
33 FFA07A: 'Светло-лососевый',
34 FFA500: 'Оранжевый',
35 FFFF00: 'Жёлтый',
36 '00FF00': 'Лайма',
37 AFEEEE: 'Бледно-синий',
38 ADD8E6: 'Свелто-голубой',
39 DDA0DD: 'Сливовый',
40 D3D3D3: 'Светло-серый',
41 FFF0F5: 'Розово-лавандовый',
42 FAEBD7: 'Античный белый',
43 FFFFE0: 'Светло-жёлтый',
44 F0FFF0: 'Медвяной росы',
45 F0FFFF: 'Лазурный',
46 F0F8FF: 'Бледно-голубой',
47 E6E6FA: 'Лавандовый',
48 FFF: 'Белый'
49 },
50 more: 'Ещё цвета...',
51 panelTitle: 'Цвета',
52 textColorTitle: 'Цвет текста'
53} );
diff --git a/sources/plugins/colorbutton/lang/si.js b/sources/plugins/colorbutton/lang/si.js
new file mode 100644
index 00000000..0ca3fd3e
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/si.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'si', {
6 auto: 'Automatic', // MISSING
7 bgColorTitle: 'පසුබිම් වර්ණය',
8 colors: {
9 '000': 'Black', // MISSING
10 '800000': 'Maroon', // MISSING
11 '8B4513': 'Saddle Brown', // MISSING
12 '2F4F4F': 'Dark Slate Gray', // MISSING
13 '008080': 'Teal', // MISSING
14 '000080': 'Navy', // MISSING
15 '4B0082': 'Indigo', // MISSING
16 '696969': 'Dark Gray', // MISSING
17 B22222: 'Fire Brick', // MISSING
18 A52A2A: 'Brown', // MISSING
19 DAA520: 'Golden Rod', // MISSING
20 '006400': 'Dark Green', // MISSING
21 '40E0D0': 'Turquoise', // MISSING
22 '0000CD': 'Medium Blue', // MISSING
23 '800080': 'Purple', // MISSING
24 '808080': 'Gray', // MISSING
25 F00: 'Red', // MISSING
26 FF8C00: 'Dark Orange', // MISSING
27 FFD700: 'Gold', // MISSING
28 '008000': 'Green', // MISSING
29 '0FF': 'Cyan', // MISSING
30 '00F': 'Blue', // MISSING
31 EE82EE: 'Violet', // MISSING
32 A9A9A9: 'Dim Gray', // MISSING
33 FFA07A: 'Light Salmon', // MISSING
34 FFA500: 'Orange', // MISSING
35 FFFF00: 'Yellow', // MISSING
36 '00FF00': 'Lime', // MISSING
37 AFEEEE: 'Pale Turquoise', // MISSING
38 ADD8E6: 'Light Blue', // MISSING
39 DDA0DD: 'Plum', // MISSING
40 D3D3D3: 'Light Grey', // MISSING
41 FFF0F5: 'Lavender Blush', // MISSING
42 FAEBD7: 'Antique White', // MISSING
43 FFFFE0: 'Light Yellow', // MISSING
44 F0FFF0: 'Honeydew', // MISSING
45 F0FFFF: 'Azure', // MISSING
46 F0F8FF: 'Alice Blue', // MISSING
47 E6E6FA: 'Lavender', // MISSING
48 FFF: 'White' // MISSING
49 },
50 more: 'More Colors...', // MISSING
51 panelTitle: 'වර්ණය',
52 textColorTitle: 'අක්ෂර වර්ණ'
53} );
diff --git a/sources/plugins/colorbutton/lang/sk.js b/sources/plugins/colorbutton/lang/sk.js
new file mode 100644
index 00000000..838f78eb
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/sk.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'sk', {
6 auto: 'Automaticky',
7 bgColorTitle: 'Farba pozadia',
8 colors: {
9 '000': 'Čierna',
10 '800000': 'Maroon',
11 '8B4513': 'Sedlová hnedá',
12 '2F4F4F': 'Tmavo bridlicovo sivá',
13 '008080': 'Modrozelená',
14 '000080': 'Tmavomodrá',
15 '4B0082': 'Indigo',
16 '696969': 'Tmavá sivá',
17 B22222: 'Ohňová tehlová',
18 A52A2A: 'Hnedá',
19 DAA520: 'Zlatobyľ',
20 '006400': 'Tmavá zelená',
21 '40E0D0': 'Tyrkysová',
22 '0000CD': 'Stredná modrá',
23 '800080': 'Purpurová',
24 '808080': 'Sivá',
25 F00: 'Červená',
26 FF8C00: 'Tmavá oranžová',
27 FFD700: 'Zlatá',
28 '008000': 'Zelená',
29 '0FF': 'Azúrová',
30 '00F': 'Modrá',
31 EE82EE: 'Fialová',
32 A9A9A9: 'Tmavá sivá',
33 FFA07A: 'Svetlo lososová',
34 FFA500: 'Oranžová',
35 FFFF00: 'Žltá',
36 '00FF00': 'Vápenná',
37 AFEEEE: 'Svetlo tyrkysová',
38 ADD8E6: 'Svetlo modrá',
39 DDA0DD: 'Slivková',
40 D3D3D3: 'Svetlo sivá',
41 FFF0F5: 'Levanduľovo červená',
42 FAEBD7: 'Antická biela',
43 FFFFE0: 'Svetlo žltá',
44 F0FFF0: 'Medová',
45 F0FFFF: 'Azúrová',
46 F0F8FF: 'Alicovo modrá',
47 E6E6FA: 'Levanduľová',
48 FFF: 'Biela'
49 },
50 more: 'Viac farieb...',
51 panelTitle: 'Farby',
52 textColorTitle: 'Farba textu'
53} );
diff --git a/sources/plugins/colorbutton/lang/sl.js b/sources/plugins/colorbutton/lang/sl.js
new file mode 100644
index 00000000..03ea6644
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/sl.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'sl', {
6 auto: 'Samodejno',
7 bgColorTitle: 'Barva ozadja',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Več barv...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Barva besedila'
53} );
diff --git a/sources/plugins/colorbutton/lang/sq.js b/sources/plugins/colorbutton/lang/sq.js
new file mode 100644
index 00000000..4069e335
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/sq.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'sq', {
6 auto: 'Automatik',
7 bgColorTitle: 'Ngjyra e Prapavijës',
8 colors: {
9 '000': 'E zezë',
10 '800000': 'Ngjyrë gështenjë',
11 '8B4513': 'Ngjyrë Shale Kafe',
12 '2F4F4F': 'Ngjyrë Gri të errët ardëz',
13 '008080': 'Ngjyrë bajukë',
14 '000080': 'Ngjyrë Marine',
15 '4B0082': 'Indigo',
16 '696969': 'Gri e Errët',
17 B22222: 'Tullë në Flakë',
18 A52A2A: 'Ngjytë Kafe',
19 DAA520: 'Shkop i Artë',
20 '006400': 'E Gjelbër e Errët',
21 '40E0D0': 'Ngjyrë e Bruztë',
22 '0000CD': 'E Kaltër e Mesme',
23 '800080': 'Vjollcë',
24 '808080': 'Gri',
25 F00: 'E Kuqe',
26 FF8C00: 'E Portokalltë e Errët',
27 FFD700: 'Ngjyrë Ari',
28 '008000': 'E Gjelbërt',
29 '0FF': 'Cyan',
30 '00F': 'E Kaltër',
31 EE82EE: 'Vjollcë',
32 A9A9A9: 'Gri e Zbehtë',
33 FFA07A: 'Salmon i Ndritur',
34 FFA500: 'E Portokalltë',
35 FFFF00: 'E Verdhë',
36 '00FF00': 'Ngjyrë Gëlqere',
37 AFEEEE: 'Ngjyrë e Bruztë e Zbehtë',
38 ADD8E6: 'E Kaltër e Ndritur',
39 DDA0DD: 'Ngjyrë Llokumi',
40 D3D3D3: 'Gri e Ndritur',
41 FFF0F5: 'Ngjyrë Purpur e Skuqur',
42 FAEBD7: 'E Bardhë Antike',
43 FFFFE0: 'E verdhë e Ndritur',
44 F0FFF0: 'Ngjyrë Nektari',
45 F0FFFF: 'Ngjyrë Qielli',
46 F0F8FF: 'E Kaltër Alice',
47 E6E6FA: 'Ngjyrë Purpur e Zbetë',
48 FFF: 'E bardhë'
49 },
50 more: 'Më Shumë Ngjyra...',
51 panelTitle: 'Ngjyrat',
52 textColorTitle: 'Ngjyra e Tekstit'
53} );
diff --git a/sources/plugins/colorbutton/lang/sr-latn.js b/sources/plugins/colorbutton/lang/sr-latn.js
new file mode 100644
index 00000000..b25c8ef6
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/sr-latn.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'sr-latn', {
6 auto: 'Automatski',
7 bgColorTitle: 'Boja pozadine',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Više boja...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Boja teksta'
53} );
diff --git a/sources/plugins/colorbutton/lang/sr.js b/sources/plugins/colorbutton/lang/sr.js
new file mode 100644
index 00000000..30c76dae
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/sr.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'sr', {
6 auto: 'Аутоматски',
7 bgColorTitle: 'Боја позадине',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'Више боја...',
51 panelTitle: 'Colors',
52 textColorTitle: 'Боја текста'
53} );
diff --git a/sources/plugins/colorbutton/lang/sv.js b/sources/plugins/colorbutton/lang/sv.js
new file mode 100644
index 00000000..085ef8e8
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/sv.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'sv', {
6 auto: 'Automatisk',
7 bgColorTitle: 'Bakgrundsfärg',
8 colors: {
9 '000': 'Svart',
10 '800000': 'Rödbrun',
11 '8B4513': 'Mörkbrun',
12 '2F4F4F': 'Skiffergrå',
13 '008080': 'Kricka',
14 '000080': 'Marinblå',
15 '4B0082': 'Indigo',
16 '696969': 'Mörkgrå',
17 B22222: 'Tegelsten',
18 A52A2A: 'Brun',
19 DAA520: 'Mörk guld',
20 '006400': 'Mörkgrön',
21 '40E0D0': 'Turkos',
22 '0000CD': 'Medium blå',
23 '800080': 'Lila',
24 '808080': 'Grå',
25 F00: 'Röd',
26 FF8C00: 'Mörkorange',
27 FFD700: 'Guld',
28 '008000': 'Grön',
29 '0FF': 'Turkos',
30 '00F': 'Blå',
31 EE82EE: 'Violett',
32 A9A9A9: 'Matt grå',
33 FFA07A: 'Laxrosa',
34 FFA500: 'Orange',
35 FFFF00: 'Gul',
36 '00FF00': 'Lime',
37 AFEEEE: 'Ljusturkos',
38 ADD8E6: 'Ljusblå',
39 DDA0DD: 'Plommon',
40 D3D3D3: 'Ljusgrå',
41 FFF0F5: 'Ljus lavendel',
42 FAEBD7: 'Antikvit',
43 FFFFE0: 'Ljusgul',
44 F0FFF0: 'Honungsdagg',
45 F0FFFF: 'Azurblå',
46 F0F8FF: 'Aliceblå',
47 E6E6FA: 'Lavendel',
48 FFF: 'Vit'
49 },
50 more: 'Fler färger...',
51 panelTitle: 'Färger',
52 textColorTitle: 'Textfärg'
53} );
diff --git a/sources/plugins/colorbutton/lang/th.js b/sources/plugins/colorbutton/lang/th.js
new file mode 100644
index 00000000..e3ed14c9
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/th.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'th', {
6 auto: 'สีอัตโนมัติ',
7 bgColorTitle: 'สีพื้นหลัง',
8 colors: {
9 '000': 'Black',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Brown',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Gray',
25 F00: 'Red',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Gold',
28 '008000': 'Green',
29 '0FF': 'Cyan',
30 '00F': 'Blue',
31 EE82EE: 'Violet',
32 A9A9A9: 'Dim Gray',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Orange',
35 FFFF00: 'Yellow',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'White'
49 },
50 more: 'เลือกสีอื่นๆ...',
51 panelTitle: 'Colors',
52 textColorTitle: 'สีตัวอักษร'
53} );
diff --git a/sources/plugins/colorbutton/lang/tr.js b/sources/plugins/colorbutton/lang/tr.js
new file mode 100644
index 00000000..7558fd15
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/tr.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'tr', {
6 auto: 'Otomatik',
7 bgColorTitle: 'Arka Renk',
8 colors: {
9 '000': 'Siyah',
10 '800000': 'Kestane',
11 '8B4513': 'Koyu Kahverengi',
12 '2F4F4F': 'Koyu Kurşuni Gri',
13 '008080': 'Teal',
14 '000080': 'Mavi',
15 '4B0082': 'Çivit Mavisi',
16 '696969': 'Silik Gri',
17 B22222: 'Ateş Tuğlası',
18 A52A2A: 'Kahverengi',
19 DAA520: 'Altun Sırık',
20 '006400': 'Koyu Yeşil',
21 '40E0D0': 'Turkuaz',
22 '0000CD': 'Orta Mavi',
23 '800080': 'Pembe',
24 '808080': 'Gri',
25 F00: 'Kırmızı',
26 FF8C00: 'Koyu Portakal',
27 FFD700: 'Altın',
28 '008000': 'Yeşil',
29 '0FF': 'Ciyan',
30 '00F': 'Mavi',
31 EE82EE: 'Menekşe',
32 A9A9A9: 'Koyu Gri',
33 FFA07A: 'Açık Sarımsı',
34 FFA500: 'Portakal',
35 FFFF00: 'Sarı',
36 '00FF00': 'Açık Yeşil',
37 AFEEEE: 'Sönük Turkuaz',
38 ADD8E6: 'Açık Mavi',
39 DDA0DD: 'Mor',
40 D3D3D3: 'Açık Gri',
41 FFF0F5: 'Eflatun Pembe',
42 FAEBD7: 'Antik Beyaz',
43 FFFFE0: 'Açık Sarı',
44 F0FFF0: 'Balsarısı',
45 F0FFFF: 'Gök Mavisi',
46 F0F8FF: 'Reha Mavi',
47 E6E6FA: 'Eflatun',
48 FFF: 'Beyaz'
49 },
50 more: 'Diğer renkler...',
51 panelTitle: 'Renkler',
52 textColorTitle: 'Yazı Rengi'
53} );
diff --git a/sources/plugins/colorbutton/lang/tt.js b/sources/plugins/colorbutton/lang/tt.js
new file mode 100644
index 00000000..e294a07d
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/tt.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'tt', {
6 auto: 'Автоматик',
7 bgColorTitle: 'Фон төсе',
8 colors: {
9 '000': 'Кара',
10 '800000': 'Бордо',
11 '8B4513': 'Дарчин',
12 '2F4F4F': 'Аспид соры',
13 '008080': 'Күкле-яшелле',
14 '000080': 'Куе күк',
15 '4B0082': 'Индиго',
16 '696969': 'Куе соры',
17 B22222: 'Кармин',
18 A52A2A: 'Чия кызыл',
19 DAA520: 'Алтын каен',
20 '006400': 'Үлән',
21 '40E0D0': 'Фирәзә',
22 '0000CD': 'Фарсы күк',
23 '800080': 'Шәмәхә',
24 '808080': 'Соры',
25 F00: 'Кызыл',
26 FF8C00: 'Кабак',
27 FFD700: 'Алтын',
28 '008000': 'Яшел',
29 '0FF': 'Ачык зәңгәр',
30 '00F': 'Зәңгәр',
31 EE82EE: 'Миләүшә',
32 A9A9A9: 'Ачык соры',
33 FFA07A: 'Кызгылт сары алсу',
34 FFA500: 'Кызгылт сары',
35 FFFF00: 'Сары',
36 '00FF00': 'Лайм',
37 AFEEEE: 'Тонык күк',
38 ADD8E6: 'Тонык күкбаш',
39 DDA0DD: 'Аксыл шәмәхә',
40 D3D3D3: 'Ачык соры',
41 FFF0F5: 'Ал ала миләүшә',
42 FAEBD7: 'Җитен',
43 FFFFE0: 'Ачык сары',
44 F0FFF0: 'Аксыл көрән',
45 F0FFFF: 'Ап-ак',
46 F0F8FF: 'Аксыл зәңгәр диңгез',
47 E6E6FA: 'Ала миләүшә',
48 FFF: 'Ак'
49 },
50 more: 'Башка төсләр...',
51 panelTitle: 'Төсләр',
52 textColorTitle: 'Текст төсе'
53} );
diff --git a/sources/plugins/colorbutton/lang/ug.js b/sources/plugins/colorbutton/lang/ug.js
new file mode 100644
index 00000000..4bfdee5f
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/ug.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'ug', {
6 auto: 'ئۆزلۈكىدىن',
7 bgColorTitle: 'تەگلىك رەڭگى',
8 colors: {
9 '000': 'قارا',
10 '800000': 'قىزغۇچ سېرىق',
11 '8B4513': 'توق قوڭۇر',
12 '2F4F4F': 'قارامتۇل يېشىل',
13 '008080': 'كۆكۈش يېشىل',
14 '000080': 'قارامتۇل كۆك',
15 '4B0082': 'كۆكۈش كۈلرەڭ',
16 '696969': 'قارامتۇل كۈلرەڭ',
17 B22222: 'خىش قىزىل',
18 A52A2A: 'قوڭۇر',
19 DAA520: 'ئالتۇن سېرىق',
20 '006400': 'توق يېشىل',
21 '40E0D0': 'كۆكۈچ يېشىل',
22 '0000CD': 'ئوتتۇراھال كۆك',
23 '800080': 'بىنەپشە',
24 '808080': 'كۈلرەڭ',
25 F00: 'قىزىل',
26 FF8C00: 'توق قىزغۇچ سېرىق',
27 FFD700: 'ئالتۇن',
28 '008000': 'يېشىل',
29 '0FF': 'يېشىل كۆك',
30 '00F': 'كۆك',
31 EE82EE: 'قىزغۇچ بىنەپشە',
32 A9A9A9: 'توق كۈلرەڭ',
33 FFA07A: 'كاۋا چېچىكى سېرىق',
34 FFA500: 'قىزغۇچ سېرىق',
35 FFFF00: 'سېرىق',
36 '00FF00': 'Lime',
37 AFEEEE: 'سۇس ھاۋا رەڭ',
38 ADD8E6: 'ئوچۇق كۆك',
39 DDA0DD: 'قىزغۇچ بىنەپشە',
40 D3D3D3: 'سۇس كۆكۈچ كۈلرەڭ',
41 FFF0F5: 'سۇس قىزغۇچ بىنەپشە',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'سۇس سېرىق',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'ئاسمان كۆكى',
46 F0F8FF: 'سۇس كۆك',
47 E6E6FA: 'سۇس بىنەپشە',
48 FFF: 'ئاق'
49 },
50 more: 'باشقا رەڭ',
51 panelTitle: 'رەڭ',
52 textColorTitle: 'تېكىست رەڭگى'
53} );
diff --git a/sources/plugins/colorbutton/lang/uk.js b/sources/plugins/colorbutton/lang/uk.js
new file mode 100644
index 00000000..0b51083e
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/uk.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'uk', {
6 auto: 'Авто',
7 bgColorTitle: 'Колір фону',
8 colors: {
9 '000': 'Чорний',
10 '800000': 'Бордовий',
11 '8B4513': 'Коричневий',
12 '2F4F4F': 'Темний сіро-зелений',
13 '008080': 'Морської хвилі',
14 '000080': 'Сливовий',
15 '4B0082': 'Індиго',
16 '696969': 'Темносірий',
17 B22222: 'Темночервоний',
18 A52A2A: 'Каштановий',
19 DAA520: 'Бежевий',
20 '006400': 'Темнозелений',
21 '40E0D0': 'Бірюзовий',
22 '0000CD': 'Темносиній',
23 '800080': 'Пурпурний',
24 '808080': 'Сірий',
25 F00: 'Червоний',
26 FF8C00: 'Темнооранжевий',
27 FFD700: 'Жовтий',
28 '008000': 'Зелений',
29 '0FF': 'Синьо-зелений',
30 '00F': 'Синій',
31 EE82EE: 'Фіолетовий',
32 A9A9A9: 'Світлосірий',
33 FFA07A: 'Рожевий',
34 FFA500: 'Оранжевий',
35 FFFF00: 'Яскравожовтий',
36 '00FF00': 'Салатовий',
37 AFEEEE: 'Світлобірюзовий',
38 ADD8E6: 'Блакитний',
39 DDA0DD: 'Світлофіолетовий',
40 D3D3D3: 'Сріблястий',
41 FFF0F5: 'Світлорожевий',
42 FAEBD7: 'Світлооранжевий',
43 FFFFE0: 'Світложовтий',
44 F0FFF0: 'Світлозелений',
45 F0FFFF: 'Світлий синьо-зелений',
46 F0F8FF: 'Світлоблакитний',
47 E6E6FA: 'Лавандовий',
48 FFF: 'Білий'
49 },
50 more: 'Кольори...',
51 panelTitle: 'Кольори',
52 textColorTitle: 'Колір тексту'
53} );
diff --git a/sources/plugins/colorbutton/lang/vi.js b/sources/plugins/colorbutton/lang/vi.js
new file mode 100644
index 00000000..1f9e3e04
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/vi.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'vi', {
6 auto: 'Tự động',
7 bgColorTitle: 'Màu nền',
8 colors: {
9 '000': 'Đen',
10 '800000': 'Maroon',
11 '8B4513': 'Saddle Brown',
12 '2F4F4F': 'Dark Slate Gray',
13 '008080': 'Teal',
14 '000080': 'Navy',
15 '4B0082': 'Indigo',
16 '696969': 'Dark Gray',
17 B22222: 'Fire Brick',
18 A52A2A: 'Nâu',
19 DAA520: 'Golden Rod',
20 '006400': 'Dark Green',
21 '40E0D0': 'Turquoise',
22 '0000CD': 'Medium Blue',
23 '800080': 'Purple',
24 '808080': 'Xám',
25 F00: 'Đỏ',
26 FF8C00: 'Dark Orange',
27 FFD700: 'Vàng',
28 '008000': 'Xanh lá cây',
29 '0FF': 'Cyan',
30 '00F': 'Xanh da trời',
31 EE82EE: 'Tím',
32 A9A9A9: 'Xám tối',
33 FFA07A: 'Light Salmon',
34 FFA500: 'Màu cam',
35 FFFF00: 'Vàng',
36 '00FF00': 'Lime',
37 AFEEEE: 'Pale Turquoise',
38 ADD8E6: 'Light Blue',
39 DDA0DD: 'Plum',
40 D3D3D3: 'Light Grey',
41 FFF0F5: 'Lavender Blush',
42 FAEBD7: 'Antique White',
43 FFFFE0: 'Light Yellow',
44 F0FFF0: 'Honeydew',
45 F0FFFF: 'Azure',
46 F0F8FF: 'Alice Blue',
47 E6E6FA: 'Lavender',
48 FFF: 'Trắng'
49 },
50 more: 'Màu khác...',
51 panelTitle: 'Màu sắc',
52 textColorTitle: 'Màu chữ'
53} );
diff --git a/sources/plugins/colorbutton/lang/zh-cn.js b/sources/plugins/colorbutton/lang/zh-cn.js
new file mode 100644
index 00000000..a139da6e
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/zh-cn.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'zh-cn', {
6 auto: '自动',
7 bgColorTitle: '背景颜色',
8 colors: {
9 '000': '黑',
10 '800000': '褐红',
11 '8B4513': '深褐',
12 '2F4F4F': '墨绿',
13 '008080': '绿松石',
14 '000080': '海军蓝',
15 '4B0082': '靛蓝',
16 '696969': '暗灰',
17 B22222: '砖红',
18 A52A2A: '褐',
19 DAA520: '金黄',
20 '006400': '深绿',
21 '40E0D0': '蓝绿',
22 '0000CD': '中蓝',
23 '800080': '紫',
24 '808080': '灰',
25 F00: '红',
26 FF8C00: '深橙',
27 FFD700: '金',
28 '008000': '绿',
29 '0FF': '青',
30 '00F': '蓝',
31 EE82EE: '紫罗兰',
32 A9A9A9: '深灰',
33 FFA07A: '亮橙',
34 FFA500: '橙',
35 FFFF00: '黄',
36 '00FF00': '水绿',
37 AFEEEE: '粉蓝',
38 ADD8E6: '亮蓝',
39 DDA0DD: '梅红',
40 D3D3D3: '淡灰',
41 FFF0F5: '淡紫红',
42 FAEBD7: '古董白',
43 FFFFE0: '淡黄',
44 F0FFF0: '蜜白',
45 F0FFFF: '天蓝',
46 F0F8FF: '淡蓝',
47 E6E6FA: '淡紫',
48 FFF: '白'
49 },
50 more: '其它颜色...',
51 panelTitle: '颜色',
52 textColorTitle: '文本颜色'
53} );
diff --git a/sources/plugins/colorbutton/lang/zh.js b/sources/plugins/colorbutton/lang/zh.js
new file mode 100644
index 00000000..68d15952
--- /dev/null
+++ b/sources/plugins/colorbutton/lang/zh.js
@@ -0,0 +1,53 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colorbutton', 'zh', {
6 auto: '自動',
7 bgColorTitle: '背景顏色',
8 colors: {
9 '000': '黑色',
10 '800000': '栗色',
11 '8B4513': '鞍褐色',
12 '2F4F4F': '暗瓦灰色',
13 '008080': '水壓色',
14 '000080': '丈青澀',
15 '4B0082': '靛青',
16 '696969': '深灰色',
17 B22222: '磚紅色',
18 A52A2A: '褐色',
19 DAA520: '金黃色',
20 '006400': '深綠色',
21 '40E0D0': '青綠色',
22 '0000CD': '藍色',
23 '800080': '紫色',
24 '808080': '灰色',
25 F00: '紅色',
26 FF8C00: '深橘色',
27 FFD700: '金色',
28 '008000': '綠色',
29 '0FF': '藍綠色',
30 '00F': '藍色',
31 EE82EE: '紫色',
32 A9A9A9: '暗灰色',
33 FFA07A: '亮鮭紅',
34 FFA500: '橘色',
35 FFFF00: '黃色',
36 '00FF00': '鮮綠色',
37 AFEEEE: '綠松色',
38 ADD8E6: '淺藍色',
39 DDA0DD: '枚紅色',
40 D3D3D3: '淺灰色',
41 FFF0F5: '淺紫色',
42 FAEBD7: '骨董白',
43 FFFFE0: '淺黃色',
44 F0FFF0: '蜜瓜綠',
45 F0FFFF: '天藍色',
46 F0F8FF: '愛麗斯蘭',
47 E6E6FA: '淺紫色',
48 FFF: '白色'
49 },
50 more: '更多顏色',
51 panelTitle: '顏色',
52 textColorTitle: '文字顏色'
53} );
diff --git a/sources/plugins/colorbutton/plugin.js b/sources/plugins/colorbutton/plugin.js
new file mode 100644
index 00000000..131e2cb0
--- /dev/null
+++ b/sources/plugins/colorbutton/plugin.js
@@ -0,0 +1,301 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "colorbutton" plugin that makes it possible to assign
8 * text and background colors to editor contents.
9 *
10 */
11CKEDITOR.plugins.add( 'colorbutton', {
12 requires: 'panelbutton,floatpanel',
13 // jscs:disable maximumLineLength
14 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
15 // jscs:enable maximumLineLength
16 icons: 'bgcolor,textcolor', // %REMOVE_LINE_CORE%
17 hidpi: true, // %REMOVE_LINE_CORE%
18 init: function( editor ) {
19 var config = editor.config,
20 lang = editor.lang.colorbutton;
21
22 if ( !CKEDITOR.env.hc ) {
23 addButton( 'TextColor', 'fore', lang.textColorTitle, 10 );
24 addButton( 'BGColor', 'back', lang.bgColorTitle, 20 );
25 }
26
27 function addButton( name, type, title, order ) {
28 var style = new CKEDITOR.style( config[ 'colorButton_' + type + 'Style' ] ),
29 colorBoxId = CKEDITOR.tools.getNextId() + '_colorBox';
30
31 editor.ui.add( name, CKEDITOR.UI_PANELBUTTON, {
32 label: title,
33 title: title,
34 modes: { wysiwyg: 1 },
35 editorFocus: 0,
36 toolbar: 'colors,' + order,
37 allowedContent: style,
38 requiredContent: style,
39
40 panel: {
41 css: CKEDITOR.skin.getPath( 'editor' ),
42 attributes: { role: 'listbox', 'aria-label': lang.panelTitle }
43 },
44
45 onBlock: function( panel, block ) {
46 block.autoSize = true;
47 block.element.addClass( 'cke_colorblock' );
48 block.element.setHtml( renderColors( panel, type, colorBoxId ) );
49 // The block should not have scrollbars (#5933, #6056)
50 block.element.getDocument().getBody().setStyle( 'overflow', 'hidden' );
51
52 CKEDITOR.ui.fire( 'ready', this );
53
54 var keys = block.keys;
55 var rtl = editor.lang.dir == 'rtl';
56 keys[ rtl ? 37 : 39 ] = 'next'; // ARROW-RIGHT
57 keys[ 40 ] = 'next'; // ARROW-DOWN
58 keys[ 9 ] = 'next'; // TAB
59 keys[ rtl ? 39 : 37 ] = 'prev'; // ARROW-LEFT
60 keys[ 38 ] = 'prev'; // ARROW-UP
61 keys[ CKEDITOR.SHIFT + 9 ] = 'prev'; // SHIFT + TAB
62 keys[ 32 ] = 'click'; // SPACE
63 },
64
65 refresh: function() {
66 if ( !editor.activeFilter.check( style ) )
67 this.setState( CKEDITOR.TRISTATE_DISABLED );
68 },
69
70 // The automatic colorbox should represent the real color (#6010)
71 onOpen: function() {
72
73 var selection = editor.getSelection(),
74 block = selection && selection.getStartElement(),
75 path = editor.elementPath( block ),
76 color;
77
78 if ( !path )
79 return;
80
81 // Find the closest block element.
82 block = path.block || path.blockLimit || editor.document.getBody();
83
84 // The background color might be transparent. In that case, look up the color in the DOM tree.
85 do {
86 color = block && block.getComputedStyle( type == 'back' ? 'background-color' : 'color' ) || 'transparent';
87 }
88 while ( type == 'back' && color == 'transparent' && block && ( block = block.getParent() ) );
89
90 // The box should never be transparent.
91 if ( !color || color == 'transparent' )
92 color = '#ffffff';
93
94 this._.panel._.iframe.getFrameDocument().getById( colorBoxId ).setStyle( 'background-color', color );
95
96 return color;
97 }
98 } );
99 }
100
101 function renderColors( panel, type, colorBoxId ) {
102 var output = [],
103 colors = config.colorButton_colors.split( ',' ),
104 // Tells if we should include "More Colors..." button.
105 moreColorsEnabled = editor.plugins.colordialog && config.colorButton_enableMore !== false,
106 // aria-setsize and aria-posinset attributes are used to indicate size of options, because
107 // screen readers doesn't play nice with table, based layouts (#12097).
108 total = colors.length + ( moreColorsEnabled ? 2 : 1 );
109
110 var clickFn = CKEDITOR.tools.addFunction( function( color, type ) {
111 var applyColorStyle = arguments.callee;
112 function onColorDialogClose( evt ) {
113 this.removeListener( 'ok', onColorDialogClose );
114 this.removeListener( 'cancel', onColorDialogClose );
115
116 evt.name == 'ok' && applyColorStyle( this.getContentElement( 'picker', 'selectedColor' ).getValue(), type );
117 }
118
119 if ( color == '?' ) {
120 editor.openDialog( 'colordialog', function() {
121 this.on( 'ok', onColorDialogClose );
122 this.on( 'cancel', onColorDialogClose );
123 } );
124
125 return;
126 }
127
128 editor.focus();
129
130 panel.hide();
131
132 editor.fire( 'saveSnapshot' );
133
134 // Clean up any conflicting style within the range.
135 editor.removeStyle( new CKEDITOR.style( config[ 'colorButton_' + type + 'Style' ], { color: 'inherit' } ) );
136
137 if ( color ) {
138 var colorStyle = config[ 'colorButton_' + type + 'Style' ];
139
140 colorStyle.childRule = type == 'back' ?
141 function( element ) {
142 // It's better to apply background color as the innermost style. (#3599)
143 // Except for "unstylable elements". (#6103)
144 return isUnstylable( element );
145 } : function( element ) {
146 // Fore color style must be applied inside links instead of around it. (#4772,#6908)
147 return !( element.is( 'a' ) || element.getElementsByTag( 'a' ).count() ) || isUnstylable( element );
148 };
149
150 editor.applyStyle( new CKEDITOR.style( colorStyle, { color: color } ) );
151 }
152
153 editor.fire( 'saveSnapshot' );
154 } );
155
156 // Render the "Automatic" button.
157 output.push( '<a class="cke_colorauto" _cke_focus=1 hidefocus=true' +
158 ' title="', lang.auto, '"' +
159 ' onclick="CKEDITOR.tools.callFunction(', clickFn, ',null,\'', type, '\');return false;"' +
160 ' href="javascript:void(\'', lang.auto, '\')"' +
161 ' role="option" aria-posinset="1" aria-setsize="', total, '">' +
162 '<table role="presentation" cellspacing=0 cellpadding=0 width="100%">' +
163 '<tr>' +
164 '<td>' +
165 '<span class="cke_colorbox" id="', colorBoxId, '"></span>' +
166 '</td>' +
167 '<td colspan=7 align=center>', lang.auto, '</td>' +
168 '</tr>' +
169 '</table>' +
170 '</a>' +
171 '<table role="presentation" cellspacing=0 cellpadding=0 width="100%">' );
172
173 // Render the color boxes.
174 for ( var i = 0; i < colors.length; i++ ) {
175 if ( ( i % 8 ) === 0 )
176 output.push( '</tr><tr>' );
177
178 var parts = colors[ i ].split( '/' ),
179 colorName = parts[ 0 ],
180 colorCode = parts[ 1 ] || colorName;
181
182 // The data can be only a color code (without #) or colorName + color code
183 // If only a color code is provided, then the colorName is the color with the hash
184 // Convert the color from RGB to RRGGBB for better compatibility with IE and <font>. See #5676
185 if ( !parts[ 1 ] )
186 colorName = '#' + colorName.replace( /^(.)(.)(.)$/, '$1$1$2$2$3$3' );
187
188 var colorLabel = editor.lang.colorbutton.colors[ colorCode ] || colorCode;
189 output.push( '<td>' +
190 '<a class="cke_colorbox" _cke_focus=1 hidefocus=true' +
191 ' title="', colorLabel, '"' +
192 ' onclick="CKEDITOR.tools.callFunction(', clickFn, ',\'', colorName, '\',\'', type, '\'); return false;"' +
193 ' href="javascript:void(\'', colorLabel, '\')"' +
194 ' role="option" aria-posinset="', ( i + 2 ), '" aria-setsize="', total, '">' +
195 '<span class="cke_colorbox" style="background-color:#', colorCode, '"></span>' +
196 '</a>' +
197 '</td>' );
198 }
199
200 // Render the "More Colors" button.
201 if ( moreColorsEnabled ) {
202 output.push( '</tr>' +
203 '<tr>' +
204 '<td colspan=8 align=center>' +
205 '<a class="cke_colormore" _cke_focus=1 hidefocus=true' +
206 ' title="', lang.more, '"' +
207 ' onclick="CKEDITOR.tools.callFunction(', clickFn, ',\'?\',\'', type, '\');return false;"' +
208 ' href="javascript:void(\'', lang.more, '\')"', ' role="option" aria-posinset="', total, '" aria-setsize="', total, '">', lang.more, '</a>' +
209 '</td>' ); // tr is later in the code.
210 }
211
212 output.push( '</tr></table>' );
213
214 return output.join( '' );
215 }
216
217 function isUnstylable( ele ) {
218 return ( ele.getAttribute( 'contentEditable' ) == 'false' ) || ele.getAttribute( 'data-nostyle' );
219 }
220 }
221} );
222
223/**
224 * Whether to enable the **More Colors*** button in the color selectors.
225 *
226 * Read more in the [documentation](#!/guide/dev_colorbutton)
227 * and see the [SDK sample](http://sdk.ckeditor.com/samples/colorbutton.html).
228 *
229 * config.colorButton_enableMore = false;
230 *
231 * @cfg {Boolean} [colorButton_enableMore=true]
232 * @member CKEDITOR.config
233 */
234
235/**
236 * Defines the colors to be displayed in the color selectors. This is a string
237 * containing hexadecimal notation for HTML colors, without the `'#'` prefix.
238 *
239 * **Since 3.3:** A color name may optionally be defined by prefixing the entries with
240 * a name and the slash character. For example, `'FontColor1/FF9900'` will be
241 * displayed as the color `#FF9900` in the selector, but will be output as `'FontColor1'`.
242 *
243 * Read more in the [documentation](#!/guide/dev_colorbutton)
244 * and see the [SDK sample](http://sdk.ckeditor.com/samples/colorbutton.html).
245 *
246 * // Brazil colors only.
247 * config.colorButton_colors = '00923E,F8C100,28166F';
248 *
249 * config.colorButton_colors = 'FontColor1/FF9900,FontColor2/0066CC,FontColor3/F00';
250 *
251 * @cfg {String} [colorButton_colors=see source]
252 * @member CKEDITOR.config
253 */
254CKEDITOR.config.colorButton_colors = '000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,' +
255 'B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,' +
256 'F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,' +
257 'FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,' +
258 'FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';
259
260/**
261 * Stores the style definition that applies the text foreground color.
262 *
263 * Read more in the [documentation](#!/guide/dev_colorbutton)
264 * and see the [SDK sample](http://sdk.ckeditor.com/samples/colorbutton.html).
265 *
266 * // This is actually the default value.
267 * config.colorButton_foreStyle = {
268 * element: 'span',
269 * styles: { color: '#(color)' }
270 * };
271 *
272 * @cfg [colorButton_foreStyle=see source]
273 * @member CKEDITOR.config
274 */
275CKEDITOR.config.colorButton_foreStyle = {
276 element: 'span',
277 styles: { 'color': '#(color)' },
278 overrides: [ {
279 element: 'font', attributes: { 'color': null }
280 } ]
281};
282
283/**
284 * Stores the style definition that applies the text background color.
285 *
286 * Read more in the [documentation](#!/guide/dev_colorbutton)
287 * and see the [SDK sample](http://sdk.ckeditor.com/samples/colorbutton.html).
288 *
289 * // This is actually the default value.
290 * config.colorButton_backStyle = {
291 * element: 'span',
292 * styles: { 'background-color': '#(color)' }
293 * };
294 *
295 * @cfg [colorButton_backStyle=see source]
296 * @member CKEDITOR.config
297 */
298CKEDITOR.config.colorButton_backStyle = {
299 element: 'span',
300 styles: { 'background-color': '#(color)' }
301};
diff --git a/sources/plugins/colordialog/dialogs/colordialog.js b/sources/plugins/colordialog/dialogs/colordialog.js
new file mode 100644
index 00000000..f5ecd483
--- /dev/null
+++ b/sources/plugins/colordialog/dialogs/colordialog.js
@@ -0,0 +1,327 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'colordialog', function( editor ) {
7 // Define some shorthands.
8 var $el = CKEDITOR.dom.element,
9 $doc = CKEDITOR.document,
10 lang = editor.lang.colordialog;
11
12 // Reference the dialog.
13 var dialog;
14
15 var spacer = {
16 type: 'html',
17 html: '&nbsp;'
18 };
19
20 var selected;
21
22 function clearSelected() {
23 $doc.getById( selHiColorId ).removeStyle( 'background-color' );
24 dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' );
25 selected && selected.removeAttribute( 'aria-selected' );
26 selected = null;
27 }
28
29 function updateSelected( evt ) {
30 var target = evt.data.getTarget(),
31 color;
32
33 if ( target.getName() == 'td' && ( color = target.getChild( 0 ).getHtml() ) ) {
34 selected = target;
35 selected.setAttribute( 'aria-selected', true );
36 dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color );
37 }
38 }
39
40 // Basing black-white decision off of luma scheme using the Rec. 709 version
41 function whiteOrBlack( color ) {
42 color = color.replace( /^#/, '' );
43 for ( var i = 0, rgb = []; i <= 2; i++ )
44 rgb[ i ] = parseInt( color.substr( i * 2, 2 ), 16 );
45 var luma = ( 0.2126 * rgb[ 0 ] ) + ( 0.7152 * rgb[ 1 ] ) + ( 0.0722 * rgb[ 2 ] );
46 return '#' + ( luma >= 165 ? '000' : 'fff' );
47 }
48
49 // Distinguish focused and hover states.
50 var focused, hovered;
51
52 // Apply highlight style.
53 function updateHighlight( event ) {
54 // Convert to event.
55 !event.name && ( event = new CKEDITOR.event( event ) );
56
57 var isFocus = !( /mouse/ ).test( event.name ),
58 target = event.data.getTarget(),
59 color;
60
61 if ( target.getName() == 'td' && ( color = target.getChild( 0 ).getHtml() ) ) {
62 removeHighlight( event );
63
64 isFocus ? focused = target : hovered = target;
65
66 // Apply outline style to show focus.
67 if ( isFocus ) {
68 target.setStyle( 'border-color', whiteOrBlack( color ) );
69 target.setStyle( 'border-style', 'dotted' );
70 }
71
72 $doc.getById( hicolorId ).setStyle( 'background-color', color );
73 $doc.getById( hicolorTextId ).setHtml( color );
74 }
75 }
76
77 function clearHighlight() {
78 var color = focused.getChild( 0 ).getHtml();
79 focused.setStyle( 'border-color', color );
80 focused.setStyle( 'border-style', 'solid' );
81 $doc.getById( hicolorId ).removeStyle( 'background-color' );
82 $doc.getById( hicolorTextId ).setHtml( '&nbsp;' );
83 focused = null;
84 }
85
86 // Remove previously focused style.
87 function removeHighlight( event ) {
88 var isFocus = !( /mouse/ ).test( event.name ),
89 target = isFocus && focused;
90
91 if ( target ) {
92 var color = target.getChild( 0 ).getHtml();
93 target.setStyle( 'border-color', color );
94 target.setStyle( 'border-style', 'solid' );
95 }
96
97 if ( !( focused || hovered ) ) {
98 $doc.getById( hicolorId ).removeStyle( 'background-color' );
99 $doc.getById( hicolorTextId ).setHtml( '&nbsp;' );
100 }
101 }
102
103 function onKeyStrokes( evt ) {
104 var domEvt = evt.data;
105
106 var element = domEvt.getTarget();
107 var relative, nodeToMove;
108 var keystroke = domEvt.getKeystroke(),
109 rtl = editor.lang.dir == 'rtl';
110
111 switch ( keystroke ) {
112 // UP-ARROW
113 case 38:
114 // relative is TR
115 if ( ( relative = element.getParent().getPrevious() ) ) {
116 nodeToMove = relative.getChild( [ element.getIndex() ] );
117 nodeToMove.focus();
118 }
119 domEvt.preventDefault();
120 break;
121 // DOWN-ARROW
122 case 40:
123 // relative is TR
124 if ( ( relative = element.getParent().getNext() ) ) {
125 nodeToMove = relative.getChild( [ element.getIndex() ] );
126 if ( nodeToMove && nodeToMove.type == 1 )
127 nodeToMove.focus();
128
129 }
130 domEvt.preventDefault();
131 break;
132
133 // SPACE
134 // ENTER
135 case 32:
136 case 13:
137 updateSelected( evt );
138 domEvt.preventDefault();
139 break;
140
141 // RIGHT-ARROW
142 case rtl ? 37 : 39:
143 // relative is TD
144 if ( ( nodeToMove = element.getNext() ) ) {
145 if ( nodeToMove.type == 1 ) {
146 nodeToMove.focus();
147 domEvt.preventDefault( true );
148 }
149 }
150 // relative is TR
151 else if ( ( relative = element.getParent().getNext() ) ) {
152 nodeToMove = relative.getChild( [ 0 ] );
153 if ( nodeToMove && nodeToMove.type == 1 ) {
154 nodeToMove.focus();
155 domEvt.preventDefault( true );
156 }
157 }
158 break;
159
160 // LEFT-ARROW
161 case rtl ? 39 : 37:
162 // relative is TD
163 if ( ( nodeToMove = element.getPrevious() ) ) {
164 nodeToMove.focus();
165 domEvt.preventDefault( true );
166 }
167 // relative is TR
168 else if ( ( relative = element.getParent().getPrevious() ) ) {
169 nodeToMove = relative.getLast();
170 nodeToMove.focus();
171 domEvt.preventDefault( true );
172 }
173 break;
174 default:
175 // Do not stop not handled events.
176 return;
177 }
178 }
179
180 function createColorTable() {
181 table = CKEDITOR.dom.element.createFromHtml( '<table tabIndex="-1" aria-label="' + lang.options + '"' +
182 ' role="grid" style="border-collapse:separate;" cellspacing="0">' +
183 '<caption class="cke_voice_label">' + lang.options + '</caption>' +
184 '<tbody role="presentation"></tbody></table>' );
185
186 table.on( 'mouseover', updateHighlight );
187 table.on( 'mouseout', removeHighlight );
188
189 // Create the base colors array.
190 var aColors = [ '00', '33', '66', '99', 'cc', 'ff' ];
191
192 // This function combines two ranges of three values from the color array into a row.
193 function appendColorRow( rangeA, rangeB ) {
194 for ( var i = rangeA; i < rangeA + 3; i++ ) {
195 var row = new $el( table.$.insertRow( -1 ) );
196 row.setAttribute( 'role', 'row' );
197
198 for ( var j = rangeB; j < rangeB + 3; j++ ) {
199 for ( var n = 0; n < 6; n++ ) {
200 appendColorCell( row.$, '#' + aColors[ j ] + aColors[ n ] + aColors[ i ] );
201 }
202 }
203 }
204 }
205
206 // This function create a single color cell in the color table.
207 function appendColorCell( targetRow, color ) {
208 var cell = new $el( targetRow.insertCell( -1 ) );
209 cell.setAttribute( 'class', 'ColorCell' );
210 cell.setAttribute( 'tabIndex', -1 );
211 cell.setAttribute( 'role', 'gridcell' );
212
213 cell.on( 'keydown', onKeyStrokes );
214 cell.on( 'click', updateSelected );
215 cell.on( 'focus', updateHighlight );
216 cell.on( 'blur', removeHighlight );
217
218 cell.setStyle( 'background-color', color );
219 cell.setStyle( 'border', '1px solid ' + color );
220
221 cell.setStyle( 'width', '14px' );
222 cell.setStyle( 'height', '14px' );
223
224 var colorLabel = numbering( 'color_table_cell' );
225 cell.setAttribute( 'aria-labelledby', colorLabel );
226 cell.append( CKEDITOR.dom.element.createFromHtml( '<span id="' + colorLabel + '" class="cke_voice_label">' + color + '</span>', CKEDITOR.document ) );
227 }
228
229 appendColorRow( 0, 0 );
230 appendColorRow( 3, 0 );
231 appendColorRow( 0, 3 );
232 appendColorRow( 3, 3 );
233
234 // Create the last row.
235 var oRow = new $el( table.$.insertRow( -1 ) );
236 oRow.setAttribute( 'role', 'row' );
237
238 // Create the gray scale colors cells.
239 appendColorCell( oRow.$, '#000000' );
240 for ( var n = 0; n < 16; n++ ) {
241 var c = n.toString( 16 );
242 appendColorCell( oRow.$, '#' + c + c + c + c + c + c );
243 }
244 appendColorCell( oRow.$, '#ffffff' );
245 }
246
247 var numbering = function( id ) {
248 return CKEDITOR.tools.getNextId() + '_' + id;
249 },
250 hicolorId = numbering( 'hicolor' ),
251 hicolorTextId = numbering( 'hicolortext' ),
252 selHiColorId = numbering( 'selhicolor' ),
253 table;
254
255 createColorTable();
256
257 return {
258 title: lang.title,
259 minWidth: 360,
260 minHeight: 220,
261 onLoad: function() {
262 // Update reference.
263 dialog = this;
264 },
265 onHide: function() {
266 clearSelected();
267 clearHighlight();
268 },
269 contents: [ {
270 id: 'picker',
271 label: lang.title,
272 accessKey: 'I',
273 elements: [ {
274 type: 'hbox',
275 padding: 0,
276 widths: [ '70%', '10%', '30%' ],
277 children: [ {
278 type: 'html',
279 html: '<div></div>',
280 onLoad: function() {
281 CKEDITOR.document.getById( this.domId ).append( table );
282 },
283 focus: function() {
284 // Restore the previously focused cell,
285 // otherwise put the initial focus on the first table cell.
286 ( focused || this.getElement().getElementsByTag( 'td' ).getItem( 0 ) ).focus();
287 }
288 },
289 spacer,
290 {
291 type: 'vbox',
292 padding: 0,
293 widths: [ '70%', '5%', '25%' ],
294 children: [ {
295 type: 'html',
296 html: '<span>' + lang.highlight + '</span>' +
297 '<div id="' + hicolorId + '" style="border: 1px solid; height: 74px; width: 74px;"></div>' +
298 '<div id="' + hicolorTextId + '">&nbsp;</div><span>' + lang.selected + '</span>' +
299 '<div id="' + selHiColorId + '" style="border: 1px solid; height: 20px; width: 74px;"></div>'
300 },
301 {
302 type: 'text',
303 label: lang.selected,
304 labelStyle: 'display:none',
305 id: 'selectedColor',
306 style: 'width: 76px;margin-top:4px',
307 onChange: function() {
308 // Try to update color preview with new value. If fails, then set it no none.
309 try {
310 $doc.getById( selHiColorId ).setStyle( 'background-color', this.getValue() );
311 } catch ( e ) {
312 clearSelected();
313 }
314 }
315 },
316 spacer,
317 {
318 type: 'button',
319 id: 'clear',
320 label: lang.clear,
321 onClick: clearSelected
322 } ]
323 } ]
324 } ]
325 } ]
326 };
327} );
diff --git a/sources/plugins/colordialog/lang/af.js b/sources/plugins/colordialog/lang/af.js
new file mode 100644
index 00000000..de005de4
--- /dev/null
+++ b/sources/plugins/colordialog/lang/af.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'af', {
6 clear: 'Herstel',
7 highlight: 'Aktief',
8 options: 'Kleuropsies',
9 selected: 'Geselekteer',
10 title: 'Kies kleur'
11} );
diff --git a/sources/plugins/colordialog/lang/ar.js b/sources/plugins/colordialog/lang/ar.js
new file mode 100644
index 00000000..804d1535
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ar.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ar', {
6 clear: 'مسح',
7 highlight: 'تحديد',
8 options: 'اختيارات الألوان',
9 selected: 'اللون المختار',
10 title: 'اختر اللون'
11} );
diff --git a/sources/plugins/colordialog/lang/bg.js b/sources/plugins/colordialog/lang/bg.js
new file mode 100644
index 00000000..46cd0b44
--- /dev/null
+++ b/sources/plugins/colordialog/lang/bg.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'bg', {
6 clear: 'Изчистване',
7 highlight: 'Осветяване',
8 options: 'Цветови опции',
9 selected: 'Изберете цвят',
10 title: 'Изберете цвят'
11} );
diff --git a/sources/plugins/colordialog/lang/bn.js b/sources/plugins/colordialog/lang/bn.js
new file mode 100644
index 00000000..ff8b58ac
--- /dev/null
+++ b/sources/plugins/colordialog/lang/bn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'bn', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/bs.js b/sources/plugins/colordialog/lang/bs.js
new file mode 100644
index 00000000..3d8145d7
--- /dev/null
+++ b/sources/plugins/colordialog/lang/bs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'bs', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/ca.js b/sources/plugins/colordialog/lang/ca.js
new file mode 100644
index 00000000..351bde1d
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ca', {
6 clear: 'Neteja',
7 highlight: 'Destacat',
8 options: 'Opcions del color',
9 selected: 'Color Seleccionat',
10 title: 'Seleccioni el color'
11} );
diff --git a/sources/plugins/colordialog/lang/cs.js b/sources/plugins/colordialog/lang/cs.js
new file mode 100644
index 00000000..49cb9efe
--- /dev/null
+++ b/sources/plugins/colordialog/lang/cs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'cs', {
6 clear: 'Vyčistit',
7 highlight: 'Zvýraznit',
8 options: 'Nastavení barvy',
9 selected: 'Vybráno',
10 title: 'Výběr barvy'
11} );
diff --git a/sources/plugins/colordialog/lang/cy.js b/sources/plugins/colordialog/lang/cy.js
new file mode 100644
index 00000000..3ee93ba4
--- /dev/null
+++ b/sources/plugins/colordialog/lang/cy.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'cy', {
6 clear: 'Clirio',
7 highlight: 'Uwcholeuo',
8 options: 'Opsiynau Lliw',
9 selected: 'Lliw a Ddewiswyd',
10 title: 'Dewis lliw'
11} );
diff --git a/sources/plugins/colordialog/lang/da.js b/sources/plugins/colordialog/lang/da.js
new file mode 100644
index 00000000..b4fd39de
--- /dev/null
+++ b/sources/plugins/colordialog/lang/da.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'da', {
6 clear: 'Nulstil',
7 highlight: 'Markér',
8 options: 'Farvemuligheder',
9 selected: 'Valgt farve',
10 title: 'Vælg farve'
11} );
diff --git a/sources/plugins/colordialog/lang/de.js b/sources/plugins/colordialog/lang/de.js
new file mode 100644
index 00000000..f45d8e1c
--- /dev/null
+++ b/sources/plugins/colordialog/lang/de.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'de', {
6 clear: 'Entfernen',
7 highlight: 'Hervorheben',
8 options: 'Farboptionen',
9 selected: 'Ausgewählte Farbe',
10 title: 'Farbe auswählen'
11} );
diff --git a/sources/plugins/colordialog/lang/el.js b/sources/plugins/colordialog/lang/el.js
new file mode 100644
index 00000000..6b4b4fcb
--- /dev/null
+++ b/sources/plugins/colordialog/lang/el.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'el', {
6 clear: 'Εκκαθάριση',
7 highlight: 'Σήμανση',
8 options: 'Επιλογές Χρωμάτων',
9 selected: 'Επιλεγμένο Χρώμα',
10 title: 'Επιλογή χρώματος'
11} );
diff --git a/sources/plugins/colordialog/lang/en-au.js b/sources/plugins/colordialog/lang/en-au.js
new file mode 100644
index 00000000..73a1e8c3
--- /dev/null
+++ b/sources/plugins/colordialog/lang/en-au.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'en-au', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/en-ca.js b/sources/plugins/colordialog/lang/en-ca.js
new file mode 100644
index 00000000..1f0d3225
--- /dev/null
+++ b/sources/plugins/colordialog/lang/en-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'en-ca', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/en-gb.js b/sources/plugins/colordialog/lang/en-gb.js
new file mode 100644
index 00000000..06fea7a0
--- /dev/null
+++ b/sources/plugins/colordialog/lang/en-gb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'en-gb', {
6 clear: 'Clear',
7 highlight: 'Highlight',
8 options: 'Colour Options',
9 selected: 'Selected Colour',
10 title: 'Select colour'
11} );
diff --git a/sources/plugins/colordialog/lang/en.js b/sources/plugins/colordialog/lang/en.js
new file mode 100644
index 00000000..13ff82a3
--- /dev/null
+++ b/sources/plugins/colordialog/lang/en.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'en', {
6 clear: 'Clear',
7 highlight: 'Highlight',
8 options: 'Color Options',
9 selected: 'Selected Color',
10 title: 'Select color'
11} );
diff --git a/sources/plugins/colordialog/lang/eo.js b/sources/plugins/colordialog/lang/eo.js
new file mode 100644
index 00000000..13b1f90a
--- /dev/null
+++ b/sources/plugins/colordialog/lang/eo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'eo', {
6 clear: 'Forigi',
7 highlight: 'Detaloj',
8 options: 'Opcioj pri koloroj',
9 selected: 'Selektita koloro',
10 title: 'Selekti koloron'
11} );
diff --git a/sources/plugins/colordialog/lang/es.js b/sources/plugins/colordialog/lang/es.js
new file mode 100644
index 00000000..405cbeda
--- /dev/null
+++ b/sources/plugins/colordialog/lang/es.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'es', {
6 clear: 'Borrar',
7 highlight: 'Muestra',
8 options: 'Opciones de colores',
9 selected: 'Elegido',
10 title: 'Elegir color'
11} );
diff --git a/sources/plugins/colordialog/lang/et.js b/sources/plugins/colordialog/lang/et.js
new file mode 100644
index 00000000..2437052f
--- /dev/null
+++ b/sources/plugins/colordialog/lang/et.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'et', {
6 clear: 'Eemalda',
7 highlight: 'Näidis',
8 options: 'Värvi valikud',
9 selected: 'Valitud värv',
10 title: 'Värvi valimine'
11} );
diff --git a/sources/plugins/colordialog/lang/eu.js b/sources/plugins/colordialog/lang/eu.js
new file mode 100644
index 00000000..beecdf08
--- /dev/null
+++ b/sources/plugins/colordialog/lang/eu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'eu', {
6 clear: 'Garbitu',
7 highlight: 'Nabarmendu',
8 options: 'Kolore aukerak',
9 selected: 'Hautatutako kolorea',
10 title: 'Hautatu kolorea'
11} );
diff --git a/sources/plugins/colordialog/lang/fa.js b/sources/plugins/colordialog/lang/fa.js
new file mode 100644
index 00000000..9cdb113f
--- /dev/null
+++ b/sources/plugins/colordialog/lang/fa.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'fa', {
6 clear: 'پاک کردن',
7 highlight: 'متمایز',
8 options: 'گزینه​های رنگ',
9 selected: 'رنگ انتخاب شده',
10 title: 'انتخاب رنگ'
11} );
diff --git a/sources/plugins/colordialog/lang/fi.js b/sources/plugins/colordialog/lang/fi.js
new file mode 100644
index 00000000..e6292467
--- /dev/null
+++ b/sources/plugins/colordialog/lang/fi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'fi', {
6 clear: 'Poista',
7 highlight: 'Korostus',
8 options: 'Värin ominaisuudet',
9 selected: 'Valittu',
10 title: 'Valitse väri'
11} );
diff --git a/sources/plugins/colordialog/lang/fo.js b/sources/plugins/colordialog/lang/fo.js
new file mode 100644
index 00000000..516fbf1d
--- /dev/null
+++ b/sources/plugins/colordialog/lang/fo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'fo', {
6 clear: 'Strika',
7 highlight: 'Framheva',
8 options: 'Litmøguleikar',
9 selected: 'Valdur litur',
10 title: 'Vel lit'
11} );
diff --git a/sources/plugins/colordialog/lang/fr-ca.js b/sources/plugins/colordialog/lang/fr-ca.js
new file mode 100644
index 00000000..b235b993
--- /dev/null
+++ b/sources/plugins/colordialog/lang/fr-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'fr-ca', {
6 clear: 'Effacer',
7 highlight: 'Surligner',
8 options: 'Options de couleur',
9 selected: 'Couleur sélectionnée',
10 title: 'Choisir une couleur'
11} );
diff --git a/sources/plugins/colordialog/lang/fr.js b/sources/plugins/colordialog/lang/fr.js
new file mode 100644
index 00000000..706df2ad
--- /dev/null
+++ b/sources/plugins/colordialog/lang/fr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'fr', {
6 clear: 'Effacer',
7 highlight: 'Détails',
8 options: 'Option des couleurs',
9 selected: 'Couleur choisie',
10 title: 'Choisir une couleur'
11} );
diff --git a/sources/plugins/colordialog/lang/gl.js b/sources/plugins/colordialog/lang/gl.js
new file mode 100644
index 00000000..a5f42e14
--- /dev/null
+++ b/sources/plugins/colordialog/lang/gl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'gl', {
6 clear: 'Limpar',
7 highlight: 'Resaltar',
8 options: 'Opcións de cor',
9 selected: 'Cor seleccionado',
10 title: 'Seleccione unha cor'
11} );
diff --git a/sources/plugins/colordialog/lang/gu.js b/sources/plugins/colordialog/lang/gu.js
new file mode 100644
index 00000000..bacc9d22
--- /dev/null
+++ b/sources/plugins/colordialog/lang/gu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'gu', {
6 clear: 'સાફ કરવું',
7 highlight: 'હાઈઈટ',
8 options: 'રંગના વિકલ્પ',
9 selected: 'પસંદ કરેલો રંગ',
10 title: 'રંગ પસંદ કરો'
11} );
diff --git a/sources/plugins/colordialog/lang/he.js b/sources/plugins/colordialog/lang/he.js
new file mode 100644
index 00000000..3bd448b9
--- /dev/null
+++ b/sources/plugins/colordialog/lang/he.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'he', {
6 clear: 'ניקוי',
7 highlight: 'סימון',
8 options: 'אפשרויות צבע',
9 selected: 'בחירה',
10 title: 'בחירת צבע'
11} );
diff --git a/sources/plugins/colordialog/lang/hi.js b/sources/plugins/colordialog/lang/hi.js
new file mode 100644
index 00000000..fc383287
--- /dev/null
+++ b/sources/plugins/colordialog/lang/hi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'hi', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/hr.js b/sources/plugins/colordialog/lang/hr.js
new file mode 100644
index 00000000..15ef17fc
--- /dev/null
+++ b/sources/plugins/colordialog/lang/hr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'hr', {
6 clear: 'Očisti',
7 highlight: 'Istaknuto',
8 options: 'Opcije boje',
9 selected: 'Odabrana boja',
10 title: 'Odaberi boju'
11} );
diff --git a/sources/plugins/colordialog/lang/hu.js b/sources/plugins/colordialog/lang/hu.js
new file mode 100644
index 00000000..69e75872
--- /dev/null
+++ b/sources/plugins/colordialog/lang/hu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'hu', {
6 clear: 'Ürítés',
7 highlight: 'Nagyítás',
8 options: 'Szín opciók',
9 selected: 'Kiválasztott',
10 title: 'Válasszon színt'
11} );
diff --git a/sources/plugins/colordialog/lang/id.js b/sources/plugins/colordialog/lang/id.js
new file mode 100644
index 00000000..f85ddf90
--- /dev/null
+++ b/sources/plugins/colordialog/lang/id.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'id', {
6 clear: 'Hapus',
7 highlight: 'Sorot',
8 options: 'Pilihan Warna',
9 selected: 'Warna Dipilih',
10 title: 'Pilih Warna'
11} );
diff --git a/sources/plugins/colordialog/lang/is.js b/sources/plugins/colordialog/lang/is.js
new file mode 100644
index 00000000..2268c402
--- /dev/null
+++ b/sources/plugins/colordialog/lang/is.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'is', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/it.js b/sources/plugins/colordialog/lang/it.js
new file mode 100644
index 00000000..e4a2956b
--- /dev/null
+++ b/sources/plugins/colordialog/lang/it.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'it', {
6 clear: 'cancella',
7 highlight: 'Evidenzia',
8 options: 'Opzioni colore',
9 selected: 'Seleziona il colore',
10 title: 'Selezionare il colore'
11} );
diff --git a/sources/plugins/colordialog/lang/ja.js b/sources/plugins/colordialog/lang/ja.js
new file mode 100644
index 00000000..33f92053
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ja.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ja', {
6 clear: 'クリア',
7 highlight: 'ハイライト',
8 options: 'カラーオプション',
9 selected: '選択された色',
10 title: '色選択'
11} );
diff --git a/sources/plugins/colordialog/lang/ka.js b/sources/plugins/colordialog/lang/ka.js
new file mode 100644
index 00000000..fd1f929f
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ka.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ka', {
6 clear: 'გასუფთავება',
7 highlight: 'ჩვენება',
8 options: 'ფერის პარამეტრები',
9 selected: 'არჩეული ფერი',
10 title: 'ფერის შეცვლა'
11} );
diff --git a/sources/plugins/colordialog/lang/km.js b/sources/plugins/colordialog/lang/km.js
new file mode 100644
index 00000000..7940f4eb
--- /dev/null
+++ b/sources/plugins/colordialog/lang/km.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'km', {
6 clear: 'សម្អាត',
7 highlight: 'បន្លិច​ពណ៌',
8 options: 'ជម្រើស​ពណ៌',
9 selected: 'ពណ៌​ដែល​បាន​រើស',
10 title: 'រើស​ពណ៌'
11} );
diff --git a/sources/plugins/colordialog/lang/ko.js b/sources/plugins/colordialog/lang/ko.js
new file mode 100644
index 00000000..ff19a6ae
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ko.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ko', {
6 clear: '비우기',
7 highlight: '강조',
8 options: '색상 옵션',
9 selected: '선택된 색상',
10 title: '색상 선택'
11} );
diff --git a/sources/plugins/colordialog/lang/ku.js b/sources/plugins/colordialog/lang/ku.js
new file mode 100644
index 00000000..bbe1d1f1
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ku.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ku', {
6 clear: 'پاکیکەوە',
7 highlight: 'نیشانکردن',
8 options: 'هەڵبژاردەی ڕەنگەکان',
9 selected: 'ڕەنگی هەڵبژێردراو',
10 title: 'هەڵبژاردنی ڕەنگ'
11} );
diff --git a/sources/plugins/colordialog/lang/lt.js b/sources/plugins/colordialog/lang/lt.js
new file mode 100644
index 00000000..817b6e2d
--- /dev/null
+++ b/sources/plugins/colordialog/lang/lt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'lt', {
6 clear: 'Išvalyti',
7 highlight: 'Paryškinti',
8 options: 'Spalvos nustatymai',
9 selected: 'Pasirinkta spalva',
10 title: 'Pasirinkite spalvą'
11} );
diff --git a/sources/plugins/colordialog/lang/lv.js b/sources/plugins/colordialog/lang/lv.js
new file mode 100644
index 00000000..6dc35d38
--- /dev/null
+++ b/sources/plugins/colordialog/lang/lv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'lv', {
6 clear: 'Notīrīt',
7 highlight: 'Paraugs',
8 options: 'Krāsas uzstādījumi',
9 selected: 'Izvēlētā krāsa',
10 title: 'Izvēlies krāsu'
11} );
diff --git a/sources/plugins/colordialog/lang/mk.js b/sources/plugins/colordialog/lang/mk.js
new file mode 100644
index 00000000..6981f12f
--- /dev/null
+++ b/sources/plugins/colordialog/lang/mk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'mk', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/mn.js b/sources/plugins/colordialog/lang/mn.js
new file mode 100644
index 00000000..6ad3bc95
--- /dev/null
+++ b/sources/plugins/colordialog/lang/mn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'mn', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/ms.js b/sources/plugins/colordialog/lang/ms.js
new file mode 100644
index 00000000..6978496e
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ms.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ms', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/nb.js b/sources/plugins/colordialog/lang/nb.js
new file mode 100644
index 00000000..8d6daded
--- /dev/null
+++ b/sources/plugins/colordialog/lang/nb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'nb', {
6 clear: 'Tøm',
7 highlight: 'Merk',
8 options: 'Alternativer for farge',
9 selected: 'Valgt farge',
10 title: 'Velg farge'
11} );
diff --git a/sources/plugins/colordialog/lang/nl.js b/sources/plugins/colordialog/lang/nl.js
new file mode 100644
index 00000000..2cd70ae3
--- /dev/null
+++ b/sources/plugins/colordialog/lang/nl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'nl', {
6 clear: 'Wissen',
7 highlight: 'Actief',
8 options: 'Kleuropties',
9 selected: 'Geselecteerde kleur',
10 title: 'Selecteer kleur'
11} );
diff --git a/sources/plugins/colordialog/lang/no.js b/sources/plugins/colordialog/lang/no.js
new file mode 100644
index 00000000..6471eeb8
--- /dev/null
+++ b/sources/plugins/colordialog/lang/no.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'no', {
6 clear: 'Tøm',
7 highlight: 'Merk',
8 options: 'Alternativer for farge',
9 selected: 'Valgt',
10 title: 'Velg farge'
11} );
diff --git a/sources/plugins/colordialog/lang/pl.js b/sources/plugins/colordialog/lang/pl.js
new file mode 100644
index 00000000..14d7bb4c
--- /dev/null
+++ b/sources/plugins/colordialog/lang/pl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'pl', {
6 clear: 'Wyczyść',
7 highlight: 'Zaznacz',
8 options: 'Opcje koloru',
9 selected: 'Wybrany',
10 title: 'Wybierz kolor'
11} );
diff --git a/sources/plugins/colordialog/lang/pt-br.js b/sources/plugins/colordialog/lang/pt-br.js
new file mode 100644
index 00000000..8c0da026
--- /dev/null
+++ b/sources/plugins/colordialog/lang/pt-br.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'pt-br', {
6 clear: 'Limpar',
7 highlight: 'Grifar',
8 options: 'Opções de Cor',
9 selected: 'Cor Selecionada',
10 title: 'Selecione uma Cor'
11} );
diff --git a/sources/plugins/colordialog/lang/pt.js b/sources/plugins/colordialog/lang/pt.js
new file mode 100644
index 00000000..87005218
--- /dev/null
+++ b/sources/plugins/colordialog/lang/pt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'pt', {
6 clear: 'Limpar',
7 highlight: 'Realçar',
8 options: 'Opções de cor',
9 selected: 'Cor selecionada',
10 title: 'Selecionar cor'
11} );
diff --git a/sources/plugins/colordialog/lang/ro.js b/sources/plugins/colordialog/lang/ro.js
new file mode 100644
index 00000000..ce326ed9
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ro.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ro', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/ru.js b/sources/plugins/colordialog/lang/ru.js
new file mode 100644
index 00000000..f491a789
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ru.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ru', {
6 clear: 'Очистить',
7 highlight: 'Под курсором',
8 options: 'Настройки цвета',
9 selected: 'Выбранный цвет',
10 title: 'Выберите цвет'
11} );
diff --git a/sources/plugins/colordialog/lang/si.js b/sources/plugins/colordialog/lang/si.js
new file mode 100644
index 00000000..ac833bb8
--- /dev/null
+++ b/sources/plugins/colordialog/lang/si.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'si', {
6 clear: 'පැහැදිලි',
7 highlight: 'මතුකර පෙන්වන්න',
8 options: 'වර්ණ විකල්ප',
9 selected: 'තෙරු වර්ණ',
10 title: 'වර්ණ තෝරන්න'
11} );
diff --git a/sources/plugins/colordialog/lang/sk.js b/sources/plugins/colordialog/lang/sk.js
new file mode 100644
index 00000000..47afd9a7
--- /dev/null
+++ b/sources/plugins/colordialog/lang/sk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'sk', {
6 clear: 'Vyčistiť',
7 highlight: 'Zvýrazniť',
8 options: 'Možnosti farby',
9 selected: 'Vybraná farba',
10 title: 'Vyberte farbu'
11} );
diff --git a/sources/plugins/colordialog/lang/sl.js b/sources/plugins/colordialog/lang/sl.js
new file mode 100644
index 00000000..9ced88ab
--- /dev/null
+++ b/sources/plugins/colordialog/lang/sl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'sl', {
6 clear: 'Počisti',
7 highlight: 'Poudarjeno',
8 options: 'Barvne Možnosti',
9 selected: 'Izbrano',
10 title: 'Izberi barvo'
11} );
diff --git a/sources/plugins/colordialog/lang/sq.js b/sources/plugins/colordialog/lang/sq.js
new file mode 100644
index 00000000..292da900
--- /dev/null
+++ b/sources/plugins/colordialog/lang/sq.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'sq', {
6 clear: 'Pastro',
7 highlight: 'Thekso',
8 options: 'Përzgjedhjet e Ngjyrave',
9 selected: 'Ngjyra e Përzgjedhur',
10 title: 'Përzgjidh një ngjyrë'
11} );
diff --git a/sources/plugins/colordialog/lang/sr-latn.js b/sources/plugins/colordialog/lang/sr-latn.js
new file mode 100644
index 00000000..01498cec
--- /dev/null
+++ b/sources/plugins/colordialog/lang/sr-latn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'sr-latn', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/sr.js b/sources/plugins/colordialog/lang/sr.js
new file mode 100644
index 00000000..d6167876
--- /dev/null
+++ b/sources/plugins/colordialog/lang/sr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'sr', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/sv.js b/sources/plugins/colordialog/lang/sv.js
new file mode 100644
index 00000000..1ffc3d89
--- /dev/null
+++ b/sources/plugins/colordialog/lang/sv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'sv', {
6 clear: 'Rensa',
7 highlight: 'Markera',
8 options: 'Färgalternativ',
9 selected: 'Vald färg',
10 title: 'Välj färg'
11} );
diff --git a/sources/plugins/colordialog/lang/th.js b/sources/plugins/colordialog/lang/th.js
new file mode 100644
index 00000000..7ac87873
--- /dev/null
+++ b/sources/plugins/colordialog/lang/th.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'th', {
6 clear: 'Clear', // MISSING
7 highlight: 'Highlight', // MISSING
8 options: 'Color Options', // MISSING
9 selected: 'Selected Color', // MISSING
10 title: 'Select color' // MISSING
11} );
diff --git a/sources/plugins/colordialog/lang/tr.js b/sources/plugins/colordialog/lang/tr.js
new file mode 100644
index 00000000..02d3bc81
--- /dev/null
+++ b/sources/plugins/colordialog/lang/tr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'tr', {
6 clear: 'Temizle',
7 highlight: 'İşaretle',
8 options: 'Renk Seçenekleri',
9 selected: 'Seçilmiş',
10 title: 'Renk seç'
11} );
diff --git a/sources/plugins/colordialog/lang/tt.js b/sources/plugins/colordialog/lang/tt.js
new file mode 100644
index 00000000..cf443883
--- /dev/null
+++ b/sources/plugins/colordialog/lang/tt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'tt', {
6 clear: 'Бушату',
7 highlight: 'Билгеләү',
8 options: 'Төс көйләүләре',
9 selected: 'Сайланган төсләр',
10 title: 'Төс сайлау'
11} );
diff --git a/sources/plugins/colordialog/lang/ug.js b/sources/plugins/colordialog/lang/ug.js
new file mode 100644
index 00000000..4a656ebf
--- /dev/null
+++ b/sources/plugins/colordialog/lang/ug.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'ug', {
6 clear: 'تازىلا',
7 highlight: 'يورۇت',
8 options: 'رەڭ تاللانمىسى',
9 selected: 'رەڭ تاللاڭ',
10 title: 'رەڭ تاللاڭ'
11} );
diff --git a/sources/plugins/colordialog/lang/uk.js b/sources/plugins/colordialog/lang/uk.js
new file mode 100644
index 00000000..ff6ef752
--- /dev/null
+++ b/sources/plugins/colordialog/lang/uk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'uk', {
6 clear: 'Очистити',
7 highlight: 'Колір, на який вказує курсор',
8 options: 'Опції кольорів',
9 selected: 'Обраний колір',
10 title: 'Обрати колір'
11} );
diff --git a/sources/plugins/colordialog/lang/vi.js b/sources/plugins/colordialog/lang/vi.js
new file mode 100644
index 00000000..d04a2dd3
--- /dev/null
+++ b/sources/plugins/colordialog/lang/vi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'vi', {
6 clear: 'Xóa bỏ',
7 highlight: 'Màu chọn',
8 options: 'Tùy chọn màu',
9 selected: 'Màu đã chọn',
10 title: 'Chọn màu'
11} );
diff --git a/sources/plugins/colordialog/lang/zh-cn.js b/sources/plugins/colordialog/lang/zh-cn.js
new file mode 100644
index 00000000..57083a4d
--- /dev/null
+++ b/sources/plugins/colordialog/lang/zh-cn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'zh-cn', {
6 clear: '清除',
7 highlight: '高亮',
8 options: '颜色选项',
9 selected: '选择颜色',
10 title: '选择颜色'
11} );
diff --git a/sources/plugins/colordialog/lang/zh.js b/sources/plugins/colordialog/lang/zh.js
new file mode 100644
index 00000000..d845a223
--- /dev/null
+++ b/sources/plugins/colordialog/lang/zh.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'colordialog', 'zh', {
6 clear: '清除',
7 highlight: '高亮',
8 options: '色彩選項',
9 selected: '選取的色彩',
10 title: '選取色彩'
11} );
diff --git a/sources/plugins/colordialog/plugin.js b/sources/plugins/colordialog/plugin.js
new file mode 100644
index 00000000..57f59199
--- /dev/null
+++ b/sources/plugins/colordialog/plugin.js
@@ -0,0 +1,71 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.colordialog = {
7 requires: 'dialog',
8 // jscs:disable maximumLineLength
9 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
10 // jscs:enable maximumLineLength
11 init: function( editor ) {
12 var cmd = new CKEDITOR.dialogCommand( 'colordialog' );
13 cmd.editorFocus = false;
14
15 editor.addCommand( 'colordialog', cmd );
16
17 CKEDITOR.dialog.add( 'colordialog', this.path + 'dialogs/colordialog.js' );
18
19 /**
20 * Open up color dialog and to receive the selected color.
21 *
22 * @param {Function} callback The callback when color dialog is closed
23 * @param {String} callback.color The color value received if selected on the dialog.
24 * @param [scope] The scope in which the callback will be bound.
25 * @member CKEDITOR.editor
26 */
27 editor.getColorFromDialog = function( callback, scope ) {
28 var onClose = function( evt ) {
29 releaseHandlers( this );
30 var color = evt.name == 'ok' ? this.getValueOf( 'picker', 'selectedColor' ) : null;
31 callback.call( scope, color );
32 };
33 var releaseHandlers = function( dialog ) {
34 dialog.removeListener( 'ok', onClose );
35 dialog.removeListener( 'cancel', onClose );
36 };
37 var bindToDialog = function( dialog ) {
38 dialog.on( 'ok', onClose );
39 dialog.on( 'cancel', onClose );
40 };
41
42 editor.execCommand( 'colordialog' );
43
44 if ( editor._.storedDialogs && editor._.storedDialogs.colordialog )
45 bindToDialog( editor._.storedDialogs.colordialog );
46 else {
47 CKEDITOR.on( 'dialogDefinition', function( e ) {
48 if ( e.data.name != 'colordialog' )
49 return;
50
51 var definition = e.data.definition;
52
53 e.removeListener();
54 definition.onLoad = CKEDITOR.tools.override( definition.onLoad,
55 function( orginal ) {
56 return function() {
57 bindToDialog( this );
58 definition.onLoad = orginal;
59 if ( typeof orginal == 'function' )
60 orginal.call( this );
61 };
62 } );
63 } );
64 }
65 };
66
67
68 }
69};
70
71CKEDITOR.plugins.add( 'colordialog', CKEDITOR.plugins.colordialog );
diff --git a/sources/plugins/contextmenu/lang/af.js b/sources/plugins/contextmenu/lang/af.js
new file mode 100644
index 00000000..c2cc63a8
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'af', {
6 options: 'Konteks Spyskaart-opsies'
7} );
diff --git a/sources/plugins/contextmenu/lang/ar.js b/sources/plugins/contextmenu/lang/ar.js
new file mode 100644
index 00000000..cb6b0974
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ar', {
6 options: 'خصائص قائمة السياق'
7} );
diff --git a/sources/plugins/contextmenu/lang/bg.js b/sources/plugins/contextmenu/lang/bg.js
new file mode 100644
index 00000000..2c4bc028
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'bg', {
6 options: 'Опции на контекстното меню'
7} );
diff --git a/sources/plugins/contextmenu/lang/bn.js b/sources/plugins/contextmenu/lang/bn.js
new file mode 100644
index 00000000..ff643525
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'bn', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/bs.js b/sources/plugins/contextmenu/lang/bs.js
new file mode 100644
index 00000000..3267caf5
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'bs', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/ca.js b/sources/plugins/contextmenu/lang/ca.js
new file mode 100644
index 00000000..b6da83d9
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ca', {
6 options: 'Opcions del menú contextual'
7} );
diff --git a/sources/plugins/contextmenu/lang/cs.js b/sources/plugins/contextmenu/lang/cs.js
new file mode 100644
index 00000000..63a0c8d0
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'cs', {
6 options: 'Nastavení kontextové nabídky'
7} );
diff --git a/sources/plugins/contextmenu/lang/cy.js b/sources/plugins/contextmenu/lang/cy.js
new file mode 100644
index 00000000..e01fb613
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'cy', {
6 options: 'Opsiynau Dewislen Cyd-destun'
7} );
diff --git a/sources/plugins/contextmenu/lang/da.js b/sources/plugins/contextmenu/lang/da.js
new file mode 100644
index 00000000..aa637367
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'da', {
6 options: 'Muligheder for hjælpemenu'
7} );
diff --git a/sources/plugins/contextmenu/lang/de.js b/sources/plugins/contextmenu/lang/de.js
new file mode 100644
index 00000000..f9cfb44e
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'de', {
6 options: 'Kontextmenüoptionen'
7} );
diff --git a/sources/plugins/contextmenu/lang/el.js b/sources/plugins/contextmenu/lang/el.js
new file mode 100644
index 00000000..16bf519c
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'el', {
6 options: 'Επιλογές Αναδυόμενου Μενού'
7} );
diff --git a/sources/plugins/contextmenu/lang/en-au.js b/sources/plugins/contextmenu/lang/en-au.js
new file mode 100644
index 00000000..756dac5d
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'en-au', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/en-ca.js b/sources/plugins/contextmenu/lang/en-ca.js
new file mode 100644
index 00000000..61160a0c
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'en-ca', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/en-gb.js b/sources/plugins/contextmenu/lang/en-gb.js
new file mode 100644
index 00000000..64b81d07
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'en-gb', {
6 options: 'Context Menu Options'
7} );
diff --git a/sources/plugins/contextmenu/lang/en.js b/sources/plugins/contextmenu/lang/en.js
new file mode 100644
index 00000000..25522bd7
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'en', {
6 options: 'Context Menu Options'
7} );
diff --git a/sources/plugins/contextmenu/lang/eo.js b/sources/plugins/contextmenu/lang/eo.js
new file mode 100644
index 00000000..86c0bf31
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'eo', {
6 options: 'Opcioj de Kunteksta Menuo'
7} );
diff --git a/sources/plugins/contextmenu/lang/es.js b/sources/plugins/contextmenu/lang/es.js
new file mode 100644
index 00000000..91bebfa9
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'es', {
6 options: 'Opciones del menú contextual'
7} );
diff --git a/sources/plugins/contextmenu/lang/et.js b/sources/plugins/contextmenu/lang/et.js
new file mode 100644
index 00000000..2ff62fea
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'et', {
6 options: 'Kontekstimenüü valikud'
7} );
diff --git a/sources/plugins/contextmenu/lang/eu.js b/sources/plugins/contextmenu/lang/eu.js
new file mode 100644
index 00000000..1f9aac01
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'eu', {
6 options: 'Testuinguru-menuaren aukerak'
7} );
diff --git a/sources/plugins/contextmenu/lang/fa.js b/sources/plugins/contextmenu/lang/fa.js
new file mode 100644
index 00000000..c83db4fd
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'fa', {
6 options: 'گزینه​های منوی زمینه'
7} );
diff --git a/sources/plugins/contextmenu/lang/fi.js b/sources/plugins/contextmenu/lang/fi.js
new file mode 100644
index 00000000..cfd3759e
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'fi', {
6 options: 'Pikavalikon ominaisuudet'
7} );
diff --git a/sources/plugins/contextmenu/lang/fo.js b/sources/plugins/contextmenu/lang/fo.js
new file mode 100644
index 00000000..1f62a56b
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'fo', {
6 options: 'Context Menu Options'
7} );
diff --git a/sources/plugins/contextmenu/lang/fr-ca.js b/sources/plugins/contextmenu/lang/fr-ca.js
new file mode 100644
index 00000000..d9220201
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'fr-ca', {
6 options: 'Options du menu contextuel'
7} );
diff --git a/sources/plugins/contextmenu/lang/fr.js b/sources/plugins/contextmenu/lang/fr.js
new file mode 100644
index 00000000..2ecfabe8
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'fr', {
6 options: 'Options du menu contextuel'
7} );
diff --git a/sources/plugins/contextmenu/lang/gl.js b/sources/plugins/contextmenu/lang/gl.js
new file mode 100644
index 00000000..5ee15528
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'gl', {
6 options: 'Opcións do menú contextual'
7} );
diff --git a/sources/plugins/contextmenu/lang/gu.js b/sources/plugins/contextmenu/lang/gu.js
new file mode 100644
index 00000000..6ad6a358
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'gu', {
6 options: 'કોન્તેક્ષ્ત્ મેનુના વિકલ્પો'
7} );
diff --git a/sources/plugins/contextmenu/lang/he.js b/sources/plugins/contextmenu/lang/he.js
new file mode 100644
index 00000000..e3e9d044
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'he', {
6 options: 'אפשרויות תפריט ההקשר'
7} );
diff --git a/sources/plugins/contextmenu/lang/hi.js b/sources/plugins/contextmenu/lang/hi.js
new file mode 100644
index 00000000..f5317a97
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'hi', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/hr.js b/sources/plugins/contextmenu/lang/hr.js
new file mode 100644
index 00000000..d9b47761
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'hr', {
6 options: 'Opcije izbornika'
7} );
diff --git a/sources/plugins/contextmenu/lang/hu.js b/sources/plugins/contextmenu/lang/hu.js
new file mode 100644
index 00000000..8a23cd90
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'hu', {
6 options: 'Helyi menü opciók'
7} );
diff --git a/sources/plugins/contextmenu/lang/id.js b/sources/plugins/contextmenu/lang/id.js
new file mode 100644
index 00000000..4b54a87f
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'id', {
6 options: 'Opsi Konteks Pilihan'
7} );
diff --git a/sources/plugins/contextmenu/lang/is.js b/sources/plugins/contextmenu/lang/is.js
new file mode 100644
index 00000000..cb5d8a96
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'is', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/it.js b/sources/plugins/contextmenu/lang/it.js
new file mode 100644
index 00000000..602dd30e
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'it', {
6 options: 'Opzioni del menù contestuale'
7} );
diff --git a/sources/plugins/contextmenu/lang/ja.js b/sources/plugins/contextmenu/lang/ja.js
new file mode 100644
index 00000000..131cadf8
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ja', {
6 options: 'コンテキストメニューオプション'
7} );
diff --git a/sources/plugins/contextmenu/lang/ka.js b/sources/plugins/contextmenu/lang/ka.js
new file mode 100644
index 00000000..9398fcb9
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ka', {
6 options: 'კონტექსტური მენიუს პარამეტრები'
7} );
diff --git a/sources/plugins/contextmenu/lang/km.js b/sources/plugins/contextmenu/lang/km.js
new file mode 100644
index 00000000..5e29edca
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'km', {
6 options: 'ជម្រើស​ម៉ឺនុយ​បរិបទ'
7} );
diff --git a/sources/plugins/contextmenu/lang/ko.js b/sources/plugins/contextmenu/lang/ko.js
new file mode 100644
index 00000000..f8dbc304
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ko', {
6 options: '컨텍스트 메뉴 옵션'
7} );
diff --git a/sources/plugins/contextmenu/lang/ku.js b/sources/plugins/contextmenu/lang/ku.js
new file mode 100644
index 00000000..9da10a07
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ku', {
6 options: 'هەڵبژاردەی لیستەی کلیکی دەستی ڕاست'
7} );
diff --git a/sources/plugins/contextmenu/lang/lt.js b/sources/plugins/contextmenu/lang/lt.js
new file mode 100644
index 00000000..1927f68e
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'lt', {
6 options: 'Kontekstinio meniu parametrai'
7} );
diff --git a/sources/plugins/contextmenu/lang/lv.js b/sources/plugins/contextmenu/lang/lv.js
new file mode 100644
index 00000000..44271af9
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'lv', {
6 options: 'Uznirstošās izvēlnes uzstādījumi'
7} );
diff --git a/sources/plugins/contextmenu/lang/mk.js b/sources/plugins/contextmenu/lang/mk.js
new file mode 100644
index 00000000..6540c9cc
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'mk', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/mn.js b/sources/plugins/contextmenu/lang/mn.js
new file mode 100644
index 00000000..effdcdd2
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'mn', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/ms.js b/sources/plugins/contextmenu/lang/ms.js
new file mode 100644
index 00000000..f5c2f413
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ms', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/nb.js b/sources/plugins/contextmenu/lang/nb.js
new file mode 100644
index 00000000..dcdcb514
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'nb', {
6 options: 'Alternativer for høyreklikkmeny'
7} );
diff --git a/sources/plugins/contextmenu/lang/nl.js b/sources/plugins/contextmenu/lang/nl.js
new file mode 100644
index 00000000..e8be1dcb
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'nl', {
6 options: 'Contextmenu opties'
7} );
diff --git a/sources/plugins/contextmenu/lang/no.js b/sources/plugins/contextmenu/lang/no.js
new file mode 100644
index 00000000..4818b9a6
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'no', {
6 options: 'Alternativer for høyreklikkmeny'
7} );
diff --git a/sources/plugins/contextmenu/lang/pl.js b/sources/plugins/contextmenu/lang/pl.js
new file mode 100644
index 00000000..4f40a9be
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'pl', {
6 options: 'Opcje menu kontekstowego'
7} );
diff --git a/sources/plugins/contextmenu/lang/pt-br.js b/sources/plugins/contextmenu/lang/pt-br.js
new file mode 100644
index 00000000..9a53a148
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'pt-br', {
6 options: 'Opções Menu de Contexto'
7} );
diff --git a/sources/plugins/contextmenu/lang/pt.js b/sources/plugins/contextmenu/lang/pt.js
new file mode 100644
index 00000000..9e4cb095
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'pt', {
6 options: 'Menu de opções de contexto'
7} );
diff --git a/sources/plugins/contextmenu/lang/ro.js b/sources/plugins/contextmenu/lang/ro.js
new file mode 100644
index 00000000..5d58b996
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ro', {
6 options: 'Opțiuni Meniu Contextual'
7} );
diff --git a/sources/plugins/contextmenu/lang/ru.js b/sources/plugins/contextmenu/lang/ru.js
new file mode 100644
index 00000000..e53098a2
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ru', {
6 options: 'Параметры контекстного меню'
7} );
diff --git a/sources/plugins/contextmenu/lang/si.js b/sources/plugins/contextmenu/lang/si.js
new file mode 100644
index 00000000..96687455
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'si', {
6 options: 'අනතර්ග ලේඛණ විකල්ප'
7} );
diff --git a/sources/plugins/contextmenu/lang/sk.js b/sources/plugins/contextmenu/lang/sk.js
new file mode 100644
index 00000000..81bdfc46
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'sk', {
6 options: 'Možnosti kontextového menu'
7} );
diff --git a/sources/plugins/contextmenu/lang/sl.js b/sources/plugins/contextmenu/lang/sl.js
new file mode 100644
index 00000000..a9b96c13
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'sl', {
6 options: 'Možnosti Kontekstnega Menija'
7} );
diff --git a/sources/plugins/contextmenu/lang/sq.js b/sources/plugins/contextmenu/lang/sq.js
new file mode 100644
index 00000000..95bd4564
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'sq', {
6 options: 'Mundësitë e Menysë së Kontekstit'
7} );
diff --git a/sources/plugins/contextmenu/lang/sr-latn.js b/sources/plugins/contextmenu/lang/sr-latn.js
new file mode 100644
index 00000000..42dac9f1
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'sr-latn', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/sr.js b/sources/plugins/contextmenu/lang/sr.js
new file mode 100644
index 00000000..a3f61a8d
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'sr', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/sv.js b/sources/plugins/contextmenu/lang/sv.js
new file mode 100644
index 00000000..2f141586
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'sv', {
6 options: 'Context Menu Options'
7} );
diff --git a/sources/plugins/contextmenu/lang/th.js b/sources/plugins/contextmenu/lang/th.js
new file mode 100644
index 00000000..9c51d1c9
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'th', {
6 options: 'Context Menu Options' // MISSING
7} );
diff --git a/sources/plugins/contextmenu/lang/tr.js b/sources/plugins/contextmenu/lang/tr.js
new file mode 100644
index 00000000..adc7c037
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'tr', {
6 options: 'İçerik Menüsü Seçenekleri'
7} );
diff --git a/sources/plugins/contextmenu/lang/tt.js b/sources/plugins/contextmenu/lang/tt.js
new file mode 100644
index 00000000..992e8938
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'tt', {
6 options: 'Контекст меню үзлекләре'
7} );
diff --git a/sources/plugins/contextmenu/lang/ug.js b/sources/plugins/contextmenu/lang/ug.js
new file mode 100644
index 00000000..05926920
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'ug', {
6 options: 'قىسقا يول تىزىملىك تاللانمىسى'
7} );
diff --git a/sources/plugins/contextmenu/lang/uk.js b/sources/plugins/contextmenu/lang/uk.js
new file mode 100644
index 00000000..cda18f62
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'uk', {
6 options: 'Опції контекстного меню'
7} );
diff --git a/sources/plugins/contextmenu/lang/vi.js b/sources/plugins/contextmenu/lang/vi.js
new file mode 100644
index 00000000..79c6cd65
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'vi', {
6 options: 'Tùy chọn menu bổ xung'
7} );
diff --git a/sources/plugins/contextmenu/lang/zh-cn.js b/sources/plugins/contextmenu/lang/zh-cn.js
new file mode 100644
index 00000000..ace5a341
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'zh-cn', {
6 options: '快捷菜单选项'
7} );
diff --git a/sources/plugins/contextmenu/lang/zh.js b/sources/plugins/contextmenu/lang/zh.js
new file mode 100644
index 00000000..db18ee53
--- /dev/null
+++ b/sources/plugins/contextmenu/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'contextmenu', 'zh', {
6 options: '內容功能表選項'
7} );
diff --git a/sources/plugins/contextmenu/plugin.js b/sources/plugins/contextmenu/plugin.js
new file mode 100644
index 00000000..111e1383
--- /dev/null
+++ b/sources/plugins/contextmenu/plugin.js
@@ -0,0 +1,159 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'contextmenu', {
7 requires: 'menu',
8
9 // jscs:disable maximumLineLength
10 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
11 // jscs:enable maximumLineLength
12
13 // Make sure the base class (CKEDITOR.menu) is loaded before it (#3318).
14 onLoad: function() {
15 /**
16 * Class replacing the non-configurable native context menu with a configurable CKEditor's equivalent.
17 *
18 * @class
19 * @extends CKEDITOR.menu
20 */
21 CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass( {
22 base: CKEDITOR.menu,
23
24 /**
25 * Creates the CKEDITOR.plugins.contextMenu class instance.
26 *
27 * @constructor
28 * @param {CKEDITOR.editor} editor
29 */
30 $: function( editor ) {
31 this.base.call( this, editor, {
32 panel: {
33 className: 'cke_menu_panel',
34 attributes: {
35 'aria-label': editor.lang.contextmenu.options
36 }
37 }
38 } );
39 },
40
41 proto: {
42 /**
43 * Starts watching on native context menu triggers (<kbd>Option</kbd> key, right click) on the given element.
44 *
45 * @param {CKEDITOR.dom.element} element
46 * @param {Boolean} [nativeContextMenuOnCtrl] Whether to open native context menu if the
47 * <kbd>Ctrl</kbd> key is held on opening the context menu. See {@link CKEDITOR.config#browserContextMenuOnCtrl}.
48 */
49 addTarget: function( element, nativeContextMenuOnCtrl ) {
50 element.on( 'contextmenu', function( event ) {
51 var domEvent = event.data,
52 isCtrlKeyDown =
53 // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event,
54 // which make this property unreliable. (#4826)
55 ( CKEDITOR.env.webkit ? holdCtrlKey : ( CKEDITOR.env.mac ? domEvent.$.metaKey : domEvent.$.ctrlKey ) );
56
57 if ( nativeContextMenuOnCtrl && isCtrlKeyDown )
58 return;
59
60 // Cancel the browser context menu.
61 domEvent.preventDefault();
62
63 // Fix selection when non-editable element in Webkit/Blink (Mac) (#11306).
64 if ( CKEDITOR.env.mac && CKEDITOR.env.webkit ) {
65 var editor = this.editor,
66 contentEditableParent = new CKEDITOR.dom.elementPath( domEvent.getTarget(), editor.editable() ).contains( function( el ) {
67 // Return when non-editable or nested editable element is found.
68 return el.hasAttribute( 'contenteditable' );
69 }, true ); // Exclude editor's editable.
70
71 // Fake selection for non-editables only (to exclude nested editables).
72 if ( contentEditableParent && contentEditableParent.getAttribute( 'contenteditable' ) == 'false' )
73 editor.getSelection().fake( contentEditableParent );
74 }
75
76 var doc = domEvent.getTarget().getDocument(),
77 offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),
78 fromFrame = !doc.equals( CKEDITOR.document ),
79 scroll = doc.getWindow().getScrollPosition(),
80 offsetX = fromFrame ? domEvent.$.clientX : domEvent.$.pageX || scroll.x + domEvent.$.clientX,
81 offsetY = fromFrame ? domEvent.$.clientY : domEvent.$.pageY || scroll.y + domEvent.$.clientY;
82
83 CKEDITOR.tools.setTimeout( function() {
84 this.open( offsetParent, null, offsetX, offsetY );
85
86 // IE needs a short while to allow selection change before opening menu. (#7908)
87 }, CKEDITOR.env.ie ? 200 : 0, this );
88 }, this );
89
90 if ( CKEDITOR.env.webkit ) {
91 var holdCtrlKey,
92 onKeyDown = function( event ) {
93 holdCtrlKey = CKEDITOR.env.mac ? event.data.$.metaKey : event.data.$.ctrlKey;
94 },
95 resetOnKeyUp = function() {
96 holdCtrlKey = 0;
97 };
98
99 element.on( 'keydown', onKeyDown );
100 element.on( 'keyup', resetOnKeyUp );
101 element.on( 'contextmenu', resetOnKeyUp );
102 }
103 },
104
105 /**
106 * Opens the context menu in the given location. See the {@link CKEDITOR.menu#show} method.
107 *
108 * @param {CKEDITOR.dom.element} offsetParent
109 * @param {Number} [corner]
110 * @param {Number} [offsetX]
111 * @param {Number} [offsetY]
112 */
113 open: function( offsetParent, corner, offsetX, offsetY ) {
114 this.editor.focus();
115 offsetParent = offsetParent || CKEDITOR.document.getDocumentElement();
116
117 // #9362: Force selection check to update commands' states in the new context.
118 this.editor.selectionChange( 1 );
119
120 this.show( offsetParent, corner, offsetX, offsetY );
121 }
122 }
123 } );
124 },
125
126 beforeInit: function( editor ) {
127 /**
128 * @readonly
129 * @property {CKEDITOR.plugins.contextMenu} contextMenu
130 * @member CKEDITOR.editor
131 */
132 var contextMenu = editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor );
133
134 editor.on( 'contentDom', function() {
135 contextMenu.addTarget( editor.editable(), editor.config.browserContextMenuOnCtrl !== false );
136 } );
137
138 editor.addCommand( 'contextMenu', {
139 exec: function() {
140 editor.contextMenu.open( editor.document.getBody() );
141 }
142 } );
143
144 editor.setKeystroke( CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' );
145 editor.setKeystroke( CKEDITOR.CTRL + CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' );
146 }
147} );
148
149/**
150 * Whether to show the browser native context menu when the <kbd>Ctrl</kbd> or
151 * <kbd>Meta</kbd> (Mac) key is pressed on opening the context menu with the
152 * right mouse button click or the <kbd>Menu</kbd> key.
153 *
154 * config.browserContextMenuOnCtrl = false;
155 *
156 * @since 3.0.2
157 * @cfg {Boolean} [browserContextMenuOnCtrl=true]
158 * @member CKEDITOR.config
159 */
diff --git a/sources/plugins/dialog/dialogDefinition.js b/sources/plugins/dialog/dialogDefinition.js
new file mode 100644
index 00000000..79306795
--- /dev/null
+++ b/sources/plugins/dialog/dialogDefinition.js
@@ -0,0 +1,1032 @@
1// jscs:disable disallowMixedSpacesAndTabs
2/**
3 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4 * For licensing, see LICENSE.md or http://ckeditor.com/license
5 */
6
7/**
8 * @fileOverview Defines the "virtual" dialog, dialog content and dialog button
9 * definition classes.
10 */
11
12/**
13 * The definition of a dialog window.
14 *
15 * This class is not really part of the API. It just illustrates the properties
16 * that developers can use to define and create dialogs.
17 *
18 * // There is no constructor for this class, the user just has to define an
19 * // object with the appropriate properties.
20 *
21 * CKEDITOR.dialog.add( 'testOnly', function( editor ) {
22 * return {
23 * title: 'Test Dialog',
24 * resizable: CKEDITOR.DIALOG_RESIZE_BOTH,
25 * minWidth: 500,
26 * minHeight: 400,
27 * contents: [
28 * {
29 * id: 'tab1',
30 * label: 'First Tab',
31 * title: 'First Tab Title',
32 * accessKey: 'Q',
33 * elements: [
34 * {
35 * type: 'text',
36 * label: 'Test Text 1',
37 * id: 'testText1',
38 * 'default': 'hello world!'
39 * }
40 * ]
41 * }
42 * ]
43 * };
44 * } );
45 *
46 * @class CKEDITOR.dialog.definition
47 */
48
49/**
50 * The dialog title, displayed in the dialog's header. Required.
51 *
52 * @property {String} title
53 */
54
55/**
56 * How the dialog can be resized, must be one of the four contents defined below.
57 *
58 * * {@link CKEDITOR#DIALOG_RESIZE_NONE}
59 * * {@link CKEDITOR#DIALOG_RESIZE_WIDTH}
60 * * {@link CKEDITOR#DIALOG_RESIZE_HEIGHT}
61 * * {@link CKEDITOR#DIALOG_RESIZE_BOTH}
62 *
63 * @property {Number} [resizable=CKEDITOR.DIALOG_RESIZE_NONE]
64 */
65
66/**
67 * The minimum width of the dialog, in pixels.
68 *
69 * @property {Number} [minWidth=600]
70 */
71
72/**
73 * The minimum height of the dialog, in pixels.
74 *
75 * @property {Number} [minHeight=400]
76 */
77
78
79/**
80 * The initial width of the dialog, in pixels.
81 *
82 * @since 3.5.3
83 * @property {Number} [width=CKEDITOR.dialog.definition#minWidth]
84 */
85
86/**
87 * The initial height of the dialog, in pixels.
88 *
89 * @since 3.5.3
90 * @property {Number} [height=CKEDITOR.dialog.definition.minHeight]
91 */
92
93/**
94 * The buttons in the dialog, defined as an array of
95 * {@link CKEDITOR.dialog.definition.button} objects.
96 *
97 * @property {Array} [buttons=[ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]]
98 */
99
100/**
101 * The contents in the dialog, defined as an array of
102 * {@link CKEDITOR.dialog.definition.content} objects. Required.
103 *
104 * @property {Array} contents
105 */
106
107/**
108 * The function to execute when OK is pressed.
109 *
110 * @property {Function} onOk
111 */
112
113/**
114 * The function to execute when Cancel is pressed.
115 *
116 * @property {Function} onCancel
117 */
118
119/**
120 * The function to execute when the dialog is displayed for the first time.
121 *
122 * @property {Function} onLoad
123 */
124
125/**
126 * The function to execute when the dialog is loaded (executed every time the dialog is opened).
127 *
128 * @property {Function} onShow
129 */
130
131/**
132 * This class is not really part of the API. It just illustrates the properties
133 * that developers can use to define and create dialog content pages.
134 *
135 * @class CKEDITOR.dialog.definition.content.
136 */
137
138/**
139 * The id of the content page.
140 *
141 * @property {String} id
142 */
143
144/**
145 * The tab label of the content page.
146 *
147 * @property {String} label
148 */
149
150/**
151 * The popup message of the tab label.
152 *
153 * @property {String} title
154 */
155
156/**
157 * The CTRL hotkey for switching to the tab.
158 *
159 * contentDefinition.accessKey = 'Q'; // Switch to this page when CTRL-Q is pressed.
160 *
161 * @property {String} accessKey
162 */
163
164/**
165 * The UI elements contained in this content page, defined as an array of
166 * {@link CKEDITOR.dialog.definition.uiElement} objects.
167 *
168 * @property {Array} elements
169 */
170
171/**
172 * The definition of user interface element (textarea, radio etc).
173 *
174 * This class is not really part of the API. It just illustrates the properties
175 * that developers can use to define and create dialog UI elements.
176 *
177 * @class CKEDITOR.dialog.definition.uiElement
178 * @see CKEDITOR.ui.dialog.uiElement
179 */
180
181/**
182 * The id of the UI element.
183 *
184 * @property {String} id
185 */
186
187/**
188 * The type of the UI element. Required.
189 *
190 * @property {String} type
191 */
192
193/**
194 * The popup label of the UI element.
195 *
196 * @property {String} title
197 */
198
199/**
200 * The content that needs to be allowed to enable this UI element.
201 * All formats accepted by {@link CKEDITOR.filter#check} may be used.
202 *
203 * When all UI elements in a tab are disabled, this tab will be disabled automatically.
204 *
205 * @property {String/Object/CKEDITOR.style} requiredContent
206 */
207
208/**
209 * CSS class names to append to the UI element.
210 *
211 * @property {String} className
212 */
213
214/**
215 * Inline CSS classes to append to the UI element.
216 *
217 * @property {String} style
218 */
219
220/**
221 * Horizontal alignment (in container) of the UI element.
222 *
223 * @property {String} align
224 */
225
226/**
227 * Function to execute the first time the UI element is displayed.
228 *
229 * @property {Function} onLoad
230 */
231
232/**
233 * Function to execute whenever the UI element's parent dialog is displayed.
234 *
235 * @property {Function} onShow
236 */
237
238/**
239 * Function to execute whenever the UI element's parent dialog is closed.
240 *
241 * @property {Function} onHide
242 */
243
244/**
245 * Function to execute whenever the UI element's parent
246 * dialog's {@link CKEDITOR.dialog#setupContent} method is executed.
247 * It usually takes care of the respective UI element as a standalone element.
248 *
249 * @property {Function} setup
250 */
251
252/**
253 * Function to execute whenever the UI element's parent
254 * dialog's {@link CKEDITOR.dialog#commitContent} method is executed.
255 * It usually takes care of the respective UI element as a standalone element.
256 *
257 * @property {Function} commit
258 */
259
260// ----- hbox -----------------------------------------------------------------
261
262/**
263 * Horizontal layout box for dialog UI elements, auto-expends to available width of container.
264 *
265 * This class is not really part of the API. It just illustrates the properties
266 * that developers can use to define and create horizontal layouts.
267 *
268 * 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}.
269 *
270 * // There is no constructor for this class, the user just has to define an
271 * // object with the appropriate properties.
272 *
273 * // Example:
274 * {
275 * type: 'hbox',
276 * widths: [ '25%', '25%', '50%' ],
277 * children: [
278 * {
279 * type: 'text',
280 * id: 'id1',
281 * width: '40px',
282 * },
283 * {
284 * type: 'text',
285 * id: 'id2',
286 * width: '40px',
287 * },
288 * {
289 * type: 'text',
290 * id: 'id3'
291 * }
292 * ]
293 * }
294 *
295 * @class CKEDITOR.dialog.definition.hbox
296 * @extends CKEDITOR.dialog.definition.uiElement
297 */
298
299/**
300 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container.
301 *
302 * @property {Array} children
303 */
304
305/**
306 * (Optional) The widths of child cells.
307 *
308 * @property {Array} widths
309 */
310
311/**
312 * (Optional) The height of the layout.
313 *
314 * @property {Number} height
315 */
316
317/**
318 * The CSS styles to apply to this element.
319 *
320 * @property {String} styles
321 */
322
323/**
324 * (Optional) The padding width inside child cells. Example: 0, 1.
325 *
326 * @property {Number} padding
327 */
328
329/**
330 * (Optional) The alignment of the whole layout. Example: center, top.
331 *
332 * @property {String} align
333 */
334
335// ----- vbox -----------------------------------------------------------------
336
337/**
338 * Vertical layout box for dialog UI elements.
339 *
340 * This class is not really part of the API. It just illustrates the properties
341 * that developers can use to define and create vertical layouts.
342 *
343 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.vbox} object and can
344 * be accessed with {@link CKEDITOR.dialog#getContentElement}.
345 *
346 * // There is no constructor for this class, the user just has to define an
347 * // object with the appropriate properties.
348 *
349 * // Example:
350 * {
351 * type: 'vbox',
352 * align: 'right',
353 * width: '200px',
354 * children: [
355 * {
356 * type: 'text',
357 * id: 'age',
358 * label: 'Age'
359 * },
360 * {
361 * type: 'text',
362 * id: 'sex',
363 * label: 'Sex'
364 * },
365 * {
366 * type: 'text',
367 * id: 'nationality',
368 * label: 'Nationality'
369 * }
370 * ]
371 * }
372 *
373 * @class CKEDITOR.dialog.definition.vbox
374 * @extends CKEDITOR.dialog.definition.uiElement
375 */
376
377/**
378 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container.
379 *
380 * @property {Array} children
381 */
382
383/**
384 * (Optional) The width of the layout.
385 *
386 * @property {Array} width
387 */
388
389/**
390 * (Optional) The heights of individual cells.
391 *
392 * @property {Number} heights
393 */
394
395/**
396 * The CSS styles to apply to this element.
397 *
398 * @property {String} styles
399 */
400
401/**
402 * (Optional) The padding width inside child cells. Example: 0, 1.
403 *
404 * @property {Number} padding
405 */
406
407/**
408 * (Optional) The alignment of the whole layout. Example: center, top.
409 *
410 * @property {String} align
411 */
412
413/**
414 * (Optional) Whether the layout should expand vertically to fill its container.
415 *
416 * @property {Boolean} expand
417 */
418
419// ----- labeled element ------------------------------------------------------
420
421/**
422 * The definition of labeled user interface element (textarea, textInput etc).
423 *
424 * This class is not really part of the API. It just illustrates the properties
425 * that developers can use to define and create dialog UI elements.
426 *
427 * @class CKEDITOR.dialog.definition.labeledElement
428 * @extends CKEDITOR.dialog.definition.uiElement
429 * @see CKEDITOR.ui.dialog.labeledElement
430 */
431
432/**
433 * The label of the UI element.
434 *
435 * {
436 * type: 'text',
437 * label: 'My Label'
438 * }
439 *
440 * @property {String} label
441 */
442
443/**
444 * (Optional) Specify the layout of the label. Set to `'horizontal'` for horizontal layout.
445 * The default layout is vertical.
446 *
447 * {
448 * type: 'text',
449 * label: 'My Label',
450 * labelLayout: 'horizontal'
451 * }
452 *
453 * @property {String} labelLayout
454 */
455
456/**
457 * (Optional) Applies only to horizontal layouts: a two elements array of lengths to specify the widths of the
458 * label and the content element. See also {@link CKEDITOR.dialog.definition.labeledElement#labelLayout}.
459 *
460 * {
461 * type: 'text',
462 * label: 'My Label',
463 * labelLayout: 'horizontal',
464 * widths: [100, 200]
465 * }
466 *
467 * @property {Array} widths
468 */
469
470/**
471 * Specify the inline style of the uiElement label.
472 *
473 * {
474 * type: 'text',
475 * label: 'My Label',
476 * labelStyle: 'color: red'
477 * }
478 *
479 * @property {String} labelStyle
480 */
481
482
483/**
484 * Specify the inline style of the input element.
485 *
486 * {
487 * type: 'text',
488 * label: 'My Label',
489 * inputStyle: 'text-align: center'
490 * }
491 *
492 * @since 3.6.1
493 * @property {String} inputStyle
494 */
495
496/**
497 * Specify the inline style of the input element container.
498 *
499 * {
500 * type: 'text',
501 * label: 'My Label',
502 * controlStyle: 'width: 3em'
503 * }
504 *
505 * @since 3.6.1
506 * @property {String} controlStyle
507 */
508
509// ----- button ---------------------------------------------------------------
510
511/**
512 * The definition of a button.
513 *
514 * This class is not really part of the API. It just illustrates the properties
515 * that developers can use to define and create buttons.
516 *
517 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.button} object
518 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
519 *
520 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
521 *
522 * // There is no constructor for this class, the user just has to define an
523 * // object with the appropriate properties.
524 *
525 * // Example:
526 * {
527 * type: 'button',
528 * id: 'buttonId',
529 * label: 'Click me',
530 * title: 'My title',
531 * onClick: function() {
532 * // this = CKEDITOR.ui.dialog.button
533 * alert( 'Clicked: ' + this.id );
534 * }
535 * }
536 *
537 * @class CKEDITOR.dialog.definition.button
538 * @extends CKEDITOR.dialog.definition.uiElement
539 */
540
541/**
542 * Whether the button is disabled.
543 *
544 * @property {Boolean} disabled
545 */
546
547/**
548 * The label of the UI element.
549 *
550 * @property {String} label
551 */
552
553// ----- checkbox ------
554/**
555 * The definition of a checkbox element.
556 *
557 * This class is not really part of the API. It just illustrates the properties
558 * that developers can use to define and create groups of checkbox buttons.
559 *
560 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.checkbox} object
561 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
562 *
563 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
564 *
565 * // There is no constructor for this class, the user just has to define an
566 * // object with the appropriate properties.
567 *
568 * // Example:
569 * {
570 * type: 'checkbox',
571 * id: 'agree',
572 * label: 'I agree',
573 * 'default': 'checked',
574 * onClick: function() {
575 * // this = CKEDITOR.ui.dialog.checkbox
576 * alert( 'Checked: ' + this.getValue() );
577 * }
578 * }
579 *
580 * @class CKEDITOR.dialog.definition.checkbox
581 * @extends CKEDITOR.dialog.definition.uiElement
582 */
583
584/**
585 * (Optional) The validation function.
586 *
587 * @property {Function} validate
588 */
589
590/**
591 * The label of the UI element.
592 *
593 * @property {String} label
594 */
595
596/**
597 * The default state.
598 *
599 * @property {String} [default='' (unchecked)]
600 */
601
602// ----- file -----------------------------------------------------------------
603
604/**
605 * The definition of a file upload input.
606 *
607 * This class is not really part of the API. It just illustrates the properties
608 * that developers can use to define and create file upload elements.
609 *
610 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.file} object
611 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
612 *
613 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
614 *
615 * // There is no constructor for this class, the user just has to define an
616 * // object with the appropriate properties.
617 *
618 * // Example:
619 * {
620 * type: 'file',
621 * id: 'upload',
622 * label: 'Select file from your computer',
623 * size: 38
624 * },
625 * {
626 * type: 'fileButton',
627 * id: 'fileId',
628 * label: 'Upload file',
629 * 'for': [ 'tab1', 'upload' ],
630 * filebrowser: {
631 * onSelect: function( fileUrl, data ) {
632 * alert( 'Successfully uploaded: ' + fileUrl );
633 * }
634 * }
635 * }
636 *
637 * @class CKEDITOR.dialog.definition.file
638 * @extends CKEDITOR.dialog.definition.labeledElement
639 */
640
641/**
642 * (Optional) The validation function.
643 *
644 * @property {Function} validate
645 */
646
647/**
648 * (Optional) The action attribute of the form element associated with this file upload input.
649 * If empty, CKEditor will use path to server connector for currently opened folder.
650 *
651 * @property {String} action
652 */
653
654/**
655 * The size of the UI element.
656 *
657 * @property {Number} size
658 */
659
660// ----- fileButton -----------------------------------------------------------
661
662/**
663 * The definition of a button for submitting the file in a file upload input.
664 *
665 * This class is not really part of the API. It just illustrates the properties
666 * that developers can use to define and create a button for submitting the file in a file upload input.
667 *
668 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.fileButton} object
669 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
670 *
671 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
672 *
673 * @class CKEDITOR.dialog.definition.fileButton
674 * @extends CKEDITOR.dialog.definition.uiElement
675 */
676
677/**
678 * (Optional) The validation function.
679 *
680 * @property {Function} validate
681 */
682
683/**
684 * The label of the UI element.
685 *
686 * @property {String} label
687 */
688
689/**
690 * The instruction for CKEditor how to deal with file upload.
691 * By default, the file and fileButton elements will not work "as expected" if this attribute is not set.
692 *
693 * // Update field with id 'txtUrl' in the 'tab1' tab when file is uploaded.
694 * filebrowser: 'tab1:txtUrl'
695 *
696 * // Call custom onSelect function when file is successfully uploaded.
697 * filebrowser: {
698 * onSelect: function( fileUrl, data ) {
699 * alert( 'Successfully uploaded: ' + fileUrl );
700 * }
701 * }
702 *
703 * @property {String} filebrowser/Object
704 */
705
706/**
707 * An array that contains pageId and elementId of the file upload input element for which this button is created.
708 *
709 * [ pageId, elementId ]
710 *
711 * @property {String} for
712 */
713
714// ----- html -----------------------------------------------------------------
715
716/**
717 * The definition of a raw HTML element.
718 *
719 * This class is not really part of the API. It just illustrates the properties
720 * that developers can use to define and create elements made from raw HTML code.
721 *
722 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.html} object
723 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
724 *
725 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
726 * To access HTML elements use {@link CKEDITOR.dom.document#getById}.
727 *
728 * // There is no constructor for this class, the user just has to define an
729 * // object with the appropriate properties.
730 *
731 * // Example 1:
732 * {
733 * type: 'html',
734 * html: '<h3>This is some sample HTML content.</h3>'
735 * }
736 *
737 * // Example 2:
738 * // Complete sample with document.getById() call when the "Ok" button is clicked.
739 * var dialogDefinition = {
740 * title: 'Sample dialog',
741 * minWidth: 300,
742 * minHeight: 200,
743 * onOk: function() {
744 * // "this" is now a CKEDITOR.dialog object.
745 * var document = this.getElement().getDocument();
746 * // document = CKEDITOR.dom.document
747 * var element = <b>document.getById( 'myDiv' );</b>
748 * if ( element )
749 * alert( element.getHtml() );
750 * },
751 * contents: [
752 * {
753 * id: 'tab1',
754 * label: '',
755 * title: '',
756 * elements: [
757 * {
758 * type: 'html',
759 * html: '<div id="myDiv">Sample <b>text</b>.</div><div id="otherId">Another div.</div>'
760 * }
761 * ]
762 * }
763 * ],
764 * buttons: [ CKEDITOR.dialog.cancelButton, CKEDITOR.dialog.okButton ]
765 * };
766 *
767 * @class CKEDITOR.dialog.definition.html
768 * @extends CKEDITOR.dialog.definition.uiElement
769 */
770
771/**
772 * (Required) HTML code of this element.
773 *
774 * @property {String} html
775 */
776
777// ----- radio ----------------------------------------------------------------
778
779/**
780 * The definition of a radio group.
781 *
782 * This class is not really part of the API. It just illustrates the properties
783 * that developers can use to define and create groups of radio buttons.
784 *
785 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.radio} object
786 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
787 *
788 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
789 *
790 * // There is no constructor for this class, the user just has to define an
791 * // object with the appropriate properties.
792 *
793 * // Example:
794 * {
795 * type: 'radio',
796 * id: 'country',
797 * label: 'Which country is bigger',
798 * items: [ [ 'France', 'FR' ], [ 'Germany', 'DE' ] ],
799 * style: 'color: green',
800 * 'default': 'DE',
801 * onClick: function() {
802 * // this = CKEDITOR.ui.dialog.radio
803 * alert( 'Current value: ' + this.getValue() );
804 * }
805 * }
806 *
807 * @class CKEDITOR.dialog.definition.radio
808 * @extends CKEDITOR.dialog.definition.labeledElement
809 */
810
811/**
812 * The default value.
813 *
814 * @property {String} default
815 */
816
817/**
818 * (Optional) The validation function.
819 *
820 * @property {Function} validate
821 */
822
823/**
824 * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`.
825 * If `'Value'` is missing, then the value would be assumed to be the same as the description.
826 *
827 * @property {Array} items
828 */
829
830// ----- selectElement --------------------------------------------------------
831
832/**
833 * The definition of a select element.
834 *
835 * This class is not really part of the API. It just illustrates the properties
836 * that developers can use to define and create select elements.
837 *
838 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.select} object
839 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
840 *
841 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
842 *
843 * // There is no constructor for this class, the user just has to define an
844 * // object with the appropriate properties.
845 *
846 * // Example:
847 * {
848 * type: 'select',
849 * id: 'sport',
850 * label: 'Select your favourite sport',
851 * items: [ [ 'Basketball' ], [ 'Baseball' ], [ 'Hockey' ], [ 'Football' ] ],
852 * 'default': 'Football',
853 * onChange: function( api ) {
854 * // this = CKEDITOR.ui.dialog.select
855 * alert( 'Current value: ' + this.getValue() );
856 * }
857 * }
858 *
859 * @class CKEDITOR.dialog.definition.select
860 * @extends CKEDITOR.dialog.definition.labeledElement
861 */
862
863/**
864 * The default value.
865 *
866 * @property {String} default
867 */
868
869/**
870 * (Optional) The validation function.
871 *
872 * @property {Function} validate
873 */
874
875/**
876 * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`.
877 * If `'Value'` is missing, then the value would be assumed to be the same as the description.
878 *
879 * @property {Array} items
880 */
881
882/**
883 * (Optional) Set this to true if you'd like to have a multiple-choice select box.
884 *
885 * @property {Boolean} [multiple=false]
886 */
887
888/**
889 * (Optional) The number of items to display in the select box.
890 *
891 * @property {Number} size
892 */
893
894// ----- textInput ------------------------------------------------------------
895
896/**
897 * The definition of a text field (single line).
898 *
899 * This class is not really part of the API. It just illustrates the properties
900 * that developers can use to define and create text fields.
901 *
902 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textInput} object
903 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
904 *
905 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
906 *
907 * // There is no constructor for this class, the user just has to define an
908 * // object with the appropriate properties.
909 *
910 * {
911 * type: 'text',
912 * id: 'name',
913 * label: 'Your name',
914 * 'default': '',
915 * validate: function() {
916 * if ( !this.getValue() ) {
917 * api.openMsgDialog( '', 'Name cannot be empty.' );
918 * return false;
919 * }
920 * }
921 * }
922 *
923 * @class CKEDITOR.dialog.definition.textInput
924 * @extends CKEDITOR.dialog.definition.labeledElement
925 */
926
927/**
928 * The default value.
929 *
930 * @property {String} default
931 */
932
933/**
934 * (Optional) The maximum length.
935 *
936 * @property {Number} maxLength
937 */
938
939/**
940 * (Optional) The size of the input field.
941 *
942 * @property {Number} size
943 */
944
945/**
946 * (Optional) The validation function.
947 *
948 * @property {Function} validate
949 */
950
951/**
952 * @property bidi
953 * @inheritdoc CKEDITOR.dialog.definition.textarea#bidi
954 */
955
956// ----- textarea -------------------------------------------------------------
957
958/**
959 * The definition of a text field (multiple lines).
960 *
961 * This class is not really part of the API. It just illustrates the properties
962 * that developers can use to define and create textarea.
963 *
964 * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textarea} object
965 * and can be accessed with {@link CKEDITOR.dialog#getContentElement}.
966 *
967 * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}.
968 *
969* // There is no constructor for this class, the user just has to define an
970* // object with the appropriate properties.
971*
972* // Example:
973* {
974* type: 'textarea',
975* id: 'message',
976* label: 'Your comment',
977* 'default': '',
978* validate: function() {
979* if ( this.getValue().length < 5 ) {
980* api.openMsgDialog( 'The comment is too short.' );
981* return false;
982* }
983* }
984* }
985 *
986 * @class CKEDITOR.dialog.definition.textarea
987 * @extends CKEDITOR.dialog.definition.labeledElement
988 */
989
990/**
991 * The number of rows.
992 *
993 * @property {Number} rows
994 */
995
996/**
997 * The number of columns.
998 *
999 * @property {Number} cols
1000 */
1001
1002/**
1003 * (Optional) The validation function.
1004 *
1005 * @property {Function} validate
1006 */
1007
1008/**
1009 * The default value.
1010 *
1011 * @property {String} default
1012 */
1013
1014/**
1015 * Whether the text direction of this input should be togglable using the following keystrokes:
1016 *
1017 * * *Shift+Alt+End* &ndash; switch to Right-To-Left,
1018 * * *Shift+Alt+Home* &ndash; switch to Left-To-Right.
1019 *
1020 * By default the input will be loaded without any text direction set, which means that
1021 * the direction will be inherited from the editor's text direction.
1022 *
1023 * If the direction was set, a marker will be prepended to every non-empty value of this input:
1024 *
1025 * * [`\u202A`](http://unicode.org/cldr/utility/character.jsp?a=202A) &ndash; for Right-To-Left,
1026 * * [`\u202B`](http://unicode.org/cldr/utility/character.jsp?a=202B) &ndash; for Left-To-Right.
1027 *
1028 * This marker allows for restoring the same text direction upon the next dialog opening.
1029 *
1030 * @since 4.5
1031 * @property {Boolean} bidi
1032 */
diff --git a/sources/plugins/dialog/plugin.js b/sources/plugins/dialog/plugin.js
new file mode 100644
index 00000000..751d7981
--- /dev/null
+++ b/sources/plugins/dialog/plugin.js
@@ -0,0 +1,3398 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The floating dialog plugin.
8 */
9
10/**
11 * No resize for this dialog.
12 *
13 * @readonly
14 * @property {Number} [=0]
15 * @member CKEDITOR
16 */
17CKEDITOR.DIALOG_RESIZE_NONE = 0;
18
19/**
20 * Only allow horizontal resizing for this dialog, disable vertical resizing.
21 *
22 * @readonly
23 * @property {Number} [=1]
24 * @member CKEDITOR
25 */
26CKEDITOR.DIALOG_RESIZE_WIDTH = 1;
27
28/**
29 * Only allow vertical resizing for this dialog, disable horizontal resizing.
30 *
31 * @readonly
32 * @property {Number} [=2]
33 * @member CKEDITOR
34 */
35CKEDITOR.DIALOG_RESIZE_HEIGHT = 2;
36
37/**
38 * Allow the dialog to be resized in both directions.
39 *
40 * @readonly
41 * @property {Number} [=3]
42 * @member CKEDITOR
43 */
44CKEDITOR.DIALOG_RESIZE_BOTH = 3;
45
46/**
47 * Dialog state when idle.
48 *
49 * @readonly
50 * @property {Number} [=1]
51 * @member CKEDITOR
52 */
53CKEDITOR.DIALOG_STATE_IDLE = 1;
54
55/**
56 * Dialog state when busy.
57 *
58 * @readonly
59 * @property {Number} [=2]
60 * @member CKEDITOR
61 */
62CKEDITOR.DIALOG_STATE_BUSY = 2;
63
64( function() {
65 var cssLength = CKEDITOR.tools.cssLength;
66
67 function isTabVisible( tabId ) {
68 return !!this._.tabs[ tabId ][ 0 ].$.offsetHeight;
69 }
70
71 function getPreviousVisibleTab() {
72 var tabId = this._.currentTabId,
73 length = this._.tabIdList.length,
74 tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ) + length;
75
76 for ( var i = tabIndex - 1; i > tabIndex - length; i-- ) {
77 if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) )
78 return this._.tabIdList[ i % length ];
79 }
80
81 return null;
82 }
83
84 function getNextVisibleTab() {
85 var tabId = this._.currentTabId,
86 length = this._.tabIdList.length,
87 tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId );
88
89 for ( var i = tabIndex + 1; i < tabIndex + length; i++ ) {
90 if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) )
91 return this._.tabIdList[ i % length ];
92 }
93
94 return null;
95 }
96
97
98 function clearOrRecoverTextInputValue( container, isRecover ) {
99 var inputs = container.$.getElementsByTagName( 'input' );
100 for ( var i = 0, length = inputs.length; i < length; i++ ) {
101 var item = new CKEDITOR.dom.element( inputs[ i ] );
102
103 if ( item.getAttribute( 'type' ).toLowerCase() == 'text' ) {
104 if ( isRecover ) {
105 item.setAttribute( 'value', item.getCustomData( 'fake_value' ) || '' );
106 item.removeCustomData( 'fake_value' );
107 } else {
108 item.setCustomData( 'fake_value', item.getAttribute( 'value' ) );
109 item.setAttribute( 'value', '' );
110 }
111 }
112 }
113 }
114
115 // Handle dialog element validation state UI changes.
116 function handleFieldValidated( isValid, msg ) {
117 var input = this.getInputElement();
118 if ( input )
119 isValid ? input.removeAttribute( 'aria-invalid' ) : input.setAttribute( 'aria-invalid', true );
120
121 if ( !isValid ) {
122 if ( this.select )
123 this.select();
124 else
125 this.focus();
126 }
127
128 msg && alert( msg ); // jshint ignore:line
129
130 this.fire( 'validated', { valid: isValid, msg: msg } );
131 }
132
133 function resetField() {
134 var input = this.getInputElement();
135 input && input.removeAttribute( 'aria-invalid' );
136 }
137
138 var templateSource = '<div class="cke_reset_all {editorId} {editorDialogClass} {hidpi}' +
139 '" dir="{langDir}"' +
140 ' lang="{langCode}"' +
141 ' role="dialog"' +
142 ' aria-labelledby="cke_dialog_title_{id}"' +
143 '>' +
144 '<table class="cke_dialog ' + CKEDITOR.env.cssClass + ' cke_{langDir}"' +
145 ' style="position:absolute" role="presentation">' +
146 '<tr><td role="presentation">' +
147 '<div class="cke_dialog_body" role="presentation">' +
148 '<div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div>' +
149 '<a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a>' +
150 '<div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div>' +
151 '<table class="cke_dialog_contents" role="presentation">' +
152 '<tr>' +
153 '<td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td>' +
154 '</tr>' +
155 '<tr>' +
156 '<td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td>' +
157 '</tr>' +
158 '</table>' +
159 '</div>' +
160 '</td></tr>' +
161 '</table>' +
162 '</div>';
163
164 function buildDialog( editor ) {
165 var element = CKEDITOR.dom.element.createFromHtml( CKEDITOR.addTemplate( 'dialog', templateSource ).output( {
166 id: CKEDITOR.tools.getNextNumber(),
167 editorId: editor.id,
168 langDir: editor.lang.dir,
169 langCode: editor.langCode,
170 editorDialogClass: 'cke_editor_' + editor.name.replace( /\./g, '\\.' ) + '_dialog',
171 closeTitle: editor.lang.common.close,
172 hidpi: CKEDITOR.env.hidpi ? 'cke_hidpi' : ''
173 } ) );
174
175 // TODO: Change this to getById(), so it'll support custom templates.
176 var body = element.getChild( [ 0, 0, 0, 0, 0 ] ),
177 title = body.getChild( 0 ),
178 close = body.getChild( 1 );
179
180 // Don't allow dragging on dialog (#13184).
181 editor.plugins.clipboard && CKEDITOR.plugins.clipboard.preventDefaultDropOnElement( body );
182
183 // IFrame shim for dialog that masks activeX in IE. (#7619)
184 if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks && !CKEDITOR.env.edge ) {
185 var src = 'javascript:void(function(){' + encodeURIComponent( 'document.open();(' + CKEDITOR.tools.fixDomain + ')();document.close();' ) + '}())', // jshint ignore:line
186 iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
187 ' frameBorder="0"' +
188 ' class="cke_iframe_shim"' +
189 ' src="' + src + '"' +
190 ' tabIndex="-1"' +
191 '></iframe>' );
192 iframe.appendTo( body.getParent() );
193 }
194
195 // Make the Title and Close Button unselectable.
196 title.unselectable();
197 close.unselectable();
198
199 return {
200 element: element,
201 parts: {
202 dialog: element.getChild( 0 ),
203 title: title,
204 close: close,
205 tabs: body.getChild( 2 ),
206 contents: body.getChild( [ 3, 0, 0, 0 ] ),
207 footer: body.getChild( [ 3, 0, 1, 0 ] )
208 }
209 };
210 }
211
212 /**
213 * This is the base class for runtime dialog objects. An instance of this
214 * class represents a single named dialog for a single editor instance.
215 *
216 * var dialogObj = new CKEDITOR.dialog( editor, 'smiley' );
217 *
218 * @class
219 * @constructor Creates a dialog class instance.
220 * @param {Object} editor The editor which created the dialog.
221 * @param {String} dialogName The dialog's registered name.
222 */
223 CKEDITOR.dialog = function( editor, dialogName ) {
224 // Load the dialog definition.
225 var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ],
226 defaultDefinition = CKEDITOR.tools.clone( defaultDialogDefinition ),
227 buttonsOrder = editor.config.dialog_buttonsOrder || 'OS',
228 dir = editor.lang.dir,
229 tabsToRemove = {},
230 i, processed, stopPropagation;
231
232 if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) || // The buttons in MacOS Apps are in reverse order (#4750)
233 ( buttonsOrder == 'rtl' && dir == 'ltr' ) || ( buttonsOrder == 'ltr' && dir == 'rtl' ) )
234 defaultDefinition.buttons.reverse();
235
236
237 // Completes the definition with the default values.
238 definition = CKEDITOR.tools.extend( definition( editor ), defaultDefinition );
239
240 // Clone a functionally independent copy for this dialog.
241 definition = CKEDITOR.tools.clone( definition );
242
243 // Create a complex definition object, extending it with the API
244 // functions.
245 definition = new definitionObject( this, definition );
246
247 var themeBuilt = buildDialog( editor );
248
249 // Initialize some basic parameters.
250 this._ = {
251 editor: editor,
252 element: themeBuilt.element,
253 name: dialogName,
254 contentSize: { width: 0, height: 0 },
255 size: { width: 0, height: 0 },
256 contents: {},
257 buttons: {},
258 accessKeyMap: {},
259
260 // Initialize the tab and page map.
261 tabs: {},
262 tabIdList: [],
263 currentTabId: null,
264 currentTabIndex: null,
265 pageCount: 0,
266 lastTab: null,
267 tabBarMode: false,
268
269 // Initialize the tab order array for input widgets.
270 focusList: [],
271 currentFocusIndex: 0,
272 hasFocus: false
273 };
274
275 this.parts = themeBuilt.parts;
276
277 CKEDITOR.tools.setTimeout( function() {
278 editor.fire( 'ariaWidget', this.parts.contents );
279 }, 0, this );
280
281 // Set the startup styles for the dialog, avoiding it enlarging the
282 // page size on the dialog creation.
283 var startStyles = {
284 position: CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed',
285 top: 0,
286 visibility: 'hidden'
287 };
288
289 startStyles[ dir == 'rtl' ? 'right' : 'left' ] = 0;
290 this.parts.dialog.setStyles( startStyles );
291
292
293 // Call the CKEDITOR.event constructor to initialize this instance.
294 CKEDITOR.event.call( this );
295
296 // Fire the "dialogDefinition" event, making it possible to customize
297 // the dialog definition.
298 this.definition = definition = CKEDITOR.fire( 'dialogDefinition', {
299 name: dialogName,
300 definition: definition
301 }, editor ).definition;
302
303 // Cache tabs that should be removed.
304 if ( !( 'removeDialogTabs' in editor._ ) && editor.config.removeDialogTabs ) {
305 var removeContents = editor.config.removeDialogTabs.split( ';' );
306
307 for ( i = 0; i < removeContents.length; i++ ) {
308 var parts = removeContents[ i ].split( ':' );
309 if ( parts.length == 2 ) {
310 var removeDialogName = parts[ 0 ];
311 if ( !tabsToRemove[ removeDialogName ] )
312 tabsToRemove[ removeDialogName ] = [];
313 tabsToRemove[ removeDialogName ].push( parts[ 1 ] );
314 }
315 }
316 editor._.removeDialogTabs = tabsToRemove;
317 }
318
319 // Remove tabs of this dialog.
320 if ( editor._.removeDialogTabs && ( tabsToRemove = editor._.removeDialogTabs[ dialogName ] ) ) {
321 for ( i = 0; i < tabsToRemove.length; i++ )
322 definition.removeContents( tabsToRemove[ i ] );
323 }
324
325 // Initialize load, show, hide, ok and cancel events.
326 if ( definition.onLoad )
327 this.on( 'load', definition.onLoad );
328
329 if ( definition.onShow )
330 this.on( 'show', definition.onShow );
331
332 if ( definition.onHide )
333 this.on( 'hide', definition.onHide );
334
335 if ( definition.onOk ) {
336 this.on( 'ok', function( evt ) {
337 // Dialog confirm might probably introduce content changes (#5415).
338 editor.fire( 'saveSnapshot' );
339 setTimeout( function() {
340 editor.fire( 'saveSnapshot' );
341 }, 0 );
342 if ( definition.onOk.call( this, evt ) === false )
343 evt.data.hide = false;
344 } );
345 }
346
347 // Set default dialog state.
348 this.state = CKEDITOR.DIALOG_STATE_IDLE;
349
350 if ( definition.onCancel ) {
351 this.on( 'cancel', function( evt ) {
352 if ( definition.onCancel.call( this, evt ) === false )
353 evt.data.hide = false;
354 } );
355 }
356
357 var me = this;
358
359 // Iterates over all items inside all content in the dialog, calling a
360 // function for each of them.
361 var iterContents = function( func ) {
362 var contents = me._.contents,
363 stop = false;
364
365 for ( var i in contents ) {
366 for ( var j in contents[ i ] ) {
367 stop = func.call( this, contents[ i ][ j ] );
368 if ( stop )
369 return;
370 }
371 }
372 };
373
374 this.on( 'ok', function( evt ) {
375 iterContents( function( item ) {
376 if ( item.validate ) {
377 var retval = item.validate( this ),
378 invalid = ( typeof retval == 'string' ) || retval === false;
379
380 if ( invalid ) {
381 evt.data.hide = false;
382 evt.stop();
383 }
384
385 handleFieldValidated.call( item, !invalid, typeof retval == 'string' ? retval : undefined );
386 return invalid;
387 }
388 } );
389 }, this, null, 0 );
390
391 this.on( 'cancel', function( evt ) {
392 iterContents( function( item ) {
393 if ( item.isChanged() ) {
394 if ( !editor.config.dialog_noConfirmCancel && !confirm( editor.lang.common.confirmCancel ) ) // jshint ignore:line
395 evt.data.hide = false;
396 return true;
397 }
398 } );
399 }, this, null, 0 );
400
401 this.parts.close.on( 'click', function( evt ) {
402 if ( this.fire( 'cancel', { hide: true } ).hide !== false )
403 this.hide();
404 evt.data.preventDefault();
405 }, this );
406
407 // Sort focus list according to tab order definitions.
408 function setupFocus() {
409 var focusList = me._.focusList;
410 focusList.sort( function( a, b ) {
411 // Mimics browser tab order logics;
412 if ( a.tabIndex != b.tabIndex )
413 return b.tabIndex - a.tabIndex;
414 // Sort is not stable in some browsers,
415 // fall-back the comparator to 'focusIndex';
416 else
417 return a.focusIndex - b.focusIndex;
418 } );
419
420 var size = focusList.length;
421 for ( var i = 0; i < size; i++ )
422 focusList[ i ].focusIndex = i;
423 }
424
425 // Expects 1 or -1 as an offset, meaning direction of the offset change.
426 function changeFocus( offset ) {
427 var focusList = me._.focusList;
428 offset = offset || 0;
429
430 if ( focusList.length < 1 )
431 return;
432
433 var startIndex = me._.currentFocusIndex;
434
435 if ( me._.tabBarMode && offset < 0 ) {
436 // If we are in tab mode, we need to mimic that we started tabbing back from the first
437 // focusList (so it will go to the last one).
438 startIndex = 0;
439 }
440
441 // Trigger the 'blur' event of any input element before anything,
442 // since certain UI updates may depend on it.
443 try {
444 focusList[ startIndex ].getInputElement().$.blur();
445 } catch ( e ) {}
446
447 var currentIndex = startIndex,
448 hasTabs = me._.pageCount > 1;
449
450 do {
451 currentIndex = currentIndex + offset;
452
453 if ( hasTabs && !me._.tabBarMode && ( currentIndex == focusList.length || currentIndex == -1 ) ) {
454 // If the dialog was not in tab mode, then focus the first tab (#13027).
455 me._.tabBarMode = true;
456 me._.tabs[ me._.currentTabId ][ 0 ].focus();
457 me._.currentFocusIndex = -1;
458
459 // Early return, in order to avoid accessing focusList[ -1 ].
460 return;
461 }
462
463 currentIndex = ( currentIndex + focusList.length ) % focusList.length;
464
465 if ( currentIndex == startIndex ) {
466 break;
467 }
468 } while ( offset && !focusList[ currentIndex ].isFocusable() );
469
470 focusList[ currentIndex ].focus();
471
472 // Select whole field content.
473 if ( focusList[ currentIndex ].type == 'text' )
474 focusList[ currentIndex ].select();
475 }
476
477 this.changeFocus = changeFocus;
478
479
480 function keydownHandler( evt ) {
481 // If I'm not the top dialog, ignore.
482 if ( me != CKEDITOR.dialog._.currentTop )
483 return;
484
485 var keystroke = evt.data.getKeystroke(),
486 rtl = editor.lang.dir == 'rtl',
487 arrowKeys = [ 37, 38, 39, 40 ],
488 button;
489
490 processed = stopPropagation = 0;
491
492 if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 ) {
493 var shiftPressed = ( keystroke == CKEDITOR.SHIFT + 9 );
494 changeFocus( shiftPressed ? -1 : 1 );
495 processed = 1;
496 } else if ( keystroke == CKEDITOR.ALT + 121 && !me._.tabBarMode && me.getPageCount() > 1 ) {
497 // Alt-F10 puts focus into the current tab item in the tab bar.
498 me._.tabBarMode = true;
499 me._.tabs[ me._.currentTabId ][ 0 ].focus();
500 me._.currentFocusIndex = -1;
501 processed = 1;
502 } else if ( CKEDITOR.tools.indexOf( arrowKeys, keystroke ) != -1 && me._.tabBarMode ) {
503 // Array with key codes that activate previous tab.
504 var prevKeyCodes = [
505 // Depending on the lang dir: right or left key
506 rtl ? 39 : 37,
507 // Top/bot arrow: actually for both cases it's the same.
508 38
509 ],
510 nextId = CKEDITOR.tools.indexOf( prevKeyCodes, keystroke ) != -1 ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me );
511
512 me.selectPage( nextId );
513 me._.tabs[ nextId ][ 0 ].focus();
514 processed = 1;
515 } else if ( ( keystroke == 13 || keystroke == 32 ) && me._.tabBarMode ) {
516 this.selectPage( this._.currentTabId );
517 this._.tabBarMode = false;
518 this._.currentFocusIndex = -1;
519 changeFocus( 1 );
520 processed = 1;
521 }
522 // If user presses enter key in a text box, it implies clicking OK for the dialog.
523 else if ( keystroke == 13 /*ENTER*/ ) {
524 // Don't do that for a target that handles ENTER.
525 var target = evt.data.getTarget();
526 if ( !target.is( 'a', 'button', 'select', 'textarea' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) ) {
527 button = this.getButton( 'ok' );
528 button && CKEDITOR.tools.setTimeout( button.click, 0, button );
529 processed = 1;
530 }
531 stopPropagation = 1; // Always block the propagation (#4269)
532 } else if ( keystroke == 27 /*ESC*/ ) {
533 button = this.getButton( 'cancel' );
534
535 // If there's a Cancel button, click it, else just fire the cancel event and hide the dialog.
536 if ( button )
537 CKEDITOR.tools.setTimeout( button.click, 0, button );
538 else {
539 if ( this.fire( 'cancel', { hide: true } ).hide !== false )
540 this.hide();
541 }
542 stopPropagation = 1; // Always block the propagation (#4269)
543 } else {
544 return;
545 }
546
547 keypressHandler( evt );
548 }
549
550 function keypressHandler( evt ) {
551 if ( processed )
552 evt.data.preventDefault( 1 );
553 else if ( stopPropagation )
554 evt.data.stopPropagation();
555 }
556
557 var dialogElement = this._.element;
558
559 editor.focusManager.add( dialogElement, 1 );
560
561 // Add the dialog keyboard handlers.
562 this.on( 'show', function() {
563 dialogElement.on( 'keydown', keydownHandler, this );
564
565 // Some browsers instead, don't cancel key events in the keydown, but in the
566 // keypress. So we must do a longer trip in those cases. (#4531,#8985)
567 if ( CKEDITOR.env.gecko )
568 dialogElement.on( 'keypress', keypressHandler, this );
569
570 } );
571 this.on( 'hide', function() {
572 dialogElement.removeListener( 'keydown', keydownHandler );
573 if ( CKEDITOR.env.gecko )
574 dialogElement.removeListener( 'keypress', keypressHandler );
575
576 // Reset fields state when closing dialog.
577 iterContents( function( item ) {
578 resetField.apply( item );
579 } );
580 } );
581 this.on( 'iframeAdded', function( evt ) {
582 var doc = new CKEDITOR.dom.document( evt.data.iframe.$.contentWindow.document );
583 doc.on( 'keydown', keydownHandler, this, null, 0 );
584 } );
585
586 // Auto-focus logic in dialog.
587 this.on( 'show', function() {
588 // Setup tabIndex on showing the dialog instead of on loading
589 // to allow dynamic tab order happen in dialog definition.
590 setupFocus();
591
592 var hasTabs = me._.pageCount > 1;
593
594 if ( editor.config.dialog_startupFocusTab && hasTabs ) {
595 me._.tabBarMode = true;
596 me._.tabs[ me._.currentTabId ][ 0 ].focus();
597 me._.currentFocusIndex = -1;
598 } else if ( !this._.hasFocus ) {
599 // http://dev.ckeditor.com/ticket/13114#comment:4.
600 this._.currentFocusIndex = hasTabs ? -1 : this._.focusList.length - 1;
601
602 // Decide where to put the initial focus.
603 if ( definition.onFocus ) {
604 var initialFocus = definition.onFocus.call( this );
605 // Focus the field that the user specified.
606 initialFocus && initialFocus.focus();
607 }
608 // Focus the first field in layout order.
609 else {
610 changeFocus( 1 );
611 }
612 }
613 }, this, null, 0xffffffff );
614
615 // IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (#2661).
616 // This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken.
617 if ( CKEDITOR.env.ie6Compat ) {
618 this.on( 'load', function() {
619 var outer = this.getElement(),
620 inner = outer.getFirst();
621 inner.remove();
622 inner.appendTo( outer );
623 }, this );
624 }
625
626 initDragAndDrop( this );
627 initResizeHandles( this );
628
629 // Insert the title.
630 ( new CKEDITOR.dom.text( definition.title, CKEDITOR.document ) ).appendTo( this.parts.title );
631
632 // Insert the tabs and contents.
633 for ( i = 0; i < definition.contents.length; i++ ) {
634 var page = definition.contents[ i ];
635 page && this.addPage( page );
636 }
637
638 this.parts.tabs.on( 'click', function( evt ) {
639 var target = evt.data.getTarget();
640 // If we aren't inside a tab, bail out.
641 if ( target.hasClass( 'cke_dialog_tab' ) ) {
642 // Get the ID of the tab, without the 'cke_' prefix and the unique number suffix.
643 var id = target.$.id;
644 this.selectPage( id.substring( 4, id.lastIndexOf( '_' ) ) );
645
646 if ( this._.tabBarMode ) {
647 this._.tabBarMode = false;
648 this._.currentFocusIndex = -1;
649 changeFocus( 1 );
650 }
651 evt.data.preventDefault();
652 }
653 }, this );
654
655 // Insert buttons.
656 var buttonsHtml = [],
657 buttons = CKEDITOR.dialog._.uiElementBuilders.hbox.build( this, {
658 type: 'hbox',
659 className: 'cke_dialog_footer_buttons',
660 widths: [],
661 children: definition.buttons
662 }, buttonsHtml ).getChild();
663 this.parts.footer.setHtml( buttonsHtml.join( '' ) );
664
665 for ( i = 0; i < buttons.length; i++ )
666 this._.buttons[ buttons[ i ].id ] = buttons[ i ];
667
668 /**
669 * Current state of the dialog. Use the {@link #setState} method to update it.
670 * See the {@link #event-state} event to know more.
671 *
672 * @readonly
673 * @property {Number} [state=CKEDITOR.DIALOG_STATE_IDLE]
674 */
675 };
676
677 // Focusable interface. Use it via dialog.addFocusable.
678 function Focusable( dialog, element, index ) {
679 this.element = element;
680 this.focusIndex = index;
681 // TODO: support tabIndex for focusables.
682 this.tabIndex = 0;
683 this.isFocusable = function() {
684 return !element.getAttribute( 'disabled' ) && element.isVisible();
685 };
686 this.focus = function() {
687 dialog._.currentFocusIndex = this.focusIndex;
688 this.element.focus();
689 };
690 // Bind events
691 element.on( 'keydown', function( e ) {
692 if ( e.data.getKeystroke() in { 32: 1, 13: 1 } )
693 this.fire( 'click' );
694 } );
695 element.on( 'focus', function() {
696 this.fire( 'mouseover' );
697 } );
698 element.on( 'blur', function() {
699 this.fire( 'mouseout' );
700 } );
701 }
702
703 // Re-layout the dialog on window resize.
704 function resizeWithWindow( dialog ) {
705 var win = CKEDITOR.document.getWindow();
706 function resizeHandler() {
707 dialog.layout();
708 }
709 win.on( 'resize', resizeHandler );
710 dialog.on( 'hide', function() {
711 win.removeListener( 'resize', resizeHandler );
712 } );
713 }
714
715 CKEDITOR.dialog.prototype = {
716 destroy: function() {
717 this.hide();
718 this._.element.remove();
719 },
720
721 /**
722 * Resizes the dialog.
723 *
724 * dialogObj.resize( 800, 640 );
725 *
726 * @method
727 * @param {Number} width The width of the dialog in pixels.
728 * @param {Number} height The height of the dialog in pixels.
729 */
730 resize: ( function() {
731 return function( width, height ) {
732 if ( this._.contentSize && this._.contentSize.width == width && this._.contentSize.height == height )
733 return;
734
735 CKEDITOR.dialog.fire( 'resize', {
736 dialog: this,
737 width: width,
738 height: height
739 }, this._.editor );
740
741 this.fire( 'resize', {
742 width: width,
743 height: height
744 }, this._.editor );
745
746 var contents = this.parts.contents;
747 contents.setStyles( {
748 width: width + 'px',
749 height: height + 'px'
750 } );
751
752 // Update dialog position when dimension get changed in RTL.
753 if ( this._.editor.lang.dir == 'rtl' && this._.position )
754 this._.position.x = CKEDITOR.document.getWindow().getViewPaneSize().width - this._.contentSize.width - parseInt( this._.element.getFirst().getStyle( 'right' ), 10 );
755
756 this._.contentSize = { width: width, height: height };
757 };
758 } )(),
759
760 /**
761 * Gets the current size of the dialog in pixels.
762 *
763 * var width = dialogObj.getSize().width;
764 *
765 * @returns {Object}
766 * @returns {Number} return.width
767 * @returns {Number} return.height
768 */
769 getSize: function() {
770 var element = this._.element.getFirst();
771 return { width: element.$.offsetWidth || 0, height: element.$.offsetHeight || 0 };
772 },
773
774 /**
775 * Moves the dialog to an `(x, y)` coordinate relative to the window.
776 *
777 * dialogObj.move( 10, 40 );
778 *
779 * @method
780 * @param {Number} x The target x-coordinate.
781 * @param {Number} y The target y-coordinate.
782 * @param {Boolean} save Flag indicate whether the dialog position should be remembered on next open up.
783 */
784 move: function( x, y, save ) {
785
786 // The dialog may be fixed positioned or absolute positioned. Ask the
787 // browser what is the current situation first.
788 var element = this._.element.getFirst(), rtl = this._.editor.lang.dir == 'rtl';
789 var isFixed = element.getComputedStyle( 'position' ) == 'fixed';
790
791 // (#8888) In some cases of a very small viewport, dialog is incorrectly
792 // positioned in IE7. It also happens that it remains sticky and user cannot
793 // scroll down/up to reveal dialog's content below/above the viewport; this is
794 // cumbersome.
795 // The only way to fix this is to move mouse out of the browser and
796 // go back to see that dialog position is automagically fixed. No events,
797 // no style change - pure magic. This is a IE7 rendering issue, which can be
798 // fixed with dummy style redraw on each move.
799 if ( CKEDITOR.env.ie )
800 element.setStyle( 'zoom', '100%' );
801
802 if ( isFixed && this._.position && this._.position.x == x && this._.position.y == y )
803 return;
804
805 // Save the current position.
806 this._.position = { x: x, y: y };
807
808 // If not fixed positioned, add scroll position to the coordinates.
809 if ( !isFixed ) {
810 var scrollPosition = CKEDITOR.document.getWindow().getScrollPosition();
811 x += scrollPosition.x;
812 y += scrollPosition.y;
813 }
814
815 // Translate coordinate for RTL.
816 if ( rtl ) {
817 var dialogSize = this.getSize(), viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize();
818 x = viewPaneSize.width - dialogSize.width - x;
819 }
820
821 var styles = { 'top': ( y > 0 ? y : 0 ) + 'px' };
822 styles[ rtl ? 'right' : 'left' ] = ( x > 0 ? x : 0 ) + 'px';
823
824 element.setStyles( styles );
825
826 save && ( this._.moved = 1 );
827 },
828
829 /**
830 * Gets the dialog's position in the window.
831 *
832 * var dialogX = dialogObj.getPosition().x;
833 *
834 * @returns {Object}
835 * @returns {Number} return.x
836 * @returns {Number} return.y
837 */
838 getPosition: function() {
839 return CKEDITOR.tools.extend( {}, this._.position );
840 },
841
842 /**
843 * Shows the dialog box.
844 *
845 * dialogObj.show();
846 */
847 show: function() {
848 // Insert the dialog's element to the root document.
849 var element = this._.element;
850 var definition = this.definition;
851 if ( !( element.getParent() && element.getParent().equals( CKEDITOR.document.getBody() ) ) )
852 element.appendTo( CKEDITOR.document.getBody() );
853 else
854 element.setStyle( 'display', 'block' );
855
856 // First, set the dialog to an appropriate size.
857 this.resize(
858 this._.contentSize && this._.contentSize.width || definition.width || definition.minWidth,
859 this._.contentSize && this._.contentSize.height || definition.height || definition.minHeight
860 );
861
862 // Reset all inputs back to their default value.
863 this.reset();
864
865 // Select the first tab by default.
866 this.selectPage( this.definition.contents[ 0 ].id );
867
868 // Set z-index.
869 if ( CKEDITOR.dialog._.currentZIndex === null )
870 CKEDITOR.dialog._.currentZIndex = this._.editor.config.baseFloatZIndex;
871 this._.element.getFirst().setStyle( 'z-index', CKEDITOR.dialog._.currentZIndex += 10 );
872
873 // Maintain the dialog ordering and dialog cover.
874 if ( CKEDITOR.dialog._.currentTop === null ) {
875 CKEDITOR.dialog._.currentTop = this;
876 this._.parentDialog = null;
877 showCover( this._.editor );
878
879 } else {
880 this._.parentDialog = CKEDITOR.dialog._.currentTop;
881 var parentElement = this._.parentDialog.getElement().getFirst();
882 parentElement.$.style.zIndex -= Math.floor( this._.editor.config.baseFloatZIndex / 2 );
883 CKEDITOR.dialog._.currentTop = this;
884 }
885
886 element.on( 'keydown', accessKeyDownHandler );
887 element.on( 'keyup', accessKeyUpHandler );
888
889 // Reset the hasFocus state.
890 this._.hasFocus = false;
891
892 for ( var i in definition.contents ) {
893 if ( !definition.contents[ i ] )
894 continue;
895
896 var content = definition.contents[ i ],
897 tab = this._.tabs[ content.id ],
898 requiredContent = content.requiredContent,
899 enableElements = 0;
900
901 if ( !tab )
902 continue;
903
904 for ( var j in this._.contents[ content.id ] ) {
905 var elem = this._.contents[ content.id ][ j ];
906
907 if ( elem.type == 'hbox' || elem.type == 'vbox' || !elem.getInputElement() )
908 continue;
909
910 if ( elem.requiredContent && !this._.editor.activeFilter.check( elem.requiredContent ) )
911 elem.disable();
912 else {
913 elem.enable();
914 enableElements++;
915 }
916 }
917
918 if ( !enableElements || ( requiredContent && !this._.editor.activeFilter.check( requiredContent ) ) )
919 tab[ 0 ].addClass( 'cke_dialog_tab_disabled' );
920 else
921 tab[ 0 ].removeClass( 'cke_dialog_tab_disabled' );
922 }
923
924 CKEDITOR.tools.setTimeout( function() {
925 this.layout();
926 resizeWithWindow( this );
927
928 this.parts.dialog.setStyle( 'visibility', '' );
929
930 // Execute onLoad for the first show.
931 this.fireOnce( 'load', {} );
932 CKEDITOR.ui.fire( 'ready', this );
933
934 this.fire( 'show', {} );
935 this._.editor.fire( 'dialogShow', this );
936
937 if ( !this._.parentDialog )
938 this._.editor.focusManager.lock();
939
940 // Save the initial values of the dialog.
941 this.foreach( function( contentObj ) {
942 contentObj.setInitValue && contentObj.setInitValue();
943 } );
944
945 }, 100, this );
946 },
947
948 /**
949 * Rearrange the dialog to its previous position or the middle of the window.
950 *
951 * @since 3.5
952 */
953 layout: function() {
954 var el = this.parts.dialog;
955 var dialogSize = this.getSize();
956 var win = CKEDITOR.document.getWindow(),
957 viewSize = win.getViewPaneSize();
958
959 var posX = ( viewSize.width - dialogSize.width ) / 2,
960 posY = ( viewSize.height - dialogSize.height ) / 2;
961
962 // Switch to absolute position when viewport is smaller than dialog size.
963 if ( !CKEDITOR.env.ie6Compat ) {
964 if ( dialogSize.height + ( posY > 0 ? posY : 0 ) > viewSize.height || dialogSize.width + ( posX > 0 ? posX : 0 ) > viewSize.width ) {
965 el.setStyle( 'position', 'absolute' );
966 } else {
967 el.setStyle( 'position', 'fixed' );
968 }
969 }
970
971 this.move( this._.moved ? this._.position.x : posX, this._.moved ? this._.position.y : posY );
972 },
973
974 /**
975 * Executes a function for each UI element.
976 *
977 * @param {Function} fn Function to execute for each UI element.
978 * @returns {CKEDITOR.dialog} The current dialog object.
979 */
980 foreach: function( fn ) {
981 for ( var i in this._.contents ) {
982 for ( var j in this._.contents[ i ] ) {
983 fn.call( this, this._.contents[i][j] );
984 }
985 }
986
987 return this;
988 },
989
990 /**
991 * Resets all input values in the dialog.
992 *
993 * dialogObj.reset();
994 *
995 * @method
996 * @chainable
997 */
998 reset: ( function() {
999 var fn = function( widget ) {
1000 if ( widget.reset )
1001 widget.reset( 1 );
1002 };
1003 return function() {
1004 this.foreach( fn );
1005 return this;
1006 };
1007 } )(),
1008
1009
1010 /**
1011 * Calls the {@link CKEDITOR.dialog.definition.uiElement#setup} method of each
1012 * of the UI elements, with the arguments passed through it.
1013 * It is usually being called when the dialog is opened, to put the initial value inside the field.
1014 *
1015 * dialogObj.setupContent();
1016 *
1017 * var timestamp = ( new Date() ).valueOf();
1018 * dialogObj.setupContent( timestamp );
1019 */
1020 setupContent: function() {
1021 var args = arguments;
1022 this.foreach( function( widget ) {
1023 if ( widget.setup )
1024 widget.setup.apply( widget, args );
1025 } );
1026 },
1027
1028 /**
1029 * Calls the {@link CKEDITOR.dialog.definition.uiElement#commit} method of each
1030 * of the UI elements, with the arguments passed through it.
1031 * It is usually being called when the user confirms the dialog, to process the values.
1032 *
1033 * dialogObj.commitContent();
1034 *
1035 * var timestamp = ( new Date() ).valueOf();
1036 * dialogObj.commitContent( timestamp );
1037 */
1038 commitContent: function() {
1039 var args = arguments;
1040 this.foreach( function( widget ) {
1041 // Make sure IE triggers "change" event on last focused input before closing the dialog. (#7915)
1042 if ( CKEDITOR.env.ie && this._.currentFocusIndex == widget.focusIndex )
1043 widget.getInputElement().$.blur();
1044
1045 if ( widget.commit )
1046 widget.commit.apply( widget, args );
1047 } );
1048 },
1049
1050 /**
1051 * Hides the dialog box.
1052 *
1053 * dialogObj.hide();
1054 */
1055 hide: function() {
1056 if ( !this.parts.dialog.isVisible() )
1057 return;
1058
1059 this.fire( 'hide', {} );
1060 this._.editor.fire( 'dialogHide', this );
1061 // Reset the tab page.
1062 this.selectPage( this._.tabIdList[ 0 ] );
1063 var element = this._.element;
1064 element.setStyle( 'display', 'none' );
1065 this.parts.dialog.setStyle( 'visibility', 'hidden' );
1066 // Unregister all access keys associated with this dialog.
1067 unregisterAccessKey( this );
1068
1069 // Close any child(top) dialogs first.
1070 while ( CKEDITOR.dialog._.currentTop != this )
1071 CKEDITOR.dialog._.currentTop.hide();
1072
1073 // Maintain dialog ordering and remove cover if needed.
1074 if ( !this._.parentDialog )
1075 hideCover( this._.editor );
1076 else {
1077 var parentElement = this._.parentDialog.getElement().getFirst();
1078 parentElement.setStyle( 'z-index', parseInt( parentElement.$.style.zIndex, 10 ) + Math.floor( this._.editor.config.baseFloatZIndex / 2 ) );
1079 }
1080 CKEDITOR.dialog._.currentTop = this._.parentDialog;
1081
1082 // Deduct or clear the z-index.
1083 if ( !this._.parentDialog ) {
1084 CKEDITOR.dialog._.currentZIndex = null;
1085
1086 // Remove access key handlers.
1087 element.removeListener( 'keydown', accessKeyDownHandler );
1088 element.removeListener( 'keyup', accessKeyUpHandler );
1089
1090 var editor = this._.editor;
1091 editor.focus();
1092
1093 // Give a while before unlock, waiting for focus to return to the editable. (#172)
1094 setTimeout( function() {
1095 editor.focusManager.unlock();
1096
1097 // Fixed iOS focus issue (#12381).
1098 // Keep in mind that editor.focus() does not work in this case.
1099 if ( CKEDITOR.env.iOS ) {
1100 editor.window.focus();
1101 }
1102 }, 0 );
1103
1104 } else {
1105 CKEDITOR.dialog._.currentZIndex -= 10;
1106 }
1107
1108 delete this._.parentDialog;
1109 // Reset the initial values of the dialog.
1110 this.foreach( function( contentObj ) {
1111 contentObj.resetInitValue && contentObj.resetInitValue();
1112 } );
1113
1114 // Reset dialog state back to IDLE, if busy (#13213).
1115 this.setState( CKEDITOR.DIALOG_STATE_IDLE );
1116 },
1117
1118 /**
1119 * Adds a tabbed page into the dialog.
1120 *
1121 * @param {Object} contents Content definition.
1122 */
1123 addPage: function( contents ) {
1124 if ( contents.requiredContent && !this._.editor.filter.check( contents.requiredContent ) )
1125 return;
1126
1127 var pageHtml = [],
1128 titleHtml = contents.label ? ' title="' + CKEDITOR.tools.htmlEncode( contents.label ) + '"' : '',
1129 vbox = CKEDITOR.dialog._.uiElementBuilders.vbox.build( this, {
1130 type: 'vbox',
1131 className: 'cke_dialog_page_contents',
1132 children: contents.elements,
1133 expand: !!contents.expand,
1134 padding: contents.padding,
1135 style: contents.style || 'width: 100%;'
1136 }, pageHtml );
1137
1138 var contentMap = this._.contents[ contents.id ] = {},
1139 cursor,
1140 children = vbox.getChild(),
1141 enabledFields = 0;
1142
1143 while ( ( cursor = children.shift() ) ) {
1144 // Count all allowed fields.
1145 if ( !cursor.notAllowed && cursor.type != 'hbox' && cursor.type != 'vbox' )
1146 enabledFields++;
1147
1148 contentMap[ cursor.id ] = cursor;
1149 if ( typeof cursor.getChild == 'function' )
1150 children.push.apply( children, cursor.getChild() );
1151 }
1152
1153 // If all fields are disabled (because they are not allowed) hide this tab.
1154 if ( !enabledFields )
1155 contents.hidden = true;
1156
1157 // Create the HTML for the tab and the content block.
1158 var page = CKEDITOR.dom.element.createFromHtml( pageHtml.join( '' ) );
1159 page.setAttribute( 'role', 'tabpanel' );
1160
1161 var env = CKEDITOR.env;
1162 var tabId = 'cke_' + contents.id + '_' + CKEDITOR.tools.getNextNumber(),
1163 tab = CKEDITOR.dom.element.createFromHtml( [
1164 '<a class="cke_dialog_tab"',
1165 ( this._.pageCount > 0 ? ' cke_last' : 'cke_first' ),
1166 titleHtml,
1167 ( !!contents.hidden ? ' style="display:none"' : '' ),
1168 ' id="', tabId, '"',
1169 env.gecko && !env.hc ? '' : ' href="javascript:void(0)"',
1170 ' tabIndex="-1"',
1171 ' hidefocus="true"',
1172 ' role="tab">',
1173 contents.label,
1174 '</a>'
1175 ].join( '' ) );
1176
1177 page.setAttribute( 'aria-labelledby', tabId );
1178
1179 // Take records for the tabs and elements created.
1180 this._.tabs[ contents.id ] = [ tab, page ];
1181 this._.tabIdList.push( contents.id );
1182 !contents.hidden && this._.pageCount++;
1183 this._.lastTab = tab;
1184 this.updateStyle();
1185
1186 // Attach the DOM nodes.
1187
1188 page.setAttribute( 'name', contents.id );
1189 page.appendTo( this.parts.contents );
1190
1191 tab.unselectable();
1192 this.parts.tabs.append( tab );
1193
1194 // Add access key handlers if access key is defined.
1195 if ( contents.accessKey ) {
1196 registerAccessKey( this, this, 'CTRL+' + contents.accessKey, tabAccessKeyDown, tabAccessKeyUp );
1197 this._.accessKeyMap[ 'CTRL+' + contents.accessKey ] = contents.id;
1198 }
1199 },
1200
1201 /**
1202 * Activates a tab page in the dialog by its id.
1203 *
1204 * dialogObj.selectPage( 'tab_1' );
1205 *
1206 * @param {String} id The id of the dialog tab to be activated.
1207 */
1208 selectPage: function( id ) {
1209 if ( this._.currentTabId == id )
1210 return;
1211
1212 if ( this._.tabs[ id ][ 0 ].hasClass( 'cke_dialog_tab_disabled' ) )
1213 return;
1214
1215 // If event was canceled - do nothing.
1216 if ( this.fire( 'selectPage', { page: id, currentPage: this._.currentTabId } ) === false )
1217 return;
1218
1219 // Hide the non-selected tabs and pages.
1220 for ( var i in this._.tabs ) {
1221 var tab = this._.tabs[ i ][ 0 ],
1222 page = this._.tabs[ i ][ 1 ];
1223 if ( i != id ) {
1224 tab.removeClass( 'cke_dialog_tab_selected' );
1225 page.hide();
1226 }
1227 page.setAttribute( 'aria-hidden', i != id );
1228 }
1229
1230 var selected = this._.tabs[ id ];
1231 selected[ 0 ].addClass( 'cke_dialog_tab_selected' );
1232
1233 // [IE] an invisible input[type='text'] will enlarge it's width
1234 // if it's value is long when it shows, so we clear it's value
1235 // before it shows and then recover it (#5649)
1236 if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat ) {
1237 clearOrRecoverTextInputValue( selected[ 1 ] );
1238 selected[ 1 ].show();
1239 setTimeout( function() {
1240 clearOrRecoverTextInputValue( selected[ 1 ], 1 );
1241 }, 0 );
1242 } else {
1243 selected[ 1 ].show();
1244 }
1245
1246 this._.currentTabId = id;
1247 this._.currentTabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, id );
1248 },
1249
1250 /**
1251 * Dialog state-specific style updates.
1252 */
1253 updateStyle: function() {
1254 // If only a single page shown, a different style is used in the central pane.
1255 this.parts.dialog[ ( this._.pageCount === 1 ? 'add' : 'remove' ) + 'Class' ]( 'cke_single_page' );
1256 },
1257
1258 /**
1259 * Hides a page's tab away from the dialog.
1260 *
1261 * dialog.hidePage( 'tab_3' );
1262 *
1263 * @param {String} id The page's Id.
1264 */
1265 hidePage: function( id ) {
1266 var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ];
1267 if ( !tab || this._.pageCount == 1 || !tab.isVisible() )
1268 return;
1269 // Switch to other tab first when we're hiding the active tab.
1270 else if ( id == this._.currentTabId )
1271 this.selectPage( getPreviousVisibleTab.call( this ) );
1272
1273 tab.hide();
1274 this._.pageCount--;
1275 this.updateStyle();
1276 },
1277
1278 /**
1279 * Unhides a page's tab.
1280 *
1281 * dialog.showPage( 'tab_2' );
1282 *
1283 * @param {String} id The page's Id.
1284 */
1285 showPage: function( id ) {
1286 var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ];
1287 if ( !tab )
1288 return;
1289 tab.show();
1290 this._.pageCount++;
1291 this.updateStyle();
1292 },
1293
1294 /**
1295 * Gets the root DOM element of the dialog.
1296 *
1297 * var dialogElement = dialogObj.getElement().getFirst();
1298 * dialogElement.setStyle( 'padding', '5px' );
1299 *
1300 * @returns {CKEDITOR.dom.element} The `<span>` element containing this dialog.
1301 */
1302 getElement: function() {
1303 return this._.element;
1304 },
1305
1306 /**
1307 * Gets the name of the dialog.
1308 *
1309 * var dialogName = dialogObj.getName();
1310 *
1311 * @returns {String} The name of this dialog.
1312 */
1313 getName: function() {
1314 return this._.name;
1315 },
1316
1317 /**
1318 * Gets a dialog UI element object from a dialog page.
1319 *
1320 * dialogObj.getContentElement( 'tabId', 'elementId' ).setValue( 'Example' );
1321 *
1322 * @param {String} pageId id of dialog page.
1323 * @param {String} elementId id of UI element.
1324 * @returns {CKEDITOR.ui.dialog.uiElement} The dialog UI element.
1325 */
1326 getContentElement: function( pageId, elementId ) {
1327 var page = this._.contents[ pageId ];
1328 return page && page[ elementId ];
1329 },
1330
1331 /**
1332 * Gets the value of a dialog UI element.
1333 *
1334 * alert( dialogObj.getValueOf( 'tabId', 'elementId' ) );
1335 *
1336 * @param {String} pageId id of dialog page.
1337 * @param {String} elementId id of UI element.
1338 * @returns {Object} The value of the UI element.
1339 */
1340 getValueOf: function( pageId, elementId ) {
1341 return this.getContentElement( pageId, elementId ).getValue();
1342 },
1343
1344 /**
1345 * Sets the value of a dialog UI element.
1346 *
1347 * dialogObj.setValueOf( 'tabId', 'elementId', 'Example' );
1348 *
1349 * @param {String} pageId id of the dialog page.
1350 * @param {String} elementId id of the UI element.
1351 * @param {Object} value The new value of the UI element.
1352 */
1353 setValueOf: function( pageId, elementId, value ) {
1354 return this.getContentElement( pageId, elementId ).setValue( value );
1355 },
1356
1357 /**
1358 * Gets the UI element of a button in the dialog's button row.
1359 *
1360 * @returns {CKEDITOR.ui.dialog.button} The button object.
1361 *
1362 * @param {String} id The id of the button.
1363 */
1364 getButton: function( id ) {
1365 return this._.buttons[ id ];
1366 },
1367
1368 /**
1369 * Simulates a click to a dialog button in the dialog's button row.
1370 *
1371 * @returns The return value of the dialog's `click` event.
1372 *
1373 * @param {String} id The id of the button.
1374 */
1375 click: function( id ) {
1376 return this._.buttons[ id ].click();
1377 },
1378
1379 /**
1380 * Disables a dialog button.
1381 *
1382 * @param {String} id The id of the button.
1383 */
1384 disableButton: function( id ) {
1385 return this._.buttons[ id ].disable();
1386 },
1387
1388 /**
1389 * Enables a dialog button.
1390 *
1391 * @param {String} id The id of the button.
1392 */
1393 enableButton: function( id ) {
1394 return this._.buttons[ id ].enable();
1395 },
1396
1397 /**
1398 * Gets the number of pages in the dialog.
1399 *
1400 * @returns {Number} Page count.
1401 */
1402 getPageCount: function() {
1403 return this._.pageCount;
1404 },
1405
1406 /**
1407 * Gets the editor instance which opened this dialog.
1408 *
1409 * @returns {CKEDITOR.editor} Parent editor instances.
1410 */
1411 getParentEditor: function() {
1412 return this._.editor;
1413 },
1414
1415 /**
1416 * Gets the element that was selected when opening the dialog, if any.
1417 *
1418 * @returns {CKEDITOR.dom.element} The element that was selected, or `null`.
1419 */
1420 getSelectedElement: function() {
1421 return this.getParentEditor().getSelection().getSelectedElement();
1422 },
1423
1424 /**
1425 * Adds element to dialog's focusable list.
1426 *
1427 * @param {CKEDITOR.dom.element} element
1428 * @param {Number} [index]
1429 */
1430 addFocusable: function( element, index ) {
1431 if ( typeof index == 'undefined' ) {
1432 index = this._.focusList.length;
1433 this._.focusList.push( new Focusable( this, element, index ) );
1434 } else {
1435 this._.focusList.splice( index, 0, new Focusable( this, element, index ) );
1436 for ( var i = index + 1; i < this._.focusList.length; i++ )
1437 this._.focusList[ i ].focusIndex++;
1438 }
1439 },
1440
1441 /**
1442 * Sets the dialog {@link #property-state}.
1443 *
1444 * @since 4.5
1445 * @param {Number} state Either {@link CKEDITOR#DIALOG_STATE_IDLE} or {@link CKEDITOR#DIALOG_STATE_BUSY}.
1446 */
1447 setState: function( state ) {
1448 var oldState = this.state;
1449
1450 if ( oldState == state ) {
1451 return;
1452 }
1453
1454 this.state = state;
1455
1456 if ( state == CKEDITOR.DIALOG_STATE_BUSY ) {
1457 // Insert the spinner on demand.
1458 if ( !this.parts.spinner ) {
1459 var dir = this.getParentEditor().lang.dir,
1460 spinnerDef = {
1461 attributes: {
1462 'class': 'cke_dialog_spinner'
1463 },
1464 styles: {
1465 'float': dir == 'rtl' ? 'right' : 'left'
1466 }
1467 };
1468
1469 spinnerDef.styles[ 'margin-' + ( dir == 'rtl' ? 'left' : 'right' ) ] = '8px';
1470
1471 this.parts.spinner = CKEDITOR.document.createElement( 'div', spinnerDef );
1472
1473 this.parts.spinner.setHtml( '&#8987;' );
1474 this.parts.spinner.appendTo( this.parts.title, 1 );
1475 }
1476
1477 // Finally, show the spinner.
1478 this.parts.spinner.show();
1479
1480 this.getButton( 'ok' ).disable();
1481 } else if ( state == CKEDITOR.DIALOG_STATE_IDLE ) {
1482 // Hide the spinner. But don't do anything if there is no spinner yet.
1483 this.parts.spinner && this.parts.spinner.hide();
1484
1485 this.getButton( 'ok' ).enable();
1486 }
1487
1488 this.fire( 'state', state );
1489 }
1490 };
1491
1492 CKEDITOR.tools.extend( CKEDITOR.dialog, {
1493 /**
1494 * Registers a dialog.
1495 *
1496 * // Full sample plugin, which does not only register a dialog window but also adds an item to the context menu.
1497 * // To open the dialog window, choose "Open dialog" in the context menu.
1498 * CKEDITOR.plugins.add( 'myplugin', {
1499 * init: function( editor ) {
1500 * editor.addCommand( 'mydialog',new CKEDITOR.dialogCommand( 'mydialog' ) );
1501 *
1502 * if ( editor.contextMenu ) {
1503 * editor.addMenuGroup( 'mygroup', 10 );
1504 * editor.addMenuItem( 'My Dialog', {
1505 * label: 'Open dialog',
1506 * command: 'mydialog',
1507 * group: 'mygroup'
1508 * } );
1509 * editor.contextMenu.addListener( function( element ) {
1510 * return { 'My Dialog': CKEDITOR.TRISTATE_OFF };
1511 * } );
1512 * }
1513 *
1514 * CKEDITOR.dialog.add( 'mydialog', function( api ) {
1515 * // CKEDITOR.dialog.definition
1516 * var dialogDefinition = {
1517 * title: 'Sample dialog',
1518 * minWidth: 390,
1519 * minHeight: 130,
1520 * contents: [
1521 * {
1522 * id: 'tab1',
1523 * label: 'Label',
1524 * title: 'Title',
1525 * expand: true,
1526 * padding: 0,
1527 * elements: [
1528 * {
1529 * type: 'html',
1530 * html: '<p>This is some sample HTML content.</p>'
1531 * },
1532 * {
1533 * type: 'textarea',
1534 * id: 'textareaId',
1535 * rows: 4,
1536 * cols: 40
1537 * }
1538 * ]
1539 * }
1540 * ],
1541 * buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ],
1542 * onOk: function() {
1543 * // "this" is now a CKEDITOR.dialog object.
1544 * // Accessing dialog elements:
1545 * var textareaObj = this.getContentElement( 'tab1', 'textareaId' );
1546 * alert( "You have entered: " + textareaObj.getValue() );
1547 * }
1548 * };
1549 *
1550 * return dialogDefinition;
1551 * } );
1552 * }
1553 * } );
1554 *
1555 * CKEDITOR.replace( 'editor1', { extraPlugins: 'myplugin' } );
1556 *
1557 * @static
1558 * @param {String} name The dialog's name.
1559 * @param {Function/String} dialogDefinition
1560 * A function returning the dialog's definition, or the URL to the `.js` file holding the function.
1561 * The function should accept an argument `editor` which is the current editor instance, and
1562 * return an object conforming to {@link CKEDITOR.dialog.definition}.
1563 * @see CKEDITOR.dialog.definition
1564 */
1565 add: function( name, dialogDefinition ) {
1566 // Avoid path registration from multiple instances override definition.
1567 if ( !this._.dialogDefinitions[ name ] || typeof dialogDefinition == 'function' )
1568 this._.dialogDefinitions[ name ] = dialogDefinition;
1569 },
1570
1571 /**
1572 * @static
1573 * @todo
1574 */
1575 exists: function( name ) {
1576 return !!this._.dialogDefinitions[ name ];
1577 },
1578
1579 /**
1580 * @static
1581 * @todo
1582 */
1583 getCurrent: function() {
1584 return CKEDITOR.dialog._.currentTop;
1585 },
1586
1587 /**
1588 * Check whether tab wasn't removed by {@link CKEDITOR.config#removeDialogTabs}.
1589 *
1590 * @since 4.1
1591 * @static
1592 * @param {CKEDITOR.editor} editor
1593 * @param {String} dialogName
1594 * @param {String} tabName
1595 * @returns {Boolean}
1596 */
1597 isTabEnabled: function( editor, dialogName, tabName ) {
1598 var cfg = editor.config.removeDialogTabs;
1599
1600 return !( cfg && cfg.match( new RegExp( '(?:^|;)' + dialogName + ':' + tabName + '(?:$|;)', 'i' ) ) );
1601 },
1602
1603 /**
1604 * The default OK button for dialogs. Fires the `ok` event and closes the dialog if the event succeeds.
1605 *
1606 * @static
1607 * @method
1608 */
1609 okButton: ( function() {
1610 var retval = function( editor, override ) {
1611 override = override || {};
1612 return CKEDITOR.tools.extend( {
1613 id: 'ok',
1614 type: 'button',
1615 label: editor.lang.common.ok,
1616 'class': 'cke_dialog_ui_button_ok',
1617 onClick: function( evt ) {
1618 var dialog = evt.data.dialog;
1619 if ( dialog.fire( 'ok', { hide: true } ).hide !== false )
1620 dialog.hide();
1621 }
1622 }, override, true );
1623 };
1624 retval.type = 'button';
1625 retval.override = function( override ) {
1626 return CKEDITOR.tools.extend( function( editor ) {
1627 return retval( editor, override );
1628 }, { type: 'button' }, true );
1629 };
1630 return retval;
1631 } )(),
1632
1633 /**
1634 * The default cancel button for dialogs. Fires the `cancel` event and
1635 * closes the dialog if no UI element value changed.
1636 *
1637 * @static
1638 * @method
1639 */
1640 cancelButton: ( function() {
1641 var retval = function( editor, override ) {
1642 override = override || {};
1643 return CKEDITOR.tools.extend( {
1644 id: 'cancel',
1645 type: 'button',
1646 label: editor.lang.common.cancel,
1647 'class': 'cke_dialog_ui_button_cancel',
1648 onClick: function( evt ) {
1649 var dialog = evt.data.dialog;
1650 if ( dialog.fire( 'cancel', { hide: true } ).hide !== false )
1651 dialog.hide();
1652 }
1653 }, override, true );
1654 };
1655 retval.type = 'button';
1656 retval.override = function( override ) {
1657 return CKEDITOR.tools.extend( function( editor ) {
1658 return retval( editor, override );
1659 }, { type: 'button' }, true );
1660 };
1661 return retval;
1662 } )(),
1663
1664 /**
1665 * Registers a dialog UI element.
1666 *
1667 * @static
1668 * @param {String} typeName The name of the UI element.
1669 * @param {Function} builder The function to build the UI element.
1670 */
1671 addUIElement: function( typeName, builder ) {
1672 this._.uiElementBuilders[ typeName ] = builder;
1673 }
1674 } );
1675
1676 CKEDITOR.dialog._ = {
1677 uiElementBuilders: {},
1678
1679 dialogDefinitions: {},
1680
1681 currentTop: null,
1682
1683 currentZIndex: null
1684 };
1685
1686 // "Inherit" (copy actually) from CKEDITOR.event.
1687 CKEDITOR.event.implementOn( CKEDITOR.dialog );
1688 CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype );
1689
1690 var defaultDialogDefinition = {
1691 resizable: CKEDITOR.DIALOG_RESIZE_BOTH,
1692 minWidth: 600,
1693 minHeight: 400,
1694 buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]
1695 };
1696
1697 // Tool function used to return an item from an array based on its id
1698 // property.
1699 var getById = function( array, id, recurse ) {
1700 for ( var i = 0, item;
1701 ( item = array[ i ] ); i++ ) {
1702 if ( item.id == id )
1703 return item;
1704 if ( recurse && item[ recurse ] ) {
1705 var retval = getById( item[ recurse ], id, recurse );
1706 if ( retval )
1707 return retval;
1708 }
1709 }
1710 return null;
1711 };
1712
1713 // Tool function used to add an item into an array.
1714 var addById = function( array, newItem, nextSiblingId, recurse, nullIfNotFound ) {
1715 if ( nextSiblingId ) {
1716 for ( var i = 0, item;
1717 ( item = array[ i ] ); i++ ) {
1718 if ( item.id == nextSiblingId ) {
1719 array.splice( i, 0, newItem );
1720 return newItem;
1721 }
1722
1723 if ( recurse && item[ recurse ] ) {
1724 var retval = addById( item[ recurse ], newItem, nextSiblingId, recurse, true );
1725 if ( retval )
1726 return retval;
1727 }
1728 }
1729
1730 if ( nullIfNotFound )
1731 return null;
1732 }
1733
1734 array.push( newItem );
1735 return newItem;
1736 };
1737
1738 // Tool function used to remove an item from an array based on its id.
1739 var removeById = function( array, id, recurse ) {
1740 for ( var i = 0, item;
1741 ( item = array[ i ] ); i++ ) {
1742 if ( item.id == id )
1743 return array.splice( i, 1 );
1744 if ( recurse && item[ recurse ] ) {
1745 var retval = removeById( item[ recurse ], id, recurse );
1746 if ( retval )
1747 return retval;
1748 }
1749 }
1750 return null;
1751 };
1752
1753 /**
1754 * This class is not really part of the API. It is the `definition` property value
1755 * passed to `dialogDefinition` event handlers.
1756 *
1757 * CKEDITOR.on( 'dialogDefinition', function( evt ) {
1758 * var definition = evt.data.definition;
1759 * var content = definition.getContents( 'page1' );
1760 * // ...
1761 * } );
1762 *
1763 * @private
1764 * @class CKEDITOR.dialog.definitionObject
1765 * @extends CKEDITOR.dialog.definition
1766 * @constructor Creates a definitionObject class instance.
1767 */
1768 var definitionObject = function( dialog, dialogDefinition ) {
1769 // TODO : Check if needed.
1770 this.dialog = dialog;
1771
1772 // Transform the contents entries in contentObjects.
1773 var contents = dialogDefinition.contents;
1774 for ( var i = 0, content;
1775 ( content = contents[ i ] ); i++ )
1776 contents[ i ] = content && new contentObject( dialog, content );
1777
1778 CKEDITOR.tools.extend( this, dialogDefinition );
1779 };
1780
1781 definitionObject.prototype = {
1782 /**
1783 * Gets a content definition.
1784 *
1785 * @param {String} id The id of the content definition.
1786 * @returns {CKEDITOR.dialog.definition.content} The content definition matching id.
1787 */
1788 getContents: function( id ) {
1789 return getById( this.contents, id );
1790 },
1791
1792 /**
1793 * Gets a button definition.
1794 *
1795 * @param {String} id The id of the button definition.
1796 * @returns {CKEDITOR.dialog.definition.button} The button definition matching id.
1797 */
1798 getButton: function( id ) {
1799 return getById( this.buttons, id );
1800 },
1801
1802 /**
1803 * Adds a content definition object under this dialog definition.
1804 *
1805 * @param {CKEDITOR.dialog.definition.content} contentDefinition The
1806 * content definition.
1807 * @param {String} [nextSiblingId] The id of an existing content
1808 * definition which the new content definition will be inserted
1809 * before. Omit if the new content definition is to be inserted as
1810 * the last item.
1811 * @returns {CKEDITOR.dialog.definition.content} The inserted content definition.
1812 */
1813 addContents: function( contentDefinition, nextSiblingId ) {
1814 return addById( this.contents, contentDefinition, nextSiblingId );
1815 },
1816
1817 /**
1818 * Adds a button definition object under this dialog definition.
1819 *
1820 * @param {CKEDITOR.dialog.definition.button} buttonDefinition The
1821 * button definition.
1822 * @param {String} [nextSiblingId] The id of an existing button
1823 * definition which the new button definition will be inserted
1824 * before. Omit if the new button definition is to be inserted as
1825 * the last item.
1826 * @returns {CKEDITOR.dialog.definition.button} The inserted button definition.
1827 */
1828 addButton: function( buttonDefinition, nextSiblingId ) {
1829 return addById( this.buttons, buttonDefinition, nextSiblingId );
1830 },
1831
1832 /**
1833 * Removes a content definition from this dialog definition.
1834 *
1835 * @param {String} id The id of the content definition to be removed.
1836 * @returns {CKEDITOR.dialog.definition.content} The removed content definition.
1837 */
1838 removeContents: function( id ) {
1839 removeById( this.contents, id );
1840 },
1841
1842 /**
1843 * Removes a button definition from the dialog definition.
1844 *
1845 * @param {String} id The id of the button definition to be removed.
1846 * @returns {CKEDITOR.dialog.definition.button} The removed button definition.
1847 */
1848 removeButton: function( id ) {
1849 removeById( this.buttons, id );
1850 }
1851 };
1852
1853 /**
1854 * This class is not really part of the API. It is the template of the
1855 * objects representing content pages inside the
1856 * CKEDITOR.dialog.definitionObject.
1857 *
1858 * CKEDITOR.on( 'dialogDefinition', function( evt ) {
1859 * var definition = evt.data.definition;
1860 * var content = definition.getContents( 'page1' );
1861 * content.remove( 'textInput1' );
1862 * // ...
1863 * } );
1864 *
1865 * @private
1866 * @class CKEDITOR.dialog.definition.contentObject
1867 * @constructor Creates a contentObject class instance.
1868 */
1869 function contentObject( dialog, contentDefinition ) {
1870 this._ = {
1871 dialog: dialog
1872 };
1873
1874 CKEDITOR.tools.extend( this, contentDefinition );
1875 }
1876
1877 contentObject.prototype = {
1878 /**
1879 * Gets a UI element definition under the content definition.
1880 *
1881 * @param {String} id The id of the UI element definition.
1882 * @returns {CKEDITOR.dialog.definition.uiElement}
1883 */
1884 get: function( id ) {
1885 return getById( this.elements, id, 'children' );
1886 },
1887
1888 /**
1889 * Adds a UI element definition to the content definition.
1890 *
1891 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition The
1892 * UI elemnet definition to be added.
1893 * @param {String} nextSiblingId The id of an existing UI element
1894 * definition which the new UI element definition will be inserted
1895 * before. Omit if the new button definition is to be inserted as
1896 * the last item.
1897 * @returns {CKEDITOR.dialog.definition.uiElement} The element definition inserted.
1898 */
1899 add: function( elementDefinition, nextSiblingId ) {
1900 return addById( this.elements, elementDefinition, nextSiblingId, 'children' );
1901 },
1902
1903 /**
1904 * Removes a UI element definition from the content definition.
1905 *
1906 * @param {String} id The id of the UI element definition to be removed.
1907 * @returns {CKEDITOR.dialog.definition.uiElement} The element definition removed.
1908 */
1909 remove: function( id ) {
1910 removeById( this.elements, id, 'children' );
1911 }
1912 };
1913
1914 function initDragAndDrop( dialog ) {
1915 var lastCoords = null,
1916 abstractDialogCoords = null,
1917 editor = dialog.getParentEditor(),
1918 magnetDistance = editor.config.dialog_magnetDistance,
1919 margins = CKEDITOR.skin.margins || [ 0, 0, 0, 0 ];
1920
1921 if ( typeof magnetDistance == 'undefined' )
1922 magnetDistance = 20;
1923
1924 function mouseMoveHandler( evt ) {
1925 var dialogSize = dialog.getSize(),
1926 viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(),
1927 x = evt.data.$.screenX,
1928 y = evt.data.$.screenY,
1929 dx = x - lastCoords.x,
1930 dy = y - lastCoords.y,
1931 realX, realY;
1932
1933 lastCoords = { x: x, y: y };
1934 abstractDialogCoords.x += dx;
1935 abstractDialogCoords.y += dy;
1936
1937 if ( abstractDialogCoords.x + margins[ 3 ] < magnetDistance )
1938 realX = -margins[ 3 ];
1939 else if ( abstractDialogCoords.x - margins[ 1 ] > viewPaneSize.width - dialogSize.width - magnetDistance )
1940 realX = viewPaneSize.width - dialogSize.width + ( editor.lang.dir == 'rtl' ? 0 : margins[ 1 ] );
1941 else
1942 realX = abstractDialogCoords.x;
1943
1944 if ( abstractDialogCoords.y + margins[ 0 ] < magnetDistance )
1945 realY = -margins[ 0 ];
1946 else if ( abstractDialogCoords.y - margins[ 2 ] > viewPaneSize.height - dialogSize.height - magnetDistance )
1947 realY = viewPaneSize.height - dialogSize.height + margins[ 2 ];
1948 else
1949 realY = abstractDialogCoords.y;
1950
1951 dialog.move( realX, realY, 1 );
1952
1953 evt.data.preventDefault();
1954 }
1955
1956 function mouseUpHandler() {
1957 CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler );
1958 CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler );
1959
1960 if ( CKEDITOR.env.ie6Compat ) {
1961 var coverDoc = currentCover.getChild( 0 ).getFrameDocument();
1962 coverDoc.removeListener( 'mousemove', mouseMoveHandler );
1963 coverDoc.removeListener( 'mouseup', mouseUpHandler );
1964 }
1965 }
1966
1967 dialog.parts.title.on( 'mousedown', function( evt ) {
1968 lastCoords = { x: evt.data.$.screenX, y: evt.data.$.screenY };
1969
1970 CKEDITOR.document.on( 'mousemove', mouseMoveHandler );
1971 CKEDITOR.document.on( 'mouseup', mouseUpHandler );
1972 abstractDialogCoords = dialog.getPosition();
1973
1974 if ( CKEDITOR.env.ie6Compat ) {
1975 var coverDoc = currentCover.getChild( 0 ).getFrameDocument();
1976 coverDoc.on( 'mousemove', mouseMoveHandler );
1977 coverDoc.on( 'mouseup', mouseUpHandler );
1978 }
1979
1980 evt.data.preventDefault();
1981 }, dialog );
1982 }
1983
1984 function initResizeHandles( dialog ) {
1985 var def = dialog.definition,
1986 resizable = def.resizable;
1987
1988 if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE )
1989 return;
1990
1991 var editor = dialog.getParentEditor();
1992 var wrapperWidth, wrapperHeight, viewSize, origin, startSize, dialogCover;
1993
1994 var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) {
1995 startSize = dialog.getSize();
1996
1997 var content = dialog.parts.contents,
1998 iframeDialog = content.$.getElementsByTagName( 'iframe' ).length;
1999
2000 // Shim to help capturing "mousemove" over iframe.
2001 if ( iframeDialog ) {
2002 dialogCover = CKEDITOR.dom.element.createFromHtml( '<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>' );
2003 content.append( dialogCover );
2004 }
2005
2006 // Calculate the offset between content and chrome size.
2007 wrapperHeight = startSize.height - dialog.parts.contents.getSize( 'height', !( CKEDITOR.env.gecko || CKEDITOR.env.ie && CKEDITOR.env.quirks ) );
2008 wrapperWidth = startSize.width - dialog.parts.contents.getSize( 'width', 1 );
2009
2010 origin = { x: $event.screenX, y: $event.screenY };
2011
2012 viewSize = CKEDITOR.document.getWindow().getViewPaneSize();
2013
2014 CKEDITOR.document.on( 'mousemove', mouseMoveHandler );
2015 CKEDITOR.document.on( 'mouseup', mouseUpHandler );
2016
2017 if ( CKEDITOR.env.ie6Compat ) {
2018 var coverDoc = currentCover.getChild( 0 ).getFrameDocument();
2019 coverDoc.on( 'mousemove', mouseMoveHandler );
2020 coverDoc.on( 'mouseup', mouseUpHandler );
2021 }
2022
2023 $event.preventDefault && $event.preventDefault();
2024 } );
2025
2026 // Prepend the grip to the dialog.
2027 dialog.on( 'load', function() {
2028 var direction = '';
2029 if ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH )
2030 direction = ' cke_resizer_horizontal';
2031 else if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT )
2032 direction = ' cke_resizer_vertical';
2033 var resizer = CKEDITOR.dom.element.createFromHtml(
2034 '<div' +
2035 ' class="cke_resizer' + direction + ' cke_resizer_' + editor.lang.dir + '"' +
2036 ' title="' + CKEDITOR.tools.htmlEncode( editor.lang.common.resize ) + '"' +
2037 ' onmousedown="CKEDITOR.tools.callFunction(' + mouseDownFn + ', event )">' +
2038 // BLACK LOWER RIGHT TRIANGLE (ltr)
2039 // BLACK LOWER LEFT TRIANGLE (rtl)
2040 ( editor.lang.dir == 'ltr' ? '\u25E2' : '\u25E3' ) +
2041 '</div>' );
2042 dialog.parts.footer.append( resizer, 1 );
2043 } );
2044 editor.on( 'destroy', function() {
2045 CKEDITOR.tools.removeFunction( mouseDownFn );
2046 } );
2047
2048 function mouseMoveHandler( evt ) {
2049 var rtl = editor.lang.dir == 'rtl',
2050 dx = ( evt.data.$.screenX - origin.x ) * ( rtl ? -1 : 1 ),
2051 dy = evt.data.$.screenY - origin.y,
2052 width = startSize.width,
2053 height = startSize.height,
2054 internalWidth = width + dx * ( dialog._.moved ? 1 : 2 ),
2055 internalHeight = height + dy * ( dialog._.moved ? 1 : 2 ),
2056 element = dialog._.element.getFirst(),
2057 right = rtl && element.getComputedStyle( 'right' ),
2058 position = dialog.getPosition();
2059
2060 if ( position.y + internalHeight > viewSize.height )
2061 internalHeight = viewSize.height - position.y;
2062
2063 if ( ( rtl ? right : position.x ) + internalWidth > viewSize.width )
2064 internalWidth = viewSize.width - ( rtl ? right : position.x );
2065
2066 // Make sure the dialog will not be resized to the wrong side when it's in the leftmost position for RTL.
2067 if ( ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) )
2068 width = Math.max( def.minWidth || 0, internalWidth - wrapperWidth );
2069
2070 if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT || resizable == CKEDITOR.DIALOG_RESIZE_BOTH )
2071 height = Math.max( def.minHeight || 0, internalHeight - wrapperHeight );
2072
2073 dialog.resize( width, height );
2074
2075 if ( !dialog._.moved )
2076 dialog.layout();
2077
2078 evt.data.preventDefault();
2079 }
2080
2081 function mouseUpHandler() {
2082 CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler );
2083 CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler );
2084
2085 if ( dialogCover ) {
2086 dialogCover.remove();
2087 dialogCover = null;
2088 }
2089
2090 if ( CKEDITOR.env.ie6Compat ) {
2091 var coverDoc = currentCover.getChild( 0 ).getFrameDocument();
2092 coverDoc.removeListener( 'mouseup', mouseUpHandler );
2093 coverDoc.removeListener( 'mousemove', mouseMoveHandler );
2094 }
2095 }
2096 }
2097
2098 var resizeCover;
2099 // Caching resuable covers and allowing only one cover
2100 // on screen.
2101 var covers = {},
2102 currentCover;
2103
2104 function cancelEvent( ev ) {
2105 ev.data.preventDefault( 1 );
2106 }
2107
2108 function showCover( editor ) {
2109 var win = CKEDITOR.document.getWindow();
2110 var config = editor.config,
2111 backgroundColorStyle = config.dialog_backgroundCoverColor || 'white',
2112 backgroundCoverOpacity = config.dialog_backgroundCoverOpacity,
2113 baseFloatZIndex = config.baseFloatZIndex,
2114 coverKey = CKEDITOR.tools.genKey( backgroundColorStyle, backgroundCoverOpacity, baseFloatZIndex ),
2115 coverElement = covers[ coverKey ];
2116
2117 if ( !coverElement ) {
2118 var html = [
2119 '<div tabIndex="-1" style="position: ', ( CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed' ),
2120 '; z-index: ', baseFloatZIndex,
2121 '; top: 0px; left: 0px; ',
2122 ( !CKEDITOR.env.ie6Compat ? 'background-color: ' + backgroundColorStyle : '' ),
2123 '" class="cke_dialog_background_cover">'
2124 ];
2125
2126 if ( CKEDITOR.env.ie6Compat ) {
2127 // Support for custom document.domain in IE.
2128 var iframeHtml = '<html><body style=\\\'background-color:' + backgroundColorStyle + ';\\\'></body></html>';
2129
2130 html.push( '<iframe' +
2131 ' hidefocus="true"' +
2132 ' frameborder="0"' +
2133 ' id="cke_dialog_background_iframe"' +
2134 ' src="javascript:' );
2135
2136 html.push( 'void((function(){' + encodeURIComponent(
2137 'document.open();' +
2138 // Support for custom document.domain in IE.
2139 '(' + CKEDITOR.tools.fixDomain + ')();' +
2140 'document.write( \'' + iframeHtml + '\' );' +
2141 'document.close();'
2142 ) + '})())' );
2143
2144 html.push( '"' +
2145 ' style="' +
2146 'position:absolute;' +
2147 'left:0;' +
2148 'top:0;' +
2149 'width:100%;' +
2150 'height: 100%;' +
2151 'filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)">' +
2152 '</iframe>' );
2153 }
2154
2155 html.push( '</div>' );
2156
2157 coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) );
2158 coverElement.setOpacity( backgroundCoverOpacity !== undefined ? backgroundCoverOpacity : 0.5 );
2159
2160 coverElement.on( 'keydown', cancelEvent );
2161 coverElement.on( 'keypress', cancelEvent );
2162 coverElement.on( 'keyup', cancelEvent );
2163
2164 coverElement.appendTo( CKEDITOR.document.getBody() );
2165 covers[ coverKey ] = coverElement;
2166 } else {
2167 coverElement.show();
2168 }
2169
2170 // Makes the dialog cover a focus holder as well.
2171 editor.focusManager.add( coverElement );
2172
2173 currentCover = coverElement;
2174 var resizeFunc = function() {
2175 var size = win.getViewPaneSize();
2176 coverElement.setStyles( {
2177 width: size.width + 'px',
2178 height: size.height + 'px'
2179 } );
2180 };
2181
2182 var scrollFunc = function() {
2183 var pos = win.getScrollPosition(),
2184 cursor = CKEDITOR.dialog._.currentTop;
2185 coverElement.setStyles( {
2186 left: pos.x + 'px',
2187 top: pos.y + 'px'
2188 } );
2189
2190 if ( cursor ) {
2191 do {
2192 var dialogPos = cursor.getPosition();
2193 cursor.move( dialogPos.x, dialogPos.y );
2194 } while ( ( cursor = cursor._.parentDialog ) );
2195 }
2196 };
2197
2198 resizeCover = resizeFunc;
2199 win.on( 'resize', resizeFunc );
2200 resizeFunc();
2201 // Using Safari/Mac, focus must be kept where it is (#7027)
2202 if ( !( CKEDITOR.env.mac && CKEDITOR.env.webkit ) )
2203 coverElement.focus();
2204
2205 if ( CKEDITOR.env.ie6Compat ) {
2206 // IE BUG: win.$.onscroll assignment doesn't work.. it must be window.onscroll.
2207 // So we need to invent a really funny way to make it work.
2208 var myScrollHandler = function() {
2209 scrollFunc();
2210 arguments.callee.prevScrollHandler.apply( this, arguments );
2211 };
2212 win.$.setTimeout( function() {
2213 myScrollHandler.prevScrollHandler = window.onscroll ||
2214 function() {};
2215 window.onscroll = myScrollHandler;
2216 }, 0 );
2217 scrollFunc();
2218 }
2219 }
2220
2221 function hideCover( editor ) {
2222 if ( !currentCover )
2223 return;
2224
2225 editor.focusManager.remove( currentCover );
2226 var win = CKEDITOR.document.getWindow();
2227 currentCover.hide();
2228 win.removeListener( 'resize', resizeCover );
2229
2230 if ( CKEDITOR.env.ie6Compat ) {
2231 win.$.setTimeout( function() {
2232 var prevScrollHandler = window.onscroll && window.onscroll.prevScrollHandler;
2233 window.onscroll = prevScrollHandler || null;
2234 }, 0 );
2235 }
2236 resizeCover = null;
2237 }
2238
2239 function removeCovers() {
2240 for ( var coverId in covers )
2241 covers[ coverId ].remove();
2242 covers = {};
2243 }
2244
2245 var accessKeyProcessors = {};
2246
2247 var accessKeyDownHandler = function( evt ) {
2248 var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey,
2249 alt = evt.data.$.altKey,
2250 shift = evt.data.$.shiftKey,
2251 key = String.fromCharCode( evt.data.$.keyCode ),
2252 keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ];
2253
2254 if ( !keyProcessor || !keyProcessor.length )
2255 return;
2256
2257 keyProcessor = keyProcessor[ keyProcessor.length - 1 ];
2258 keyProcessor.keydown && keyProcessor.keydown.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key );
2259 evt.data.preventDefault();
2260 };
2261
2262 var accessKeyUpHandler = function( evt ) {
2263 var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey,
2264 alt = evt.data.$.altKey,
2265 shift = evt.data.$.shiftKey,
2266 key = String.fromCharCode( evt.data.$.keyCode ),
2267 keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ];
2268
2269 if ( !keyProcessor || !keyProcessor.length )
2270 return;
2271
2272 keyProcessor = keyProcessor[ keyProcessor.length - 1 ];
2273 if ( keyProcessor.keyup ) {
2274 keyProcessor.keyup.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key );
2275 evt.data.preventDefault();
2276 }
2277 };
2278
2279 var registerAccessKey = function( uiElement, dialog, key, downFunc, upFunc ) {
2280 var procList = accessKeyProcessors[ key ] || ( accessKeyProcessors[ key ] = [] );
2281 procList.push( {
2282 uiElement: uiElement,
2283 dialog: dialog,
2284 key: key,
2285 keyup: upFunc || uiElement.accessKeyUp,
2286 keydown: downFunc || uiElement.accessKeyDown
2287 } );
2288 };
2289
2290 var unregisterAccessKey = function( obj ) {
2291 for ( var i in accessKeyProcessors ) {
2292 var list = accessKeyProcessors[ i ];
2293 for ( var j = list.length - 1; j >= 0; j-- ) {
2294 if ( list[ j ].dialog == obj || list[ j ].uiElement == obj )
2295 list.splice( j, 1 );
2296 }
2297 if ( list.length === 0 )
2298 delete accessKeyProcessors[ i ];
2299 }
2300 };
2301
2302 var tabAccessKeyUp = function( dialog, key ) {
2303 if ( dialog._.accessKeyMap[ key ] )
2304 dialog.selectPage( dialog._.accessKeyMap[ key ] );
2305 };
2306
2307 var tabAccessKeyDown = function() {};
2308
2309 ( function() {
2310 CKEDITOR.ui.dialog = {
2311 /**
2312 * The base class of all dialog UI elements.
2313 *
2314 * @class CKEDITOR.ui.dialog.uiElement
2315 * @constructor Creates a uiElement class instance.
2316 * @param {CKEDITOR.dialog} dialog Parent dialog object.
2317 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element
2318 * definition.
2319 *
2320 * Accepted fields:
2321 *
2322 * * `id` (Required) The id of the UI element. See {@link CKEDITOR.dialog#getContentElement}.
2323 * * `type` (Required) The type of the UI element. The
2324 * value to this field specifies which UI element class will be used to
2325 * generate the final widget.
2326 * * `title` (Optional) The popup tooltip for the UI
2327 * element.
2328 * * `hidden` (Optional) A flag that tells if the element
2329 * should be initially visible.
2330 * * `className` (Optional) Additional CSS class names
2331 * to add to the UI element. Separated by space.
2332 * * `style` (Optional) Additional CSS inline styles
2333 * to add to the UI element. A semicolon (;) is required after the last
2334 * style declaration.
2335 * * `accessKey` (Optional) The alphanumeric access key
2336 * for this element. Access keys are automatically prefixed by CTRL.
2337 * * `on*` (Optional) Any UI element definition field that
2338 * starts with `on` followed immediately by a capital letter and
2339 * probably more letters is an event handler. Event handlers may be further
2340 * divided into registered event handlers and DOM event handlers. Please
2341 * refer to {@link CKEDITOR.ui.dialog.uiElement#registerEvents} and
2342 * {@link CKEDITOR.ui.dialog.uiElement#eventProcessors} for more information.
2343 *
2344 * @param {Array} htmlList
2345 * List of HTML code to be added to the dialog's content area.
2346 * @param {Function/String} [nodeNameArg='div']
2347 * A function returning a string, or a simple string for the node name for
2348 * the root DOM node.
2349 * @param {Function/Object} [stylesArg={}]
2350 * A function returning an object, or a simple object for CSS styles applied
2351 * to the DOM node.
2352 * @param {Function/Object} [attributesArg={}]
2353 * A fucntion returning an object, or a simple object for attributes applied
2354 * to the DOM node.
2355 * @param {Function/String} [contentsArg='']
2356 * A function returning a string, or a simple string for the HTML code inside
2357 * the root DOM node. Default is empty string.
2358 */
2359 uiElement: function( dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg ) {
2360 if ( arguments.length < 4 )
2361 return;
2362
2363 var nodeName = ( nodeNameArg.call ? nodeNameArg( elementDefinition ) : nodeNameArg ) || 'div',
2364 html = [ '<', nodeName, ' ' ],
2365 styles = ( stylesArg && stylesArg.call ? stylesArg( elementDefinition ) : stylesArg ) || {},
2366 attributes = ( attributesArg && attributesArg.call ? attributesArg( elementDefinition ) : attributesArg ) || {},
2367 innerHTML = ( contentsArg && contentsArg.call ? contentsArg.call( this, dialog, elementDefinition ) : contentsArg ) || '',
2368 domId = this.domId = attributes.id || CKEDITOR.tools.getNextId() + '_uiElement',
2369 i;
2370
2371 if ( elementDefinition.requiredContent && !dialog.getParentEditor().filter.check( elementDefinition.requiredContent ) ) {
2372 styles.display = 'none';
2373 this.notAllowed = true;
2374 }
2375
2376 // Set the id, a unique id is required for getElement() to work.
2377 attributes.id = domId;
2378
2379 // Set the type and definition CSS class names.
2380 var classes = {};
2381 if ( elementDefinition.type )
2382 classes[ 'cke_dialog_ui_' + elementDefinition.type ] = 1;
2383 if ( elementDefinition.className )
2384 classes[ elementDefinition.className ] = 1;
2385 if ( elementDefinition.disabled )
2386 classes.cke_disabled = 1;
2387
2388 var attributeClasses = ( attributes[ 'class' ] && attributes[ 'class' ].split ) ? attributes[ 'class' ].split( ' ' ) : [];
2389 for ( i = 0; i < attributeClasses.length; i++ ) {
2390 if ( attributeClasses[ i ] )
2391 classes[ attributeClasses[ i ] ] = 1;
2392 }
2393 var finalClasses = [];
2394 for ( i in classes )
2395 finalClasses.push( i );
2396 attributes[ 'class' ] = finalClasses.join( ' ' );
2397
2398 // Set the popup tooltop.
2399 if ( elementDefinition.title )
2400 attributes.title = elementDefinition.title;
2401
2402 // Write the inline CSS styles.
2403 var styleStr = ( elementDefinition.style || '' ).split( ';' );
2404
2405 // Element alignment support.
2406 if ( elementDefinition.align ) {
2407 var align = elementDefinition.align;
2408 styles[ 'margin-left' ] = align == 'left' ? 0 : 'auto';
2409 styles[ 'margin-right' ] = align == 'right' ? 0 : 'auto';
2410 }
2411
2412 for ( i in styles )
2413 styleStr.push( i + ':' + styles[ i ] );
2414 if ( elementDefinition.hidden )
2415 styleStr.push( 'display:none' );
2416 for ( i = styleStr.length - 1; i >= 0; i-- ) {
2417 if ( styleStr[ i ] === '' )
2418 styleStr.splice( i, 1 );
2419 }
2420 if ( styleStr.length > 0 )
2421 attributes.style = ( attributes.style ? ( attributes.style + '; ' ) : '' ) + styleStr.join( '; ' );
2422
2423 // Write the attributes.
2424 for ( i in attributes )
2425 html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[ i ] ) + '" ' );
2426
2427 // Write the content HTML.
2428 html.push( '>', innerHTML, '</', nodeName, '>' );
2429
2430 // Add contents to the parent HTML array.
2431 htmlList.push( html.join( '' ) );
2432
2433 ( this._ || ( this._ = {} ) ).dialog = dialog;
2434
2435 // Override isChanged if it is defined in element definition.
2436 if ( typeof elementDefinition.isChanged == 'boolean' )
2437 this.isChanged = function() {
2438 return elementDefinition.isChanged;
2439 };
2440 if ( typeof elementDefinition.isChanged == 'function' )
2441 this.isChanged = elementDefinition.isChanged;
2442
2443 // Overload 'get(set)Value' on definition.
2444 if ( typeof elementDefinition.setValue == 'function' ) {
2445 this.setValue = CKEDITOR.tools.override( this.setValue, function( org ) {
2446 return function( val ) {
2447 org.call( this, elementDefinition.setValue.call( this, val ) );
2448 };
2449 } );
2450 }
2451
2452 if ( typeof elementDefinition.getValue == 'function' ) {
2453 this.getValue = CKEDITOR.tools.override( this.getValue, function( org ) {
2454 return function() {
2455 return elementDefinition.getValue.call( this, org.call( this ) );
2456 };
2457 } );
2458 }
2459
2460 // Add events.
2461 CKEDITOR.event.implementOn( this );
2462
2463 this.registerEvents( elementDefinition );
2464 if ( this.accessKeyUp && this.accessKeyDown && elementDefinition.accessKey )
2465 registerAccessKey( this, dialog, 'CTRL+' + elementDefinition.accessKey );
2466
2467 var me = this;
2468 dialog.on( 'load', function() {
2469 var input = me.getInputElement();
2470 if ( input ) {
2471 var focusClass = me.type in { 'checkbox': 1, 'ratio': 1 } && CKEDITOR.env.ie && CKEDITOR.env.version < 8 ? 'cke_dialog_ui_focused' : '';
2472 input.on( 'focus', function() {
2473 dialog._.tabBarMode = false;
2474 dialog._.hasFocus = true;
2475 me.fire( 'focus' );
2476 focusClass && this.addClass( focusClass );
2477
2478 } );
2479
2480 input.on( 'blur', function() {
2481 me.fire( 'blur' );
2482 focusClass && this.removeClass( focusClass );
2483 } );
2484 }
2485 } );
2486
2487 // Completes this object with everything we have in the
2488 // definition.
2489 CKEDITOR.tools.extend( this, elementDefinition );
2490
2491 // Register the object as a tab focus if it can be included.
2492 if ( this.keyboardFocusable ) {
2493 this.tabIndex = elementDefinition.tabIndex || 0;
2494
2495 this.focusIndex = dialog._.focusList.push( this ) - 1;
2496 this.on( 'focus', function() {
2497 dialog._.currentFocusIndex = me.focusIndex;
2498 } );
2499 }
2500 },
2501
2502 /**
2503 * Horizontal layout box for dialog UI elements, auto-expends to available width of container.
2504 *
2505 * @class CKEDITOR.ui.dialog.hbox
2506 * @extends CKEDITOR.ui.dialog.uiElement
2507 * @constructor Creates a hbox class instance.
2508 * @param {CKEDITOR.dialog} dialog Parent dialog object.
2509 * @param {Array} childObjList
2510 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container.
2511 * @param {Array} childHtmlList
2512 * Array of HTML code that correspond to the HTML output of all the
2513 * objects in childObjList.
2514 * @param {Array} htmlList
2515 * Array of HTML code that this element will output to.
2516 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
2517 * The element definition. Accepted fields:
2518 *
2519 * * `widths` (Optional) The widths of child cells.
2520 * * `height` (Optional) The height of the layout.
2521 * * `padding` (Optional) The padding width inside child cells.
2522 * * `align` (Optional) The alignment of the whole layout.
2523 */
2524 hbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) {
2525 if ( arguments.length < 4 )
2526 return;
2527
2528 this._ || ( this._ = {} );
2529
2530 var children = this._.children = childObjList,
2531 widths = elementDefinition && elementDefinition.widths || null,
2532 height = elementDefinition && elementDefinition.height || null,
2533 styles = {},
2534 i;
2535 /** @ignore */
2536 var innerHTML = function() {
2537 var html = [ '<tbody><tr class="cke_dialog_ui_hbox">' ];
2538 for ( i = 0; i < childHtmlList.length; i++ ) {
2539 var className = 'cke_dialog_ui_hbox_child',
2540 styles = [];
2541 if ( i === 0 ) {
2542 className = 'cke_dialog_ui_hbox_first';
2543 }
2544 if ( i == childHtmlList.length - 1 ) {
2545 className = 'cke_dialog_ui_hbox_last';
2546 }
2547
2548 html.push( '<td class="', className, '" role="presentation" ' );
2549 if ( widths ) {
2550 if ( widths[ i ] ) {
2551 styles.push( 'width:' + cssLength( widths[i] ) );
2552 }
2553 } else {
2554 styles.push( 'width:' + Math.floor( 100 / childHtmlList.length ) + '%' );
2555 }
2556 if ( height ) {
2557 styles.push( 'height:' + cssLength( height ) );
2558 }
2559 if ( elementDefinition && elementDefinition.padding !== undefined ) {
2560 styles.push( 'padding:' + cssLength( elementDefinition.padding ) );
2561 }
2562 // In IE Quirks alignment has to be done on table cells. (#7324)
2563 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && children[ i ].align ) {
2564 styles.push( 'text-align:' + children[ i ].align );
2565 }
2566 if ( styles.length > 0 ) {
2567 html.push( 'style="' + styles.join( '; ' ) + '" ' );
2568 }
2569 html.push( '>', childHtmlList[ i ], '</td>' );
2570 }
2571 html.push( '</tr></tbody>' );
2572 return html.join( '' );
2573 };
2574
2575 var attribs = { role: 'presentation' };
2576 elementDefinition && elementDefinition.align && ( attribs.align = elementDefinition.align );
2577
2578 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'hbox' }, htmlList, 'table', styles, attribs, innerHTML );
2579 },
2580
2581 /**
2582 * Vertical layout box for dialog UI elements.
2583 *
2584 * @class CKEDITOR.ui.dialog.vbox
2585 * @extends CKEDITOR.ui.dialog.hbox
2586 * @constructor Creates a vbox class instance.
2587 * @param {CKEDITOR.dialog} dialog Parent dialog object.
2588 * @param {Array} childObjList
2589 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container.
2590 * @param {Array} childHtmlList
2591 * Array of HTML code that correspond to the HTML output of all the
2592 * objects in childObjList.
2593 * @param {Array} htmlList Array of HTML code that this element will output to.
2594 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
2595 * The element definition. Accepted fields:
2596 *
2597 * * `width` (Optional) The width of the layout.
2598 * * `heights` (Optional) The heights of individual cells.
2599 * * `align` (Optional) The alignment of the layout.
2600 * * `padding` (Optional) The padding width inside child cells.
2601 * * `expand` (Optional) Whether the layout should expand
2602 * vertically to fill its container.
2603 */
2604 vbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) {
2605 if ( arguments.length < 3 )
2606 return;
2607
2608 this._ || ( this._ = {} );
2609
2610 var children = this._.children = childObjList,
2611 width = elementDefinition && elementDefinition.width || null,
2612 heights = elementDefinition && elementDefinition.heights || null;
2613 /** @ignore */
2614 var innerHTML = function() {
2615 var html = [ '<table role="presentation" cellspacing="0" border="0" ' ];
2616 html.push( 'style="' );
2617 if ( elementDefinition && elementDefinition.expand )
2618 html.push( 'height:100%;' );
2619 html.push( 'width:' + cssLength( width || '100%' ), ';' );
2620
2621 // (#10123) Temp fix for dialog broken layout in latest webkit.
2622 if ( CKEDITOR.env.webkit )
2623 html.push( 'float:none;' );
2624
2625 html.push( '"' );
2626 html.push( 'align="', CKEDITOR.tools.htmlEncode(
2627 ( elementDefinition && elementDefinition.align ) || ( dialog.getParentEditor().lang.dir == 'ltr' ? 'left' : 'right' ) ), '" ' );
2628
2629 html.push( '><tbody>' );
2630 for ( var i = 0; i < childHtmlList.length; i++ ) {
2631 var styles = [];
2632 html.push( '<tr><td role="presentation" ' );
2633 if ( width )
2634 styles.push( 'width:' + cssLength( width || '100%' ) );
2635 if ( heights )
2636 styles.push( 'height:' + cssLength( heights[ i ] ) );
2637 else if ( elementDefinition && elementDefinition.expand )
2638 styles.push( 'height:' + Math.floor( 100 / childHtmlList.length ) + '%' );
2639 if ( elementDefinition && elementDefinition.padding !== undefined )
2640 styles.push( 'padding:' + cssLength( elementDefinition.padding ) );
2641 // In IE Quirks alignment has to be done on table cells. (#7324)
2642 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && children[ i ].align )
2643 styles.push( 'text-align:' + children[ i ].align );
2644 if ( styles.length > 0 )
2645 html.push( 'style="', styles.join( '; ' ), '" ' );
2646 html.push( ' class="cke_dialog_ui_vbox_child">', childHtmlList[ i ], '</td></tr>' );
2647 }
2648 html.push( '</tbody></table>' );
2649 return html.join( '' );
2650 };
2651 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'vbox' }, htmlList, 'div', null, { role: 'presentation' }, innerHTML );
2652 }
2653 };
2654 } )();
2655
2656 /** @class CKEDITOR.ui.dialog.uiElement */
2657 CKEDITOR.ui.dialog.uiElement.prototype = {
2658 /**
2659 * Gets the root DOM element of this dialog UI object.
2660 *
2661 * uiElement.getElement().hide();
2662 *
2663 * @returns {CKEDITOR.dom.element} Root DOM element of UI object.
2664 */
2665 getElement: function() {
2666 return CKEDITOR.document.getById( this.domId );
2667 },
2668
2669 /**
2670 * Gets the DOM element that the user inputs values.
2671 *
2672 * This function is used by {@link #setValue}, {@link #getValue} and {@link #focus}. It should
2673 * be overrided in child classes where the input element isn't the root
2674 * element.
2675 *
2676 * var rawValue = textInput.getInputElement().$.value;
2677 *
2678 * @returns {CKEDITOR.dom.element} The element where the user input values.
2679 */
2680 getInputElement: function() {
2681 return this.getElement();
2682 },
2683
2684 /**
2685 * Gets the parent dialog object containing this UI element.
2686 *
2687 * var dialog = uiElement.getDialog();
2688 *
2689 * @returns {CKEDITOR.dialog} Parent dialog object.
2690 */
2691 getDialog: function() {
2692 return this._.dialog;
2693 },
2694
2695 /**
2696 * Sets the value of this dialog UI object.
2697 *
2698 * uiElement.setValue( 'Dingo' );
2699 *
2700 * @chainable
2701 * @param {Object} value The new value.
2702 * @param {Boolean} noChangeEvent Internal commit, to supress `change` event on this element.
2703 */
2704 setValue: function( value, noChangeEvent ) {
2705 this.getInputElement().setValue( value );
2706 !noChangeEvent && this.fire( 'change', { value: value } );
2707 return this;
2708 },
2709
2710 /**
2711 * Gets the current value of this dialog UI object.
2712 *
2713 * var myValue = uiElement.getValue();
2714 *
2715 * @returns {Object} The current value.
2716 */
2717 getValue: function() {
2718 return this.getInputElement().getValue();
2719 },
2720
2721 /**
2722 * Tells whether the UI object's value has changed.
2723 *
2724 * if ( uiElement.isChanged() )
2725 * confirm( 'Value changed! Continue?' );
2726 *
2727 * @returns {Boolean} `true` if changed, `false` if not changed.
2728 */
2729 isChanged: function() {
2730 // Override in input classes.
2731 return false;
2732 },
2733
2734 /**
2735 * Selects the parent tab of this element. Usually called by focus() or overridden focus() methods.
2736 *
2737 * focus : function() {
2738 * this.selectParentTab();
2739 * // do something else.
2740 * }
2741 *
2742 * @chainable
2743 */
2744 selectParentTab: function() {
2745 var element = this.getInputElement(),
2746 cursor = element,
2747 tabId;
2748 while ( ( cursor = cursor.getParent() ) && cursor.$.className.search( 'cke_dialog_page_contents' ) == -1 ) {
2749
2750 }
2751
2752 // Some widgets don't have parent tabs (e.g. OK and Cancel buttons).
2753 if ( !cursor )
2754 return this;
2755
2756 tabId = cursor.getAttribute( 'name' );
2757 // Avoid duplicate select.
2758 if ( this._.dialog._.currentTabId != tabId )
2759 this._.dialog.selectPage( tabId );
2760 return this;
2761 },
2762
2763 /**
2764 * Puts the focus to the UI object. Switches tabs if the UI object isn't in the active tab page.
2765 *
2766 * uiElement.focus();
2767 *
2768 * @chainable
2769 */
2770 focus: function() {
2771 this.selectParentTab().getInputElement().focus();
2772 return this;
2773 },
2774
2775 /**
2776 * Registers the `on*` event handlers defined in the element definition.
2777 *
2778 * The default behavior of this function is:
2779 *
2780 * 1. If the on* event is defined in the class's eventProcesors list,
2781 * then the registration is delegated to the corresponding function
2782 * in the eventProcessors list.
2783 * 2. If the on* event is not defined in the eventProcessors list, then
2784 * register the event handler under the corresponding DOM event of
2785 * the UI element's input DOM element (as defined by the return value
2786 * of {@link #getInputElement}).
2787 *
2788 * This function is only called at UI element instantiation, but can
2789 * be overridded in child classes if they require more flexibility.
2790 *
2791 * @chainable
2792 * @param {CKEDITOR.dialog.definition.uiElement} definition The UI element
2793 * definition.
2794 */
2795 registerEvents: function( definition ) {
2796 var regex = /^on([A-Z]\w+)/,
2797 match;
2798
2799 var registerDomEvent = function( uiElement, dialog, eventName, func ) {
2800 dialog.on( 'load', function() {
2801 uiElement.getInputElement().on( eventName, func, uiElement );
2802 } );
2803 };
2804
2805 for ( var i in definition ) {
2806 if ( !( match = i.match( regex ) ) )
2807 continue;
2808 if ( this.eventProcessors[ i ] )
2809 this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] );
2810 else
2811 registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] );
2812 }
2813
2814 return this;
2815 },
2816
2817 /**
2818 * The event processor list used by
2819 * {@link CKEDITOR.ui.dialog.uiElement#getInputElement} at UI element
2820 * instantiation. The default list defines three `on*` events:
2821 *
2822 * 1. `onLoad` - Called when the element's parent dialog opens for the
2823 * first time.
2824 * 2. `onShow` - Called whenever the element's parent dialog opens.
2825 * 3. `onHide` - Called whenever the element's parent dialog closes.
2826 *
2827 * // This connects the 'click' event in CKEDITOR.ui.dialog.button to onClick
2828 * // handlers in the UI element's definitions.
2829 * CKEDITOR.ui.dialog.button.eventProcessors = CKEDITOR.tools.extend( {},
2830 * CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
2831 * { onClick : function( dialog, func ) { this.on( 'click', func ); } },
2832 * true
2833 * );
2834 *
2835 * @property {Object}
2836 */
2837 eventProcessors: {
2838 onLoad: function( dialog, func ) {
2839 dialog.on( 'load', func, this );
2840 },
2841
2842 onShow: function( dialog, func ) {
2843 dialog.on( 'show', func, this );
2844 },
2845
2846 onHide: function( dialog, func ) {
2847 dialog.on( 'hide', func, this );
2848 }
2849 },
2850
2851 /**
2852 * The default handler for a UI element's access key down event, which
2853 * tries to put focus to the UI element.
2854 *
2855 * Can be overridded in child classes for more sophisticaed behavior.
2856 *
2857 * @param {CKEDITOR.dialog} dialog The parent dialog object.
2858 * @param {String} key The key combination pressed. Since access keys
2859 * are defined to always include the `CTRL` key, its value should always
2860 * include a `'CTRL+'` prefix.
2861 */
2862 accessKeyDown: function() {
2863 this.focus();
2864 },
2865
2866 /**
2867 * The default handler for a UI element's access key up event, which
2868 * does nothing.
2869 *
2870 * Can be overridded in child classes for more sophisticated behavior.
2871 *
2872 * @param {CKEDITOR.dialog} dialog The parent dialog object.
2873 * @param {String} key The key combination pressed. Since access keys
2874 * are defined to always include the `CTRL` key, its value should always
2875 * include a `'CTRL+'` prefix.
2876 */
2877 accessKeyUp: function() {},
2878
2879 /**
2880 * Disables a UI element.
2881 */
2882 disable: function() {
2883 var element = this.getElement(),
2884 input = this.getInputElement();
2885 input.setAttribute( 'disabled', 'true' );
2886 element.addClass( 'cke_disabled' );
2887 },
2888
2889 /**
2890 * Enables a UI element.
2891 */
2892 enable: function() {
2893 var element = this.getElement(),
2894 input = this.getInputElement();
2895 input.removeAttribute( 'disabled' );
2896 element.removeClass( 'cke_disabled' );
2897 },
2898
2899 /**
2900 * Determines whether an UI element is enabled or not.
2901 *
2902 * @returns {Boolean} Whether the UI element is enabled.
2903 */
2904 isEnabled: function() {
2905 return !this.getElement().hasClass( 'cke_disabled' );
2906 },
2907
2908 /**
2909 * Determines whether an UI element is visible or not.
2910 *
2911 * @returns {Boolean} Whether the UI element is visible.
2912 */
2913 isVisible: function() {
2914 return this.getInputElement().isVisible();
2915 },
2916
2917 /**
2918 * Determines whether an UI element is focus-able or not.
2919 * Focus-able is defined as being both visible and enabled.
2920 *
2921 * @returns {Boolean} Whether the UI element can be focused.
2922 */
2923 isFocusable: function() {
2924 if ( !this.isEnabled() || !this.isVisible() )
2925 return false;
2926 return true;
2927 }
2928 };
2929
2930 /** @class CKEDITOR.ui.dialog.hbox */
2931 CKEDITOR.ui.dialog.hbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), {
2932 /**
2933 * Gets a child UI element inside this container.
2934 *
2935 * var checkbox = hbox.getChild( [0,1] );
2936 * checkbox.setValue( true );
2937 *
2938 * @param {Array/Number} indices An array or a single number to indicate the child's
2939 * position in the container's descendant tree. Omit to get all the children in an array.
2940 * @returns {Array/CKEDITOR.ui.dialog.uiElement} Array of all UI elements in the container
2941 * if no argument given, or the specified UI element if indices is given.
2942 */
2943 getChild: function( indices ) {
2944 // If no arguments, return a clone of the children array.
2945 if ( arguments.length < 1 )
2946 return this._.children.concat();
2947
2948 // If indices isn't array, make it one.
2949 if ( !indices.splice )
2950 indices = [ indices ];
2951
2952 // Retrieve the child element according to tree position.
2953 if ( indices.length < 2 )
2954 return this._.children[ indices[ 0 ] ];
2955 else
2956 return ( this._.children[ indices[ 0 ] ] && this._.children[ indices[ 0 ] ].getChild ) ? this._.children[ indices[ 0 ] ].getChild( indices.slice( 1, indices.length ) ) : null;
2957 }
2958 }, true );
2959
2960 CKEDITOR.ui.dialog.vbox.prototype = new CKEDITOR.ui.dialog.hbox();
2961
2962 ( function() {
2963 var commonBuilder = {
2964 build: function( dialog, elementDefinition, output ) {
2965 var children = elementDefinition.children,
2966 child,
2967 childHtmlList = [],
2968 childObjList = [];
2969 for ( var i = 0;
2970 ( i < children.length && ( child = children[ i ] ) ); i++ ) {
2971 var childHtml = [];
2972 childHtmlList.push( childHtml );
2973 childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) );
2974 }
2975 return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition );
2976 }
2977 };
2978
2979 CKEDITOR.dialog.addUIElement( 'hbox', commonBuilder );
2980 CKEDITOR.dialog.addUIElement( 'vbox', commonBuilder );
2981 } )();
2982
2983 /**
2984 * Generic dialog command. It opens a specific dialog when executed.
2985 *
2986 * // Register the "link" command, which opens the "link" dialog.
2987 * editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) );
2988 *
2989 * @class
2990 * @constructor Creates a dialogCommand class instance.
2991 * @extends CKEDITOR.commandDefinition
2992 * @param {String} dialogName The name of the dialog to open when executing
2993 * this command.
2994 * @param {Object} [ext] Additional command definition's properties.
2995 */
2996 CKEDITOR.dialogCommand = function( dialogName, ext ) {
2997 this.dialogName = dialogName;
2998 CKEDITOR.tools.extend( this, ext, true );
2999 };
3000
3001 CKEDITOR.dialogCommand.prototype = {
3002 exec: function( editor ) {
3003 editor.openDialog( this.dialogName );
3004 },
3005
3006 // Dialog commands just open a dialog ui, thus require no undo logic,
3007 // undo support should dedicate to specific dialog implementation.
3008 canUndo: false,
3009
3010 editorFocus: 1
3011 };
3012
3013 ( function() {
3014 var notEmptyRegex = /^([a]|[^a])+$/,
3015 integerRegex = /^\d*$/,
3016 numberRegex = /^\d*(?:\.\d+)?$/,
3017 htmlLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,
3018 cssLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,
3019 inlineStyleRegex = /^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;
3020
3021 CKEDITOR.VALIDATE_OR = 1;
3022 CKEDITOR.VALIDATE_AND = 2;
3023
3024 CKEDITOR.dialog.validate = {
3025 functions: function() {
3026 var args = arguments;
3027 return function() {
3028 /**
3029 * It's important for validate functions to be able to accept the value
3030 * as argument in addition to this.getValue(), so that it is possible to
3031 * combine validate functions together to make more sophisticated
3032 * validators.
3033 */
3034 var value = this && this.getValue ? this.getValue() : args[ 0 ];
3035
3036 var msg,
3037 relation = CKEDITOR.VALIDATE_AND,
3038 functions = [],
3039 i;
3040
3041 for ( i = 0; i < args.length; i++ ) {
3042 if ( typeof args[ i ] == 'function' )
3043 functions.push( args[ i ] );
3044 else
3045 break;
3046 }
3047
3048 if ( i < args.length && typeof args[ i ] == 'string' ) {
3049 msg = args[ i ];
3050 i++;
3051 }
3052
3053 if ( i < args.length && typeof args[ i ] == 'number' )
3054 relation = args[ i ];
3055
3056 var passed = ( relation == CKEDITOR.VALIDATE_AND ? true : false );
3057 for ( i = 0; i < functions.length; i++ ) {
3058 if ( relation == CKEDITOR.VALIDATE_AND )
3059 passed = passed && functions[ i ]( value );
3060 else
3061 passed = passed || functions[ i ]( value );
3062 }
3063
3064 return !passed ? msg : true;
3065 };
3066 },
3067
3068 regex: function( regex, msg ) {
3069 /*
3070 * Can be greatly shortened by deriving from functions validator if code size
3071 * turns out to be more important than performance.
3072 */
3073 return function() {
3074 var value = this && this.getValue ? this.getValue() : arguments[ 0 ];
3075 return !regex.test( value ) ? msg : true;
3076 };
3077 },
3078
3079 notEmpty: function( msg ) {
3080 return this.regex( notEmptyRegex, msg );
3081 },
3082
3083 integer: function( msg ) {
3084 return this.regex( integerRegex, msg );
3085 },
3086
3087 'number': function( msg ) {
3088 return this.regex( numberRegex, msg );
3089 },
3090
3091 'cssLength': function( msg ) {
3092 return this.functions( function( val ) {
3093 return cssLengthRegex.test( CKEDITOR.tools.trim( val ) );
3094 }, msg );
3095 },
3096
3097 'htmlLength': function( msg ) {
3098 return this.functions( function( val ) {
3099 return htmlLengthRegex.test( CKEDITOR.tools.trim( val ) );
3100 }, msg );
3101 },
3102
3103 'inlineStyle': function( msg ) {
3104 return this.functions( function( val ) {
3105 return inlineStyleRegex.test( CKEDITOR.tools.trim( val ) );
3106 }, msg );
3107 },
3108
3109 equals: function( value, msg ) {
3110 return this.functions( function( val ) {
3111 return val == value;
3112 }, msg );
3113 },
3114
3115 notEqual: function( value, msg ) {
3116 return this.functions( function( val ) {
3117 return val != value;
3118 }, msg );
3119 }
3120 };
3121
3122 CKEDITOR.on( 'instanceDestroyed', function( evt ) {
3123 // Remove dialog cover on last instance destroy.
3124 if ( CKEDITOR.tools.isEmpty( CKEDITOR.instances ) ) {
3125 var currentTopDialog;
3126 while ( ( currentTopDialog = CKEDITOR.dialog._.currentTop ) )
3127 currentTopDialog.hide();
3128 removeCovers();
3129 }
3130
3131 var dialogs = evt.editor._.storedDialogs;
3132 for ( var name in dialogs )
3133 dialogs[ name ].destroy();
3134
3135 } );
3136
3137 } )();
3138
3139 // Extend the CKEDITOR.editor class with dialog specific functions.
3140 CKEDITOR.tools.extend( CKEDITOR.editor.prototype, {
3141 /**
3142 * Loads and opens a registered dialog.
3143 *
3144 * CKEDITOR.instances.editor1.openDialog( 'smiley' );
3145 *
3146 * @member CKEDITOR.editor
3147 * @param {String} dialogName The registered name of the dialog.
3148 * @param {Function} callback The function to be invoked after dialog instance created.
3149 * @returns {CKEDITOR.dialog} The dialog object corresponding to the dialog displayed.
3150 * `null` if the dialog name is not registered.
3151 * @see CKEDITOR.dialog#add
3152 */
3153 openDialog: function( dialogName, callback ) {
3154 var dialog = null, dialogDefinitions = CKEDITOR.dialog._.dialogDefinitions[ dialogName ];
3155
3156 if ( CKEDITOR.dialog._.currentTop === null )
3157 showCover( this );
3158
3159 // If the dialogDefinition is already loaded, open it immediately.
3160 if ( typeof dialogDefinitions == 'function' ) {
3161 var storedDialogs = this._.storedDialogs || ( this._.storedDialogs = {} );
3162
3163 dialog = storedDialogs[ dialogName ] || ( storedDialogs[ dialogName ] = new CKEDITOR.dialog( this, dialogName ) );
3164
3165 callback && callback.call( dialog, dialog );
3166 dialog.show();
3167
3168 } else if ( dialogDefinitions == 'failed' ) {
3169 hideCover( this );
3170 throw new Error( '[CKEDITOR.dialog.openDialog] Dialog "' + dialogName + '" failed when loading definition.' );
3171 } else if ( typeof dialogDefinitions == 'string' ) {
3172
3173 CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( dialogDefinitions ),
3174 function() {
3175 var dialogDefinition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ];
3176 // In case of plugin error, mark it as loading failed.
3177 if ( typeof dialogDefinition != 'function' )
3178 CKEDITOR.dialog._.dialogDefinitions[ dialogName ] = 'failed';
3179
3180 this.openDialog( dialogName, callback );
3181 }, this, 0, 1 );
3182 }
3183
3184 CKEDITOR.skin.loadPart( 'dialog' );
3185
3186 return dialog;
3187 }
3188 } );
3189} )();
3190
3191CKEDITOR.plugins.add( 'dialog', {
3192 requires: 'dialogui',
3193 init: function( editor ) {
3194 editor.on( 'doubleclick', function( evt ) {
3195 if ( evt.data.dialog )
3196 editor.openDialog( evt.data.dialog );
3197 }, null, null, 999 );
3198 }
3199} );
3200
3201// Dialog related configurations.
3202
3203/**
3204 * The color of the dialog background cover. It should be a valid CSS color string.
3205 *
3206 * config.dialog_backgroundCoverColor = 'rgb(255, 254, 253)';
3207 *
3208 * @cfg {String} [dialog_backgroundCoverColor='white']
3209 * @member CKEDITOR.config
3210 */
3211
3212/**
3213 * The opacity of the dialog background cover. It should be a number within the
3214 * range `[0.0, 1.0]`.
3215 *
3216 * config.dialog_backgroundCoverOpacity = 0.7;
3217 *
3218 * @cfg {Number} [dialog_backgroundCoverOpacity=0.5]
3219 * @member CKEDITOR.config
3220 */
3221
3222/**
3223 * If the dialog has more than one tab, put focus into the first tab as soon as dialog is opened.
3224 *
3225 * config.dialog_startupFocusTab = true;
3226 *
3227 * @cfg {Boolean} [dialog_startupFocusTab=false]
3228 * @member CKEDITOR.config
3229 */
3230
3231/**
3232 * The distance of magnetic borders used in moving and resizing dialogs,
3233 * measured in pixels.
3234 *
3235 * config.dialog_magnetDistance = 30;
3236 *
3237 * @cfg {Number} [dialog_magnetDistance=20]
3238 * @member CKEDITOR.config
3239 */
3240
3241/**
3242 * The guideline to follow when generating the dialog buttons. There are 3 possible options:
3243 *
3244 * * `'OS'` - the buttons will be displayed in the default order of the user's OS;
3245 * * `'ltr'` - for Left-To-Right order;
3246 * * `'rtl'` - for Right-To-Left order.
3247 *
3248 * Example:
3249 *
3250 * config.dialog_buttonsOrder = 'rtl';
3251 *
3252 * @since 3.5
3253 * @cfg {String} [dialog_buttonsOrder='OS']
3254 * @member CKEDITOR.config
3255 */
3256
3257/**
3258 * The dialog contents to removed. It's a string composed by dialog name and tab name with a colon between them.
3259 *
3260 * Separate each pair with semicolon (see example).
3261 *
3262 * **Note:** All names are case-sensitive.
3263 *
3264 * **Note:** Be cautious when specifying dialog tabs that are mandatory,
3265 * like `'info'`, dialog functionality might be broken because of this!
3266 *
3267 * config.removeDialogTabs = 'flash:advanced;image:Link';
3268 *
3269 * @since 3.5
3270 * @cfg {String} [removeDialogTabs='']
3271 * @member CKEDITOR.config
3272 */
3273
3274/**
3275 * Tells if user should not be asked to confirm close, if any dialog field was modified.
3276 * By default it is set to `false` meaning that the confirmation dialog will be shown.
3277 *
3278 * config.dialog_noConfirmCancel = true;
3279 *
3280 * @since 4.3
3281 * @cfg {Boolean} [dialog_noConfirmCancel=false]
3282 * @member CKEDITOR.config
3283 */
3284
3285/**
3286 * Event fired when a dialog definition is about to be used to create a dialog into
3287 * an editor instance. This event makes it possible to customize the definition
3288 * before creating it.
3289 *
3290 * Note that this event is called only the first time a specific dialog is
3291 * opened. Successive openings will use the cached dialog, and this event will
3292 * not get fired.
3293 *
3294 * @event dialogDefinition
3295 * @member CKEDITOR
3296 * @param {CKEDITOR.dialog.definition} data The dialog defination that
3297 * is being loaded.
3298 * @param {CKEDITOR.editor} editor The editor instance that will use the dialog.
3299 */
3300
3301/**
3302 * Event fired when a tab is going to be selected in a dialog.
3303 *
3304 * @event selectPage
3305 * @member CKEDITOR.dialog
3306 * @param data
3307 * @param {String} data.page The id of the page that it's gonna be selected.
3308 * @param {String} data.currentPage The id of the current page.
3309 */
3310
3311/**
3312 * Event fired when the user tries to dismiss a dialog.
3313 *
3314 * @event cancel
3315 * @member CKEDITOR.dialog
3316 * @param data
3317 * @param {Boolean} data.hide Whether the event should proceed or not.
3318 */
3319
3320/**
3321 * Event fired when the user tries to confirm a dialog.
3322 *
3323 * @event ok
3324 * @member CKEDITOR.dialog
3325 * @param data
3326 * @param {Boolean} data.hide Whether the event should proceed or not.
3327 */
3328
3329/**
3330 * Event fired when a dialog is shown.
3331 *
3332 * @event show
3333 * @member CKEDITOR.dialog
3334 */
3335
3336/**
3337 * Event fired when a dialog is shown.
3338 *
3339 * @event dialogShow
3340 * @member CKEDITOR.editor
3341 * @param {CKEDITOR.editor} editor This editor instance.
3342 * @param {CKEDITOR.dialog} data The opened dialog instance.
3343 */
3344
3345/**
3346 * Event fired when a dialog is hidden.
3347 *
3348 * @event hide
3349 * @member CKEDITOR.dialog
3350 */
3351
3352/**
3353 * Event fired when a dialog is hidden.
3354 *
3355 * @event dialogHide
3356 * @member CKEDITOR.editor
3357 * @param {CKEDITOR.editor} editor This editor instance.
3358 * @param {CKEDITOR.dialog} data The hidden dialog instance.
3359 */
3360
3361/**
3362 * Event fired when a dialog is being resized. The event is fired on
3363 * both the {@link CKEDITOR.dialog} object and the dialog instance
3364 * since 3.5.3, previously it was only available in the global object.
3365 *
3366 * @static
3367 * @event resize
3368 * @member CKEDITOR.dialog
3369 * @param data
3370 * @param {CKEDITOR.dialog} data.dialog The dialog being resized (if
3371 * it is fired on the dialog itself, this parameter is not sent).
3372 * @param {String} data.skin The skin name.
3373 * @param {Number} data.width The new width.
3374 * @param {Number} data.height The new height.
3375 */
3376
3377/**
3378 * Event fired when a dialog is being resized. The event is fired on
3379 * both the {@link CKEDITOR.dialog} object and the dialog instance
3380 * since 3.5.3, previously it was only available in the global object.
3381 *
3382 * @since 3.5
3383 * @event resize
3384 * @member CKEDITOR.dialog
3385 * @param data
3386 * @param {Number} data.width The new width.
3387 * @param {Number} data.height The new height.
3388 */
3389
3390/**
3391 * Event fired when the dialog state changes, usually by {@link CKEDITOR.dialog#setState}.
3392 *
3393 * @since 4.5
3394 * @event state
3395 * @member CKEDITOR.dialog
3396 * @param data
3397 * @param {Number} data The new state. Either {@link CKEDITOR#DIALOG_STATE_IDLE} or {@link CKEDITOR#DIALOG_STATE_BUSY}.
3398 */
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 00000000..6ee1a201
--- /dev/null
+++ b/sources/plugins/dialog/samples/assets/my_dialog.js
@@ -0,0 +1,49 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'myDialog', function() {
7 return {
8 title: 'My Dialog',
9 minWidth: 400,
10 minHeight: 200,
11 contents: [
12 {
13 id: 'tab1',
14 label: 'First Tab',
15 title: 'First Tab',
16 elements: [
17 {
18 id: 'input1',
19 type: 'text',
20 label: 'Text Field'
21 },
22 {
23 id: 'select1',
24 type: 'select',
25 label: 'Select Field',
26 items: [
27 [ 'option1', 'value1' ],
28 [ 'option2', 'value2' ]
29 ]
30 }
31 ]
32 },
33 {
34 id: 'tab2',
35 label: 'Second Tab',
36 title: 'Second Tab',
37 elements: [
38 {
39 id: 'button1',
40 type: 'button',
41 label: 'Button Field'
42 }
43 ]
44 }
45 ]
46 };
47} );
48
49// %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 00000000..df43657e
--- /dev/null
+++ b/sources/plugins/dialog/samples/dialog.html
@@ -0,0 +1,190 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Using API to Customize Dialog Windows &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <link rel="stylesheet" href="../../../samples/old/sample.css">
12 <meta name="ckeditor-sample-name" content="Using the JavaScript API to customize dialog windows">
13 <meta name="ckeditor-sample-group" content="Advanced Samples">
14 <meta name="ckeditor-sample-description" content="Using the dialog windows API to customize dialog windows without changing the original editor code.">
15 <style>
16
17 .cke_button__mybutton_icon
18 {
19 display: none !important;
20 }
21
22 .cke_button__mybutton_label
23 {
24 display: inline !important;
25 }
26
27 </style>
28 <script>
29
30 CKEDITOR.on( 'instanceCreated', function( ev ){
31 var editor = ev.editor;
32
33 // Listen for the "pluginsLoaded" event, so we are sure that the
34 // "dialog" plugin has been loaded and we are able to do our
35 // customizations.
36 editor.on( 'pluginsLoaded', function() {
37
38 // If our custom dialog has not been registered, do that now.
39 if ( !CKEDITOR.dialog.exists( 'myDialog' ) ) {
40 // We need to do the following trick to find out the dialog
41 // definition file URL path. In the real world, you would simply
42 // point to an absolute path directly, like "/mydir/mydialog.js".
43 var href = document.location.href.split( '/' );
44 href.pop();
45 href.push( 'assets/my_dialog.js' );
46 href = href.join( '/' );
47
48 // Finally, register the dialog.
49 CKEDITOR.dialog.add( 'myDialog', href );
50 }
51
52 // Register the command used to open the dialog.
53 editor.addCommand( 'myDialogCmd', new CKEDITOR.dialogCommand( 'myDialog' ) );
54
55 // Add the a custom toolbar buttons, which fires the above
56 // command..
57 editor.ui.add( 'MyButton', CKEDITOR.UI_BUTTON, {
58 label: 'My Dialog',
59 command: 'myDialogCmd'
60 });
61 });
62 });
63
64 // When opening a dialog, its "definition" is created for it, for
65 // each editor instance. The "dialogDefinition" event is then
66 // fired. We should use this event to make customizations to the
67 // definition of existing dialogs.
68 CKEDITOR.on( 'dialogDefinition', function( ev ) {
69 // Take the dialog name and its definition from the event data.
70 var dialogName = ev.data.name;
71 var dialogDefinition = ev.data.definition;
72
73 // Check if the definition is from the dialog we're
74 // interested on (the "Link" dialog).
75 if ( dialogName == 'myDialog' && ev.editor.name == 'editor2' ) {
76 // Get a reference to the "Link Info" tab.
77 var infoTab = dialogDefinition.getContents( 'tab1' );
78
79 // Add a new text field to the "tab1" tab page.
80 infoTab.add( {
81 type: 'text',
82 label: 'My Custom Field',
83 id: 'customField',
84 'default': 'Sample!',
85 validate: function() {
86 if ( ( /\d/ ).test( this.getValue() ) )
87 return 'My Custom Field must not contain digits';
88 }
89 });
90
91 // Remove the "select1" field from the "tab1" tab.
92 infoTab.remove( 'select1' );
93
94 // Set the default value for "input1" field.
95 var input1 = infoTab.get( 'input1' );
96 input1[ 'default' ] = 'www.example.com';
97
98 // Remove the "tab2" tab page.
99 dialogDefinition.removeContents( 'tab2' );
100
101 // Add a new tab to the "Link" dialog.
102 dialogDefinition.addContents( {
103 id: 'customTab',
104 label: 'My Tab',
105 accessKey: 'M',
106 elements: [
107 {
108 id: 'myField1',
109 type: 'text',
110 label: 'My Text Field'
111 },
112 {
113 id: 'myField2',
114 type: 'text',
115 label: 'Another Text Field'
116 }
117 ]
118 });
119
120 // Provide the focus handler to start initial focus in "customField" field.
121 dialogDefinition.onFocus = function() {
122 var urlField = this.getContentElement( 'tab1', 'customField' );
123 urlField.select();
124 };
125 }
126 });
127
128 var config = {
129 extraPlugins: 'dialog',
130 toolbar: [ [ 'MyButton' ] ]
131 };
132
133 </script>
134</head>
135<body>
136 <h1 class="samples">
137 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Using CKEditor Dialog API
138 </h1>
139 <div class="warning deprecated">
140 This sample is not maintained anymore. Check out the <a href="http://sdk.ckeditor.com/">brand new samples in CKEditor SDK</a>.
141 </div>
142 <div class="description">
143 <p>
144 This sample shows how to use the
145 <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.dialog">CKEditor Dialog API</a>
146 to customize CKEditor dialog windows without changing the original editor code.
147 The following customizations are being done in the example below:
148 </p>
149 <p>
150 For details on how to create this setup check the source code of this sample page.
151 </p>
152 </div>
153 <p>A custom dialog is added to the editors using the <code>pluginsLoaded</code> event, from an external <a target="_blank" href="assets/my_dialog.js">dialog definition file</a>:</p>
154 <ol>
155 <li><strong>Creating a custom dialog window</strong> &ndash; "My Dialog" dialog window opened with the "My Dialog" toolbar button.</li>
156 <li><strong>Creating a custom button</strong> &ndash; Add button to open the dialog with "My Dialog" toolbar button.</li>
157 </ol>
158 <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
159 <script>
160 // Replace the <textarea id="editor1"> with an CKEditor instance.
161 CKEDITOR.replace( 'editor1', config );
162 </script>
163 <p>The below editor modify the dialog definition of the above added dialog using the <code>dialogDefinition</code> event:</p>
164 <ol>
165 <li><strong>Adding dialog tab</strong> &ndash; Add new tab "My Tab" to dialog window.</li>
166 <li><strong>Removing a dialog window tab</strong> &ndash; Remove "Second Tab" page from the dialog window.</li>
167 <li><strong>Adding dialog window fields</strong> &ndash; Add "My Custom Field" to the dialog window.</li>
168 <li><strong>Removing dialog window field</strong> &ndash; Remove "Select Field" selection field from the dialog window.</li>
169 <li><strong>Setting default values for dialog window fields</strong> &ndash; Set default value of "Text Field" text field. </li>
170 <li><strong>Setup initial focus for dialog window</strong> &ndash; Put initial focus on "My Custom Field" text field. </li>
171 </ol>
172 <textarea cols="80" id="editor2" name="editor2" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
173 <script>
174
175 // Replace the <textarea id="editor1"> with an CKEditor instance.
176 CKEDITOR.replace( 'editor2', config );
177
178 </script>
179 <div id="footer">
180 <hr>
181 <p>
182 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
183 </p>
184 <p id="copy">
185 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
186 Knabben. All rights reserved.
187 </p>
188 </div>
189</body>
190</html>
diff --git a/sources/plugins/dialogadvtab/plugin.js b/sources/plugins/dialogadvtab/plugin.js
new file mode 100644
index 00000000..f57f604b
--- /dev/null
+++ b/sources/plugins/dialogadvtab/plugin.js
@@ -0,0 +1,196 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7
8 function setupAdvParams( element ) {
9 var attrName = this.att;
10
11 var value = element && element.hasAttribute( attrName ) && element.getAttribute( attrName ) || '';
12
13 if ( value !== undefined )
14 this.setValue( value );
15 }
16
17 function commitAdvParams() {
18 // Dialogs may use different parameters in the commit list, so, by
19 // definition, we take the first CKEDITOR.dom.element available.
20 var element;
21
22 for ( var i = 0; i < arguments.length; i++ ) {
23 if ( arguments[ i ] instanceof CKEDITOR.dom.element ) {
24 element = arguments[ i ];
25 break;
26 }
27 }
28
29 if ( element ) {
30 var attrName = this.att,
31 value = this.getValue();
32
33 if ( value )
34 element.setAttribute( attrName, value );
35 else
36 element.removeAttribute( attrName, value );
37 }
38 }
39
40 var defaultTabConfig = { id: 1, dir: 1, classes: 1, styles: 1 };
41
42 CKEDITOR.plugins.add( 'dialogadvtab', {
43 requires: 'dialog',
44
45 // Returns allowed content rule for the content created by this plugin.
46 allowedContent: function( tabConfig ) {
47 if ( !tabConfig )
48 tabConfig = defaultTabConfig;
49
50 var allowedAttrs = [];
51 if ( tabConfig.id )
52 allowedAttrs.push( 'id' );
53 if ( tabConfig.dir )
54 allowedAttrs.push( 'dir' );
55
56 var allowed = '';
57
58 if ( allowedAttrs.length )
59 allowed += '[' + allowedAttrs.join( ',' ) + ']';
60
61 if ( tabConfig.classes )
62 allowed += '(*)';
63 if ( tabConfig.styles )
64 allowed += '{*}';
65
66 return allowed;
67 },
68
69 // @param tabConfig
70 // id, dir, classes, styles
71 createAdvancedTab: function( editor, tabConfig, element ) {
72 if ( !tabConfig )
73 tabConfig = defaultTabConfig;
74
75 var lang = editor.lang.common;
76
77 var result = {
78 id: 'advanced',
79 label: lang.advancedTab,
80 title: lang.advancedTab,
81 elements: [ {
82 type: 'vbox',
83 padding: 1,
84 children: []
85 } ]
86 };
87
88 var contents = [];
89
90 if ( tabConfig.id || tabConfig.dir ) {
91 if ( tabConfig.id ) {
92 contents.push( {
93 id: 'advId',
94 att: 'id',
95 type: 'text',
96 requiredContent: element ? element + '[id]' : null,
97 label: lang.id,
98 setup: setupAdvParams,
99 commit: commitAdvParams
100 } );
101 }
102
103 if ( tabConfig.dir ) {
104 contents.push( {
105 id: 'advLangDir',
106 att: 'dir',
107 type: 'select',
108 requiredContent: element ? element + '[dir]' : null,
109 label: lang.langDir,
110 'default': '',
111 style: 'width:100%',
112 items: [
113 [ lang.notSet, '' ],
114 [ lang.langDirLTR, 'ltr' ],
115 [ lang.langDirRTL, 'rtl' ]
116 ],
117 setup: setupAdvParams,
118 commit: commitAdvParams
119 } );
120 }
121
122 result.elements[ 0 ].children.push( {
123 type: 'hbox',
124 widths: [ '50%', '50%' ],
125 children: [].concat( contents )
126 } );
127 }
128
129 if ( tabConfig.styles || tabConfig.classes ) {
130 contents = [];
131
132 if ( tabConfig.styles ) {
133 contents.push( {
134 id: 'advStyles',
135 att: 'style',
136 type: 'text',
137 requiredContent: element ? element + '{cke-xyz}' : null,
138 label: lang.styles,
139 'default': '',
140
141 validate: CKEDITOR.dialog.validate.inlineStyle( lang.invalidInlineStyle ),
142 onChange: function() {},
143
144 getStyle: function( name, defaultValue ) {
145 var match = this.getValue().match( new RegExp( '(?:^|;)\\s*' + name + '\\s*:\\s*([^;]*)', 'i' ) );
146 return match ? match[ 1 ] : defaultValue;
147 },
148
149 updateStyle: function( name, value ) {
150 var styles = this.getValue();
151
152 var tmp = editor.document.createElement( 'span' );
153 tmp.setAttribute( 'style', styles );
154 tmp.setStyle( name, value );
155 styles = CKEDITOR.tools.normalizeCssText( tmp.getAttribute( 'style' ) );
156
157 this.setValue( styles, 1 );
158 },
159
160 setup: setupAdvParams,
161
162 commit: commitAdvParams
163
164 } );
165 }
166
167 if ( tabConfig.classes ) {
168 contents.push( {
169 type: 'hbox',
170 widths: [ '45%', '55%' ],
171 children: [ {
172 id: 'advCSSClasses',
173 att: 'class',
174 type: 'text',
175 requiredContent: element ? element + '(cke-xyz)' : null,
176 label: lang.cssClasses,
177 'default': '',
178 setup: setupAdvParams,
179 commit: commitAdvParams
180
181 } ]
182 } );
183 }
184
185 result.elements[ 0 ].children.push( {
186 type: 'hbox',
187 widths: [ '50%', '50%' ],
188 children: [].concat( contents )
189 } );
190 }
191
192 return result;
193 }
194 } );
195
196} )();
diff --git a/sources/plugins/dialogui/plugin.js b/sources/plugins/dialogui/plugin.js
new file mode 100644
index 00000000..3b3f1e22
--- /dev/null
+++ b/sources/plugins/dialogui/plugin.js
@@ -0,0 +1,1530 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The Dialog User Interface plugin.
8 */
9
10CKEDITOR.plugins.add( 'dialogui', {
11 onLoad: function() {
12
13 var initPrivateObject = function( elementDefinition ) {
14 this._ || ( this._ = {} );
15 this._[ 'default' ] = this._.initValue = elementDefinition[ 'default' ] || '';
16 this._.required = elementDefinition.required || false;
17 var args = [ this._ ];
18 for ( var i = 1; i < arguments.length; i++ )
19 args.push( arguments[ i ] );
20 args.push( true );
21 CKEDITOR.tools.extend.apply( CKEDITOR.tools, args );
22 return this._;
23 },
24 textBuilder = {
25 build: function( dialog, elementDefinition, output ) {
26 return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output );
27 }
28 },
29 commonBuilder = {
30 build: function( dialog, elementDefinition, output ) {
31 return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, elementDefinition, output );
32 }
33 },
34 containerBuilder = {
35 build: function( dialog, elementDefinition, output ) {
36 var children = elementDefinition.children,
37 child,
38 childHtmlList = [],
39 childObjList = [];
40 for ( var i = 0;
41 ( i < children.length && ( child = children[ i ] ) ); i++ ) {
42 var childHtml = [];
43 childHtmlList.push( childHtml );
44 childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) );
45 }
46 return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition );
47 }
48 },
49 commonPrototype = {
50 isChanged: function() {
51 return this.getValue() != this.getInitValue();
52 },
53
54 reset: function( noChangeEvent ) {
55 this.setValue( this.getInitValue(), noChangeEvent );
56 },
57
58 setInitValue: function() {
59 this._.initValue = this.getValue();
60 },
61
62 resetInitValue: function() {
63 this._.initValue = this._[ 'default' ];
64 },
65
66 getInitValue: function() {
67 return this._.initValue;
68 }
69 },
70 commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, {
71 onChange: function( dialog, func ) {
72 if ( !this._.domOnChangeRegistered ) {
73 dialog.on( 'load', function() {
74 this.getInputElement().on( 'change', function() {
75 // Make sure 'onchange' doesn't get fired after dialog closed. (#5719)
76 if ( !dialog.parts.dialog.isVisible() )
77 return;
78
79 this.fire( 'change', { value: this.getValue() } );
80 }, this );
81 }, this );
82 this._.domOnChangeRegistered = true;
83 }
84
85 this.on( 'change', func );
86 }
87 }, true ),
88 eventRegex = /^on([A-Z]\w+)/,
89 cleanInnerDefinition = function( def ) {
90 // An inner UI element should not have the parent's type, title or events.
91 for ( var i in def ) {
92 if ( eventRegex.test( i ) || i == 'title' || i == 'type' )
93 delete def[ i ];
94 }
95 return def;
96 },
97 // @context {CKEDITOR.dialog.uiElement} UI element (textarea or textInput)
98 // @param {CKEDITOR.dom.event} evt
99 toggleBidiKeyUpHandler = function( evt ) {
100 var keystroke = evt.data.getKeystroke();
101
102 // ALT + SHIFT + Home for LTR direction.
103 if ( keystroke == CKEDITOR.SHIFT + CKEDITOR.ALT + 36 )
104 this.setDirectionMarker( 'ltr' );
105
106 // ALT + SHIFT + End for RTL direction.
107 else if ( keystroke == CKEDITOR.SHIFT + CKEDITOR.ALT + 35 )
108 this.setDirectionMarker( 'rtl' );
109 };
110
111 CKEDITOR.tools.extend( CKEDITOR.ui.dialog, {
112 /**
113 * Base class for all dialog window elements with a textual label on the left.
114 *
115 * @class CKEDITOR.ui.dialog.labeledElement
116 * @extends CKEDITOR.ui.dialog.uiElement
117 * @constructor Creates a labeledElement class instance.
118 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
119 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
120 * The element definition. Accepted fields:
121 *
122 * * `label` (Required) The label string.
123 * * `labelLayout` (Optional) Put 'horizontal' here if the
124 * label element is to be laid out horizontally. Otherwise a vertical
125 * layout will be used.
126 * * `widths` (Optional) This applies only to horizontal
127 * layouts &mdash; a two-element array of lengths to specify the widths of the
128 * label and the content element.
129 * * `role` (Optional) Value for the `role` attribute.
130 * * `includeLabel` (Optional) If set to `true`, the `aria-labelledby` attribute
131 * will be included.
132 *
133 * @param {Array} htmlList The list of HTML code to output to.
134 * @param {Function} contentHtml
135 * A function returning the HTML code string to be added inside the content
136 * cell.
137 */
138 labeledElement: function( dialog, elementDefinition, htmlList, contentHtml ) {
139 if ( arguments.length < 4 )
140 return;
141
142 var _ = initPrivateObject.call( this, elementDefinition );
143 _.labelId = CKEDITOR.tools.getNextId() + '_label';
144 this._.children = [];
145
146 var innerHTML = function() {
147 var html = [],
148 requiredClass = elementDefinition.required ? ' cke_required' : '';
149 if ( elementDefinition.labelLayout != 'horizontal' ) {
150 html.push(
151 '<label class="cke_dialog_ui_labeled_label' + requiredClass + '" ', ' id="' + _.labelId + '"',
152 ( _.inputId ? ' for="' + _.inputId + '"' : '' ),
153 ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) + '>',
154 elementDefinition.label,
155 '</label>',
156 '<div class="cke_dialog_ui_labeled_content"',
157 ( elementDefinition.controlStyle ? ' style="' + elementDefinition.controlStyle + '"' : '' ),
158 ' role="presentation">',
159 contentHtml.call( this, dialog, elementDefinition ),
160 '</div>' );
161 } else {
162 var hboxDefinition = {
163 type: 'hbox',
164 widths: elementDefinition.widths,
165 padding: 0,
166 children: [ {
167 type: 'html',
168 html: '<label class="cke_dialog_ui_labeled_label' + requiredClass + '"' +
169 ' id="' + _.labelId + '"' +
170 ' for="' + _.inputId + '"' +
171 ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) + '>' +
172 CKEDITOR.tools.htmlEncode( elementDefinition.label ) +
173 '</label>'
174 },
175 {
176 type: 'html',
177 html: '<span class="cke_dialog_ui_labeled_content"' + ( elementDefinition.controlStyle ? ' style="' + elementDefinition.controlStyle + '"' : '' ) + '>' +
178 contentHtml.call( this, dialog, elementDefinition ) +
179 '</span>'
180 } ]
181 };
182 CKEDITOR.dialog._.uiElementBuilders.hbox.build( dialog, hboxDefinition, html );
183 }
184 return html.join( '' );
185 };
186 var attributes = { role: elementDefinition.role || 'presentation' };
187
188 if ( elementDefinition.includeLabel )
189 attributes[ 'aria-labelledby' ] = _.labelId;
190
191 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'div', null, attributes, innerHTML );
192 },
193
194 /**
195 * A text input with a label. This UI element class represents both the
196 * single-line text inputs and password inputs in dialog boxes.
197 *
198 * @class CKEDITOR.ui.dialog.textInput
199 * @extends CKEDITOR.ui.dialog.labeledElement
200 * @constructor Creates a textInput class instance.
201 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
202 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
203 * The element definition. Accepted fields:
204 *
205 * * `default` (Optional) The default value.
206 * * `validate` (Optional) The validation function.
207 * * `maxLength` (Optional) The maximum length of text box contents.
208 * * `size` (Optional) The size of the text box. This is
209 * usually overridden by the size defined by the skin, though.
210 *
211 * @param {Array} htmlList List of HTML code to output to.
212 */
213 textInput: function( dialog, elementDefinition, htmlList ) {
214 if ( arguments.length < 3 )
215 return;
216
217 initPrivateObject.call( this, elementDefinition );
218 var domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textInput',
219 attributes = { 'class': 'cke_dialog_ui_input_' + elementDefinition.type, id: domId, type: elementDefinition.type };
220
221 // Set the validator, if any.
222 if ( elementDefinition.validate )
223 this.validate = elementDefinition.validate;
224
225 // Set the max length and size.
226 if ( elementDefinition.maxLength )
227 attributes.maxlength = elementDefinition.maxLength;
228 if ( elementDefinition.size )
229 attributes.size = elementDefinition.size;
230
231 if ( elementDefinition.inputStyle )
232 attributes.style = elementDefinition.inputStyle;
233
234 // If user presses Enter in a text box, it implies clicking OK for the dialog.
235 var me = this,
236 keyPressedOnMe = false;
237 dialog.on( 'load', function() {
238 me.getInputElement().on( 'keydown', function( evt ) {
239 if ( evt.data.getKeystroke() == 13 )
240 keyPressedOnMe = true;
241 } );
242
243 // Lower the priority this 'keyup' since 'ok' will close the dialog.(#3749)
244 me.getInputElement().on( 'keyup', function( evt ) {
245 if ( evt.data.getKeystroke() == 13 && keyPressedOnMe ) {
246 dialog.getButton( 'ok' ) && setTimeout( function() {
247 dialog.getButton( 'ok' ).click();
248 }, 0 );
249 keyPressedOnMe = false;
250 }
251
252 if ( me.bidi )
253 toggleBidiKeyUpHandler.call( me, evt );
254 }, null, null, 1000 );
255 } );
256
257 var innerHTML = function() {
258 // IE BUG: Text input fields in IE at 100% would exceed a <td> or inline
259 // container's width, so need to wrap it inside a <div>.
260 var html = [ '<div class="cke_dialog_ui_input_', elementDefinition.type, '" role="presentation"' ];
261
262 if ( elementDefinition.width )
263 html.push( 'style="width:' + elementDefinition.width + '" ' );
264
265 html.push( '><input ' );
266
267 attributes[ 'aria-labelledby' ] = this._.labelId;
268 this._.required && ( attributes[ 'aria-required' ] = this._.required );
269 for ( var i in attributes )
270 html.push( i + '="' + attributes[ i ] + '" ' );
271 html.push( ' /></div>' );
272 return html.join( '' );
273 };
274 CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
275 },
276
277 /**
278 * A text area with a label at the top or on the left.
279 *
280 * @class CKEDITOR.ui.dialog.textarea
281 * @extends CKEDITOR.ui.dialog.labeledElement
282 * @constructor Creates a textarea class instance.
283 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
284 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
285 *
286 * The element definition. Accepted fields:
287 *
288 * * `rows` (Optional) The number of rows displayed.
289 * Defaults to 5 if not defined.
290 * * `cols` (Optional) The number of cols displayed.
291 * Defaults to 20 if not defined. Usually overridden by skins.
292 * * `default` (Optional) The default value.
293 * * `validate` (Optional) The validation function.
294 *
295 * @param {Array} htmlList List of HTML code to output to.
296 */
297 textarea: function( dialog, elementDefinition, htmlList ) {
298 if ( arguments.length < 3 )
299 return;
300
301 initPrivateObject.call( this, elementDefinition );
302 var me = this,
303 domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textarea',
304 attributes = {};
305
306 if ( elementDefinition.validate )
307 this.validate = elementDefinition.validate;
308
309 // Generates the essential attributes for the textarea tag.
310 attributes.rows = elementDefinition.rows || 5;
311 attributes.cols = elementDefinition.cols || 20;
312
313 attributes[ 'class' ] = 'cke_dialog_ui_input_textarea ' + ( elementDefinition[ 'class' ] || '' );
314
315 if ( typeof elementDefinition.inputStyle != 'undefined' )
316 attributes.style = elementDefinition.inputStyle;
317
318 if ( elementDefinition.dir )
319 attributes.dir = elementDefinition.dir;
320
321 if ( me.bidi ) {
322 dialog.on( 'load', function() {
323 me.getInputElement().on( 'keyup', toggleBidiKeyUpHandler );
324 }, me );
325 }
326
327 var innerHTML = function() {
328 attributes[ 'aria-labelledby' ] = this._.labelId;
329 this._.required && ( attributes[ 'aria-required' ] = this._.required );
330 var html = [ '<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea id="', domId, '" ' ];
331 for ( var i in attributes )
332 html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[ i ] ) + '" ' );
333 html.push( '>', CKEDITOR.tools.htmlEncode( me._[ 'default' ] ), '</textarea></div>' );
334 return html.join( '' );
335 };
336 CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
337 },
338
339 /**
340 * A single checkbox with a label on the right.
341 *
342 * @class CKEDITOR.ui.dialog.checkbox
343 * @extends CKEDITOR.ui.dialog.uiElement
344 * @constructor Creates a checkbox class instance.
345 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
346 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
347 * The element definition. Accepted fields:
348 *
349 * * `checked` (Optional) Whether the checkbox is checked
350 * on instantiation. Defaults to `false`.
351 * * `validate` (Optional) The validation function.
352 * * `label` (Optional) The checkbox label.
353 *
354 * @param {Array} htmlList List of HTML code to output to.
355 */
356 checkbox: function( dialog, elementDefinition, htmlList ) {
357 if ( arguments.length < 3 )
358 return;
359
360 var _ = initPrivateObject.call( this, elementDefinition, { 'default': !!elementDefinition[ 'default' ] } );
361
362 if ( elementDefinition.validate )
363 this.validate = elementDefinition.validate;
364
365 var innerHTML = function() {
366 var myDefinition = CKEDITOR.tools.extend(
367 {},
368 elementDefinition,
369 {
370 id: elementDefinition.id ? elementDefinition.id + '_checkbox' : CKEDITOR.tools.getNextId() + '_checkbox'
371 },
372 true
373 ),
374 html = [];
375
376 var labelId = CKEDITOR.tools.getNextId() + '_label';
377 var attributes = { 'class': 'cke_dialog_ui_checkbox_input', type: 'checkbox', 'aria-labelledby': labelId };
378 cleanInnerDefinition( myDefinition );
379 if ( elementDefinition[ 'default' ] )
380 attributes.checked = 'checked';
381
382 if ( typeof myDefinition.inputStyle != 'undefined' )
383 myDefinition.style = myDefinition.inputStyle;
384
385 _.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes );
386 html.push(
387 ' <label id="',
388 labelId,
389 '" for="',
390 attributes.id,
391 '"' + ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) + '>',
392 CKEDITOR.tools.htmlEncode( elementDefinition.label ),
393 '</label>'
394 );
395 return html.join( '' );
396 };
397
398 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'span', null, null, innerHTML );
399 },
400
401 /**
402 * A group of radio buttons.
403 *
404 * @class CKEDITOR.ui.dialog.radio
405 * @extends CKEDITOR.ui.dialog.labeledElement
406 * @constructor Creates a radio class instance.
407 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
408 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
409 * The element definition. Accepted fields:
410 *
411 * * `default` (Required) The default value.
412 * * `validate` (Optional) The validation function.
413 * * `items` (Required) An array of options. Each option
414 * is a one- or two-item array of format `[ 'Description', 'Value' ]`. If `'Value'`
415 * is missing, then the value would be assumed to be the same as the description.
416 *
417 * @param {Array} htmlList List of HTML code to output to.
418 */
419 radio: function( dialog, elementDefinition, htmlList ) {
420 if ( arguments.length < 3 )
421 return;
422
423 initPrivateObject.call( this, elementDefinition );
424
425 if ( !this._[ 'default' ] )
426 this._[ 'default' ] = this._.initValue = elementDefinition.items[ 0 ][ 1 ];
427
428 if ( elementDefinition.validate )
429 this.validate = elementDefinition.validate;
430
431 var children = [],
432 me = this;
433
434 var innerHTML = function() {
435 var inputHtmlList = [],
436 html = [],
437 commonName = ( elementDefinition.id ? elementDefinition.id : CKEDITOR.tools.getNextId() ) + '_radio';
438
439 for ( var i = 0; i < elementDefinition.items.length; i++ ) {
440 var item = elementDefinition.items[ i ],
441 title = item[ 2 ] !== undefined ? item[ 2 ] : item[ 0 ],
442 value = item[ 1 ] !== undefined ? item[ 1 ] : item[ 0 ],
443 inputId = CKEDITOR.tools.getNextId() + '_radio_input',
444 labelId = inputId + '_label',
445
446 inputDefinition = CKEDITOR.tools.extend( {}, elementDefinition, {
447 id: inputId,
448 title: null,
449 type: null
450 }, true ),
451
452 labelDefinition = CKEDITOR.tools.extend( {}, inputDefinition, {
453 title: title
454 }, true ),
455
456 inputAttributes = {
457 type: 'radio',
458 'class': 'cke_dialog_ui_radio_input',
459 name: commonName,
460 value: value,
461 'aria-labelledby': labelId
462 },
463
464 inputHtml = [];
465
466 if ( me._[ 'default' ] == value )
467 inputAttributes.checked = 'checked';
468
469 cleanInnerDefinition( inputDefinition );
470 cleanInnerDefinition( labelDefinition );
471
472 if ( typeof inputDefinition.inputStyle != 'undefined' )
473 inputDefinition.style = inputDefinition.inputStyle;
474
475 // Make inputs of radio type focusable (#10866).
476 inputDefinition.keyboardFocusable = true;
477
478 children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) );
479
480 inputHtml.push( ' ' );
481
482 new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtml, 'label', null, {
483 id: labelId,
484 'for': inputAttributes.id
485 }, item[ 0 ] );
486
487 inputHtmlList.push( inputHtml.join( '' ) );
488 }
489
490 new CKEDITOR.ui.dialog.hbox( dialog, children, inputHtmlList, html );
491
492 return html.join( '' );
493 };
494
495 // Adding a role="radiogroup" to definition used for wrapper.
496 elementDefinition.role = 'radiogroup';
497 elementDefinition.includeLabel = true;
498
499 CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
500 this._.children = children;
501 },
502
503 /**
504 * A button with a label inside.
505 *
506 * @class CKEDITOR.ui.dialog.button
507 * @extends CKEDITOR.ui.dialog.uiElement
508 * @constructor Creates a button class instance.
509 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
510 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
511 * The element definition. Accepted fields:
512 *
513 * * `label` (Required) The button label.
514 * * `disabled` (Optional) Set to `true` if you want the
515 * button to appear in the disabled state.
516 *
517 * @param {Array} htmlList List of HTML code to output to.
518 */
519 button: function( dialog, elementDefinition, htmlList ) {
520 if ( !arguments.length )
521 return;
522
523 if ( typeof elementDefinition == 'function' )
524 elementDefinition = elementDefinition( dialog.getParentEditor() );
525
526 initPrivateObject.call( this, elementDefinition, { disabled: elementDefinition.disabled || false } );
527
528 // Add OnClick event to this input.
529 CKEDITOR.event.implementOn( this );
530
531 var me = this;
532
533 // Register an event handler for processing button clicks.
534 dialog.on( 'load', function() {
535 var element = this.getElement();
536
537 ( function() {
538 element.on( 'click', function( evt ) {
539 me.click();
540 // #9958
541 evt.data.preventDefault();
542 } );
543
544 element.on( 'keydown', function( evt ) {
545 if ( evt.data.getKeystroke() in { 32: 1 } ) {
546 me.click();
547 evt.data.preventDefault();
548 }
549 } );
550 } )();
551
552 element.unselectable();
553 }, this );
554
555 var outerDefinition = CKEDITOR.tools.extend( {}, elementDefinition );
556 delete outerDefinition.style;
557
558 var labelId = CKEDITOR.tools.getNextId() + '_label';
559 CKEDITOR.ui.dialog.uiElement.call( this, dialog, outerDefinition, htmlList, 'a', null, {
560 style: elementDefinition.style,
561 href: 'javascript:void(0)', // jshint ignore:line
562 title: elementDefinition.label,
563 hidefocus: 'true',
564 'class': elementDefinition[ 'class' ],
565 role: 'button',
566 'aria-labelledby': labelId
567 }, '<span id="' + labelId + '" class="cke_dialog_ui_button">' +
568 CKEDITOR.tools.htmlEncode( elementDefinition.label ) +
569 '</span>' );
570 },
571
572 /**
573 * A select box.
574 *
575 * @class CKEDITOR.ui.dialog.select
576 * @extends CKEDITOR.ui.dialog.uiElement
577 * @constructor Creates a button class instance.
578 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
579 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
580 * The element definition. Accepted fields:
581 *
582 * * `default` (Required) The default value.
583 * * `validate` (Optional) The validation function.
584 * * `items` (Required) An array of options. Each option
585 * is a one- or two-item array of format `[ 'Description', 'Value' ]`. If `'Value'`
586 * is missing, then the value would be assumed to be the same as the
587 * description.
588 * * `multiple` (Optional) Set this to `true` if you would like
589 * to have a multiple-choice select box.
590 * * `size` (Optional) The number of items to display in
591 * the select box.
592 *
593 * @param {Array} htmlList List of HTML code to output to.
594 */
595 select: function( dialog, elementDefinition, htmlList ) {
596 if ( arguments.length < 3 )
597 return;
598
599 var _ = initPrivateObject.call( this, elementDefinition );
600
601 if ( elementDefinition.validate )
602 this.validate = elementDefinition.validate;
603
604 _.inputId = CKEDITOR.tools.getNextId() + '_select';
605
606 var innerHTML = function() {
607 var myDefinition = CKEDITOR.tools.extend(
608 {},
609 elementDefinition,
610 {
611 id: ( elementDefinition.id ? elementDefinition.id + '_select' : CKEDITOR.tools.getNextId() + '_select' )
612 },
613 true
614 ),
615 html = [],
616 innerHTML = [],
617 attributes = { 'id': _.inputId, 'class': 'cke_dialog_ui_input_select', 'aria-labelledby': this._.labelId };
618
619 html.push( '<div class="cke_dialog_ui_input_', elementDefinition.type, '" role="presentation"' );
620 if ( elementDefinition.width )
621 html.push( 'style="width:' + elementDefinition.width + '" ' );
622 html.push( '>' );
623
624 // Add multiple and size attributes from element definition.
625 if ( elementDefinition.size !== undefined )
626 attributes.size = elementDefinition.size;
627 if ( elementDefinition.multiple !== undefined )
628 attributes.multiple = elementDefinition.multiple;
629
630 cleanInnerDefinition( myDefinition );
631 for ( var i = 0, item; i < elementDefinition.items.length && ( item = elementDefinition.items[ i ] ); i++ ) {
632 innerHTML.push( '<option value="', CKEDITOR.tools.htmlEncode( item[ 1 ] !== undefined ? item[ 1 ] : item[ 0 ] ).replace( /"/g, '&quot;' ), '" /> ', CKEDITOR.tools.htmlEncode( item[ 0 ] ) );
633 }
634
635 if ( typeof myDefinition.inputStyle != 'undefined' )
636 myDefinition.style = myDefinition.inputStyle;
637
638 _.select = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'select', null, attributes, innerHTML.join( '' ) );
639
640 html.push( '</div>' );
641
642 return html.join( '' );
643 };
644
645 CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
646 },
647
648 /**
649 * A file upload input.
650 *
651 * @class CKEDITOR.ui.dialog.file
652 * @extends CKEDITOR.ui.dialog.labeledElement
653 * @constructor Creates a file class instance.
654 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
655 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
656 * The element definition. Accepted fields:
657 *
658 * * `validate` (Optional) The validation function.
659 *
660 * @param {Array} htmlList List of HTML code to output to.
661 */
662 file: function( dialog, elementDefinition, htmlList ) {
663 if ( arguments.length < 3 )
664 return;
665
666 if ( elementDefinition[ 'default' ] === undefined )
667 elementDefinition[ 'default' ] = '';
668
669 var _ = CKEDITOR.tools.extend( initPrivateObject.call( this, elementDefinition ), { definition: elementDefinition, buttons: [] } );
670
671 if ( elementDefinition.validate )
672 this.validate = elementDefinition.validate;
673
674 /** @ignore */
675 var innerHTML = function() {
676 _.frameId = CKEDITOR.tools.getNextId() + '_fileInput';
677
678 var html = [
679 '<iframe' +
680 ' frameborder="0"' +
681 ' allowtransparency="0"' +
682 ' class="cke_dialog_ui_input_file"' +
683 ' role="presentation"' +
684 ' id="', _.frameId, '"' +
685 ' title="', elementDefinition.label, '"' +
686 ' src="javascript:void('
687 ];
688
689 // Support for custom document.domain on IE. (#10165)
690 html.push( CKEDITOR.env.ie ?
691 '(function(){' + encodeURIComponent(
692 'document.open();' +
693 '(' + CKEDITOR.tools.fixDomain + ')();' +
694 'document.close();'
695 ) + '})()'
696 :
697 '0'
698 );
699
700 html.push( ')"></iframe>' );
701
702 return html.join( '' );
703 };
704
705 // IE BUG: Parent container does not resize to contain the iframe automatically.
706 dialog.on( 'load', function() {
707 var iframe = CKEDITOR.document.getById( _.frameId ),
708 contentDiv = iframe.getParent();
709 contentDiv.addClass( 'cke_dialog_ui_input_file' );
710 } );
711
712 CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
713 },
714
715 /**
716 * A button for submitting the file in a file upload input.
717 *
718 * @class CKEDITOR.ui.dialog.fileButton
719 * @extends CKEDITOR.ui.dialog.button
720 * @constructor Creates a fileButton class instance.
721 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
722 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
723 * The element definition. Accepted fields:
724 *
725 * * `for` (Required) The file input's page and element ID
726 * to associate with, in a two-item array format: `[ 'page_id', 'element_id' ]`.
727 * * `validate` (Optional) The validation function.
728 *
729 * @param {Array} htmlList List of HTML code to output to.
730 */
731 fileButton: function( dialog, elementDefinition, htmlList ) {
732 var me = this;
733 if ( arguments.length < 3 )
734 return;
735
736 initPrivateObject.call( this, elementDefinition );
737
738 if ( elementDefinition.validate )
739 this.validate = elementDefinition.validate;
740
741 var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition );
742 var onClick = myDefinition.onClick;
743 myDefinition.className = ( myDefinition.className ? myDefinition.className + ' ' : '' ) + 'cke_dialog_ui_button';
744 myDefinition.onClick = function( evt ) {
745 var target = elementDefinition[ 'for' ]; // [ pageId, elementId ]
746 if ( !onClick || onClick.call( this, evt ) !== false ) {
747 dialog.getContentElement( target[ 0 ], target[ 1 ] ).submit();
748 this.disable();
749 }
750 };
751
752 dialog.on( 'load', function() {
753 dialog.getContentElement( elementDefinition[ 'for' ][ 0 ], elementDefinition[ 'for' ][ 1 ] )._.buttons.push( me );
754 } );
755
756 CKEDITOR.ui.dialog.button.call( this, dialog, myDefinition, htmlList );
757 },
758
759 html: ( function() {
760 var myHtmlRe = /^\s*<[\w:]+\s+([^>]*)?>/,
761 theirHtmlRe = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,
762 emptyTagRe = /\/$/;
763 /**
764 * A dialog window element made from raw HTML code.
765 *
766 * @class CKEDITOR.ui.dialog.html
767 * @extends CKEDITOR.ui.dialog.uiElement
768 * @constructor Creates a html class instance.
769 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
770 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element definition.
771 * Accepted fields:
772 *
773 * * `html` (Required) HTML code of this element.
774 *
775 * @param {Array} htmlList List of HTML code to be added to the dialog's content area.
776 */
777 return function( dialog, elementDefinition, htmlList ) {
778 if ( arguments.length < 3 )
779 return;
780
781 var myHtmlList = [],
782 myHtml,
783 theirHtml = elementDefinition.html,
784 myMatch, theirMatch;
785
786 // If the HTML input doesn't contain any tags at the beginning, add a <span> tag around it.
787 if ( theirHtml.charAt( 0 ) != '<' )
788 theirHtml = '<span>' + theirHtml + '</span>';
789
790 // Look for focus function in definition.
791 var focus = elementDefinition.focus;
792 if ( focus ) {
793 var oldFocus = this.focus;
794 this.focus = function() {
795 ( typeof focus == 'function' ? focus : oldFocus ).call( this );
796 this.fire( 'focus' );
797 };
798 if ( elementDefinition.isFocusable ) {
799 var oldIsFocusable = this.isFocusable;
800 this.isFocusable = oldIsFocusable;
801 }
802 this.keyboardFocusable = true;
803 }
804
805 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtmlList, 'span', null, null, '' );
806
807 // Append the attributes created by the uiElement call to the real HTML.
808 myHtml = myHtmlList.join( '' );
809 myMatch = myHtml.match( myHtmlRe );
810 theirMatch = theirHtml.match( theirHtmlRe ) || [ '', '', '' ];
811
812 if ( emptyTagRe.test( theirMatch[ 1 ] ) ) {
813 theirMatch[ 1 ] = theirMatch[ 1 ].slice( 0, -1 );
814 theirMatch[ 2 ] = '/' + theirMatch[ 2 ];
815 }
816
817 htmlList.push( [ theirMatch[ 1 ], ' ', myMatch[ 1 ] || '', theirMatch[ 2 ] ].join( '' ) );
818 };
819 } )(),
820
821 /**
822 * Form fieldset for grouping dialog UI elements.
823 *
824 * @class CKEDITOR.ui.dialog.fieldset
825 * @extends CKEDITOR.ui.dialog.uiElement
826 * @constructor Creates a fieldset class instance.
827 * @param {CKEDITOR.dialog} dialog Parent dialog window object.
828 * @param {Array} childObjList
829 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container.
830 * @param {Array} childHtmlList Array of HTML code that corresponds to the HTML output of all the
831 * objects in childObjList.
832 * @param {Array} htmlList Array of HTML code that this element will output to.
833 * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition
834 * The element definition. Accepted fields:
835 *
836 * * `label` (Optional) The legend of the this fieldset.
837 * * `children` (Required) An array of dialog window field definitions which will be grouped inside this fieldset.
838 *
839 */
840 fieldset: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) {
841 var legendLabel = elementDefinition.label;
842 /** @ignore */
843 var innerHTML = function() {
844 var html = [];
845 legendLabel && html.push( '<legend' +
846 ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) +
847 '>' + legendLabel + '</legend>' );
848 for ( var i = 0; i < childHtmlList.length; i++ )
849 html.push( childHtmlList[ i ] );
850 return html.join( '' );
851 };
852
853 this._ = { children: childObjList };
854 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'fieldset', null, null, innerHTML );
855 }
856
857 }, true );
858
859 CKEDITOR.ui.dialog.html.prototype = new CKEDITOR.ui.dialog.uiElement();
860
861 /** @class CKEDITOR.ui.dialog.labeledElement */
862 CKEDITOR.ui.dialog.labeledElement.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), {
863 /**
864 * Sets the label text of the element.
865 *
866 * @param {String} label The new label text.
867 * @returns {CKEDITOR.ui.dialog.labeledElement} The current labeled element.
868 */
869 setLabel: function( label ) {
870 var node = CKEDITOR.document.getById( this._.labelId );
871 if ( node.getChildCount() < 1 )
872 ( new CKEDITOR.dom.text( label, CKEDITOR.document ) ).appendTo( node );
873 else
874 node.getChild( 0 ).$.nodeValue = label;
875 return this;
876 },
877
878 /**
879 * Retrieves the current label text of the elment.
880 *
881 * @returns {String} The current label text.
882 */
883 getLabel: function() {
884 var node = CKEDITOR.document.getById( this._.labelId );
885 if ( !node || node.getChildCount() < 1 )
886 return '';
887 else
888 return node.getChild( 0 ).getText();
889 },
890
891 /**
892 * Defines the `onChange` event for UI element definitions.
893 * @property {Object}
894 */
895 eventProcessors: commonEventProcessors
896 }, true );
897
898 /** @class CKEDITOR.ui.dialog.button */
899 CKEDITOR.ui.dialog.button.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), {
900 /**
901 * Simulates a click to the button.
902 *
903 * @returns {Object} Return value of the `click` event.
904 */
905 click: function() {
906 if ( !this._.disabled )
907 return this.fire( 'click', { dialog: this._.dialog } );
908 return false;
909 },
910
911 /**
912 * Enables the button.
913 */
914 enable: function() {
915 this._.disabled = false;
916 var element = this.getElement();
917 element && element.removeClass( 'cke_disabled' );
918 },
919
920 /**
921 * Disables the button.
922 */
923 disable: function() {
924 this._.disabled = true;
925 this.getElement().addClass( 'cke_disabled' );
926 },
927
928 /**
929 * Checks whether a field is visible.
930 *
931 * @returns {Boolean}
932 */
933 isVisible: function() {
934 return this.getElement().getFirst().isVisible();
935 },
936
937 /**
938 * Checks whether a field is enabled. Fields can be disabled by using the
939 * {@link #disable} method and enabled by using the {@link #enable} method.
940 *
941 * @returns {Boolean}
942 */
943 isEnabled: function() {
944 return !this._.disabled;
945 },
946
947 /**
948 * Defines the `onChange` event and `onClick` for button element definitions.
949 *
950 * @property {Object}
951 */
952 eventProcessors: CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, {
953 onClick: function( dialog, func ) {
954 this.on( 'click', function() {
955 func.apply( this, arguments );
956 } );
957 }
958 }, true ),
959
960 /**
961 * Handler for the element's access key up event. Simulates a click to
962 * the button.
963 */
964 accessKeyUp: function() {
965 this.click();
966 },
967
968 /**
969 * Handler for the element's access key down event. Simulates a mouse
970 * down to the button.
971 */
972 accessKeyDown: function() {
973 this.focus();
974 },
975
976 keyboardFocusable: true
977 }, true );
978
979 /** @class CKEDITOR.ui.dialog.textInput */
980 CKEDITOR.ui.dialog.textInput.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), {
981 /**
982 * Gets the text input DOM element under this UI object.
983 *
984 * @returns {CKEDITOR.dom.element} The DOM element of the text input.
985 */
986 getInputElement: function() {
987 return CKEDITOR.document.getById( this._.inputId );
988 },
989
990 /**
991 * Puts focus into the text input.
992 */
993 focus: function() {
994 var me = this.selectParentTab();
995
996 // GECKO BUG: setTimeout() is needed to workaround invisible selections.
997 setTimeout( function() {
998 var element = me.getInputElement();
999 element && element.$.focus();
1000 }, 0 );
1001 },
1002
1003 /**
1004 * Selects all the text in the text input.
1005 */
1006 select: function() {
1007 var me = this.selectParentTab();
1008
1009 // GECKO BUG: setTimeout() is needed to workaround invisible selections.
1010 setTimeout( function() {
1011 var e = me.getInputElement();
1012 if ( e ) {
1013 e.$.focus();
1014 e.$.select();
1015 }
1016 }, 0 );
1017 },
1018
1019 /**
1020 * Handler for the text input's access key up event. Makes a `select()`
1021 * call to the text input.
1022 */
1023 accessKeyUp: function() {
1024 this.select();
1025 },
1026
1027 /**
1028 * Sets the value of this text input object.
1029 *
1030 * uiElement.setValue( 'Blamo' );
1031 *
1032 * @param {Object} value The new value.
1033 * @returns {CKEDITOR.ui.dialog.textInput} The current UI element.
1034 */
1035 setValue: function( value ) {
1036 if ( this.bidi ) {
1037 var marker = value && value.charAt( 0 ),
1038 dir = ( marker == '\u202A' ? 'ltr' : marker == '\u202B' ? 'rtl' : null );
1039
1040 if ( dir ) {
1041 value = value.slice( 1 );
1042 }
1043
1044 // Set the marker or reset it (if dir==null).
1045 this.setDirectionMarker( dir );
1046 }
1047
1048 if ( !value ) {
1049 value = '';
1050 }
1051
1052 return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply( this, arguments );
1053 },
1054
1055 /**
1056 * Gets the value of this text input object.
1057 *
1058 * @returns {String} The value.
1059 */
1060 getValue: function() {
1061 var value = CKEDITOR.ui.dialog.uiElement.prototype.getValue.call( this );
1062
1063 if ( this.bidi && value ) {
1064 var dir = this.getDirectionMarker();
1065 if ( dir ) {
1066 value = ( dir == 'ltr' ? '\u202A' : '\u202B' ) + value;
1067 }
1068 }
1069
1070 return value;
1071 },
1072
1073 /**
1074 * Sets the text direction marker and the `dir` attribute of the input element.
1075 *
1076 * @since 4.5
1077 * @param {String} dir The text direction. Pass `null` to reset.
1078 */
1079 setDirectionMarker: function( dir ) {
1080 var inputElement = this.getInputElement();
1081
1082 if ( dir ) {
1083 inputElement.setAttributes( {
1084 dir: dir,
1085 'data-cke-dir-marker': dir
1086 } );
1087 // Don't remove the dir attribute if this field hasn't got the marker,
1088 // because the dir attribute could be set independently.
1089 } else if ( this.getDirectionMarker() ) {
1090 inputElement.removeAttributes( [ 'dir', 'data-cke-dir-marker' ] );
1091 }
1092 },
1093
1094 /**
1095 * Gets the value of the text direction marker.
1096 *
1097 * @since 4.5
1098 * @returns {String} `'ltr'`, `'rtl'` or `null` if the marker is not set.
1099 */
1100 getDirectionMarker: function() {
1101 return this.getInputElement().data( 'cke-dir-marker' );
1102 },
1103
1104 keyboardFocusable: true
1105 }, commonPrototype, true );
1106
1107 CKEDITOR.ui.dialog.textarea.prototype = new CKEDITOR.ui.dialog.textInput();
1108
1109 /** @class CKEDITOR.ui.dialog.select */
1110 CKEDITOR.ui.dialog.select.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), {
1111 /**
1112 * Gets the DOM element of the select box.
1113 *
1114 * @returns {CKEDITOR.dom.element} The `<select>` element of this UI element.
1115 */
1116 getInputElement: function() {
1117 return this._.select.getElement();
1118 },
1119
1120 /**
1121 * Adds an option to the select box.
1122 *
1123 * @param {String} label Option label.
1124 * @param {String} value (Optional) Option value, if not defined it will be
1125 * assumed to be the same as the label.
1126 * @param {Number} index (Optional) Position of the option to be inserted
1127 * to. If not defined, the new option will be inserted to the end of list.
1128 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
1129 */
1130 add: function( label, value, index ) {
1131 var option = new CKEDITOR.dom.element( 'option', this.getDialog().getParentEditor().document ),
1132 selectElement = this.getInputElement().$;
1133 option.$.text = label;
1134 option.$.value = ( value === undefined || value === null ) ? label : value;
1135 if ( index === undefined || index === null ) {
1136 if ( CKEDITOR.env.ie ) {
1137 selectElement.add( option.$ );
1138 } else {
1139 selectElement.add( option.$, null );
1140 }
1141 } else {
1142 selectElement.add( option.$, index );
1143 }
1144 return this;
1145 },
1146
1147 /**
1148 * Removes an option from the selection list.
1149 *
1150 * @param {Number} index Index of the option to be removed.
1151 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
1152 */
1153 remove: function( index ) {
1154 var selectElement = this.getInputElement().$;
1155 selectElement.remove( index );
1156 return this;
1157 },
1158
1159 /**
1160 * Clears all options out of the selection list.
1161 *
1162 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
1163 */
1164 clear: function() {
1165 var selectElement = this.getInputElement().$;
1166 while ( selectElement.length > 0 )
1167 selectElement.remove( 0 );
1168 return this;
1169 },
1170
1171 keyboardFocusable: true
1172 }, commonPrototype, true );
1173
1174 /** @class CKEDITOR.ui.dialog.checkbox */
1175 CKEDITOR.ui.dialog.checkbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), {
1176 /**
1177 * Gets the checkbox DOM element.
1178 *
1179 * @returns {CKEDITOR.dom.element} The DOM element of the checkbox.
1180 */
1181 getInputElement: function() {
1182 return this._.checkbox.getElement();
1183 },
1184
1185 /**
1186 * Sets the state of the checkbox.
1187 *
1188 * @param {Boolean} checked `true` to tick the checkbox, `false` to untick it.
1189 * @param {Boolean} noChangeEvent Internal commit, to supress `change` event on this element.
1190 */
1191 setValue: function( checked, noChangeEvent ) {
1192 this.getInputElement().$.checked = checked;
1193 !noChangeEvent && this.fire( 'change', { value: checked } );
1194 },
1195
1196 /**
1197 * Gets the state of the checkbox.
1198 *
1199 * @returns {Boolean} `true` means that the checkbox is ticked, `false` means it is not ticked.
1200 */
1201 getValue: function() {
1202 return this.getInputElement().$.checked;
1203 },
1204
1205 /**
1206 * Handler for the access key up event. Toggles the checkbox.
1207 */
1208 accessKeyUp: function() {
1209 this.setValue( !this.getValue() );
1210 },
1211
1212 /**
1213 * Defines the `onChange` event for UI element definitions.
1214 *
1215 * @property {Object}
1216 */
1217 eventProcessors: {
1218 onChange: function( dialog, func ) {
1219 if ( !CKEDITOR.env.ie || ( CKEDITOR.env.version > 8 ) )
1220 return commonEventProcessors.onChange.apply( this, arguments );
1221 else {
1222 dialog.on( 'load', function() {
1223 var element = this._.checkbox.getElement();
1224 element.on( 'propertychange', function( evt ) {
1225 evt = evt.data.$;
1226 if ( evt.propertyName == 'checked' )
1227 this.fire( 'change', { value: element.$.checked } );
1228 }, this );
1229 }, this );
1230 this.on( 'change', func );
1231 }
1232 return null;
1233 }
1234 },
1235
1236 keyboardFocusable: true
1237 }, commonPrototype, true );
1238
1239 /** @class CKEDITOR.ui.dialog.radio */
1240 CKEDITOR.ui.dialog.radio.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), {
1241 /**
1242 * Selects one of the radio buttons in this button group.
1243 *
1244 * @param {String} value The value of the button to be chcked.
1245 * @param {Boolean} noChangeEvent Internal commit, to supress the `change` event on this element.
1246 */
1247 setValue: function( value, noChangeEvent ) {
1248 var children = this._.children,
1249 item;
1250 for ( var i = 0;
1251 ( i < children.length ) && ( item = children[ i ] ); i++ )
1252 item.getElement().$.checked = ( item.getValue() == value );
1253 !noChangeEvent && this.fire( 'change', { value: value } );
1254 },
1255
1256 /**
1257 * Gets the value of the currently selected radio button.
1258 *
1259 * @returns {String} The currently selected button's value.
1260 */
1261 getValue: function() {
1262 var children = this._.children;
1263 for ( var i = 0; i < children.length; i++ ) {
1264 if ( children[ i ].getElement().$.checked )
1265 return children[ i ].getValue();
1266 }
1267 return null;
1268 },
1269
1270 /**
1271 * Handler for the access key up event. Focuses the currently
1272 * selected radio button, or the first radio button if none is selected.
1273 */
1274 accessKeyUp: function() {
1275 var children = this._.children,
1276 i;
1277 for ( i = 0; i < children.length; i++ ) {
1278 if ( children[ i ].getElement().$.checked ) {
1279 children[ i ].getElement().focus();
1280 return;
1281 }
1282 }
1283 children[ 0 ].getElement().focus();
1284 },
1285
1286 /**
1287 * Defines the `onChange` event for UI element definitions.
1288 *
1289 * @property {Object}
1290 */
1291 eventProcessors: {
1292 onChange: function( dialog, func ) {
1293 if ( !CKEDITOR.env.ie || ( CKEDITOR.env.version > 8 ) )
1294 return commonEventProcessors.onChange.apply( this, arguments );
1295 else {
1296 dialog.on( 'load', function() {
1297 var children = this._.children,
1298 me = this;
1299 for ( var i = 0; i < children.length; i++ ) {
1300 var element = children[ i ].getElement();
1301 element.on( 'propertychange', function( evt ) {
1302 evt = evt.data.$;
1303 if ( evt.propertyName == 'checked' && this.$.checked )
1304 me.fire( 'change', { value: this.getAttribute( 'value' ) } );
1305 } );
1306 }
1307 }, this );
1308 this.on( 'change', func );
1309 }
1310 return null;
1311 }
1312 }
1313 }, commonPrototype, true );
1314
1315 /** @class CKEDITOR.ui.dialog.file */
1316 CKEDITOR.ui.dialog.file.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), commonPrototype, {
1317 /**
1318 * Gets the `<input>` element of this file input.
1319 *
1320 * @returns {CKEDITOR.dom.element} The file input element.
1321 */
1322 getInputElement: function() {
1323 var frameDocument = CKEDITOR.document.getById( this._.frameId ).getFrameDocument();
1324 return frameDocument.$.forms.length > 0 ? new CKEDITOR.dom.element( frameDocument.$.forms[ 0 ].elements[ 0 ] ) : this.getElement();
1325 },
1326
1327 /**
1328 * Uploads the file in the file input.
1329 *
1330 * @returns {CKEDITOR.ui.dialog.file} This object.
1331 */
1332 submit: function() {
1333 this.getInputElement().getParent().$.submit();
1334 return this;
1335 },
1336
1337 /**
1338 * Gets the action assigned to the form.
1339 *
1340 * @returns {String} The value of the action.
1341 */
1342 getAction: function() {
1343 return this.getInputElement().getParent().$.action;
1344 },
1345
1346 /**
1347 * The events must be applied to the inner input element, and
1348 * this must be done when the iframe and form have been loaded.
1349 */
1350 registerEvents: function( definition ) {
1351 var regex = /^on([A-Z]\w+)/,
1352 match;
1353
1354 var registerDomEvent = function( uiElement, dialog, eventName, func ) {
1355 uiElement.on( 'formLoaded', function() {
1356 uiElement.getInputElement().on( eventName, func, uiElement );
1357 } );
1358 };
1359
1360 for ( var i in definition ) {
1361 if ( !( match = i.match( regex ) ) )
1362 continue;
1363
1364 if ( this.eventProcessors[ i ] )
1365 this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] );
1366 else
1367 registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] );
1368 }
1369
1370 return this;
1371 },
1372
1373 /**
1374 * Redraws the file input and resets the file path in the file input.
1375 * The redrawing logic is necessary because non-IE browsers tend to clear
1376 * the `<iframe>` containing the file input after closing the dialog window.
1377 */
1378 reset: function() {
1379 var _ = this._,
1380 frameElement = CKEDITOR.document.getById( _.frameId ),
1381 frameDocument = frameElement.getFrameDocument(),
1382 elementDefinition = _.definition,
1383 buttons = _.buttons,
1384 callNumber = this.formLoadedNumber,
1385 unloadNumber = this.formUnloadNumber,
1386 langDir = _.dialog._.editor.lang.dir,
1387 langCode = _.dialog._.editor.langCode;
1388
1389 // The callback function for the iframe, but we must call tools.addFunction only once
1390 // so we store the function number in this.formLoadedNumber
1391 if ( !callNumber ) {
1392 callNumber = this.formLoadedNumber = CKEDITOR.tools.addFunction( function() {
1393 // Now we can apply the events to the input type=file
1394 this.fire( 'formLoaded' );
1395 }, this );
1396
1397 // Remove listeners attached to the content of the iframe (the file input)
1398 unloadNumber = this.formUnloadNumber = CKEDITOR.tools.addFunction( function() {
1399 this.getInputElement().clearCustomData();
1400 }, this );
1401
1402 this.getDialog()._.editor.on( 'destroy', function() {
1403 CKEDITOR.tools.removeFunction( callNumber );
1404 CKEDITOR.tools.removeFunction( unloadNumber );
1405 } );
1406 }
1407
1408 function generateFormField() {
1409 frameDocument.$.open();
1410
1411 var size = '';
1412 if ( elementDefinition.size )
1413 size = elementDefinition.size - ( CKEDITOR.env.ie ? 7 : 0 ); // "Browse" button is bigger in IE.
1414
1415 var inputId = _.frameId + '_input';
1416
1417 frameDocument.$.write( [
1418 '<html dir="' + langDir + '" lang="' + langCode + '"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">',
1419 '<form enctype="multipart/form-data" method="POST" dir="' + langDir + '" lang="' + langCode + '" action="',
1420 CKEDITOR.tools.htmlEncode( elementDefinition.action ),
1421 '">',
1422 // Replicate the field label inside of iframe.
1423 '<label id="', _.labelId, '" for="', inputId, '" style="display:none">',
1424 CKEDITOR.tools.htmlEncode( elementDefinition.label ),
1425 '</label>',
1426 // Set width to make sure that input is not clipped by the iframe (#11253).
1427 '<input style="width:100%" id="', inputId, '" aria-labelledby="', _.labelId, '" type="file" name="',
1428 CKEDITOR.tools.htmlEncode( elementDefinition.id || 'cke_upload' ),
1429 '" size="',
1430 CKEDITOR.tools.htmlEncode( size > 0 ? size : '' ),
1431 '" />',
1432 '</form>',
1433 '</body></html>',
1434 '<script>',
1435 // Support for custom document.domain in IE.
1436 CKEDITOR.env.ie ? '(' + CKEDITOR.tools.fixDomain + ')();' : '',
1437
1438 'window.parent.CKEDITOR.tools.callFunction(' + callNumber + ');',
1439 'window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction(' + unloadNumber + ')}',
1440 '</script>'
1441 ].join( '' ) );
1442
1443 frameDocument.$.close();
1444
1445 for ( var i = 0; i < buttons.length; i++ )
1446 buttons[ i ].enable();
1447 }
1448
1449 // #3465: Wait for the browser to finish rendering the dialog first.
1450 if ( CKEDITOR.env.gecko )
1451 setTimeout( generateFormField, 500 );
1452 else
1453 generateFormField();
1454 },
1455
1456 getValue: function() {
1457 return this.getInputElement().$.value || '';
1458 },
1459
1460 /**
1461 * The default value of input `type="file"` is an empty string, but during the initialization
1462 * of this UI element, the iframe still is not ready so it cannot be read from that object.
1463 * Setting it manually prevents later issues with the current value (`''`) being different
1464 * than the initial value (undefined as it asked for `.value` of a div).
1465 */
1466 setInitValue: function() {
1467 this._.initValue = '';
1468 },
1469
1470 /**
1471 * Defines the `onChange` event for UI element definitions.
1472 *
1473 * @property {Object}
1474 */
1475 eventProcessors: {
1476 onChange: function( dialog, func ) {
1477 // If this method is called several times (I'm not sure about how this can happen but the default
1478 // onChange processor includes this protection)
1479 // In order to reapply to the new element, the property is deleted at the beggining of the registerEvents method
1480 if ( !this._.domOnChangeRegistered ) {
1481 // By listening for the formLoaded event, this handler will get reapplied when a new
1482 // form is created
1483 this.on( 'formLoaded', function() {
1484 this.getInputElement().on( 'change', function() {
1485 this.fire( 'change', { value: this.getValue() } );
1486 }, this );
1487 }, this );
1488 this._.domOnChangeRegistered = true;
1489 }
1490
1491 this.on( 'change', func );
1492 }
1493 },
1494
1495 keyboardFocusable: true
1496 }, true );
1497
1498 CKEDITOR.ui.dialog.fileButton.prototype = new CKEDITOR.ui.dialog.button();
1499
1500 CKEDITOR.ui.dialog.fieldset.prototype = CKEDITOR.tools.clone( CKEDITOR.ui.dialog.hbox.prototype );
1501
1502 CKEDITOR.dialog.addUIElement( 'text', textBuilder );
1503 CKEDITOR.dialog.addUIElement( 'password', textBuilder );
1504 CKEDITOR.dialog.addUIElement( 'textarea', commonBuilder );
1505 CKEDITOR.dialog.addUIElement( 'checkbox', commonBuilder );
1506 CKEDITOR.dialog.addUIElement( 'radio', commonBuilder );
1507 CKEDITOR.dialog.addUIElement( 'button', commonBuilder );
1508 CKEDITOR.dialog.addUIElement( 'select', commonBuilder );
1509 CKEDITOR.dialog.addUIElement( 'file', commonBuilder );
1510 CKEDITOR.dialog.addUIElement( 'fileButton', commonBuilder );
1511 CKEDITOR.dialog.addUIElement( 'html', commonBuilder );
1512 CKEDITOR.dialog.addUIElement( 'fieldset', containerBuilder );
1513 }
1514} );
1515
1516/**
1517 * Fired when the value of the uiElement is changed.
1518 *
1519 * @event change
1520 * @member CKEDITOR.ui.dialog.uiElement
1521 */
1522
1523/**
1524 * Fired when the inner frame created by the element is ready.
1525 * Each time the button is used or the dialog window is loaded, a new
1526 * form might be created.
1527 *
1528 * @event formLoaded
1529 * @member CKEDITOR.ui.dialog.fileButton
1530 */
diff --git a/sources/plugins/div/dialogs/div.js b/sources/plugins/div/dialogs/div.js
new file mode 100644
index 00000000..3914f071
--- /dev/null
+++ b/sources/plugins/div/dialogs/div.js
@@ -0,0 +1,430 @@
1/*
2 * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7
8 // Add to collection with DUP examination.
9 // @param {Object} collection
10 // @param {Object} element
11 // @param {Object} database
12 function addSafely( collection, element, database ) {
13 // 1. IE doesn't support customData on text nodes;
14 // 2. Text nodes never get chance to appear twice;
15 if ( !element.is || !element.getCustomData( 'block_processed' ) ) {
16 element.is && CKEDITOR.dom.element.setMarker( database, element, 'block_processed', true );
17 collection.push( element );
18 }
19 }
20
21 // Dialog reused by both 'creatediv' and 'editdiv' commands.
22 // @param {Object} editor
23 // @param {String} command The command name which indicate what the current command is.
24 function divDialog( editor, command ) {
25 // Definition of elements at which div operation should stopped.
26 var divLimitDefinition = ( function() {
27
28 // Customzie from specialize blockLimit elements
29 var definition = CKEDITOR.tools.extend( {}, CKEDITOR.dtd.$blockLimit );
30
31 if ( editor.config.div_wrapTable ) {
32 delete definition.td;
33 delete definition.th;
34 }
35 return definition;
36 } )();
37
38 // DTD of 'div' element
39 var dtd = CKEDITOR.dtd.div;
40
41 // Get the first div limit element on the element's path.
42 // @param {Object} element
43 function getDivContainer( element ) {
44 var container = editor.elementPath( element ).blockLimit;
45
46 // Never consider read-only (i.e. contenteditable=false) element as
47 // a first div limit (#11083).
48 if ( container.isReadOnly() )
49 container = container.getParent();
50
51 // Dont stop at 'td' and 'th' when div should wrap entire table.
52 if ( editor.config.div_wrapTable && container.is( [ 'td', 'th' ] ) ) {
53 var parentPath = editor.elementPath( container.getParent() );
54 container = parentPath.blockLimit;
55 }
56
57 return container;
58 }
59
60 // Init all fields' setup/commit function.
61 // @memberof divDialog
62 function setupFields() {
63 this.foreach( function( field ) {
64 // Exclude layout container elements
65 if ( /^(?!vbox|hbox)/.test( field.type ) ) {
66 if ( !field.setup ) {
67 // Read the dialog fields values from the specified
68 // element attributes.
69 field.setup = function( element ) {
70 field.setValue( element.getAttribute( field.id ) || '', 1 );
71 };
72 }
73 if ( !field.commit ) {
74 // Set element attributes assigned by the dialog
75 // fields.
76 field.commit = function( element ) {
77 var fieldValue = this.getValue();
78 // ignore default element attribute values
79 if ( field.id == 'dir' && element.getComputedStyle( 'direction' ) == fieldValue ) {
80 return;
81 }
82
83 if ( fieldValue )
84 element.setAttribute( field.id, fieldValue );
85 else
86 element.removeAttribute( field.id );
87 };
88 }
89 }
90 } );
91 }
92
93 // Wrapping 'div' element around appropriate blocks among the selected ranges.
94 // @param {Object} editor
95 function createDiv( editor ) {
96 // new adding containers OR detected pre-existed containers.
97 var containers = [];
98 // node markers store.
99 var database = {};
100 // All block level elements which contained by the ranges.
101 var containedBlocks = [],
102 block;
103
104 // Get all ranges from the selection.
105 var selection = editor.getSelection(),
106 ranges = selection.getRanges();
107 var bookmarks = selection.createBookmarks();
108 var i, iterator;
109
110 // collect all included elements from dom-iterator
111 for ( i = 0; i < ranges.length; i++ ) {
112 iterator = ranges[ i ].createIterator();
113 while ( ( block = iterator.getNextParagraph() ) ) {
114 // include contents of blockLimit elements.
115 if ( block.getName() in divLimitDefinition && !block.isReadOnly() ) {
116 var j,
117 childNodes = block.getChildren();
118 for ( j = 0; j < childNodes.count(); j++ )
119 addSafely( containedBlocks, childNodes.getItem( j ), database );
120 } else {
121 while ( !dtd[ block.getName() ] && !block.equals( ranges[ i ].root ) )
122 block = block.getParent();
123 addSafely( containedBlocks, block, database );
124 }
125 }
126 }
127
128 CKEDITOR.dom.element.clearAllMarkers( database );
129
130 var blockGroups = groupByDivLimit( containedBlocks );
131 var ancestor, divElement;
132
133 for ( i = 0; i < blockGroups.length; i++ ) {
134 var currentNode = blockGroups[ i ][ 0 ];
135
136 // Calculate the common parent node of all contained elements.
137 ancestor = currentNode.getParent();
138 for ( j = 1; j < blockGroups[ i ].length; j++ )
139 ancestor = ancestor.getCommonAncestor( blockGroups[ i ][ j ] );
140
141 divElement = new CKEDITOR.dom.element( 'div', editor.document );
142
143 // Normalize the blocks in each group to a common parent.
144 for ( j = 0; j < blockGroups[ i ].length; j++ ) {
145 currentNode = blockGroups[ i ][ j ];
146
147 while ( !currentNode.getParent().equals( ancestor ) )
148 currentNode = currentNode.getParent();
149
150 // This could introduce some duplicated elements in array.
151 blockGroups[ i ][ j ] = currentNode;
152 }
153
154 // Wrapped blocks counting
155 for ( j = 0; j < blockGroups[ i ].length; j++ ) {
156 currentNode = blockGroups[ i ][ j ];
157
158 // Avoid DUP elements introduced by grouping.
159 if ( !( currentNode.getCustomData && currentNode.getCustomData( 'block_processed' ) ) ) {
160 currentNode.is && CKEDITOR.dom.element.setMarker( database, currentNode, 'block_processed', true );
161
162 // Establish new container, wrapping all elements in this group.
163 if ( !j )
164 divElement.insertBefore( currentNode );
165
166 divElement.append( currentNode );
167 }
168 }
169
170 CKEDITOR.dom.element.clearAllMarkers( database );
171 containers.push( divElement );
172 }
173
174 selection.selectBookmarks( bookmarks );
175 return containers;
176 }
177
178 // Divide a set of nodes to different groups by their path's blocklimit element.
179 // Note: the specified nodes should be in source order naturally, which mean they are supposed to producea by following class:
180 // * CKEDITOR.dom.range.Iterator
181 // * CKEDITOR.dom.domWalker
182 // @returns {Array[]} the grouped nodes
183 function groupByDivLimit( nodes ) {
184 var groups = [],
185 lastDivLimit = null,
186 block;
187
188 for ( var i = 0; i < nodes.length; i++ ) {
189 block = nodes[ i ];
190 var limit = getDivContainer( block );
191 if ( !limit.equals( lastDivLimit ) ) {
192 lastDivLimit = limit;
193 groups.push( [] );
194 }
195 groups[ groups.length - 1 ].push( block );
196 }
197 return groups;
198 }
199
200 // Synchronous field values to other impacted fields is required, e.g. div styles
201 // change should also alter inline-style text.
202 function commitInternally( targetFields ) {
203 var dialog = this.getDialog(),
204 element = dialog._element && dialog._element.clone() || new CKEDITOR.dom.element( 'div', editor.document );
205
206 // Commit this field and broadcast to target fields.
207 this.commit( element, true );
208
209 targetFields = [].concat( targetFields );
210 var length = targetFields.length,
211 field;
212 for ( var i = 0; i < length; i++ ) {
213 field = dialog.getContentElement.apply( dialog, targetFields[ i ].split( ':' ) );
214 field && field.setup && field.setup( element, true );
215 }
216 }
217
218
219 // Registered 'CKEDITOR.style' instances.
220 var styles = {};
221
222 // Hold a collection of created block container elements.
223 var containers = [];
224
225 // @type divDialog
226 return {
227 title: editor.lang.div.title,
228 minWidth: 400,
229 minHeight: 165,
230 contents: [ {
231 id: 'info',
232 label: editor.lang.common.generalTab,
233 title: editor.lang.common.generalTab,
234 elements: [ {
235 type: 'hbox',
236 widths: [ '50%', '50%' ],
237 children: [ {
238 id: 'elementStyle',
239 type: 'select',
240 style: 'width: 100%;',
241 label: editor.lang.div.styleSelectLabel,
242 'default': '',
243 // Options are loaded dynamically.
244 items: [
245 [ editor.lang.common.notSet, '' ]
246 ],
247 onChange: function() {
248 commitInternally.call( this, [ 'info:elementStyle', 'info:class', 'advanced:dir', 'advanced:style' ] );
249 },
250 setup: function( element ) {
251 for ( var name in styles )
252 styles[ name ].checkElementRemovable( element, true, editor ) && this.setValue( name, 1 );
253 },
254 commit: function( element ) {
255 var styleName;
256 if ( ( styleName = this.getValue() ) ) {
257 var style = styles[ styleName ];
258 style.applyToObject( element, editor );
259 }
260 else {
261 element.removeAttribute( 'style' );
262 }
263 }
264 },
265 {
266 id: 'class',
267 type: 'text',
268 requiredContent: 'div(cke-xyz)', // Random text like 'xyz' will check if all are allowed.
269 label: editor.lang.common.cssClass,
270 'default': ''
271 } ]
272 } ]
273 },
274 {
275 id: 'advanced',
276 label: editor.lang.common.advancedTab,
277 title: editor.lang.common.advancedTab,
278 elements: [ {
279 type: 'vbox',
280 padding: 1,
281 children: [ {
282 type: 'hbox',
283 widths: [ '50%', '50%' ],
284 children: [ {
285 type: 'text',
286 id: 'id',
287 requiredContent: 'div[id]',
288 label: editor.lang.common.id,
289 'default': ''
290 },
291 {
292 type: 'text',
293 id: 'lang',
294 requiredContent: 'div[lang]',
295 label: editor.lang.common.langCode,
296 'default': ''
297 } ]
298 },
299 {
300 type: 'hbox',
301 children: [ {
302 type: 'text',
303 id: 'style',
304 requiredContent: 'div{cke-xyz}', // Random text like 'xyz' will check if all are allowed.
305 style: 'width: 100%;',
306 label: editor.lang.common.cssStyle,
307 'default': '',
308 commit: function( element ) {
309 element.setAttribute( 'style', this.getValue() );
310 }
311 } ]
312 },
313 {
314 type: 'hbox',
315 children: [ {
316 type: 'text',
317 id: 'title',
318 requiredContent: 'div[title]',
319 style: 'width: 100%;',
320 label: editor.lang.common.advisoryTitle,
321 'default': ''
322 } ]
323 },
324 {
325 type: 'select',
326 id: 'dir',
327 requiredContent: 'div[dir]',
328 style: 'width: 100%;',
329 label: editor.lang.common.langDir,
330 'default': '',
331 items: [
332 [ editor.lang.common.notSet, '' ],
333 [ editor.lang.common.langDirLtr, 'ltr' ],
334 [ editor.lang.common.langDirRtl, 'rtl' ]
335 ]
336 } ] }
337 ]
338 } ],
339 onLoad: function() {
340 setupFields.call( this );
341
342 // Preparing for the 'elementStyle' field.
343 var dialog = this,
344 stylesField = this.getContentElement( 'info', 'elementStyle' );
345
346 // Reuse the 'stylescombo' plugin's styles definition.
347 editor.getStylesSet( function( stylesDefinitions ) {
348 var styleName, style;
349
350 if ( stylesDefinitions ) {
351 // Digg only those styles that apply to 'div'.
352 for ( var i = 0; i < stylesDefinitions.length; i++ ) {
353 var styleDefinition = stylesDefinitions[ i ];
354 if ( styleDefinition.element && styleDefinition.element == 'div' ) {
355 styleName = styleDefinition.name;
356 styles[ styleName ] = style = new CKEDITOR.style( styleDefinition );
357
358 if ( editor.filter.check( style ) ) {
359 // Populate the styles field options with style name.
360 stylesField.items.push( [ styleName, styleName ] );
361 stylesField.add( styleName, styleName );
362 }
363 }
364 }
365 }
366
367 // We should disable the content element
368 // it if no options are available at all.
369 stylesField[ stylesField.items.length > 1 ? 'enable' : 'disable' ]();
370
371 // Now setup the field value manually if dialog was opened on element. (#9689)
372 setTimeout( function() {
373 dialog._element && stylesField.setup( dialog._element );
374 }, 0 );
375 } );
376 },
377 onShow: function() {
378 // Whether always create new container regardless of existed
379 // ones.
380 if ( command == 'editdiv' ) {
381 // Try to discover the containers that already existed in
382 // ranges
383 // update dialog field values
384 this.setupContent( this._element = CKEDITOR.plugins.div.getSurroundDiv( editor ) );
385 }
386 },
387 onOk: function() {
388 if ( command == 'editdiv' )
389 containers = [ this._element ];
390 else
391 containers = createDiv( editor, true );
392
393 // Update elements attributes
394 var size = containers.length;
395 for ( var i = 0; i < size; i++ ) {
396 this.commitContent( containers[ i ] );
397
398 // Remove empty 'style' attribute.
399 !containers[ i ].getAttribute( 'style' ) && containers[ i ].removeAttribute( 'style' );
400 }
401
402 this.hide();
403 },
404 onHide: function() {
405 // Remove style only when editing existing DIV. (#6315)
406 if ( command == 'editdiv' )
407 this._element.removeCustomData( 'elementStyle' );
408 delete this._element;
409 }
410 };
411 }
412
413 CKEDITOR.dialog.add( 'creatediv', function( editor ) {
414 return divDialog( editor, 'creatediv' );
415 } );
416
417 CKEDITOR.dialog.add( 'editdiv', function( editor ) {
418 return divDialog( editor, 'editdiv' );
419 } );
420
421} )();
422
423/**
424 * Whether to wrap the entire table instead of individual cells when creating a `<div>` in a table cell.
425 *
426 * config.div_wrapTable = true;
427 *
428 * @cfg {Boolean} [div_wrapTable=false]
429 * @member CKEDITOR.config
430 */
diff --git a/sources/plugins/div/icons/creatediv.png b/sources/plugins/div/icons/creatediv.png
new file mode 100644
index 00000000..6cca564d
--- /dev/null
+++ b/sources/plugins/div/icons/creatediv.png
Binary files differ
diff --git a/sources/plugins/div/icons/hidpi/creatediv.png b/sources/plugins/div/icons/hidpi/creatediv.png
new file mode 100644
index 00000000..f0ca49fd
--- /dev/null
+++ b/sources/plugins/div/icons/hidpi/creatediv.png
Binary files differ
diff --git a/sources/plugins/div/lang/af.js b/sources/plugins/div/lang/af.js
new file mode 100644
index 00000000..01afb427
--- /dev/null
+++ b/sources/plugins/div/lang/af.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'af', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Aanbevole Titel',
8 cssClassInputLabel: 'CSS klasse',
9 edit: 'Wysig Div',
10 inlineStyleInputLabel: 'Inlyn Styl',
11 langDirLTRLabel: 'Links na regs (LTR)',
12 langDirLabel: 'Skryfrigting',
13 langDirRTLLabel: 'Regs na links (RTL)',
14 languageCodeInputLabel: ' Taalkode',
15 remove: 'Verwyder Div',
16 styleSelectLabel: 'Styl',
17 title: 'Skep Div houer',
18 toolbar: 'Skep Div houer'
19} );
diff --git a/sources/plugins/div/lang/ar.js b/sources/plugins/div/lang/ar.js
new file mode 100644
index 00000000..a446bea9
--- /dev/null
+++ b/sources/plugins/div/lang/ar.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ar', {
6 IdInputLabel: 'هوية',
7 advisoryTitleInputLabel: 'عنوان التقرير',
8 cssClassInputLabel: 'فئات التنسيق',
9 edit: 'تحرير Div',
10 inlineStyleInputLabel: 'Inline Style',
11 langDirLTRLabel: 'اليسار لليمين (LTR)',
12 langDirLabel: 'إتجاه النص',
13 langDirRTLLabel: 'اليمين لليسار (RTL)',
14 languageCodeInputLabel: 'رمز اللغة',
15 remove: 'إزالة Div',
16 styleSelectLabel: 'نمط',
17 title: 'إحداث Div Container',
18 toolbar: 'إحداث Div Container'
19} );
diff --git a/sources/plugins/div/lang/bg.js b/sources/plugins/div/lang/bg.js
new file mode 100644
index 00000000..fa492645
--- /dev/null
+++ b/sources/plugins/div/lang/bg.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'bg', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: 'Препоръчително заглавие',
8 cssClassInputLabel: 'Класове за CSS',
9 edit: 'Промяна на Div',
10 inlineStyleInputLabel: 'В редица',
11 langDirLTRLabel: 'Ляво на Дясно (ЛнД)',
12 langDirLabel: 'Посока на езика',
13 langDirRTLLabel: 'Дясно на Ляво (ДнЛ)',
14 languageCodeInputLabel: ' Код на езика',
15 remove: 'Премахване на Div',
16 styleSelectLabel: 'Стил',
17 title: 'Създай Div блок',
18 toolbar: 'Създаване на Div контейнер'
19} );
diff --git a/sources/plugins/div/lang/bn.js b/sources/plugins/div/lang/bn.js
new file mode 100644
index 00000000..f5b04749
--- /dev/null
+++ b/sources/plugins/div/lang/bn.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'bn', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/bs.js b/sources/plugins/div/lang/bs.js
new file mode 100644
index 00000000..37104cad
--- /dev/null
+++ b/sources/plugins/div/lang/bs.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'bs', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Advisory title',
8 cssClassInputLabel: 'Klase CSS stilova',
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'S lijeva na desno (LTR)',
12 langDirLabel: 'Smjer pisanja',
13 langDirRTLLabel: 'S desna na lijevo (RTL)',
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Stil',
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/ca.js b/sources/plugins/div/lang/ca.js
new file mode 100644
index 00000000..d3adec46
--- /dev/null
+++ b/sources/plugins/div/lang/ca.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ca', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Títol de guia',
8 cssClassInputLabel: 'Classes de la fulla d\'estils',
9 edit: 'Edita la Capa',
10 inlineStyleInputLabel: 'Estil en línia',
11 langDirLTRLabel: 'D\'esquerra a dreta (LTR)',
12 langDirLabel: 'Direcció de l\'idioma',
13 langDirRTLLabel: 'De dreta a esquerra (RTL)',
14 languageCodeInputLabel: ' Codi d\'idioma',
15 remove: 'Elimina la Capa',
16 styleSelectLabel: 'Estil',
17 title: 'Crea una Capa Contenidora',
18 toolbar: 'Crea una Capa Contenidora'
19} );
diff --git a/sources/plugins/div/lang/cs.js b/sources/plugins/div/lang/cs.js
new file mode 100644
index 00000000..fcafb154
--- /dev/null
+++ b/sources/plugins/div/lang/cs.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'cs', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Nápovědní titulek',
8 cssClassInputLabel: 'Třídy stylů',
9 edit: 'Změnit Div',
10 inlineStyleInputLabel: 'Vnitřní styly',
11 langDirLTRLabel: 'Zleva doprava (LTR)',
12 langDirLabel: 'Směr jazyka',
13 langDirRTLLabel: 'Zprava doleva (RTL)',
14 languageCodeInputLabel: ' Kód jazyka',
15 remove: 'Odstranit Div',
16 styleSelectLabel: 'Styly',
17 title: 'Vytvořit Div kontejner',
18 toolbar: 'Vytvořit Div kontejner'
19} );
diff --git a/sources/plugins/div/lang/cy.js b/sources/plugins/div/lang/cy.js
new file mode 100644
index 00000000..6d92bf1b
--- /dev/null
+++ b/sources/plugins/div/lang/cy.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'cy', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Teitl Cynghorol',
8 cssClassInputLabel: 'Dosbarthiadau Ffeil Arddull',
9 edit: 'Golygu Div',
10 inlineStyleInputLabel: 'Arddull Mewn Llinell',
11 langDirLTRLabel: 'Chwith i\'r Dde (LTR)',
12 langDirLabel: 'Cyfeiriad yr Iaith',
13 langDirRTLLabel: 'Dde i\'r Chwith (RTL)',
14 languageCodeInputLabel: ' Cod Iaith',
15 remove: 'Tynnu Div',
16 styleSelectLabel: 'Arddull',
17 title: 'Creu Cynhwysydd Div',
18 toolbar: 'Creu Cynhwysydd Div'
19} );
diff --git a/sources/plugins/div/lang/da.js b/sources/plugins/div/lang/da.js
new file mode 100644
index 00000000..7184e276
--- /dev/null
+++ b/sources/plugins/div/lang/da.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'da', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Vejledende titel',
8 cssClassInputLabel: 'Typografiark',
9 edit: 'Rediger Div',
10 inlineStyleInputLabel: 'Inline Style',
11 langDirLTRLabel: 'Venstre til højre (LTR)',
12 langDirLabel: 'Sprogretning',
13 langDirRTLLabel: 'Højre til venstre (RTL)',
14 languageCodeInputLabel: ' Sprogkode',
15 remove: 'Slet Div',
16 styleSelectLabel: 'Style',
17 title: 'Opret Div Container',
18 toolbar: 'Opret Div Container'
19} );
diff --git a/sources/plugins/div/lang/de.js b/sources/plugins/div/lang/de.js
new file mode 100644
index 00000000..0b4430f8
--- /dev/null
+++ b/sources/plugins/div/lang/de.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'de', {
6 IdInputLabel: 'Kennung',
7 advisoryTitleInputLabel: 'Tooltip',
8 cssClassInputLabel: 'Formatvorlagenklasse',
9 edit: 'Div bearbeiten',
10 inlineStyleInputLabel: 'Inline Stil',
11 langDirLTRLabel: 'Links nach Rechs (LTR)',
12 langDirLabel: 'Sprachrichtung',
13 langDirRTLLabel: 'Rechs nach Links (RTL)',
14 languageCodeInputLabel: 'Sprachcode',
15 remove: 'Div entfernen',
16 styleSelectLabel: 'Stil',
17 title: 'Div Container erzeugen',
18 toolbar: 'Div Container erzeugen'
19} );
diff --git a/sources/plugins/div/lang/el.js b/sources/plugins/div/lang/el.js
new file mode 100644
index 00000000..16aaebbb
--- /dev/null
+++ b/sources/plugins/div/lang/el.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'el', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Ενδεικτικός Τίτλος',
8 cssClassInputLabel: 'Κλάσεις Φύλλων Στυλ',
9 edit: 'Επεξεργασία Div',
10 inlineStyleInputLabel: 'Στυλ Εν Σειρά',
11 langDirLTRLabel: 'Αριστερά προς Δεξιά (LTR)',
12 langDirLabel: 'Κατεύθυνση Κειμένου',
13 langDirRTLLabel: 'Δεξιά προς Αριστερά (RTL)',
14 languageCodeInputLabel: 'Κωδικός Γλώσσας',
15 remove: 'Διαγραφή Div',
16 styleSelectLabel: 'Μορφή',
17 title: 'Δημιουργία Div',
18 toolbar: 'Δημιουργία Div'
19} );
diff --git a/sources/plugins/div/lang/en-au.js b/sources/plugins/div/lang/en-au.js
new file mode 100644
index 00000000..f30dd7c1
--- /dev/null
+++ b/sources/plugins/div/lang/en-au.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'en-au', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/en-ca.js b/sources/plugins/div/lang/en-ca.js
new file mode 100644
index 00000000..bbfa4e36
--- /dev/null
+++ b/sources/plugins/div/lang/en-ca.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'en-ca', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/en-gb.js b/sources/plugins/div/lang/en-gb.js
new file mode 100644
index 00000000..5c5cea9a
--- /dev/null
+++ b/sources/plugins/div/lang/en-gb.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'en-gb', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Advisory Title',
8 cssClassInputLabel: 'Stylesheet Classes',
9 edit: 'Edit Div',
10 inlineStyleInputLabel: 'Inline Style',
11 langDirLTRLabel: 'Left to Right (LTR)',
12 langDirLabel: 'Language Direction',
13 langDirRTLLabel: 'Right to Left (RTL)',
14 languageCodeInputLabel: ' Language Code',
15 remove: 'Remove Div',
16 styleSelectLabel: 'Style',
17 title: 'Create Div Container',
18 toolbar: 'Create Div Container'
19} );
diff --git a/sources/plugins/div/lang/en.js b/sources/plugins/div/lang/en.js
new file mode 100644
index 00000000..943ac0d1
--- /dev/null
+++ b/sources/plugins/div/lang/en.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'en', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Advisory Title',
8 cssClassInputLabel: 'Stylesheet Classes',
9 edit: 'Edit Div',
10 inlineStyleInputLabel: 'Inline Style',
11 langDirLTRLabel: 'Left to Right (LTR)',
12 langDirLabel: 'Language Direction',
13 langDirRTLLabel: 'Right to Left (RTL)',
14 languageCodeInputLabel: ' Language Code',
15 remove: 'Remove Div',
16 styleSelectLabel: 'Style',
17 title: 'Create Div Container',
18 toolbar: 'Create Div Container'
19} );
diff --git a/sources/plugins/div/lang/eo.js b/sources/plugins/div/lang/eo.js
new file mode 100644
index 00000000..734a7671
--- /dev/null
+++ b/sources/plugins/div/lang/eo.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'eo', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Priskriba Titolo',
8 cssClassInputLabel: 'Stilfolioklasoj',
9 edit: 'Redakti Div',
10 inlineStyleInputLabel: 'Enlinia stilo',
11 langDirLTRLabel: 'Maldekstre dekstren (angle LTR)',
12 langDirLabel: 'Skribdirekto',
13 langDirRTLLabel: 'Dekstre maldekstren (angle RTL)',
14 languageCodeInputLabel: ' Lingvokodo',
15 remove: 'Forigi Div',
16 styleSelectLabel: 'Stilo',
17 title: 'Krei DIV ujon',
18 toolbar: 'Krei DIV ujon'
19} );
diff --git a/sources/plugins/div/lang/es.js b/sources/plugins/div/lang/es.js
new file mode 100644
index 00000000..e477ab26
--- /dev/null
+++ b/sources/plugins/div/lang/es.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'es', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Título',
8 cssClassInputLabel: 'Clase de hoja de estilos',
9 edit: 'Editar Div',
10 inlineStyleInputLabel: 'Estilo',
11 langDirLTRLabel: 'Izquierda a Derecha (LTR)',
12 langDirLabel: 'Orientación',
13 langDirRTLLabel: 'Derecha a Izquierda (RTL)',
14 languageCodeInputLabel: ' Codigo de idioma',
15 remove: 'Quitar Div',
16 styleSelectLabel: 'Estilo',
17 title: 'Crear contenedor DIV',
18 toolbar: 'Crear contenedor DIV'
19} );
diff --git a/sources/plugins/div/lang/et.js b/sources/plugins/div/lang/et.js
new file mode 100644
index 00000000..272c9df3
--- /dev/null
+++ b/sources/plugins/div/lang/et.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'et', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: 'Soovitatav pealkiri',
8 cssClassInputLabel: 'Stiililehe klassid',
9 edit: 'Muuda Div',
10 inlineStyleInputLabel: 'Reasisene stiil',
11 langDirLTRLabel: 'Vasakult paremale (LTR)',
12 langDirLabel: 'Keele suund',
13 langDirRTLLabel: 'Paremalt vasakule (RTL)',
14 languageCodeInputLabel: ' Keelekood',
15 remove: 'Eemalda Div',
16 styleSelectLabel: 'Stiil',
17 title: 'Div-konteineri loomine',
18 toolbar: 'Div-konteineri loomine'
19} );
diff --git a/sources/plugins/div/lang/eu.js b/sources/plugins/div/lang/eu.js
new file mode 100644
index 00000000..6d68d3aa
--- /dev/null
+++ b/sources/plugins/div/lang/eu.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'eu', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Aholkatutako izenburua',
8 cssClassInputLabel: 'Estilo-orriko klaseak',
9 edit: 'Editatu Div-a',
10 inlineStyleInputLabel: 'Lineako estiloa',
11 langDirLTRLabel: 'Ezkerretik eskuinera (LTR)',
12 langDirLabel: 'Hizkuntzaren norabidea',
13 langDirRTLLabel: 'Eskuinetik ezkerrera (RTL)',
14 languageCodeInputLabel: 'Hizkuntzaren kodea',
15 remove: 'Kendu Div-a',
16 styleSelectLabel: 'Estiloa',
17 title: 'Sortu Div edukiontzia',
18 toolbar: 'Sortu Div edukiontzia'
19} );
diff --git a/sources/plugins/div/lang/fa.js b/sources/plugins/div/lang/fa.js
new file mode 100644
index 00000000..8c880f74
--- /dev/null
+++ b/sources/plugins/div/lang/fa.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'fa', {
6 IdInputLabel: 'شناسه',
7 advisoryTitleInputLabel: 'عنوان مشاوره',
8 cssClassInputLabel: 'کلاس​های شیوه​نامه',
9 edit: 'ویرایش Div',
10 inlineStyleInputLabel: 'سبک درون​خطی(Inline Style)',
11 langDirLTRLabel: 'چپ به راست (LTR)',
12 langDirLabel: 'جهت نوشتاری زبان',
13 langDirRTLLabel: 'راست به چپ (RTL)',
14 languageCodeInputLabel: ' کد زبان',
15 remove: 'حذف Div',
16 styleSelectLabel: 'سبک',
17 title: 'ایجاد یک محل DIV',
18 toolbar: 'ایجاد یک محل DIV'
19} );
diff --git a/sources/plugins/div/lang/fi.js b/sources/plugins/div/lang/fi.js
new file mode 100644
index 00000000..bb1e8bf1
--- /dev/null
+++ b/sources/plugins/div/lang/fi.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'fi', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Ohjeistava otsikko',
8 cssClassInputLabel: 'Tyylitiedoston luokat',
9 edit: 'Muokkaa Diviä',
10 inlineStyleInputLabel: 'Sisätyyli',
11 langDirLTRLabel: 'Vasemmalta oikealle (LTR)',
12 langDirLabel: 'Kielen suunta',
13 langDirRTLLabel: 'Oikealta vasemmalle (RTL)',
14 languageCodeInputLabel: ' Kielen koodi',
15 remove: 'Poista Div',
16 styleSelectLabel: 'Tyyli',
17 title: 'Luo div-kehikko',
18 toolbar: 'Luo div-kehikko'
19} );
diff --git a/sources/plugins/div/lang/fo.js b/sources/plugins/div/lang/fo.js
new file mode 100644
index 00000000..150f903e
--- /dev/null
+++ b/sources/plugins/div/lang/fo.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'fo', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Advisory Title',
8 cssClassInputLabel: 'Stylesheet Classes',
9 edit: 'Redigera Div',
10 inlineStyleInputLabel: 'Inline Style',
11 langDirLTRLabel: 'Vinstru til høgru (LTR)',
12 langDirLabel: 'Language Direction',
13 langDirRTLLabel: 'Høgru til vinstru (RTL)',
14 languageCodeInputLabel: ' Language Code',
15 remove: 'Strika Div',
16 styleSelectLabel: 'Style',
17 title: 'Ger Div Container',
18 toolbar: 'Ger Div Container'
19} );
diff --git a/sources/plugins/div/lang/fr-ca.js b/sources/plugins/div/lang/fr-ca.js
new file mode 100644
index 00000000..1d03ff3b
--- /dev/null
+++ b/sources/plugins/div/lang/fr-ca.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'fr-ca', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: 'Titre',
8 cssClassInputLabel: 'Classes CSS',
9 edit: 'Modifier le DIV',
10 inlineStyleInputLabel: 'Style en ligne',
11 langDirLTRLabel: 'De gauche à droite (LTR)',
12 langDirLabel: 'Sens d\'écriture',
13 langDirRTLLabel: 'De droite à gauche (RTL)',
14 languageCodeInputLabel: 'Code de langue',
15 remove: 'Supprimer le DIV',
16 styleSelectLabel: 'Style',
17 title: 'Créer un DIV',
18 toolbar: 'Créer un DIV'
19} );
diff --git a/sources/plugins/div/lang/fr.js b/sources/plugins/div/lang/fr.js
new file mode 100644
index 00000000..20475163
--- /dev/null
+++ b/sources/plugins/div/lang/fr.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'fr', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Advisory Title',
8 cssClassInputLabel: 'Classe CSS',
9 edit: 'Éditer la DIV',
10 inlineStyleInputLabel: 'Style en ligne',
11 langDirLTRLabel: 'Gauche à droite (LTR)',
12 langDirLabel: 'Sens d\'écriture',
13 langDirRTLLabel: 'Droite à gauche (RTL)',
14 languageCodeInputLabel: 'Code de langue',
15 remove: 'Enlever la DIV',
16 styleSelectLabel: 'Style',
17 title: 'Créer un container DIV',
18 toolbar: 'Créer un container DIV'
19} );
diff --git a/sources/plugins/div/lang/gl.js b/sources/plugins/div/lang/gl.js
new file mode 100644
index 00000000..2333d520
--- /dev/null
+++ b/sources/plugins/div/lang/gl.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'gl', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: 'Título informativo',
8 cssClassInputLabel: 'Clases da folla de estilos',
9 edit: 'Editar Div',
10 inlineStyleInputLabel: 'Estilo de liña',
11 langDirLTRLabel: 'Esquerda a dereita (LTR)',
12 langDirLabel: 'Dirección de escritura do idioma',
13 langDirRTLLabel: 'Dereita a esquerda (RTL)',
14 languageCodeInputLabel: 'Código do idioma',
15 remove: 'Retirar Div',
16 styleSelectLabel: 'Estilo',
17 title: 'Crear un contedor Div',
18 toolbar: 'Crear un contedor Div'
19} );
diff --git a/sources/plugins/div/lang/gu.js b/sources/plugins/div/lang/gu.js
new file mode 100644
index 00000000..476c2f51
--- /dev/null
+++ b/sources/plugins/div/lang/gu.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'gu', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'એડવાઈઝર શીર્ષક',
8 cssClassInputLabel: 'સ્ટાઈલશીટ કલાસીસ',
9 edit: 'ડીવીમાં ફેરફાર કરવો',
10 inlineStyleInputLabel: 'ઈનલાઈન પદ્ધતિ',
11 langDirLTRLabel: 'ડાબે થી જમણે (LTR)',
12 langDirLabel: 'ભાષાની દિશા',
13 langDirRTLLabel: 'જમણે થી ડાબે (RTL)',
14 languageCodeInputLabel: 'ભાષાનો કોડ',
15 remove: 'ડીવી કાઢી કાઢવું',
16 styleSelectLabel: 'સ્ટાઈલ',
17 title: 'Div કન્ટેનર બનાવુંવું',
18 toolbar: 'Div કન્ટેનર બનાવુંવું'
19} );
diff --git a/sources/plugins/div/lang/he.js b/sources/plugins/div/lang/he.js
new file mode 100644
index 00000000..44b28490
--- /dev/null
+++ b/sources/plugins/div/lang/he.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'he', {
6 IdInputLabel: 'מזהה (ID)',
7 advisoryTitleInputLabel: 'כותרת מוצעת',
8 cssClassInputLabel: 'מחלקת עיצוב',
9 edit: 'עריכת מיכל (Div)',
10 inlineStyleInputLabel: 'סגנון פנימי',
11 langDirLTRLabel: 'שמאל לימין (LTR)',
12 langDirLabel: 'כיוון שפה',
13 langDirRTLLabel: 'ימין לשמאל (RTL)',
14 languageCodeInputLabel: 'קוד שפה',
15 remove: 'הסרת מיכל (Div)',
16 styleSelectLabel: 'סגנון',
17 title: 'יצירת מיכל (Div)',
18 toolbar: 'יצירת מיכל (Div)'
19} );
diff --git a/sources/plugins/div/lang/hi.js b/sources/plugins/div/lang/hi.js
new file mode 100644
index 00000000..370ebc5a
--- /dev/null
+++ b/sources/plugins/div/lang/hi.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'hi', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'परामर्श शीर्शक',
8 cssClassInputLabel: 'स्टाइल-शीट क्लास',
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'बायें से दायें (LTR)',
12 langDirLabel: 'भाषा लिखने की दिशा',
13 langDirRTLLabel: 'दायें से बायें (RTL)',
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'स्टाइल',
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/hr.js b/sources/plugins/div/lang/hr.js
new file mode 100644
index 00000000..f0a27a63
--- /dev/null
+++ b/sources/plugins/div/lang/hr.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'hr', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Savjetodavni naslov',
8 cssClassInputLabel: 'Klase stilova',
9 edit: 'Uredi DIV',
10 inlineStyleInputLabel: 'Stil u liniji',
11 langDirLTRLabel: 'S lijeva na desno (LTR)',
12 langDirLabel: 'Smjer jezika',
13 langDirRTLLabel: 'S desna na lijevo (RTL)',
14 languageCodeInputLabel: 'Jezični kod',
15 remove: 'Ukloni DIV',
16 styleSelectLabel: 'Stil',
17 title: 'Napravi DIV kontejner',
18 toolbar: 'Napravi DIV kontejner'
19} );
diff --git a/sources/plugins/div/lang/hu.js b/sources/plugins/div/lang/hu.js
new file mode 100644
index 00000000..e1ea33d7
--- /dev/null
+++ b/sources/plugins/div/lang/hu.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'hu', {
6 IdInputLabel: 'Azonosító',
7 advisoryTitleInputLabel: 'Tipp szöveg',
8 cssClassInputLabel: 'Stíluslap osztály',
9 edit: 'DIV szerkesztése',
10 inlineStyleInputLabel: 'Inline stílus',
11 langDirLTRLabel: 'Balról jobbra (LTR)',
12 langDirLabel: 'Nyelvi irány',
13 langDirRTLLabel: 'Jobbról balra (RTL)',
14 languageCodeInputLabel: ' Nyelv kódja',
15 remove: 'DIV eltávolítása',
16 styleSelectLabel: 'Stílus',
17 title: 'DIV tároló létrehozása',
18 toolbar: 'DIV tároló létrehozása'
19} );
diff --git a/sources/plugins/div/lang/id.js b/sources/plugins/div/lang/id.js
new file mode 100644
index 00000000..7a517f2e
--- /dev/null
+++ b/sources/plugins/div/lang/id.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'id', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Penasehat Judul',
8 cssClassInputLabel: 'Kelas Stylesheet',
9 edit: 'Sunting Div',
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Kiri ke Kanan (LTR)',
12 langDirLabel: 'Arah Bahasa',
13 langDirRTLLabel: 'Kanan ke Kiri (RTL)',
14 languageCodeInputLabel: 'Kode Bahasa',
15 remove: 'Hapus Div',
16 styleSelectLabel: 'Gaya',
17 title: 'Ciptakan Wadah Div',
18 toolbar: 'Cipatakan Wadah Div'
19} );
diff --git a/sources/plugins/div/lang/is.js b/sources/plugins/div/lang/is.js
new file mode 100644
index 00000000..cc1b9423
--- /dev/null
+++ b/sources/plugins/div/lang/is.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'is', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/it.js b/sources/plugins/div/lang/it.js
new file mode 100644
index 00000000..f8ce279f
--- /dev/null
+++ b/sources/plugins/div/lang/it.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'it', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Titolo Avviso',
8 cssClassInputLabel: 'Classi di stile',
9 edit: 'Modifica DIV',
10 inlineStyleInputLabel: 'Stile Inline',
11 langDirLTRLabel: 'Da sinistra a destra (LTR)',
12 langDirLabel: 'Direzione di scrittura',
13 langDirRTLLabel: 'Da destra a sinistra (RTL)',
14 languageCodeInputLabel: 'Codice lingua',
15 remove: 'Rimuovi DIV',
16 styleSelectLabel: 'Stile',
17 title: 'Crea DIV contenitore',
18 toolbar: 'Crea DIV contenitore'
19} );
diff --git a/sources/plugins/div/lang/ja.js b/sources/plugins/div/lang/ja.js
new file mode 100644
index 00000000..38e78544
--- /dev/null
+++ b/sources/plugins/div/lang/ja.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ja', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Title属性',
8 cssClassInputLabel: 'スタイルシートクラス',
9 edit: 'Divコンテナを編集',
10 inlineStyleInputLabel: 'インラインスタイル',
11 langDirLTRLabel: '左から右 (LTR)',
12 langDirLabel: '文字表記の方向',
13 langDirRTLLabel: '右から左 (RTL)',
14 languageCodeInputLabel: ' 言語コード',
15 remove: 'Divコンテナを削除',
16 styleSelectLabel: 'スタイル',
17 title: 'Divコンテナ',
18 toolbar: 'Divコンテナ'
19} );
diff --git a/sources/plugins/div/lang/ka.js b/sources/plugins/div/lang/ka.js
new file mode 100644
index 00000000..6d79016f
--- /dev/null
+++ b/sources/plugins/div/lang/ka.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ka', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'სათაური',
8 cssClassInputLabel: 'CSS კლასები',
9 edit: 'Div-ის რედაქტირება',
10 inlineStyleInputLabel: 'თანდართული სტილი',
11 langDirLTRLabel: 'მარცხნიდან მარჯვნიც (LTR)',
12 langDirLabel: 'ენის მინართულება',
13 langDirRTLLabel: 'მარჯვნიდან მარცხნივ (RTL)',
14 languageCodeInputLabel: 'ენის კოდი',
15 remove: 'Div-ის წაშლა',
16 styleSelectLabel: 'სტილი',
17 title: 'Div კონტეინერის შექმნა',
18 toolbar: 'Div კონტეინერის შექმნა'
19} );
diff --git a/sources/plugins/div/lang/km.js b/sources/plugins/div/lang/km.js
new file mode 100644
index 00000000..6a98643e
--- /dev/null
+++ b/sources/plugins/div/lang/km.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'km', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'ចំណង​ជើង​ប្រឹក្សា',
8 cssClassInputLabel: 'Stylesheet Classes',
9 edit: 'កែ Div',
10 inlineStyleInputLabel: 'ស្ទីល​ក្នុង​បន្ទាត់',
11 langDirLTRLabel: 'ពីឆ្វេងទៅស្តាំ(LTR)',
12 langDirLabel: 'ទិសដៅភាសា',
13 langDirRTLLabel: 'ពីស្តាំទៅឆ្វេង(RTL)',
14 languageCodeInputLabel: 'កូដ​ភាសា',
15 remove: 'ដក Div ចេញ',
16 styleSelectLabel: 'ស្ទីល',
17 title: 'បង្កើត​អ្នក​ផ្ទុក Div',
18 toolbar: 'បង្កើត​អ្នក​ផ្ទុក Div'
19} );
diff --git a/sources/plugins/div/lang/ko.js b/sources/plugins/div/lang/ko.js
new file mode 100644
index 00000000..ffdca19c
--- /dev/null
+++ b/sources/plugins/div/lang/ko.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ko', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: '보조 제목',
8 cssClassInputLabel: '스타일 시트 클래스',
9 edit: 'Div 편집',
10 inlineStyleInputLabel: '인라인 스타일',
11 langDirLTRLabel: '왼쪽에서 오른쪽 (LTR)',
12 langDirLabel: '언어 방향',
13 langDirRTLLabel: '오른쪽에서 왼쪽 (RTL)',
14 languageCodeInputLabel: ' 언어 코드',
15 remove: 'Div 태그 삭제',
16 styleSelectLabel: '스타일',
17 title: 'Div 태그 생성',
18 toolbar: 'Div 태그 생성'
19} );
diff --git a/sources/plugins/div/lang/ku.js b/sources/plugins/div/lang/ku.js
new file mode 100644
index 00000000..d244aaf6
--- /dev/null
+++ b/sources/plugins/div/lang/ku.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ku', {
6 IdInputLabel: 'ناسنامە',
7 advisoryTitleInputLabel: 'سەردێڕ',
8 cssClassInputLabel: 'شێوازی چینی پەڕه',
9 edit: 'چاکسازی Div',
10 inlineStyleInputLabel: 'شێوازی ناوهێڵ',
11 langDirLTRLabel: 'چەپ بۆ ڕاست (LTR)',
12 langDirLabel: 'ئاراستەی زمان',
13 langDirRTLLabel: 'ڕاست بۆ چەپ (RTL)',
14 languageCodeInputLabel: 'هێمای زمان',
15 remove: 'لابردنی Div',
16 styleSelectLabel: 'شێواز',
17 title: 'دروستکردنی لەخۆگری Div',
18 toolbar: 'دروستکردنی لەخۆگری Div'
19} );
diff --git a/sources/plugins/div/lang/lt.js b/sources/plugins/div/lang/lt.js
new file mode 100644
index 00000000..c2e6a316
--- /dev/null
+++ b/sources/plugins/div/lang/lt.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'lt', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Patariamas pavadinimas',
8 cssClassInputLabel: 'Stilių klasės',
9 edit: 'Redaguoti Div',
10 inlineStyleInputLabel: 'Vidiniai stiliai',
11 langDirLTRLabel: 'Iš kairės į dešinę (LTR)',
12 langDirLabel: 'Kalbos nurodymai',
13 langDirRTLLabel: 'Iš dešinės į kairę (RTL)',
14 languageCodeInputLabel: ' Kalbos kodas',
15 remove: 'Pašalinti Div',
16 styleSelectLabel: 'Stilius',
17 title: 'Sukurti Div elementą',
18 toolbar: 'Sukurti Div elementą'
19} );
diff --git a/sources/plugins/div/lang/lv.js b/sources/plugins/div/lang/lv.js
new file mode 100644
index 00000000..dd63e6c6
--- /dev/null
+++ b/sources/plugins/div/lang/lv.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'lv', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Konsultatīvs virsraksts',
8 cssClassInputLabel: 'Stilu klases',
9 edit: 'Labot Div',
10 inlineStyleInputLabel: 'Iekļautais stils',
11 langDirLTRLabel: 'Kreisais uz Labo (LTR)',
12 langDirLabel: 'Valodas virziens',
13 langDirRTLLabel: 'Labais uz kreiso (RTL)',
14 languageCodeInputLabel: 'Valodas kods',
15 remove: 'Noņemt Div',
16 styleSelectLabel: 'Stils',
17 title: 'Izveidot div konteineri',
18 toolbar: 'Izveidot div konteineri'
19} );
diff --git a/sources/plugins/div/lang/mk.js b/sources/plugins/div/lang/mk.js
new file mode 100644
index 00000000..0d48fa35
--- /dev/null
+++ b/sources/plugins/div/lang/mk.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'mk', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/mn.js b/sources/plugins/div/lang/mn.js
new file mode 100644
index 00000000..68b6bbb5
--- /dev/null
+++ b/sources/plugins/div/lang/mn.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'mn', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Зөвлөлдөх гарчиг',
8 cssClassInputLabel: 'Stylesheet классууд',
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Зүүн талаас баруун тишээ (LTR)',
12 langDirLabel: 'Хэлний чиглэл',
13 langDirRTLLabel: 'Баруун талаас зүүн тишээ (RTL)',
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Загвар',
17 title: 'Div гэдэг хэсэг бий болгох',
18 toolbar: 'Div гэдэг хэсэг бий болгох'
19} );
diff --git a/sources/plugins/div/lang/ms.js b/sources/plugins/div/lang/ms.js
new file mode 100644
index 00000000..6175249a
--- /dev/null
+++ b/sources/plugins/div/lang/ms.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ms', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/nb.js b/sources/plugins/div/lang/nb.js
new file mode 100644
index 00000000..6620e5f7
--- /dev/null
+++ b/sources/plugins/div/lang/nb.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'nb', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Tittel',
8 cssClassInputLabel: 'Stilark-klasser',
9 edit: 'Rediger Div',
10 inlineStyleInputLabel: 'Inlinestiler',
11 langDirLTRLabel: 'Venstre til høyre (VTH)',
12 langDirLabel: 'Språkretning',
13 langDirRTLLabel: 'Høyre til venstre (HTV)',
14 languageCodeInputLabel: ' Språkkode',
15 remove: 'Fjern Div',
16 styleSelectLabel: 'Stil',
17 title: 'Sett inn Div Container',
18 toolbar: 'Sett inn Div Container'
19} );
diff --git a/sources/plugins/div/lang/nl.js b/sources/plugins/div/lang/nl.js
new file mode 100644
index 00000000..4e8c96da
--- /dev/null
+++ b/sources/plugins/div/lang/nl.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'nl', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Adviserende titel',
8 cssClassInputLabel: 'Stylesheet klassen',
9 edit: 'Div wijzigen',
10 inlineStyleInputLabel: 'Inline stijl',
11 langDirLTRLabel: 'Links naar rechts (LTR)',
12 langDirLabel: 'Schrijfrichting',
13 langDirRTLLabel: 'Rechts naar links (RTL)',
14 languageCodeInputLabel: ' Taalcode',
15 remove: 'Div verwijderen',
16 styleSelectLabel: 'Stijl',
17 title: 'Div aanmaken',
18 toolbar: 'Div aanmaken'
19} );
diff --git a/sources/plugins/div/lang/no.js b/sources/plugins/div/lang/no.js
new file mode 100644
index 00000000..9f9a0a80
--- /dev/null
+++ b/sources/plugins/div/lang/no.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'no', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Tittel',
8 cssClassInputLabel: 'Stilark-klasser',
9 edit: 'Rediger Div',
10 inlineStyleInputLabel: 'Inlinestiler',
11 langDirLTRLabel: 'Venstre til høyre (VTH)',
12 langDirLabel: 'Språkretning',
13 langDirRTLLabel: 'Høyre til venstre (HTV)',
14 languageCodeInputLabel: ' Språkkode',
15 remove: 'Fjern Div',
16 styleSelectLabel: 'Stil',
17 title: 'Sett inn Div Container',
18 toolbar: 'Sett inn Div Container'
19} );
diff --git a/sources/plugins/div/lang/pl.js b/sources/plugins/div/lang/pl.js
new file mode 100644
index 00000000..fe9c48bd
--- /dev/null
+++ b/sources/plugins/div/lang/pl.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'pl', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Opis obiektu docelowego',
8 cssClassInputLabel: 'Klasy arkusza stylów',
9 edit: 'Edytuj pojemnik Div',
10 inlineStyleInputLabel: 'Style liniowe',
11 langDirLTRLabel: 'Od lewej do prawej (LTR)',
12 langDirLabel: 'Kierunek tekstu',
13 langDirRTLLabel: 'Od prawej do lewej (RTL)',
14 languageCodeInputLabel: 'Kod języka',
15 remove: 'Usuń pojemnik Div',
16 styleSelectLabel: 'Styl',
17 title: 'Utwórz pojemnik Div',
18 toolbar: 'Utwórz pojemnik Div'
19} );
diff --git a/sources/plugins/div/lang/pt-br.js b/sources/plugins/div/lang/pt-br.js
new file mode 100644
index 00000000..e76db23a
--- /dev/null
+++ b/sources/plugins/div/lang/pt-br.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'pt-br', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Título Consulta',
8 cssClassInputLabel: 'Classes de CSS',
9 edit: 'Editar Div',
10 inlineStyleInputLabel: 'Estilo Inline',
11 langDirLTRLabel: 'Esquerda para Direita (LTR)',
12 langDirLabel: 'Direção da Escrita',
13 langDirRTLLabel: 'Direita para Esquerda (RTL)',
14 languageCodeInputLabel: 'Código de Idioma',
15 remove: 'Remover Div',
16 styleSelectLabel: 'Estilo',
17 title: 'Criar Container de DIV',
18 toolbar: 'Criar Container de DIV'
19} );
diff --git a/sources/plugins/div/lang/pt.js b/sources/plugins/div/lang/pt.js
new file mode 100644
index 00000000..946e0589
--- /dev/null
+++ b/sources/plugins/div/lang/pt.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'pt', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: 'Título',
8 cssClassInputLabel: 'Classes de folhas de estilo',
9 edit: 'Editar Div',
10 inlineStyleInputLabel: 'Estilho em Linha',
11 langDirLTRLabel: 'Esquerda à Direita (LTR)',
12 langDirLabel: 'Orientação de idioma',
13 langDirRTLLabel: 'Direita a Esquerda (RTL)',
14 languageCodeInputLabel: 'Codigo do Idioma',
15 remove: 'Remover Div',
16 styleSelectLabel: 'Estilo',
17 title: 'Criar Div',
18 toolbar: 'Criar Div'
19} );
diff --git a/sources/plugins/div/lang/ro.js b/sources/plugins/div/lang/ro.js
new file mode 100644
index 00000000..6a7f9a57
--- /dev/null
+++ b/sources/plugins/div/lang/ro.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ro', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Titlul consultativ',
8 cssClassInputLabel: 'Clasele cu stilul paginii (CSS)',
9 edit: 'Modifică Div-ul',
10 inlineStyleInputLabel: 'Stil Inline',
11 langDirLTRLabel: 'stânga-dreapta (LTR)',
12 langDirLabel: 'Direcţia cuvintelor',
13 langDirRTLLabel: 'dreapta-stânga (RTL)',
14 languageCodeInputLabel: 'Codul limbii',
15 remove: 'Șterge Div-ul',
16 styleSelectLabel: 'Stil',
17 title: 'Crează un container Div',
18 toolbar: 'Crează un container Div'
19} );
diff --git a/sources/plugins/div/lang/ru.js b/sources/plugins/div/lang/ru.js
new file mode 100644
index 00000000..855e19cc
--- /dev/null
+++ b/sources/plugins/div/lang/ru.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ru', {
6 IdInputLabel: 'Идентификатор',
7 advisoryTitleInputLabel: 'Заголовок',
8 cssClassInputLabel: 'Классы CSS',
9 edit: 'Редактировать контейнер',
10 inlineStyleInputLabel: 'Стиль элемента',
11 langDirLTRLabel: 'Слева направо (LTR)',
12 langDirLabel: 'Направление текста',
13 langDirRTLLabel: 'Справа налево (RTL)',
14 languageCodeInputLabel: 'Код языка',
15 remove: 'Удалить контейнер',
16 styleSelectLabel: 'Стиль',
17 title: 'Создать Div-контейнер',
18 toolbar: 'Создать Div-контейнер'
19} );
diff --git a/sources/plugins/div/lang/si.js b/sources/plugins/div/lang/si.js
new file mode 100644
index 00000000..128b93ed
--- /dev/null
+++ b/sources/plugins/div/lang/si.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'si', {
6 IdInputLabel: 'අංකය',
7 advisoryTitleInputLabel: 'උපදේශාත්මක නාමය',
8 cssClassInputLabel: 'විලාසපත්‍ර පන්තිය',
9 edit: 'වෙනස්කිරීම',
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'වමේසිට දකුණුට',
12 langDirLabel: 'භාෂා දිශාව',
13 langDirRTLLabel: 'දකුණේ සිට වමට',
14 languageCodeInputLabel: 'භාෂා ',
15 remove: 'ඉවත් කිරීම',
16 styleSelectLabel: 'විලාසය',
17 title: 'නිර්මාණය ',
18 toolbar: 'නිර්මාණය '
19} );
diff --git a/sources/plugins/div/lang/sk.js b/sources/plugins/div/lang/sk.js
new file mode 100644
index 00000000..0e1f2c5a
--- /dev/null
+++ b/sources/plugins/div/lang/sk.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'sk', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Pomocný titulok',
8 cssClassInputLabel: 'Triedy štýlu',
9 edit: 'Upraviť Div',
10 inlineStyleInputLabel: 'Inline štýl',
11 langDirLTRLabel: 'Zľava doprava (LTR)',
12 langDirLabel: 'Smer jazyka',
13 langDirRTLLabel: 'Zprava doľava (RTL)',
14 languageCodeInputLabel: 'Kód jazyka',
15 remove: 'Odstrániť Div',
16 styleSelectLabel: 'Štýl',
17 title: 'Vytvoriť Div kontajner',
18 toolbar: 'Vytvoriť Div kontajner'
19} );
diff --git a/sources/plugins/div/lang/sl.js b/sources/plugins/div/lang/sl.js
new file mode 100644
index 00000000..2c31fe73
--- /dev/null
+++ b/sources/plugins/div/lang/sl.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'sl', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Predlagani naslov',
8 cssClassInputLabel: 'Razred stilne predloge',
9 edit: 'Uredi Div',
10 inlineStyleInputLabel: 'Inline Slog',
11 langDirLTRLabel: 'Od leve proti desni (LTR)',
12 langDirLabel: 'Smer jezika',
13 langDirRTLLabel: 'Od desne proti levi (RTL)',
14 languageCodeInputLabel: 'Koda Jezika',
15 remove: 'Odstrani Div',
16 styleSelectLabel: 'Slog',
17 title: 'Ustvari Div Posodo',
18 toolbar: 'Ustvari Div Posodo'
19} );
diff --git a/sources/plugins/div/lang/sq.js b/sources/plugins/div/lang/sq.js
new file mode 100644
index 00000000..edac6e3d
--- /dev/null
+++ b/sources/plugins/div/lang/sq.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'sq', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Titull',
8 cssClassInputLabel: 'Klasa stili CSS',
9 edit: 'Redakto Div',
10 inlineStyleInputLabel: 'Stili i brendshëm',
11 langDirLTRLabel: 'Nga e majta në të djathë (LTR)',
12 langDirLabel: 'Drejtim teksti',
13 langDirRTLLabel: 'Nga e djathta në të majtë (RTL)',
14 languageCodeInputLabel: 'Kodi i Gjuhës',
15 remove: 'Largo Div',
16 styleSelectLabel: 'Stil',
17 title: 'Krijo Div Përmbajtës',
18 toolbar: 'Krijo Div Përmbajtës'
19} );
diff --git a/sources/plugins/div/lang/sr-latn.js b/sources/plugins/div/lang/sr-latn.js
new file mode 100644
index 00000000..ff8f433b
--- /dev/null
+++ b/sources/plugins/div/lang/sr-latn.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'sr-latn', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Advisory naslov',
8 cssClassInputLabel: 'Stylesheet klase',
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'S leva na desno (LTR)',
12 langDirLabel: 'Smer jezika',
13 langDirRTLLabel: 'S desna na levo (RTL)',
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Stil',
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/sr.js b/sources/plugins/div/lang/sr.js
new file mode 100644
index 00000000..14530d55
--- /dev/null
+++ b/sources/plugins/div/lang/sr.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'sr', {
6 IdInputLabel: 'Id', // MISSING
7 advisoryTitleInputLabel: 'Advisory Title', // MISSING
8 cssClassInputLabel: 'Stylesheet Classes', // MISSING
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'Left to Right (LTR)', // MISSING
12 langDirLabel: 'Language Direction', // MISSING
13 langDirRTLLabel: 'Right to Left (RTL)', // MISSING
14 languageCodeInputLabel: ' Language Code', // MISSING
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Style', // MISSING
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/sv.js b/sources/plugins/div/lang/sv.js
new file mode 100644
index 00000000..80751370
--- /dev/null
+++ b/sources/plugins/div/lang/sv.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'sv', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Rådgivande titel',
8 cssClassInputLabel: 'Stilmallar',
9 edit: 'Redigera Div',
10 inlineStyleInputLabel: 'Inline Style',
11 langDirLTRLabel: 'Vänster till höger (LTR)',
12 langDirLabel: 'Språkriktning',
13 langDirRTLLabel: 'Höger till vänster (RTL)',
14 languageCodeInputLabel: ' Språkkod',
15 remove: 'Ta bort Div',
16 styleSelectLabel: 'Stil',
17 title: 'Skapa Div container',
18 toolbar: 'Skapa Div container'
19} );
diff --git a/sources/plugins/div/lang/th.js b/sources/plugins/div/lang/th.js
new file mode 100644
index 00000000..69008c34
--- /dev/null
+++ b/sources/plugins/div/lang/th.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'th', {
6 IdInputLabel: 'ไอดี',
7 advisoryTitleInputLabel: 'คำเกริ่นนำ',
8 cssClassInputLabel: 'คลาสของไฟล์กำหนดลักษณะการแสดงผล',
9 edit: 'แก้ไข Div',
10 inlineStyleInputLabel: 'Inline Style', // MISSING
11 langDirLTRLabel: 'จากซ้ายไปขวา (LTR)',
12 langDirLabel: 'การเขียน-อ่านภาษา',
13 langDirRTLLabel: 'จากขวามาซ้าย (RTL)',
14 languageCodeInputLabel: 'รหัสภาษา',
15 remove: 'ลบ Div',
16 styleSelectLabel: 'ลักษณะการแสดงผล',
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/tr.js b/sources/plugins/div/lang/tr.js
new file mode 100644
index 00000000..67f0ee25
--- /dev/null
+++ b/sources/plugins/div/lang/tr.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'tr', {
6 IdInputLabel: 'Id',
7 advisoryTitleInputLabel: 'Tavsiye Başlığı',
8 cssClassInputLabel: 'Stilltipi Sınıfı',
9 edit: 'Div Düzenle',
10 inlineStyleInputLabel: 'Inline Stili',
11 langDirLTRLabel: 'Soldan sağa (LTR)',
12 langDirLabel: 'Dil Yönü',
13 langDirRTLLabel: 'Sağdan sola (RTL)',
14 languageCodeInputLabel: ' Dil Kodu',
15 remove: 'Div Kaldır',
16 styleSelectLabel: 'Stil',
17 title: 'Div İçeriği Oluştur',
18 toolbar: 'Div İçeriği Oluştur'
19} );
diff --git a/sources/plugins/div/lang/tt.js b/sources/plugins/div/lang/tt.js
new file mode 100644
index 00000000..71acf056
--- /dev/null
+++ b/sources/plugins/div/lang/tt.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'tt', {
6 IdInputLabel: 'Идентификатор',
7 advisoryTitleInputLabel: 'Киңәш исем',
8 cssClassInputLabel: 'Стильләр класслары',
9 edit: 'Edit Div', // MISSING
10 inlineStyleInputLabel: 'Эчке стиль',
11 langDirLTRLabel: 'Сулдан уңга язылыш (LTR)',
12 langDirLabel: 'Язылыш юнəлеше',
13 langDirRTLLabel: 'Уңнан сулга язылыш (RTL)',
14 languageCodeInputLabel: 'Тел коды',
15 remove: 'Remove Div', // MISSING
16 styleSelectLabel: 'Стиль',
17 title: 'Create Div Container', // MISSING
18 toolbar: 'Create Div Container' // MISSING
19} );
diff --git a/sources/plugins/div/lang/ug.js b/sources/plugins/div/lang/ug.js
new file mode 100644
index 00000000..8a29377d
--- /dev/null
+++ b/sources/plugins/div/lang/ug.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'ug', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: 'ماۋزۇ',
8 cssClassInputLabel: 'ئۇسلۇب تىپىنىڭ ئاتى',
9 edit: 'DIV تەھرىر',
10 inlineStyleInputLabel: 'قۇر ئىچىدىكى ئۇسلۇبى',
11 langDirLTRLabel: 'سولدىن ئوڭغا (LTR)',
12 langDirLabel: 'تىل يۆنىلىشى',
13 langDirRTLLabel: 'ئوڭدىن سولغا (RTL)',
14 languageCodeInputLabel: 'تىل كودى',
15 remove: 'DIV چىقىرىۋەت',
16 styleSelectLabel: 'ئۇسلۇب',
17 title: 'DIV قاچا قۇر',
18 toolbar: 'DIV قاچا قۇر'
19} );
diff --git a/sources/plugins/div/lang/uk.js b/sources/plugins/div/lang/uk.js
new file mode 100644
index 00000000..0e69c5d4
--- /dev/null
+++ b/sources/plugins/div/lang/uk.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'uk', {
6 IdInputLabel: 'Ідентифікатор',
7 advisoryTitleInputLabel: 'Зміст випливаючої підказки',
8 cssClassInputLabel: 'Клас CSS',
9 edit: 'Редагувати блок',
10 inlineStyleInputLabel: 'Вписаний стиль',
11 langDirLTRLabel: 'Зліва направо (LTR)',
12 langDirLabel: 'Напрямок мови',
13 langDirRTLLabel: 'Справа наліво (RTL)',
14 languageCodeInputLabel: 'Код мови',
15 remove: 'Видалити блок',
16 styleSelectLabel: 'Стиль CSS',
17 title: 'Створити блок-контейнер',
18 toolbar: 'Створити блок-контейнер'
19} );
diff --git a/sources/plugins/div/lang/vi.js b/sources/plugins/div/lang/vi.js
new file mode 100644
index 00000000..8591290c
--- /dev/null
+++ b/sources/plugins/div/lang/vi.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'vi', {
6 IdInputLabel: 'Định danh (id)',
7 advisoryTitleInputLabel: 'Nhan đề hướng dẫn',
8 cssClassInputLabel: 'Các lớp CSS',
9 edit: 'Chỉnh sửa',
10 inlineStyleInputLabel: 'Kiểu nội dòng',
11 langDirLTRLabel: 'Trái sang phải (LTR)',
12 langDirLabel: 'Hướng ngôn ngữ',
13 langDirRTLLabel: 'Phải qua trái (RTL)',
14 languageCodeInputLabel: 'Mã ngôn ngữ',
15 remove: 'Xóa bỏ',
16 styleSelectLabel: 'Kiểu (style)',
17 title: 'Tạo khối các thành phần',
18 toolbar: 'Tạo khối các thành phần'
19} );
diff --git a/sources/plugins/div/lang/zh-cn.js b/sources/plugins/div/lang/zh-cn.js
new file mode 100644
index 00000000..ae577b23
--- /dev/null
+++ b/sources/plugins/div/lang/zh-cn.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'zh-cn', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: '标题',
8 cssClassInputLabel: '样式类名称',
9 edit: '编辑 DIV',
10 inlineStyleInputLabel: '行内样式',
11 langDirLTRLabel: '从左到右 (LTR)',
12 langDirLabel: '语言方向',
13 langDirRTLLabel: '从右到左 (RTL)',
14 languageCodeInputLabel: '语言代码',
15 remove: '移除 DIV',
16 styleSelectLabel: '样式',
17 title: '创建 DIV 容器',
18 toolbar: '创建 DIV 容器'
19} );
diff --git a/sources/plugins/div/lang/zh.js b/sources/plugins/div/lang/zh.js
new file mode 100644
index 00000000..4d38ff79
--- /dev/null
+++ b/sources/plugins/div/lang/zh.js
@@ -0,0 +1,19 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'div', 'zh', {
6 IdInputLabel: 'ID',
7 advisoryTitleInputLabel: '標題',
8 cssClassInputLabel: '樣式表類別',
9 edit: '編輯 Div',
10 inlineStyleInputLabel: '行內樣式',
11 langDirLTRLabel: '由左至右 (LTR)',
12 langDirLabel: '語言方向',
13 langDirRTLLabel: '由右至左 (RTL)',
14 languageCodeInputLabel: '語言碼',
15 remove: '移除 Div',
16 styleSelectLabel: '樣式',
17 title: '建立 Div 容器',
18 toolbar: '建立 Div 容器'
19} );
diff --git a/sources/plugins/div/plugin.js b/sources/plugins/div/plugin.js
new file mode 100644
index 00000000..0faaa5fc
--- /dev/null
+++ b/sources/plugins/div/plugin.js
@@ -0,0 +1,131 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "div" plugin. It wraps the selected block level elements with a 'div' element with specified styles and attributes.
8 *
9 */
10
11( function() {
12 CKEDITOR.plugins.add( 'div', {
13 requires: 'dialog',
14 // jscs:disable maximumLineLength
15 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
16 // jscs:enable maximumLineLength
17 icons: 'creatediv', // %REMOVE_LINE_CORE%
18 hidpi: true, // %REMOVE_LINE_CORE%
19 init: function( editor ) {
20 if ( editor.blockless )
21 return;
22
23 var lang = editor.lang.div,
24 allowed = 'div(*)';
25
26 if ( CKEDITOR.dialog.isTabEnabled( editor, 'editdiv', 'advanced' ) )
27 allowed += ';div[dir,id,lang,title]{*}';
28
29 editor.addCommand( 'creatediv', new CKEDITOR.dialogCommand( 'creatediv', {
30 allowedContent: allowed,
31 requiredContent: 'div',
32 contextSensitive: true,
33 refresh: function( editor, path ) {
34 var context = editor.config.div_wrapTable ? path.root : path.blockLimit;
35 this.setState( 'div' in context.getDtd() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
36 }
37 } ) );
38
39 editor.addCommand( 'editdiv', new CKEDITOR.dialogCommand( 'editdiv', { requiredContent: 'div' } ) );
40 editor.addCommand( 'removediv', {
41 requiredContent: 'div',
42 exec: function( editor ) {
43 var selection = editor.getSelection(),
44 ranges = selection && selection.getRanges(),
45 range,
46 bookmarks = selection.createBookmarks(),
47 walker,
48 toRemove = [];
49
50 function findDiv( node ) {
51 var div = CKEDITOR.plugins.div.getSurroundDiv( editor, node );
52 if ( div && !div.data( 'cke-div-added' ) ) {
53 toRemove.push( div );
54 div.data( 'cke-div-added' );
55 }
56 }
57
58 for ( var i = 0; i < ranges.length; i++ ) {
59 range = ranges[ i ];
60 if ( range.collapsed )
61 findDiv( selection.getStartElement() );
62 else {
63 walker = new CKEDITOR.dom.walker( range );
64 walker.evaluator = findDiv;
65 walker.lastForward();
66 }
67 }
68
69 for ( i = 0; i < toRemove.length; i++ )
70 toRemove[ i ].remove( true );
71
72 selection.selectBookmarks( bookmarks );
73 }
74 } );
75
76 editor.ui.addButton && editor.ui.addButton( 'CreateDiv', {
77 label: lang.toolbar,
78 command: 'creatediv',
79 toolbar: 'blocks,50'
80 } );
81
82 if ( editor.addMenuItems ) {
83 editor.addMenuItems( {
84 editdiv: {
85 label: lang.edit,
86 command: 'editdiv',
87 group: 'div',
88 order: 1
89 },
90
91 removediv: {
92 label: lang.remove,
93 command: 'removediv',
94 group: 'div',
95 order: 5
96 }
97 } );
98
99 if ( editor.contextMenu ) {
100 editor.contextMenu.addListener( function( element ) {
101 if ( !element || element.isReadOnly() )
102 return null;
103
104
105 if ( CKEDITOR.plugins.div.getSurroundDiv( editor ) ) {
106 return {
107 editdiv: CKEDITOR.TRISTATE_OFF,
108 removediv: CKEDITOR.TRISTATE_OFF
109 };
110 }
111
112 return null;
113 } );
114 }
115 }
116
117 CKEDITOR.dialog.add( 'creatediv', this.path + 'dialogs/div.js' );
118 CKEDITOR.dialog.add( 'editdiv', this.path + 'dialogs/div.js' );
119 }
120 } );
121
122 CKEDITOR.plugins.div = {
123 getSurroundDiv: function( editor, start ) {
124 var path = editor.elementPath( start );
125 return editor.elementPath( path.blockLimit ).contains( function( node ) {
126 // Avoid read-only (i.e. contenteditable="false") divs (#11083).
127 return node.is( 'div' ) && !node.isReadOnly();
128 }, 1 );
129 }
130 };
131} )();
diff --git a/sources/plugins/elementspath/lang/af.js b/sources/plugins/elementspath/lang/af.js
new file mode 100644
index 00000000..c5a5643c
--- /dev/null
+++ b/sources/plugins/elementspath/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'af', {
6 eleLabel: 'Elemente-pad',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/ar.js b/sources/plugins/elementspath/lang/ar.js
new file mode 100644
index 00000000..8893ef9d
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ar', {
6 eleLabel: 'مسار العنصر',
7 eleTitle: 'عنصر 1%'
8} );
diff --git a/sources/plugins/elementspath/lang/bg.js b/sources/plugins/elementspath/lang/bg.js
new file mode 100644
index 00000000..b931b4bc
--- /dev/null
+++ b/sources/plugins/elementspath/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'bg', {
6 eleLabel: 'Път за елементите',
7 eleTitle: '%1 елемент'
8} );
diff --git a/sources/plugins/elementspath/lang/bn.js b/sources/plugins/elementspath/lang/bn.js
new file mode 100644
index 00000000..beffa948
--- /dev/null
+++ b/sources/plugins/elementspath/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'bn', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/bs.js b/sources/plugins/elementspath/lang/bs.js
new file mode 100644
index 00000000..7233099f
--- /dev/null
+++ b/sources/plugins/elementspath/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'bs', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/ca.js b/sources/plugins/elementspath/lang/ca.js
new file mode 100644
index 00000000..84a8800a
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ca', {
6 eleLabel: 'Ruta dels elements',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/cs.js b/sources/plugins/elementspath/lang/cs.js
new file mode 100644
index 00000000..dfa25533
--- /dev/null
+++ b/sources/plugins/elementspath/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'cs', {
6 eleLabel: 'Cesta objektu',
7 eleTitle: '%1 objekt'
8} );
diff --git a/sources/plugins/elementspath/lang/cy.js b/sources/plugins/elementspath/lang/cy.js
new file mode 100644
index 00000000..46294929
--- /dev/null
+++ b/sources/plugins/elementspath/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'cy', {
6 eleLabel: 'Llwybr elfennau',
7 eleTitle: 'Elfen %1'
8} );
diff --git a/sources/plugins/elementspath/lang/da.js b/sources/plugins/elementspath/lang/da.js
new file mode 100644
index 00000000..e598ac72
--- /dev/null
+++ b/sources/plugins/elementspath/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'da', {
6 eleLabel: 'Sti på element',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/de.js b/sources/plugins/elementspath/lang/de.js
new file mode 100644
index 00000000..8633a27d
--- /dev/null
+++ b/sources/plugins/elementspath/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'de', {
6 eleLabel: 'Elementepfad',
7 eleTitle: '%1 Element'
8} );
diff --git a/sources/plugins/elementspath/lang/el.js b/sources/plugins/elementspath/lang/el.js
new file mode 100644
index 00000000..135f249a
--- /dev/null
+++ b/sources/plugins/elementspath/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'el', {
6 eleLabel: 'Διαδρομή Στοιχείων',
7 eleTitle: 'Στοιχείο %1'
8} );
diff --git a/sources/plugins/elementspath/lang/en-au.js b/sources/plugins/elementspath/lang/en-au.js
new file mode 100644
index 00000000..e4948d27
--- /dev/null
+++ b/sources/plugins/elementspath/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'en-au', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/en-ca.js b/sources/plugins/elementspath/lang/en-ca.js
new file mode 100644
index 00000000..70d2dd49
--- /dev/null
+++ b/sources/plugins/elementspath/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'en-ca', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/en-gb.js b/sources/plugins/elementspath/lang/en-gb.js
new file mode 100644
index 00000000..ec263fb2
--- /dev/null
+++ b/sources/plugins/elementspath/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'en-gb', {
6 eleLabel: 'Elements path',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/en.js b/sources/plugins/elementspath/lang/en.js
new file mode 100644
index 00000000..6f4c803c
--- /dev/null
+++ b/sources/plugins/elementspath/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'en', {
6 eleLabel: 'Elements path',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/eo.js b/sources/plugins/elementspath/lang/eo.js
new file mode 100644
index 00000000..0a952ce8
--- /dev/null
+++ b/sources/plugins/elementspath/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'eo', {
6 eleLabel: 'Vojo al Elementoj',
7 eleTitle: '%1 elementoj'
8} );
diff --git a/sources/plugins/elementspath/lang/es.js b/sources/plugins/elementspath/lang/es.js
new file mode 100644
index 00000000..2afd31b5
--- /dev/null
+++ b/sources/plugins/elementspath/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'es', {
6 eleLabel: 'Ruta de los elementos',
7 eleTitle: '%1 elemento'
8} );
diff --git a/sources/plugins/elementspath/lang/et.js b/sources/plugins/elementspath/lang/et.js
new file mode 100644
index 00000000..c354a8d4
--- /dev/null
+++ b/sources/plugins/elementspath/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'et', {
6 eleLabel: 'Elementide asukoht',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/eu.js b/sources/plugins/elementspath/lang/eu.js
new file mode 100644
index 00000000..2b063ef6
--- /dev/null
+++ b/sources/plugins/elementspath/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'eu', {
6 eleLabel: 'Elementuen bidea',
7 eleTitle: '%1 elementua'
8} );
diff --git a/sources/plugins/elementspath/lang/fa.js b/sources/plugins/elementspath/lang/fa.js
new file mode 100644
index 00000000..71ce8bfc
--- /dev/null
+++ b/sources/plugins/elementspath/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'fa', {
6 eleLabel: 'مسیر عناصر',
7 eleTitle: '%1 عنصر'
8} );
diff --git a/sources/plugins/elementspath/lang/fi.js b/sources/plugins/elementspath/lang/fi.js
new file mode 100644
index 00000000..a4787123
--- /dev/null
+++ b/sources/plugins/elementspath/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'fi', {
6 eleLabel: 'Elementin polku',
7 eleTitle: '%1 elementti'
8} );
diff --git a/sources/plugins/elementspath/lang/fo.js b/sources/plugins/elementspath/lang/fo.js
new file mode 100644
index 00000000..01aca7d9
--- /dev/null
+++ b/sources/plugins/elementspath/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'fo', {
6 eleLabel: 'Slóð til elementir',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/fr-ca.js b/sources/plugins/elementspath/lang/fr-ca.js
new file mode 100644
index 00000000..ff7c1fa0
--- /dev/null
+++ b/sources/plugins/elementspath/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'fr-ca', {
6 eleLabel: 'Chemin d\'éléments',
7 eleTitle: 'element %1'
8} );
diff --git a/sources/plugins/elementspath/lang/fr.js b/sources/plugins/elementspath/lang/fr.js
new file mode 100644
index 00000000..fb2f126c
--- /dev/null
+++ b/sources/plugins/elementspath/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'fr', {
6 eleLabel: 'Elements path',
7 eleTitle: '%1 éléments'
8} );
diff --git a/sources/plugins/elementspath/lang/gl.js b/sources/plugins/elementspath/lang/gl.js
new file mode 100644
index 00000000..cc81ebc2
--- /dev/null
+++ b/sources/plugins/elementspath/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'gl', {
6 eleLabel: 'Ruta dos elementos',
7 eleTitle: 'Elemento %1'
8} );
diff --git a/sources/plugins/elementspath/lang/gu.js b/sources/plugins/elementspath/lang/gu.js
new file mode 100644
index 00000000..d46a9e28
--- /dev/null
+++ b/sources/plugins/elementspath/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'gu', {
6 eleLabel: 'એલીમેન્ટ્સ નો ',
7 eleTitle: 'એલીમેન્ટ %1'
8} );
diff --git a/sources/plugins/elementspath/lang/he.js b/sources/plugins/elementspath/lang/he.js
new file mode 100644
index 00000000..058d9f10
--- /dev/null
+++ b/sources/plugins/elementspath/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'he', {
6 eleLabel: 'עץ האלמנטים',
7 eleTitle: '%1 אלמנט'
8} );
diff --git a/sources/plugins/elementspath/lang/hi.js b/sources/plugins/elementspath/lang/hi.js
new file mode 100644
index 00000000..474d825d
--- /dev/null
+++ b/sources/plugins/elementspath/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'hi', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/hr.js b/sources/plugins/elementspath/lang/hr.js
new file mode 100644
index 00000000..de52d688
--- /dev/null
+++ b/sources/plugins/elementspath/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'hr', {
6 eleLabel: 'Putanja elemenata',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/hu.js b/sources/plugins/elementspath/lang/hu.js
new file mode 100644
index 00000000..66dc55a4
--- /dev/null
+++ b/sources/plugins/elementspath/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'hu', {
6 eleLabel: 'Elem utak',
7 eleTitle: '%1 elem'
8} );
diff --git a/sources/plugins/elementspath/lang/is.js b/sources/plugins/elementspath/lang/is.js
new file mode 100644
index 00000000..11f8c535
--- /dev/null
+++ b/sources/plugins/elementspath/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'is', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/it.js b/sources/plugins/elementspath/lang/it.js
new file mode 100644
index 00000000..8f2d30a5
--- /dev/null
+++ b/sources/plugins/elementspath/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'it', {
6 eleLabel: 'Percorso degli elementi',
7 eleTitle: '%1 elemento'
8} );
diff --git a/sources/plugins/elementspath/lang/ja.js b/sources/plugins/elementspath/lang/ja.js
new file mode 100644
index 00000000..61b6a8bb
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ja', {
6 eleLabel: '要素パス',
7 eleTitle: '%1 要素'
8} );
diff --git a/sources/plugins/elementspath/lang/ka.js b/sources/plugins/elementspath/lang/ka.js
new file mode 100644
index 00000000..a5d39c12
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ka', {
6 eleLabel: 'ელემეტის გზა',
7 eleTitle: '%1 ელემენტი'
8} );
diff --git a/sources/plugins/elementspath/lang/km.js b/sources/plugins/elementspath/lang/km.js
new file mode 100644
index 00000000..bfa6385e
--- /dev/null
+++ b/sources/plugins/elementspath/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'km', {
6 eleLabel: 'ទីតាំង​ធាតុ',
7 eleTitle: 'ធាតុ %1'
8} );
diff --git a/sources/plugins/elementspath/lang/ko.js b/sources/plugins/elementspath/lang/ko.js
new file mode 100644
index 00000000..6e69875d
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ko', {
6 eleLabel: '요소 경로',
7 eleTitle: '%1 요소'
8} );
diff --git a/sources/plugins/elementspath/lang/ku.js b/sources/plugins/elementspath/lang/ku.js
new file mode 100644
index 00000000..235b82b2
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ku', {
6 eleLabel: 'ڕێڕەوی توخمەکان',
7 eleTitle: '%1 توخم'
8} );
diff --git a/sources/plugins/elementspath/lang/lt.js b/sources/plugins/elementspath/lang/lt.js
new file mode 100644
index 00000000..6696ad62
--- /dev/null
+++ b/sources/plugins/elementspath/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'lt', {
6 eleLabel: 'Elemento kelias',
7 eleTitle: '%1 elementas'
8} );
diff --git a/sources/plugins/elementspath/lang/lv.js b/sources/plugins/elementspath/lang/lv.js
new file mode 100644
index 00000000..8d697cb2
--- /dev/null
+++ b/sources/plugins/elementspath/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'lv', {
6 eleLabel: 'Elementa ceļš',
7 eleTitle: '%1 elements'
8} );
diff --git a/sources/plugins/elementspath/lang/mk.js b/sources/plugins/elementspath/lang/mk.js
new file mode 100644
index 00000000..f4719330
--- /dev/null
+++ b/sources/plugins/elementspath/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'mk', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/mn.js b/sources/plugins/elementspath/lang/mn.js
new file mode 100644
index 00000000..b21a8c8e
--- /dev/null
+++ b/sources/plugins/elementspath/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'mn', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/ms.js b/sources/plugins/elementspath/lang/ms.js
new file mode 100644
index 00000000..7ab75249
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ms', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/nb.js b/sources/plugins/elementspath/lang/nb.js
new file mode 100644
index 00000000..8c097159
--- /dev/null
+++ b/sources/plugins/elementspath/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'nb', {
6 eleLabel: 'Element-sti',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/nl.js b/sources/plugins/elementspath/lang/nl.js
new file mode 100644
index 00000000..b76b8d17
--- /dev/null
+++ b/sources/plugins/elementspath/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'nl', {
6 eleLabel: 'Elementenpad',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/no.js b/sources/plugins/elementspath/lang/no.js
new file mode 100644
index 00000000..d20dff5b
--- /dev/null
+++ b/sources/plugins/elementspath/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'no', {
6 eleLabel: 'Element-sti',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/pl.js b/sources/plugins/elementspath/lang/pl.js
new file mode 100644
index 00000000..dc1bd5f0
--- /dev/null
+++ b/sources/plugins/elementspath/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'pl', {
6 eleLabel: 'Ścieżka elementów',
7 eleTitle: 'element %1'
8} );
diff --git a/sources/plugins/elementspath/lang/pt-br.js b/sources/plugins/elementspath/lang/pt-br.js
new file mode 100644
index 00000000..71a09195
--- /dev/null
+++ b/sources/plugins/elementspath/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'pt-br', {
6 eleLabel: 'Caminho dos Elementos',
7 eleTitle: 'Elemento %1'
8} );
diff --git a/sources/plugins/elementspath/lang/pt.js b/sources/plugins/elementspath/lang/pt.js
new file mode 100644
index 00000000..84ecfb60
--- /dev/null
+++ b/sources/plugins/elementspath/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'pt', {
6 eleLabel: 'Caminho dos elementos',
7 eleTitle: 'Elemento %1'
8} );
diff --git a/sources/plugins/elementspath/lang/ro.js b/sources/plugins/elementspath/lang/ro.js
new file mode 100644
index 00000000..60e83dac
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ro', {
6 eleLabel: 'Calea elementelor',
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/ru.js b/sources/plugins/elementspath/lang/ru.js
new file mode 100644
index 00000000..de9c3873
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ru', {
6 eleLabel: 'Путь элементов',
7 eleTitle: 'Элемент %1'
8} );
diff --git a/sources/plugins/elementspath/lang/si.js b/sources/plugins/elementspath/lang/si.js
new file mode 100644
index 00000000..af9ec4b9
--- /dev/null
+++ b/sources/plugins/elementspath/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'si', {
6 eleLabel: 'මුලද්‍රව්‍ය මාර්ගය',
7 eleTitle: '%1 මුල'
8} );
diff --git a/sources/plugins/elementspath/lang/sk.js b/sources/plugins/elementspath/lang/sk.js
new file mode 100644
index 00000000..47fc2355
--- /dev/null
+++ b/sources/plugins/elementspath/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'sk', {
6 eleLabel: 'Cesta prvkov',
7 eleTitle: '%1 prvok'
8} );
diff --git a/sources/plugins/elementspath/lang/sl.js b/sources/plugins/elementspath/lang/sl.js
new file mode 100644
index 00000000..40a06657
--- /dev/null
+++ b/sources/plugins/elementspath/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'sl', {
6 eleLabel: 'Pot elementov',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/sq.js b/sources/plugins/elementspath/lang/sq.js
new file mode 100644
index 00000000..34245156
--- /dev/null
+++ b/sources/plugins/elementspath/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'sq', {
6 eleLabel: 'Rruga e elementeve',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/sr-latn.js b/sources/plugins/elementspath/lang/sr-latn.js
new file mode 100644
index 00000000..847dbabb
--- /dev/null
+++ b/sources/plugins/elementspath/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'sr-latn', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/sr.js b/sources/plugins/elementspath/lang/sr.js
new file mode 100644
index 00000000..62fe53d4
--- /dev/null
+++ b/sources/plugins/elementspath/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'sr', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/sv.js b/sources/plugins/elementspath/lang/sv.js
new file mode 100644
index 00000000..c89e5bcc
--- /dev/null
+++ b/sources/plugins/elementspath/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'sv', {
6 eleLabel: 'Elementets sökväg',
7 eleTitle: '%1 element'
8} );
diff --git a/sources/plugins/elementspath/lang/th.js b/sources/plugins/elementspath/lang/th.js
new file mode 100644
index 00000000..6390e4ad
--- /dev/null
+++ b/sources/plugins/elementspath/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'th', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 element' // MISSING
8} );
diff --git a/sources/plugins/elementspath/lang/tr.js b/sources/plugins/elementspath/lang/tr.js
new file mode 100644
index 00000000..7b7445c2
--- /dev/null
+++ b/sources/plugins/elementspath/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'tr', {
6 eleLabel: 'Elementlerin yolu',
7 eleTitle: '%1 elementi'
8} );
diff --git a/sources/plugins/elementspath/lang/tt.js b/sources/plugins/elementspath/lang/tt.js
new file mode 100644
index 00000000..76e0da16
--- /dev/null
+++ b/sources/plugins/elementspath/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'tt', {
6 eleLabel: 'Elements path', // MISSING
7 eleTitle: '%1 элемент'
8} );
diff --git a/sources/plugins/elementspath/lang/ug.js b/sources/plugins/elementspath/lang/ug.js
new file mode 100644
index 00000000..e680cd77
--- /dev/null
+++ b/sources/plugins/elementspath/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'ug', {
6 eleLabel: 'ئېلېمېنت يولى',
7 eleTitle: '%1 ئېلېمېنت'
8} );
diff --git a/sources/plugins/elementspath/lang/uk.js b/sources/plugins/elementspath/lang/uk.js
new file mode 100644
index 00000000..448ccd98
--- /dev/null
+++ b/sources/plugins/elementspath/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'uk', {
6 eleLabel: 'Шлях',
7 eleTitle: '%1 елемент'
8} );
diff --git a/sources/plugins/elementspath/lang/vi.js b/sources/plugins/elementspath/lang/vi.js
new file mode 100644
index 00000000..93a31a5c
--- /dev/null
+++ b/sources/plugins/elementspath/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'vi', {
6 eleLabel: 'Nhãn thành phần',
7 eleTitle: '%1 thành phần'
8} );
diff --git a/sources/plugins/elementspath/lang/zh-cn.js b/sources/plugins/elementspath/lang/zh-cn.js
new file mode 100644
index 00000000..2f96b7e1
--- /dev/null
+++ b/sources/plugins/elementspath/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'zh-cn', {
6 eleLabel: '元素路径',
7 eleTitle: '%1 元素'
8} );
diff --git a/sources/plugins/elementspath/lang/zh.js b/sources/plugins/elementspath/lang/zh.js
new file mode 100644
index 00000000..d2dadbbc
--- /dev/null
+++ b/sources/plugins/elementspath/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'elementspath', 'zh', {
6 eleLabel: '元件路徑',
7 eleTitle: '%1 個元件'
8} );
diff --git a/sources/plugins/elementspath/plugin.js b/sources/plugins/elementspath/plugin.js
new file mode 100644
index 00000000..d997b7b4
--- /dev/null
+++ b/sources/plugins/elementspath/plugin.js
@@ -0,0 +1,235 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "elementspath" plugin. It shows all elements in the DOM
8 * parent tree relative to the current selection in the editing area.
9 */
10
11( function() {
12 var commands = {
13 toolbarFocus: {
14 editorFocus: false,
15 readOnly: 1,
16 exec: function( editor ) {
17 var idBase = editor._.elementsPath.idBase;
18 var element = CKEDITOR.document.getById( idBase + '0' );
19
20 // Make the first button focus accessible for IE. (#3417)
21 // Adobe AIR instead need while of delay.
22 element && element.focus( CKEDITOR.env.ie || CKEDITOR.env.air );
23 }
24 }
25 };
26
27 var emptyHtml = '<span class="cke_path_empty">&nbsp;</span>';
28
29 var extra = '';
30
31 // Some browsers don't cancel key events in the keydown but in the
32 // keypress.
33 // TODO: Check if really needed.
34 if ( CKEDITOR.env.gecko && CKEDITOR.env.mac )
35 extra += ' onkeypress="return false;"';
36
37 // With Firefox, we need to force the button to redraw, otherwise it
38 // will remain in the focus state.
39 if ( CKEDITOR.env.gecko )
40 extra += ' onblur="this.style.cssText = this.style.cssText;"';
41
42 var pathItemTpl = CKEDITOR.addTemplate( 'pathItem', '<a' +
43 ' id="{id}"' +
44 ' href="{jsTitle}"' +
45 ' tabindex="-1"' +
46 ' class="cke_path_item"' +
47 ' title="{label}"' +
48 extra +
49 ' hidefocus="true" ' +
50 ' onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );"' +
51 ' onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;"' +
52 ' role="button" aria-label="{label}">' +
53 '{text}' +
54 '</a>' );
55
56 CKEDITOR.plugins.add( 'elementspath', {
57 // jscs:disable maximumLineLength
58 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,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%
59 // jscs:enable maximumLineLength
60 init: function( editor ) {
61 editor._.elementsPath = {
62 idBase: 'cke_elementspath_' + CKEDITOR.tools.getNextNumber() + '_',
63 filters: []
64 };
65
66 editor.on( 'uiSpace', function( event ) {
67 if ( event.data.space == 'bottom' )
68 initElementsPath( editor, event.data );
69 } );
70 }
71 } );
72
73 function initElementsPath( editor, bottomSpaceData ) {
74 var spaceId = editor.ui.spaceId( 'path' ),
75 spaceElement,
76 getSpaceElement = function() {
77 if ( !spaceElement )
78 spaceElement = CKEDITOR.document.getById( spaceId );
79 return spaceElement;
80 },
81 elementsPath = editor._.elementsPath,
82 idBase = elementsPath.idBase;
83
84 bottomSpaceData.html += '<span id="' + spaceId + '_label" class="cke_voice_label">' + editor.lang.elementspath.eleLabel + '</span>' +
85 '<span id="' + spaceId + '" class="cke_path" role="group" aria-labelledby="' + spaceId + '_label">' + emptyHtml + '</span>';
86
87 // Register the ui element to the focus manager.
88 editor.on( 'uiReady', function() {
89 var element = editor.ui.space( 'path' );
90 element && editor.focusManager.add( element, 1 );
91 } );
92
93 function onClick( elementIndex ) {
94 var element = elementsPath.list[ elementIndex ];
95 if ( element.equals( editor.editable() ) || element.getAttribute( 'contenteditable' ) == 'true' ) {
96 var range = editor.createRange();
97 range.selectNodeContents( element );
98 range.select();
99 } else {
100 editor.getSelection().selectElement( element );
101 }
102
103 // It is important to focus() *after* the above selection
104 // manipulation, otherwise Firefox will have troubles. #10119
105 editor.focus();
106 }
107
108 elementsPath.onClick = onClick;
109
110 var onClickHanlder = CKEDITOR.tools.addFunction( onClick ),
111 onKeyDownHandler = CKEDITOR.tools.addFunction( function( elementIndex, ev ) {
112 var idBase = elementsPath.idBase,
113 element;
114
115 ev = new CKEDITOR.dom.event( ev );
116
117 var rtl = editor.lang.dir == 'rtl';
118 switch ( ev.getKeystroke() ) {
119 case rtl ? 39 : 37: // LEFT-ARROW
120 case 9: // TAB
121 element = CKEDITOR.document.getById( idBase + ( elementIndex + 1 ) );
122 if ( !element )
123 element = CKEDITOR.document.getById( idBase + '0' );
124 element.focus();
125 return false;
126
127 case rtl ? 37 : 39: // RIGHT-ARROW
128 case CKEDITOR.SHIFT + 9: // SHIFT + TAB
129 element = CKEDITOR.document.getById( idBase + ( elementIndex - 1 ) );
130 if ( !element )
131 element = CKEDITOR.document.getById( idBase + ( elementsPath.list.length - 1 ) );
132 element.focus();
133 return false;
134
135 case 27: // ESC
136 editor.focus();
137 return false;
138
139 case 13: // ENTER // Opera
140 case 32: // SPACE
141 onClick( elementIndex );
142 return false;
143 }
144 return true;
145 } );
146
147 editor.on( 'selectionChange', function() {
148 var html = [],
149 elementsList = elementsPath.list = [],
150 namesList = [],
151 filters = elementsPath.filters,
152 isContentEditable = true,
153
154 // Use elementPath to consider children of editable only (#11124).
155 elementsChain = editor.elementPath().elements,
156 name;
157
158 // Starts iteration from body element, skipping html.
159 for ( var j = elementsChain.length; j--; ) {
160 var element = elementsChain[ j ],
161 ignore = 0;
162
163 if ( element.data( 'cke-display-name' ) )
164 name = element.data( 'cke-display-name' );
165 else if ( element.data( 'cke-real-element-type' ) )
166 name = element.data( 'cke-real-element-type' );
167 else
168 name = element.getName();
169
170 isContentEditable = element.hasAttribute( 'contenteditable' ) ?
171 element.getAttribute( 'contenteditable' ) == 'true' : isContentEditable;
172
173 // If elem is non-contenteditable, and it's not specifying contenteditable
174 // attribute - then elem should be ignored.
175 if ( !isContentEditable && !element.hasAttribute( 'contenteditable' ) )
176 ignore = 1;
177
178 for ( var i = 0; i < filters.length; i++ ) {
179 var ret = filters[ i ]( element, name );
180 if ( ret === false ) {
181 ignore = 1;
182 break;
183 }
184 name = ret || name;
185 }
186
187 if ( !ignore ) {
188 elementsList.unshift( element );
189 namesList.unshift( name );
190 }
191 }
192
193 for ( var iterationLimit = elementsList.length, index = 0; index < iterationLimit; index++ ) {
194 name = namesList[ index ];
195 var label = editor.lang.elementspath.eleTitle.replace( /%1/, name ),
196 item = pathItemTpl.output( {
197 id: idBase + index,
198 label: label,
199 text: name,
200 jsTitle: 'javascript:void(\'' + name + '\')', // jshint ignore:line
201 index: index,
202 keyDownFn: onKeyDownHandler,
203 clickFn: onClickHanlder
204 } );
205
206 html.unshift( item );
207 }
208
209 var space = getSpaceElement();
210 space.setHtml( html.join( '' ) + emptyHtml );
211 editor.fire( 'elementsPathUpdate', { space: space } );
212 } );
213
214 function empty() {
215 spaceElement && spaceElement.setHtml( emptyHtml );
216 delete elementsPath.list;
217 }
218
219 editor.on( 'readOnly', empty );
220 editor.on( 'contentDomUnload', empty );
221
222 editor.addCommand( 'elementsPathFocus', commands.toolbarFocus );
223 editor.setKeystroke( CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' );
224 }
225} )();
226
227/**
228 * Fired when the contents of the elementsPath are changed.
229 *
230 * @event elementsPathUpdate
231 * @member CKEDITOR.editor
232 * @param {CKEDITOR.editor} editor This editor instance.
233 * @param data
234 * @param {CKEDITOR.dom.element} data.space The elementsPath container.
235 */
diff --git a/sources/plugins/enterkey/plugin.js b/sources/plugins/enterkey/plugin.js
new file mode 100644
index 00000000..883aea44
--- /dev/null
+++ b/sources/plugins/enterkey/plugin.js
@@ -0,0 +1,566 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 CKEDITOR.plugins.add( 'enterkey', {
8 init: function( editor ) {
9 editor.addCommand( 'enter', {
10 modes: { wysiwyg: 1 },
11 editorFocus: false,
12 exec: function( editor ) {
13 enter( editor );
14 }
15 } );
16
17 editor.addCommand( 'shiftEnter', {
18 modes: { wysiwyg: 1 },
19 editorFocus: false,
20 exec: function( editor ) {
21 shiftEnter( editor );
22 }
23 } );
24
25 editor.setKeystroke( [
26 [ 13, 'enter' ],
27 [ CKEDITOR.SHIFT + 13, 'shiftEnter' ]
28 ] );
29 }
30 } );
31
32 var whitespaces = CKEDITOR.dom.walker.whitespaces(),
33 bookmark = CKEDITOR.dom.walker.bookmark();
34
35 CKEDITOR.plugins.enterkey = {
36 enterBlock: function( editor, mode, range, forceMode ) {
37 // Get the range for the current selection.
38 range = range || getRange( editor );
39
40 // We may not have valid ranges to work on, like when inside a
41 // contenteditable=false element.
42 if ( !range )
43 return;
44
45 // When range is in nested editable, we have to replace range with this one,
46 // which have root property set to closest editable, to make auto paragraphing work. (#12162)
47 range = replaceRangeWithClosestEditableRoot( range );
48
49 var doc = range.document;
50
51 var atBlockStart = range.checkStartOfBlock(),
52 atBlockEnd = range.checkEndOfBlock(),
53 path = editor.elementPath( range.startContainer ),
54 block = path.block,
55
56 // Determine the block element to be used.
57 blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' ),
58
59 newBlock;
60
61 // Exit the list when we're inside an empty list item block. (#5376)
62 if ( atBlockStart && atBlockEnd ) {
63 // Exit the list when we're inside an empty list item block. (#5376)
64 if ( block && ( block.is( 'li' ) || block.getParent().is( 'li' ) ) ) {
65 // Make sure to point to the li when dealing with empty list item.
66 if ( !block.is( 'li' ) )
67 block = block.getParent();
68
69 var blockParent = block.getParent(),
70 blockGrandParent = blockParent.getParent(),
71
72 firstChild = !block.hasPrevious(),
73 lastChild = !block.hasNext(),
74
75 selection = editor.getSelection(),
76 bookmarks = selection.createBookmarks(),
77
78 orgDir = block.getDirection( 1 ),
79 className = block.getAttribute( 'class' ),
80 style = block.getAttribute( 'style' ),
81 dirLoose = blockGrandParent.getDirection( 1 ) != orgDir,
82
83 enterMode = editor.enterMode,
84 needsBlock = enterMode != CKEDITOR.ENTER_BR || dirLoose || style || className,
85
86 child;
87
88 if ( blockGrandParent.is( 'li' ) ) {
89
90 // If block is the first or the last child of the parent
91 // list, degrade it and move to the outer list:
92 // before the parent list if block is first child and after
93 // the parent list if block is the last child, respectively.
94 //
95 // <ul> => <ul>
96 // <li> => <li>
97 // <ul> => <ul>
98 // <li>x</li> => <li>x</li>
99 // <li>^</li> => </ul>
100 // </ul> => </li>
101 // </li> => <li>^</li>
102 // </ul> => </ul>
103 //
104 // AND
105 //
106 // <ul> => <ul>
107 // <li> => <li>^</li>
108 // <ul> => <li>
109 // <li>^</li> => <ul>
110 // <li>x</li> => <li>x</li>
111 // </ul> => </ul>
112 // </li> => </li>
113 // </ul> => </ul>
114
115 if ( firstChild || lastChild ) {
116
117 // If it's only child, we don't want to keep perent ul anymore.
118 if ( firstChild && lastChild ) {
119 blockParent.remove();
120 }
121
122 block[lastChild ? 'insertAfter' : 'insertBefore']( blockGrandParent );
123
124 // If the empty block is neither first nor last child
125 // then split the list and the block as an element
126 // of outer list.
127 //
128 // => <ul>
129 // => <li>
130 // <ul> => <ul>
131 // <li> => <li>x</li>
132 // <ul> => </ul>
133 // <li>x</li> => </li>
134 // <li>^</li> => <li>^</li>
135 // <li>y</li> => <li>
136 // </ul> => <ul>
137 // </li> => <li>y</li>
138 // </ul> => </ul>
139 // => </li>
140 // => </ul>
141
142 } else {
143 block.breakParent( blockGrandParent );
144 }
145 }
146
147 else if ( !needsBlock ) {
148 block.appendBogus( true );
149
150 // If block is the first or last child of the parent
151 // list, move all block's children out of the list:
152 // before the list if block is first child and after the list
153 // if block is the last child, respectively.
154 //
155 // <ul> => <ul>
156 // <li>x</li> => <li>x</li>
157 // <li>^</li> => </ul>
158 // </ul> => ^
159 //
160 // AND
161 //
162 // <ul> => ^
163 // <li>^</li> => <ul>
164 // <li>x</li> => <li>x</li>
165 // </ul> => </ul>
166
167 if ( firstChild || lastChild ) {
168 while ( ( child = block[ firstChild ? 'getFirst' : 'getLast' ]() ) )
169 child[ firstChild ? 'insertBefore' : 'insertAfter' ]( blockParent );
170 }
171
172 // If the empty block is neither first nor last child
173 // then split the list and put all the block contents
174 // between two lists.
175 //
176 // <ul> => <ul>
177 // <li>x</li> => <li>x</li>
178 // <li>^</li> => </ul>
179 // <li>y</li> => ^
180 // </ul> => <ul>
181 // => <li>y</li>
182 // => </ul>
183
184 else {
185 block.breakParent( blockParent );
186
187 while ( ( child = block.getLast() ) )
188 child.insertAfter( blockParent );
189 }
190
191 block.remove();
192 } else {
193 // Original path block is the list item, create new block for the list item content.
194 if ( path.block.is( 'li' ) ) {
195 // Use <div> block for ENTER_BR and ENTER_DIV.
196 newBlock = doc.createElement( mode == CKEDITOR.ENTER_P ? 'p' : 'div' );
197
198 if ( dirLoose )
199 newBlock.setAttribute( 'dir', orgDir );
200
201 style && newBlock.setAttribute( 'style', style );
202 className && newBlock.setAttribute( 'class', className );
203
204 // Move all the child nodes to the new block.
205 block.moveChildren( newBlock );
206 }
207 // The original path block is not a list item, just copy the block to out side of the list.
208 else {
209 newBlock = path.block;
210 }
211
212 // If block is the first or last child of the parent
213 // list, move it out of the list:
214 // before the list if block is first child and after the list
215 // if block is the last child, respectively.
216 //
217 // <ul> => <ul>
218 // <li>x</li> => <li>x</li>
219 // <li>^</li> => </ul>
220 // </ul> => <p>^</p>
221 //
222 // AND
223 //
224 // <ul> => <p>^</p>
225 // <li>^</li> => <ul>
226 // <li>x</li> => <li>x</li>
227 // </ul> => </ul>
228
229 if ( firstChild || lastChild )
230 newBlock[ firstChild ? 'insertBefore' : 'insertAfter' ]( blockParent );
231
232 // If the empty block is neither first nor last child
233 // then split the list and put the new block between
234 // two lists.
235 //
236 // => <ul>
237 // <ul> => <li>x</li>
238 // <li>x</li> => </ul>
239 // <li>^</li> => <p>^</p>
240 // <li>y</li> => <ul>
241 // </ul> => <li>y</li>
242 // => </ul>
243
244 else {
245 block.breakParent( blockParent );
246 newBlock.insertAfter( blockParent );
247 }
248
249 block.remove();
250 }
251
252 selection.selectBookmarks( bookmarks );
253
254 return;
255 }
256
257 if ( block && block.getParent().is( 'blockquote' ) ) {
258 block.breakParent( block.getParent() );
259
260 // If we were at the start of <blockquote>, there will be an empty element before it now.
261 if ( !block.getPrevious().getFirst( CKEDITOR.dom.walker.invisible( 1 ) ) )
262 block.getPrevious().remove();
263
264 // If we were at the end of <blockquote>, there will be an empty element after it now.
265 if ( !block.getNext().getFirst( CKEDITOR.dom.walker.invisible( 1 ) ) )
266 block.getNext().remove();
267
268 range.moveToElementEditStart( block );
269 range.select();
270 return;
271 }
272 }
273 // Don't split <pre> if we're in the middle of it, act as shift enter key.
274 else if ( block && block.is( 'pre' ) ) {
275 if ( !atBlockEnd ) {
276 enterBr( editor, mode, range, forceMode );
277 return;
278 }
279 }
280
281 // Split the range.
282 var splitInfo = range.splitBlock( blockTag );
283
284 if ( !splitInfo )
285 return;
286
287 // Get the current blocks.
288 var previousBlock = splitInfo.previousBlock,
289 nextBlock = splitInfo.nextBlock;
290
291 var isStartOfBlock = splitInfo.wasStartOfBlock,
292 isEndOfBlock = splitInfo.wasEndOfBlock;
293
294 var node;
295
296 // If this is a block under a list item, split it as well. (#1647)
297 if ( nextBlock ) {
298 node = nextBlock.getParent();
299 if ( node.is( 'li' ) ) {
300 nextBlock.breakParent( node );
301 nextBlock.move( nextBlock.getNext(), 1 );
302 }
303 } else if ( previousBlock && ( node = previousBlock.getParent() ) && node.is( 'li' ) ) {
304 previousBlock.breakParent( node );
305 node = previousBlock.getNext();
306 range.moveToElementEditStart( node );
307 previousBlock.move( previousBlock.getPrevious() );
308 }
309
310 // If we have both the previous and next blocks, it means that the
311 // boundaries were on separated blocks, or none of them where on the
312 // block limits (start/end).
313 if ( !isStartOfBlock && !isEndOfBlock ) {
314 // If the next block is an <li> with another list tree as the first
315 // child, we'll need to append a filler (<br>/NBSP) or the list item
316 // wouldn't be editable. (#1420)
317 if ( nextBlock.is( 'li' ) ) {
318 var walkerRange = range.clone();
319 walkerRange.selectNodeContents( nextBlock );
320 var walker = new CKEDITOR.dom.walker( walkerRange );
321 walker.evaluator = function( node ) {
322 return !( bookmark( node ) || whitespaces( node ) || node.type == CKEDITOR.NODE_ELEMENT && node.getName() in CKEDITOR.dtd.$inline && !( node.getName() in CKEDITOR.dtd.$empty ) );
323 };
324
325 node = walker.next();
326 if ( node && node.type == CKEDITOR.NODE_ELEMENT && node.is( 'ul', 'ol' ) )
327 ( CKEDITOR.env.needsBrFiller ? doc.createElement( 'br' ) : doc.createText( '\xa0' ) ).insertBefore( node );
328 }
329
330 // Move the selection to the end block.
331 if ( nextBlock )
332 range.moveToElementEditStart( nextBlock );
333 } else {
334 var newBlockDir;
335
336 if ( previousBlock ) {
337 // Do not enter this block if it's a header tag, or we are in
338 // a Shift+Enter (#77). Create a new block element instead
339 // (later in the code).
340 if ( previousBlock.is( 'li' ) || !( headerTagRegex.test( previousBlock.getName() ) || previousBlock.is( 'pre' ) ) ) {
341 // Otherwise, duplicate the previous block.
342 newBlock = previousBlock.clone();
343 }
344 } else if ( nextBlock ) {
345 newBlock = nextBlock.clone();
346 }
347
348 if ( !newBlock ) {
349 // We have already created a new list item. (#6849)
350 if ( node && node.is( 'li' ) )
351 newBlock = node;
352 else {
353 newBlock = doc.createElement( blockTag );
354 if ( previousBlock && ( newBlockDir = previousBlock.getDirection() ) )
355 newBlock.setAttribute( 'dir', newBlockDir );
356 }
357 }
358 // Force the enter block unless we're talking of a list item.
359 else if ( forceMode && !newBlock.is( 'li' ) ) {
360 newBlock.renameNode( blockTag );
361 }
362
363 // Recreate the inline elements tree, which was available
364 // before hitting enter, so the same styles will be available in
365 // the new block.
366 var elementPath = splitInfo.elementPath;
367 if ( elementPath ) {
368 for ( var i = 0, len = elementPath.elements.length; i < len; i++ ) {
369 var element = elementPath.elements[ i ];
370
371 if ( element.equals( elementPath.block ) || element.equals( elementPath.blockLimit ) )
372 break;
373
374 if ( CKEDITOR.dtd.$removeEmpty[ element.getName() ] ) {
375 element = element.clone();
376 newBlock.moveChildren( element );
377 newBlock.append( element );
378 }
379 }
380 }
381
382 newBlock.appendBogus();
383
384 if ( !newBlock.getParent() )
385 range.insertNode( newBlock );
386
387 // list item start number should not be duplicated (#7330), but we need
388 // to remove the attribute after it's onto the DOM tree because of old IEs (#7581).
389 newBlock.is( 'li' ) && newBlock.removeAttribute( 'value' );
390
391 // This is tricky, but to make the new block visible correctly
392 // we must select it.
393 // The previousBlock check has been included because it may be
394 // empty if we have fixed a block-less space (like ENTER into an
395 // empty table cell).
396 if ( CKEDITOR.env.ie && isStartOfBlock && ( !isEndOfBlock || !previousBlock.getChildCount() ) ) {
397 // Move the selection to the new block.
398 range.moveToElementEditStart( isEndOfBlock ? previousBlock : newBlock );
399 range.select();
400 }
401
402 // Move the selection to the new block.
403 range.moveToElementEditStart( isStartOfBlock && !isEndOfBlock ? nextBlock : newBlock );
404 }
405
406 range.select();
407 range.scrollIntoView();
408 },
409
410 enterBr: function( editor, mode, range, forceMode ) {
411 // Get the range for the current selection.
412 range = range || getRange( editor );
413
414 // We may not have valid ranges to work on, like when inside a
415 // contenteditable=false element.
416 if ( !range )
417 return;
418
419 var doc = range.document;
420
421 var isEndOfBlock = range.checkEndOfBlock();
422
423 var elementPath = new CKEDITOR.dom.elementPath( editor.getSelection().getStartElement() );
424
425 var startBlock = elementPath.block,
426 startBlockTag = startBlock && elementPath.block.getName();
427
428 if ( !forceMode && startBlockTag == 'li' ) {
429 enterBlock( editor, mode, range, forceMode );
430 return;
431 }
432
433 // If we are at the end of a header block.
434 if ( !forceMode && isEndOfBlock && headerTagRegex.test( startBlockTag ) ) {
435 var newBlock, newBlockDir;
436
437 if ( ( newBlockDir = startBlock.getDirection() ) ) {
438 newBlock = doc.createElement( 'div' );
439 newBlock.setAttribute( 'dir', newBlockDir );
440 newBlock.insertAfter( startBlock );
441 range.setStart( newBlock, 0 );
442 } else {
443 // Insert a <br> after the current paragraph.
444 doc.createElement( 'br' ).insertAfter( startBlock );
445
446 // A text node is required by Gecko only to make the cursor blink.
447 if ( CKEDITOR.env.gecko )
448 doc.createText( '' ).insertAfter( startBlock );
449
450 // IE has different behaviors regarding position.
451 range.setStartAt( startBlock.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START );
452 }
453 } else {
454 var lineBreak;
455
456 // IE<8 prefers text node as line-break inside of <pre> (#4711).
457 if ( startBlockTag == 'pre' && CKEDITOR.env.ie && CKEDITOR.env.version < 8 )
458 lineBreak = doc.createText( '\r' );
459 else
460 lineBreak = doc.createElement( 'br' );
461
462 range.deleteContents();
463 range.insertNode( lineBreak );
464
465 // Old IEs have different behavior regarding position.
466 if ( !CKEDITOR.env.needsBrFiller )
467 range.setStartAt( lineBreak, CKEDITOR.POSITION_AFTER_END );
468 else {
469 // A text node is required by Gecko only to make the cursor blink.
470 // We need some text inside of it, so the bogus <br> is properly
471 // created.
472 doc.createText( '\ufeff' ).insertAfter( lineBreak );
473
474 // If we are at the end of a block, we must be sure the bogus node is available in that block.
475 if ( isEndOfBlock ) {
476 // In most situations we've got an elementPath.block (e.g. <p>), but in a
477 // blockless editor or when autoP is false that needs to be a block limit.
478 ( startBlock || elementPath.blockLimit ).appendBogus();
479 }
480
481 // Now we can remove the text node contents, so the caret doesn't
482 // stop on it.
483 lineBreak.getNext().$.nodeValue = '';
484
485 range.setStartAt( lineBreak.getNext(), CKEDITOR.POSITION_AFTER_START );
486
487 }
488 }
489
490 // This collapse guarantees the cursor will be blinking.
491 range.collapse( true );
492
493 range.select();
494 range.scrollIntoView();
495 }
496 };
497
498 var plugin = CKEDITOR.plugins.enterkey,
499 enterBr = plugin.enterBr,
500 enterBlock = plugin.enterBlock,
501 headerTagRegex = /^h[1-6]$/;
502
503 function shiftEnter( editor ) {
504 // On SHIFT+ENTER:
505 // 1. We want to enforce the mode to be respected, instead
506 // of cloning the current block. (#77)
507 return enter( editor, editor.activeShiftEnterMode, 1 );
508 }
509
510 function enter( editor, mode, forceMode ) {
511 forceMode = editor.config.forceEnterMode || forceMode;
512
513 // Only effective within document.
514 if ( editor.mode != 'wysiwyg' )
515 return;
516
517 if ( !mode )
518 mode = editor.activeEnterMode;
519
520 // TODO this should be handled by setting editor.activeEnterMode on selection change.
521 // Check path block specialities:
522 // 1. Cannot be a un-splittable element, e.g. table caption;
523 var path = editor.elementPath();
524 if ( !path.isContextFor( 'p' ) ) {
525 mode = CKEDITOR.ENTER_BR;
526 forceMode = 1;
527 }
528
529 editor.fire( 'saveSnapshot' ); // Save undo step.
530
531 if ( mode == CKEDITOR.ENTER_BR )
532 enterBr( editor, mode, null, forceMode );
533 else
534 enterBlock( editor, mode, null, forceMode );
535
536 editor.fire( 'saveSnapshot' );
537 }
538
539 function getRange( editor ) {
540 // Get the selection ranges.
541 var ranges = editor.getSelection().getRanges( true );
542
543 // Delete the contents of all ranges except the first one.
544 for ( var i = ranges.length - 1; i > 0; i-- ) {
545 ranges[ i ].deleteContents();
546 }
547
548 // Return the first range.
549 return ranges[ 0 ];
550 }
551
552 function replaceRangeWithClosestEditableRoot( range ) {
553 var closestEditable = range.startContainer.getAscendant( function( node ) {
554 return node.type == CKEDITOR.NODE_ELEMENT && node.getAttribute( 'contenteditable' ) == 'true';
555 }, true );
556
557 if ( range.root.equals( closestEditable ) ) {
558 return range;
559 } else {
560 var newRange = new CKEDITOR.dom.range( closestEditable );
561
562 newRange.moveToRange( range );
563 return newRange;
564 }
565 }
566} )();
diff --git a/sources/plugins/enterkey/samples/enterkey.html b/sources/plugins/enterkey/samples/enterkey.html
new file mode 100644
index 00000000..82a3124c
--- /dev/null
+++ b/sources/plugins/enterkey/samples/enterkey.html
@@ -0,0 +1,106 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>ENTER Key Configuration &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <link href="../../../samples/old/sample.css" rel="stylesheet">
12 <meta name="ckeditor-sample-name" content="Using the &quot;Enter&quot; key in CKEditor">
13 <meta name="ckeditor-sample-group" content="Advanced Samples">
14 <meta name="ckeditor-sample-description" content="Configuring the behavior of &lt;em&gt;Enter&lt;/em&gt; and &lt;em&gt;Shift+Enter&lt;/em&gt; keys.">
15 <script>
16
17 var editor;
18
19 function changeEnter() {
20 // If we already have an editor, let's destroy it first.
21 if ( editor )
22 editor.destroy( true );
23
24 // Create the editor again, with the appropriate settings.
25 editor = CKEDITOR.replace( 'editor1', {
26 extraPlugins: 'enterkey',
27 enterMode: Number( document.getElementById( 'xEnter' ).value ),
28 shiftEnterMode: Number( document.getElementById( 'xShiftEnter' ).value )
29 });
30 }
31
32 window.onload = changeEnter;
33
34 </script>
35</head>
36<body>
37 <h1 class="samples">
38 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; ENTER Key Configuration
39 </h1>
40 <div class="warning deprecated">
41 This sample is not maintained anymore. Check out its <a href="http://sdk.ckeditor.com/samples/enterkey.html">brand new version in CKEditor SDK</a>.
42 </div>
43 <div class="description">
44 <p>
45 This sample shows how to configure the <em>Enter</em> and <em>Shift+Enter</em> keys
46 to perform actions specified in the
47 <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode"><code>enterMode</code></a>
48 and <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode"><code>shiftEnterMode</code></a>
49 parameters, respectively.
50 You can choose from the following options:
51 </p>
52 <ul class="samples">
53 <li><strong><code>ENTER_P</code></strong> &ndash; new <code>&lt;p&gt;</code> paragraphs are created;</li>
54 <li><strong><code>ENTER_BR</code></strong> &ndash; lines are broken with <code>&lt;br&gt;</code> elements;</li>
55 <li><strong><code>ENTER_DIV</code></strong> &ndash; new <code>&lt;div&gt;</code> blocks are created.</li>
56 </ul>
57 <p>
58 The sample code below shows how to configure CKEditor to create a <code>&lt;div&gt;</code> block when <em>Enter</em> key is pressed.
59 </p>
60<pre class="samples">
61CKEDITOR.replace( '<em>textarea_id</em>', {
62 <strong>enterMode: CKEDITOR.ENTER_DIV</strong>
63});</pre>
64 <p>
65 Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
66 the <code>&lt;textarea&gt;</code> element to be replaced.
67 </p>
68 </div>
69 <div style="float: left; margin-right: 20px">
70 When <em>Enter</em> is pressed:<br>
71 <select id="xEnter" onchange="changeEnter();">
72 <option selected="selected" value="1">Create a new &lt;P&gt; (recommended)</option>
73 <option value="3">Create a new &lt;DIV&gt;</option>
74 <option value="2">Break the line with a &lt;BR&gt;</option>
75 </select>
76 </div>
77 <div style="float: left">
78 When <em>Shift+Enter</em> is pressed:<br>
79 <select id="xShiftEnter" onchange="changeEnter();">
80 <option value="1">Create a new &lt;P&gt;</option>
81 <option value="3">Create a new &lt;DIV&gt;</option>
82 <option selected="selected" value="2">Break the line with a &lt;BR&gt; (recommended)</option>
83 </select>
84 </div>
85 <br style="clear: both">
86 <form action="../../../samples/sample_posteddata.php" method="post">
87 <p>
88 <br>
89 <textarea cols="80" id="editor1" name="editor1" rows="10">This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.</textarea>
90 </p>
91 <p>
92 <input type="submit" value="Submit">
93 </p>
94 </form>
95 <div id="footer">
96 <hr>
97 <p>
98 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
99 </p>
100 <p id="copy">
101 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
102 Knabben. All rights reserved.
103 </p>
104 </div>
105</body>
106</html>
diff --git a/sources/plugins/entities/plugin.js b/sources/plugins/entities/plugin.js
new file mode 100644
index 00000000..70993e15
--- /dev/null
+++ b/sources/plugins/entities/plugin.js
@@ -0,0 +1,239 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 // Basic HTML entities.
8 var htmlbase = 'nbsp,gt,lt,amp';
9
10 var entities =
11 // Latin-1 entities
12 'quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,' +
13 'not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,' +
14 'cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,' +
15
16 // Symbols
17 'fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,' +
18 'alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,' +
19 'forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,' +
20 'radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,' +
21 'equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,' +
22 'rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,' +
23
24 // Other special characters
25 'circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,' +
26 'rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,' +
27 'euro';
28
29 // Latin letters entities
30 var latin = 'Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,' +
31 'Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,' +
32 'Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,' +
33 'agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,' +
34 'ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,' +
35 'otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,' +
36 'OElig,oelig,Scaron,scaron,Yuml';
37
38 // Greek letters entities.
39 var greek = 'Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,' +
40 'Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,' +
41 'beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,' +
42 'omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,' +
43 'upsih,piv';
44
45 // Create a mapping table between one character and its entity form from a list of entity names.
46 // @param reverse {Boolean} Whether to create a reverse map from the entity string form to an actual character.
47 function buildTable( entities, reverse ) {
48 var table = {},
49 regex = [];
50
51 // Entities that the browsers' DOM does not automatically transform to the
52 // final character.
53 var specialTable = {
54 nbsp: '\u00A0', // IE | FF
55 shy: '\u00AD', // IE
56 gt: '\u003E', // IE | FF | -- | Opera
57 lt: '\u003C', // IE | FF | Safari | Opera
58 amp: '\u0026', // ALL
59 apos: '\u0027', // IE
60 quot: '\u0022' // IE
61 };
62
63 entities = entities.replace( /\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g, function( match, entity ) {
64 var org = reverse ? '&' + entity + ';' : specialTable[ entity ],
65 result = reverse ? specialTable[ entity ] : '&' + entity + ';';
66
67 table[ org ] = result;
68 regex.push( org );
69 return '';
70 } );
71
72 if ( !reverse && entities ) {
73 // Transforms the entities string into an array.
74 entities = entities.split( ',' );
75
76 // Put all entities inside a DOM element, transforming them to their
77 // final characters.
78 var div = document.createElement( 'div' ),
79 chars;
80 div.innerHTML = '&' + entities.join( ';&' ) + ';';
81 chars = div.innerHTML;
82 div = null;
83
84 // Add all characters to the table.
85 for ( var i = 0; i < chars.length; i++ ) {
86 var charAt = chars.charAt( i );
87 table[ charAt ] = '&' + entities[ i ] + ';';
88 regex.push( charAt );
89 }
90 }
91
92 table.regex = regex.join( reverse ? '|' : '' );
93
94 return table;
95 }
96
97 CKEDITOR.plugins.add( 'entities', {
98 afterInit: function( editor ) {
99 var config = editor.config;
100
101 function getChar( character ) {
102 return baseEntitiesTable[ character ];
103 }
104
105 function getEntity( character ) {
106 return config.entities_processNumerical == 'force' || !entitiesTable[ character ] ? '&#' + character.charCodeAt( 0 ) + ';'
107 : entitiesTable[ character ];
108 }
109
110 var dataProcessor = editor.dataProcessor,
111 htmlFilter = dataProcessor && dataProcessor.htmlFilter;
112
113 if ( htmlFilter ) {
114 // Mandatory HTML basic entities.
115 var selectedEntities = [];
116
117 if ( config.basicEntities !== false )
118 selectedEntities.push( htmlbase );
119
120 if ( config.entities ) {
121 if ( selectedEntities.length )
122 selectedEntities.push( entities );
123
124 if ( config.entities_latin )
125 selectedEntities.push( latin );
126
127 if ( config.entities_greek )
128 selectedEntities.push( greek );
129
130 if ( config.entities_additional )
131 selectedEntities.push( config.entities_additional );
132 }
133
134 var entitiesTable = buildTable( selectedEntities.join( ',' ) );
135
136 // Create the Regex used to find entities in the text, leave it matches nothing if entities are empty.
137 var entitiesRegex = entitiesTable.regex ? '[' + entitiesTable.regex + ']' : 'a^';
138 delete entitiesTable.regex;
139
140 if ( config.entities && config.entities_processNumerical )
141 entitiesRegex = '[^ -~]|' + entitiesRegex;
142
143 entitiesRegex = new RegExp( entitiesRegex, 'g' );
144
145 // Decode entities that the browsers has transformed
146 // at first place.
147 var baseEntitiesTable = buildTable( [ htmlbase, 'shy' ].join( ',' ), true ),
148 baseEntitiesRegex = new RegExp( baseEntitiesTable.regex, 'g' );
149
150 htmlFilter.addRules( {
151 text: function( text ) {
152 return text.replace( baseEntitiesRegex, getChar ).replace( entitiesRegex, getEntity );
153 }
154 }, {
155 applyToAll: true,
156 excludeNestedEditable: true
157 } );
158 }
159 }
160 } );
161} )();
162
163/**
164 * Whether to escape basic HTML entities in the document, including:
165 *
166 * * `&nbsp;`
167 * * `&gt;`
168 * * `&lt;`
169 * * `&amp;`
170 *
171 * **Note:** This option should not be changed unless when outputting a non-HTML data format like BBCode.
172 *
173 * config.basicEntities = false;
174 *
175 * @cfg {Boolean} [basicEntities=true]
176 * @member CKEDITOR.config
177 */
178CKEDITOR.config.basicEntities = true;
179
180/**
181 * Whether to use HTML entities in the editor output.
182 *
183 * config.entities = false;
184 *
185 * @cfg {Boolean} [entities=true]
186 * @member CKEDITOR.config
187 */
188CKEDITOR.config.entities = true;
189
190/**
191 * Whether to convert some Latin characters (Latin alphabet No. 1, ISO 8859-1)
192 * to HTML entities. The list of entities can be found in the
193 * [W3C HTML 4.01 Specification, section 24.2.1](http://www.w3.org/TR/html4/sgml/entities.html#h-24.2.1).
194 *
195 * config.entities_latin = false;
196 *
197 * @cfg {Boolean} [entities_latin=true]
198 * @member CKEDITOR.config
199 */
200CKEDITOR.config.entities_latin = true;
201
202/**
203 * Whether to convert some symbols, mathematical symbols, and Greek letters to
204 * HTML entities. This may be more relevant for users typing text written in Greek.
205 * The list of entities can be found in the
206 * [W3C HTML 4.01 Specification, section 24.3.1](http://www.w3.org/TR/html4/sgml/entities.html#h-24.3.1).
207 *
208 * config.entities_greek = false;
209 *
210 * @cfg {Boolean} [entities_greek=true]
211 * @member CKEDITOR.config
212 */
213CKEDITOR.config.entities_greek = true;
214
215/**
216 * Whether to convert all remaining characters not included in the ASCII
217 * character table to their relative decimal numeric representation of HTML entity.
218 * When set to `force`, it will convert all entities into this format.
219 *
220 * For example the phrase: `'This is Chinese: 汉语.'` would be output
221 * as: `'This is Chinese: &#27721;&#35821;.'`
222 *
223 * config.entities_processNumerical = true;
224 * config.entities_processNumerical = 'force'; // Converts from '&nbsp;' into '&#160;';
225 *
226 * @cfg {Boolean/String} [entities_processNumerical=false]
227 * @member CKEDITOR.config
228 */
229
230/**
231 * A comma-separated list of additional entities to be used. Entity names
232 * or numbers must be used in a form that excludes the `'&amp;'` prefix and the `';'` ending.
233 *
234 * config.entities_additional = '#1049'; // Adds Cyrillic capital letter Short I (Й).
235 *
236 * @cfg {String} [entities_additional='#39' (The single quote (') character)]
237 * @member CKEDITOR.config
238 */
239CKEDITOR.config.entities_additional = '#39';
diff --git a/sources/plugins/fakeobjects/lang/af.js b/sources/plugins/fakeobjects/lang/af.js
new file mode 100644
index 00000000..785c7244
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/af.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'af', {
6 anchor: 'Anker',
7 flash: 'Flash animasie',
8 hiddenfield: 'Verborge veld',
9 iframe: 'IFrame',
10 unknown: 'Onbekende objek'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ar.js b/sources/plugins/fakeobjects/lang/ar.js
new file mode 100644
index 00000000..3c828614
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ar.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ar', {
6 anchor: 'إرساء',
7 flash: 'رسم متحرك بالفلاش',
8 hiddenfield: 'إدراج حقل خفي',
9 iframe: 'iframe',
10 unknown: 'عنصر غير معروف'
11} );
diff --git a/sources/plugins/fakeobjects/lang/bg.js b/sources/plugins/fakeobjects/lang/bg.js
new file mode 100644
index 00000000..f358b55b
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/bg.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'bg', {
6 anchor: 'Кука',
7 flash: 'Флаш анимация',
8 hiddenfield: 'Скрито поле',
9 iframe: 'IFrame',
10 unknown: 'Неизвестен обект'
11} );
diff --git a/sources/plugins/fakeobjects/lang/bn.js b/sources/plugins/fakeobjects/lang/bn.js
new file mode 100644
index 00000000..190f6014
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/bn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'bn', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/bs.js b/sources/plugins/fakeobjects/lang/bs.js
new file mode 100644
index 00000000..a44bc373
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/bs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'bs', {
6 anchor: 'Anchor',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/ca.js b/sources/plugins/fakeobjects/lang/ca.js
new file mode 100644
index 00000000..549e86cd
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ca', {
6 anchor: 'Àncora',
7 flash: 'Animació Flash',
8 hiddenfield: 'Camp ocult',
9 iframe: 'IFrame',
10 unknown: 'Objecte desconegut'
11} );
diff --git a/sources/plugins/fakeobjects/lang/cs.js b/sources/plugins/fakeobjects/lang/cs.js
new file mode 100644
index 00000000..44fbc826
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/cs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'cs', {
6 anchor: 'Záložka',
7 flash: 'Flash animace',
8 hiddenfield: 'Skryté pole',
9 iframe: 'IFrame',
10 unknown: 'Neznámý objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/cy.js b/sources/plugins/fakeobjects/lang/cy.js
new file mode 100644
index 00000000..5d4c97d6
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/cy.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'cy', {
6 anchor: 'Angor',
7 flash: 'Animeiddiant Flash',
8 hiddenfield: 'Maes Cudd',
9 iframe: 'IFrame',
10 unknown: 'Gwrthrych Anhysbys'
11} );
diff --git a/sources/plugins/fakeobjects/lang/da.js b/sources/plugins/fakeobjects/lang/da.js
new file mode 100644
index 00000000..5609ae01
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/da.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'da', {
6 anchor: 'Anker',
7 flash: 'Flashanimation',
8 hiddenfield: 'Skjult felt',
9 iframe: 'Iframe',
10 unknown: 'Ukendt objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/de.js b/sources/plugins/fakeobjects/lang/de.js
new file mode 100644
index 00000000..d7917d33
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/de.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'de', {
6 anchor: 'Anker',
7 flash: 'Flash-Animation',
8 hiddenfield: 'Verstecktes Feld',
9 iframe: 'IFrame',
10 unknown: 'Unbekanntes Objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/el.js b/sources/plugins/fakeobjects/lang/el.js
new file mode 100644
index 00000000..91a4fcb8
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/el.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'el', {
6 anchor: 'Άγκυρα',
7 flash: 'Ταινία Flash',
8 hiddenfield: 'Κρυφό Πεδίο',
9 iframe: 'IFrame',
10 unknown: 'Άγνωστο Αντικείμενο'
11} );
diff --git a/sources/plugins/fakeobjects/lang/en-au.js b/sources/plugins/fakeobjects/lang/en-au.js
new file mode 100644
index 00000000..89dc70a1
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/en-au.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'en-au', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/en-ca.js b/sources/plugins/fakeobjects/lang/en-ca.js
new file mode 100644
index 00000000..fb0ef9d3
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/en-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'en-ca', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/en-gb.js b/sources/plugins/fakeobjects/lang/en-gb.js
new file mode 100644
index 00000000..f57465da
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/en-gb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'en-gb', {
6 anchor: 'Anchor',
7 flash: 'Flash Animation',
8 hiddenfield: 'Hidden Field',
9 iframe: 'IFrame',
10 unknown: 'Unknown Object'
11} );
diff --git a/sources/plugins/fakeobjects/lang/en.js b/sources/plugins/fakeobjects/lang/en.js
new file mode 100644
index 00000000..4893575c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/en.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'en', {
6 anchor: 'Anchor',
7 flash: 'Flash Animation',
8 hiddenfield: 'Hidden Field',
9 iframe: 'IFrame',
10 unknown: 'Unknown Object'
11} );
diff --git a/sources/plugins/fakeobjects/lang/eo.js b/sources/plugins/fakeobjects/lang/eo.js
new file mode 100644
index 00000000..e717b63c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/eo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'eo', {
6 anchor: 'Ankro',
7 flash: 'FlaŝAnimacio',
8 hiddenfield: 'Kaŝita kampo',
9 iframe: 'Enlinia Kadro (IFrame)',
10 unknown: 'Nekonata objekto'
11} );
diff --git a/sources/plugins/fakeobjects/lang/es.js b/sources/plugins/fakeobjects/lang/es.js
new file mode 100644
index 00000000..396e8652
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/es.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'es', {
6 anchor: 'Ancla',
7 flash: 'Animación flash',
8 hiddenfield: 'Campo oculto',
9 iframe: 'IFrame',
10 unknown: 'Objeto desconocido'
11} );
diff --git a/sources/plugins/fakeobjects/lang/et.js b/sources/plugins/fakeobjects/lang/et.js
new file mode 100644
index 00000000..17a33bce
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/et.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'et', {
6 anchor: 'Ankur',
7 flash: 'Flashi animatsioon',
8 hiddenfield: 'Varjatud väli',
9 iframe: 'IFrame',
10 unknown: 'Tundmatu objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/eu.js b/sources/plugins/fakeobjects/lang/eu.js
new file mode 100644
index 00000000..4997482b
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/eu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'eu', {
6 anchor: 'Aingura',
7 flash: 'Flash animazioa',
8 hiddenfield: 'Ezkutuko eremua',
9 iframe: 'IFrame-a',
10 unknown: 'Objektu ezezaguna'
11} );
diff --git a/sources/plugins/fakeobjects/lang/fa.js b/sources/plugins/fakeobjects/lang/fa.js
new file mode 100644
index 00000000..31267454
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/fa.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'fa', {
6 anchor: 'لنگر',
7 flash: 'انیمشن فلش',
8 hiddenfield: 'فیلد پنهان',
9 iframe: 'IFrame',
10 unknown: 'شیء ناشناخته'
11} );
diff --git a/sources/plugins/fakeobjects/lang/fi.js b/sources/plugins/fakeobjects/lang/fi.js
new file mode 100644
index 00000000..f2a620df
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/fi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'fi', {
6 anchor: 'Ankkuri',
7 flash: 'Flash animaatio',
8 hiddenfield: 'Piilokenttä',
9 iframe: 'IFrame-kehys',
10 unknown: 'Tuntematon objekti'
11} );
diff --git a/sources/plugins/fakeobjects/lang/fo.js b/sources/plugins/fakeobjects/lang/fo.js
new file mode 100644
index 00000000..beefb6e2
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/fo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'fo', {
6 anchor: 'Anchor',
7 flash: 'Flash Animation',
8 hiddenfield: 'Fjaldur teigur',
9 iframe: 'IFrame',
10 unknown: 'Ókent Object'
11} );
diff --git a/sources/plugins/fakeobjects/lang/fr-ca.js b/sources/plugins/fakeobjects/lang/fr-ca.js
new file mode 100644
index 00000000..047442b1
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/fr-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'fr-ca', {
6 anchor: 'Ancre',
7 flash: 'Animation Flash',
8 hiddenfield: 'Champ caché',
9 iframe: 'IFrame',
10 unknown: 'Objet inconnu'
11} );
diff --git a/sources/plugins/fakeobjects/lang/fr.js b/sources/plugins/fakeobjects/lang/fr.js
new file mode 100644
index 00000000..faa3edcf
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/fr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'fr', {
6 anchor: 'Ancre',
7 flash: 'Animation Flash',
8 hiddenfield: 'Champ caché',
9 iframe: 'IFrame',
10 unknown: 'Objet inconnu'
11} );
diff --git a/sources/plugins/fakeobjects/lang/gl.js b/sources/plugins/fakeobjects/lang/gl.js
new file mode 100644
index 00000000..12810d48
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/gl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'gl', {
6 anchor: 'Ancoraxe',
7 flash: 'Animación «Flash»',
8 hiddenfield: 'Campo agochado',
9 iframe: 'IFrame',
10 unknown: 'Obxecto descoñecido'
11} );
diff --git a/sources/plugins/fakeobjects/lang/gu.js b/sources/plugins/fakeobjects/lang/gu.js
new file mode 100644
index 00000000..00d29dc3
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/gu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'gu', {
6 anchor: 'અનકર',
7 flash: 'ફ્લેશ ',
8 hiddenfield: 'હિડન ',
9 iframe: 'IFrame',
10 unknown: 'અનનોન ઓબ્જેક્ટ'
11} );
diff --git a/sources/plugins/fakeobjects/lang/he.js b/sources/plugins/fakeobjects/lang/he.js
new file mode 100644
index 00000000..3ea757c1
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/he.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'he', {
6 anchor: 'עוגן',
7 flash: 'סרטון פלאש',
8 hiddenfield: 'שדה חבוי',
9 iframe: 'חלון פנימי (iframe)',
10 unknown: 'אובייקט לא ידוע'
11} );
diff --git a/sources/plugins/fakeobjects/lang/hi.js b/sources/plugins/fakeobjects/lang/hi.js
new file mode 100644
index 00000000..38265b21
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/hi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'hi', {
6 anchor: 'ऐंकर इन्सर्ट/संपादन',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'गुप्त फ़ील्ड',
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/hr.js b/sources/plugins/fakeobjects/lang/hr.js
new file mode 100644
index 00000000..67ad8686
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/hr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'hr', {
6 anchor: 'Sidro',
7 flash: 'Flash animacija',
8 hiddenfield: 'Sakriveno polje',
9 iframe: 'IFrame',
10 unknown: 'Nepoznati objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/hu.js b/sources/plugins/fakeobjects/lang/hu.js
new file mode 100644
index 00000000..d6c5600c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/hu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'hu', {
6 anchor: 'Horgony',
7 flash: 'Flash animáció',
8 hiddenfield: 'Rejtett mezõ',
9 iframe: 'IFrame',
10 unknown: 'Ismeretlen objektum'
11} );
diff --git a/sources/plugins/fakeobjects/lang/id.js b/sources/plugins/fakeobjects/lang/id.js
new file mode 100644
index 00000000..388a6596
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/id.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'id', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Animasi Flash',
8 hiddenfield: 'Kolom Tersembunyi',
9 iframe: 'IFrame',
10 unknown: 'Obyek Tak Dikenal'
11} );
diff --git a/sources/plugins/fakeobjects/lang/is.js b/sources/plugins/fakeobjects/lang/is.js
new file mode 100644
index 00000000..cd93b235
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/is.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'is', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/it.js b/sources/plugins/fakeobjects/lang/it.js
new file mode 100644
index 00000000..fee1cdd5
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/it.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'it', {
6 anchor: 'Ancora',
7 flash: 'Animazione Flash',
8 hiddenfield: 'Campo Nascosto',
9 iframe: 'IFrame',
10 unknown: 'Oggetto sconosciuto'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ja.js b/sources/plugins/fakeobjects/lang/ja.js
new file mode 100644
index 00000000..dd26aa4c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ja.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ja', {
6 anchor: 'アンカー',
7 flash: 'Flash Animation',
8 hiddenfield: '不可視フィールド',
9 iframe: 'IFrame',
10 unknown: 'Unknown Object'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ka.js b/sources/plugins/fakeobjects/lang/ka.js
new file mode 100644
index 00000000..d59f7415
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ka.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ka', {
6 anchor: 'ღუზა',
7 flash: 'Flash ანიმაცია',
8 hiddenfield: 'მალული ველი',
9 iframe: 'IFrame',
10 unknown: 'უცნობი ობიექტი'
11} );
diff --git a/sources/plugins/fakeobjects/lang/km.js b/sources/plugins/fakeobjects/lang/km.js
new file mode 100644
index 00000000..d8b8ee7f
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/km.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'km', {
6 anchor: 'យុថ្កា',
7 flash: 'Flash មាន​ចលនា',
8 hiddenfield: 'វាល​កំបាំង',
9 iframe: 'IFrame',
10 unknown: 'វត្ថុ​មិន​ស្គាល់'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ko.js b/sources/plugins/fakeobjects/lang/ko.js
new file mode 100644
index 00000000..13aace3a
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ko.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ko', {
6 anchor: '책갈피',
7 flash: '플래시 애니메이션',
8 hiddenfield: '숨은 입력 칸',
9 iframe: '아이프레임',
10 unknown: '알 수 없는 객체'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ku.js b/sources/plugins/fakeobjects/lang/ku.js
new file mode 100644
index 00000000..a24d1374
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ku.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ku', {
6 anchor: 'لەنگەر',
7 flash: 'فلاش',
8 hiddenfield: 'شاردنەوەی خانه',
9 iframe: 'لەچوارچێوە',
10 unknown: 'بەرکارێکی نەناسراو'
11} );
diff --git a/sources/plugins/fakeobjects/lang/lt.js b/sources/plugins/fakeobjects/lang/lt.js
new file mode 100644
index 00000000..d9dc3746
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/lt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'lt', {
6 anchor: 'Žymė',
7 flash: 'Flash animacija',
8 hiddenfield: 'Paslėptas laukas',
9 iframe: 'IFrame',
10 unknown: 'Nežinomas objektas'
11} );
diff --git a/sources/plugins/fakeobjects/lang/lv.js b/sources/plugins/fakeobjects/lang/lv.js
new file mode 100644
index 00000000..50dca340
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/lv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'lv', {
6 anchor: 'Iezīme',
7 flash: 'Flash animācija',
8 hiddenfield: 'Slēpts lauks',
9 iframe: 'Iframe',
10 unknown: 'Nezināms objekts'
11} );
diff --git a/sources/plugins/fakeobjects/lang/mk.js b/sources/plugins/fakeobjects/lang/mk.js
new file mode 100644
index 00000000..bf48a97c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/mk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'mk', {
6 anchor: 'Anchor',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/mn.js b/sources/plugins/fakeobjects/lang/mn.js
new file mode 100644
index 00000000..a4af5551
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/mn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'mn', {
6 anchor: 'Зангуу',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Нууц талбар',
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/ms.js b/sources/plugins/fakeobjects/lang/ms.js
new file mode 100644
index 00000000..0c210bed
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ms.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ms', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/nb.js b/sources/plugins/fakeobjects/lang/nb.js
new file mode 100644
index 00000000..3969f02c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/nb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'nb', {
6 anchor: 'Anker',
7 flash: 'Flash-animasjon',
8 hiddenfield: 'Skjult felt',
9 iframe: 'IFrame',
10 unknown: 'Ukjent objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/nl.js b/sources/plugins/fakeobjects/lang/nl.js
new file mode 100644
index 00000000..4eebd778
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/nl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'nl', {
6 anchor: 'Interne link',
7 flash: 'Flash animatie',
8 hiddenfield: 'Verborgen veld',
9 iframe: 'IFrame',
10 unknown: 'Onbekend object'
11} );
diff --git a/sources/plugins/fakeobjects/lang/no.js b/sources/plugins/fakeobjects/lang/no.js
new file mode 100644
index 00000000..d4d208a7
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/no.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'no', {
6 anchor: 'Anker',
7 flash: 'Flash-animasjon',
8 hiddenfield: 'Skjult felt',
9 iframe: 'IFrame',
10 unknown: 'Ukjent objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/pl.js b/sources/plugins/fakeobjects/lang/pl.js
new file mode 100644
index 00000000..a002b0c5
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/pl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'pl', {
6 anchor: 'Kotwica',
7 flash: 'Animacja Flash',
8 hiddenfield: 'Pole ukryte',
9 iframe: 'IFrame',
10 unknown: 'Nieznany obiekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/pt-br.js b/sources/plugins/fakeobjects/lang/pt-br.js
new file mode 100644
index 00000000..07f807d8
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/pt-br.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'pt-br', {
6 anchor: 'Âncora',
7 flash: 'Animação em Flash',
8 hiddenfield: 'Campo Oculto',
9 iframe: 'IFrame',
10 unknown: 'Objeto desconhecido'
11} );
diff --git a/sources/plugins/fakeobjects/lang/pt.js b/sources/plugins/fakeobjects/lang/pt.js
new file mode 100644
index 00000000..cb82ae4a
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/pt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'pt', {
6 anchor: ' Inserir/Editar Âncora',
7 flash: 'Animação Flash',
8 hiddenfield: 'Campo oculto',
9 iframe: 'IFrame',
10 unknown: 'Objeto Desconhecido'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ro.js b/sources/plugins/fakeobjects/lang/ro.js
new file mode 100644
index 00000000..7abffa6c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ro.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ro', {
6 anchor: 'Inserează/Editează ancoră',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Câmp ascuns (HiddenField)',
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/ru.js b/sources/plugins/fakeobjects/lang/ru.js
new file mode 100644
index 00000000..302ce959
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ru.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ru', {
6 anchor: 'Якорь',
7 flash: 'Flash анимация',
8 hiddenfield: 'Скрытое поле',
9 iframe: 'iFrame',
10 unknown: 'Неизвестный объект'
11} );
diff --git a/sources/plugins/fakeobjects/lang/si.js b/sources/plugins/fakeobjects/lang/si.js
new file mode 100644
index 00000000..bd11014a
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/si.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'si', {
6 anchor: 'ආධාරය',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'සැඟවුණු ප්‍රදේශය',
9 iframe: 'IFrame',
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/sk.js b/sources/plugins/fakeobjects/lang/sk.js
new file mode 100644
index 00000000..03bf62c3
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/sk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'sk', {
6 anchor: 'Kotva',
7 flash: 'Flash animácia',
8 hiddenfield: 'Skryté pole',
9 iframe: 'IFrame',
10 unknown: 'Neznámy objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/sl.js b/sources/plugins/fakeobjects/lang/sl.js
new file mode 100644
index 00000000..65315467
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/sl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'sl', {
6 anchor: 'Sidro',
7 flash: 'Flash animacija',
8 hiddenfield: 'Skrito polje',
9 iframe: 'IFrame',
10 unknown: 'Neznan objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/sq.js b/sources/plugins/fakeobjects/lang/sq.js
new file mode 100644
index 00000000..c493a66f
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/sq.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'sq', {
6 anchor: 'Spirancë',
7 flash: 'Objekt flash',
8 hiddenfield: 'Fushë e fshehur',
9 iframe: 'IFrame',
10 unknown: 'Objekt i Panjohur'
11} );
diff --git a/sources/plugins/fakeobjects/lang/sr-latn.js b/sources/plugins/fakeobjects/lang/sr-latn.js
new file mode 100644
index 00000000..b42ffb00
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/sr-latn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'sr-latn', {
6 anchor: 'Unesi/izmeni sidro',
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Skriveno polje',
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/sr.js b/sources/plugins/fakeobjects/lang/sr.js
new file mode 100644
index 00000000..20394853
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/sr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'sr', {
6 anchor: 'Anchor', // MISSING
7 flash: 'Flash Animation', // MISSING
8 hiddenfield: 'Hidden Field', // MISSING
9 iframe: 'IFrame', // MISSING
10 unknown: 'Unknown Object' // MISSING
11} );
diff --git a/sources/plugins/fakeobjects/lang/sv.js b/sources/plugins/fakeobjects/lang/sv.js
new file mode 100644
index 00000000..a0c6e290
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/sv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'sv', {
6 anchor: 'Ankare',
7 flash: 'Flashanimation',
8 hiddenfield: 'Gömt fält',
9 iframe: 'iFrame',
10 unknown: 'Okänt objekt'
11} );
diff --git a/sources/plugins/fakeobjects/lang/th.js b/sources/plugins/fakeobjects/lang/th.js
new file mode 100644
index 00000000..a2b217dc
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/th.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'th', {
6 anchor: 'แทรก/แก้ไข Anchor',
7 flash: 'ภาพอนิเมชั่นแฟลช',
8 hiddenfield: 'ฮิดเดนฟิลด์',
9 iframe: 'IFrame',
10 unknown: 'วัตถุไม่ทราบชนิด'
11} );
diff --git a/sources/plugins/fakeobjects/lang/tr.js b/sources/plugins/fakeobjects/lang/tr.js
new file mode 100644
index 00000000..fd2718a8
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/tr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'tr', {
6 anchor: 'Bağlantı',
7 flash: 'Flash Animasyonu',
8 hiddenfield: 'Gizli Alan',
9 iframe: 'IFrame',
10 unknown: 'Bilinmeyen Nesne'
11} );
diff --git a/sources/plugins/fakeobjects/lang/tt.js b/sources/plugins/fakeobjects/lang/tt.js
new file mode 100644
index 00000000..b999f09c
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/tt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'tt', {
6 anchor: 'Якорь',
7 flash: 'Флеш анимациясы',
8 hiddenfield: 'Яшерен кыр',
9 iframe: 'IFrame',
10 unknown: 'Танылмаган объект'
11} );
diff --git a/sources/plugins/fakeobjects/lang/ug.js b/sources/plugins/fakeobjects/lang/ug.js
new file mode 100644
index 00000000..9ed5b0a9
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/ug.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'ug', {
6 anchor: 'لەڭگەرلىك نۇقتا',
7 flash: 'Flash جانلاندۇرۇم',
8 hiddenfield: 'يوشۇرۇن دائىرە',
9 iframe: 'IFrame',
10 unknown: 'يوچۇن نەڭ'
11} );
diff --git a/sources/plugins/fakeobjects/lang/uk.js b/sources/plugins/fakeobjects/lang/uk.js
new file mode 100644
index 00000000..93f16493
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/uk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'uk', {
6 anchor: 'Якір',
7 flash: 'Flash-анімація',
8 hiddenfield: 'Приховані Поля',
9 iframe: 'IFrame',
10 unknown: 'Невідомий об\'єкт'
11} );
diff --git a/sources/plugins/fakeobjects/lang/vi.js b/sources/plugins/fakeobjects/lang/vi.js
new file mode 100644
index 00000000..c7dd7331
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/vi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'vi', {
6 anchor: 'Điểm neo',
7 flash: 'Flash',
8 hiddenfield: 'Trường ẩn',
9 iframe: 'IFrame',
10 unknown: 'Đối tượng không rõ ràng'
11} );
diff --git a/sources/plugins/fakeobjects/lang/zh-cn.js b/sources/plugins/fakeobjects/lang/zh-cn.js
new file mode 100644
index 00000000..dbcc9786
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/zh-cn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'zh-cn', {
6 anchor: '锚点',
7 flash: 'Flash 动画',
8 hiddenfield: '隐藏域',
9 iframe: 'IFrame',
10 unknown: '未知对象'
11} );
diff --git a/sources/plugins/fakeobjects/lang/zh.js b/sources/plugins/fakeobjects/lang/zh.js
new file mode 100644
index 00000000..535424ac
--- /dev/null
+++ b/sources/plugins/fakeobjects/lang/zh.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'fakeobjects', 'zh', {
6 anchor: '錨點',
7 flash: 'Flash 動畫',
8 hiddenfield: '隱藏欄位',
9 iframe: 'IFrame',
10 unknown: '無法辨識的物件'
11} );
diff --git a/sources/plugins/fakeobjects/plugin.js b/sources/plugins/fakeobjects/plugin.js
new file mode 100644
index 00000000..c0008970
--- /dev/null
+++ b/sources/plugins/fakeobjects/plugin.js
@@ -0,0 +1,183 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var cssStyle = CKEDITOR.htmlParser.cssStyle,
8 cssLength = CKEDITOR.tools.cssLength;
9
10 var cssLengthRegex = /^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i;
11
12 // Replacing the former CSS length value with the later one, with
13 // adjustment to the length unit.
14 function replaceCssLength( length1, length2 ) {
15 var parts1 = cssLengthRegex.exec( length1 ),
16 parts2 = cssLengthRegex.exec( length2 );
17
18 // Omit pixel length unit when necessary,
19 // e.g. replaceCssLength( 10, '20px' ) -> 20
20 if ( parts1 ) {
21 if ( !parts1[ 2 ] && parts2[ 2 ] == 'px' )
22 return parts2[ 1 ];
23 if ( parts1[ 2 ] == 'px' && !parts2[ 2 ] )
24 return parts2[ 1 ] + 'px';
25 }
26
27 return length2;
28 }
29
30 var htmlFilterRules = {
31 elements: {
32 $: function( element ) {
33 var attributes = element.attributes,
34 realHtml = attributes && attributes[ 'data-cke-realelement' ],
35 realFragment = realHtml && new CKEDITOR.htmlParser.fragment.fromHtml( decodeURIComponent( realHtml ) ),
36 realElement = realFragment && realFragment.children[ 0 ];
37
38 // Width/height in the fake object are subjected to clone into the real element.
39 if ( realElement && element.attributes[ 'data-cke-resizable' ] ) {
40 var styles = new cssStyle( element ).rules,
41 realAttrs = realElement.attributes,
42 width = styles.width,
43 height = styles.height;
44
45 width && ( realAttrs.width = replaceCssLength( realAttrs.width, width ) );
46 height && ( realAttrs.height = replaceCssLength( realAttrs.height, height ) );
47 }
48
49 return realElement;
50 }
51 }
52 };
53
54 CKEDITOR.plugins.add( 'fakeobjects', {
55 // jscs:disable maximumLineLength
56 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
57 // jscs:enable maximumLineLength
58
59 init: function( editor ) {
60 // Allow image with all styles and classes plus src, alt and title attributes.
61 // We need them when fakeobject is pasted.
62 editor.filter.allow( 'img[!data-cke-realelement,src,alt,title](*){*}', 'fakeobjects' );
63 },
64
65 afterInit: function( editor ) {
66 var dataProcessor = editor.dataProcessor,
67 htmlFilter = dataProcessor && dataProcessor.htmlFilter;
68
69 if ( htmlFilter ) {
70 htmlFilter.addRules( htmlFilterRules, {
71 applyToAll: true
72 } );
73 }
74 }
75 } );
76
77 /**
78 * @member CKEDITOR.editor
79 * @todo
80 */
81 CKEDITOR.editor.prototype.createFakeElement = function( realElement, className, realElementType, isResizable ) {
82 var lang = this.lang.fakeobjects,
83 label = lang[ realElementType ] || lang.unknown;
84
85 var attributes = {
86 'class': className,
87 'data-cke-realelement': encodeURIComponent( realElement.getOuterHtml() ),
88 'data-cke-real-node-type': realElement.type,
89 alt: label,
90 title: label,
91 align: realElement.getAttribute( 'align' ) || ''
92 };
93
94 // Do not set "src" on high-contrast so the alt text is displayed. (#8945)
95 if ( !CKEDITOR.env.hc )
96 attributes.src = CKEDITOR.tools.transparentImageData;
97
98 if ( realElementType )
99 attributes[ 'data-cke-real-element-type' ] = realElementType;
100
101 if ( isResizable ) {
102 attributes[ 'data-cke-resizable' ] = isResizable;
103
104 var fakeStyle = new cssStyle();
105
106 var width = realElement.getAttribute( 'width' ),
107 height = realElement.getAttribute( 'height' );
108
109 width && ( fakeStyle.rules.width = cssLength( width ) );
110 height && ( fakeStyle.rules.height = cssLength( height ) );
111 fakeStyle.populate( attributes );
112 }
113
114 return this.document.createElement( 'img', { attributes: attributes } );
115 };
116
117 /**
118 * @member CKEDITOR.editor
119 * @todo
120 */
121 CKEDITOR.editor.prototype.createFakeParserElement = function( realElement, className, realElementType, isResizable ) {
122 var lang = this.lang.fakeobjects,
123 label = lang[ realElementType ] || lang.unknown,
124 html;
125
126 var writer = new CKEDITOR.htmlParser.basicWriter();
127 realElement.writeHtml( writer );
128 html = writer.getHtml();
129
130 var attributes = {
131 'class': className,
132 'data-cke-realelement': encodeURIComponent( html ),
133 'data-cke-real-node-type': realElement.type,
134 alt: label,
135 title: label,
136 align: realElement.attributes.align || ''
137 };
138
139 // Do not set "src" on high-contrast so the alt text is displayed. (#8945)
140 if ( !CKEDITOR.env.hc )
141 attributes.src = CKEDITOR.tools.transparentImageData;
142
143 if ( realElementType )
144 attributes[ 'data-cke-real-element-type' ] = realElementType;
145
146 if ( isResizable ) {
147 attributes[ 'data-cke-resizable' ] = isResizable;
148 var realAttrs = realElement.attributes,
149 fakeStyle = new cssStyle();
150
151 var width = realAttrs.width,
152 height = realAttrs.height;
153
154 width !== undefined && ( fakeStyle.rules.width = cssLength( width ) );
155 height !== undefined && ( fakeStyle.rules.height = cssLength( height ) );
156 fakeStyle.populate( attributes );
157 }
158
159 return new CKEDITOR.htmlParser.element( 'img', attributes );
160 };
161
162 /**
163 * @member CKEDITOR.editor
164 * @todo
165 */
166 CKEDITOR.editor.prototype.restoreRealElement = function( fakeElement ) {
167 if ( fakeElement.data( 'cke-real-node-type' ) != CKEDITOR.NODE_ELEMENT )
168 return null;
169
170 var element = CKEDITOR.dom.element.createFromHtml( decodeURIComponent( fakeElement.data( 'cke-realelement' ) ), this.document );
171
172 if ( fakeElement.data( 'cke-resizable' ) ) {
173 var width = fakeElement.getStyle( 'width' ),
174 height = fakeElement.getStyle( 'height' );
175
176 width && element.setAttribute( 'width', replaceCssLength( element.getAttribute( 'width' ), width ) );
177 height && element.setAttribute( 'height', replaceCssLength( element.getAttribute( 'height' ), height ) );
178 }
179
180 return element;
181 };
182
183} )();
diff --git a/sources/plugins/filebrowser/plugin.js b/sources/plugins/filebrowser/plugin.js
new file mode 100644
index 00000000..1fd9f22e
--- /dev/null
+++ b/sources/plugins/filebrowser/plugin.js
@@ -0,0 +1,573 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "filebrowser" plugin that adds support for file uploads and
8 * browsing.
9 *
10 * When a file is uploaded or selected inside the file browser, its URL is
11 * inserted automatically into a field defined in the <code>filebrowser</code>
12 * attribute. In order to specify a field that should be updated, pass the tab ID and
13 * the element ID, separated with a colon.<br /><br />
14 *
15 * <strong>Example 1: (Browse)</strong>
16 *
17 * <pre>
18 * {
19 * type : 'button',
20 * id : 'browse',
21 * filebrowser : 'tabId:elementId',
22 * label : editor.lang.common.browseServer
23 * }
24 * </pre>
25 *
26 * If you set the <code>filebrowser</code> attribute for an element other than
27 * the <code>fileButton</code>, the <code>Browse</code> action will be triggered.<br /><br />
28 *
29 * <strong>Example 2: (Quick Upload)</strong>
30 *
31 * <pre>
32 * {
33 * type : 'fileButton',
34 * id : 'uploadButton',
35 * filebrowser : 'tabId:elementId',
36 * label : editor.lang.common.uploadSubmit,
37 * 'for' : [ 'upload', 'upload' ]
38 * }
39 * </pre>
40 *
41 * If you set the <code>filebrowser</code> attribute for a <code>fileButton</code>
42 * element, the <code>QuickUpload</code> action will be executed.<br /><br />
43 *
44 * The filebrowser plugin also supports more advanced configuration performed through
45 * a JavaScript object.
46 *
47 * The following settings are supported:
48 *
49 * <ul>
50 * <li><code>action</code> &ndash; <code>Browse</code> or <code>QuickUpload</code>.</li>
51 * <li><code>target</code> &ndash; the field to update in the <code><em>tabId:elementId</em></code> format.</li>
52 * <li><code>params</code> &ndash; additional arguments to be passed to the server connector (optional).</li>
53 * <li><code>onSelect</code> &ndash; a function to execute when the file is selected/uploaded (optional).</li>
54 * <li><code>url</code> &ndash; the URL to be called (optional).</li>
55 * </ul>
56 *
57 * <strong>Example 3: (Quick Upload)</strong>
58 *
59 * <pre>
60 * {
61 * type : 'fileButton',
62 * label : editor.lang.common.uploadSubmit,
63 * id : 'buttonId',
64 * filebrowser :
65 * {
66 * action : 'QuickUpload', // required
67 * target : 'tab1:elementId', // required
68 * params : // optional
69 * {
70 * type : 'Files',
71 * currentFolder : '/folder/'
72 * },
73 * onSelect : function( fileUrl, errorMessage ) // optional
74 * {
75 * // Do not call the built-in selectFuntion.
76 * // return false;
77 * }
78 * },
79 * 'for' : [ 'tab1', 'myFile' ]
80 * }
81 * </pre>
82 *
83 * Suppose you have a file element with an ID of <code>myFile</code>, a text
84 * field with an ID of <code>elementId</code> and a <code>fileButton</code>.
85 * If the <code>filebowser.url</code> attribute is not specified explicitly,
86 * the form action will be set to <code>filebrowser[<em>DialogWindowName</em>]UploadUrl</code>
87 * or, if not specified, to <code>filebrowserUploadUrl</code>. Additional parameters
88 * from the <code>params</code> object will be added to the query string. It is
89 * possible to create your own <code>uploadHandler</code> and cancel the built-in
90 * <code>updateTargetElement</code> command.<br /><br />
91 *
92 * <strong>Example 4: (Browse)</strong>
93 *
94 * <pre>
95 * {
96 * type : 'button',
97 * id : 'buttonId',
98 * label : editor.lang.common.browseServer,
99 * filebrowser :
100 * {
101 * action : 'Browse',
102 * url : '/ckfinder/ckfinder.html&amp;type=Images',
103 * target : 'tab1:elementId'
104 * }
105 * }
106 * </pre>
107 *
108 * In this example, when the button is pressed, the file browser will be opened in a
109 * popup window. If you do not specify the <code>filebrowser.url</code> attribute,
110 * <code>filebrowser[<em>DialogName</em>]BrowseUrl</code> or
111 * <code>filebrowserBrowseUrl</code> will be used. After selecting a file in the file
112 * browser, an element with an ID of <code>elementId</code> will be updated. Just
113 * like in the third example, a custom <code>onSelect</code> function may be defined.
114 */
115
116( function() {
117 // Default input element name for CSRF protection token.
118 var TOKEN_INPUT_NAME = 'ckCsrfToken';
119
120 // Adds (additional) arguments to given url.
121 //
122 // @param {String}
123 // url The url.
124 // @param {Object}
125 // params Additional parameters.
126 function addQueryString( url, params ) {
127 var queryString = [];
128
129 if ( !params )
130 return url;
131 else {
132 for ( var i in params )
133 queryString.push( i + '=' + encodeURIComponent( params[ i ] ) );
134 }
135
136 return url + ( ( url.indexOf( '?' ) != -1 ) ? '&' : '?' ) + queryString.join( '&' );
137 }
138
139 // Make a string's first character uppercase.
140 //
141 // @param {String}
142 // str String.
143 function ucFirst( str ) {
144 str += '';
145 var f = str.charAt( 0 ).toUpperCase();
146 return f + str.substr( 1 );
147 }
148
149 // The onlick function assigned to the 'Browse Server' button. Opens the
150 // file browser and updates target field when file is selected.
151 //
152 // @param {CKEDITOR.event}
153 // evt The event object.
154 function browseServer() {
155 var dialog = this.getDialog();
156 var editor = dialog.getParentEditor();
157
158 editor._.filebrowserSe = this;
159
160 var width = editor.config[ 'filebrowser' + ucFirst( dialog.getName() ) + 'WindowWidth' ] || editor.config.filebrowserWindowWidth || '80%';
161 var height = editor.config[ 'filebrowser' + ucFirst( dialog.getName() ) + 'WindowHeight' ] || editor.config.filebrowserWindowHeight || '70%';
162
163 var params = this.filebrowser.params || {};
164 params.CKEditor = editor.name;
165 params.CKEditorFuncNum = editor._.filebrowserFn;
166 if ( !params.langCode )
167 params.langCode = editor.langCode;
168
169 var url = addQueryString( this.filebrowser.url, params );
170 // TODO: V4: Remove backward compatibility (#8163).
171 editor.popup( url, width, height, editor.config.filebrowserWindowFeatures || editor.config.fileBrowserWindowFeatures );
172 }
173
174 // Appends token preventing CSRF attacks to the form of provided file input.
175 //
176 // @since 4.5.6
177 // @param {CKEDITOR.dom.element} fileInput
178 function appendToken( fileInput ) {
179 var tokenElement;
180 var form = new CKEDITOR.dom.element( fileInput.$.form );
181
182 if ( form ) {
183 // Check if token input element already exists.
184 tokenElement = form.$.elements[ TOKEN_INPUT_NAME ];
185
186 // Create new if needed.
187 if ( !tokenElement ) {
188 tokenElement = new CKEDITOR.dom.element( 'input' );
189 tokenElement.setAttributes( {
190 name: TOKEN_INPUT_NAME,
191 type: 'hidden'
192 } );
193
194 form.append( tokenElement );
195 } else {
196 tokenElement = new CKEDITOR.dom.element( tokenElement );
197 }
198
199 tokenElement.setAttribute( 'value', CKEDITOR.tools.getCsrfToken() );
200 }
201 }
202
203 // The onlick function assigned to the 'Upload' button. Makes the final
204 // decision whether form is really submitted and updates target field when
205 // file is uploaded.
206 //
207 // @param {CKEDITOR.event}
208 // evt The event object.
209 function uploadFile() {
210 var dialog = this.getDialog();
211 var editor = dialog.getParentEditor();
212
213 editor._.filebrowserSe = this;
214
215 // If user didn't select the file, stop the upload.
216 if ( !dialog.getContentElement( this[ 'for' ][ 0 ], this[ 'for' ][ 1 ] ).getInputElement().$.value )
217 return false;
218
219 if ( !dialog.getContentElement( this[ 'for' ][ 0 ], this[ 'for' ][ 1 ] ).getAction() )
220 return false;
221
222 return true;
223 }
224
225 // Setups the file element.
226 //
227 // @param {CKEDITOR.ui.dialog.file}
228 // fileInput The file element used during file upload.
229 // @param {Object}
230 // filebrowser Object containing filebrowser settings assigned to
231 // the fileButton associated with this file element.
232 function setupFileElement( editor, fileInput, filebrowser ) {
233 var params = filebrowser.params || {};
234 params.CKEditor = editor.name;
235 params.CKEditorFuncNum = editor._.filebrowserFn;
236 if ( !params.langCode )
237 params.langCode = editor.langCode;
238
239 fileInput.action = addQueryString( filebrowser.url, params );
240 fileInput.filebrowser = filebrowser;
241 }
242
243 // Traverse through the content definition and attach filebrowser to
244 // elements with 'filebrowser' attribute.
245 //
246 // @param String
247 // dialogName Dialog name.
248 // @param {CKEDITOR.dialog.definitionObject}
249 // definition Dialog definition.
250 // @param {Array}
251 // elements Array of {@link CKEDITOR.dialog.definition.content}
252 // objects.
253 function attachFileBrowser( editor, dialogName, definition, elements ) {
254 if ( !elements || !elements.length )
255 return;
256
257 var element;
258
259 for ( var i = elements.length; i--; ) {
260 element = elements[ i ];
261
262 if ( element.type == 'hbox' || element.type == 'vbox' || element.type == 'fieldset' )
263 attachFileBrowser( editor, dialogName, definition, element.children );
264
265 if ( !element.filebrowser )
266 continue;
267
268 if ( typeof element.filebrowser == 'string' ) {
269 var fb = {
270 action: ( element.type == 'fileButton' ) ? 'QuickUpload' : 'Browse',
271 target: element.filebrowser
272 };
273 element.filebrowser = fb;
274 }
275
276 if ( element.filebrowser.action == 'Browse' ) {
277 var url = element.filebrowser.url;
278 if ( url === undefined ) {
279 url = editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'BrowseUrl' ];
280 if ( url === undefined )
281 url = editor.config.filebrowserBrowseUrl;
282 }
283
284 if ( url ) {
285 element.onClick = browseServer;
286 element.filebrowser.url = url;
287 element.hidden = false;
288 }
289 } else if ( element.filebrowser.action == 'QuickUpload' && element[ 'for' ] ) {
290 url = element.filebrowser.url;
291 if ( url === undefined ) {
292 url = editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'UploadUrl' ];
293 if ( url === undefined )
294 url = editor.config.filebrowserUploadUrl;
295 }
296
297 if ( url ) {
298 var onClick = element.onClick;
299 element.onClick = function( evt ) {
300 // "element" here means the definition object, so we need to find the correct
301 // button to scope the event call
302 var sender = evt.sender;
303 if ( onClick && onClick.call( sender, evt ) === false )
304 return false;
305
306 if ( uploadFile.call( sender, evt ) ) {
307 var fileInput = sender.getDialog().getContentElement( this[ 'for' ][ 0 ], this[ 'for' ][ 1 ] ).getInputElement();
308
309 // Append token preventing CSRF attacks.
310 appendToken( fileInput );
311 return true;
312 }
313
314
315 return false;
316 };
317
318 element.filebrowser.url = url;
319 element.hidden = false;
320 setupFileElement( editor, definition.getContents( element[ 'for' ][ 0 ] ).get( element[ 'for' ][ 1 ] ), element.filebrowser );
321 }
322 }
323 }
324 }
325
326 // Updates the target element with the url of uploaded/selected file.
327 //
328 // @param {String}
329 // url The url of a file.
330 function updateTargetElement( url, sourceElement ) {
331 var dialog = sourceElement.getDialog();
332 var targetElement = sourceElement.filebrowser.target || null;
333
334 // If there is a reference to targetElement, update it.
335 if ( targetElement ) {
336 var target = targetElement.split( ':' );
337 var element = dialog.getContentElement( target[ 0 ], target[ 1 ] );
338 if ( element ) {
339 element.setValue( url );
340 dialog.selectPage( target[ 0 ] );
341 }
342 }
343 }
344
345 // Returns true if filebrowser is configured in one of the elements.
346 //
347 // @param {CKEDITOR.dialog.definitionObject}
348 // definition Dialog definition.
349 // @param String
350 // tabId The tab id where element(s) can be found.
351 // @param String
352 // elementId The element id (or ids, separated with a semicolon) to check.
353 function isConfigured( definition, tabId, elementId ) {
354 if ( elementId.indexOf( ';' ) !== -1 ) {
355 var ids = elementId.split( ';' );
356 for ( var i = 0; i < ids.length; i++ ) {
357 if ( isConfigured( definition, tabId, ids[ i ] ) )
358 return true;
359 }
360 return false;
361 }
362
363 var elementFileBrowser = definition.getContents( tabId ).get( elementId ).filebrowser;
364 return ( elementFileBrowser && elementFileBrowser.url );
365 }
366
367 function setUrl( fileUrl, data ) {
368 var dialog = this._.filebrowserSe.getDialog(),
369 targetInput = this._.filebrowserSe[ 'for' ],
370 onSelect = this._.filebrowserSe.filebrowser.onSelect;
371
372 if ( targetInput )
373 dialog.getContentElement( targetInput[ 0 ], targetInput[ 1 ] ).reset();
374
375 if ( typeof data == 'function' && data.call( this._.filebrowserSe ) === false )
376 return;
377
378 if ( onSelect && onSelect.call( this._.filebrowserSe, fileUrl, data ) === false )
379 return;
380
381 // The "data" argument may be used to pass the error message to the editor.
382 if ( typeof data == 'string' && data )
383 alert( data ); // jshint ignore:line
384
385 if ( fileUrl )
386 updateTargetElement( fileUrl, this._.filebrowserSe );
387 }
388
389 CKEDITOR.plugins.add( 'filebrowser', {
390 requires: 'popup',
391 init: function( editor ) {
392 editor._.filebrowserFn = CKEDITOR.tools.addFunction( setUrl, editor );
393 editor.on( 'destroy', function() {
394 CKEDITOR.tools.removeFunction( this._.filebrowserFn );
395 } );
396 }
397 } );
398
399 CKEDITOR.on( 'dialogDefinition', function( evt ) {
400 // We require filebrowser plugin to be loaded.
401 if ( !evt.editor.plugins.filebrowser )
402 return;
403
404 var definition = evt.data.definition,
405 element;
406 // Associate filebrowser to elements with 'filebrowser' attribute.
407 for ( var i = 0; i < definition.contents.length; ++i ) {
408 if ( ( element = definition.contents[ i ] ) ) {
409 attachFileBrowser( evt.editor, evt.data.name, definition, element.elements );
410 if ( element.hidden && element.filebrowser )
411 element.hidden = !isConfigured( definition, element.id, element.filebrowser );
412
413 }
414 }
415 } );
416
417} )();
418
419/**
420 * The location of an external file manager that should be launched when the **Browse Server**
421 * button is pressed. If configured, the **Browse Server** button will appear in the
422 * **Link**, **Image**, and **Flash** dialog windows.
423 *
424 * Read more in the [documentation](#!/guide/dev_file_browse_upload)
425 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
426 *
427 * config.filebrowserBrowseUrl = '/browser/browse.php';
428 *
429 * @since 3.0
430 * @cfg {String} [filebrowserBrowseUrl='' (empty string = disabled)]
431 * @member CKEDITOR.config
432 */
433
434/**
435 * The location of the script that handles file uploads.
436 * If set, the **Upload** tab will appear in the **Link**, **Image**,
437 * and **Flash** dialog windows.
438 *
439 * Read more in the [documentation](#!/guide/dev_file_browse_upload)
440 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
441 *
442 * config.filebrowserUploadUrl = '/uploader/upload.php';
443 *
444 * **Note:** This is a configuration setting for a [file browser/uploader](#!/guide/dev_file_browse_upload).
445 * To configure [uploading dropped or pasted files](#!/guide/dev_file_upload) use the {@link CKEDITOR.config#uploadUrl}
446 * configuration option.
447 *
448 * @since 3.0
449 * @cfg {String} [filebrowserUploadUrl='' (empty string = disabled)]
450 * @member CKEDITOR.config
451 */
452
453/**
454 * The location of an external file manager that should be launched when the **Browse Server**
455 * button is pressed in the **Image** dialog window.
456 *
457 * If not set, CKEditor will use {@link CKEDITOR.config#filebrowserBrowseUrl}.
458 *
459 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-adding-file-manager-scripts-for-selected-dialog-windows)
460 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
461 *
462 * config.filebrowserImageBrowseUrl = '/browser/browse.php?type=Images';
463 *
464 * @since 3.0
465 * @cfg {String} [filebrowserImageBrowseUrl='' (empty string = disabled)]
466 * @member CKEDITOR.config
467 */
468
469/**
470 * The location of an external file browser that should be launched when the **Browse Server**
471 * button is pressed in the **Flash** dialog window.
472 *
473 * If not set, CKEditor will use {@link CKEDITOR.config#filebrowserBrowseUrl}.
474 *
475 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-adding-file-manager-scripts-for-selected-dialog-windows)
476 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
477 *
478 * config.filebrowserFlashBrowseUrl = '/browser/browse.php?type=Flash';
479 *
480 * @since 3.0
481 * @cfg {String} [filebrowserFlashBrowseUrl='' (empty string = disabled)]
482 * @member CKEDITOR.config
483 */
484
485/**
486 * The location of the script that handles file uploads in the **Image** dialog window.
487 *
488 * If not set, CKEditor will use {@link CKEDITOR.config#filebrowserUploadUrl}.
489 *
490 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-adding-file-manager-scripts-for-selected-dialog-windows)
491 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
492 *
493 * config.filebrowserImageUploadUrl = '/uploader/upload.php?type=Images';
494 *
495 * **Note:** This is a configuration setting for a [file browser/uploader](#!/guide/dev_file_browse_upload).
496 * To configure [uploading dropped or pasted files](#!/guide/dev_file_upload) use the {@link CKEDITOR.config#uploadUrl}
497 * or {@link CKEDITOR.config#imageUploadUrl} configuration option.
498 *
499 * @since 3.0
500 * @cfg {String} [filebrowserImageUploadUrl='' (empty string = disabled)]
501 * @member CKEDITOR.config
502 */
503
504/**
505 * The location of the script that handles file uploads in the **Flash** dialog window.
506 *
507 * If not set, CKEditor will use {@link CKEDITOR.config#filebrowserUploadUrl}.
508 *
509 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-adding-file-manager-scripts-for-selected-dialog-windows)
510 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
511 *
512 * config.filebrowserFlashUploadUrl = '/uploader/upload.php?type=Flash';
513 *
514 * @since 3.0
515 * @cfg {String} filebrowserFlashUploadUrl='' (empty string = disabled)]
516 * @member CKEDITOR.config
517 */
518
519/**
520 * The location of an external file manager that should be launched when the **Browse Server**
521 * button is pressed in the **Link** tab of the **Image** dialog window.
522 *
523 * If not set, CKEditor will use {@link CKEDITOR.config#filebrowserBrowseUrl}.
524 *
525 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-adding-file-manager-scripts-for-selected-dialog-windows)
526 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
527 *
528 * config.filebrowserImageBrowseLinkUrl = '/browser/browse.php';
529 *
530 * @since 3.2
531 * @cfg {String} [filebrowserImageBrowseLinkUrl='' (empty string = disabled)]
532 * @member CKEDITOR.config
533 */
534
535/**
536 * The features to use in the file manager popup window.
537 *
538 * config.filebrowserWindowFeatures = 'resizable=yes,scrollbars=no';
539 *
540 * @since 3.4.1
541 * @cfg {String} [filebrowserWindowFeatures='location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes']
542 * @member CKEDITOR.config
543 */
544
545/**
546 * The width of the file manager popup window. It can be a number denoting a value in
547 * pixels or a percent string.
548 *
549 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-file-manager-window-size)
550 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
551 *
552 * config.filebrowserWindowWidth = 750;
553 *
554 * config.filebrowserWindowWidth = '50%';
555 *
556 * @cfg {Number/String} [filebrowserWindowWidth='80%']
557 * @member CKEDITOR.config
558 */
559
560/**
561 * The height of the file manager popup window. It can be a number denoting a value in
562 * pixels or a percent string.
563 *
564 * Read more in the [documentation](#!/guide/dev_file_manager_configuration-section-file-manager-window-size)
565 * and see the [SDK sample](http://sdk.ckeditor.com/samples/fileupload.html).
566 *
567 * config.filebrowserWindowHeight = 580;
568 *
569 * config.filebrowserWindowHeight = '50%';
570 *
571 * @cfg {Number/String} [filebrowserWindowHeight='70%']
572 * @member CKEDITOR.config
573 */
diff --git a/sources/plugins/find/dialogs/find.js b/sources/plugins/find/dialogs/find.js
new file mode 100644
index 00000000..f56ba963
--- /dev/null
+++ b/sources/plugins/find/dialogs/find.js
@@ -0,0 +1,802 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var isReplace;
8
9 function findEvaluator( node ) {
10 return node.type == CKEDITOR.NODE_TEXT && node.getLength() > 0 && ( !isReplace || !node.isReadOnly() );
11 }
12
13 // Elements which break characters been considered as sequence.
14 function nonCharactersBoundary( node ) {
15 return !( node.type == CKEDITOR.NODE_ELEMENT && node.isBlockBoundary( CKEDITOR.tools.extend( {}, CKEDITOR.dtd.$empty, CKEDITOR.dtd.$nonEditable ) ) );
16 }
17
18 // Get the cursor object which represent both current character and it's dom
19 // position thing.
20 var cursorStep = function() {
21 return {
22 textNode: this.textNode,
23 offset: this.offset,
24 character: this.textNode ? this.textNode.getText().charAt( this.offset ) : null,
25 hitMatchBoundary: this._.matchBoundary
26 };
27 };
28
29 var pages = [ 'find', 'replace' ],
30 fieldsMapping = [
31 [ 'txtFindFind', 'txtFindReplace' ],
32 [ 'txtFindCaseChk', 'txtReplaceCaseChk' ],
33 [ 'txtFindWordChk', 'txtReplaceWordChk' ],
34 [ 'txtFindCyclic', 'txtReplaceCyclic' ]
35 ];
36
37 // Synchronize corresponding filed values between 'replace' and 'find' pages.
38 // @param {String} currentPageId The page id which receive values.
39 function syncFieldsBetweenTabs( currentPageId ) {
40 var sourceIndex, targetIndex, sourceField, targetField;
41
42 sourceIndex = currentPageId === 'find' ? 1 : 0;
43 targetIndex = 1 - sourceIndex;
44 var i,
45 l = fieldsMapping.length;
46 for ( i = 0; i < l; i++ ) {
47 sourceField = this.getContentElement( pages[ sourceIndex ], fieldsMapping[ i ][ sourceIndex ] );
48 targetField = this.getContentElement( pages[ targetIndex ], fieldsMapping[ i ][ targetIndex ] );
49
50 targetField.setValue( sourceField.getValue() );
51 }
52 }
53
54 function findDialog( editor, startupPage ) {
55 // Style object for highlights: (#5018)
56 // 1. Defined as full match style to avoid compromising ordinary text color styles.
57 // 2. Must be apply onto inner-most text to avoid conflicting with ordinary text color styles visually.
58 var highlightConfig = {
59 attributes: {
60 'data-cke-highlight': 1
61 },
62 fullMatch: 1,
63 ignoreReadonly: 1,
64 childRule: function() {
65 return 0;
66 }
67 };
68 var highlightStyle = new CKEDITOR.style( CKEDITOR.tools.extend( highlightConfig, editor.config.find_highlight, true ) );
69
70 // Iterator which walk through the specified range char by char. By
71 // default the walking will not stop at the character boundaries, until
72 // the end of the range is encountered.
73 // @param { CKEDITOR.dom.range } range
74 // @param {Boolean} matchWord Whether the walking will stop at character boundary.
75 function characterWalker( range, matchWord ) {
76 var self = this;
77 var walker = new CKEDITOR.dom.walker( range );
78 walker.guard = matchWord ? nonCharactersBoundary : function( node ) {
79 !nonCharactersBoundary( node ) && ( self._.matchBoundary = true );
80 };
81 walker.evaluator = findEvaluator;
82 walker.breakOnFalse = 1;
83
84 if ( range.startContainer.type == CKEDITOR.NODE_TEXT ) {
85 this.textNode = range.startContainer;
86 this.offset = range.startOffset - 1;
87 }
88
89 this._ = {
90 matchWord: matchWord,
91 walker: walker,
92 matchBoundary: false
93 };
94 }
95
96 characterWalker.prototype = {
97 next: function() {
98 return this.move();
99 },
100
101 back: function() {
102 return this.move( true );
103 },
104
105 move: function( rtl ) {
106 var currentTextNode = this.textNode;
107 // Already at the end of document, no more character available.
108 if ( currentTextNode === null )
109 return cursorStep.call( this );
110
111 this._.matchBoundary = false;
112
113 // There are more characters in the text node, step forward.
114 if ( currentTextNode && rtl && this.offset > 0 ) {
115 this.offset--;
116 return cursorStep.call( this );
117 } else if ( currentTextNode && this.offset < currentTextNode.getLength() - 1 ) {
118 this.offset++;
119 return cursorStep.call( this );
120 } else {
121 currentTextNode = null;
122 // At the end of the text node, walking foward for the next.
123 while ( !currentTextNode ) {
124 currentTextNode = this._.walker[ rtl ? 'previous' : 'next' ].call( this._.walker );
125
126 // Stop searching if we're need full word match OR
127 // already reach document end.
128 if ( this._.matchWord && !currentTextNode || this._.walker._.end )
129 break;
130 }
131 // Found a fresh text node.
132 this.textNode = currentTextNode;
133 if ( currentTextNode )
134 this.offset = rtl ? currentTextNode.getLength() - 1 : 0;
135 else
136 this.offset = 0;
137 }
138
139 return cursorStep.call( this );
140 }
141
142 };
143
144 /**
145 * A range of cursors which represent a trunk of characters which try to
146 * match, it has the same length as the pattern string.
147 *
148 * **Note:** This class isn't accessible from global scope.
149 *
150 * @private
151 * @class CKEDITOR.plugins.find.characterRange
152 * @constructor Creates a characterRange class instance.
153 */
154 var characterRange = function( characterWalker, rangeLength ) {
155 this._ = {
156 walker: characterWalker,
157 cursors: [],
158 rangeLength: rangeLength,
159 highlightRange: null,
160 isMatched: 0
161 };
162 };
163
164 characterRange.prototype = {
165 /**
166 * Translate this range to {@link CKEDITOR.dom.range}.
167 */
168 toDomRange: function() {
169 var range = editor.createRange();
170 var cursors = this._.cursors;
171 if ( cursors.length < 1 ) {
172 var textNode = this._.walker.textNode;
173 if ( textNode )
174 range.setStartAfter( textNode );
175 else
176 return null;
177 } else {
178 var first = cursors[ 0 ],
179 last = cursors[ cursors.length - 1 ];
180
181 range.setStart( first.textNode, first.offset );
182 range.setEnd( last.textNode, last.offset + 1 );
183 }
184
185 return range;
186 },
187
188 /**
189 * Reflect the latest changes from dom range.
190 */
191 updateFromDomRange: function( domRange ) {
192 var cursor,
193 walker = new characterWalker( domRange );
194 this._.cursors = [];
195 do {
196 cursor = walker.next();
197 if ( cursor.character ) this._.cursors.push( cursor );
198 }
199 while ( cursor.character );
200 this._.rangeLength = this._.cursors.length;
201 },
202
203 setMatched: function() {
204 this._.isMatched = true;
205 },
206
207 clearMatched: function() {
208 this._.isMatched = false;
209 },
210
211 isMatched: function() {
212 return this._.isMatched;
213 },
214
215 /**
216 * Hightlight the current matched chunk of text.
217 */
218 highlight: function() {
219 // Do not apply if nothing is found.
220 if ( this._.cursors.length < 1 )
221 return;
222
223 // Remove the previous highlight if there's one.
224 if ( this._.highlightRange )
225 this.removeHighlight();
226
227 // Apply the highlight.
228 var range = this.toDomRange(),
229 bookmark = range.createBookmark();
230 highlightStyle.applyToRange( range, editor );
231 range.moveToBookmark( bookmark );
232 this._.highlightRange = range;
233
234 // Scroll the editor to the highlighted area.
235 var element = range.startContainer;
236 if ( element.type != CKEDITOR.NODE_ELEMENT )
237 element = element.getParent();
238 element.scrollIntoView();
239
240 // Update the character cursors.
241 this.updateFromDomRange( range );
242 },
243
244 /**
245 * Remove highlighted find result.
246 */
247 removeHighlight: function() {
248 if ( !this._.highlightRange )
249 return;
250
251 var bookmark = this._.highlightRange.createBookmark();
252 highlightStyle.removeFromRange( this._.highlightRange, editor );
253 this._.highlightRange.moveToBookmark( bookmark );
254 this.updateFromDomRange( this._.highlightRange );
255 this._.highlightRange = null;
256 },
257
258 isReadOnly: function() {
259 if ( !this._.highlightRange )
260 return 0;
261
262 return this._.highlightRange.startContainer.isReadOnly();
263 },
264
265 moveBack: function() {
266 var retval = this._.walker.back(),
267 cursors = this._.cursors;
268
269 if ( retval.hitMatchBoundary )
270 this._.cursors = cursors = [];
271
272 cursors.unshift( retval );
273 if ( cursors.length > this._.rangeLength )
274 cursors.pop();
275
276 return retval;
277 },
278
279 moveNext: function() {
280 var retval = this._.walker.next(),
281 cursors = this._.cursors;
282
283 // Clear the cursors queue if we've crossed a match boundary.
284 if ( retval.hitMatchBoundary )
285 this._.cursors = cursors = [];
286
287 cursors.push( retval );
288 if ( cursors.length > this._.rangeLength )
289 cursors.shift();
290
291 return retval;
292 },
293
294 getEndCharacter: function() {
295 var cursors = this._.cursors;
296 if ( cursors.length < 1 )
297 return null;
298
299 return cursors[ cursors.length - 1 ].character;
300 },
301
302 getNextCharacterRange: function( maxLength ) {
303 var lastCursor, nextRangeWalker,
304 cursors = this._.cursors;
305
306 if ( ( lastCursor = cursors[ cursors.length - 1 ] ) && lastCursor.textNode )
307 nextRangeWalker = new characterWalker( getRangeAfterCursor( lastCursor ) );
308 // In case it's an empty range (no cursors), figure out next range from walker (#4951).
309 else
310 nextRangeWalker = this._.walker;
311
312 return new characterRange( nextRangeWalker, maxLength );
313 },
314
315 getCursors: function() {
316 return this._.cursors;
317 }
318 };
319
320
321 // The remaining document range after the character cursor.
322 function getRangeAfterCursor( cursor, inclusive ) {
323 var range = editor.createRange();
324 range.setStart( cursor.textNode, ( inclusive ? cursor.offset : cursor.offset + 1 ) );
325 range.setEndAt( editor.editable(), CKEDITOR.POSITION_BEFORE_END );
326 return range;
327 }
328
329 // The document range before the character cursor.
330 function getRangeBeforeCursor( cursor ) {
331 var range = editor.createRange();
332 range.setStartAt( editor.editable(), CKEDITOR.POSITION_AFTER_START );
333 range.setEnd( cursor.textNode, cursor.offset );
334 return range;
335 }
336
337 var KMP_NOMATCH = 0,
338 KMP_ADVANCED = 1,
339 KMP_MATCHED = 2;
340
341 // Examination the occurrence of a word which implement KMP algorithm.
342 var kmpMatcher = function( pattern, ignoreCase ) {
343 var overlap = [ -1 ];
344 if ( ignoreCase )
345 pattern = pattern.toLowerCase();
346 for ( var i = 0; i < pattern.length; i++ ) {
347 overlap.push( overlap[ i ] + 1 );
348 while ( overlap[ i + 1 ] > 0 && pattern.charAt( i ) != pattern.charAt( overlap[ i + 1 ] - 1 ) )
349 overlap[ i + 1 ] = overlap[ overlap[ i + 1 ] - 1 ] + 1;
350 }
351
352 this._ = {
353 overlap: overlap,
354 state: 0,
355 ignoreCase: !!ignoreCase,
356 pattern: pattern
357 };
358 };
359
360 kmpMatcher.prototype = {
361 feedCharacter: function( c ) {
362 if ( this._.ignoreCase )
363 c = c.toLowerCase();
364
365 while ( true ) {
366 if ( c == this._.pattern.charAt( this._.state ) ) {
367 this._.state++;
368 if ( this._.state == this._.pattern.length ) {
369 this._.state = 0;
370 return KMP_MATCHED;
371 }
372 return KMP_ADVANCED;
373 } else if ( !this._.state ) {
374 return KMP_NOMATCH;
375 } else {
376 this._.state = this._.overlap[this._.state];
377 }
378 }
379 },
380
381 reset: function() {
382 this._.state = 0;
383 }
384 };
385
386 var wordSeparatorRegex = /[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/;
387
388 var isWordSeparator = function( c ) {
389 if ( !c )
390 return true;
391 var code = c.charCodeAt( 0 );
392 return ( code >= 9 && code <= 0xd ) || ( code >= 0x2000 && code <= 0x200a ) || wordSeparatorRegex.test( c );
393 };
394
395 var finder = {
396 searchRange: null,
397 matchRange: null,
398 find: function( pattern, matchCase, matchWord, matchCyclic, highlightMatched, cyclicRerun ) {
399 if ( !this.matchRange )
400 this.matchRange = new characterRange( new characterWalker( this.searchRange ), pattern.length );
401 else {
402 this.matchRange.removeHighlight();
403 this.matchRange = this.matchRange.getNextCharacterRange( pattern.length );
404 }
405
406 var matcher = new kmpMatcher( pattern, !matchCase ),
407 matchState = KMP_NOMATCH,
408 character = '%';
409
410 while ( character !== null ) {
411 this.matchRange.moveNext();
412 while ( ( character = this.matchRange.getEndCharacter() ) ) {
413 matchState = matcher.feedCharacter( character );
414 if ( matchState == KMP_MATCHED )
415 break;
416 if ( this.matchRange.moveNext().hitMatchBoundary )
417 matcher.reset();
418 }
419
420 if ( matchState == KMP_MATCHED ) {
421 if ( matchWord ) {
422 var cursors = this.matchRange.getCursors(),
423 tail = cursors[ cursors.length - 1 ],
424 head = cursors[ 0 ];
425
426 var rangeBefore = getRangeBeforeCursor( head ),
427 rangeAfter = getRangeAfterCursor( tail );
428
429 // The word boundary checks requires to trim the text nodes. (#9036)
430 rangeBefore.trim();
431 rangeAfter.trim();
432
433 var headWalker = new characterWalker( rangeBefore, true ),
434 tailWalker = new characterWalker( rangeAfter, true );
435
436 if ( !( isWordSeparator( headWalker.back().character ) && isWordSeparator( tailWalker.next().character ) ) )
437 continue;
438 }
439 this.matchRange.setMatched();
440 if ( highlightMatched !== false )
441 this.matchRange.highlight();
442 return true;
443 }
444 }
445
446 this.matchRange.clearMatched();
447 this.matchRange.removeHighlight();
448 // Clear current session and restart with the default search
449 // range.
450 // Re-run the finding once for cyclic.(#3517)
451 if ( matchCyclic && !cyclicRerun ) {
452 this.searchRange = getSearchRange( 1 );
453 this.matchRange = null;
454 return arguments.callee.apply( this, Array.prototype.slice.call( arguments ).concat( [ true ] ) );
455 }
456
457 return false;
458 },
459
460 // Record how much replacement occurred toward one replacing.
461 replaceCounter: 0,
462
463 replace: function( dialog, pattern, newString, matchCase, matchWord, matchCyclic, isReplaceAll ) {
464 isReplace = 1;
465
466 // Successiveness of current replace/find.
467 var result = 0;
468
469 // 1. Perform the replace when there's already a match here.
470 // 2. Otherwise perform the find but don't replace it immediately.
471 if ( this.matchRange && this.matchRange.isMatched() && !this.matchRange._.isReplaced && !this.matchRange.isReadOnly() ) {
472 // Turn off highlight for a while when saving snapshots.
473 this.matchRange.removeHighlight();
474 var domRange = this.matchRange.toDomRange();
475 var text = editor.document.createText( newString );
476 if ( !isReplaceAll ) {
477 // Save undo snaps before and after the replacement.
478 var selection = editor.getSelection();
479 selection.selectRanges( [ domRange ] );
480 editor.fire( 'saveSnapshot' );
481 }
482 domRange.deleteContents();
483 domRange.insertNode( text );
484 if ( !isReplaceAll ) {
485 selection.selectRanges( [ domRange ] );
486 editor.fire( 'saveSnapshot' );
487 }
488 this.matchRange.updateFromDomRange( domRange );
489 if ( !isReplaceAll )
490 this.matchRange.highlight();
491 this.matchRange._.isReplaced = true;
492 this.replaceCounter++;
493 result = 1;
494 } else {
495 result = this.find( pattern, matchCase, matchWord, matchCyclic, !isReplaceAll );
496 }
497
498 isReplace = 0;
499
500 return result;
501 }
502 };
503
504 // The range in which find/replace happened, receive from user
505 // selection prior.
506 function getSearchRange( isDefault ) {
507 var searchRange,
508 sel = editor.getSelection(),
509 range = sel.getRanges()[ 0 ],
510 editable = editor.editable();
511
512 // Blink browsers return empty array of ranges when editor is in read-only mode
513 // and it hasn't got focus, so instead of selection, we check for range itself. (#12848)
514 if ( range && !isDefault ) {
515 searchRange = range.clone();
516 searchRange.collapse( true );
517 } else {
518 searchRange = editor.createRange();
519 searchRange.setStartAt( editable, CKEDITOR.POSITION_AFTER_START );
520 }
521 searchRange.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END );
522 return searchRange;
523 }
524
525 var lang = editor.lang.find;
526 return {
527 title: lang.title,
528 resizable: CKEDITOR.DIALOG_RESIZE_NONE,
529 minWidth: 350,
530 minHeight: 170,
531 buttons: [
532 // Close button only.
533 CKEDITOR.dialog.cancelButton( editor, {
534 label: editor.lang.common.close
535 } )
536 ],
537 contents: [ {
538 id: 'find',
539 label: lang.find,
540 title: lang.find,
541 accessKey: '',
542 elements: [ {
543 type: 'hbox',
544 widths: [ '230px', '90px' ],
545 children: [ {
546 type: 'text',
547 id: 'txtFindFind',
548 label: lang.findWhat,
549 isChanged: false,
550 labelLayout: 'horizontal',
551 accessKey: 'F'
552 },
553 {
554 type: 'button',
555 id: 'btnFind',
556 align: 'left',
557 style: 'width:100%',
558 label: lang.find,
559 onClick: function() {
560 var dialog = this.getDialog();
561 if ( !finder.find(
562 dialog.getValueOf( 'find', 'txtFindFind' ),
563 dialog.getValueOf( 'find', 'txtFindCaseChk' ),
564 dialog.getValueOf( 'find', 'txtFindWordChk' ),
565 dialog.getValueOf( 'find', 'txtFindCyclic' )
566 ) ) {
567 alert( lang.notFoundMsg ); // jshint ignore:line
568 }
569 }
570 } ]
571 },
572 {
573 type: 'fieldset',
574 label: CKEDITOR.tools.htmlEncode( lang.findOptions ),
575 style: 'margin-top:29px',
576 children: [ {
577 type: 'vbox',
578 padding: 0,
579 children: [ {
580 type: 'checkbox',
581 id: 'txtFindCaseChk',
582 isChanged: false,
583 label: lang.matchCase
584 },
585 {
586 type: 'checkbox',
587 id: 'txtFindWordChk',
588 isChanged: false,
589 label: lang.matchWord
590 },
591 {
592 type: 'checkbox',
593 id: 'txtFindCyclic',
594 isChanged: false,
595 'default': true,
596 label: lang.matchCyclic
597 } ]
598 } ]
599 } ]
600 },
601 {
602 id: 'replace',
603 label: lang.replace,
604 accessKey: 'M',
605 elements: [ {
606 type: 'hbox',
607 widths: [ '230px', '90px' ],
608 children: [ {
609 type: 'text',
610 id: 'txtFindReplace',
611 label: lang.findWhat,
612 isChanged: false,
613 labelLayout: 'horizontal',
614 accessKey: 'F'
615 },
616 {
617 type: 'button',
618 id: 'btnFindReplace',
619 align: 'left',
620 style: 'width:100%',
621 label: lang.replace,
622 onClick: function() {
623 var dialog = this.getDialog();
624 if ( !finder.replace(
625 dialog,
626 dialog.getValueOf( 'replace', 'txtFindReplace' ),
627 dialog.getValueOf( 'replace', 'txtReplace' ),
628 dialog.getValueOf( 'replace', 'txtReplaceCaseChk' ),
629 dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
630 dialog.getValueOf( 'replace', 'txtReplaceCyclic' )
631 ) ) {
632 alert( lang.notFoundMsg ); // jshint ignore:line
633 }
634 }
635 } ]
636 },
637 {
638 type: 'hbox',
639 widths: [ '230px', '90px' ],
640 children: [ {
641 type: 'text',
642 id: 'txtReplace',
643 label: lang.replaceWith,
644 isChanged: false,
645 labelLayout: 'horizontal',
646 accessKey: 'R'
647 },
648 {
649 type: 'button',
650 id: 'btnReplaceAll',
651 align: 'left',
652 style: 'width:100%',
653 label: lang.replaceAll,
654 isChanged: false,
655 onClick: function() {
656 var dialog = this.getDialog();
657
658 finder.replaceCounter = 0;
659
660 // Scope to full document.
661 finder.searchRange = getSearchRange( 1 );
662 if ( finder.matchRange ) {
663 finder.matchRange.removeHighlight();
664 finder.matchRange = null;
665 }
666 editor.fire( 'saveSnapshot' );
667 while ( finder.replace(
668 dialog,
669 dialog.getValueOf( 'replace', 'txtFindReplace' ),
670 dialog.getValueOf( 'replace', 'txtReplace' ),
671 dialog.getValueOf( 'replace', 'txtReplaceCaseChk' ),
672 dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
673 false,
674 true
675 ) ) {
676
677 }
678
679 if ( finder.replaceCounter ) {
680 alert( lang.replaceSuccessMsg.replace( /%1/, finder.replaceCounter ) ); // jshint ignore:line
681 editor.fire( 'saveSnapshot' );
682 } else {
683 alert( lang.notFoundMsg ); // jshint ignore:line
684 }
685 }
686 } ]
687 },
688 {
689 type: 'fieldset',
690 label: CKEDITOR.tools.htmlEncode( lang.findOptions ),
691 children: [ {
692 type: 'vbox',
693 padding: 0,
694 children: [ {
695 type: 'checkbox',
696 id: 'txtReplaceCaseChk',
697 isChanged: false,
698 label: lang.matchCase
699 },
700 {
701 type: 'checkbox',
702 id: 'txtReplaceWordChk',
703 isChanged: false,
704 label: lang.matchWord
705 },
706 {
707 type: 'checkbox',
708 id: 'txtReplaceCyclic',
709 isChanged: false,
710 'default': true,
711 label: lang.matchCyclic
712 } ]
713 } ]
714 } ]
715 } ],
716 onLoad: function() {
717 var dialog = this;
718
719 // Keep track of the current pattern field in use.
720 var patternField, wholeWordChkField;
721
722 // Ignore initial page select on dialog show
723 var isUserSelect = 0;
724 this.on( 'hide', function() {
725 isUserSelect = 0;
726 } );
727 this.on( 'show', function() {
728 isUserSelect = 1;
729 } );
730
731 this.selectPage = CKEDITOR.tools.override( this.selectPage, function( originalFunc ) {
732 return function( pageId ) {
733 originalFunc.call( dialog, pageId );
734
735 var currPage = dialog._.tabs[ pageId ];
736 var patternFieldInput, patternFieldId, wholeWordChkFieldId;
737 patternFieldId = pageId === 'find' ? 'txtFindFind' : 'txtFindReplace';
738 wholeWordChkFieldId = pageId === 'find' ? 'txtFindWordChk' : 'txtReplaceWordChk';
739
740 patternField = dialog.getContentElement( pageId, patternFieldId );
741 wholeWordChkField = dialog.getContentElement( pageId, wholeWordChkFieldId );
742
743 // Prepare for check pattern text filed 'keyup' event
744 if ( !currPage.initialized ) {
745 patternFieldInput = CKEDITOR.document.getById( patternField._.inputId );
746 currPage.initialized = true;
747 }
748
749 // Synchronize fields on tab switch.
750 if ( isUserSelect )
751 syncFieldsBetweenTabs.call( this, pageId );
752 };
753 } );
754
755 },
756 onShow: function() {
757 // Establish initial searching start position.
758 finder.searchRange = getSearchRange();
759
760 // Fill in the find field with selected text.
761 var selectedText = this.getParentEditor().getSelection().getSelectedText(),
762 patternFieldId = ( startupPage == 'find' ? 'txtFindFind' : 'txtFindReplace' );
763
764 var field = this.getContentElement( startupPage, patternFieldId );
765 field.setValue( selectedText );
766 field.select();
767
768 this.selectPage( startupPage );
769
770 this[ ( startupPage == 'find' && this._.editor.readOnly ? 'hide' : 'show' ) + 'Page' ]( 'replace' );
771 },
772 onHide: function() {
773 var range;
774 if ( finder.matchRange && finder.matchRange.isMatched() ) {
775 finder.matchRange.removeHighlight();
776 editor.focus();
777
778 range = finder.matchRange.toDomRange();
779 if ( range )
780 editor.getSelection().selectRanges( [ range ] );
781 }
782
783 // Clear current session before dialog close
784 delete finder.matchRange;
785 },
786 onFocus: function() {
787 if ( startupPage == 'replace' )
788 return this.getContentElement( 'replace', 'txtFindReplace' );
789 else
790 return this.getContentElement( 'find', 'txtFindFind' );
791 }
792 };
793 }
794
795 CKEDITOR.dialog.add( 'find', function( editor ) {
796 return findDialog( editor, 'find' );
797 } );
798
799 CKEDITOR.dialog.add( 'replace', function( editor ) {
800 return findDialog( editor, 'replace' );
801 } );
802} )();
diff --git a/sources/plugins/find/icons/find-rtl.png b/sources/plugins/find/icons/find-rtl.png
new file mode 100644
index 00000000..02f40cb2
--- /dev/null
+++ b/sources/plugins/find/icons/find-rtl.png
Binary files differ
diff --git a/sources/plugins/find/icons/find.png b/sources/plugins/find/icons/find.png
new file mode 100644
index 00000000..02f40cb2
--- /dev/null
+++ b/sources/plugins/find/icons/find.png
Binary files differ
diff --git a/sources/plugins/find/icons/hidpi/find-rtl.png b/sources/plugins/find/icons/hidpi/find-rtl.png
new file mode 100644
index 00000000..cbf9ced2
--- /dev/null
+++ b/sources/plugins/find/icons/hidpi/find-rtl.png
Binary files differ
diff --git a/sources/plugins/find/icons/hidpi/find.png b/sources/plugins/find/icons/hidpi/find.png
new file mode 100644
index 00000000..cbf9ced2
--- /dev/null
+++ b/sources/plugins/find/icons/hidpi/find.png
Binary files differ
diff --git a/sources/plugins/find/icons/hidpi/replace.png b/sources/plugins/find/icons/hidpi/replace.png
new file mode 100644
index 00000000..9efd8bbd
--- /dev/null
+++ b/sources/plugins/find/icons/hidpi/replace.png
Binary files differ
diff --git a/sources/plugins/find/icons/replace.png b/sources/plugins/find/icons/replace.png
new file mode 100644
index 00000000..e68afcbe
--- /dev/null
+++ b/sources/plugins/find/icons/replace.png
Binary files differ
diff --git a/sources/plugins/find/lang/af.js b/sources/plugins/find/lang/af.js
new file mode 100644
index 00000000..6f2517ac
--- /dev/null
+++ b/sources/plugins/find/lang/af.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'af', {
6 find: 'Soek',
7 findOptions: 'Find Options',
8 findWhat: 'Soek na:',
9 matchCase: 'Hoof/kleinletter sensitief',
10 matchCyclic: 'Soek deurlopend',
11 matchWord: 'Hele woord moet voorkom',
12 notFoundMsg: 'Teks nie gevind nie.',
13 replace: 'Vervang',
14 replaceAll: 'Vervang alles',
15 replaceSuccessMsg: '%1 voorkoms(te) vervang.',
16 replaceWith: 'Vervang met:',
17 title: 'Soek en vervang'
18} );
diff --git a/sources/plugins/find/lang/ar.js b/sources/plugins/find/lang/ar.js
new file mode 100644
index 00000000..33f56042
--- /dev/null
+++ b/sources/plugins/find/lang/ar.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ar', {
6 find: 'بحث',
7 findOptions: 'Find Options',
8 findWhat: 'البحث بـ:',
9 matchCase: 'مطابقة حالة الأحرف',
10 matchCyclic: 'مطابقة دورية',
11 matchWord: 'مطابقة بالكامل',
12 notFoundMsg: 'لم يتم العثور على النص المحدد.',
13 replace: 'إستبدال',
14 replaceAll: 'إستبدال الكل',
15 replaceSuccessMsg: 'تم استبدال 1% من الحالات ',
16 replaceWith: 'إستبدال بـ:',
17 title: 'بحث واستبدال'
18} );
diff --git a/sources/plugins/find/lang/bg.js b/sources/plugins/find/lang/bg.js
new file mode 100644
index 00000000..4fb17476
--- /dev/null
+++ b/sources/plugins/find/lang/bg.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'bg', {
6 find: 'Търсене',
7 findOptions: 'Find Options',
8 findWhat: 'Търси за:',
9 matchCase: 'Съвпадение',
10 matchCyclic: 'Циклично съвпадение',
11 matchWord: 'Съвпадение с дума',
12 notFoundMsg: 'Указаният текст не е намерен.',
13 replace: 'Препокриване',
14 replaceAll: 'Препокрий всички',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Препокрива с:',
17 title: 'Търсене и препокриване'
18} );
diff --git a/sources/plugins/find/lang/bn.js b/sources/plugins/find/lang/bn.js
new file mode 100644
index 00000000..396b2348
--- /dev/null
+++ b/sources/plugins/find/lang/bn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'bn', {
6 find: 'খোজো',
7 findOptions: 'Find Options',
8 findWhat: 'যা খুঁজতে হবে:',
9 matchCase: 'কেস মিলাও',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'পুরা শব্দ মেলাও',
12 notFoundMsg: 'আপনার উল্লেখিত টেকস্ট পাওয়া যায়নি',
13 replace: 'রিপ্লেস',
14 replaceAll: 'সব বদলে দাও',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'যার সাথে বদলাতে হবে:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/bs.js b/sources/plugins/find/lang/bs.js
new file mode 100644
index 00000000..0b171017
--- /dev/null
+++ b/sources/plugins/find/lang/bs.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'bs', {
6 find: 'Naði',
7 findOptions: 'Find Options',
8 findWhat: 'Naði šta:',
9 matchCase: 'Uporeðuj velika/mala slova',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Uporeðuj samo cijelu rijeè',
12 notFoundMsg: 'Traženi tekst nije pronaðen.',
13 replace: 'Zamjeni',
14 replaceAll: 'Zamjeni sve',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Zamjeni sa:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/ca.js b/sources/plugins/find/lang/ca.js
new file mode 100644
index 00000000..eea8b4b0
--- /dev/null
+++ b/sources/plugins/find/lang/ca.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ca', {
6 find: 'Cerca',
7 findOptions: 'Opcions de Cerca',
8 findWhat: 'Cerca el:',
9 matchCase: 'Distingeix majúscules/minúscules',
10 matchCyclic: 'Coincidència cíclica',
11 matchWord: 'Només paraules completes',
12 notFoundMsg: 'El text especificat no s\'ha trobat.',
13 replace: 'Reemplaça',
14 replaceAll: 'Reemplaça-ho tot',
15 replaceSuccessMsg: '%1 ocurrència/es reemplaçada/es.',
16 replaceWith: 'Reemplaça amb:',
17 title: 'Cerca i reemplaça'
18} );
diff --git a/sources/plugins/find/lang/cs.js b/sources/plugins/find/lang/cs.js
new file mode 100644
index 00000000..b4c97c32
--- /dev/null
+++ b/sources/plugins/find/lang/cs.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'cs', {
6 find: 'Hledat',
7 findOptions: 'Možnosti hledání',
8 findWhat: 'Co hledat:',
9 matchCase: 'Rozlišovat velikost písma',
10 matchCyclic: 'Procházet opakovaně',
11 matchWord: 'Pouze celá slova',
12 notFoundMsg: 'Hledaný text nebyl nalezen.',
13 replace: 'Nahradit',
14 replaceAll: 'Nahradit vše',
15 replaceSuccessMsg: '%1 nahrazení.',
16 replaceWith: 'Čím nahradit:',
17 title: 'Najít a nahradit'
18} );
diff --git a/sources/plugins/find/lang/cy.js b/sources/plugins/find/lang/cy.js
new file mode 100644
index 00000000..ad3ad22a
--- /dev/null
+++ b/sources/plugins/find/lang/cy.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'cy', {
6 find: 'Chwilio',
7 findOptions: 'Opsiynau Chwilio',
8 findWhat: 'Chwilio\'r term:',
9 matchCase: 'Cydweddu\'r cas',
10 matchCyclic: 'Cydweddu\'n gylchol',
11 matchWord: 'Cydweddu gair cyfan',
12 notFoundMsg: 'Nid oedd y testun wedi\'i ddarganfod.',
13 replace: 'Amnewid Un',
14 replaceAll: 'Amnewid Pob',
15 replaceSuccessMsg: 'Amnewidiwyd %1 achlysur.',
16 replaceWith: 'Amnewid gyda:',
17 title: 'Chwilio ac Amnewid'
18} );
diff --git a/sources/plugins/find/lang/da.js b/sources/plugins/find/lang/da.js
new file mode 100644
index 00000000..42d3bfcf
--- /dev/null
+++ b/sources/plugins/find/lang/da.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'da', {
6 find: 'Søg',
7 findOptions: 'Find muligheder',
8 findWhat: 'Søg efter:',
9 matchCase: 'Forskel på store og små bogstaver',
10 matchCyclic: 'Match cyklisk',
11 matchWord: 'Kun hele ord',
12 notFoundMsg: 'Søgeteksten blev ikke fundet',
13 replace: 'Erstat',
14 replaceAll: 'Erstat alle',
15 replaceSuccessMsg: '%1 forekomst(er) erstattet.',
16 replaceWith: 'Erstat med:',
17 title: 'Søg og erstat'
18} );
diff --git a/sources/plugins/find/lang/de.js b/sources/plugins/find/lang/de.js
new file mode 100644
index 00000000..b12f2525
--- /dev/null
+++ b/sources/plugins/find/lang/de.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'de', {
6 find: 'Suchen',
7 findOptions: 'Suchoptionen',
8 findWhat: 'Suche nach:',
9 matchCase: 'Groß-/Kleinschreibung beachten',
10 matchCyclic: 'Zyklische Suche',
11 matchWord: 'Nur ganze Worte suchen',
12 notFoundMsg: 'Der angegebene Text wurde nicht gefunden.',
13 replace: 'Ersetzen',
14 replaceAll: 'Alle ersetzen',
15 replaceSuccessMsg: '%1 Vorkommen ersetzt.',
16 replaceWith: 'Ersetze mit:',
17 title: 'Suchen und Ersetzen'
18} );
diff --git a/sources/plugins/find/lang/el.js b/sources/plugins/find/lang/el.js
new file mode 100644
index 00000000..054d5c70
--- /dev/null
+++ b/sources/plugins/find/lang/el.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'el', {
6 find: 'Εύρεση',
7 findOptions: 'Επιλογές Εύρεσης',
8 findWhat: 'Εύρεση για:',
9 matchCase: 'Ταίριασμα πεζών/κεφαλαίων',
10 matchCyclic: 'Αναδρομική εύρεση',
11 matchWord: 'Εύρεση μόνο πλήρων λέξεων',
12 notFoundMsg: 'Το κείμενο δεν βρέθηκε.',
13 replace: 'Αντικατάσταση',
14 replaceAll: 'Αντικατάσταση Όλων',
15 replaceSuccessMsg: 'Ο(ι) όρος(-οι) αντικαταστήθηκε(-αν) %1 φορές.',
16 replaceWith: 'Αντικατάσταση με:',
17 title: 'Εύρεση και Αντικατάσταση'
18} );
diff --git a/sources/plugins/find/lang/en-au.js b/sources/plugins/find/lang/en-au.js
new file mode 100644
index 00000000..c7039480
--- /dev/null
+++ b/sources/plugins/find/lang/en-au.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'en-au', {
6 find: 'Find',
7 findOptions: 'Find Options',
8 findWhat: 'Find what:',
9 matchCase: 'Match case',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Match whole word',
12 notFoundMsg: 'The specified text was not found.',
13 replace: 'Replace',
14 replaceAll: 'Replace All',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Replace with:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/en-ca.js b/sources/plugins/find/lang/en-ca.js
new file mode 100644
index 00000000..d19c10d6
--- /dev/null
+++ b/sources/plugins/find/lang/en-ca.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'en-ca', {
6 find: 'Find',
7 findOptions: 'Find Options',
8 findWhat: 'Find what:',
9 matchCase: 'Match case',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Match whole word',
12 notFoundMsg: 'The specified text was not found.',
13 replace: 'Replace',
14 replaceAll: 'Replace All',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Replace with:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/en-gb.js b/sources/plugins/find/lang/en-gb.js
new file mode 100644
index 00000000..40687bcb
--- /dev/null
+++ b/sources/plugins/find/lang/en-gb.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'en-gb', {
6 find: 'Find',
7 findOptions: 'Find Options',
8 findWhat: 'Find what:',
9 matchCase: 'Match case',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Match whole word',
12 notFoundMsg: 'The specified text was not found.',
13 replace: 'Replace',
14 replaceAll: 'Replace All',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Replace with:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/en.js b/sources/plugins/find/lang/en.js
new file mode 100644
index 00000000..3a357ac5
--- /dev/null
+++ b/sources/plugins/find/lang/en.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'en', {
6 find: 'Find',
7 findOptions: 'Find Options',
8 findWhat: 'Find what:',
9 matchCase: 'Match case',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Match whole word',
12 notFoundMsg: 'The specified text was not found.',
13 replace: 'Replace',
14 replaceAll: 'Replace All',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Replace with:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/eo.js b/sources/plugins/find/lang/eo.js
new file mode 100644
index 00000000..51d06994
--- /dev/null
+++ b/sources/plugins/find/lang/eo.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'eo', {
6 find: 'Serĉi',
7 findOptions: 'Opcioj pri Serĉado',
8 findWhat: 'Serĉi:',
9 matchCase: 'Kongruigi Usklecon',
10 matchCyclic: 'Cikla Serĉado',
11 matchWord: 'Tuta Vorto',
12 notFoundMsg: 'La celteksto ne estas trovita.',
13 replace: 'Anstataŭigi',
14 replaceAll: 'Anstataŭigi Ĉion',
15 replaceSuccessMsg: '%1 anstataŭigita(j) apero(j).',
16 replaceWith: 'Anstataŭigi per:',
17 title: 'Serĉi kaj Anstataŭigi'
18} );
diff --git a/sources/plugins/find/lang/es.js b/sources/plugins/find/lang/es.js
new file mode 100644
index 00000000..86c40728
--- /dev/null
+++ b/sources/plugins/find/lang/es.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'es', {
6 find: 'Buscar',
7 findOptions: 'Opciones de búsqueda',
8 findWhat: 'Texto a buscar:',
9 matchCase: 'Coincidir may/min',
10 matchCyclic: 'Buscar en todo el contenido',
11 matchWord: 'Coincidir toda la palabra',
12 notFoundMsg: 'El texto especificado no ha sido encontrado.',
13 replace: 'Reemplazar',
14 replaceAll: 'Reemplazar Todo',
15 replaceSuccessMsg: 'La expresión buscada ha sido reemplazada %1 veces.',
16 replaceWith: 'Reemplazar con:',
17 title: 'Buscar y Reemplazar'
18} );
diff --git a/sources/plugins/find/lang/et.js b/sources/plugins/find/lang/et.js
new file mode 100644
index 00000000..749c54e3
--- /dev/null
+++ b/sources/plugins/find/lang/et.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'et', {
6 find: 'Otsi',
7 findOptions: 'Otsingu valikud',
8 findWhat: 'Otsitav:',
9 matchCase: 'Suur- ja väiketähtede eristamine',
10 matchCyclic: 'Jätkatakse algusest',
11 matchWord: 'Ainult terved sõnad',
12 notFoundMsg: 'Otsitud teksti ei leitud.',
13 replace: 'Asenda',
14 replaceAll: 'Asenda kõik',
15 replaceSuccessMsg: '%1 vastet asendati.',
16 replaceWith: 'Asendus:',
17 title: 'Otsimine ja asendamine'
18} );
diff --git a/sources/plugins/find/lang/eu.js b/sources/plugins/find/lang/eu.js
new file mode 100644
index 00000000..dad61b1b
--- /dev/null
+++ b/sources/plugins/find/lang/eu.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'eu', {
6 find: 'Bilatu',
7 findOptions: 'Bilaketaren aukerak',
8 findWhat: 'Bilatu hau:',
9 matchCase: 'Maiuskula/minuskula',
10 matchCyclic: 'Bilaketa ziklikoa',
11 matchWord: 'Bilatu hitz osoa',
12 notFoundMsg: 'Ez da aurkitu zehazturiko testua.',
13 replace: 'Ordezkatu',
14 replaceAll: 'Ordezkatu guztiak',
15 replaceSuccessMsg: '%1 aldiz ordezkatua.',
16 replaceWith: 'Ordezkatu honekin:',
17 title: 'Bilatu eta ordezkatu'
18} );
diff --git a/sources/plugins/find/lang/fa.js b/sources/plugins/find/lang/fa.js
new file mode 100644
index 00000000..c0b45b54
--- /dev/null
+++ b/sources/plugins/find/lang/fa.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'fa', {
6 find: 'جستجو',
7 findOptions: 'گزینه​های جستجو',
8 findWhat: 'چه چیز را مییابید:',
9 matchCase: 'همسانی در بزرگی و کوچکی نویسه​ها',
10 matchCyclic: 'همسانی با چرخه',
11 matchWord: 'همسانی با واژهٴ کامل',
12 notFoundMsg: 'متن موردنظر یافت نشد.',
13 replace: 'جایگزینی',
14 replaceAll: 'جایگزینی همهٴ یافته​ها',
15 replaceSuccessMsg: '%1 رخداد جایگزین شد.',
16 replaceWith: 'جایگزینی با:',
17 title: 'جستجو و جایگزینی'
18} );
diff --git a/sources/plugins/find/lang/fi.js b/sources/plugins/find/lang/fi.js
new file mode 100644
index 00000000..2d583902
--- /dev/null
+++ b/sources/plugins/find/lang/fi.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'fi', {
6 find: 'Etsi',
7 findOptions: 'Hakuasetukset',
8 findWhat: 'Etsi mitä:',
9 matchCase: 'Sama kirjainkoko',
10 matchCyclic: 'Kierrä ympäri',
11 matchWord: 'Koko sana',
12 notFoundMsg: 'Etsittyä tekstiä ei löytynyt.',
13 replace: 'Korvaa',
14 replaceAll: 'Korvaa kaikki',
15 replaceSuccessMsg: '%1 esiintymä(ä) korvattu.',
16 replaceWith: 'Korvaa tällä:',
17 title: 'Etsi ja korvaa'
18} );
diff --git a/sources/plugins/find/lang/fo.js b/sources/plugins/find/lang/fo.js
new file mode 100644
index 00000000..be08687b
--- /dev/null
+++ b/sources/plugins/find/lang/fo.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'fo', {
6 find: 'Leita',
7 findOptions: 'Finn møguleikar',
8 findWhat: 'Finn:',
9 matchCase: 'Munur á stórum og smáum bókstavum',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Bert heil orð',
12 notFoundMsg: 'Leititeksturin varð ikki funnin',
13 replace: 'Yvirskriva',
14 replaceAll: 'Yvirskriva alt',
15 replaceSuccessMsg: '%1 úrslit broytt.',
16 replaceWith: 'Yvirskriva við:',
17 title: 'Finn og broyt'
18} );
diff --git a/sources/plugins/find/lang/fr-ca.js b/sources/plugins/find/lang/fr-ca.js
new file mode 100644
index 00000000..401aedbf
--- /dev/null
+++ b/sources/plugins/find/lang/fr-ca.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'fr-ca', {
6 find: 'Rechercher',
7 findOptions: 'Options de recherche',
8 findWhat: 'Rechercher:',
9 matchCase: 'Respecter la casse',
10 matchCyclic: 'Recherche cyclique',
11 matchWord: 'Mot entier',
12 notFoundMsg: 'Le texte indiqué est introuvable.',
13 replace: 'Remplacer',
14 replaceAll: 'Tout remplacer',
15 replaceSuccessMsg: '%1 remplacements.',
16 replaceWith: 'Remplacer par:',
17 title: 'Rechercher et remplacer'
18} );
diff --git a/sources/plugins/find/lang/fr.js b/sources/plugins/find/lang/fr.js
new file mode 100644
index 00000000..65ce1bb1
--- /dev/null
+++ b/sources/plugins/find/lang/fr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'fr', {
6 find: 'Trouver',
7 findOptions: 'Options de recherche',
8 findWhat: 'Expression à trouver: ',
9 matchCase: 'Respecter la casse',
10 matchCyclic: 'Boucler',
11 matchWord: 'Mot entier uniquement',
12 notFoundMsg: 'Le texte spécifié ne peut être trouvé.',
13 replace: 'Remplacer',
14 replaceAll: 'Remplacer tout',
15 replaceSuccessMsg: '%1 occurrence(s) replacée(s).',
16 replaceWith: 'Remplacer par: ',
17 title: 'Trouver et remplacer'
18} );
diff --git a/sources/plugins/find/lang/gl.js b/sources/plugins/find/lang/gl.js
new file mode 100644
index 00000000..853bfd8e
--- /dev/null
+++ b/sources/plugins/find/lang/gl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'gl', {
6 find: 'Buscar',
7 findOptions: 'Buscar opcións',
8 findWhat: 'Texto a buscar:',
9 matchCase: 'Coincidir Mai./min.',
10 matchCyclic: 'Coincidencia cíclica',
11 matchWord: 'Coincidencia coa palabra completa',
12 notFoundMsg: 'Non se atopou o texto indicado.',
13 replace: 'Substituir',
14 replaceAll: 'Substituír todo',
15 replaceSuccessMsg: '%1 concorrencia(s) substituída(s).',
16 replaceWith: 'Substituír con:',
17 title: 'Buscar e substituír'
18} );
diff --git a/sources/plugins/find/lang/gu.js b/sources/plugins/find/lang/gu.js
new file mode 100644
index 00000000..9f0a344c
--- /dev/null
+++ b/sources/plugins/find/lang/gu.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'gu', {
6 find: 'શોધવું',
7 findOptions: 'વીકલ્પ શોધો',
8 findWhat: 'આ શોધો',
9 matchCase: 'કેસ સરખા રાખો',
10 matchCyclic: 'સરખાવવા બધા',
11 matchWord: 'બઘા શબ્દ સરખા રાખો',
12 notFoundMsg: 'તમે શોધેલી ટેક્સ્ટ નથી મળી',
13 replace: 'રિપ્લેસ/બદલવું',
14 replaceAll: 'બઘા બદલી ',
15 replaceSuccessMsg: '%1 ફેરફારો બાદલાયા છે.',
16 replaceWith: 'આનાથી બદલો',
17 title: 'શોધવું અને બદલવું'
18} );
diff --git a/sources/plugins/find/lang/he.js b/sources/plugins/find/lang/he.js
new file mode 100644
index 00000000..9c81572a
--- /dev/null
+++ b/sources/plugins/find/lang/he.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'he', {
6 find: 'חיפוש',
7 findOptions: 'אפשרויות חיפוש',
8 findWhat: 'חיפוש מחרוזת:',
9 matchCase: 'הבחנה בין אותיות רשיות לקטנות (Case)',
10 matchCyclic: 'התאמה מחזורית',
11 matchWord: 'התאמה למילה המלאה',
12 notFoundMsg: 'הטקסט המבוקש לא נמצא.',
13 replace: 'החלפה',
14 replaceAll: 'החלפה בכל העמוד',
15 replaceSuccessMsg: '%1 טקסטים הוחלפו.',
16 replaceWith: 'החלפה במחרוזת:',
17 title: 'חיפוש והחלפה'
18} );
diff --git a/sources/plugins/find/lang/hi.js b/sources/plugins/find/lang/hi.js
new file mode 100644
index 00000000..73ebdafb
--- /dev/null
+++ b/sources/plugins/find/lang/hi.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'hi', {
6 find: 'खोजें',
7 findOptions: 'Find Options',
8 findWhat: 'यह खोजें:',
9 matchCase: 'केस मिलायें',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'पूरा शब्द मिलायें',
12 notFoundMsg: 'आपके द्वारा दिया गया टेक्स्ट नहीं मिला',
13 replace: 'रीप्लेस',
14 replaceAll: 'सभी रिप्लेस करें',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'इससे रिप्लेस करें:',
17 title: 'खोजें और बदलें'
18} );
diff --git a/sources/plugins/find/lang/hr.js b/sources/plugins/find/lang/hr.js
new file mode 100644
index 00000000..ea542328
--- /dev/null
+++ b/sources/plugins/find/lang/hr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'hr', {
6 find: 'Pronađi',
7 findOptions: 'Opcije traženja',
8 findWhat: 'Pronađi:',
9 matchCase: 'Usporedi mala/velika slova',
10 matchCyclic: 'Usporedi kružno',
11 matchWord: 'Usporedi cijele riječi',
12 notFoundMsg: 'Traženi tekst nije pronađen.',
13 replace: 'Zamijeni',
14 replaceAll: 'Zamijeni sve',
15 replaceSuccessMsg: 'Zamijenjeno %1 pojmova.',
16 replaceWith: 'Zamijeni s:',
17 title: 'Pronađi i zamijeni'
18} );
diff --git a/sources/plugins/find/lang/hu.js b/sources/plugins/find/lang/hu.js
new file mode 100644
index 00000000..70ed8523
--- /dev/null
+++ b/sources/plugins/find/lang/hu.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'hu', {
6 find: 'Keresés',
7 findOptions: 'Beállítások',
8 findWhat: 'Keresett szöveg:',
9 matchCase: 'Kis- és nagybetű megkülönböztetése',
10 matchCyclic: 'Ciklikus keresés',
11 matchWord: 'Csak ha ez a teljes szó',
12 notFoundMsg: 'A keresett szöveg nem található.',
13 replace: 'Csere',
14 replaceAll: 'Az összes cseréje',
15 replaceSuccessMsg: '%1 egyezőség cserélve.',
16 replaceWith: 'Csere erre:',
17 title: 'Keresés és csere'
18} );
diff --git a/sources/plugins/find/lang/id.js b/sources/plugins/find/lang/id.js
new file mode 100644
index 00000000..136c9aaf
--- /dev/null
+++ b/sources/plugins/find/lang/id.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'id', {
6 find: 'Temukan',
7 findOptions: 'Opsi menemukan',
8 findWhat: 'Temukan apa:',
9 matchCase: 'Match case', // MISSING
10 matchCyclic: 'Match cyclic', // MISSING
11 matchWord: 'Match whole word', // MISSING
12 notFoundMsg: 'Teks yang dipilih tidak ditemukan',
13 replace: 'Ganti',
14 replaceAll: 'Ganti Semua',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.', // MISSING
16 replaceWith: 'Ganti dengan:',
17 title: 'Temukan dan Ganti'
18} );
diff --git a/sources/plugins/find/lang/is.js b/sources/plugins/find/lang/is.js
new file mode 100644
index 00000000..7687957c
--- /dev/null
+++ b/sources/plugins/find/lang/is.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'is', {
6 find: 'Leita',
7 findOptions: 'Find Options',
8 findWhat: 'Leita að:',
9 matchCase: 'Gera greinarmun á¡ há¡- og lágstöfum',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Aðeins heil orð',
12 notFoundMsg: 'Leitartexti fannst ekki!',
13 replace: 'Skipta út',
14 replaceAll: 'Skipta út allsstaðar',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Skipta út fyrir:',
17 title: 'Finna og skipta'
18} );
diff --git a/sources/plugins/find/lang/it.js b/sources/plugins/find/lang/it.js
new file mode 100644
index 00000000..4759fdba
--- /dev/null
+++ b/sources/plugins/find/lang/it.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'it', {
6 find: 'Trova',
7 findOptions: 'Opzioni di ricerca',
8 findWhat: 'Trova:',
9 matchCase: 'Maiuscole/minuscole',
10 matchCyclic: 'Ricerca ciclica',
11 matchWord: 'Solo parole intere',
12 notFoundMsg: 'L\'elemento cercato non è stato trovato.',
13 replace: 'Sostituisci',
14 replaceAll: 'Sostituisci tutto',
15 replaceSuccessMsg: '%1 occorrenza(e) sostituite.',
16 replaceWith: 'Sostituisci con:',
17 title: 'Cerca e Sostituisci'
18} );
diff --git a/sources/plugins/find/lang/ja.js b/sources/plugins/find/lang/ja.js
new file mode 100644
index 00000000..51100472
--- /dev/null
+++ b/sources/plugins/find/lang/ja.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ja', {
6 find: '検索',
7 findOptions: '検索オプション',
8 findWhat: '検索する文字列:',
9 matchCase: '大文字と小文字を区別する',
10 matchCyclic: '末尾に逹したら先頭に戻る',
11 matchWord: '単語単位で探す',
12 notFoundMsg: '指定された文字列は見つかりませんでした。',
13 replace: '置換',
14 replaceAll: 'すべて置換',
15 replaceSuccessMsg: '%1 個置換しました。',
16 replaceWith: '置換後の文字列:',
17 title: '検索と置換'
18} );
diff --git a/sources/plugins/find/lang/ka.js b/sources/plugins/find/lang/ka.js
new file mode 100644
index 00000000..2ac75798
--- /dev/null
+++ b/sources/plugins/find/lang/ka.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ka', {
6 find: 'ძებნა',
7 findOptions: 'Find Options',
8 findWhat: 'საძიებელი ტექსტი:',
9 matchCase: 'დიდი და პატარა ასოების დამთხვევა',
10 matchCyclic: 'დოკუმენტის ბოლოში გასვლის მერე თავიდან დაწყება',
11 matchWord: 'მთელი სიტყვის დამთხვევა',
12 notFoundMsg: 'მითითებული ტექსტი არ მოიძებნა.',
13 replace: 'შეცვლა',
14 replaceAll: 'ყველას შეცვლა',
15 replaceSuccessMsg: '%1 მოძებნილი შეიცვალა.',
16 replaceWith: 'შეცვლის ტექსტი:',
17 title: 'ძებნა და შეცვლა'
18} );
diff --git a/sources/plugins/find/lang/km.js b/sources/plugins/find/lang/km.js
new file mode 100644
index 00000000..f4f43399
--- /dev/null
+++ b/sources/plugins/find/lang/km.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'km', {
6 find: 'ស្វែងរក',
7 findOptions: 'ជម្រើស​ស្វែង​រក',
8 findWhat: 'ស្វែងរកអ្វី:',
9 matchCase: 'ករណី​ដំណូច',
10 matchCyclic: 'ត្រូវ​នឹង cyclic',
11 matchWord: 'ដូច​នឹង​ពាក្យ​ទាំង​មូល',
12 notFoundMsg: 'រក​មិន​ឃើញ​ពាក្យ​ដែល​បាន​បញ្ជាក់។',
13 replace: 'ជំនួស',
14 replaceAll: 'ជំនួសទាំងអស់',
15 replaceSuccessMsg: 'ការ​ជំនួស​ចំនួន %1 បាន​កើត​ឡើង។',
16 replaceWith: 'ជំនួសជាមួយ:',
17 title: 'រក​និង​ជំនួស'
18} );
diff --git a/sources/plugins/find/lang/ko.js b/sources/plugins/find/lang/ko.js
new file mode 100644
index 00000000..13bef418
--- /dev/null
+++ b/sources/plugins/find/lang/ko.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ko', {
6 find: '찾기',
7 findOptions: '찾기 조건',
8 findWhat: '찾을 내용:',
9 matchCase: '대소문자 구분',
10 matchCyclic: '되돌이 검색',
11 matchWord: '온전한 단어',
12 notFoundMsg: '문자열을 찾을 수 없습니다.',
13 replace: '바꾸기',
14 replaceAll: '모두 바꾸기',
15 replaceSuccessMsg: '%1개의 항목이 바뀌었습니다.',
16 replaceWith: '바꿀 내용:',
17 title: '찾기 및 바꾸기'
18} );
diff --git a/sources/plugins/find/lang/ku.js b/sources/plugins/find/lang/ku.js
new file mode 100644
index 00000000..c74fb071
--- /dev/null
+++ b/sources/plugins/find/lang/ku.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ku', {
6 find: 'گەڕان',
7 findOptions: 'هەڵبژاردەکانی گەڕان',
8 findWhat: 'گەڕان بەدووای:',
9 matchCase: 'جیاکردنەوه لەنێوان پیتی گەورەو بچووك',
10 matchCyclic: 'گەڕان لەهەموو پەڕەکه',
11 matchWord: 'تەنەا هەموو وشەکه',
12 notFoundMsg: 'هیچ دەقه گەڕانێك نەدۆزراوه.',
13 replace: 'لەبریدانان',
14 replaceAll: 'لەبریدانانی هەمووی',
15 replaceSuccessMsg: ' پێشهاتە(ی) لەبری دانرا. %1',
16 replaceWith: 'لەبریدانان به:',
17 title: 'گەڕان و لەبریدانان'
18} );
diff --git a/sources/plugins/find/lang/lt.js b/sources/plugins/find/lang/lt.js
new file mode 100644
index 00000000..91d8ef24
--- /dev/null
+++ b/sources/plugins/find/lang/lt.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'lt', {
6 find: 'Rasti',
7 findOptions: 'Paieškos nustatymai',
8 findWhat: 'Surasti tekstą:',
9 matchCase: 'Skirti didžiąsias ir mažąsias raides',
10 matchCyclic: 'Sutampantis cikliškumas',
11 matchWord: 'Atitikti pilną žodį',
12 notFoundMsg: 'Nurodytas tekstas nerastas.',
13 replace: 'Pakeisti',
14 replaceAll: 'Pakeisti viską',
15 replaceSuccessMsg: '%1 sutapimas(ų) buvo pakeisti.',
16 replaceWith: 'Pakeisti tekstu:',
17 title: 'Surasti ir pakeisti'
18} );
diff --git a/sources/plugins/find/lang/lv.js b/sources/plugins/find/lang/lv.js
new file mode 100644
index 00000000..fff75cf9
--- /dev/null
+++ b/sources/plugins/find/lang/lv.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'lv', {
6 find: 'Meklēt',
7 findOptions: 'Meklēt uzstādījumi',
8 findWhat: 'Meklēt:',
9 matchCase: 'Reģistrjūtīgs',
10 matchCyclic: 'Sakrist cikliski',
11 matchWord: 'Jāsakrīt pilnībā',
12 notFoundMsg: 'Norādītā frāze netika atrasta.',
13 replace: 'Nomainīt',
14 replaceAll: 'Aizvietot visu',
15 replaceSuccessMsg: '%1 gadījums(i) aizvietoti',
16 replaceWith: 'Nomainīt uz:',
17 title: 'Meklēt un aizvietot'
18} );
diff --git a/sources/plugins/find/lang/mk.js b/sources/plugins/find/lang/mk.js
new file mode 100644
index 00000000..d30638b4
--- /dev/null
+++ b/sources/plugins/find/lang/mk.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'mk', {
6 find: 'Find',
7 findOptions: 'Find Options',
8 findWhat: 'Find what:',
9 matchCase: 'Match case',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Match whole word',
12 notFoundMsg: 'The specified text was not found.',
13 replace: 'Replace',
14 replaceAll: 'Replace All',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Replace with:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/mn.js b/sources/plugins/find/lang/mn.js
new file mode 100644
index 00000000..e41d1429
--- /dev/null
+++ b/sources/plugins/find/lang/mn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'mn', {
6 find: 'Хайх',
7 findOptions: 'Хайх сонголтууд',
8 findWhat: 'Хайх үг/үсэг:',
9 matchCase: 'Тэнцэх төлөв',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Тэнцэх бүтэн үг',
12 notFoundMsg: 'Хайсан бичвэрийг олсонгүй.',
13 replace: 'Орлуулах',
14 replaceAll: 'Бүгдийг нь солих',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Солих үг:',
17 title: 'Хайж орлуулах'
18} );
diff --git a/sources/plugins/find/lang/ms.js b/sources/plugins/find/lang/ms.js
new file mode 100644
index 00000000..79ceca0c
--- /dev/null
+++ b/sources/plugins/find/lang/ms.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ms', {
6 find: 'Cari',
7 findOptions: 'Find Options',
8 findWhat: 'Perkataan yang dicari:',
9 matchCase: 'Padanan case huruf',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Padana Keseluruhan perkataan',
12 notFoundMsg: 'Text yang dicari tidak dijumpai.',
13 replace: 'Ganti',
14 replaceAll: 'Ganti semua',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Diganti dengan:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/nb.js b/sources/plugins/find/lang/nb.js
new file mode 100644
index 00000000..fdd559b8
--- /dev/null
+++ b/sources/plugins/find/lang/nb.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'nb', {
6 find: 'Søk',
7 findOptions: 'Søkealternativer',
8 findWhat: 'Søk etter:',
9 matchCase: 'Skill mellom store og små bokstaver',
10 matchCyclic: 'Søk i hele dokumentet',
11 matchWord: 'Bare hele ord',
12 notFoundMsg: 'Fant ikke søketeksten.',
13 replace: 'Erstatt',
14 replaceAll: 'Erstatt alle',
15 replaceSuccessMsg: '%1 tilfelle(r) erstattet.',
16 replaceWith: 'Erstatt med:',
17 title: 'Søk og erstatt'
18} );
diff --git a/sources/plugins/find/lang/nl.js b/sources/plugins/find/lang/nl.js
new file mode 100644
index 00000000..c350072b
--- /dev/null
+++ b/sources/plugins/find/lang/nl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'nl', {
6 find: 'Zoeken',
7 findOptions: 'Zoekopties',
8 findWhat: 'Zoeken naar:',
9 matchCase: 'Hoofdlettergevoelig',
10 matchCyclic: 'Doorlopend zoeken',
11 matchWord: 'Hele woord moet voorkomen',
12 notFoundMsg: 'De opgegeven tekst is niet gevonden.',
13 replace: 'Vervangen',
14 replaceAll: 'Alles vervangen',
15 replaceSuccessMsg: '%1 resultaten vervangen.',
16 replaceWith: 'Vervangen met:',
17 title: 'Zoeken en vervangen'
18} );
diff --git a/sources/plugins/find/lang/no.js b/sources/plugins/find/lang/no.js
new file mode 100644
index 00000000..6c99e793
--- /dev/null
+++ b/sources/plugins/find/lang/no.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'no', {
6 find: 'Søk',
7 findOptions: 'Søkealternativer',
8 findWhat: 'Søk etter:',
9 matchCase: 'Skill mellom store og små bokstaver',
10 matchCyclic: 'Søk i hele dokumentet',
11 matchWord: 'Bare hele ord',
12 notFoundMsg: 'Fant ikke søketeksten.',
13 replace: 'Erstatt',
14 replaceAll: 'Erstatt alle',
15 replaceSuccessMsg: '%1 tilfelle(r) erstattet.',
16 replaceWith: 'Erstatt med:',
17 title: 'Søk og erstatt'
18} );
diff --git a/sources/plugins/find/lang/pl.js b/sources/plugins/find/lang/pl.js
new file mode 100644
index 00000000..949c2a38
--- /dev/null
+++ b/sources/plugins/find/lang/pl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'pl', {
6 find: 'Znajdź',
7 findOptions: 'Opcje wyszukiwania',
8 findWhat: 'Znajdź:',
9 matchCase: 'Uwzględnij wielkość liter',
10 matchCyclic: 'Cykliczne dopasowanie',
11 matchWord: 'Całe słowa',
12 notFoundMsg: 'Nie znaleziono szukanego hasła.',
13 replace: 'Zamień',
14 replaceAll: 'Zamień wszystko',
15 replaceSuccessMsg: '%1 wystąpień zastąpionych.',
16 replaceWith: 'Zastąp przez:',
17 title: 'Znajdź i zamień'
18} );
diff --git a/sources/plugins/find/lang/pt-br.js b/sources/plugins/find/lang/pt-br.js
new file mode 100644
index 00000000..e52126c7
--- /dev/null
+++ b/sources/plugins/find/lang/pt-br.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'pt-br', {
6 find: 'Localizar',
7 findOptions: 'Opções',
8 findWhat: 'Procurar por:',
9 matchCase: 'Coincidir Maiúsculas/Minúsculas',
10 matchCyclic: 'Coincidir cíclico',
11 matchWord: 'Coincidir a palavra inteira',
12 notFoundMsg: 'O texto especificado não foi encontrado.',
13 replace: 'Substituir',
14 replaceAll: 'Substituir Tudo',
15 replaceSuccessMsg: '%1 ocorrência(s) substituída(s).',
16 replaceWith: 'Substituir por:',
17 title: 'Localizar e Substituir'
18} );
diff --git a/sources/plugins/find/lang/pt.js b/sources/plugins/find/lang/pt.js
new file mode 100644
index 00000000..19901df5
--- /dev/null
+++ b/sources/plugins/find/lang/pt.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'pt', {
6 find: 'Procurar',
7 findOptions: 'Find Options',
8 findWhat: 'Texto a procurar:',
9 matchCase: 'Maiúsculas/Minúsculas',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Coincidir com toda a palavra',
12 notFoundMsg: 'O texto especificado não foi encontrado.',
13 replace: 'Substituir',
14 replaceAll: 'Substituir Tudo',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Substituir por:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/ro.js b/sources/plugins/find/lang/ro.js
new file mode 100644
index 00000000..0760be20
--- /dev/null
+++ b/sources/plugins/find/lang/ro.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ro', {
6 find: 'Găseşte',
7 findOptions: 'Find Options',
8 findWhat: 'Găseşte:',
9 matchCase: 'Deosebeşte majuscule de minuscule (Match case)',
10 matchCyclic: 'Potrivește ciclic',
11 matchWord: 'Doar cuvintele întregi',
12 notFoundMsg: 'Textul specificat nu a fost găsit.',
13 replace: 'Înlocuieşte',
14 replaceAll: 'Înlocuieşte tot',
15 replaceSuccessMsg: '%1 căutări înlocuite.',
16 replaceWith: 'Înlocuieşte cu:',
17 title: 'Găseşte şi înlocuieşte'
18} );
diff --git a/sources/plugins/find/lang/ru.js b/sources/plugins/find/lang/ru.js
new file mode 100644
index 00000000..5667a7dd
--- /dev/null
+++ b/sources/plugins/find/lang/ru.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ru', {
6 find: 'Найти',
7 findOptions: 'Опции поиска',
8 findWhat: 'Найти:',
9 matchCase: 'Учитывать регистр',
10 matchCyclic: 'По всему тексту',
11 matchWord: 'Только слово целиком',
12 notFoundMsg: 'Искомый текст не найден.',
13 replace: 'Заменить',
14 replaceAll: 'Заменить всё',
15 replaceSuccessMsg: 'Успешно заменено %1 раз(а).',
16 replaceWith: 'Заменить на:',
17 title: 'Поиск и замена'
18} );
diff --git a/sources/plugins/find/lang/si.js b/sources/plugins/find/lang/si.js
new file mode 100644
index 00000000..2e1b1b68
--- /dev/null
+++ b/sources/plugins/find/lang/si.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'si', {
6 find: 'Find', // MISSING
7 findOptions: 'Find Options', // MISSING
8 findWhat: 'Find what:', // MISSING
9 matchCase: 'Match case', // MISSING
10 matchCyclic: 'Match cyclic', // MISSING
11 matchWord: 'Match whole word', // MISSING
12 notFoundMsg: 'The specified text was not found.', // MISSING
13 replace: 'හිලව් කිරීම',
14 replaceAll: 'සියල්ලම හිලව් කරන්න',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.', // MISSING
16 replaceWith: 'Replace with:', // MISSING
17 title: 'Find and Replace' // MISSING
18} );
diff --git a/sources/plugins/find/lang/sk.js b/sources/plugins/find/lang/sk.js
new file mode 100644
index 00000000..2b3471b1
--- /dev/null
+++ b/sources/plugins/find/lang/sk.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'sk', {
6 find: 'Hľadať',
7 findOptions: 'Nájsť možnosti',
8 findWhat: 'Čo hľadať:',
9 matchCase: 'Rozlišovať malé a veľké písmená',
10 matchCyclic: 'Cykliť zhodu',
11 matchWord: 'Len celé slová',
12 notFoundMsg: 'Hľadaný text nebol nájdený.',
13 replace: 'Nahradiť',
14 replaceAll: 'Nahradiť všetko',
15 replaceSuccessMsg: '%1 výskyt(ov) nahradených.',
16 replaceWith: 'Čím nahradiť:',
17 title: 'Nájsť a nahradiť'
18} );
diff --git a/sources/plugins/find/lang/sl.js b/sources/plugins/find/lang/sl.js
new file mode 100644
index 00000000..ce6302c4
--- /dev/null
+++ b/sources/plugins/find/lang/sl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'sl', {
6 find: 'Najdi',
7 findOptions: 'Find Options',
8 findWhat: 'Najdi:',
9 matchCase: 'Razlikuj velike in male črke',
10 matchCyclic: 'Primerjaj znake v cirilici',
11 matchWord: 'Samo cele besede',
12 notFoundMsg: 'Navedeno besedilo ni bilo najdeno.',
13 replace: 'Zamenjaj',
14 replaceAll: 'Zamenjaj vse',
15 replaceSuccessMsg: '%1 pojavitev je bilo zamenjano.',
16 replaceWith: 'Zamenjaj z:',
17 title: 'Najdi in zamenjaj'
18} );
diff --git a/sources/plugins/find/lang/sq.js b/sources/plugins/find/lang/sq.js
new file mode 100644
index 00000000..8a2e449d
--- /dev/null
+++ b/sources/plugins/find/lang/sq.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'sq', {
6 find: 'Gjej',
7 findOptions: 'Gjejë Alternativat',
8 findWhat: 'Gjej çka:',
9 matchCase: 'Rasti i përputhjes',
10 matchCyclic: 'Përputh ciklikun',
11 matchWord: 'Përputh fjalën e tërë',
12 notFoundMsg: 'Teksti i caktuar nuk mundej të gjendet.',
13 replace: 'Zëvendëso',
14 replaceAll: 'Zëvendëso të gjitha',
15 replaceSuccessMsg: '%1 rast(e) u zëvendësua(n).',
16 replaceWith: 'Zëvendëso me:',
17 title: 'Gjej dhe Zëvendëso'
18} );
diff --git a/sources/plugins/find/lang/sr-latn.js b/sources/plugins/find/lang/sr-latn.js
new file mode 100644
index 00000000..48f85a25
--- /dev/null
+++ b/sources/plugins/find/lang/sr-latn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'sr-latn', {
6 find: 'Pretraga',
7 findOptions: 'Find Options',
8 findWhat: 'Pronadi:',
9 matchCase: 'Razlikuj mala i velika slova',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Uporedi cele reci',
12 notFoundMsg: 'Traženi tekst nije pronađen.',
13 replace: 'Zamena',
14 replaceAll: 'Zameni sve',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Zameni sa:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/sr.js b/sources/plugins/find/lang/sr.js
new file mode 100644
index 00000000..9e7ae1c9
--- /dev/null
+++ b/sources/plugins/find/lang/sr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'sr', {
6 find: 'Претрага',
7 findOptions: 'Find Options',
8 findWhat: 'Пронађи:',
9 matchCase: 'Разликуј велика и мала слова',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'Упореди целе речи',
12 notFoundMsg: 'Тражени текст није пронађен.',
13 replace: 'Замена',
14 replaceAll: 'Замени све',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'Замени са:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/sv.js b/sources/plugins/find/lang/sv.js
new file mode 100644
index 00000000..3e2d1ce0
--- /dev/null
+++ b/sources/plugins/find/lang/sv.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'sv', {
6 find: 'Sök',
7 findOptions: 'Sökalternativ',
8 findWhat: 'Sök efter:',
9 matchCase: 'Skiftläge',
10 matchCyclic: 'Matcha cykliska',
11 matchWord: 'Inkludera hela ord',
12 notFoundMsg: 'Angiven text kunde ej hittas.',
13 replace: 'Ersätt',
14 replaceAll: 'Ersätt alla',
15 replaceSuccessMsg: '%1 förekomst(er) ersatta.',
16 replaceWith: 'Ersätt med:',
17 title: 'Sök och ersätt'
18} );
diff --git a/sources/plugins/find/lang/th.js b/sources/plugins/find/lang/th.js
new file mode 100644
index 00000000..d83cfd26
--- /dev/null
+++ b/sources/plugins/find/lang/th.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'th', {
6 find: 'ค้นหา',
7 findOptions: 'Find Options',
8 findWhat: 'ค้นหาคำว่า:',
9 matchCase: 'ตัวโหญ่-เล็ก ต้องตรงกัน',
10 matchCyclic: 'Match cyclic',
11 matchWord: 'ต้องตรงกันทุกคำ',
12 notFoundMsg: 'ไม่พบคำที่ค้นหา.',
13 replace: 'ค้นหาและแทนที่',
14 replaceAll: 'แทนที่ทั้งหมดที่พบ',
15 replaceSuccessMsg: '%1 occurrence(s) replaced.',
16 replaceWith: 'แทนที่ด้วย:',
17 title: 'Find and Replace'
18} );
diff --git a/sources/plugins/find/lang/tr.js b/sources/plugins/find/lang/tr.js
new file mode 100644
index 00000000..9705d9e0
--- /dev/null
+++ b/sources/plugins/find/lang/tr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'tr', {
6 find: 'Bul',
7 findOptions: 'Seçenekleri Bul',
8 findWhat: 'Aranan:',
9 matchCase: 'Büyük/küçük harf duyarlı',
10 matchCyclic: 'Eşleşen döngü',
11 matchWord: 'Kelimenin tamamı uysun',
12 notFoundMsg: 'Belirtilen yazı bulunamadı.',
13 replace: 'Değiştir',
14 replaceAll: 'Tümünü Değiştir',
15 replaceSuccessMsg: '%1 bulunanlardan değiştirildi.',
16 replaceWith: 'Bununla değiştir:',
17 title: 'Bul ve Değiştir'
18} );
diff --git a/sources/plugins/find/lang/tt.js b/sources/plugins/find/lang/tt.js
new file mode 100644
index 00000000..459892b1
--- /dev/null
+++ b/sources/plugins/find/lang/tt.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'tt', {
6 find: 'Эзләү',
7 findOptions: 'Эзләү көйләүләре',
8 findWhat: 'Нәрсә эзләргә:',
9 matchCase: 'Баш һәм юл хәрефләрен исәпкә алу',
10 matchCyclic: 'Кабатлап эзләргә',
11 matchWord: 'Сүзләрне тулысынча гына эзләү',
12 notFoundMsg: 'Эзләнгән текст табылмады.',
13 replace: 'Алмаштыру',
14 replaceAll: 'Барысын да алмаштыру',
15 replaceSuccessMsg: '%1 урында(ларда) алмаштырылган.',
16 replaceWith: 'Нәрсәгә алмаштыру:',
17 title: 'Эзләп табу һәм алмаштыру'
18} );
diff --git a/sources/plugins/find/lang/ug.js b/sources/plugins/find/lang/ug.js
new file mode 100644
index 00000000..1407e983
--- /dev/null
+++ b/sources/plugins/find/lang/ug.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'ug', {
6 find: 'ئىزدە',
7 findOptions: 'ئىزدەش تاللانمىسى',
8 findWhat: 'ئىزدە:',
9 matchCase: 'چوڭ كىچىك ھەرپنى پەرقلەندۈر',
10 matchCyclic: 'ئايلانما ماسلىشىش',
11 matchWord: 'پۈتۈن سۆز ماسلىشىش',
12 notFoundMsg: 'بەلگىلەنگەن تېكىستنى تاپالمىدى',
13 replace: 'ئالماشتۇر',
14 replaceAll: 'ھەممىنى ئالماشتۇر',
15 replaceSuccessMsg: 'جەمئى %1 جايدىكى ئالماشتۇرۇش تاماملاندى',
16 replaceWith: 'ئالماشتۇر:',
17 title: 'ئىزدەپ ئالماشتۇر'
18} );
diff --git a/sources/plugins/find/lang/uk.js b/sources/plugins/find/lang/uk.js
new file mode 100644
index 00000000..3e904836
--- /dev/null
+++ b/sources/plugins/find/lang/uk.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'uk', {
6 find: 'Пошук',
7 findOptions: 'Параметри Пошуку',
8 findWhat: 'Шукати:',
9 matchCase: 'Враховувати регістр',
10 matchCyclic: 'Циклічна заміна',
11 matchWord: 'Збіг цілих слів',
12 notFoundMsg: 'Вказаний текст не знайдено.',
13 replace: 'Заміна',
14 replaceAll: 'Замінити все',
15 replaceSuccessMsg: '%1 співпадінь(ня) замінено.',
16 replaceWith: 'Замінити на:',
17 title: 'Знайти і замінити'
18} );
diff --git a/sources/plugins/find/lang/vi.js b/sources/plugins/find/lang/vi.js
new file mode 100644
index 00000000..3a6d522b
--- /dev/null
+++ b/sources/plugins/find/lang/vi.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'vi', {
6 find: 'Tìm kiếm',
7 findOptions: 'Tìm tùy chọn',
8 findWhat: 'Tìm chuỗi:',
9 matchCase: 'Phân biệt chữ hoa/thường',
10 matchCyclic: 'Giống một phần',
11 matchWord: 'Giống toàn bộ từ',
12 notFoundMsg: 'Không tìm thấy chuỗi cần tìm.',
13 replace: 'Thay thế',
14 replaceAll: 'Thay thế tất cả',
15 replaceSuccessMsg: '%1 vị trí đã được thay thế.',
16 replaceWith: 'Thay bằng:',
17 title: 'Tìm kiếm và thay thế'
18} );
diff --git a/sources/plugins/find/lang/zh-cn.js b/sources/plugins/find/lang/zh-cn.js
new file mode 100644
index 00000000..d38bb9dd
--- /dev/null
+++ b/sources/plugins/find/lang/zh-cn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'zh-cn', {
6 find: '查找',
7 findOptions: '查找选项',
8 findWhat: '查找:',
9 matchCase: '区分大小写',
10 matchCyclic: '循环匹配',
11 matchWord: '全字匹配',
12 notFoundMsg: '指定的文本没有找到。',
13 replace: '替换',
14 replaceAll: '全部替换',
15 replaceSuccessMsg: '共完成 %1 处替换。',
16 replaceWith: '替换:',
17 title: '查找和替换'
18} );
diff --git a/sources/plugins/find/lang/zh.js b/sources/plugins/find/lang/zh.js
new file mode 100644
index 00000000..13c65c57
--- /dev/null
+++ b/sources/plugins/find/lang/zh.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'find', 'zh', {
6 find: '尋找',
7 findOptions: '尋找選項',
8 findWhat: '尋找目標:',
9 matchCase: '大小寫須相符',
10 matchCyclic: '循環搜尋',
11 matchWord: '全字拼寫須相符',
12 notFoundMsg: '找不到指定的文字。',
13 replace: '取代',
14 replaceAll: '全部取代',
15 replaceSuccessMsg: '已取代 %1 個指定項目。',
16 replaceWith: '取代成:',
17 title: '尋找及取代'
18} );
diff --git a/sources/plugins/find/plugin.js b/sources/plugins/find/plugin.js
new file mode 100644
index 00000000..bf8a3529
--- /dev/null
+++ b/sources/plugins/find/plugin.js
@@ -0,0 +1,52 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'find', {
7 requires: 'dialog',
8 // jscs:disable maximumLineLength
9 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
10 // jscs:enable maximumLineLength
11 icons: 'find,find-rtl,replace', // %REMOVE_LINE_CORE%
12 hidpi: true, // %REMOVE_LINE_CORE%
13 init: function( editor ) {
14 var findCommand = editor.addCommand( 'find', new CKEDITOR.dialogCommand( 'find' ) );
15 findCommand.canUndo = false;
16 findCommand.readOnly = 1;
17
18 var replaceCommand = editor.addCommand( 'replace', new CKEDITOR.dialogCommand( 'replace' ) );
19 replaceCommand.canUndo = false;
20
21 if ( editor.ui.addButton ) {
22 editor.ui.addButton( 'Find', {
23 label: editor.lang.find.find,
24 command: 'find',
25 toolbar: 'find,10'
26 } );
27
28 editor.ui.addButton( 'Replace', {
29 label: editor.lang.find.replace,
30 command: 'replace',
31 toolbar: 'find,20'
32 } );
33 }
34
35 CKEDITOR.dialog.add( 'find', this.path + 'dialogs/find.js' );
36 CKEDITOR.dialog.add( 'replace', this.path + 'dialogs/find.js' );
37 }
38} );
39
40/**
41 * Defines the style to be used to highlight results with the find dialog.
42 *
43 * // Highlight search results with blue on yellow.
44 * config.find_highlight = {
45 * element: 'span',
46 * styles: { 'background-color': '#ff0', color: '#00f' }
47 * };
48 *
49 * @cfg
50 * @member CKEDITOR.config
51 */
52CKEDITOR.config.find_highlight = { element: 'span', styles: { 'background-color': '#004', color: '#fff' } };
diff --git a/sources/plugins/flash/dialogs/flash.js b/sources/plugins/flash/dialogs/flash.js
new file mode 100644
index 00000000..60d5482f
--- /dev/null
+++ b/sources/plugins/flash/dialogs/flash.js
@@ -0,0 +1,647 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 // It is possible to set things in three different places.
8 // 1. As attributes in the object tag.
9 // 2. As param tags under the object tag.
10 // 3. As attributes in the embed tag.
11 // It is possible for a single attribute to be present in more than one place.
12 // So let's define a mapping between a sementic attribute and its syntactic
13 // equivalents.
14 // Then we'll set and retrieve attribute values according to the mapping,
15 // instead of having to check and set each syntactic attribute every time.
16 //
17 // Reference: http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701
18 var ATTRTYPE_OBJECT = 1,
19 ATTRTYPE_PARAM = 2,
20 ATTRTYPE_EMBED = 4;
21
22 var attributesMap = {
23 id: [ {
24 type: ATTRTYPE_OBJECT, name: 'id'
25 } ],
26 classid: [ {
27 type: ATTRTYPE_OBJECT, name: 'classid'
28 } ],
29 codebase: [ {
30 type: ATTRTYPE_OBJECT, name: 'codebase'
31 } ],
32 pluginspage: [ {
33 type: ATTRTYPE_EMBED, name: 'pluginspage'
34 } ],
35 src: [ {
36 type: ATTRTYPE_PARAM, name: 'movie'
37 }, {
38 type: ATTRTYPE_EMBED, name: 'src'
39 }, {
40 type: ATTRTYPE_OBJECT, name: 'data'
41 } ],
42 name: [ {
43 type: ATTRTYPE_EMBED, name: 'name'
44 } ],
45 align: [ {
46 type: ATTRTYPE_OBJECT, name: 'align'
47 } ],
48 'class': [ {
49 type: ATTRTYPE_OBJECT, name: 'class'
50 }, {
51 type: ATTRTYPE_EMBED, name: 'class'
52 } ],
53 width: [ {
54 type: ATTRTYPE_OBJECT, name: 'width'
55 }, {
56 type: ATTRTYPE_EMBED, name: 'width'
57 } ],
58 height: [ {
59 type: ATTRTYPE_OBJECT, name: 'height'
60 }, {
61 type: ATTRTYPE_EMBED, name: 'height'
62 } ],
63 hSpace: [ {
64 type: ATTRTYPE_OBJECT, name: 'hSpace'
65 }, {
66 type: ATTRTYPE_EMBED, name: 'hSpace'
67 } ],
68 vSpace: [ {
69 type: ATTRTYPE_OBJECT, name: 'vSpace'
70 }, {
71 type: ATTRTYPE_EMBED, name: 'vSpace'
72 } ],
73 style: [ {
74 type: ATTRTYPE_OBJECT, name: 'style'
75 }, {
76 type: ATTRTYPE_EMBED, name: 'style'
77 } ],
78 type: [ {
79 type: ATTRTYPE_EMBED, name: 'type'
80 } ]
81 };
82
83 var names = [ 'play', 'loop', 'menu', 'quality', 'scale', 'salign', 'wmode', 'bgcolor', 'base', 'flashvars', 'allowScriptAccess', 'allowFullScreen' ];
84 for ( var i = 0; i < names.length; i++ ) {
85 attributesMap[ names[ i ] ] = [ {
86 type: ATTRTYPE_EMBED, name: names[ i ]
87 }, {
88 type: ATTRTYPE_PARAM, name: names[ i ]
89 } ];
90 }
91
92 // These attributes are "true" by default and not present in editor data (when "true").
93 // Note that, though default value of "allowFullScreen" is "true", it is not listed here.
94 // "allowFullScreen" is present in editor data regardless of the value (#7634).
95 names = [ 'play', 'loop', 'menu' ];
96 for ( i = 0; i < names.length; i++ )
97 attributesMap[ names[ i ] ][ 0 ][ 'default' ] = attributesMap[ names[ i ] ][ 1 ][ 'default' ] = true;
98
99 function loadValue( objectNode, embedNode, paramMap ) {
100 var attributes = attributesMap[ this.id ];
101 if ( !attributes )
102 return;
103
104 var isCheckbox = ( this instanceof CKEDITOR.ui.dialog.checkbox );
105 for ( var i = 0; i < attributes.length; i++ ) {
106 var attrDef = attributes[ i ];
107 switch ( attrDef.type ) {
108 case ATTRTYPE_OBJECT:
109 if ( !objectNode )
110 continue;
111 if ( objectNode.getAttribute( attrDef.name ) !== null ) {
112 var value = objectNode.getAttribute( attrDef.name );
113 if ( isCheckbox ) {
114 this.setValue( value.toLowerCase() == 'true' );
115 } else {
116 this.setValue( value );
117 }
118 return;
119 } else if ( isCheckbox ) {
120 this.setValue( !!attrDef['default'] );
121 }
122 break;
123 case ATTRTYPE_PARAM:
124 if ( !objectNode ) {
125 continue;
126 }
127 if ( attrDef.name in paramMap ) {
128 value = paramMap[ attrDef.name ];
129 if ( isCheckbox )
130 this.setValue( value.toLowerCase() == 'true' );
131 else
132 this.setValue( value );
133 return;
134 } else if ( isCheckbox ) {
135 this.setValue( !!attrDef[ 'default' ] );
136 }
137 break;
138 case ATTRTYPE_EMBED:
139 if ( !embedNode )
140 continue;
141 if ( embedNode.getAttribute( attrDef.name ) ) {
142 value = embedNode.getAttribute( attrDef.name );
143 if ( isCheckbox )
144 this.setValue( value.toLowerCase() == 'true' );
145 else
146 this.setValue( value );
147 return;
148 } else if ( isCheckbox ) {
149 this.setValue( !!attrDef[ 'default' ] );
150 }
151 }
152 }
153 }
154
155 function commitValue( objectNode, embedNode, paramMap ) {
156 var attributes = attributesMap[ this.id ];
157 if ( !attributes )
158 return;
159
160 var isRemove = ( this.getValue() === '' ),
161 isCheckbox = ( this instanceof CKEDITOR.ui.dialog.checkbox );
162
163 for ( var i = 0; i < attributes.length; i++ ) {
164 var attrDef = attributes[ i ];
165 switch ( attrDef.type ) {
166 case ATTRTYPE_OBJECT:
167 // Avoid applying the data attribute when not needed (#7733)
168 if ( !objectNode || ( attrDef.name == 'data' && embedNode && !objectNode.hasAttribute( 'data' ) ) )
169 continue;
170 var value = this.getValue();
171 if ( isRemove || isCheckbox && value === attrDef[ 'default' ] )
172 objectNode.removeAttribute( attrDef.name );
173 else
174 objectNode.setAttribute( attrDef.name, value );
175 break;
176 case ATTRTYPE_PARAM:
177 if ( !objectNode )
178 continue;
179 value = this.getValue();
180 if ( isRemove || isCheckbox && value === attrDef[ 'default' ] ) {
181 if ( attrDef.name in paramMap )
182 paramMap[ attrDef.name ].remove();
183 } else {
184 if ( attrDef.name in paramMap )
185 paramMap[ attrDef.name ].setAttribute( 'value', value );
186 else {
187 var param = CKEDITOR.dom.element.createFromHtml( '<cke:param></cke:param>', objectNode.getDocument() );
188 param.setAttributes( { name: attrDef.name, value: value } );
189 if ( objectNode.getChildCount() < 1 )
190 param.appendTo( objectNode );
191 else
192 param.insertBefore( objectNode.getFirst() );
193 }
194 }
195 break;
196 case ATTRTYPE_EMBED:
197 if ( !embedNode )
198 continue;
199 value = this.getValue();
200 if ( isRemove || isCheckbox && value === attrDef[ 'default' ] )
201 embedNode.removeAttribute( attrDef.name );
202 else {
203 embedNode.setAttribute( attrDef.name, value );
204 }
205 }
206 }
207 }
208
209 CKEDITOR.dialog.add( 'flash', function( editor ) {
210 var makeObjectTag = !editor.config.flashEmbedTagOnly,
211 makeEmbedTag = editor.config.flashAddEmbedTag || editor.config.flashEmbedTagOnly;
212
213 var previewPreloader,
214 previewAreaHtml = '<div>' + CKEDITOR.tools.htmlEncode( editor.lang.common.preview ) + '<br>' +
215 '<div id="cke_FlashPreviewLoader' + CKEDITOR.tools.getNextNumber() + '" style="display:none"><div class="loading">&nbsp;</div></div>' +
216 '<div id="cke_FlashPreviewBox' + CKEDITOR.tools.getNextNumber() + '" class="FlashPreviewBox"></div></div>';
217
218 return {
219 title: editor.lang.flash.title,
220 minWidth: 420,
221 minHeight: 310,
222 onShow: function() {
223 // Clear previously saved elements.
224 this.fakeImage = this.objectNode = this.embedNode = null;
225 previewPreloader = new CKEDITOR.dom.element( 'embed', editor.document );
226
227 // Try to detect any embed or object tag that has Flash parameters.
228 var fakeImage = this.getSelectedElement();
229 if ( fakeImage && fakeImage.data( 'cke-real-element-type' ) && fakeImage.data( 'cke-real-element-type' ) == 'flash' ) {
230 this.fakeImage = fakeImage;
231
232 var realElement = editor.restoreRealElement( fakeImage ),
233 objectNode = null,
234 embedNode = null,
235 paramMap = {};
236 if ( realElement.getName() == 'cke:object' ) {
237 objectNode = realElement;
238 var embedList = objectNode.getElementsByTag( 'embed', 'cke' );
239 if ( embedList.count() > 0 )
240 embedNode = embedList.getItem( 0 );
241 var paramList = objectNode.getElementsByTag( 'param', 'cke' );
242 for ( var i = 0, length = paramList.count(); i < length; i++ ) {
243 var item = paramList.getItem( i ),
244 name = item.getAttribute( 'name' ),
245 value = item.getAttribute( 'value' );
246 paramMap[ name ] = value;
247 }
248 } else if ( realElement.getName() == 'cke:embed' ) {
249 embedNode = realElement;
250 }
251
252 this.objectNode = objectNode;
253 this.embedNode = embedNode;
254
255 this.setupContent( objectNode, embedNode, paramMap, fakeImage );
256 }
257 },
258 onOk: function() {
259 // If there's no selected object or embed, create one. Otherwise, reuse the
260 // selected object and embed nodes.
261 var objectNode = null,
262 embedNode = null,
263 paramMap = null;
264 if ( !this.fakeImage ) {
265 if ( makeObjectTag ) {
266 objectNode = CKEDITOR.dom.element.createFromHtml( '<cke:object></cke:object>', editor.document );
267 var attributes = {
268 classid: 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',
269 codebase: 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'
270 };
271 objectNode.setAttributes( attributes );
272 }
273 if ( makeEmbedTag ) {
274 embedNode = CKEDITOR.dom.element.createFromHtml( '<cke:embed></cke:embed>', editor.document );
275 embedNode.setAttributes( {
276 type: 'application/x-shockwave-flash',
277 pluginspage: 'http://www.macromedia.com/go/getflashplayer'
278 } );
279 if ( objectNode )
280 embedNode.appendTo( objectNode );
281 }
282 } else {
283 objectNode = this.objectNode;
284 embedNode = this.embedNode;
285 }
286
287 // Produce the paramMap if there's an object tag.
288 if ( objectNode ) {
289 paramMap = {};
290 var paramList = objectNode.getElementsByTag( 'param', 'cke' );
291 for ( var i = 0, length = paramList.count(); i < length; i++ )
292 paramMap[ paramList.getItem( i ).getAttribute( 'name' ) ] = paramList.getItem( i );
293 }
294
295 // A subset of the specified attributes/styles
296 // should also be applied on the fake element to
297 // have better visual effect. (#5240)
298 var extraStyles = {},
299 extraAttributes = {};
300 this.commitContent( objectNode, embedNode, paramMap, extraStyles, extraAttributes );
301
302 // Refresh the fake image.
303 var newFakeImage = editor.createFakeElement( objectNode || embedNode, 'cke_flash', 'flash', true );
304 newFakeImage.setAttributes( extraAttributes );
305 newFakeImage.setStyles( extraStyles );
306 if ( this.fakeImage ) {
307 newFakeImage.replace( this.fakeImage );
308 editor.getSelection().selectElement( newFakeImage );
309 } else {
310 editor.insertElement( newFakeImage );
311 }
312 },
313
314 onHide: function() {
315 if ( this.preview )
316 this.preview.setHtml( '' );
317 },
318
319 contents: [ {
320 id: 'info',
321 label: editor.lang.common.generalTab,
322 accessKey: 'I',
323 elements: [ {
324 type: 'vbox',
325 padding: 0,
326 children: [ {
327 type: 'hbox',
328 widths: [ '280px', '110px' ],
329 align: 'right',
330 children: [ {
331 id: 'src',
332 type: 'text',
333 label: editor.lang.common.url,
334 required: true,
335 validate: CKEDITOR.dialog.validate.notEmpty( editor.lang.flash.validateSrc ),
336 setup: loadValue,
337 commit: commitValue,
338 onLoad: function() {
339 var dialog = this.getDialog(),
340 updatePreview = function( src ) {
341 // Query the preloader to figure out the url impacted by based href.
342 previewPreloader.setAttribute( 'src', src );
343 dialog.preview.setHtml( '<embed height="100%" width="100%" src="' + CKEDITOR.tools.htmlEncode( previewPreloader.getAttribute( 'src' ) ) +
344 '" type="application/x-shockwave-flash"></embed>' );
345 };
346 // Preview element
347 dialog.preview = dialog.getContentElement( 'info', 'preview' ).getElement().getChild( 3 );
348
349 // Sync on inital value loaded.
350 this.on( 'change', function( evt ) {
351
352 if ( evt.data && evt.data.value )
353 updatePreview( evt.data.value );
354 } );
355 // Sync when input value changed.
356 this.getInputElement().on( 'change', function() {
357
358 updatePreview( this.getValue() );
359 }, this );
360 }
361 },
362 {
363 type: 'button',
364 id: 'browse',
365 filebrowser: 'info:src',
366 hidden: true,
367 // v-align with the 'src' field.
368 // TODO: We need something better than a fixed size here.
369 style: 'display:inline-block;margin-top:14px;',
370 label: editor.lang.common.browseServer
371 } ]
372 } ]
373 },
374 {
375 type: 'hbox',
376 widths: [ '25%', '25%', '25%', '25%', '25%' ],
377 children: [ {
378 type: 'text',
379 id: 'width',
380 requiredContent: 'embed[width]',
381 style: 'width:95px',
382 label: editor.lang.common.width,
383 validate: CKEDITOR.dialog.validate.htmlLength( editor.lang.common.invalidHtmlLength.replace( '%1', editor.lang.common.width ) ),
384 setup: loadValue,
385 commit: commitValue
386 },
387 {
388 type: 'text',
389 id: 'height',
390 requiredContent: 'embed[height]',
391 style: 'width:95px',
392 label: editor.lang.common.height,
393 validate: CKEDITOR.dialog.validate.htmlLength( editor.lang.common.invalidHtmlLength.replace( '%1', editor.lang.common.height ) ),
394 setup: loadValue,
395 commit: commitValue
396 },
397 {
398 type: 'text',
399 id: 'hSpace',
400 requiredContent: 'embed[hspace]',
401 style: 'width:95px',
402 label: editor.lang.flash.hSpace,
403 validate: CKEDITOR.dialog.validate.integer( editor.lang.flash.validateHSpace ),
404 setup: loadValue,
405 commit: commitValue
406 },
407 {
408 type: 'text',
409 id: 'vSpace',
410 requiredContent: 'embed[vspace]',
411 style: 'width:95px',
412 label: editor.lang.flash.vSpace,
413 validate: CKEDITOR.dialog.validate.integer( editor.lang.flash.validateVSpace ),
414 setup: loadValue,
415 commit: commitValue
416 } ]
417 },
418
419 {
420 type: 'vbox',
421 children: [ {
422 type: 'html',
423 id: 'preview',
424 style: 'width:95%;',
425 html: previewAreaHtml
426 } ]
427 } ]
428 },
429 {
430 id: 'Upload',
431 hidden: true,
432 filebrowser: 'uploadButton',
433 label: editor.lang.common.upload,
434 elements: [ {
435 type: 'file',
436 id: 'upload',
437 label: editor.lang.common.upload,
438 size: 38
439 },
440 {
441 type: 'fileButton',
442 id: 'uploadButton',
443 label: editor.lang.common.uploadSubmit,
444 filebrowser: 'info:src',
445 'for': [ 'Upload', 'upload' ]
446 } ]
447 },
448 {
449 id: 'properties',
450 label: editor.lang.flash.propertiesTab,
451 elements: [ {
452 type: 'hbox',
453 widths: [ '50%', '50%' ],
454 children: [ {
455 id: 'scale',
456 type: 'select',
457 requiredContent: 'embed[scale]',
458 label: editor.lang.flash.scale,
459 'default': '',
460 style: 'width : 100%;',
461 items: [
462 [ editor.lang.common.notSet, '' ],
463 [ editor.lang.flash.scaleAll, 'showall' ],
464 [ editor.lang.flash.scaleNoBorder, 'noborder' ],
465 [ editor.lang.flash.scaleFit, 'exactfit' ]
466 ],
467 setup: loadValue,
468 commit: commitValue
469 },
470 {
471 id: 'allowScriptAccess',
472 type: 'select',
473 requiredContent: 'embed[allowscriptaccess]',
474 label: editor.lang.flash.access,
475 'default': '',
476 style: 'width : 100%;',
477 items: [
478 [ editor.lang.common.notSet, '' ],
479 [ editor.lang.flash.accessAlways, 'always' ],
480 [ editor.lang.flash.accessSameDomain, 'samedomain' ],
481 [ editor.lang.flash.accessNever, 'never' ]
482 ],
483 setup: loadValue,
484 commit: commitValue
485 } ]
486 },
487 {
488 type: 'hbox',
489 widths: [ '50%', '50%' ],
490 children: [ {
491 id: 'wmode',
492 type: 'select',
493 requiredContent: 'embed[wmode]',
494 label: editor.lang.flash.windowMode,
495 'default': '',
496 style: 'width : 100%;',
497 items: [
498 [ editor.lang.common.notSet, '' ],
499 [ editor.lang.flash.windowModeWindow, 'window' ],
500 [ editor.lang.flash.windowModeOpaque, 'opaque' ],
501 [ editor.lang.flash.windowModeTransparent, 'transparent' ]
502 ],
503 setup: loadValue,
504 commit: commitValue
505 },
506 {
507 id: 'quality',
508 type: 'select',
509 requiredContent: 'embed[quality]',
510 label: editor.lang.flash.quality,
511 'default': 'high',
512 style: 'width : 100%;',
513 items: [
514 [ editor.lang.common.notSet, '' ],
515 [ editor.lang.flash.qualityBest, 'best' ],
516 [ editor.lang.flash.qualityHigh, 'high' ],
517 [ editor.lang.flash.qualityAutoHigh, 'autohigh' ],
518 [ editor.lang.flash.qualityMedium, 'medium' ],
519 [ editor.lang.flash.qualityAutoLow, 'autolow' ],
520 [ editor.lang.flash.qualityLow, 'low' ]
521 ],
522 setup: loadValue,
523 commit: commitValue
524 } ]
525 },
526 {
527 type: 'hbox',
528 widths: [ '50%', '50%' ],
529 children: [ {
530 id: 'align',
531 type: 'select',
532 requiredContent: 'object[align]',
533 label: editor.lang.common.align,
534 'default': '',
535 style: 'width : 100%;',
536 items: [
537 [ editor.lang.common.notSet, '' ],
538 [ editor.lang.common.alignLeft, 'left' ],
539 [ editor.lang.flash.alignAbsBottom, 'absBottom' ],
540 [ editor.lang.flash.alignAbsMiddle, 'absMiddle' ],
541 [ editor.lang.flash.alignBaseline, 'baseline' ],
542 [ editor.lang.common.alignBottom, 'bottom' ],
543 [ editor.lang.common.alignMiddle, 'middle' ],
544 [ editor.lang.common.alignRight, 'right' ],
545 [ editor.lang.flash.alignTextTop, 'textTop' ],
546 [ editor.lang.common.alignTop, 'top' ]
547 ],
548 setup: loadValue,
549 commit: function( objectNode, embedNode, paramMap, extraStyles, extraAttributes ) {
550 var value = this.getValue();
551 commitValue.apply( this, arguments );
552 value && ( extraAttributes.align = value );
553 }
554 },
555 {
556 type: 'html',
557 html: '<div></div>'
558 } ]
559 },
560 {
561 type: 'fieldset',
562 label: CKEDITOR.tools.htmlEncode( editor.lang.flash.flashvars ),
563 children: [ {
564 type: 'vbox',
565 padding: 0,
566 children: [ {
567 type: 'checkbox',
568 id: 'menu',
569 label: editor.lang.flash.chkMenu,
570 'default': true,
571 setup: loadValue,
572 commit: commitValue
573 },
574 {
575 type: 'checkbox',
576 id: 'play',
577 label: editor.lang.flash.chkPlay,
578 'default': true,
579 setup: loadValue,
580 commit: commitValue
581 },
582 {
583 type: 'checkbox',
584 id: 'loop',
585 label: editor.lang.flash.chkLoop,
586 'default': true,
587 setup: loadValue,
588 commit: commitValue
589 },
590 {
591 type: 'checkbox',
592 id: 'allowFullScreen',
593 label: editor.lang.flash.chkFull,
594 'default': true,
595 setup: loadValue,
596 commit: commitValue
597 } ]
598 } ]
599 } ]
600 },
601 {
602 id: 'advanced',
603 label: editor.lang.common.advancedTab,
604 elements: [ {
605 type: 'hbox',
606 children: [ {
607 type: 'text',
608 id: 'id',
609 requiredContent: 'object[id]',
610 label: editor.lang.common.id,
611 setup: loadValue,
612 commit: commitValue
613 } ]
614 },
615 {
616 type: 'hbox',
617 widths: [ '45%', '55%' ],
618 children: [ {
619 type: 'text',
620 id: 'bgcolor',
621 requiredContent: 'embed[bgcolor]',
622 label: editor.lang.flash.bgcolor,
623 setup: loadValue,
624 commit: commitValue
625 },
626 {
627 type: 'text',
628 id: 'class',
629 requiredContent: 'embed(cke-xyz)', // Random text like 'xyz' will check if all are allowed.
630 label: editor.lang.common.cssClass,
631 setup: loadValue,
632 commit: commitValue
633 } ]
634 },
635 {
636 type: 'text',
637 id: 'style',
638 requiredContent: 'embed{cke-xyz}', // Random text like 'xyz' will check if all are allowed.
639 validate: CKEDITOR.dialog.validate.inlineStyle( editor.lang.common.invalidInlineStyle ),
640 label: editor.lang.common.cssStyle,
641 setup: loadValue,
642 commit: commitValue
643 } ]
644 } ]
645 };
646 } );
647} )();
diff --git a/sources/plugins/flash/icons/flash.png b/sources/plugins/flash/icons/flash.png
new file mode 100644
index 00000000..df7b1c60
--- /dev/null
+++ b/sources/plugins/flash/icons/flash.png
Binary files differ
diff --git a/sources/plugins/flash/icons/hidpi/flash.png b/sources/plugins/flash/icons/hidpi/flash.png
new file mode 100644
index 00000000..7ad0e388
--- /dev/null
+++ b/sources/plugins/flash/icons/hidpi/flash.png
Binary files differ
diff --git a/sources/plugins/flash/images/placeholder.png b/sources/plugins/flash/images/placeholder.png
new file mode 100644
index 00000000..0bc6caa7
--- /dev/null
+++ b/sources/plugins/flash/images/placeholder.png
Binary files differ
diff --git a/sources/plugins/flash/lang/af.js b/sources/plugins/flash/lang/af.js
new file mode 100644
index 00000000..f34ac663
--- /dev/null
+++ b/sources/plugins/flash/lang/af.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'af', {
6 access: 'Skrip toegang',
7 accessAlways: 'Altyd',
8 accessNever: 'Nooit',
9 accessSameDomain: 'Selfde domeinnaam',
10 alignAbsBottom: 'Absoluut-onder',
11 alignAbsMiddle: 'Absoluut-middel',
12 alignBaseline: 'Basislyn',
13 alignTextTop: 'Teks bo',
14 bgcolor: 'Agtergrondkleur',
15 chkFull: 'Laat volledige skerm toe',
16 chkLoop: 'Herhaal',
17 chkMenu: 'Flash spyskaart aan',
18 chkPlay: 'Speel outomaties',
19 flashvars: 'Veranderlikes vir Flash',
20 hSpace: 'HSpasie',
21 properties: 'Flash eienskappe',
22 propertiesTab: 'Eienskappe',
23 quality: 'Kwaliteit',
24 qualityAutoHigh: 'Outomaties hoog',
25 qualityAutoLow: 'Outomaties laag',
26 qualityBest: 'Beste',
27 qualityHigh: 'Hoog',
28 qualityLow: 'Laag',
29 qualityMedium: 'Gemiddeld',
30 scale: 'Skaal',
31 scaleAll: 'Wys alles',
32 scaleFit: 'Presiese pas',
33 scaleNoBorder: 'Geen rand',
34 title: 'Flash eienskappe',
35 vSpace: 'VSpasie',
36 validateHSpace: 'HSpasie moet \'n heelgetal wees.',
37 validateSrc: 'Voeg die URL in',
38 validateVSpace: 'VSpasie moet \'n heelgetal wees.',
39 windowMode: 'Venster modus',
40 windowModeOpaque: 'Ondeursigtig',
41 windowModeTransparent: 'Deursigtig',
42 windowModeWindow: 'Venster'
43} );
diff --git a/sources/plugins/flash/lang/ar.js b/sources/plugins/flash/lang/ar.js
new file mode 100644
index 00000000..ce91616f
--- /dev/null
+++ b/sources/plugins/flash/lang/ar.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ar', {
6 access: 'دخول النص البرمجي',
7 accessAlways: 'دائماً',
8 accessNever: 'مطلقاً',
9 accessSameDomain: 'نفس النطاق',
10 alignAbsBottom: 'أسفل النص',
11 alignAbsMiddle: 'وسط السطر',
12 alignBaseline: 'على السطر',
13 alignTextTop: 'أعلى النص',
14 bgcolor: 'لون الخلفية',
15 chkFull: 'ملء الشاشة',
16 chkLoop: 'تكرار',
17 chkMenu: 'تمكين قائمة فيلم الفلاش',
18 chkPlay: 'تشغيل تلقائي',
19 flashvars: 'متغيرات الفلاش',
20 hSpace: 'تباعد أفقي',
21 properties: 'خصائص الفلاش',
22 propertiesTab: 'الخصائص',
23 quality: 'جودة',
24 qualityAutoHigh: 'عالية تلقائياً',
25 qualityAutoLow: 'منخفضة تلقائياً',
26 qualityBest: 'أفضل',
27 qualityHigh: 'عالية',
28 qualityLow: 'منخفضة',
29 qualityMedium: 'متوسطة',
30 scale: 'الحجم',
31 scaleAll: 'إظهار الكل',
32 scaleFit: 'ضبط تام',
33 scaleNoBorder: 'بلا حدود',
34 title: 'خصائص فيلم الفلاش',
35 vSpace: 'تباعد عمودي',
36 validateHSpace: 'HSpace يجب أن يكون عدداً.',
37 validateSrc: 'فضلاً أدخل عنوان الموقع الذي يشير إليه الرابط',
38 validateVSpace: 'VSpace يجب أن يكون عدداً.',
39 windowMode: 'وضع النافذة',
40 windowModeOpaque: 'غير شفاف',
41 windowModeTransparent: 'شفاف',
42 windowModeWindow: 'نافذة'
43} );
diff --git a/sources/plugins/flash/lang/bg.js b/sources/plugins/flash/lang/bg.js
new file mode 100644
index 00000000..5d0b28d0
--- /dev/null
+++ b/sources/plugins/flash/lang/bg.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'bg', {
6 access: 'Достъп до скрипт',
7 accessAlways: 'Винаги',
8 accessNever: 'Никога',
9 accessSameDomain: 'Същият домейн',
10 alignAbsBottom: 'Най-долу',
11 alignAbsMiddle: 'Точно по средата',
12 alignBaseline: 'Базова линия',
13 alignTextTop: 'Върху текста',
14 bgcolor: 'Цвят на фона',
15 chkFull: 'Включи на цял екран',
16 chkLoop: 'Цикъл',
17 chkMenu: 'Разрешено Flash меню',
18 chkPlay: 'Авто. пускане',
19 flashvars: 'Променливи за Флаш',
20 hSpace: 'Хоризонтален отстъп',
21 properties: 'Настройки за флаш',
22 propertiesTab: 'Настройки',
23 quality: 'Качество',
24 qualityAutoHigh: 'Авто. високо',
25 qualityAutoLow: 'Авто. ниско',
26 qualityBest: 'Отлично',
27 qualityHigh: 'Високо',
28 qualityLow: 'Ниско',
29 qualityMedium: 'Средно',
30 scale: 'Оразмеряване',
31 scaleAll: 'Показва всичко',
32 scaleFit: 'Според мястото',
33 scaleNoBorder: 'Без рамка',
34 title: 'Настройки за флаш',
35 vSpace: 'Вертикален отстъп',
36 validateHSpace: 'HSpace трябва да е число.',
37 validateSrc: 'Уеб адреса не трябва да е празен.',
38 validateVSpace: 'VSpace трябва да е число.',
39 windowMode: 'Режим на прозореца',
40 windowModeOpaque: 'Плътност',
41 windowModeTransparent: 'Прозрачност',
42 windowModeWindow: 'Прозорец'
43} );
diff --git a/sources/plugins/flash/lang/bn.js b/sources/plugins/flash/lang/bn.js
new file mode 100644
index 00000000..1d713ab5
--- /dev/null
+++ b/sources/plugins/flash/lang/bn.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'bn', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs নীচে',
11 alignAbsMiddle: 'Abs উপর',
12 alignBaseline: 'মূল রেখা',
13 alignTextTop: 'টেক্সট উপর',
14 bgcolor: 'বেকগ্রাউন্ড রং',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'লূপ',
17 chkMenu: 'ফ্ল্যাশ মেনু এনাবল কর',
18 chkPlay: 'অটো প্লে',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'হরাইজন্টাল স্পেস',
21 properties: 'ফ্লাশ প্রোপার্টি',
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'স্কেল',
31 scaleAll: 'সব দেখাও',
32 scaleFit: 'নিখুঁত ফিট',
33 scaleNoBorder: 'কোনো বর্ডার নেই',
34 title: 'ফ্ল্যাশ প্রোপার্টি',
35 vSpace: 'ভার্টিকেল স্পেস',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'অনুগ্রহ করে URL লিংক টাইপ করুন',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/bs.js b/sources/plugins/flash/lang/bs.js
new file mode 100644
index 00000000..0219f2a7
--- /dev/null
+++ b/sources/plugins/flash/lang/bs.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'bs', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs dole',
11 alignAbsMiddle: 'Abs sredina',
12 alignBaseline: 'Bazno',
13 alignTextTop: 'Vrh teksta',
14 bgcolor: 'Boja pozadine',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Loop', // MISSING
17 chkMenu: 'Enable Flash Menu', // MISSING
18 chkPlay: 'Auto Play', // MISSING
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'HSpace',
21 properties: 'Flash Properties', // MISSING
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Scale', // MISSING
31 scaleAll: 'Show all', // MISSING
32 scaleFit: 'Exact Fit', // MISSING
33 scaleNoBorder: 'No Border', // MISSING
34 title: 'Flash Properties', // MISSING
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'Molimo ukucajte URL link',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/ca.js b/sources/plugins/flash/lang/ca.js
new file mode 100644
index 00000000..fdeefa07
--- /dev/null
+++ b/sources/plugins/flash/lang/ca.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ca', {
6 access: 'Accés a scripts',
7 accessAlways: 'Sempre',
8 accessNever: 'Mai',
9 accessSameDomain: 'El mateix domini',
10 alignAbsBottom: 'Abs Bottom',
11 alignAbsMiddle: 'Abs Middle',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Text Superior',
14 bgcolor: 'Color de Fons',
15 chkFull: 'Permetre la pantalla completa',
16 chkLoop: 'Bucle',
17 chkMenu: 'Habilita menú Flash',
18 chkPlay: 'Reprodució automàtica',
19 flashvars: 'Variables de Flash',
20 hSpace: 'Espaiat horitzontal',
21 properties: 'Propietats del Flash',
22 propertiesTab: 'Propietats',
23 quality: 'Qualitat',
24 qualityAutoHigh: 'Alta automàtica',
25 qualityAutoLow: 'Baixa automàtica',
26 qualityBest: 'La millor',
27 qualityHigh: 'Alta',
28 qualityLow: 'Baixa',
29 qualityMedium: 'Mitjana',
30 scale: 'Escala',
31 scaleAll: 'Mostra-ho tot',
32 scaleFit: 'Mida exacta',
33 scaleNoBorder: 'Sense vores',
34 title: 'Propietats del Flash',
35 vSpace: 'Espaiat vertical',
36 validateHSpace: 'L\'espaiat horitzontal ha de ser un número.',
37 validateSrc: 'La URL no pot estar buida.',
38 validateVSpace: 'L\'espaiat vertical ha de ser un número.',
39 windowMode: 'Mode de la finestra',
40 windowModeOpaque: 'Opaca',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Finestra'
43} );
diff --git a/sources/plugins/flash/lang/cs.js b/sources/plugins/flash/lang/cs.js
new file mode 100644
index 00000000..a28e00e9
--- /dev/null
+++ b/sources/plugins/flash/lang/cs.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'cs', {
6 access: 'Přístup ke skriptu',
7 accessAlways: 'Vždy',
8 accessNever: 'Nikdy',
9 accessSameDomain: 'Ve stejné doméně',
10 alignAbsBottom: 'Zcela dolů',
11 alignAbsMiddle: 'Doprostřed',
12 alignBaseline: 'Na účaří',
13 alignTextTop: 'Na horní okraj textu',
14 bgcolor: 'Barva pozadí',
15 chkFull: 'Povolit celoobrazovkový režim',
16 chkLoop: 'Opakování',
17 chkMenu: 'Nabídka Flash',
18 chkPlay: 'Automatické spuštění',
19 flashvars: 'Proměnné pro Flash',
20 hSpace: 'Horizontální mezera',
21 properties: 'Vlastnosti Flashe',
22 propertiesTab: 'Vlastnosti',
23 quality: 'Kvalita',
24 qualityAutoHigh: 'Vysoká - auto',
25 qualityAutoLow: 'Nízká - auto',
26 qualityBest: 'Nejlepší',
27 qualityHigh: 'Vysoká',
28 qualityLow: 'Nejnižší',
29 qualityMedium: 'Střední',
30 scale: 'Zobrazit',
31 scaleAll: 'Zobrazit vše',
32 scaleFit: 'Přizpůsobit',
33 scaleNoBorder: 'Bez okraje',
34 title: 'Vlastnosti Flashe',
35 vSpace: 'Vertikální mezera',
36 validateHSpace: 'Zadaná horizontální mezera musí být číslo.',
37 validateSrc: 'Zadejte prosím URL odkazu',
38 validateVSpace: 'Zadaná vertikální mezera musí být číslo.',
39 windowMode: 'Režim okna',
40 windowModeOpaque: 'Neprůhledné',
41 windowModeTransparent: 'Průhledné',
42 windowModeWindow: 'Okno'
43} );
diff --git a/sources/plugins/flash/lang/cy.js b/sources/plugins/flash/lang/cy.js
new file mode 100644
index 00000000..e581eac1
--- /dev/null
+++ b/sources/plugins/flash/lang/cy.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'cy', {
6 access: 'Mynediad Sgript',
7 accessAlways: 'Pob amser',
8 accessNever: 'Byth',
9 accessSameDomain: 'R\'un parth',
10 alignAbsBottom: 'Gwaelod Abs',
11 alignAbsMiddle: 'Canol Abs',
12 alignBaseline: 'Baslinell',
13 alignTextTop: 'Testun Top',
14 bgcolor: 'Lliw cefndir',
15 chkFull: 'Caniatàu Sgrin Llawn',
16 chkLoop: 'Lwpio',
17 chkMenu: 'Galluogi Dewislen Flash',
18 chkPlay: 'AwtoChwarae',
19 flashvars: 'Newidynnau ar gyfer Flash',
20 hSpace: 'BwlchLl',
21 properties: 'Priodweddau Flash',
22 propertiesTab: 'Priodweddau',
23 quality: 'Ansawdd',
24 qualityAutoHigh: 'Uchel Awto',
25 qualityAutoLow: 'Isel Awto',
26 qualityBest: 'Gorau',
27 qualityHigh: 'Uchel',
28 qualityLow: 'Isel',
29 qualityMedium: 'Canolig',
30 scale: 'Graddfa',
31 scaleAll: 'Dangos pob',
32 scaleFit: 'Ffit Union',
33 scaleNoBorder: 'Dim Ymyl',
34 title: 'Priodweddau Flash',
35 vSpace: 'BwlchF',
36 validateHSpace: 'Rhaid i\'r BwlchLl fod yn rhif.',
37 validateSrc: 'Ni all yr URL fod yn wag.',
38 validateVSpace: 'Rhaid i\'r BwlchF fod yn rhif.',
39 windowMode: 'Modd ffenestr',
40 windowModeOpaque: 'Afloyw',
41 windowModeTransparent: 'Tryloyw',
42 windowModeWindow: 'Ffenestr'
43} );
diff --git a/sources/plugins/flash/lang/da.js b/sources/plugins/flash/lang/da.js
new file mode 100644
index 00000000..453a3e03
--- /dev/null
+++ b/sources/plugins/flash/lang/da.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'da', {
6 access: 'Scriptadgang',
7 accessAlways: 'Altid',
8 accessNever: 'Aldrig',
9 accessSameDomain: 'Samme domæne',
10 alignAbsBottom: 'Absolut nederst',
11 alignAbsMiddle: 'Absolut centreret',
12 alignBaseline: 'Grundlinje',
13 alignTextTop: 'Toppen af teksten',
14 bgcolor: 'Baggrundsfarve',
15 chkFull: 'Tillad fuldskærm',
16 chkLoop: 'Gentagelse',
17 chkMenu: 'Vis Flash-menu',
18 chkPlay: 'Automatisk afspilning',
19 flashvars: 'Variabler for Flash',
20 hSpace: 'Vandret margen',
21 properties: 'Egenskaber for Flash',
22 propertiesTab: 'Egenskaber',
23 quality: 'Kvalitet',
24 qualityAutoHigh: 'Auto høj',
25 qualityAutoLow: 'Auto lav',
26 qualityBest: 'Bedste',
27 qualityHigh: 'Høj',
28 qualityLow: 'Lav',
29 qualityMedium: 'Medium',
30 scale: 'Skalér',
31 scaleAll: 'Vis alt',
32 scaleFit: 'Tilpas størrelse',
33 scaleNoBorder: 'Ingen ramme',
34 title: 'Egenskaber for Flash',
35 vSpace: 'Lodret margen',
36 validateHSpace: 'Vandret margen skal være et tal.',
37 validateSrc: 'Indtast hyperlink URL!',
38 validateVSpace: 'Lodret margen skal være et tal.',
39 windowMode: 'Vinduestilstand',
40 windowModeOpaque: 'Gennemsigtig (opaque)',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Vindue'
43} );
diff --git a/sources/plugins/flash/lang/de.js b/sources/plugins/flash/lang/de.js
new file mode 100644
index 00000000..b974d827
--- /dev/null
+++ b/sources/plugins/flash/lang/de.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'de', {
6 access: 'Skriptzugriff',
7 accessAlways: 'Immer',
8 accessNever: 'Nie',
9 accessSameDomain: 'Gleiche Domain',
10 alignAbsBottom: 'Abs Unten',
11 alignAbsMiddle: 'Abs Mitte',
12 alignBaseline: 'Basislinie',
13 alignTextTop: 'Text oben',
14 bgcolor: 'Hintergrundfarbe',
15 chkFull: 'Vollbildmodus erlauben',
16 chkLoop: 'Endlosschleife',
17 chkMenu: 'Flash-Menü aktivieren',
18 chkPlay: 'Automatisch Abspielen',
19 flashvars: 'Variablen für Flash',
20 hSpace: 'Horizontal-Abstand',
21 properties: 'Flash-Eigenschaften',
22 propertiesTab: 'Eigenschaften',
23 quality: 'Qualität',
24 qualityAutoHigh: 'Auto Hoch',
25 qualityAutoLow: 'Auto Niedrig',
26 qualityBest: 'Beste',
27 qualityHigh: 'Hoch',
28 qualityLow: 'Niedrig',
29 qualityMedium: 'Mittel',
30 scale: 'Skalierung',
31 scaleAll: 'Alles anzeigen',
32 scaleFit: 'Passgenau',
33 scaleNoBorder: 'Ohne Rand',
34 title: 'Flash-Eigenschaften',
35 vSpace: 'Vertikal-Abstand',
36 validateHSpace: 'HSpace muss eine Zahl sein.',
37 validateSrc: 'URL darf nicht leer sein.',
38 validateVSpace: 'VSpace muss eine Zahl sein.',
39 windowMode: 'Fenstermodus',
40 windowModeOpaque: 'Deckend',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Fenster'
43} );
diff --git a/sources/plugins/flash/lang/el.js b/sources/plugins/flash/lang/el.js
new file mode 100644
index 00000000..f96d63a5
--- /dev/null
+++ b/sources/plugins/flash/lang/el.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'el', {
6 access: 'Πρόσβαση Script',
7 accessAlways: 'Πάντα',
8 accessNever: 'Ποτέ',
9 accessSameDomain: 'Ίδιο όνομα τομέα',
10 alignAbsBottom: 'Απόλυτα Κάτω',
11 alignAbsMiddle: 'Απόλυτα στη Μέση',
12 alignBaseline: 'Γραμμή Βάσης',
13 alignTextTop: 'Κορυφή Κειμένου',
14 bgcolor: 'Χρώμα Υποβάθρου',
15 chkFull: 'Να Επιτρέπεται η Προβολή σε Πλήρη Οθόνη',
16 chkLoop: 'Επανάληψη',
17 chkMenu: 'Ενεργοποίηση Flash Menu',
18 chkPlay: 'Αυτόματη Εκτέλεση',
19 flashvars: 'Μεταβλητές για Flash',
20 hSpace: 'Οριζόντιο Διάστημα',
21 properties: 'Ιδιότητες Flash',
22 propertiesTab: 'Ιδιότητες',
23 quality: 'Ποιότητα',
24 qualityAutoHigh: 'Αυτόματη Υψηλή',
25 qualityAutoLow: 'Αυτόματη Χαμηλή',
26 qualityBest: 'Καλύτερη',
27 qualityHigh: 'Υψηλή',
28 qualityLow: 'Χαμηλή',
29 qualityMedium: 'Μεσαία',
30 scale: 'Μεγέθυνση',
31 scaleAll: 'Εμφάνιση όλων',
32 scaleFit: 'Ακριβές Μέγεθος',
33 scaleNoBorder: 'Χωρίς Περίγραμμα',
34 title: 'Ιδιότητες Flash',
35 vSpace: 'Κάθετο Διάστημα',
36 validateHSpace: 'Το HSpace πρέπει να είναι αριθμός.',
37 validateSrc: 'Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)',
38 validateVSpace: 'Το VSpace πρέπει να είναι αριθμός.',
39 windowMode: 'Τρόπος λειτουργίας παραθύρου',
40 windowModeOpaque: 'Συμπαγές',
41 windowModeTransparent: 'Διάφανο',
42 windowModeWindow: 'Παράθυρο'
43} );
diff --git a/sources/plugins/flash/lang/en-au.js b/sources/plugins/flash/lang/en-au.js
new file mode 100644
index 00000000..78fb629c
--- /dev/null
+++ b/sources/plugins/flash/lang/en-au.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'en-au', {
6 access: 'Script Access',
7 accessAlways: 'Always',
8 accessNever: 'Never',
9 accessSameDomain: 'Same domain',
10 alignAbsBottom: 'Abs Bottom',
11 alignAbsMiddle: 'Abs Middle',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Text Top',
14 bgcolor: 'Background colour',
15 chkFull: 'Allow Fullscreen',
16 chkLoop: 'Loop',
17 chkMenu: 'Enable Flash Menu',
18 chkPlay: 'Auto Play',
19 flashvars: 'Variables for Flash',
20 hSpace: 'HSpace',
21 properties: 'Flash Properties',
22 propertiesTab: 'Properties',
23 quality: 'Quality',
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Scale',
31 scaleAll: 'Show all',
32 scaleFit: 'Exact Fit',
33 scaleNoBorder: 'No Border',
34 title: 'Flash Properties',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.',
37 validateSrc: 'URL must not be empty.',
38 validateVSpace: 'VSpace must be a number.',
39 windowMode: 'Window mode',
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/en-ca.js b/sources/plugins/flash/lang/en-ca.js
new file mode 100644
index 00000000..37770f05
--- /dev/null
+++ b/sources/plugins/flash/lang/en-ca.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'en-ca', {
6 access: 'Script Access',
7 accessAlways: 'Always',
8 accessNever: 'Never',
9 accessSameDomain: 'Same domain',
10 alignAbsBottom: 'Abs Bottom',
11 alignAbsMiddle: 'Abs Middle',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Text Top',
14 bgcolor: 'Background colour',
15 chkFull: 'Allow Fullscreen',
16 chkLoop: 'Loop',
17 chkMenu: 'Enable Flash Menu',
18 chkPlay: 'Auto Play',
19 flashvars: 'Variables for Flash',
20 hSpace: 'HSpace',
21 properties: 'Flash Properties',
22 propertiesTab: 'Properties',
23 quality: 'Quality',
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Scale',
31 scaleAll: 'Show all',
32 scaleFit: 'Exact Fit',
33 scaleNoBorder: 'No Border',
34 title: 'Flash Properties',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.',
37 validateSrc: 'URL must not be empty.',
38 validateVSpace: 'VSpace must be a number.',
39 windowMode: 'Window mode',
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/en-gb.js b/sources/plugins/flash/lang/en-gb.js
new file mode 100644
index 00000000..3965ea65
--- /dev/null
+++ b/sources/plugins/flash/lang/en-gb.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'en-gb', {
6 access: 'Script Access',
7 accessAlways: 'Always',
8 accessNever: 'Never',
9 accessSameDomain: 'Same domain',
10 alignAbsBottom: 'Abs Bottom',
11 alignAbsMiddle: 'Abs Middle',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Text Top',
14 bgcolor: 'Background colour',
15 chkFull: 'Allow Fullscreen',
16 chkLoop: 'Loop',
17 chkMenu: 'Enable Flash Menu',
18 chkPlay: 'Auto Play',
19 flashvars: 'Variables for Flash',
20 hSpace: 'HSpace',
21 properties: 'Flash Properties',
22 propertiesTab: 'Properties',
23 quality: 'Quality',
24 qualityAutoHigh: 'Auto High',
25 qualityAutoLow: 'Auto Low',
26 qualityBest: 'Best',
27 qualityHigh: 'High',
28 qualityLow: 'Low',
29 qualityMedium: 'Medium',
30 scale: 'Scale',
31 scaleAll: 'Show all',
32 scaleFit: 'Exact Fit',
33 scaleNoBorder: 'No Border',
34 title: 'Flash Properties',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.',
37 validateSrc: 'URL must not be empty.',
38 validateVSpace: 'VSpace must be a number.',
39 windowMode: 'Window mode',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Window'
43} );
diff --git a/sources/plugins/flash/lang/en.js b/sources/plugins/flash/lang/en.js
new file mode 100644
index 00000000..cea0d5ce
--- /dev/null
+++ b/sources/plugins/flash/lang/en.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'en', {
6 access: 'Script Access',
7 accessAlways: 'Always',
8 accessNever: 'Never',
9 accessSameDomain: 'Same domain',
10 alignAbsBottom: 'Abs Bottom',
11 alignAbsMiddle: 'Abs Middle',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Text Top',
14 bgcolor: 'Background color',
15 chkFull: 'Allow Fullscreen',
16 chkLoop: 'Loop',
17 chkMenu: 'Enable Flash Menu',
18 chkPlay: 'Auto Play',
19 flashvars: 'Variables for Flash',
20 hSpace: 'HSpace',
21 properties: 'Flash Properties',
22 propertiesTab: 'Properties',
23 quality: 'Quality',
24 qualityAutoHigh: 'Auto High',
25 qualityAutoLow: 'Auto Low',
26 qualityBest: 'Best',
27 qualityHigh: 'High',
28 qualityLow: 'Low',
29 qualityMedium: 'Medium',
30 scale: 'Scale',
31 scaleAll: 'Show all',
32 scaleFit: 'Exact Fit',
33 scaleNoBorder: 'No Border',
34 title: 'Flash Properties',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.',
37 validateSrc: 'URL must not be empty.',
38 validateVSpace: 'VSpace must be a number.',
39 windowMode: 'Window mode',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Window'
43} );
diff --git a/sources/plugins/flash/lang/eo.js b/sources/plugins/flash/lang/eo.js
new file mode 100644
index 00000000..ada16d0d
--- /dev/null
+++ b/sources/plugins/flash/lang/eo.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'eo', {
6 access: 'Atingi skriptojn',
7 accessAlways: 'Ĉiam',
8 accessNever: 'Neniam',
9 accessSameDomain: 'Sama domajno',
10 alignAbsBottom: 'Absoluta Malsupro',
11 alignAbsMiddle: 'Absoluta Centro',
12 alignBaseline: 'TekstoMalsupro',
13 alignTextTop: 'TekstoSupro',
14 bgcolor: 'Fona Koloro',
15 chkFull: 'Permesi tutekranon',
16 chkLoop: 'Iteracio',
17 chkMenu: 'Ebligi flaŝmenuon',
18 chkPlay: 'Aŭtomata legado',
19 flashvars: 'Variabloj por Flaŝo',
20 hSpace: 'Horizontala Spaco',
21 properties: 'Flaŝatributoj',
22 propertiesTab: 'Atributoj',
23 quality: 'Kvalito',
24 qualityAutoHigh: 'Aŭtomate alta',
25 qualityAutoLow: 'Aŭtomate malalta',
26 qualityBest: 'Plej bona',
27 qualityHigh: 'Alta',
28 qualityLow: 'Malalta',
29 qualityMedium: 'Meza',
30 scale: 'Skalo',
31 scaleAll: 'Montri ĉion',
32 scaleFit: 'Origina grando',
33 scaleNoBorder: 'Neniu bordero',
34 title: 'Flaŝatributoj',
35 vSpace: 'Vertikala Spaco',
36 validateHSpace: 'Horizontala Spaco devas esti nombro.',
37 validateSrc: 'Bonvolu entajpi la retadreson (URL)',
38 validateVSpace: 'Vertikala Spaco devas esti nombro.',
39 windowMode: 'Fenestra reĝimo',
40 windowModeOpaque: 'Opaka',
41 windowModeTransparent: 'Travidebla',
42 windowModeWindow: 'Fenestro'
43} );
diff --git a/sources/plugins/flash/lang/es.js b/sources/plugins/flash/lang/es.js
new file mode 100644
index 00000000..9965ca87
--- /dev/null
+++ b/sources/plugins/flash/lang/es.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'es', {
6 access: 'Acceso de scripts',
7 accessAlways: 'Siempre',
8 accessNever: 'Nunca',
9 accessSameDomain: 'Mismo dominio',
10 alignAbsBottom: 'Abs inferior',
11 alignAbsMiddle: 'Abs centro',
12 alignBaseline: 'Línea de base',
13 alignTextTop: 'Tope del texto',
14 bgcolor: 'Color de Fondo',
15 chkFull: 'Permitir pantalla completa',
16 chkLoop: 'Repetir',
17 chkMenu: 'Activar Menú Flash',
18 chkPlay: 'Autoejecución',
19 flashvars: 'Opciones',
20 hSpace: 'Esp.Horiz',
21 properties: 'Propiedades de Flash',
22 propertiesTab: 'Propiedades',
23 quality: 'Calidad',
24 qualityAutoHigh: 'Auto Alta',
25 qualityAutoLow: 'Auto Baja',
26 qualityBest: 'La mejor',
27 qualityHigh: 'Alta',
28 qualityLow: 'Baja',
29 qualityMedium: 'Media',
30 scale: 'Escala',
31 scaleAll: 'Mostrar todo',
32 scaleFit: 'Ajustado',
33 scaleNoBorder: 'Sin Borde',
34 title: 'Propiedades de Flash',
35 vSpace: 'Esp.Vert',
36 validateHSpace: 'Esp.Horiz debe ser un número.',
37 validateSrc: 'Por favor escriba el vínculo URL',
38 validateVSpace: 'Esp.Vert debe ser un número.',
39 windowMode: 'WindowMode',
40 windowModeOpaque: 'Opaco',
41 windowModeTransparent: 'Transparente',
42 windowModeWindow: 'Ventana'
43} );
diff --git a/sources/plugins/flash/lang/et.js b/sources/plugins/flash/lang/et.js
new file mode 100644
index 00000000..8ed5eac8
--- /dev/null
+++ b/sources/plugins/flash/lang/et.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'et', {
6 access: 'Skriptide ligipääs',
7 accessAlways: 'Kõigile',
8 accessNever: 'Mitte ühelegi',
9 accessSameDomain: 'Samalt domeenilt',
10 alignAbsBottom: 'Abs alla',
11 alignAbsMiddle: 'Abs keskele',
12 alignBaseline: 'Baasjoonele',
13 alignTextTop: 'Tekstist üles',
14 bgcolor: 'Tausta värv',
15 chkFull: 'Täisekraan lubatud',
16 chkLoop: 'Korduv',
17 chkMenu: 'Flashi menüü lubatud',
18 chkPlay: 'Automaatne start ',
19 flashvars: 'Flashi muutujad',
20 hSpace: 'H. vaheruum',
21 properties: 'Flashi omadused',
22 propertiesTab: 'Omadused',
23 quality: 'Kvaliteet',
24 qualityAutoHigh: 'Automaatne kõrge',
25 qualityAutoLow: 'Automaatne madal',
26 qualityBest: 'Parim',
27 qualityHigh: 'Kõrge',
28 qualityLow: 'Madal',
29 qualityMedium: 'Keskmine',
30 scale: 'Mastaap',
31 scaleAll: 'Näidatakse kõike',
32 scaleFit: 'Täpne sobivus',
33 scaleNoBorder: 'Äärist ei ole',
34 title: 'Flashi omadused',
35 vSpace: 'V. vaheruum',
36 validateHSpace: 'H. vaheruum peab olema number.',
37 validateSrc: 'Palun kirjuta lingi URL',
38 validateVSpace: 'V. vaheruum peab olema number.',
39 windowMode: 'Akna režiim',
40 windowModeOpaque: 'Läbipaistmatu',
41 windowModeTransparent: 'Läbipaistev',
42 windowModeWindow: 'Aken'
43} );
diff --git a/sources/plugins/flash/lang/eu.js b/sources/plugins/flash/lang/eu.js
new file mode 100644
index 00000000..750f8a48
--- /dev/null
+++ b/sources/plugins/flash/lang/eu.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'eu', {
6 access: 'Script atzipena',
7 accessAlways: 'Beti',
8 accessNever: 'Inoiz ere ez',
9 accessSameDomain: 'Domeinu berekoak',
10 alignAbsBottom: 'Abs behean',
11 alignAbsMiddle: 'Abs erdian',
12 alignBaseline: 'Oinean',
13 alignTextTop: 'Testua goian',
14 bgcolor: 'Atzeko planoko kolorea',
15 chkFull: 'Onartu pantaila osoa',
16 chkLoop: 'Begizta',
17 chkMenu: 'Gaitu Flash-en menua',
18 chkPlay: 'Erreproduzitu automatikoki',
19 flashvars: 'Flash-en aldagaiak',
20 hSpace: 'HSpace',
21 properties: 'Flash-en propietateak',
22 propertiesTab: 'Propietateak',
23 quality: 'Kalitatea',
24 qualityAutoHigh: 'Auto altua',
25 qualityAutoLow: 'Auto baxua',
26 qualityBest: 'Hoberena',
27 qualityHigh: 'Altua',
28 qualityLow: 'Baxua',
29 qualityMedium: 'Ertaina',
30 scale: 'Eskalatu',
31 scaleAll: 'Erakutsi dena',
32 scaleFit: 'Doitu',
33 scaleNoBorder: 'Ertzik gabe',
34 title: 'Flash-en propietateak',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace zenbaki bat izan behar da.',
37 validateSrc: 'URLak ezin du hutsik egon.',
38 validateVSpace: 'VSpace zenbaki bat izan behar da.',
39 windowMode: 'Leiho-modua',
40 windowModeOpaque: 'Opakoa',
41 windowModeTransparent: 'Gardena',
42 windowModeWindow: 'Leihoa'
43} );
diff --git a/sources/plugins/flash/lang/fa.js b/sources/plugins/flash/lang/fa.js
new file mode 100644
index 00000000..6abe129c
--- /dev/null
+++ b/sources/plugins/flash/lang/fa.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'fa', {
6 access: 'دسترسی به اسکریپت',
7 accessAlways: 'همیشه',
8 accessNever: 'هرگز',
9 accessSameDomain: 'همان دامنه',
10 alignAbsBottom: 'پائین مطلق',
11 alignAbsMiddle: 'وسط مطلق',
12 alignBaseline: 'خط پایه',
13 alignTextTop: 'متن بالا',
14 bgcolor: 'رنگ پس​زمینه',
15 chkFull: 'اجازه تمام صفحه',
16 chkLoop: 'اجرای پیاپی',
17 chkMenu: 'در دسترس بودن منوی فلش',
18 chkPlay: 'آغاز خودکار',
19 flashvars: 'مقادیر برای فلش',
20 hSpace: 'فاصلهٴ افقی',
21 properties: 'ویژگی​های فلش',
22 propertiesTab: 'ویژگی​ها',
23 quality: 'کیفیت',
24 qualityAutoHigh: 'بالا - خودکار',
25 qualityAutoLow: 'پایین - خودکار',
26 qualityBest: 'بهترین',
27 qualityHigh: 'بالا',
28 qualityLow: 'پایین',
29 qualityMedium: 'متوسط',
30 scale: 'مقیاس',
31 scaleAll: 'نمایش همه',
32 scaleFit: 'جایگیری کامل',
33 scaleNoBorder: 'بدون کران',
34 title: 'ویژگی​های فلش',
35 vSpace: 'فاصلهٴ عمودی',
36 validateHSpace: 'مقدار فاصله گذاری افقی باید یک عدد باشد.',
37 validateSrc: 'لطفا URL پیوند را بنویسید',
38 validateVSpace: 'مقدار فاصله گذاری عمودی باید یک عدد باشد.',
39 windowMode: 'حالت پنجره',
40 windowModeOpaque: 'مات',
41 windowModeTransparent: 'شفاف',
42 windowModeWindow: 'پنجره'
43} );
diff --git a/sources/plugins/flash/lang/fi.js b/sources/plugins/flash/lang/fi.js
new file mode 100644
index 00000000..74a0ad83
--- /dev/null
+++ b/sources/plugins/flash/lang/fi.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'fi', {
6 access: 'Skriptien pääsy',
7 accessAlways: 'Aina',
8 accessNever: 'Ei koskaan',
9 accessSameDomain: 'Sama verkkotunnus',
10 alignAbsBottom: 'Aivan alas',
11 alignAbsMiddle: 'Aivan keskelle',
12 alignBaseline: 'Alas (teksti)',
13 alignTextTop: 'Ylös (teksti)',
14 bgcolor: 'Taustaväri',
15 chkFull: 'Salli kokoruututila',
16 chkLoop: 'Toisto',
17 chkMenu: 'Näytä Flash-valikko',
18 chkPlay: 'Automaattinen käynnistys',
19 flashvars: 'Muuttujat Flash:lle',
20 hSpace: 'Vaakatila',
21 properties: 'Flash-ominaisuudet',
22 propertiesTab: 'Ominaisuudet',
23 quality: 'Laatu',
24 qualityAutoHigh: 'Automaattinen korkea',
25 qualityAutoLow: 'Automaattinen matala',
26 qualityBest: 'Paras',
27 qualityHigh: 'Korkea',
28 qualityLow: 'Matala',
29 qualityMedium: 'Keskitaso',
30 scale: 'Levitä',
31 scaleAll: 'Näytä kaikki',
32 scaleFit: 'Tarkka koko',
33 scaleNoBorder: 'Ei rajaa',
34 title: 'Flash ominaisuudet',
35 vSpace: 'Pystytila',
36 validateHSpace: 'Vaakatilan täytyy olla numero.',
37 validateSrc: 'Linkille on kirjoitettava URL',
38 validateVSpace: 'Pystytilan täytyy olla numero.',
39 windowMode: 'Ikkuna tila',
40 windowModeOpaque: 'Läpinäkyvyys',
41 windowModeTransparent: 'Läpinäkyvä',
42 windowModeWindow: 'Ikkuna'
43} );
diff --git a/sources/plugins/flash/lang/fo.js b/sources/plugins/flash/lang/fo.js
new file mode 100644
index 00000000..5066cda0
--- /dev/null
+++ b/sources/plugins/flash/lang/fo.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'fo', {
6 access: 'Script atgongd',
7 accessAlways: 'Altíð',
8 accessNever: 'Ongantíð',
9 accessSameDomain: 'Sama navnaøki',
10 alignAbsBottom: 'Abs botnur',
11 alignAbsMiddle: 'Abs miðja',
12 alignBaseline: 'Basislinja',
13 alignTextTop: 'Tekst toppur',
14 bgcolor: 'Bakgrundslitur',
15 chkFull: 'Loyv fullan skerm',
16 chkLoop: 'Endurspæl',
17 chkMenu: 'Ger Flash skrá virkna',
18 chkPlay: 'Avspælingin byrjar sjálv',
19 flashvars: 'Variablar fyri Flash',
20 hSpace: 'Høgri breddi',
21 properties: 'Flash eginleikar',
22 propertiesTab: 'Eginleikar',
23 quality: 'Góðska',
24 qualityAutoHigh: 'Auto høg',
25 qualityAutoLow: 'Auto Lág',
26 qualityBest: 'Besta',
27 qualityHigh: 'Høg',
28 qualityLow: 'Lág',
29 qualityMedium: 'Meðal',
30 scale: 'Skalering',
31 scaleAll: 'Vís alt',
32 scaleFit: 'Neyv skalering',
33 scaleNoBorder: 'Eingin bordi',
34 title: 'Flash eginleikar',
35 vSpace: 'Vinstri breddi',
36 validateHSpace: 'HSpace má vera eitt tal.',
37 validateSrc: 'Vinarliga skriva tilknýti (URL)',
38 validateVSpace: 'VSpace má vera eitt tal.',
39 windowMode: 'Slag av rúti',
40 windowModeOpaque: 'Ikki transparent',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Rútur'
43} );
diff --git a/sources/plugins/flash/lang/fr-ca.js b/sources/plugins/flash/lang/fr-ca.js
new file mode 100644
index 00000000..1a0817aa
--- /dev/null
+++ b/sources/plugins/flash/lang/fr-ca.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'fr-ca', {
6 access: 'Accès au script',
7 accessAlways: 'Toujours',
8 accessNever: 'Jamais',
9 accessSameDomain: 'Même domaine',
10 alignAbsBottom: 'Bas absolu',
11 alignAbsMiddle: 'Milieu absolu',
12 alignBaseline: 'Bas du texte',
13 alignTextTop: 'Haut du texte',
14 bgcolor: 'Couleur de fond',
15 chkFull: 'Permettre le plein-écran',
16 chkLoop: 'Boucle',
17 chkMenu: 'Activer le menu Flash',
18 chkPlay: 'Lecture automatique',
19 flashvars: 'Variables pour Flash',
20 hSpace: 'Espacement horizontal',
21 properties: 'Propriétés de l\'animation Flash',
22 propertiesTab: 'Propriétés',
23 quality: 'Qualité',
24 qualityAutoHigh: 'Haute auto',
25 qualityAutoLow: 'Basse auto',
26 qualityBest: 'Meilleur',
27 qualityHigh: 'Haute',
28 qualityLow: 'Basse',
29 qualityMedium: 'Moyenne',
30 scale: 'Échelle',
31 scaleAll: 'Afficher tout',
32 scaleFit: 'Ajuster aux dimensions',
33 scaleNoBorder: 'Sans bordure',
34 title: 'Propriétés de l\'animation Flash',
35 vSpace: 'Espacement vertical',
36 validateHSpace: 'L\'espacement horizontal doit être un entier.',
37 validateSrc: 'Veuillez saisir l\'URL',
38 validateVSpace: 'L\'espacement vertical doit être un entier.',
39 windowMode: 'Mode de fenêtre',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Fenêtre'
43} );
diff --git a/sources/plugins/flash/lang/fr.js b/sources/plugins/flash/lang/fr.js
new file mode 100644
index 00000000..aa010d44
--- /dev/null
+++ b/sources/plugins/flash/lang/fr.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'fr', {
6 access: 'Accès aux scripts',
7 accessAlways: 'Toujours',
8 accessNever: 'Jamais',
9 accessSameDomain: 'Même domaine',
10 alignAbsBottom: 'Bas absolu',
11 alignAbsMiddle: 'Milieu absolu',
12 alignBaseline: 'Bas du texte',
13 alignTextTop: 'Haut du texte',
14 bgcolor: 'Couleur d\'arrière-plan',
15 chkFull: 'Permettre le plein écran',
16 chkLoop: 'Boucle',
17 chkMenu: 'Activer le menu Flash',
18 chkPlay: 'Jouer automatiquement',
19 flashvars: 'Variables du Flash',
20 hSpace: 'Espacement horizontal',
21 properties: 'Propriétés du Flash',
22 propertiesTab: 'Propriétés',
23 quality: 'Qualité',
24 qualityAutoHigh: 'Haute Auto',
25 qualityAutoLow: 'Basse Auto',
26 qualityBest: 'Meilleure',
27 qualityHigh: 'Haute',
28 qualityLow: 'Basse',
29 qualityMedium: 'Moyenne',
30 scale: 'Echelle',
31 scaleAll: 'Afficher tout',
32 scaleFit: 'Taille d\'origine',
33 scaleNoBorder: 'Pas de bordure',
34 title: 'Propriétés du Flash',
35 vSpace: 'Espacement vertical',
36 validateHSpace: 'L\'espacement horizontal doit être un nombre.',
37 validateSrc: 'L\'adresse ne doit pas être vide.',
38 validateVSpace: 'L\'espacement vertical doit être un nombre.',
39 windowMode: 'Mode fenêtre',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Fenêtre'
43} );
diff --git a/sources/plugins/flash/lang/gl.js b/sources/plugins/flash/lang/gl.js
new file mode 100644
index 00000000..0135d132
--- /dev/null
+++ b/sources/plugins/flash/lang/gl.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'gl', {
6 access: 'Acceso de scripts',
7 accessAlways: 'Sempre',
8 accessNever: 'Nunca',
9 accessSameDomain: 'Mesmo dominio',
10 alignAbsBottom: 'Abs Inferior',
11 alignAbsMiddle: 'Abs centro',
12 alignBaseline: 'Liña de base',
13 alignTextTop: 'Tope do texto',
14 bgcolor: 'Cor do fondo',
15 chkFull: 'Permitir pantalla completa',
16 chkLoop: 'Repetir',
17 chkMenu: 'Activar o menú do «Flash»',
18 chkPlay: 'Reprodución auomática',
19 flashvars: 'Opcións do «Flash»',
20 hSpace: 'Esp. Horiz.',
21 properties: 'Propiedades do «Flash»',
22 propertiesTab: 'Propiedades',
23 quality: 'Calidade',
24 qualityAutoHigh: 'Alta, automática',
25 qualityAutoLow: 'Baixa, automática',
26 qualityBest: 'A mellor',
27 qualityHigh: 'Alta',
28 qualityLow: 'Baixa',
29 qualityMedium: 'Media',
30 scale: 'Escalar',
31 scaleAll: 'Amosar todo',
32 scaleFit: 'Encaixar axustando',
33 scaleNoBorder: 'Sen bordo',
34 title: 'Propiedades do «Flash»',
35 vSpace: 'Esp.Vert.',
36 validateHSpace: 'O espazado horizontal debe ser un número.',
37 validateSrc: 'O URL non pode estar baleiro.',
38 validateVSpace: 'O espazado vertical debe ser un número.',
39 windowMode: 'Modo da xanela',
40 windowModeOpaque: 'Opaca',
41 windowModeTransparent: 'Transparente',
42 windowModeWindow: 'Xanela'
43} );
diff --git a/sources/plugins/flash/lang/gu.js b/sources/plugins/flash/lang/gu.js
new file mode 100644
index 00000000..79fa2a19
--- /dev/null
+++ b/sources/plugins/flash/lang/gu.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'gu', {
6 access: 'સ્ક્રીપ્ટ એક્સેસ',
7 accessAlways: 'હમેશાં',
8 accessNever: 'નહી',
9 accessSameDomain: 'એજ ડોમેન',
10 alignAbsBottom: 'Abs નીચે',
11 alignAbsMiddle: 'Abs ઉપર',
12 alignBaseline: 'આધાર લીટી',
13 alignTextTop: 'ટેક્સ્ટ ઉપર',
14 bgcolor: 'બૅકગ્રાઉન્ડ રંગ,',
15 chkFull: 'ફૂલ સ્ક્રીન કરવું',
16 chkLoop: 'લૂપ',
17 chkMenu: 'ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો',
18 chkPlay: 'ઑટો/સ્વયં પ્લે',
19 flashvars: 'ફલેશ ના વિકલ્પો',
20 hSpace: 'સમસ્તરીય જગ્યા',
21 properties: 'ફ્લૅશના ગુણ',
22 propertiesTab: 'ગુણ',
23 quality: 'ગુણધર્મ',
24 qualityAutoHigh: 'ઓટો ઊંચું',
25 qualityAutoLow: 'ઓટો નીચું',
26 qualityBest: 'શ્રેષ્ઠ',
27 qualityHigh: 'ઊંચું',
28 qualityLow: 'નીચું',
29 qualityMedium: 'મધ્યમ',
30 scale: 'સ્કેલ',
31 scaleAll: 'સ્કેલ ઓલ/બધુ બતાવો',
32 scaleFit: 'સ્કેલ એકદમ ફીટ',
33 scaleNoBorder: 'સ્કેલ બોર્ડર વગર',
34 title: 'ફ્લૅશ ગુણ',
35 vSpace: 'લંબરૂપ જગ્યા',
36 validateHSpace: 'HSpace આંકડો હોવો જોઈએ.',
37 validateSrc: 'લિંક URL ટાઇપ કરો',
38 validateVSpace: 'VSpace આંકડો હોવો જોઈએ.',
39 windowMode: 'વિન્ડો મોડ',
40 windowModeOpaque: 'અપારદર્શક',
41 windowModeTransparent: 'પારદર્શક',
42 windowModeWindow: 'વિન્ડો'
43} );
diff --git a/sources/plugins/flash/lang/he.js b/sources/plugins/flash/lang/he.js
new file mode 100644
index 00000000..27f8ce33
--- /dev/null
+++ b/sources/plugins/flash/lang/he.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'he', {
6 access: 'גישת סקריפט',
7 accessAlways: 'תמיד',
8 accessNever: 'אף פעם',
9 accessSameDomain: 'דומיין זהה',
10 alignAbsBottom: 'לתחתית האבסולוטית',
11 alignAbsMiddle: 'מרכוז אבסולוטי',
12 alignBaseline: 'לקו התחתית',
13 alignTextTop: 'לראש הטקסט',
14 bgcolor: 'צבע רקע',
15 chkFull: 'אפשר חלון מלא',
16 chkLoop: 'לולאה',
17 chkMenu: 'אפשר תפריט פלאש',
18 chkPlay: 'ניגון אוטומטי',
19 flashvars: 'משתנים לפלאש',
20 hSpace: 'מרווח אופקי',
21 properties: 'מאפייני פלאש',
22 propertiesTab: 'מאפיינים',
23 quality: 'איכות',
24 qualityAutoHigh: 'גבוהה אוטומטית',
25 qualityAutoLow: 'נמוכה אוטומטית',
26 qualityBest: 'מעולה',
27 qualityHigh: 'גבוהה',
28 qualityLow: 'נמוכה',
29 qualityMedium: 'ממוצעת',
30 scale: 'גודל',
31 scaleAll: 'הצג הכל',
32 scaleFit: 'התאמה מושלמת',
33 scaleNoBorder: 'ללא גבולות',
34 title: 'מאפיני פלאש',
35 vSpace: 'מרווח אנכי',
36 validateHSpace: 'המרווח האופקי חייב להיות מספר.',
37 validateSrc: 'יש להקליד את כתובת סרטון הפלאש (URL)',
38 validateVSpace: 'המרווח האנכי חייב להיות מספר.',
39 windowMode: 'מצב חלון',
40 windowModeOpaque: 'אטום',
41 windowModeTransparent: 'שקוף',
42 windowModeWindow: 'חלון'
43} );
diff --git a/sources/plugins/flash/lang/hi.js b/sources/plugins/flash/lang/hi.js
new file mode 100644
index 00000000..6c0c0fd7
--- /dev/null
+++ b/sources/plugins/flash/lang/hi.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'hi', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs नीचे',
11 alignAbsMiddle: 'Abs ऊपर',
12 alignBaseline: 'मूल रेखा',
13 alignTextTop: 'टेक्स्ट ऊपर',
14 bgcolor: 'बैक्ग्राउन्ड रंग',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'लूप',
17 chkMenu: 'फ़्लैश मॅन्यू का प्रयोग करें',
18 chkPlay: 'ऑटो प्ले',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'हॉरिज़ॉन्टल स्पेस',
21 properties: 'फ़्लैश प्रॉपर्टीज़',
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'स्केल',
31 scaleAll: 'सभी दिखायें',
32 scaleFit: 'बिल्कुल फ़िट',
33 scaleNoBorder: 'कोई बॉर्डर नहीं',
34 title: 'फ़्लैश प्रॉपर्टीज़',
35 vSpace: 'वर्टिकल स्पेस',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'लिंक URL टाइप करें',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/hr.js b/sources/plugins/flash/lang/hr.js
new file mode 100644
index 00000000..79d9083a
--- /dev/null
+++ b/sources/plugins/flash/lang/hr.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'hr', {
6 access: 'Script Access',
7 accessAlways: 'Uvijek',
8 accessNever: 'Nikad',
9 accessSameDomain: 'Ista domena',
10 alignAbsBottom: 'Abs dolje',
11 alignAbsMiddle: 'Abs sredina',
12 alignBaseline: 'Bazno',
13 alignTextTop: 'Vrh teksta',
14 bgcolor: 'Boja pozadine',
15 chkFull: 'Omogući Fullscreen',
16 chkLoop: 'Ponavljaj',
17 chkMenu: 'Omogući Flash izbornik',
18 chkPlay: 'Auto Play',
19 flashvars: 'Varijable za Flash',
20 hSpace: 'HSpace',
21 properties: 'Flash svojstva',
22 propertiesTab: 'Svojstva',
23 quality: 'Kvaliteta',
24 qualityAutoHigh: 'Auto High',
25 qualityAutoLow: 'Auto Low',
26 qualityBest: 'Best',
27 qualityHigh: 'High',
28 qualityLow: 'Low',
29 qualityMedium: 'Medium',
30 scale: 'Omjer',
31 scaleAll: 'Prikaži sve',
32 scaleFit: 'Točna veličina',
33 scaleNoBorder: 'Bez okvira',
34 title: 'Flash svojstva',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace mora biti broj.',
37 validateSrc: 'Molimo upišite URL link',
38 validateVSpace: 'VSpace mora biti broj.',
39 windowMode: 'Vrsta prozora',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Window'
43} );
diff --git a/sources/plugins/flash/lang/hu.js b/sources/plugins/flash/lang/hu.js
new file mode 100644
index 00000000..755500a8
--- /dev/null
+++ b/sources/plugins/flash/lang/hu.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'hu', {
6 access: 'Szkript hozzáférés',
7 accessAlways: 'Mindig',
8 accessNever: 'Soha',
9 accessSameDomain: 'Azonos domainről',
10 alignAbsBottom: 'Legaljára',
11 alignAbsMiddle: 'Közepére',
12 alignBaseline: 'Alapvonalhoz',
13 alignTextTop: 'Szöveg tetejére',
14 bgcolor: 'Háttérszín',
15 chkFull: 'Teljes képernyő engedélyezése',
16 chkLoop: 'Folyamatosan',
17 chkMenu: 'Flash menü engedélyezése',
18 chkPlay: 'Automata lejátszás',
19 flashvars: 'Flash változók',
20 hSpace: 'Vízsz. táv',
21 properties: 'Flash tulajdonságai',
22 propertiesTab: 'Tulajdonságok',
23 quality: 'Minőség',
24 qualityAutoHigh: 'Automata jó',
25 qualityAutoLow: 'Automata gyenge',
26 qualityBest: 'Legjobb',
27 qualityHigh: 'Jó',
28 qualityLow: 'Gyenge',
29 qualityMedium: 'Közepes',
30 scale: 'Méretezés',
31 scaleAll: 'Mindent mutat',
32 scaleFit: 'Teljes kitöltés',
33 scaleNoBorder: 'Keret nélkül',
34 title: 'Flash tulajdonságai',
35 vSpace: 'Függ. táv',
36 validateHSpace: 'A vízszintes távolsűág mezőbe csak számokat írhat.',
37 validateSrc: 'Adja meg a hivatkozás webcímét',
38 validateVSpace: 'A függőleges távolsűág mezőbe csak számokat írhat.',
39 windowMode: 'Ablak mód',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Window'
43} );
diff --git a/sources/plugins/flash/lang/id.js b/sources/plugins/flash/lang/id.js
new file mode 100644
index 00000000..bd66ee65
--- /dev/null
+++ b/sources/plugins/flash/lang/id.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'id', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Selalu',
8 accessNever: 'Tidak Pernah',
9 accessSameDomain: 'Domain yang sama',
10 alignAbsBottom: 'Abs Bottom', // MISSING
11 alignAbsMiddle: 'Abs Middle', // MISSING
12 alignBaseline: 'Dasar',
13 alignTextTop: 'Text Top', // MISSING
14 bgcolor: 'Warna Latar Belakang',
15 chkFull: 'Izinkan Layar Penuh',
16 chkLoop: 'Loop', // MISSING
17 chkMenu: 'Enable Flash Menu', // MISSING
18 chkPlay: 'Mainkan Otomatis',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'HSpace', // MISSING
21 properties: 'Flash Properties', // MISSING
22 propertiesTab: 'Properti',
23 quality: 'Kualitas',
24 qualityAutoHigh: 'Tinggi Otomatis',
25 qualityAutoLow: 'Rendah Otomatis',
26 qualityBest: 'Terbaik',
27 qualityHigh: 'Tinggi',
28 qualityLow: 'Rendah',
29 qualityMedium: 'Sedang',
30 scale: 'Scale', // MISSING
31 scaleAll: 'Perlihatkan semua',
32 scaleFit: 'Exact Fit', // MISSING
33 scaleNoBorder: 'Tanpa Batas',
34 title: 'Flash Properties', // MISSING
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace harus sebuah angka',
37 validateSrc: 'URL tidak boleh kosong',
38 validateVSpace: 'VSpace harus sebuah angka',
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparan',
42 windowModeWindow: 'Jendela'
43} );
diff --git a/sources/plugins/flash/lang/is.js b/sources/plugins/flash/lang/is.js
new file mode 100644
index 00000000..519104a9
--- /dev/null
+++ b/sources/plugins/flash/lang/is.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'is', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs neðst',
11 alignAbsMiddle: 'Abs miðjuð',
12 alignBaseline: 'Grunnlína',
13 alignTextTop: 'Efri brún texta',
14 bgcolor: 'Bakgrunnslitur',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Endurtekning',
17 chkMenu: 'Sýna Flash-valmynd',
18 chkPlay: 'Sjálfvirk spilun',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'Vinstri bil',
21 properties: 'Eigindi Flash',
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Skali',
31 scaleAll: 'Sýna allt',
32 scaleFit: 'Fella skala að stærð',
33 scaleNoBorder: 'Án ramma',
34 title: 'Eigindi Flash',
35 vSpace: 'Hægri bil',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'Sláðu inn veffang stiklunnar!',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/it.js b/sources/plugins/flash/lang/it.js
new file mode 100644
index 00000000..01322fe5
--- /dev/null
+++ b/sources/plugins/flash/lang/it.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'it', {
6 access: 'Accesso Script',
7 accessAlways: 'Sempre',
8 accessNever: 'Mai',
9 accessSameDomain: 'Solo stesso dominio',
10 alignAbsBottom: 'In basso assoluto',
11 alignAbsMiddle: 'Centrato assoluto',
12 alignBaseline: 'Linea base',
13 alignTextTop: 'In alto al testo',
14 bgcolor: 'Colore sfondo',
15 chkFull: 'Permetti la modalità tutto schermo',
16 chkLoop: 'Riavvio automatico',
17 chkMenu: 'Abilita Menu di Flash',
18 chkPlay: 'Avvio Automatico',
19 flashvars: 'Variabili per Flash',
20 hSpace: 'HSpace',
21 properties: 'Proprietà Oggetto Flash',
22 propertiesTab: 'Proprietà',
23 quality: 'Qualità',
24 qualityAutoHigh: 'Alta Automatica',
25 qualityAutoLow: 'Bassa Automatica',
26 qualityBest: 'Massima',
27 qualityHigh: 'Alta',
28 qualityLow: 'Bassa',
29 qualityMedium: 'Intermedia',
30 scale: 'Ridimensiona',
31 scaleAll: 'Mostra Tutto',
32 scaleFit: 'Dimensione Esatta',
33 scaleNoBorder: 'Senza Bordo',
34 title: 'Proprietà Oggetto Flash',
35 vSpace: 'VSpace',
36 validateHSpace: 'L\'HSpace dev\'essere un numero.',
37 validateSrc: 'Devi inserire l\'URL del collegamento',
38 validateVSpace: 'Il VSpace dev\'essere un numero.',
39 windowMode: 'Modalità finestra',
40 windowModeOpaque: 'Opaca',
41 windowModeTransparent: 'Trasparente',
42 windowModeWindow: 'Finestra'
43} );
diff --git a/sources/plugins/flash/lang/ja.js b/sources/plugins/flash/lang/ja.js
new file mode 100644
index 00000000..080ad9c9
--- /dev/null
+++ b/sources/plugins/flash/lang/ja.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ja', {
6 access: 'スクリプトアクセス(AllowScriptAccess)',
7 accessAlways: 'すべての場合に通信可能(Always)',
8 accessNever: 'すべての場合に通信不可能(Never)',
9 accessSameDomain: '同一ドメインのみに通信可能(Same domain)',
10 alignAbsBottom: '下部(絶対的)',
11 alignAbsMiddle: '中央(絶対的)',
12 alignBaseline: 'ベースライン',
13 alignTextTop: 'テキスト上部',
14 bgcolor: '背景色',
15 chkFull: 'フルスクリーン許可',
16 chkLoop: 'ループ再生',
17 chkMenu: 'Flashメニュー可能',
18 chkPlay: '再生',
19 flashvars: 'フラッシュに渡す変数(FlashVars)',
20 hSpace: '横間隔',
21 properties: 'Flash プロパティ',
22 propertiesTab: 'プロパティ',
23 quality: '画質',
24 qualityAutoHigh: '自動/高',
25 qualityAutoLow: '自動/低',
26 qualityBest: '品質優先',
27 qualityHigh: '高',
28 qualityLow: '低',
29 qualityMedium: '中',
30 scale: '拡大縮小設定',
31 scaleAll: 'すべて表示',
32 scaleFit: '上下左右にフィット',
33 scaleNoBorder: '外が見えない様に拡大',
34 title: 'Flash プロパティ',
35 vSpace: '縦間隔',
36 validateHSpace: '横間隔は数値で入力してください。',
37 validateSrc: 'リンクURLを入力してください。',
38 validateVSpace: '縦間隔は数値で入力してください。',
39 windowMode: 'ウィンドウモード',
40 windowModeOpaque: '背景を不透明設定',
41 windowModeTransparent: '背景を透過設定',
42 windowModeWindow: '標準'
43} );
diff --git a/sources/plugins/flash/lang/ka.js b/sources/plugins/flash/lang/ka.js
new file mode 100644
index 00000000..0a0260eb
--- /dev/null
+++ b/sources/plugins/flash/lang/ka.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ka', {
6 access: 'სკრიპტის წვდომა',
7 accessAlways: 'ყოველთვის',
8 accessNever: 'არასდროს',
9 accessSameDomain: 'იგივე დომენი',
10 alignAbsBottom: 'ჩარჩოს ქვემოთა ნაწილის სწორება ტექსტისთვის',
11 alignAbsMiddle: 'ჩარჩოს შუა ნაწილის სწორება ტექსტისთვის',
12 alignBaseline: 'საბაზისო ხაზის სწორება',
13 alignTextTop: 'ტექსტი ზემოდან',
14 bgcolor: 'ფონის ფერი',
15 chkFull: 'მთელი ეკრანის დაშვება',
16 chkLoop: 'ჩაციკლვა',
17 chkMenu: 'Flash-ის მენიუს დაშვება',
18 chkPlay: 'ავტო გაშვება',
19 flashvars: 'ცვლადები Flash-ისთვის',
20 hSpace: 'ჰორიზ. სივრცე',
21 properties: 'Flash-ის პარამეტრები',
22 propertiesTab: 'პარამეტრები',
23 quality: 'ხარისხი',
24 qualityAutoHigh: 'მაღალი (ავტომატური)',
25 qualityAutoLow: 'ძალიან დაბალი',
26 qualityBest: 'საუკეთესო',
27 qualityHigh: 'მაღალი',
28 qualityLow: 'დაბალი',
29 qualityMedium: 'საშუალო',
30 scale: 'მასშტაბირება',
31 scaleAll: 'ყველაფრის ჩვენება',
32 scaleFit: 'ზუსტი ჩასმა',
33 scaleNoBorder: 'ჩარჩოს გარეშე',
34 title: 'Flash-ის პარამეტრები',
35 vSpace: 'ვერტ. სივრცე',
36 validateHSpace: 'ჰორიზონტალური სივრცე არ უნდა იყოს ცარიელი.',
37 validateSrc: 'URL არ უნდა იყოს ცარიელი.',
38 validateVSpace: 'ვერტიკალური სივრცე არ უნდა იყოს ცარიელი.',
39 windowMode: 'ფანჯრის რეჟიმი',
40 windowModeOpaque: 'გაუმჭვირვალე',
41 windowModeTransparent: 'გამჭვირვალე',
42 windowModeWindow: 'ფანჯარა'
43} );
diff --git a/sources/plugins/flash/lang/km.js b/sources/plugins/flash/lang/km.js
new file mode 100644
index 00000000..d7a95c45
--- /dev/null
+++ b/sources/plugins/flash/lang/km.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'km', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'ជានិច្ច',
8 accessNever: 'កុំ',
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs Bottom', // MISSING
11 alignAbsMiddle: 'Abs Middle', // MISSING
12 alignBaseline: 'បន្ទាត់ជាមូលដ្ឋាន',
13 alignTextTop: 'លើអត្ថបទ',
14 bgcolor: 'ពណ៌ផ្ទៃខាងក្រោយ',
15 chkFull: 'អនុញ្ញាត​ឲ្យ​ពេញ​អេក្រង់',
16 chkLoop: 'ចំនួនដង',
17 chkMenu: 'បង្ហាញ មឺនុយរបស់ Flash',
18 chkPlay: 'លេងដោយស្វ័យប្រវត្ត',
19 flashvars: 'អថេរ Flash',
20 hSpace: 'គំលាតទទឹង',
21 properties: 'ការកំណត់ Flash',
22 propertiesTab: 'លក្ខណៈ​សម្បត្តិ',
23 quality: 'គុណភាព',
24 qualityAutoHigh: 'ខ្ពស់​ស្វ័យ​ប្រវត្តិ',
25 qualityAutoLow: 'ទាប​ស្វ័យ​ប្រវត្តិ',
26 qualityBest: 'ល្អ​បំផុត',
27 qualityHigh: 'ខ្ពស់',
28 qualityLow: 'ទាប',
29 qualityMedium: 'មធ្យម',
30 scale: 'ទំហំ',
31 scaleAll: 'បង្ហាញទាំងអស់',
32 scaleFit: 'ត្រូវល្មម',
33 scaleNoBorder: 'មិនបង្ហាញស៊ុម',
34 title: 'ការកំណត់ Flash',
35 vSpace: 'គំលាតបណ្តោយ',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'សូមសរសេរ អាស័យដ្ឋាន URL',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'ភាព​ថ្លា',
42 windowModeWindow: 'វីនដូ'
43} );
diff --git a/sources/plugins/flash/lang/ko.js b/sources/plugins/flash/lang/ko.js
new file mode 100644
index 00000000..d044d026
--- /dev/null
+++ b/sources/plugins/flash/lang/ko.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ko', {
6 access: '스크립트 허용',
7 accessAlways: '항상 허용',
8 accessNever: '허용 안함',
9 accessSameDomain: '같은 도메인 허용',
10 alignAbsBottom: '아래',
11 alignAbsMiddle: '중간',
12 alignBaseline: '영문 글꼴 기준선',
13 alignTextTop: '글자 상단',
14 bgcolor: '배경 색상',
15 chkFull: '전체화면 허용',
16 chkLoop: '반복',
17 chkMenu: '플래시 메뉴 활성화',
18 chkPlay: '자동 재생',
19 flashvars: '플래시 변수',
20 hSpace: '가로 여백',
21 properties: '플래시 속성',
22 propertiesTab: '속성',
23 quality: '품질',
24 qualityAutoHigh: '자동 높음',
25 qualityAutoLow: '자동 낮음',
26 qualityBest: '최고',
27 qualityHigh: '높음',
28 qualityLow: '낮음',
29 qualityMedium: '중간',
30 scale: '배율',
31 scaleAll: '모두 보기',
32 scaleFit: '맞춤',
33 scaleNoBorder: '테두리 없음',
34 title: '플래시 속성',
35 vSpace: '세로 여백',
36 validateHSpace: '가로 여백은 숫자여야 합니다.',
37 validateSrc: '링크 주소(URL)를 입력하십시오.',
38 validateVSpace: '세로 여백은 숫자여야 합니다.',
39 windowMode: '윈도우 모드',
40 windowModeOpaque: '불투명',
41 windowModeTransparent: '투명',
42 windowModeWindow: '윈도우'
43} );
diff --git a/sources/plugins/flash/lang/ku.js b/sources/plugins/flash/lang/ku.js
new file mode 100644
index 00000000..c1a5bfb4
--- /dev/null
+++ b/sources/plugins/flash/lang/ku.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ku', {
6 access: 'دەستپێگەیشتنی نووسراو',
7 accessAlways: 'هەمیشه',
8 accessNever: 'هەرگیز',
9 accessSameDomain: 'هەمان دۆمەین',
10 alignAbsBottom: 'له ژێرەوه',
11 alignAbsMiddle: 'لەناوەند',
12 alignBaseline: 'هێڵەبنەڕەت',
13 alignTextTop: 'دەق لەسەرەوه',
14 bgcolor: 'ڕەنگی پاشبنەما',
15 chkFull: 'ڕێپێدان بە پڕی شاشه',
16 chkLoop: 'گرێ',
17 chkMenu: 'چالاککردنی لیستەی فلاش',
18 chkPlay: 'پێکردنی یان لێدانی خۆکار',
19 flashvars: 'گۆڕاوەکان بۆ فلاش',
20 hSpace: 'بۆشایی ئاسۆیی',
21 properties: 'خاسیەتی فلاش',
22 propertiesTab: 'خاسیەت',
23 quality: 'جۆرایەتی',
24 qualityAutoHigh: 'بەرزی خۆکار',
25 qualityAutoLow: 'نزمی خۆکار',
26 qualityBest: 'باشترین',
27 qualityHigh: 'بەرزی',
28 qualityLow: 'نزم',
29 qualityMedium: 'مامناوەند',
30 scale: 'پێوانه',
31 scaleAll: 'نیشاندانی هەموو',
32 scaleFit: 'بەوردی بگونجێت',
33 scaleNoBorder: 'بێ پەراوێز',
34 title: 'خاسیەتی فلاش',
35 vSpace: 'بۆشایی ئەستونی',
36 validateHSpace: 'بۆشایی ئاسۆیی دەبێت ژمارە بێت.',
37 validateSrc: 'ناونیشانی بەستەر نابێت خاڵی بێت',
38 validateVSpace: 'بۆشایی ئەستونی دەبێت ژماره بێت.',
39 windowMode: 'شێوازی پەنجەره',
40 windowModeOpaque: 'ناڕوون',
41 windowModeTransparent: 'ڕۆشن',
42 windowModeWindow: 'پەنجەره'
43} );
diff --git a/sources/plugins/flash/lang/lt.js b/sources/plugins/flash/lang/lt.js
new file mode 100644
index 00000000..d29a614c
--- /dev/null
+++ b/sources/plugins/flash/lang/lt.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'lt', {
6 access: 'Skripto priėjimas',
7 accessAlways: 'Visada',
8 accessNever: 'Niekada',
9 accessSameDomain: 'Tas pats domenas',
10 alignAbsBottom: 'Absoliučią apačią',
11 alignAbsMiddle: 'Absoliutų vidurį',
12 alignBaseline: 'Apatinę liniją',
13 alignTextTop: 'Teksto viršūnę',
14 bgcolor: 'Fono spalva',
15 chkFull: 'Leisti per visą ekraną',
16 chkLoop: 'Ciklas',
17 chkMenu: 'Leisti Flash meniu',
18 chkPlay: 'Automatinis paleidimas',
19 flashvars: 'Flash kintamieji',
20 hSpace: 'Hor.Erdvė',
21 properties: 'Flash savybės',
22 propertiesTab: 'Nustatymai',
23 quality: 'Kokybė',
24 qualityAutoHigh: 'Automatiškai Gera',
25 qualityAutoLow: 'Automatiškai Žema',
26 qualityBest: 'Geriausia',
27 qualityHigh: 'Gera',
28 qualityLow: 'Žema',
29 qualityMedium: 'Vidutinė',
30 scale: 'Mastelis',
31 scaleAll: 'Rodyti visą',
32 scaleFit: 'Tikslus atitikimas',
33 scaleNoBorder: 'Be rėmelio',
34 title: 'Flash savybės',
35 vSpace: 'Vert.Erdvė',
36 validateHSpace: 'HSpace turi būti skaičius.',
37 validateSrc: 'Prašome įvesti nuorodos URL',
38 validateVSpace: 'VSpace turi būti skaičius.',
39 windowMode: 'Lango režimas',
40 windowModeOpaque: 'Nepermatomas',
41 windowModeTransparent: 'Permatomas',
42 windowModeWindow: 'Langas'
43} );
diff --git a/sources/plugins/flash/lang/lv.js b/sources/plugins/flash/lang/lv.js
new file mode 100644
index 00000000..ff033511
--- /dev/null
+++ b/sources/plugins/flash/lang/lv.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'lv', {
6 access: 'Skripta pieeja',
7 accessAlways: 'Vienmēr',
8 accessNever: 'Nekad',
9 accessSameDomain: 'Tas pats domēns',
10 alignAbsBottom: 'Absolūti apakšā',
11 alignAbsMiddle: 'Absolūti vertikāli centrēts',
12 alignBaseline: 'Pamatrindā',
13 alignTextTop: 'Teksta augšā',
14 bgcolor: 'Fona krāsa',
15 chkFull: 'Pilnekrāns',
16 chkLoop: 'Nepārtraukti',
17 chkMenu: 'Atļaut Flash izvēlni',
18 chkPlay: 'Automātiska atskaņošana',
19 flashvars: 'Flash mainīgie',
20 hSpace: 'Horizontālā telpa',
21 properties: 'Flash īpašības',
22 propertiesTab: 'Uzstādījumi',
23 quality: 'Kvalitāte',
24 qualityAutoHigh: 'Automātiski Augsta',
25 qualityAutoLow: 'Automātiski Zema',
26 qualityBest: 'Labākā',
27 qualityHigh: 'Augsta',
28 qualityLow: 'Zema',
29 qualityMedium: 'Vidēja',
30 scale: 'Mainīt izmēru',
31 scaleAll: 'Rādīt visu',
32 scaleFit: 'Precīzs izmērs',
33 scaleNoBorder: 'Bez rāmja',
34 title: 'Flash īpašības',
35 vSpace: 'Vertikālā telpa',
36 validateHSpace: 'Hspace jābūt skaitlim',
37 validateSrc: 'Lūdzu norādi hipersaiti',
38 validateVSpace: 'Vspace jābūt skaitlim',
39 windowMode: 'Loga režīms',
40 windowModeOpaque: 'Necaurspīdīgs',
41 windowModeTransparent: 'Caurspīdīgs',
42 windowModeWindow: 'Logs'
43} );
diff --git a/sources/plugins/flash/lang/mk.js b/sources/plugins/flash/lang/mk.js
new file mode 100644
index 00000000..878d3792
--- /dev/null
+++ b/sources/plugins/flash/lang/mk.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'mk', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs Bottom', // MISSING
11 alignAbsMiddle: 'Abs Middle', // MISSING
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Text Top', // MISSING
14 bgcolor: 'Background color', // MISSING
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Loop', // MISSING
17 chkMenu: 'Enable Flash Menu', // MISSING
18 chkPlay: 'Auto Play', // MISSING
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'HSpace', // MISSING
21 properties: 'Flash Properties', // MISSING
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Scale', // MISSING
31 scaleAll: 'Show all', // MISSING
32 scaleFit: 'Exact Fit', // MISSING
33 scaleNoBorder: 'No Border', // MISSING
34 title: 'Flash Properties', // MISSING
35 vSpace: 'VSpace', // MISSING
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'URL must not be empty.', // MISSING
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/mn.js b/sources/plugins/flash/lang/mn.js
new file mode 100644
index 00000000..450acc71
--- /dev/null
+++ b/sources/plugins/flash/lang/mn.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'mn', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Онцлогууд',
8 accessNever: 'Хэзээ ч үгүй',
9 accessSameDomain: 'Байнга',
10 alignAbsBottom: 'Abs доод талд',
11 alignAbsMiddle: 'Abs Дунд талд',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Текст дээр',
14 bgcolor: 'Дэвсгэр өнгө',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Давтах',
17 chkMenu: 'Флаш цэс идвэхжүүлэх',
18 chkPlay: 'Автоматаар тоглох',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'Хөндлөн зай',
21 properties: 'Флаш шинж чанар',
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Өргөгтгөх',
31 scaleAll: 'Бүгдийг харуулах',
32 scaleFit: 'Яг тааруулах',
33 scaleNoBorder: 'Хүрээгүй',
34 title: 'Флаш шинж чанар',
35 vSpace: 'Босоо зай',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'Линк URL-ээ төрөлжүүлнэ үү',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/ms.js b/sources/plugins/flash/lang/ms.js
new file mode 100644
index 00000000..f71871a1
--- /dev/null
+++ b/sources/plugins/flash/lang/ms.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ms', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Bawah Mutlak',
11 alignAbsMiddle: 'Pertengahan Mutlak',
12 alignBaseline: 'Garis Dasar',
13 alignTextTop: 'Atas Text',
14 bgcolor: 'Warna Latarbelakang',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Loop', // MISSING
17 chkMenu: 'Enable Flash Menu', // MISSING
18 chkPlay: 'Auto Play', // MISSING
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'Ruang Melintang',
21 properties: 'Flash Properties', // MISSING
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Scale', // MISSING
31 scaleAll: 'Show all', // MISSING
32 scaleFit: 'Exact Fit', // MISSING
33 scaleNoBorder: 'No Border', // MISSING
34 title: 'Flash Properties', // MISSING
35 vSpace: 'Ruang Menegak',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'Sila taip sambungan URL',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/nb.js b/sources/plugins/flash/lang/nb.js
new file mode 100644
index 00000000..6b315f41
--- /dev/null
+++ b/sources/plugins/flash/lang/nb.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'nb', {
6 access: 'Scripttilgang',
7 accessAlways: 'Alltid',
8 accessNever: 'Aldri',
9 accessSameDomain: 'Samme domene',
10 alignAbsBottom: 'Abs bunn',
11 alignAbsMiddle: 'Abs midten',
12 alignBaseline: 'Bunnlinje',
13 alignTextTop: 'Tekst topp',
14 bgcolor: 'Bakgrunnsfarge',
15 chkFull: 'Tillat fullskjerm',
16 chkLoop: 'Loop',
17 chkMenu: 'Slå på Flash-meny',
18 chkPlay: 'Autospill',
19 flashvars: 'Variabler for flash',
20 hSpace: 'HMarg',
21 properties: 'Egenskaper for Flash-objekt',
22 propertiesTab: 'Egenskaper',
23 quality: 'Kvalitet',
24 qualityAutoHigh: 'Auto høy',
25 qualityAutoLow: 'Auto lav',
26 qualityBest: 'Best',
27 qualityHigh: 'Høy',
28 qualityLow: 'Lav',
29 qualityMedium: 'Medium',
30 scale: 'Skaler',
31 scaleAll: 'Vis alt',
32 scaleFit: 'Skaler til å passe',
33 scaleNoBorder: 'Ingen ramme',
34 title: 'Flash-egenskaper',
35 vSpace: 'VMarg',
36 validateHSpace: 'HMarg må være et tall.',
37 validateSrc: 'Vennligst skriv inn lenkens url.',
38 validateVSpace: 'VMarg må være et tall.',
39 windowMode: 'Vindumodus',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Gjennomsiktig',
42 windowModeWindow: 'Vindu'
43} );
diff --git a/sources/plugins/flash/lang/nl.js b/sources/plugins/flash/lang/nl.js
new file mode 100644
index 00000000..f577a752
--- /dev/null
+++ b/sources/plugins/flash/lang/nl.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'nl', {
6 access: 'Script toegang',
7 accessAlways: 'Altijd',
8 accessNever: 'Nooit',
9 accessSameDomain: 'Zelfde domeinnaam',
10 alignAbsBottom: 'Absoluut-onder',
11 alignAbsMiddle: 'Absoluut-midden',
12 alignBaseline: 'Basislijn',
13 alignTextTop: 'Boven tekst',
14 bgcolor: 'Achtergrondkleur',
15 chkFull: 'Schermvullend toestaan',
16 chkLoop: 'Herhalen',
17 chkMenu: 'Flashmenu\'s inschakelen',
18 chkPlay: 'Automatisch afspelen',
19 flashvars: 'Variabelen voor Flash',
20 hSpace: 'HSpace',
21 properties: 'Eigenschappen Flash',
22 propertiesTab: 'Eigenschappen',
23 quality: 'Kwaliteit',
24 qualityAutoHigh: 'Automatisch hoog',
25 qualityAutoLow: 'Automatisch laag',
26 qualityBest: 'Beste',
27 qualityHigh: 'Hoog',
28 qualityLow: 'Laag',
29 qualityMedium: 'Gemiddeld',
30 scale: 'Schaal',
31 scaleAll: 'Alles tonen',
32 scaleFit: 'Precies passend',
33 scaleNoBorder: 'Geen rand',
34 title: 'Eigenschappen Flash',
35 vSpace: 'VSpace',
36 validateHSpace: 'De HSpace moet een getal zijn.',
37 validateSrc: 'De URL mag niet leeg zijn.',
38 validateVSpace: 'De VSpace moet een getal zijn.',
39 windowMode: 'Venster modus',
40 windowModeOpaque: 'Ondoorzichtig',
41 windowModeTransparent: 'Doorzichtig',
42 windowModeWindow: 'Venster'
43} );
diff --git a/sources/plugins/flash/lang/no.js b/sources/plugins/flash/lang/no.js
new file mode 100644
index 00000000..0b976aec
--- /dev/null
+++ b/sources/plugins/flash/lang/no.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'no', {
6 access: 'Scripttilgang',
7 accessAlways: 'Alltid',
8 accessNever: 'Aldri',
9 accessSameDomain: 'Samme domene',
10 alignAbsBottom: 'Abs bunn',
11 alignAbsMiddle: 'Abs midten',
12 alignBaseline: 'Bunnlinje',
13 alignTextTop: 'Tekst topp',
14 bgcolor: 'Bakgrunnsfarge',
15 chkFull: 'Tillat fullskjerm',
16 chkLoop: 'Loop',
17 chkMenu: 'Slå på Flash-meny',
18 chkPlay: 'Autospill',
19 flashvars: 'Variabler for flash',
20 hSpace: 'HMarg',
21 properties: 'Egenskaper for Flash-objekt',
22 propertiesTab: 'Egenskaper',
23 quality: 'Kvalitet',
24 qualityAutoHigh: 'Auto høy',
25 qualityAutoLow: 'Auto lav',
26 qualityBest: 'Best',
27 qualityHigh: 'Høy',
28 qualityLow: 'Lav',
29 qualityMedium: 'Medium',
30 scale: 'Skaler',
31 scaleAll: 'Vis alt',
32 scaleFit: 'Skaler til å passe',
33 scaleNoBorder: 'Ingen ramme',
34 title: 'Flash-egenskaper',
35 vSpace: 'VMarg',
36 validateHSpace: 'HMarg må være et tall.',
37 validateSrc: 'Vennligst skriv inn lenkens url.',
38 validateVSpace: 'VMarg må være et tall.',
39 windowMode: 'Vindumodus',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Gjennomsiktig',
42 windowModeWindow: 'Vindu'
43} );
diff --git a/sources/plugins/flash/lang/pl.js b/sources/plugins/flash/lang/pl.js
new file mode 100644
index 00000000..e7850332
--- /dev/null
+++ b/sources/plugins/flash/lang/pl.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'pl', {
6 access: 'Dostęp skryptów',
7 accessAlways: 'Zawsze',
8 accessNever: 'Nigdy',
9 accessSameDomain: 'Ta sama domena',
10 alignAbsBottom: 'Do dołu',
11 alignAbsMiddle: 'Do środka w pionie',
12 alignBaseline: 'Do linii bazowej',
13 alignTextTop: 'Do góry tekstu',
14 bgcolor: 'Kolor tła',
15 chkFull: 'Zezwól na pełny ekran',
16 chkLoop: 'Pętla',
17 chkMenu: 'Włącz menu',
18 chkPlay: 'Autoodtwarzanie',
19 flashvars: 'Zmienne obiektu Flash',
20 hSpace: 'Odstęp poziomy',
21 properties: 'Właściwości obiektu Flash',
22 propertiesTab: 'Właściwości',
23 quality: 'Jakość',
24 qualityAutoHigh: 'Auto wysoka',
25 qualityAutoLow: 'Auto niska',
26 qualityBest: 'Najlepsza',
27 qualityHigh: 'Wysoka',
28 qualityLow: 'Niska',
29 qualityMedium: 'Średnia',
30 scale: 'Skaluj',
31 scaleAll: 'Pokaż wszystko',
32 scaleFit: 'Dokładne dopasowanie',
33 scaleNoBorder: 'Bez obramowania',
34 title: 'Właściwości obiektu Flash',
35 vSpace: 'Odstęp pionowy',
36 validateHSpace: 'Odstęp poziomy musi być liczbą.',
37 validateSrc: 'Podaj adres URL',
38 validateVSpace: 'Odstęp pionowy musi być liczbą.',
39 windowMode: 'Tryb okna',
40 windowModeOpaque: 'Nieprzezroczyste',
41 windowModeTransparent: 'Przezroczyste',
42 windowModeWindow: 'Okno'
43} );
diff --git a/sources/plugins/flash/lang/pt-br.js b/sources/plugins/flash/lang/pt-br.js
new file mode 100644
index 00000000..6e57ece4
--- /dev/null
+++ b/sources/plugins/flash/lang/pt-br.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'pt-br', {
6 access: 'Acesso ao script',
7 accessAlways: 'Sempre',
8 accessNever: 'Nunca',
9 accessSameDomain: 'Acessar Mesmo Domínio',
10 alignAbsBottom: 'Inferior Absoluto',
11 alignAbsMiddle: 'Centralizado Absoluto',
12 alignBaseline: 'Baseline',
13 alignTextTop: 'Superior Absoluto',
14 bgcolor: 'Cor do Plano de Fundo',
15 chkFull: 'Permitir tela cheia',
16 chkLoop: 'Tocar Infinitamente',
17 chkMenu: 'Habilita Menu Flash',
18 chkPlay: 'Tocar Automaticamente',
19 flashvars: 'Variáveis do Flash',
20 hSpace: 'HSpace',
21 properties: 'Propriedades do Flash',
22 propertiesTab: 'Propriedades',
23 quality: 'Qualidade',
24 qualityAutoHigh: 'Qualidade Alta Automática',
25 qualityAutoLow: 'Qualidade Baixa Automática',
26 qualityBest: 'Qualidade Melhor',
27 qualityHigh: 'Qualidade Alta',
28 qualityLow: 'Qualidade Baixa',
29 qualityMedium: 'Qualidade Média',
30 scale: 'Escala',
31 scaleAll: 'Mostrar tudo',
32 scaleFit: 'Escala Exata',
33 scaleNoBorder: 'Sem Borda',
34 title: 'Propriedades do Flash',
35 vSpace: 'VSpace',
36 validateHSpace: 'O HSpace tem que ser um número',
37 validateSrc: 'Por favor, digite o endereço do link',
38 validateVSpace: 'O VSpace tem que ser um número.',
39 windowMode: 'Modo da janela',
40 windowModeOpaque: 'Opaca',
41 windowModeTransparent: 'Transparente',
42 windowModeWindow: 'Janela'
43} );
diff --git a/sources/plugins/flash/lang/pt.js b/sources/plugins/flash/lang/pt.js
new file mode 100644
index 00000000..c2b2c2e5
--- /dev/null
+++ b/sources/plugins/flash/lang/pt.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'pt', {
6 access: 'Acesso ao Script',
7 accessAlways: 'Sempre',
8 accessNever: 'Nunca',
9 accessSameDomain: 'Mesmo dominio',
10 alignAbsBottom: 'Abs inferior',
11 alignAbsMiddle: 'Abs centro',
12 alignBaseline: 'Linha de base',
13 alignTextTop: 'Topo do texto',
14 bgcolor: 'Cor de Fundo',
15 chkFull: 'Permitir Ecrã inteiro',
16 chkLoop: 'Loop',
17 chkMenu: 'Permitir Menu do Flash',
18 chkPlay: 'Reproduzir automaticamente',
19 flashvars: 'Variaveis para o Flash',
20 hSpace: 'Esp.Horiz',
21 properties: 'Propriedades do Flash',
22 propertiesTab: 'Propriedades',
23 quality: 'Qualidade',
24 qualityAutoHigh: 'Alta Automaticamente',
25 qualityAutoLow: 'Baixa Automaticamente',
26 qualityBest: 'Melhor',
27 qualityHigh: 'Alta',
28 qualityLow: 'Baixa',
29 qualityMedium: 'Média',
30 scale: 'Escala',
31 scaleAll: 'Mostrar tudo',
32 scaleFit: 'Tamanho Exacto',
33 scaleNoBorder: 'Sem Limites',
34 title: 'Propriedades do Flash',
35 vSpace: 'Esp.Vert',
36 validateHSpace: 'HSpace tem de ser um numero.',
37 validateSrc: 'Por favor introduza a hiperligação URL',
38 validateVSpace: 'VSpace tem de ser um numero.',
39 windowMode: 'Modo de janela',
40 windowModeOpaque: 'Opaco',
41 windowModeTransparent: 'Transparente',
42 windowModeWindow: 'Janela'
43} );
diff --git a/sources/plugins/flash/lang/ro.js b/sources/plugins/flash/lang/ro.js
new file mode 100644
index 00000000..488ad1e3
--- /dev/null
+++ b/sources/plugins/flash/lang/ro.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ro', {
6 access: 'Acces script',
7 accessAlways: 'Întotdeauna',
8 accessNever: 'Niciodată',
9 accessSameDomain: 'Același domeniu',
10 alignAbsBottom: 'Jos absolut (Abs Bottom)',
11 alignAbsMiddle: 'Mijloc absolut (Abs Middle)',
12 alignBaseline: 'Linia de jos (Baseline)',
13 alignTextTop: 'Text sus',
14 bgcolor: 'Coloarea fundalului',
15 chkFull: 'Permite pe tot ecranul',
16 chkLoop: 'Repetă (Loop)',
17 chkMenu: 'Activează meniul flash',
18 chkPlay: 'Rulează automat',
19 flashvars: 'Variabile pentru flash',
20 hSpace: 'HSpace',
21 properties: 'Proprietăţile flashului',
22 propertiesTab: 'Proprietăți',
23 quality: 'Calitate',
24 qualityAutoHigh: 'Auto înaltă',
25 qualityAutoLow: 'Auto Joasă',
26 qualityBest: 'Cea mai bună',
27 qualityHigh: 'Înaltă',
28 qualityLow: 'Joasă',
29 qualityMedium: 'Medie',
30 scale: 'Scală',
31 scaleAll: 'Arată tot',
32 scaleFit: 'Potriveşte',
33 scaleNoBorder: 'Fără bordură (No border)',
34 title: 'Proprietăţile flashului',
35 vSpace: 'VSpace',
36 validateHSpace: 'Hspace trebuie să fie un număr.',
37 validateSrc: 'Vă rugăm să scrieţi URL-ul',
38 validateVSpace: 'VSpace trebuie să fie un număr',
39 windowMode: 'Mod fereastră',
40 windowModeOpaque: 'Opacă',
41 windowModeTransparent: 'Transparentă',
42 windowModeWindow: 'Fereastră'
43} );
diff --git a/sources/plugins/flash/lang/ru.js b/sources/plugins/flash/lang/ru.js
new file mode 100644
index 00000000..2c03bb32
--- /dev/null
+++ b/sources/plugins/flash/lang/ru.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ru', {
6 access: 'Доступ к скриптам',
7 accessAlways: 'Всегда',
8 accessNever: 'Никогда',
9 accessSameDomain: 'В том же домене',
10 alignAbsBottom: 'По низу текста',
11 alignAbsMiddle: 'По середине текста',
12 alignBaseline: 'По базовой линии',
13 alignTextTop: 'По верху текста',
14 bgcolor: 'Цвет фона',
15 chkFull: 'Разрешить полноэкранный режим',
16 chkLoop: 'Повторять',
17 chkMenu: 'Включить меню Flash',
18 chkPlay: 'Автоматическое воспроизведение',
19 flashvars: 'Переменные для Flash',
20 hSpace: 'Гориз. отступ',
21 properties: 'Свойства Flash',
22 propertiesTab: 'Свойства',
23 quality: 'Качество',
24 qualityAutoHigh: 'Запуск на высоком',
25 qualityAutoLow: 'Запуск на низком',
26 qualityBest: 'Лучшее',
27 qualityHigh: 'Высокое',
28 qualityLow: 'Низкое',
29 qualityMedium: 'Среднее',
30 scale: 'Масштабировать',
31 scaleAll: 'Пропорционально',
32 scaleFit: 'Заполнять',
33 scaleNoBorder: 'Заходить за границы',
34 title: 'Свойства Flash',
35 vSpace: 'Вертик. отступ',
36 validateHSpace: 'Горизонтальный отступ задается числом.',
37 validateSrc: 'Вы должны ввести ссылку',
38 validateVSpace: 'Вертикальный отступ задается числом.',
39 windowMode: 'Взаимодействие с окном',
40 windowModeOpaque: 'Непрозрачный',
41 windowModeTransparent: 'Прозрачный',
42 windowModeWindow: 'Обычный'
43} );
diff --git a/sources/plugins/flash/lang/si.js b/sources/plugins/flash/lang/si.js
new file mode 100644
index 00000000..1511971a
--- /dev/null
+++ b/sources/plugins/flash/lang/si.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'si', {
6 access: 'පිටපත් ප්‍රවේශය',
7 accessAlways: 'හැමවිටම',
8 accessNever: 'කිසිදා නොවේ',
9 accessSameDomain: 'එකම වසමේ',
10 alignAbsBottom: 'පතුල',
11 alignAbsMiddle: 'Abs ',
12 alignBaseline: 'පාද රේඛාව',
13 alignTextTop: 'වගන්තිය ඉහල',
14 bgcolor: 'පසුබිම් වර්ණය',
15 chkFull: 'පුර්ණ තිරය සදහා අවසර',
16 chkLoop: 'පුඩුව',
17 chkMenu: 'සක්‍රිය බබලන මෙනුව',
18 chkPlay: 'ස්‌වයංක්‍රිය ක්‍රියාත්මක වීම',
19 flashvars: 'වෙනස්වන දත්ත',
20 hSpace: 'HSpace',
21 properties: 'බබලන ගුණ',
22 propertiesTab: 'ගුණ',
23 quality: 'තත්වය',
24 qualityAutoHigh: 'ස්‌වයංක්‍රිය ',
25 qualityAutoLow: ' ස්‌වයංක්‍රිය ',
26 qualityBest: 'වඩාත් ගැලපෙන',
27 qualityHigh: 'ඉහළ',
28 qualityLow: 'පහළ',
29 qualityMedium: 'මධ්‍ය',
30 scale: 'පරිමාණ',
31 scaleAll: 'සියල්ල ',
32 scaleFit: 'හරියටම ගැලපෙන',
33 scaleNoBorder: 'මාඉම් නොමැති',
34 title: 'බබලන ',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace සංක්‍යාවක් විය යුතුය.',
37 validateSrc: 'URL හිස් නොවිය ',
38 validateVSpace: 'VSpace සංක්‍යාවක් විය යුතුය',
39 windowMode: 'ජනෙල ක්‍රමය',
40 windowModeOpaque: 'විනිවිද පෙනෙන',
41 windowModeTransparent: 'විනිවිද පෙනෙන',
42 windowModeWindow: 'ජනෙල'
43} );
diff --git a/sources/plugins/flash/lang/sk.js b/sources/plugins/flash/lang/sk.js
new file mode 100644
index 00000000..f29b4f04
--- /dev/null
+++ b/sources/plugins/flash/lang/sk.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'sk', {
6 access: 'Prístup skriptu',
7 accessAlways: 'Vždy',
8 accessNever: 'Nikdy',
9 accessSameDomain: 'Rovnaká doména',
10 alignAbsBottom: 'Úplne dole',
11 alignAbsMiddle: 'Do stredu',
12 alignBaseline: 'Na základnú čiaru',
13 alignTextTop: 'Na horný okraj textu',
14 bgcolor: 'Farba pozadia',
15 chkFull: 'Povoliť zobrazenie na celú obrazovku (fullscreen)',
16 chkLoop: 'Opakovanie',
17 chkMenu: 'Povoliť Flash Menu',
18 chkPlay: 'Automatické prehrávanie',
19 flashvars: 'Premenné pre Flash',
20 hSpace: 'H-medzera',
21 properties: 'Vlastnosti Flashu',
22 propertiesTab: 'Vlastnosti',
23 quality: 'Kvalita',
24 qualityAutoHigh: 'Automaticky vysoká',
25 qualityAutoLow: 'Automaticky nízka',
26 qualityBest: 'Najlepšia',
27 qualityHigh: 'Vysoká',
28 qualityLow: 'Nízka',
29 qualityMedium: 'Stredná',
30 scale: 'Mierka',
31 scaleAll: 'Zobraziť všetko',
32 scaleFit: 'Roztiahnuť, aby sedelo presne',
33 scaleNoBorder: 'Bez okrajov',
34 title: 'Vlastnosti Flashu',
35 vSpace: 'V-medzera',
36 validateHSpace: 'H-medzera musí byť číslo.',
37 validateSrc: 'URL nesmie byť prázdne.',
38 validateVSpace: 'V-medzera musí byť číslo',
39 windowMode: 'Mód okna',
40 windowModeOpaque: 'Nepriehľadný',
41 windowModeTransparent: 'Priehľadný',
42 windowModeWindow: 'Okno'
43} );
diff --git a/sources/plugins/flash/lang/sl.js b/sources/plugins/flash/lang/sl.js
new file mode 100644
index 00000000..7b7be227
--- /dev/null
+++ b/sources/plugins/flash/lang/sl.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'sl', {
6 access: 'Dostop skript',
7 accessAlways: 'Vedno',
8 accessNever: 'Nikoli',
9 accessSameDomain: 'Samo ista domena',
10 alignAbsBottom: 'Popolnoma na dno',
11 alignAbsMiddle: 'Popolnoma v sredino',
12 alignBaseline: 'Na osnovno črto',
13 alignTextTop: 'Besedilo na vrh',
14 bgcolor: 'Barva ozadja',
15 chkFull: 'Dovoli celozaslonski način',
16 chkLoop: 'Ponavljanje',
17 chkMenu: 'Omogoči Flash Meni',
18 chkPlay: 'Samodejno predvajaj',
19 flashvars: 'Spremenljivke za Flash',
20 hSpace: 'Vodoravni razmik',
21 properties: 'Lastnosti Flash',
22 propertiesTab: 'Lastnosti',
23 quality: 'Kakovost',
24 qualityAutoHigh: 'Samodejno visoka',
25 qualityAutoLow: 'Samodejno nizka',
26 qualityBest: 'Najvišja',
27 qualityHigh: 'Visoka',
28 qualityLow: 'Nizka',
29 qualityMedium: 'Srednja',
30 scale: 'Povečava',
31 scaleAll: 'Pokaži vse',
32 scaleFit: 'Natančno prileganje',
33 scaleNoBorder: 'Brez obrobe',
34 title: 'Lastnosti Flash',
35 vSpace: 'Navpični razmik',
36 validateHSpace: 'Vodoravni razmik mora biti število.',
37 validateSrc: 'Vnesite URL povezave',
38 validateVSpace: 'Navpični razmik mora biti število.',
39 windowMode: 'Vrsta okna',
40 windowModeOpaque: 'Motno',
41 windowModeTransparent: 'Prosojno',
42 windowModeWindow: 'Okno'
43} );
diff --git a/sources/plugins/flash/lang/sq.js b/sources/plugins/flash/lang/sq.js
new file mode 100644
index 00000000..84c8138f
--- /dev/null
+++ b/sources/plugins/flash/lang/sq.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'sq', {
6 access: 'Qasja në Skriptë',
7 accessAlways: 'Gjithnjë',
8 accessNever: 'Asnjëherë',
9 accessSameDomain: 'Fusha e Njëjtë',
10 alignAbsBottom: 'Abs në Fund',
11 alignAbsMiddle: 'Abs në Mes',
12 alignBaseline: 'Baza',
13 alignTextTop: 'Koka e Tekstit',
14 bgcolor: 'Ngjyra e Prapavijës',
15 chkFull: 'Lejo Ekran të Plotë',
16 chkLoop: 'Përsëritje',
17 chkMenu: 'Lejo Menynë për Flash',
18 chkPlay: 'Auto Play',
19 flashvars: 'Variablat për Flash',
20 hSpace: 'Hapësira Horizontale',
21 properties: 'Karakteristikat për Flash',
22 propertiesTab: 'Karakteristikat',
23 quality: 'Kualiteti',
24 qualityAutoHigh: 'Automatikisht i Lartë',
25 qualityAutoLow: 'Automatikisht i Ulët',
26 qualityBest: 'Më i Miri',
27 qualityHigh: 'I Lartë',
28 qualityLow: 'Më i Ulti',
29 qualityMedium: 'I Mesëm',
30 scale: 'Shkalla',
31 scaleAll: 'Shfaq të Gjitha',
32 scaleFit: 'Përputhje të Plotë',
33 scaleNoBorder: 'Pa Kornizë',
34 title: 'Rekuizitat për Flash',
35 vSpace: 'Hapësira Vertikale',
36 validateHSpace: 'Hapësira Horizontale duhet të është numër.',
37 validateSrc: 'URL nuk duhet mbetur zbrazur.',
38 validateVSpace: 'Hapësira Vertikale duhet të është numër.',
39 windowMode: 'Window mode',
40 windowModeOpaque: 'Errët',
41 windowModeTransparent: 'Tejdukshëm',
42 windowModeWindow: 'Window'
43} );
diff --git a/sources/plugins/flash/lang/sr-latn.js b/sources/plugins/flash/lang/sr-latn.js
new file mode 100644
index 00000000..83a7c5ce
--- /dev/null
+++ b/sources/plugins/flash/lang/sr-latn.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'sr-latn', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs dole',
11 alignAbsMiddle: 'Abs sredina',
12 alignBaseline: 'Bazno',
13 alignTextTop: 'Vrh teksta',
14 bgcolor: 'Boja pozadine',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Ponavljaj',
17 chkMenu: 'Uključi fleš meni',
18 chkPlay: 'Automatski start',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'HSpace',
21 properties: 'Osobine fleša',
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Skaliraj',
31 scaleAll: 'Prikaži sve',
32 scaleFit: 'Popuni površinu',
33 scaleNoBorder: 'Bez ivice',
34 title: 'Osobine fleša',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'Unesite URL linka',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/sr.js b/sources/plugins/flash/lang/sr.js
new file mode 100644
index 00000000..18bbf0c1
--- /dev/null
+++ b/sources/plugins/flash/lang/sr.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'sr', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Always', // MISSING
8 accessNever: 'Never', // MISSING
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Abs доле',
11 alignAbsMiddle: 'Abs средина',
12 alignBaseline: 'Базно',
13 alignTextTop: 'Врх текста',
14 bgcolor: 'Боја позадине',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Понављај',
17 chkMenu: 'Укључи флеш мени',
18 chkPlay: 'Аутоматски старт',
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'HSpace',
21 properties: 'Особине Флеша',
22 propertiesTab: 'Properties', // MISSING
23 quality: 'Quality', // MISSING
24 qualityAutoHigh: 'Auto High', // MISSING
25 qualityAutoLow: 'Auto Low', // MISSING
26 qualityBest: 'Best', // MISSING
27 qualityHigh: 'High', // MISSING
28 qualityLow: 'Low', // MISSING
29 qualityMedium: 'Medium', // MISSING
30 scale: 'Скалирај',
31 scaleAll: 'Прикажи све',
32 scaleFit: 'Попуни површину',
33 scaleNoBorder: 'Без ивице',
34 title: 'Особине флеша',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace must be a number.', // MISSING
37 validateSrc: 'Унесите УРЛ линка',
38 validateVSpace: 'VSpace must be a number.', // MISSING
39 windowMode: 'Window mode', // MISSING
40 windowModeOpaque: 'Opaque', // MISSING
41 windowModeTransparent: 'Transparent', // MISSING
42 windowModeWindow: 'Window' // MISSING
43} );
diff --git a/sources/plugins/flash/lang/sv.js b/sources/plugins/flash/lang/sv.js
new file mode 100644
index 00000000..c2e3b3fb
--- /dev/null
+++ b/sources/plugins/flash/lang/sv.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'sv', {
6 access: 'Script-tillgång',
7 accessAlways: 'Alltid',
8 accessNever: 'Aldrig',
9 accessSameDomain: 'Samma domän',
10 alignAbsBottom: 'Absolut nederkant',
11 alignAbsMiddle: 'Absolut centrering',
12 alignBaseline: 'Baslinje',
13 alignTextTop: 'Text överkant',
14 bgcolor: 'Bakgrundsfärg',
15 chkFull: 'Tillåt helskärm',
16 chkLoop: 'Upprepa/Loopa',
17 chkMenu: 'Aktivera Flashmeny',
18 chkPlay: 'Automatisk uppspelning',
19 flashvars: 'Variabler för Flash',
20 hSpace: 'Horis. marginal',
21 properties: 'Flashegenskaper',
22 propertiesTab: 'Egenskaper',
23 quality: 'Kvalitet',
24 qualityAutoHigh: 'Auto Hög',
25 qualityAutoLow: 'Auto Låg',
26 qualityBest: 'Bäst',
27 qualityHigh: 'Hög',
28 qualityLow: 'Låg',
29 qualityMedium: 'Medium',
30 scale: 'Skala',
31 scaleAll: 'Visa allt',
32 scaleFit: 'Exakt passning',
33 scaleNoBorder: 'Ingen ram',
34 title: 'Flashegenskaper',
35 vSpace: 'Vert. marginal',
36 validateHSpace: 'HSpace måste vara ett nummer.',
37 validateSrc: 'Var god ange länkens URL',
38 validateVSpace: 'VSpace måste vara ett nummer.',
39 windowMode: 'Fönsterläge',
40 windowModeOpaque: 'Opaque',
41 windowModeTransparent: 'Transparent',
42 windowModeWindow: 'Fönster'
43} );
diff --git a/sources/plugins/flash/lang/th.js b/sources/plugins/flash/lang/th.js
new file mode 100644
index 00000000..8a5c55da
--- /dev/null
+++ b/sources/plugins/flash/lang/th.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'th', {
6 access: 'การเข้าถึงสคริปต์',
7 accessAlways: 'ตลอดไป',
8 accessNever: 'ไม่เลย',
9 accessSameDomain: 'โดเมนเดียวกัน',
10 alignAbsBottom: 'ชิดด้านล่างสุด',
11 alignAbsMiddle: 'กึ่งกลาง',
12 alignBaseline: 'ชิดบรรทัด',
13 alignTextTop: 'ใต้ตัวอักษร',
14 bgcolor: 'สีพื้นหลัง',
15 chkFull: 'อนุญาตให้แสดงเต็มหน้าจอได้',
16 chkLoop: 'เล่นวนรอบ Loop',
17 chkMenu: 'ให้ใช้งานเมนูของ Flash',
18 chkPlay: 'เล่นอัตโนมัติ Auto Play',
19 flashvars: 'ตัวแปรสำหรับ Flas',
20 hSpace: 'ระยะแนวนอน',
21 properties: 'คุณสมบัติของไฟล์ Flash',
22 propertiesTab: 'คุณสมบัติ',
23 quality: 'คุณภาพ',
24 qualityAutoHigh: 'ปรับคุณภาพสูงอัตโนมัติ',
25 qualityAutoLow: 'ปรับคุณภาพต่ำอัตโนมัติ',
26 qualityBest: 'ดีที่สุด',
27 qualityHigh: 'สูง',
28 qualityLow: 'ต่ำ',
29 qualityMedium: 'ปานกลาง',
30 scale: 'อัตราส่วน Scale',
31 scaleAll: 'แสดงให้เห็นทั้งหมด Show all',
32 scaleFit: 'แสดงให้พอดีกับพื้นที่ Exact Fit',
33 scaleNoBorder: 'ไม่แสดงเส้นขอบ No Border',
34 title: 'คุณสมบัติของไฟล์ Flash',
35 vSpace: 'ระยะแนวตั้ง',
36 validateHSpace: 'HSpace ต้องเป็นจำนวนตัวเลข',
37 validateSrc: 'กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)',
38 validateVSpace: 'VSpace ต้องเป็นจำนวนตัวเลข',
39 windowMode: 'โหมดหน้าต่าง',
40 windowModeOpaque: 'ความทึบแสง',
41 windowModeTransparent: 'ความโปรงแสง',
42 windowModeWindow: 'หน้าต่าง'
43} );
diff --git a/sources/plugins/flash/lang/tr.js b/sources/plugins/flash/lang/tr.js
new file mode 100644
index 00000000..18784380
--- /dev/null
+++ b/sources/plugins/flash/lang/tr.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'tr', {
6 access: 'Kod İzni',
7 accessAlways: 'Herzaman',
8 accessNever: 'Asla',
9 accessSameDomain: 'Aynı domain',
10 alignAbsBottom: 'Tam Altı',
11 alignAbsMiddle: 'Tam Ortası',
12 alignBaseline: 'Taban Çizgisi',
13 alignTextTop: 'Yazı Tepeye',
14 bgcolor: 'Arka Renk',
15 chkFull: 'Tam ekrana İzinver',
16 chkLoop: 'Döngü',
17 chkMenu: 'Flash Menüsünü Kullan',
18 chkPlay: 'Otomatik Oynat',
19 flashvars: 'Flash Değerleri',
20 hSpace: 'Yatay Boşluk',
21 properties: 'Flash Özellikleri',
22 propertiesTab: 'Özellikler',
23 quality: 'Kalite',
24 qualityAutoHigh: 'Otomatik Yükseklik',
25 qualityAutoLow: 'Otomatik Düşüklük',
26 qualityBest: 'En iyi',
27 qualityHigh: 'Yüksek',
28 qualityLow: 'Düşük',
29 qualityMedium: 'Orta',
30 scale: 'Boyutlandır',
31 scaleAll: 'Hepsini Göster',
32 scaleFit: 'Tam Sığdır',
33 scaleNoBorder: 'Kenar Yok',
34 title: 'Flash Özellikleri',
35 vSpace: 'Dikey Boşluk',
36 validateHSpace: 'HSpace sayı olmalıdır.',
37 validateSrc: 'Lütfen köprü URL\'sini yazın',
38 validateVSpace: 'VSpace sayı olmalıdır.',
39 windowMode: 'Pencere modu',
40 windowModeOpaque: 'Opak',
41 windowModeTransparent: 'Şeffaf',
42 windowModeWindow: 'Pencere'
43} );
diff --git a/sources/plugins/flash/lang/tt.js b/sources/plugins/flash/lang/tt.js
new file mode 100644
index 00000000..dbea9350
--- /dev/null
+++ b/sources/plugins/flash/lang/tt.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'tt', {
6 access: 'Script Access', // MISSING
7 accessAlways: 'Һəрвакыт',
8 accessNever: 'Беркайчан да',
9 accessSameDomain: 'Same domain', // MISSING
10 alignAbsBottom: 'Иң аска',
11 alignAbsMiddle: 'Төгәл уртада',
12 alignBaseline: 'Таяныч сызыгы',
13 alignTextTop: 'Текст өсте',
14 bgcolor: 'Фон төсе',
15 chkFull: 'Allow Fullscreen', // MISSING
16 chkLoop: 'Әйләнеш',
17 chkMenu: 'Enable Flash Menu', // MISSING
18 chkPlay: 'Auto Play', // MISSING
19 flashvars: 'Variables for Flash', // MISSING
20 hSpace: 'Горизонталь ара',
21 properties: 'Флеш үзлекләре',
22 propertiesTab: 'Үзлекләр',
23 quality: 'Сыйфат',
24 qualityAutoHigh: 'Авто югары сыйфат',
25 qualityAutoLow: 'Авто түбән сыйфат',
26 qualityBest: 'Иң югары сыйфат',
27 qualityHigh: 'Югары',
28 qualityLow: 'Түбəн',
29 qualityMedium: 'Уртача',
30 scale: 'Зурлык',
31 scaleAll: 'Барысын күрсәтү',
32 scaleFit: 'Exact Fit', // MISSING
33 scaleNoBorder: 'Чиксез',
34 title: 'Флеш үзлекләре',
35 vSpace: 'Вертикаль ара',
36 validateHSpace: 'Горизонталь ара сан булырга тиеш.',
37 validateSrc: 'URL буш булмаска тиеш.',
38 validateVSpace: 'Вертикаль ара сан булырга тиеш.',
39 windowMode: 'Тəрəзə тәртибе',
40 windowModeOpaque: 'Үтә күренмәле',
41 windowModeTransparent: 'Үтə күренмəле',
42 windowModeWindow: 'Тəрəзə'
43} );
diff --git a/sources/plugins/flash/lang/ug.js b/sources/plugins/flash/lang/ug.js
new file mode 100644
index 00000000..90a98e03
--- /dev/null
+++ b/sources/plugins/flash/lang/ug.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'ug', {
6 access: 'قوليازما زىيارەتكە يول قوي',
7 accessAlways: 'ھەمىشە',
8 accessNever: 'ھەرگىز',
9 accessSameDomain: 'ئوخشاش دائىرىدە',
10 alignAbsBottom: 'مۇتلەق ئاستى',
11 alignAbsMiddle: 'مۇتلەق ئوتتۇرا',
12 alignBaseline: 'ئاساسىي سىزىق',
13 alignTextTop: 'تېكىست ئۈستىدە',
14 bgcolor: 'تەگلىك رەڭگى',
15 chkFull: 'پۈتۈن ئېكراننى قوزغات',
16 chkLoop: 'دەۋرىي',
17 chkMenu: 'Flash تىزىملىكنى قوزغات',
18 chkPlay: 'ئۆزلۈكىدىن چال',
19 flashvars: 'Flash ئۆزگەرگۈچى',
20 hSpace: 'توغرىسىغا ئارىلىق',
21 properties: 'Flash خاسلىق',
22 propertiesTab: 'خاسلىق',
23 quality: 'سۈپەت',
24 qualityAutoHigh: 'يۇقىرى (ئاپتوماتىك)',
25 qualityAutoLow: 'تۆۋەن (ئاپتوماتىك)',
26 qualityBest: 'ئەڭ ياخشى',
27 qualityHigh: 'يۇقىرى',
28 qualityLow: 'تۆۋەن',
29 qualityMedium: 'ئوتتۇرا (ئاپتوماتىك)',
30 scale: 'نىسبىتى',
31 scaleAll: 'ھەممىنى كۆرسەت',
32 scaleFit: 'قەتئىي ماسلىشىش',
33 scaleNoBorder: 'گىرۋەك يوق',
34 title: 'ماۋزۇ',
35 vSpace: 'بويىغا ئارىلىق',
36 validateHSpace: 'توغرىسىغا ئارىلىق چوقۇم سان بولىدۇ',
37 validateSrc: 'ئەسلى ھۆججەت ئادرېسىنى كىرگۈزۈڭ',
38 validateVSpace: 'بويىغا ئارىلىق چوقۇم سان بولىدۇ',
39 windowMode: 'كۆزنەك ھالىتى',
40 windowModeOpaque: 'خىرە',
41 windowModeTransparent: 'سۈزۈك',
42 windowModeWindow: 'كۆزنەك گەۋدىسى'
43} );
diff --git a/sources/plugins/flash/lang/uk.js b/sources/plugins/flash/lang/uk.js
new file mode 100644
index 00000000..48e9ba8c
--- /dev/null
+++ b/sources/plugins/flash/lang/uk.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'uk', {
6 access: 'Доступ до скрипта',
7 accessAlways: 'Завжди',
8 accessNever: 'Ніколи',
9 accessSameDomain: 'З того ж домена',
10 alignAbsBottom: 'По нижньому краю (abs)',
11 alignAbsMiddle: 'По середині (abs)',
12 alignBaseline: 'По базовій лінії',
13 alignTextTop: 'Текст по верхньому краю',
14 bgcolor: 'Колір фону',
15 chkFull: 'Дозволити повноекранний перегляд',
16 chkLoop: 'Циклічно',
17 chkMenu: 'Дозволити меню Flash',
18 chkPlay: 'Автопрогравання',
19 flashvars: 'Змінні Flash',
20 hSpace: 'Гориз. відступ',
21 properties: 'Властивості Flash',
22 propertiesTab: 'Властивості',
23 quality: 'Якість',
24 qualityAutoHigh: 'Автом. відмінна',
25 qualityAutoLow: 'Автом. низька',
26 qualityBest: 'Відмінна',
27 qualityHigh: 'Висока',
28 qualityLow: 'Низька',
29 qualityMedium: 'Середня',
30 scale: 'Масштаб',
31 scaleAll: 'Показати все',
32 scaleFit: 'Поч. розмір',
33 scaleNoBorder: 'Без рамки',
34 title: 'Властивості Flash',
35 vSpace: 'Верт. відступ',
36 validateHSpace: 'Гориз. відступ повинен бути цілим числом.',
37 validateSrc: 'URL посилання не може бути порожнім.',
38 validateVSpace: 'Верт. відступ повинен бути цілим числом.',
39 windowMode: 'Віконний режим',
40 windowModeOpaque: 'Непрозорість',
41 windowModeTransparent: 'Прозорість',
42 windowModeWindow: 'Вікно'
43} );
diff --git a/sources/plugins/flash/lang/vi.js b/sources/plugins/flash/lang/vi.js
new file mode 100644
index 00000000..77e850e5
--- /dev/null
+++ b/sources/plugins/flash/lang/vi.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'vi', {
6 access: 'Truy cập mã',
7 accessAlways: 'Luôn luôn',
8 accessNever: 'Không bao giờ',
9 accessSameDomain: 'Cùng tên miền',
10 alignAbsBottom: 'Dưới tuyệt đối',
11 alignAbsMiddle: 'Giữa tuyệt đối',
12 alignBaseline: 'Đường cơ sở',
13 alignTextTop: 'Phía trên chữ',
14 bgcolor: 'Màu nền',
15 chkFull: 'Cho phép toàn màn hình',
16 chkLoop: 'Lặp',
17 chkMenu: 'Cho phép bật menu của Flash',
18 chkPlay: 'Tự động chạy',
19 flashvars: 'Các biến số dành cho Flash',
20 hSpace: 'Khoảng đệm ngang',
21 properties: 'Thuộc tính Flash',
22 propertiesTab: 'Thuộc tính',
23 quality: 'Chất lượng',
24 qualityAutoHigh: 'Cao tự động',
25 qualityAutoLow: 'Thấp tự động',
26 qualityBest: 'Tốt nhất',
27 qualityHigh: 'Cao',
28 qualityLow: 'Thấp',
29 qualityMedium: 'Trung bình',
30 scale: 'Tỷ lệ',
31 scaleAll: 'Hiển thị tất cả',
32 scaleFit: 'Vừa vặn',
33 scaleNoBorder: 'Không đường viền',
34 title: 'Thuộc tính Flash',
35 vSpace: 'Khoảng đệm dọc',
36 validateHSpace: 'Khoảng đệm ngang phải là số nguyên.',
37 validateSrc: 'Hãy đưa vào đường dẫn liên kết',
38 validateVSpace: 'Khoảng đệm dọc phải là số nguyên.',
39 windowMode: 'Chế độ cửa sổ',
40 windowModeOpaque: 'Mờ đục',
41 windowModeTransparent: 'Trong suốt',
42 windowModeWindow: 'Cửa sổ'
43} );
diff --git a/sources/plugins/flash/lang/zh-cn.js b/sources/plugins/flash/lang/zh-cn.js
new file mode 100644
index 00000000..85c0c17f
--- /dev/null
+++ b/sources/plugins/flash/lang/zh-cn.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'zh-cn', {
6 access: '允许脚本访问',
7 accessAlways: '总是',
8 accessNever: '从不',
9 accessSameDomain: '同域',
10 alignAbsBottom: '绝对底部',
11 alignAbsMiddle: '绝对居中',
12 alignBaseline: '基线',
13 alignTextTop: '文本上方',
14 bgcolor: '背景颜色',
15 chkFull: '启用全屏',
16 chkLoop: '循环',
17 chkMenu: '启用 Flash 菜单',
18 chkPlay: '自动播放',
19 flashvars: 'Flash 变量',
20 hSpace: '水平间距',
21 properties: 'Flash 属性',
22 propertiesTab: '属性',
23 quality: '质量',
24 qualityAutoHigh: '高(自动)',
25 qualityAutoLow: '低(自动)',
26 qualityBest: '最好',
27 qualityHigh: '高',
28 qualityLow: '低',
29 qualityMedium: '中(自动)',
30 scale: '缩放',
31 scaleAll: '全部显示',
32 scaleFit: '严格匹配',
33 scaleNoBorder: '无边框',
34 title: '标题',
35 vSpace: '垂直间距',
36 validateHSpace: '水平间距必须为数字格式',
37 validateSrc: '请输入源文件地址',
38 validateVSpace: '垂直间距必须为数字格式',
39 windowMode: '窗体模式',
40 windowModeOpaque: '不透明',
41 windowModeTransparent: '透明',
42 windowModeWindow: '窗体'
43} );
diff --git a/sources/plugins/flash/lang/zh.js b/sources/plugins/flash/lang/zh.js
new file mode 100644
index 00000000..d8660124
--- /dev/null
+++ b/sources/plugins/flash/lang/zh.js
@@ -0,0 +1,43 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'flash', 'zh', {
6 access: '腳本存取',
7 accessAlways: '永遠',
8 accessNever: '從不',
9 accessSameDomain: '相同網域',
10 alignAbsBottom: '絕對下方',
11 alignAbsMiddle: '絕對置中',
12 alignBaseline: '基準線',
13 alignTextTop: '上層文字',
14 bgcolor: '背景顏色',
15 chkFull: '允許全螢幕',
16 chkLoop: '重複播放',
17 chkMenu: '啟用 Flash 選單',
18 chkPlay: '自動播放',
19 flashvars: 'Flash 變數',
20 hSpace: 'HSpace',
21 properties: 'Flash 屬性​​',
22 propertiesTab: '屬性',
23 quality: '品質',
24 qualityAutoHigh: '自動高',
25 qualityAutoLow: '自動低',
26 qualityBest: '最佳',
27 qualityHigh: '高',
28 qualityLow: '低',
29 qualityMedium: '中',
30 scale: '縮放比例',
31 scaleAll: '全部顯示',
32 scaleFit: '最適化',
33 scaleNoBorder: '無框線',
34 title: 'Flash 屬性​​',
35 vSpace: 'VSpace',
36 validateHSpace: 'HSpace 必須為數字。',
37 validateSrc: 'URL 不可為空白。',
38 validateVSpace: 'VSpace 必須為數字。',
39 windowMode: '視窗模式',
40 windowModeOpaque: '不透明',
41 windowModeTransparent: '透明',
42 windowModeWindow: '視窗'
43} );
diff --git a/sources/plugins/flash/plugin.js b/sources/plugins/flash/plugin.js
new file mode 100644
index 00000000..53e37ffd
--- /dev/null
+++ b/sources/plugins/flash/plugin.js
@@ -0,0 +1,151 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var flashFilenameRegex = /\.swf(?:$|\?)/i;
8
9 function isFlashEmbed( element ) {
10 var attributes = element.attributes;
11
12 return ( attributes.type == 'application/x-shockwave-flash' || flashFilenameRegex.test( attributes.src || '' ) );
13 }
14
15 function createFakeElement( editor, realElement ) {
16 return editor.createFakeParserElement( realElement, 'cke_flash', 'flash', true );
17 }
18
19 CKEDITOR.plugins.add( 'flash', {
20 requires: 'dialog,fakeobjects',
21 // jscs:disable maximumLineLength
22 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
23 // jscs:enable maximumLineLength
24 icons: 'flash', // %REMOVE_LINE_CORE%
25 hidpi: true, // %REMOVE_LINE_CORE%
26 onLoad: function() {
27 CKEDITOR.addCss( 'img.cke_flash' +
28 '{' +
29 'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.png' ) + ');' +
30 'background-position: center center;' +
31 'background-repeat: no-repeat;' +
32 'border: 1px solid #a9a9a9;' +
33 'width: 80px;' +
34 'height: 80px;' +
35 '}'
36 );
37
38 },
39 init: function( editor ) {
40 var allowed = 'object[classid,codebase,height,hspace,vspace,width];' +
41 'param[name,value];' +
42 'embed[height,hspace,pluginspage,src,type,vspace,width]';
43
44 if ( CKEDITOR.dialog.isTabEnabled( editor, 'flash', 'properties' ) )
45 allowed += ';object[align]; embed[allowscriptaccess,quality,scale,wmode]';
46 if ( CKEDITOR.dialog.isTabEnabled( editor, 'flash', 'advanced' ) )
47 allowed += ';object[id]{*}; embed[bgcolor]{*}(*)';
48
49 editor.addCommand( 'flash', new CKEDITOR.dialogCommand( 'flash', {
50 allowedContent: allowed,
51 requiredContent: 'embed'
52 } ) );
53 editor.ui.addButton && editor.ui.addButton( 'Flash', {
54 label: editor.lang.common.flash,
55 command: 'flash',
56 toolbar: 'insert,20'
57 } );
58 CKEDITOR.dialog.add( 'flash', this.path + 'dialogs/flash.js' );
59
60 // If the "menu" plugin is loaded, register the menu items.
61 if ( editor.addMenuItems ) {
62 editor.addMenuItems( {
63 flash: {
64 label: editor.lang.flash.properties,
65 command: 'flash',
66 group: 'flash'
67 }
68 } );
69 }
70
71 editor.on( 'doubleclick', function( evt ) {
72 var element = evt.data.element;
73
74 if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'flash' )
75 evt.data.dialog = 'flash';
76 } );
77
78 // If the "contextmenu" plugin is loaded, register the listeners.
79 if ( editor.contextMenu ) {
80 editor.contextMenu.addListener( function( element ) {
81 if ( element && element.is( 'img' ) && !element.isReadOnly() && element.data( 'cke-real-element-type' ) == 'flash' )
82 return { flash: CKEDITOR.TRISTATE_OFF };
83 } );
84 }
85 },
86
87 afterInit: function( editor ) {
88 var dataProcessor = editor.dataProcessor,
89 dataFilter = dataProcessor && dataProcessor.dataFilter;
90
91 if ( dataFilter ) {
92 dataFilter.addRules( {
93 elements: {
94 'cke:object': function( element ) {
95 var attributes = element.attributes,
96 classId = attributes.classid && String( attributes.classid ).toLowerCase();
97
98 if ( !classId && !isFlashEmbed( element ) ) {
99 // Look for the inner <embed>
100 for ( var i = 0; i < element.children.length; i++ ) {
101 if ( element.children[ i ].name == 'cke:embed' ) {
102 if ( !isFlashEmbed( element.children[ i ] ) )
103 return null;
104
105 return createFakeElement( editor, element );
106 }
107 }
108 return null;
109 }
110
111 return createFakeElement( editor, element );
112 },
113
114 'cke:embed': function( element ) {
115 if ( !isFlashEmbed( element ) )
116 return null;
117
118 return createFakeElement( editor, element );
119 }
120 }
121 }, 5 );
122 }
123 }
124 } );
125} )();
126
127CKEDITOR.tools.extend( CKEDITOR.config, {
128 /**
129 * Save as `<embed>` tag only. This tag is unrecommended.
130 *
131 * @cfg {Boolean} [flashEmbedTagOnly=false]
132 * @member CKEDITOR.config
133 */
134 flashEmbedTagOnly: false,
135
136 /**
137 * Add `<embed>` tag as alternative: `<object><embed></embed></object>`.
138 *
139 * @cfg {Boolean} [flashAddEmbedTag=false]
140 * @member CKEDITOR.config
141 */
142 flashAddEmbedTag: true,
143
144 /**
145 * Use {@link #flashEmbedTagOnly} and {@link #flashAddEmbedTag} values on edit.
146 *
147 * @cfg {Boolean} [flashConvertOnEdit=false]
148 * @member CKEDITOR.config
149 */
150 flashConvertOnEdit: false
151} );
diff --git a/sources/plugins/floatingspace/plugin.js b/sources/plugins/floatingspace/plugin.js
new file mode 100644
index 00000000..72ea28d9
--- /dev/null
+++ b/sources/plugins/floatingspace/plugin.js
@@ -0,0 +1,406 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var win = CKEDITOR.document.getWindow(),
8 pixelate = CKEDITOR.tools.cssLength;
9
10 CKEDITOR.plugins.add( 'floatingspace', {
11 init: function( editor ) {
12 // Add listener with lower priority than that in themedui creator.
13 // Thereby floatingspace will be created only if themedui wasn't used.
14 editor.on( 'loaded', function() {
15 attach( this );
16 }, null, null, 20 );
17 }
18 } );
19
20 function scrollOffset( side ) {
21 var pageOffset = side == 'left' ? 'pageXOffset' : 'pageYOffset',
22 docScrollOffset = side == 'left' ? 'scrollLeft' : 'scrollTop';
23
24 return ( pageOffset in win.$ ) ? win.$[ pageOffset ] : CKEDITOR.document.$.documentElement[ docScrollOffset ];
25 }
26
27 function attach( editor ) {
28 var config = editor.config,
29
30 // Get the HTML for the predefined spaces.
31 topHtml = editor.fire( 'uiSpace', { space: 'top', html: '' } ).html,
32
33 // Re-positioning of the space.
34 layout = ( function() {
35 // Mode indicates the vertical aligning mode.
36 var mode, editable,
37 spaceRect, editorRect, viewRect, spaceHeight, pageScrollX,
38
39 // Allow minor adjustments of the float space from custom configs.
40 dockedOffsetX = config.floatSpaceDockedOffsetX || 0,
41 dockedOffsetY = config.floatSpaceDockedOffsetY || 0,
42 pinnedOffsetX = config.floatSpacePinnedOffsetX || 0,
43 pinnedOffsetY = config.floatSpacePinnedOffsetY || 0;
44
45 // Update the float space position.
46 function updatePos( pos, prop, val ) {
47 floatSpace.setStyle( prop, pixelate( val ) );
48 floatSpace.setStyle( 'position', pos );
49 }
50
51 // Change the current mode and update float space position accordingly.
52 function changeMode( newMode ) {
53 var editorPos = editable.getDocumentPosition();
54
55 switch ( newMode ) {
56 case 'top':
57 updatePos( 'absolute', 'top', editorPos.y - spaceHeight - dockedOffsetY );
58 break;
59 case 'pin':
60 updatePos( 'fixed', 'top', pinnedOffsetY );
61 break;
62 case 'bottom':
63 updatePos( 'absolute', 'top', editorPos.y + ( editorRect.height || editorRect.bottom - editorRect.top ) + dockedOffsetY );
64 break;
65 }
66
67 mode = newMode;
68 }
69
70 return function( evt ) {
71 // #10112 Do not fail on editable-less editor.
72 if ( !( editable = editor.editable() ) )
73 return;
74
75 var show = ( evt && evt.name == 'focus' );
76
77 // Show up the space on focus gain.
78 if ( show ) {
79 floatSpace.show();
80 }
81
82 editor.fire( 'floatingSpaceLayout', { show: show } );
83
84 // Reset the horizontal position for below measurement.
85 floatSpace.removeStyle( 'left' );
86 floatSpace.removeStyle( 'right' );
87
88 // Compute the screen position from the TextRectangle object would
89 // be very simple, even though the "width"/"height" property is not
90 // available for all, it's safe to figure that out from the rest.
91
92 // http://help.dottoro.com/ljgupwlp.php
93 spaceRect = floatSpace.getClientRect();
94 editorRect = editable.getClientRect();
95 viewRect = win.getViewPaneSize();
96 spaceHeight = spaceRect.height;
97 pageScrollX = scrollOffset( 'left' );
98
99 // We initialize it as pin mode.
100 if ( !mode ) {
101 mode = 'pin';
102 changeMode( 'pin' );
103 // Call for a refresh to the actual layout.
104 layout( evt );
105 return;
106 }
107
108 // +------------------------ Viewport -+ \
109 // | | |-> floatSpaceDockedOffsetY
110 // | ................................. | /
111 // | |
112 // | +------ Space -+ |
113 // | | | |
114 // | +--------------+ |
115 // | +------------------ Editor -+ |
116 // | | | |
117 //
118 if ( spaceHeight + dockedOffsetY <= editorRect.top )
119 changeMode( 'top' );
120
121 // +- - - - - - - - - Editor -+
122 // | |
123 // +------------------------ Viewport -+ \
124 // | | | | |-> floatSpacePinnedOffsetY
125 // | ................................. | /
126 // | +------ Space -+ | |
127 // | | | | |
128 // | +--------------+ | |
129 // | | | |
130 // | +---------------------------+ |
131 // +-----------------------------------+
132 //
133 else if ( spaceHeight + dockedOffsetY > viewRect.height - editorRect.bottom )
134 changeMode( 'pin' );
135
136 // +- - - - - - - - - Editor -+
137 // | |
138 // +------------------------ Viewport -+ \
139 // | | | | |-> floatSpacePinnedOffsetY
140 // | ................................. | /
141 // | | | |
142 // | | | |
143 // | +---------------------------+ |
144 // | +------ Space -+ |
145 // | | | |
146 // | +--------------+ |
147 //
148 else
149 changeMode( 'bottom' );
150
151 var mid = viewRect.width / 2,
152 alignSide, offset;
153
154 if ( config.floatSpacePreferRight ) {
155 alignSide = 'right';
156 } else if ( editorRect.left > 0 && editorRect.right < viewRect.width && editorRect.width > spaceRect.width ) {
157 alignSide = config.contentsLangDirection == 'rtl' ? 'right' : 'left';
158 } else {
159 alignSide = mid - editorRect.left > editorRect.right - mid ? 'left' : 'right';
160 }
161
162 // (#9769) If viewport width is less than space width,
163 // make sure space never cross the left boundary of the viewport.
164 // In other words: top-left corner of the space is always visible.
165 if ( spaceRect.width > viewRect.width ) {
166 alignSide = 'left';
167 offset = 0;
168 }
169 else {
170 if ( alignSide == 'left' ) {
171 // If the space rect fits into viewport, align it
172 // to the left edge of editor:
173 //
174 // +------------------------ Viewport -+
175 // | |
176 // | +------------- Space -+ |
177 // | | | |
178 // | +---------------------+ |
179 // | +------------------ Editor -+ |
180 // | | | |
181 //
182 if ( editorRect.left > 0 )
183 offset = editorRect.left;
184
185 // If the left part of the editor is cut off by the left
186 // edge of the viewport, stick the space to the viewport:
187 //
188 // +------------------------ Viewport -+
189 // | |
190 // +---------------- Space -+ |
191 // | | |
192 // +------------------------+ |
193 // +----|------------- Editor -+ |
194 // | | | |
195 //
196 else
197 offset = 0;
198 }
199 else {
200 // If the space rect fits into viewport, align it
201 // to the right edge of editor:
202 //
203 // +------------------------ Viewport -+
204 // | |
205 // | +------------- Space -+ |
206 // | | | |
207 // | +---------------------+ |
208 // | +------------------ Editor -+ |
209 // | | | |
210 //
211 if ( editorRect.right < viewRect.width )
212 offset = viewRect.width - editorRect.right;
213
214 // If the right part of the editor is cut off by the right
215 // edge of the viewport, stick the space to the viewport:
216 //
217 // +------------------------ Viewport -+
218 // | |
219 // | +------------- Space -+
220 // | | |
221 // | +---------------------+
222 // | +-----------------|- Editor -+
223 // | | | |
224 //
225 else
226 offset = 0;
227 }
228
229 // (#9769) Finally, stick the space to the opposite side of
230 // the viewport when it's cut off horizontally on the left/right
231 // side like below.
232 //
233 // This trick reveals cut off space in some edge cases and
234 // hence it improves accessibility.
235 //
236 // +------------------------ Viewport -+
237 // | |
238 // | +--------------------|-- Space -+
239 // | | | |
240 // | +--------------------|----------+
241 // | +------- Editor -+ |
242 // | | | |
243 //
244 // becomes:
245 //
246 // +------------------------ Viewport -+
247 // | |
248 // | +----------------------- Space -+
249 // | | |
250 // | +-------------------------------+
251 // | +------- Editor -+ |
252 // | | | |
253 //
254 if ( offset + spaceRect.width > viewRect.width ) {
255 alignSide = alignSide == 'left' ? 'right' : 'left';
256 offset = 0;
257 }
258 }
259
260 // Pin mode is fixed, so don't include scroll-x.
261 // (#9903) For mode is "top" or "bottom", add opposite scroll-x for right-aligned space.
262 var scroll = mode == 'pin' ? 0 : alignSide == 'left' ? pageScrollX : -pageScrollX;
263
264 floatSpace.setStyle( alignSide, pixelate( ( mode == 'pin' ? pinnedOffsetX : dockedOffsetX ) + offset + scroll ) );
265 };
266 } )();
267
268 if ( topHtml ) {
269 var floatSpaceTpl = new CKEDITOR.template(
270 '<div' +
271 ' id="cke_{name}"' +
272 ' class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} ' + CKEDITOR.env.cssClass + '"' +
273 ' dir="{langDir}"' +
274 ' title="' + ( CKEDITOR.env.gecko ? ' ' : '' ) + '"' +
275 ' lang="{langCode}"' +
276 ' role="application"' +
277 ' style="{style}"' +
278 ( editor.title ? ' aria-labelledby="cke_{name}_arialbl"' : ' ' ) +
279 '>' +
280 ( editor.title ? '<span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span>' : ' ' ) +
281 '<div class="cke_inner">' +
282 '<div id="{topId}" class="cke_top" role="presentation">{content}</div>' +
283 '</div>' +
284 '</div>' ),
285 floatSpace = CKEDITOR.document.getBody().append( CKEDITOR.dom.element.createFromHtml( floatSpaceTpl.output( {
286 content: topHtml,
287 id: editor.id,
288 langDir: editor.lang.dir,
289 langCode: editor.langCode,
290 name: editor.name,
291 style: 'display:none;z-index:' + ( config.baseFloatZIndex - 1 ),
292 topId: editor.ui.spaceId( 'top' ),
293 voiceLabel: editor.title
294 } ) ) ),
295
296 // Use event buffers to reduce CPU load when tons of events are fired.
297 changeBuffer = CKEDITOR.tools.eventsBuffer( 500, layout ),
298 uiBuffer = CKEDITOR.tools.eventsBuffer( 100, layout );
299
300 // There's no need for the floatSpace to be selectable.
301 floatSpace.unselectable();
302
303 // Prevent clicking on non-buttons area of the space from blurring editor.
304 floatSpace.on( 'mousedown', function( evt ) {
305 evt = evt.data;
306 if ( !evt.getTarget().hasAscendant( 'a', 1 ) )
307 evt.preventDefault();
308 } );
309
310 editor.on( 'focus', function( evt ) {
311 layout( evt );
312 editor.on( 'change', changeBuffer.input );
313 win.on( 'scroll', uiBuffer.input );
314 win.on( 'resize', uiBuffer.input );
315 } );
316
317 editor.on( 'blur', function() {
318 floatSpace.hide();
319 editor.removeListener( 'change', changeBuffer.input );
320 win.removeListener( 'scroll', uiBuffer.input );
321 win.removeListener( 'resize', uiBuffer.input );
322 } );
323
324 editor.on( 'destroy', function() {
325 win.removeListener( 'scroll', uiBuffer.input );
326 win.removeListener( 'resize', uiBuffer.input );
327 floatSpace.clearCustomData();
328 floatSpace.remove();
329 } );
330
331 // Handle initial focus.
332 if ( editor.focusManager.hasFocus )
333 floatSpace.show();
334
335 // Register this UI space to the focus manager.
336 editor.focusManager.add( floatSpace, 1 );
337 }
338 }
339} )();
340
341/**
342 * Along with {@link #floatSpaceDockedOffsetY} it defines the
343 * amount of offset (in pixels) between the float space and the editable left/right
344 * boundaries when the space element is docked on either side of the editable.
345 *
346 * config.floatSpaceDockedOffsetX = 10;
347 *
348 * @cfg {Number} [floatSpaceDockedOffsetX=0]
349 * @member CKEDITOR.config
350 */
351
352/**
353 * Along with {@link #floatSpaceDockedOffsetX} it defines the
354 * amount of offset (in pixels) between the float space and the editable top/bottom
355 * boundaries when the space element is docked on either side of the editable.
356 *
357 * config.floatSpaceDockedOffsetY = 10;
358 *
359 * @cfg {Number} [floatSpaceDockedOffsetY=0]
360 * @member CKEDITOR.config
361 */
362
363/**
364 * Along with {@link #floatSpacePinnedOffsetY} it defines the
365 * amount of offset (in pixels) between the float space and the viewport boundaries
366 * when the space element is pinned.
367 *
368 * config.floatSpacePinnedOffsetX = 20;
369 *
370 * @cfg {Number} [floatSpacePinnedOffsetX=0]
371 * @member CKEDITOR.config
372 */
373
374/**
375 * Along with {@link #floatSpacePinnedOffsetX} it defines the
376 * amount of offset (in pixels) between the float space and the viewport boundaries
377 * when the space element is pinned.
378 *
379 * config.floatSpacePinnedOffsetY = 20;
380 *
381 * @cfg {Number} [floatSpacePinnedOffsetY=0]
382 * @member CKEDITOR.config
383 */
384
385/**
386 * Indicates that the float space should be aligned to the right side
387 * of the editable area rather than to the left (if possible).
388 *
389 * config.floatSpacePreferRight = true;
390 *
391 * @since 4.5
392 * @cfg {Boolean} [floatSpacePreferRight=false]
393 * @member CKEDITOR.config
394 */
395
396/**
397 * Fired when the viewport or editor parameters change and the floating space needs to check and
398 * eventually update its position and dimensions.
399 *
400 * @since 4.5
401 * @event floatingSpaceLayout
402 * @member CKEDITOR.editor
403 * @param {CKEDITOR.editor} editor The editor instance.
404 * @param data
405 * @param {Boolean} data.show True if the float space should show up as a result of this event.
406 */
diff --git a/sources/plugins/floatpanel/plugin.js b/sources/plugins/floatpanel/plugin.js
new file mode 100644
index 00000000..98ed6fd1
--- /dev/null
+++ b/sources/plugins/floatpanel/plugin.js
@@ -0,0 +1,598 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'floatpanel', {
7 requires: 'panel'
8} );
9
10( function() {
11 var panels = {};
12
13 function getPanel( editor, doc, parentElement, definition, level ) {
14 // Generates the panel key: docId-eleId-skinName-langDir[-uiColor][-CSSs][-level]
15 var key = CKEDITOR.tools.genKey( doc.getUniqueId(), parentElement.getUniqueId(), editor.lang.dir, editor.uiColor || '', definition.css || '', level || '' ),
16 panel = panels[ key ];
17
18 if ( !panel ) {
19 panel = panels[ key ] = new CKEDITOR.ui.panel( doc, definition );
20 panel.element = parentElement.append( CKEDITOR.dom.element.createFromHtml( panel.render( editor ), doc ) );
21
22 panel.element.setStyles( {
23 display: 'none',
24 position: 'absolute'
25 } );
26 }
27
28 return panel;
29 }
30
31 /**
32 * Represents a floating panel UI element.
33 *
34 * It is reused by rich combos, color combos, menus, etc.
35 * and it renders its content using {@link CKEDITOR.ui.panel}.
36 *
37 * @class
38 * @todo
39 */
40 CKEDITOR.ui.floatPanel = CKEDITOR.tools.createClass( {
41 /**
42 * Creates a floatPanel class instance.
43 *
44 * @constructor
45 * @param {CKEDITOR.editor} editor
46 * @param {CKEDITOR.dom.element} parentElement
47 * @param {Object} definition Definition of the panel that will be floating.
48 * @param {Number} level
49 */
50 $: function( editor, parentElement, definition, level ) {
51 definition.forceIFrame = 1;
52
53 // In case of editor with floating toolbar append panels that should float
54 // to the main UI element.
55 if ( definition.toolbarRelated && editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
56 parentElement = CKEDITOR.document.getById( 'cke_' + editor.name );
57
58 var doc = parentElement.getDocument(),
59 panel = getPanel( editor, doc, parentElement, definition, level || 0 ),
60 element = panel.element,
61 iframe = element.getFirst(),
62 that = this;
63
64 // Disable native browser menu. (#4825)
65 element.disableContextMenu();
66
67 this.element = element;
68
69 this._ = {
70 editor: editor,
71 // The panel that will be floating.
72 panel: panel,
73 parentElement: parentElement,
74 definition: definition,
75 document: doc,
76 iframe: iframe,
77 children: [],
78 dir: editor.lang.dir,
79 showBlockParams: null
80 };
81
82 editor.on( 'mode', hide );
83 editor.on( 'resize', hide );
84
85 // When resize of the window is triggered floatpanel should be repositioned according to new dimensions.
86 // #11724. Fixes issue with undesired panel hiding on Android and iOS.
87 doc.getWindow().on( 'resize', function() {
88 this.reposition();
89 }, this );
90
91 // We need a wrapper because events implementation doesn't allow to attach
92 // one listener more than once for the same event on the same object.
93 // Remember that floatPanel#hide is shared between all instances.
94 function hide() {
95 that.hide();
96 }
97 },
98
99 proto: {
100 /**
101 * @todo
102 */
103 addBlock: function( name, block ) {
104 return this._.panel.addBlock( name, block );
105 },
106
107 /**
108 * @todo
109 */
110 addListBlock: function( name, multiSelect ) {
111 return this._.panel.addListBlock( name, multiSelect );
112 },
113
114 /**
115 * @todo
116 */
117 getBlock: function( name ) {
118 return this._.panel.getBlock( name );
119 },
120
121 /**
122 * Shows the panel block.
123 *
124 * @param {String} name
125 * @param {CKEDITOR.dom.element} offsetParent Positioned parent.
126 * @param {Number} corner
127 *
128 * * For LTR (left to right) oriented editor:
129 * * `1` = top-left
130 * * `2` = top-right
131 * * `3` = bottom-right
132 * * `4` = bottom-left
133 * * For RTL (right to left):
134 * * `1` = top-right
135 * * `2` = top-left
136 * * `3` = bottom-left
137 * * `4` = bottom-right
138 *
139 * @param {Number} [offsetX=0]
140 * @param {Number} [offsetY=0]
141 * @param {Function} [callback] A callback function executed when block positioning is done.
142 * @todo what do exactly these params mean (especially corner)?
143 */
144 showBlock: function( name, offsetParent, corner, offsetX, offsetY, callback ) {
145 var panel = this._.panel,
146 block = panel.showBlock( name );
147
148 this._.showBlockParams = [].slice.call( arguments );
149 this.allowBlur( false );
150
151 // Record from where the focus is when open panel.
152 var editable = this._.editor.editable();
153 this._.returnFocus = editable.hasFocus ? editable : new CKEDITOR.dom.element( CKEDITOR.document.$.activeElement );
154 this._.hideTimeout = 0;
155
156 var element = this.element,
157 iframe = this._.iframe,
158 // Edge prefers iframe's window to the iframe, just like the rest of the browsers (#13143).
159 focused = CKEDITOR.env.ie && !CKEDITOR.env.edge ? iframe : new CKEDITOR.dom.window( iframe.$.contentWindow ),
160 doc = element.getDocument(),
161 positionedAncestor = this._.parentElement.getPositionedAncestor(),
162 position = offsetParent.getDocumentPosition( doc ),
163 positionedAncestorPosition = positionedAncestor ? positionedAncestor.getDocumentPosition( doc ) : { x: 0, y: 0 },
164 rtl = this._.dir == 'rtl',
165 left = position.x + ( offsetX || 0 ) - positionedAncestorPosition.x,
166 top = position.y + ( offsetY || 0 ) - positionedAncestorPosition.y;
167
168 // Floating panels are off by (-1px, 0px) in RTL mode. (#3438)
169 if ( rtl && ( corner == 1 || corner == 4 ) )
170 left += offsetParent.$.offsetWidth;
171 else if ( !rtl && ( corner == 2 || corner == 3 ) )
172 left += offsetParent.$.offsetWidth - 1;
173
174 if ( corner == 3 || corner == 4 )
175 top += offsetParent.$.offsetHeight - 1;
176
177 // Memorize offsetParent by it's ID.
178 this._.panel._.offsetParentId = offsetParent.getId();
179
180 element.setStyles( {
181 top: top + 'px',
182 left: 0,
183 display: ''
184 } );
185
186 // Don't use display or visibility style because we need to
187 // calculate the rendering layout later and focus the element.
188 element.setOpacity( 0 );
189
190 // To allow the context menu to decrease back their width
191 element.getFirst().removeStyle( 'width' );
192
193 // Report to focus manager.
194 this._.editor.focusManager.add( focused );
195
196 // Configure the IFrame blur event. Do that only once.
197 if ( !this._.blurSet ) {
198
199 // With addEventListener compatible browsers, we must
200 // useCapture when registering the focus/blur events to
201 // guarantee they will be firing in all situations. (#3068, #3222 )
202 CKEDITOR.event.useCapture = true;
203
204 focused.on( 'blur', function( ev ) {
205 // As we are using capture to register the listener,
206 // the blur event may get fired even when focusing
207 // inside the window itself, so we must ensure the
208 // target is out of it.
209 if ( !this.allowBlur() || ev.data.getPhase() != CKEDITOR.EVENT_PHASE_AT_TARGET )
210 return;
211
212 if ( this.visible && !this._.activeChild ) {
213 // [iOS] Allow hide to be prevented if touch is bound
214 // to any parent of the iframe blur happens before touch (#10714).
215 if ( CKEDITOR.env.iOS ) {
216 if ( !this._.hideTimeout )
217 this._.hideTimeout = CKEDITOR.tools.setTimeout( doHide, 0, this );
218 } else {
219 doHide.call( this );
220 }
221 }
222
223 function doHide() {
224 // Panel close is caused by user's navigating away the focus, e.g. click outside the panel.
225 // DO NOT restore focus in this case.
226 delete this._.returnFocus;
227 this.hide();
228 }
229 }, this );
230
231 focused.on( 'focus', function() {
232 this._.focused = true;
233 this.hideChild();
234 this.allowBlur( true );
235 }, this );
236
237 // [iOS] if touch is bound to any parent of the iframe blur
238 // happens twice before touchstart and before touchend (#10714).
239 if ( CKEDITOR.env.iOS ) {
240 // Prevent false hiding on blur.
241 // We don't need to return focus here because touchend will fire anyway.
242 // If user scrolls and pointer gets out of the panel area touchend will also fire.
243 focused.on( 'touchstart', function() {
244 clearTimeout( this._.hideTimeout );
245 }, this );
246
247 // Set focus back to handle blur and hide panel when needed.
248 focused.on( 'touchend', function() {
249 this._.hideTimeout = 0;
250 this.focus();
251 }, this );
252 }
253
254 CKEDITOR.event.useCapture = false;
255
256 this._.blurSet = 1;
257 }
258
259 panel.onEscape = CKEDITOR.tools.bind( function( keystroke ) {
260 if ( this.onEscape && this.onEscape( keystroke ) === false )
261 return false;
262 }, this );
263
264 CKEDITOR.tools.setTimeout( function() {
265 var panelLoad = CKEDITOR.tools.bind( function() {
266 var target = element;
267
268 // Reset panel width as the new content can be narrower
269 // than the old one. (#9355)
270 target.removeStyle( 'width' );
271
272 if ( block.autoSize ) {
273 var panelDoc = block.element.getDocument();
274 var width = ( CKEDITOR.env.webkit ? block.element : panelDoc.getBody() ).$.scrollWidth;
275
276 // Account for extra height needed due to IE quirks box model bug:
277 // http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug
278 // (#3426)
279 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && width > 0 )
280 width += ( target.$.offsetWidth || 0 ) - ( target.$.clientWidth || 0 ) + 3;
281
282 // Add some extra pixels to improve the appearance.
283 width += 10;
284
285 target.setStyle( 'width', width + 'px' );
286
287 var height = block.element.$.scrollHeight;
288
289 // Account for extra height needed due to IE quirks box model bug:
290 // http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug
291 // (#3426)
292 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && height > 0 )
293 height += ( target.$.offsetHeight || 0 ) - ( target.$.clientHeight || 0 ) + 3;
294
295 target.setStyle( 'height', height + 'px' );
296
297 // Fix IE < 8 visibility.
298 panel._.currentBlock.element.setStyle( 'display', 'none' ).removeStyle( 'display' );
299 } else {
300 target.removeStyle( 'height' );
301 }
302
303 // Flip panel layout horizontally in RTL with known width.
304 if ( rtl )
305 left -= element.$.offsetWidth;
306
307 // Pop the style now for measurement.
308 element.setStyle( 'left', left + 'px' );
309
310 /* panel layout smartly fit the viewport size. */
311 var panelElement = panel.element,
312 panelWindow = panelElement.getWindow(),
313 rect = element.$.getBoundingClientRect(),
314 viewportSize = panelWindow.getViewPaneSize();
315
316 // Compensation for browsers that dont support "width" and "height".
317 var rectWidth = rect.width || rect.right - rect.left,
318 rectHeight = rect.height || rect.bottom - rect.top;
319
320 // Check if default horizontal layout is impossible.
321 var spaceAfter = rtl ? rect.right : viewportSize.width - rect.left,
322 spaceBefore = rtl ? viewportSize.width - rect.right : rect.left;
323
324 if ( rtl ) {
325 if ( spaceAfter < rectWidth ) {
326 // Flip to show on right.
327 if ( spaceBefore > rectWidth )
328 left += rectWidth;
329 // Align to window left.
330 else if ( viewportSize.width > rectWidth )
331 left = left - rect.left;
332 // Align to window right, never cutting the panel at right.
333 else
334 left = left - rect.right + viewportSize.width;
335 }
336 } else if ( spaceAfter < rectWidth ) {
337 // Flip to show on left.
338 if ( spaceBefore > rectWidth )
339 left -= rectWidth;
340 // Align to window right.
341 else if ( viewportSize.width > rectWidth )
342 left = left - rect.right + viewportSize.width;
343 // Align to window left, never cutting the panel at left.
344 else
345 left = left - rect.left;
346 }
347
348
349 // Check if the default vertical layout is possible.
350 var spaceBelow = viewportSize.height - rect.top,
351 spaceAbove = rect.top;
352
353 if ( spaceBelow < rectHeight ) {
354 // Flip to show above.
355 if ( spaceAbove > rectHeight )
356 top -= rectHeight;
357 // Align to window bottom.
358 else if ( viewportSize.height > rectHeight )
359 top = top - rect.bottom + viewportSize.height;
360 // Align to top, never cutting the panel at top.
361 else
362 top = top - rect.top;
363 }
364
365 // If IE is in RTL, we have troubles with absolute
366 // position and horizontal scrolls. Here we have a
367 // series of hacks to workaround it. (#6146)
368 if ( CKEDITOR.env.ie ) {
369 var offsetParent = new CKEDITOR.dom.element( element.$.offsetParent ),
370 scrollParent = offsetParent;
371
372 // Quirks returns <body>, but standards returns <html>.
373 if ( scrollParent.getName() == 'html' )
374 scrollParent = scrollParent.getDocument().getBody();
375
376 if ( scrollParent.getComputedStyle( 'direction' ) == 'rtl' ) {
377 // For IE8, there is not much logic on this, but it works.
378 if ( CKEDITOR.env.ie8Compat )
379 left -= element.getDocument().getDocumentElement().$.scrollLeft * 2;
380 else
381 left -= ( offsetParent.$.scrollWidth - offsetParent.$.clientWidth );
382 }
383 }
384
385 // Trigger the onHide event of the previously active panel to prevent
386 // incorrect styles from being applied (#6170)
387 var innerElement = element.getFirst(),
388 activePanel;
389 if ( ( activePanel = innerElement.getCustomData( 'activePanel' ) ) )
390 activePanel.onHide && activePanel.onHide.call( this, 1 );
391 innerElement.setCustomData( 'activePanel', this );
392
393 element.setStyles( {
394 top: top + 'px',
395 left: left + 'px'
396 } );
397 element.setOpacity( 1 );
398
399 callback && callback();
400 }, this );
401
402 panel.isLoaded ? panelLoad() : panel.onLoad = panelLoad;
403
404 CKEDITOR.tools.setTimeout( function() {
405 var scrollTop = CKEDITOR.env.webkit && CKEDITOR.document.getWindow().getScrollPosition().y;
406
407 // Focus the panel frame first, so blur gets fired.
408 this.focus();
409
410 // Focus the block now.
411 block.element.focus();
412
413 // #10623, #10951 - restore the viewport's scroll position after focusing list element.
414 if ( CKEDITOR.env.webkit )
415 CKEDITOR.document.getBody().$.scrollTop = scrollTop;
416
417 // We need this get fired manually because of unfired focus() function.
418 this.allowBlur( true );
419 this._.editor.fire( 'panelShow', this );
420 }, 0, this );
421 }, CKEDITOR.env.air ? 200 : 0, this );
422 this.visible = 1;
423
424 if ( this.onShow )
425 this.onShow.call( this );
426 },
427
428 /**
429 * Repositions the panel with the same parameters that were used in the last {@link #showBlock} call.
430 *
431 * @since 4.5.4
432 */
433 reposition: function() {
434 var blockParams = this._.showBlockParams;
435
436 if ( this.visible && this._.showBlockParams ) {
437 this.hide();
438 this.showBlock.apply( this, blockParams );
439 }
440 },
441
442 /**
443 * Restores the last focused element or simply focuses the panel window.
444 */
445 focus: function() {
446 // Webkit requires to blur any previous focused page element, in
447 // order to properly fire the "focus" event.
448 if ( CKEDITOR.env.webkit ) {
449 var active = CKEDITOR.document.getActive();
450 active && !active.equals( this._.iframe ) && active.$.blur();
451 }
452
453 // Restore last focused element or simply focus panel window.
454 var focus = this._.lastFocused || this._.iframe.getFrameDocument().getWindow();
455 focus.focus();
456 },
457
458 /**
459 * @todo
460 */
461 blur: function() {
462 var doc = this._.iframe.getFrameDocument(),
463 active = doc.getActive();
464
465 active && active.is( 'a' ) && ( this._.lastFocused = active );
466 },
467
468 /**
469 * Hides the panel.
470 *
471 * @todo
472 */
473 hide: function( returnFocus ) {
474 if ( this.visible && ( !this.onHide || this.onHide.call( this ) !== true ) ) {
475 this.hideChild();
476 // Blur previously focused element. (#6671)
477 CKEDITOR.env.gecko && this._.iframe.getFrameDocument().$.activeElement.blur();
478 this.element.setStyle( 'display', 'none' );
479 this.visible = 0;
480 this.element.getFirst().removeCustomData( 'activePanel' );
481
482 // Return focus properly. (#6247)
483 var focusReturn = returnFocus && this._.returnFocus;
484 if ( focusReturn ) {
485 // Webkit requires focus moved out panel iframe first.
486 if ( CKEDITOR.env.webkit && focusReturn.type )
487 focusReturn.getWindow().$.focus();
488
489 focusReturn.focus();
490 }
491
492 delete this._.lastFocused;
493 this._.showBlockParams = null;
494
495 this._.editor.fire( 'panelHide', this );
496 }
497 },
498
499 /**
500 * @todo
501 */
502 allowBlur: function( allow ) {
503 // Prevent editor from hiding the panel. (#3222)
504 var panel = this._.panel;
505 if ( allow !== undefined )
506 panel.allowBlur = allow;
507
508 return panel.allowBlur;
509 },
510
511 /**
512 * Shows the specified panel as a child of one block of this one.
513 *
514 * @param {CKEDITOR.ui.floatPanel} panel
515 * @param {String} blockName
516 * @param {CKEDITOR.dom.element} offsetParent Positioned parent.
517 * @param {Number} corner
518 *
519 * * For LTR (left to right) oriented editor:
520 * * `1` = top-left
521 * * `2` = top-right
522 * * `3` = bottom-right
523 * * `4` = bottom-left
524 * * For RTL (right to left):
525 * * `1` = top-right
526 * * `2` = top-left
527 * * `3` = bottom-left
528 * * `4` = bottom-right
529 *
530 * @param {Number} [offsetX=0]
531 * @param {Number} [offsetY=0]
532 * @todo
533 */
534 showAsChild: function( panel, blockName, offsetParent, corner, offsetX, offsetY ) {
535 // Skip reshowing of child which is already visible.
536 if ( this._.activeChild == panel && panel._.panel._.offsetParentId == offsetParent.getId() )
537 return;
538
539 this.hideChild();
540
541 panel.onHide = CKEDITOR.tools.bind( function() {
542 // Use a timeout, so we give time for this menu to get
543 // potentially focused.
544 CKEDITOR.tools.setTimeout( function() {
545 if ( !this._.focused )
546 this.hide();
547 }, 0, this );
548 }, this );
549
550 this._.activeChild = panel;
551 this._.focused = false;
552
553 panel.showBlock( blockName, offsetParent, corner, offsetX, offsetY );
554 this.blur();
555
556 /* #3767 IE: Second level menu may not have borders */
557 if ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) {
558 setTimeout( function() {
559 panel.element.getChild( 0 ).$.style.cssText += '';
560 }, 100 );
561 }
562 },
563
564 /**
565 * @todo
566 */
567 hideChild: function( restoreFocus ) {
568 var activeChild = this._.activeChild;
569
570 if ( activeChild ) {
571 delete activeChild.onHide;
572 delete this._.activeChild;
573 activeChild.hide();
574
575 // At this point focus should be moved back to parent panel.
576 restoreFocus && this.focus();
577 }
578 }
579 }
580 } );
581
582 CKEDITOR.on( 'instanceDestroyed', function() {
583 var isLastInstance = CKEDITOR.tools.isEmpty( CKEDITOR.instances );
584
585 for ( var i in panels ) {
586 var panel = panels[ i ];
587 // Safe to destroy it since there're no more instances.(#4241)
588 if ( isLastInstance )
589 panel.destroy();
590 // Panel might be used by other instances, just hide them.(#4552)
591 else
592 panel.element.hide();
593 }
594 // Remove the registration.
595 isLastInstance && ( panels = {} );
596
597 } );
598} )();
diff --git a/sources/plugins/font/lang/af.js b/sources/plugins/font/lang/af.js
new file mode 100644
index 00000000..66f7398d
--- /dev/null
+++ b/sources/plugins/font/lang/af.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'af', {
6 fontSize: {
7 label: 'Grootte',
8 voiceLabel: 'Fontgrootte',
9 panelTitle: 'Fontgrootte'
10 },
11 label: 'Font',
12 panelTitle: 'Fontnaam',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/ar.js b/sources/plugins/font/lang/ar.js
new file mode 100644
index 00000000..168189c5
--- /dev/null
+++ b/sources/plugins/font/lang/ar.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ar', {
6 fontSize: {
7 label: 'حجم الخط',
8 voiceLabel: 'حجم الخط',
9 panelTitle: 'حجم الخط'
10 },
11 label: 'خط',
12 panelTitle: 'حجم الخط',
13 voiceLabel: 'حجم الخط'
14} );
diff --git a/sources/plugins/font/lang/bg.js b/sources/plugins/font/lang/bg.js
new file mode 100644
index 00000000..72edae63
--- /dev/null
+++ b/sources/plugins/font/lang/bg.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'bg', {
6 fontSize: {
7 label: 'Размер',
8 voiceLabel: 'Размер на шрифт',
9 panelTitle: 'Размер на шрифт'
10 },
11 label: 'Шрифт',
12 panelTitle: 'Име на шрифт',
13 voiceLabel: 'Шрифт'
14} );
diff --git a/sources/plugins/font/lang/bn.js b/sources/plugins/font/lang/bn.js
new file mode 100644
index 00000000..4aa397d7
--- /dev/null
+++ b/sources/plugins/font/lang/bn.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'bn', {
6 fontSize: {
7 label: 'সাইজ',
8 voiceLabel: 'Font Size',
9 panelTitle: 'সাইজ'
10 },
11 label: 'ফন্ট',
12 panelTitle: 'ফন্ট',
13 voiceLabel: 'ফন্ট'
14} );
diff --git a/sources/plugins/font/lang/bs.js b/sources/plugins/font/lang/bs.js
new file mode 100644
index 00000000..8699582b
--- /dev/null
+++ b/sources/plugins/font/lang/bs.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'bs', {
6 fontSize: {
7 label: 'Velièina',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Velièina'
10 },
11 label: 'Font',
12 panelTitle: 'Font',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/ca.js b/sources/plugins/font/lang/ca.js
new file mode 100644
index 00000000..7a7730ca
--- /dev/null
+++ b/sources/plugins/font/lang/ca.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ca', {
6 fontSize: {
7 label: 'Mida',
8 voiceLabel: 'Mida de la lletra',
9 panelTitle: 'Mida de la lletra'
10 },
11 label: 'Tipus de lletra',
12 panelTitle: 'Tipus de lletra',
13 voiceLabel: 'Tipus de lletra'
14} );
diff --git a/sources/plugins/font/lang/cs.js b/sources/plugins/font/lang/cs.js
new file mode 100644
index 00000000..2884a68e
--- /dev/null
+++ b/sources/plugins/font/lang/cs.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'cs', {
6 fontSize: {
7 label: 'Velikost',
8 voiceLabel: 'Velikost písma',
9 panelTitle: 'Velikost'
10 },
11 label: 'Písmo',
12 panelTitle: 'Písmo',
13 voiceLabel: 'Písmo'
14} );
diff --git a/sources/plugins/font/lang/cy.js b/sources/plugins/font/lang/cy.js
new file mode 100644
index 00000000..d14cfe67
--- /dev/null
+++ b/sources/plugins/font/lang/cy.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'cy', {
6 fontSize: {
7 label: 'Maint',
8 voiceLabel: 'Maint y Ffont',
9 panelTitle: 'Maint y Ffont'
10 },
11 label: 'Ffont',
12 panelTitle: 'Enw\'r Ffont',
13 voiceLabel: 'Ffont'
14} );
diff --git a/sources/plugins/font/lang/da.js b/sources/plugins/font/lang/da.js
new file mode 100644
index 00000000..c18415b3
--- /dev/null
+++ b/sources/plugins/font/lang/da.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'da', {
6 fontSize: {
7 label: 'Skriftstørrelse',
8 voiceLabel: 'Skriftstørrelse',
9 panelTitle: 'Skriftstørrelse'
10 },
11 label: 'Skrifttype',
12 panelTitle: 'Skrifttype',
13 voiceLabel: 'Skrifttype'
14} );
diff --git a/sources/plugins/font/lang/de.js b/sources/plugins/font/lang/de.js
new file mode 100644
index 00000000..d5aa1a7b
--- /dev/null
+++ b/sources/plugins/font/lang/de.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'de', {
6 fontSize: {
7 label: 'Größe',
8 voiceLabel: 'Schrifgröße',
9 panelTitle: 'Schriftgröße'
10 },
11 label: 'Schriftart',
12 panelTitle: 'Schriftartname',
13 voiceLabel: 'Schriftart'
14} );
diff --git a/sources/plugins/font/lang/el.js b/sources/plugins/font/lang/el.js
new file mode 100644
index 00000000..20fb5f39
--- /dev/null
+++ b/sources/plugins/font/lang/el.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'el', {
6 fontSize: {
7 label: 'Μέγεθος',
8 voiceLabel: 'Μέγεθος Γραμματοσειράς',
9 panelTitle: 'Μέγεθος Γραμματοσειράς'
10 },
11 label: 'Γραμματοσειρά',
12 panelTitle: 'Όνομα Γραμματοσειράς',
13 voiceLabel: 'Γραμματοσειρά'
14} );
diff --git a/sources/plugins/font/lang/en-au.js b/sources/plugins/font/lang/en-au.js
new file mode 100644
index 00000000..7f6ade46
--- /dev/null
+++ b/sources/plugins/font/lang/en-au.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'en-au', {
6 fontSize: {
7 label: 'Size',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Font Size'
10 },
11 label: 'Font',
12 panelTitle: 'Font Name',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/en-ca.js b/sources/plugins/font/lang/en-ca.js
new file mode 100644
index 00000000..5d51411c
--- /dev/null
+++ b/sources/plugins/font/lang/en-ca.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'en-ca', {
6 fontSize: {
7 label: 'Size',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Font Size'
10 },
11 label: 'Font',
12 panelTitle: 'Font Name',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/en-gb.js b/sources/plugins/font/lang/en-gb.js
new file mode 100644
index 00000000..8314a004
--- /dev/null
+++ b/sources/plugins/font/lang/en-gb.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'en-gb', {
6 fontSize: {
7 label: 'Size',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Font Size'
10 },
11 label: 'Font',
12 panelTitle: 'Font Name',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/en.js b/sources/plugins/font/lang/en.js
new file mode 100644
index 00000000..c10403ca
--- /dev/null
+++ b/sources/plugins/font/lang/en.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'en', {
6 fontSize: {
7 label: 'Size',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Font Size'
10 },
11 label: 'Font',
12 panelTitle: 'Font Name',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/eo.js b/sources/plugins/font/lang/eo.js
new file mode 100644
index 00000000..8a883219
--- /dev/null
+++ b/sources/plugins/font/lang/eo.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'eo', {
6 fontSize: {
7 label: 'Grado',
8 voiceLabel: 'Tipara grado',
9 panelTitle: 'Tipara grado'
10 },
11 label: 'Tiparo',
12 panelTitle: 'Tipara nomo',
13 voiceLabel: 'Tiparo'
14} );
diff --git a/sources/plugins/font/lang/es.js b/sources/plugins/font/lang/es.js
new file mode 100644
index 00000000..9a68c614
--- /dev/null
+++ b/sources/plugins/font/lang/es.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'es', {
6 fontSize: {
7 label: 'Tamaño',
8 voiceLabel: 'Tamaño de fuente',
9 panelTitle: 'Tamaño'
10 },
11 label: 'Fuente',
12 panelTitle: 'Fuente',
13 voiceLabel: 'Fuente'
14} );
diff --git a/sources/plugins/font/lang/et.js b/sources/plugins/font/lang/et.js
new file mode 100644
index 00000000..3a8fa319
--- /dev/null
+++ b/sources/plugins/font/lang/et.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'et', {
6 fontSize: {
7 label: 'Suurus',
8 voiceLabel: 'Kirja suurus',
9 panelTitle: 'Suurus'
10 },
11 label: 'Kiri',
12 panelTitle: 'Kiri',
13 voiceLabel: 'Kiri'
14} );
diff --git a/sources/plugins/font/lang/eu.js b/sources/plugins/font/lang/eu.js
new file mode 100644
index 00000000..164f7283
--- /dev/null
+++ b/sources/plugins/font/lang/eu.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'eu', {
6 fontSize: {
7 label: 'Tamaina',
8 voiceLabel: 'Letra-tamaina',
9 panelTitle: 'Letra-tamaina'
10 },
11 label: 'Letra-tipoa',
12 panelTitle: 'Letra-tipoaren izena',
13 voiceLabel: 'Letra-tipoa'
14} );
diff --git a/sources/plugins/font/lang/fa.js b/sources/plugins/font/lang/fa.js
new file mode 100644
index 00000000..418920ba
--- /dev/null
+++ b/sources/plugins/font/lang/fa.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'fa', {
6 fontSize: {
7 label: 'اندازه',
8 voiceLabel: 'اندازه قلم',
9 panelTitle: 'اندازه قلم'
10 },
11 label: 'قلم',
12 panelTitle: 'نام قلم',
13 voiceLabel: 'قلم'
14} );
diff --git a/sources/plugins/font/lang/fi.js b/sources/plugins/font/lang/fi.js
new file mode 100644
index 00000000..2fa400f5
--- /dev/null
+++ b/sources/plugins/font/lang/fi.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'fi', {
6 fontSize: {
7 label: 'Koko',
8 voiceLabel: 'Kirjaisimen koko',
9 panelTitle: 'Koko'
10 },
11 label: 'Kirjaisinlaji',
12 panelTitle: 'Kirjaisinlaji',
13 voiceLabel: 'Kirjaisinlaji'
14} );
diff --git a/sources/plugins/font/lang/fo.js b/sources/plugins/font/lang/fo.js
new file mode 100644
index 00000000..6889201e
--- /dev/null
+++ b/sources/plugins/font/lang/fo.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'fo', {
6 fontSize: {
7 label: 'Skriftstødd',
8 voiceLabel: 'Skriftstødd',
9 panelTitle: 'Skriftstødd'
10 },
11 label: 'Skrift',
12 panelTitle: 'Skrift',
13 voiceLabel: 'Skrift'
14} );
diff --git a/sources/plugins/font/lang/fr-ca.js b/sources/plugins/font/lang/fr-ca.js
new file mode 100644
index 00000000..5fea47ec
--- /dev/null
+++ b/sources/plugins/font/lang/fr-ca.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'fr-ca', {
6 fontSize: {
7 label: 'Taille',
8 voiceLabel: 'Taille',
9 panelTitle: 'Taille'
10 },
11 label: 'Police',
12 panelTitle: 'Police',
13 voiceLabel: 'Police'
14} );
diff --git a/sources/plugins/font/lang/fr.js b/sources/plugins/font/lang/fr.js
new file mode 100644
index 00000000..801f93d5
--- /dev/null
+++ b/sources/plugins/font/lang/fr.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'fr', {
6 fontSize: {
7 label: 'Taille',
8 voiceLabel: 'Taille de police',
9 panelTitle: 'Taille de police'
10 },
11 label: 'Police',
12 panelTitle: 'Style de police',
13 voiceLabel: 'Police'
14} );
diff --git a/sources/plugins/font/lang/gl.js b/sources/plugins/font/lang/gl.js
new file mode 100644
index 00000000..2a2223eb
--- /dev/null
+++ b/sources/plugins/font/lang/gl.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'gl', {
6 fontSize: {
7 label: 'Tamaño',
8 voiceLabel: 'Tamaño da letra',
9 panelTitle: 'Tamaño da letra'
10 },
11 label: 'Tipo de letra',
12 panelTitle: 'Nome do tipo de letra',
13 voiceLabel: 'Tipo de letra'
14} );
diff --git a/sources/plugins/font/lang/gu.js b/sources/plugins/font/lang/gu.js
new file mode 100644
index 00000000..07ffa00d
--- /dev/null
+++ b/sources/plugins/font/lang/gu.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'gu', {
6 fontSize: {
7 label: 'ફૉન્ટ સાઇઝ/કદ',
8 voiceLabel: 'ફોન્ટ સાઈઝ',
9 panelTitle: 'ફૉન્ટ સાઇઝ/કદ'
10 },
11 label: 'ફૉન્ટ',
12 panelTitle: 'ફૉન્ટ',
13 voiceLabel: 'ફોન્ટ'
14} );
diff --git a/sources/plugins/font/lang/he.js b/sources/plugins/font/lang/he.js
new file mode 100644
index 00000000..0fc74beb
--- /dev/null
+++ b/sources/plugins/font/lang/he.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'he', {
6 fontSize: {
7 label: 'גודל',
8 voiceLabel: 'גודל',
9 panelTitle: 'גודל'
10 },
11 label: 'גופן',
12 panelTitle: 'גופן',
13 voiceLabel: 'גופן'
14} );
diff --git a/sources/plugins/font/lang/hi.js b/sources/plugins/font/lang/hi.js
new file mode 100644
index 00000000..f5e2cc7a
--- /dev/null
+++ b/sources/plugins/font/lang/hi.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'hi', {
6 fontSize: {
7 label: 'साइज़',
8 voiceLabel: 'Font Size',
9 panelTitle: 'साइज़'
10 },
11 label: 'फ़ॉन्ट',
12 panelTitle: 'फ़ॉन्ट',
13 voiceLabel: 'फ़ॉन्ट'
14} );
diff --git a/sources/plugins/font/lang/hr.js b/sources/plugins/font/lang/hr.js
new file mode 100644
index 00000000..86e2a1a6
--- /dev/null
+++ b/sources/plugins/font/lang/hr.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'hr', {
6 fontSize: {
7 label: 'Veličina',
8 voiceLabel: 'Veličina slova',
9 panelTitle: 'Veličina'
10 },
11 label: 'Font',
12 panelTitle: 'Font',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/hu.js b/sources/plugins/font/lang/hu.js
new file mode 100644
index 00000000..e6f1f000
--- /dev/null
+++ b/sources/plugins/font/lang/hu.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'hu', {
6 fontSize: {
7 label: 'Méret',
8 voiceLabel: 'Betűméret',
9 panelTitle: 'Méret'
10 },
11 label: 'Betűtípus',
12 panelTitle: 'Betűtípus',
13 voiceLabel: 'Betűtípus'
14} );
diff --git a/sources/plugins/font/lang/id.js b/sources/plugins/font/lang/id.js
new file mode 100644
index 00000000..6ae856b2
--- /dev/null
+++ b/sources/plugins/font/lang/id.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'id', {
6 fontSize: {
7 label: 'Ukuran',
8 voiceLabel: 'Ukuran Huruf',
9 panelTitle: 'Ukuran Huruf'
10 },
11 label: 'Huruf',
12 panelTitle: 'Font Name', // MISSING
13 voiceLabel: 'Huruf'
14} );
diff --git a/sources/plugins/font/lang/is.js b/sources/plugins/font/lang/is.js
new file mode 100644
index 00000000..a83bf180
--- /dev/null
+++ b/sources/plugins/font/lang/is.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'is', {
6 fontSize: {
7 label: 'Leturstærð ',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Leturstærð '
10 },
11 label: 'Leturgerð ',
12 panelTitle: 'Leturgerð ',
13 voiceLabel: 'Leturgerð '
14} );
diff --git a/sources/plugins/font/lang/it.js b/sources/plugins/font/lang/it.js
new file mode 100644
index 00000000..caf94901
--- /dev/null
+++ b/sources/plugins/font/lang/it.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'it', {
6 fontSize: {
7 label: 'Dimensione',
8 voiceLabel: 'Dimensione Carattere',
9 panelTitle: 'Dimensione'
10 },
11 label: 'Carattere',
12 panelTitle: 'Carattere',
13 voiceLabel: 'Carattere'
14} );
diff --git a/sources/plugins/font/lang/ja.js b/sources/plugins/font/lang/ja.js
new file mode 100644
index 00000000..db14ac1e
--- /dev/null
+++ b/sources/plugins/font/lang/ja.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ja', {
6 fontSize: {
7 label: 'サイズ',
8 voiceLabel: 'フォントサイズ',
9 panelTitle: 'フォントサイズ'
10 },
11 label: 'フォント',
12 panelTitle: 'フォント',
13 voiceLabel: 'フォント'
14} );
diff --git a/sources/plugins/font/lang/ka.js b/sources/plugins/font/lang/ka.js
new file mode 100644
index 00000000..3ec63753
--- /dev/null
+++ b/sources/plugins/font/lang/ka.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ka', {
6 fontSize: {
7 label: 'ზომა',
8 voiceLabel: 'ტექსტის ზომა',
9 panelTitle: 'ტექსტის ზომა'
10 },
11 label: 'ფონტი',
12 panelTitle: 'ფონტის სახელი',
13 voiceLabel: 'ფონტი'
14} );
diff --git a/sources/plugins/font/lang/km.js b/sources/plugins/font/lang/km.js
new file mode 100644
index 00000000..07d36691
--- /dev/null
+++ b/sources/plugins/font/lang/km.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'km', {
6 fontSize: {
7 label: 'ទំហំ',
8 voiceLabel: 'ទំហំ​អក្សរ',
9 panelTitle: 'ទំហំ​អក្សរ'
10 },
11 label: 'ពុម្ព​អក្សរ',
12 panelTitle: 'ឈ្មោះ​ពុម្ព​អក្សរ',
13 voiceLabel: 'ពុម្ព​អក្សរ'
14} );
diff --git a/sources/plugins/font/lang/ko.js b/sources/plugins/font/lang/ko.js
new file mode 100644
index 00000000..0a239341
--- /dev/null
+++ b/sources/plugins/font/lang/ko.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ko', {
6 fontSize: {
7 label: '크기',
8 voiceLabel: '글자 크기',
9 panelTitle: '글자 크기'
10 },
11 label: '글꼴',
12 panelTitle: '글꼴',
13 voiceLabel: '글꼴'
14} );
diff --git a/sources/plugins/font/lang/ku.js b/sources/plugins/font/lang/ku.js
new file mode 100644
index 00000000..aaf57d2e
--- /dev/null
+++ b/sources/plugins/font/lang/ku.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ku', {
6 fontSize: {
7 label: 'گەورەیی',
8 voiceLabel: 'گەورەیی فۆنت',
9 panelTitle: 'گەورەیی فۆنت'
10 },
11 label: 'فۆنت',
12 panelTitle: 'ناوی فۆنت',
13 voiceLabel: 'فۆنت'
14} );
diff --git a/sources/plugins/font/lang/lt.js b/sources/plugins/font/lang/lt.js
new file mode 100644
index 00000000..ccd4c6e0
--- /dev/null
+++ b/sources/plugins/font/lang/lt.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'lt', {
6 fontSize: {
7 label: 'Šrifto dydis',
8 voiceLabel: 'Šrifto dydis',
9 panelTitle: 'Šrifto dydis'
10 },
11 label: 'Šriftas',
12 panelTitle: 'Šriftas',
13 voiceLabel: 'Šriftas'
14} );
diff --git a/sources/plugins/font/lang/lv.js b/sources/plugins/font/lang/lv.js
new file mode 100644
index 00000000..90c336dd
--- /dev/null
+++ b/sources/plugins/font/lang/lv.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'lv', {
6 fontSize: {
7 label: 'Izmērs',
8 voiceLabel: 'Fonta izmeŗs',
9 panelTitle: 'Izmērs'
10 },
11 label: 'Šrifts',
12 panelTitle: 'Šrifts',
13 voiceLabel: 'Fonts'
14} );
diff --git a/sources/plugins/font/lang/mk.js b/sources/plugins/font/lang/mk.js
new file mode 100644
index 00000000..46cd6386
--- /dev/null
+++ b/sources/plugins/font/lang/mk.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'mk', {
6 fontSize: {
7 label: 'Size',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Font Size'
10 },
11 label: 'Font', // MISSING
12 panelTitle: 'Font Name', // MISSING
13 voiceLabel: 'Font' // MISSING
14} );
diff --git a/sources/plugins/font/lang/mn.js b/sources/plugins/font/lang/mn.js
new file mode 100644
index 00000000..f907e3b6
--- /dev/null
+++ b/sources/plugins/font/lang/mn.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'mn', {
6 fontSize: {
7 label: 'Хэмжээ',
8 voiceLabel: 'Үсгийн хэмжээ',
9 panelTitle: 'Үсгийн хэмжээ'
10 },
11 label: 'Үсгийн хэлбэр',
12 panelTitle: 'Үгсийн хэлбэрийн нэр',
13 voiceLabel: 'Үгсийн хэлбэр'
14} );
diff --git a/sources/plugins/font/lang/ms.js b/sources/plugins/font/lang/ms.js
new file mode 100644
index 00000000..3ba71a77
--- /dev/null
+++ b/sources/plugins/font/lang/ms.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ms', {
6 fontSize: {
7 label: 'Saiz',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Saiz'
10 },
11 label: 'Font',
12 panelTitle: 'Font',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/nb.js b/sources/plugins/font/lang/nb.js
new file mode 100644
index 00000000..ae79b440
--- /dev/null
+++ b/sources/plugins/font/lang/nb.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'nb', {
6 fontSize: {
7 label: 'Størrelse',
8 voiceLabel: 'Skriftstørrelse',
9 panelTitle: 'Skriftstørrelse'
10 },
11 label: 'Skrift',
12 panelTitle: 'Skrift',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/nl.js b/sources/plugins/font/lang/nl.js
new file mode 100644
index 00000000..5a42cb32
--- /dev/null
+++ b/sources/plugins/font/lang/nl.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'nl', {
6 fontSize: {
7 label: 'Lettergrootte',
8 voiceLabel: 'Lettergrootte',
9 panelTitle: 'Lettergrootte'
10 },
11 label: 'Lettertype',
12 panelTitle: 'Lettertype',
13 voiceLabel: 'Lettertype'
14} );
diff --git a/sources/plugins/font/lang/no.js b/sources/plugins/font/lang/no.js
new file mode 100644
index 00000000..8dd5a622
--- /dev/null
+++ b/sources/plugins/font/lang/no.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'no', {
6 fontSize: {
7 label: 'Størrelse',
8 voiceLabel: 'Font Størrelse',
9 panelTitle: 'Størrelse'
10 },
11 label: 'Skrift',
12 panelTitle: 'Skrift',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/pl.js b/sources/plugins/font/lang/pl.js
new file mode 100644
index 00000000..75c592cb
--- /dev/null
+++ b/sources/plugins/font/lang/pl.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'pl', {
6 fontSize: {
7 label: 'Rozmiar',
8 voiceLabel: 'Rozmiar czcionki',
9 panelTitle: 'Rozmiar'
10 },
11 label: 'Czcionka',
12 panelTitle: 'Czcionka',
13 voiceLabel: 'Czcionka'
14} );
diff --git a/sources/plugins/font/lang/pt-br.js b/sources/plugins/font/lang/pt-br.js
new file mode 100644
index 00000000..cf8982d6
--- /dev/null
+++ b/sources/plugins/font/lang/pt-br.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'pt-br', {
6 fontSize: {
7 label: 'Tamanho',
8 voiceLabel: 'Tamanho da fonte',
9 panelTitle: 'Tamanho'
10 },
11 label: 'Fonte',
12 panelTitle: 'Fonte',
13 voiceLabel: 'Fonte'
14} );
diff --git a/sources/plugins/font/lang/pt.js b/sources/plugins/font/lang/pt.js
new file mode 100644
index 00000000..6ee81a53
--- /dev/null
+++ b/sources/plugins/font/lang/pt.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'pt', {
6 fontSize: {
7 label: 'Tamanho',
8 voiceLabel: 'Tamanho da letra',
9 panelTitle: 'Tamanho da letra'
10 },
11 label: 'Fonte',
12 panelTitle: 'Nome do Tipo de Letra',
13 voiceLabel: 'Tipo de Letra'
14} );
diff --git a/sources/plugins/font/lang/ro.js b/sources/plugins/font/lang/ro.js
new file mode 100644
index 00000000..69cb91ff
--- /dev/null
+++ b/sources/plugins/font/lang/ro.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ro', {
6 fontSize: {
7 label: 'Mărime',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Mărime'
10 },
11 label: 'Font',
12 panelTitle: 'Font',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/ru.js b/sources/plugins/font/lang/ru.js
new file mode 100644
index 00000000..4b642c4e
--- /dev/null
+++ b/sources/plugins/font/lang/ru.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ru', {
6 fontSize: {
7 label: 'Размер',
8 voiceLabel: 'Размер шрифта',
9 panelTitle: 'Размер шрифта'
10 },
11 label: 'Шрифт',
12 panelTitle: 'Шрифт',
13 voiceLabel: 'Шрифт'
14} );
diff --git a/sources/plugins/font/lang/si.js b/sources/plugins/font/lang/si.js
new file mode 100644
index 00000000..fd6cab3f
--- /dev/null
+++ b/sources/plugins/font/lang/si.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'si', {
6 fontSize: {
7 label: 'විශාලත්වය',
8 voiceLabel: 'අක්ෂර විශාලත්වය',
9 panelTitle: 'අක්ෂර විශාලත්වය'
10 },
11 label: 'අක්ෂරය',
12 panelTitle: 'අක්ෂර නාමය',
13 voiceLabel: 'අක්ෂර'
14} );
diff --git a/sources/plugins/font/lang/sk.js b/sources/plugins/font/lang/sk.js
new file mode 100644
index 00000000..c0f9b00f
--- /dev/null
+++ b/sources/plugins/font/lang/sk.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'sk', {
6 fontSize: {
7 label: 'Veľkosť',
8 voiceLabel: 'Veľkosť písma',
9 panelTitle: 'Veľkosť písma'
10 },
11 label: 'Font',
12 panelTitle: 'Názov fontu',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/sl.js b/sources/plugins/font/lang/sl.js
new file mode 100644
index 00000000..239c15df
--- /dev/null
+++ b/sources/plugins/font/lang/sl.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'sl', {
6 fontSize: {
7 label: 'Velikost',
8 voiceLabel: 'Velikost',
9 panelTitle: 'Velikost'
10 },
11 label: 'Pisava',
12 panelTitle: 'Pisava',
13 voiceLabel: 'Pisava'
14} );
diff --git a/sources/plugins/font/lang/sq.js b/sources/plugins/font/lang/sq.js
new file mode 100644
index 00000000..0101f4f1
--- /dev/null
+++ b/sources/plugins/font/lang/sq.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'sq', {
6 fontSize: {
7 label: 'Madhësia',
8 voiceLabel: 'Madhësia e Shkronjës',
9 panelTitle: 'Madhësia e Shkronjës'
10 },
11 label: 'Shkronja',
12 panelTitle: 'Emri i Shkronjës',
13 voiceLabel: 'Shkronja'
14} );
diff --git a/sources/plugins/font/lang/sr-latn.js b/sources/plugins/font/lang/sr-latn.js
new file mode 100644
index 00000000..1189126b
--- /dev/null
+++ b/sources/plugins/font/lang/sr-latn.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'sr-latn', {
6 fontSize: {
7 label: 'Veličina fonta',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Veličina fonta'
10 },
11 label: 'Font',
12 panelTitle: 'Font',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/sr.js b/sources/plugins/font/lang/sr.js
new file mode 100644
index 00000000..b0287ef5
--- /dev/null
+++ b/sources/plugins/font/lang/sr.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'sr', {
6 fontSize: {
7 label: 'Величина фонта',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Величина фонта'
10 },
11 label: 'Фонт',
12 panelTitle: 'Фонт',
13 voiceLabel: 'Фонт'
14} );
diff --git a/sources/plugins/font/lang/sv.js b/sources/plugins/font/lang/sv.js
new file mode 100644
index 00000000..4dacb9e3
--- /dev/null
+++ b/sources/plugins/font/lang/sv.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'sv', {
6 fontSize: {
7 label: 'Storlek',
8 voiceLabel: 'Teckenstorlek',
9 panelTitle: 'Teckenstorlek'
10 },
11 label: 'Typsnitt',
12 panelTitle: 'Typsnitt',
13 voiceLabel: 'Typsnitt'
14} );
diff --git a/sources/plugins/font/lang/th.js b/sources/plugins/font/lang/th.js
new file mode 100644
index 00000000..0622a057
--- /dev/null
+++ b/sources/plugins/font/lang/th.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'th', {
6 fontSize: {
7 label: 'ขนาด',
8 voiceLabel: 'Font Size',
9 panelTitle: 'ขนาด'
10 },
11 label: 'แบบอักษร',
12 panelTitle: 'แบบอักษร',
13 voiceLabel: 'แบบอักษร'
14} );
diff --git a/sources/plugins/font/lang/tr.js b/sources/plugins/font/lang/tr.js
new file mode 100644
index 00000000..678f0dd9
--- /dev/null
+++ b/sources/plugins/font/lang/tr.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'tr', {
6 fontSize: {
7 label: 'Boyut',
8 voiceLabel: 'Font Size',
9 panelTitle: 'Boyut'
10 },
11 label: 'Yazı Türü',
12 panelTitle: 'Yazı Türü',
13 voiceLabel: 'Font'
14} );
diff --git a/sources/plugins/font/lang/tt.js b/sources/plugins/font/lang/tt.js
new file mode 100644
index 00000000..46aec1e1
--- /dev/null
+++ b/sources/plugins/font/lang/tt.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'tt', {
6 fontSize: {
7 label: 'Зурлык',
8 voiceLabel: 'Шрифт зурлыклары',
9 panelTitle: 'Шрифт зурлыклары'
10 },
11 label: 'Шрифт',
12 panelTitle: 'Шрифт исеме',
13 voiceLabel: 'Шрифт'
14} );
diff --git a/sources/plugins/font/lang/ug.js b/sources/plugins/font/lang/ug.js
new file mode 100644
index 00000000..e50b5f0d
--- /dev/null
+++ b/sources/plugins/font/lang/ug.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'ug', {
6 fontSize: {
7 label: 'چوڭلۇقى',
8 voiceLabel: 'خەت چوڭلۇقى',
9 panelTitle: 'چوڭلۇقى'
10 },
11 label: 'خەت نۇسخا',
12 panelTitle: 'خەت نۇسخا',
13 voiceLabel: 'خەت نۇسخا'
14} );
diff --git a/sources/plugins/font/lang/uk.js b/sources/plugins/font/lang/uk.js
new file mode 100644
index 00000000..0867b73f
--- /dev/null
+++ b/sources/plugins/font/lang/uk.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'uk', {
6 fontSize: {
7 label: 'Розмір',
8 voiceLabel: 'Розмір шрифту',
9 panelTitle: 'Розмір'
10 },
11 label: 'Шрифт',
12 panelTitle: 'Шрифт',
13 voiceLabel: 'Шрифт'
14} );
diff --git a/sources/plugins/font/lang/vi.js b/sources/plugins/font/lang/vi.js
new file mode 100644
index 00000000..6b82356c
--- /dev/null
+++ b/sources/plugins/font/lang/vi.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'vi', {
6 fontSize: {
7 label: 'Cỡ chữ',
8 voiceLabel: 'Kích cỡ phông',
9 panelTitle: 'Cỡ chữ'
10 },
11 label: 'Phông',
12 panelTitle: 'Phông',
13 voiceLabel: 'Phông'
14} );
diff --git a/sources/plugins/font/lang/zh-cn.js b/sources/plugins/font/lang/zh-cn.js
new file mode 100644
index 00000000..8a297cb7
--- /dev/null
+++ b/sources/plugins/font/lang/zh-cn.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'zh-cn', {
6 fontSize: {
7 label: '大小',
8 voiceLabel: '文字大小',
9 panelTitle: '大小'
10 },
11 label: '字体',
12 panelTitle: '字体',
13 voiceLabel: '字体'
14} );
diff --git a/sources/plugins/font/lang/zh.js b/sources/plugins/font/lang/zh.js
new file mode 100644
index 00000000..091b94b5
--- /dev/null
+++ b/sources/plugins/font/lang/zh.js
@@ -0,0 +1,14 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'font', 'zh', {
6 fontSize: {
7 label: '大小',
8 voiceLabel: '字型大小',
9 panelTitle: '字型大小'
10 },
11 label: '字型',
12 panelTitle: '字型名稱',
13 voiceLabel: '字型'
14} );
diff --git a/sources/plugins/font/plugin.js b/sources/plugins/font/plugin.js
new file mode 100644
index 00000000..9db04108
--- /dev/null
+++ b/sources/plugins/font/plugin.js
@@ -0,0 +1,313 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 function addCombo( editor, comboName, styleType, lang, entries, defaultLabel, styleDefinition, order ) {
8 var config = editor.config,
9 style = new CKEDITOR.style( styleDefinition );
10
11 // Gets the list of fonts from the settings.
12 var names = entries.split( ';' ),
13 values = [];
14
15 // Create style objects for all fonts.
16 var styles = {};
17 for ( var i = 0; i < names.length; i++ ) {
18 var parts = names[ i ];
19
20 if ( parts ) {
21 parts = parts.split( '/' );
22
23 var vars = {},
24 name = names[ i ] = parts[ 0 ];
25
26 vars[ styleType ] = values[ i ] = parts[ 1 ] || name;
27
28 styles[ name ] = new CKEDITOR.style( styleDefinition, vars );
29 styles[ name ]._.definition.name = name;
30 } else {
31 names.splice( i--, 1 );
32 }
33 }
34
35 editor.ui.addRichCombo( comboName, {
36 label: lang.label,
37 title: lang.panelTitle,
38 toolbar: 'styles,' + order,
39 allowedContent: style,
40 requiredContent: style,
41
42 panel: {
43 css: [ CKEDITOR.skin.getPath( 'editor' ) ].concat( config.contentsCss ),
44 multiSelect: false,
45 attributes: { 'aria-label': lang.panelTitle }
46 },
47
48 init: function() {
49 this.startGroup( lang.panelTitle );
50
51 for ( var i = 0; i < names.length; i++ ) {
52 var name = names[ i ];
53
54 // Add the tag entry to the panel list.
55 this.add( name, styles[ name ].buildPreview(), name );
56 }
57 },
58
59 onClick: function( value ) {
60 editor.focus();
61 editor.fire( 'saveSnapshot' );
62
63 var previousValue = this.getValue(),
64 style = styles[ value ];
65
66 // When applying one style over another, first remove the previous one (#12403).
67 // NOTE: This is only a temporary fix. It will be moved to the styles system (#12687).
68 if ( previousValue && value != previousValue ) {
69 var previousStyle = styles[ previousValue ],
70 range = editor.getSelection().getRanges()[ 0 ];
71
72 // If the range is collapsed we can't simply use the editor.removeStyle method
73 // because it will remove the entire element and we want to split it instead.
74 if ( range.collapsed ) {
75 var path = editor.elementPath(),
76 // Find the style element.
77 matching = path.contains( function( el ) {
78 return previousStyle.checkElementRemovable( el );
79 } );
80
81 if ( matching ) {
82 var startBoundary = range.checkBoundaryOfElement( matching, CKEDITOR.START ),
83 endBoundary = range.checkBoundaryOfElement( matching, CKEDITOR.END ),
84 node, bm;
85
86 // If we are at both boundaries it means that the element is empty.
87 // Remove it but in a way that we won't lose other empty inline elements inside it.
88 // Example: <p>x<span style="font-size:48px"><em>[]</em></span>x</p>
89 // Result: <p>x<em>[]</em>x</p>
90 if ( startBoundary && endBoundary ) {
91 bm = range.createBookmark();
92 // Replace the element with its children (TODO element.replaceWithChildren).
93 while ( ( node = matching.getFirst() ) ) {
94 node.insertBefore( matching );
95 }
96 matching.remove();
97 range.moveToBookmark( bm );
98
99 // If we are at the boundary of the style element, just move out.
100 } else if ( startBoundary ) {
101 range.moveToPosition( matching, CKEDITOR.POSITION_BEFORE_START );
102 } else if ( endBoundary ) {
103 range.moveToPosition( matching, CKEDITOR.POSITION_AFTER_END );
104 } else {
105 // Split the element and clone the elements that were in the path
106 // (between the startContainer and the matching element)
107 // into the new place.
108 range.splitElement( matching );
109 range.moveToPosition( matching, CKEDITOR.POSITION_AFTER_END );
110 cloneSubtreeIntoRange( range, path.elements.slice(), matching );
111 }
112
113 editor.getSelection().selectRanges( [ range ] );
114 }
115 } else {
116 editor.removeStyle( previousStyle );
117 }
118 }
119
120 editor[ previousValue == value ? 'removeStyle' : 'applyStyle' ]( style );
121
122 editor.fire( 'saveSnapshot' );
123 },
124
125 onRender: function() {
126 editor.on( 'selectionChange', function( ev ) {
127 var currentValue = this.getValue();
128
129 var elementPath = ev.data.path,
130 elements = elementPath.elements;
131
132 // For each element into the elements path.
133 for ( var i = 0, element; i < elements.length; i++ ) {
134 element = elements[ i ];
135
136 // Check if the element is removable by any of
137 // the styles.
138 for ( var value in styles ) {
139 if ( styles[ value ].checkElementMatch( element, true, editor ) ) {
140 if ( value != currentValue )
141 this.setValue( value );
142 return;
143 }
144 }
145 }
146
147 // If no styles match, just empty it.
148 this.setValue( '', defaultLabel );
149 }, this );
150 },
151
152 refresh: function() {
153 if ( !editor.activeFilter.check( style ) )
154 this.setState( CKEDITOR.TRISTATE_DISABLED );
155 }
156 } );
157 }
158
159 // Clones the subtree between subtreeStart (exclusive) and the
160 // leaf (inclusive) and inserts it into the range.
161 //
162 // @param range
163 // @param {CKEDITOR.dom.element[]} elements Elements path in the standard order: leaf -> root.
164 // @param {CKEDITOR.dom.element/null} substreeStart The start of the subtree.
165 // If null, then the leaf belongs to the subtree.
166 function cloneSubtreeIntoRange( range, elements, subtreeStart ) {
167 var current = elements.pop();
168 if ( !current ) {
169 return;
170 }
171 // Rewind the elements array up to the subtreeStart and then start the real cloning.
172 if ( subtreeStart ) {
173 return cloneSubtreeIntoRange( range, elements, current.equals( subtreeStart ) ? null : subtreeStart );
174 }
175
176 var clone = current.clone();
177 range.insertNode( clone );
178 range.moveToPosition( clone, CKEDITOR.POSITION_AFTER_START );
179
180 cloneSubtreeIntoRange( range, elements );
181 }
182
183 CKEDITOR.plugins.add( 'font', {
184 requires: 'richcombo',
185 // jscs:disable maximumLineLength
186 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
187 // jscs:enable maximumLineLength
188 init: function( editor ) {
189 var config = editor.config;
190
191 addCombo( editor, 'Font', 'family', editor.lang.font, config.font_names, config.font_defaultLabel, config.font_style, 30 );
192 addCombo( editor, 'FontSize', 'size', editor.lang.font.fontSize, config.fontSize_sizes, config.fontSize_defaultLabel, config.fontSize_style, 40 );
193 }
194 } );
195} )();
196
197/**
198 * The list of fonts names to be displayed in the Font combo in the toolbar.
199 * Entries are separated by semi-colons (`';'`), while it's possible to have more
200 * than one font for each entry, in the HTML way (separated by comma).
201 *
202 * A display name may be optionally defined by prefixing the entries with the
203 * name and the slash character. For example, `'Arial/Arial, Helvetica, sans-serif'`
204 * will be displayed as `'Arial'` in the list, but will be outputted as
205 * `'Arial, Helvetica, sans-serif'`.
206 *
207 * config.font_names =
208 * 'Arial/Arial, Helvetica, sans-serif;' +
209 * 'Times New Roman/Times New Roman, Times, serif;' +
210 * 'Verdana';
211 *
212 * config.font_names = 'Arial;Times New Roman;Verdana';
213 *
214 * @cfg {String} [font_names=see source]
215 * @member CKEDITOR.config
216 */
217CKEDITOR.config.font_names = 'Arial/Arial, Helvetica, sans-serif;' +
218 'Comic Sans MS/Comic Sans MS, cursive;' +
219 'Courier New/Courier New, Courier, monospace;' +
220 'Georgia/Georgia, serif;' +
221 'Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;' +
222 'Tahoma/Tahoma, Geneva, sans-serif;' +
223 'Times New Roman/Times New Roman, Times, serif;' +
224 'Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;' +
225 'Verdana/Verdana, Geneva, sans-serif';
226
227/**
228 * The text to be displayed in the Font combo is none of the available values
229 * matches the current cursor position or text selection.
230 *
231 * // If the default site font is Arial, we may making it more explicit to the end user.
232 * config.font_defaultLabel = 'Arial';
233 *
234 * @cfg {String} [font_defaultLabel='']
235 * @member CKEDITOR.config
236 */
237CKEDITOR.config.font_defaultLabel = '';
238
239/**
240 * The style definition to be used to apply the font in the text.
241 *
242 * // This is actually the default value for it.
243 * config.font_style = {
244 * element: 'span',
245 * styles: { 'font-family': '#(family)' },
246 * overrides: [ { element: 'font', attributes: { 'face': null } } ]
247 * };
248 *
249 * @cfg {Object} [font_style=see example]
250 * @member CKEDITOR.config
251 */
252CKEDITOR.config.font_style = {
253 element: 'span',
254 styles: { 'font-family': '#(family)' },
255 overrides: [ {
256 element: 'font', attributes: { 'face': null }
257 } ]
258};
259
260/**
261 * The list of fonts size to be displayed in the Font Size combo in the
262 * toolbar. Entries are separated by semi-colons (`';'`).
263 *
264 * Any kind of "CSS like" size can be used, like `'12px'`, `'2.3em'`, `'130%'`,
265 * `'larger'` or `'x-small'`.
266 *
267 * A display name may be optionally defined by prefixing the entries with the
268 * name and the slash character. For example, `'Bigger Font/14px'` will be
269 * displayed as `'Bigger Font'` in the list, but will be outputted as `'14px'`.
270 *
271 * config.fontSize_sizes = '16/16px;24/24px;48/48px;';
272 *
273 * config.fontSize_sizes = '12px;2.3em;130%;larger;x-small';
274 *
275 * config.fontSize_sizes = '12 Pixels/12px;Big/2.3em;30 Percent More/130%;Bigger/larger;Very Small/x-small';
276 *
277 * @cfg {String} [fontSize_sizes=see source]
278 * @member CKEDITOR.config
279 */
280CKEDITOR.config.fontSize_sizes = '8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';
281
282/**
283 * The text to be displayed in the Font Size combo is none of the available
284 * values matches the current cursor position or text selection.
285 *
286 * // If the default site font size is 12px, we may making it more explicit to the end user.
287 * config.fontSize_defaultLabel = '12px';
288 *
289 * @cfg {String} [fontSize_defaultLabel='']
290 * @member CKEDITOR.config
291 */
292CKEDITOR.config.fontSize_defaultLabel = '';
293
294/**
295 * The style definition to be used to apply the font size in the text.
296 *
297 * // This is actually the default value for it.
298 * config.fontSize_style = {
299 * element: 'span',
300 * styles: { 'font-size': '#(size)' },
301 * overrides: [ { element :'font', attributes: { 'size': null } } ]
302 * };
303 *
304 * @cfg {Object} [fontSize_style=see example]
305 * @member CKEDITOR.config
306 */
307CKEDITOR.config.fontSize_style = {
308 element: 'span',
309 styles: { 'font-size': '#(size)' },
310 overrides: [ {
311 element: 'font', attributes: { 'size': null }
312 } ]
313};
diff --git a/sources/plugins/format/lang/af.js b/sources/plugins/format/lang/af.js
new file mode 100644
index 00000000..72d82517
--- /dev/null
+++ b/sources/plugins/format/lang/af.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'af', {
6 label: 'Opmaak',
7 panelTitle: 'Opmaak',
8 tag_address: 'Adres',
9 tag_div: 'Normaal (DIV)',
10 tag_h1: 'Opskrif 1',
11 tag_h2: 'Opskrif 2',
12 tag_h3: 'Opskrif 3',
13 tag_h4: 'Opskrif 4',
14 tag_h5: 'Opskrif 5',
15 tag_h6: 'Opskrif 6',
16 tag_p: 'Normaal',
17 tag_pre: 'Opgemaak'
18} );
diff --git a/sources/plugins/format/lang/ar.js b/sources/plugins/format/lang/ar.js
new file mode 100644
index 00000000..c0d75d82
--- /dev/null
+++ b/sources/plugins/format/lang/ar.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ar', {
6 label: 'تنسيق',
7 panelTitle: 'تنسيق الفقرة',
8 tag_address: 'عنوان',
9 tag_div: 'عادي (DIV)',
10 tag_h1: 'العنوان 1',
11 tag_h2: 'العنوان 2',
12 tag_h3: 'العنوان 3',
13 tag_h4: 'العنوان 4',
14 tag_h5: 'العنوان 5',
15 tag_h6: 'العنوان 6',
16 tag_p: 'عادي',
17 tag_pre: 'منسّق'
18} );
diff --git a/sources/plugins/format/lang/bg.js b/sources/plugins/format/lang/bg.js
new file mode 100644
index 00000000..241c3e46
--- /dev/null
+++ b/sources/plugins/format/lang/bg.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'bg', {
6 label: 'Формат',
7 panelTitle: 'Формат',
8 tag_address: 'Адрес',
9 tag_div: 'Параграф (DIV)',
10 tag_h1: 'Заглавие 1',
11 tag_h2: 'Заглавие 2',
12 tag_h3: 'Заглавие 3',
13 tag_h4: 'Заглавие 4',
14 tag_h5: 'Заглавие 5',
15 tag_h6: 'Заглавие 6',
16 tag_p: 'Нормален',
17 tag_pre: 'Форматиран'
18} );
diff --git a/sources/plugins/format/lang/bn.js b/sources/plugins/format/lang/bn.js
new file mode 100644
index 00000000..d2002c3d
--- /dev/null
+++ b/sources/plugins/format/lang/bn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'bn', {
6 label: 'ফন্ট ফরমেট',
7 panelTitle: 'ফন্ট ফরমেট',
8 tag_address: 'ঠিকানা',
9 tag_div: 'শীর্ষক (DIV)',
10 tag_h1: 'শীর্ষক ১',
11 tag_h2: 'শীর্ষক ২',
12 tag_h3: 'শীর্ষক ৩',
13 tag_h4: 'শীর্ষক ৪',
14 tag_h5: 'শীর্ষক ৫',
15 tag_h6: 'শীর্ষক ৬',
16 tag_p: 'সাধারণ',
17 tag_pre: 'ফর্মেটেড'
18} );
diff --git a/sources/plugins/format/lang/bs.js b/sources/plugins/format/lang/bs.js
new file mode 100644
index 00000000..236bd4dc
--- /dev/null
+++ b/sources/plugins/format/lang/bs.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'bs', {
6 label: 'Format',
7 panelTitle: 'Format',
8 tag_address: 'Address',
9 tag_div: 'Normal (DIV)', // MISSING
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/ca.js b/sources/plugins/format/lang/ca.js
new file mode 100644
index 00000000..379d09c1
--- /dev/null
+++ b/sources/plugins/format/lang/ca.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ca', {
6 label: 'Format',
7 panelTitle: 'Format',
8 tag_address: 'Adreça',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Encapçalament 1',
11 tag_h2: 'Encapçalament 2',
12 tag_h3: 'Encapçalament 3',
13 tag_h4: 'Encapçalament 4',
14 tag_h5: 'Encapçalament 5',
15 tag_h6: 'Encapçalament 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatejat'
18} );
diff --git a/sources/plugins/format/lang/cs.js b/sources/plugins/format/lang/cs.js
new file mode 100644
index 00000000..341c5e9f
--- /dev/null
+++ b/sources/plugins/format/lang/cs.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'cs', {
6 label: 'Formát',
7 panelTitle: 'Formát',
8 tag_address: 'Adresa',
9 tag_div: 'Normální (DIV)',
10 tag_h1: 'Nadpis 1',
11 tag_h2: 'Nadpis 2',
12 tag_h3: 'Nadpis 3',
13 tag_h4: 'Nadpis 4',
14 tag_h5: 'Nadpis 5',
15 tag_h6: 'Nadpis 6',
16 tag_p: 'Normální',
17 tag_pre: 'Naformátováno'
18} );
diff --git a/sources/plugins/format/lang/cy.js b/sources/plugins/format/lang/cy.js
new file mode 100644
index 00000000..8d9e7b46
--- /dev/null
+++ b/sources/plugins/format/lang/cy.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'cy', {
6 label: 'Fformat',
7 panelTitle: 'Fformat Paragraff',
8 tag_address: 'Cyfeiriad',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Pennawd 1',
11 tag_h2: 'Pennawd 2',
12 tag_h3: 'Pennawd 3',
13 tag_h4: 'Pennawd 4',
14 tag_h5: 'Pennawd 5',
15 tag_h6: 'Pennawd 6',
16 tag_p: 'Normal',
17 tag_pre: 'Wedi\'i Fformatio'
18} );
diff --git a/sources/plugins/format/lang/da.js b/sources/plugins/format/lang/da.js
new file mode 100644
index 00000000..ceb5ee6a
--- /dev/null
+++ b/sources/plugins/format/lang/da.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'da', {
6 label: 'Formatering',
7 panelTitle: 'Formatering',
8 tag_address: 'Adresse',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Overskrift 1',
11 tag_h2: 'Overskrift 2',
12 tag_h3: 'Overskrift 3',
13 tag_h4: 'Overskrift 4',
14 tag_h5: 'Overskrift 5',
15 tag_h6: 'Overskrift 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formateret'
18} );
diff --git a/sources/plugins/format/lang/de.js b/sources/plugins/format/lang/de.js
new file mode 100644
index 00000000..d37ffc1b
--- /dev/null
+++ b/sources/plugins/format/lang/de.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'de', {
6 label: 'Format',
7 panelTitle: 'Absatzformat',
8 tag_address: 'Adresse',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Überschrift 1',
11 tag_h2: 'Überschrift 2',
12 tag_h3: 'Überschrift 3',
13 tag_h4: 'Überschrift 4',
14 tag_h5: 'Überschrift 5',
15 tag_h6: 'Überschrift 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatiert'
18} );
diff --git a/sources/plugins/format/lang/el.js b/sources/plugins/format/lang/el.js
new file mode 100644
index 00000000..823e367d
--- /dev/null
+++ b/sources/plugins/format/lang/el.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'el', {
6 label: 'Μορφοποίηση',
7 panelTitle: 'Μορφοποίηση Παραγράφου',
8 tag_address: 'Διεύθυνση',
9 tag_div: 'Κανονική (DIV)',
10 tag_h1: 'Κεφαλίδα 1',
11 tag_h2: 'Κεφαλίδα 2',
12 tag_h3: 'Κεφαλίδα 3',
13 tag_h4: 'Κεφαλίδα 4',
14 tag_h5: 'Κεφαλίδα 5',
15 tag_h6: 'Κεφαλίδα 6',
16 tag_p: 'Κανονική',
17 tag_pre: 'Προ-μορφοποιημένη'
18} );
diff --git a/sources/plugins/format/lang/en-au.js b/sources/plugins/format/lang/en-au.js
new file mode 100644
index 00000000..366a7216
--- /dev/null
+++ b/sources/plugins/format/lang/en-au.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'en-au', {
6 label: 'Format',
7 panelTitle: 'Paragraph Format',
8 tag_address: 'Address',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/en-ca.js b/sources/plugins/format/lang/en-ca.js
new file mode 100644
index 00000000..e9d97e24
--- /dev/null
+++ b/sources/plugins/format/lang/en-ca.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'en-ca', {
6 label: 'Format',
7 panelTitle: 'Paragraph Format',
8 tag_address: 'Address',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/en-gb.js b/sources/plugins/format/lang/en-gb.js
new file mode 100644
index 00000000..5f2888dc
--- /dev/null
+++ b/sources/plugins/format/lang/en-gb.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'en-gb', {
6 label: 'Format',
7 panelTitle: 'Paragraph Format',
8 tag_address: 'Address',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/en.js b/sources/plugins/format/lang/en.js
new file mode 100644
index 00000000..cf73a290
--- /dev/null
+++ b/sources/plugins/format/lang/en.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'en', {
6 label: 'Format',
7 panelTitle: 'Paragraph Format',
8 tag_address: 'Address',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/eo.js b/sources/plugins/format/lang/eo.js
new file mode 100644
index 00000000..f8457afd
--- /dev/null
+++ b/sources/plugins/format/lang/eo.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'eo', {
6 label: 'Formato',
7 panelTitle: 'ParagrafFormato',
8 tag_address: 'Adreso',
9 tag_div: 'Normala (DIV)',
10 tag_h1: 'Titolo 1',
11 tag_h2: 'Titolo 2',
12 tag_h3: 'Titolo 3',
13 tag_h4: 'Titolo 4',
14 tag_h5: 'Titolo 5',
15 tag_h6: 'Titolo 6',
16 tag_p: 'Normala',
17 tag_pre: 'Formatita'
18} );
diff --git a/sources/plugins/format/lang/es.js b/sources/plugins/format/lang/es.js
new file mode 100644
index 00000000..c78c106d
--- /dev/null
+++ b/sources/plugins/format/lang/es.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'es', {
6 label: 'Formato',
7 panelTitle: 'Formato',
8 tag_address: 'Dirección',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Encabezado 1',
11 tag_h2: 'Encabezado 2',
12 tag_h3: 'Encabezado 3',
13 tag_h4: 'Encabezado 4',
14 tag_h5: 'Encabezado 5',
15 tag_h6: 'Encabezado 6',
16 tag_p: 'Normal',
17 tag_pre: 'Con formato'
18} );
diff --git a/sources/plugins/format/lang/et.js b/sources/plugins/format/lang/et.js
new file mode 100644
index 00000000..e4d5bb15
--- /dev/null
+++ b/sources/plugins/format/lang/et.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'et', {
6 label: 'Vorming',
7 panelTitle: 'Vorming',
8 tag_address: 'Aadress',
9 tag_div: 'Tavaline (DIV)',
10 tag_h1: 'Pealkiri 1',
11 tag_h2: 'Pealkiri 2',
12 tag_h3: 'Pealkiri 3',
13 tag_h4: 'Pealkiri 4',
14 tag_h5: 'Pealkiri 5',
15 tag_h6: 'Pealkiri 6',
16 tag_p: 'Tavaline',
17 tag_pre: 'Vormindatud'
18} );
diff --git a/sources/plugins/format/lang/eu.js b/sources/plugins/format/lang/eu.js
new file mode 100644
index 00000000..ad314cca
--- /dev/null
+++ b/sources/plugins/format/lang/eu.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'eu', {
6 label: 'Formatua',
7 panelTitle: 'Paragrafoaren formatua',
8 tag_address: 'Helbidea',
9 tag_div: 'Normala (DIV)',
10 tag_h1: 'Izenburua 1',
11 tag_h2: 'Izenburua 2',
12 tag_h3: 'Izenburua 3',
13 tag_h4: 'Izenburua 4',
14 tag_h5: 'Izenburua 5',
15 tag_h6: 'Izenburua 6',
16 tag_p: 'Normala',
17 tag_pre: 'Formatuduna'
18} );
diff --git a/sources/plugins/format/lang/fa.js b/sources/plugins/format/lang/fa.js
new file mode 100644
index 00000000..d9753818
--- /dev/null
+++ b/sources/plugins/format/lang/fa.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'fa', {
6 label: 'قالب',
7 panelTitle: 'قالب بند',
8 tag_address: 'نشانی',
9 tag_div: 'بند',
10 tag_h1: 'سرنویس ۱',
11 tag_h2: 'سرنویس ۲',
12 tag_h3: 'سرنویس ۳',
13 tag_h4: 'سرنویس ۴',
14 tag_h5: 'سرنویس ۵',
15 tag_h6: 'سرنویس ۶',
16 tag_p: 'معمولی',
17 tag_pre: 'قالب‌دار'
18} );
diff --git a/sources/plugins/format/lang/fi.js b/sources/plugins/format/lang/fi.js
new file mode 100644
index 00000000..8a1c83c2
--- /dev/null
+++ b/sources/plugins/format/lang/fi.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'fi', {
6 label: 'Muotoilu',
7 panelTitle: 'Muotoilu',
8 tag_address: 'Osoite',
9 tag_div: 'Normaali (DIV)',
10 tag_h1: 'Otsikko 1',
11 tag_h2: 'Otsikko 2',
12 tag_h3: 'Otsikko 3',
13 tag_h4: 'Otsikko 4',
14 tag_h5: 'Otsikko 5',
15 tag_h6: 'Otsikko 6',
16 tag_p: 'Normaali',
17 tag_pre: 'Muotoiltu'
18} );
diff --git a/sources/plugins/format/lang/fo.js b/sources/plugins/format/lang/fo.js
new file mode 100644
index 00000000..dc1109d3
--- /dev/null
+++ b/sources/plugins/format/lang/fo.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'fo', {
6 label: 'Skriftsnið',
7 panelTitle: 'Skriftsnið',
8 tag_address: 'Adressa',
9 tag_div: 'Vanligt (DIV)',
10 tag_h1: 'Yvirskrift 1',
11 tag_h2: 'Yvirskrift 2',
12 tag_h3: 'Yvirskrift 3',
13 tag_h4: 'Yvirskrift 4',
14 tag_h5: 'Yvirskrift 5',
15 tag_h6: 'Yvirskrift 6',
16 tag_p: 'Vanligt',
17 tag_pre: 'Sniðgivið'
18} );
diff --git a/sources/plugins/format/lang/fr-ca.js b/sources/plugins/format/lang/fr-ca.js
new file mode 100644
index 00000000..ef987245
--- /dev/null
+++ b/sources/plugins/format/lang/fr-ca.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'fr-ca', {
6 label: 'Format',
7 panelTitle: 'Format de paragraphe',
8 tag_address: 'Adresse',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'En-tête 1',
11 tag_h2: 'En-tête 2',
12 tag_h3: 'En-tête 3',
13 tag_h4: 'En-tête 4',
14 tag_h5: 'En-tête 5',
15 tag_h6: 'En-tête 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formaté'
18} );
diff --git a/sources/plugins/format/lang/fr.js b/sources/plugins/format/lang/fr.js
new file mode 100644
index 00000000..8d4499e2
--- /dev/null
+++ b/sources/plugins/format/lang/fr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'fr', {
6 label: 'Format',
7 panelTitle: 'Format de paragraphe',
8 tag_address: 'Adresse',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Titre 1',
11 tag_h2: 'Titre 2',
12 tag_h3: 'Titre 3',
13 tag_h4: 'Titre 4',
14 tag_h5: 'Titre 5',
15 tag_h6: 'Titre 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formaté'
18} );
diff --git a/sources/plugins/format/lang/gl.js b/sources/plugins/format/lang/gl.js
new file mode 100644
index 00000000..2259896e
--- /dev/null
+++ b/sources/plugins/format/lang/gl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'gl', {
6 label: 'Formato',
7 panelTitle: 'Formato do parágrafo',
8 tag_address: 'Enderezo',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Enacabezado 1',
11 tag_h2: 'Encabezado 2',
12 tag_h3: 'Encabezado 3',
13 tag_h4: 'Encabezado 4',
14 tag_h5: 'Encabezado 5',
15 tag_h6: 'Encabezado 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatado'
18} );
diff --git a/sources/plugins/format/lang/gu.js b/sources/plugins/format/lang/gu.js
new file mode 100644
index 00000000..110e060f
--- /dev/null
+++ b/sources/plugins/format/lang/gu.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'gu', {
6 label: 'ફૉન્ટ ફૉર્મટ, રચનાની શૈલી',
7 panelTitle: 'ફૉન્ટ ફૉર્મટ, રચનાની શૈલી',
8 tag_address: 'સરનામું',
9 tag_div: 'શીર્ષક (DIV)',
10 tag_h1: 'શીર્ષક 1',
11 tag_h2: 'શીર્ષક 2',
12 tag_h3: 'શીર્ષક 3',
13 tag_h4: 'શીર્ષક 4',
14 tag_h5: 'શીર્ષક 5',
15 tag_h6: 'શીર્ષક 6',
16 tag_p: 'સામાન્ય',
17 tag_pre: 'ફૉર્મટેડ'
18} );
diff --git a/sources/plugins/format/lang/he.js b/sources/plugins/format/lang/he.js
new file mode 100644
index 00000000..20e6b1b0
--- /dev/null
+++ b/sources/plugins/format/lang/he.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'he', {
6 label: 'עיצוב',
7 panelTitle: 'עיצוב',
8 tag_address: 'כתובת',
9 tag_div: 'נורמלי (DIV)',
10 tag_h1: 'כותרת',
11 tag_h2: 'כותרת 2',
12 tag_h3: 'כותרת 3',
13 tag_h4: 'כותרת 4',
14 tag_h5: 'כותרת 5',
15 tag_h6: 'כותרת 6',
16 tag_p: 'נורמלי',
17 tag_pre: 'קוד'
18} );
diff --git a/sources/plugins/format/lang/hi.js b/sources/plugins/format/lang/hi.js
new file mode 100644
index 00000000..c93716e3
--- /dev/null
+++ b/sources/plugins/format/lang/hi.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'hi', {
6 label: 'फ़ॉर्मैट',
7 panelTitle: 'फ़ॉर्मैट',
8 tag_address: 'पता',
9 tag_div: 'शीर्षक (DIV)',
10 tag_h1: 'शीर्षक 1',
11 tag_h2: 'शीर्षक 2',
12 tag_h3: 'शीर्षक 3',
13 tag_h4: 'शीर्षक 4',
14 tag_h5: 'शीर्षक 5',
15 tag_h6: 'शीर्षक 6',
16 tag_p: 'साधारण',
17 tag_pre: 'फ़ॉर्मैटॅड'
18} );
diff --git a/sources/plugins/format/lang/hr.js b/sources/plugins/format/lang/hr.js
new file mode 100644
index 00000000..b2464f2b
--- /dev/null
+++ b/sources/plugins/format/lang/hr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'hr', {
6 label: 'Format',
7 panelTitle: 'Format',
8 tag_address: 'Address',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatirano'
18} );
diff --git a/sources/plugins/format/lang/hu.js b/sources/plugins/format/lang/hu.js
new file mode 100644
index 00000000..aad0776d
--- /dev/null
+++ b/sources/plugins/format/lang/hu.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'hu', {
6 label: 'Formátum',
7 panelTitle: 'Formátum',
8 tag_address: 'Címsor',
9 tag_div: 'Bekezdés (DIV)',
10 tag_h1: 'Fejléc 1',
11 tag_h2: 'Fejléc 2',
12 tag_h3: 'Fejléc 3',
13 tag_h4: 'Fejléc 4',
14 tag_h5: 'Fejléc 5',
15 tag_h6: 'Fejléc 6',
16 tag_p: 'Normál',
17 tag_pre: 'Formázott'
18} );
diff --git a/sources/plugins/format/lang/id.js b/sources/plugins/format/lang/id.js
new file mode 100644
index 00000000..6fab9409
--- /dev/null
+++ b/sources/plugins/format/lang/id.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'id', {
6 label: 'Bentuk',
7 panelTitle: 'Bentuk Paragraf',
8 tag_address: 'Alamat',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Membentuk'
18} );
diff --git a/sources/plugins/format/lang/is.js b/sources/plugins/format/lang/is.js
new file mode 100644
index 00000000..fffe5b35
--- /dev/null
+++ b/sources/plugins/format/lang/is.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'is', {
6 label: 'Stílsnið',
7 panelTitle: 'Stílsnið',
8 tag_address: 'Vistfang',
9 tag_div: 'Venjulegt (DIV)',
10 tag_h1: 'Fyrirsögn 1',
11 tag_h2: 'Fyrirsögn 2',
12 tag_h3: 'Fyrirsögn 3',
13 tag_h4: 'Fyrirsögn 4',
14 tag_h5: 'Fyrirsögn 5',
15 tag_h6: 'Fyrirsögn 6',
16 tag_p: 'Venjulegt letur',
17 tag_pre: 'Forsniðið'
18} );
diff --git a/sources/plugins/format/lang/it.js b/sources/plugins/format/lang/it.js
new file mode 100644
index 00000000..d2ba4dc4
--- /dev/null
+++ b/sources/plugins/format/lang/it.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'it', {
6 label: 'Formato',
7 panelTitle: 'Formato',
8 tag_address: 'Indirizzo',
9 tag_div: 'Paragrafo (DIV)',
10 tag_h1: 'Titolo 1',
11 tag_h2: 'Titolo 2',
12 tag_h3: 'Titolo 3',
13 tag_h4: 'Titolo 4',
14 tag_h5: 'Titolo 5',
15 tag_h6: 'Titolo 6',
16 tag_p: 'Normale',
17 tag_pre: 'Formattato'
18} );
diff --git a/sources/plugins/format/lang/ja.js b/sources/plugins/format/lang/ja.js
new file mode 100644
index 00000000..8490389f
--- /dev/null
+++ b/sources/plugins/format/lang/ja.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ja', {
6 label: '書式',
7 panelTitle: '段落の書式',
8 tag_address: 'アドレス',
9 tag_div: '標準 (DIV)',
10 tag_h1: '見出し 1',
11 tag_h2: '見出し 2',
12 tag_h3: '見出し 3',
13 tag_h4: '見出し 4',
14 tag_h5: '見出し 5',
15 tag_h6: '見出し 6',
16 tag_p: '標準',
17 tag_pre: '書式付き'
18} );
diff --git a/sources/plugins/format/lang/ka.js b/sources/plugins/format/lang/ka.js
new file mode 100644
index 00000000..0544c0c4
--- /dev/null
+++ b/sources/plugins/format/lang/ka.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ka', {
6 label: 'ფიორმატირება',
7 panelTitle: 'ფორმატირება',
8 tag_address: 'მისამართი',
9 tag_div: 'ჩვეულებრივი (DIV)',
10 tag_h1: 'სათაური 1',
11 tag_h2: 'სათაური 2',
12 tag_h3: 'სათაური 3',
13 tag_h4: 'სათაური 4',
14 tag_h5: 'სათაური 5',
15 tag_h6: 'სათაური 6',
16 tag_p: 'ჩვეულებრივი',
17 tag_pre: 'ფორმატირებული'
18} );
diff --git a/sources/plugins/format/lang/km.js b/sources/plugins/format/lang/km.js
new file mode 100644
index 00000000..5196d9f6
--- /dev/null
+++ b/sources/plugins/format/lang/km.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'km', {
6 label: 'ទម្រង់',
7 panelTitle: 'ទម្រង់​កថាខណ្ឌ',
8 tag_address: 'អាសយដ្ឋាន',
9 tag_div: 'ធម្មតា (DIV)',
10 tag_h1: 'ចំណង​ជើង 1',
11 tag_h2: 'ចំណង​ជើង 2',
12 tag_h3: 'ចំណង​ជើង 3',
13 tag_h4: 'ចំណង​ជើង 4',
14 tag_h5: 'ចំណង​ជើង 5',
15 tag_h6: 'ចំណង​ជើង 6',
16 tag_p: 'ធម្មតា',
17 tag_pre: 'Formatted' // MISSING
18} );
diff --git a/sources/plugins/format/lang/ko.js b/sources/plugins/format/lang/ko.js
new file mode 100644
index 00000000..031ce8b2
--- /dev/null
+++ b/sources/plugins/format/lang/ko.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ko', {
6 label: '문단',
7 panelTitle: '문단 형식',
8 tag_address: '글쓴이',
9 tag_div: '기본 (DIV)',
10 tag_h1: '제목 1',
11 tag_h2: '제목 2',
12 tag_h3: '제목 3',
13 tag_h4: '제목 4',
14 tag_h5: '제목 5',
15 tag_h6: '제목 6',
16 tag_p: '본문',
17 tag_pre: '정형 문단'
18} );
diff --git a/sources/plugins/format/lang/ku.js b/sources/plugins/format/lang/ku.js
new file mode 100644
index 00000000..d1dbe951
--- /dev/null
+++ b/sources/plugins/format/lang/ku.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ku', {
6 label: 'ڕازاندنەوە',
7 panelTitle: 'بەشی ڕازاندنەوه',
8 tag_address: 'ناونیشان',
9 tag_div: '(DIV)-ی ئاسایی',
10 tag_h1: 'سەرنووسەی ١',
11 tag_h2: 'سەرنووسەی ٢',
12 tag_h3: 'سەرنووسەی ٣',
13 tag_h4: 'سەرنووسەی ٤',
14 tag_h5: 'سەرنووسەی ٥',
15 tag_h6: 'سەرنووسەی ٦',
16 tag_p: 'ئاسایی',
17 tag_pre: 'شێوازکراو'
18} );
diff --git a/sources/plugins/format/lang/lt.js b/sources/plugins/format/lang/lt.js
new file mode 100644
index 00000000..98cbcc38
--- /dev/null
+++ b/sources/plugins/format/lang/lt.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'lt', {
6 label: 'Šrifto formatas',
7 panelTitle: 'Šrifto formatas',
8 tag_address: 'Kreipinio',
9 tag_div: 'Normalus (DIV)',
10 tag_h1: 'Antraštinis 1',
11 tag_h2: 'Antraštinis 2',
12 tag_h3: 'Antraštinis 3',
13 tag_h4: 'Antraštinis 4',
14 tag_h5: 'Antraštinis 5',
15 tag_h6: 'Antraštinis 6',
16 tag_p: 'Normalus',
17 tag_pre: 'Formuotas'
18} );
diff --git a/sources/plugins/format/lang/lv.js b/sources/plugins/format/lang/lv.js
new file mode 100644
index 00000000..171ba5c6
--- /dev/null
+++ b/sources/plugins/format/lang/lv.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'lv', {
6 label: 'Formāts',
7 panelTitle: 'Formāts',
8 tag_address: 'Adrese',
9 tag_div: 'Rindkopa (DIV)',
10 tag_h1: 'Virsraksts 1',
11 tag_h2: 'Virsraksts 2',
12 tag_h3: 'Virsraksts 3',
13 tag_h4: 'Virsraksts 4',
14 tag_h5: 'Virsraksts 5',
15 tag_h6: 'Virsraksts 6',
16 tag_p: 'Normāls teksts',
17 tag_pre: 'Formatēts teksts'
18} );
diff --git a/sources/plugins/format/lang/mk.js b/sources/plugins/format/lang/mk.js
new file mode 100644
index 00000000..d1457ee6
--- /dev/null
+++ b/sources/plugins/format/lang/mk.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'mk', {
6 label: 'Format', // MISSING
7 panelTitle: 'Paragraph Format', // MISSING
8 tag_address: 'Address', // MISSING
9 tag_div: 'Normal (DIV)', // MISSING
10 tag_h1: 'Heading 1', // MISSING
11 tag_h2: 'Heading 2', // MISSING
12 tag_h3: 'Heading 3', // MISSING
13 tag_h4: 'Heading 4', // MISSING
14 tag_h5: 'Heading 5', // MISSING
15 tag_h6: 'Heading 6', // MISSING
16 tag_p: 'Normal', // MISSING
17 tag_pre: 'Formatted' // MISSING
18} );
diff --git a/sources/plugins/format/lang/mn.js b/sources/plugins/format/lang/mn.js
new file mode 100644
index 00000000..32c029bf
--- /dev/null
+++ b/sources/plugins/format/lang/mn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'mn', {
6 label: 'Параргафын загвар',
7 panelTitle: 'Параргафын загвар',
8 tag_address: 'Хаяг',
9 tag_div: 'Paragraph (DIV)',
10 tag_h1: 'Гарчиг 1',
11 tag_h2: 'Гарчиг 2',
12 tag_h3: 'Гарчиг 3',
13 tag_h4: 'Гарчиг 4',
14 tag_h5: 'Гарчиг 5',
15 tag_h6: 'Гарчиг 6',
16 tag_p: 'Хэвийн',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/ms.js b/sources/plugins/format/lang/ms.js
new file mode 100644
index 00000000..0fba201f
--- /dev/null
+++ b/sources/plugins/format/lang/ms.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ms', {
6 label: 'Format',
7 panelTitle: 'Format',
8 tag_address: 'Alamat',
9 tag_div: 'Perenggan (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Telah Diformat'
18} );
diff --git a/sources/plugins/format/lang/nb.js b/sources/plugins/format/lang/nb.js
new file mode 100644
index 00000000..dec4d829
--- /dev/null
+++ b/sources/plugins/format/lang/nb.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'nb', {
6 label: 'Format',
7 panelTitle: 'Avsnittsformat',
8 tag_address: 'Adresse',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Overskrift 1',
11 tag_h2: 'Overskrift 2',
12 tag_h3: 'Overskrift 3',
13 tag_h4: 'Overskrift 4',
14 tag_h5: 'Overskrift 5',
15 tag_h6: 'Overskrift 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatert'
18} );
diff --git a/sources/plugins/format/lang/nl.js b/sources/plugins/format/lang/nl.js
new file mode 100644
index 00000000..47747d98
--- /dev/null
+++ b/sources/plugins/format/lang/nl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'nl', {
6 label: 'Opmaak',
7 panelTitle: 'Opmaak',
8 tag_address: 'Adres',
9 tag_div: 'Normaal (DIV)',
10 tag_h1: 'Kop 1',
11 tag_h2: 'Kop 2',
12 tag_h3: 'Kop 3',
13 tag_h4: 'Kop 4',
14 tag_h5: 'Kop 5',
15 tag_h6: 'Kop 6',
16 tag_p: 'Normaal',
17 tag_pre: 'Met opmaak'
18} );
diff --git a/sources/plugins/format/lang/no.js b/sources/plugins/format/lang/no.js
new file mode 100644
index 00000000..af026709
--- /dev/null
+++ b/sources/plugins/format/lang/no.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'no', {
6 label: 'Format',
7 panelTitle: 'Avsnittsformat',
8 tag_address: 'Adresse',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Overskrift 1',
11 tag_h2: 'Overskrift 2',
12 tag_h3: 'Overskrift 3',
13 tag_h4: 'Overskrift 4',
14 tag_h5: 'Overskrift 5',
15 tag_h6: 'Overskrift 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatert'
18} );
diff --git a/sources/plugins/format/lang/pl.js b/sources/plugins/format/lang/pl.js
new file mode 100644
index 00000000..3ea349ea
--- /dev/null
+++ b/sources/plugins/format/lang/pl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'pl', {
6 label: 'Format',
7 panelTitle: 'Format',
8 tag_address: 'Adres',
9 tag_div: 'Normalny (DIV)',
10 tag_h1: 'Nagłówek 1',
11 tag_h2: 'Nagłówek 2',
12 tag_h3: 'Nagłówek 3',
13 tag_h4: 'Nagłówek 4',
14 tag_h5: 'Nagłówek 5',
15 tag_h6: 'Nagłówek 6',
16 tag_p: 'Normalny',
17 tag_pre: 'Tekst sformatowany'
18} );
diff --git a/sources/plugins/format/lang/pt-br.js b/sources/plugins/format/lang/pt-br.js
new file mode 100644
index 00000000..05ecc2cf
--- /dev/null
+++ b/sources/plugins/format/lang/pt-br.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'pt-br', {
6 label: 'Formatação',
7 panelTitle: 'Formatação',
8 tag_address: 'Endereço',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Título 1',
11 tag_h2: 'Título 2',
12 tag_h3: 'Título 3',
13 tag_h4: 'Título 4',
14 tag_h5: 'Título 5',
15 tag_h6: 'Título 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatado'
18} );
diff --git a/sources/plugins/format/lang/pt.js b/sources/plugins/format/lang/pt.js
new file mode 100644
index 00000000..5772729f
--- /dev/null
+++ b/sources/plugins/format/lang/pt.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'pt', {
6 label: 'Formatar',
7 panelTitle: 'Formatar Parágrafo',
8 tag_address: 'Endereço',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Título 1',
11 tag_h2: 'Título 2',
12 tag_h3: 'Título 3',
13 tag_h4: 'Título 4',
14 tag_h5: 'Título 5',
15 tag_h6: 'Título 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatado'
18} );
diff --git a/sources/plugins/format/lang/ro.js b/sources/plugins/format/lang/ro.js
new file mode 100644
index 00000000..b0ef79c6
--- /dev/null
+++ b/sources/plugins/format/lang/ro.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ro', {
6 label: 'Formatare',
7 panelTitle: 'Formatare',
8 tag_address: 'Adresă',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatat'
18} );
diff --git a/sources/plugins/format/lang/ru.js b/sources/plugins/format/lang/ru.js
new file mode 100644
index 00000000..04d15a04
--- /dev/null
+++ b/sources/plugins/format/lang/ru.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ru', {
6 label: 'Форматирование',
7 panelTitle: 'Форматирование',
8 tag_address: 'Адрес',
9 tag_div: 'Обычное (div)',
10 tag_h1: 'Заголовок 1',
11 tag_h2: 'Заголовок 2',
12 tag_h3: 'Заголовок 3',
13 tag_h4: 'Заголовок 4',
14 tag_h5: 'Заголовок 5',
15 tag_h6: 'Заголовок 6',
16 tag_p: 'Обычное',
17 tag_pre: 'Моноширинное'
18} );
diff --git a/sources/plugins/format/lang/si.js b/sources/plugins/format/lang/si.js
new file mode 100644
index 00000000..589c7c62
--- /dev/null
+++ b/sources/plugins/format/lang/si.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'si', {
6 label: 'ආකෘතිය',
7 panelTitle: 'චේදයේ ',
8 tag_address: 'ලිපිනය',
9 tag_div: 'සාමාන්‍ය(DIV)',
10 tag_h1: 'ශීර්ෂය 1',
11 tag_h2: 'ශීර්ෂය 2',
12 tag_h3: 'ශීර්ෂය 3',
13 tag_h4: 'ශීර්ෂය 4',
14 tag_h5: 'ශීර්ෂය 5',
15 tag_h6: 'ශීර්ෂය 6',
16 tag_p: 'සාමාන්‍ය',
17 tag_pre: 'ආකෘතියන්'
18} );
diff --git a/sources/plugins/format/lang/sk.js b/sources/plugins/format/lang/sk.js
new file mode 100644
index 00000000..e8117aac
--- /dev/null
+++ b/sources/plugins/format/lang/sk.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'sk', {
6 label: 'Formát',
7 panelTitle: 'Formát',
8 tag_address: 'Adresa',
9 tag_div: 'Normálny (DIV)',
10 tag_h1: 'Nadpis 1',
11 tag_h2: 'Nadpis 2',
12 tag_h3: 'Nadpis 3',
13 tag_h4: 'Nadpis 4',
14 tag_h5: 'Nadpis 5',
15 tag_h6: 'Nadpis 6',
16 tag_p: 'Normálny',
17 tag_pre: 'Formátovaný'
18} );
diff --git a/sources/plugins/format/lang/sl.js b/sources/plugins/format/lang/sl.js
new file mode 100644
index 00000000..3241cc57
--- /dev/null
+++ b/sources/plugins/format/lang/sl.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'sl', {
6 label: 'Oblika',
7 panelTitle: 'Oblika',
8 tag_address: 'Napis',
9 tag_div: 'Navaden (DIV)',
10 tag_h1: 'Naslov 1',
11 tag_h2: 'Naslov 2',
12 tag_h3: 'Naslov 3',
13 tag_h4: 'Naslov 4',
14 tag_h5: 'Naslov 5',
15 tag_h6: 'Naslov 6',
16 tag_p: 'Navaden',
17 tag_pre: 'Oblikovan'
18} );
diff --git a/sources/plugins/format/lang/sq.js b/sources/plugins/format/lang/sq.js
new file mode 100644
index 00000000..b03da03a
--- /dev/null
+++ b/sources/plugins/format/lang/sq.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'sq', {
6 label: 'Formati',
7 panelTitle: 'Formati i Paragrafit',
8 tag_address: 'Adresa',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Titulli 1',
11 tag_h2: 'Titulli 2',
12 tag_h3: 'Titulli 3',
13 tag_h4: 'Titulli 4',
14 tag_h5: 'Titulli 5',
15 tag_h6: 'Titulli 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatuar'
18} );
diff --git a/sources/plugins/format/lang/sr-latn.js b/sources/plugins/format/lang/sr-latn.js
new file mode 100644
index 00000000..d9bb0d2a
--- /dev/null
+++ b/sources/plugins/format/lang/sr-latn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'sr-latn', {
6 label: 'Format',
7 panelTitle: 'Format',
8 tag_address: 'Adresa',
9 tag_div: 'Normalno (DIV)',
10 tag_h1: 'Naslov 1',
11 tag_h2: 'Naslov 2',
12 tag_h3: 'Naslov 3',
13 tag_h4: 'Naslov 4',
14 tag_h5: 'Naslov 5',
15 tag_h6: 'Naslov 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatirano'
18} );
diff --git a/sources/plugins/format/lang/sr.js b/sources/plugins/format/lang/sr.js
new file mode 100644
index 00000000..4b6f3a85
--- /dev/null
+++ b/sources/plugins/format/lang/sr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'sr', {
6 label: 'Формат',
7 panelTitle: 'Формат',
8 tag_address: 'Adresa',
9 tag_div: 'Нормално (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatirano'
18} );
diff --git a/sources/plugins/format/lang/sv.js b/sources/plugins/format/lang/sv.js
new file mode 100644
index 00000000..4b89e8c5
--- /dev/null
+++ b/sources/plugins/format/lang/sv.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'sv', {
6 label: 'Teckenformat',
7 panelTitle: 'Teckenformat',
8 tag_address: 'Adress',
9 tag_div: 'Normal (DIV)',
10 tag_h1: 'Rubrik 1',
11 tag_h2: 'Rubrik 2',
12 tag_h3: 'Rubrik 3',
13 tag_h4: 'Rubrik 4',
14 tag_h5: 'Rubrik 5',
15 tag_h6: 'Rubrik 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formaterad'
18} );
diff --git a/sources/plugins/format/lang/th.js b/sources/plugins/format/lang/th.js
new file mode 100644
index 00000000..a103d66b
--- /dev/null
+++ b/sources/plugins/format/lang/th.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'th', {
6 label: 'รูปแบบ',
7 panelTitle: 'รูปแบบ',
8 tag_address: 'Address',
9 tag_div: 'Paragraph (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Normal',
17 tag_pre: 'Formatted'
18} );
diff --git a/sources/plugins/format/lang/tr.js b/sources/plugins/format/lang/tr.js
new file mode 100644
index 00000000..44b6262e
--- /dev/null
+++ b/sources/plugins/format/lang/tr.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'tr', {
6 label: 'Biçim',
7 panelTitle: 'Biçim',
8 tag_address: 'Adres',
9 tag_div: 'Paragraf (DIV)',
10 tag_h1: 'Başlık 1',
11 tag_h2: 'Başlık 2',
12 tag_h3: 'Başlık 3',
13 tag_h4: 'Başlık 4',
14 tag_h5: 'Başlık 5',
15 tag_h6: 'Başlık 6',
16 tag_p: 'Normal',
17 tag_pre: 'Biçimli'
18} );
diff --git a/sources/plugins/format/lang/tt.js b/sources/plugins/format/lang/tt.js
new file mode 100644
index 00000000..3b05f090
--- /dev/null
+++ b/sources/plugins/format/lang/tt.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'tt', {
6 label: 'Форматлау',
7 panelTitle: 'Параграф форматлавы',
8 tag_address: 'Адрес',
9 tag_div: 'Гади (DIV)',
10 tag_h1: 'Башлам 1',
11 tag_h2: 'Башлам 2',
12 tag_h3: 'Башлам 3',
13 tag_h4: 'Башлам 4',
14 tag_h5: 'Башлам 5',
15 tag_h6: 'Башлам 6',
16 tag_p: 'Гади',
17 tag_pre: 'Форматлаулы'
18} );
diff --git a/sources/plugins/format/lang/ug.js b/sources/plugins/format/lang/ug.js
new file mode 100644
index 00000000..e0d0d7a9
--- /dev/null
+++ b/sources/plugins/format/lang/ug.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'ug', {
6 label: 'پىچىم',
7 panelTitle: 'پىچىم',
8 tag_address: 'ئادرېس',
9 tag_div: 'ئابزاس (DIV)',
10 tag_h1: 'ماۋزۇ 1',
11 tag_h2: 'ماۋزۇ 2',
12 tag_h3: 'ماۋزۇ 3',
13 tag_h4: 'ماۋزۇ 4',
14 tag_h5: 'ماۋزۇ 5',
15 tag_h6: 'ماۋزۇ 6',
16 tag_p: 'ئادەتتىكى',
17 tag_pre: 'تىزىلغان پىچىم'
18} );
diff --git a/sources/plugins/format/lang/uk.js b/sources/plugins/format/lang/uk.js
new file mode 100644
index 00000000..87f64310
--- /dev/null
+++ b/sources/plugins/format/lang/uk.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'uk', {
6 label: 'Форматування',
7 panelTitle: 'Форматування параграфа',
8 tag_address: 'Адреса',
9 tag_div: 'Нормальний (div)',
10 tag_h1: 'Заголовок 1',
11 tag_h2: 'Заголовок 2',
12 tag_h3: 'Заголовок 3',
13 tag_h4: 'Заголовок 4',
14 tag_h5: 'Заголовок 5',
15 tag_h6: 'Заголовок 6',
16 tag_p: 'Нормальний',
17 tag_pre: 'Форматований'
18} );
diff --git a/sources/plugins/format/lang/vi.js b/sources/plugins/format/lang/vi.js
new file mode 100644
index 00000000..6f598d72
--- /dev/null
+++ b/sources/plugins/format/lang/vi.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'vi', {
6 label: 'Định dạng',
7 panelTitle: 'Định dạng',
8 tag_address: 'Address',
9 tag_div: 'Bình thường (DIV)',
10 tag_h1: 'Heading 1',
11 tag_h2: 'Heading 2',
12 tag_h3: 'Heading 3',
13 tag_h4: 'Heading 4',
14 tag_h5: 'Heading 5',
15 tag_h6: 'Heading 6',
16 tag_p: 'Bình thường (P)',
17 tag_pre: 'Đã thiết lập'
18} );
diff --git a/sources/plugins/format/lang/zh-cn.js b/sources/plugins/format/lang/zh-cn.js
new file mode 100644
index 00000000..cab5dff9
--- /dev/null
+++ b/sources/plugins/format/lang/zh-cn.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'zh-cn', {
6 label: '格式',
7 panelTitle: '格式',
8 tag_address: '地址',
9 tag_div: '段落(DIV)',
10 tag_h1: '标题 1',
11 tag_h2: '标题 2',
12 tag_h3: '标题 3',
13 tag_h4: '标题 4',
14 tag_h5: '标题 5',
15 tag_h6: '标题 6',
16 tag_p: '普通',
17 tag_pre: '已编排格式'
18} );
diff --git a/sources/plugins/format/lang/zh.js b/sources/plugins/format/lang/zh.js
new file mode 100644
index 00000000..13ad22a2
--- /dev/null
+++ b/sources/plugins/format/lang/zh.js
@@ -0,0 +1,18 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'format', 'zh', {
6 label: '格式',
7 panelTitle: '段落格式',
8 tag_address: '地址',
9 tag_div: '標準 (DIV)',
10 tag_h1: '標題 1',
11 tag_h2: '標題 2',
12 tag_h3: '標題 3',
13 tag_h4: '標題 4',
14 tag_h5: '標題 5',
15 tag_h6: '標題 6',
16 tag_p: '標準',
17 tag_pre: '格式設定'
18} );
diff --git a/sources/plugins/format/plugin.js b/sources/plugins/format/plugin.js
new file mode 100644
index 00000000..b9f9bc68
--- /dev/null
+++ b/sources/plugins/format/plugin.js
@@ -0,0 +1,279 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'format', {
7 requires: 'richcombo',
8 // jscs:disable maximumLineLength
9 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
10 // jscs:enable maximumLineLength
11 init: function( editor ) {
12 if ( editor.blockless )
13 return;
14
15 var config = editor.config,
16 lang = editor.lang.format;
17
18 // Gets the list of tags from the settings.
19 var tags = config.format_tags.split( ';' );
20
21 // Create style objects for all defined styles.
22 var styles = {},
23 stylesCount = 0,
24 allowedContent = [];
25 for ( var i = 0; i < tags.length; i++ ) {
26 var tag = tags[ i ];
27 var style = new CKEDITOR.style( config[ 'format_' + tag ] );
28 if ( !editor.filter.customConfig || editor.filter.check( style ) ) {
29 stylesCount++;
30 styles[ tag ] = style;
31 styles[ tag ]._.enterMode = editor.config.enterMode;
32 allowedContent.push( style );
33 }
34 }
35
36 // Hide entire combo when all formats are rejected.
37 if ( stylesCount === 0 )
38 return;
39
40 editor.ui.addRichCombo( 'Format', {
41 label: lang.label,
42 title: lang.panelTitle,
43 toolbar: 'styles,20',
44 allowedContent: allowedContent,
45
46 panel: {
47 css: [ CKEDITOR.skin.getPath( 'editor' ) ].concat( config.contentsCss ),
48 multiSelect: false,
49 attributes: { 'aria-label': lang.panelTitle }
50 },
51
52 init: function() {
53 this.startGroup( lang.panelTitle );
54
55 for ( var tag in styles ) {
56 var label = lang[ 'tag_' + tag ];
57
58 // Add the tag entry to the panel list.
59 this.add( tag, styles[ tag ].buildPreview( label ), label );
60 }
61 },
62
63 onClick: function( value ) {
64 editor.focus();
65 editor.fire( 'saveSnapshot' );
66
67 var style = styles[ value ],
68 elementPath = editor.elementPath();
69
70 editor[ style.checkActive( elementPath, editor ) ? 'removeStyle' : 'applyStyle' ]( style );
71
72 // Save the undo snapshot after all changes are affected. (#4899)
73 setTimeout( function() {
74 editor.fire( 'saveSnapshot' );
75 }, 0 );
76 },
77
78 onRender: function() {
79 editor.on( 'selectionChange', function( ev ) {
80 var currentTag = this.getValue(),
81 elementPath = ev.data.path;
82
83 this.refresh();
84
85 for ( var tag in styles ) {
86 if ( styles[ tag ].checkActive( elementPath, editor ) ) {
87 if ( tag != currentTag )
88 this.setValue( tag, editor.lang.format[ 'tag_' + tag ] );
89 return;
90 }
91 }
92
93 // If no styles match, just empty it.
94 this.setValue( '' );
95
96 }, this );
97 },
98
99 onOpen: function() {
100 this.showAll();
101 for ( var name in styles ) {
102 var style = styles[ name ];
103
104 // Check if that style is enabled in activeFilter.
105 if ( !editor.activeFilter.check( style ) )
106 this.hideItem( name );
107
108 }
109 },
110
111 refresh: function() {
112 var elementPath = editor.elementPath();
113
114 if ( !elementPath )
115 return;
116
117 // Check if element path contains 'p' element.
118 if ( !elementPath.isContextFor( 'p' ) ) {
119 this.setState( CKEDITOR.TRISTATE_DISABLED );
120 return;
121 }
122
123 // Check if there is any available style.
124 for ( var name in styles ) {
125 if ( editor.activeFilter.check( styles[ name ] ) )
126 return;
127 }
128 this.setState( CKEDITOR.TRISTATE_DISABLED );
129 }
130 } );
131 }
132} );
133
134/**
135 * A list of semicolon-separated style names (by default: tags) representing
136 * the style definition for each entry to be displayed in the Format drop-down list
137 * in the toolbar. Each entry must have a corresponding configuration in a
138 * setting named `'format_(tagName)'`. For example, the `'p'` entry has its
139 * definition taken from [config.format_p](#!/api/CKEDITOR.config-cfg-format_p).
140 *
141 * Read more in the [documentation](#!/guide/dev_format)
142 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
143 *
144 * config.format_tags = 'p;h2;h3;pre';
145 *
146 * @cfg {String} [format_tags='p;h1;h2;h3;h4;h5;h6;pre;address;div']
147 * @member CKEDITOR.config
148 */
149CKEDITOR.config.format_tags = 'p;h1;h2;h3;h4;h5;h6;pre;address;div';
150
151/**
152 * The style definition to be used to apply the `Normal` format.
153 *
154 * Read more in the [documentation](#!/guide/dev_format)
155 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
156 *
157 * config.format_p = { element: 'p', attributes: { 'class': 'normalPara' } };
158 *
159 * @cfg {Object} [format_p={ element: 'p' }]
160 * @member CKEDITOR.config
161 */
162CKEDITOR.config.format_p = { element: 'p' };
163
164/**
165 * The style definition to be used to apply the `Normal (DIV)` format.
166 *
167 * Read more in the [documentation](#!/guide/dev_format)
168 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
169 *
170 * config.format_div = { element: 'div', attributes: { 'class': 'normalDiv' } };
171 *
172 * @cfg {Object} [format_div={ element: 'div' }]
173 * @member CKEDITOR.config
174 */
175CKEDITOR.config.format_div = { element: 'div' };
176
177/**
178 * The style definition to be used to apply the `Formatted` format.
179 *
180 * Read more in the [documentation](#!/guide/dev_format)
181 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
182 *
183 * config.format_pre = { element: 'pre', attributes: { 'class': 'code' } };
184 *
185 * @cfg {Object} [format_pre={ element: 'pre' }]
186 * @member CKEDITOR.config
187 */
188CKEDITOR.config.format_pre = { element: 'pre' };
189
190/**
191 * The style definition to be used to apply the `Address` format.
192 *
193 * Read more in the [documentation](#!/guide/dev_format)
194 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
195 *
196 * config.format_address = { element: 'address', attributes: { 'class': 'styledAddress' } };
197 *
198 * @cfg {Object} [format_address={ element: 'address' }]
199 * @member CKEDITOR.config
200 */
201CKEDITOR.config.format_address = { element: 'address' };
202
203/**
204 * The style definition to be used to apply the `Heading 1` format.
205 *
206 * Read more in the [documentation](#!/guide/dev_format)
207 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
208 *
209 * config.format_h1 = { element: 'h1', attributes: { 'class': 'contentTitle1' } };
210 *
211 * @cfg {Object} [format_h1={ element: 'h1' }]
212 * @member CKEDITOR.config
213 */
214CKEDITOR.config.format_h1 = { element: 'h1' };
215
216/**
217 * The style definition to be used to apply the `Heading 2` format.
218 *
219 * Read more in the [documentation](#!/guide/dev_format)
220 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
221 *
222 * config.format_h2 = { element: 'h2', attributes: { 'class': 'contentTitle2' } };
223 *
224 * @cfg {Object} [format_h2={ element: 'h2' }]
225 * @member CKEDITOR.config
226 */
227CKEDITOR.config.format_h2 = { element: 'h2' };
228
229/**
230 * The style definition to be used to apply the `Heading 3` format.
231 *
232 * Read more in the [documentation](#!/guide/dev_format)
233 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
234 *
235 * config.format_h3 = { element: 'h3', attributes: { 'class': 'contentTitle3' } };
236 *
237 * @cfg {Object} [format_h3={ element: 'h3' }]
238 * @member CKEDITOR.config
239 */
240CKEDITOR.config.format_h3 = { element: 'h3' };
241
242/**
243 * The style definition to be used to apply the `Heading 4` format.
244 *
245 * Read more in the [documentation](#!/guide/dev_format)
246 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
247 *
248 * config.format_h4 = { element: 'h4', attributes: { 'class': 'contentTitle4' } };
249 *
250 * @cfg {Object} [format_h4={ element: 'h4' }]
251 * @member CKEDITOR.config
252 */
253CKEDITOR.config.format_h4 = { element: 'h4' };
254
255/**
256 * The style definition to be used to apply the `Heading 5` format.
257 *
258 * Read more in the [documentation](#!/guide/dev_format)
259 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
260 *
261 * config.format_h5 = { element: 'h5', attributes: { 'class': 'contentTitle5' } };
262 *
263 * @cfg {Object} [format_h5={ element: 'h5' }]
264 * @member CKEDITOR.config
265 */
266CKEDITOR.config.format_h5 = { element: 'h5' };
267
268/**
269 * The style definition to be used to apply the `Heading 6` format.
270 *
271 * Read more in the [documentation](#!/guide/dev_format)
272 * and see the [SDK sample](http://sdk.ckeditor.com/samples/format.html).
273 *
274 * config.format_h6 = { element: 'h6', attributes: { 'class': 'contentTitle6' } };
275 *
276 * @cfg {Object} [format_h6={ element: 'h6' }]
277 * @member CKEDITOR.config
278 */
279CKEDITOR.config.format_h6 = { element: 'h6' };
diff --git a/sources/plugins/forms/dialogs/button.js b/sources/plugins/forms/dialogs/button.js
new file mode 100644
index 00000000..b0dd161c
--- /dev/null
+++ b/sources/plugins/forms/dialogs/button.js
@@ -0,0 +1,100 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'button', function( editor ) {
7 function commitAttributes( element ) {
8 var val = this.getValue();
9 if ( val ) {
10 element.attributes[ this.id ] = val;
11 if ( this.id == 'name' )
12 element.attributes[ 'data-cke-saved-name' ] = val;
13 } else {
14 delete element.attributes[ this.id ];
15 if ( this.id == 'name' )
16 delete element.attributes[ 'data-cke-saved-name' ];
17 }
18 }
19
20 return {
21 title: editor.lang.forms.button.title,
22 minWidth: 350,
23 minHeight: 150,
24 onShow: function() {
25 delete this.button;
26 var element = this.getParentEditor().getSelection().getSelectedElement();
27 if ( element && element.is( 'input' ) ) {
28 var type = element.getAttribute( 'type' );
29 if ( type in { button: 1, reset: 1, submit: 1 } ) {
30 this.button = element;
31 this.setupContent( element );
32 }
33 }
34 },
35 onOk: function() {
36 var editor = this.getParentEditor(),
37 element = this.button,
38 isInsertMode = !element;
39
40 var fake = element ? CKEDITOR.htmlParser.fragment.fromHtml( element.getOuterHtml() ).children[ 0 ] : new CKEDITOR.htmlParser.element( 'input' );
41 this.commitContent( fake );
42
43 var writer = new CKEDITOR.htmlParser.basicWriter();
44 fake.writeHtml( writer );
45 var newElement = CKEDITOR.dom.element.createFromHtml( writer.getHtml(), editor.document );
46
47 if ( isInsertMode )
48 editor.insertElement( newElement );
49 else {
50 newElement.replace( element );
51 editor.getSelection().selectElement( newElement );
52 }
53 },
54 contents: [ {
55 id: 'info',
56 label: editor.lang.forms.button.title,
57 title: editor.lang.forms.button.title,
58 elements: [
59 {
60 id: 'name',
61 type: 'text',
62 bidi: true,
63 label: editor.lang.common.name,
64 'default': '',
65 setup: function( element ) {
66 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
67 },
68 commit: commitAttributes
69 },
70 {
71 id: 'value',
72 type: 'text',
73 label: editor.lang.forms.button.text,
74 accessKey: 'V',
75 'default': '',
76 setup: function( element ) {
77 this.setValue( element.getAttribute( 'value' ) || '' );
78 },
79 commit: commitAttributes
80 },
81 {
82 id: 'type',
83 type: 'select',
84 label: editor.lang.forms.button.type,
85 'default': 'button',
86 accessKey: 'T',
87 items: [
88 [ editor.lang.forms.button.typeBtn, 'button' ],
89 [ editor.lang.forms.button.typeSbm, 'submit' ],
90 [ editor.lang.forms.button.typeRst, 'reset' ]
91 ],
92 setup: function( element ) {
93 this.setValue( element.getAttribute( 'type' ) || '' );
94 },
95 commit: commitAttributes
96 }
97 ]
98 } ]
99 };
100} );
diff --git a/sources/plugins/forms/dialogs/checkbox.js b/sources/plugins/forms/dialogs/checkbox.js
new file mode 100644
index 00000000..0bfda9ba
--- /dev/null
+++ b/sources/plugins/forms/dialogs/checkbox.js
@@ -0,0 +1,146 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'checkbox', function( editor ) {
7 return {
8 title: editor.lang.forms.checkboxAndRadio.checkboxTitle,
9 minWidth: 350,
10 minHeight: 140,
11 onShow: function() {
12 delete this.checkbox;
13
14 var element = this.getParentEditor().getSelection().getSelectedElement();
15
16 if ( element && element.getAttribute( 'type' ) == 'checkbox' ) {
17 this.checkbox = element;
18 this.setupContent( element );
19 }
20 },
21 onOk: function() {
22 var editor,
23 element = this.checkbox,
24 isInsertMode = !element;
25
26 if ( isInsertMode ) {
27 editor = this.getParentEditor();
28 element = editor.document.createElement( 'input' );
29 element.setAttribute( 'type', 'checkbox' );
30 editor.insertElement( element );
31 }
32 this.commitContent( { element: element } );
33 },
34 contents: [ {
35 id: 'info',
36 label: editor.lang.forms.checkboxAndRadio.checkboxTitle,
37 title: editor.lang.forms.checkboxAndRadio.checkboxTitle,
38 startupFocus: 'txtName',
39 elements: [ {
40 id: 'txtName',
41 type: 'text',
42 label: editor.lang.common.name,
43 'default': '',
44 accessKey: 'N',
45 setup: function( element ) {
46 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
47 },
48 commit: function( data ) {
49 var element = data.element;
50
51 // IE failed to update 'name' property on input elements, protect it now.
52 if ( this.getValue() )
53 element.data( 'cke-saved-name', this.getValue() );
54 else {
55 element.data( 'cke-saved-name', false );
56 element.removeAttribute( 'name' );
57 }
58 }
59 },
60 {
61 id: 'txtValue',
62 type: 'text',
63 label: editor.lang.forms.checkboxAndRadio.value,
64 'default': '',
65 accessKey: 'V',
66 setup: function( element ) {
67 var value = element.getAttribute( 'value' );
68 // IE Return 'on' as default attr value.
69 this.setValue( CKEDITOR.env.ie && value == 'on' ? '' : value );
70 },
71 commit: function( data ) {
72 var element = data.element,
73 value = this.getValue();
74
75 if ( value && !( CKEDITOR.env.ie && value == 'on' ) )
76 element.setAttribute( 'value', value );
77 else {
78 if ( CKEDITOR.env.ie ) {
79 // Remove attribute 'value' of checkbox (#4721).
80 var checkbox = new CKEDITOR.dom.element( 'input', element.getDocument() );
81 element.copyAttributes( checkbox, { value: 1 } );
82 checkbox.replace( element );
83 editor.getSelection().selectElement( checkbox );
84 data.element = checkbox;
85 } else {
86 element.removeAttribute( 'value' );
87 }
88 }
89 }
90 },
91 {
92 id: 'cmbSelected',
93 type: 'checkbox',
94 label: editor.lang.forms.checkboxAndRadio.selected,
95 'default': '',
96 accessKey: 'S',
97 value: 'checked',
98 setup: function( element ) {
99 this.setValue( element.getAttribute( 'checked' ) );
100 },
101 commit: function( data ) {
102 var element = data.element;
103
104 if ( CKEDITOR.env.ie ) {
105 var isElementChecked = !!element.getAttribute( 'checked' ),
106 isChecked = !!this.getValue();
107
108 if ( isElementChecked != isChecked ) {
109 var replace = CKEDITOR.dom.element.createFromHtml( '<input type="checkbox"' + ( isChecked ? ' checked="checked"' : '' ) +
110 '/>', editor.document );
111
112 element.copyAttributes( replace, { type: 1, checked: 1 } );
113 replace.replace( element );
114 editor.getSelection().selectElement( replace );
115 data.element = replace;
116 }
117 } else {
118 var value = this.getValue();
119 if ( value )
120 element.setAttribute( 'checked', 'checked' );
121 else
122 element.removeAttribute( 'checked' );
123 }
124 }
125 },
126 {
127 id: 'required',
128 type: 'checkbox',
129 label: editor.lang.forms.checkboxAndRadio.required,
130 'default': '',
131 accessKey: 'Q',
132 value: 'required',
133 setup: function( element ) {
134 this.setValue( element.getAttribute( 'required' ) );
135 },
136 commit: function( data ) {
137 var element = data.element;
138 if ( this.getValue() )
139 element.setAttribute( 'required', 'required' );
140 else
141 element.removeAttribute( 'required' );
142 }
143 } ]
144 } ]
145 };
146} );
diff --git a/sources/plugins/forms/dialogs/form.js b/sources/plugins/forms/dialogs/form.js
new file mode 100644
index 00000000..256b0544
--- /dev/null
+++ b/sources/plugins/forms/dialogs/form.js
@@ -0,0 +1,145 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'form', function( editor ) {
7 var autoAttributes = { action: 1, id: 1, method: 1, enctype: 1, target: 1 };
8
9 return {
10 title: editor.lang.forms.form.title,
11 minWidth: 350,
12 minHeight: 200,
13 onShow: function() {
14 delete this.form;
15
16 var path = this.getParentEditor().elementPath(),
17 form = path.contains( 'form', 1 );
18
19 if ( form ) {
20 this.form = form;
21 this.setupContent( form );
22 }
23 },
24 onOk: function() {
25 var editor,
26 element = this.form,
27 isInsertMode = !element;
28
29 if ( isInsertMode ) {
30 editor = this.getParentEditor();
31 element = editor.document.createElement( 'form' );
32 element.appendBogus();
33 }
34
35 if ( isInsertMode )
36 editor.insertElement( element );
37 this.commitContent( element );
38 },
39 onLoad: function() {
40 function autoSetup( element ) {
41 this.setValue( element.getAttribute( this.id ) || '' );
42 }
43
44 function autoCommit( element ) {
45 if ( this.getValue() )
46 element.setAttribute( this.id, this.getValue() );
47 else
48 element.removeAttribute( this.id );
49 }
50
51 this.foreach( function( contentObj ) {
52 if ( autoAttributes[ contentObj.id ] ) {
53 contentObj.setup = autoSetup;
54 contentObj.commit = autoCommit;
55 }
56 } );
57 },
58 contents: [ {
59 id: 'info',
60 label: editor.lang.forms.form.title,
61 title: editor.lang.forms.form.title,
62 elements: [ {
63 id: 'txtName',
64 bidi: true,
65 type: 'text',
66 label: editor.lang.common.name,
67 'default': '',
68 accessKey: 'N',
69 setup: function( element ) {
70 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
71 },
72 commit: function( element ) {
73 if ( this.getValue() )
74 element.data( 'cke-saved-name', this.getValue() );
75 else {
76 element.data( 'cke-saved-name', false );
77 element.removeAttribute( 'name' );
78 }
79 }
80 },
81 {
82 id: 'action',
83 type: 'text',
84 label: editor.lang.forms.form.action,
85 'default': '',
86 accessKey: 'T'
87 },
88 {
89 type: 'hbox',
90 widths: [ '45%', '55%' ],
91 children: [ {
92 id: 'id',
93 type: 'text',
94 label: editor.lang.common.id,
95 'default': '',
96 accessKey: 'I'
97 },
98 {
99 id: 'enctype',
100 type: 'select',
101 label: editor.lang.forms.form.encoding,
102 style: 'width:100%',
103 accessKey: 'E',
104 'default': '',
105 items: [
106 [ '' ],
107 [ 'text/plain' ],
108 [ 'multipart/form-data' ],
109 [ 'application/x-www-form-urlencoded' ]
110 ]
111 } ]
112 },
113 {
114 type: 'hbox',
115 widths: [ '45%', '55%' ],
116 children: [ {
117 id: 'target',
118 type: 'select',
119 label: editor.lang.common.target,
120 style: 'width:100%',
121 accessKey: 'M',
122 'default': '',
123 items: [
124 [ editor.lang.common.notSet, '' ],
125 [ editor.lang.common.targetNew, '_blank' ],
126 [ editor.lang.common.targetTop, '_top' ],
127 [ editor.lang.common.targetSelf, '_self' ],
128 [ editor.lang.common.targetParent, '_parent' ]
129 ]
130 },
131 {
132 id: 'method',
133 type: 'select',
134 label: editor.lang.forms.form.method,
135 accessKey: 'M',
136 'default': 'GET',
137 items: [
138 [ 'GET', 'get' ],
139 [ 'POST', 'post' ]
140 ]
141 } ]
142 } ]
143 } ]
144 };
145} );
diff --git a/sources/plugins/forms/dialogs/hiddenfield.js b/sources/plugins/forms/dialogs/hiddenfield.js
new file mode 100644
index 00000000..b4e0fe3b
--- /dev/null
+++ b/sources/plugins/forms/dialogs/hiddenfield.js
@@ -0,0 +1,83 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'hiddenfield', function( editor ) {
7 return {
8 title: editor.lang.forms.hidden.title,
9 hiddenField: null,
10 minWidth: 350,
11 minHeight: 110,
12 onShow: function() {
13 delete this.hiddenField;
14
15 var editor = this.getParentEditor(),
16 selection = editor.getSelection(),
17 element = selection.getSelectedElement();
18
19 if ( element && element.data( 'cke-real-element-type' ) && element.data( 'cke-real-element-type' ) == 'hiddenfield' ) {
20 this.hiddenField = element;
21 element = editor.restoreRealElement( this.hiddenField );
22 this.setupContent( element );
23 selection.selectElement( this.hiddenField );
24 }
25 },
26 onOk: function() {
27 var name = this.getValueOf( 'info', '_cke_saved_name' ),
28 editor = this.getParentEditor(),
29 element = CKEDITOR.env.ie && CKEDITOR.document.$.documentMode < 8 ?
30 editor.document.createElement( '<input name="' + CKEDITOR.tools.htmlEncode( name ) + '">' ) :
31 editor.document.createElement( 'input' );
32
33 element.setAttribute( 'type', 'hidden' );
34 this.commitContent( element );
35 var fakeElement = editor.createFakeElement( element, 'cke_hidden', 'hiddenfield' );
36 if ( !this.hiddenField )
37 editor.insertElement( fakeElement );
38 else {
39 fakeElement.replace( this.hiddenField );
40 editor.getSelection().selectElement( fakeElement );
41 }
42 return true;
43 },
44 contents: [ {
45 id: 'info',
46 label: editor.lang.forms.hidden.title,
47 title: editor.lang.forms.hidden.title,
48 elements: [ {
49 id: '_cke_saved_name',
50 type: 'text',
51 label: editor.lang.forms.hidden.name,
52 'default': '',
53 accessKey: 'N',
54 setup: function( element ) {
55 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
56 },
57 commit: function( element ) {
58 if ( this.getValue() )
59 element.setAttribute( 'name', this.getValue() );
60 else
61 element.removeAttribute( 'name' );
62
63 }
64 },
65 {
66 id: 'value',
67 type: 'text',
68 label: editor.lang.forms.hidden.value,
69 'default': '',
70 accessKey: 'V',
71 setup: function( element ) {
72 this.setValue( element.getAttribute( 'value' ) || '' );
73 },
74 commit: function( element ) {
75 if ( this.getValue() )
76 element.setAttribute( 'value', this.getValue() );
77 else
78 element.removeAttribute( 'value' );
79 }
80 } ]
81 } ]
82 };
83} );
diff --git a/sources/plugins/forms/dialogs/radio.js b/sources/plugins/forms/dialogs/radio.js
new file mode 100644
index 00000000..a9214e41
--- /dev/null
+++ b/sources/plugins/forms/dialogs/radio.js
@@ -0,0 +1,129 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5CKEDITOR.dialog.add( 'radio', function( editor ) {
6 return {
7 title: editor.lang.forms.checkboxAndRadio.radioTitle,
8 minWidth: 350,
9 minHeight: 140,
10 onShow: function() {
11 delete this.radioButton;
12
13 var element = this.getParentEditor().getSelection().getSelectedElement();
14 if ( element && element.getName() == 'input' && element.getAttribute( 'type' ) == 'radio' ) {
15 this.radioButton = element;
16 this.setupContent( element );
17 }
18 },
19 onOk: function() {
20 var editor,
21 element = this.radioButton,
22 isInsertMode = !element;
23
24 if ( isInsertMode ) {
25 editor = this.getParentEditor();
26 element = editor.document.createElement( 'input' );
27 element.setAttribute( 'type', 'radio' );
28 }
29
30 if ( isInsertMode )
31 editor.insertElement( element );
32 this.commitContent( { element: element } );
33 },
34 contents: [ {
35 id: 'info',
36 label: editor.lang.forms.checkboxAndRadio.radioTitle,
37 title: editor.lang.forms.checkboxAndRadio.radioTitle,
38 elements: [ {
39 id: 'name',
40 type: 'text',
41 label: editor.lang.common.name,
42 'default': '',
43 accessKey: 'N',
44 setup: function( element ) {
45 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
46 },
47 commit: function( data ) {
48 var element = data.element;
49
50 if ( this.getValue() )
51 element.data( 'cke-saved-name', this.getValue() );
52 else {
53 element.data( 'cke-saved-name', false );
54 element.removeAttribute( 'name' );
55 }
56 }
57 },
58 {
59 id: 'value',
60 type: 'text',
61 label: editor.lang.forms.checkboxAndRadio.value,
62 'default': '',
63 accessKey: 'V',
64 setup: function( element ) {
65 this.setValue( element.getAttribute( 'value' ) || '' );
66 },
67 commit: function( data ) {
68 var element = data.element;
69
70 if ( this.getValue() )
71 element.setAttribute( 'value', this.getValue() );
72 else
73 element.removeAttribute( 'value' );
74 }
75 },
76 {
77 id: 'checked',
78 type: 'checkbox',
79 label: editor.lang.forms.checkboxAndRadio.selected,
80 'default': '',
81 accessKey: 'S',
82 value: 'checked',
83 setup: function( element ) {
84 this.setValue( element.getAttribute( 'checked' ) );
85 },
86 commit: function( data ) {
87 var element = data.element;
88
89 if ( !CKEDITOR.env.ie ) {
90 if ( this.getValue() )
91 element.setAttribute( 'checked', 'checked' );
92 else
93 element.removeAttribute( 'checked' );
94 } else {
95 var isElementChecked = element.getAttribute( 'checked' );
96 var isChecked = !!this.getValue();
97
98 if ( isElementChecked != isChecked ) {
99 var replace = CKEDITOR.dom.element.createFromHtml( '<input type="radio"' + ( isChecked ? ' checked="checked"' : '' ) +
100 '></input>', editor.document );
101 element.copyAttributes( replace, { type: 1, checked: 1 } );
102 replace.replace( element );
103 editor.getSelection().selectElement( replace );
104 data.element = replace;
105 }
106 }
107 }
108 },
109 {
110 id: 'required',
111 type: 'checkbox',
112 label: editor.lang.forms.checkboxAndRadio.required,
113 'default': '',
114 accessKey: 'Q',
115 value: 'required',
116 setup: function( element ) {
117 this.setValue( element.getAttribute( 'required' ) );
118 },
119 commit: function( data ) {
120 var element = data.element;
121 if ( this.getValue() )
122 element.setAttribute( 'required', 'required' );
123 else
124 element.removeAttribute( 'required' );
125 }
126 } ]
127 } ]
128 };
129} );
diff --git a/sources/plugins/forms/dialogs/select.js b/sources/plugins/forms/dialogs/select.js
new file mode 100644
index 00000000..38842c20
--- /dev/null
+++ b/sources/plugins/forms/dialogs/select.js
@@ -0,0 +1,505 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5CKEDITOR.dialog.add( 'select', function( editor ) {
6 // Add a new option to a SELECT object (combo or list).
7 function addOption( combo, optionText, optionValue, documentObject, index ) {
8 combo = getSelect( combo );
9 var oOption;
10 if ( documentObject )
11 oOption = documentObject.createElement( 'OPTION' );
12 else
13 oOption = document.createElement( 'OPTION' );
14
15 if ( combo && oOption && oOption.getName() == 'option' ) {
16 if ( CKEDITOR.env.ie ) {
17 if ( !isNaN( parseInt( index, 10 ) ) )
18 combo.$.options.add( oOption.$, index );
19 else
20 combo.$.options.add( oOption.$ );
21
22 oOption.$.innerHTML = optionText.length > 0 ? optionText : '';
23 oOption.$.value = optionValue;
24 } else {
25 if ( index !== null && index < combo.getChildCount() )
26 combo.getChild( index < 0 ? 0 : index ).insertBeforeMe( oOption );
27 else
28 combo.append( oOption );
29
30 oOption.setText( optionText.length > 0 ? optionText : '' );
31 oOption.setValue( optionValue );
32 }
33 } else {
34 return false;
35 }
36
37 return oOption;
38 }
39 // Remove all selected options from a SELECT object.
40 function removeSelectedOptions( combo ) {
41 combo = getSelect( combo );
42
43 // Save the selected index
44 var iSelectedIndex = getSelectedIndex( combo );
45
46 // Remove all selected options.
47 for ( var i = combo.getChildren().count() - 1; i >= 0; i-- ) {
48 if ( combo.getChild( i ).$.selected )
49 combo.getChild( i ).remove();
50 }
51
52 // Reset the selection based on the original selected index.
53 setSelectedIndex( combo, iSelectedIndex );
54 }
55 //Modify option from a SELECT object.
56 function modifyOption( combo, index, title, value ) {
57 combo = getSelect( combo );
58 if ( index < 0 )
59 return false;
60 var child = combo.getChild( index );
61 child.setText( title );
62 child.setValue( value );
63 return child;
64 }
65
66 function removeAllOptions( combo ) {
67 combo = getSelect( combo );
68 while ( combo.getChild( 0 ) && combo.getChild( 0 ).remove() ) {
69
70 }
71 }
72 // Moves the selected option by a number of steps (also negative).
73 function changeOptionPosition( combo, steps, documentObject ) {
74 combo = getSelect( combo );
75 var iActualIndex = getSelectedIndex( combo );
76 if ( iActualIndex < 0 )
77 return false;
78
79 var iFinalIndex = iActualIndex + steps;
80 iFinalIndex = ( iFinalIndex < 0 ) ? 0 : iFinalIndex;
81 iFinalIndex = ( iFinalIndex >= combo.getChildCount() ) ? combo.getChildCount() - 1 : iFinalIndex;
82
83 if ( iActualIndex == iFinalIndex )
84 return false;
85
86 var oOption = combo.getChild( iActualIndex ),
87 sText = oOption.getText(),
88 sValue = oOption.getValue();
89
90 oOption.remove();
91
92 oOption = addOption( combo, sText, sValue, ( !documentObject ) ? null : documentObject, iFinalIndex );
93 setSelectedIndex( combo, iFinalIndex );
94 return oOption;
95 }
96
97 function getSelectedIndex( combo ) {
98 combo = getSelect( combo );
99 return combo ? combo.$.selectedIndex : -1;
100 }
101
102 function setSelectedIndex( combo, index ) {
103 combo = getSelect( combo );
104 if ( index < 0 )
105 return null;
106 var count = combo.getChildren().count();
107 combo.$.selectedIndex = ( index >= count ) ? ( count - 1 ) : index;
108 return combo;
109 }
110
111 function getOptions( combo ) {
112 combo = getSelect( combo );
113 return combo ? combo.getChildren() : false;
114 }
115
116 function getSelect( obj ) {
117 if ( obj && obj.domId && obj.getInputElement().$ ) // Dialog element.
118 return obj.getInputElement();
119 else if ( obj && obj.$ )
120 return obj;
121 return false;
122 }
123
124 return {
125 title: editor.lang.forms.select.title,
126 minWidth: CKEDITOR.env.ie ? 460 : 395,
127 minHeight: CKEDITOR.env.ie ? 320 : 300,
128 onShow: function() {
129 delete this.selectBox;
130 this.setupContent( 'clear' );
131 var element = this.getParentEditor().getSelection().getSelectedElement();
132 if ( element && element.getName() == 'select' ) {
133 this.selectBox = element;
134 this.setupContent( element.getName(), element );
135
136 // Load Options into dialog.
137 var objOptions = getOptions( element );
138 for ( var i = 0; i < objOptions.count(); i++ )
139 this.setupContent( 'option', objOptions.getItem( i ) );
140 }
141 },
142 onOk: function() {
143 var editor = this.getParentEditor(),
144 element = this.selectBox,
145 isInsertMode = !element;
146
147 if ( isInsertMode )
148 element = editor.document.createElement( 'select' );
149 this.commitContent( element );
150
151 if ( isInsertMode ) {
152 editor.insertElement( element );
153 if ( CKEDITOR.env.ie ) {
154 var sel = editor.getSelection(),
155 bms = sel.createBookmarks();
156 setTimeout( function() {
157 sel.selectBookmarks( bms );
158 }, 0 );
159 }
160 }
161 },
162 contents: [ {
163 id: 'info',
164 label: editor.lang.forms.select.selectInfo,
165 title: editor.lang.forms.select.selectInfo,
166 accessKey: '',
167 elements: [ {
168 id: 'txtName',
169 type: 'text',
170 widths: [ '25%', '75%' ],
171 labelLayout: 'horizontal',
172 label: editor.lang.common.name,
173 'default': '',
174 accessKey: 'N',
175 style: 'width:350px',
176 setup: function( name, element ) {
177 if ( name == 'clear' )
178 this.setValue( this[ 'default' ] || '' );
179 else if ( name == 'select' )
180 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
181
182 },
183 commit: function( element ) {
184 if ( this.getValue() )
185 element.data( 'cke-saved-name', this.getValue() );
186 else {
187 element.data( 'cke-saved-name', false );
188 element.removeAttribute( 'name' );
189 }
190 }
191 },
192 {
193 id: 'txtValue',
194 type: 'text',
195 widths: [ '25%', '75%' ],
196 labelLayout: 'horizontal',
197 label: editor.lang.forms.select.value,
198 style: 'width:350px',
199 'default': '',
200 className: 'cke_disabled',
201 onLoad: function() {
202 this.getInputElement().setAttribute( 'readOnly', true );
203 },
204 setup: function( name, element ) {
205 if ( name == 'clear' )
206 this.setValue( '' );
207 else if ( name == 'option' && element.getAttribute( 'selected' ) )
208 this.setValue( element.$.value );
209 }
210 },
211 {
212 type: 'hbox',
213 widths: [ '175px', '170px' ],
214 children: [ {
215 id: 'txtSize',
216 type: 'text',
217 labelLayout: 'horizontal',
218 label: editor.lang.forms.select.size,
219 'default': '',
220 accessKey: 'S',
221 style: 'width:175px',
222 validate: function() {
223 var func = CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed );
224 return ( ( this.getValue() === '' ) || func.apply( this ) );
225 },
226 setup: function( name, element ) {
227 if ( name == 'select' )
228 this.setValue( element.getAttribute( 'size' ) || '' );
229 if ( CKEDITOR.env.webkit )
230 this.getInputElement().setStyle( 'width', '86px' );
231 },
232 commit: function( element ) {
233 if ( this.getValue() )
234 element.setAttribute( 'size', this.getValue() );
235 else
236 element.removeAttribute( 'size' );
237 }
238 },
239 {
240 type: 'html',
241 html: '<span>' + CKEDITOR.tools.htmlEncode( editor.lang.forms.select.lines ) + '</span>'
242 } ]
243 },
244 {
245 type: 'html',
246 html: '<span>' + CKEDITOR.tools.htmlEncode( editor.lang.forms.select.opAvail ) + '</span>'
247 },
248 {
249 type: 'hbox',
250 widths: [ '115px', '115px', '100px' ],
251 children: [ {
252 type: 'vbox',
253 children: [ {
254 id: 'txtOptName',
255 type: 'text',
256 label: editor.lang.forms.select.opText,
257 style: 'width:115px',
258 setup: function( name ) {
259 if ( name == 'clear' )
260 this.setValue( '' );
261 }
262 },
263 {
264 type: 'select',
265 id: 'cmbName',
266 label: '',
267 title: '',
268 size: 5,
269 style: 'width:115px;height:75px',
270 items: [],
271 onChange: function() {
272 var dialog = this.getDialog(),
273 values = dialog.getContentElement( 'info', 'cmbValue' ),
274 optName = dialog.getContentElement( 'info', 'txtOptName' ),
275 optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
276 iIndex = getSelectedIndex( this );
277
278 setSelectedIndex( values, iIndex );
279 optName.setValue( this.getValue() );
280 optValue.setValue( values.getValue() );
281 },
282 setup: function( name, element ) {
283 if ( name == 'clear' )
284 removeAllOptions( this );
285 else if ( name == 'option' )
286 addOption( this, element.getText(), element.getText(), this.getDialog().getParentEditor().document );
287 },
288 commit: function( element ) {
289 var dialog = this.getDialog(),
290 optionsNames = getOptions( this ),
291 optionsValues = getOptions( dialog.getContentElement( 'info', 'cmbValue' ) ),
292 selectValue = dialog.getContentElement( 'info', 'txtValue' ).getValue();
293
294 removeAllOptions( element );
295
296 for ( var i = 0; i < optionsNames.count(); i++ ) {
297 var oOption = addOption( element, optionsNames.getItem( i ).getValue(), optionsValues.getItem( i ).getValue(), dialog.getParentEditor().document );
298 if ( optionsValues.getItem( i ).getValue() == selectValue ) {
299 oOption.setAttribute( 'selected', 'selected' );
300 oOption.selected = true;
301 }
302 }
303 }
304 } ]
305 },
306 {
307 type: 'vbox',
308 children: [ {
309 id: 'txtOptValue',
310 type: 'text',
311 label: editor.lang.forms.select.opValue,
312 style: 'width:115px',
313 setup: function( name ) {
314 if ( name == 'clear' )
315 this.setValue( '' );
316 }
317 },
318 {
319 type: 'select',
320 id: 'cmbValue',
321 label: '',
322 size: 5,
323 style: 'width:115px;height:75px',
324 items: [],
325 onChange: function() {
326 var dialog = this.getDialog(),
327 names = dialog.getContentElement( 'info', 'cmbName' ),
328 optName = dialog.getContentElement( 'info', 'txtOptName' ),
329 optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
330 iIndex = getSelectedIndex( this );
331
332 setSelectedIndex( names, iIndex );
333 optName.setValue( names.getValue() );
334 optValue.setValue( this.getValue() );
335 },
336 setup: function( name, element ) {
337 if ( name == 'clear' )
338 removeAllOptions( this );
339 else if ( name == 'option' ) {
340 var oValue = element.getValue();
341 addOption( this, oValue, oValue, this.getDialog().getParentEditor().document );
342 if ( element.getAttribute( 'selected' ) == 'selected' )
343 this.getDialog().getContentElement( 'info', 'txtValue' ).setValue( oValue );
344 }
345 }
346 } ]
347 },
348 {
349 type: 'vbox',
350 padding: 5,
351 children: [ {
352 type: 'button',
353 id: 'btnAdd',
354 label: editor.lang.forms.select.btnAdd,
355 title: editor.lang.forms.select.btnAdd,
356 style: 'width:100%;',
357 onClick: function() {
358 //Add new option.
359 var dialog = this.getDialog(),
360 optName = dialog.getContentElement( 'info', 'txtOptName' ),
361 optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
362 names = dialog.getContentElement( 'info', 'cmbName' ),
363 values = dialog.getContentElement( 'info', 'cmbValue' );
364
365 addOption( names, optName.getValue(), optName.getValue(), dialog.getParentEditor().document );
366 addOption( values, optValue.getValue(), optValue.getValue(), dialog.getParentEditor().document );
367
368 optName.setValue( '' );
369 optValue.setValue( '' );
370 }
371 },
372 {
373 type: 'button',
374 id: 'btnModify',
375 label: editor.lang.forms.select.btnModify,
376 title: editor.lang.forms.select.btnModify,
377 style: 'width:100%;',
378 onClick: function() {
379 //Modify selected option.
380 var dialog = this.getDialog(),
381 optName = dialog.getContentElement( 'info', 'txtOptName' ),
382 optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
383 names = dialog.getContentElement( 'info', 'cmbName' ),
384 values = dialog.getContentElement( 'info', 'cmbValue' ),
385 iIndex = getSelectedIndex( names );
386
387 if ( iIndex >= 0 ) {
388 modifyOption( names, iIndex, optName.getValue(), optName.getValue() );
389 modifyOption( values, iIndex, optValue.getValue(), optValue.getValue() );
390 }
391 }
392 },
393 {
394 type: 'button',
395 id: 'btnUp',
396 style: 'width:100%;',
397 label: editor.lang.forms.select.btnUp,
398 title: editor.lang.forms.select.btnUp,
399 onClick: function() {
400 //Move up.
401 var dialog = this.getDialog(),
402 names = dialog.getContentElement( 'info', 'cmbName' ),
403 values = dialog.getContentElement( 'info', 'cmbValue' );
404
405 changeOptionPosition( names, -1, dialog.getParentEditor().document );
406 changeOptionPosition( values, -1, dialog.getParentEditor().document );
407 }
408 },
409 {
410 type: 'button',
411 id: 'btnDown',
412 style: 'width:100%;',
413 label: editor.lang.forms.select.btnDown,
414 title: editor.lang.forms.select.btnDown,
415 onClick: function() {
416 //Move down.
417 var dialog = this.getDialog(),
418 names = dialog.getContentElement( 'info', 'cmbName' ),
419 values = dialog.getContentElement( 'info', 'cmbValue' );
420
421 changeOptionPosition( names, 1, dialog.getParentEditor().document );
422 changeOptionPosition( values, 1, dialog.getParentEditor().document );
423 }
424 } ]
425 } ]
426 },
427 {
428 type: 'hbox',
429 widths: [ '40%', '20%', '40%' ],
430 children: [ {
431 type: 'button',
432 id: 'btnSetValue',
433 label: editor.lang.forms.select.btnSetValue,
434 title: editor.lang.forms.select.btnSetValue,
435 onClick: function() {
436 //Set as default value.
437 var dialog = this.getDialog(),
438 values = dialog.getContentElement( 'info', 'cmbValue' ),
439 txtValue = dialog.getContentElement( 'info', 'txtValue' );
440 txtValue.setValue( values.getValue() );
441 }
442 },
443 {
444 type: 'button',
445 id: 'btnDelete',
446 label: editor.lang.forms.select.btnDelete,
447 title: editor.lang.forms.select.btnDelete,
448 onClick: function() {
449 // Delete option.
450 var dialog = this.getDialog(),
451 names = dialog.getContentElement( 'info', 'cmbName' ),
452 values = dialog.getContentElement( 'info', 'cmbValue' ),
453 optName = dialog.getContentElement( 'info', 'txtOptName' ),
454 optValue = dialog.getContentElement( 'info', 'txtOptValue' );
455
456 removeSelectedOptions( names );
457 removeSelectedOptions( values );
458
459 optName.setValue( '' );
460 optValue.setValue( '' );
461 }
462 },
463 {
464 type: 'vbox',
465 children: [ {
466 id: 'chkMulti',
467 type: 'checkbox',
468 label: editor.lang.forms.select.chkMulti,
469 'default': '',
470 accessKey: 'M',
471 value: 'checked',
472 setup: function( name, element ) {
473 if ( name == 'select' )
474 this.setValue( element.getAttribute( 'multiple' ) );
475 },
476 commit: function( element ) {
477 if ( this.getValue() )
478 element.setAttribute( 'multiple', this.getValue() );
479 else
480 element.removeAttribute( 'multiple' );
481 }
482 },
483 {
484 id: 'required',
485 type: 'checkbox',
486 label: editor.lang.forms.select.required,
487 'default': '',
488 accessKey: 'Q',
489 value: 'checked',
490 setup: function( name, element ) {
491 if ( name == 'select' )
492 this.setValue( element.getAttribute( 'required' ) );
493 },
494 commit: function( element ) {
495 if ( this.getValue() )
496 element.setAttribute( 'required', 'required' );
497 else
498 element.removeAttribute( 'required' );
499 }
500 } ]
501 } ]
502 } ]
503 } ]
504 };
505} );
diff --git a/sources/plugins/forms/dialogs/textarea.js b/sources/plugins/forms/dialogs/textarea.js
new file mode 100644
index 00000000..4370955e
--- /dev/null
+++ b/sources/plugins/forms/dialogs/textarea.js
@@ -0,0 +1,128 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5CKEDITOR.dialog.add( 'textarea', function( editor ) {
6 return {
7 title: editor.lang.forms.textarea.title,
8 minWidth: 350,
9 minHeight: 220,
10 onShow: function() {
11 delete this.textarea;
12
13 var element = this.getParentEditor().getSelection().getSelectedElement();
14 if ( element && element.getName() == 'textarea' ) {
15 this.textarea = element;
16 this.setupContent( element );
17 }
18 },
19 onOk: function() {
20 var editor,
21 element = this.textarea,
22 isInsertMode = !element;
23
24 if ( isInsertMode ) {
25 editor = this.getParentEditor();
26 element = editor.document.createElement( 'textarea' );
27 }
28 this.commitContent( element );
29
30 if ( isInsertMode )
31 editor.insertElement( element );
32 },
33 contents: [ {
34 id: 'info',
35 label: editor.lang.forms.textarea.title,
36 title: editor.lang.forms.textarea.title,
37 elements: [ {
38 id: '_cke_saved_name',
39 type: 'text',
40 label: editor.lang.common.name,
41 'default': '',
42 accessKey: 'N',
43 setup: function( element ) {
44 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
45 },
46 commit: function( element ) {
47 if ( this.getValue() )
48 element.data( 'cke-saved-name', this.getValue() );
49 else {
50 element.data( 'cke-saved-name', false );
51 element.removeAttribute( 'name' );
52 }
53 }
54 },
55 {
56 type: 'hbox',
57 widths: [ '50%', '50%' ],
58 children: [ {
59 id: 'cols',
60 type: 'text',
61 label: editor.lang.forms.textarea.cols,
62 'default': '',
63 accessKey: 'C',
64 style: 'width:50px',
65 validate: CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
66 setup: function( element ) {
67 var value = element.hasAttribute( 'cols' ) && element.getAttribute( 'cols' );
68 this.setValue( value || '' );
69 },
70 commit: function( element ) {
71 if ( this.getValue() )
72 element.setAttribute( 'cols', this.getValue() );
73 else
74 element.removeAttribute( 'cols' );
75 }
76 },
77 {
78 id: 'rows',
79 type: 'text',
80 label: editor.lang.forms.textarea.rows,
81 'default': '',
82 accessKey: 'R',
83 style: 'width:50px',
84 validate: CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
85 setup: function( element ) {
86 var value = element.hasAttribute( 'rows' ) && element.getAttribute( 'rows' );
87 this.setValue( value || '' );
88 },
89 commit: function( element ) {
90 if ( this.getValue() )
91 element.setAttribute( 'rows', this.getValue() );
92 else
93 element.removeAttribute( 'rows' );
94 }
95 } ]
96 },
97 {
98 id: 'value',
99 type: 'textarea',
100 label: editor.lang.forms.textfield.value,
101 'default': '',
102 setup: function( element ) {
103 this.setValue( element.$.defaultValue );
104 },
105 commit: function( element ) {
106 element.$.value = element.$.defaultValue = this.getValue();
107 }
108 },
109 {
110 id: 'required',
111 type: 'checkbox',
112 label: editor.lang.forms.textfield.required,
113 'default': '',
114 accessKey: 'Q',
115 value: 'required',
116 setup: function( element ) {
117 this.setValue( element.getAttribute( 'required' ) );
118 },
119 commit: function( element ) {
120 if ( this.getValue() )
121 element.setAttribute( 'required', 'required' );
122 else
123 element.removeAttribute( 'required' );
124 }
125 } ]
126 } ]
127 };
128} );
diff --git a/sources/plugins/forms/dialogs/textfield.js b/sources/plugins/forms/dialogs/textfield.js
new file mode 100644
index 00000000..5b601b31
--- /dev/null
+++ b/sources/plugins/forms/dialogs/textfield.js
@@ -0,0 +1,193 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5CKEDITOR.dialog.add( 'textfield', function( editor ) {
6
7 var acceptedTypes = { email: 1, password: 1, search: 1, tel: 1, text: 1, url: 1 };
8
9 function autoCommit( data ) {
10 var element = data.element;
11 var value = this.getValue();
12
13 value ? element.setAttribute( this.id, value ) : element.removeAttribute( this.id );
14 }
15
16 function autoSetup( element ) {
17 var value = element.hasAttribute( this.id ) && element.getAttribute( this.id );
18 this.setValue( value || '' );
19 }
20
21 return {
22 title: editor.lang.forms.textfield.title,
23 minWidth: 350,
24 minHeight: 150,
25 onShow: function() {
26 delete this.textField;
27
28 var element = this.getParentEditor().getSelection().getSelectedElement();
29 if ( element && element.getName() == 'input' && ( acceptedTypes[ element.getAttribute( 'type' ) ] || !element.getAttribute( 'type' ) ) ) {
30 this.textField = element;
31 this.setupContent( element );
32 }
33 },
34 onOk: function() {
35 var editor = this.getParentEditor(),
36 element = this.textField,
37 isInsertMode = !element;
38
39 if ( isInsertMode ) {
40 element = editor.document.createElement( 'input' );
41 element.setAttribute( 'type', 'text' );
42 }
43
44 var data = { element: element };
45
46 if ( isInsertMode )
47 editor.insertElement( data.element );
48
49 this.commitContent( data );
50
51 // Element might be replaced by commitment.
52 if ( !isInsertMode )
53 editor.getSelection().selectElement( data.element );
54 },
55 onLoad: function() {
56 this.foreach( function( contentObj ) {
57 if ( contentObj.getValue ) {
58 if ( !contentObj.setup )
59 contentObj.setup = autoSetup;
60 if ( !contentObj.commit )
61 contentObj.commit = autoCommit;
62 }
63 } );
64 },
65 contents: [ {
66 id: 'info',
67 label: editor.lang.forms.textfield.title,
68 title: editor.lang.forms.textfield.title,
69 elements: [ {
70 type: 'hbox',
71 widths: [ '50%', '50%' ],
72 children: [ {
73 id: '_cke_saved_name',
74 type: 'text',
75 label: editor.lang.forms.textfield.name,
76 'default': '',
77 accessKey: 'N',
78 setup: function( element ) {
79 this.setValue( element.data( 'cke-saved-name' ) || element.getAttribute( 'name' ) || '' );
80 },
81 commit: function( data ) {
82 var element = data.element;
83
84 if ( this.getValue() )
85 element.data( 'cke-saved-name', this.getValue() );
86 else {
87 element.data( 'cke-saved-name', false );
88 element.removeAttribute( 'name' );
89 }
90 }
91 },
92 {
93 id: 'value',
94 type: 'text',
95 label: editor.lang.forms.textfield.value,
96 'default': '',
97 accessKey: 'V',
98 commit: function( data ) {
99 if ( CKEDITOR.env.ie && !this.getValue() ) {
100 var element = data.element,
101 fresh = new CKEDITOR.dom.element( 'input', editor.document );
102 element.copyAttributes( fresh, { value: 1 } );
103 fresh.replace( element );
104 data.element = fresh;
105 } else {
106 autoCommit.call( this, data );
107 }
108 }
109 } ]
110 },
111 {
112 type: 'hbox',
113 widths: [ '50%', '50%' ],
114 children: [ {
115 id: 'size',
116 type: 'text',
117 label: editor.lang.forms.textfield.charWidth,
118 'default': '',
119 accessKey: 'C',
120 style: 'width:50px',
121 validate: CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed )
122 },
123 {
124 id: 'maxLength',
125 type: 'text',
126 label: editor.lang.forms.textfield.maxChars,
127 'default': '',
128 accessKey: 'M',
129 style: 'width:50px',
130 validate: CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed )
131 } ],
132 onLoad: function() {
133 // Repaint the style for IE7 (#6068)
134 if ( CKEDITOR.env.ie7Compat )
135 this.getElement().setStyle( 'zoom', '100%' );
136 }
137 },
138 {
139 id: 'type',
140 type: 'select',
141 label: editor.lang.forms.textfield.type,
142 'default': 'text',
143 accessKey: 'M',
144 items: [
145 [ editor.lang.forms.textfield.typeEmail, 'email' ],
146 [ editor.lang.forms.textfield.typePass, 'password' ],
147 [ editor.lang.forms.textfield.typeSearch, 'search' ],
148 [ editor.lang.forms.textfield.typeTel, 'tel' ],
149 [ editor.lang.forms.textfield.typeText, 'text' ],
150 [ editor.lang.forms.textfield.typeUrl, 'url' ]
151 ],
152 setup: function( element ) {
153 this.setValue( element.getAttribute( 'type' ) );
154 },
155 commit: function( data ) {
156 var element = data.element;
157
158 if ( CKEDITOR.env.ie ) {
159 var elementType = element.getAttribute( 'type' );
160 var myType = this.getValue();
161
162 if ( elementType != myType ) {
163 var replace = CKEDITOR.dom.element.createFromHtml( '<input type="' + myType + '"></input>', editor.document );
164 element.copyAttributes( replace, { type: 1 } );
165 replace.replace( element );
166 data.element = replace;
167 }
168 } else {
169 element.setAttribute( 'type', this.getValue() );
170 }
171 }
172 },
173 {
174 id: 'required',
175 type: 'checkbox',
176 label: editor.lang.forms.textfield.required,
177 'default': '',
178 accessKey: 'Q',
179 value: 'required',
180 setup: function( element ) {
181 this.setValue( element.getAttribute( 'required' ) );
182 },
183 commit: function( data ) {
184 var element = data.element;
185 if ( this.getValue() )
186 element.setAttribute( 'required', 'required' );
187 else
188 element.removeAttribute( 'required' );
189 }
190 } ]
191 } ]
192 };
193} );
diff --git a/sources/plugins/forms/icons/button.png b/sources/plugins/forms/icons/button.png
new file mode 100644
index 00000000..0bf68caa
--- /dev/null
+++ b/sources/plugins/forms/icons/button.png
Binary files differ
diff --git a/sources/plugins/forms/icons/checkbox.png b/sources/plugins/forms/icons/checkbox.png
new file mode 100644
index 00000000..2f4eb2f4
--- /dev/null
+++ b/sources/plugins/forms/icons/checkbox.png
Binary files differ
diff --git a/sources/plugins/forms/icons/form.png b/sources/plugins/forms/icons/form.png
new file mode 100644
index 00000000..08416674
--- /dev/null
+++ b/sources/plugins/forms/icons/form.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hiddenfield.png b/sources/plugins/forms/icons/hiddenfield.png
new file mode 100644
index 00000000..0cfab97a
--- /dev/null
+++ b/sources/plugins/forms/icons/hiddenfield.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/button.png b/sources/plugins/forms/icons/hidpi/button.png
new file mode 100644
index 00000000..bd92b165
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/button.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/checkbox.png b/sources/plugins/forms/icons/hidpi/checkbox.png
new file mode 100644
index 00000000..36be4aa0
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/checkbox.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/form.png b/sources/plugins/forms/icons/hidpi/form.png
new file mode 100644
index 00000000..4a02649c
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/form.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/hiddenfield.png b/sources/plugins/forms/icons/hidpi/hiddenfield.png
new file mode 100644
index 00000000..cd5f3186
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/hiddenfield.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/imagebutton.png b/sources/plugins/forms/icons/hidpi/imagebutton.png
new file mode 100644
index 00000000..d2737963
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/imagebutton.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/radio.png b/sources/plugins/forms/icons/hidpi/radio.png
new file mode 100644
index 00000000..2f0c72d6
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/radio.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/select-rtl.png b/sources/plugins/forms/icons/hidpi/select-rtl.png
new file mode 100644
index 00000000..42452e19
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/select-rtl.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/select.png b/sources/plugins/forms/icons/hidpi/select.png
new file mode 100644
index 00000000..da2b066b
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/select.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/textarea-rtl.png b/sources/plugins/forms/icons/hidpi/textarea-rtl.png
new file mode 100644
index 00000000..60618a5b
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/textarea-rtl.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/textarea.png b/sources/plugins/forms/icons/hidpi/textarea.png
new file mode 100644
index 00000000..87073d22
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/textarea.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/textfield-rtl.png b/sources/plugins/forms/icons/hidpi/textfield-rtl.png
new file mode 100644
index 00000000..d3c13582
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/textfield-rtl.png
Binary files differ
diff --git a/sources/plugins/forms/icons/hidpi/textfield.png b/sources/plugins/forms/icons/hidpi/textfield.png
new file mode 100644
index 00000000..d3c13582
--- /dev/null
+++ b/sources/plugins/forms/icons/hidpi/textfield.png
Binary files differ
diff --git a/sources/plugins/forms/icons/imagebutton.png b/sources/plugins/forms/icons/imagebutton.png
new file mode 100644
index 00000000..162df9a3
--- /dev/null
+++ b/sources/plugins/forms/icons/imagebutton.png
Binary files differ
diff --git a/sources/plugins/forms/icons/radio.png b/sources/plugins/forms/icons/radio.png
new file mode 100644
index 00000000..aaad523f
--- /dev/null
+++ b/sources/plugins/forms/icons/radio.png
Binary files differ
diff --git a/sources/plugins/forms/icons/select-rtl.png b/sources/plugins/forms/icons/select-rtl.png
new file mode 100644
index 00000000..029a0d22
--- /dev/null
+++ b/sources/plugins/forms/icons/select-rtl.png
Binary files differ
diff --git a/sources/plugins/forms/icons/select.png b/sources/plugins/forms/icons/select.png
new file mode 100644
index 00000000..44b02b9d
--- /dev/null
+++ b/sources/plugins/forms/icons/select.png
Binary files differ
diff --git a/sources/plugins/forms/icons/textarea-rtl.png b/sources/plugins/forms/icons/textarea-rtl.png
new file mode 100644
index 00000000..8a15d688
--- /dev/null
+++ b/sources/plugins/forms/icons/textarea-rtl.png
Binary files differ
diff --git a/sources/plugins/forms/icons/textarea.png b/sources/plugins/forms/icons/textarea.png
new file mode 100644
index 00000000..58e0fa02
--- /dev/null
+++ b/sources/plugins/forms/icons/textarea.png
Binary files differ
diff --git a/sources/plugins/forms/icons/textfield-rtl.png b/sources/plugins/forms/icons/textfield-rtl.png
new file mode 100644
index 00000000..054aab56
--- /dev/null
+++ b/sources/plugins/forms/icons/textfield-rtl.png
Binary files differ
diff --git a/sources/plugins/forms/icons/textfield.png b/sources/plugins/forms/icons/textfield.png
new file mode 100644
index 00000000..054aab56
--- /dev/null
+++ b/sources/plugins/forms/icons/textfield.png
Binary files differ
diff --git a/sources/plugins/forms/images/hiddenfield.gif b/sources/plugins/forms/images/hiddenfield.gif
new file mode 100644
index 00000000..988d9565
--- /dev/null
+++ b/sources/plugins/forms/images/hiddenfield.gif
Binary files differ
diff --git a/sources/plugins/forms/lang/af.js b/sources/plugins/forms/lang/af.js
new file mode 100644
index 00000000..cef21a56
--- /dev/null
+++ b/sources/plugins/forms/lang/af.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'af', {
6 button: {
7 title: 'Knop eienskappe',
8 text: 'Teks (Waarde)',
9 type: 'Soort',
10 typeBtn: 'Knop',
11 typeSbm: 'Stuur',
12 typeRst: 'Maak leeg'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Merkhokkie eienskappe',
16 radioTitle: 'Radioknoppie eienskappe',
17 value: 'Waarde',
18 selected: 'Geselekteer',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Vorm eienskappe',
23 menu: 'Vorm eienskappe',
24 action: 'Aksie',
25 method: 'Metode',
26 encoding: 'Kodering'
27 },
28 hidden: {
29 title: 'Verborge veld eienskappe',
30 name: 'Naam',
31 value: 'Waarde'
32 },
33 select: {
34 title: 'Keuseveld eienskappe',
35 selectInfo: 'Info',
36 opAvail: 'Beskikbare opsies',
37 value: 'Waarde',
38 size: 'Grootte',
39 lines: 'Lyne',
40 chkMulti: 'Laat meer as een keuse toe',
41 required: 'Required', // MISSING
42 opText: 'Teks',
43 opValue: 'Waarde',
44 btnAdd: 'Byvoeg',
45 btnModify: 'Wysig',
46 btnUp: 'Op',
47 btnDown: 'Af',
48 btnSetValue: 'Stel as geselekteerde waarde',
49 btnDelete: 'Verwyder'
50 },
51 textarea: {
52 title: 'Teks-area eienskappe',
53 cols: 'Kolomme',
54 rows: 'Rye'
55 },
56 textfield: {
57 title: 'Teksveld eienskappe',
58 name: 'Naam',
59 value: 'Waarde',
60 charWidth: 'Breedte (karakters)',
61 maxChars: 'Maksimum karakters',
62 required: 'Required', // MISSING
63 type: 'Soort',
64 typeText: 'Teks',
65 typePass: 'Wagwoord',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ar.js b/sources/plugins/forms/lang/ar.js
new file mode 100644
index 00000000..bb9fb296
--- /dev/null
+++ b/sources/plugins/forms/lang/ar.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ar', {
6 button: {
7 title: 'خصائص زر الضغط',
8 text: 'القيمة/التسمية',
9 type: 'نوع الزر',
10 typeBtn: 'زر',
11 typeSbm: 'إرسال',
12 typeRst: 'إعادة تعيين'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'خصائص خانة الإختيار',
16 radioTitle: 'خصائص زر الخيار',
17 value: 'القيمة',
18 selected: 'محدد',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'خصائص النموذج',
23 menu: 'خصائص النموذج',
24 action: 'اسم الملف',
25 method: 'الأسلوب',
26 encoding: 'تشفير'
27 },
28 hidden: {
29 title: 'خصائص الحقل المخفي',
30 name: 'الاسم',
31 value: 'القيمة'
32 },
33 select: {
34 title: 'خصائص اختيار الحقل',
35 selectInfo: 'اختار معلومات',
36 opAvail: 'الخيارات المتاحة',
37 value: 'القيمة',
38 size: 'الحجم',
39 lines: 'الأسطر',
40 chkMulti: 'السماح بتحديدات متعددة',
41 required: 'Required', // MISSING
42 opText: 'النص',
43 opValue: 'القيمة',
44 btnAdd: 'إضافة',
45 btnModify: 'تعديل',
46 btnUp: 'أعلى',
47 btnDown: 'أسفل',
48 btnSetValue: 'إجعلها محددة',
49 btnDelete: 'إزالة'
50 },
51 textarea: {
52 title: 'خصائص مساحة النص',
53 cols: 'الأعمدة',
54 rows: 'الصفوف'
55 },
56 textfield: {
57 title: 'خصائص مربع النص',
58 name: 'الاسم',
59 value: 'القيمة',
60 charWidth: 'عرض السمات',
61 maxChars: 'اقصى عدد للسمات',
62 required: 'Required', // MISSING
63 type: 'نوع المحتوى',
64 typeText: 'نص',
65 typePass: 'كلمة مرور',
66 typeEmail: 'بريد إلكتروني',
67 typeSearch: 'بحث',
68 typeTel: 'رقم الهاتف',
69 typeUrl: 'الرابط'
70 }
71} );
diff --git a/sources/plugins/forms/lang/bg.js b/sources/plugins/forms/lang/bg.js
new file mode 100644
index 00000000..bf46fd15
--- /dev/null
+++ b/sources/plugins/forms/lang/bg.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'bg', {
6 button: {
7 title: 'Настройки на бутона',
8 text: 'Текст (стойност)',
9 type: 'Тип',
10 typeBtn: 'Бутон',
11 typeSbm: 'Добави',
12 typeRst: 'Нулиране'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Настройки на радиобутон',
17 value: 'Стойност',
18 selected: 'Избрано',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Настройки на формата',
23 menu: 'Настройки на формата',
24 action: 'Действие',
25 method: 'Метод',
26 encoding: 'Кодиране'
27 },
28 hidden: {
29 title: 'Настройки за скрито поле',
30 name: 'Име',
31 value: 'Стойност'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Налични опции',
37 value: 'Стойност',
38 size: 'Размер',
39 lines: 'линии',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required', // MISSING
42 opText: 'Текст',
43 opValue: 'Стойност',
44 btnAdd: 'Добави',
45 btnModify: 'Промени',
46 btnUp: 'На горе',
47 btnDown: 'На долу',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Изтриване'
50 },
51 textarea: {
52 title: 'Опции за текстовата зона',
53 cols: 'Колони',
54 rows: 'Редове'
55 },
56 textfield: {
57 title: 'Настройки за текстово поле',
58 name: 'Име',
59 value: 'Стойност',
60 charWidth: 'Ширина на знаците',
61 maxChars: 'Макс. знаци',
62 required: 'Required', // MISSING
63 type: 'Тип',
64 typeText: 'Текст',
65 typePass: 'Парола',
66 typeEmail: 'Email',
67 typeSearch: 'Търсене',
68 typeTel: 'Телефонен номер',
69 typeUrl: 'Уеб адрес'
70 }
71} );
diff --git a/sources/plugins/forms/lang/bn.js b/sources/plugins/forms/lang/bn.js
new file mode 100644
index 00000000..34674ae3
--- /dev/null
+++ b/sources/plugins/forms/lang/bn.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'bn', {
6 button: {
7 title: 'বাটন প্রোপার্টি',
8 text: 'টেক্সট (ভ্যালু)',
9 type: 'প্রকার',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'চেক বক্স প্রোপার্টি',
16 radioTitle: 'রেডিও বাটন প্রোপার্টি',
17 value: 'ভ্যালু',
18 selected: 'সিলেক্টেড',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'ফর্ম প্রোপার্টি',
23 menu: 'ফর্ম প্রোপার্টি',
24 action: 'একশ্যন',
25 method: 'পদ্ধতি',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'গুপ্ত ফীল্ড প্রোপার্টি',
30 name: 'নাম',
31 value: 'ভ্যালু'
32 },
33 select: {
34 title: 'বাছাই ফীল্ড প্রোপার্টি',
35 selectInfo: 'তথ্য',
36 opAvail: 'অন্যান্য বিকল্প',
37 value: 'ভ্যালু',
38 size: 'সাইজ',
39 lines: 'লাইন সমূহ',
40 chkMulti: 'একাধিক সিলেকশন এলাউ কর',
41 required: 'Required', // MISSING
42 opText: 'টেক্সট',
43 opValue: 'ভ্যালু',
44 btnAdd: 'যুক্ত',
45 btnModify: 'বদলে দাও',
46 btnUp: 'উপর',
47 btnDown: 'নীচে',
48 btnSetValue: 'বাছাই করা ভ্যালু হিসেবে সেট কর',
49 btnDelete: 'ডিলীট'
50 },
51 textarea: {
52 title: 'টেক্সট এরিয়া প্রোপার্টি',
53 cols: 'কলাম',
54 rows: 'রো'
55 },
56 textfield: {
57 title: 'টেক্সট ফীল্ড প্রোপার্টি',
58 name: 'নাম',
59 value: 'ভ্যালু',
60 charWidth: 'ক্যারেক্টার প্রশস্ততা',
61 maxChars: 'সর্বাধিক ক্যারেক্টার',
62 required: 'Required', // MISSING
63 type: 'টাইপ',
64 typeText: 'টেক্সট',
65 typePass: 'পাসওয়ার্ড',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/bs.js b/sources/plugins/forms/lang/bs.js
new file mode 100644
index 00000000..206339d7
--- /dev/null
+++ b/sources/plugins/forms/lang/bs.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'bs', {
6 button: {
7 title: 'Button Properties',
8 text: 'Text (Value)',
9 type: 'Type',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Radio Button Properties',
17 value: 'Value',
18 selected: 'Selected',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Form Properties',
23 menu: 'Form Properties',
24 action: 'Action',
25 method: 'Method',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field Properties',
30 name: 'Name',
31 value: 'Value'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Available Options',
37 value: 'Value',
38 size: 'Size',
39 lines: 'lines',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Value',
44 btnAdd: 'Add',
45 btnModify: 'Modify',
46 btnUp: 'Up',
47 btnDown: 'Down',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Delete'
50 },
51 textarea: {
52 title: 'Textarea Properties',
53 cols: 'Columns',
54 rows: 'Rows'
55 },
56 textfield: {
57 title: 'Text Field Properties',
58 name: 'Name',
59 value: 'Value',
60 charWidth: 'Character Width',
61 maxChars: 'Maximum Characters',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Text',
65 typePass: 'Password',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ca.js b/sources/plugins/forms/lang/ca.js
new file mode 100644
index 00000000..6b287286
--- /dev/null
+++ b/sources/plugins/forms/lang/ca.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ca', {
6 button: {
7 title: 'Propietats del botó',
8 text: 'Text (Valor)',
9 type: 'Tipus',
10 typeBtn: 'Botó',
11 typeSbm: 'Transmet formulari',
12 typeRst: 'Reinicia formulari'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Propietats de la casella de verificació',
16 radioTitle: 'Propietats del botó d\'opció',
17 value: 'Valor',
18 selected: 'Seleccionat',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Propietats del formulari',
23 menu: 'Propietats del formulari',
24 action: 'Acció',
25 method: 'Mètode',
26 encoding: 'Codificació'
27 },
28 hidden: {
29 title: 'Propietats del camp ocult',
30 name: 'Nom',
31 value: 'Valor'
32 },
33 select: {
34 title: 'Propietats del camp de selecció',
35 selectInfo: 'Info',
36 opAvail: 'Opcions disponibles',
37 value: 'Valor',
38 size: 'Mida',
39 lines: 'Línies',
40 chkMulti: 'Permet múltiples seleccions',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Valor',
44 btnAdd: 'Afegeix',
45 btnModify: 'Modifica',
46 btnUp: 'Amunt',
47 btnDown: 'Avall',
48 btnSetValue: 'Selecciona per defecte',
49 btnDelete: 'Elimina'
50 },
51 textarea: {
52 title: 'Propietats de l\'àrea de text',
53 cols: 'Columnes',
54 rows: 'Files'
55 },
56 textfield: {
57 title: 'Propietats del camp de text',
58 name: 'Nom',
59 value: 'Valor',
60 charWidth: 'Amplada',
61 maxChars: 'Nombre màxim de caràcters',
62 required: 'Required', // MISSING
63 type: 'Tipus',
64 typeText: 'Text',
65 typePass: 'Contrasenya',
66 typeEmail: 'Correu electrònic',
67 typeSearch: 'Cercar',
68 typeTel: 'Número de telèfon',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/cs.js b/sources/plugins/forms/lang/cs.js
new file mode 100644
index 00000000..ea529dae
--- /dev/null
+++ b/sources/plugins/forms/lang/cs.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'cs', {
6 button: {
7 title: 'Vlastnosti tlačítka',
8 text: 'Popisek',
9 type: 'Typ',
10 typeBtn: 'Tlačítko',
11 typeSbm: 'Odeslat',
12 typeRst: 'Obnovit'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Vlastnosti zaškrtávacího políčka',
16 radioTitle: 'Vlastnosti přepínače',
17 value: 'Hodnota',
18 selected: 'Zaškrtnuto',
19 required: 'Vyžadováno'
20 },
21 form: {
22 title: 'Vlastnosti formuláře',
23 menu: 'Vlastnosti formuláře',
24 action: 'Akce',
25 method: 'Metoda',
26 encoding: 'Kódování'
27 },
28 hidden: {
29 title: 'Vlastnosti skrytého pole',
30 name: 'Název',
31 value: 'Hodnota'
32 },
33 select: {
34 title: 'Vlastnosti seznamu',
35 selectInfo: 'Info',
36 opAvail: 'Dostupná nastavení',
37 value: 'Hodnota',
38 size: 'Velikost',
39 lines: 'Řádků',
40 chkMulti: 'Povolit mnohonásobné výběry',
41 required: 'Vyžadováno',
42 opText: 'Text',
43 opValue: 'Hodnota',
44 btnAdd: 'Přidat',
45 btnModify: 'Změnit',
46 btnUp: 'Nahoru',
47 btnDown: 'Dolů',
48 btnSetValue: 'Nastavit jako vybranou hodnotu',
49 btnDelete: 'Smazat'
50 },
51 textarea: {
52 title: 'Vlastnosti textové oblasti',
53 cols: 'Sloupců',
54 rows: 'Řádků'
55 },
56 textfield: {
57 title: 'Vlastnosti textového pole',
58 name: 'Název',
59 value: 'Hodnota',
60 charWidth: 'Šířka ve znacích',
61 maxChars: 'Maximální počet znaků',
62 required: 'Vyžadováno',
63 type: 'Typ',
64 typeText: 'Text',
65 typePass: 'Heslo',
66 typeEmail: 'Email',
67 typeSearch: 'Hledat',
68 typeTel: 'Telefonní číslo',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/cy.js b/sources/plugins/forms/lang/cy.js
new file mode 100644
index 00000000..6fb1e19f
--- /dev/null
+++ b/sources/plugins/forms/lang/cy.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'cy', {
6 button: {
7 title: 'Priodweddau Botymau',
8 text: 'Testun (Gwerth)',
9 type: 'Math',
10 typeBtn: 'Botwm',
11 typeSbm: 'Anfon',
12 typeRst: 'Ailosod'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Priodweddau Blwch Ticio',
16 radioTitle: 'Priodweddau Botwm Radio',
17 value: 'Gwerth',
18 selected: 'Dewiswyd',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Priodweddau Ffurflen',
23 menu: 'Priodweddau Ffurflen',
24 action: 'Gweithred',
25 method: 'Dull',
26 encoding: 'Amgodio'
27 },
28 hidden: {
29 title: 'Priodweddau Maes Cudd',
30 name: 'Enw',
31 value: 'Gwerth'
32 },
33 select: {
34 title: 'Priodweddau Maes Dewis',
35 selectInfo: 'Gwyb Dewis',
36 opAvail: 'Opsiynau ar Gael',
37 value: 'Gwerth',
38 size: 'Maint',
39 lines: 'llinellau',
40 chkMulti: 'Caniatàu aml-ddewisiadau',
41 required: 'Required', // MISSING
42 opText: 'Testun',
43 opValue: 'Gwerth',
44 btnAdd: 'Ychwanegu',
45 btnModify: 'Newid',
46 btnUp: 'Lan',
47 btnDown: 'Lawr',
48 btnSetValue: 'Gosod fel gwerth a ddewiswyd',
49 btnDelete: 'Dileu'
50 },
51 textarea: {
52 title: 'Priodweddau Ardal Testun',
53 cols: 'Colofnau',
54 rows: 'Rhesi'
55 },
56 textfield: {
57 title: 'Priodweddau Maes Testun',
58 name: 'Enw',
59 value: 'Gwerth',
60 charWidth: 'Lled Nod',
61 maxChars: 'Uchafswm y Nodau',
62 required: 'Required', // MISSING
63 type: 'Math',
64 typeText: 'Testun',
65 typePass: 'Cyfrinair',
66 typeEmail: 'Ebost',
67 typeSearch: 'Chwilio',
68 typeTel: 'Rhif Ffôn',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/da.js b/sources/plugins/forms/lang/da.js
new file mode 100644
index 00000000..8fe4a68b
--- /dev/null
+++ b/sources/plugins/forms/lang/da.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'da', {
6 button: {
7 title: 'Egenskaber for knap',
8 text: 'Tekst',
9 type: 'Type',
10 typeBtn: 'Knap',
11 typeSbm: 'Send',
12 typeRst: 'Nulstil'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Egenskaber for afkrydsningsfelt',
16 radioTitle: 'Egenskaber for alternativknap',
17 value: 'Værdi',
18 selected: 'Valgt',
19 required: 'Påkrævet'
20 },
21 form: {
22 title: 'Egenskaber for formular',
23 menu: 'Egenskaber for formular',
24 action: 'Handling',
25 method: 'Metode',
26 encoding: 'Kodning (encoding)'
27 },
28 hidden: {
29 title: 'Egenskaber for skjult felt',
30 name: 'Navn',
31 value: 'Værdi'
32 },
33 select: {
34 title: 'Egenskaber for liste',
35 selectInfo: 'Generelt',
36 opAvail: 'Valgmuligheder',
37 value: 'Værdi',
38 size: 'Størrelse',
39 lines: 'Linjer',
40 chkMulti: 'Tillad flere valg',
41 required: 'Påkrævet',
42 opText: 'Tekst',
43 opValue: 'Værdi',
44 btnAdd: 'Tilføj',
45 btnModify: 'Redigér',
46 btnUp: 'Op',
47 btnDown: 'Ned',
48 btnSetValue: 'Sæt som valgt',
49 btnDelete: 'Slet'
50 },
51 textarea: {
52 title: 'Egenskaber for tekstboks',
53 cols: 'Kolonner',
54 rows: 'Rækker'
55 },
56 textfield: {
57 title: 'Egenskaber for tekstfelt',
58 name: 'Navn',
59 value: 'Værdi',
60 charWidth: 'Bredde (tegn)',
61 maxChars: 'Max. antal tegn',
62 required: 'Påkrævet',
63 type: 'Type',
64 typeText: 'Tekst',
65 typePass: 'Adgangskode',
66 typeEmail: 'E-mail',
67 typeSearch: 'Søg',
68 typeTel: 'Telefon nummer',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/de.js b/sources/plugins/forms/lang/de.js
new file mode 100644
index 00000000..41f64c16
--- /dev/null
+++ b/sources/plugins/forms/lang/de.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'de', {
6 button: {
7 title: 'Schaltflächeneigenschaften',
8 text: 'Text (Wert)',
9 type: 'Typ',
10 typeBtn: 'Button',
11 typeSbm: 'Absenden',
12 typeRst: 'Zurücksetzen'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Kontrollboxeigenschaften',
16 radioTitle: 'Optionsfeldeigenschaften',
17 value: 'Wert',
18 selected: 'Ausgewählt',
19 required: 'Erforderlich'
20 },
21 form: {
22 title: 'Formulareigenschaften',
23 menu: 'Formulareigenschaften',
24 action: 'Aktion',
25 method: 'Methode',
26 encoding: 'Kodierung'
27 },
28 hidden: {
29 title: 'Versteckte Feldeigenschaften',
30 name: 'Name',
31 value: 'Wert'
32 },
33 select: {
34 title: 'Auswahlfeldeigenschaften',
35 selectInfo: 'Info auswählen',
36 opAvail: 'Verfügbare Optionen',
37 value: 'Wert',
38 size: 'Größe',
39 lines: 'Linien',
40 chkMulti: 'Mehrfachauswahl erlauben',
41 required: 'Erforderlich',
42 opText: 'Text',
43 opValue: 'Wert',
44 btnAdd: 'Hinzufügen',
45 btnModify: 'Ändern',
46 btnUp: 'Hoch',
47 btnDown: 'Runter',
48 btnSetValue: 'Als ausgewählten Wert festlegen',
49 btnDelete: 'Entfernen'
50 },
51 textarea: {
52 title: 'Textfeldeigenschaften',
53 cols: 'Spalten',
54 rows: 'Reihen'
55 },
56 textfield: {
57 title: 'Textfeldeigenschaften',
58 name: 'Name',
59 value: 'Wert',
60 charWidth: 'Zeichenbreite',
61 maxChars: 'Max. Zeichen',
62 required: 'Erforderlich',
63 type: 'Typ',
64 typeText: 'Text',
65 typePass: 'Passwort',
66 typeEmail: 'E-mail',
67 typeSearch: 'Suche',
68 typeTel: 'Telefonnummer',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/el.js b/sources/plugins/forms/lang/el.js
new file mode 100644
index 00000000..35a8c230
--- /dev/null
+++ b/sources/plugins/forms/lang/el.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'el', {
6 button: {
7 title: 'Ιδιότητες Κουμπιού',
8 text: 'Κείμενο (Τιμή)',
9 type: 'Τύπος',
10 typeBtn: 'Κουμπί',
11 typeSbm: 'Υποβολή',
12 typeRst: 'Επαναφορά'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Ιδιότητες Κουτιού Επιλογής',
16 radioTitle: 'Ιδιότητες Κουμπιού Επιλογής',
17 value: 'Τιμή',
18 selected: 'Επιλεγμένο',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Ιδιότητες Φόρμας',
23 menu: 'Ιδιότητες Φόρμας',
24 action: 'Ενέργεια',
25 method: 'Μέθοδος',
26 encoding: 'Κωδικοποίηση'
27 },
28 hidden: {
29 title: 'Ιδιότητες Κρυφού Πεδίου',
30 name: 'Όνομα',
31 value: 'Τιμή'
32 },
33 select: {
34 title: 'Ιδιότητες Πεδίου Επιλογής',
35 selectInfo: 'Πληροφορίες Πεδίου Επιλογής',
36 opAvail: 'Διαθέσιμες Επιλογές',
37 value: 'Τιμή',
38 size: 'Μέγεθος',
39 lines: 'γραμμές',
40 chkMulti: 'Να επιτρέπονται οι πολλαπλές επιλογές',
41 required: 'Required', // MISSING
42 opText: 'Κείμενο',
43 opValue: 'Τιμή',
44 btnAdd: 'Προσθήκη',
45 btnModify: 'Τροποποίηση',
46 btnUp: 'Πάνω',
47 btnDown: 'Κάτω',
48 btnSetValue: 'Θέση ως προεπιλογή',
49 btnDelete: 'Διαγραφή'
50 },
51 textarea: {
52 title: 'Ιδιότητες Περιοχής Κειμένου',
53 cols: 'Στήλες',
54 rows: 'Σειρές'
55 },
56 textfield: {
57 title: 'Ιδιότητες Πεδίου Κειμένου',
58 name: 'Όνομα',
59 value: 'Τιμή',
60 charWidth: 'Πλάτος Χαρακτήρων',
61 maxChars: 'Μέγιστοι χαρακτήρες',
62 required: 'Required', // MISSING
63 type: 'Τύπος',
64 typeText: 'Κείμενο',
65 typePass: 'Κωδικός',
66 typeEmail: 'Email',
67 typeSearch: 'Αναζήτηση',
68 typeTel: 'Αριθμός Τηλεφώνου',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/en-au.js b/sources/plugins/forms/lang/en-au.js
new file mode 100644
index 00000000..f424f182
--- /dev/null
+++ b/sources/plugins/forms/lang/en-au.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'en-au', {
6 button: {
7 title: 'Button Properties',
8 text: 'Text (Value)',
9 type: 'Type',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Radio Button Properties',
17 value: 'Value',
18 selected: 'Selected',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Form Properties',
23 menu: 'Form Properties',
24 action: 'Action',
25 method: 'Method',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field Properties',
30 name: 'Name',
31 value: 'Value'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Available Options',
37 value: 'Value',
38 size: 'Size',
39 lines: 'lines',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Value',
44 btnAdd: 'Add',
45 btnModify: 'Modify',
46 btnUp: 'Up',
47 btnDown: 'Down',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Delete'
50 },
51 textarea: {
52 title: 'Textarea Properties',
53 cols: 'Columns',
54 rows: 'Rows'
55 },
56 textfield: {
57 title: 'Text Field Properties',
58 name: 'Name',
59 value: 'Value',
60 charWidth: 'Character Width',
61 maxChars: 'Maximum Characters',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Text',
65 typePass: 'Password',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/en-ca.js b/sources/plugins/forms/lang/en-ca.js
new file mode 100644
index 00000000..fa8b3042
--- /dev/null
+++ b/sources/plugins/forms/lang/en-ca.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'en-ca', {
6 button: {
7 title: 'Button Properties',
8 text: 'Text (Value)',
9 type: 'Type',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Radio Button Properties',
17 value: 'Value',
18 selected: 'Selected',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Form Properties',
23 menu: 'Form Properties',
24 action: 'Action',
25 method: 'Method',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field Properties',
30 name: 'Name',
31 value: 'Value'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Available Options',
37 value: 'Value',
38 size: 'Size',
39 lines: 'lines',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Value',
44 btnAdd: 'Add',
45 btnModify: 'Modify',
46 btnUp: 'Up',
47 btnDown: 'Down',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Delete'
50 },
51 textarea: {
52 title: 'Textarea Properties',
53 cols: 'Columns',
54 rows: 'Rows'
55 },
56 textfield: {
57 title: 'Text Field Properties',
58 name: 'Name',
59 value: 'Value',
60 charWidth: 'Character Width',
61 maxChars: 'Maximum Characters',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Text',
65 typePass: 'Password',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/en-gb.js b/sources/plugins/forms/lang/en-gb.js
new file mode 100644
index 00000000..b5c978c2
--- /dev/null
+++ b/sources/plugins/forms/lang/en-gb.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'en-gb', {
6 button: {
7 title: 'Button Properties',
8 text: 'Text (Value)',
9 type: 'Type',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Radio Button Properties',
17 value: 'Value',
18 selected: 'Selected',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Form Properties',
23 menu: 'Form Properties',
24 action: 'Action',
25 method: 'Method',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field Properties',
30 name: 'Name',
31 value: 'Value'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Available Options',
37 value: 'Value',
38 size: 'Size',
39 lines: 'lines',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Value',
44 btnAdd: 'Add',
45 btnModify: 'Modify',
46 btnUp: 'Up',
47 btnDown: 'Down',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Delete'
50 },
51 textarea: {
52 title: 'Textarea Properties',
53 cols: 'Columns',
54 rows: 'Rows'
55 },
56 textfield: {
57 title: 'Text Field Properties',
58 name: 'Name',
59 value: 'Value',
60 charWidth: 'Character Width',
61 maxChars: 'Maximum Characters',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Text',
65 typePass: 'Password',
66 typeEmail: 'E-mail',
67 typeSearch: 'Search',
68 typeTel: 'Telephone Number',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/en.js b/sources/plugins/forms/lang/en.js
new file mode 100644
index 00000000..e094ee9d
--- /dev/null
+++ b/sources/plugins/forms/lang/en.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'en', {
6 button: {
7 title: 'Button Properties',
8 text: 'Text (Value)',
9 type: 'Type',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Radio Button Properties',
17 value: 'Value',
18 selected: 'Selected',
19 required: 'Required'
20 },
21 form: {
22 title: 'Form Properties',
23 menu: 'Form Properties',
24 action: 'Action',
25 method: 'Method',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field Properties',
30 name: 'Name',
31 value: 'Value'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Available Options',
37 value: 'Value',
38 size: 'Size',
39 lines: 'lines',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required',
42 opText: 'Text',
43 opValue: 'Value',
44 btnAdd: 'Add',
45 btnModify: 'Modify',
46 btnUp: 'Up',
47 btnDown: 'Down',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Delete'
50 },
51 textarea: {
52 title: 'Textarea Properties',
53 cols: 'Columns',
54 rows: 'Rows'
55 },
56 textfield: {
57 title: 'Text Field Properties',
58 name: 'Name',
59 value: 'Value',
60 charWidth: 'Character Width',
61 maxChars: 'Maximum Characters',
62 required: 'Required',
63 type: 'Type',
64 typeText: 'Text',
65 typePass: 'Password',
66 typeEmail: 'Email',
67 typeSearch: 'Search',
68 typeTel: 'Telephone Number',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/eo.js b/sources/plugins/forms/lang/eo.js
new file mode 100644
index 00000000..6858a481
--- /dev/null
+++ b/sources/plugins/forms/lang/eo.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'eo', {
6 button: {
7 title: 'Butonaj atributoj',
8 text: 'Teksto (Valoro)',
9 type: 'Tipo',
10 typeBtn: 'Butono',
11 typeSbm: 'Validigi (submit)',
12 typeRst: 'Remeti en la originstaton (Reset)'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Markobutonaj Atributoj',
16 radioTitle: 'Radiobutonaj Atributoj',
17 value: 'Valoro',
18 selected: 'Selektita',
19 required: 'Postulata'
20 },
21 form: {
22 title: 'Formularaj Atributoj',
23 menu: 'Formularaj Atributoj',
24 action: 'Ago',
25 method: 'Metodo',
26 encoding: 'Kodoprezento'
27 },
28 hidden: {
29 title: 'Atributoj de Kaŝita Kampo',
30 name: 'Nomo',
31 value: 'Valoro'
32 },
33 select: {
34 title: 'Atributoj de Elekta Kampo',
35 selectInfo: 'Informoj pri la rulummenuo',
36 opAvail: 'Elektoj Disponeblaj',
37 value: 'Valoro',
38 size: 'Grando',
39 lines: 'Linioj',
40 chkMulti: 'Permesi Plurajn Elektojn',
41 required: 'Postulata',
42 opText: 'Teksto',
43 opValue: 'Valoro',
44 btnAdd: 'Aldoni',
45 btnModify: 'Modifi',
46 btnUp: 'Supren',
47 btnDown: 'Malsupren',
48 btnSetValue: 'Agordi kiel Elektitan Valoron',
49 btnDelete: 'Forigi'
50 },
51 textarea: {
52 title: 'Atributoj de Teksta Areo',
53 cols: 'Kolumnoj',
54 rows: 'Linioj'
55 },
56 textfield: {
57 title: 'Atributoj de Teksta Kampo',
58 name: 'Nomo',
59 value: 'Valoro',
60 charWidth: 'Signolarĝo',
61 maxChars: 'Maksimuma Nombro da Signoj',
62 required: 'Postulata',
63 type: 'Tipo',
64 typeText: 'Teksto',
65 typePass: 'Pasvorto',
66 typeEmail: 'retpoŝtadreso',
67 typeSearch: 'Serĉi',
68 typeTel: 'Telefonnumero',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/es.js b/sources/plugins/forms/lang/es.js
new file mode 100644
index 00000000..0a59faa8
--- /dev/null
+++ b/sources/plugins/forms/lang/es.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'es', {
6 button: {
7 title: 'Propiedades de Botón',
8 text: 'Texto (Valor)',
9 type: 'Tipo',
10 typeBtn: 'Boton',
11 typeSbm: 'Enviar',
12 typeRst: 'Reestablecer'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Propiedades de Casilla',
16 radioTitle: 'Propiedades de Botón de Radio',
17 value: 'Valor',
18 selected: 'Seleccionado',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Propiedades de Formulario',
23 menu: 'Propiedades de Formulario',
24 action: 'Acción',
25 method: 'Método',
26 encoding: 'Codificación'
27 },
28 hidden: {
29 title: 'Propiedades de Campo Oculto',
30 name: 'Nombre',
31 value: 'Valor'
32 },
33 select: {
34 title: 'Propiedades de Campo de Selección',
35 selectInfo: 'Información',
36 opAvail: 'Opciones disponibles',
37 value: 'Valor',
38 size: 'Tamaño',
39 lines: 'Lineas',
40 chkMulti: 'Permitir múltiple selección',
41 required: 'Required', // MISSING
42 opText: 'Texto',
43 opValue: 'Valor',
44 btnAdd: 'Agregar',
45 btnModify: 'Modificar',
46 btnUp: 'Subir',
47 btnDown: 'Bajar',
48 btnSetValue: 'Establecer como predeterminado',
49 btnDelete: 'Eliminar'
50 },
51 textarea: {
52 title: 'Propiedades de Area de Texto',
53 cols: 'Columnas',
54 rows: 'Filas'
55 },
56 textfield: {
57 title: 'Propiedades de Campo de Texto',
58 name: 'Nombre',
59 value: 'Valor',
60 charWidth: 'Caracteres de ancho',
61 maxChars: 'Máximo caracteres',
62 required: 'Required', // MISSING
63 type: 'Tipo',
64 typeText: 'Texto',
65 typePass: 'Contraseña',
66 typeEmail: 'Correo electrónico',
67 typeSearch: 'Buscar',
68 typeTel: 'Número de teléfono',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/et.js b/sources/plugins/forms/lang/et.js
new file mode 100644
index 00000000..a00a4f0c
--- /dev/null
+++ b/sources/plugins/forms/lang/et.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'et', {
6 button: {
7 title: 'Nupu omadused',
8 text: 'Tekst (väärtus)',
9 type: 'Liik',
10 typeBtn: 'Nupp',
11 typeSbm: 'Saada',
12 typeRst: 'Lähtesta'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Märkeruudu omadused',
16 radioTitle: 'Raadionupu omadused',
17 value: 'Väärtus',
18 selected: 'Märgitud',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Vormi omadused',
23 menu: 'Vormi omadused',
24 action: 'Toiming',
25 method: 'Meetod',
26 encoding: 'Kodeering'
27 },
28 hidden: {
29 title: 'Varjatud lahtri omadused',
30 name: 'Nimi',
31 value: 'Väärtus'
32 },
33 select: {
34 title: 'Valiklahtri omadused',
35 selectInfo: 'Info',
36 opAvail: 'Võimalikud valikud:',
37 value: 'Väärtus',
38 size: 'Suurus',
39 lines: 'ridu',
40 chkMulti: 'Võimalik mitu valikut',
41 required: 'Required', // MISSING
42 opText: 'Tekst',
43 opValue: 'Väärtus',
44 btnAdd: 'Lisa',
45 btnModify: 'Muuda',
46 btnUp: 'Üles',
47 btnDown: 'Alla',
48 btnSetValue: 'Määra vaikimisi',
49 btnDelete: 'Kustuta'
50 },
51 textarea: {
52 title: 'Tekstiala omadused',
53 cols: 'Veerge',
54 rows: 'Ridu'
55 },
56 textfield: {
57 title: 'Tekstilahtri omadused',
58 name: 'Nimi',
59 value: 'Väärtus',
60 charWidth: 'Laius (tähemärkides)',
61 maxChars: 'Maksimaalselt tähemärke',
62 required: 'Required', // MISSING
63 type: 'Liik',
64 typeText: 'Tekst',
65 typePass: 'Parool',
66 typeEmail: 'E-mail',
67 typeSearch: 'Otsi',
68 typeTel: 'Telefon',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/eu.js b/sources/plugins/forms/lang/eu.js
new file mode 100644
index 00000000..684ad400
--- /dev/null
+++ b/sources/plugins/forms/lang/eu.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'eu', {
6 button: {
7 title: 'Botoiaren ezaugarriak',
8 text: 'Testua (balioa)',
9 type: 'Mota',
10 typeBtn: 'Botoia',
11 typeSbm: 'Bidali',
12 typeRst: 'Berrezarri'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Kontrol-laukiaren propietateak',
16 radioTitle: 'Aukera-botoiaren propietateak',
17 value: 'Balioa',
18 selected: 'Hautatuta',
19 required: 'Beharrezkoa'
20 },
21 form: {
22 title: 'Formularioaren propietateak',
23 menu: 'Formularioaren propietateak',
24 action: 'Ekintza',
25 method: 'Metodoa',
26 encoding: 'Kodeketa'
27 },
28 hidden: {
29 title: 'Ezkutuko eremuaren propietateak',
30 name: 'Izena',
31 value: 'Balioa'
32 },
33 select: {
34 title: 'Hautespen eremuaren propietateak',
35 selectInfo: 'Hautatu informazioa',
36 opAvail: 'Erabilgarri dauden aukerak',
37 value: 'Balioa',
38 size: 'Tamaina',
39 lines: 'lerro kopurua',
40 chkMulti: 'baimendu hautapen anitzak',
41 required: 'Beharrezkoa',
42 opText: 'Testua',
43 opValue: 'Balioa',
44 btnAdd: 'Gehitu',
45 btnModify: 'Aldatu',
46 btnUp: 'Gora',
47 btnDown: 'Behera',
48 btnSetValue: 'Ezarri hautatutako balio bezala',
49 btnDelete: 'Ezabatu'
50 },
51 textarea: {
52 title: 'Testu-arearen propietateak',
53 cols: 'Zutabeak',
54 rows: 'Errenkadak'
55 },
56 textfield: {
57 title: 'Testu-eremuaren propietateak',
58 name: 'Izena',
59 value: 'Balioa',
60 charWidth: 'Karaktere-zabalera',
61 maxChars: 'Gehienezko karaktereak',
62 required: 'Beharrezkoa',
63 type: 'Mota',
64 typeText: 'Testua',
65 typePass: 'Pasahitza',
66 typeEmail: 'E-posta',
67 typeSearch: 'Bilatu',
68 typeTel: 'Telefono zenbakia',
69 typeUrl: 'URLa'
70 }
71} );
diff --git a/sources/plugins/forms/lang/fa.js b/sources/plugins/forms/lang/fa.js
new file mode 100644
index 00000000..f2b1d7d7
--- /dev/null
+++ b/sources/plugins/forms/lang/fa.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'fa', {
6 button: {
7 title: 'ویژگی​های دکمه',
8 text: 'متن (مقدار)',
9 type: 'نوع',
10 typeBtn: 'دکمه',
11 typeSbm: 'ثبت',
12 typeRst: 'بازنشانی (Reset)'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'ویژگی​های خانهٴ گزینه​ای',
16 radioTitle: 'ویژگی​های دکمهٴ رادیویی',
17 value: 'مقدار',
18 selected: 'برگزیده',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'ویژگی​های فرم',
23 menu: 'ویژگی​های فرم',
24 action: 'رویداد',
25 method: 'متد',
26 encoding: 'رمزنگاری'
27 },
28 hidden: {
29 title: 'ویژگی​های فیلد پنهان',
30 name: 'نام',
31 value: 'مقدار'
32 },
33 select: {
34 title: 'ویژگی​های فیلد چندگزینه​ای',
35 selectInfo: 'اطلاعات',
36 opAvail: 'گزینه​های دردسترس',
37 value: 'مقدار',
38 size: 'اندازه',
39 lines: 'خطوط',
40 chkMulti: 'گزینش چندگانه فراهم باشد',
41 required: 'Required', // MISSING
42 opText: 'متن',
43 opValue: 'مقدار',
44 btnAdd: 'افزودن',
45 btnModify: 'ویرایش',
46 btnUp: 'بالا',
47 btnDown: 'پائین',
48 btnSetValue: 'تنظیم به عنوان مقدار برگزیده',
49 btnDelete: 'پاککردن'
50 },
51 textarea: {
52 title: 'ویژگی​های ناحیهٴ متنی',
53 cols: 'ستون​ها',
54 rows: 'سطرها'
55 },
56 textfield: {
57 title: 'ویژگی​های فیلد متنی',
58 name: 'نام',
59 value: 'مقدار',
60 charWidth: 'پهنای نویسه',
61 maxChars: 'بیشینهٴ نویسه​ها',
62 required: 'Required', // MISSING
63 type: 'نوع',
64 typeText: 'متن',
65 typePass: 'گذرواژه',
66 typeEmail: 'ایمیل',
67 typeSearch: 'جستجو',
68 typeTel: 'شماره تلفن',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/fi.js b/sources/plugins/forms/lang/fi.js
new file mode 100644
index 00000000..cf5ccead
--- /dev/null
+++ b/sources/plugins/forms/lang/fi.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'fi', {
6 button: {
7 title: 'Painikkeen ominaisuudet',
8 text: 'Teksti (arvo)',
9 type: 'Tyyppi',
10 typeBtn: 'Painike',
11 typeSbm: 'Lähetä',
12 typeRst: 'Tyhjennä'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Valintaruudun ominaisuudet',
16 radioTitle: 'Radiopainikkeen ominaisuudet',
17 value: 'Arvo',
18 selected: 'Valittu',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Lomakkeen ominaisuudet',
23 menu: 'Lomakkeen ominaisuudet',
24 action: 'Toiminto',
25 method: 'Tapa',
26 encoding: 'Enkoodaus'
27 },
28 hidden: {
29 title: 'Piilokentän ominaisuudet',
30 name: 'Nimi',
31 value: 'Arvo'
32 },
33 select: {
34 title: 'Valintakentän ominaisuudet',
35 selectInfo: 'Info',
36 opAvail: 'Ominaisuudet',
37 value: 'Arvo',
38 size: 'Koko',
39 lines: 'Rivit',
40 chkMulti: 'Salli usea valinta',
41 required: 'Required', // MISSING
42 opText: 'Teksti',
43 opValue: 'Arvo',
44 btnAdd: 'Lisää',
45 btnModify: 'Muuta',
46 btnUp: 'Ylös',
47 btnDown: 'Alas',
48 btnSetValue: 'Aseta valituksi',
49 btnDelete: 'Poista'
50 },
51 textarea: {
52 title: 'Tekstilaatikon ominaisuudet',
53 cols: 'Sarakkeita',
54 rows: 'Rivejä'
55 },
56 textfield: {
57 title: 'Tekstikentän ominaisuudet',
58 name: 'Nimi',
59 value: 'Arvo',
60 charWidth: 'Leveys',
61 maxChars: 'Maksimi merkkimäärä',
62 required: 'Required', // MISSING
63 type: 'Tyyppi',
64 typeText: 'Teksti',
65 typePass: 'Salasana',
66 typeEmail: 'Sähköposti',
67 typeSearch: 'Haku',
68 typeTel: 'Puhelinnumero',
69 typeUrl: 'Osoite'
70 }
71} );
diff --git a/sources/plugins/forms/lang/fo.js b/sources/plugins/forms/lang/fo.js
new file mode 100644
index 00000000..430e56a9
--- /dev/null
+++ b/sources/plugins/forms/lang/fo.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'fo', {
6 button: {
7 title: 'Eginleikar fyri knøtt',
8 text: 'Tekstur',
9 type: 'Slag',
10 typeBtn: 'Knøttur',
11 typeSbm: 'Send',
12 typeRst: 'Nullstilla'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Eginleikar fyri flugubein',
16 radioTitle: 'Eginleikar fyri radioknøtt',
17 value: 'Virði',
18 selected: 'Valt',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Eginleikar fyri Form',
23 menu: 'Eginleikar fyri Form',
24 action: 'Hending',
25 method: 'Háttur',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Eginleikar fyri fjaldan teig',
30 name: 'Navn',
31 value: 'Virði'
32 },
33 select: {
34 title: 'Eginleikar fyri valskrá',
35 selectInfo: 'Upplýsingar',
36 opAvail: 'Tøkir møguleikar',
37 value: 'Virði',
38 size: 'Stødd',
39 lines: 'Linjur',
40 chkMulti: 'Loyv fleiri valmøguleikum samstundis',
41 required: 'Required', // MISSING
42 opText: 'Tekstur',
43 opValue: 'Virði',
44 btnAdd: 'Legg afturat',
45 btnModify: 'Broyt',
46 btnUp: 'Upp',
47 btnDown: 'Niður',
48 btnSetValue: 'Set sum valt virði',
49 btnDelete: 'Strika'
50 },
51 textarea: {
52 title: 'Eginleikar fyri tekstumráði',
53 cols: 'kolonnur',
54 rows: 'røðir'
55 },
56 textfield: {
57 title: 'Eginleikar fyri tekstteig',
58 name: 'Navn',
59 value: 'Virði',
60 charWidth: 'Breidd (sjónlig tekn)',
61 maxChars: 'Mest loyvdu tekn',
62 required: 'Required', // MISSING
63 type: 'Slag',
64 typeText: 'Tekstur',
65 typePass: 'Loyniorð',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/fr-ca.js b/sources/plugins/forms/lang/fr-ca.js
new file mode 100644
index 00000000..a468bd0c
--- /dev/null
+++ b/sources/plugins/forms/lang/fr-ca.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'fr-ca', {
6 button: {
7 title: 'Propriétés du bouton',
8 text: 'Texte (Valeur)',
9 type: 'Type',
10 typeBtn: 'Bouton',
11 typeSbm: 'Soumettre',
12 typeRst: 'Réinitialiser'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Propriétés de la case à cocher',
16 radioTitle: 'Propriétés du bouton radio',
17 value: 'Valeur',
18 selected: 'Sélectionné',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Propriétés du formulaire',
23 menu: 'Propriétés du formulaire',
24 action: 'Action',
25 method: 'Méthode',
26 encoding: 'Encodage'
27 },
28 hidden: {
29 title: 'Propriétés du champ caché',
30 name: 'Nom',
31 value: 'Valeur'
32 },
33 select: {
34 title: 'Propriétés du champ de sélection',
35 selectInfo: 'Info',
36 opAvail: 'Options disponibles',
37 value: 'Valeur',
38 size: 'Taille',
39 lines: 'lignes',
40 chkMulti: 'Permettre les sélections multiples',
41 required: 'Required', // MISSING
42 opText: 'Texte',
43 opValue: 'Valeur',
44 btnAdd: 'Ajouter',
45 btnModify: 'Modifier',
46 btnUp: 'Monter',
47 btnDown: 'Descendre',
48 btnSetValue: 'Valeur sélectionnée',
49 btnDelete: 'Supprimer'
50 },
51 textarea: {
52 title: 'Propriétés de la zone de texte',
53 cols: 'Colonnes',
54 rows: 'Lignes'
55 },
56 textfield: {
57 title: 'Propriétés du champ texte',
58 name: 'Nom',
59 value: 'Valeur',
60 charWidth: 'Largeur de caractères',
61 maxChars: 'Nombre maximum de caractères',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Texte',
65 typePass: 'Mot de passe',
66 typeEmail: 'Courriel',
67 typeSearch: 'Recherche',
68 typeTel: 'Numéro de téléphone',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/fr.js b/sources/plugins/forms/lang/fr.js
new file mode 100644
index 00000000..d4024ed1
--- /dev/null
+++ b/sources/plugins/forms/lang/fr.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'fr', {
6 button: {
7 title: 'Propriétés du bouton',
8 text: 'Texte (Value)',
9 type: 'Type',
10 typeBtn: 'Bouton',
11 typeSbm: 'Validation (submit)',
12 typeRst: 'Remise à zéro'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Propriétés de la case à cocher',
16 radioTitle: 'Propriétés du bouton Radio',
17 value: 'Valeur',
18 selected: 'Sélectionné',
19 required: 'Requis'
20 },
21 form: {
22 title: 'Propriétés du formulaire',
23 menu: 'Propriétés du formulaire',
24 action: 'Action',
25 method: 'Méthode',
26 encoding: 'Encodage'
27 },
28 hidden: {
29 title: 'Propriétés du champ caché',
30 name: 'Nom',
31 value: 'Valeur'
32 },
33 select: {
34 title: 'Propriétés du menu déroulant',
35 selectInfo: 'Informations sur le menu déroulant',
36 opAvail: 'Options disponibles',
37 value: 'Valeur',
38 size: 'Taille',
39 lines: 'Lignes',
40 chkMulti: 'Permettre les sélections multiples',
41 required: 'Requis',
42 opText: 'Texte',
43 opValue: 'Valeur',
44 btnAdd: 'Ajouter',
45 btnModify: 'Modifier',
46 btnUp: 'Haut',
47 btnDown: 'Bas',
48 btnSetValue: 'Définir comme valeur sélectionnée',
49 btnDelete: 'Supprimer'
50 },
51 textarea: {
52 title: 'Propriétés de la zone de texte',
53 cols: 'Colonnes',
54 rows: 'Lignes'
55 },
56 textfield: {
57 title: 'Propriétés du champ texte',
58 name: 'Nom',
59 value: 'Valeur',
60 charWidth: 'Taille des caractères',
61 maxChars: 'Nombre maximum de caractères',
62 required: 'Requis',
63 type: 'Type',
64 typeText: 'Texte',
65 typePass: 'Mot de passe',
66 typeEmail: 'E-mail',
67 typeSearch: 'Rechercher',
68 typeTel: 'Numéro de téléphone',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/gl.js b/sources/plugins/forms/lang/gl.js
new file mode 100644
index 00000000..efe96d93
--- /dev/null
+++ b/sources/plugins/forms/lang/gl.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'gl', {
6 button: {
7 title: 'Propiedades do botón',
8 text: 'Texto (Valor)',
9 type: 'Tipo',
10 typeBtn: 'Botón',
11 typeSbm: 'Enviar',
12 typeRst: 'Restabelever'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Propiedades da caixa de selección',
16 radioTitle: 'Propiedades do botón de opción',
17 value: 'Valor',
18 selected: 'Seleccionado',
19 required: 'Requirido'
20 },
21 form: {
22 title: 'Propiedades do formulario',
23 menu: 'Propiedades do formulario',
24 action: 'Acción',
25 method: 'Método',
26 encoding: 'Codificación'
27 },
28 hidden: {
29 title: 'Propiedades do campo agochado',
30 name: 'Nome',
31 value: 'Valor'
32 },
33 select: {
34 title: 'Propiedades do campo de selección',
35 selectInfo: 'Información',
36 opAvail: 'Opcións dispoñíbeis',
37 value: 'Valor',
38 size: 'Tamaño',
39 lines: 'liñas',
40 chkMulti: 'Permitir múltiplas seleccións',
41 required: 'Requirido',
42 opText: 'Texto',
43 opValue: 'Valor',
44 btnAdd: 'Engadir',
45 btnModify: 'Modificar',
46 btnUp: 'Subir',
47 btnDown: 'Baixar',
48 btnSetValue: 'Estabelecer como valor seleccionado',
49 btnDelete: 'Eliminar'
50 },
51 textarea: {
52 title: 'Propiedades da área de texto',
53 cols: 'Columnas',
54 rows: 'Filas'
55 },
56 textfield: {
57 title: 'Propiedades do campo de texto',
58 name: 'Nome',
59 value: 'Valor',
60 charWidth: 'Largo do carácter',
61 maxChars: 'Núm. máximo de caracteres',
62 required: 'Requirido',
63 type: 'Tipo',
64 typeText: 'Texto',
65 typePass: 'Contrasinal',
66 typeEmail: 'Correo',
67 typeSearch: 'Buscar',
68 typeTel: 'Número de teléfono',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/gu.js b/sources/plugins/forms/lang/gu.js
new file mode 100644
index 00000000..e02d7ac0
--- /dev/null
+++ b/sources/plugins/forms/lang/gu.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'gu', {
6 button: {
7 title: 'બટનના ગુણ',
8 text: 'ટેક્સ્ટ (વૅલ્યૂ)',
9 type: 'પ્રકાર',
10 typeBtn: 'બટન',
11 typeSbm: 'સબ્મિટ',
12 typeRst: 'રિસેટ'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'ચેક બોક્સ ગુણ',
16 radioTitle: 'રેડિઓ બટનના ગુણ',
17 value: 'વૅલ્યૂ',
18 selected: 'સિલેક્ટેડ',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'ફૉર્મ/પત્રકના ગુણ',
23 menu: 'ફૉર્મ/પત્રકના ગુણ',
24 action: 'ક્રિયા',
25 method: 'પદ્ધતિ',
26 encoding: 'અન્કોડીન્ગ'
27 },
28 hidden: {
29 title: 'ગુપ્ત ક્ષેત્રના ગુણ',
30 name: 'નામ',
31 value: 'વૅલ્યૂ'
32 },
33 select: {
34 title: 'પસંદગી ક્ષેત્રના ગુણ',
35 selectInfo: 'સૂચના',
36 opAvail: 'ઉપલબ્ધ વિકલ્પ',
37 value: 'વૅલ્યૂ',
38 size: 'સાઇઝ',
39 lines: 'લીટીઓ',
40 chkMulti: 'એકથી વધારે પસંદ કરી શકો',
41 required: 'Required', // MISSING
42 opText: 'ટેક્સ્ટ',
43 opValue: 'વૅલ્યૂ',
44 btnAdd: 'ઉમેરવું',
45 btnModify: 'બદલવું',
46 btnUp: 'ઉપર',
47 btnDown: 'નીચે',
48 btnSetValue: 'પસંદ કરલી વૅલ્યૂ સેટ કરો',
49 btnDelete: 'રદ કરવું'
50 },
51 textarea: {
52 title: 'ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ',
53 cols: 'કૉલમ/ઊભી કટાર',
54 rows: 'પંક્તિઓ'
55 },
56 textfield: {
57 title: 'ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ',
58 name: 'નામ',
59 value: 'વૅલ્યૂ',
60 charWidth: 'કેરેક્ટરની પહોળાઈ',
61 maxChars: 'અધિકતમ કેરેક્ટર',
62 required: 'Required', // MISSING
63 type: 'ટાઇપ',
64 typeText: 'ટેક્સ્ટ',
65 typePass: 'પાસવર્ડ',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/he.js b/sources/plugins/forms/lang/he.js
new file mode 100644
index 00000000..7b0222e5
--- /dev/null
+++ b/sources/plugins/forms/lang/he.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'he', {
6 button: {
7 title: 'מאפייני כפתור',
8 text: 'טקסט (ערך)',
9 type: 'סוג',
10 typeBtn: 'כפתור',
11 typeSbm: 'שליחה',
12 typeRst: 'איפוס'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'מאפייני תיבת סימון',
16 radioTitle: 'מאפייני לחצן אפשרויות',
17 value: 'ערך',
18 selected: 'מסומן',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'מאפיני טופס',
23 menu: 'מאפיני טופס',
24 action: 'שלח אל',
25 method: 'סוג שליחה',
26 encoding: 'קידוד'
27 },
28 hidden: {
29 title: 'מאפיני שדה חבוי',
30 name: 'שם',
31 value: 'ערך'
32 },
33 select: {
34 title: 'מאפייני שדה בחירה',
35 selectInfo: 'מידע',
36 opAvail: 'אפשרויות זמינות',
37 value: 'ערך',
38 size: 'גודל',
39 lines: 'שורות',
40 chkMulti: 'איפשור בחירות מרובות',
41 required: 'Required', // MISSING
42 opText: 'טקסט',
43 opValue: 'ערך',
44 btnAdd: 'הוספה',
45 btnModify: 'שינוי',
46 btnUp: 'למעלה',
47 btnDown: 'למטה',
48 btnSetValue: 'קביעה כברירת מחדל',
49 btnDelete: 'מחיקה'
50 },
51 textarea: {
52 title: 'מאפייני איזור טקסט',
53 cols: 'עמודות',
54 rows: 'שורות'
55 },
56 textfield: {
57 title: 'מאפייני שדה טקסט',
58 name: 'שם',
59 value: 'ערך',
60 charWidth: 'רוחב לפי תווים',
61 maxChars: 'מקסימום תווים',
62 required: 'Required', // MISSING
63 type: 'סוג',
64 typeText: 'טקסט',
65 typePass: 'סיסמה',
66 typeEmail: 'דוא"ל',
67 typeSearch: 'חיפוש',
68 typeTel: 'מספר טלפון',
69 typeUrl: 'כתובת (URL)'
70 }
71} );
diff --git a/sources/plugins/forms/lang/hi.js b/sources/plugins/forms/lang/hi.js
new file mode 100644
index 00000000..32134b6f
--- /dev/null
+++ b/sources/plugins/forms/lang/hi.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'hi', {
6 button: {
7 title: 'बटन प्रॉपर्टीज़',
8 text: 'टेक्स्ट (वैल्यू)',
9 type: 'प्रकार',
10 typeBtn: 'बटन',
11 typeSbm: 'सब्मिट',
12 typeRst: 'रिसेट'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'चॅक बॉक्स प्रॉपर्टीज़',
16 radioTitle: 'रेडिओ बटन प्रॉपर्टीज़',
17 value: 'वैल्यू',
18 selected: 'सॅलॅक्टॅड',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'फ़ॉर्म प्रॉपर्टीज़',
23 menu: 'फ़ॉर्म प्रॉपर्टीज़',
24 action: 'क्रिया',
25 method: 'तरीका',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'गुप्त फ़ील्ड प्रॉपर्टीज़',
30 name: 'नाम',
31 value: 'वैल्यू'
32 },
33 select: {
34 title: 'चुनाव फ़ील्ड प्रॉपर्टीज़',
35 selectInfo: 'सूचना',
36 opAvail: 'उपलब्ध विकल्प',
37 value: 'वैल्यू',
38 size: 'साइज़',
39 lines: 'पंक्तियाँ',
40 chkMulti: 'एक से ज्यादा विकल्प चुनने दें',
41 required: 'Required', // MISSING
42 opText: 'टेक्स्ट',
43 opValue: 'वैल्यू',
44 btnAdd: 'जोड़ें',
45 btnModify: 'बदलें',
46 btnUp: 'ऊपर',
47 btnDown: 'नीचे',
48 btnSetValue: 'चुनी गई वैल्यू सॅट करें',
49 btnDelete: 'डिलीट'
50 },
51 textarea: {
52 title: 'टेक्स्त एरिया प्रॉपर्टीज़',
53 cols: 'कालम',
54 rows: 'पंक्तियां'
55 },
56 textfield: {
57 title: 'टेक्स्ट फ़ील्ड प्रॉपर्टीज़',
58 name: 'नाम',
59 value: 'वैल्यू',
60 charWidth: 'करॅक्टर की चौढ़ाई',
61 maxChars: 'अधिकतम करॅक्टर',
62 required: 'Required', // MISSING
63 type: 'टाइप',
64 typeText: 'टेक्स्ट',
65 typePass: 'पास्वर्ड',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/hr.js b/sources/plugins/forms/lang/hr.js
new file mode 100644
index 00000000..0fee02ec
--- /dev/null
+++ b/sources/plugins/forms/lang/hr.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'hr', {
6 button: {
7 title: 'Button svojstva',
8 text: 'Tekst (vrijednost)',
9 type: 'Vrsta',
10 typeBtn: 'Gumb',
11 typeSbm: 'Pošalji',
12 typeRst: 'Poništi'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox svojstva',
16 radioTitle: 'Radio Button svojstva',
17 value: 'Vrijednost',
18 selected: 'Odabrano',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Form svojstva',
23 menu: 'Form svojstva',
24 action: 'Akcija',
25 method: 'Metoda',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field svojstva',
30 name: 'Ime',
31 value: 'Vrijednost'
32 },
33 select: {
34 title: 'Selection svojstva',
35 selectInfo: 'Info',
36 opAvail: 'Dostupne opcije',
37 value: 'Vrijednost',
38 size: 'Veličina',
39 lines: 'linija',
40 chkMulti: 'Dozvoli višestruki odabir',
41 required: 'Required', // MISSING
42 opText: 'Tekst',
43 opValue: 'Vrijednost',
44 btnAdd: 'Dodaj',
45 btnModify: 'Promijeni',
46 btnUp: 'Gore',
47 btnDown: 'Dolje',
48 btnSetValue: 'Postavi kao odabranu vrijednost',
49 btnDelete: 'Obriši'
50 },
51 textarea: {
52 title: 'Textarea svojstva',
53 cols: 'Kolona',
54 rows: 'Redova'
55 },
56 textfield: {
57 title: 'Text Field svojstva',
58 name: 'Ime',
59 value: 'Vrijednost',
60 charWidth: 'Širina',
61 maxChars: 'Najviše karaktera',
62 required: 'Required', // MISSING
63 type: 'Vrsta',
64 typeText: 'Tekst',
65 typePass: 'Šifra',
66 typeEmail: 'Email',
67 typeSearch: 'Traži',
68 typeTel: 'Broj telefona',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/hu.js b/sources/plugins/forms/lang/hu.js
new file mode 100644
index 00000000..aa5893af
--- /dev/null
+++ b/sources/plugins/forms/lang/hu.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'hu', {
6 button: {
7 title: 'Gomb tulajdonságai',
8 text: 'Szöveg (Érték)',
9 type: 'Típus',
10 typeBtn: 'Gomb',
11 typeSbm: 'Küldés',
12 typeRst: 'Alaphelyzet'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Jelölőnégyzet tulajdonságai',
16 radioTitle: 'Választógomb tulajdonságai',
17 value: 'Érték',
18 selected: 'Kiválasztott',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Űrlap tulajdonságai',
23 menu: 'Űrlap tulajdonságai',
24 action: 'Adatfeldolgozást végző hivatkozás',
25 method: 'Adatküldés módja',
26 encoding: 'Kódolás'
27 },
28 hidden: {
29 title: 'Rejtett mező tulajdonságai',
30 name: 'Név',
31 value: 'Érték'
32 },
33 select: {
34 title: 'Legördülő lista tulajdonságai',
35 selectInfo: 'Alaptulajdonságok',
36 opAvail: 'Elérhető opciók',
37 value: 'Érték',
38 size: 'Méret',
39 lines: 'sor',
40 chkMulti: 'több sor is kiválasztható',
41 required: 'Required', // MISSING
42 opText: 'Szöveg',
43 opValue: 'Érték',
44 btnAdd: 'Hozzáad',
45 btnModify: 'Módosít',
46 btnUp: 'Fel',
47 btnDown: 'Le',
48 btnSetValue: 'Legyen az alapértelmezett érték',
49 btnDelete: 'Töröl'
50 },
51 textarea: {
52 title: 'Szövegterület tulajdonságai',
53 cols: 'Karakterek száma egy sorban',
54 rows: 'Sorok száma'
55 },
56 textfield: {
57 title: 'Szövegmező tulajdonságai',
58 name: 'Név',
59 value: 'Érték',
60 charWidth: 'Megjelenített karakterek száma',
61 maxChars: 'Maximális karakterszám',
62 required: 'Required', // MISSING
63 type: 'Típus',
64 typeText: 'Szöveg',
65 typePass: 'Jelszó',
66 typeEmail: 'Ímél',
67 typeSearch: 'Keresés',
68 typeTel: 'Telefonszám',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/id.js b/sources/plugins/forms/lang/id.js
new file mode 100644
index 00000000..f70162eb
--- /dev/null
+++ b/sources/plugins/forms/lang/id.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'id', {
6 button: {
7 title: 'Properti Tombol',
8 text: 'Teks (Nilai)',
9 type: 'Tipe',
10 typeBtn: 'Tombol',
11 typeSbm: 'Menyerahkan',
12 typeRst: 'Atur Ulang'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties', // MISSING
16 radioTitle: 'Radio Button Properties', // MISSING
17 value: 'Nilai',
18 selected: 'Terpilih',
19 required: 'Wajib'
20 },
21 form: {
22 title: 'Form Properties', // MISSING
23 menu: 'Form Properties', // MISSING
24 action: 'Aksi',
25 method: 'Metode',
26 encoding: 'Encoding' // MISSING
27 },
28 hidden: {
29 title: 'Hidden Field Properties', // MISSING
30 name: 'Nama',
31 value: 'Nilai'
32 },
33 select: {
34 title: 'Selection Field Properties', // MISSING
35 selectInfo: 'Select Info', // MISSING
36 opAvail: 'Available Options', // MISSING
37 value: 'Nilai',
38 size: 'Ukuran',
39 lines: 'garis',
40 chkMulti: 'Izinkan pemilihan ganda',
41 required: 'Wajib',
42 opText: 'Teks',
43 opValue: 'Nilai',
44 btnAdd: 'Tambah',
45 btnModify: 'Modifikasi',
46 btnUp: 'Atas',
47 btnDown: 'Bawah',
48 btnSetValue: 'Atur sebagai nilai yang dipilih',
49 btnDelete: 'Hapus'
50 },
51 textarea: {
52 title: 'Textarea Properties', // MISSING
53 cols: 'Kolom',
54 rows: 'Baris'
55 },
56 textfield: {
57 title: 'Text Field Properties', // MISSING
58 name: 'Name',
59 value: 'Nilai',
60 charWidth: 'Character Width', // MISSING
61 maxChars: 'Maximum Characters', // MISSING
62 required: 'Wajib',
63 type: 'Tipe',
64 typeText: 'Teks',
65 typePass: 'Kata kunci',
66 typeEmail: 'Surel',
67 typeSearch: 'Cari',
68 typeTel: 'Nomor Telepon',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/is.js b/sources/plugins/forms/lang/is.js
new file mode 100644
index 00000000..d94d35fb
--- /dev/null
+++ b/sources/plugins/forms/lang/is.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'is', {
6 button: {
7 title: 'Eigindi hnapps',
8 text: 'Texti',
9 type: 'Gerð',
10 typeBtn: 'Hnappur',
11 typeSbm: 'Staðfesta',
12 typeRst: 'Hreinsa'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Eigindi markreits',
16 radioTitle: 'Eigindi valhnapps',
17 value: 'Gildi',
18 selected: 'Valið',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Eigindi innsláttarforms',
23 menu: 'Eigindi innsláttarforms',
24 action: 'Aðgerð',
25 method: 'Aðferð',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Eigindi falins svæðis',
30 name: 'Nafn',
31 value: 'Gildi'
32 },
33 select: {
34 title: 'Eigindi lista',
35 selectInfo: 'Upplýsingar',
36 opAvail: 'Kostir',
37 value: 'Gildi',
38 size: 'Stærð',
39 lines: 'línur',
40 chkMulti: 'Leyfa fleiri kosti',
41 required: 'Required', // MISSING
42 opText: 'Texti',
43 opValue: 'Gildi',
44 btnAdd: 'Bæta við',
45 btnModify: 'Breyta',
46 btnUp: 'Upp',
47 btnDown: 'Niður',
48 btnSetValue: 'Merkja sem valið',
49 btnDelete: 'Eyða'
50 },
51 textarea: {
52 title: 'Eigindi textasvæðis',
53 cols: 'Dálkar',
54 rows: 'Línur'
55 },
56 textfield: {
57 title: 'Eigindi textareits',
58 name: 'Nafn',
59 value: 'Gildi',
60 charWidth: 'Breidd (leturtákn)',
61 maxChars: 'Hámarksfjöldi leturtákna',
62 required: 'Required', // MISSING
63 type: 'Gerð',
64 typeText: 'Texti',
65 typePass: 'Lykilorð',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'Vefslóð'
70 }
71} );
diff --git a/sources/plugins/forms/lang/it.js b/sources/plugins/forms/lang/it.js
new file mode 100644
index 00000000..491ae0f7
--- /dev/null
+++ b/sources/plugins/forms/lang/it.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'it', {
6 button: {
7 title: 'Proprietà bottone',
8 text: 'Testo (Valore)',
9 type: 'Tipo',
10 typeBtn: 'Bottone',
11 typeSbm: 'Invio',
12 typeRst: 'Annulla'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Proprietà checkbox',
16 radioTitle: 'Proprietà radio button',
17 value: 'Valore',
18 selected: 'Selezionato',
19 required: 'Richiesto'
20 },
21 form: {
22 title: 'Proprietà modulo',
23 menu: 'Proprietà modulo',
24 action: 'Azione',
25 method: 'Metodo',
26 encoding: 'Codifica'
27 },
28 hidden: {
29 title: 'Proprietà campo nascosto',
30 name: 'Nome',
31 value: 'Valore'
32 },
33 select: {
34 title: 'Proprietà menu di selezione',
35 selectInfo: 'Info',
36 opAvail: 'Opzioni disponibili',
37 value: 'Valore',
38 size: 'Dimensione',
39 lines: 'righe',
40 chkMulti: 'Permetti selezione multipla',
41 required: 'Richiesto',
42 opText: 'Testo',
43 opValue: 'Valore',
44 btnAdd: 'Aggiungi',
45 btnModify: 'Modifica',
46 btnUp: 'Su',
47 btnDown: 'Gi',
48 btnSetValue: 'Imposta come predefinito',
49 btnDelete: 'Rimuovi'
50 },
51 textarea: {
52 title: 'Proprietà area di testo',
53 cols: 'Colonne',
54 rows: 'Righe'
55 },
56 textfield: {
57 title: 'Proprietà campo di testo',
58 name: 'Nome',
59 value: 'Valore',
60 charWidth: 'Larghezza',
61 maxChars: 'Numero massimo di caratteri',
62 required: 'Richiesto',
63 type: 'Tipo',
64 typeText: 'Testo',
65 typePass: 'Password',
66 typeEmail: 'Email',
67 typeSearch: 'Cerca',
68 typeTel: 'Numero di telefono',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ja.js b/sources/plugins/forms/lang/ja.js
new file mode 100644
index 00000000..6b878901
--- /dev/null
+++ b/sources/plugins/forms/lang/ja.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ja', {
6 button: {
7 title: 'ボタン プロパティ',
8 text: 'テキスト (値)',
9 type: 'タイプ',
10 typeBtn: 'ボタン',
11 typeSbm: '送信',
12 typeRst: 'リセット'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'チェックボックスのプロパティ',
16 radioTitle: 'ラジオボタンのプロパティ',
17 value: '値',
18 selected: '選択済み',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'フォームのプロパティ',
23 menu: 'フォームのプロパティ',
24 action: 'アクション (action)',
25 method: 'メソッド (method)',
26 encoding: 'エンコード方式 (encoding)'
27 },
28 hidden: {
29 title: '不可視フィールド プロパティ',
30 name: '名前 (name)',
31 value: '値 (value)'
32 },
33 select: {
34 title: '選択フィールドのプロパティ',
35 selectInfo: '情報',
36 opAvail: '利用可能なオプション',
37 value: '選択項目値',
38 size: 'サイズ',
39 lines: '行',
40 chkMulti: '複数選択を許可',
41 required: 'Required', // MISSING
42 opText: '選択項目名',
43 opValue: '値',
44 btnAdd: '追加',
45 btnModify: '編集',
46 btnUp: '上へ',
47 btnDown: '下へ',
48 btnSetValue: '選択した値を設定',
49 btnDelete: '削除'
50 },
51 textarea: {
52 title: 'テキストエリア プロパティ',
53 cols: '列',
54 rows: '行'
55 },
56 textfield: {
57 title: '1行テキスト プロパティ',
58 name: '名前',
59 value: '値',
60 charWidth: 'サイズ',
61 maxChars: '最大長',
62 required: 'Required', // MISSING
63 type: 'タイプ',
64 typeText: 'テキスト',
65 typePass: 'パスワード入力',
66 typeEmail: 'メール',
67 typeSearch: '検索',
68 typeTel: '電話番号',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ka.js b/sources/plugins/forms/lang/ka.js
new file mode 100644
index 00000000..2f9e0975
--- /dev/null
+++ b/sources/plugins/forms/lang/ka.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ka', {
6 button: {
7 title: 'ღილაკის პარამეტრები',
8 text: 'ტექსტი',
9 type: 'ტიპი',
10 typeBtn: 'ღილაკი',
11 typeSbm: 'გაგზავნა',
12 typeRst: 'გასუფთავება'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'მონიშვნის ღილაკის (Checkbox) პარამეტრები',
16 radioTitle: 'ასარჩევი ღილაკის (Radio) პარამეტრები',
17 value: 'ტექსტი',
18 selected: 'არჩეული',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'ფორმის პარამეტრები',
23 menu: 'ფორმის პარამეტრები',
24 action: 'ქმედება',
25 method: 'მეთოდი',
26 encoding: 'კოდირება'
27 },
28 hidden: {
29 title: 'მალული ველის პარამეტრები',
30 name: 'სახელი',
31 value: 'მნიშვნელობა'
32 },
33 select: {
34 title: 'არჩევის ველის პარამეტრები',
35 selectInfo: 'ინფორმაცია',
36 opAvail: 'შესაძლებელი ვარიანტები',
37 value: 'მნიშვნელობა',
38 size: 'ზომა',
39 lines: 'ხაზები',
40 chkMulti: 'მრავლობითი არჩევანის საშუალება',
41 required: 'Required', // MISSING
42 opText: 'ტექსტი',
43 opValue: 'მნიშვნელობა',
44 btnAdd: 'დამატება',
45 btnModify: 'შეცვლა',
46 btnUp: 'ზემოთ',
47 btnDown: 'ქვემოთ',
48 btnSetValue: 'ამორჩეულ მნიშვნელოვნად დაყენება',
49 btnDelete: 'წაშლა'
50 },
51 textarea: {
52 title: 'ტექსტური არის პარამეტრები',
53 cols: 'სვეტები',
54 rows: 'სტრიქონები'
55 },
56 textfield: {
57 title: 'ტექსტური ველის პარამეტრები',
58 name: 'სახელი',
59 value: 'მნიშვნელობა',
60 charWidth: 'სიმბოლოს ზომა',
61 maxChars: 'ასოების მაქსიმალური ოდენობა',
62 required: 'Required', // MISSING
63 type: 'ტიპი',
64 typeText: 'ტექსტი',
65 typePass: 'პაროლი',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/km.js b/sources/plugins/forms/lang/km.js
new file mode 100644
index 00000000..696d2cd7
--- /dev/null
+++ b/sources/plugins/forms/lang/km.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'km', {
6 button: {
7 title: 'លក្ខណៈ​ប៊ូតុង',
8 text: 'អត្ថបទ (តម្លៃ)',
9 type: 'ប្រភេទ',
10 typeBtn: 'ប៊ូតុង',
11 typeSbm: 'ដាក់ស្នើ',
12 typeRst: 'កំណត់​ឡើង​វិញ'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'លក្ខណៈ​ប្រអប់​ធីក',
16 radioTitle: 'លក្ខនៈ​ប៊ូតុង​មូល',
17 value: 'តម្លៃ',
18 selected: 'បាន​ជ្រើស',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'លក្ខណៈ​បែបបទ',
23 menu: 'លក្ខណៈ​បែបបទ',
24 action: 'សកម្មភាព',
25 method: 'វិធីសាស្ត្រ',
26 encoding: 'ការ​អ៊ិនកូដ'
27 },
28 hidden: {
29 title: 'លក្ខណៈ​វាល​កំបាំង',
30 name: 'ឈ្មោះ',
31 value: 'តម្លៃ'
32 },
33 select: {
34 title: 'លក្ខណៈ​វាល​ជម្រើស',
35 selectInfo: 'ព័ត៌មាន​ជម្រើស',
36 opAvail: 'ជម្រើស​ដែល​មាន',
37 value: 'តម្លៃ',
38 size: 'ទំហំ',
39 lines: 'បន្ទាត់',
40 chkMulti: 'អនុញ្ញាត​ពហុ​ជម្រើស',
41 required: 'Required', // MISSING
42 opText: 'អត្ថបទ',
43 opValue: 'តម្លៃ',
44 btnAdd: 'បន្ថែម',
45 btnModify: 'ផ្លាស់ប្តូរ',
46 btnUp: 'លើ',
47 btnDown: 'ក្រោម',
48 btnSetValue: 'កំណត់​ជា​តម្លៃ​ដែល​បាន​ជ្រើស',
49 btnDelete: 'លុប'
50 },
51 textarea: {
52 title: 'លក្ខណៈ​ប្រអប់​អត្ថបទ',
53 cols: 'ជួរឈរ',
54 rows: 'ជួរដេក'
55 },
56 textfield: {
57 title: 'លក្ខណៈ​វាល​អត្ថបទ',
58 name: 'ឈ្មោះ',
59 value: 'តម្លៃ',
60 charWidth: 'ទទឹង​តួ​អក្សរ',
61 maxChars: 'អក្សរអតិបរិមា',
62 required: 'Required', // MISSING
63 type: 'ប្រភេទ',
64 typeText: 'អត្ថបទ',
65 typePass: 'ពាក្យសម្ងាត់',
66 typeEmail: 'អ៊ីមែល',
67 typeSearch: 'ស្វែង​រក',
68 typeTel: 'លេខ​ទូរសព្ទ',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ko.js b/sources/plugins/forms/lang/ko.js
new file mode 100644
index 00000000..03ff2050
--- /dev/null
+++ b/sources/plugins/forms/lang/ko.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ko', {
6 button: {
7 title: '버튼 속성',
8 text: '글자 (값)',
9 type: '종류',
10 typeBtn: '버튼',
11 typeSbm: '제출',
12 typeRst: '재설정'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: '체크 박스 속성',
16 radioTitle: '라디오 버튼 속성',
17 value: '값',
18 selected: '선택됨',
19 required: '필수 항목'
20 },
21 form: {
22 title: '폼 속성',
23 menu: '폼 속성',
24 action: '실행 경로(Action)',
25 method: '방법(Method)',
26 encoding: '인코딩'
27 },
28 hidden: {
29 title: '숨은 입력 칸 속성',
30 name: '이름',
31 value: '값'
32 },
33 select: {
34 title: '선택 목록 속성',
35 selectInfo: '선택 정보',
36 opAvail: '옵션',
37 value: '값',
38 size: '크기',
39 lines: '줄',
40 chkMulti: '여러 항목 선택 허용',
41 required: '필수 항목',
42 opText: '이름',
43 opValue: '값',
44 btnAdd: '추가',
45 btnModify: '수정',
46 btnUp: '위',
47 btnDown: '아래',
48 btnSetValue: '선택된 것으로 설정',
49 btnDelete: '삭제'
50 },
51 textarea: {
52 title: '여러 줄 입력 칸 속성',
53 cols: '칸 수',
54 rows: '줄 수'
55 },
56 textfield: {
57 title: '한 줄 입력 칸 속성',
58 name: '이름',
59 value: '값',
60 charWidth: '글자 너비',
61 maxChars: '최대 글자 수',
62 required: '필수 항목',
63 type: '형식',
64 typeText: '문자열',
65 typePass: '비밀번호',
66 typeEmail: '이메일',
67 typeSearch: '검색',
68 typeTel: '전화번호',
69 typeUrl: '웹 주소(URL)'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ku.js b/sources/plugins/forms/lang/ku.js
new file mode 100644
index 00000000..55556131
--- /dev/null
+++ b/sources/plugins/forms/lang/ku.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ku', {
6 button: {
7 title: 'خاسیەتی دوگمە',
8 text: '(نرخی) دەق',
9 type: 'جۆر',
10 typeBtn: 'دوگمە',
11 typeSbm: 'بنێرە',
12 typeRst: 'ڕێکخستنەوە'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'خاسیەتی چووارگۆشی پشکنین',
16 radioTitle: 'خاسیەتی جێگرەوەی دوگمە',
17 value: 'نرخ',
18 selected: 'هەڵبژاردرا',
19 required: 'پێویستە'
20 },
21 form: {
22 title: 'خاسیەتی داڕشتە',
23 menu: 'خاسیەتی داڕشتە',
24 action: 'کردار',
25 method: 'ڕێگە',
26 encoding: 'بەکۆدکەر'
27 },
28 hidden: {
29 title: 'خاسیەتی خانەی شاردراوە',
30 name: 'ناو',
31 value: 'نرخ'
32 },
33 select: {
34 title: 'هەڵبژاردەی خاسیەتی خانە',
35 selectInfo: 'زانیاری',
36 opAvail: 'هەڵبژاردەی لەبەردەستدابوون',
37 value: 'نرخ',
38 size: 'گەورەیی',
39 lines: 'هێڵەکان',
40 chkMulti: 'ڕێدان بەفره هەڵبژارده',
41 required: 'پێویستە',
42 opText: 'دەق',
43 opValue: 'نرخ',
44 btnAdd: 'زیادکردن',
45 btnModify: 'گۆڕانکاری',
46 btnUp: 'سەرەوه',
47 btnDown: 'خوارەوە',
48 btnSetValue: 'دابنێ وەك نرخێکی هەڵبژێردراو',
49 btnDelete: 'سڕینەوه'
50 },
51 textarea: {
52 title: 'خاسیەتی ڕووبەری دەق',
53 cols: 'ستوونەکان',
54 rows: 'ڕیزەکان'
55 },
56 textfield: {
57 title: 'خاسیەتی خانەی دەق',
58 name: 'ناو',
59 value: 'نرخ',
60 charWidth: 'پانی نووسە',
61 maxChars: 'ئەوپەڕی نووسە',
62 required: 'پێویستە',
63 type: 'جۆر',
64 typeText: 'دەق',
65 typePass: 'پێپەڕەوشە',
66 typeEmail: 'ئیمەیل',
67 typeSearch: 'گەڕان',
68 typeTel: 'ژمارەی تەلەفۆن',
69 typeUrl: 'ناونیشانی بەستەر'
70 }
71} );
diff --git a/sources/plugins/forms/lang/lt.js b/sources/plugins/forms/lang/lt.js
new file mode 100644
index 00000000..88efbeea
--- /dev/null
+++ b/sources/plugins/forms/lang/lt.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'lt', {
6 button: {
7 title: 'Mygtuko savybės',
8 text: 'Tekstas (Reikšmė)',
9 type: 'Tipas',
10 typeBtn: 'Mygtukas',
11 typeSbm: 'Siųsti',
12 typeRst: 'Išvalyti'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Žymimojo langelio savybės',
16 radioTitle: 'Žymimosios akutės savybės',
17 value: 'Reikšmė',
18 selected: 'Pažymėtas',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Formos savybės',
23 menu: 'Formos savybės',
24 action: 'Veiksmas',
25 method: 'Metodas',
26 encoding: 'Kodavimas'
27 },
28 hidden: {
29 title: 'Nerodomo lauko savybės',
30 name: 'Vardas',
31 value: 'Reikšmė'
32 },
33 select: {
34 title: 'Atrankos lauko savybės',
35 selectInfo: 'Informacija',
36 opAvail: 'Galimos parinktys',
37 value: 'Reikšmė',
38 size: 'Dydis',
39 lines: 'eilučių',
40 chkMulti: 'Leisti daugeriopą atranką',
41 required: 'Required', // MISSING
42 opText: 'Tekstas',
43 opValue: 'Reikšmė',
44 btnAdd: 'Įtraukti',
45 btnModify: 'Modifikuoti',
46 btnUp: 'Aukštyn',
47 btnDown: 'Žemyn',
48 btnSetValue: 'Laikyti pažymėta reikšme',
49 btnDelete: 'Trinti'
50 },
51 textarea: {
52 title: 'Teksto srities savybės',
53 cols: 'Ilgis',
54 rows: 'Plotis'
55 },
56 textfield: {
57 title: 'Teksto lauko savybės',
58 name: 'Vardas',
59 value: 'Reikšmė',
60 charWidth: 'Ilgis simboliais',
61 maxChars: 'Maksimalus simbolių skaičius',
62 required: 'Required', // MISSING
63 type: 'Tipas',
64 typeText: 'Tekstas',
65 typePass: 'Slaptažodis',
66 typeEmail: 'El. paštas',
67 typeSearch: 'Paieška',
68 typeTel: 'Telefono numeris',
69 typeUrl: 'Nuoroda'
70 }
71} );
diff --git a/sources/plugins/forms/lang/lv.js b/sources/plugins/forms/lang/lv.js
new file mode 100644
index 00000000..013b1ac7
--- /dev/null
+++ b/sources/plugins/forms/lang/lv.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'lv', {
6 button: {
7 title: 'Pogas īpašības',
8 text: 'Teksts (vērtība)',
9 type: 'Tips',
10 typeBtn: 'Poga',
11 typeSbm: 'Nosūtīt',
12 typeRst: 'Atcelt'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Atzīmēšanas kastītes īpašības',
16 radioTitle: 'Izvēles poga īpašības',
17 value: 'Vērtība',
18 selected: 'Iezīmēts',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Formas īpašības',
23 menu: 'Formas īpašības',
24 action: 'Darbība',
25 method: 'Metode',
26 encoding: 'Kodējums'
27 },
28 hidden: {
29 title: 'Paslēptās teksta rindas īpašības',
30 name: 'Nosaukums',
31 value: 'Vērtība'
32 },
33 select: {
34 title: 'Iezīmēšanas lauka īpašības',
35 selectInfo: 'Informācija',
36 opAvail: 'Pieejamās iespējas',
37 value: 'Vērtība',
38 size: 'Izmērs',
39 lines: 'rindas',
40 chkMulti: 'Atļaut vairākus iezīmējumus',
41 required: 'Required', // MISSING
42 opText: 'Teksts',
43 opValue: 'Vērtība',
44 btnAdd: 'Pievienot',
45 btnModify: 'Veikt izmaiņas',
46 btnUp: 'Augšup',
47 btnDown: 'Lejup',
48 btnSetValue: 'Noteikt kā iezīmēto vērtību',
49 btnDelete: 'Dzēst'
50 },
51 textarea: {
52 title: 'Teksta laukuma īpašības',
53 cols: 'Kolonnas',
54 rows: 'Rindas'
55 },
56 textfield: {
57 title: 'Teksta rindas īpašības',
58 name: 'Nosaukums',
59 value: 'Vērtība',
60 charWidth: 'Simbolu platums',
61 maxChars: 'Simbolu maksimālais daudzums',
62 required: 'Required', // MISSING
63 type: 'Tips',
64 typeText: 'Teksts',
65 typePass: 'Parole',
66 typeEmail: 'Epasts',
67 typeSearch: 'Meklēt',
68 typeTel: 'Tālruņa numurs',
69 typeUrl: 'Adrese'
70 }
71} );
diff --git a/sources/plugins/forms/lang/mk.js b/sources/plugins/forms/lang/mk.js
new file mode 100644
index 00000000..e648cd4f
--- /dev/null
+++ b/sources/plugins/forms/lang/mk.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'mk', {
6 button: {
7 title: 'Button Properties',
8 text: 'Text (Value)',
9 type: 'Type',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties',
16 radioTitle: 'Radio Button Properties',
17 value: 'Value',
18 selected: 'Selected',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Form Properties',
23 menu: 'Form Properties',
24 action: 'Action',
25 method: 'Method',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Hidden Field Properties',
30 name: 'Name',
31 value: 'Value'
32 },
33 select: {
34 title: 'Selection Field Properties',
35 selectInfo: 'Select Info',
36 opAvail: 'Available Options',
37 value: 'Value',
38 size: 'Size',
39 lines: 'lines',
40 chkMulti: 'Allow multiple selections',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Value',
44 btnAdd: 'Add',
45 btnModify: 'Modify',
46 btnUp: 'Up',
47 btnDown: 'Down',
48 btnSetValue: 'Set as selected value',
49 btnDelete: 'Delete'
50 },
51 textarea: {
52 title: 'Textarea Properties',
53 cols: 'Columns',
54 rows: 'Rows'
55 },
56 textfield: {
57 title: 'Text Field Properties',
58 name: 'Name',
59 value: 'Value',
60 charWidth: 'Character Width',
61 maxChars: 'Maximum Characters',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Text',
65 typePass: 'Password',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL' // MISSING
70 }
71} );
diff --git a/sources/plugins/forms/lang/mn.js b/sources/plugins/forms/lang/mn.js
new file mode 100644
index 00000000..081b62ea
--- /dev/null
+++ b/sources/plugins/forms/lang/mn.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'mn', {
6 button: {
7 title: 'Товчны шинж чанар',
8 text: 'Тэкст (Утга)',
9 type: 'Төрөл',
10 typeBtn: 'Товч',
11 typeSbm: 'Submit',
12 typeRst: 'Болих'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Чекбоксны шинж чанар',
16 radioTitle: 'Радио товчны шинж чанар',
17 value: 'Утга',
18 selected: 'Сонгогдсон',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Форм шинж чанар',
23 menu: 'Форм шинж чанар',
24 action: 'Үйлдэл',
25 method: 'Арга',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Нууц талбарын шинж чанар',
30 name: 'Нэр',
31 value: 'Утга'
32 },
33 select: {
34 title: 'Согогч талбарын шинж чанар',
35 selectInfo: 'Мэдээлэл',
36 opAvail: 'Идвэхтэй сонголт',
37 value: 'Утга',
38 size: 'Хэмжээ',
39 lines: 'Мөр',
40 chkMulti: 'Олон зүйл зэрэг сонгохыг зөвшөөрөх',
41 required: 'Required', // MISSING
42 opText: 'Тэкст',
43 opValue: 'Утга',
44 btnAdd: 'Нэмэх',
45 btnModify: 'Өөрчлөх',
46 btnUp: 'Дээш',
47 btnDown: 'Доош',
48 btnSetValue: 'Сонгогдсан утга оноох',
49 btnDelete: 'Устгах'
50 },
51 textarea: {
52 title: 'Текст орчны шинж чанар',
53 cols: 'Багана',
54 rows: 'Мөр'
55 },
56 textfield: {
57 title: 'Текст талбарын шинж чанар',
58 name: 'Нэр',
59 value: 'Утга',
60 charWidth: 'Тэмдэгтын өргөн',
61 maxChars: 'Хамгийн их тэмдэгт',
62 required: 'Required', // MISSING
63 type: 'Төрөл',
64 typeText: 'Текст',
65 typePass: 'Нууц үг',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'цахим хуудасны хаяг (URL)'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ms.js b/sources/plugins/forms/lang/ms.js
new file mode 100644
index 00000000..3118f475
--- /dev/null
+++ b/sources/plugins/forms/lang/ms.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ms', {
6 button: {
7 title: 'Ciri-ciri Butang',
8 text: 'Teks (Nilai)',
9 type: 'Jenis',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Ciri-ciri Checkbox',
16 radioTitle: 'Ciri-ciri Butang Radio',
17 value: 'Nilai',
18 selected: 'Dipilih',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Ciri-ciri Borang',
23 menu: 'Ciri-ciri Borang',
24 action: 'Tindakan borang',
25 method: 'Cara borang dihantar',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Ciri-ciri Field Tersembunyi',
30 name: 'Nama',
31 value: 'Nilai'
32 },
33 select: {
34 title: 'Ciri-ciri Selection Field',
35 selectInfo: 'Select Info',
36 opAvail: 'Pilihan sediada',
37 value: 'Nilai',
38 size: 'Saiz',
39 lines: 'garisan',
40 chkMulti: 'Benarkan pilihan pelbagai',
41 required: 'Required', // MISSING
42 opText: 'Teks',
43 opValue: 'Nilai',
44 btnAdd: 'Tambah Pilihan',
45 btnModify: 'Ubah Pilihan',
46 btnUp: 'Naik ke atas',
47 btnDown: 'Turun ke bawah',
48 btnSetValue: 'Set sebagai nilai terpilih',
49 btnDelete: 'Padam'
50 },
51 textarea: {
52 title: 'Ciri-ciri Textarea',
53 cols: 'Lajur',
54 rows: 'Baris'
55 },
56 textfield: {
57 title: 'Ciri-ciri Text Field',
58 name: 'Nama',
59 value: 'Nilai',
60 charWidth: 'Lebar isian',
61 maxChars: 'Isian Maksimum',
62 required: 'Required', // MISSING
63 type: 'Jenis',
64 typeText: 'Teks',
65 typePass: 'Kata Laluan',
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/nb.js b/sources/plugins/forms/lang/nb.js
new file mode 100644
index 00000000..d819af52
--- /dev/null
+++ b/sources/plugins/forms/lang/nb.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'nb', {
6 button: {
7 title: 'Egenskaper for knapp',
8 text: 'Tekst (verdi)',
9 type: 'Type',
10 typeBtn: 'Knapp',
11 typeSbm: 'Send',
12 typeRst: 'Nullstill'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Egenskaper for avmerkingsboks',
16 radioTitle: 'Egenskaper for alternativknapp',
17 value: 'Verdi',
18 selected: 'Valgt',
19 required: 'Påkrevd'
20 },
21 form: {
22 title: 'Egenskaper for skjema',
23 menu: 'Egenskaper for skjema',
24 action: 'Handling',
25 method: 'Metode',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Egenskaper for skjult felt',
30 name: 'Navn',
31 value: 'Verdi'
32 },
33 select: {
34 title: 'Egenskaper for rullegardinliste',
35 selectInfo: 'Info',
36 opAvail: 'Tilgjenglige alternativer',
37 value: 'Verdi',
38 size: 'Størrelse',
39 lines: 'Linjer',
40 chkMulti: 'Tillat flervalg',
41 required: 'Påkrevd',
42 opText: 'Tekst',
43 opValue: 'Verdi',
44 btnAdd: 'Legg til',
45 btnModify: 'Endre',
46 btnUp: 'Opp',
47 btnDown: 'Ned',
48 btnSetValue: 'Sett som valgt',
49 btnDelete: 'Slett'
50 },
51 textarea: {
52 title: 'Egenskaper for tekstområde',
53 cols: 'Kolonner',
54 rows: 'Rader'
55 },
56 textfield: {
57 title: 'Egenskaper for tekstfelt',
58 name: 'Navn',
59 value: 'Verdi',
60 charWidth: 'Tegnbredde',
61 maxChars: 'Maks antall tegn',
62 required: 'Påkrevd',
63 type: 'Type',
64 typeText: 'Tekst',
65 typePass: 'Passord',
66 typeEmail: 'Epost',
67 typeSearch: 'Søk',
68 typeTel: 'Telefonnummer',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/nl.js b/sources/plugins/forms/lang/nl.js
new file mode 100644
index 00000000..c5464dcb
--- /dev/null
+++ b/sources/plugins/forms/lang/nl.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'nl', {
6 button: {
7 title: 'Eigenschappen knop',
8 text: 'Tekst (waarde)',
9 type: 'Soort',
10 typeBtn: 'Knop',
11 typeSbm: 'Versturen',
12 typeRst: 'Leegmaken'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Eigenschappen aanvinkvakje',
16 radioTitle: 'Eigenschappen selectievakje',
17 value: 'Waarde',
18 selected: 'Geselecteerd',
19 required: 'Vereist'
20 },
21 form: {
22 title: 'Eigenschappen formulier',
23 menu: 'Eigenschappen formulier',
24 action: 'Actie',
25 method: 'Methode',
26 encoding: 'Codering'
27 },
28 hidden: {
29 title: 'Eigenschappen verborgen veld',
30 name: 'Naam',
31 value: 'Waarde'
32 },
33 select: {
34 title: 'Eigenschappen selectieveld',
35 selectInfo: 'Informatie',
36 opAvail: 'Beschikbare opties',
37 value: 'Waarde',
38 size: 'Grootte',
39 lines: 'Regels',
40 chkMulti: 'Gecombineerde selecties toestaan',
41 required: 'Vereist',
42 opText: 'Tekst',
43 opValue: 'Waarde',
44 btnAdd: 'Toevoegen',
45 btnModify: 'Wijzigen',
46 btnUp: 'Omhoog',
47 btnDown: 'Omlaag',
48 btnSetValue: 'Als geselecteerde waarde instellen',
49 btnDelete: 'Verwijderen'
50 },
51 textarea: {
52 title: 'Eigenschappen tekstvak',
53 cols: 'Kolommen',
54 rows: 'Rijen'
55 },
56 textfield: {
57 title: 'Eigenschappen tekstveld',
58 name: 'Naam',
59 value: 'Waarde',
60 charWidth: 'Breedte (tekens)',
61 maxChars: 'Maximum aantal tekens',
62 required: 'Vereist',
63 type: 'Soort',
64 typeText: 'Tekst',
65 typePass: 'Wachtwoord',
66 typeEmail: 'E-mail',
67 typeSearch: 'Zoeken',
68 typeTel: 'Telefoonnummer',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/no.js b/sources/plugins/forms/lang/no.js
new file mode 100644
index 00000000..11a18d71
--- /dev/null
+++ b/sources/plugins/forms/lang/no.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'no', {
6 button: {
7 title: 'Egenskaper for knapp',
8 text: 'Tekst (verdi)',
9 type: 'Type',
10 typeBtn: 'Knapp',
11 typeSbm: 'Send',
12 typeRst: 'Nullstill'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Egenskaper for avmerkingsboks',
16 radioTitle: 'Egenskaper for alternativknapp',
17 value: 'Verdi',
18 selected: 'Valgt',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Egenskaper for skjema',
23 menu: 'Egenskaper for skjema',
24 action: 'Handling',
25 method: 'Metode',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Egenskaper for skjult felt',
30 name: 'Navn',
31 value: 'Verdi'
32 },
33 select: {
34 title: 'Egenskaper for rullegardinliste',
35 selectInfo: 'Info',
36 opAvail: 'Tilgjenglige alternativer',
37 value: 'Verdi',
38 size: 'Størrelse',
39 lines: 'Linjer',
40 chkMulti: 'Tillat flervalg',
41 required: 'Required', // MISSING
42 opText: 'Tekst',
43 opValue: 'Verdi',
44 btnAdd: 'Legg til',
45 btnModify: 'Endre',
46 btnUp: 'Opp',
47 btnDown: 'Ned',
48 btnSetValue: 'Sett som valgt',
49 btnDelete: 'Slett'
50 },
51 textarea: {
52 title: 'Egenskaper for tekstområde',
53 cols: 'Kolonner',
54 rows: 'Rader'
55 },
56 textfield: {
57 title: 'Egenskaper for tekstfelt',
58 name: 'Navn',
59 value: 'Verdi',
60 charWidth: 'Tegnbredde',
61 maxChars: 'Maks antall tegn',
62 required: 'Required', // MISSING
63 type: 'Type',
64 typeText: 'Tekst',
65 typePass: 'Passord',
66 typeEmail: 'Epost',
67 typeSearch: 'Søk',
68 typeTel: 'Telefonnummer',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/pl.js b/sources/plugins/forms/lang/pl.js
new file mode 100644
index 00000000..856300c4
--- /dev/null
+++ b/sources/plugins/forms/lang/pl.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'pl', {
6 button: {
7 title: 'Właściwości przycisku',
8 text: 'Tekst (Wartość)',
9 type: 'Typ',
10 typeBtn: 'Przycisk',
11 typeSbm: 'Wyślij',
12 typeRst: 'Wyczyść'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Właściwości pola wyboru (checkbox)',
16 radioTitle: 'Właściwości przycisku opcji (radio)',
17 value: 'Wartość',
18 selected: 'Zaznaczone',
19 required: 'Wymagane'
20 },
21 form: {
22 title: 'Właściwości formularza',
23 menu: 'Właściwości formularza',
24 action: 'Akcja',
25 method: 'Metoda',
26 encoding: 'Kodowanie'
27 },
28 hidden: {
29 title: 'Właściwości pola ukrytego',
30 name: 'Nazwa',
31 value: 'Wartość'
32 },
33 select: {
34 title: 'Właściwości listy wyboru',
35 selectInfo: 'Informacje',
36 opAvail: 'Dostępne opcje',
37 value: 'Wartość',
38 size: 'Rozmiar',
39 lines: 'wierszy',
40 chkMulti: 'Wielokrotny wybór',
41 required: 'Wymagane',
42 opText: 'Tekst',
43 opValue: 'Wartość',
44 btnAdd: 'Dodaj',
45 btnModify: 'Zmień',
46 btnUp: 'Do góry',
47 btnDown: 'Do dołu',
48 btnSetValue: 'Ustaw jako zaznaczoną',
49 btnDelete: 'Usuń'
50 },
51 textarea: {
52 title: 'Właściwości obszaru tekstowego',
53 cols: 'Liczba kolumn',
54 rows: 'Liczba wierszy'
55 },
56 textfield: {
57 title: 'Właściwości pola tekstowego',
58 name: 'Nazwa',
59 value: 'Wartość',
60 charWidth: 'Szerokość w znakach',
61 maxChars: 'Szerokość maksymalna',
62 required: 'Wymagane',
63 type: 'Typ',
64 typeText: 'Tekst',
65 typePass: 'Hasło',
66 typeEmail: 'Email',
67 typeSearch: 'Szukaj',
68 typeTel: 'Numer telefonu',
69 typeUrl: 'Adres URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/pt-br.js b/sources/plugins/forms/lang/pt-br.js
new file mode 100644
index 00000000..d9fd77d2
--- /dev/null
+++ b/sources/plugins/forms/lang/pt-br.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'pt-br', {
6 button: {
7 title: 'Formatar Botão',
8 text: 'Texto (Valor)',
9 type: 'Tipo',
10 typeBtn: 'Botão',
11 typeSbm: 'Enviar',
12 typeRst: 'Limpar'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Formatar Caixa de Seleção',
16 radioTitle: 'Formatar Botão de Opção',
17 value: 'Valor',
18 selected: 'Selecionado',
19 required: 'Obrigatório'
20 },
21 form: {
22 title: 'Formatar Formulário',
23 menu: 'Formatar Formulário',
24 action: 'Ação',
25 method: 'Método',
26 encoding: 'Codificação'
27 },
28 hidden: {
29 title: 'Formatar Campo Oculto',
30 name: 'Nome',
31 value: 'Valor'
32 },
33 select: {
34 title: 'Formatar Caixa de Listagem',
35 selectInfo: 'Informações',
36 opAvail: 'Opções disponíveis',
37 value: 'Valor',
38 size: 'Tamanho',
39 lines: 'linhas',
40 chkMulti: 'Permitir múltiplas seleções',
41 required: 'Obrigatório',
42 opText: 'Texto',
43 opValue: 'Valor',
44 btnAdd: 'Adicionar',
45 btnModify: 'Modificar',
46 btnUp: 'Para cima',
47 btnDown: 'Para baixo',
48 btnSetValue: 'Definir como selecionado',
49 btnDelete: 'Remover'
50 },
51 textarea: {
52 title: 'Formatar Área de Texto',
53 cols: 'Colunas',
54 rows: 'Linhas'
55 },
56 textfield: {
57 title: 'Formatar Caixa de Texto',
58 name: 'Nome',
59 value: 'Valor',
60 charWidth: 'Comprimento (em caracteres)',
61 maxChars: 'Número Máximo de Caracteres',
62 required: 'Obrigatório',
63 type: 'Tipo',
64 typeText: 'Texto',
65 typePass: 'Senha',
66 typeEmail: 'Email',
67 typeSearch: 'Busca',
68 typeTel: 'Número de Telefone',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/pt.js b/sources/plugins/forms/lang/pt.js
new file mode 100644
index 00000000..192ff8fc
--- /dev/null
+++ b/sources/plugins/forms/lang/pt.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'pt', {
6 button: {
7 title: 'Propriedades do Botão',
8 text: 'Texto (Valor)',
9 type: 'Tipo',
10 typeBtn: 'Botão',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Propriedades da Caixa de Verificação',
16 radioTitle: 'Propriedades do Botão de Opção',
17 value: 'Valor',
18 selected: 'Seleccionado',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Propriedades do Formulário',
23 menu: 'Propriedades do Formulário',
24 action: 'Acção',
25 method: 'Método',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Propriedades do Campo Escondido',
30 name: 'Nome',
31 value: 'Valor'
32 },
33 select: {
34 title: 'Propriedades da Caixa de Combinação',
35 selectInfo: 'Informação',
36 opAvail: 'Opções Possíveis',
37 value: 'Valor',
38 size: 'Tamanho',
39 lines: 'linhas',
40 chkMulti: 'Permitir selecções múltiplas',
41 required: 'Required', // MISSING
42 opText: 'Texto',
43 opValue: 'Valor',
44 btnAdd: 'Adicionar',
45 btnModify: 'Modificar',
46 btnUp: 'Para cima',
47 btnDown: 'Para baixo',
48 btnSetValue: 'Definir um valor por defeito',
49 btnDelete: 'Apagar'
50 },
51 textarea: {
52 title: 'Propriedades da Área de Texto',
53 cols: 'Colunas',
54 rows: 'Linhas'
55 },
56 textfield: {
57 title: 'Propriedades do Campo de Texto',
58 name: 'Nome',
59 value: 'Valor',
60 charWidth: 'Tamanho do caracter',
61 maxChars: 'Nr. Máximo de Caracteres',
62 required: 'Required', // MISSING
63 type: 'Tipo',
64 typeText: 'Texto',
65 typePass: 'Senha',
66 typeEmail: 'Email',
67 typeSearch: 'Pesquisar',
68 typeTel: 'Telefone',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ro.js b/sources/plugins/forms/lang/ro.js
new file mode 100644
index 00000000..9bf69bb1
--- /dev/null
+++ b/sources/plugins/forms/lang/ro.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ro', {
6 button: {
7 title: 'Proprietăţi buton',
8 text: 'Text (Valoare)',
9 type: 'Tip',
10 typeBtn: 'Buton',
11 typeSbm: 'Trimite',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Proprietăţi bifă (Checkbox)',
16 radioTitle: 'Proprietăţi buton radio (Radio Button)',
17 value: 'Valoare',
18 selected: 'Selectat',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Proprietăţi formular (Form)',
23 menu: 'Proprietăţi formular (Form)',
24 action: 'Acţiune',
25 method: 'Metodă',
26 encoding: 'Encodare'
27 },
28 hidden: {
29 title: 'Proprietăţi câmp ascuns (Hidden Field)',
30 name: 'Nume',
31 value: 'Valoare'
32 },
33 select: {
34 title: 'Proprietăţi câmp selecţie (Selection Field)',
35 selectInfo: 'Informaţii',
36 opAvail: 'Opţiuni disponibile',
37 value: 'Valoare',
38 size: 'Mărime',
39 lines: 'linii',
40 chkMulti: 'Permite selecţii multiple',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Valoare',
44 btnAdd: 'Adaugă',
45 btnModify: 'Modifică',
46 btnUp: 'Sus',
47 btnDown: 'Jos',
48 btnSetValue: 'Setează ca valoare selectată',
49 btnDelete: 'Şterge'
50 },
51 textarea: {
52 title: 'Proprietăţi suprafaţă text (Textarea)',
53 cols: 'Coloane',
54 rows: 'Linii'
55 },
56 textfield: {
57 title: 'Proprietăţi câmp text (Text Field)',
58 name: 'Nume',
59 value: 'Valoare',
60 charWidth: 'Lărgimea caracterului',
61 maxChars: 'Caractere maxime',
62 required: 'Required', // MISSING
63 type: 'Tip',
64 typeText: 'Text',
65 typePass: 'Parolă',
66 typeEmail: 'Email',
67 typeSearch: 'Cauta',
68 typeTel: 'Numar de telefon',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ru.js b/sources/plugins/forms/lang/ru.js
new file mode 100644
index 00000000..be9bacda
--- /dev/null
+++ b/sources/plugins/forms/lang/ru.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ru', {
6 button: {
7 title: 'Свойства кнопки',
8 text: 'Текст (Значение)',
9 type: 'Тип',
10 typeBtn: 'Кнопка',
11 typeSbm: 'Отправка',
12 typeRst: 'Сброс'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Свойства флаговой кнопки',
16 radioTitle: 'Свойства кнопки выбора',
17 value: 'Значение',
18 selected: 'Выбрано',
19 required: 'Обязательное поле'
20 },
21 form: {
22 title: 'Свойства формы',
23 menu: 'Свойства формы',
24 action: 'Действие',
25 method: 'Метод',
26 encoding: 'Кодировка'
27 },
28 hidden: {
29 title: 'Свойства скрытого поля',
30 name: 'Имя',
31 value: 'Значение'
32 },
33 select: {
34 title: 'Свойства списка выбора',
35 selectInfo: 'Информация о списке выбора',
36 opAvail: 'Доступные варианты',
37 value: 'Значение',
38 size: 'Размер',
39 lines: 'строк(и)',
40 chkMulti: 'Разрешить выбор нескольких вариантов',
41 required: 'Обязательное поле',
42 opText: 'Текст',
43 opValue: 'Значение',
44 btnAdd: 'Добавить',
45 btnModify: 'Изменить',
46 btnUp: 'Поднять',
47 btnDown: 'Опустить',
48 btnSetValue: 'Пометить как выбранное',
49 btnDelete: 'Удалить'
50 },
51 textarea: {
52 title: 'Свойства многострочного текстового поля',
53 cols: 'Колонок',
54 rows: 'Строк'
55 },
56 textfield: {
57 title: 'Свойства текстового поля',
58 name: 'Имя',
59 value: 'Значение',
60 charWidth: 'Ширина поля (в символах)',
61 maxChars: 'Макс. количество символов',
62 required: 'Обязательное поле',
63 type: 'Тип содержимого',
64 typeText: 'Текст',
65 typePass: 'Пароль',
66 typeEmail: 'Email',
67 typeSearch: 'Поиск',
68 typeTel: 'Номер телефона',
69 typeUrl: 'Ссылка'
70 }
71} );
diff --git a/sources/plugins/forms/lang/si.js b/sources/plugins/forms/lang/si.js
new file mode 100644
index 00000000..436b81b6
--- /dev/null
+++ b/sources/plugins/forms/lang/si.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'si', {
6 button: {
7 title: 'බොත්තම් ගුණ',
8 text: 'වගන්තිය(වටිනාකම)',
9 type: 'වර්ගය',
10 typeBtn: 'බොත්තම',
11 typeSbm: 'යොමුකරනවා',
12 typeRst: 'නැවත ආරම්භකතත්වයට පත් කරනවා'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'ලකුණු කිරීමේ කොටුවේ ලක්ෂණ',
16 radioTitle: 'Radio Button Properties', // MISSING
17 value: 'Value', // MISSING
18 selected: 'Selected', // MISSING
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'පෝරමයේ ',
23 menu: 'පෝරමයේ ගුණ/',
24 action: 'ගන්නා පියවර',
25 method: 'ක්‍රමය',
26 encoding: 'කේතීකරණය'
27 },
28 hidden: {
29 title: 'සැඟවුණු ප්‍රදේශයේ ',
30 name: 'නම',
31 value: 'Value' // MISSING
32 },
33 select: {
34 title: 'තේරීම් ප්‍රදේශයේ ',
35 selectInfo: 'විස්තර තෝරන්න',
36 opAvail: 'ඉතුරුවී ඇති වීකල්ප',
37 value: 'Value', // MISSING
38 size: 'විශාලත්වය',
39 lines: 'lines', // MISSING
40 chkMulti: 'Allow multiple selections', // MISSING
41 required: 'Required', // MISSING
42 opText: 'Text', // MISSING
43 opValue: 'Value', // MISSING
44 btnAdd: 'Add', // MISSING
45 btnModify: 'Modify', // MISSING
46 btnUp: 'Up', // MISSING
47 btnDown: 'Down', // MISSING
48 btnSetValue: 'Set as selected value', // MISSING
49 btnDelete: 'මකා දැම්ම'
50 },
51 textarea: {
52 title: 'Textarea Properties', // MISSING
53 cols: 'සිරස් ',
54 rows: 'Rows' // MISSING
55 },
56 textfield: {
57 title: 'Text Field Properties', // MISSING
58 name: 'නම',
59 value: 'Value', // MISSING
60 charWidth: 'Character Width', // MISSING
61 maxChars: 'Maximum Characters', // MISSING
62 required: 'Required', // MISSING
63 type: 'වර්ගය',
64 typeText: 'Text', // MISSING
65 typePass: 'Password', // MISSING
66 typeEmail: 'Email', // MISSING
67 typeSearch: 'Search', // MISSING
68 typeTel: 'Telephone Number', // MISSING
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/sk.js b/sources/plugins/forms/lang/sk.js
new file mode 100644
index 00000000..0bb4507d
--- /dev/null
+++ b/sources/plugins/forms/lang/sk.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'sk', {
6 button: {
7 title: 'Vlastnosti tlačidla',
8 text: 'Text (Hodnota)',
9 type: 'Typ',
10 typeBtn: 'Tlačidlo',
11 typeSbm: 'Odoslať',
12 typeRst: 'Resetovať'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Vlastnosti zaškrtávacieho políčka',
16 radioTitle: 'Vlastnosti prepínača (radio button)',
17 value: 'Hodnota',
18 selected: 'Vybrané (selected)',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Vlastnosti formulára',
23 menu: 'Vlastnosti formulára',
24 action: 'Akcia (action)',
25 method: 'Metóda (method)',
26 encoding: 'Kódovanie (encoding)'
27 },
28 hidden: {
29 title: 'Vlastnosti skrytého poľa',
30 name: 'Názov (name)',
31 value: 'Hodnota'
32 },
33 select: {
34 title: 'Vlastnosti rozbaľovacieho zoznamu',
35 selectInfo: 'Informácie o výbere',
36 opAvail: 'Dostupné možnosti',
37 value: 'Hodnota',
38 size: 'Veľkosť',
39 lines: 'riadkov',
40 chkMulti: 'Povoliť viacnásobný výber',
41 required: 'Required', // MISSING
42 opText: 'Text',
43 opValue: 'Hodnota',
44 btnAdd: 'Pridať',
45 btnModify: 'Upraviť',
46 btnUp: 'Hore',
47 btnDown: 'Dole',
48 btnSetValue: 'Nastaviť ako vybranú hodnotu',
49 btnDelete: 'Vymazať'
50 },
51 textarea: {
52 title: 'Vlastnosti textovej oblasti (textarea)',
53 cols: 'Stĺpcov',
54 rows: 'Riadkov'
55 },
56 textfield: {
57 title: 'Vlastnosti textového poľa',
58 name: 'Názov (name)',
59 value: 'Hodnota',
60 charWidth: 'Šírka poľa (podľa znakov)',
61 maxChars: 'Maximálny počet znakov',
62 required: 'Required', // MISSING
63 type: 'Typ',
64 typeText: 'Text',
65 typePass: 'Heslo',
66 typeEmail: 'Email',
67 typeSearch: 'Hľadať',
68 typeTel: 'Telefónne číslo',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/sl.js b/sources/plugins/forms/lang/sl.js
new file mode 100644
index 00000000..ed520f6e
--- /dev/null
+++ b/sources/plugins/forms/lang/sl.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'sl', {
6 button: {
7 title: 'Lastnosti gumba',
8 text: 'Besedilo (Vrednost)',
9 type: 'Tip',
10 typeBtn: 'Gumb',
11 typeSbm: 'Potrdi',
12 typeRst: 'Ponastavi'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Lastnosti potrditvenega polja',
16 radioTitle: 'Lastnosti izbirnega polja',
17 value: 'Vrednost',
18 selected: 'Izbrano',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Lastnosti obrazca',
23 menu: 'Lastnosti obrazca',
24 action: 'Akcija',
25 method: 'Metoda',
26 encoding: 'Kodiranje znakov'
27 },
28 hidden: {
29 title: 'Lastnosti skritega polja',
30 name: 'Ime',
31 value: 'Vrednost'
32 },
33 select: {
34 title: 'Lastnosti spustnega seznama',
35 selectInfo: 'Podatki',
36 opAvail: 'Razpoložljive izbire',
37 value: 'Vrednost',
38 size: 'Velikost',
39 lines: 'vrstic',
40 chkMulti: 'Dovoli izbor večih vrstic',
41 required: 'Required', // MISSING
42 opText: 'Besedilo',
43 opValue: 'Vrednost',
44 btnAdd: 'Dodaj',
45 btnModify: 'Spremeni',
46 btnUp: 'Gor',
47 btnDown: 'Dol',
48 btnSetValue: 'Postavi kot privzeto izbiro',
49 btnDelete: 'Izbriši'
50 },
51 textarea: {
52 title: 'Lastnosti vnosnega območja',
53 cols: 'Stolpcev',
54 rows: 'Vrstic'
55 },
56 textfield: {
57 title: 'Lastnosti vnosnega polja',
58 name: 'Ime',
59 value: 'Vrednost',
60 charWidth: 'Dolžina',
61 maxChars: 'Največje število znakov',
62 required: 'Required', // MISSING
63 type: 'Tip',
64 typeText: 'Besedilo',
65 typePass: 'Geslo',
66 typeEmail: 'E-pošta',
67 typeSearch: 'Iskanje',
68 typeTel: 'Telefonska Številka',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/sq.js b/sources/plugins/forms/lang/sq.js
new file mode 100644
index 00000000..bf228b62
--- /dev/null
+++ b/sources/plugins/forms/lang/sq.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'sq', {
6 button: {
7 title: 'Rekuizitat e Pullës',
8 text: 'Teskti (Vlera)',
9 type: 'LLoji',
10 typeBtn: 'Buton',
11 typeSbm: 'Dërgo',
12 typeRst: 'Rikthe'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Rekuizitat e Kutizë Përzgjedhëse',
16 radioTitle: 'Rekuizitat e Pullës',
17 value: 'Vlera',
18 selected: 'Përzgjedhur',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Rekuizitat e Formës',
23 menu: 'Rekuizitat e Formës',
24 action: 'Veprim',
25 method: 'Metoda',
26 encoding: 'Kodimi'
27 },
28 hidden: {
29 title: 'Rekuizitat e Fushës së Fshehur',
30 name: 'Emër',
31 value: 'Vlera'
32 },
33 select: {
34 title: 'Rekuizitat e Fushës së Përzgjedhur',
35 selectInfo: 'Përzgjidh Informacionin',
36 opAvail: 'Opsionet e Mundshme',
37 value: 'Vlera',
38 size: 'Madhësia',
39 lines: 'rreshtat',
40 chkMulti: 'Lejo përzgjidhje të shumëfishta',
41 required: 'Required', // MISSING
42 opText: 'Teksti',
43 opValue: 'Vlera',
44 btnAdd: 'Vendos',
45 btnModify: 'Ndrysho',
46 btnUp: 'Sipër',
47 btnDown: 'Poshtë',
48 btnSetValue: 'Bëje si vlerë të përzgjedhur',
49 btnDelete: 'Grise'
50 },
51 textarea: {
52 title: 'Rekuzitat e Fushës së Tekstit',
53 cols: 'Kolonat',
54 rows: 'Rreshtat'
55 },
56 textfield: {
57 title: 'Rekuizitat e Fushës së Tekstit',
58 name: 'Emër',
59 value: 'Vlera',
60 charWidth: 'Gjerësia e Karakterit',
61 maxChars: 'Numri maksimal i karaktereve',
62 required: 'Required', // MISSING
63 type: 'LLoji',
64 typeText: 'Teksti',
65 typePass: 'Fjalëkalimi',
66 typeEmail: 'Posta Elektronike',
67 typeSearch: 'Kërko',
68 typeTel: 'Numri i Telefonit',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/sr-latn.js b/sources/plugins/forms/lang/sr-latn.js
new file mode 100644
index 00000000..35d04e55
--- /dev/null
+++ b/sources/plugins/forms/lang/sr-latn.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'sr-latn', {
6 button: {
7 title: 'Osobine dugmeta',
8 text: 'Tekst (vrednost)',
9 type: 'Tip',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Osobine polja za potvrdu',
16 radioTitle: 'Osobine radio-dugmeta',
17 value: 'Vrednost',
18 selected: 'Označeno',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Osobine forme',
23 menu: 'Osobine forme',
24 action: 'Akcija',
25 method: 'Metoda',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Osobine skrivenog polja',
30 name: 'Naziv',
31 value: 'Vrednost'
32 },
33 select: {
34 title: 'Osobine izbornog polja',
35 selectInfo: 'Info',
36 opAvail: 'Dostupne opcije',
37 value: 'Vrednost',
38 size: 'Veličina',
39 lines: 'linija',
40 chkMulti: 'Dozvoli višestruku selekciju',
41 required: 'Required', // MISSING
42 opText: 'Tekst',
43 opValue: 'Vrednost',
44 btnAdd: 'Dodaj',
45 btnModify: 'Izmeni',
46 btnUp: 'Gore',
47 btnDown: 'Dole',
48 btnSetValue: 'Podesi kao označenu vrednost',
49 btnDelete: 'Obriši'
50 },
51 textarea: {
52 title: 'Osobine zone teksta',
53 cols: 'Broj kolona',
54 rows: 'Broj redova'
55 },
56 textfield: {
57 title: 'Osobine tekstualnog polja',
58 name: 'Naziv',
59 value: 'Vrednost',
60 charWidth: 'Širina (karaktera)',
61 maxChars: 'Maksimalno karaktera',
62 required: 'Required', // MISSING
63 type: 'Tip',
64 typeText: 'Tekst',
65 typePass: 'Lozinka',
66 typeEmail: 'Email',
67 typeSearch: 'Pretraži',
68 typeTel: 'Broj telefona',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/sr.js b/sources/plugins/forms/lang/sr.js
new file mode 100644
index 00000000..b68bb596
--- /dev/null
+++ b/sources/plugins/forms/lang/sr.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'sr', {
6 button: {
7 title: 'Особине дугмета',
8 text: 'Текст (вредност)',
9 type: 'Tип',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Особине поља за потврду',
16 radioTitle: 'Особине радио-дугмета',
17 value: 'Вредност',
18 selected: 'Означено',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Особине форме',
23 menu: 'Особине форме',
24 action: 'Aкција',
25 method: 'Mетода',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'Особине скривеног поља',
30 name: 'Назив',
31 value: 'Вредност'
32 },
33 select: {
34 title: 'Особине изборног поља',
35 selectInfo: 'Инфо',
36 opAvail: 'Доступне опције',
37 value: 'Вредност',
38 size: 'Величина',
39 lines: 'линија',
40 chkMulti: 'Дозволи вишеструку селекцију',
41 required: 'Required', // MISSING
42 opText: 'Текст',
43 opValue: 'Вредност',
44 btnAdd: 'Додај',
45 btnModify: 'Измени',
46 btnUp: 'Горе',
47 btnDown: 'Доле',
48 btnSetValue: 'Подеси као означену вредност',
49 btnDelete: 'Обриши'
50 },
51 textarea: {
52 title: 'Особине зоне текста',
53 cols: 'Број колона',
54 rows: 'Број редова'
55 },
56 textfield: {
57 title: 'Особине текстуалног поља',
58 name: 'Назив',
59 value: 'Вредност',
60 charWidth: 'Ширина (карактера)',
61 maxChars: 'Максимално карактера',
62 required: 'Required', // MISSING
63 type: 'Тип',
64 typeText: 'Текст',
65 typePass: 'Лозинка',
66 typeEmail: 'Е-пошта',
67 typeSearch: 'Претрага',
68 typeTel: 'Број телефона',
69 typeUrl: 'УРЛ'
70 }
71} );
diff --git a/sources/plugins/forms/lang/sv.js b/sources/plugins/forms/lang/sv.js
new file mode 100644
index 00000000..baed9d06
--- /dev/null
+++ b/sources/plugins/forms/lang/sv.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'sv', {
6 button: {
7 title: 'Egenskaper för knapp',
8 text: 'Text (värde)',
9 type: 'Typ',
10 typeBtn: 'Knapp',
11 typeSbm: 'Skicka',
12 typeRst: 'Återställ'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Egenskaper för kryssruta',
16 radioTitle: 'Egenskaper för alternativknapp',
17 value: 'Värde',
18 selected: 'Vald',
19 required: 'Krävs'
20 },
21 form: {
22 title: 'Egenskaper för formulär',
23 menu: 'Egenskaper för formulär',
24 action: 'Funktion',
25 method: 'Metod',
26 encoding: 'Kodning'
27 },
28 hidden: {
29 title: 'Egenskaper för dolt fält',
30 name: 'Namn',
31 value: 'Värde'
32 },
33 select: {
34 title: 'Egenskaper för flervalslista',
35 selectInfo: 'Information',
36 opAvail: 'Befintliga val',
37 value: 'Värde',
38 size: 'Storlek',
39 lines: 'Linjer',
40 chkMulti: 'Tillåt flerval',
41 required: 'Krävs',
42 opText: 'Text',
43 opValue: 'Värde',
44 btnAdd: 'Lägg till',
45 btnModify: 'Redigera',
46 btnUp: 'Upp',
47 btnDown: 'Ner',
48 btnSetValue: 'Markera som valt värde',
49 btnDelete: 'Radera'
50 },
51 textarea: {
52 title: 'Egenskaper för textruta',
53 cols: 'Kolumner',
54 rows: 'Rader'
55 },
56 textfield: {
57 title: 'Egenskaper för textfält',
58 name: 'Namn',
59 value: 'Värde',
60 charWidth: 'Teckenbredd',
61 maxChars: 'Max antal tecken',
62 required: 'Krävs',
63 type: 'Typ',
64 typeText: 'Text',
65 typePass: 'Lösenord',
66 typeEmail: 'E-post',
67 typeSearch: 'Sök',
68 typeTel: 'Telefonnummer',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/th.js b/sources/plugins/forms/lang/th.js
new file mode 100644
index 00000000..f5b06922
--- /dev/null
+++ b/sources/plugins/forms/lang/th.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'th', {
6 button: {
7 title: 'รายละเอียดของ ปุ่ม',
8 text: 'ข้อความ (ค่าตัวแปร)',
9 type: 'ข้อความ',
10 typeBtn: 'Button',
11 typeSbm: 'Submit',
12 typeRst: 'Reset'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'คุณสมบัติของ เช็คบ๊อก',
16 radioTitle: 'คุณสมบัติของ เรดิโอบัตตอน',
17 value: 'ค่าตัวแปร',
18 selected: 'เลือกเป็นค่าเริ่มต้น',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'คุณสมบัติของ แบบฟอร์ม',
23 menu: 'คุณสมบัติของ แบบฟอร์ม',
24 action: 'แอคชั่น',
25 method: 'เมธอด',
26 encoding: 'Encoding'
27 },
28 hidden: {
29 title: 'คุณสมบัติของ ฮิดเดนฟิลด์',
30 name: 'ชื่อ',
31 value: 'ค่าตัวแปร'
32 },
33 select: {
34 title: 'คุณสมบัติของ แถบตัวเลือก',
35 selectInfo: 'อินโฟ',
36 opAvail: 'รายการตัวเลือก',
37 value: 'ค่าตัวแปร',
38 size: 'ขนาด',
39 lines: 'บรรทัด',
40 chkMulti: 'เลือกหลายค่าได้',
41 required: 'Required', // MISSING
42 opText: 'ข้อความ',
43 opValue: 'ค่าตัวแปร',
44 btnAdd: 'เพิ่ม',
45 btnModify: 'แก้ไข',
46 btnUp: 'บน',
47 btnDown: 'ล่าง',
48 btnSetValue: 'เลือกเป็นค่าเริ่มต้น',
49 btnDelete: 'ลบ'
50 },
51 textarea: {
52 title: 'คุณสมบัติของ เท็กแอเรีย',
53 cols: 'สดมภ์',
54 rows: 'แถว'
55 },
56 textfield: {
57 title: 'คุณสมบัติของ เท็กซ์ฟิลด์',
58 name: 'ชื่อ',
59 value: 'ค่าตัวแปร',
60 charWidth: 'ความกว้าง',
61 maxChars: 'จำนวนตัวอักษรสูงสุด',
62 required: 'Required', // MISSING
63 type: 'ชนิด',
64 typeText: 'ข้อความ',
65 typePass: 'รหัสผ่าน',
66 typeEmail: 'อีเมล',
67 typeSearch: 'ค้นหาก',
68 typeTel: 'หมายเลขโทรศัพท์',
69 typeUrl: 'ที่อยู่อ้างอิง URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/tr.js b/sources/plugins/forms/lang/tr.js
new file mode 100644
index 00000000..99c6c737
--- /dev/null
+++ b/sources/plugins/forms/lang/tr.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'tr', {
6 button: {
7 title: 'Düğme Özellikleri',
8 text: 'Metin (Değer)',
9 type: 'Tip',
10 typeBtn: 'Düğme',
11 typeSbm: 'Gönder',
12 typeRst: 'Sıfırla'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Onay Kutusu Özellikleri',
16 radioTitle: 'Seçenek Düğmesi Özellikleri',
17 value: 'Değer',
18 selected: 'Seçili',
19 required: 'Zorunlu'
20 },
21 form: {
22 title: 'Form Özellikleri',
23 menu: 'Form Özellikleri',
24 action: 'İşlem',
25 method: 'Yöntem',
26 encoding: 'Kodlama'
27 },
28 hidden: {
29 title: 'Gizli Veri Özellikleri',
30 name: 'Ad',
31 value: 'Değer'
32 },
33 select: {
34 title: 'Seçim Menüsü Özellikleri',
35 selectInfo: 'Bilgi',
36 opAvail: 'Mevcut Seçenekler',
37 value: 'Değer',
38 size: 'Boyut',
39 lines: 'satır',
40 chkMulti: 'Çoklu seçime izin ver',
41 required: 'Zorunlu',
42 opText: 'Metin',
43 opValue: 'Değer',
44 btnAdd: 'Ekle',
45 btnModify: 'Düzenle',
46 btnUp: 'Yukarı',
47 btnDown: 'Aşağı',
48 btnSetValue: 'Seçili değer olarak ata',
49 btnDelete: 'Sil'
50 },
51 textarea: {
52 title: 'Çok Satırlı Metin Özellikleri',
53 cols: 'Sütunlar',
54 rows: 'Satırlar'
55 },
56 textfield: {
57 title: 'Metin Girişi Özellikleri',
58 name: 'Ad',
59 value: 'Değer',
60 charWidth: 'Karakter Genişliği',
61 maxChars: 'En Fazla Karakter',
62 required: 'Zorunlu',
63 type: 'Tür',
64 typeText: 'Metin',
65 typePass: 'Şifre',
66 typeEmail: 'E-posta',
67 typeSearch: 'Ara',
68 typeTel: 'Telefon Numarası',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/tt.js b/sources/plugins/forms/lang/tt.js
new file mode 100644
index 00000000..24f9d3b6
--- /dev/null
+++ b/sources/plugins/forms/lang/tt.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'tt', {
6 button: {
7 title: 'Төймә үзлекләре',
8 text: 'Текст (күләм)',
9 type: 'Төр',
10 typeBtn: 'Төймә',
11 typeSbm: 'Җибәрү',
12 typeRst: 'Кире кайтару'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Checkbox Properties', // MISSING
16 radioTitle: 'Радио төймə үзлекләре',
17 value: 'Күләм',
18 selected: 'Сайланган',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Форма үзлекләре',
23 menu: 'Форма үзлекләре',
24 action: 'Гамәл',
25 method: 'Ысул',
26 encoding: 'Кодировка'
27 },
28 hidden: {
29 title: 'Яшерен кыр үзлекләре',
30 name: 'Исем',
31 value: 'Күләм'
32 },
33 select: {
34 title: 'Selection Field Properties', // MISSING
35 selectInfo: 'Select Info', // MISSING
36 opAvail: 'Мөмкин булган көйләүләр',
37 value: 'Күләм',
38 size: 'Зурлык',
39 lines: 'юллар',
40 chkMulti: 'Allow multiple selections', // MISSING
41 required: 'Required', // MISSING
42 opText: 'Текст',
43 opValue: 'Күләм',
44 btnAdd: 'Кушу',
45 btnModify: 'Үзгәртү',
46 btnUp: 'Өскә',
47 btnDown: 'Аска',
48 btnSetValue: 'Сайланган күләм булып билгеләргә',
49 btnDelete: 'Бетерү'
50 },
51 textarea: {
52 title: 'Текст мәйданы үзлекләре',
53 cols: 'Баганалар',
54 rows: 'Юллар'
55 },
56 textfield: {
57 title: 'Текст кыры үзлекләре',
58 name: 'Исем',
59 value: 'Күләм',
60 charWidth: 'Символлар киңлеге',
61 maxChars: 'Maximum Characters', // MISSING
62 required: 'Required', // MISSING
63 type: 'Төр',
64 typeText: 'Текст',
65 typePass: 'Сер сүз',
66 typeEmail: 'Эл. почта',
67 typeSearch: 'Эзләү',
68 typeTel: 'Телефон номеры',
69 typeUrl: 'Сылталама'
70 }
71} );
diff --git a/sources/plugins/forms/lang/ug.js b/sources/plugins/forms/lang/ug.js
new file mode 100644
index 00000000..1eed4af8
--- /dev/null
+++ b/sources/plugins/forms/lang/ug.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'ug', {
6 button: {
7 title: 'توپچا خاسلىقى',
8 text: 'بەلگە (قىممەت)',
9 type: 'تىپى',
10 typeBtn: 'توپچا',
11 typeSbm: 'تاپشۇر',
12 typeRst: 'ئەسلىگە قايتۇر'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'كۆپ تاللاش خاسلىقى',
16 radioTitle: 'تاق تاللاش توپچا خاسلىقى',
17 value: 'تاللىغان قىممەت',
18 selected: 'تاللانغان',
19 required: 'زۆرۈر'
20 },
21 form: {
22 title: 'جەدۋەل خاسلىقى',
23 menu: 'جەدۋەل خاسلىقى',
24 action: 'مەشغۇلات',
25 method: 'ئۇسۇل',
26 encoding: 'جەدۋەل كودلىنىشى'
27 },
28 hidden: {
29 title: 'يوشۇرۇن دائىرە خاسلىقى',
30 name: 'ئات',
31 value: 'دەسلەپكى قىممىتى'
32 },
33 select: {
34 title: 'جەدۋەل/تىزىم خاسلىقى',
35 selectInfo: 'ئۇچۇر تاللاڭ',
36 opAvail: 'تاللاش تۈرلىرى',
37 value: 'قىممەت',
38 size: 'ئېگىزلىكى',
39 lines: 'قۇر',
40 chkMulti: 'كۆپ تاللاشچان',
41 required: 'زۆرۈر',
42 opText: 'تاللانما تېكىستى',
43 opValue: 'تاللانما قىممىتى',
44 btnAdd: 'قوش',
45 btnModify: 'ئۆزگەرت',
46 btnUp: 'ئۈستىگە',
47 btnDown: 'ئاستىغا',
48 btnSetValue: 'دەسلەپكى تاللانما قىممىتىگە تەڭشە',
49 btnDelete: 'ئۆچۈر'
50 },
51 textarea: {
52 title: ' كۆپ قۇرلۇق تېكىست خاسلىقى',
53 cols: 'ھەرپ كەڭلىكى',
54 rows: 'قۇر سانى'
55 },
56 textfield: {
57 title: 'تاق قۇرلۇق تېكىست خاسلىقى',
58 name: 'ئات',
59 value: 'دەسلەپكى قىممىتى',
60 charWidth: 'ھەرپ كەڭلىكى',
61 maxChars: 'ئەڭ كۆپ ھەرپ سانى',
62 required: 'زۆرۈر',
63 type: 'تىپى',
64 typeText: 'تېكىست',
65 typePass: 'ئىم',
66 typeEmail: 'تورخەت',
67 typeSearch: 'ئىزدە',
68 typeTel: 'تېلېفون نومۇر',
69 typeUrl: 'ئادرېس'
70 }
71} );
diff --git a/sources/plugins/forms/lang/uk.js b/sources/plugins/forms/lang/uk.js
new file mode 100644
index 00000000..eec09087
--- /dev/null
+++ b/sources/plugins/forms/lang/uk.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'uk', {
6 button: {
7 title: 'Властивості кнопки',
8 text: 'Значення',
9 type: 'Тип',
10 typeBtn: 'Кнопка (button)',
11 typeSbm: 'Надіслати (submit)',
12 typeRst: 'Очистити (reset)'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Властивості галочки',
16 radioTitle: 'Властивості кнопки вибору',
17 value: 'Значення',
18 selected: 'Обрана',
19 required: 'Обов’язкове поле'
20 },
21 form: {
22 title: 'Властивості форми',
23 menu: 'Властивості форми',
24 action: 'Дія',
25 method: 'Метод',
26 encoding: 'Кодування'
27 },
28 hidden: {
29 title: 'Властивості прихованого поля',
30 name: 'Ім\'я',
31 value: 'Значення'
32 },
33 select: {
34 title: 'Властивості списку',
35 selectInfo: 'Інфо',
36 opAvail: 'Доступні варіанти',
37 value: 'Значення',
38 size: 'Кількість',
39 lines: 'видимих позицій у списку',
40 chkMulti: 'Список з мультивибором',
41 required: 'Обов’язкове поле',
42 opText: 'Текст',
43 opValue: 'Значення',
44 btnAdd: 'Добавити',
45 btnModify: 'Змінити',
46 btnUp: 'Вгору',
47 btnDown: 'Вниз',
48 btnSetValue: 'Встановити як обране значення',
49 btnDelete: 'Видалити'
50 },
51 textarea: {
52 title: 'Властивості текстової області',
53 cols: 'Стовбці',
54 rows: 'Рядки'
55 },
56 textfield: {
57 title: 'Властивості текстового поля',
58 name: 'Ім\'я',
59 value: 'Значення',
60 charWidth: 'Ширина',
61 maxChars: 'Макс. к-ть символів',
62 required: 'Обов’язкове поле',
63 type: 'Тип',
64 typeText: 'Текст',
65 typePass: 'Пароль',
66 typeEmail: 'Пошта',
67 typeSearch: 'Пошук',
68 typeTel: 'Мобільний',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/vi.js b/sources/plugins/forms/lang/vi.js
new file mode 100644
index 00000000..8d8929fc
--- /dev/null
+++ b/sources/plugins/forms/lang/vi.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'vi', {
6 button: {
7 title: 'Thuộc tính của nút',
8 text: 'Chuỗi hiển thị (giá trị)',
9 type: 'Kiểu',
10 typeBtn: 'Nút bấm',
11 typeSbm: 'Nút gửi',
12 typeRst: 'Nút nhập lại'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: 'Thuộc tính nút kiểm',
16 radioTitle: 'Thuộc tính nút chọn',
17 value: 'Giá trị',
18 selected: 'Được chọn',
19 required: 'Required' // MISSING
20 },
21 form: {
22 title: 'Thuộc tính biểu mẫu',
23 menu: 'Thuộc tính biểu mẫu',
24 action: 'Hành động',
25 method: 'Phương thức',
26 encoding: 'Bảng mã'
27 },
28 hidden: {
29 title: 'Thuộc tính trường ẩn',
30 name: 'Tên',
31 value: 'Giá trị'
32 },
33 select: {
34 title: 'Thuộc tính ô chọn',
35 selectInfo: 'Thông tin',
36 opAvail: 'Các tùy chọn có thể sử dụng',
37 value: 'Giá trị',
38 size: 'Kích cỡ',
39 lines: 'dòng',
40 chkMulti: 'Cho phép chọn nhiều',
41 required: 'Required', // MISSING
42 opText: 'Văn bản',
43 opValue: 'Giá trị',
44 btnAdd: 'Thêm',
45 btnModify: 'Thay đổi',
46 btnUp: 'Lên',
47 btnDown: 'Xuống',
48 btnSetValue: 'Giá trị được chọn',
49 btnDelete: 'Nút xoá'
50 },
51 textarea: {
52 title: 'Thuộc tính vùng văn bản',
53 cols: 'Số cột',
54 rows: 'Số hàng'
55 },
56 textfield: {
57 title: 'Thuộc tính trường văn bản',
58 name: 'Tên',
59 value: 'Giá trị',
60 charWidth: 'Độ rộng của ký tự',
61 maxChars: 'Số ký tự tối đa',
62 required: 'Required', // MISSING
63 type: 'Kiểu',
64 typeText: 'Ký tự',
65 typePass: 'Mật khẩu',
66 typeEmail: 'Email',
67 typeSearch: 'Tìm kiếm',
68 typeTel: 'Số điện thoại',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/lang/zh-cn.js b/sources/plugins/forms/lang/zh-cn.js
new file mode 100644
index 00000000..89a8050a
--- /dev/null
+++ b/sources/plugins/forms/lang/zh-cn.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'zh-cn', {
6 button: {
7 title: '按钮属性',
8 text: '标签(值)',
9 type: '类型',
10 typeBtn: '按钮',
11 typeSbm: '提交',
12 typeRst: '重设'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: '复选框属性',
16 radioTitle: '单选按钮属性',
17 value: '选定值',
18 selected: '已勾选',
19 required: '必选'
20 },
21 form: {
22 title: '表单属性',
23 menu: '表单属性',
24 action: '动作',
25 method: '方法',
26 encoding: '表单编码'
27 },
28 hidden: {
29 title: '隐藏域属性',
30 name: '名称',
31 value: '初始值'
32 },
33 select: {
34 title: '菜单/列表属性',
35 selectInfo: '选择信息',
36 opAvail: '可选项',
37 value: '值',
38 size: '高度',
39 lines: '行',
40 chkMulti: '允许多选',
41 required: '必选',
42 opText: '选项文本',
43 opValue: '选项值',
44 btnAdd: '添加',
45 btnModify: '修改',
46 btnUp: '上移',
47 btnDown: '下移',
48 btnSetValue: '设为初始选定',
49 btnDelete: '删除'
50 },
51 textarea: {
52 title: '多行文本属性',
53 cols: '字符宽度',
54 rows: '行数'
55 },
56 textfield: {
57 title: '单行文本属性',
58 name: '名称',
59 value: '初始值',
60 charWidth: '字符宽度',
61 maxChars: '最多字符数',
62 required: '必填',
63 type: '类型',
64 typeText: '文本',
65 typePass: '密码',
66 typeEmail: 'Email',
67 typeSearch: '搜索',
68 typeTel: '电话号码',
69 typeUrl: '地址'
70 }
71} );
diff --git a/sources/plugins/forms/lang/zh.js b/sources/plugins/forms/lang/zh.js
new file mode 100644
index 00000000..ede780a8
--- /dev/null
+++ b/sources/plugins/forms/lang/zh.js
@@ -0,0 +1,71 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'forms', 'zh', {
6 button: {
7 title: '按鈕內容',
8 text: '顯示文字 (值)',
9 type: '類型',
10 typeBtn: '按鈕',
11 typeSbm: '送出',
12 typeRst: '重設'
13 },
14 checkboxAndRadio: {
15 checkboxTitle: '核取方塊內容',
16 radioTitle: '選項按鈕內容',
17 value: '數值',
18 selected: '已選',
19 required: '必填'
20 },
21 form: {
22 title: '表單內容',
23 menu: '表單內容',
24 action: '動作',
25 method: '方式',
26 encoding: '編碼'
27 },
28 hidden: {
29 title: '隱藏欄位內容',
30 name: '名稱',
31 value: '數值'
32 },
33 select: {
34 title: '選取欄位內容',
35 selectInfo: '選擇資訊',
36 opAvail: '可用選項',
37 value: '數值',
38 size: '大小',
39 lines: '行數',
40 chkMulti: '允許多選',
41 required: '必填',
42 opText: '文字',
43 opValue: '數值',
44 btnAdd: '新增',
45 btnModify: '修改',
46 btnUp: '向上',
47 btnDown: '向下',
48 btnSetValue: '設為已選',
49 btnDelete: '刪除'
50 },
51 textarea: {
52 title: '文字區域內容',
53 cols: '列',
54 rows: '行'
55 },
56 textfield: {
57 title: '文字欄位內容',
58 name: '名字',
59 value: '數值',
60 charWidth: '字元寬度',
61 maxChars: '最大字元數',
62 required: '必填',
63 type: '類型',
64 typeText: '文字',
65 typePass: '密碼',
66 typeEmail: '電子郵件',
67 typeSearch: '搜尋',
68 typeTel: '電話號碼',
69 typeUrl: 'URL'
70 }
71} );
diff --git a/sources/plugins/forms/plugin.js b/sources/plugins/forms/plugin.js
new file mode 100644
index 00000000..737204ae
--- /dev/null
+++ b/sources/plugins/forms/plugin.js
@@ -0,0 +1,279 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Forms Plugin
8 */
9
10CKEDITOR.plugins.add( 'forms', {
11 requires: 'dialog,fakeobjects',
12 // jscs:disable maximumLineLength
13 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
14 // jscs:enable maximumLineLength
15 icons: 'button,checkbox,form,hiddenfield,imagebutton,radio,select,select-rtl,textarea,textarea-rtl,textfield', // %REMOVE_LINE_CORE%
16 hidpi: true, // %REMOVE_LINE_CORE%
17 onLoad: function() {
18 CKEDITOR.addCss( '.cke_editable form' +
19 '{' +
20 'border: 1px dotted #FF0000;' +
21 'padding: 2px;' +
22 '}\n' );
23
24 CKEDITOR.addCss( 'img.cke_hidden' +
25 '{' +
26 'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/hiddenfield.gif' ) + ');' +
27 'background-position: center center;' +
28 'background-repeat: no-repeat;' +
29 'border: 1px solid #a9a9a9;' +
30 'width: 16px !important;' +
31 'height: 16px !important;' +
32 '}' );
33
34 },
35 init: function( editor ) {
36 var lang = editor.lang,
37 order = 0,
38 textfieldTypes = { email: 1, password: 1, search: 1, tel: 1, text: 1, url: 1 },
39 allowedContent = {
40 checkbox: 'input[type,name,checked,required]',
41 radio: 'input[type,name,checked,required]',
42 textfield: 'input[type,name,value,size,maxlength,required]',
43 textarea: 'textarea[cols,rows,name,required]',
44 select: 'select[name,size,multiple,required]; option[value,selected]',
45 button: 'input[type,name,value]',
46 form: 'form[action,name,id,enctype,target,method]',
47 hiddenfield: 'input[type,name,value]',
48 imagebutton: 'input[type,alt,src]{width,height,border,border-width,border-style,margin,float}'
49 },
50 requiredContent = {
51 checkbox: 'input',
52 radio: 'input',
53 textfield: 'input',
54 textarea: 'textarea',
55 select: 'select',
56 button: 'input',
57 form: 'form',
58 hiddenfield: 'input',
59 imagebutton: 'input'
60 };
61
62 // All buttons use the same code to register. So, to avoid
63 // duplications, let's use this tool function.
64 var addButtonCommand = function( buttonName, commandName, dialogFile ) {
65 var def = {
66 allowedContent: allowedContent[ commandName ],
67 requiredContent: requiredContent[ commandName ]
68 };
69 commandName == 'form' && ( def.context = 'form' );
70
71 editor.addCommand( commandName, new CKEDITOR.dialogCommand( commandName, def ) );
72
73 editor.ui.addButton && editor.ui.addButton( buttonName, {
74 label: lang.common[ buttonName.charAt( 0 ).toLowerCase() + buttonName.slice( 1 ) ],
75 command: commandName,
76 toolbar: 'forms,' + ( order += 10 )
77 } );
78 CKEDITOR.dialog.add( commandName, dialogFile );
79 };
80
81 var dialogPath = this.path + 'dialogs/';
82 !editor.blockless && addButtonCommand( 'Form', 'form', dialogPath + 'form.js' );
83 addButtonCommand( 'Checkbox', 'checkbox', dialogPath + 'checkbox.js' );
84 addButtonCommand( 'Radio', 'radio', dialogPath + 'radio.js' );
85 addButtonCommand( 'TextField', 'textfield', dialogPath + 'textfield.js' );
86 addButtonCommand( 'Textarea', 'textarea', dialogPath + 'textarea.js' );
87 addButtonCommand( 'Select', 'select', dialogPath + 'select.js' );
88 addButtonCommand( 'Button', 'button', dialogPath + 'button.js' );
89
90 var imagePlugin = editor.plugins.image;
91
92 // Since Image plugin is disabled when Image2 is to be loaded,
93 // ImageButton also got to be off (#11222).
94 if ( imagePlugin && !editor.plugins.image2 )
95 addButtonCommand( 'ImageButton', 'imagebutton', CKEDITOR.plugins.getPath( 'image' ) + 'dialogs/image.js' );
96
97 addButtonCommand( 'HiddenField', 'hiddenfield', dialogPath + 'hiddenfield.js' );
98
99 // If the "menu" plugin is loaded, register the menu items.
100 if ( editor.addMenuItems ) {
101 var items = {
102 checkbox: {
103 label: lang.forms.checkboxAndRadio.checkboxTitle,
104 command: 'checkbox',
105 group: 'checkbox'
106 },
107
108 radio: {
109 label: lang.forms.checkboxAndRadio.radioTitle,
110 command: 'radio',
111 group: 'radio'
112 },
113
114 textfield: {
115 label: lang.forms.textfield.title,
116 command: 'textfield',
117 group: 'textfield'
118 },
119
120 hiddenfield: {
121 label: lang.forms.hidden.title,
122 command: 'hiddenfield',
123 group: 'hiddenfield'
124 },
125
126 button: {
127 label: lang.forms.button.title,
128 command: 'button',
129 group: 'button'
130 },
131
132 select: {
133 label: lang.forms.select.title,
134 command: 'select',
135 group: 'select'
136 },
137
138 textarea: {
139 label: lang.forms.textarea.title,
140 command: 'textarea',
141 group: 'textarea'
142 }
143 };
144
145 if ( imagePlugin ) {
146 items.imagebutton = {
147 label: lang.image.titleButton,
148 command: 'imagebutton',
149 group: 'imagebutton'
150 };
151 }
152
153 !editor.blockless && ( items.form = {
154 label: lang.forms.form.menu,
155 command: 'form',
156 group: 'form'
157 } );
158
159 editor.addMenuItems( items );
160
161 }
162
163 // If the "contextmenu" plugin is loaded, register the listeners.
164 if ( editor.contextMenu ) {
165 !editor.blockless && editor.contextMenu.addListener( function( element, selection, path ) {
166 var form = path.contains( 'form', 1 );
167 if ( form && !form.isReadOnly() )
168 return { form: CKEDITOR.TRISTATE_OFF };
169 } );
170
171 editor.contextMenu.addListener( function( element ) {
172 if ( element && !element.isReadOnly() ) {
173 var name = element.getName();
174
175 if ( name == 'select' )
176 return { select: CKEDITOR.TRISTATE_OFF };
177
178 if ( name == 'textarea' )
179 return { textarea: CKEDITOR.TRISTATE_OFF };
180
181 if ( name == 'input' ) {
182 var type = element.getAttribute( 'type' ) || 'text';
183 switch ( type ) {
184 case 'button':
185 case 'submit':
186 case 'reset':
187 return { button: CKEDITOR.TRISTATE_OFF };
188
189 case 'checkbox':
190 return { checkbox: CKEDITOR.TRISTATE_OFF };
191
192 case 'radio':
193 return { radio: CKEDITOR.TRISTATE_OFF };
194
195 case 'image':
196 return imagePlugin ? { imagebutton: CKEDITOR.TRISTATE_OFF } : null;
197 }
198
199 if ( textfieldTypes[ type ] )
200 return { textfield: CKEDITOR.TRISTATE_OFF };
201 }
202
203 if ( name == 'img' && element.data( 'cke-real-element-type' ) == 'hiddenfield' )
204 return { hiddenfield: CKEDITOR.TRISTATE_OFF };
205 }
206 } );
207 }
208
209 editor.on( 'doubleclick', function( evt ) {
210 var element = evt.data.element;
211
212 if ( !editor.blockless && element.is( 'form' ) )
213 evt.data.dialog = 'form';
214 else if ( element.is( 'select' ) )
215 evt.data.dialog = 'select';
216 else if ( element.is( 'textarea' ) )
217 evt.data.dialog = 'textarea';
218 else if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'hiddenfield' )
219 evt.data.dialog = 'hiddenfield';
220 else if ( element.is( 'input' ) ) {
221 var type = element.getAttribute( 'type' ) || 'text';
222 switch ( type ) {
223 case 'button':
224 case 'submit':
225 case 'reset':
226 evt.data.dialog = 'button';
227 break;
228 case 'checkbox':
229 evt.data.dialog = 'checkbox';
230 break;
231 case 'radio':
232 evt.data.dialog = 'radio';
233 break;
234 case 'image':
235 evt.data.dialog = 'imagebutton';
236 break;
237 }
238 if ( textfieldTypes[ type ] )
239 evt.data.dialog = 'textfield';
240 }
241 } );
242 },
243
244 afterInit: function( editor ) {
245 var dataProcessor = editor.dataProcessor,
246 htmlFilter = dataProcessor && dataProcessor.htmlFilter,
247 dataFilter = dataProcessor && dataProcessor.dataFilter;
248
249 // Cleanup certain IE form elements default values.
250 // Note: Inputs are marked with contenteditable=false flags, so filters for them
251 // need to be applied to non-editable content as well.
252 if ( CKEDITOR.env.ie ) {
253 htmlFilter && htmlFilter.addRules( {
254 elements: {
255 input: function( input ) {
256 var attrs = input.attributes,
257 type = attrs.type;
258 // Old IEs don't provide type for Text inputs #5522
259 if ( !type )
260 attrs.type = 'text';
261 if ( type == 'checkbox' || type == 'radio' )
262 attrs.value == 'on' && delete attrs.value;
263 }
264 }
265 }, { applyToAll: true } );
266 }
267
268 if ( dataFilter ) {
269 dataFilter.addRules( {
270 elements: {
271 input: function( element ) {
272 if ( element.attributes.type == 'hidden' )
273 return editor.createFakeParserElement( element, 'cke_hidden', 'hiddenfield' );
274 }
275 }
276 }, { applyToAll: true } );
277 }
278 }
279} );
diff --git a/sources/plugins/horizontalrule/icons/hidpi/horizontalrule.png b/sources/plugins/horizontalrule/icons/hidpi/horizontalrule.png
new file mode 100644
index 00000000..433613da
--- /dev/null
+++ b/sources/plugins/horizontalrule/icons/hidpi/horizontalrule.png
Binary files differ
diff --git a/sources/plugins/horizontalrule/icons/horizontalrule.png b/sources/plugins/horizontalrule/icons/horizontalrule.png
new file mode 100644
index 00000000..4af9bc8e
--- /dev/null
+++ b/sources/plugins/horizontalrule/icons/horizontalrule.png
Binary files differ
diff --git a/sources/plugins/horizontalrule/lang/af.js b/sources/plugins/horizontalrule/lang/af.js
new file mode 100644
index 00000000..9306861e
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'af', {
6 toolbar: 'Horisontale lyn invoeg'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ar.js b/sources/plugins/horizontalrule/lang/ar.js
new file mode 100644
index 00000000..1a12f0db
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ar', {
6 toolbar: 'خط فاصل'
7} );
diff --git a/sources/plugins/horizontalrule/lang/bg.js b/sources/plugins/horizontalrule/lang/bg.js
new file mode 100644
index 00000000..bfa61db7
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'bg', {
6 toolbar: 'Вмъкване на хоризонтална линия'
7} );
diff --git a/sources/plugins/horizontalrule/lang/bn.js b/sources/plugins/horizontalrule/lang/bn.js
new file mode 100644
index 00000000..a1e14681
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'bn', {
6 toolbar: 'রেখা যুক্ত কর'
7} );
diff --git a/sources/plugins/horizontalrule/lang/bs.js b/sources/plugins/horizontalrule/lang/bs.js
new file mode 100644
index 00000000..edeeeea7
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'bs', {
6 toolbar: 'Ubaci horizontalnu liniju'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ca.js b/sources/plugins/horizontalrule/lang/ca.js
new file mode 100644
index 00000000..0d8d5d23
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ca', {
6 toolbar: 'Insereix línia horitzontal'
7} );
diff --git a/sources/plugins/horizontalrule/lang/cs.js b/sources/plugins/horizontalrule/lang/cs.js
new file mode 100644
index 00000000..5a6d186e
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'cs', {
6 toolbar: 'Vložit vodorovnou linku'
7} );
diff --git a/sources/plugins/horizontalrule/lang/cy.js b/sources/plugins/horizontalrule/lang/cy.js
new file mode 100644
index 00000000..c9246c0c
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'cy', {
6 toolbar: 'Mewnosod Llinell Lorweddol'
7} );
diff --git a/sources/plugins/horizontalrule/lang/da.js b/sources/plugins/horizontalrule/lang/da.js
new file mode 100644
index 00000000..bc690cfa
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'da', {
6 toolbar: 'Indsæt vandret streg'
7} );
diff --git a/sources/plugins/horizontalrule/lang/de.js b/sources/plugins/horizontalrule/lang/de.js
new file mode 100644
index 00000000..5094422c
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'de', {
6 toolbar: 'Horizontale Linie einfügen'
7} );
diff --git a/sources/plugins/horizontalrule/lang/el.js b/sources/plugins/horizontalrule/lang/el.js
new file mode 100644
index 00000000..fbffb607
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'el', {
6 toolbar: 'Εισαγωγή Οριζόντιας Γραμμής'
7} );
diff --git a/sources/plugins/horizontalrule/lang/en-au.js b/sources/plugins/horizontalrule/lang/en-au.js
new file mode 100644
index 00000000..539aae58
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'en-au', {
6 toolbar: 'Insert Horizontal Line'
7} );
diff --git a/sources/plugins/horizontalrule/lang/en-ca.js b/sources/plugins/horizontalrule/lang/en-ca.js
new file mode 100644
index 00000000..ceb4e230
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'en-ca', {
6 toolbar: 'Insert Horizontal Line'
7} );
diff --git a/sources/plugins/horizontalrule/lang/en-gb.js b/sources/plugins/horizontalrule/lang/en-gb.js
new file mode 100644
index 00000000..251dc447
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'en-gb', {
6 toolbar: 'Insert Horizontal Line'
7} );
diff --git a/sources/plugins/horizontalrule/lang/en.js b/sources/plugins/horizontalrule/lang/en.js
new file mode 100644
index 00000000..216e3d37
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'en', {
6 toolbar: 'Insert Horizontal Line'
7} );
diff --git a/sources/plugins/horizontalrule/lang/eo.js b/sources/plugins/horizontalrule/lang/eo.js
new file mode 100644
index 00000000..821dcb6e
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'eo', {
6 toolbar: 'Enmeti Horizontalan Linion'
7} );
diff --git a/sources/plugins/horizontalrule/lang/es.js b/sources/plugins/horizontalrule/lang/es.js
new file mode 100644
index 00000000..efc58ae8
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'es', {
6 toolbar: 'Insertar Línea Horizontal'
7} );
diff --git a/sources/plugins/horizontalrule/lang/et.js b/sources/plugins/horizontalrule/lang/et.js
new file mode 100644
index 00000000..9b6e6140
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'et', {
6 toolbar: 'Horisontaaljoone sisestamine'
7} );
diff --git a/sources/plugins/horizontalrule/lang/eu.js b/sources/plugins/horizontalrule/lang/eu.js
new file mode 100644
index 00000000..fab552b9
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'eu', {
6 toolbar: 'Txertatu marra horizontala'
7} );
diff --git a/sources/plugins/horizontalrule/lang/fa.js b/sources/plugins/horizontalrule/lang/fa.js
new file mode 100644
index 00000000..afb96d96
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'fa', {
6 toolbar: 'گنجاندن خط افقی'
7} );
diff --git a/sources/plugins/horizontalrule/lang/fi.js b/sources/plugins/horizontalrule/lang/fi.js
new file mode 100644
index 00000000..a1462042
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'fi', {
6 toolbar: 'Lisää murtoviiva'
7} );
diff --git a/sources/plugins/horizontalrule/lang/fo.js b/sources/plugins/horizontalrule/lang/fo.js
new file mode 100644
index 00000000..8dd904db
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'fo', {
6 toolbar: 'Ger vatnrætta linju'
7} );
diff --git a/sources/plugins/horizontalrule/lang/fr-ca.js b/sources/plugins/horizontalrule/lang/fr-ca.js
new file mode 100644
index 00000000..13c5b5b9
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'fr-ca', {
6 toolbar: 'Insérer un séparateur horizontale'
7} );
diff --git a/sources/plugins/horizontalrule/lang/fr.js b/sources/plugins/horizontalrule/lang/fr.js
new file mode 100644
index 00000000..6b44a00d
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'fr', {
6 toolbar: 'Ligne horizontale'
7} );
diff --git a/sources/plugins/horizontalrule/lang/gl.js b/sources/plugins/horizontalrule/lang/gl.js
new file mode 100644
index 00000000..8f0eb28a
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'gl', {
6 toolbar: 'Inserir unha liña horizontal'
7} );
diff --git a/sources/plugins/horizontalrule/lang/gu.js b/sources/plugins/horizontalrule/lang/gu.js
new file mode 100644
index 00000000..548eb5b0
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'gu', {
6 toolbar: 'સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી'
7} );
diff --git a/sources/plugins/horizontalrule/lang/he.js b/sources/plugins/horizontalrule/lang/he.js
new file mode 100644
index 00000000..9ee3fb61
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'he', {
6 toolbar: 'הוספת קו אופקי'
7} );
diff --git a/sources/plugins/horizontalrule/lang/hi.js b/sources/plugins/horizontalrule/lang/hi.js
new file mode 100644
index 00000000..3a70d368
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'hi', {
6 toolbar: 'हॉरिज़ॉन्टल रेखा इन्सर्ट करें'
7} );
diff --git a/sources/plugins/horizontalrule/lang/hr.js b/sources/plugins/horizontalrule/lang/hr.js
new file mode 100644
index 00000000..29f1c8c5
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'hr', {
6 toolbar: 'Ubaci vodoravnu liniju'
7} );
diff --git a/sources/plugins/horizontalrule/lang/hu.js b/sources/plugins/horizontalrule/lang/hu.js
new file mode 100644
index 00000000..e0b9a408
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'hu', {
6 toolbar: 'Elválasztóvonal beillesztése'
7} );
diff --git a/sources/plugins/horizontalrule/lang/id.js b/sources/plugins/horizontalrule/lang/id.js
new file mode 100644
index 00000000..6f28c6b4
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'id', {
6 toolbar: 'Sisip Garis Horisontal'
7} );
diff --git a/sources/plugins/horizontalrule/lang/is.js b/sources/plugins/horizontalrule/lang/is.js
new file mode 100644
index 00000000..3620f4a4
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'is', {
6 toolbar: 'Lóðrétt lína'
7} );
diff --git a/sources/plugins/horizontalrule/lang/it.js b/sources/plugins/horizontalrule/lang/it.js
new file mode 100644
index 00000000..a5756f4b
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'it', {
6 toolbar: 'Inserisci riga orizzontale'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ja.js b/sources/plugins/horizontalrule/lang/ja.js
new file mode 100644
index 00000000..0d8af61b
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ja', {
6 toolbar: '水平線'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ka.js b/sources/plugins/horizontalrule/lang/ka.js
new file mode 100644
index 00000000..796f719a
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ka', {
6 toolbar: 'ჰორიზონტალური ხაზის ჩასმა'
7} );
diff --git a/sources/plugins/horizontalrule/lang/km.js b/sources/plugins/horizontalrule/lang/km.js
new file mode 100644
index 00000000..dfba64bb
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'km', {
6 toolbar: 'បន្ថែមបន្ទាត់ផ្តេក'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ko.js b/sources/plugins/horizontalrule/lang/ko.js
new file mode 100644
index 00000000..48490ab3
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ko', {
6 toolbar: '가로 줄 삽입'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ku.js b/sources/plugins/horizontalrule/lang/ku.js
new file mode 100644
index 00000000..b281a252
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ku', {
6 toolbar: 'دانانی هێلی ئاسۆیی'
7} );
diff --git a/sources/plugins/horizontalrule/lang/lt.js b/sources/plugins/horizontalrule/lang/lt.js
new file mode 100644
index 00000000..869e7627
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'lt', {
6 toolbar: 'Įterpti horizontalią liniją'
7} );
diff --git a/sources/plugins/horizontalrule/lang/lv.js b/sources/plugins/horizontalrule/lang/lv.js
new file mode 100644
index 00000000..888dc174
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'lv', {
6 toolbar: 'Ievietot horizontālu Atdalītājsvītru'
7} );
diff --git a/sources/plugins/horizontalrule/lang/mk.js b/sources/plugins/horizontalrule/lang/mk.js
new file mode 100644
index 00000000..8e1ac1ad
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'mk', {
6 toolbar: 'Insert Horizontal Line' // MISSING
7} );
diff --git a/sources/plugins/horizontalrule/lang/mn.js b/sources/plugins/horizontalrule/lang/mn.js
new file mode 100644
index 00000000..8f235fad
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'mn', {
6 toolbar: 'Хөндлөн зураас оруулах'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ms.js b/sources/plugins/horizontalrule/lang/ms.js
new file mode 100644
index 00000000..0f8d7b9f
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ms', {
6 toolbar: 'Masukkan Garisan Membujur'
7} );
diff --git a/sources/plugins/horizontalrule/lang/nb.js b/sources/plugins/horizontalrule/lang/nb.js
new file mode 100644
index 00000000..d00fd155
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'nb', {
6 toolbar: 'Sett inn horisontal linje'
7} );
diff --git a/sources/plugins/horizontalrule/lang/nl.js b/sources/plugins/horizontalrule/lang/nl.js
new file mode 100644
index 00000000..3420fefe
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'nl', {
6 toolbar: 'Horizontale lijn invoegen'
7} );
diff --git a/sources/plugins/horizontalrule/lang/no.js b/sources/plugins/horizontalrule/lang/no.js
new file mode 100644
index 00000000..5173f99a
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'no', {
6 toolbar: 'Sett inn horisontal linje'
7} );
diff --git a/sources/plugins/horizontalrule/lang/pl.js b/sources/plugins/horizontalrule/lang/pl.js
new file mode 100644
index 00000000..bd137b97
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'pl', {
6 toolbar: 'Wstaw poziomą linię'
7} );
diff --git a/sources/plugins/horizontalrule/lang/pt-br.js b/sources/plugins/horizontalrule/lang/pt-br.js
new file mode 100644
index 00000000..dbb40d2d
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'pt-br', {
6 toolbar: 'Inserir Linha Horizontal'
7} );
diff --git a/sources/plugins/horizontalrule/lang/pt.js b/sources/plugins/horizontalrule/lang/pt.js
new file mode 100644
index 00000000..956ae18f
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'pt', {
6 toolbar: 'Inserir Linha Horizontal'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ro.js b/sources/plugins/horizontalrule/lang/ro.js
new file mode 100644
index 00000000..af2fdbe6
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ro', {
6 toolbar: 'Inserează linie orizontală'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ru.js b/sources/plugins/horizontalrule/lang/ru.js
new file mode 100644
index 00000000..08b31f35
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ru', {
6 toolbar: 'Вставить горизонтальную линию'
7} );
diff --git a/sources/plugins/horizontalrule/lang/si.js b/sources/plugins/horizontalrule/lang/si.js
new file mode 100644
index 00000000..3f6546e4
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'si', {
6 toolbar: 'තිරස් රේඛාවක් ඇතුලත් කරන්න'
7} );
diff --git a/sources/plugins/horizontalrule/lang/sk.js b/sources/plugins/horizontalrule/lang/sk.js
new file mode 100644
index 00000000..0b02b122
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'sk', {
6 toolbar: 'Vložiť vodorovnú čiaru'
7} );
diff --git a/sources/plugins/horizontalrule/lang/sl.js b/sources/plugins/horizontalrule/lang/sl.js
new file mode 100644
index 00000000..18380b1e
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'sl', {
6 toolbar: 'Vstavi vodoravno črto'
7} );
diff --git a/sources/plugins/horizontalrule/lang/sq.js b/sources/plugins/horizontalrule/lang/sq.js
new file mode 100644
index 00000000..d1b8da89
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'sq', {
6 toolbar: 'Vendos Vijë Horizontale'
7} );
diff --git a/sources/plugins/horizontalrule/lang/sr-latn.js b/sources/plugins/horizontalrule/lang/sr-latn.js
new file mode 100644
index 00000000..d77b7b7a
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'sr-latn', {
6 toolbar: 'Unesi horizontalnu liniju'
7} );
diff --git a/sources/plugins/horizontalrule/lang/sr.js b/sources/plugins/horizontalrule/lang/sr.js
new file mode 100644
index 00000000..e6a66f01
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'sr', {
6 toolbar: 'Унеси хоризонталну линију'
7} );
diff --git a/sources/plugins/horizontalrule/lang/sv.js b/sources/plugins/horizontalrule/lang/sv.js
new file mode 100644
index 00000000..80174c43
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'sv', {
6 toolbar: 'Infoga horisontal linje'
7} );
diff --git a/sources/plugins/horizontalrule/lang/th.js b/sources/plugins/horizontalrule/lang/th.js
new file mode 100644
index 00000000..50966d42
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'th', {
6 toolbar: 'แทรกเส้นคั่นบรรทัด'
7} );
diff --git a/sources/plugins/horizontalrule/lang/tr.js b/sources/plugins/horizontalrule/lang/tr.js
new file mode 100644
index 00000000..4dfa72b0
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'tr', {
6 toolbar: 'Yatay Satır Ekle'
7} );
diff --git a/sources/plugins/horizontalrule/lang/tt.js b/sources/plugins/horizontalrule/lang/tt.js
new file mode 100644
index 00000000..ed41abb1
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'tt', {
6 toolbar: 'Ятма сызык өстәү'
7} );
diff --git a/sources/plugins/horizontalrule/lang/ug.js b/sources/plugins/horizontalrule/lang/ug.js
new file mode 100644
index 00000000..0a6dbfd4
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'ug', {
6 toolbar: 'توغرا سىزىق قىستۇر'
7} );
diff --git a/sources/plugins/horizontalrule/lang/uk.js b/sources/plugins/horizontalrule/lang/uk.js
new file mode 100644
index 00000000..c42688a2
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'uk', {
6 toolbar: 'Горизонтальна лінія'
7} );
diff --git a/sources/plugins/horizontalrule/lang/vi.js b/sources/plugins/horizontalrule/lang/vi.js
new file mode 100644
index 00000000..2b45cdce
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'vi', {
6 toolbar: 'Chèn đường phân cách ngang'
7} );
diff --git a/sources/plugins/horizontalrule/lang/zh-cn.js b/sources/plugins/horizontalrule/lang/zh-cn.js
new file mode 100644
index 00000000..74b44261
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'zh-cn', {
6 toolbar: '插入水平线'
7} );
diff --git a/sources/plugins/horizontalrule/lang/zh.js b/sources/plugins/horizontalrule/lang/zh.js
new file mode 100644
index 00000000..2e0fb4d0
--- /dev/null
+++ b/sources/plugins/horizontalrule/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'horizontalrule', 'zh', {
6 toolbar: '插入水平線'
7} );
diff --git a/sources/plugins/horizontalrule/plugin.js b/sources/plugins/horizontalrule/plugin.js
new file mode 100644
index 00000000..0bb5bafc
--- /dev/null
+++ b/sources/plugins/horizontalrule/plugin.js
@@ -0,0 +1,43 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Horizontal Rule plugin.
8 */
9
10( function() {
11 var horizontalruleCmd = {
12 canUndo: false, // The undo snapshot will be handled by 'insertElement'.
13 exec: function( editor ) {
14 var hr = editor.document.createElement( 'hr' );
15 editor.insertElement( hr );
16 },
17
18 allowedContent: 'hr',
19 requiredContent: 'hr'
20 };
21
22 var pluginName = 'horizontalrule';
23
24 // Register a plugin named "horizontalrule".
25 CKEDITOR.plugins.add( pluginName, {
26 // jscs:disable maximumLineLength
27 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
28 // jscs:enable maximumLineLength
29 icons: 'horizontalrule', // %REMOVE_LINE_CORE%
30 hidpi: true, // %REMOVE_LINE_CORE%
31 init: function( editor ) {
32 if ( editor.blockless )
33 return;
34
35 editor.addCommand( pluginName, horizontalruleCmd );
36 editor.ui.addButton && editor.ui.addButton( 'HorizontalRule', {
37 label: editor.lang.horizontalrule.toolbar,
38 command: pluginName,
39 toolbar: 'insert,40'
40 } );
41 }
42 } );
43} )();
diff --git a/sources/plugins/htmlwriter/plugin.js b/sources/plugins/htmlwriter/plugin.js
new file mode 100644
index 00000000..687b2bf0
--- /dev/null
+++ b/sources/plugins/htmlwriter/plugin.js
@@ -0,0 +1,359 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'htmlwriter', {
7 init: function( editor ) {
8 var writer = new CKEDITOR.htmlWriter();
9
10 writer.forceSimpleAmpersand = editor.config.forceSimpleAmpersand;
11 writer.indentationChars = editor.config.dataIndentationChars || '\t';
12
13 // Overwrite default basicWriter initialized in hmtlDataProcessor constructor.
14 editor.dataProcessor.writer = writer;
15 }
16} );
17
18/**
19 * The class used to write HTML data.
20 *
21 * var writer = new CKEDITOR.htmlWriter();
22 * writer.openTag( 'p' );
23 * writer.attribute( 'class', 'MyClass' );
24 * writer.openTagClose( 'p' );
25 * writer.text( 'Hello' );
26 * writer.closeTag( 'p' );
27 * alert( writer.getHtml() ); // '<p class="MyClass">Hello</p>'
28 *
29 * @class
30 * @extends CKEDITOR.htmlParser.basicWriter
31 */
32CKEDITOR.htmlWriter = CKEDITOR.tools.createClass( {
33 base: CKEDITOR.htmlParser.basicWriter,
34
35 /**
36 * Creates an `htmlWriter` class instance.
37 *
38 * @constructor
39 */
40 $: function() {
41 // Call the base contructor.
42 this.base();
43
44 /**
45 * The characters to be used for each indentation step.
46 *
47 * // Use tab for indentation.
48 * editorInstance.dataProcessor.writer.indentationChars = '\t';
49 */
50 this.indentationChars = '\t';
51
52 /**
53 * The characters to be used to close "self-closing" elements, like `<br>` or `<img>`.
54 *
55 * // Use HTML4 notation for self-closing elements.
56 * editorInstance.dataProcessor.writer.selfClosingEnd = '>';
57 */
58 this.selfClosingEnd = ' />';
59
60 /**
61 * The characters to be used for line breaks.
62 *
63 * // Use CRLF for line breaks.
64 * editorInstance.dataProcessor.writer.lineBreakChars = '\r\n';
65 */
66 this.lineBreakChars = '\n';
67
68 this.sortAttributes = 1;
69
70 this._.indent = 0;
71 this._.indentation = '';
72 // Indicate preformatted block context status. (#5789)
73 this._.inPre = 0;
74 this._.rules = {};
75
76 var dtd = CKEDITOR.dtd;
77
78 for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
79 this.setRules( e, {
80 indent: !dtd[ e ][ '#' ],
81 breakBeforeOpen: 1,
82 breakBeforeClose: !dtd[ e ][ '#' ],
83 breakAfterClose: 1,
84 needsSpace: ( e in dtd.$block ) && !( e in { li: 1, dt: 1, dd: 1 } )
85 } );
86 }
87
88 this.setRules( 'br', { breakAfterOpen: 1 } );
89
90 this.setRules( 'title', {
91 indent: 0,
92 breakAfterOpen: 0
93 } );
94
95 this.setRules( 'style', {
96 indent: 0,
97 breakBeforeClose: 1
98 } );
99
100 this.setRules( 'pre', {
101 breakAfterOpen: 1, // Keep line break after the opening tag
102 indent: 0 // Disable indentation on <pre>.
103 } );
104 },
105
106 proto: {
107 /**
108 * Writes the tag opening part for an opener tag.
109 *
110 * // Writes '<p'.
111 * writer.openTag( 'p', { class : 'MyClass', id : 'MyId' } );
112 *
113 * @param {String} tagName The element name for this tag.
114 * @param {Object} attributes The attributes defined for this tag. The
115 * attributes could be used to inspect the tag.
116 */
117 openTag: function( tagName ) {
118 var rules = this._.rules[ tagName ];
119
120 if ( this._.afterCloser && rules && rules.needsSpace && this._.needsSpace )
121 this._.output.push( '\n' );
122
123 if ( this._.indent )
124 this.indentation();
125 // Do not break if indenting.
126 else if ( rules && rules.breakBeforeOpen ) {
127 this.lineBreak();
128 this.indentation();
129 }
130
131 this._.output.push( '<', tagName );
132
133 this._.afterCloser = 0;
134 },
135
136 /**
137 * Writes the tag closing part for an opener tag.
138 *
139 * // Writes '>'.
140 * writer.openTagClose( 'p', false );
141 *
142 * // Writes ' />'.
143 * writer.openTagClose( 'br', true );
144 *
145 * @param {String} tagName The element name for this tag.
146 * @param {Boolean} isSelfClose Indicates that this is a self-closing tag,
147 * like `<br>` or `<img>`.
148 */
149 openTagClose: function( tagName, isSelfClose ) {
150 var rules = this._.rules[ tagName ];
151
152 if ( isSelfClose ) {
153 this._.output.push( this.selfClosingEnd );
154
155 if ( rules && rules.breakAfterClose )
156 this._.needsSpace = rules.needsSpace;
157 } else {
158 this._.output.push( '>' );
159
160 if ( rules && rules.indent )
161 this._.indentation += this.indentationChars;
162 }
163
164 if ( rules && rules.breakAfterOpen )
165 this.lineBreak();
166 tagName == 'pre' && ( this._.inPre = 1 );
167 },
168
169 /**
170 * Writes an attribute. This function should be called after opening the
171 * tag with {@link #openTagClose}.
172 *
173 * // Writes ' class="MyClass"'.
174 * writer.attribute( 'class', 'MyClass' );
175 *
176 * @param {String} attName The attribute name.
177 * @param {String} attValue The attribute value.
178 */
179 attribute: function( attName, attValue ) {
180
181 if ( typeof attValue == 'string' ) {
182 this.forceSimpleAmpersand && ( attValue = attValue.replace( /&amp;/g, '&' ) );
183 // Browsers don't always escape special character in attribute values. (#4683, #4719).
184 attValue = CKEDITOR.tools.htmlEncodeAttr( attValue );
185 }
186
187 this._.output.push( ' ', attName, '="', attValue, '"' );
188 },
189
190 /**
191 * Writes a closer tag.
192 *
193 * // Writes '</p>'.
194 * writer.closeTag( 'p' );
195 *
196 * @param {String} tagName The element name for this tag.
197 */
198 closeTag: function( tagName ) {
199 var rules = this._.rules[ tagName ];
200
201 if ( rules && rules.indent )
202 this._.indentation = this._.indentation.substr( this.indentationChars.length );
203
204 if ( this._.indent )
205 this.indentation();
206 // Do not break if indenting.
207 else if ( rules && rules.breakBeforeClose ) {
208 this.lineBreak();
209 this.indentation();
210 }
211
212 this._.output.push( '</', tagName, '>' );
213 tagName == 'pre' && ( this._.inPre = 0 );
214
215 if ( rules && rules.breakAfterClose ) {
216 this.lineBreak();
217 this._.needsSpace = rules.needsSpace;
218 }
219
220 this._.afterCloser = 1;
221 },
222
223 /**
224 * Writes text.
225 *
226 * // Writes 'Hello Word'.
227 * writer.text( 'Hello Word' );
228 *
229 * @param {String} text The text value
230 */
231 text: function( text ) {
232 if ( this._.indent ) {
233 this.indentation();
234 !this._.inPre && ( text = CKEDITOR.tools.ltrim( text ) );
235 }
236
237 this._.output.push( text );
238 },
239
240 /**
241 * Writes a comment.
242 *
243 * // Writes "<!-- My comment -->".
244 * writer.comment( ' My comment ' );
245 *
246 * @param {String} comment The comment text.
247 */
248 comment: function( comment ) {
249 if ( this._.indent )
250 this.indentation();
251
252 this._.output.push( '<!--', comment, '-->' );
253 },
254
255 /**
256 * Writes a line break. It uses the {@link #lineBreakChars} property for it.
257 *
258 * // Writes '\n' (e.g.).
259 * writer.lineBreak();
260 */
261 lineBreak: function() {
262 if ( !this._.inPre && this._.output.length > 0 )
263 this._.output.push( this.lineBreakChars );
264 this._.indent = 1;
265 },
266
267 /**
268 * Writes the current indentation character. It uses the {@link #indentationChars}
269 * property, repeating it for the current indentation steps.
270 *
271 * // Writes '\t' (e.g.).
272 * writer.indentation();
273 */
274 indentation: function() {
275 if ( !this._.inPre && this._.indentation )
276 this._.output.push( this._.indentation );
277 this._.indent = 0;
278 },
279
280 /**
281 * Empties the current output buffer. It also brings back the default
282 * values of the writer flags.
283 *
284 * writer.reset();
285 */
286 reset: function() {
287 this._.output = [];
288 this._.indent = 0;
289 this._.indentation = '';
290 this._.afterCloser = 0;
291 this._.inPre = 0;
292 },
293
294 /**
295 * Sets formatting rules for a given element. Possible rules are:
296 *
297 * * `indent` &ndash; indent the element content.
298 * * `breakBeforeOpen` &ndash; break line before the opener tag for this element.
299 * * `breakAfterOpen` &ndash; break line after the opener tag for this element.
300 * * `breakBeforeClose` &ndash; break line before the closer tag for this element.
301 * * `breakAfterClose` &ndash; break line after the closer tag for this element.
302 *
303 * All rules default to `false`. Each function call overrides rules that are
304 * already present, leaving the undefined ones untouched.
305 *
306 * By default, all elements available in the {@link CKEDITOR.dtd#$block},
307 * {@link CKEDITOR.dtd#$listItem}, and {@link CKEDITOR.dtd#$tableContent}
308 * lists have all the above rules set to `true`. Additionaly, the `<br>`
309 * element has the `breakAfterOpen` rule set to `true`.
310 *
311 * // Break line before and after "img" tags.
312 * writer.setRules( 'img', {
313 * breakBeforeOpen: true
314 * breakAfterOpen: true
315 * } );
316 *
317 * // Reset the rules for the "h1" tag.
318 * writer.setRules( 'h1', {} );
319 *
320 * @param {String} tagName The name of the element for which the rules are set.
321 * @param {Object} rules An object containing the element rules.
322 */
323 setRules: function( tagName, rules ) {
324 var currentRules = this._.rules[ tagName ];
325
326 if ( currentRules )
327 CKEDITOR.tools.extend( currentRules, rules, true );
328 else
329 this._.rules[ tagName ] = rules;
330 }
331 }
332} );
333
334/**
335 * Whether to force using `'&'` instead of `'&amp;'` in element attributes
336 * values. It is not recommended to change this setting for compliance with the
337 * W3C XHTML 1.0 standards ([C.12, XHTML 1.0](http://www.w3.org/TR/xhtml1/#C_12)).
338 *
339 * // Use `'&'` instead of `'&amp;'`
340 * CKEDITOR.config.forceSimpleAmpersand = true;
341 *
342 * @cfg {Boolean} [forceSimpleAmpersand=false]
343 * @member CKEDITOR.config
344 */
345
346/**
347 * The characters to be used for indenting HTML output produced by the editor.
348 * Using characters different from `' '` (space) and `'\t'` (tab) is not recommended
349 * as it will mess the code.
350 *
351 * // No indentation.
352 * CKEDITOR.config.dataIndentationChars = '';
353 *
354 * // Use two spaces for indentation.
355 * CKEDITOR.config.dataIndentationChars = ' ';
356 *
357 * @cfg {String} [dataIndentationChars='\t']
358 * @member CKEDITOR.config
359 */
diff --git a/sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.fla b/sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.fla
new file mode 100644
index 00000000..27e68ccd
--- /dev/null
+++ b/sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.fla
Binary files differ
diff --git a/sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.swf b/sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.swf
new file mode 100644
index 00000000..dbe17b6b
--- /dev/null
+++ b/sources/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.swf
Binary files differ
diff --git a/sources/plugins/htmlwriter/samples/assets/outputforflash/swfobject.js b/sources/plugins/htmlwriter/samples/assets/outputforflash/swfobject.js
new file mode 100644
index 00000000..90cdcc9e
--- /dev/null
+++ b/sources/plugins/htmlwriter/samples/assets/outputforflash/swfobject.js
@@ -0,0 +1,5 @@
1
2/* SWFObject v2.2 <http://code.google.com/p/swfobject/>
3 is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
4*/
5var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
diff --git a/sources/plugins/htmlwriter/samples/outputforflash.html b/sources/plugins/htmlwriter/samples/outputforflash.html
new file mode 100644
index 00000000..c6923df8
--- /dev/null
+++ b/sources/plugins/htmlwriter/samples/outputforflash.html
@@ -0,0 +1,283 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Output for Flash &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <script src="../../../samples/old/sample.js"></script>
12 <script src="assets/outputforflash/swfobject.js"></script>
13 <link href="../../../samples/old/sample.css" rel="stylesheet">
14 <meta name="ckeditor-sample-required-plugins" content="sourcearea">
15 <meta name="ckeditor-sample-name" content="Output for Flash">
16 <meta name="ckeditor-sample-group" content="Advanced Samples">
17 <meta name="ckeditor-sample-description" content="Configuring CKEditor to produce HTML code that can be used with Adobe Flash.">
18 <style>
19
20 .alert
21 {
22 background: #ffa84c;
23 padding: 10px 15px;
24 font-weight: bold;
25 display: block;
26 margin-bottom: 20px;
27 }
28
29 </style>
30</head>
31<body>
32 <h1 class="samples">
33 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Producing Flash Compliant HTML Output
34 </h1>
35 <div class="warning deprecated">
36 This sample is not maintained anymore. Check out the <a href="http://sdk.ckeditor.com/">brand new samples in CKEditor SDK</a>.
37 </div>
38 <div class="description">
39 <p>
40 This sample shows how to configure CKEditor to output
41 HTML code that can be used with
42 <a class="samples" href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000922.html">
43 Adobe Flash</a>.
44 The code will contain a subset of standard HTML elements like <code>&lt;b&gt;</code>,
45 <code>&lt;i&gt;</code>, and <code>&lt;p&gt;</code> as well as HTML attributes.
46 </p>
47 <p>
48 To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard
49 JavaScript call, and define CKEditor features to use HTML elements and attributes.
50 </p>
51 <p>
52 For details on how to create this setup check the source code of this sample page.
53 </p>
54 </div>
55 <p>
56 To see how it works, create some content in the editing area of CKEditor on the left
57 and send it to the Flash object on the right side of the page by using the
58 <strong>Send to Flash</strong> button.
59 </p>
60 <table style="width: 100%; border-spacing: 0; border-collapse:collapse;">
61 <tr>
62 <td style="width: 100%">
63 <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;&lt;b&gt;&lt;font size=&quot;18&quot; style=&quot;font-size:18px;&quot;&gt;Flash and HTML&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It is possible to have &lt;a href=&quot;http://ckeditor.com&quot;&gt;CKEditor&lt;/a&gt; creating content that will be later loaded inside &lt;b&gt;Flash&lt;/b&gt; objects and animations.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flash has a few limitations when dealing with HTML:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It has limited support on tags.&lt;/li&gt;&lt;li&gt;There is no margin between block elements, like paragraphs.&lt;/li&gt;&lt;/ul&gt;</textarea>
64 <script>
65
66 if ( document.location.protocol == 'file:' )
67 alert( 'Warning: This samples does not work when loaded from local filesystem' +
68 'due to security restrictions implemented in Flash.' +
69 '\n\nPlease load the sample from a web server instead.' );
70
71 var editor = CKEDITOR.replace( 'editor1', {
72 /*
73 * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
74 */
75 extraPlugins: 'htmlwriter',
76
77 height: 290,
78 width: '100%',
79 toolbar: [
80 [ 'Source', '-', 'Bold', 'Italic', 'Underline', '-', 'BulletedList', '-', 'Link', 'Unlink' ],
81 [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ],
82 '/',
83 [ 'Font', 'FontSize' ],
84 [ 'TextColor', '-', 'About' ]
85 ],
86
87 /*
88 * Style sheet for the contents
89 */
90 contentsCss: 'body {color:#000; background-color#FFF; font-family: Arial; font-size:80%;} p, ol, ul {margin-top: 0px; margin-bottom: 0px;}',
91
92 /*
93 * Quirks doctype
94 */
95 docType: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
96
97 /*
98 * Core styles.
99 */
100 coreStyles_bold: { element: 'b' },
101 coreStyles_italic: { element: 'i' },
102 coreStyles_underline: { element: 'u' },
103
104 /*
105 * Font face.
106 */
107
108 // Define the way font elements will be applied to the document. The "font"
109 // element will be used.
110 font_style: {
111 element: 'font',
112 attributes: { 'face': '#(family)' }
113 },
114
115 /*
116 * Font sizes.
117 */
118
119 // The CSS part of the font sizes isn't used by Flash, it is there to get the
120 // font rendered correctly in CKEditor.
121 fontSize_sizes: '8px/8;9px/9;10px/10;11px/11;12px/12;14px/14;16px/16;18px/18;20px/20;22px/22;24px/24;26px/26;28px/28;36px/36;48px/48;72px/72',
122 fontSize_style: {
123 element: 'font',
124 attributes: { 'size': '#(size)' },
125 styles: { 'font-size': '#(size)px' }
126 } ,
127
128 /*
129 * Font colors.
130 */
131 colorButton_enableMore: true,
132
133 colorButton_foreStyle: {
134 element: 'font',
135 attributes: { 'color': '#(color)' }
136 },
137
138 colorButton_backStyle: {
139 element: 'font',
140 styles: { 'background-color': '#(color)' }
141 },
142
143 on: { 'instanceReady': configureFlashOutput }
144 });
145
146 /*
147 * Adjust the behavior of the dataProcessor to match the
148 * requirements of Flash
149 */
150 function configureFlashOutput( ev ) {
151 var editor = ev.editor,
152 dataProcessor = editor.dataProcessor,
153 htmlFilter = dataProcessor && dataProcessor.htmlFilter;
154
155 // Out self closing tags the HTML4 way, like <br>.
156 dataProcessor.writer.selfClosingEnd = '>';
157
158 // Make output formatting match Flash expectations
159 var dtd = CKEDITOR.dtd;
160 for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
161 dataProcessor.writer.setRules( e, {
162 indent: false,
163 breakBeforeOpen: false,
164 breakAfterOpen: false,
165 breakBeforeClose: false,
166 breakAfterClose: false
167 });
168 }
169 dataProcessor.writer.setRules( 'br', {
170 indent: false,
171 breakBeforeOpen: false,
172 breakAfterOpen: false,
173 breakBeforeClose: false,
174 breakAfterClose: false
175 });
176
177 // Output properties as attributes, not styles.
178 htmlFilter.addRules( {
179 elements: {
180 $: function( element ) {
181 var style, match, width, height, align;
182
183 // Output dimensions of images as width and height
184 if ( element.name == 'img' ) {
185 style = element.attributes.style;
186
187 if ( style ) {
188 // Get the width from the style.
189 match = ( /(?:^|\s)width\s*:\s*(\d+)px/i ).exec( style );
190 width = match && match[1];
191
192 // Get the height from the style.
193 match = ( /(?:^|\s)height\s*:\s*(\d+)px/i ).exec( style );
194 height = match && match[1];
195
196 if ( width ) {
197 element.attributes.style = element.attributes.style.replace( /(?:^|\s)width\s*:\s*(\d+)px;?/i , '' );
198 element.attributes.width = width;
199 }
200
201 if ( height ) {
202 element.attributes.style = element.attributes.style.replace( /(?:^|\s)height\s*:\s*(\d+)px;?/i , '' );
203 element.attributes.height = height;
204 }
205 }
206 }
207
208 // Output alignment of paragraphs using align
209 if ( element.name == 'p' ) {
210 style = element.attributes.style;
211
212 if ( style ) {
213 // Get the align from the style.
214 match = ( /(?:^|\s)text-align\s*:\s*(\w*);?/i ).exec( style );
215 align = match && match[1];
216
217 if ( align ) {
218 element.attributes.style = element.attributes.style.replace( /(?:^|\s)text-align\s*:\s*(\w*);?/i , '' );
219 element.attributes.align = align;
220 }
221 }
222 }
223
224 if ( element.attributes.style === '' )
225 delete element.attributes.style;
226
227 return element;
228 }
229 }
230 });
231 }
232
233 function sendToFlash() {
234 var html = CKEDITOR.instances.editor1.getData() ;
235
236 // Quick fix for link color.
237 html = html.replace( /<a /g, '<font color="#0000FF"><u><a ' )
238 html = html.replace( /<\/a>/g, '</a></u></font>' )
239
240 var flash = document.getElementById( 'ckFlashContainer' ) ;
241 flash.setData( html ) ;
242 }
243
244 CKEDITOR.domReady( function() {
245 if ( !swfobject.hasFlashPlayerVersion( '8' ) ) {
246 CKEDITOR.dom.element.createFromHtml( '<span class="alert">' +
247 'At least Adobe Flash Player 8 is required to run this sample. ' +
248 'You can download it from <a href="http://get.adobe.com/flashplayer">Adobe\'s website</a>.' +
249 '</span>' ).insertBefore( editor.element );
250 }
251
252 swfobject.embedSWF(
253 'assets/outputforflash/outputforflash.swf',
254 'ckFlashContainer',
255 '550',
256 '400',
257 '8',
258 { wmode: 'transparent' }
259 );
260 });
261
262 </script>
263 <p>
264 <input type="button" value="Send to Flash" onclick="sendToFlash();">
265 </p>
266 </td>
267 <td style="vertical-align: top; padding-left: 20px">
268 <div id="ckFlashContainer"></div>
269 </td>
270 </tr>
271 </table>
272 <div id="footer">
273 <hr>
274 <p>
275 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
276 </p>
277 <p id="copy">
278 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
279 Knabben. All rights reserved.
280 </p>
281 </div>
282</body>
283</html>
diff --git a/sources/plugins/htmlwriter/samples/outputhtml.html b/sources/plugins/htmlwriter/samples/outputhtml.html
new file mode 100644
index 00000000..3c584558
--- /dev/null
+++ b/sources/plugins/htmlwriter/samples/outputhtml.html
@@ -0,0 +1,224 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>HTML Compliant Output &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <script src="../../../samples/old/sample.js"></script>
12 <link href="../../../samples/old/sample.css" rel="stylesheet">
13 <meta name="ckeditor-sample-required-plugins" content="sourcearea">
14 <meta name="ckeditor-sample-name" content="Output HTML">
15 <meta name="ckeditor-sample-group" content="Advanced Samples">
16 <meta name="ckeditor-sample-description" content="Configuring CKEditor to produce legacy HTML 4 code.">
17</head>
18<body>
19 <h1 class="samples">
20 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Producing HTML Compliant Output
21 </h1>
22 <div class="warning deprecated">
23 This sample is not maintained anymore. Check out the <a href="http://sdk.ckeditor.com/">brand new samples in CKEditor SDK</a>.
24 </div>
25 <div class="description">
26 <p>
27 This sample shows how to configure CKEditor to output valid
28 <a class="samples" href="http://www.w3.org/TR/html401/">HTML 4.01</a> code.
29 Traditional HTML elements like <code>&lt;b&gt;</code>,
30 <code>&lt;i&gt;</code>, and <code>&lt;font&gt;</code> are used in place of
31 <code>&lt;strong&gt;</code>, <code>&lt;em&gt;</code>, and CSS styles.
32 </p>
33 <p>
34 To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard
35 JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes.
36 </p>
37 <p>
38 A snippet of the configuration code can be seen below; check the source of this page for
39 full definition:
40 </p>
41<pre class="samples">
42CKEDITOR.replace( '<em>textarea_id</em>', {
43 coreStyles_bold: { element: 'b' },
44 coreStyles_italic: { element: 'i' },
45
46 fontSize_style: {
47 element: 'font',
48 attributes: { 'size': '#(size)' }
49 }
50
51 ...
52});</pre>
53 </div>
54 <form action="../../../samples/sample_posteddata.php" method="post">
55 <p>
56 <label for="editor1">
57 Editor 1:
58 </label>
59 <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;b&gt;sample text&lt;/b&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
60 <script>
61
62 CKEDITOR.replace( 'editor1', {
63 /*
64 * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
65 */
66 extraPlugins: 'htmlwriter',
67
68 /*
69 * Style sheet for the contents
70 */
71 contentsCss: 'body {color:#000; background-color#:FFF;}',
72
73 /*
74 * Simple HTML5 doctype
75 */
76 docType: '<!DOCTYPE HTML>',
77
78 /*
79 * Allowed content rules which beside limiting allowed HTML
80 * will also take care of transforming styles to attributes
81 * (currently only for img - see transformation rules defined below).
82 *
83 * Read more: http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter
84 */
85 allowedContent:
86 'h1 h2 h3 p pre[align]; ' +
87 'blockquote code kbd samp var del ins cite q b i u strike ul ol li hr table tbody tr td th caption; ' +
88 'img[!src,alt,align,width,height]; font[!face]; font[!family]; font[!color]; font[!size]; font{!background-color}; a[!href]; a[!name]',
89
90 /*
91 * Core styles.
92 */
93 coreStyles_bold: { element: 'b' },
94 coreStyles_italic: { element: 'i' },
95 coreStyles_underline: { element: 'u' },
96 coreStyles_strike: { element: 'strike' },
97
98 /*
99 * Font face.
100 */
101
102 // Define the way font elements will be applied to the document.
103 // The "font" element will be used.
104 font_style: {
105 element: 'font',
106 attributes: { 'face': '#(family)' }
107 },
108
109 /*
110 * Font sizes.
111 */
112 fontSize_sizes: 'xx-small/1;x-small/2;small/3;medium/4;large/5;x-large/6;xx-large/7',
113 fontSize_style: {
114 element: 'font',
115 attributes: { 'size': '#(size)' }
116 },
117
118 /*
119 * Font colors.
120 */
121
122 colorButton_foreStyle: {
123 element: 'font',
124 attributes: { 'color': '#(color)' }
125 },
126
127 colorButton_backStyle: {
128 element: 'font',
129 styles: { 'background-color': '#(color)' }
130 },
131
132 /*
133 * Styles combo.
134 */
135 stylesSet: [
136 { name: 'Computer Code', element: 'code' },
137 { name: 'Keyboard Phrase', element: 'kbd' },
138 { name: 'Sample Text', element: 'samp' },
139 { name: 'Variable', element: 'var' },
140 { name: 'Deleted Text', element: 'del' },
141 { name: 'Inserted Text', element: 'ins' },
142 { name: 'Cited Work', element: 'cite' },
143 { name: 'Inline Quotation', element: 'q' }
144 ],
145
146 on: {
147 pluginsLoaded: configureTransformations,
148 loaded: configureHtmlWriter
149 }
150 });
151
152 /*
153 * Add missing content transformations.
154 */
155 function configureTransformations( evt ) {
156 var editor = evt.editor;
157
158 editor.dataProcessor.htmlFilter.addRules( {
159 attributes: {
160 style: function( value, element ) {
161 // Return #RGB for background and border colors
162 return CKEDITOR.tools.convertRgbToHex( value );
163 }
164 }
165 } );
166
167 // Default automatic content transformations do not yet take care of
168 // align attributes on blocks, so we need to add our own transformation rules.
169 function alignToAttribute( element ) {
170 if ( element.styles[ 'text-align' ] ) {
171 element.attributes.align = element.styles[ 'text-align' ];
172 delete element.styles[ 'text-align' ];
173 }
174 }
175 editor.filter.addTransformations( [
176 [ { element: 'p', right: alignToAttribute } ],
177 [ { element: 'h1', right: alignToAttribute } ],
178 [ { element: 'h2', right: alignToAttribute } ],
179 [ { element: 'h3', right: alignToAttribute } ],
180 [ { element: 'pre', right: alignToAttribute } ]
181 ] );
182 }
183
184 /*
185 * Adjust the behavior of htmlWriter to make it output HTML like FCKeditor.
186 */
187 function configureHtmlWriter( evt ) {
188 var editor = evt.editor,
189 dataProcessor = editor.dataProcessor;
190
191 // Out self closing tags the HTML4 way, like <br>.
192 dataProcessor.writer.selfClosingEnd = '>';
193
194 // Make output formatting behave similar to FCKeditor.
195 var dtd = CKEDITOR.dtd;
196 for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
197 dataProcessor.writer.setRules( e, {
198 indent: true,
199 breakBeforeOpen: true,
200 breakAfterOpen: false,
201 breakBeforeClose: !dtd[ e ][ '#' ],
202 breakAfterClose: true
203 });
204 }
205 }
206
207 </script>
208 </p>
209 <p>
210 <input type="submit" value="Submit">
211 </p>
212 </form>
213 <div id="footer">
214 <hr>
215 <p>
216 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
217 </p>
218 <p id="copy">
219 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
220 Knabben. All rights reserved.
221 </p>
222 </div>
223</body>
224</html>
diff --git a/sources/plugins/iframe/dialogs/iframe.js b/sources/plugins/iframe/dialogs/iframe.js
new file mode 100644
index 00000000..fb0d5627
--- /dev/null
+++ b/sources/plugins/iframe/dialogs/iframe.js
@@ -0,0 +1,207 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 // Map 'true' and 'false' values to match W3C's specifications
8 // http://www.w3.org/TR/REC-html40/present/frames.html#h-16.5
9 var checkboxValues = {
10 scrolling: { 'true': 'yes', 'false': 'no' },
11 frameborder: { 'true': '1', 'false': '0' }
12 };
13
14 function loadValue( iframeNode ) {
15 var isCheckbox = this instanceof CKEDITOR.ui.dialog.checkbox;
16 if ( iframeNode.hasAttribute( this.id ) ) {
17 var value = iframeNode.getAttribute( this.id );
18 if ( isCheckbox )
19 this.setValue( checkboxValues[ this.id ][ 'true' ] == value.toLowerCase() );
20 else
21 this.setValue( value );
22 }
23 }
24
25 function commitValue( iframeNode ) {
26 var isRemove = this.getValue() === '',
27 isCheckbox = this instanceof CKEDITOR.ui.dialog.checkbox,
28 value = this.getValue();
29 if ( isRemove )
30 iframeNode.removeAttribute( this.att || this.id );
31 else if ( isCheckbox )
32 iframeNode.setAttribute( this.id, checkboxValues[ this.id ][ value ] );
33 else
34 iframeNode.setAttribute( this.att || this.id, value );
35 }
36
37 CKEDITOR.dialog.add( 'iframe', function( editor ) {
38 var iframeLang = editor.lang.iframe,
39 commonLang = editor.lang.common,
40 dialogadvtab = editor.plugins.dialogadvtab;
41 return {
42 title: iframeLang.title,
43 minWidth: 350,
44 minHeight: 260,
45 onShow: function() {
46 // Clear previously saved elements.
47 this.fakeImage = this.iframeNode = null;
48
49 var fakeImage = this.getSelectedElement();
50 if ( fakeImage && fakeImage.data( 'cke-real-element-type' ) && fakeImage.data( 'cke-real-element-type' ) == 'iframe' ) {
51 this.fakeImage = fakeImage;
52
53 var iframeNode = editor.restoreRealElement( fakeImage );
54 this.iframeNode = iframeNode;
55
56 this.setupContent( iframeNode );
57 }
58 },
59 onOk: function() {
60 var iframeNode;
61 if ( !this.fakeImage )
62 iframeNode = new CKEDITOR.dom.element( 'iframe' );
63 else
64 iframeNode = this.iframeNode;
65
66 // A subset of the specified attributes/styles
67 // should also be applied on the fake element to
68 // have better visual effect. (#5240)
69 var extraStyles = {},
70 extraAttributes = {};
71 this.commitContent( iframeNode, extraStyles, extraAttributes );
72
73 // Refresh the fake image.
74 var newFakeImage = editor.createFakeElement( iframeNode, 'cke_iframe', 'iframe', true );
75 newFakeImage.setAttributes( extraAttributes );
76 newFakeImage.setStyles( extraStyles );
77 if ( this.fakeImage ) {
78 newFakeImage.replace( this.fakeImage );
79 editor.getSelection().selectElement( newFakeImage );
80 } else {
81 editor.insertElement( newFakeImage );
82 }
83 },
84 contents: [ {
85 id: 'info',
86 label: commonLang.generalTab,
87 accessKey: 'I',
88 elements: [ {
89 type: 'vbox',
90 padding: 0,
91 children: [ {
92 id: 'src',
93 type: 'text',
94 label: commonLang.url,
95 required: true,
96 validate: CKEDITOR.dialog.validate.notEmpty( iframeLang.noUrl ),
97 setup: loadValue,
98 commit: commitValue
99 } ]
100 },
101 {
102 type: 'hbox',
103 children: [ {
104 id: 'width',
105 type: 'text',
106 requiredContent: 'iframe[width]',
107 style: 'width:100%',
108 labelLayout: 'vertical',
109 label: commonLang.width,
110 validate: CKEDITOR.dialog.validate.htmlLength( commonLang.invalidHtmlLength.replace( '%1', commonLang.width ) ),
111 setup: loadValue,
112 commit: commitValue
113 },
114 {
115 id: 'height',
116 type: 'text',
117 requiredContent: 'iframe[height]',
118 style: 'width:100%',
119 labelLayout: 'vertical',
120 label: commonLang.height,
121 validate: CKEDITOR.dialog.validate.htmlLength( commonLang.invalidHtmlLength.replace( '%1', commonLang.height ) ),
122 setup: loadValue,
123 commit: commitValue
124 },
125 {
126 id: 'align',
127 type: 'select',
128 requiredContent: 'iframe[align]',
129 'default': '',
130 items: [
131 [ commonLang.notSet, '' ],
132 [ commonLang.alignLeft, 'left' ],
133 [ commonLang.alignRight, 'right' ],
134 [ commonLang.alignTop, 'top' ],
135 [ commonLang.alignMiddle, 'middle' ],
136 [ commonLang.alignBottom, 'bottom' ]
137 ],
138 style: 'width:100%',
139 labelLayout: 'vertical',
140 label: commonLang.align,
141 setup: function( iframeNode, fakeImage ) {
142 loadValue.apply( this, arguments );
143 if ( fakeImage ) {
144 var fakeImageAlign = fakeImage.getAttribute( 'align' );
145 this.setValue( fakeImageAlign && fakeImageAlign.toLowerCase() || '' );
146 }
147 },
148 commit: function( iframeNode, extraStyles, extraAttributes ) {
149 commitValue.apply( this, arguments );
150 if ( this.getValue() )
151 extraAttributes.align = this.getValue();
152 }
153 } ]
154 },
155 {
156 type: 'hbox',
157 widths: [ '50%', '50%' ],
158 children: [ {
159 id: 'scrolling',
160 type: 'checkbox',
161 requiredContent: 'iframe[scrolling]',
162 label: iframeLang.scrolling,
163 setup: loadValue,
164 commit: commitValue
165 },
166 {
167 id: 'frameborder',
168 type: 'checkbox',
169 requiredContent: 'iframe[frameborder]',
170 label: iframeLang.border,
171 setup: loadValue,
172 commit: commitValue
173 } ]
174 },
175 {
176 type: 'hbox',
177 widths: [ '50%', '50%' ],
178 children: [ {
179 id: 'name',
180 type: 'text',
181 requiredContent: 'iframe[name]',
182 label: commonLang.name,
183 setup: loadValue,
184 commit: commitValue
185 },
186 {
187 id: 'title',
188 type: 'text',
189 requiredContent: 'iframe[title]',
190 label: commonLang.advisoryTitle,
191 setup: loadValue,
192 commit: commitValue
193 } ]
194 },
195 {
196 id: 'longdesc',
197 type: 'text',
198 requiredContent: 'iframe[longdesc]',
199 label: commonLang.longDescr,
200 setup: loadValue,
201 commit: commitValue
202 } ]
203 },
204 dialogadvtab && dialogadvtab.createAdvancedTab( editor, { id: 1, classes: 1, styles: 1 }, 'iframe' )
205 ] };
206 } );
207} )();
diff --git a/sources/plugins/iframe/icons/hidpi/iframe.png b/sources/plugins/iframe/icons/hidpi/iframe.png
new file mode 100644
index 00000000..ff17604d
--- /dev/null
+++ b/sources/plugins/iframe/icons/hidpi/iframe.png
Binary files differ
diff --git a/sources/plugins/iframe/icons/iframe.png b/sources/plugins/iframe/icons/iframe.png
new file mode 100644
index 00000000..f72d1915
--- /dev/null
+++ b/sources/plugins/iframe/icons/iframe.png
Binary files differ
diff --git a/sources/plugins/iframe/images/placeholder.png b/sources/plugins/iframe/images/placeholder.png
new file mode 100644
index 00000000..4af09565
--- /dev/null
+++ b/sources/plugins/iframe/images/placeholder.png
Binary files differ
diff --git a/sources/plugins/iframe/lang/af.js b/sources/plugins/iframe/lang/af.js
new file mode 100644
index 00000000..ed13c648
--- /dev/null
+++ b/sources/plugins/iframe/lang/af.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'af', {
6 border: 'Wys rand van raam',
7 noUrl: 'Gee die iframe URL',
8 scrolling: 'Skuifbalke aan',
9 title: 'IFrame Eienskappe',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/ar.js b/sources/plugins/iframe/lang/ar.js
new file mode 100644
index 00000000..41427519
--- /dev/null
+++ b/sources/plugins/iframe/lang/ar.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ar', {
6 border: 'إظهار حدود الإطار',
7 noUrl: 'فضلا أكتب رابط الـ iframe',
8 scrolling: 'تفعيل أشرطة الإنتقال',
9 title: 'خصائص iframe',
10 toolbar: 'iframe'
11} );
diff --git a/sources/plugins/iframe/lang/bg.js b/sources/plugins/iframe/lang/bg.js
new file mode 100644
index 00000000..7a14a452
--- /dev/null
+++ b/sources/plugins/iframe/lang/bg.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'bg', {
6 border: 'Показва рамка на карето',
7 noUrl: 'Моля въведете URL за iFrame',
8 scrolling: 'Вкл. скролбаровете',
9 title: 'IFrame настройки',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/bn.js b/sources/plugins/iframe/lang/bn.js
new file mode 100644
index 00000000..ab2fe567
--- /dev/null
+++ b/sources/plugins/iframe/lang/bn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'bn', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/bs.js b/sources/plugins/iframe/lang/bs.js
new file mode 100644
index 00000000..66453678
--- /dev/null
+++ b/sources/plugins/iframe/lang/bs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'bs', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/ca.js b/sources/plugins/iframe/lang/ca.js
new file mode 100644
index 00000000..4cd956e0
--- /dev/null
+++ b/sources/plugins/iframe/lang/ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ca', {
6 border: 'Mostra la vora del marc',
7 noUrl: 'Si us plau, introdueixi la URL de l\'iframe',
8 scrolling: 'Activa les barres de desplaçament',
9 title: 'Propietats de l\'IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/cs.js b/sources/plugins/iframe/lang/cs.js
new file mode 100644
index 00000000..a1332a06
--- /dev/null
+++ b/sources/plugins/iframe/lang/cs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'cs', {
6 border: 'Zobrazit okraj',
7 noUrl: 'Zadejte prosím URL obsahu pro IFrame',
8 scrolling: 'Zapnout posuvníky',
9 title: 'Vlastnosti IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/cy.js b/sources/plugins/iframe/lang/cy.js
new file mode 100644
index 00000000..40227239
--- /dev/null
+++ b/sources/plugins/iframe/lang/cy.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'cy', {
6 border: 'Dangos ymyl y ffrâm',
7 noUrl: 'Rhowch URL yr iframe',
8 scrolling: 'Galluogi bariau sgrolio',
9 title: 'Priodweddau IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/da.js b/sources/plugins/iframe/lang/da.js
new file mode 100644
index 00000000..8bb5b759
--- /dev/null
+++ b/sources/plugins/iframe/lang/da.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'da', {
6 border: 'Vis kant på rammen',
7 noUrl: 'Venligst indsæt URL på iframen',
8 scrolling: 'Aktiver scrollbars',
9 title: 'Iframe egenskaber',
10 toolbar: 'Iframe'
11} );
diff --git a/sources/plugins/iframe/lang/de.js b/sources/plugins/iframe/lang/de.js
new file mode 100644
index 00000000..beb43321
--- /dev/null
+++ b/sources/plugins/iframe/lang/de.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'de', {
6 border: 'Rahmen anzeigen',
7 noUrl: 'Bitte geben Sie die IFrame-URL an',
8 scrolling: 'Rollbalken anzeigen',
9 title: 'IFrame-Eigenschaften',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/el.js b/sources/plugins/iframe/lang/el.js
new file mode 100644
index 00000000..ece32b07
--- /dev/null
+++ b/sources/plugins/iframe/lang/el.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'el', {
6 border: 'Προβολή περιγράμματος πλαισίου',
7 noUrl: 'Παρακαλούμε εισάγεται το URL του iframe',
8 scrolling: 'Ενεργοποίηση μπαρών κύλισης',
9 title: 'Ιδιότητες IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/en-au.js b/sources/plugins/iframe/lang/en-au.js
new file mode 100644
index 00000000..632ac329
--- /dev/null
+++ b/sources/plugins/iframe/lang/en-au.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'en-au', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/en-ca.js b/sources/plugins/iframe/lang/en-ca.js
new file mode 100644
index 00000000..080a558d
--- /dev/null
+++ b/sources/plugins/iframe/lang/en-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'en-ca', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/en-gb.js b/sources/plugins/iframe/lang/en-gb.js
new file mode 100644
index 00000000..fa17adb3
--- /dev/null
+++ b/sources/plugins/iframe/lang/en-gb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'en-gb', {
6 border: 'Show frame border',
7 noUrl: 'Please type the iframe URL',
8 scrolling: 'Enable scrollbars',
9 title: 'IFrame Properties',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/en.js b/sources/plugins/iframe/lang/en.js
new file mode 100644
index 00000000..f9f5202a
--- /dev/null
+++ b/sources/plugins/iframe/lang/en.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'en', {
6 border: 'Show frame border',
7 noUrl: 'Please type the iframe URL',
8 scrolling: 'Enable scrollbars',
9 title: 'IFrame Properties',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/eo.js b/sources/plugins/iframe/lang/eo.js
new file mode 100644
index 00000000..7d11c38b
--- /dev/null
+++ b/sources/plugins/iframe/lang/eo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'eo', {
6 border: 'Montri borderon de kadro (frame)',
7 noUrl: 'Bonvolu entajpi la retadreson de la ligilo al la enlinia kadro (IFrame)',
8 scrolling: 'Ebligi rulumskalon',
9 title: 'Atributoj de la enlinia kadro (IFrame)',
10 toolbar: 'Enlinia kadro (IFrame)'
11} );
diff --git a/sources/plugins/iframe/lang/es.js b/sources/plugins/iframe/lang/es.js
new file mode 100644
index 00000000..d84830db
--- /dev/null
+++ b/sources/plugins/iframe/lang/es.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'es', {
6 border: 'Mostrar borde del marco',
7 noUrl: 'Por favor, escriba la dirección del iframe',
8 scrolling: 'Activar barras de desplazamiento',
9 title: 'Propiedades de iframe',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/et.js b/sources/plugins/iframe/lang/et.js
new file mode 100644
index 00000000..3a9bae0e
--- /dev/null
+++ b/sources/plugins/iframe/lang/et.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'et', {
6 border: 'Raami äärise näitamine',
7 noUrl: 'Vali iframe URLi liik',
8 scrolling: 'Kerimisribade lubamine',
9 title: 'IFrame omadused',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/eu.js b/sources/plugins/iframe/lang/eu.js
new file mode 100644
index 00000000..b359f385
--- /dev/null
+++ b/sources/plugins/iframe/lang/eu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'eu', {
6 border: 'Erakutsi markoaren ertza',
7 noUrl: 'Idatzi iframe-aren URLa, mesedez.',
8 scrolling: 'Gaitu korritze-barrak',
9 title: 'IFrame-aren propietateak',
10 toolbar: 'IFrame-a'
11} );
diff --git a/sources/plugins/iframe/lang/fa.js b/sources/plugins/iframe/lang/fa.js
new file mode 100644
index 00000000..0d8ec21a
--- /dev/null
+++ b/sources/plugins/iframe/lang/fa.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'fa', {
6 border: 'نمایش خطوط frame',
7 noUrl: 'لطفا مسیر URL iframe را درج کنید',
8 scrolling: 'نمایش خطکشها',
9 title: 'ویژگیهای IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/fi.js b/sources/plugins/iframe/lang/fi.js
new file mode 100644
index 00000000..128a5354
--- /dev/null
+++ b/sources/plugins/iframe/lang/fi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'fi', {
6 border: 'Näytä kehyksen reunat',
7 noUrl: 'Anna IFrame-kehykselle lähdeosoite (src)',
8 scrolling: 'Näytä vierityspalkit',
9 title: 'IFrame-kehyksen ominaisuudet',
10 toolbar: 'IFrame-kehys'
11} );
diff --git a/sources/plugins/iframe/lang/fo.js b/sources/plugins/iframe/lang/fo.js
new file mode 100644
index 00000000..e573e090
--- /dev/null
+++ b/sources/plugins/iframe/lang/fo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'fo', {
6 border: 'Vís frame kant',
7 noUrl: 'Vinarliga skriva URL til iframe',
8 scrolling: 'Loyv scrollbars',
9 title: 'Møguleikar fyri IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/fr-ca.js b/sources/plugins/iframe/lang/fr-ca.js
new file mode 100644
index 00000000..8b99ffaa
--- /dev/null
+++ b/sources/plugins/iframe/lang/fr-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'fr-ca', {
6 border: 'Afficher la bordure du cadre',
7 noUrl: 'Veuillez entre l\'URL du IFrame',
8 scrolling: 'Activer les barres de défilement',
9 title: 'Propriétés du IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/fr.js b/sources/plugins/iframe/lang/fr.js
new file mode 100644
index 00000000..664021cb
--- /dev/null
+++ b/sources/plugins/iframe/lang/fr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'fr', {
6 border: 'Afficher une bordure de la IFrame',
7 noUrl: 'Veuillez entrer l\'adresse du lien de la IFrame',
8 scrolling: 'Permettre à la barre de défilement',
9 title: 'Propriétés de la IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/gl.js b/sources/plugins/iframe/lang/gl.js
new file mode 100644
index 00000000..60561b09
--- /dev/null
+++ b/sources/plugins/iframe/lang/gl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'gl', {
6 border: 'Amosar o bordo do marco',
7 noUrl: 'Escriba o enderezo do iframe',
8 scrolling: 'Activar as barras de desprazamento',
9 title: 'Propiedades do iFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/gu.js b/sources/plugins/iframe/lang/gu.js
new file mode 100644
index 00000000..89c1e732
--- /dev/null
+++ b/sources/plugins/iframe/lang/gu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'gu', {
6 border: 'ફ્રેમ બોર્ડેર બતાવવી',
7 noUrl: 'iframe URL ટાઈપ્ કરો',
8 scrolling: 'સ્ક્રોલબાર ચાલુ કરવા',
9 title: 'IFrame વિકલ્પો',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/he.js b/sources/plugins/iframe/lang/he.js
new file mode 100644
index 00000000..bcdfa507
--- /dev/null
+++ b/sources/plugins/iframe/lang/he.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'he', {
6 border: 'הראה מסגרת לחלון',
7 noUrl: 'יש להכניס כתובת לחלון.',
8 scrolling: 'אפשר פסי גלילה',
9 title: 'מאפייני חלון פנימי (iframe)',
10 toolbar: 'חלון פנימי (iframe)'
11} );
diff --git a/sources/plugins/iframe/lang/hi.js b/sources/plugins/iframe/lang/hi.js
new file mode 100644
index 00000000..9ab0316f
--- /dev/null
+++ b/sources/plugins/iframe/lang/hi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'hi', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/hr.js b/sources/plugins/iframe/lang/hr.js
new file mode 100644
index 00000000..981d8c2c
--- /dev/null
+++ b/sources/plugins/iframe/lang/hr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'hr', {
6 border: 'Prikaži okvir IFrame-a',
7 noUrl: 'Unesite URL iframe-a',
8 scrolling: 'Omogući trake za skrolanje',
9 title: 'IFrame svojstva',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/hu.js b/sources/plugins/iframe/lang/hu.js
new file mode 100644
index 00000000..0fdd1885
--- /dev/null
+++ b/sources/plugins/iframe/lang/hu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'hu', {
6 border: 'Legyen keret',
7 noUrl: 'Kérem írja be a iframe URL-t',
8 scrolling: 'Gördítősáv bekapcsolása',
9 title: 'IFrame Tulajdonságok',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/id.js b/sources/plugins/iframe/lang/id.js
new file mode 100644
index 00000000..47f5862a
--- /dev/null
+++ b/sources/plugins/iframe/lang/id.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'id', {
6 border: 'Tampilkan Batas Bingkai',
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Aktifkan Scrollbar',
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/is.js b/sources/plugins/iframe/lang/is.js
new file mode 100644
index 00000000..5bfda8e5
--- /dev/null
+++ b/sources/plugins/iframe/lang/is.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'is', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/it.js b/sources/plugins/iframe/lang/it.js
new file mode 100644
index 00000000..2fc4d3ad
--- /dev/null
+++ b/sources/plugins/iframe/lang/it.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'it', {
6 border: 'Mostra il bordo',
7 noUrl: 'Inserire l\'URL del campo IFrame',
8 scrolling: 'Abilita scrollbar',
9 title: 'Proprietà IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/ja.js b/sources/plugins/iframe/lang/ja.js
new file mode 100644
index 00000000..6d210ab1
--- /dev/null
+++ b/sources/plugins/iframe/lang/ja.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ja', {
6 border: 'フレームの枠を表示',
7 noUrl: 'iframeのURLを入力してください。',
8 scrolling: 'スクロールバーの表示を許可',
9 title: 'iFrameのプロパティ',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/ka.js b/sources/plugins/iframe/lang/ka.js
new file mode 100644
index 00000000..252da248
--- /dev/null
+++ b/sources/plugins/iframe/lang/ka.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ka', {
6 border: 'ჩარჩოს გამოჩენა',
7 noUrl: 'აკრიფეთ iframe-ის URL',
8 scrolling: 'გადახვევის ზოლების დაშვება',
9 title: 'IFrame-ის პარამეტრები',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/km.js b/sources/plugins/iframe/lang/km.js
new file mode 100644
index 00000000..c4d163ce
--- /dev/null
+++ b/sources/plugins/iframe/lang/km.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'km', {
6 border: 'បង្ហាញ​បន្ទាត់​ស៊ុម',
7 noUrl: 'សូម​បញ្ចូល URL របស់ iframe',
8 scrolling: 'ប្រើ​របារ​រំកិល',
9 title: 'លក្ខណៈ​សម្បត្តិ IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/ko.js b/sources/plugins/iframe/lang/ko.js
new file mode 100644
index 00000000..536b5bd9
--- /dev/null
+++ b/sources/plugins/iframe/lang/ko.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ko', {
6 border: '프레임 테두리 표시',
7 noUrl: '아이프레임 주소(URL)를 입력해주세요.',
8 scrolling: '스크롤바 사용',
9 title: '아이프레임 속성',
10 toolbar: '아이프레임'
11} );
diff --git a/sources/plugins/iframe/lang/ku.js b/sources/plugins/iframe/lang/ku.js
new file mode 100644
index 00000000..dcc6a590
--- /dev/null
+++ b/sources/plugins/iframe/lang/ku.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ku', {
6 border: 'نیشاندانی لاکێشه بە چوواردەوری چووارچێوە',
7 noUrl: 'تکایه ناونیشانی بەستەر بنووسه بۆ چووارچێوه',
8 scrolling: 'چالاککردنی هاتووچۆپێکردن',
9 title: 'دیالۆگی چووارچێوه',
10 toolbar: 'چووارچێوه'
11} );
diff --git a/sources/plugins/iframe/lang/lt.js b/sources/plugins/iframe/lang/lt.js
new file mode 100644
index 00000000..d147709a
--- /dev/null
+++ b/sources/plugins/iframe/lang/lt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'lt', {
6 border: 'Rodyti rėmelį',
7 noUrl: 'Nurodykite iframe nuorodą',
8 scrolling: 'Įjungti slankiklius',
9 title: 'IFrame nustatymai',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/lv.js b/sources/plugins/iframe/lang/lv.js
new file mode 100644
index 00000000..1596ac14
--- /dev/null
+++ b/sources/plugins/iframe/lang/lv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'lv', {
6 border: 'Rādīt rāmi',
7 noUrl: 'Norādiet iframe adresi',
8 scrolling: 'Atļaut ritjoslas',
9 title: 'IFrame uzstādījumi',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/mk.js b/sources/plugins/iframe/lang/mk.js
new file mode 100644
index 00000000..d9436c46
--- /dev/null
+++ b/sources/plugins/iframe/lang/mk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'mk', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/mn.js b/sources/plugins/iframe/lang/mn.js
new file mode 100644
index 00000000..295f15d2
--- /dev/null
+++ b/sources/plugins/iframe/lang/mn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'mn', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/ms.js b/sources/plugins/iframe/lang/ms.js
new file mode 100644
index 00000000..9a05b354
--- /dev/null
+++ b/sources/plugins/iframe/lang/ms.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ms', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/nb.js b/sources/plugins/iframe/lang/nb.js
new file mode 100644
index 00000000..dbf41c8f
--- /dev/null
+++ b/sources/plugins/iframe/lang/nb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'nb', {
6 border: 'Vis ramme rundt iframe',
7 noUrl: 'Vennligst skriv inn URL for iframe',
8 scrolling: 'Aktiver scrollefelt',
9 title: 'Egenskaper for IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/nl.js b/sources/plugins/iframe/lang/nl.js
new file mode 100644
index 00000000..9ea97e07
--- /dev/null
+++ b/sources/plugins/iframe/lang/nl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'nl', {
6 border: 'Framerand tonen',
7 noUrl: 'Vul de IFrame URL in',
8 scrolling: 'Scrollbalken inschakelen',
9 title: 'IFrame-eigenschappen',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/no.js b/sources/plugins/iframe/lang/no.js
new file mode 100644
index 00000000..b49ad735
--- /dev/null
+++ b/sources/plugins/iframe/lang/no.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'no', {
6 border: 'Viss ramme rundt iframe',
7 noUrl: 'Vennligst skriv inn URL for iframe',
8 scrolling: 'Aktiver scrollefelt',
9 title: 'Egenskaper for IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/pl.js b/sources/plugins/iframe/lang/pl.js
new file mode 100644
index 00000000..a68461b7
--- /dev/null
+++ b/sources/plugins/iframe/lang/pl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'pl', {
6 border: 'Pokaż obramowanie obiektu IFrame',
7 noUrl: 'Podaj adres URL elementu IFrame',
8 scrolling: 'Włącz paski przewijania',
9 title: 'Właściwości elementu IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/pt-br.js b/sources/plugins/iframe/lang/pt-br.js
new file mode 100644
index 00000000..13197704
--- /dev/null
+++ b/sources/plugins/iframe/lang/pt-br.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'pt-br', {
6 border: 'Mostra borda do iframe',
7 noUrl: 'Insira a URL do iframe',
8 scrolling: 'Abilita scrollbars',
9 title: 'Propriedade do IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/pt.js b/sources/plugins/iframe/lang/pt.js
new file mode 100644
index 00000000..790894d4
--- /dev/null
+++ b/sources/plugins/iframe/lang/pt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'pt', {
6 border: 'Mostrar a borda da Frame',
7 noUrl: 'Por favor, digite o URL da iframe',
8 scrolling: 'Ativar barras de rolamento',
9 title: 'Propriedades da IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/ro.js b/sources/plugins/iframe/lang/ro.js
new file mode 100644
index 00000000..0fdf471d
--- /dev/null
+++ b/sources/plugins/iframe/lang/ro.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ro', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/ru.js b/sources/plugins/iframe/lang/ru.js
new file mode 100644
index 00000000..b137b9a2
--- /dev/null
+++ b/sources/plugins/iframe/lang/ru.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ru', {
6 border: 'Показать границы фрейма',
7 noUrl: 'Пожалуйста, введите ссылку фрейма',
8 scrolling: 'Отображать полосы прокрутки',
9 title: 'Свойства iFrame',
10 toolbar: 'iFrame'
11} );
diff --git a/sources/plugins/iframe/lang/si.js b/sources/plugins/iframe/lang/si.js
new file mode 100644
index 00000000..fed32683
--- /dev/null
+++ b/sources/plugins/iframe/lang/si.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'si', {
6 border: 'සැකිල්ලේ කඩයිම් ',
7 noUrl: 'කරුණාකර රුපයේ URL ලියන්න',
8 scrolling: 'සක්ක්‍රිය කරන්න',
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/sk.js b/sources/plugins/iframe/lang/sk.js
new file mode 100644
index 00000000..bf42e307
--- /dev/null
+++ b/sources/plugins/iframe/lang/sk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'sk', {
6 border: 'Zobraziť rám frame-u',
7 noUrl: 'Prosím, vložte URL iframe',
8 scrolling: 'Povoliť skrolovanie',
9 title: 'Vlastnosti IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/sl.js b/sources/plugins/iframe/lang/sl.js
new file mode 100644
index 00000000..1831584d
--- /dev/null
+++ b/sources/plugins/iframe/lang/sl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'sl', {
6 border: 'Pokaži mejo okvira',
7 noUrl: 'Prosimo, vnesite iframe URL',
8 scrolling: 'Omogoči scrollbars',
9 title: 'IFrame Lastnosti',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/sq.js b/sources/plugins/iframe/lang/sq.js
new file mode 100644
index 00000000..cf88dbe4
--- /dev/null
+++ b/sources/plugins/iframe/lang/sq.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'sq', {
6 border: 'Shfaq kufirin e kornizës',
7 noUrl: 'Ju lutemi shkruani URL-në e iframe-it',
8 scrolling: 'Lejo shiritët zvarritës',
9 title: 'Karakteristikat e IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/sr-latn.js b/sources/plugins/iframe/lang/sr-latn.js
new file mode 100644
index 00000000..d8ddf222
--- /dev/null
+++ b/sources/plugins/iframe/lang/sr-latn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'sr-latn', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/sr.js b/sources/plugins/iframe/lang/sr.js
new file mode 100644
index 00000000..8a66fba9
--- /dev/null
+++ b/sources/plugins/iframe/lang/sr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'sr', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame' // MISSING
11} );
diff --git a/sources/plugins/iframe/lang/sv.js b/sources/plugins/iframe/lang/sv.js
new file mode 100644
index 00000000..8777eb5a
--- /dev/null
+++ b/sources/plugins/iframe/lang/sv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'sv', {
6 border: 'Visa ramkant',
7 noUrl: 'Skriv in URL för iFrame',
8 scrolling: 'Aktivera rullningslister',
9 title: 'iFrame Egenskaper',
10 toolbar: 'iFrame'
11} );
diff --git a/sources/plugins/iframe/lang/th.js b/sources/plugins/iframe/lang/th.js
new file mode 100644
index 00000000..635d834e
--- /dev/null
+++ b/sources/plugins/iframe/lang/th.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'th', {
6 border: 'Show frame border', // MISSING
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame Properties', // MISSING
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/tr.js b/sources/plugins/iframe/lang/tr.js
new file mode 100644
index 00000000..e6ad11dd
--- /dev/null
+++ b/sources/plugins/iframe/lang/tr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'tr', {
6 border: 'Çerceve sınırlarını göster',
7 noUrl: 'Lütfen IFrame köprü (URL) bağlantısını yazın',
8 scrolling: 'Kaydırma çubuklarını aktif et',
9 title: 'IFrame Özellikleri',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/tt.js b/sources/plugins/iframe/lang/tt.js
new file mode 100644
index 00000000..05970380
--- /dev/null
+++ b/sources/plugins/iframe/lang/tt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'tt', {
6 border: 'Frame чикләрен күрсәтү',
7 noUrl: 'Please type the iframe URL', // MISSING
8 scrolling: 'Enable scrollbars', // MISSING
9 title: 'IFrame үзлекләре',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/ug.js b/sources/plugins/iframe/lang/ug.js
new file mode 100644
index 00000000..80ea2d00
--- /dev/null
+++ b/sources/plugins/iframe/lang/ug.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'ug', {
6 border: 'كاندۇك گىرۋەكلىرىنى كۆرسەت',
7 noUrl: 'كاندۇكنىڭ ئادرېسى(Url)نى كىرگۈزۈڭ',
8 scrolling: 'دومىلىما سۈرگۈچكە يول قوي',
9 title: 'IFrame خاسلىق',
10 toolbar: 'IFrame '
11} );
diff --git a/sources/plugins/iframe/lang/uk.js b/sources/plugins/iframe/lang/uk.js
new file mode 100644
index 00000000..c5d1e996
--- /dev/null
+++ b/sources/plugins/iframe/lang/uk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'uk', {
6 border: 'Показати рамки фрейму',
7 noUrl: 'Будь ласка введіть URL посилання для IFrame',
8 scrolling: 'Увімкнути прокрутку',
9 title: 'Налаштування для IFrame',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/vi.js b/sources/plugins/iframe/lang/vi.js
new file mode 100644
index 00000000..56b3c521
--- /dev/null
+++ b/sources/plugins/iframe/lang/vi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'vi', {
6 border: 'Hiển thị viền khung',
7 noUrl: 'Vui lòng nhập địa chỉ iframe',
8 scrolling: 'Kích hoạt thanh cuộn',
9 title: 'Thuộc tính iframe',
10 toolbar: 'Iframe'
11} );
diff --git a/sources/plugins/iframe/lang/zh-cn.js b/sources/plugins/iframe/lang/zh-cn.js
new file mode 100644
index 00000000..7ddca048
--- /dev/null
+++ b/sources/plugins/iframe/lang/zh-cn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'zh-cn', {
6 border: '显示框架边框',
7 noUrl: '请输入框架的 URL',
8 scrolling: '允许滚动条',
9 title: 'IFrame 属性',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/lang/zh.js b/sources/plugins/iframe/lang/zh.js
new file mode 100644
index 00000000..51cead96
--- /dev/null
+++ b/sources/plugins/iframe/lang/zh.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'iframe', 'zh', {
6 border: '顯示框架框線',
7 noUrl: '請輸入 iframe URL',
8 scrolling: '啟用捲軸列',
9 title: 'IFrame 屬性',
10 toolbar: 'IFrame'
11} );
diff --git a/sources/plugins/iframe/plugin.js b/sources/plugins/iframe/plugin.js
new file mode 100644
index 00000000..3c32376e
--- /dev/null
+++ b/sources/plugins/iframe/plugin.js
@@ -0,0 +1,85 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 CKEDITOR.plugins.add( 'iframe', {
8 requires: 'dialog,fakeobjects',
9 // jscs:disable maximumLineLength
10 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
11 // jscs:enable maximumLineLength
12 icons: 'iframe', // %REMOVE_LINE_CORE%
13 hidpi: true, // %REMOVE_LINE_CORE%
14 onLoad: function() {
15 CKEDITOR.addCss( 'img.cke_iframe' +
16 '{' +
17 'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.png' ) + ');' +
18 'background-position: center center;' +
19 'background-repeat: no-repeat;' +
20 'border: 1px solid #a9a9a9;' +
21 'width: 80px;' +
22 'height: 80px;' +
23 '}'
24 );
25 },
26 init: function( editor ) {
27 var pluginName = 'iframe',
28 lang = editor.lang.iframe,
29 allowed = 'iframe[align,longdesc,frameborder,height,name,scrolling,src,title,width]';
30
31 if ( editor.plugins.dialogadvtab )
32 allowed += ';iframe' + editor.plugins.dialogadvtab.allowedContent( { id: 1, classes: 1, styles: 1 } );
33
34 CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/iframe.js' );
35 editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName, {
36 allowedContent: allowed,
37 requiredContent: 'iframe'
38 } ) );
39
40 editor.ui.addButton && editor.ui.addButton( 'Iframe', {
41 label: lang.toolbar,
42 command: pluginName,
43 toolbar: 'insert,80'
44 } );
45
46 editor.on( 'doubleclick', function( evt ) {
47 var element = evt.data.element;
48 if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'iframe' )
49 evt.data.dialog = 'iframe';
50 } );
51
52 if ( editor.addMenuItems ) {
53 editor.addMenuItems( {
54 iframe: {
55 label: lang.title,
56 command: 'iframe',
57 group: 'image'
58 }
59 } );
60 }
61
62 // If the "contextmenu" plugin is loaded, register the listeners.
63 if ( editor.contextMenu ) {
64 editor.contextMenu.addListener( function( element ) {
65 if ( element && element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'iframe' )
66 return { iframe: CKEDITOR.TRISTATE_OFF };
67 } );
68 }
69 },
70 afterInit: function( editor ) {
71 var dataProcessor = editor.dataProcessor,
72 dataFilter = dataProcessor && dataProcessor.dataFilter;
73
74 if ( dataFilter ) {
75 dataFilter.addRules( {
76 elements: {
77 iframe: function( element ) {
78 return editor.createFakeParserElement( element, 'cke_iframe', 'iframe', true );
79 }
80 }
81 } );
82 }
83 }
84 } );
85} )();
diff --git a/sources/plugins/image/dialogs/image.js b/sources/plugins/image/dialogs/image.js
new file mode 100644
index 00000000..7daf4aa3
--- /dev/null
+++ b/sources/plugins/image/dialogs/image.js
@@ -0,0 +1,1251 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var imageDialog = function( editor, dialogType ) {
8 // Load image preview.
9 var IMAGE = 1,
10 LINK = 2,
11 PREVIEW = 4,
12 CLEANUP = 8,
13 regexGetSize = /^\s*(\d+)((px)|\%)?\s*$/i,
14 regexGetSizeOrEmpty = /(^\s*(\d+)((px)|\%)?\s*$)|^$/i,
15 pxLengthRegex = /^\d+px$/;
16
17 var onSizeChange = function() {
18 var value = this.getValue(),
19 // This = input element.
20 dialog = this.getDialog(),
21 aMatch = value.match( regexGetSize ); // Check value
22 if ( aMatch ) {
23 if ( aMatch[ 2 ] == '%' ) // % is allowed - > unlock ratio.
24 switchLockRatio( dialog, false ); // Unlock.
25 value = aMatch[ 1 ];
26 }
27
28 // Only if ratio is locked
29 if ( dialog.lockRatio ) {
30 var oImageOriginal = dialog.originalElement;
31 if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' ) {
32 if ( this.id == 'txtHeight' ) {
33 if ( value && value != '0' )
34 value = Math.round( oImageOriginal.$.width * ( value / oImageOriginal.$.height ) );
35 if ( !isNaN( value ) )
36 dialog.setValueOf( 'info', 'txtWidth', value );
37 }
38 // this.id = txtWidth.
39 else {
40 if ( value && value != '0' )
41 value = Math.round( oImageOriginal.$.height * ( value / oImageOriginal.$.width ) );
42 if ( !isNaN( value ) )
43 dialog.setValueOf( 'info', 'txtHeight', value );
44 }
45 }
46 }
47 updatePreview( dialog );
48 };
49
50 var updatePreview = function( dialog ) {
51 //Don't load before onShow.
52 if ( !dialog.originalElement || !dialog.preview )
53 return 1;
54
55 // Read attributes and update imagePreview;
56 dialog.commitContent( PREVIEW, dialog.preview );
57 return 0;
58 };
59
60 // Custom commit dialog logic, where we're intended to give inline style
61 // field (txtdlgGenStyle) higher priority to avoid overwriting styles contribute
62 // by other fields.
63 function commitContent() {
64 var args = arguments;
65 var inlineStyleField = this.getContentElement( 'advanced', 'txtdlgGenStyle' );
66 inlineStyleField && inlineStyleField.commit.apply( inlineStyleField, args );
67
68 this.foreach( function( widget ) {
69 if ( widget.commit && widget.id != 'txtdlgGenStyle' )
70 widget.commit.apply( widget, args );
71 } );
72 }
73
74 // Avoid recursions.
75 var incommit;
76
77 // Synchronous field values to other impacted fields is required, e.g. border
78 // size change should alter inline-style text as well.
79 function commitInternally( targetFields ) {
80 if ( incommit )
81 return;
82
83 incommit = 1;
84
85 var dialog = this.getDialog(),
86 element = dialog.imageElement;
87 if ( element ) {
88 // Commit this field and broadcast to target fields.
89 this.commit( IMAGE, element );
90
91 targetFields = [].concat( targetFields );
92 var length = targetFields.length,
93 field;
94 for ( var i = 0; i < length; i++ ) {
95 field = dialog.getContentElement.apply( dialog, targetFields[ i ].split( ':' ) );
96 // May cause recursion.
97 field && field.setup( IMAGE, element );
98 }
99 }
100
101 incommit = 0;
102 }
103
104 var switchLockRatio = function( dialog, value ) {
105 if ( !dialog.getContentElement( 'info', 'ratioLock' ) )
106 return null;
107
108 var oImageOriginal = dialog.originalElement;
109
110 // Dialog may already closed. (#5505)
111 if ( !oImageOriginal )
112 return null;
113
114 // Check image ratio and original image ratio, but respecting user's preference.
115 if ( value == 'check' ) {
116 if ( !dialog.userlockRatio && oImageOriginal.getCustomData( 'isReady' ) == 'true' ) {
117 var width = dialog.getValueOf( 'info', 'txtWidth' ),
118 height = dialog.getValueOf( 'info', 'txtHeight' ),
119 originalRatio = oImageOriginal.$.width * 1000 / oImageOriginal.$.height,
120 thisRatio = width * 1000 / height;
121 dialog.lockRatio = false; // Default: unlock ratio
122
123 if ( !width && !height )
124 dialog.lockRatio = true;
125 else if ( !isNaN( originalRatio ) && !isNaN( thisRatio ) ) {
126 if ( Math.round( originalRatio ) == Math.round( thisRatio ) )
127 dialog.lockRatio = true;
128 }
129 }
130 } else if ( value !== undefined )
131 dialog.lockRatio = value;
132 else {
133 dialog.userlockRatio = 1;
134 dialog.lockRatio = !dialog.lockRatio;
135 }
136
137 var ratioButton = CKEDITOR.document.getById( btnLockSizesId );
138 if ( dialog.lockRatio )
139 ratioButton.removeClass( 'cke_btn_unlocked' );
140 else
141 ratioButton.addClass( 'cke_btn_unlocked' );
142
143 ratioButton.setAttribute( 'aria-checked', dialog.lockRatio );
144
145 // Ratio button hc presentation - WHITE SQUARE / BLACK SQUARE
146 if ( CKEDITOR.env.hc ) {
147 var icon = ratioButton.getChild( 0 );
148 icon.setHtml( dialog.lockRatio ? CKEDITOR.env.ie ? '\u25A0' : '\u25A3' : CKEDITOR.env.ie ? '\u25A1' : '\u25A2' );
149 }
150
151 return dialog.lockRatio;
152 };
153
154 var resetSize = function( dialog, emptyValues ) {
155 var oImageOriginal = dialog.originalElement,
156 ready = oImageOriginal.getCustomData( 'isReady' ) == 'true';
157
158 if ( ready ) {
159 var widthField = dialog.getContentElement( 'info', 'txtWidth' ),
160 heightField = dialog.getContentElement( 'info', 'txtHeight' ),
161 widthValue, heightValue;
162
163 if ( emptyValues ) {
164 widthValue = 0;
165 heightValue = 0;
166 } else {
167 widthValue = oImageOriginal.$.width;
168 heightValue = oImageOriginal.$.height;
169 }
170
171 widthField && widthField.setValue( widthValue );
172 heightField && heightField.setValue( heightValue );
173 }
174 updatePreview( dialog );
175 };
176
177 var setupDimension = function( type, element ) {
178 if ( type != IMAGE )
179 return;
180
181 function checkDimension( size, defaultValue ) {
182 var aMatch = size.match( regexGetSize );
183 if ( aMatch ) {
184 // % is allowed.
185 if ( aMatch[ 2 ] == '%' ) {
186 aMatch[ 1 ] += '%';
187 switchLockRatio( dialog, false ); // Unlock ratio
188 }
189 return aMatch[ 1 ];
190 }
191 return defaultValue;
192 }
193
194 var dialog = this.getDialog(),
195 value = '',
196 dimension = this.id == 'txtWidth' ? 'width' : 'height',
197 size = element.getAttribute( dimension );
198
199 if ( size )
200 value = checkDimension( size, value );
201 value = checkDimension( element.getStyle( dimension ), value );
202
203 this.setValue( value );
204 };
205
206 var previewPreloader;
207
208 var onImgLoadEvent = function() {
209 // Image is ready.
210 var original = this.originalElement,
211 loader = CKEDITOR.document.getById( imagePreviewLoaderId );
212
213 original.setCustomData( 'isReady', 'true' );
214 original.removeListener( 'load', onImgLoadEvent );
215 original.removeListener( 'error', onImgLoadErrorEvent );
216 original.removeListener( 'abort', onImgLoadErrorEvent );
217
218 // Hide loader.
219 if ( loader )
220 loader.setStyle( 'display', 'none' );
221
222 // New image -> new dimensions
223 if ( !this.dontResetSize ) {
224 resetSize( this, editor.config.image_prefillDimensions === false );
225 }
226
227 if ( this.firstLoad ) {
228 CKEDITOR.tools.setTimeout( function() {
229 switchLockRatio( this, 'check' );
230 }, 0, this );
231 }
232
233 this.firstLoad = false;
234 this.dontResetSize = false;
235
236 // Possible fix for #12818.
237 updatePreview( this );
238 };
239
240 var onImgLoadErrorEvent = function() {
241 // Error. Image is not loaded.
242 var original = this.originalElement,
243 loader = CKEDITOR.document.getById( imagePreviewLoaderId );
244
245 original.removeListener( 'load', onImgLoadEvent );
246 original.removeListener( 'error', onImgLoadErrorEvent );
247 original.removeListener( 'abort', onImgLoadErrorEvent );
248
249 // Set Error image.
250 var noimage = CKEDITOR.getUrl( CKEDITOR.plugins.get( 'image' ).path + 'images/noimage.png' );
251
252 if ( this.preview )
253 this.preview.setAttribute( 'src', noimage );
254
255 // Hide loader.
256 if ( loader )
257 loader.setStyle( 'display', 'none' );
258
259 switchLockRatio( this, false ); // Unlock.
260 };
261
262 var numbering = function( id ) {
263 return CKEDITOR.tools.getNextId() + '_' + id;
264 },
265 btnLockSizesId = numbering( 'btnLockSizes' ),
266 btnResetSizeId = numbering( 'btnResetSize' ),
267 imagePreviewLoaderId = numbering( 'ImagePreviewLoader' ),
268 previewLinkId = numbering( 'previewLink' ),
269 previewImageId = numbering( 'previewImage' );
270
271 return {
272 title: editor.lang.image[ dialogType == 'image' ? 'title' : 'titleButton' ],
273 minWidth: 420,
274 minHeight: 360,
275 onShow: function() {
276 this.imageElement = false;
277 this.linkElement = false;
278
279 // Default: create a new element.
280 this.imageEditMode = false;
281 this.linkEditMode = false;
282
283 this.lockRatio = true;
284 this.userlockRatio = 0;
285 this.dontResetSize = false;
286 this.firstLoad = true;
287 this.addLink = false;
288
289 var editor = this.getParentEditor(),
290 sel = editor.getSelection(),
291 element = sel && sel.getSelectedElement(),
292 link = element && editor.elementPath( element ).contains( 'a', 1 ),
293 loader = CKEDITOR.document.getById( imagePreviewLoaderId );
294
295 // Hide loader.
296 if ( loader )
297 loader.setStyle( 'display', 'none' );
298
299 // Create the preview before setup the dialog contents.
300 previewPreloader = new CKEDITOR.dom.element( 'img', editor.document );
301 this.preview = CKEDITOR.document.getById( previewImageId );
302
303 // Copy of the image
304 this.originalElement = editor.document.createElement( 'img' );
305 this.originalElement.setAttribute( 'alt', '' );
306 this.originalElement.setCustomData( 'isReady', 'false' );
307
308 if ( link ) {
309 this.linkElement = link;
310 this.linkEditMode = true;
311
312 // If there is an existing link, by default keep it (true).
313 // It will be removed if certain conditions are met and Link tab is enabled. (#13351)
314 this.addLink = true;
315
316 // Look for Image element.
317 var linkChildren = link.getChildren();
318 if ( linkChildren.count() == 1 ) {
319 var childTag = linkChildren.getItem( 0 );
320
321 if ( childTag.type == CKEDITOR.NODE_ELEMENT ) {
322 if ( childTag.is( 'img' ) || childTag.is( 'input' ) ) {
323 this.imageElement = linkChildren.getItem( 0 );
324 if ( this.imageElement.is( 'img' ) )
325 this.imageEditMode = 'img';
326 else if ( this.imageElement.is( 'input' ) )
327 this.imageEditMode = 'input';
328 }
329 }
330 }
331 // Fill out all fields.
332 if ( dialogType == 'image' )
333 this.setupContent( LINK, link );
334 }
335
336 // Edit given image element instead the one from selection.
337 if ( this.customImageElement ) {
338 this.imageEditMode = 'img';
339 this.imageElement = this.customImageElement;
340 delete this.customImageElement;
341 }
342 else if ( element && element.getName() == 'img' && !element.data( 'cke-realelement' ) ||
343 element && element.getName() == 'input' && element.getAttribute( 'type' ) == 'image' ) {
344 this.imageEditMode = element.getName();
345 this.imageElement = element;
346 }
347
348 if ( this.imageEditMode ) {
349 // Use the original element as a buffer from since we don't want
350 // temporary changes to be committed, e.g. if the dialog is canceled.
351 this.cleanImageElement = this.imageElement;
352 this.imageElement = this.cleanImageElement.clone( true, true );
353
354 // Fill out all fields.
355 this.setupContent( IMAGE, this.imageElement );
356 }
357
358 // Refresh LockRatio button
359 switchLockRatio( this, true );
360
361 // Dont show preview if no URL given.
362 if ( !CKEDITOR.tools.trim( this.getValueOf( 'info', 'txtUrl' ) ) ) {
363 this.preview.removeAttribute( 'src' );
364 this.preview.setStyle( 'display', 'none' );
365 }
366 },
367 onOk: function() {
368 // Edit existing Image.
369 if ( this.imageEditMode ) {
370 var imgTagName = this.imageEditMode;
371
372 // Image dialog and Input element.
373 if ( dialogType == 'image' && imgTagName == 'input' && confirm( editor.lang.image.button2Img ) ) { // jshint ignore:line
374 // Replace INPUT-> IMG
375 imgTagName = 'img';
376 this.imageElement = editor.document.createElement( 'img' );
377 this.imageElement.setAttribute( 'alt', '' );
378 editor.insertElement( this.imageElement );
379 }
380 // ImageButton dialog and Image element.
381 else if ( dialogType != 'image' && imgTagName == 'img' && confirm( editor.lang.image.img2Button ) ) { // jshint ignore:line
382 // Replace IMG -> INPUT
383 imgTagName = 'input';
384 this.imageElement = editor.document.createElement( 'input' );
385 this.imageElement.setAttributes( {
386 type: 'image',
387 alt: ''
388 } );
389 editor.insertElement( this.imageElement );
390 } else {
391 // Restore the original element before all commits.
392 this.imageElement = this.cleanImageElement;
393 delete this.cleanImageElement;
394 }
395 }
396 // Create a new image.
397 else {
398 // Image dialog -> create IMG element.
399 if ( dialogType == 'image' )
400 this.imageElement = editor.document.createElement( 'img' );
401 else {
402 this.imageElement = editor.document.createElement( 'input' );
403 this.imageElement.setAttribute( 'type', 'image' );
404 }
405 this.imageElement.setAttribute( 'alt', '' );
406 }
407
408 // Create a new link.
409 if ( !this.linkEditMode )
410 this.linkElement = editor.document.createElement( 'a' );
411
412 // Set attributes.
413 this.commitContent( IMAGE, this.imageElement );
414 this.commitContent( LINK, this.linkElement );
415
416 // Remove empty style attribute.
417 if ( !this.imageElement.getAttribute( 'style' ) )
418 this.imageElement.removeAttribute( 'style' );
419
420 // Insert a new Image.
421 if ( !this.imageEditMode ) {
422 if ( this.addLink ) {
423 if ( !this.linkEditMode ) {
424 // Insert a new link.
425 editor.insertElement( this.linkElement );
426 this.linkElement.append( this.imageElement, false );
427 } else {
428 // We already have a link in editor.
429 if ( this.linkElement.equals( editor.getSelection().getSelectedElement() ) ) {
430 // If the link is selected outside, replace it's content rather than the link itself. ([<a>foo</a>])
431 this.linkElement.setHtml( '' );
432 this.linkElement.append( this.imageElement, false );
433 } else {
434 // Only inside of the link is selected, so replace it with image. (<a>[foo]</a>, <a>[f]oo</a>)
435 editor.insertElement( this.imageElement );
436 }
437 }
438 } else {
439 editor.insertElement( this.imageElement );
440 }
441 }
442 // Image already exists.
443 else {
444 // Add a new link element.
445 if ( !this.linkEditMode && this.addLink ) {
446 editor.insertElement( this.linkElement );
447 this.imageElement.appendTo( this.linkElement );
448 }
449 // Remove Link, Image exists.
450 else if ( this.linkEditMode && !this.addLink ) {
451 editor.getSelection().selectElement( this.linkElement );
452 editor.insertElement( this.imageElement );
453 }
454 }
455 },
456 onLoad: function() {
457 if ( dialogType != 'image' )
458 this.hidePage( 'Link' ); //Hide Link tab.
459 var doc = this._.element.getDocument();
460
461 if ( this.getContentElement( 'info', 'ratioLock' ) ) {
462 this.addFocusable( doc.getById( btnResetSizeId ), 5 );
463 this.addFocusable( doc.getById( btnLockSizesId ), 5 );
464 }
465
466 this.commitContent = commitContent;
467 },
468 onHide: function() {
469 if ( this.preview )
470 this.commitContent( CLEANUP, this.preview );
471
472 if ( this.originalElement ) {
473 this.originalElement.removeListener( 'load', onImgLoadEvent );
474 this.originalElement.removeListener( 'error', onImgLoadErrorEvent );
475 this.originalElement.removeListener( 'abort', onImgLoadErrorEvent );
476 this.originalElement.remove();
477 this.originalElement = false; // Dialog is closed.
478 }
479
480 delete this.imageElement;
481 },
482 contents: [ {
483 id: 'info',
484 label: editor.lang.image.infoTab,
485 accessKey: 'I',
486 elements: [ {
487 type: 'vbox',
488 padding: 0,
489 children: [ {
490 type: 'hbox',
491 widths: [ '280px', '110px' ],
492 align: 'right',
493 children: [ {
494 id: 'txtUrl',
495 type: 'text',
496 label: editor.lang.common.url,
497 required: true,
498 onChange: function() {
499 var dialog = this.getDialog(),
500 newUrl = this.getValue();
501
502 // Update original image.
503 // Prevent from load before onShow.
504 if ( newUrl.length > 0 ) {
505 dialog = this.getDialog();
506 var original = dialog.originalElement;
507
508 if ( dialog.preview ) {
509 dialog.preview.removeStyle( 'display' );
510 }
511
512 original.setCustomData( 'isReady', 'false' );
513 // Show loader.
514 var loader = CKEDITOR.document.getById( imagePreviewLoaderId );
515 if ( loader )
516 loader.setStyle( 'display', '' );
517
518 original.on( 'load', onImgLoadEvent, dialog );
519 original.on( 'error', onImgLoadErrorEvent, dialog );
520 original.on( 'abort', onImgLoadErrorEvent, dialog );
521 original.setAttribute( 'src', newUrl );
522
523 if ( dialog.preview ) {
524 // Query the preloader to figure out the url impacted by based href.
525 previewPreloader.setAttribute( 'src', newUrl );
526 dialog.preview.setAttribute( 'src', previewPreloader.$.src );
527 updatePreview( dialog );
528 }
529 }
530 // Dont show preview if no URL given.
531 else if ( dialog.preview ) {
532 dialog.preview.removeAttribute( 'src' );
533 dialog.preview.setStyle( 'display', 'none' );
534 }
535 },
536 setup: function( type, element ) {
537 if ( type == IMAGE ) {
538 var url = element.data( 'cke-saved-src' ) || element.getAttribute( 'src' );
539 var field = this;
540
541 this.getDialog().dontResetSize = true;
542
543 field.setValue( url ); // And call this.onChange()
544 // Manually set the initial value.(#4191)
545 field.setInitValue();
546 }
547 },
548 commit: function( type, element ) {
549 if ( type == IMAGE && ( this.getValue() || this.isChanged() ) ) {
550 element.data( 'cke-saved-src', this.getValue() );
551 element.setAttribute( 'src', this.getValue() );
552 } else if ( type == CLEANUP ) {
553 element.setAttribute( 'src', '' ); // If removeAttribute doesn't work.
554 element.removeAttribute( 'src' );
555 }
556 },
557 validate: CKEDITOR.dialog.validate.notEmpty( editor.lang.image.urlMissing )
558 },
559 {
560 type: 'button',
561 id: 'browse',
562 // v-align with the 'txtUrl' field.
563 // TODO: We need something better than a fixed size here.
564 style: 'display:inline-block;margin-top:14px;',
565 align: 'center',
566 label: editor.lang.common.browseServer,
567 hidden: true,
568 filebrowser: 'info:txtUrl'
569 } ]
570 } ]
571 },
572 {
573 id: 'txtAlt',
574 type: 'text',
575 label: editor.lang.image.alt,
576 accessKey: 'T',
577 'default': '',
578 onChange: function() {
579 updatePreview( this.getDialog() );
580 },
581 setup: function( type, element ) {
582 if ( type == IMAGE )
583 this.setValue( element.getAttribute( 'alt' ) );
584 },
585 commit: function( type, element ) {
586 if ( type == IMAGE ) {
587 if ( this.getValue() || this.isChanged() )
588 element.setAttribute( 'alt', this.getValue() );
589 } else if ( type == PREVIEW )
590 element.setAttribute( 'alt', this.getValue() );
591 else if ( type == CLEANUP ) {
592 element.removeAttribute( 'alt' );
593 }
594
595 }
596 },
597 {
598 type: 'hbox',
599 children: [ {
600 id: 'basic',
601 type: 'vbox',
602 children: [ {
603 type: 'hbox',
604 requiredContent: 'img{width,height}',
605 widths: [ '50%', '50%' ],
606 children: [ {
607 type: 'vbox',
608 padding: 1,
609 children: [ {
610 type: 'text',
611 width: '45px',
612 id: 'txtWidth',
613 label: editor.lang.common.width,
614 onKeyUp: onSizeChange,
615 onChange: function() {
616 commitInternally.call( this, 'advanced:txtdlgGenStyle' );
617 },
618 validate: function() {
619 var aMatch = this.getValue().match( regexGetSizeOrEmpty ),
620 isValid = !!( aMatch && parseInt( aMatch[ 1 ], 10 ) !== 0 );
621 if ( !isValid )
622 alert( editor.lang.common.invalidWidth ); // jshint ignore:line
623 return isValid;
624 },
625 setup: setupDimension,
626 commit: function( type, element ) {
627 var value = this.getValue();
628 if ( type == IMAGE ) {
629 if ( value && editor.activeFilter.check( 'img{width,height}' ) )
630 element.setStyle( 'width', CKEDITOR.tools.cssLength( value ) );
631 else
632 element.removeStyle( 'width' );
633
634 element.removeAttribute( 'width' );
635 } else if ( type == PREVIEW ) {
636 var aMatch = value.match( regexGetSize );
637 if ( !aMatch ) {
638 var oImageOriginal = this.getDialog().originalElement;
639 if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
640 element.setStyle( 'width', oImageOriginal.$.width + 'px' );
641 } else {
642 element.setStyle( 'width', CKEDITOR.tools.cssLength( value ) );
643 }
644 } else if ( type == CLEANUP ) {
645 element.removeAttribute( 'width' );
646 element.removeStyle( 'width' );
647 }
648 }
649 },
650 {
651 type: 'text',
652 id: 'txtHeight',
653 width: '45px',
654 label: editor.lang.common.height,
655 onKeyUp: onSizeChange,
656 onChange: function() {
657 commitInternally.call( this, 'advanced:txtdlgGenStyle' );
658 },
659 validate: function() {
660 var aMatch = this.getValue().match( regexGetSizeOrEmpty ),
661 isValid = !!( aMatch && parseInt( aMatch[ 1 ], 10 ) !== 0 );
662 if ( !isValid )
663 alert( editor.lang.common.invalidHeight ); // jshint ignore:line
664 return isValid;
665 },
666 setup: setupDimension,
667 commit: function( type, element ) {
668 var value = this.getValue();
669 if ( type == IMAGE ) {
670 if ( value && editor.activeFilter.check( 'img{width,height}' ) )
671 element.setStyle( 'height', CKEDITOR.tools.cssLength( value ) );
672 else
673 element.removeStyle( 'height' );
674
675 element.removeAttribute( 'height' );
676 } else if ( type == PREVIEW ) {
677 var aMatch = value.match( regexGetSize );
678 if ( !aMatch ) {
679 var oImageOriginal = this.getDialog().originalElement;
680 if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
681 element.setStyle( 'height', oImageOriginal.$.height + 'px' );
682 } else {
683 element.setStyle( 'height', CKEDITOR.tools.cssLength( value ) );
684 }
685 } else if ( type == CLEANUP ) {
686 element.removeAttribute( 'height' );
687 element.removeStyle( 'height' );
688 }
689 }
690 } ]
691 },
692 {
693 id: 'ratioLock',
694 type: 'html',
695 style: 'margin-top:30px;width:40px;height:40px;',
696 onLoad: function() {
697 // Activate Reset button
698 var resetButton = CKEDITOR.document.getById( btnResetSizeId ),
699 ratioButton = CKEDITOR.document.getById( btnLockSizesId );
700 if ( resetButton ) {
701 resetButton.on( 'click', function( evt ) {
702 resetSize( this );
703 evt.data && evt.data.preventDefault();
704 }, this.getDialog() );
705 resetButton.on( 'mouseover', function() {
706 this.addClass( 'cke_btn_over' );
707 }, resetButton );
708 resetButton.on( 'mouseout', function() {
709 this.removeClass( 'cke_btn_over' );
710 }, resetButton );
711 }
712 // Activate (Un)LockRatio button
713 if ( ratioButton ) {
714 ratioButton.on( 'click', function( evt ) {
715 switchLockRatio( this );
716
717 var oImageOriginal = this.originalElement,
718 width = this.getValueOf( 'info', 'txtWidth' );
719
720 if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' && width ) {
721 var height = oImageOriginal.$.height / oImageOriginal.$.width * width;
722 if ( !isNaN( height ) ) {
723 this.setValueOf( 'info', 'txtHeight', Math.round( height ) );
724 updatePreview( this );
725 }
726 }
727 evt.data && evt.data.preventDefault();
728 }, this.getDialog() );
729 ratioButton.on( 'mouseover', function() {
730 this.addClass( 'cke_btn_over' );
731 }, ratioButton );
732 ratioButton.on( 'mouseout', function() {
733 this.removeClass( 'cke_btn_over' );
734 }, ratioButton );
735 }
736 },
737 html: '<div>' +
738 '<a href="javascript:void(0)" tabindex="-1" title="' + editor.lang.image.lockRatio +
739 '" class="cke_btn_locked" id="' + btnLockSizesId + '" role="checkbox"><span class="cke_icon"></span><span class="cke_label">' + editor.lang.image.lockRatio + '</span></a>' +
740 '<a href="javascript:void(0)" tabindex="-1" title="' + editor.lang.image.resetSize +
741 '" class="cke_btn_reset" id="' + btnResetSizeId + '" role="button"><span class="cke_label">' + editor.lang.image.resetSize + '</span></a>' +
742 '</div>'
743 } ]
744 },
745 {
746 type: 'vbox',
747 padding: 1,
748 children: [ {
749 type: 'text',
750 id: 'txtBorder',
751 requiredContent: 'img{border-width}',
752 width: '60px',
753 label: editor.lang.image.border,
754 'default': '',
755 onKeyUp: function() {
756 updatePreview( this.getDialog() );
757 },
758 onChange: function() {
759 commitInternally.call( this, 'advanced:txtdlgGenStyle' );
760 },
761 validate: CKEDITOR.dialog.validate.integer( editor.lang.image.validateBorder ),
762 setup: function( type, element ) {
763 if ( type == IMAGE ) {
764 var value,
765 borderStyle = element.getStyle( 'border-width' );
766 borderStyle = borderStyle && borderStyle.match( /^(\d+px)(?: \1 \1 \1)?$/ );
767 value = borderStyle && parseInt( borderStyle[ 1 ], 10 );
768 isNaN( parseInt( value, 10 ) ) && ( value = element.getAttribute( 'border' ) );
769 this.setValue( value );
770 }
771 },
772 commit: function( type, element ) {
773 var value = parseInt( this.getValue(), 10 );
774 if ( type == IMAGE || type == PREVIEW ) {
775 if ( !isNaN( value ) ) {
776 element.setStyle( 'border-width', CKEDITOR.tools.cssLength( value ) );
777 element.setStyle( 'border-style', 'solid' );
778 } else if ( !value && this.isChanged() ) {
779 element.removeStyle( 'border' );
780 }
781
782 if ( type == IMAGE )
783 element.removeAttribute( 'border' );
784 } else if ( type == CLEANUP ) {
785 element.removeAttribute( 'border' );
786 element.removeStyle( 'border-width' );
787 element.removeStyle( 'border-style' );
788 element.removeStyle( 'border-color' );
789 }
790 }
791 },
792 {
793 type: 'text',
794 id: 'txtHSpace',
795 requiredContent: 'img{margin-left,margin-right}',
796 width: '60px',
797 label: editor.lang.image.hSpace,
798 'default': '',
799 onKeyUp: function() {
800 updatePreview( this.getDialog() );
801 },
802 onChange: function() {
803 commitInternally.call( this, 'advanced:txtdlgGenStyle' );
804 },
805 validate: CKEDITOR.dialog.validate.integer( editor.lang.image.validateHSpace ),
806 setup: function( type, element ) {
807 if ( type == IMAGE ) {
808 var value, marginLeftPx, marginRightPx,
809 marginLeftStyle = element.getStyle( 'margin-left' ),
810 marginRightStyle = element.getStyle( 'margin-right' );
811
812 marginLeftStyle = marginLeftStyle && marginLeftStyle.match( pxLengthRegex );
813 marginRightStyle = marginRightStyle && marginRightStyle.match( pxLengthRegex );
814 marginLeftPx = parseInt( marginLeftStyle, 10 );
815 marginRightPx = parseInt( marginRightStyle, 10 );
816
817 value = ( marginLeftPx == marginRightPx ) && marginLeftPx;
818 isNaN( parseInt( value, 10 ) ) && ( value = element.getAttribute( 'hspace' ) );
819
820 this.setValue( value );
821 }
822 },
823 commit: function( type, element ) {
824 var value = parseInt( this.getValue(), 10 );
825 if ( type == IMAGE || type == PREVIEW ) {
826 if ( !isNaN( value ) ) {
827 element.setStyle( 'margin-left', CKEDITOR.tools.cssLength( value ) );
828 element.setStyle( 'margin-right', CKEDITOR.tools.cssLength( value ) );
829 } else if ( !value && this.isChanged() ) {
830 element.removeStyle( 'margin-left' );
831 element.removeStyle( 'margin-right' );
832 }
833
834 if ( type == IMAGE )
835 element.removeAttribute( 'hspace' );
836 } else if ( type == CLEANUP ) {
837 element.removeAttribute( 'hspace' );
838 element.removeStyle( 'margin-left' );
839 element.removeStyle( 'margin-right' );
840 }
841 }
842 },
843 {
844 type: 'text',
845 id: 'txtVSpace',
846 requiredContent: 'img{margin-top,margin-bottom}',
847 width: '60px',
848 label: editor.lang.image.vSpace,
849 'default': '',
850 onKeyUp: function() {
851 updatePreview( this.getDialog() );
852 },
853 onChange: function() {
854 commitInternally.call( this, 'advanced:txtdlgGenStyle' );
855 },
856 validate: CKEDITOR.dialog.validate.integer( editor.lang.image.validateVSpace ),
857 setup: function( type, element ) {
858 if ( type == IMAGE ) {
859 var value, marginTopPx, marginBottomPx,
860 marginTopStyle = element.getStyle( 'margin-top' ),
861 marginBottomStyle = element.getStyle( 'margin-bottom' );
862
863 marginTopStyle = marginTopStyle && marginTopStyle.match( pxLengthRegex );
864 marginBottomStyle = marginBottomStyle && marginBottomStyle.match( pxLengthRegex );
865 marginTopPx = parseInt( marginTopStyle, 10 );
866 marginBottomPx = parseInt( marginBottomStyle, 10 );
867
868 value = ( marginTopPx == marginBottomPx ) && marginTopPx;
869 isNaN( parseInt( value, 10 ) ) && ( value = element.getAttribute( 'vspace' ) );
870 this.setValue( value );
871 }
872 },
873 commit: function( type, element ) {
874 var value = parseInt( this.getValue(), 10 );
875 if ( type == IMAGE || type == PREVIEW ) {
876 if ( !isNaN( value ) ) {
877 element.setStyle( 'margin-top', CKEDITOR.tools.cssLength( value ) );
878 element.setStyle( 'margin-bottom', CKEDITOR.tools.cssLength( value ) );
879 } else if ( !value && this.isChanged() ) {
880 element.removeStyle( 'margin-top' );
881 element.removeStyle( 'margin-bottom' );
882 }
883
884 if ( type == IMAGE )
885 element.removeAttribute( 'vspace' );
886 } else if ( type == CLEANUP ) {
887 element.removeAttribute( 'vspace' );
888 element.removeStyle( 'margin-top' );
889 element.removeStyle( 'margin-bottom' );
890 }
891 }
892 },
893 {
894 id: 'cmbAlign',
895 requiredContent: 'img{float}',
896 type: 'select',
897 widths: [ '35%', '65%' ],
898 style: 'width:90px',
899 label: editor.lang.common.align,
900 'default': '',
901 items: [
902 [ editor.lang.common.notSet, '' ],
903 [ editor.lang.common.alignLeft, 'left' ],
904 [ editor.lang.common.alignRight, 'right' ]
905 // Backward compatible with v2 on setup when specified as attribute value,
906 // while these values are no more available as select options.
907 // [ editor.lang.image.alignAbsBottom , 'absBottom'],
908 // [ editor.lang.image.alignAbsMiddle , 'absMiddle'],
909 // [ editor.lang.image.alignBaseline , 'baseline'],
910 // [ editor.lang.image.alignTextTop , 'text-top'],
911 // [ editor.lang.image.alignBottom , 'bottom'],
912 // [ editor.lang.image.alignMiddle , 'middle'],
913 // [ editor.lang.image.alignTop , 'top']
914 ],
915 onChange: function() {
916 updatePreview( this.getDialog() );
917 commitInternally.call( this, 'advanced:txtdlgGenStyle' );
918 },
919 setup: function( type, element ) {
920 if ( type == IMAGE ) {
921 var value = element.getStyle( 'float' );
922 switch ( value ) {
923 // Ignore those unrelated values.
924 case 'inherit':
925 case 'none':
926 value = '';
927 }
928
929 !value && ( value = ( element.getAttribute( 'align' ) || '' ).toLowerCase() );
930 this.setValue( value );
931 }
932 },
933 commit: function( type, element ) {
934 var value = this.getValue();
935 if ( type == IMAGE || type == PREVIEW ) {
936 if ( value )
937 element.setStyle( 'float', value );
938 else
939 element.removeStyle( 'float' );
940
941 if ( type == IMAGE ) {
942 value = ( element.getAttribute( 'align' ) || '' ).toLowerCase();
943 switch ( value ) {
944 // we should remove it only if it matches "left" or "right",
945 // otherwise leave it intact.
946 case 'left':
947 case 'right':
948 element.removeAttribute( 'align' );
949 }
950 }
951 } else if ( type == CLEANUP ) {
952 element.removeStyle( 'float' );
953 }
954 }
955 } ]
956 } ]
957 },
958 {
959 type: 'vbox',
960 height: '250px',
961 children: [ {
962 type: 'html',
963 id: 'htmlPreview',
964 style: 'width:95%;',
965 html: '<div>' + CKEDITOR.tools.htmlEncode( editor.lang.common.preview ) + '<br>' +
966 '<div id="' + imagePreviewLoaderId + '" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div>' +
967 '<div class="ImagePreviewBox"><table><tr><td>' +
968 '<a href="javascript:void(0)" target="_blank" onclick="return false;" id="' + previewLinkId + '">' +
969 '<img id="' + previewImageId + '" alt="" /></a>' +
970 // jscs:disable maximumLineLength
971 ( editor.config.image_previewText || 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. ' +
972 'Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, ' +
973 'nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.' ) +
974 // jscs:enable maximumLineLength
975 '</td></tr></table></div></div>'
976 } ]
977 } ]
978 } ]
979 },
980 {
981 id: 'Link',
982 requiredContent: 'a[href]',
983 label: editor.lang.image.linkTab,
984 padding: 0,
985 elements: [ {
986 id: 'txtUrl',
987 type: 'text',
988 label: editor.lang.common.url,
989 style: 'width: 100%',
990 'default': '',
991 setup: function( type, element ) {
992 if ( type == LINK ) {
993 var href = element.data( 'cke-saved-href' );
994 if ( !href )
995 href = element.getAttribute( 'href' );
996 this.setValue( href );
997 }
998 },
999 commit: function( type, element ) {
1000 if ( type == LINK ) {
1001 if ( this.getValue() || this.isChanged() ) {
1002 var url = this.getValue();
1003 element.data( 'cke-saved-href', url );
1004 element.setAttribute( 'href', url );
1005
1006 if ( this.getValue() || !editor.config.image_removeLinkByEmptyURL )
1007 this.getDialog().addLink = true;
1008 else
1009 this.getDialog().addLink = false;
1010 }
1011 }
1012 }
1013 },
1014 {
1015 type: 'button',
1016 id: 'browse',
1017 filebrowser: {
1018 action: 'Browse',
1019 target: 'Link:txtUrl',
1020 url: editor.config.filebrowserImageBrowseLinkUrl
1021 },
1022 style: 'float:right',
1023 hidden: true,
1024 label: editor.lang.common.browseServer
1025 },
1026 {
1027 id: 'cmbTarget',
1028 type: 'select',
1029 requiredContent: 'a[target]',
1030 label: editor.lang.common.target,
1031 'default': '',
1032 items: [
1033 [ editor.lang.common.notSet, '' ],
1034 [ editor.lang.common.targetNew, '_blank' ],
1035 [ editor.lang.common.targetTop, '_top' ],
1036 [ editor.lang.common.targetSelf, '_self' ],
1037 [ editor.lang.common.targetParent, '_parent' ]
1038 ],
1039 setup: function( type, element ) {
1040 if ( type == LINK )
1041 this.setValue( element.getAttribute( 'target' ) || '' );
1042 },
1043 commit: function( type, element ) {
1044 if ( type == LINK ) {
1045 if ( this.getValue() || this.isChanged() )
1046 element.setAttribute( 'target', this.getValue() );
1047 }
1048 }
1049 } ]
1050 },
1051 {
1052 id: 'Upload',
1053 hidden: true,
1054 filebrowser: 'uploadButton',
1055 label: editor.lang.image.upload,
1056 elements: [ {
1057 type: 'file',
1058 id: 'upload',
1059 label: editor.lang.image.btnUpload,
1060 style: 'height:40px',
1061 size: 38
1062 },
1063 {
1064 type: 'fileButton',
1065 id: 'uploadButton',
1066 filebrowser: 'info:txtUrl',
1067 label: editor.lang.image.btnUpload,
1068 'for': [ 'Upload', 'upload' ]
1069 } ]
1070 },
1071 {
1072 id: 'advanced',
1073 label: editor.lang.common.advancedTab,
1074 elements: [ {
1075 type: 'hbox',
1076 widths: [ '50%', '25%', '25%' ],
1077 children: [ {
1078 type: 'text',
1079 id: 'linkId',
1080 requiredContent: 'img[id]',
1081 label: editor.lang.common.id,
1082 setup: function( type, element ) {
1083 if ( type == IMAGE )
1084 this.setValue( element.getAttribute( 'id' ) );
1085 },
1086 commit: function( type, element ) {
1087 if ( type == IMAGE ) {
1088 if ( this.getValue() || this.isChanged() )
1089 element.setAttribute( 'id', this.getValue() );
1090 }
1091 }
1092 },
1093 {
1094 id: 'cmbLangDir',
1095 type: 'select',
1096 requiredContent: 'img[dir]',
1097 style: 'width : 100px;',
1098 label: editor.lang.common.langDir,
1099 'default': '',
1100 items: [
1101 [ editor.lang.common.notSet, '' ],
1102 [ editor.lang.common.langDirLtr, 'ltr' ],
1103 [ editor.lang.common.langDirRtl, 'rtl' ]
1104 ],
1105 setup: function( type, element ) {
1106 if ( type == IMAGE )
1107 this.setValue( element.getAttribute( 'dir' ) );
1108 },
1109 commit: function( type, element ) {
1110 if ( type == IMAGE ) {
1111 if ( this.getValue() || this.isChanged() )
1112 element.setAttribute( 'dir', this.getValue() );
1113 }
1114 }
1115 },
1116 {
1117 type: 'text',
1118 id: 'txtLangCode',
1119 requiredContent: 'img[lang]',
1120 label: editor.lang.common.langCode,
1121 'default': '',
1122 setup: function( type, element ) {
1123 if ( type == IMAGE )
1124 this.setValue( element.getAttribute( 'lang' ) );
1125 },
1126 commit: function( type, element ) {
1127 if ( type == IMAGE ) {
1128 if ( this.getValue() || this.isChanged() )
1129 element.setAttribute( 'lang', this.getValue() );
1130 }
1131 }
1132 } ]
1133 },
1134 {
1135 type: 'text',
1136 id: 'txtGenLongDescr',
1137 requiredContent: 'img[longdesc]',
1138 label: editor.lang.common.longDescr,
1139 setup: function( type, element ) {
1140 if ( type == IMAGE )
1141 this.setValue( element.getAttribute( 'longDesc' ) );
1142 },
1143 commit: function( type, element ) {
1144 if ( type == IMAGE ) {
1145 if ( this.getValue() || this.isChanged() )
1146 element.setAttribute( 'longDesc', this.getValue() );
1147 }
1148 }
1149 },
1150 {
1151 type: 'hbox',
1152 widths: [ '50%', '50%' ],
1153 children: [ {
1154 type: 'text',
1155 id: 'txtGenClass',
1156 requiredContent: 'img(cke-xyz)', // Random text like 'xyz' will check if all are allowed.
1157 label: editor.lang.common.cssClass,
1158 'default': '',
1159 setup: function( type, element ) {
1160 if ( type == IMAGE )
1161 this.setValue( element.getAttribute( 'class' ) );
1162 },
1163 commit: function( type, element ) {
1164 if ( type == IMAGE ) {
1165 if ( this.getValue() || this.isChanged() )
1166 element.setAttribute( 'class', this.getValue() );
1167 }
1168 }
1169 },
1170 {
1171 type: 'text',
1172 id: 'txtGenTitle',
1173 requiredContent: 'img[title]',
1174 label: editor.lang.common.advisoryTitle,
1175 'default': '',
1176 onChange: function() {
1177 updatePreview( this.getDialog() );
1178 },
1179 setup: function( type, element ) {
1180 if ( type == IMAGE )
1181 this.setValue( element.getAttribute( 'title' ) );
1182 },
1183 commit: function( type, element ) {
1184 if ( type == IMAGE ) {
1185 if ( this.getValue() || this.isChanged() )
1186 element.setAttribute( 'title', this.getValue() );
1187 } else if ( type == PREVIEW )
1188 element.setAttribute( 'title', this.getValue() );
1189 else if ( type == CLEANUP ) {
1190 element.removeAttribute( 'title' );
1191 }
1192 }
1193 } ]
1194 },
1195 {
1196 type: 'text',
1197 id: 'txtdlgGenStyle',
1198 requiredContent: 'img{cke-xyz}', // Random text like 'xyz' will check if all are allowed.
1199 label: editor.lang.common.cssStyle,
1200 validate: CKEDITOR.dialog.validate.inlineStyle( editor.lang.common.invalidInlineStyle ),
1201 'default': '',
1202 setup: function( type, element ) {
1203 if ( type == IMAGE ) {
1204 var genStyle = element.getAttribute( 'style' );
1205 if ( !genStyle && element.$.style.cssText )
1206 genStyle = element.$.style.cssText;
1207 this.setValue( genStyle );
1208
1209 var height = element.$.style.height,
1210 width = element.$.style.width,
1211 aMatchH = ( height ? height : '' ).match( regexGetSize ),
1212 aMatchW = ( width ? width : '' ).match( regexGetSize );
1213
1214 this.attributesInStyle = {
1215 height: !!aMatchH,
1216 width: !!aMatchW
1217 };
1218 }
1219 },
1220 onChange: function() {
1221 commitInternally.call(
1222 this, [
1223 'info:cmbFloat',
1224 'info:cmbAlign',
1225 'info:txtVSpace',
1226 'info:txtHSpace',
1227 'info:txtBorder',
1228 'info:txtWidth',
1229 'info:txtHeight'
1230 ]
1231 );
1232 updatePreview( this );
1233 },
1234 commit: function( type, element ) {
1235 if ( type == IMAGE && ( this.getValue() || this.isChanged() ) )
1236 element.setAttribute( 'style', this.getValue() );
1237
1238 }
1239 } ]
1240 } ]
1241 };
1242 };
1243
1244 CKEDITOR.dialog.add( 'image', function( editor ) {
1245 return imageDialog( editor, 'image' );
1246 } );
1247
1248 CKEDITOR.dialog.add( 'imagebutton', function( editor ) {
1249 return imageDialog( editor, 'imagebutton' );
1250 } );
1251} )();
diff --git a/sources/plugins/image/icons/hidpi/image.png b/sources/plugins/image/icons/hidpi/image.png
new file mode 100644
index 00000000..b3c7ade5
--- /dev/null
+++ b/sources/plugins/image/icons/hidpi/image.png
Binary files differ
diff --git a/sources/plugins/image/icons/image.png b/sources/plugins/image/icons/image.png
new file mode 100644
index 00000000..fcf61b5f
--- /dev/null
+++ b/sources/plugins/image/icons/image.png
Binary files differ
diff --git a/sources/plugins/image/images/noimage.png b/sources/plugins/image/images/noimage.png
new file mode 100644
index 00000000..74c6ee92
--- /dev/null
+++ b/sources/plugins/image/images/noimage.png
Binary files differ
diff --git a/sources/plugins/image/lang/af.js b/sources/plugins/image/lang/af.js
new file mode 100644
index 00000000..f81dd0f2
--- /dev/null
+++ b/sources/plugins/image/lang/af.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'af', {
6 alt: 'Alternatiewe teks',
7 border: 'Rand',
8 btnUpload: 'Stuur na bediener',
9 button2Img: 'Wil u die geselekteerde afbeeldingsknop vervang met \'n eenvoudige afbeelding?',
10 hSpace: 'HSpasie',
11 img2Button: 'Wil u die geselekteerde afbeelding vervang met \'n afbeeldingsknop?',
12 infoTab: 'Afbeelding informasie',
13 linkTab: 'Skakel',
14 lockRatio: 'Vaste proporsie',
15 menu: 'Afbeelding eienskappe',
16 resetSize: 'Herstel grootte',
17 title: 'Afbeelding eienskappe',
18 titleButton: 'Afbeeldingsknop eienskappe',
19 upload: 'Oplaai',
20 urlMissing: 'Die URL na die afbeelding ontbreek.',
21 vSpace: 'VSpasie',
22 validateBorder: 'Rand moet \'n heelgetal wees.',
23 validateHSpace: 'HSpasie moet \'n heelgetal wees.',
24 validateVSpace: 'VSpasie moet \'n heelgetal wees.'
25} );
diff --git a/sources/plugins/image/lang/ar.js b/sources/plugins/image/lang/ar.js
new file mode 100644
index 00000000..f15aacd4
--- /dev/null
+++ b/sources/plugins/image/lang/ar.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ar', {
6 alt: 'عنوان الصورة',
7 border: 'سمك الحدود',
8 btnUpload: 'أرسلها للخادم',
9 button2Img: 'هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟',
10 hSpace: 'تباعد أفقي',
11 img2Button: 'هل تريد تحويل الصورة المختارة إلى زر صورة؟',
12 infoTab: 'معلومات الصورة',
13 linkTab: 'الرابط',
14 lockRatio: 'تناسق الحجم',
15 menu: 'خصائص الصورة',
16 resetSize: 'إستعادة الحجم الأصلي',
17 title: 'خصائص الصورة',
18 titleButton: 'خصائص زر الصورة',
19 upload: 'رفع',
20 urlMissing: 'عنوان مصدر الصورة مفقود',
21 vSpace: 'تباعد عمودي',
22 validateBorder: 'الإطار يجب أن يكون عددا',
23 validateHSpace: 'HSpace يجب أن يكون عدداً.',
24 validateVSpace: 'VSpace يجب أن يكون عدداً.'
25} );
diff --git a/sources/plugins/image/lang/bg.js b/sources/plugins/image/lang/bg.js
new file mode 100644
index 00000000..f6533aee
--- /dev/null
+++ b/sources/plugins/image/lang/bg.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'bg', {
6 alt: 'Алтернативен текст',
7 border: 'Рамка',
8 btnUpload: 'Изпрати я на сървъра',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'Хоризонтален отстъп',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Инфо за снимка',
13 linkTab: 'Връзка',
14 lockRatio: 'Заключване на съотношението',
15 menu: 'Настройки за снимка',
16 resetSize: 'Нулиране на размер',
17 title: 'Настройки за снимка',
18 titleButton: 'Настойки за бутон за снимка',
19 upload: 'Качване',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'Вертикален отстъп',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/bn.js b/sources/plugins/image/lang/bn.js
new file mode 100644
index 00000000..fc8131db
--- /dev/null
+++ b/sources/plugins/image/lang/bn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'bn', {
6 alt: 'বিকল্প টেক্সট',
7 border: 'বর্ডার',
8 btnUpload: 'ইহাকে সার্ভারে প্রেরন কর',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'হরাইজন্টাল স্পেস',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'ছবির তথ্য',
13 linkTab: 'লিংক',
14 lockRatio: 'অনুপাত লক কর',
15 menu: 'ছবির প্রোপার্টি',
16 resetSize: 'সাইজ পূর্বাবস্থায় ফিরিয়ে দাও',
17 title: 'ছবির প্রোপার্টি',
18 titleButton: 'ছবি বাটন প্রোপার্টি',
19 upload: 'আপলোড',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'ভার্টিকেল স্পেস',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/bs.js b/sources/plugins/image/lang/bs.js
new file mode 100644
index 00000000..885b6cf1
--- /dev/null
+++ b/sources/plugins/image/lang/bs.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'bs', {
6 alt: 'Tekst na slici',
7 border: 'Okvir',
8 btnUpload: 'Šalji na server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Info slike',
13 linkTab: 'Link',
14 lockRatio: 'Zakljuèaj odnos',
15 menu: 'Svojstva slike',
16 resetSize: 'Resetuj dimenzije',
17 title: 'Svojstva slike',
18 titleButton: 'Image Button Properties', // MISSING
19 upload: 'Šalji',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'VSpace',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/ca.js b/sources/plugins/image/lang/ca.js
new file mode 100644
index 00000000..d7fcbb9d
--- /dev/null
+++ b/sources/plugins/image/lang/ca.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ca', {
6 alt: 'Text alternatiu',
7 border: 'Vora',
8 btnUpload: 'Envia-la al servidor',
9 button2Img: 'Voleu transformar el botó d\'imatge seleccionat en una simple imatge?',
10 hSpace: 'Espaiat horit.',
11 img2Button: 'Voleu transformar la imatge seleccionada en un botó d\'imatge?',
12 infoTab: 'Informació de la imatge',
13 linkTab: 'Enllaç',
14 lockRatio: 'Bloqueja les proporcions',
15 menu: 'Propietats de la imatge',
16 resetSize: 'Restaura la mida',
17 title: 'Propietats de la imatge',
18 titleButton: 'Propietats del botó d\'imatge',
19 upload: 'Puja',
20 urlMissing: 'Falta la URL de la imatge.',
21 vSpace: 'Espaiat vert.',
22 validateBorder: 'La vora ha de ser un nombre enter.',
23 validateHSpace: 'HSpace ha de ser un nombre enter.',
24 validateVSpace: 'VSpace ha de ser un nombre enter.'
25} );
diff --git a/sources/plugins/image/lang/cs.js b/sources/plugins/image/lang/cs.js
new file mode 100644
index 00000000..dac2bd85
--- /dev/null
+++ b/sources/plugins/image/lang/cs.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'cs', {
6 alt: 'Alternativní text',
7 border: 'Okraje',
8 btnUpload: 'Odeslat na server',
9 button2Img: 'Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?',
10 hSpace: 'Horizontální mezera',
11 img2Button: 'Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?',
12 infoTab: 'Informace o obrázku',
13 linkTab: 'Odkaz',
14 lockRatio: 'Zámek',
15 menu: 'Vlastnosti obrázku',
16 resetSize: 'Původní velikost',
17 title: 'Vlastnosti obrázku',
18 titleButton: 'Vlastností obrázkového tlačítka',
19 upload: 'Odeslat',
20 urlMissing: 'Zadané URL zdroje obrázku nebylo nalezeno.',
21 vSpace: 'Vertikální mezera',
22 validateBorder: 'Okraj musí být nastaven v celých číslech.',
23 validateHSpace: 'Horizontální mezera musí být nastavena v celých číslech.',
24 validateVSpace: 'Vertikální mezera musí být nastavena v celých číslech.'
25} );
diff --git a/sources/plugins/image/lang/cy.js b/sources/plugins/image/lang/cy.js
new file mode 100644
index 00000000..0049154c
--- /dev/null
+++ b/sources/plugins/image/lang/cy.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'cy', {
6 alt: 'Testun Amgen',
7 border: 'Ymyl',
8 btnUpload: 'Anfon i\'r Gweinydd',
9 button2Img: 'Ydych am drawsffurfio\'r botwm ddelwedd hwn ar ddelwedd syml?',
10 hSpace: 'BwlchLl',
11 img2Button: 'Ydych am drawsffurfio\'r ddelwedd hon ar fotwm delwedd?',
12 infoTab: 'Gwyb Delwedd',
13 linkTab: 'Dolen',
14 lockRatio: 'Cloi Cymhareb',
15 menu: 'Priodweddau Delwedd',
16 resetSize: 'Ailosod Maint',
17 title: 'Priodweddau Delwedd',
18 titleButton: 'Priodweddau Botwm Delwedd',
19 upload: 'Lanlwytho',
20 urlMissing: 'URL gwreiddiol y ddelwedd ar goll.',
21 vSpace: 'BwlchF',
22 validateBorder: 'Rhaid i\'r ymyl fod yn gyfanrif.',
23 validateHSpace: 'Rhaid i\'r HSpace fod yn gyfanrif.',
24 validateVSpace: 'Rhaid i\'r VSpace fod yn gyfanrif.'
25} );
diff --git a/sources/plugins/image/lang/da.js b/sources/plugins/image/lang/da.js
new file mode 100644
index 00000000..e468277c
--- /dev/null
+++ b/sources/plugins/image/lang/da.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'da', {
6 alt: 'Alternativ tekst',
7 border: 'Ramme',
8 btnUpload: 'Upload fil til serveren',
9 button2Img: 'Vil du lave billedknappen om til et almindeligt billede?',
10 hSpace: 'Vandret margen',
11 img2Button: 'Vil du lave billedet om til en billedknap?',
12 infoTab: 'Generelt',
13 linkTab: 'Hyperlink',
14 lockRatio: 'Lås størrelsesforhold',
15 menu: 'Egenskaber for billede',
16 resetSize: 'Nulstil størrelse',
17 title: 'Egenskaber for billede',
18 titleButton: 'Egenskaber for billedknap',
19 upload: 'Upload',
20 urlMissing: 'Kilde på billed-URL mangler',
21 vSpace: 'Lodret margen',
22 validateBorder: 'Kant skal være et helt nummer.',
23 validateHSpace: 'HSpace skal være et helt nummer.',
24 validateVSpace: 'VSpace skal være et helt nummer.'
25} );
diff --git a/sources/plugins/image/lang/de.js b/sources/plugins/image/lang/de.js
new file mode 100644
index 00000000..68ba4ae1
--- /dev/null
+++ b/sources/plugins/image/lang/de.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'de', {
6 alt: 'Alternativer Text',
7 border: 'Rahmen',
8 btnUpload: 'Zum Server senden',
9 button2Img: 'Möchten Sie die ausgewählte Bildschaltfläche in ein einfaches Bild umwandeln?',
10 hSpace: 'Horizontal-Abstand',
11 img2Button: 'Möchten Sie das ausgewählte Bild in eine Bildschaltfläche umwandeln?',
12 infoTab: 'Bildinfo',
13 linkTab: 'Link',
14 lockRatio: 'Größenverhältnis beibehalten',
15 menu: 'Bildeigenschaften',
16 resetSize: 'Größe zurücksetzen',
17 title: 'Bildeigenschaften',
18 titleButton: 'Bildschaltflächeneigenschaften',
19 upload: 'Hochladen',
20 urlMissing: 'Bildquellen-URL fehlt.',
21 vSpace: 'Vertikal-Abstand',
22 validateBorder: 'Rahmen muss eine ganze Zahl sein.',
23 validateHSpace: 'Horizontal-Abstand muss eine ganze Zahl sein.',
24 validateVSpace: 'Vertikal-Abstand muss eine ganze Zahl sein.'
25} );
diff --git a/sources/plugins/image/lang/el.js b/sources/plugins/image/lang/el.js
new file mode 100644
index 00000000..8bd9dc06
--- /dev/null
+++ b/sources/plugins/image/lang/el.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'el', {
6 alt: 'Εναλλακτικό Κείμενο',
7 border: 'Περίγραμμα',
8 btnUpload: 'Αποστολή στον Διακομιστή',
9 button2Img: 'Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;',
10 hSpace: 'HSpace',
11 img2Button: 'Θέλετε να μεταμορφώσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;',
12 infoTab: 'Πληροφορίες Εικόνας',
13 linkTab: 'Σύνδεσμος',
14 lockRatio: 'Κλείδωμα Αναλογίας',
15 menu: 'Ιδιότητες Εικόνας',
16 resetSize: 'Επαναφορά Αρχικού Μεγέθους',
17 title: 'Ιδιότητες Εικόνας',
18 titleButton: 'Ιδιότητες Κουμπιού Εικόνας',
19 upload: 'Αποστολή',
20 urlMissing: 'Το URL πηγής για την εικόνα λείπει.',
21 vSpace: 'VSpace',
22 validateBorder: 'Το περίγραμμα πρέπει να είναι ένας ακέραιος αριθμός.',
23 validateHSpace: 'Το HSpace πρέπει να είναι ένας ακέραιος αριθμός.',
24 validateVSpace: 'Το VSpace πρέπει να είναι ένας ακέραιος αριθμός.'
25} );
diff --git a/sources/plugins/image/lang/en-au.js b/sources/plugins/image/lang/en-au.js
new file mode 100644
index 00000000..b5a87de7
--- /dev/null
+++ b/sources/plugins/image/lang/en-au.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'en-au', {
6 alt: 'Alternative Text',
7 border: 'Border',
8 btnUpload: 'Send it to the Server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?',
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?',
12 infoTab: 'Image Info',
13 linkTab: 'Link',
14 lockRatio: 'Lock Ratio',
15 menu: 'Image Properties',
16 resetSize: 'Reset Size',
17 title: 'Image Properties',
18 titleButton: 'Image Button Properties',
19 upload: 'Upload',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'VSpace',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/en-ca.js b/sources/plugins/image/lang/en-ca.js
new file mode 100644
index 00000000..3289e498
--- /dev/null
+++ b/sources/plugins/image/lang/en-ca.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'en-ca', {
6 alt: 'Alternative Text',
7 border: 'Border',
8 btnUpload: 'Send it to the Server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?',
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?',
12 infoTab: 'Image Info',
13 linkTab: 'Link',
14 lockRatio: 'Lock Ratio',
15 menu: 'Image Properties',
16 resetSize: 'Reset Size',
17 title: 'Image Properties',
18 titleButton: 'Image Button Properties',
19 upload: 'Upload',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'VSpace',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/en-gb.js b/sources/plugins/image/lang/en-gb.js
new file mode 100644
index 00000000..add0adbc
--- /dev/null
+++ b/sources/plugins/image/lang/en-gb.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'en-gb', {
6 alt: 'Alternative Text',
7 border: 'Border',
8 btnUpload: 'Send it to the Server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?',
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?',
12 infoTab: 'Image Info',
13 linkTab: 'Link',
14 lockRatio: 'Lock Ratio',
15 menu: 'Image Properties',
16 resetSize: 'Reset Size',
17 title: 'Image Properties',
18 titleButton: 'Image Button Properties',
19 upload: 'Upload',
20 urlMissing: 'Image source URL is missing.',
21 vSpace: 'VSpace',
22 validateBorder: 'Border must be a whole number.',
23 validateHSpace: 'HSpace must be a whole number.',
24 validateVSpace: 'VSpace must be a whole number.'
25} );
diff --git a/sources/plugins/image/lang/en.js b/sources/plugins/image/lang/en.js
new file mode 100644
index 00000000..18af4b88
--- /dev/null
+++ b/sources/plugins/image/lang/en.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'en', {
6 alt: 'Alternative Text',
7 border: 'Border',
8 btnUpload: 'Send it to the Server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?',
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?',
12 infoTab: 'Image Info',
13 linkTab: 'Link',
14 lockRatio: 'Lock Ratio',
15 menu: 'Image Properties',
16 resetSize: 'Reset Size',
17 title: 'Image Properties',
18 titleButton: 'Image Button Properties',
19 upload: 'Upload',
20 urlMissing: 'Image source URL is missing.',
21 vSpace: 'VSpace',
22 validateBorder: 'Border must be a whole number.',
23 validateHSpace: 'HSpace must be a whole number.',
24 validateVSpace: 'VSpace must be a whole number.'
25} );
diff --git a/sources/plugins/image/lang/eo.js b/sources/plugins/image/lang/eo.js
new file mode 100644
index 00000000..de3b73cf
--- /dev/null
+++ b/sources/plugins/image/lang/eo.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'eo', {
6 alt: 'Anstataŭiga Teksto',
7 border: 'Bordero',
8 btnUpload: 'Sendu al Servilo',
9 button2Img: 'Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?',
10 hSpace: 'Horizontala Spaco',
11 img2Button: 'Ĉu vi volas transformi la selektitan bildon en bildbutonon?',
12 infoTab: 'Informoj pri Bildo',
13 linkTab: 'Ligilo',
14 lockRatio: 'Konservi Proporcion',
15 menu: 'Atributoj de Bildo',
16 resetSize: 'Origina Grando',
17 title: 'Atributoj de Bildo',
18 titleButton: 'Bildbutonaj Atributoj',
19 upload: 'Alŝuti',
20 urlMissing: 'La fontretadreso de la bildo mankas.',
21 vSpace: 'Vertikala Spaco',
22 validateBorder: 'La bordero devas esti entjera nombro.',
23 validateHSpace: 'La horizontala spaco devas esti entjera nombro.',
24 validateVSpace: 'La vertikala spaco devas esti entjera nombro.'
25} );
diff --git a/sources/plugins/image/lang/es.js b/sources/plugins/image/lang/es.js
new file mode 100644
index 00000000..35310e00
--- /dev/null
+++ b/sources/plugins/image/lang/es.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'es', {
6 alt: 'Texto Alternativo',
7 border: 'Borde',
8 btnUpload: 'Enviar al Servidor',
9 button2Img: '¿Desea convertir el botón de imagen en una simple imagen?',
10 hSpace: 'Esp.Horiz',
11 img2Button: '¿Desea convertir la imagen en un botón de imagen?',
12 infoTab: 'Información de Imagen',
13 linkTab: 'Vínculo',
14 lockRatio: 'Proporcional',
15 menu: 'Propiedades de Imagen',
16 resetSize: 'Tamaño Original',
17 title: 'Propiedades de Imagen',
18 titleButton: 'Propiedades de Botón de Imagen',
19 upload: 'Cargar',
20 urlMissing: 'Debe indicar la URL de la imagen.',
21 vSpace: 'Esp.Vert',
22 validateBorder: 'El borde debe ser un número.',
23 validateHSpace: 'El espaciado horizontal debe ser un número.',
24 validateVSpace: 'El espaciado vertical debe ser un número.'
25} );
diff --git a/sources/plugins/image/lang/et.js b/sources/plugins/image/lang/et.js
new file mode 100644
index 00000000..00559b5c
--- /dev/null
+++ b/sources/plugins/image/lang/et.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'et', {
6 alt: 'Alternatiivne tekst',
7 border: 'Joon',
8 btnUpload: 'Saada serverisse',
9 button2Img: 'Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?',
10 hSpace: 'H. vaheruum',
11 img2Button: 'Kas tahad teisendada valitud tavalise pildi pildiga nupuks?',
12 infoTab: 'Pildi info',
13 linkTab: 'Link',
14 lockRatio: 'Lukusta kuvasuhe',
15 menu: 'Pildi omadused',
16 resetSize: 'Lähtesta suurus',
17 title: 'Pildi omadused',
18 titleButton: 'Piltnupu omadused',
19 upload: 'Lae üles',
20 urlMissing: 'Pildi lähte-URL on puudu.',
21 vSpace: 'V. vaheruum',
22 validateBorder: 'Äärise laius peab olema täisarv.',
23 validateHSpace: 'Horisontaalne vaheruum peab olema täisarv.',
24 validateVSpace: 'Vertikaalne vaheruum peab olema täisarv.'
25} );
diff --git a/sources/plugins/image/lang/eu.js b/sources/plugins/image/lang/eu.js
new file mode 100644
index 00000000..874dd697
--- /dev/null
+++ b/sources/plugins/image/lang/eu.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'eu', {
6 alt: 'Ordezko testua',
7 border: 'Ertza',
8 btnUpload: 'Bidali zerbitzarira',
9 button2Img: 'Hautatutako irudi-botoia irudi arrunt bihurtu nahi duzu?',
10 hSpace: 'HSpace',
11 img2Button: 'Hautatutako irudia irudi-botoi bihurtu nahi duzu?',
12 infoTab: 'Irudiaren informazioa',
13 linkTab: 'Esteka',
14 lockRatio: 'Blokeatu erlazioa',
15 menu: 'Irudiaren propietateak',
16 resetSize: 'Berrezarri tamaina',
17 title: 'Irudiaren propietateak',
18 titleButton: 'Irudi-botoiaren propietateak',
19 upload: 'Kargatu',
20 urlMissing: 'Irudiaren iturburuaren URLa falta da.',
21 vSpace: 'VSpace',
22 validateBorder: 'Ertza zenbaki oso bat izan behar da.',
23 validateHSpace: 'HSpace zenbaki oso bat izan behar da.',
24 validateVSpace: 'VSpace zenbaki oso bat izan behar da.'
25} );
diff --git a/sources/plugins/image/lang/fa.js b/sources/plugins/image/lang/fa.js
new file mode 100644
index 00000000..90dbd907
--- /dev/null
+++ b/sources/plugins/image/lang/fa.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'fa', {
6 alt: 'متن جایگزین',
7 border: 'لبه',
8 btnUpload: 'به سرور بفرست',
9 button2Img: 'آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟',
10 hSpace: 'فاصلهٴ افقی',
11 img2Button: 'آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟',
12 infoTab: 'اطلاعات تصویر',
13 linkTab: 'پیوند',
14 lockRatio: 'قفل کردن نسبت',
15 menu: 'ویژگی​های تصویر',
16 resetSize: 'بازنشانی اندازه',
17 title: 'ویژگی​های تصویر',
18 titleButton: 'ویژگی​های دکمهٴ تصویری',
19 upload: 'انتقال به سرور',
20 urlMissing: 'آدرس URL اصلی تصویر یافت نشد.',
21 vSpace: 'فاصلهٴ عمودی',
22 validateBorder: 'مقدار خطوط باید یک عدد باشد.',
23 validateHSpace: 'مقدار فاصله گذاری افقی باید یک عدد باشد.',
24 validateVSpace: 'مقدار فاصله گذاری عمودی باید یک عدد باشد.'
25} );
diff --git a/sources/plugins/image/lang/fi.js b/sources/plugins/image/lang/fi.js
new file mode 100644
index 00000000..f324e88f
--- /dev/null
+++ b/sources/plugins/image/lang/fi.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'fi', {
6 alt: 'Vaihtoehtoinen teksti',
7 border: 'Kehys',
8 btnUpload: 'Lähetä palvelimelle',
9 button2Img: 'Haluatko muuntaa valitun kuvanäppäimen kuvaksi?',
10 hSpace: 'Vaakatila',
11 img2Button: 'Haluatko muuntaa valitun kuvan kuvanäppäimeksi?',
12 infoTab: 'Kuvan tiedot',
13 linkTab: 'Linkki',
14 lockRatio: 'Lukitse suhteet',
15 menu: 'Kuvan ominaisuudet',
16 resetSize: 'Alkuperäinen koko',
17 title: 'Kuvan ominaisuudet',
18 titleButton: 'Kuvapainikkeen ominaisuudet',
19 upload: 'Lisää kuva',
20 urlMissing: 'Kuvan lähdeosoite puuttuu.',
21 vSpace: 'Pystytila',
22 validateBorder: 'Kehyksen täytyy olla kokonaisluku.',
23 validateHSpace: 'HSpace-määrityksen täytyy olla kokonaisluku.',
24 validateVSpace: 'VSpace-määrityksen täytyy olla kokonaisluku.'
25} );
diff --git a/sources/plugins/image/lang/fo.js b/sources/plugins/image/lang/fo.js
new file mode 100644
index 00000000..d3b78085
--- /dev/null
+++ b/sources/plugins/image/lang/fo.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'fo', {
6 alt: 'Alternativur tekstur',
7 border: 'Bordi',
8 btnUpload: 'Send til ambætaran',
9 button2Img: 'Skal valdi myndaknøttur gerast til vanliga mynd?',
10 hSpace: 'Høgri breddi',
11 img2Button: 'Skal valda mynd gerast til myndaknøtt?',
12 infoTab: 'Myndaupplýsingar',
13 linkTab: 'Tilknýti',
14 lockRatio: 'Læs lutfallið',
15 menu: 'Myndaeginleikar',
16 resetSize: 'Upprunastødd',
17 title: 'Myndaeginleikar',
18 titleButton: 'Eginleikar fyri myndaknøtt',
19 upload: 'Send',
20 urlMissing: 'URL til mynd manglar.',
21 vSpace: 'Vinstri breddi',
22 validateBorder: 'Bordi má vera eitt heiltal.',
23 validateHSpace: 'HSpace má vera eitt heiltal.',
24 validateVSpace: 'VSpace má vera eitt heiltal.'
25} );
diff --git a/sources/plugins/image/lang/fr-ca.js b/sources/plugins/image/lang/fr-ca.js
new file mode 100644
index 00000000..69b9d843
--- /dev/null
+++ b/sources/plugins/image/lang/fr-ca.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'fr-ca', {
6 alt: 'Texte alternatif',
7 border: 'Bordure',
8 btnUpload: 'Envoyer sur le serveur',
9 button2Img: 'Désirez-vous transformer l\'image sélectionnée en image simple?',
10 hSpace: 'Espacement horizontal',
11 img2Button: 'Désirez-vous transformer l\'image sélectionnée en bouton image?',
12 infoTab: 'Informations sur l\'image',
13 linkTab: 'Lien',
14 lockRatio: 'Verrouiller les proportions',
15 menu: 'Propriétés de l\'image',
16 resetSize: 'Taille originale',
17 title: 'Propriétés de l\'image',
18 titleButton: 'Propriétés du bouton image',
19 upload: 'Téléverser',
20 urlMissing: 'L\'URL de la source de l\'image est manquant.',
21 vSpace: 'Espacement vertical',
22 validateBorder: 'La bordure doit être un entier.',
23 validateHSpace: 'L\'espacement horizontal doit être un entier.',
24 validateVSpace: 'L\'espacement vertical doit être un entier.'
25} );
diff --git a/sources/plugins/image/lang/fr.js b/sources/plugins/image/lang/fr.js
new file mode 100644
index 00000000..cfd2feac
--- /dev/null
+++ b/sources/plugins/image/lang/fr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'fr', {
6 alt: 'Texte de remplacement',
7 border: 'Bordure',
8 btnUpload: 'Envoyer sur le serveur',
9 button2Img: 'Voulez-vous transformer le bouton image sélectionné en simple image?',
10 hSpace: 'Espacement horizontal',
11 img2Button: 'Voulez-vous transformer l\'image en bouton image?',
12 infoTab: 'Informations sur l\'image',
13 linkTab: 'Lien',
14 lockRatio: 'Conserver les proportions',
15 menu: 'Propriétés de l\'image',
16 resetSize: 'Taille d\'origine',
17 title: 'Propriétés de l\'image',
18 titleButton: 'Propriétés du bouton image',
19 upload: 'Envoyer',
20 urlMissing: 'L\'adresse source de l\'image est manquante.',
21 vSpace: 'Espacement vertical',
22 validateBorder: 'Bordure doit être un entier.',
23 validateHSpace: 'HSpace doit être un entier.',
24 validateVSpace: 'VSpace doit être un entier.'
25} );
diff --git a/sources/plugins/image/lang/gl.js b/sources/plugins/image/lang/gl.js
new file mode 100644
index 00000000..28aaba94
--- /dev/null
+++ b/sources/plugins/image/lang/gl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'gl', {
6 alt: 'Texto alternativo',
7 border: 'Bordo',
8 btnUpload: 'Enviar ao servidor',
9 button2Img: 'Quere converter o botón da imaxe seleccionada nunha imaxe sinxela?',
10 hSpace: 'Esp.Horiz.',
11 img2Button: 'Quere converter a imaxe seleccionada nun botón de imaxe?',
12 infoTab: 'Información da imaxe',
13 linkTab: 'Ligazón',
14 lockRatio: 'Proporcional',
15 menu: 'Propiedades da imaxe',
16 resetSize: 'Tamaño orixinal',
17 title: 'Propiedades da imaxe',
18 titleButton: 'Propiedades do botón de imaxe',
19 upload: 'Cargar',
20 urlMissing: 'Non se atopa o URL da imaxe.',
21 vSpace: 'Esp.Vert.',
22 validateBorder: 'O bordo debe ser un número.',
23 validateHSpace: 'O espazado horizontal debe ser un número.',
24 validateVSpace: 'O espazado vertical debe ser un número.'
25} );
diff --git a/sources/plugins/image/lang/gu.js b/sources/plugins/image/lang/gu.js
new file mode 100644
index 00000000..b62fad85
--- /dev/null
+++ b/sources/plugins/image/lang/gu.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'gu', {
6 alt: 'ઑલ્ટર્નટ ટેક્સ્ટ',
7 border: 'બોર્ડર',
8 btnUpload: 'આ સર્વરને મોકલવું',
9 button2Img: 'તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.',
10 hSpace: 'સમસ્તરીય જગ્યા',
11 img2Button: 'તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.',
12 infoTab: 'ચિત્ર ની જાણકારી',
13 linkTab: 'લિંક',
14 lockRatio: 'લૉક ગુણોત્તર',
15 menu: 'ચિત્રના ગુણ',
16 resetSize: 'રીસેટ સાઇઝ',
17 title: 'ચિત્રના ગુણ',
18 titleButton: 'ચિત્ર બટનના ગુણ',
19 upload: 'અપલોડ',
20 urlMissing: 'ઈમેજની મૂળ URL છે નહી.',
21 vSpace: 'લંબરૂપ જગ્યા',
22 validateBorder: 'બોર્ડેર આંકડો હોવો જોઈએ.',
23 validateHSpace: 'HSpaceઆંકડો હોવો જોઈએ.',
24 validateVSpace: 'VSpace આંકડો હોવો જોઈએ. '
25} );
diff --git a/sources/plugins/image/lang/he.js b/sources/plugins/image/lang/he.js
new file mode 100644
index 00000000..21fe73fa
--- /dev/null
+++ b/sources/plugins/image/lang/he.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'he', {
6 alt: 'טקסט חלופי',
7 border: 'מסגרת',
8 btnUpload: 'שליחה לשרת',
9 button2Img: 'האם להפוך את תמונת הכפתור לתמונה פשוטה?',
10 hSpace: 'מרווח אופקי',
11 img2Button: 'האם להפוך את התמונה לכפתור תמונה?',
12 infoTab: 'מידע על התמונה',
13 linkTab: 'קישור',
14 lockRatio: 'נעילת היחס',
15 menu: 'תכונות התמונה',
16 resetSize: 'איפוס הגודל',
17 title: 'מאפייני התמונה',
18 titleButton: 'מאפיני כפתור תמונה',
19 upload: 'העלאה',
20 urlMissing: 'כתובת התמונה חסרה.',
21 vSpace: 'מרווח אנכי',
22 validateBorder: 'שדה המסגרת חייב להיות מספר שלם.',
23 validateHSpace: 'שדה המרווח האופקי חייב להיות מספר שלם.',
24 validateVSpace: 'שדה המרווח האנכי חייב להיות מספר שלם.'
25} );
diff --git a/sources/plugins/image/lang/hi.js b/sources/plugins/image/lang/hi.js
new file mode 100644
index 00000000..2c0c3822
--- /dev/null
+++ b/sources/plugins/image/lang/hi.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'hi', {
6 alt: 'वैकल्पिक टेक्स्ट',
7 border: 'बॉर्डर',
8 btnUpload: 'इसे सर्वर को भेजें',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'हॉरिज़ॉन्टल स्पेस',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'तस्वीर की जानकारी',
13 linkTab: 'लिंक',
14 lockRatio: 'लॉक अनुपात',
15 menu: 'तस्वीर प्रॉपर्टीज़',
16 resetSize: 'रीसॅट साइज़',
17 title: 'तस्वीर प्रॉपर्टीज़',
18 titleButton: 'तस्वीर बटन प्रॉपर्टीज़',
19 upload: 'अपलोड',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'वर्टिकल स्पेस',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/hr.js b/sources/plugins/image/lang/hr.js
new file mode 100644
index 00000000..d4b05252
--- /dev/null
+++ b/sources/plugins/image/lang/hr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'hr', {
6 alt: 'Alternativni tekst',
7 border: 'Okvir',
8 btnUpload: 'Pošalji na server',
9 button2Img: 'Želite li promijeniti odabrani gumb u jednostavnu sliku?',
10 hSpace: 'HSpace',
11 img2Button: 'Želite li promijeniti odabranu sliku u gumb?',
12 infoTab: 'Info slike',
13 linkTab: 'Link',
14 lockRatio: 'Zaključaj odnos',
15 menu: 'Svojstva slika',
16 resetSize: 'Obriši veličinu',
17 title: 'Svojstva slika',
18 titleButton: 'Image Button svojstva',
19 upload: 'Pošalji',
20 urlMissing: 'Nedostaje URL slike.',
21 vSpace: 'VSpace',
22 validateBorder: 'Okvir mora biti cijeli broj.',
23 validateHSpace: 'HSpace mora biti cijeli broj',
24 validateVSpace: 'VSpace mora biti cijeli broj.'
25} );
diff --git a/sources/plugins/image/lang/hu.js b/sources/plugins/image/lang/hu.js
new file mode 100644
index 00000000..f615b713
--- /dev/null
+++ b/sources/plugins/image/lang/hu.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'hu', {
6 alt: 'Alternatív szöveg',
7 border: 'Keret',
8 btnUpload: 'Küldés a szerverre',
9 button2Img: 'A kiválasztott képgombból sima képet szeretne csinálni?',
10 hSpace: 'Vízsz. táv',
11 img2Button: 'A kiválasztott képből képgombot szeretne csinálni?',
12 infoTab: 'Alaptulajdonságok',
13 linkTab: 'Hivatkozás',
14 lockRatio: 'Arány megtartása',
15 menu: 'Kép tulajdonságai',
16 resetSize: 'Eredeti méret',
17 title: 'Kép tulajdonságai',
18 titleButton: 'Képgomb tulajdonságai',
19 upload: 'Feltöltés',
20 urlMissing: 'Hiányzik a kép URL-je',
21 vSpace: 'Függ. táv',
22 validateBorder: 'A keret méretének egész számot kell beírni!',
23 validateHSpace: 'Vízszintes távolságnak egész számot kell beírni!',
24 validateVSpace: 'Függőleges távolságnak egész számot kell beírni!'
25} );
diff --git a/sources/plugins/image/lang/id.js b/sources/plugins/image/lang/id.js
new file mode 100644
index 00000000..e91f4ebf
--- /dev/null
+++ b/sources/plugins/image/lang/id.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'id', {
6 alt: 'Teks alternatif',
7 border: 'Batas',
8 btnUpload: 'Kirim ke Server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'HSpace', // MISSING
11 img2Button: 'Apakah anda ingin mengubah gambar yang dipilih pada tombol gambar?',
12 infoTab: 'Info Gambar',
13 linkTab: 'Tautan',
14 lockRatio: 'Lock Ratio', // MISSING
15 menu: 'Image Properties', // MISSING
16 resetSize: 'Atur Ulang Ukuran',
17 title: 'Image Properties', // MISSING
18 titleButton: 'Image Button Properties', // MISSING
19 upload: 'Unggah',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'VSpace',
22 validateBorder: 'Border harus berupa angka',
23 validateHSpace: 'HSpace harus berupa angka',
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/is.js b/sources/plugins/image/lang/is.js
new file mode 100644
index 00000000..d4cb57d1
--- /dev/null
+++ b/sources/plugins/image/lang/is.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'is', {
6 alt: 'Baklægur texti',
7 border: 'Rammi',
8 btnUpload: 'Hlaða upp',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'Vinstri bil',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Almennt',
13 linkTab: 'Stikla',
14 lockRatio: 'Festa stærðarhlutfall',
15 menu: 'Eigindi myndar',
16 resetSize: 'Reikna stærð',
17 title: 'Eigindi myndar',
18 titleButton: 'Eigindi myndahnapps',
19 upload: 'Hlaða upp',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'Hægri bil',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/it.js b/sources/plugins/image/lang/it.js
new file mode 100644
index 00000000..24b60d39
--- /dev/null
+++ b/sources/plugins/image/lang/it.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'it', {
6 alt: 'Testo alternativo',
7 border: 'Bordo',
8 btnUpload: 'Invia al server',
9 button2Img: 'Vuoi trasformare il bottone immagine selezionato in un\'immagine semplice?',
10 hSpace: 'HSpace',
11 img2Button: 'Vuoi trasferomare l\'immagine selezionata in un bottone immagine?',
12 infoTab: 'Informazioni immagine',
13 linkTab: 'Collegamento',
14 lockRatio: 'Blocca rapporto',
15 menu: 'Proprietà immagine',
16 resetSize: 'Reimposta dimensione',
17 title: 'Proprietà immagine',
18 titleButton: 'Proprietà bottone immagine',
19 upload: 'Carica',
20 urlMissing: 'Manca l\'URL dell\'immagine.',
21 vSpace: 'VSpace',
22 validateBorder: 'Il campo Bordo deve essere un numero intero.',
23 validateHSpace: 'Il campo HSpace deve essere un numero intero.',
24 validateVSpace: 'Il campo VSpace deve essere un numero intero.'
25} );
diff --git a/sources/plugins/image/lang/ja.js b/sources/plugins/image/lang/ja.js
new file mode 100644
index 00000000..74a99fc5
--- /dev/null
+++ b/sources/plugins/image/lang/ja.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ja', {
6 alt: '代替テキスト',
7 border: '枠線の幅',
8 btnUpload: 'サーバーに送信',
9 button2Img: '選択した画像ボタンを画像に変換しますか?',
10 hSpace: '水平間隔',
11 img2Button: '選択した画像を画像ボタンに変換しますか?',
12 infoTab: '画像情報',
13 linkTab: 'リンク',
14 lockRatio: '比率を固定',
15 menu: '画像のプロパティ',
16 resetSize: 'サイズをリセット',
17 title: '画像のプロパティ',
18 titleButton: '画像ボタンのプロパティ',
19 upload: 'アップロード',
20 urlMissing: '画像のURLを入力してください。',
21 vSpace: '垂直間隔',
22 validateBorder: '枠線の幅は数値で入力してください。',
23 validateHSpace: '水平間隔は数値で入力してください。',
24 validateVSpace: '垂直間隔は数値で入力してください。'
25} );
diff --git a/sources/plugins/image/lang/ka.js b/sources/plugins/image/lang/ka.js
new file mode 100644
index 00000000..d388c5a3
--- /dev/null
+++ b/sources/plugins/image/lang/ka.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ka', {
6 alt: 'სანაცვლო ტექსტი',
7 border: 'ჩარჩო',
8 btnUpload: 'სერვერისთვის გაგზავნა',
9 button2Img: 'გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?',
10 hSpace: 'ჰორიზონტალური სივრცე',
11 img2Button: 'გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?',
12 infoTab: 'სურათის ინფორმცია',
13 linkTab: 'ბმული',
14 lockRatio: 'პროპორციის შენარჩუნება',
15 menu: 'სურათის პარამეტრები',
16 resetSize: 'ზომის დაბრუნება',
17 title: 'სურათის პარამეტრები',
18 titleButton: 'სურათიანი ღილაკის პარამეტრები',
19 upload: 'ატვირთვა',
20 urlMissing: 'სურათის URL არაა შევსებული.',
21 vSpace: 'ვერტიკალური სივრცე',
22 validateBorder: 'ჩარჩო მთელი რიცხვი უნდა იყოს.',
23 validateHSpace: 'ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.',
24 validateVSpace: 'ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს.'
25} );
diff --git a/sources/plugins/image/lang/km.js b/sources/plugins/image/lang/km.js
new file mode 100644
index 00000000..12eb6d27
--- /dev/null
+++ b/sources/plugins/image/lang/km.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'km', {
6 alt: 'អត្ថបទជំនួស',
7 border: 'ស៊ុម',
8 btnUpload: 'ផ្ញើ​ទៅ​ម៉ាស៊ីន​បម្រើ',
9 button2Img: 'តើ​អ្នក​ចង់​ផ្លាស់​ប្ដូរ​ប៊ូតុង​រូបភាព​ដែល​បាន​ជ្រើស នៅ​លើ​រូបភាព​ធម្មតា​មួយ​មែនទេ?',
10 hSpace: 'គម្លាត​ផ្ដេក',
11 img2Button: 'តើ​អ្នក​ចង់​ផ្លាស់​ប្ដូរ​រូបភាព​ដែល​បាន​ជ្រើស នៅ​លើ​ប៊ូតុង​រូបភាព​មែនទេ?',
12 infoTab: 'ពត៌មានអំពីរូបភាព',
13 linkTab: 'តំណ',
14 lockRatio: 'ចាក់​សោ​ផល​ធៀប',
15 menu: 'លក្ខណៈ​រូបភាព',
16 resetSize: 'កំណត់ទំហំឡើងវិញ',
17 title: 'លក្ខណៈ​រូបភាព',
18 titleButton: 'លក្ខណៈ​ប៊ូតុង​រូបភាព',
19 upload: 'ផ្ទុកឡើង',
20 urlMissing: 'ខ្វះ URL ប្រភព​រូប​ភាព។',
21 vSpace: 'គម្លាត​បញ្ឈរ',
22 validateBorder: 'ស៊ុម​ត្រូវ​តែ​ជា​លេខ។',
23 validateHSpace: 'គម្លាត​ផ្ដេក​ត្រូវ​តែ​ជា​លេខ។',
24 validateVSpace: 'គម្លាត​បញ្ឈរ​ត្រូវ​តែ​ជា​លេខ។'
25} );
diff --git a/sources/plugins/image/lang/ko.js b/sources/plugins/image/lang/ko.js
new file mode 100644
index 00000000..0bb99907
--- /dev/null
+++ b/sources/plugins/image/lang/ko.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ko', {
6 alt: '대체 문자열',
7 border: '테두리',
8 btnUpload: '서버로 전송',
9 button2Img: '단순 이미지에서 선택한 이미지 버튼을 변환하시겠습니까?',
10 hSpace: '가로 여백',
11 img2Button: '이미지 버튼에 선택한 이미지를 변환하시겠습니까?',
12 infoTab: '이미지 정보',
13 linkTab: '링크',
14 lockRatio: '비율 유지',
15 menu: '이미지 속성',
16 resetSize: '원래 크기로',
17 title: '이미지 속성',
18 titleButton: '이미지 버튼 속성',
19 upload: '업로드',
20 urlMissing: '이미지 원본 주소(URL)가 없습니다.',
21 vSpace: '세로 여백',
22 validateBorder: '테두리 두께는 정수여야 합니다.',
23 validateHSpace: '가로 길이는 정수여야 합니다.',
24 validateVSpace: '세로 길이는 정수여야 합니다.'
25} );
diff --git a/sources/plugins/image/lang/ku.js b/sources/plugins/image/lang/ku.js
new file mode 100644
index 00000000..5273fc56
--- /dev/null
+++ b/sources/plugins/image/lang/ku.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ku', {
6 alt: 'جێگرەوەی دەق',
7 border: 'پەراوێز',
8 btnUpload: 'ناردنی بۆ ڕاژه',
9 button2Img: 'تۆ دەتەوێت دوگمەی وێنەی دیاریکراو بگۆڕیت بۆ وێنەیەکی ئاسایی؟',
10 hSpace: 'بۆشایی ئاسۆیی',
11 img2Button: 'تۆ دەتەوێت وێنەی دیاریکراو بگۆڕیت بۆ دوگمەی وێنه؟',
12 infoTab: 'زانیاری وێنه',
13 linkTab: 'بەستەر',
14 lockRatio: 'داخستنی ڕێژه',
15 menu: 'خاسیەتی وێنه',
16 resetSize: 'ڕێکخستنەوەی قەباره',
17 title: 'خاسیەتی وێنه',
18 titleButton: 'خاسیەتی دوگمەی وێنه',
19 upload: 'بارکردن',
20 urlMissing: 'سەرچاوەی بەستەری وێنه بزره',
21 vSpace: 'بۆشایی ئەستونی',
22 validateBorder: 'پەراوێز دەبێت بەتەواوی تەنها ژماره بێت.',
23 validateHSpace: 'بۆشایی ئاسۆیی دەبێت بەتەواوی تەنها ژمارە بێت.',
24 validateVSpace: 'بۆشایی ئەستونی دەبێت بەتەواوی تەنها ژماره بێت.'
25} );
diff --git a/sources/plugins/image/lang/lt.js b/sources/plugins/image/lang/lt.js
new file mode 100644
index 00000000..55f24281
--- /dev/null
+++ b/sources/plugins/image/lang/lt.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'lt', {
6 alt: 'Alternatyvus Tekstas',
7 border: 'Rėmelis',
8 btnUpload: 'Siųsti į serverį',
9 button2Img: 'Ar norite mygtuką paversti paprastu paveiksliuku?',
10 hSpace: 'Hor.Erdvė',
11 img2Button: 'Ar norite paveiksliuką paversti mygtuku?',
12 infoTab: 'Vaizdo informacija',
13 linkTab: 'Nuoroda',
14 lockRatio: 'Išlaikyti proporciją',
15 menu: 'Vaizdo savybės',
16 resetSize: 'Atstatyti dydį',
17 title: 'Vaizdo savybės',
18 titleButton: 'Vaizdinio mygtuko savybės',
19 upload: 'Nusiųsti',
20 urlMissing: 'Paveiksliuko nuorodos nėra.',
21 vSpace: 'Vert.Erdvė',
22 validateBorder: 'Reikšmė turi būti sveikas skaičius.',
23 validateHSpace: 'Reikšmė turi būti sveikas skaičius.',
24 validateVSpace: 'Reikšmė turi būti sveikas skaičius.'
25} );
diff --git a/sources/plugins/image/lang/lv.js b/sources/plugins/image/lang/lv.js
new file mode 100644
index 00000000..8b962442
--- /dev/null
+++ b/sources/plugins/image/lang/lv.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'lv', {
6 alt: 'Alternatīvais teksts',
7 border: 'Rāmis',
8 btnUpload: 'Nosūtīt serverim',
9 button2Img: 'Vai vēlaties pārveidot izvēlēto attēla pogu uz attēla?',
10 hSpace: 'Horizontālā telpa',
11 img2Button: 'Vai vēlaties pārveidot izvēlēto attēlu uz attēla pogas?',
12 infoTab: 'Informācija par attēlu',
13 linkTab: 'Hipersaite',
14 lockRatio: 'Nemainīga Augstuma/Platuma attiecība',
15 menu: 'Attēla īpašības',
16 resetSize: 'Atjaunot sākotnējo izmēru',
17 title: 'Attēla īpašības',
18 titleButton: 'Attēlpogas īpašības',
19 upload: 'Augšupielādēt',
20 urlMissing: 'Trūkst attēla atrašanās adrese.',
21 vSpace: 'Vertikālā telpa',
22 validateBorder: 'Apmalei jābūt veselam skaitlim',
23 validateHSpace: 'HSpace jābūt veselam skaitlim',
24 validateVSpace: 'VSpace jābūt veselam skaitlim'
25} );
diff --git a/sources/plugins/image/lang/mk.js b/sources/plugins/image/lang/mk.js
new file mode 100644
index 00000000..bfd943e8
--- /dev/null
+++ b/sources/plugins/image/lang/mk.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'mk', {
6 alt: 'Alternative Text', // MISSING
7 border: 'Border', // MISSING
8 btnUpload: 'Send it to the Server', // MISSING
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'HSpace', // MISSING
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Image Info', // MISSING
13 linkTab: 'Link', // MISSING
14 lockRatio: 'Lock Ratio', // MISSING
15 menu: 'Image Properties', // MISSING
16 resetSize: 'Reset Size', // MISSING
17 title: 'Image Properties', // MISSING
18 titleButton: 'Image Button Properties', // MISSING
19 upload: 'Upload', // MISSING
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'VSpace', // MISSING
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/mn.js b/sources/plugins/image/lang/mn.js
new file mode 100644
index 00000000..79950e41
--- /dev/null
+++ b/sources/plugins/image/lang/mn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'mn', {
6 alt: 'Зургийг орлох бичвэр',
7 border: 'Хүрээ',
8 btnUpload: 'Үүнийг сервэррүү илгээ',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'Хөндлөн зай',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Зурагны мэдээлэл',
13 linkTab: 'Холбоос',
14 lockRatio: 'Радио түгжих',
15 menu: 'Зураг',
16 resetSize: 'хэмжээ дахин оноох',
17 title: 'Зураг',
18 titleButton: 'Зурган товчны шинж чанар',
19 upload: 'Хуулах',
20 urlMissing: 'Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.',
21 vSpace: 'Босоо зай',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/ms.js b/sources/plugins/image/lang/ms.js
new file mode 100644
index 00000000..ae67d22a
--- /dev/null
+++ b/sources/plugins/image/lang/ms.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ms', {
6 alt: 'Text Alternatif',
7 border: 'Border',
8 btnUpload: 'Hantar ke Server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'Ruang Melintang',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Info Imej',
13 linkTab: 'Sambungan',
14 lockRatio: 'Tetapkan Nisbah',
15 menu: 'Ciri-ciri Imej',
16 resetSize: 'Saiz Set Semula',
17 title: 'Ciri-ciri Imej',
18 titleButton: 'Ciri-ciri Butang Bergambar',
19 upload: 'Muat Naik',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'Ruang Menegak',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/nb.js b/sources/plugins/image/lang/nb.js
new file mode 100644
index 00000000..24eb3e08
--- /dev/null
+++ b/sources/plugins/image/lang/nb.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'nb', {
6 alt: 'Alternativ tekst',
7 border: 'Ramme',
8 btnUpload: 'Send det til serveren',
9 button2Img: 'Vil du endre den valgte bildeknappen til et vanlig bilde?',
10 hSpace: 'HMarg',
11 img2Button: 'Vil du endre det valgte bildet til en bildeknapp?',
12 infoTab: 'Bildeinformasjon',
13 linkTab: 'Lenke',
14 lockRatio: 'Lås forhold',
15 menu: 'Bildeegenskaper',
16 resetSize: 'Tilbakestill størrelse',
17 title: 'Bildeegenskaper',
18 titleButton: 'Egenskaper for bildeknapp',
19 upload: 'Last opp',
20 urlMissing: 'Bildets adresse mangler.',
21 vSpace: 'VMarg',
22 validateBorder: 'Ramme må være et heltall.',
23 validateHSpace: 'HMarg må være et heltall.',
24 validateVSpace: 'VMarg må være et heltall.'
25} );
diff --git a/sources/plugins/image/lang/nl.js b/sources/plugins/image/lang/nl.js
new file mode 100644
index 00000000..6636f1b1
--- /dev/null
+++ b/sources/plugins/image/lang/nl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'nl', {
6 alt: 'Alternatieve tekst',
7 border: 'Rand',
8 btnUpload: 'Naar server verzenden',
9 button2Img: 'Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?',
10 hSpace: 'HSpace',
11 img2Button: 'Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?',
12 infoTab: 'Informatie afbeelding',
13 linkTab: 'Link',
14 lockRatio: 'Afmetingen vergrendelen',
15 menu: 'Eigenschappen afbeelding',
16 resetSize: 'Afmetingen resetten',
17 title: 'Eigenschappen afbeelding',
18 titleButton: 'Eigenschappen afbeeldingsknop',
19 upload: 'Upload',
20 urlMissing: 'De URL naar de afbeelding ontbreekt.',
21 vSpace: 'VSpace',
22 validateBorder: 'Rand moet een heel nummer zijn.',
23 validateHSpace: 'HSpace moet een heel nummer zijn.',
24 validateVSpace: 'VSpace moet een heel nummer zijn.'
25} );
diff --git a/sources/plugins/image/lang/no.js b/sources/plugins/image/lang/no.js
new file mode 100644
index 00000000..c48abaec
--- /dev/null
+++ b/sources/plugins/image/lang/no.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'no', {
6 alt: 'Alternativ tekst',
7 border: 'Ramme',
8 btnUpload: 'Send det til serveren',
9 button2Img: 'Vil du endre den valgte bildeknappen til et vanlig bilde?',
10 hSpace: 'HMarg',
11 img2Button: 'Vil du endre det valgte bildet til en bildeknapp?',
12 infoTab: 'Bildeinformasjon',
13 linkTab: 'Lenke',
14 lockRatio: 'Lås forhold',
15 menu: 'Bildeegenskaper',
16 resetSize: 'Tilbakestill størrelse',
17 title: 'Bildeegenskaper',
18 titleButton: 'Egenskaper for bildeknapp',
19 upload: 'Last opp',
20 urlMissing: 'Bildets adresse mangler.',
21 vSpace: 'VMarg',
22 validateBorder: 'Ramme må være et heltall.',
23 validateHSpace: 'HMarg må være et heltall.',
24 validateVSpace: 'VMarg må være et heltall.'
25} );
diff --git a/sources/plugins/image/lang/pl.js b/sources/plugins/image/lang/pl.js
new file mode 100644
index 00000000..04c02956
--- /dev/null
+++ b/sources/plugins/image/lang/pl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'pl', {
6 alt: 'Tekst zastępczy',
7 border: 'Obramowanie',
8 btnUpload: 'Wyślij',
9 button2Img: 'Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?',
10 hSpace: 'Odstęp poziomy',
11 img2Button: 'Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?',
12 infoTab: 'Informacje o obrazku',
13 linkTab: 'Hiperłącze',
14 lockRatio: 'Zablokuj proporcje',
15 menu: 'Właściwości obrazka',
16 resetSize: 'Przywróć rozmiar',
17 title: 'Właściwości obrazka',
18 titleButton: 'Właściwości przycisku graficznego',
19 upload: 'Wyślij',
20 urlMissing: 'Podaj adres URL obrazka.',
21 vSpace: 'Odstęp pionowy',
22 validateBorder: 'Wartość obramowania musi być liczbą całkowitą.',
23 validateHSpace: 'Wartość odstępu poziomego musi być liczbą całkowitą.',
24 validateVSpace: 'Wartość odstępu pionowego musi być liczbą całkowitą.'
25} );
diff --git a/sources/plugins/image/lang/pt-br.js b/sources/plugins/image/lang/pt-br.js
new file mode 100644
index 00000000..eeb0b14c
--- /dev/null
+++ b/sources/plugins/image/lang/pt-br.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'pt-br', {
6 alt: 'Texto Alternativo',
7 border: 'Borda',
8 btnUpload: 'Enviar para o Servidor',
9 button2Img: 'Deseja transformar o botão de imagem em uma imagem comum?',
10 hSpace: 'HSpace',
11 img2Button: 'Deseja transformar a imagem em um botão de imagem?',
12 infoTab: 'Informações da Imagem',
13 linkTab: 'Link',
14 lockRatio: 'Travar Proporções',
15 menu: 'Formatar Imagem',
16 resetSize: 'Redefinir para o Tamanho Original',
17 title: 'Formatar Imagem',
18 titleButton: 'Formatar Botão de Imagem',
19 upload: 'Enviar',
20 urlMissing: 'URL da imagem está faltando.',
21 vSpace: 'VSpace',
22 validateBorder: 'A borda deve ser um número inteiro.',
23 validateHSpace: 'O HSpace deve ser um número inteiro.',
24 validateVSpace: 'O VSpace deve ser um número inteiro.'
25} );
diff --git a/sources/plugins/image/lang/pt.js b/sources/plugins/image/lang/pt.js
new file mode 100644
index 00000000..af25caaa
--- /dev/null
+++ b/sources/plugins/image/lang/pt.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'pt', {
6 alt: 'Texto Alternativo',
7 border: 'Limite',
8 btnUpload: 'Enviar para o servidor',
9 button2Img: 'Deseja transformar o botão com imagem selecionado em uma imagem?',
10 hSpace: 'Esp.Horiz',
11 img2Button: 'Deseja transformar a imagem selecionada em um botão com imagem?',
12 infoTab: 'Informação da Imagem',
13 linkTab: 'Hiperligação',
14 lockRatio: 'Proporcional',
15 menu: 'Propriedades da Imagem',
16 resetSize: 'Tamanho Original',
17 title: 'Propriedades da Imagem',
18 titleButton: 'Propriedades do Botão de imagens',
19 upload: 'Carregar',
20 urlMissing: 'O URL da fonte da imagem está em falta.',
21 vSpace: 'Esp.Vert',
22 validateBorder: 'A borda tem de ser um numero.',
23 validateHSpace: 'HSpace tem de ser um numero.',
24 validateVSpace: 'VSpace tem de ser um numero.'
25} );
diff --git a/sources/plugins/image/lang/ro.js b/sources/plugins/image/lang/ro.js
new file mode 100644
index 00000000..79a2a9dc
--- /dev/null
+++ b/sources/plugins/image/lang/ro.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ro', {
6 alt: 'Text alternativ',
7 border: 'Margine',
8 btnUpload: 'Trimite la server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Informaţii despre imagine',
13 linkTab: 'Link (Legătură web)',
14 lockRatio: 'Păstrează proporţiile',
15 menu: 'Proprietăţile imaginii',
16 resetSize: 'Resetează mărimea',
17 title: 'Proprietăţile imaginii',
18 titleButton: 'Proprietăţi buton imagine (Image Button)',
19 upload: 'Încarcă',
20 urlMissing: 'Sursa URL a imaginii lipsește.',
21 vSpace: 'VSpace',
22 validateBorder: 'Bordura trebuie să fie un număr întreg.',
23 validateHSpace: 'Hspace trebuie să fie un număr întreg.',
24 validateVSpace: 'Vspace trebuie să fie un număr întreg.'
25} );
diff --git a/sources/plugins/image/lang/ru.js b/sources/plugins/image/lang/ru.js
new file mode 100644
index 00000000..490af92d
--- /dev/null
+++ b/sources/plugins/image/lang/ru.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ru', {
6 alt: 'Альтернативный текст',
7 border: 'Граница',
8 btnUpload: 'Загрузить на сервер',
9 button2Img: 'Вы желаете преобразовать это изображение-кнопку в обычное изображение?',
10 hSpace: 'Гориз. отступ',
11 img2Button: 'Вы желаете преобразовать это обычное изображение в изображение-кнопку?',
12 infoTab: 'Данные об изображении',
13 linkTab: 'Ссылка',
14 lockRatio: 'Сохранять пропорции',
15 menu: 'Свойства изображения',
16 resetSize: 'Вернуть обычные размеры',
17 title: 'Свойства изображения',
18 titleButton: 'Свойства изображения-кнопки',
19 upload: 'Загрузить',
20 urlMissing: 'Не указана ссылка на изображение.',
21 vSpace: 'Вертик. отступ',
22 validateBorder: 'Размер границ должен быть задан числом.',
23 validateHSpace: 'Горизонтальный отступ должен быть задан числом.',
24 validateVSpace: 'Вертикальный отступ должен быть задан числом.'
25} );
diff --git a/sources/plugins/image/lang/si.js b/sources/plugins/image/lang/si.js
new file mode 100644
index 00000000..9c608a3f
--- /dev/null
+++ b/sources/plugins/image/lang/si.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'si', {
6 alt: 'විකල්ප ',
7 border: 'සීමාවවල ',
8 btnUpload: 'සේවාදායකය වෙත යොමුකිරිම',
9 button2Img: 'ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්‍යද?',
10 hSpace: 'HSpace',
11 img2Button: 'ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්‍යද?',
12 infoTab: 'රුපයේ තොරතුරු',
13 linkTab: 'සබැඳිය',
14 lockRatio: 'නවතන අනුපාතය ',
15 menu: 'රුපයේ ගුණ',
16 resetSize: 'නැවතත් විශාලත්වය වෙනස් කිරීම',
17 title: 'රුපයේ ',
18 titleButton: 'රුප බොත්තමේ ගුණ',
19 upload: 'උඩුගතකිරීම',
20 urlMissing: 'රුප මුලාශ්‍ර URL නැත.',
21 vSpace: 'VSpace',
22 validateBorder: 'මාඉම් සම්පුර්ණ සංක්‍යාවක් විය යුතුය.',
23 validateHSpace: 'HSpace සම්පුර්ණ සංක්‍යාවක් විය යුතුය',
24 validateVSpace: 'VSpace සම්පුර්ණ සංක්‍යාවක් විය යුතුය.'
25} );
diff --git a/sources/plugins/image/lang/sk.js b/sources/plugins/image/lang/sk.js
new file mode 100644
index 00000000..0478ab39
--- /dev/null
+++ b/sources/plugins/image/lang/sk.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'sk', {
6 alt: 'Alternatívny text',
7 border: 'Rám (border)',
8 btnUpload: 'Odoslať to na server',
9 button2Img: 'Chcete zmeniť vybrané obrázkové tlačidlo na jednoduchý obrázok?',
10 hSpace: 'H-medzera',
11 img2Button: 'Chcete zmeniť vybraný obrázok na obrázkové tlačidlo?',
12 infoTab: 'Informácie o obrázku',
13 linkTab: 'Odkaz',
14 lockRatio: 'Pomer zámky',
15 menu: 'Vlastnosti obrázka',
16 resetSize: 'Pôvodná veľkosť',
17 title: 'Vlastnosti obrázka',
18 titleButton: 'Vlastnosti obrázkového tlačidla',
19 upload: 'Nahrať',
20 urlMissing: 'Chýba URL zdroja obrázka.',
21 vSpace: 'V-medzera',
22 validateBorder: 'Rám (border) musí byť celé číslo.',
23 validateHSpace: 'H-medzera musí byť celé číslo.',
24 validateVSpace: 'V-medzera musí byť celé číslo.'
25} );
diff --git a/sources/plugins/image/lang/sl.js b/sources/plugins/image/lang/sl.js
new file mode 100644
index 00000000..ef93d331
--- /dev/null
+++ b/sources/plugins/image/lang/sl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'sl', {
6 alt: 'Nadomestno besedilo',
7 border: 'Obroba',
8 btnUpload: 'Pošlji na strežnik',
9 button2Img: 'Želiš pretvoriti izbrani gumb s sliko v preprosto sliko?',
10 hSpace: 'Vodoravni razmik',
11 img2Button: 'Želiš pretvoriti izbrano sliko v gumb s sliko?',
12 infoTab: 'Podatki o sliki',
13 linkTab: 'Povezava',
14 lockRatio: 'Zakleni razmerje',
15 menu: 'Lastnosti slike',
16 resetSize: 'Ponastavi velikost',
17 title: 'Lastnosti slike',
18 titleButton: 'Lastnosti gumba s sliko',
19 upload: 'Pošlji',
20 urlMissing: 'Manjka vir (URL) slike.',
21 vSpace: 'Navpični razmik',
22 validateBorder: 'Meja mora biti celo število.',
23 validateHSpace: 'HSpace mora biti celo število.',
24 validateVSpace: 'VSpace mora biti celo število.'
25} );
diff --git a/sources/plugins/image/lang/sq.js b/sources/plugins/image/lang/sq.js
new file mode 100644
index 00000000..37a3e155
--- /dev/null
+++ b/sources/plugins/image/lang/sq.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'sq', {
6 alt: 'Tekst Alternativ',
7 border: 'Korniza',
8 btnUpload: 'Dërgo në server',
9 button2Img: 'Dëshironi të e ndërroni pullën e fotos së selektuar në një foto të thjeshtë?',
10 hSpace: 'HSpace',
11 img2Button: 'Dëshironi të ndryshoni foton e përzgjedhur në pullë?',
12 infoTab: 'Informacione mbi Fotografinë',
13 linkTab: 'Nyja',
14 lockRatio: 'Mbyll Racionin',
15 menu: 'Karakteristikat e Fotografisë',
16 resetSize: 'Rikthe Madhësinë',
17 title: 'Karakteristikat e Fotografisë',
18 titleButton: 'Karakteristikat e Pullës së Fotografisë',
19 upload: 'Ngarko',
20 urlMissing: 'Mungon URL e burimit të fotografisë.',
21 vSpace: 'Hapësira Vertikale',
22 validateBorder: 'Korniza duhet të jetë numër i plotë.',
23 validateHSpace: 'Hapësira horizontale duhet të jetë numër i plotë.',
24 validateVSpace: 'Hapësira vertikale duhet të jetë numër i plotë.'
25} );
diff --git a/sources/plugins/image/lang/sr-latn.js b/sources/plugins/image/lang/sr-latn.js
new file mode 100644
index 00000000..34b96210
--- /dev/null
+++ b/sources/plugins/image/lang/sr-latn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'sr-latn', {
6 alt: 'Alternativni tekst',
7 border: 'Okvir',
8 btnUpload: 'Pošalji na server',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'HSpace',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Info slike',
13 linkTab: 'Link',
14 lockRatio: 'Zaključaj odnos',
15 menu: 'Osobine slika',
16 resetSize: 'Resetuj veličinu',
17 title: 'Osobine slika',
18 titleButton: 'Osobine dugmeta sa slikom',
19 upload: 'Pošalji',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'VSpace',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/sr.js b/sources/plugins/image/lang/sr.js
new file mode 100644
index 00000000..5f33a561
--- /dev/null
+++ b/sources/plugins/image/lang/sr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'sr', {
6 alt: 'Алтернативни текст',
7 border: 'Оквир',
8 btnUpload: 'Пошаљи на сервер',
9 button2Img: 'Да ли желите да промените одабрану слику дугмета као једноставну слику?',
10 hSpace: 'HSpace',
11 img2Button: 'Да ли желите да промените одабрану слику у слику дугмета?',
12 infoTab: 'Инфо слике',
13 linkTab: 'Линк',
14 lockRatio: 'Закључај однос',
15 menu: 'Особине слика',
16 resetSize: 'Ресетуј величину',
17 title: 'Особине слика',
18 titleButton: 'Особине дугмета са сликом',
19 upload: 'Пошаљи',
20 urlMissing: 'Недостаје УРЛ слике.',
21 vSpace: 'VSpace',
22 validateBorder: 'Ивица треба да буде цифра.',
23 validateHSpace: 'HSpace треба да буде цифра.',
24 validateVSpace: 'VSpace треба да буде цифра.'
25} );
diff --git a/sources/plugins/image/lang/sv.js b/sources/plugins/image/lang/sv.js
new file mode 100644
index 00000000..3854a3d6
--- /dev/null
+++ b/sources/plugins/image/lang/sv.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'sv', {
6 alt: 'Alternativ text',
7 border: 'Kant',
8 btnUpload: 'Skicka till server',
9 button2Img: 'Vill du omvandla den valda bildknappen på en enkel bild?',
10 hSpace: 'Horis. marginal',
11 img2Button: 'Vill du omvandla den valda bildknappen på en enkel bild?',
12 infoTab: 'Bildinformation',
13 linkTab: 'Länk',
14 lockRatio: 'Lås höjd/bredd förhållanden',
15 menu: 'Bildegenskaper',
16 resetSize: 'Återställ storlek',
17 title: 'Bildegenskaper',
18 titleButton: 'Egenskaper för bildknapp',
19 upload: 'Ladda upp',
20 urlMissing: 'Bildkällans URL saknas.',
21 vSpace: 'Vert. marginal',
22 validateBorder: 'Kantlinje måste vara ett heltal.',
23 validateHSpace: 'HSpace måste vara ett heltal.',
24 validateVSpace: 'VSpace måste vara ett heltal.'
25} );
diff --git a/sources/plugins/image/lang/th.js b/sources/plugins/image/lang/th.js
new file mode 100644
index 00000000..0018a713
--- /dev/null
+++ b/sources/plugins/image/lang/th.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'th', {
6 alt: 'คำประกอบรูปภาพ',
7 border: 'ขนาดขอบรูป',
8 btnUpload: 'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'ระยะแนวนอน',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'ข้อมูลของรูปภาพ',
13 linkTab: 'ลิ้งค์',
14 lockRatio: 'กำหนดอัตราส่วน กว้าง-สูง แบบคงที่',
15 menu: 'คุณสมบัติของ รูปภาพ',
16 resetSize: 'กำหนดรูปเท่าขนาดจริง',
17 title: 'คุณสมบัติของ รูปภาพ',
18 titleButton: 'คุณสมบัติของ ปุ่มแบบรูปภาพ',
19 upload: 'อัพโหลดไฟล์',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'ระยะแนวตั้ง',
22 validateBorder: 'Border must be a whole number.', // MISSING
23 validateHSpace: 'HSpace must be a whole number.', // MISSING
24 validateVSpace: 'VSpace must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/image/lang/tr.js b/sources/plugins/image/lang/tr.js
new file mode 100644
index 00000000..3c294a1e
--- /dev/null
+++ b/sources/plugins/image/lang/tr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'tr', {
6 alt: 'Alternatif Yazı',
7 border: 'Kenar',
8 btnUpload: 'Sunucuya Yolla',
9 button2Img: 'Seçili resim butonunu basit resime çevirmek istermisiniz?',
10 hSpace: 'Yatay Boşluk',
11 img2Button: 'Seçili olan resimi, resimli butona çevirmek istermisiniz?',
12 infoTab: 'Resim Bilgisi',
13 linkTab: 'Köprü',
14 lockRatio: 'Oranı Kilitle',
15 menu: 'Resim Özellikleri',
16 resetSize: 'Boyutu Başa Döndür',
17 title: 'Resim Özellikleri',
18 titleButton: 'Resimli Düğme Özellikleri',
19 upload: 'Karşıya Yükle',
20 urlMissing: 'Resmin URL kaynağı eksiktir.',
21 vSpace: 'Dikey Boşluk',
22 validateBorder: 'Çerçeve tam sayı olmalıdır.',
23 validateHSpace: 'HSpace tam sayı olmalıdır.',
24 validateVSpace: 'VSpace tam sayı olmalıdır.'
25} );
diff --git a/sources/plugins/image/lang/tt.js b/sources/plugins/image/lang/tt.js
new file mode 100644
index 00000000..5e9ec8d5
--- /dev/null
+++ b/sources/plugins/image/lang/tt.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'tt', {
6 alt: 'Альтернатив текст',
7 border: 'Чик',
8 btnUpload: 'Серверга җибәрү',
9 button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
10 hSpace: 'Горизонталь ара',
11 img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
12 infoTab: 'Рәсем тасвирламасы',
13 linkTab: 'Сылталама',
14 lockRatio: 'Lock Ratio', // MISSING
15 menu: 'Рәсем үзлекләре',
16 resetSize: 'Баштагы зурлык',
17 title: 'Рәсем үзлекләре',
18 titleButton: 'Рәсемле төймə үзлекләре',
19 upload: 'Йөкләү',
20 urlMissing: 'Image source URL is missing.', // MISSING
21 vSpace: 'Вертикаль ара',
22 validateBorder: 'Чик киңлеге сан булырга тиеш.',
23 validateHSpace: 'Горизонталь ара бөтен сан булырга тиеш.',
24 validateVSpace: 'Вертикаль ара бөтен сан булырга тиеш.'
25} );
diff --git a/sources/plugins/image/lang/ug.js b/sources/plugins/image/lang/ug.js
new file mode 100644
index 00000000..c96889bd
--- /dev/null
+++ b/sources/plugins/image/lang/ug.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'ug', {
6 alt: 'تېكىست ئالماشتۇر',
7 border: 'گىرۋەك چوڭلۇقى',
8 btnUpload: 'مۇلازىمېتىرغا يۈكلە',
9 button2Img: 'نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟',
10 hSpace: 'توغرىسىغا ئارىلىقى',
11 img2Button: 'نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟',
12 infoTab: 'سۈرەت',
13 linkTab: 'ئۇلانما',
14 lockRatio: 'نىسبەتنى قۇلۇپلا',
15 menu: 'سۈرەت خاسلىقى',
16 resetSize: 'ئەسلى چوڭلۇق',
17 title: 'سۈرەت خاسلىقى',
18 titleButton: 'سۈرەت دائىرە خاسلىقى',
19 upload: 'يۈكلە',
20 urlMissing: 'سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم',
21 vSpace: 'بويىغا ئارىلىقى',
22 validateBorder: 'گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ',
23 validateHSpace: 'توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ',
24 validateVSpace: 'بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ'
25} );
diff --git a/sources/plugins/image/lang/uk.js b/sources/plugins/image/lang/uk.js
new file mode 100644
index 00000000..6f6215c6
--- /dev/null
+++ b/sources/plugins/image/lang/uk.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'uk', {
6 alt: 'Альтернативний текст',
7 border: 'Рамка',
8 btnUpload: 'Надіслати на сервер',
9 button2Img: 'Бажаєте перетворити обрану кнопку-зображення на просте зображення?',
10 hSpace: 'Гориз. відступ',
11 img2Button: 'Бажаєте перетворити обране зображення на кнопку-зображення?',
12 infoTab: 'Інформація про зображення',
13 linkTab: 'Посилання',
14 lockRatio: 'Зберегти пропорції',
15 menu: 'Властивості зображення',
16 resetSize: 'Очистити поля розмірів',
17 title: 'Властивості зображення',
18 titleButton: 'Властивості кнопки із зображенням',
19 upload: 'Надіслати',
20 urlMissing: 'Вкажіть URL зображення.',
21 vSpace: 'Верт. відступ',
22 validateBorder: 'Ширина рамки повинна бути цілим числом.',
23 validateHSpace: 'Гориз. відступ повинен бути цілим числом.',
24 validateVSpace: 'Верт. відступ повинен бути цілим числом.'
25} );
diff --git a/sources/plugins/image/lang/vi.js b/sources/plugins/image/lang/vi.js
new file mode 100644
index 00000000..bcc93633
--- /dev/null
+++ b/sources/plugins/image/lang/vi.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'vi', {
6 alt: 'Chú thích ảnh',
7 border: 'Đường viền',
8 btnUpload: 'Tải lên máy chủ',
9 button2Img: 'Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?',
10 hSpace: 'Khoảng đệm ngang',
11 img2Button: 'Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?',
12 infoTab: 'Thông tin của ảnh',
13 linkTab: 'Tab liên kết',
14 lockRatio: 'Giữ nguyên tỷ lệ',
15 menu: 'Thuộc tính của ảnh',
16 resetSize: 'Kích thước gốc',
17 title: 'Thuộc tính của ảnh',
18 titleButton: 'Thuộc tính nút của ảnh',
19 upload: 'Tải lên',
20 urlMissing: 'Thiếu đường dẫn hình ảnh',
21 vSpace: 'Khoảng đệm dọc',
22 validateBorder: 'Chiều rộng của đường viền phải là một số nguyên dương',
23 validateHSpace: 'Khoảng đệm ngang phải là một số nguyên dương',
24 validateVSpace: 'Khoảng đệm dọc phải là một số nguyên dương'
25} );
diff --git a/sources/plugins/image/lang/zh-cn.js b/sources/plugins/image/lang/zh-cn.js
new file mode 100644
index 00000000..64813fc1
--- /dev/null
+++ b/sources/plugins/image/lang/zh-cn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'zh-cn', {
6 alt: '替换文本',
7 border: '边框大小',
8 btnUpload: '上传到服务器',
9 button2Img: '确定要把当前图像按钮转换为普通图像吗?',
10 hSpace: '水平间距',
11 img2Button: '确定要把当前图像改变为图像按钮吗?',
12 infoTab: '图像信息',
13 linkTab: '链接',
14 lockRatio: '锁定比例',
15 menu: '图像属性',
16 resetSize: '原始尺寸',
17 title: '图像属性',
18 titleButton: '图像域属性',
19 upload: '上传',
20 urlMissing: '缺少图像源文件地址',
21 vSpace: '垂直间距',
22 validateBorder: '边框大小必须为整数格式',
23 validateHSpace: '水平间距必须为整数格式',
24 validateVSpace: '垂直间距必须为整数格式'
25} );
diff --git a/sources/plugins/image/lang/zh.js b/sources/plugins/image/lang/zh.js
new file mode 100644
index 00000000..4bdbba5d
--- /dev/null
+++ b/sources/plugins/image/lang/zh.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'image', 'zh', {
6 alt: '替代文字',
7 border: '框線',
8 btnUpload: '傳送到伺服器',
9 button2Img: '請問您確定要將「圖片按鈕」轉換成「圖片」嗎?',
10 hSpace: 'HSpace',
11 img2Button: '請問您確定要將「圖片」轉換成「圖片按鈕」嗎?',
12 infoTab: '影像資訊',
13 linkTab: '連結',
14 lockRatio: '固定比例',
15 menu: '影像屬性',
16 resetSize: '重設大小',
17 title: '影像屬性',
18 titleButton: '影像按鈕屬性',
19 upload: '上傳',
20 urlMissing: '遺失圖片來源之 URL ',
21 vSpace: 'VSpace',
22 validateBorder: '框線必須是整數。',
23 validateHSpace: 'HSpace 必須是整數。',
24 validateVSpace: 'VSpace 必須是整數。'
25} );
diff --git a/sources/plugins/image/plugin.js b/sources/plugins/image/plugin.js
new file mode 100644
index 00000000..f4a6a334
--- /dev/null
+++ b/sources/plugins/image/plugin.js
@@ -0,0 +1,183 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The Image plugin.
8 */
9
10( function() {
11
12 CKEDITOR.plugins.add( 'image', {
13 requires: 'dialog',
14 // jscs:disable maximumLineLength
15 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
16 // jscs:enable maximumLineLength
17 icons: 'image', // %REMOVE_LINE_CORE%
18 hidpi: true, // %REMOVE_LINE_CORE%
19 init: function( editor ) {
20 // Abort when Image2 is to be loaded since both plugins
21 // share the same button, command, etc. names (#11222).
22 if ( editor.plugins.image2 )
23 return;
24
25 var pluginName = 'image';
26
27 // Register the dialog.
28 CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/image.js' );
29
30 var allowed = 'img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}',
31 required = 'img[alt,src]';
32
33 if ( CKEDITOR.dialog.isTabEnabled( editor, pluginName, 'advanced' ) )
34 allowed = 'img[alt,dir,id,lang,longdesc,!src,title]{*}(*)';
35
36 // Register the command.
37 editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName, {
38 allowedContent: allowed,
39 requiredContent: required,
40 contentTransformations: [
41 [ 'img{width}: sizeToStyle', 'img[width]: sizeToAttribute' ],
42 [ 'img{float}: alignmentToStyle', 'img[align]: alignmentToAttribute' ]
43 ]
44 } ) );
45
46 // Register the toolbar button.
47 editor.ui.addButton && editor.ui.addButton( 'Image', {
48 label: editor.lang.common.image,
49 command: pluginName,
50 toolbar: 'insert,10'
51 } );
52
53 editor.on( 'doubleclick', function( evt ) {
54 var element = evt.data.element;
55
56 if ( element.is( 'img' ) && !element.data( 'cke-realelement' ) && !element.isReadOnly() )
57 evt.data.dialog = 'image';
58 } );
59
60 // If the "menu" plugin is loaded, register the menu items.
61 if ( editor.addMenuItems ) {
62 editor.addMenuItems( {
63 image: {
64 label: editor.lang.image.menu,
65 command: 'image',
66 group: 'image'
67 }
68 } );
69 }
70
71 // If the "contextmenu" plugin is loaded, register the listeners.
72 if ( editor.contextMenu ) {
73 editor.contextMenu.addListener( function( element ) {
74 if ( getSelectedImage( editor, element ) )
75 return { image: CKEDITOR.TRISTATE_OFF };
76 } );
77 }
78 },
79 afterInit: function( editor ) {
80 // Abort when Image2 is to be loaded since both plugins
81 // share the same button, command, etc. names (#11222).
82 if ( editor.plugins.image2 )
83 return;
84
85 // Customize the behavior of the alignment commands. (#7430)
86 setupAlignCommand( 'left' );
87 setupAlignCommand( 'right' );
88 setupAlignCommand( 'center' );
89 setupAlignCommand( 'block' );
90
91 function setupAlignCommand( value ) {
92 var command = editor.getCommand( 'justify' + value );
93 if ( command ) {
94 if ( value == 'left' || value == 'right' ) {
95 command.on( 'exec', function( evt ) {
96 var img = getSelectedImage( editor ),
97 align;
98 if ( img ) {
99 align = getImageAlignment( img );
100 if ( align == value ) {
101 img.removeStyle( 'float' );
102
103 // Remove "align" attribute when necessary.
104 if ( value == getImageAlignment( img ) )
105 img.removeAttribute( 'align' );
106 } else {
107 img.setStyle( 'float', value );
108 }
109
110 evt.cancel();
111 }
112 } );
113 }
114
115 command.on( 'refresh', function( evt ) {
116 var img = getSelectedImage( editor ),
117 align;
118 if ( img ) {
119 align = getImageAlignment( img );
120
121 this.setState(
122 ( align == value ) ? CKEDITOR.TRISTATE_ON : ( value == 'right' || value == 'left' ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
123
124 evt.cancel();
125 }
126 } );
127 }
128 }
129 }
130 } );
131
132 function getSelectedImage( editor, element ) {
133 if ( !element ) {
134 var sel = editor.getSelection();
135 element = sel.getSelectedElement();
136 }
137
138 if ( element && element.is( 'img' ) && !element.data( 'cke-realelement' ) && !element.isReadOnly() )
139 return element;
140 }
141
142 function getImageAlignment( element ) {
143 var align = element.getStyle( 'float' );
144
145 if ( align == 'inherit' || align == 'none' )
146 align = 0;
147
148 if ( !align )
149 align = element.getAttribute( 'align' );
150
151 return align;
152 }
153
154} )();
155
156/**
157 * Determines whether dimension inputs should be automatically filled when the image URL changes in the Image plugin dialog window.
158 *
159 * config.image_prefillDimensions = false;
160 *
161 * @since 4.5
162 * @cfg {Boolean} [image_prefillDimensions=true]
163 * @member CKEDITOR.config
164 */
165
166/**
167 * Whether to remove links when emptying the link URL field in the Image dialog window.
168 *
169 * config.image_removeLinkByEmptyURL = false;
170 *
171 * @cfg {Boolean} [image_removeLinkByEmptyURL=true]
172 * @member CKEDITOR.config
173 */
174CKEDITOR.config.image_removeLinkByEmptyURL = true;
175
176/**
177 * Padding text to set off the image in the preview area.
178 *
179 * config.image_previewText = CKEDITOR.tools.repeat( '___ ', 100 );
180 *
181 * @cfg {String} [image_previewText='Lorem ipsum dolor...' (placeholder text)]
182 * @member CKEDITOR.config
183 */
diff --git a/sources/plugins/imagebrowser/LICENSE.txt b/sources/plugins/imagebrowser/LICENSE.txt
new file mode 100644
index 00000000..e81261ab
--- /dev/null
+++ b/sources/plugins/imagebrowser/LICENSE.txt
@@ -0,0 +1,10 @@
1Copyright (c) 2013, Slavi Pantaleev
2All rights reserved.
3
4Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5
6 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8 * Neither the name of ckeditor-imagebrowser nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9
10THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/sources/plugins/imagebrowser/README.rst b/sources/plugins/imagebrowser/README.rst
new file mode 100644
index 00000000..ea9d2296
--- /dev/null
+++ b/sources/plugins/imagebrowser/README.rst
@@ -0,0 +1,69 @@
1CKEditor Image Browser plugin
2=============================
3
4**imagebrowser** is a `CKEditor <http://ckeditor.com/>`_ plugin that allows images on the server to be browsed and picked
5for inclusion into the editor's contents.
6
7This plugin integrates with the **image** plugin (part of CKEditor),
8by making it provide a **Browse Server** button in the Image dialog window (`screenshot here <http://ckeditor.com/sites/default/files/styles/large/public/image/image_manager.png>`_).
9
10The way you use it is very similar to `imageGetJson <http://imperavi.com/redactor/docs/settings/#set_imageGetJson>`_ in `Redactor <http://imperavi.com/redactor/>`_
11- you only need to provide a list of images in a JSON format, and the image browser will take care of the rest.
12
13In fact, it uses the same data format as Redactor, allowing for an easy transition between the two editors.
14
15Installation
16------------
17
18Copy the whole contents of this repository into a new ``plugins/imagebrowser`` directory in your CKEditor install.
19
20Make sure you're using the **Standard** or **Full** `CKEditor packages <http://ckeditor.com/download>`_.
21The **Basic** package lacks an in-built "File Browser" plugin, which this plugin depends on.
22You can also use a `Custom CKEditor package <http://ckeditor.com/builder>`_, if you build it with "File Browser" plugin support.
23
24Usage
25-----
26
27Enable the plugin by adding it to `extraPlugins` and specify the `imageBrowser_listUrl` parameter::
28
29 CKEDITOR.replace('textareaId', {
30 "extraPlugins": "imagebrowser",
31 "imageBrowser_listUrl": "/path/to/images_list.json"
32 });
33
34The **imageBrowser_listUrl** configuration parameter points to a URL that lists the server's images in a JSON format.
35
36Example::
37
38 [
39 {
40 "image": "/image1_200x150.jpg",
41 "thumb": "/image1_thumb.jpg",
42 "folder": "Small"
43 },
44 {
45 "image": "/image2_200x150.jpg",
46 "thumb": "/image2_thumb.jpg",
47 "folder": "Small"
48 },
49
50 {
51 "image": "/image1_full.jpg",
52 "thumb": "/image1_thumb.jpg",
53 "folder": "Large"
54 },
55 {
56 "image": "/image2_full.jpg",
57 "thumb": "/image2_thumb.jpg",
58 "folder": "Large"
59 }
60 ]
61
62The above says that there are 2 image directories ("Small" and "Large") with 2 files in each of them.
63
64The **image** field is the relative/absolute path being used when the image gets put into the editor's contents.
65
66The **thumb** field is *optional*. It specifies the relative/absolute path to the image's thumbnail (for preview purposes).
67If omitted, the value of **image** is used as a thumbnail.
68
69The **folder** field is *optional*. If omitted, the image list will not be split into folders.
diff --git a/sources/plugins/imagebrowser/browser/browser.css b/sources/plugins/imagebrowser/browser/browser.css
new file mode 100644
index 00000000..1bb665c4
--- /dev/null
+++ b/sources/plugins/imagebrowser/browser/browser.css
@@ -0,0 +1,62 @@
1body {
2 margin: 0;
3}
4
5.folder-switcher {
6 font-size: 16px;
7 font-weight: bold;
8 margin: 0;
9 padding: 5px 10px;
10 list-style: none;
11 background-color: #e3e3e3;
12 border-bottom: 1px solid #b7b7b7;
13}
14
15.folder-switcher li {
16 display: inline-block;
17 margin: 5px;
18 padding: 5px 10px;
19 border: 1px solid #b7b7b7;
20 border-radius: 4px;
21 box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
22 background-color: #fff;
23 color: #333;
24 white-space: nowrap;
25 cursor: pointer;
26}
27
28.folder-switcher li:hover {
29 color: #0576b7;
30 border-color: #0576b7;
31}
32
33.folder-switcher li.active {
34 color: #fff;
35 background-color: #0576b7;
36 border-color: #0576b7;
37 box-shadow: none;
38}
39
40.images-container {
41 padding: 5px 10px;
42}
43
44.thumbnail {
45 display: inline-block;
46 margin: 5px 5px;
47 border: 1px solid #ccc;
48 border-radius: 4px;
49 overflow: hidden;
50 font-size: 0;
51}
52
53.thumbnail:hover {
54 border-color: #0a94e3;
55}
56
57.thumbnail img {
58 width: auto;
59 height: auto;
60 max-width: 200px;
61 max-height: 200px;
62}
diff --git a/sources/plugins/imagebrowser/browser/browser.html b/sources/plugins/imagebrowser/browser/browser.html
new file mode 100644
index 00000000..181e169a
--- /dev/null
+++ b/sources/plugins/imagebrowser/browser/browser.html
@@ -0,0 +1,25 @@
1<!doctype html>
2<html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <base>
6 <link rel="stylesheet" href="browser.css">
7 </head>
8
9 <body>
10 <script type="text/x-template-html" id="js-template-image">
11 <a href="javascript://" class="thumbnail js-image-link" data-url="%imageUrl%"><img src="%thumbUrl%"></a>
12 </script>
13
14 <ul class="folder-switcher" id="js-folder-switcher"></ul>
15
16 <div class="images-container" id="js-images-container">Loading..</div>
17
18 <script type="text/javascript" src="jquery-1.9.1.min.js"></script>
19 <script type="text/javascript" src="browser.js"></script>
20
21 <script type="text/javascript">
22 CkEditorImageBrowser.init();
23 </script>
24 </body>
25</html>
diff --git a/sources/plugins/imagebrowser/browser/browser.js b/sources/plugins/imagebrowser/browser/browser.js
new file mode 100644
index 00000000..5d52dbdd
--- /dev/null
+++ b/sources/plugins/imagebrowser/browser/browser.js
@@ -0,0 +1,136 @@
1var CkEditorImageBrowser = {};
2
3CkEditorImageBrowser.folders = [];
4CkEditorImageBrowser.images = {}; //folder => list of images
5CkEditorImageBrowser.ckFunctionNum = null;
6
7CkEditorImageBrowser.$folderSwitcher = null;
8CkEditorImageBrowser.$imagesContainer = null;
9
10CkEditorImageBrowser.init = function () {
11 CkEditorImageBrowser.$folderSwitcher = $('#js-folder-switcher');
12 CkEditorImageBrowser.$imagesContainer = $('#js-images-container');
13
14 var baseHref = CkEditorImageBrowser.getQueryStringParam("baseHref");
15 if (baseHref) {
16 var h = (document.head || document.getElementsByTagName("head")[0]),
17 el = h.getElementsByTagName("link")[0];
18 el.href = location.href.replace(/\/[^\/]*$/,"/browser.css");
19 (h.getElementsByTagName("base")[0]).href = baseHref;
20 }
21
22 CkEditorImageBrowser.ckFunctionNum = CkEditorImageBrowser.getQueryStringParam('CKEditorFuncNum');
23
24 CkEditorImageBrowser.initEventHandlers();
25
26 CkEditorImageBrowser.loadData(CkEditorImageBrowser.getQueryStringParam('listUrl'), function () {
27 CkEditorImageBrowser.initFolderSwitcher();
28 });
29};
30
31CkEditorImageBrowser.loadData = function (url, onLoaded) {
32 CkEditorImageBrowser.folders = [];
33 CkEditorImageBrowser.images = {};
34
35 $.getJSON(url, function (list) {
36 $.each(list, function (_idx, item) {
37 if (typeof(item.folder) === 'undefined') {
38 item.folder = 'Images';
39 }
40
41 if (typeof(item.thumb) === 'undefined') {
42 item.thumb = item.image;
43 }
44
45 CkEditorImageBrowser.addImage(item.folder, item.image, item.thumb);
46 });
47
48 onLoaded();
49 }).error(function(jqXHR, textStatus, errorThrown) {
50 var errorMessage;
51 if (jqXHR.status < 200 || jqXHR.status >= 400) {
52 errorMessage = 'HTTP Status: ' + jqXHR.status + '/' + jqXHR.statusText + ': "<strong style="color: red;">' + url + '</strong>"';
53 } else if (textStatus === 'parsererror') {
54 errorMessage = textStatus + ': invalid JSON file: "<strong style="color: red;">' + url + '</strong>": ' + errorThrown.message;
55 } else {
56 errorMessage = textStatus + ' / ' + jqXHR.statusText + ' / ' + errorThrown.message;
57 }
58 CkEditorImageBrowser.$imagesContainer.html(errorMessage);
59 });
60};
61
62CkEditorImageBrowser.addImage = function (folderName, imageUrl, thumbUrl) {
63 if (typeof(CkEditorImageBrowser.images[folderName]) === 'undefined') {
64 CkEditorImageBrowser.folders.push(folderName);
65 CkEditorImageBrowser.images[folderName] = [];
66 }
67
68 CkEditorImageBrowser.images[folderName].push({
69 "imageUrl": imageUrl,
70 "thumbUrl": thumbUrl
71 });
72};
73
74CkEditorImageBrowser.initFolderSwitcher = function () {
75 var $switcher = CkEditorImageBrowser.$folderSwitcher;
76
77 $switcher.find('li').remove();
78
79 $.each(CkEditorImageBrowser.folders, function (idx, folderName) {
80 var $option = $('<li></li>').data('idx', idx).text(folderName);
81 $option.appendTo($switcher);
82 });
83
84
85 if (CkEditorImageBrowser.folders.length === 0) {
86 $switcher.remove();
87 CkEditorImageBrowser.$imagesContainer.text('No images.');
88 } else {
89 if (CkEditorImageBrowser.folders.length === 1) {
90 $switcher.hide();
91 }
92
93 $switcher.find('li:first').click();
94 }
95};
96
97CkEditorImageBrowser.renderImagesForFolder = function (folderName) {
98 var images = CkEditorImageBrowser.images[folderName],
99 templateHtml = $('#js-template-image').html();
100
101 CkEditorImageBrowser.$imagesContainer.html('');
102
103 $.each(images, function (_idx, imageData) {
104 var html = templateHtml;
105 html = html.replace('%imageUrl%', imageData.imageUrl);
106 html = html.replace('%thumbUrl%', imageData.thumbUrl);
107
108 var $item = $($.parseHTML(html));
109
110 CkEditorImageBrowser.$imagesContainer.append($item);
111 });
112};
113
114CkEditorImageBrowser.initEventHandlers = function () {
115 $(document).on('click', '#js-folder-switcher li', function () {
116 var idx = parseInt($(this).data('idx'), 10),
117 folderName = CkEditorImageBrowser.folders[idx];
118
119 $(this).siblings('li').removeClass('active');
120 $(this).addClass('active');
121
122 CkEditorImageBrowser.renderImagesForFolder(folderName);
123 });
124
125 $(document).on('click', '.js-image-link', function () {
126 window.opener.CKEDITOR.tools.callFunction(CkEditorImageBrowser.ckFunctionNum, $(this).data('url'));
127 window.close();
128 });
129};
130
131CkEditorImageBrowser.getQueryStringParam = function (name) {
132 var regex = new RegExp('[?&]' + name + '=([^&]*)'),
133 result = window.location.search.match(regex);
134
135 return (result && result.length > 1 ? decodeURIComponent(result[1]) : null);
136};
diff --git a/sources/plugins/imagebrowser/browser/jquery-1.9.1.min.js b/sources/plugins/imagebrowser/browser/jquery-1.9.1.min.js
new file mode 100644
index 00000000..09b9ffb7
--- /dev/null
+++ b/sources/plugins/imagebrowser/browser/jquery-1.9.1.min.js
@@ -0,0 +1,5 @@
1/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
2//@ sourceMappingURL=jquery.min.map
3*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
4return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
5}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
diff --git a/sources/plugins/imagebrowser/plugin.js b/sources/plugins/imagebrowser/plugin.js
new file mode 100644
index 00000000..419b6881
--- /dev/null
+++ b/sources/plugins/imagebrowser/plugin.js
@@ -0,0 +1,14 @@
1CKEDITOR.plugins.add('imagebrowser', {
2 "init": function (editor) {
3 if (typeof(editor.config.imageBrowser_listUrl) === 'undefined' || editor.config.imageBrowser_listUrl === null) {
4 return;
5 }
6
7 var url = editor.plugins.imagebrowser.path + "browser/browser.html?listUrl=" + encodeURIComponent(editor.config.imageBrowser_listUrl);
8 if (editor.config.baseHref) {
9 url += "&baseHref=" + encodeURIComponent(editor.config.baseHref);
10 }
11
12 editor.config.filebrowserImageBrowseUrl = url;
13 }
14});
diff --git a/sources/plugins/indent/dev/indent.html b/sources/plugins/indent/dev/indent.html
new file mode 100644
index 00000000..0a3a8288
--- /dev/null
+++ b/sources/plugins/indent/dev/indent.html
@@ -0,0 +1,284 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Indent DEV sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <style>
12 body {
13 padding: 20px;
14 margin: 0;
15 }
16 .editors {
17 display: block;
18 overflow: hidden;
19 width: 100%;
20 margin: 0px auto;
21 list-style-type: none;
22 margin: 0;
23 padding: 0;
24
25 box-sizing: content-box;
26
27 background: #eee;
28 }
29 .editors li {
30 width: 50%;
31 margin: 0;
32 padding: 10px;
33 float: left;
34
35 box-sizing: border-box;
36 }
37 .editors li:nth-child(2n) {
38 background: #D4E59A;
39 }
40 #menu {
41 position: fixed;
42 top: 0;
43 right: 20px;
44 padding: 5px;
45 border: 1px solid #aaa;
46 background: #eee;
47 }
48
49 </style>
50</head>
51<body>
52 <p id="menu">
53 <a href="#listnblock">List &amp; Block</a>,
54 <a href="#classes">Classes</a>,
55 <a href="#list">List</a>,
56 <a href="#block">Block</a>,
57 <a href="#br">ENTER_BR</a>
58 </p>
59
60 <h1 class="samples">Indent DEV sample</h1>
61 <h2 id="listnblock">List &amp; Block</h2>
62 <ul class="editors">
63 <li>
64 <textarea cols="80" id="editor1" rows="10">
65 <p>xx</p>
66 <ul>
67 <li>x</li>
68 <li>y</li>
69 </ul>
70 <p>xx</p>
71
72 <br>
73
74 <ul><li><ol><li>xx</li></ol></li><li>yy</li></ul>
75 </textarea>
76 </li>
77 <li>
78 <pre id="editor1_out"></pre>
79 </li>
80 </ul>
81
82 <h2 id="classes">Indent classes</h2>
83 <ul class="editors">
84 <li>
85 <textarea cols="80" id="editor2" rows="10">
86 <ul>
87 <li>a</li>
88 <li>
89 b
90 <ol>
91 <li>inner</li>
92 </ol>
93 </li>
94 <li>c</li>
95 </ul>
96 <p>moo</p>
97 </textarea>
98 </li>
99 <li>
100 <pre id="editor2_out"></pre>
101 </li>
102 </ul>
103
104 <h2 id="list">List only</h2>
105 <ul class="editors">
106 <li>
107 <textarea cols="80" id="editor3" rows="10">
108 <ul>
109 <li>a</li>
110 <li>
111 b
112 <ol>
113 <li>inner</li>
114 </ol>
115 </li>
116 <li>c</li>
117 </ul>
118 <p>moo</p>
119 </textarea>
120 </li>
121 <li>
122 <pre id="editor3_out"></pre>
123 </li>
124 </ul>
125
126 <h2 id="block">Block only</h2>
127 <ul class="editors">
128 <li>
129 <textarea cols="80" id="editor4" rows="10">
130 <ul>
131 <li>a</li>
132 <li>
133 b
134 <ol>
135 <li>inner</li>
136 </ol>
137 </li>
138 <li>c</li>
139 </ul>
140 <p>moo</p>
141 </textarea>
142 </li>
143 <li>
144 <pre id="editor4_out"></pre>
145 </li>
146 </ul>
147
148 <h2 id="br">CKEDITOR.ENTER_BR</h2>
149 <ul class="editors">
150 <li>
151 <textarea cols="80" id="editor5" rows="10">
152 Text
153 <br>
154 <ul>
155 <li>a</li>
156 <li>b</li>
157 </ul>
158 </textarea>
159 </li>
160 <li>
161 <pre id="editor5_out"></pre>
162 </li>
163 </ul>
164 <script>
165
166 var plugins = 'enterkey,toolbar,htmlwriter,wysiwygarea,undo,sourcearea,clipboard,list,justify,indent,indentlist,indentblock';
167
168 CKEDITOR.config.indentOffset = 10;
169 CKEDITOR.addCss( '\
170 .i1{ margin-left: 10px}\
171 .i2{ margin-left: 20px}\
172 .i3{ margin-left: 30px}' );
173
174 function showData( event ) {
175 CKEDITOR.document.getById( this.name + '_out' ).setText( getHtmlWithSelection( this ) );
176 }
177
178 function browserHtmlFix( html ) {
179 if ( CKEDITOR.env.ie && ( document.documentMode || CKEDITOR.env.version ) < 9 ) {
180 // Fix output base href on anchored link.
181 html = html.replace( /href="(.*?)#(.*?)"/gi,
182 function( m, base, anchor ) {
183 if ( base == window.location.href.replace( window.location.hash, '' ) )
184 return 'href="#' + anchor + '"';
185
186 return m;
187 } );
188
189 // Fix output line break after HR.
190 html = html.replace( /(<HR>)\r\n/gi, function( m, hr ) { return hr; } );
191 }
192
193 return html;
194 }
195
196 function getHtmlWithSelection( editorOrElement, root ) {
197 var isEditor = editorOrElement instanceof CKEDITOR.editor,
198 element = isEditor ? editorOrElement.editable() : editorOrElement;
199
200 root = isEditor ? element :
201 root instanceof CKEDITOR.dom.document ?
202 root.getBody() : root || CKEDITOR.document.getBody();
203
204 function replaceWithBookmark( match, startOrEnd ) {
205 var bookmark;
206 switch( startOrEnd ) {
207 case 'S' :
208 bookmark = '[';
209 break;
210 case 'E' :
211 bookmark = ']';
212 break;
213 case 'C' :
214 bookmark = '^';
215 break;
216 }
217 return bookmark;
218 }
219
220 // Hack: force remove the filling char hack in Webkit.
221 isEditor && CKEDITOR.env.webkit && editorOrElement.fire( 'beforeSetMode' );
222
223 var sel = isEditor ? editorOrElement.getSelection()
224 : new CKEDITOR.dom.selection( root );
225
226 var doc = sel.document;
227 var ranges = sel.getRanges(),
228 range;
229
230 var bms = [];
231 var iter = ranges.createIterator();
232 while( range = iter.getNextRange() )
233 bms.push( range.createBookmark( 1 ) );
234
235 var html = browserHtmlFix( isEditor ? editorOrElement.getData() : element.getHtml() );
236 html = html.replace( /<span\b[^>]*?id="?cke_bm_\d+(\w)"?\b[^>]*?>.*?<\/span>/gi,
237 replaceWithBookmark );
238
239 for ( var i = 0, bm; i < bms.length; i++ ) {
240 bm = bms[ i ];
241 var start = doc.getById( bm.startNode ),
242 end = doc.getById( bm.endNode );
243
244 start && start.remove();
245 end && end.remove();
246 }
247
248 return html;
249 }
250
251 CKEDITOR.on( 'instanceReady', function ( event ) {
252 var editor = event.editor;
253
254 showData.call( editor );
255
256 editor.on( 'afterCommandExec', showData, editor );
257 });
258
259 CKEDITOR.replace( 'editor1', {
260 plugins: plugins
261 } );
262
263 CKEDITOR.replace( 'editor2', {
264 plugins: plugins,
265 indentClasses: [ 'i1', 'i2', 'i3' ]
266 } );
267
268 CKEDITOR.replace( 'editor3', {
269 plugins: plugins,
270 removePlugins: 'indentblock'
271 } );
272
273 CKEDITOR.replace( 'editor4', {
274 plugins: plugins,
275 removePlugins: 'indentlist'
276 } );
277
278 CKEDITOR.replace( 'editor5', {
279 plugins: plugins,
280 enterMode: CKEDITOR.ENTER_BR
281 } );
282 </script>
283</body>
284</html>
diff --git a/sources/plugins/indent/icons/hidpi/indent-rtl.png b/sources/plugins/indent/icons/hidpi/indent-rtl.png
new file mode 100644
index 00000000..e14dc308
--- /dev/null
+++ b/sources/plugins/indent/icons/hidpi/indent-rtl.png
Binary files differ
diff --git a/sources/plugins/indent/icons/hidpi/indent.png b/sources/plugins/indent/icons/hidpi/indent.png
new file mode 100644
index 00000000..c629bb41
--- /dev/null
+++ b/sources/plugins/indent/icons/hidpi/indent.png
Binary files differ
diff --git a/sources/plugins/indent/icons/hidpi/outdent-rtl.png b/sources/plugins/indent/icons/hidpi/outdent-rtl.png
new file mode 100644
index 00000000..35f69abf
--- /dev/null
+++ b/sources/plugins/indent/icons/hidpi/outdent-rtl.png
Binary files differ
diff --git a/sources/plugins/indent/icons/hidpi/outdent.png b/sources/plugins/indent/icons/hidpi/outdent.png
new file mode 100644
index 00000000..b00179e2
--- /dev/null
+++ b/sources/plugins/indent/icons/hidpi/outdent.png
Binary files differ
diff --git a/sources/plugins/indent/icons/indent-rtl.png b/sources/plugins/indent/icons/indent-rtl.png
new file mode 100644
index 00000000..ff3fd222
--- /dev/null
+++ b/sources/plugins/indent/icons/indent-rtl.png
Binary files differ
diff --git a/sources/plugins/indent/icons/indent.png b/sources/plugins/indent/icons/indent.png
new file mode 100644
index 00000000..3e151bc6
--- /dev/null
+++ b/sources/plugins/indent/icons/indent.png
Binary files differ
diff --git a/sources/plugins/indent/icons/outdent-rtl.png b/sources/plugins/indent/icons/outdent-rtl.png
new file mode 100644
index 00000000..7165424d
--- /dev/null
+++ b/sources/plugins/indent/icons/outdent-rtl.png
Binary files differ
diff --git a/sources/plugins/indent/icons/outdent.png b/sources/plugins/indent/icons/outdent.png
new file mode 100644
index 00000000..54f205d6
--- /dev/null
+++ b/sources/plugins/indent/icons/outdent.png
Binary files differ
diff --git a/sources/plugins/indent/lang/af.js b/sources/plugins/indent/lang/af.js
new file mode 100644
index 00000000..dcf8aeed
--- /dev/null
+++ b/sources/plugins/indent/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'af', {
6 indent: 'Vergroot inspring',
7 outdent: 'Verklein inspring'
8} );
diff --git a/sources/plugins/indent/lang/ar.js b/sources/plugins/indent/lang/ar.js
new file mode 100644
index 00000000..bf427cba
--- /dev/null
+++ b/sources/plugins/indent/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ar', {
6 indent: 'زيادة المسافة البادئة',
7 outdent: 'إنقاص المسافة البادئة'
8} );
diff --git a/sources/plugins/indent/lang/bg.js b/sources/plugins/indent/lang/bg.js
new file mode 100644
index 00000000..329363a6
--- /dev/null
+++ b/sources/plugins/indent/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'bg', {
6 indent: 'Увеличаване на отстъпа',
7 outdent: 'Намаляване на отстъпа'
8} );
diff --git a/sources/plugins/indent/lang/bn.js b/sources/plugins/indent/lang/bn.js
new file mode 100644
index 00000000..331bede3
--- /dev/null
+++ b/sources/plugins/indent/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'bn', {
6 indent: 'ইনডেন্ট বাড়াও',
7 outdent: 'ইনডেন্ট কমাও'
8} );
diff --git a/sources/plugins/indent/lang/bs.js b/sources/plugins/indent/lang/bs.js
new file mode 100644
index 00000000..ee41a42d
--- /dev/null
+++ b/sources/plugins/indent/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'bs', {
6 indent: 'Poveæaj uvod',
7 outdent: 'Smanji uvod'
8} );
diff --git a/sources/plugins/indent/lang/ca.js b/sources/plugins/indent/lang/ca.js
new file mode 100644
index 00000000..60756840
--- /dev/null
+++ b/sources/plugins/indent/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ca', {
6 indent: 'Augmenta el sagnat',
7 outdent: 'Redueix el sagnat'
8} );
diff --git a/sources/plugins/indent/lang/cs.js b/sources/plugins/indent/lang/cs.js
new file mode 100644
index 00000000..14b1474b
--- /dev/null
+++ b/sources/plugins/indent/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'cs', {
6 indent: 'Zvětšit odsazení',
7 outdent: 'Zmenšit odsazení'
8} );
diff --git a/sources/plugins/indent/lang/cy.js b/sources/plugins/indent/lang/cy.js
new file mode 100644
index 00000000..fe38f2ff
--- /dev/null
+++ b/sources/plugins/indent/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'cy', {
6 indent: 'Cynyddu\'r Mewnoliad',
7 outdent: 'Lleihau\'r Mewnoliad'
8} );
diff --git a/sources/plugins/indent/lang/da.js b/sources/plugins/indent/lang/da.js
new file mode 100644
index 00000000..fa22b3b3
--- /dev/null
+++ b/sources/plugins/indent/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'da', {
6 indent: 'Forøg indrykning',
7 outdent: 'Formindsk indrykning'
8} );
diff --git a/sources/plugins/indent/lang/de.js b/sources/plugins/indent/lang/de.js
new file mode 100644
index 00000000..315311dd
--- /dev/null
+++ b/sources/plugins/indent/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'de', {
6 indent: 'Einzug erhöhen',
7 outdent: 'Einzug verringern'
8} );
diff --git a/sources/plugins/indent/lang/el.js b/sources/plugins/indent/lang/el.js
new file mode 100644
index 00000000..55e5678e
--- /dev/null
+++ b/sources/plugins/indent/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'el', {
6 indent: 'Αύξηση Εσοχής',
7 outdent: 'Μείωση Εσοχής'
8} );
diff --git a/sources/plugins/indent/lang/en-au.js b/sources/plugins/indent/lang/en-au.js
new file mode 100644
index 00000000..be93b7b0
--- /dev/null
+++ b/sources/plugins/indent/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'en-au', {
6 indent: 'Increase Indent',
7 outdent: 'Decrease Indent'
8} );
diff --git a/sources/plugins/indent/lang/en-ca.js b/sources/plugins/indent/lang/en-ca.js
new file mode 100644
index 00000000..91b5f051
--- /dev/null
+++ b/sources/plugins/indent/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'en-ca', {
6 indent: 'Increase Indent',
7 outdent: 'Decrease Indent'
8} );
diff --git a/sources/plugins/indent/lang/en-gb.js b/sources/plugins/indent/lang/en-gb.js
new file mode 100644
index 00000000..6f98aa99
--- /dev/null
+++ b/sources/plugins/indent/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'en-gb', {
6 indent: 'Increase Indent',
7 outdent: 'Decrease Indent'
8} );
diff --git a/sources/plugins/indent/lang/en.js b/sources/plugins/indent/lang/en.js
new file mode 100644
index 00000000..6403f726
--- /dev/null
+++ b/sources/plugins/indent/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'en', {
6 indent: 'Increase Indent',
7 outdent: 'Decrease Indent'
8} );
diff --git a/sources/plugins/indent/lang/eo.js b/sources/plugins/indent/lang/eo.js
new file mode 100644
index 00000000..6dc6e0dc
--- /dev/null
+++ b/sources/plugins/indent/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'eo', {
6 indent: 'Pligrandigi Krommarĝenon',
7 outdent: 'Malpligrandigi Krommarĝenon'
8} );
diff --git a/sources/plugins/indent/lang/es.js b/sources/plugins/indent/lang/es.js
new file mode 100644
index 00000000..cd8845b2
--- /dev/null
+++ b/sources/plugins/indent/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'es', {
6 indent: 'Aumentar Sangría',
7 outdent: 'Disminuir Sangría'
8} );
diff --git a/sources/plugins/indent/lang/et.js b/sources/plugins/indent/lang/et.js
new file mode 100644
index 00000000..30082dae
--- /dev/null
+++ b/sources/plugins/indent/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'et', {
6 indent: 'Taande suurendamine',
7 outdent: 'Taande vähendamine'
8} );
diff --git a/sources/plugins/indent/lang/eu.js b/sources/plugins/indent/lang/eu.js
new file mode 100644
index 00000000..ae12a9b0
--- /dev/null
+++ b/sources/plugins/indent/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'eu', {
6 indent: 'Handitu koska',
7 outdent: 'Txikitu koska'
8} );
diff --git a/sources/plugins/indent/lang/fa.js b/sources/plugins/indent/lang/fa.js
new file mode 100644
index 00000000..71a60492
--- /dev/null
+++ b/sources/plugins/indent/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'fa', {
6 indent: 'افزایش تورفتگی',
7 outdent: 'کاهش تورفتگی'
8} );
diff --git a/sources/plugins/indent/lang/fi.js b/sources/plugins/indent/lang/fi.js
new file mode 100644
index 00000000..42c28b01
--- /dev/null
+++ b/sources/plugins/indent/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'fi', {
6 indent: 'Suurenna sisennystä',
7 outdent: 'Pienennä sisennystä'
8} );
diff --git a/sources/plugins/indent/lang/fo.js b/sources/plugins/indent/lang/fo.js
new file mode 100644
index 00000000..582cf2ae
--- /dev/null
+++ b/sources/plugins/indent/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'fo', {
6 indent: 'Økja reglubrotarinntriv',
7 outdent: 'Minka reglubrotarinntriv'
8} );
diff --git a/sources/plugins/indent/lang/fr-ca.js b/sources/plugins/indent/lang/fr-ca.js
new file mode 100644
index 00000000..37725cea
--- /dev/null
+++ b/sources/plugins/indent/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'fr-ca', {
6 indent: 'Augmenter le retrait',
7 outdent: 'Diminuer le retrait'
8} );
diff --git a/sources/plugins/indent/lang/fr.js b/sources/plugins/indent/lang/fr.js
new file mode 100644
index 00000000..eda26f40
--- /dev/null
+++ b/sources/plugins/indent/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'fr', {
6 indent: 'Augmenter le retrait (tabulation)',
7 outdent: 'Diminuer le retrait (tabulation)'
8} );
diff --git a/sources/plugins/indent/lang/gl.js b/sources/plugins/indent/lang/gl.js
new file mode 100644
index 00000000..1fc4350d
--- /dev/null
+++ b/sources/plugins/indent/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'gl', {
6 indent: 'Aumentar a sangría',
7 outdent: 'Reducir a sangría'
8} );
diff --git a/sources/plugins/indent/lang/gu.js b/sources/plugins/indent/lang/gu.js
new file mode 100644
index 00000000..935bbaf3
--- /dev/null
+++ b/sources/plugins/indent/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'gu', {
6 indent: 'ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી',
7 outdent: 'ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી'
8} );
diff --git a/sources/plugins/indent/lang/he.js b/sources/plugins/indent/lang/he.js
new file mode 100644
index 00000000..a653131e
--- /dev/null
+++ b/sources/plugins/indent/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'he', {
6 indent: 'הגדלת הזחה',
7 outdent: 'הקטנת הזחה'
8} );
diff --git a/sources/plugins/indent/lang/hi.js b/sources/plugins/indent/lang/hi.js
new file mode 100644
index 00000000..e48eeafb
--- /dev/null
+++ b/sources/plugins/indent/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'hi', {
6 indent: 'इन्डॅन्ट बढ़ायें',
7 outdent: 'इन्डॅन्ट कम करें'
8} );
diff --git a/sources/plugins/indent/lang/hr.js b/sources/plugins/indent/lang/hr.js
new file mode 100644
index 00000000..47a0b2c2
--- /dev/null
+++ b/sources/plugins/indent/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'hr', {
6 indent: 'Pomakni udesno',
7 outdent: 'Pomakni ulijevo'
8} );
diff --git a/sources/plugins/indent/lang/hu.js b/sources/plugins/indent/lang/hu.js
new file mode 100644
index 00000000..1a55b43f
--- /dev/null
+++ b/sources/plugins/indent/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'hu', {
6 indent: 'Behúzás növelése',
7 outdent: 'Behúzás csökkentése'
8} );
diff --git a/sources/plugins/indent/lang/id.js b/sources/plugins/indent/lang/id.js
new file mode 100644
index 00000000..4b26b7ca
--- /dev/null
+++ b/sources/plugins/indent/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'id', {
6 indent: 'Tingkatkan Lekuk',
7 outdent: 'Kurangi Lekuk'
8} );
diff --git a/sources/plugins/indent/lang/is.js b/sources/plugins/indent/lang/is.js
new file mode 100644
index 00000000..4ef6c390
--- /dev/null
+++ b/sources/plugins/indent/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'is', {
6 indent: 'Minnka inndrátt',
7 outdent: 'Auka inndrátt'
8} );
diff --git a/sources/plugins/indent/lang/it.js b/sources/plugins/indent/lang/it.js
new file mode 100644
index 00000000..aa70e80d
--- /dev/null
+++ b/sources/plugins/indent/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'it', {
6 indent: 'Aumenta rientro',
7 outdent: 'Riduci rientro'
8} );
diff --git a/sources/plugins/indent/lang/ja.js b/sources/plugins/indent/lang/ja.js
new file mode 100644
index 00000000..daaaa77d
--- /dev/null
+++ b/sources/plugins/indent/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ja', {
6 indent: 'インデント',
7 outdent: 'インデント解除'
8} );
diff --git a/sources/plugins/indent/lang/ka.js b/sources/plugins/indent/lang/ka.js
new file mode 100644
index 00000000..7c179132
--- /dev/null
+++ b/sources/plugins/indent/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ka', {
6 indent: 'მეტად შეწევა',
7 outdent: 'ნაკლებად შეწევა'
8} );
diff --git a/sources/plugins/indent/lang/km.js b/sources/plugins/indent/lang/km.js
new file mode 100644
index 00000000..4c6cb692
--- /dev/null
+++ b/sources/plugins/indent/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'km', {
6 indent: 'បន្ថែមការចូលបន្ទាត់',
7 outdent: 'បន្ថយការចូលបន្ទាត់'
8} );
diff --git a/sources/plugins/indent/lang/ko.js b/sources/plugins/indent/lang/ko.js
new file mode 100644
index 00000000..39f63737
--- /dev/null
+++ b/sources/plugins/indent/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ko', {
6 indent: '들여쓰기',
7 outdent: '내어쓰기'
8} );
diff --git a/sources/plugins/indent/lang/ku.js b/sources/plugins/indent/lang/ku.js
new file mode 100644
index 00000000..25349904
--- /dev/null
+++ b/sources/plugins/indent/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ku', {
6 indent: 'زیادکردنی بۆشایی',
7 outdent: 'کەمکردنەوەی بۆشایی'
8} );
diff --git a/sources/plugins/indent/lang/lt.js b/sources/plugins/indent/lang/lt.js
new file mode 100644
index 00000000..263fa04d
--- /dev/null
+++ b/sources/plugins/indent/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'lt', {
6 indent: 'Padidinti įtrauką',
7 outdent: 'Sumažinti įtrauką'
8} );
diff --git a/sources/plugins/indent/lang/lv.js b/sources/plugins/indent/lang/lv.js
new file mode 100644
index 00000000..0315bfb7
--- /dev/null
+++ b/sources/plugins/indent/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'lv', {
6 indent: 'Palielināt atkāpi',
7 outdent: 'Samazināt atkāpi'
8} );
diff --git a/sources/plugins/indent/lang/mk.js b/sources/plugins/indent/lang/mk.js
new file mode 100644
index 00000000..52d13c35
--- /dev/null
+++ b/sources/plugins/indent/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'mk', {
6 indent: 'Increase Indent', // MISSING
7 outdent: 'Decrease Indent' // MISSING
8} );
diff --git a/sources/plugins/indent/lang/mn.js b/sources/plugins/indent/lang/mn.js
new file mode 100644
index 00000000..9eded3ef
--- /dev/null
+++ b/sources/plugins/indent/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'mn', {
6 indent: 'Догол мөр хасах',
7 outdent: 'Догол мөр нэмэх'
8} );
diff --git a/sources/plugins/indent/lang/ms.js b/sources/plugins/indent/lang/ms.js
new file mode 100644
index 00000000..7d3a5f29
--- /dev/null
+++ b/sources/plugins/indent/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ms', {
6 indent: 'Tambahkan Inden',
7 outdent: 'Kurangkan Inden'
8} );
diff --git a/sources/plugins/indent/lang/nb.js b/sources/plugins/indent/lang/nb.js
new file mode 100644
index 00000000..3e124d55
--- /dev/null
+++ b/sources/plugins/indent/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'nb', {
6 indent: 'Øk innrykk',
7 outdent: 'Reduser innrykk'
8} );
diff --git a/sources/plugins/indent/lang/nl.js b/sources/plugins/indent/lang/nl.js
new file mode 100644
index 00000000..0cdf066f
--- /dev/null
+++ b/sources/plugins/indent/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'nl', {
6 indent: 'Inspringing vergroten',
7 outdent: 'Inspringing verkleinen'
8} );
diff --git a/sources/plugins/indent/lang/no.js b/sources/plugins/indent/lang/no.js
new file mode 100644
index 00000000..eeb5e1ce
--- /dev/null
+++ b/sources/plugins/indent/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'no', {
6 indent: 'Øk innrykk',
7 outdent: 'Reduser innrykk'
8} );
diff --git a/sources/plugins/indent/lang/pl.js b/sources/plugins/indent/lang/pl.js
new file mode 100644
index 00000000..321f520b
--- /dev/null
+++ b/sources/plugins/indent/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'pl', {
6 indent: 'Zwiększ wcięcie',
7 outdent: 'Zmniejsz wcięcie'
8} );
diff --git a/sources/plugins/indent/lang/pt-br.js b/sources/plugins/indent/lang/pt-br.js
new file mode 100644
index 00000000..b2334695
--- /dev/null
+++ b/sources/plugins/indent/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'pt-br', {
6 indent: 'Aumentar Recuo',
7 outdent: 'Diminuir Recuo'
8} );
diff --git a/sources/plugins/indent/lang/pt.js b/sources/plugins/indent/lang/pt.js
new file mode 100644
index 00000000..5e395317
--- /dev/null
+++ b/sources/plugins/indent/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'pt', {
6 indent: 'Aumentar Avanço',
7 outdent: 'Diminuir Avanço'
8} );
diff --git a/sources/plugins/indent/lang/ro.js b/sources/plugins/indent/lang/ro.js
new file mode 100644
index 00000000..639d4f03
--- /dev/null
+++ b/sources/plugins/indent/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ro', {
6 indent: 'Creşte indentarea',
7 outdent: 'Scade indentarea'
8} );
diff --git a/sources/plugins/indent/lang/ru.js b/sources/plugins/indent/lang/ru.js
new file mode 100644
index 00000000..ddbb0508
--- /dev/null
+++ b/sources/plugins/indent/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ru', {
6 indent: 'Увеличить отступ',
7 outdent: 'Уменьшить отступ'
8} );
diff --git a/sources/plugins/indent/lang/si.js b/sources/plugins/indent/lang/si.js
new file mode 100644
index 00000000..fe5a8e2b
--- /dev/null
+++ b/sources/plugins/indent/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'si', {
6 indent: 'අතර පරතරය වැඩිකරන්න',
7 outdent: 'අතර පරතරය අඩුකරන්න'
8} );
diff --git a/sources/plugins/indent/lang/sk.js b/sources/plugins/indent/lang/sk.js
new file mode 100644
index 00000000..a5210ee0
--- /dev/null
+++ b/sources/plugins/indent/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'sk', {
6 indent: 'Zväčšiť odsadenie',
7 outdent: 'Zmenšiť odsadenie'
8} );
diff --git a/sources/plugins/indent/lang/sl.js b/sources/plugins/indent/lang/sl.js
new file mode 100644
index 00000000..1cef8167
--- /dev/null
+++ b/sources/plugins/indent/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'sl', {
6 indent: 'Povečaj zamik',
7 outdent: 'Zmanjšaj zamik'
8} );
diff --git a/sources/plugins/indent/lang/sq.js b/sources/plugins/indent/lang/sq.js
new file mode 100644
index 00000000..670b1065
--- /dev/null
+++ b/sources/plugins/indent/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'sq', {
6 indent: 'Rrite Identin',
7 outdent: 'Zvogëlo Identin'
8} );
diff --git a/sources/plugins/indent/lang/sr-latn.js b/sources/plugins/indent/lang/sr-latn.js
new file mode 100644
index 00000000..a79ff72b
--- /dev/null
+++ b/sources/plugins/indent/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'sr-latn', {
6 indent: 'Uvećaj levu marginu',
7 outdent: 'Smanji levu marginu'
8} );
diff --git a/sources/plugins/indent/lang/sr.js b/sources/plugins/indent/lang/sr.js
new file mode 100644
index 00000000..92f11970
--- /dev/null
+++ b/sources/plugins/indent/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'sr', {
6 indent: 'Увећај леву маргину',
7 outdent: 'Смањи леву маргину'
8} );
diff --git a/sources/plugins/indent/lang/sv.js b/sources/plugins/indent/lang/sv.js
new file mode 100644
index 00000000..c9141012
--- /dev/null
+++ b/sources/plugins/indent/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'sv', {
6 indent: 'Öka indrag',
7 outdent: 'Minska indrag'
8} );
diff --git a/sources/plugins/indent/lang/th.js b/sources/plugins/indent/lang/th.js
new file mode 100644
index 00000000..1a4f2cde
--- /dev/null
+++ b/sources/plugins/indent/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'th', {
6 indent: 'เพิ่มระยะย่อหน้า',
7 outdent: 'ลดระยะย่อหน้า'
8} );
diff --git a/sources/plugins/indent/lang/tr.js b/sources/plugins/indent/lang/tr.js
new file mode 100644
index 00000000..227e2cd9
--- /dev/null
+++ b/sources/plugins/indent/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'tr', {
6 indent: 'Sekme Arttır',
7 outdent: 'Sekme Azalt'
8} );
diff --git a/sources/plugins/indent/lang/tt.js b/sources/plugins/indent/lang/tt.js
new file mode 100644
index 00000000..465b4ce3
--- /dev/null
+++ b/sources/plugins/indent/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'tt', {
6 indent: 'Отступны арттыру',
7 outdent: 'Отступны кечерәйтү'
8} );
diff --git a/sources/plugins/indent/lang/ug.js b/sources/plugins/indent/lang/ug.js
new file mode 100644
index 00000000..956e6a4c
--- /dev/null
+++ b/sources/plugins/indent/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'ug', {
6 indent: 'تارايت',
7 outdent: 'كەڭەيت'
8} );
diff --git a/sources/plugins/indent/lang/uk.js b/sources/plugins/indent/lang/uk.js
new file mode 100644
index 00000000..80d77f76
--- /dev/null
+++ b/sources/plugins/indent/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'uk', {
6 indent: 'Збільшити відступ',
7 outdent: 'Зменшити відступ'
8} );
diff --git a/sources/plugins/indent/lang/vi.js b/sources/plugins/indent/lang/vi.js
new file mode 100644
index 00000000..c423837d
--- /dev/null
+++ b/sources/plugins/indent/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'vi', {
6 indent: 'Dịch vào trong',
7 outdent: 'Dịch ra ngoài'
8} );
diff --git a/sources/plugins/indent/lang/zh-cn.js b/sources/plugins/indent/lang/zh-cn.js
new file mode 100644
index 00000000..2ce406f2
--- /dev/null
+++ b/sources/plugins/indent/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'zh-cn', {
6 indent: '增加缩进量',
7 outdent: '减少缩进量'
8} );
diff --git a/sources/plugins/indent/lang/zh.js b/sources/plugins/indent/lang/zh.js
new file mode 100644
index 00000000..4aa2abf8
--- /dev/null
+++ b/sources/plugins/indent/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'indent', 'zh', {
6 indent: '增加縮排',
7 outdent: '減少縮排'
8} );
diff --git a/sources/plugins/indent/plugin.js b/sources/plugins/indent/plugin.js
new file mode 100644
index 00000000..325503d6
--- /dev/null
+++ b/sources/plugins/indent/plugin.js
@@ -0,0 +1,461 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Increase and Decrease Indent commands.
8 */
9
10( function() {
11 'use strict';
12
13 var TRISTATE_DISABLED = CKEDITOR.TRISTATE_DISABLED,
14 TRISTATE_OFF = CKEDITOR.TRISTATE_OFF;
15
16 CKEDITOR.plugins.add( 'indent', {
17 // jscs:disable maximumLineLength
18 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
19 // jscs:enable maximumLineLength
20 icons: 'indent,indent-rtl,outdent,outdent-rtl', // %REMOVE_LINE_CORE%
21 hidpi: true, // %REMOVE_LINE_CORE%
22
23 init: function( editor ) {
24 var genericDefinition = CKEDITOR.plugins.indent.genericDefinition;
25
26 // Register generic commands.
27 setupGenericListeners( editor, editor.addCommand( 'indent', new genericDefinition( true ) ) );
28 setupGenericListeners( editor, editor.addCommand( 'outdent', new genericDefinition() ) );
29
30 // Create and register toolbar button if possible.
31 if ( editor.ui.addButton ) {
32 editor.ui.addButton( 'Indent', {
33 label: editor.lang.indent.indent,
34 command: 'indent',
35 directional: true,
36 toolbar: 'indent,20'
37 } );
38
39 editor.ui.addButton( 'Outdent', {
40 label: editor.lang.indent.outdent,
41 command: 'outdent',
42 directional: true,
43 toolbar: 'indent,10'
44 } );
45 }
46
47 // Register dirChanged listener.
48 editor.on( 'dirChanged', function( evt ) {
49 var range = editor.createRange(),
50 dataNode = evt.data.node;
51
52 range.setStartBefore( dataNode );
53 range.setEndAfter( dataNode );
54
55 var walker = new CKEDITOR.dom.walker( range ),
56 node;
57
58 while ( ( node = walker.next() ) ) {
59 if ( node.type == CKEDITOR.NODE_ELEMENT ) {
60 // A child with the defined dir is to be ignored.
61 if ( !node.equals( dataNode ) && node.getDirection() ) {
62 range.setStartAfter( node );
63 walker = new CKEDITOR.dom.walker( range );
64 continue;
65 }
66
67 // Switch alignment classes.
68 var classes = editor.config.indentClasses;
69 if ( classes ) {
70 var suffix = ( evt.data.dir == 'ltr' ) ? [ '_rtl', '' ] : [ '', '_rtl' ];
71 for ( var i = 0; i < classes.length; i++ ) {
72 if ( node.hasClass( classes[ i ] + suffix[ 0 ] ) ) {
73 node.removeClass( classes[ i ] + suffix[ 0 ] );
74 node.addClass( classes[ i ] + suffix[ 1 ] );
75 }
76 }
77 }
78
79 // Switch the margins.
80 var marginLeft = node.getStyle( 'margin-right' ),
81 marginRight = node.getStyle( 'margin-left' );
82
83 marginLeft ? node.setStyle( 'margin-left', marginLeft ) : node.removeStyle( 'margin-left' );
84 marginRight ? node.setStyle( 'margin-right', marginRight ) : node.removeStyle( 'margin-right' );
85 }
86 }
87 } );
88 }
89 } );
90
91 /**
92 * Global command class definitions and global helpers.
93 *
94 * @class
95 * @singleton
96 */
97 CKEDITOR.plugins.indent = {
98 /**
99 * A base class for a generic command definition, responsible mainly for creating
100 * Increase Indent and Decrease Indent toolbar buttons as well as for refreshing
101 * UI states.
102 *
103 * Commands of this class do not perform any indentation by themselves. They
104 * delegate this job to content-specific indentation commands (i.e. indentlist).
105 *
106 * @class CKEDITOR.plugins.indent.genericDefinition
107 * @extends CKEDITOR.commandDefinition
108 * @param {CKEDITOR.editor} editor The editor instance this command will be
109 * applied to.
110 * @param {String} name The name of the command.
111 * @param {Boolean} [isIndent] Defines the command as indenting or outdenting.
112 */
113 genericDefinition: function( isIndent ) {
114 /**
115 * Determines whether the command belongs to the indentation family.
116 * Otherwise it is assumed to be an outdenting command.
117 *
118 * @readonly
119 * @property {Boolean} [=false]
120 */
121 this.isIndent = !!isIndent;
122
123 // Mimic naive startDisabled behavior for outdent.
124 this.startDisabled = !this.isIndent;
125 },
126
127 /**
128 * A base class for specific indentation command definitions responsible for
129 * handling a pre-defined set of elements i.e. indentlist for lists or
130 * indentblock for text block elements.
131 *
132 * Commands of this class perform indentation operations and modify the DOM structure.
133 * They listen for events fired by {@link CKEDITOR.plugins.indent.genericDefinition}
134 * and execute defined actions.
135 *
136 * **NOTE**: This is not an {@link CKEDITOR.command editor command}.
137 * Context-specific commands are internal, for indentation system only.
138 *
139 * @class CKEDITOR.plugins.indent.specificDefinition
140 * @param {CKEDITOR.editor} editor The editor instance this command will be
141 * applied to.
142 * @param {String} name The name of the command.
143 * @param {Boolean} [isIndent] Defines the command as indenting or outdenting.
144 */
145 specificDefinition: function( editor, name, isIndent ) {
146 this.name = name;
147 this.editor = editor;
148
149 /**
150 * An object of jobs handled by the command. Each job consists
151 * of two functions: `refresh` and `exec` as well as the execution priority.
152 *
153 * * The `refresh` function determines whether a job is doable for
154 * a particular context. These functions are executed in the
155 * order of priorities, one by one, for all plugins that registered
156 * jobs. As jobs are related to generic commands, refreshing
157 * occurs when the global command is firing the `refresh` event.
158 *
159 * **Note**: This function must return either {@link CKEDITOR#TRISTATE_DISABLED}
160 * or {@link CKEDITOR#TRISTATE_OFF}.
161 *
162 * * The `exec` function modifies the DOM if possible. Just like
163 * `refresh`, `exec` functions are executed in the order of priorities
164 * while the generic command is executed. This function is not executed
165 * if `refresh` for this job returned {@link CKEDITOR#TRISTATE_DISABLED}.
166 *
167 * **Note**: This function must return a Boolean value, indicating whether it
168 * was successful. If a job was successful, then no other jobs are being executed.
169 *
170 * Sample definition:
171 *
172 * command.jobs = {
173 * // Priority = 20.
174 * '20': {
175 * refresh( editor, path ) {
176 * if ( condition )
177 * return CKEDITOR.TRISTATE_OFF;
178 * else
179 * return CKEDITOR.TRISTATE_DISABLED;
180 * },
181 * exec( editor ) {
182 * // DOM modified! This was OK.
183 * return true;
184 * }
185 * },
186 * // Priority = 60. This job is done later.
187 * '60': {
188 * // Another job.
189 * }
190 * };
191 *
192 * For additional information, please check comments for
193 * the `setupGenericListeners` function.
194 *
195 * @readonly
196 * @property {Object} [={}]
197 */
198 this.jobs = {};
199
200 /**
201 * Determines whether the editor that the command belongs to has
202 * {@link CKEDITOR.config#enterMode config.enterMode} set to {@link CKEDITOR#ENTER_BR}.
203 *
204 * @readonly
205 * @see CKEDITOR.config#enterMode
206 * @property {Boolean} [=false]
207 */
208 this.enterBr = editor.config.enterMode == CKEDITOR.ENTER_BR;
209
210 /**
211 * Determines whether the command belongs to the indentation family.
212 * Otherwise it is assumed to be an outdenting command.
213 *
214 * @readonly
215 * @property {Boolean} [=false]
216 */
217 this.isIndent = !!isIndent;
218
219 /**
220 * The name of the global command related to this one.
221 *
222 * @readonly
223 */
224 this.relatedGlobal = isIndent ? 'indent' : 'outdent';
225
226 /**
227 * A keystroke associated with this command (*Tab* or *Shift+Tab*).
228 *
229 * @readonly
230 */
231 this.indentKey = isIndent ? 9 : CKEDITOR.SHIFT + 9;
232
233 /**
234 * Stores created markers for the command so they can eventually be
235 * purged after the `exec` function is run.
236 */
237 this.database = {};
238 },
239
240 /**
241 * Registers content-specific commands as a part of the indentation system
242 * directed by generic commands. Once a command is registered,
243 * it listens for events of a related generic command.
244 *
245 * CKEDITOR.plugins.indent.registerCommands( editor, {
246 * 'indentlist': new indentListCommand( editor, 'indentlist' ),
247 * 'outdentlist': new indentListCommand( editor, 'outdentlist' )
248 * } );
249 *
250 * Content-specific commands listen for the generic command's `exec` and
251 * try to execute their own jobs, one after another. If some execution is
252 * successful, `evt.data.done` is set so no more jobs (commands) are involved.
253 *
254 * Content-specific commands also listen for the generic command's `refresh`
255 * and fill the `evt.data.states` object with states of jobs. A generic command
256 * uses this data to determine its own state and to update the UI.
257 *
258 * @member CKEDITOR.plugins.indent
259 * @param {CKEDITOR.editor} editor The editor instance this command is
260 * applied to.
261 * @param {Object} commands An object of {@link CKEDITOR.command}.
262 */
263 registerCommands: function( editor, commands ) {
264 editor.on( 'pluginsLoaded', function() {
265 for ( var name in commands ) {
266 ( function( editor, command ) {
267 var relatedGlobal = editor.getCommand( command.relatedGlobal );
268
269 for ( var priority in command.jobs ) {
270 // Observe generic exec event and execute command when necessary.
271 // If the command was successfully handled by the command and
272 // DOM has been modified, stop event propagation so no other plugin
273 // will bother. Job is done.
274 relatedGlobal.on( 'exec', function( evt ) {
275 if ( evt.data.done )
276 return;
277
278 // Make sure that anything this command will do is invisible
279 // for undoManager. What undoManager only can see and
280 // remember is the execution of the global command (relatedGlobal).
281 editor.fire( 'lockSnapshot' );
282
283 if ( command.execJob( editor, priority ) )
284 evt.data.done = true;
285
286 editor.fire( 'unlockSnapshot' );
287
288 // Clean up the markers.
289 CKEDITOR.dom.element.clearAllMarkers( command.database );
290 }, this, null, priority );
291
292 // Observe generic refresh event and force command refresh.
293 // Once refreshed, save command state in event data
294 // so generic command plugin can update its own state and UI.
295 relatedGlobal.on( 'refresh', function( evt ) {
296 if ( !evt.data.states )
297 evt.data.states = {};
298
299 evt.data.states[ command.name + '@' + priority ] =
300 command.refreshJob( editor, priority, evt.data.path );
301 }, this, null, priority );
302 }
303
304 // Since specific indent commands have no UI elements,
305 // they need to be manually registered as a editor feature.
306 editor.addFeature( command );
307 } )( this, commands[ name ] );
308 }
309 } );
310 }
311 };
312
313 CKEDITOR.plugins.indent.genericDefinition.prototype = {
314 context: 'p',
315
316 exec: function() {}
317 };
318
319 CKEDITOR.plugins.indent.specificDefinition.prototype = {
320 /**
321 * Executes the content-specific procedure if the context is correct.
322 * It calls the `exec` function of a job of the given `priority`
323 * that modifies the DOM.
324 *
325 * @param {CKEDITOR.editor} editor The editor instance this command
326 * will be applied to.
327 * @param {Number} priority The priority of the job to be executed.
328 * @returns {Boolean} Indicates whether the job was successful.
329 */
330 execJob: function( editor, priority ) {
331 var job = this.jobs[ priority ];
332
333 if ( job.state != TRISTATE_DISABLED )
334 return job.exec.call( this, editor );
335 },
336
337 /**
338 * Calls the `refresh` function of a job of the given `priority`.
339 * The function returns the state of the job which can be either
340 * {@link CKEDITOR#TRISTATE_DISABLED} or {@link CKEDITOR#TRISTATE_OFF}.
341 *
342 * @param {CKEDITOR.editor} editor The editor instance this command
343 * will be applied to.
344 * @param {Number} priority The priority of the job to be executed.
345 * @returns {Number} The state of the job.
346 */
347 refreshJob: function( editor, priority, path ) {
348 var job = this.jobs[ priority ];
349
350 if ( !editor.activeFilter.checkFeature( this ) )
351 job.state = TRISTATE_DISABLED;
352 else
353 job.state = job.refresh.call( this, editor, path );
354
355 return job.state;
356 },
357
358 /**
359 * Checks if the element path contains the element handled
360 * by this indentation command.
361 *
362 * @param {CKEDITOR.dom.elementPath} node A path to be checked.
363 * @returns {CKEDITOR.dom.element}
364 */
365 getContext: function( path ) {
366 return path.contains( this.context );
367 }
368 };
369
370 /**
371 * Attaches event listeners for this generic command. Since the indentation
372 * system is event-oriented, generic commands communicate with
373 * content-specific commands using the `exec` and `refresh` events.
374 *
375 * Listener priorities are crucial. Different indentation phases
376 * are executed with different priorities.
377 *
378 * For the `exec` event:
379 *
380 * * 0: Selection and bookmarks are saved by the generic command.
381 * * 1-99: Content-specific commands try to indent the code by executing
382 * their own jobs ({@link CKEDITOR.plugins.indent.specificDefinition#jobs}).
383 * * 100: Bookmarks are re-selected by the generic command.
384 *
385 * The visual interpretation looks as follows:
386 *
387 * +------------------+
388 * | Exec event fired |
389 * +------ + ---------+
390 * |
391 * 0 -<----------+ Selection and bookmarks saved.
392 * |
393 * |
394 * 25 -<---+ Exec 1st job of plugin#1 (return false, continuing...).
395 * |
396 * |
397 * 50 -<---+ Exec 1st job of plugin#2 (return false, continuing...).
398 * |
399 * |
400 * 75 -<---+ Exec 2nd job of plugin#1 (only if plugin#2 failed).
401 * |
402 * |
403 * 100 -<-----------+ Re-select bookmarks, clean-up.
404 * |
405 * +-------- v ----------+
406 * | Exec event finished |
407 * +---------------------+
408 *
409 * For the `refresh` event:
410 *
411 * * <100: Content-specific commands refresh their job states according
412 * to the given path. Jobs save their states in the `evt.data.states` object
413 * passed along with the event. This can be either {@link CKEDITOR#TRISTATE_DISABLED}
414 * or {@link CKEDITOR#TRISTATE_OFF}.
415 * * 100: Command state is determined according to what states
416 * have been returned by content-specific jobs (`evt.data.states`).
417 * UI elements are updated at this stage.
418 *
419 * **Note**: If there is at least one job with the {@link CKEDITOR#TRISTATE_OFF} state,
420 * then the generic command state is also {@link CKEDITOR#TRISTATE_OFF}. Otherwise,
421 * the command state is {@link CKEDITOR#TRISTATE_DISABLED}.
422 *
423 * @param {CKEDITOR.command} command The command to be set up.
424 * @private
425 */
426 function setupGenericListeners( editor, command ) {
427 var selection, bookmarks;
428
429 // Set the command state according to content-specific
430 // command states.
431 command.on( 'refresh', function( evt ) {
432 // If no state comes with event data, disable command.
433 var states = [ TRISTATE_DISABLED ];
434
435 for ( var s in evt.data.states )
436 states.push( evt.data.states[ s ] );
437
438 this.setState( CKEDITOR.tools.search( states, TRISTATE_OFF ) ? TRISTATE_OFF : TRISTATE_DISABLED );
439 }, command, null, 100 );
440
441 // Initialization. Save bookmarks and mark event as not handled
442 // by any plugin (command) yet.
443 command.on( 'exec', function( evt ) {
444 selection = editor.getSelection();
445 bookmarks = selection.createBookmarks( 1 );
446
447 // Mark execution as not handled yet.
448 if ( !evt.data )
449 evt.data = {};
450
451 evt.data.done = false;
452 }, command, null, 0 );
453
454 // Housekeeping. Make sure selectionChange will be called.
455 // Also re-select previously saved bookmarks.
456 command.on( 'exec', function() {
457 editor.forceNextSelectionCheck();
458 selection.selectBookmarks( bookmarks );
459 }, command, null, 100 );
460 }
461} )();
diff --git a/sources/plugins/indentblock/plugin.js b/sources/plugins/indentblock/plugin.js
new file mode 100644
index 00000000..10265801
--- /dev/null
+++ b/sources/plugins/indentblock/plugin.js
@@ -0,0 +1,298 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Handles the indentation of block elements.
8 */
9
10( function() {
11 'use strict';
12
13 var $listItem = CKEDITOR.dtd.$listItem,
14 $list = CKEDITOR.dtd.$list,
15 TRISTATE_DISABLED = CKEDITOR.TRISTATE_DISABLED,
16 TRISTATE_OFF = CKEDITOR.TRISTATE_OFF;
17
18 CKEDITOR.plugins.add( 'indentblock', {
19 requires: 'indent',
20 init: function( editor ) {
21 var globalHelpers = CKEDITOR.plugins.indent,
22 classes = editor.config.indentClasses;
23
24 // Register commands.
25 globalHelpers.registerCommands( editor, {
26 indentblock: new commandDefinition( editor, 'indentblock', true ),
27 outdentblock: new commandDefinition( editor, 'outdentblock' )
28 } );
29
30 function commandDefinition() {
31 globalHelpers.specificDefinition.apply( this, arguments );
32
33 this.allowedContent = {
34 'div h1 h2 h3 h4 h5 h6 ol p pre ul': {
35 // Do not add elements, but only text-align style if element is validated by other rule.
36 propertiesOnly: true,
37 styles: !classes ? 'margin-left,margin-right' : null,
38 classes: classes || null
39 }
40 };
41
42 if ( this.enterBr )
43 this.allowedContent.div = true;
44
45 this.requiredContent = ( this.enterBr ? 'div' : 'p' ) +
46 ( classes ? '(' + classes.join( ',' ) + ')' : '{margin-left}' );
47
48 this.jobs = {
49 '20': {
50 refresh: function( editor, path ) {
51 var firstBlock = path.block || path.blockLimit;
52
53 // Switch context from somewhere inside list item to list item,
54 // if not found just assign self (doing nothing).
55 if ( !firstBlock.is( $listItem ) ) {
56 var ascendant = firstBlock.getAscendant( $listItem );
57
58 firstBlock = ( ascendant && path.contains( ascendant ) ) || firstBlock;
59 }
60
61 // Switch context from list item to list
62 // because indentblock can indent entire list
63 // but not a single list element.
64
65 if ( firstBlock.is( $listItem ) )
66 firstBlock = firstBlock.getParent();
67
68 // [-] Context in the path or ENTER_BR
69 //
70 // Don't try to indent if the element is out of
71 // this plugin's scope. This assertion is omitted
72 // if ENTER_BR is in use since there may be no block
73 // in the path.
74
75 if ( !this.enterBr && !this.getContext( path ) )
76 return TRISTATE_DISABLED;
77
78 else if ( classes ) {
79
80 // [+] Context in the path or ENTER_BR
81 // [+] IndentClasses
82 //
83 // If there are indentation classes, check if reached
84 // the highest level of indentation. If so, disable
85 // the command.
86
87 if ( indentClassLeft.call( this, firstBlock, classes ) )
88 return TRISTATE_OFF;
89 else
90 return TRISTATE_DISABLED;
91 } else {
92
93 // [+] Context in the path or ENTER_BR
94 // [-] IndentClasses
95 // [+] Indenting
96 //
97 // No indent-level limitations due to indent classes.
98 // Indent-like command can always be executed.
99
100 if ( this.isIndent )
101 return TRISTATE_OFF;
102
103 // [+] Context in the path or ENTER_BR
104 // [-] IndentClasses
105 // [-] Indenting
106 // [-] Block in the path
107 //
108 // No block in path. There's no element to apply indentation
109 // so disable the command.
110
111 else if ( !firstBlock )
112 return TRISTATE_DISABLED;
113
114 // [+] Context in the path or ENTER_BR
115 // [-] IndentClasses
116 // [-] Indenting
117 // [+] Block in path.
118 //
119 // Not using indentClasses but there is firstBlock.
120 // We can calculate current indentation level and
121 // try to increase/decrease it.
122
123 else {
124 return CKEDITOR[
125 ( getIndent( firstBlock ) || 0 ) <= 0 ? 'TRISTATE_DISABLED' : 'TRISTATE_OFF'
126 ];
127 }
128 }
129 },
130
131 exec: function( editor ) {
132 var selection = editor.getSelection(),
133 range = selection && selection.getRanges()[ 0 ],
134 nearestListBlock;
135
136 // If there's some list in the path, then it will be
137 // a full-list indent by increasing or decreasing margin property.
138 if ( ( nearestListBlock = editor.elementPath().contains( $list ) ) )
139 indentElement.call( this, nearestListBlock, classes );
140
141 // If no list in the path, use iterator to indent all the possible
142 // paragraphs in the range, creating them if necessary.
143 else {
144 var iterator = range.createIterator(),
145 enterMode = editor.config.enterMode,
146 block;
147
148 iterator.enforceRealBlocks = true;
149 iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
150
151 while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) ) {
152 if ( !block.isReadOnly() )
153 indentElement.call( this, block, classes );
154 }
155 }
156
157 return true;
158 }
159 }
160 };
161 }
162
163 CKEDITOR.tools.extend( commandDefinition.prototype, globalHelpers.specificDefinition.prototype, {
164 // Elements that, if in an elementpath, will be handled by this
165 // command. They restrict the scope of the plugin.
166 context: { div: 1, dl: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, ul: 1, ol: 1, p: 1, pre: 1, table: 1 },
167
168 // A regex built on config#indentClasses to detect whether an
169 // element has some indentClass or not.
170 classNameRegex: classes ? new RegExp( '(?:^|\\s+)(' + classes.join( '|' ) + ')(?=$|\\s)' ) : null
171 } );
172 }
173 } );
174
175 // Generic indentation procedure for indentation of any element
176 // either with margin property or config#indentClass.
177 function indentElement( element, classes, dir ) {
178 if ( element.getCustomData( 'indent_processed' ) )
179 return;
180
181 var editor = this.editor,
182 isIndent = this.isIndent;
183
184 if ( classes ) {
185 // Transform current class f to indent step index.
186 var indentClass = element.$.className.match( this.classNameRegex ),
187 indentStep = 0;
188
189 if ( indentClass ) {
190 indentClass = indentClass[ 1 ];
191 indentStep = CKEDITOR.tools.indexOf( classes, indentClass ) + 1;
192 }
193
194 // Operate on indent step index, transform indent step index
195 // back to class name.
196 if ( ( indentStep += isIndent ? 1 : -1 ) < 0 )
197 return;
198
199 indentStep = Math.min( indentStep, classes.length );
200 indentStep = Math.max( indentStep, 0 );
201 element.$.className = CKEDITOR.tools.ltrim( element.$.className.replace( this.classNameRegex, '' ) );
202
203 if ( indentStep > 0 )
204 element.addClass( classes[ indentStep - 1 ] );
205 } else {
206 var indentCssProperty = getIndentCss( element, dir ),
207 currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 ),
208 indentOffset = editor.config.indentOffset || 40;
209
210 if ( isNaN( currentOffset ) )
211 currentOffset = 0;
212
213 currentOffset += ( isIndent ? 1 : -1 ) * indentOffset;
214
215 if ( currentOffset < 0 )
216 return;
217
218 currentOffset = Math.max( currentOffset, 0 );
219 currentOffset = Math.ceil( currentOffset / indentOffset ) * indentOffset;
220
221 element.setStyle(
222 indentCssProperty,
223 currentOffset ? currentOffset + ( editor.config.indentUnit || 'px' ) : ''
224 );
225
226 if ( element.getAttribute( 'style' ) === '' )
227 element.removeAttribute( 'style' );
228 }
229
230 CKEDITOR.dom.element.setMarker( this.database, element, 'indent_processed', 1 );
231
232 return;
233 }
234
235 // Method that checks if current indentation level for an element
236 // reached the limit determined by config#indentClasses.
237 function indentClassLeft( node, classes ) {
238 var indentClass = node.$.className.match( this.classNameRegex ),
239 isIndent = this.isIndent;
240
241 // If node has one of the indentClasses:
242 // * If it holds the topmost indentClass, then
243 // no more classes have left.
244 // * If it holds any other indentClass, it can use the next one
245 // or the previous one.
246 // * Outdent is always possible. We can remove indentClass.
247 if ( indentClass )
248 return isIndent ? indentClass[ 1 ] != classes.slice( -1 ) : true;
249
250 // If node has no class which belongs to indentClasses,
251 // then it is at 0-level. It can be indented but not outdented.
252 else
253 return isIndent;
254 }
255
256 // Determines indent CSS property for an element according to
257 // what is the direction of such element. It can be either `margin-left`
258 // or `margin-right`.
259 function getIndentCss( element, dir ) {
260 return ( dir || element.getComputedStyle( 'direction' ) ) == 'ltr' ? 'margin-left' : 'margin-right';
261 }
262
263 // Return the numerical indent value of margin-left|right of an element,
264 // considering element's direction. If element has no margin specified,
265 // NaN is returned.
266 function getIndent( element ) {
267 return parseInt( element.getStyle( getIndentCss( element ) ), 10 );
268 }
269} )();
270
271/**
272 * A list of classes to use for indenting the contents. If set to `null`, no classes will be used
273 * and instead the {@link #indentUnit} and {@link #indentOffset} properties will be used.
274 *
275 * // Use the 'Indent1', 'Indent2', 'Indent3' classes.
276 * config.indentClasses = ['Indent1', 'Indent2', 'Indent3'];
277 *
278 * @cfg {Array} [indentClasses=null]
279 * @member CKEDITOR.config
280 */
281
282/**
283 * The size in {@link CKEDITOR.config#indentUnit indentation units} of each indentation step.
284 *
285 * config.indentOffset = 4;
286 *
287 * @cfg {Number} [indentOffset=40]
288 * @member CKEDITOR.config
289 */
290
291/**
292 * The unit used for {@link CKEDITOR.config#indentOffset indentation offset}.
293 *
294 * config.indentUnit = 'em';
295 *
296 * @cfg {String} [indentUnit='px']
297 * @member CKEDITOR.config
298 */
diff --git a/sources/plugins/indentlist/plugin.js b/sources/plugins/indentlist/plugin.js
new file mode 100644
index 00000000..b88be7ae
--- /dev/null
+++ b/sources/plugins/indentlist/plugin.js
@@ -0,0 +1,318 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Handles the indentation of lists.
8 */
9
10( function() {
11 'use strict';
12
13 var isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),
14 isNotBookmark = CKEDITOR.dom.walker.bookmark( false, true ),
15 TRISTATE_DISABLED = CKEDITOR.TRISTATE_DISABLED,
16 TRISTATE_OFF = CKEDITOR.TRISTATE_OFF;
17
18 CKEDITOR.plugins.add( 'indentlist', {
19 requires: 'indent',
20 init: function( editor ) {
21 var globalHelpers = CKEDITOR.plugins.indent;
22
23 // Register commands.
24 globalHelpers.registerCommands( editor, {
25 indentlist: new commandDefinition( editor, 'indentlist', true ),
26 outdentlist: new commandDefinition( editor, 'outdentlist' )
27 } );
28
29 function commandDefinition( editor ) {
30 globalHelpers.specificDefinition.apply( this, arguments );
31
32 // Require ul OR ol list.
33 this.requiredContent = [ 'ul', 'ol' ];
34
35 // Indent and outdent lists with TAB/SHIFT+TAB key. Indenting can
36 // be done for any list item that isn't the first child of the parent.
37 editor.on( 'key', function( evt ) {
38 if ( editor.mode != 'wysiwyg' )
39 return;
40
41 if ( evt.data.keyCode == this.indentKey ) {
42 var list = this.getContext( editor.elementPath() );
43
44 if ( list ) {
45 // Don't indent if in first list item of the parent.
46 // Outdent, however, can always be done to collapse
47 // the list into a paragraph (div).
48 if ( this.isIndent && CKEDITOR.plugins.indentList.firstItemInPath( this.context, editor.elementPath(), list ) )
49 return;
50
51 // Exec related global indentation command. Global
52 // commands take care of bookmarks and selection,
53 // so it's much easier to use them instead of
54 // content-specific commands.
55 editor.execCommand( this.relatedGlobal );
56
57 // Cancel the key event so editor doesn't lose focus.
58 evt.cancel();
59 }
60 }
61 }, this );
62
63 // There are two different jobs for this plugin:
64 //
65 // * Indent job (priority=10), before indentblock.
66 //
67 // This job is before indentblock because, if this plugin is
68 // loaded it has higher priority over indentblock. It means that,
69 // if possible, nesting is performed, and then block manipulation,
70 // if necessary.
71 //
72 // * Outdent job (priority=30), after outdentblock.
73 //
74 // This job got to be after outdentblock because in some cases
75 // (margin, config#indentClass on list) outdent must be done on
76 // block-level.
77
78 this.jobs[ this.isIndent ? 10 : 30 ] = {
79 refresh: this.isIndent ?
80 function( editor, path ) {
81 var list = this.getContext( path ),
82 inFirstListItem = CKEDITOR.plugins.indentList.firstItemInPath( this.context, path, list );
83
84 if ( !list || !this.isIndent || inFirstListItem )
85 return TRISTATE_DISABLED;
86
87 return TRISTATE_OFF;
88 } : function( editor, path ) {
89 var list = this.getContext( path );
90
91 if ( !list || this.isIndent )
92 return TRISTATE_DISABLED;
93
94 return TRISTATE_OFF;
95 },
96
97 exec: CKEDITOR.tools.bind( indentList, this )
98 };
99 }
100
101 CKEDITOR.tools.extend( commandDefinition.prototype, globalHelpers.specificDefinition.prototype, {
102 // Elements that, if in an elementpath, will be handled by this
103 // command. They restrict the scope of the plugin.
104 context: { ol: 1, ul: 1 }
105 } );
106 }
107 } );
108
109 function indentList( editor ) {
110 var that = this,
111 database = this.database,
112 context = this.context;
113
114 function indent( listNode ) {
115 // Our starting and ending points of the range might be inside some blocks under a list item...
116 // So before playing with the iterator, we need to expand the block to include the list items.
117 var startContainer = range.startContainer,
118 endContainer = range.endContainer;
119 while ( startContainer && !startContainer.getParent().equals( listNode ) )
120 startContainer = startContainer.getParent();
121 while ( endContainer && !endContainer.getParent().equals( listNode ) )
122 endContainer = endContainer.getParent();
123
124 if ( !startContainer || !endContainer )
125 return false;
126
127 // Now we can iterate over the individual items on the same tree depth.
128 var block = startContainer,
129 itemsToMove = [],
130 stopFlag = false;
131
132 while ( !stopFlag ) {
133 if ( block.equals( endContainer ) )
134 stopFlag = true;
135
136 itemsToMove.push( block );
137 block = block.getNext();
138 }
139
140 if ( itemsToMove.length < 1 )
141 return false;
142
143 // Do indent or outdent operations on the array model of the list, not the
144 // list's DOM tree itself. The array model demands that it knows as much as
145 // possible about the surrounding lists, we need to feed it the further
146 // ancestor node that is still a list.
147 var listParents = listNode.getParents( true );
148 for ( var i = 0; i < listParents.length; i++ ) {
149 if ( listParents[ i ].getName && context[ listParents[ i ].getName() ] ) {
150 listNode = listParents[ i ];
151 break;
152 }
153 }
154
155 var indentOffset = that.isIndent ? 1 : -1,
156 startItem = itemsToMove[ 0 ],
157 lastItem = itemsToMove[ itemsToMove.length - 1 ],
158
159 // Convert the list DOM tree into a one dimensional array.
160 listArray = CKEDITOR.plugins.list.listToArray( listNode, database ),
161
162 // Apply indenting or outdenting on the array.
163 baseIndent = listArray[ lastItem.getCustomData( 'listarray_index' ) ].indent;
164
165 for ( i = startItem.getCustomData( 'listarray_index' ); i <= lastItem.getCustomData( 'listarray_index' ); i++ ) {
166 listArray[ i ].indent += indentOffset;
167 // Make sure the newly created sublist get a brand-new element of the same type. (#5372)
168 if ( indentOffset > 0 ) {
169 var listRoot = listArray[ i ].parent;
170 listArray[ i ].parent = new CKEDITOR.dom.element( listRoot.getName(), listRoot.getDocument() );
171 }
172 }
173
174 for ( i = lastItem.getCustomData( 'listarray_index' ) + 1; i < listArray.length && listArray[ i ].indent > baseIndent; i++ )
175 listArray[ i ].indent += indentOffset;
176
177 // Convert the array back to a DOM forest (yes we might have a few subtrees now).
178 // And replace the old list with the new forest.
179 var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, listNode.getDirection() );
180
181 // Avoid nested <li> after outdent even they're visually same,
182 // recording them for later refactoring.(#3982)
183 if ( !that.isIndent ) {
184 var parentLiElement;
185 if ( ( parentLiElement = listNode.getParent() ) && parentLiElement.is( 'li' ) ) {
186 var children = newList.listNode.getChildren(),
187 pendingLis = [],
188 count = children.count(),
189 child;
190
191 for ( i = count - 1; i >= 0; i-- ) {
192 if ( ( child = children.getItem( i ) ) && child.is && child.is( 'li' ) )
193 pendingLis.push( child );
194 }
195 }
196 }
197
198 if ( newList )
199 newList.listNode.replace( listNode );
200
201 // Move the nested <li> to be appeared after the parent.
202 if ( pendingLis && pendingLis.length ) {
203 for ( i = 0; i < pendingLis.length; i++ ) {
204 var li = pendingLis[ i ],
205 followingList = li;
206
207 // Nest preceding <ul>/<ol> inside current <li> if any.
208 while ( ( followingList = followingList.getNext() ) && followingList.is && followingList.getName() in context ) {
209 // IE requires a filler NBSP for nested list inside empty list item,
210 // otherwise the list item will be inaccessiable. (#4476)
211 if ( CKEDITOR.env.needsNbspFiller && !li.getFirst( neitherWhitespacesNorBookmark ) )
212 li.append( range.document.createText( '\u00a0' ) );
213
214 li.append( followingList );
215 }
216
217 li.insertAfter( parentLiElement );
218 }
219 }
220
221 if ( newList )
222 editor.fire( 'contentDomInvalidated' );
223
224 return true;
225 }
226
227 var selection = editor.getSelection(),
228 ranges = selection && selection.getRanges(),
229 iterator = ranges.createIterator(),
230 range;
231
232 while ( ( range = iterator.getNextRange() ) ) {
233 var nearestListBlock = range.getCommonAncestor();
234
235 while ( nearestListBlock && !( nearestListBlock.type == CKEDITOR.NODE_ELEMENT && context[ nearestListBlock.getName() ] ) ) {
236 // Avoid having plugin propagate to parent of editor in inline mode by canceling the indentation. (#12796)
237 if ( editor.editable().equals( nearestListBlock ) ) {
238 nearestListBlock = false;
239 break;
240 }
241 nearestListBlock = nearestListBlock.getParent();
242 }
243
244 // Avoid having selection boundaries out of the list.
245 // <ul><li>[...</li></ul><p>...]</p> => <ul><li>[...]</li></ul><p>...</p>
246 if ( !nearestListBlock ) {
247 if ( ( nearestListBlock = range.startPath().contains( context ) ) )
248 range.setEndAt( nearestListBlock, CKEDITOR.POSITION_BEFORE_END );
249 }
250
251 // Avoid having selection enclose the entire list. (#6138)
252 // [<ul><li>...</li></ul>] =><ul><li>[...]</li></ul>
253 if ( !nearestListBlock ) {
254 var selectedNode = range.getEnclosedNode();
255 if ( selectedNode && selectedNode.type == CKEDITOR.NODE_ELEMENT && selectedNode.getName() in context ) {
256 range.setStartAt( selectedNode, CKEDITOR.POSITION_AFTER_START );
257 range.setEndAt( selectedNode, CKEDITOR.POSITION_BEFORE_END );
258 nearestListBlock = selectedNode;
259 }
260 }
261
262 // Avoid selection anchors under list root.
263 // <ul>[<li>...</li>]</ul> => <ul><li>[...]</li></ul>
264 if ( nearestListBlock && range.startContainer.type == CKEDITOR.NODE_ELEMENT && range.startContainer.getName() in context ) {
265 var walker = new CKEDITOR.dom.walker( range );
266 walker.evaluator = listItem;
267 range.startContainer = walker.next();
268 }
269
270 if ( nearestListBlock && range.endContainer.type == CKEDITOR.NODE_ELEMENT && range.endContainer.getName() in context ) {
271 walker = new CKEDITOR.dom.walker( range );
272 walker.evaluator = listItem;
273 range.endContainer = walker.previous();
274 }
275
276 if ( nearestListBlock )
277 return indent( nearestListBlock );
278 }
279 return 0;
280 }
281
282 // Determines whether a node is a list <li> element.
283 function listItem( node ) {
284 return node.type == CKEDITOR.NODE_ELEMENT && node.is( 'li' );
285 }
286
287 function neitherWhitespacesNorBookmark( node ) {
288 return isNotWhitespaces( node ) && isNotBookmark( node );
289 }
290
291 /**
292 * Global namespace for methods exposed by the Indent List plugin.
293 *
294 * @singleton
295 * @class
296 */
297 CKEDITOR.plugins.indentList = {};
298
299 /**
300 * Checks whether the first child of the list is in the path.
301 * The list can be extracted from the path or given explicitly
302 * e.g. for better performance if cached.
303 *
304 * @since 4.4.6
305 * @param {Object} query See the {@link CKEDITOR.dom.elementPath#contains} method arguments.
306 * @param {CKEDITOR.dom.elementPath} path
307 * @param {CKEDITOR.dom.element} [list]
308 * @returns {Boolean}
309 * @member CKEDITOR.plugins.indentList
310 */
311 CKEDITOR.plugins.indentList.firstItemInPath = function( query, path, list ) {
312 var firstListItemInPath = path.contains( listItem );
313 if ( !list )
314 list = path.contains( query );
315
316 return list && firstListItemInPath && firstListItemInPath.equals( list.getFirst( listItem ) );
317 };
318} )();
diff --git a/sources/plugins/justify/icons/hidpi/justifyblock.png b/sources/plugins/justify/icons/hidpi/justifyblock.png
new file mode 100644
index 00000000..7209fd41
--- /dev/null
+++ b/sources/plugins/justify/icons/hidpi/justifyblock.png
Binary files differ
diff --git a/sources/plugins/justify/icons/hidpi/justifycenter.png b/sources/plugins/justify/icons/hidpi/justifycenter.png
new file mode 100644
index 00000000..365e3205
--- /dev/null
+++ b/sources/plugins/justify/icons/hidpi/justifycenter.png
Binary files differ
diff --git a/sources/plugins/justify/icons/hidpi/justifyleft.png b/sources/plugins/justify/icons/hidpi/justifyleft.png
new file mode 100644
index 00000000..75308c12
--- /dev/null
+++ b/sources/plugins/justify/icons/hidpi/justifyleft.png
Binary files differ
diff --git a/sources/plugins/justify/icons/hidpi/justifyright.png b/sources/plugins/justify/icons/hidpi/justifyright.png
new file mode 100644
index 00000000..de7c3d45
--- /dev/null
+++ b/sources/plugins/justify/icons/hidpi/justifyright.png
Binary files differ
diff --git a/sources/plugins/justify/icons/justifyblock.png b/sources/plugins/justify/icons/justifyblock.png
new file mode 100644
index 00000000..a507be1b
--- /dev/null
+++ b/sources/plugins/justify/icons/justifyblock.png
Binary files differ
diff --git a/sources/plugins/justify/icons/justifycenter.png b/sources/plugins/justify/icons/justifycenter.png
new file mode 100644
index 00000000..f758bc42
--- /dev/null
+++ b/sources/plugins/justify/icons/justifycenter.png
Binary files differ
diff --git a/sources/plugins/justify/icons/justifyleft.png b/sources/plugins/justify/icons/justifyleft.png
new file mode 100644
index 00000000..542ddee3
--- /dev/null
+++ b/sources/plugins/justify/icons/justifyleft.png
Binary files differ
diff --git a/sources/plugins/justify/icons/justifyright.png b/sources/plugins/justify/icons/justifyright.png
new file mode 100644
index 00000000..71a983c9
--- /dev/null
+++ b/sources/plugins/justify/icons/justifyright.png
Binary files differ
diff --git a/sources/plugins/justify/lang/af.js b/sources/plugins/justify/lang/af.js
new file mode 100644
index 00000000..5c427be2
--- /dev/null
+++ b/sources/plugins/justify/lang/af.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'af', {
6 block: 'Uitvul',
7 center: 'Sentreer',
8 left: 'Links oplyn',
9 right: 'Regs oplyn'
10} );
diff --git a/sources/plugins/justify/lang/ar.js b/sources/plugins/justify/lang/ar.js
new file mode 100644
index 00000000..b71602da
--- /dev/null
+++ b/sources/plugins/justify/lang/ar.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ar', {
6 block: 'ضبط',
7 center: 'توسيط',
8 left: 'محاذاة إلى اليسار',
9 right: 'محاذاة إلى اليمين'
10} );
diff --git a/sources/plugins/justify/lang/bg.js b/sources/plugins/justify/lang/bg.js
new file mode 100644
index 00000000..9c292f59
--- /dev/null
+++ b/sources/plugins/justify/lang/bg.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'bg', {
6 block: 'Двустранно подравняване',
7 center: 'Център',
8 left: 'Подравни в ляво',
9 right: 'Подравни в дясно'
10} );
diff --git a/sources/plugins/justify/lang/bn.js b/sources/plugins/justify/lang/bn.js
new file mode 100644
index 00000000..6db6d790
--- /dev/null
+++ b/sources/plugins/justify/lang/bn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'bn', {
6 block: 'ব্লক জাস্টিফাই',
7 center: 'মাঝ বরাবর ঘেষা',
8 left: 'বা দিকে ঘেঁষা',
9 right: 'ডান দিকে ঘেঁষা'
10} );
diff --git a/sources/plugins/justify/lang/bs.js b/sources/plugins/justify/lang/bs.js
new file mode 100644
index 00000000..c8c05a66
--- /dev/null
+++ b/sources/plugins/justify/lang/bs.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'bs', {
6 block: 'Puno poravnanje',
7 center: 'Centralno poravnanje',
8 left: 'Lijevo poravnanje',
9 right: 'Desno poravnanje'
10} );
diff --git a/sources/plugins/justify/lang/ca.js b/sources/plugins/justify/lang/ca.js
new file mode 100644
index 00000000..19fd7ff5
--- /dev/null
+++ b/sources/plugins/justify/lang/ca.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ca', {
6 block: 'Justificat',
7 center: 'Centrat',
8 left: 'Alinea a l\'esquerra',
9 right: 'Alinea a la dreta'
10} );
diff --git a/sources/plugins/justify/lang/cs.js b/sources/plugins/justify/lang/cs.js
new file mode 100644
index 00000000..2463cde9
--- /dev/null
+++ b/sources/plugins/justify/lang/cs.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'cs', {
6 block: 'Zarovnat do bloku',
7 center: 'Zarovnat na střed',
8 left: 'Zarovnat vlevo',
9 right: 'Zarovnat vpravo'
10} );
diff --git a/sources/plugins/justify/lang/cy.js b/sources/plugins/justify/lang/cy.js
new file mode 100644
index 00000000..95b8ac39
--- /dev/null
+++ b/sources/plugins/justify/lang/cy.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'cy', {
6 block: 'Unioni',
7 center: 'Alinio i\'r Canol',
8 left: 'Alinio i\'r Chwith',
9 right: 'Alinio i\'r Dde'
10} );
diff --git a/sources/plugins/justify/lang/da.js b/sources/plugins/justify/lang/da.js
new file mode 100644
index 00000000..433e127b
--- /dev/null
+++ b/sources/plugins/justify/lang/da.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'da', {
6 block: 'Lige margener',
7 center: 'Centreret',
8 left: 'Venstrestillet',
9 right: 'Højrestillet'
10} );
diff --git a/sources/plugins/justify/lang/de.js b/sources/plugins/justify/lang/de.js
new file mode 100644
index 00000000..d1d5ba3a
--- /dev/null
+++ b/sources/plugins/justify/lang/de.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'de', {
6 block: 'Blocksatz',
7 center: 'Zentriert',
8 left: 'Linksbündig',
9 right: 'Rechtsbündig'
10} );
diff --git a/sources/plugins/justify/lang/el.js b/sources/plugins/justify/lang/el.js
new file mode 100644
index 00000000..9930e3a0
--- /dev/null
+++ b/sources/plugins/justify/lang/el.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'el', {
6 block: 'Πλήρης Στοίχιση',
7 center: 'Στο Κέντρο',
8 left: 'Στοίχιση Αριστερά',
9 right: 'Στοίχιση Δεξιά'
10} );
diff --git a/sources/plugins/justify/lang/en-au.js b/sources/plugins/justify/lang/en-au.js
new file mode 100644
index 00000000..76019272
--- /dev/null
+++ b/sources/plugins/justify/lang/en-au.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'en-au', {
6 block: 'Justify',
7 center: 'Centre',
8 left: 'Align Left',
9 right: 'Align Right'
10} );
diff --git a/sources/plugins/justify/lang/en-ca.js b/sources/plugins/justify/lang/en-ca.js
new file mode 100644
index 00000000..b97a749c
--- /dev/null
+++ b/sources/plugins/justify/lang/en-ca.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'en-ca', {
6 block: 'Justify',
7 center: 'Centre',
8 left: 'Align Left',
9 right: 'Align Right'
10} );
diff --git a/sources/plugins/justify/lang/en-gb.js b/sources/plugins/justify/lang/en-gb.js
new file mode 100644
index 00000000..66c27864
--- /dev/null
+++ b/sources/plugins/justify/lang/en-gb.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'en-gb', {
6 block: 'Justify',
7 center: 'Centre',
8 left: 'Align Left',
9 right: 'Align Right'
10} );
diff --git a/sources/plugins/justify/lang/en.js b/sources/plugins/justify/lang/en.js
new file mode 100644
index 00000000..c8054a66
--- /dev/null
+++ b/sources/plugins/justify/lang/en.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'en', {
6 block: 'Justify',
7 center: 'Center',
8 left: 'Align Left',
9 right: 'Align Right'
10} );
diff --git a/sources/plugins/justify/lang/eo.js b/sources/plugins/justify/lang/eo.js
new file mode 100644
index 00000000..9dc56c1e
--- /dev/null
+++ b/sources/plugins/justify/lang/eo.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'eo', {
6 block: 'Ĝisrandigi Ambaŭflanke',
7 center: 'Centrigi',
8 left: 'Ĝisrandigi maldekstren',
9 right: 'Ĝisrandigi dekstren'
10} );
diff --git a/sources/plugins/justify/lang/es.js b/sources/plugins/justify/lang/es.js
new file mode 100644
index 00000000..1c26ef40
--- /dev/null
+++ b/sources/plugins/justify/lang/es.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'es', {
6 block: 'Justificado',
7 center: 'Centrar',
8 left: 'Alinear a Izquierda',
9 right: 'Alinear a Derecha'
10} );
diff --git a/sources/plugins/justify/lang/et.js b/sources/plugins/justify/lang/et.js
new file mode 100644
index 00000000..f91a575d
--- /dev/null
+++ b/sources/plugins/justify/lang/et.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'et', {
6 block: 'Rööpjoondus',
7 center: 'Keskjoondus',
8 left: 'Vasakjoondus',
9 right: 'Paremjoondus'
10} );
diff --git a/sources/plugins/justify/lang/eu.js b/sources/plugins/justify/lang/eu.js
new file mode 100644
index 00000000..3becc223
--- /dev/null
+++ b/sources/plugins/justify/lang/eu.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'eu', {
6 block: 'Justifikatu',
7 center: 'Erdian',
8 left: 'Lerrokatu ezkerrean',
9 right: 'Lerrokatu eskuinean'
10} );
diff --git a/sources/plugins/justify/lang/fa.js b/sources/plugins/justify/lang/fa.js
new file mode 100644
index 00000000..4e8e3088
--- /dev/null
+++ b/sources/plugins/justify/lang/fa.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'fa', {
6 block: 'بلوک چین',
7 center: 'میان چین',
8 left: 'چپ چین',
9 right: 'راست چین'
10} );
diff --git a/sources/plugins/justify/lang/fi.js b/sources/plugins/justify/lang/fi.js
new file mode 100644
index 00000000..52660877
--- /dev/null
+++ b/sources/plugins/justify/lang/fi.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'fi', {
6 block: 'Tasaa molemmat reunat',
7 center: 'Keskitä',
8 left: 'Tasaa vasemmat reunat',
9 right: 'Tasaa oikeat reunat'
10} );
diff --git a/sources/plugins/justify/lang/fo.js b/sources/plugins/justify/lang/fo.js
new file mode 100644
index 00000000..8e8dec5b
--- /dev/null
+++ b/sources/plugins/justify/lang/fo.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'fo', {
6 block: 'Javnir tekstkantar',
7 center: 'Miðsett',
8 left: 'Vinstrasett',
9 right: 'Høgrasett'
10} );
diff --git a/sources/plugins/justify/lang/fr-ca.js b/sources/plugins/justify/lang/fr-ca.js
new file mode 100644
index 00000000..c72309e0
--- /dev/null
+++ b/sources/plugins/justify/lang/fr-ca.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'fr-ca', {
6 block: 'Justifié',
7 center: 'Centré',
8 left: 'Aligner à gauche',
9 right: 'Aligner à Droite'
10} );
diff --git a/sources/plugins/justify/lang/fr.js b/sources/plugins/justify/lang/fr.js
new file mode 100644
index 00000000..f11cd9a9
--- /dev/null
+++ b/sources/plugins/justify/lang/fr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'fr', {
6 block: 'Justifier',
7 center: 'Centrer',
8 left: 'Aligner à gauche',
9 right: 'Aligner à droite'
10} );
diff --git a/sources/plugins/justify/lang/gl.js b/sources/plugins/justify/lang/gl.js
new file mode 100644
index 00000000..da83d3cc
--- /dev/null
+++ b/sources/plugins/justify/lang/gl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'gl', {
6 block: 'Xustificado',
7 center: 'Centrado',
8 left: 'Aliñar á esquerda',
9 right: 'Aliñar á dereita'
10} );
diff --git a/sources/plugins/justify/lang/gu.js b/sources/plugins/justify/lang/gu.js
new file mode 100644
index 00000000..76bbc0c2
--- /dev/null
+++ b/sources/plugins/justify/lang/gu.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'gu', {
6 block: 'બ્લૉક, અંતરાય જસ્ટિફાઇ',
7 center: 'સંકેંદ્રણ/સેંટરિંગ',
8 left: 'ડાબી બાજુએ/બાજુ તરફ',
9 right: 'જમણી બાજુએ/બાજુ તરફ'
10} );
diff --git a/sources/plugins/justify/lang/he.js b/sources/plugins/justify/lang/he.js
new file mode 100644
index 00000000..1bd4204a
--- /dev/null
+++ b/sources/plugins/justify/lang/he.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'he', {
6 block: 'יישור לשוליים',
7 center: 'מרכוז',
8 left: 'יישור לשמאל',
9 right: 'יישור לימין'
10} );
diff --git a/sources/plugins/justify/lang/hi.js b/sources/plugins/justify/lang/hi.js
new file mode 100644
index 00000000..2339f676
--- /dev/null
+++ b/sources/plugins/justify/lang/hi.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'hi', {
6 block: 'ब्लॉक जस्टीफ़ाई',
7 center: 'बीच में',
8 left: 'बायीं तरफ',
9 right: 'दायीं तरफ'
10} );
diff --git a/sources/plugins/justify/lang/hr.js b/sources/plugins/justify/lang/hr.js
new file mode 100644
index 00000000..4db599ae
--- /dev/null
+++ b/sources/plugins/justify/lang/hr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'hr', {
6 block: 'Blok poravnanje',
7 center: 'Središnje poravnanje',
8 left: 'Lijevo poravnanje',
9 right: 'Desno poravnanje'
10} );
diff --git a/sources/plugins/justify/lang/hu.js b/sources/plugins/justify/lang/hu.js
new file mode 100644
index 00000000..5e1a7990
--- /dev/null
+++ b/sources/plugins/justify/lang/hu.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'hu', {
6 block: 'Sorkizárt',
7 center: 'Középre',
8 left: 'Balra',
9 right: 'Jobbra'
10} );
diff --git a/sources/plugins/justify/lang/id.js b/sources/plugins/justify/lang/id.js
new file mode 100644
index 00000000..7dc6aafe
--- /dev/null
+++ b/sources/plugins/justify/lang/id.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'id', {
6 block: 'Rata kiri-kanan',
7 center: 'Pusat',
8 left: 'Align Left', // MISSING
9 right: 'Align Right' // MISSING
10} );
diff --git a/sources/plugins/justify/lang/is.js b/sources/plugins/justify/lang/is.js
new file mode 100644
index 00000000..8d94c59b
--- /dev/null
+++ b/sources/plugins/justify/lang/is.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'is', {
6 block: 'Jafna báðum megin',
7 center: 'Miðja texta',
8 left: 'Vinstrijöfnun',
9 right: 'Hægrijöfnun'
10} );
diff --git a/sources/plugins/justify/lang/it.js b/sources/plugins/justify/lang/it.js
new file mode 100644
index 00000000..71060d6b
--- /dev/null
+++ b/sources/plugins/justify/lang/it.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'it', {
6 block: 'Giustifica',
7 center: 'Centra',
8 left: 'Allinea a sinistra',
9 right: 'Allinea a destra'
10} );
diff --git a/sources/plugins/justify/lang/ja.js b/sources/plugins/justify/lang/ja.js
new file mode 100644
index 00000000..ff972e4a
--- /dev/null
+++ b/sources/plugins/justify/lang/ja.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ja', {
6 block: '両端揃え',
7 center: '中央揃え',
8 left: '左揃え',
9 right: '右揃え'
10} );
diff --git a/sources/plugins/justify/lang/ka.js b/sources/plugins/justify/lang/ka.js
new file mode 100644
index 00000000..7479f064
--- /dev/null
+++ b/sources/plugins/justify/lang/ka.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ka', {
6 block: 'გადასწორება',
7 center: 'შუაში სწორება',
8 left: 'მარცხნივ სწორება',
9 right: 'მარჯვნივ სწორება'
10} );
diff --git a/sources/plugins/justify/lang/km.js b/sources/plugins/justify/lang/km.js
new file mode 100644
index 00000000..8769ba71
--- /dev/null
+++ b/sources/plugins/justify/lang/km.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'km', {
6 block: 'តម្រឹម​ពេញ',
7 center: 'កណ្ដាល',
8 left: 'តម្រឹម​ឆ្វេង',
9 right: 'តម្រឹម​ស្ដាំ'
10} );
diff --git a/sources/plugins/justify/lang/ko.js b/sources/plugins/justify/lang/ko.js
new file mode 100644
index 00000000..4d0bb4cf
--- /dev/null
+++ b/sources/plugins/justify/lang/ko.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ko', {
6 block: '양쪽 맞춤',
7 center: '가운데 정렬',
8 left: '왼쪽 정렬',
9 right: '오른쪽 정렬'
10} );
diff --git a/sources/plugins/justify/lang/ku.js b/sources/plugins/justify/lang/ku.js
new file mode 100644
index 00000000..85b1e409
--- /dev/null
+++ b/sources/plugins/justify/lang/ku.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ku', {
6 block: 'هاوستوونی',
7 center: 'ناوەڕاست',
8 left: 'بەهێڵ کردنی چەپ',
9 right: 'بەهێڵ کردنی ڕاست'
10} );
diff --git a/sources/plugins/justify/lang/lt.js b/sources/plugins/justify/lang/lt.js
new file mode 100644
index 00000000..cef177be
--- /dev/null
+++ b/sources/plugins/justify/lang/lt.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'lt', {
6 block: 'Lygiuoti abi puses',
7 center: 'Centruoti',
8 left: 'Lygiuoti kairę',
9 right: 'Lygiuoti dešinę'
10} );
diff --git a/sources/plugins/justify/lang/lv.js b/sources/plugins/justify/lang/lv.js
new file mode 100644
index 00000000..1711629f
--- /dev/null
+++ b/sources/plugins/justify/lang/lv.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'lv', {
6 block: 'Izlīdzināt malas',
7 center: 'Izlīdzināt pret centru',
8 left: 'Izlīdzināt pa kreisi',
9 right: 'Izlīdzināt pa labi'
10} );
diff --git a/sources/plugins/justify/lang/mk.js b/sources/plugins/justify/lang/mk.js
new file mode 100644
index 00000000..10605fd9
--- /dev/null
+++ b/sources/plugins/justify/lang/mk.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'mk', {
6 block: 'Justify', // MISSING
7 center: 'Center', // MISSING
8 left: 'Align Left', // MISSING
9 right: 'Align Right' // MISSING
10} );
diff --git a/sources/plugins/justify/lang/mn.js b/sources/plugins/justify/lang/mn.js
new file mode 100644
index 00000000..8ecaa78c
--- /dev/null
+++ b/sources/plugins/justify/lang/mn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'mn', {
6 block: 'Тэгшлэх',
7 center: 'Голлуулах',
8 left: 'Зүүн талд тулгах',
9 right: 'Баруун талд тулгах'
10} );
diff --git a/sources/plugins/justify/lang/ms.js b/sources/plugins/justify/lang/ms.js
new file mode 100644
index 00000000..7f1deb15
--- /dev/null
+++ b/sources/plugins/justify/lang/ms.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ms', {
6 block: 'Jajaran Blok',
7 center: 'Jajaran Tengah',
8 left: 'Jajaran Kiri',
9 right: 'Jajaran Kanan'
10} );
diff --git a/sources/plugins/justify/lang/nb.js b/sources/plugins/justify/lang/nb.js
new file mode 100644
index 00000000..2cc4b56b
--- /dev/null
+++ b/sources/plugins/justify/lang/nb.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'nb', {
6 block: 'Blokkjuster',
7 center: 'Midtstill',
8 left: 'Venstrejuster',
9 right: 'Høyrejuster'
10} );
diff --git a/sources/plugins/justify/lang/nl.js b/sources/plugins/justify/lang/nl.js
new file mode 100644
index 00000000..f0ed723c
--- /dev/null
+++ b/sources/plugins/justify/lang/nl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'nl', {
6 block: 'Uitvullen',
7 center: 'Centreren',
8 left: 'Links uitlijnen',
9 right: 'Rechts uitlijnen'
10} );
diff --git a/sources/plugins/justify/lang/no.js b/sources/plugins/justify/lang/no.js
new file mode 100644
index 00000000..cddfd5db
--- /dev/null
+++ b/sources/plugins/justify/lang/no.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'no', {
6 block: 'Blokkjuster',
7 center: 'Midtstill',
8 left: 'Venstrejuster',
9 right: 'Høyrejuster'
10} );
diff --git a/sources/plugins/justify/lang/pl.js b/sources/plugins/justify/lang/pl.js
new file mode 100644
index 00000000..5d1fb432
--- /dev/null
+++ b/sources/plugins/justify/lang/pl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'pl', {
6 block: 'Wyjustuj',
7 center: 'Wyśrodkuj',
8 left: 'Wyrównaj do lewej',
9 right: 'Wyrównaj do prawej'
10} );
diff --git a/sources/plugins/justify/lang/pt-br.js b/sources/plugins/justify/lang/pt-br.js
new file mode 100644
index 00000000..892a00fe
--- /dev/null
+++ b/sources/plugins/justify/lang/pt-br.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'pt-br', {
6 block: 'Justificado',
7 center: 'Centralizar',
8 left: 'Alinhar Esquerda',
9 right: 'Alinhar Direita'
10} );
diff --git a/sources/plugins/justify/lang/pt.js b/sources/plugins/justify/lang/pt.js
new file mode 100644
index 00000000..20abc3b7
--- /dev/null
+++ b/sources/plugins/justify/lang/pt.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'pt', {
6 block: 'Justificado',
7 center: 'Alinhar ao Centro',
8 left: 'Alinhar à esquerda',
9 right: 'Alinhar à direita'
10} );
diff --git a/sources/plugins/justify/lang/ro.js b/sources/plugins/justify/lang/ro.js
new file mode 100644
index 00000000..71db25ce
--- /dev/null
+++ b/sources/plugins/justify/lang/ro.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ro', {
6 block: 'Aliniere în bloc (Block Justify)',
7 center: 'Aliniere centrală',
8 left: 'Aliniere la stânga',
9 right: 'Aliniere la dreapta'
10} );
diff --git a/sources/plugins/justify/lang/ru.js b/sources/plugins/justify/lang/ru.js
new file mode 100644
index 00000000..fcbcf7df
--- /dev/null
+++ b/sources/plugins/justify/lang/ru.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ru', {
6 block: 'По ширине',
7 center: 'По центру',
8 left: 'По левому краю',
9 right: 'По правому краю'
10} );
diff --git a/sources/plugins/justify/lang/si.js b/sources/plugins/justify/lang/si.js
new file mode 100644
index 00000000..e24354a0
--- /dev/null
+++ b/sources/plugins/justify/lang/si.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'si', {
6 block: 'Justify', // MISSING
7 center: 'මධ්‍ය',
8 left: 'Align Left', // MISSING
9 right: 'Align Right' // MISSING
10} );
diff --git a/sources/plugins/justify/lang/sk.js b/sources/plugins/justify/lang/sk.js
new file mode 100644
index 00000000..2ec39eb8
--- /dev/null
+++ b/sources/plugins/justify/lang/sk.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'sk', {
6 block: 'Zarovnať do bloku',
7 center: 'Zarovnať na stred',
8 left: 'Zarovnať vľavo',
9 right: 'Zarovnať vpravo'
10} );
diff --git a/sources/plugins/justify/lang/sl.js b/sources/plugins/justify/lang/sl.js
new file mode 100644
index 00000000..95b5850f
--- /dev/null
+++ b/sources/plugins/justify/lang/sl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'sl', {
6 block: 'Obojestranska poravnava',
7 center: 'Sredinska poravnava',
8 left: 'Leva poravnava',
9 right: 'Desna poravnava'
10} );
diff --git a/sources/plugins/justify/lang/sq.js b/sources/plugins/justify/lang/sq.js
new file mode 100644
index 00000000..73195609
--- /dev/null
+++ b/sources/plugins/justify/lang/sq.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'sq', {
6 block: 'Zgjero',
7 center: 'Qendër',
8 left: 'Rreshto majtas',
9 right: 'Rreshto Djathtas'
10} );
diff --git a/sources/plugins/justify/lang/sr-latn.js b/sources/plugins/justify/lang/sr-latn.js
new file mode 100644
index 00000000..e95d5862
--- /dev/null
+++ b/sources/plugins/justify/lang/sr-latn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'sr-latn', {
6 block: 'Obostrano ravnanje',
7 center: 'Centriran tekst',
8 left: 'Levo ravnanje',
9 right: 'Desno ravnanje'
10} );
diff --git a/sources/plugins/justify/lang/sr.js b/sources/plugins/justify/lang/sr.js
new file mode 100644
index 00000000..91176181
--- /dev/null
+++ b/sources/plugins/justify/lang/sr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'sr', {
6 block: 'Обострано равнање',
7 center: 'Центриран текст',
8 left: 'Лево равнање',
9 right: 'Десно равнање'
10} );
diff --git a/sources/plugins/justify/lang/sv.js b/sources/plugins/justify/lang/sv.js
new file mode 100644
index 00000000..c1d4f44b
--- /dev/null
+++ b/sources/plugins/justify/lang/sv.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'sv', {
6 block: 'Justera till marginaler',
7 center: 'Centrera',
8 left: 'Vänsterjustera',
9 right: 'Högerjustera'
10} );
diff --git a/sources/plugins/justify/lang/th.js b/sources/plugins/justify/lang/th.js
new file mode 100644
index 00000000..682fc9de
--- /dev/null
+++ b/sources/plugins/justify/lang/th.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'th', {
6 block: 'จัดพอดีหน้ากระดาษ',
7 center: 'จัดกึ่งกลาง',
8 left: 'จัดชิดซ้าย',
9 right: 'จัดชิดขวา'
10} );
diff --git a/sources/plugins/justify/lang/tr.js b/sources/plugins/justify/lang/tr.js
new file mode 100644
index 00000000..e51cbe89
--- /dev/null
+++ b/sources/plugins/justify/lang/tr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'tr', {
6 block: 'İki Kenara Yaslanmış',
7 center: 'Ortalanmış',
8 left: 'Sola Dayalı',
9 right: 'Sağa Dayalı'
10} );
diff --git a/sources/plugins/justify/lang/tt.js b/sources/plugins/justify/lang/tt.js
new file mode 100644
index 00000000..fc693413
--- /dev/null
+++ b/sources/plugins/justify/lang/tt.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'tt', {
6 block: 'Киңлеккә карап тигезләү',
7 center: 'Үзәккә тигезләү',
8 left: 'Сул як кырыйдан тигезләү',
9 right: 'Уң як кырыйдан тигезләү'
10} );
diff --git a/sources/plugins/justify/lang/ug.js b/sources/plugins/justify/lang/ug.js
new file mode 100644
index 00000000..3ddbaf51
--- /dev/null
+++ b/sources/plugins/justify/lang/ug.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'ug', {
6 block: 'ئىككى تەرەپتىن توغرىلا',
7 center: 'ئوتتۇرىغا توغرىلا',
8 left: 'سولغا توغرىلا',
9 right: 'ئوڭغا توغرىلا'
10} );
diff --git a/sources/plugins/justify/lang/uk.js b/sources/plugins/justify/lang/uk.js
new file mode 100644
index 00000000..eb74639a
--- /dev/null
+++ b/sources/plugins/justify/lang/uk.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'uk', {
6 block: 'По ширині',
7 center: 'По центру',
8 left: 'По лівому краю',
9 right: 'По правому краю'
10} );
diff --git a/sources/plugins/justify/lang/vi.js b/sources/plugins/justify/lang/vi.js
new file mode 100644
index 00000000..a15674af
--- /dev/null
+++ b/sources/plugins/justify/lang/vi.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'vi', {
6 block: 'Canh đều',
7 center: 'Canh giữa',
8 left: 'Canh trái',
9 right: 'Canh phải'
10} );
diff --git a/sources/plugins/justify/lang/zh-cn.js b/sources/plugins/justify/lang/zh-cn.js
new file mode 100644
index 00000000..f078618c
--- /dev/null
+++ b/sources/plugins/justify/lang/zh-cn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'zh-cn', {
6 block: '两端对齐',
7 center: '居中',
8 left: '左对齐',
9 right: '右对齐'
10} );
diff --git a/sources/plugins/justify/lang/zh.js b/sources/plugins/justify/lang/zh.js
new file mode 100644
index 00000000..00e6ecea
--- /dev/null
+++ b/sources/plugins/justify/lang/zh.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'justify', 'zh', {
6 block: '左右對齊',
7 center: '置中',
8 left: '靠左對齊',
9 right: '靠右對齊'
10} );
diff --git a/sources/plugins/justify/plugin.js b/sources/plugins/justify/plugin.js
new file mode 100644
index 00000000..5be53ecd
--- /dev/null
+++ b/sources/plugins/justify/plugin.js
@@ -0,0 +1,245 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Justify commands.
8 */
9
10( function() {
11 function getAlignment( element, useComputedState ) {
12 useComputedState = useComputedState === undefined || useComputedState;
13
14 var align;
15 if ( useComputedState )
16 align = element.getComputedStyle( 'text-align' );
17 else {
18 while ( !element.hasAttribute || !( element.hasAttribute( 'align' ) || element.getStyle( 'text-align' ) ) ) {
19 var parent = element.getParent();
20 if ( !parent )
21 break;
22 element = parent;
23 }
24 align = element.getStyle( 'text-align' ) || element.getAttribute( 'align' ) || '';
25 }
26
27 // Sometimes computed values doesn't tell.
28 align && ( align = align.replace( /(?:-(?:moz|webkit)-)?(?:start|auto)/i, '' ) );
29
30 !align && useComputedState && ( align = element.getComputedStyle( 'direction' ) == 'rtl' ? 'right' : 'left' );
31
32 return align;
33 }
34
35 function justifyCommand( editor, name, value ) {
36 this.editor = editor;
37 this.name = name;
38 this.value = value;
39 this.context = 'p';
40
41 var classes = editor.config.justifyClasses,
42 blockTag = editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div';
43
44 if ( classes ) {
45 switch ( value ) {
46 case 'left':
47 this.cssClassName = classes[ 0 ];
48 break;
49 case 'center':
50 this.cssClassName = classes[ 1 ];
51 break;
52 case 'right':
53 this.cssClassName = classes[ 2 ];
54 break;
55 case 'justify':
56 this.cssClassName = classes[ 3 ];
57 break;
58 }
59
60 this.cssClassRegex = new RegExp( '(?:^|\\s+)(?:' + classes.join( '|' ) + ')(?=$|\\s)' );
61 this.requiredContent = blockTag + '(' + this.cssClassName + ')';
62 }
63 else {
64 this.requiredContent = blockTag + '{text-align}';
65 }
66
67 this.allowedContent = {
68 'caption div h1 h2 h3 h4 h5 h6 p pre td th li': {
69 // Do not add elements, but only text-align style if element is validated by other rule.
70 propertiesOnly: true,
71 styles: this.cssClassName ? null : 'text-align',
72 classes: this.cssClassName || null
73 }
74 };
75
76 // In enter mode BR we need to allow here for div, because when non other
77 // feature allows div justify is the only plugin that uses it.
78 if ( editor.config.enterMode == CKEDITOR.ENTER_BR )
79 this.allowedContent.div = true;
80 }
81
82 function onDirChanged( e ) {
83 var editor = e.editor;
84
85 var range = editor.createRange();
86 range.setStartBefore( e.data.node );
87 range.setEndAfter( e.data.node );
88
89 var walker = new CKEDITOR.dom.walker( range ),
90 node;
91
92 while ( ( node = walker.next() ) ) {
93 if ( node.type == CKEDITOR.NODE_ELEMENT ) {
94 // A child with the defined dir is to be ignored.
95 if ( !node.equals( e.data.node ) && node.getDirection() ) {
96 range.setStartAfter( node );
97 walker = new CKEDITOR.dom.walker( range );
98 continue;
99 }
100
101 // Switch the alignment.
102 var classes = editor.config.justifyClasses;
103 if ( classes ) {
104 // The left align class.
105 if ( node.hasClass( classes[ 0 ] ) ) {
106 node.removeClass( classes[ 0 ] );
107 node.addClass( classes[ 2 ] );
108 }
109 // The right align class.
110 else if ( node.hasClass( classes[ 2 ] ) ) {
111 node.removeClass( classes[ 2 ] );
112 node.addClass( classes[ 0 ] );
113 }
114 }
115
116 // Always switch CSS margins.
117 var style = 'text-align';
118 var align = node.getStyle( style );
119
120 if ( align == 'left' )
121 node.setStyle( style, 'right' );
122 else if ( align == 'right' )
123 node.setStyle( style, 'left' );
124 }
125 }
126 }
127
128 justifyCommand.prototype = {
129 exec: function( editor ) {
130 var selection = editor.getSelection(),
131 enterMode = editor.config.enterMode;
132
133 if ( !selection )
134 return;
135
136 var bookmarks = selection.createBookmarks(),
137 ranges = selection.getRanges();
138
139 var cssClassName = this.cssClassName,
140 iterator, block;
141
142 var useComputedState = editor.config.useComputedState;
143 useComputedState = useComputedState === undefined || useComputedState;
144
145 for ( var i = ranges.length - 1; i >= 0; i-- ) {
146 iterator = ranges[ i ].createIterator();
147 iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
148
149 while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) ) {
150 if ( block.isReadOnly() )
151 continue;
152
153 block.removeAttribute( 'align' );
154 block.removeStyle( 'text-align' );
155
156 // Remove any of the alignment classes from the className.
157 var className = cssClassName && ( block.$.className = CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) ) );
158
159 var apply = ( this.state == CKEDITOR.TRISTATE_OFF ) && ( !useComputedState || ( getAlignment( block, true ) != this.value ) );
160
161 if ( cssClassName ) {
162 // Append the desired class name.
163 if ( apply )
164 block.addClass( cssClassName );
165 else if ( !className )
166 block.removeAttribute( 'class' );
167 } else if ( apply ) {
168 block.setStyle( 'text-align', this.value );
169 }
170 }
171
172 }
173
174 editor.focus();
175 editor.forceNextSelectionCheck();
176 selection.selectBookmarks( bookmarks );
177 },
178
179 refresh: function( editor, path ) {
180 var firstBlock = path.block || path.blockLimit;
181
182 this.setState( firstBlock.getName() != 'body' && getAlignment( firstBlock, this.editor.config.useComputedState ) == this.value ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
183 }
184 };
185
186 CKEDITOR.plugins.add( 'justify', {
187 // jscs:disable maximumLineLength
188 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
189 // jscs:enable maximumLineLength
190 icons: 'justifyblock,justifycenter,justifyleft,justifyright', // %REMOVE_LINE_CORE%
191 hidpi: true, // %REMOVE_LINE_CORE%
192 init: function( editor ) {
193 if ( editor.blockless )
194 return;
195
196 var left = new justifyCommand( editor, 'justifyleft', 'left' ),
197 center = new justifyCommand( editor, 'justifycenter', 'center' ),
198 right = new justifyCommand( editor, 'justifyright', 'right' ),
199 justify = new justifyCommand( editor, 'justifyblock', 'justify' );
200
201 editor.addCommand( 'justifyleft', left );
202 editor.addCommand( 'justifycenter', center );
203 editor.addCommand( 'justifyright', right );
204 editor.addCommand( 'justifyblock', justify );
205
206 if ( editor.ui.addButton ) {
207 editor.ui.addButton( 'JustifyLeft', {
208 label: editor.lang.justify.left,
209 command: 'justifyleft',
210 toolbar: 'align,10'
211 } );
212 editor.ui.addButton( 'JustifyCenter', {
213 label: editor.lang.justify.center,
214 command: 'justifycenter',
215 toolbar: 'align,20'
216 } );
217 editor.ui.addButton( 'JustifyRight', {
218 label: editor.lang.justify.right,
219 command: 'justifyright',
220 toolbar: 'align,30'
221 } );
222 editor.ui.addButton( 'JustifyBlock', {
223 label: editor.lang.justify.block,
224 command: 'justifyblock',
225 toolbar: 'align,40'
226 } );
227 }
228
229 editor.on( 'dirChanged', onDirChanged );
230 }
231 } );
232} )();
233
234/**
235 * List of classes to use for aligning the contents. If it's `null`, no classes will be used
236 * and instead the corresponding CSS values will be used.
237 *
238 * The array should contain 4 members, in the following order: left, center, right, justify.
239 *
240 * // Use the classes 'AlignLeft', 'AlignCenter', 'AlignRight', 'AlignJustify'
241 * config.justifyClasses = [ 'AlignLeft', 'AlignCenter', 'AlignRight', 'AlignJustify' ];
242 *
243 * @cfg {Array} [justifyClasses=null]
244 * @member CKEDITOR.config
245 */
diff --git a/sources/plugins/link/dialogs/anchor.js b/sources/plugins/link/dialogs/anchor.js
new file mode 100644
index 00000000..899f7dc4
--- /dev/null
+++ b/sources/plugins/link/dialogs/anchor.js
@@ -0,0 +1,105 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'anchor', function( editor ) {
7 // Function called in onShow to load selected element.
8 var loadElements = function( element ) {
9 this._.selectedElement = element;
10
11 var attributeValue = element.data( 'cke-saved-name' );
12 this.setValueOf( 'info', 'txtName', attributeValue || '' );
13 };
14
15 function createFakeAnchor( editor, attributes ) {
16 return editor.createFakeElement( editor.document.createElement( 'a', {
17 attributes: attributes
18 } ), 'cke_anchor', 'anchor' );
19 }
20
21 return {
22 title: editor.lang.link.anchor.title,
23 minWidth: 300,
24 minHeight: 60,
25 onOk: function() {
26 var name = CKEDITOR.tools.trim( this.getValueOf( 'info', 'txtName' ) );
27 var attributes = {
28 id: name,
29 name: name,
30 'data-cke-saved-name': name
31 };
32
33 if ( this._.selectedElement ) {
34 if ( this._.selectedElement.data( 'cke-realelement' ) ) {
35 var newFake = createFakeAnchor( editor, attributes );
36 newFake.replace( this._.selectedElement );
37
38 // Selecting fake element for IE. (#11377)
39 if ( CKEDITOR.env.ie )
40 editor.getSelection().selectElement( newFake );
41 } else {
42 this._.selectedElement.setAttributes( attributes );
43 }
44 } else {
45 var sel = editor.getSelection(),
46 range = sel && sel.getRanges()[ 0 ];
47
48 // Empty anchor
49 if ( range.collapsed ) {
50 var anchor = createFakeAnchor( editor, attributes );
51 range.insertNode( anchor );
52 } else {
53 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 )
54 attributes[ 'class' ] = 'cke_anchor';
55
56 // Apply style.
57 var style = new CKEDITOR.style( { element: 'a', attributes: attributes } );
58 style.type = CKEDITOR.STYLE_INLINE;
59 editor.applyStyle( style );
60 }
61 }
62 },
63
64 onHide: function() {
65 delete this._.selectedElement;
66 },
67
68 onShow: function() {
69 var sel = editor.getSelection(),
70 fullySelected = sel.getSelectedElement(),
71 fakeSelected = fullySelected && fullySelected.data( 'cke-realelement' ),
72 linkElement = fakeSelected ?
73 CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, fullySelected ) :
74 CKEDITOR.plugins.link.getSelectedLink( editor );
75
76 if ( linkElement ) {
77 loadElements.call( this, linkElement );
78 !fakeSelected && sel.selectElement( linkElement );
79
80 if ( fullySelected )
81 this._.selectedElement = fullySelected;
82 }
83
84 this.getContentElement( 'info', 'txtName' ).focus();
85 },
86 contents: [ {
87 id: 'info',
88 label: editor.lang.link.anchor.title,
89 accessKey: 'I',
90 elements: [ {
91 type: 'text',
92 id: 'txtName',
93 label: editor.lang.link.anchor.name,
94 required: true,
95 validate: function() {
96 if ( !this.getValue() ) {
97 alert( editor.lang.link.anchor.errorName ); // jshint ignore:line
98 return false;
99 }
100 return true;
101 }
102 } ]
103 } ]
104 };
105} );
diff --git a/sources/plugins/link/dialogs/link.js b/sources/plugins/link/dialogs/link.js
new file mode 100644
index 00000000..96dd288a
--- /dev/null
+++ b/sources/plugins/link/dialogs/link.js
@@ -0,0 +1,904 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6'use strict';
7
8( function() {
9 CKEDITOR.dialog.add( 'link', function( editor ) {
10 var plugin = CKEDITOR.plugins.link;
11
12 // Handles the event when the "Target" selection box is changed.
13 var targetChanged = function() {
14 var dialog = this.getDialog(),
15 popupFeatures = dialog.getContentElement( 'target', 'popupFeatures' ),
16 targetName = dialog.getContentElement( 'target', 'linkTargetName' ),
17 value = this.getValue();
18
19 if ( !popupFeatures || !targetName )
20 return;
21
22 popupFeatures = popupFeatures.getElement();
23 popupFeatures.hide();
24 targetName.setValue( '' );
25
26 switch ( value ) {
27 case 'frame':
28 targetName.setLabel( editor.lang.link.targetFrameName );
29 targetName.getElement().show();
30 break;
31 case 'popup':
32 popupFeatures.show();
33 targetName.setLabel( editor.lang.link.targetPopupName );
34 targetName.getElement().show();
35 break;
36 default:
37 targetName.setValue( value );
38 targetName.getElement().hide();
39 break;
40 }
41
42 };
43
44 // Handles the event when the "Type" selection box is changed.
45 var linkTypeChanged = function() {
46 var dialog = this.getDialog(),
47 partIds = [ 'urlOptions', 'anchorOptions', 'emailOptions' ],
48 typeValue = this.getValue(),
49 uploadTab = dialog.definition.getContents( 'upload' ),
50 uploadInitiallyHidden = uploadTab && uploadTab.hidden;
51
52 if ( typeValue == 'url' ) {
53 if ( editor.config.linkShowTargetTab )
54 dialog.showPage( 'target' );
55 if ( !uploadInitiallyHidden )
56 dialog.showPage( 'upload' );
57 } else {
58 dialog.hidePage( 'target' );
59 if ( !uploadInitiallyHidden )
60 dialog.hidePage( 'upload' );
61 }
62
63 for ( var i = 0; i < partIds.length; i++ ) {
64 var element = dialog.getContentElement( 'info', partIds[ i ] );
65 if ( !element )
66 continue;
67
68 element = element.getElement().getParent().getParent();
69 if ( partIds[ i ] == typeValue + 'Options' )
70 element.show();
71 else
72 element.hide();
73 }
74
75 dialog.layout();
76 };
77
78 var setupParams = function( page, data ) {
79 if ( data[ page ] )
80 this.setValue( data[ page ][ this.id ] || '' );
81 };
82
83 var setupPopupParams = function( data ) {
84 return setupParams.call( this, 'target', data );
85 };
86
87 var setupAdvParams = function( data ) {
88 return setupParams.call( this, 'advanced', data );
89 };
90
91 var commitParams = function( page, data ) {
92 if ( !data[ page ] )
93 data[ page ] = {};
94
95 data[ page ][ this.id ] = this.getValue() || '';
96 };
97
98 var commitPopupParams = function( data ) {
99 return commitParams.call( this, 'target', data );
100 };
101
102 var commitAdvParams = function( data ) {
103 return commitParams.call( this, 'advanced', data );
104 };
105
106 var commonLang = editor.lang.common,
107 linkLang = editor.lang.link,
108 anchors;
109
110 return {
111 title: linkLang.title,
112 minWidth: 350,
113 minHeight: 230,
114 contents: [ {
115 id: 'info',
116 label: linkLang.info,
117 title: linkLang.info,
118 elements: [ {
119 id: 'linkType',
120 type: 'select',
121 label: linkLang.type,
122 'default': 'url',
123 items: [
124 [ linkLang.toUrl, 'url' ],
125 [ linkLang.toAnchor, 'anchor' ],
126 [ linkLang.toEmail, 'email' ]
127 ],
128 onChange: linkTypeChanged,
129 setup: function( data ) {
130 this.setValue( data.type || 'url' );
131 },
132 commit: function( data ) {
133 data.type = this.getValue();
134 }
135 },
136 {
137 type: 'vbox',
138 id: 'urlOptions',
139 children: [ {
140 type: 'hbox',
141 widths: [ '25%', '75%' ],
142 children: [ {
143 id: 'protocol',
144 type: 'select',
145 label: commonLang.protocol,
146 'default': 'http://',
147 items: [
148 // Force 'ltr' for protocol names in BIDI. (#5433)
149 [ 'http://\u200E', 'http://' ],
150 [ 'https://\u200E', 'https://' ],
151 [ 'ftp://\u200E', 'ftp://' ],
152 [ 'news://\u200E', 'news://' ],
153 [ linkLang.other, '' ]
154 ],
155 setup: function( data ) {
156 if ( data.url )
157 this.setValue( data.url.protocol || '' );
158 },
159 commit: function( data ) {
160 if ( !data.url )
161 data.url = {};
162
163 data.url.protocol = this.getValue();
164 }
165 },
166 {
167 type: 'text',
168 id: 'url',
169 label: commonLang.url,
170 required: true,
171 onLoad: function() {
172 this.allowOnChange = true;
173 },
174 onKeyUp: function() {
175 this.allowOnChange = false;
176 var protocolCmb = this.getDialog().getContentElement( 'info', 'protocol' ),
177 url = this.getValue(),
178 urlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/i,
179 urlOnChangeTestOther = /^((javascript:)|[#\/\.\?])/i;
180
181 var protocol = urlOnChangeProtocol.exec( url );
182 if ( protocol ) {
183 this.setValue( url.substr( protocol[ 0 ].length ) );
184 protocolCmb.setValue( protocol[ 0 ].toLowerCase() );
185 } else if ( urlOnChangeTestOther.test( url ) ) {
186 protocolCmb.setValue( '' );
187 }
188
189 this.allowOnChange = true;
190 },
191 onChange: function() {
192 if ( this.allowOnChange ) // Dont't call on dialog load.
193 this.onKeyUp();
194 },
195 validate: function() {
196 var dialog = this.getDialog();
197
198 if ( dialog.getContentElement( 'info', 'linkType' ) && dialog.getValueOf( 'info', 'linkType' ) != 'url' )
199 return true;
200
201 if ( !editor.config.linkJavaScriptLinksAllowed && ( /javascript\:/ ).test( this.getValue() ) ) {
202 alert( commonLang.invalidValue ); // jshint ignore:line
203 return false;
204 }
205
206 if ( this.getDialog().fakeObj ) // Edit Anchor.
207 return true;
208
209 var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noUrl );
210 return func.apply( this );
211 },
212 setup: function( data ) {
213 this.allowOnChange = false;
214 if ( data.url )
215 this.setValue( data.url.url );
216 this.allowOnChange = true;
217
218 },
219 commit: function( data ) {
220 // IE will not trigger the onChange event if the mouse has been used
221 // to carry all the operations #4724
222 this.onChange();
223
224 if ( !data.url )
225 data.url = {};
226
227 data.url.url = this.getValue();
228 this.allowOnChange = false;
229 }
230 } ],
231 setup: function() {
232 if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
233 this.getElement().show();
234 }
235 },
236 {
237 type: 'button',
238 id: 'browse',
239 hidden: 'true',
240 filebrowser: 'info:url',
241 label: commonLang.browseServer
242 } ]
243 },
244 {
245 type: 'vbox',
246 id: 'anchorOptions',
247 width: 260,
248 align: 'center',
249 padding: 0,
250 children: [ {
251 type: 'fieldset',
252 id: 'selectAnchorText',
253 label: linkLang.selectAnchor,
254 setup: function() {
255 anchors = plugin.getEditorAnchors( editor );
256
257 this.getElement()[ anchors && anchors.length ? 'show' : 'hide' ]();
258 },
259 children: [ {
260 type: 'hbox',
261 id: 'selectAnchor',
262 children: [ {
263 type: 'select',
264 id: 'anchorName',
265 'default': '',
266 label: linkLang.anchorName,
267 style: 'width: 100%;',
268 items: [
269 [ '' ]
270 ],
271 setup: function( data ) {
272 this.clear();
273 this.add( '' );
274
275 if ( anchors ) {
276 for ( var i = 0; i < anchors.length; i++ ) {
277 if ( anchors[ i ].name )
278 this.add( anchors[ i ].name );
279 }
280 }
281
282 if ( data.anchor )
283 this.setValue( data.anchor.name );
284
285 var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
286 if ( linkType && linkType.getValue() == 'email' )
287 this.focus();
288 },
289 commit: function( data ) {
290 if ( !data.anchor )
291 data.anchor = {};
292
293 data.anchor.name = this.getValue();
294 }
295 },
296 {
297 type: 'select',
298 id: 'anchorId',
299 'default': '',
300 label: linkLang.anchorId,
301 style: 'width: 100%;',
302 items: [
303 [ '' ]
304 ],
305 setup: function( data ) {
306 this.clear();
307 this.add( '' );
308
309 if ( anchors ) {
310 for ( var i = 0; i < anchors.length; i++ ) {
311 if ( anchors[ i ].id )
312 this.add( anchors[ i ].id );
313 }
314 }
315
316 if ( data.anchor )
317 this.setValue( data.anchor.id );
318 },
319 commit: function( data ) {
320 if ( !data.anchor )
321 data.anchor = {};
322
323 data.anchor.id = this.getValue();
324 }
325 } ],
326 setup: function() {
327 this.getElement()[ anchors && anchors.length ? 'show' : 'hide' ]();
328 }
329 } ]
330 },
331 {
332 type: 'html',
333 id: 'noAnchors',
334 style: 'text-align: center;',
335 html: '<div role="note" tabIndex="-1">' + CKEDITOR.tools.htmlEncode( linkLang.noAnchors ) + '</div>',
336 // Focus the first element defined in above html.
337 focus: true,
338 setup: function() {
339 this.getElement()[ anchors && anchors.length ? 'hide' : 'show' ]();
340 }
341 } ],
342 setup: function() {
343 if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
344 this.getElement().hide();
345 }
346 },
347 {
348 type: 'vbox',
349 id: 'emailOptions',
350 padding: 1,
351 children: [ {
352 type: 'text',
353 id: 'emailAddress',
354 label: linkLang.emailAddress,
355 required: true,
356 validate: function() {
357 var dialog = this.getDialog();
358
359 if ( !dialog.getContentElement( 'info', 'linkType' ) || dialog.getValueOf( 'info', 'linkType' ) != 'email' )
360 return true;
361
362 var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noEmail );
363 return func.apply( this );
364 },
365 setup: function( data ) {
366 if ( data.email )
367 this.setValue( data.email.address );
368
369 var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
370 if ( linkType && linkType.getValue() == 'email' )
371 this.select();
372 },
373 commit: function( data ) {
374 if ( !data.email )
375 data.email = {};
376
377 data.email.address = this.getValue();
378 }
379 },
380 {
381 type: 'text',
382 id: 'emailSubject',
383 label: linkLang.emailSubject,
384 setup: function( data ) {
385 if ( data.email )
386 this.setValue( data.email.subject );
387 },
388 commit: function( data ) {
389 if ( !data.email )
390 data.email = {};
391
392 data.email.subject = this.getValue();
393 }
394 },
395 {
396 type: 'textarea',
397 id: 'emailBody',
398 label: linkLang.emailBody,
399 rows: 3,
400 'default': '',
401 setup: function( data ) {
402 if ( data.email )
403 this.setValue( data.email.body );
404 },
405 commit: function( data ) {
406 if ( !data.email )
407 data.email = {};
408
409 data.email.body = this.getValue();
410 }
411 } ],
412 setup: function() {
413 if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
414 this.getElement().hide();
415 }
416 } ]
417 },
418 {
419 id: 'target',
420 requiredContent: 'a[target]', // This is not fully correct, because some target option requires JS.
421 label: linkLang.target,
422 title: linkLang.target,
423 elements: [ {
424 type: 'hbox',
425 widths: [ '50%', '50%' ],
426 children: [ {
427 type: 'select',
428 id: 'linkTargetType',
429 label: commonLang.target,
430 'default': 'notSet',
431 style: 'width : 100%;',
432 'items': [
433 [ commonLang.notSet, 'notSet' ],
434 [ linkLang.targetFrame, 'frame' ],
435 [ linkLang.targetPopup, 'popup' ],
436 [ commonLang.targetNew, '_blank' ],
437 [ commonLang.targetTop, '_top' ],
438 [ commonLang.targetSelf, '_self' ],
439 [ commonLang.targetParent, '_parent' ]
440 ],
441 onChange: targetChanged,
442 setup: function( data ) {
443 if ( data.target )
444 this.setValue( data.target.type || 'notSet' );
445 targetChanged.call( this );
446 },
447 commit: function( data ) {
448 if ( !data.target )
449 data.target = {};
450
451 data.target.type = this.getValue();
452 }
453 },
454 {
455 type: 'text',
456 id: 'linkTargetName',
457 label: linkLang.targetFrameName,
458 'default': '',
459 setup: function( data ) {
460 if ( data.target )
461 this.setValue( data.target.name );
462 },
463 commit: function( data ) {
464 if ( !data.target )
465 data.target = {};
466
467 data.target.name = this.getValue().replace( /([^\x00-\x7F]|\s)/gi, '' );
468 }
469 } ]
470 },
471 {
472 type: 'vbox',
473 width: '100%',
474 align: 'center',
475 padding: 2,
476 id: 'popupFeatures',
477 children: [ {
478 type: 'fieldset',
479 label: linkLang.popupFeatures,
480 children: [ {
481 type: 'hbox',
482 children: [ {
483 type: 'checkbox',
484 id: 'resizable',
485 label: linkLang.popupResizable,
486 setup: setupPopupParams,
487 commit: commitPopupParams
488 },
489 {
490 type: 'checkbox',
491 id: 'status',
492 label: linkLang.popupStatusBar,
493 setup: setupPopupParams,
494 commit: commitPopupParams
495
496 } ]
497 },
498 {
499 type: 'hbox',
500 children: [ {
501 type: 'checkbox',
502 id: 'location',
503 label: linkLang.popupLocationBar,
504 setup: setupPopupParams,
505 commit: commitPopupParams
506
507 },
508 {
509 type: 'checkbox',
510 id: 'toolbar',
511 label: linkLang.popupToolbar,
512 setup: setupPopupParams,
513 commit: commitPopupParams
514
515 } ]
516 },
517 {
518 type: 'hbox',
519 children: [ {
520 type: 'checkbox',
521 id: 'menubar',
522 label: linkLang.popupMenuBar,
523 setup: setupPopupParams,
524 commit: commitPopupParams
525
526 },
527 {
528 type: 'checkbox',
529 id: 'fullscreen',
530 label: linkLang.popupFullScreen,
531 setup: setupPopupParams,
532 commit: commitPopupParams
533
534 } ]
535 },
536 {
537 type: 'hbox',
538 children: [ {
539 type: 'checkbox',
540 id: 'scrollbars',
541 label: linkLang.popupScrollBars,
542 setup: setupPopupParams,
543 commit: commitPopupParams
544
545 },
546 {
547 type: 'checkbox',
548 id: 'dependent',
549 label: linkLang.popupDependent,
550 setup: setupPopupParams,
551 commit: commitPopupParams
552
553 } ]
554 },
555 {
556 type: 'hbox',
557 children: [ {
558 type: 'text',
559 widths: [ '50%', '50%' ],
560 labelLayout: 'horizontal',
561 label: commonLang.width,
562 id: 'width',
563 setup: setupPopupParams,
564 commit: commitPopupParams
565
566 },
567 {
568 type: 'text',
569 labelLayout: 'horizontal',
570 widths: [ '50%', '50%' ],
571 label: linkLang.popupLeft,
572 id: 'left',
573 setup: setupPopupParams,
574 commit: commitPopupParams
575
576 } ]
577 },
578 {
579 type: 'hbox',
580 children: [ {
581 type: 'text',
582 labelLayout: 'horizontal',
583 widths: [ '50%', '50%' ],
584 label: commonLang.height,
585 id: 'height',
586 setup: setupPopupParams,
587 commit: commitPopupParams
588
589 },
590 {
591 type: 'text',
592 labelLayout: 'horizontal',
593 label: linkLang.popupTop,
594 widths: [ '50%', '50%' ],
595 id: 'top',
596 setup: setupPopupParams,
597 commit: commitPopupParams
598
599 } ]
600 } ]
601 } ]
602 } ]
603 },
604 {
605 id: 'upload',
606 label: linkLang.upload,
607 title: linkLang.upload,
608 hidden: true,
609 filebrowser: 'uploadButton',
610 elements: [ {
611 type: 'file',
612 id: 'upload',
613 label: commonLang.upload,
614 style: 'height:40px',
615 size: 29
616 },
617 {
618 type: 'fileButton',
619 id: 'uploadButton',
620 label: commonLang.uploadSubmit,
621 filebrowser: 'info:url',
622 'for': [ 'upload', 'upload' ]
623 } ]
624 },
625 {
626 id: 'advanced',
627 label: linkLang.advanced,
628 title: linkLang.advanced,
629 elements: [ {
630 type: 'vbox',
631 padding: 1,
632 children: [ {
633 type: 'hbox',
634 widths: [ '45%', '35%', '20%' ],
635 children: [ {
636 type: 'text',
637 id: 'advId',
638 requiredContent: 'a[id]',
639 label: linkLang.id,
640 setup: setupAdvParams,
641 commit: commitAdvParams
642 },
643 {
644 type: 'select',
645 id: 'advLangDir',
646 requiredContent: 'a[dir]',
647 label: linkLang.langDir,
648 'default': '',
649 style: 'width:110px',
650 items: [
651 [ commonLang.notSet, '' ],
652 [ linkLang.langDirLTR, 'ltr' ],
653 [ linkLang.langDirRTL, 'rtl' ]
654 ],
655 setup: setupAdvParams,
656 commit: commitAdvParams
657 },
658 {
659 type: 'text',
660 id: 'advAccessKey',
661 requiredContent: 'a[accesskey]',
662 width: '80px',
663 label: linkLang.acccessKey,
664 maxLength: 1,
665 setup: setupAdvParams,
666 commit: commitAdvParams
667
668 } ]
669 },
670 {
671 type: 'hbox',
672 widths: [ '45%', '35%', '20%' ],
673 children: [ {
674 type: 'text',
675 label: linkLang.name,
676 id: 'advName',
677 requiredContent: 'a[name]',
678 setup: setupAdvParams,
679 commit: commitAdvParams
680
681 },
682 {
683 type: 'text',
684 label: linkLang.langCode,
685 id: 'advLangCode',
686 requiredContent: 'a[lang]',
687 width: '110px',
688 'default': '',
689 setup: setupAdvParams,
690 commit: commitAdvParams
691
692 },
693 {
694 type: 'text',
695 label: linkLang.tabIndex,
696 id: 'advTabIndex',
697 requiredContent: 'a[tabindex]',
698 width: '80px',
699 maxLength: 5,
700 setup: setupAdvParams,
701 commit: commitAdvParams
702
703 } ]
704 } ]
705 },
706 {
707 type: 'vbox',
708 padding: 1,
709 children: [ {
710 type: 'hbox',
711 widths: [ '45%', '55%' ],
712 children: [ {
713 type: 'text',
714 label: linkLang.advisoryTitle,
715 requiredContent: 'a[title]',
716 'default': '',
717 id: 'advTitle',
718 setup: setupAdvParams,
719 commit: commitAdvParams
720
721 },
722 {
723 type: 'text',
724 label: linkLang.advisoryContentType,
725 requiredContent: 'a[type]',
726 'default': '',
727 id: 'advContentType',
728 setup: setupAdvParams,
729 commit: commitAdvParams
730
731 } ]
732 },
733 {
734 type: 'hbox',
735 widths: [ '45%', '55%' ],
736 children: [ {
737 type: 'text',
738 label: linkLang.cssClasses,
739 requiredContent: 'a(cke-xyz)', // Random text like 'xyz' will check if all are allowed.
740 'default': '',
741 id: 'advCSSClasses',
742 setup: setupAdvParams,
743 commit: commitAdvParams
744
745 },
746 {
747 type: 'text',
748 label: linkLang.charset,
749 requiredContent: 'a[charset]',
750 'default': '',
751 id: 'advCharset',
752 setup: setupAdvParams,
753 commit: commitAdvParams
754
755 } ]
756 },
757 {
758 type: 'hbox',
759 widths: [ '45%', '55%' ],
760 children: [ {
761 type: 'text',
762 label: linkLang.rel,
763 requiredContent: 'a[rel]',
764 'default': '',
765 id: 'advRel',
766 setup: setupAdvParams,
767 commit: commitAdvParams
768 },
769 {
770 type: 'text',
771 label: linkLang.styles,
772 requiredContent: 'a{cke-xyz}', // Random text like 'xyz' will check if all are allowed.
773 'default': '',
774 id: 'advStyles',
775 validate: CKEDITOR.dialog.validate.inlineStyle( editor.lang.common.invalidInlineStyle ),
776 setup: setupAdvParams,
777 commit: commitAdvParams
778 } ]
779 } ]
780 } ]
781 } ],
782 onShow: function() {
783 var editor = this.getParentEditor(),
784 selection = editor.getSelection(),
785 element = null;
786
787 // Fill in all the relevant fields if there's already one link selected.
788 if ( ( element = plugin.getSelectedLink( editor ) ) && element.hasAttribute( 'href' ) ) {
789 // Don't change selection if some element is already selected.
790 // For example - don't destroy fake selection.
791 if ( !selection.getSelectedElement() )
792 selection.selectElement( element );
793 } else {
794 element = null;
795 }
796
797 var data = plugin.parseLinkAttributes( editor, element );
798
799 // Record down the selected element in the dialog.
800 this._.selectedElement = element;
801
802 this.setupContent( data );
803 },
804 onOk: function() {
805 var data = {};
806
807 // Collect data from fields.
808 this.commitContent( data );
809
810 var selection = editor.getSelection(),
811 attributes = plugin.getLinkAttributes( editor, data );
812
813 if ( !this._.selectedElement ) {
814 var range = selection.getRanges()[ 0 ];
815
816 // Use link URL as text with a collapsed cursor.
817 if ( range.collapsed ) {
818 // Short mailto link text view (#5736).
819 var text = new CKEDITOR.dom.text( data.type == 'email' ?
820 data.email.address : attributes.set[ 'data-cke-saved-href' ], editor.document );
821 range.insertNode( text );
822 range.selectNodeContents( text );
823 }
824
825 // Apply style.
826 var style = new CKEDITOR.style( {
827 element: 'a',
828 attributes: attributes.set
829 } );
830
831 style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.
832 style.applyToRange( range, editor );
833 range.select();
834 } else {
835 // We're only editing an existing link, so just overwrite the attributes.
836 var element = this._.selectedElement,
837 href = element.data( 'cke-saved-href' ),
838 textView = element.getHtml();
839
840 element.setAttributes( attributes.set );
841 element.removeAttributes( attributes.removed );
842
843 // Update text view when user changes protocol (#4612).
844 if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) {
845 // Short mailto link text view (#5736).
846 element.setHtml( data.type == 'email' ?
847 data.email.address : attributes.set[ 'data-cke-saved-href' ] );
848
849 // We changed the content, so need to select it again.
850 selection.selectElement( element );
851 }
852
853 delete this._.selectedElement;
854 }
855 },
856 onLoad: function() {
857 if ( !editor.config.linkShowAdvancedTab )
858 this.hidePage( 'advanced' ); //Hide Advanded tab.
859
860 if ( !editor.config.linkShowTargetTab )
861 this.hidePage( 'target' ); //Hide Target tab.
862 },
863 // Inital focus on 'url' field if link is of type URL.
864 onFocus: function() {
865 var linkType = this.getContentElement( 'info', 'linkType' ),
866 urlField;
867
868 if ( linkType && linkType.getValue() == 'url' ) {
869 urlField = this.getContentElement( 'info', 'url' );
870 urlField.select();
871 }
872 }
873 };
874 } );
875} )();
876// jscs:disable maximumLineLength
877/**
878 * The e-mail address anti-spam protection option. The protection will be
879 * applied when creating or modifying e-mail links through the editor interface.
880 *
881 * Two methods of protection can be chosen:
882 *
883 * 1. The e-mail parts (name, domain, and any other query string) are
884 * assembled into a function call pattern. Such function must be
885 * provided by the developer in the pages that will use the contents.
886 * 2. Only the e-mail address is obfuscated into a special string that
887 * has no meaning for humans or spam bots, but which is properly
888 * rendered and accepted by the browser.
889 *
890 * Both approaches require JavaScript to be enabled.
891 *
892 * // href="mailto:tester@ckeditor.com?subject=subject&body=body"
893 * config.emailProtection = '';
894 *
895 * // href="<a href=\"javascript:void(location.href=\'mailto:\'+String.fromCharCode(116,101,115,116,101,114,64,99,107,101,100,105,116,111,114,46,99,111,109)+\'?subject=subject&body=body\')\">e-mail</a>"
896 * config.emailProtection = 'encode';
897 *
898 * // href="javascript:mt('tester','ckeditor.com','subject','body')"
899 * config.emailProtection = 'mt(NAME,DOMAIN,SUBJECT,BODY)';
900 *
901 * @since 3.1
902 * @cfg {String} [emailProtection='' (empty string = disabled)]
903 * @member CKEDITOR.config
904 */
diff --git a/sources/plugins/link/icons/anchor-rtl.png b/sources/plugins/link/icons/anchor-rtl.png
new file mode 100644
index 00000000..87d717d8
--- /dev/null
+++ b/sources/plugins/link/icons/anchor-rtl.png
Binary files differ
diff --git a/sources/plugins/link/icons/anchor.png b/sources/plugins/link/icons/anchor.png
new file mode 100644
index 00000000..0ca085f7
--- /dev/null
+++ b/sources/plugins/link/icons/anchor.png
Binary files differ
diff --git a/sources/plugins/link/icons/hidpi/anchor-rtl.png b/sources/plugins/link/icons/hidpi/anchor-rtl.png
new file mode 100644
index 00000000..cd6d4ea6
--- /dev/null
+++ b/sources/plugins/link/icons/hidpi/anchor-rtl.png
Binary files differ
diff --git a/sources/plugins/link/icons/hidpi/anchor.png b/sources/plugins/link/icons/hidpi/anchor.png
new file mode 100644
index 00000000..c5869db8
--- /dev/null
+++ b/sources/plugins/link/icons/hidpi/anchor.png
Binary files differ
diff --git a/sources/plugins/link/icons/hidpi/link.png b/sources/plugins/link/icons/hidpi/link.png
new file mode 100644
index 00000000..bb8a0691
--- /dev/null
+++ b/sources/plugins/link/icons/hidpi/link.png
Binary files differ
diff --git a/sources/plugins/link/icons/hidpi/unlink.png b/sources/plugins/link/icons/hidpi/unlink.png
new file mode 100644
index 00000000..5af59c26
--- /dev/null
+++ b/sources/plugins/link/icons/hidpi/unlink.png
Binary files differ
diff --git a/sources/plugins/link/icons/link.png b/sources/plugins/link/icons/link.png
new file mode 100644
index 00000000..95092d03
--- /dev/null
+++ b/sources/plugins/link/icons/link.png
Binary files differ
diff --git a/sources/plugins/link/icons/unlink.png b/sources/plugins/link/icons/unlink.png
new file mode 100644
index 00000000..33a15999
--- /dev/null
+++ b/sources/plugins/link/icons/unlink.png
Binary files differ
diff --git a/sources/plugins/link/images/anchor.png b/sources/plugins/link/images/anchor.png
new file mode 100644
index 00000000..6d861a0e
--- /dev/null
+++ b/sources/plugins/link/images/anchor.png
Binary files differ
diff --git a/sources/plugins/link/images/hidpi/anchor.png b/sources/plugins/link/images/hidpi/anchor.png
new file mode 100644
index 00000000..f5048430
--- /dev/null
+++ b/sources/plugins/link/images/hidpi/anchor.png
Binary files differ
diff --git a/sources/plugins/link/lang/af.js b/sources/plugins/link/lang/af.js
new file mode 100644
index 00000000..4966cf2f
--- /dev/null
+++ b/sources/plugins/link/lang/af.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'af', {
6 acccessKey: 'Toegangsleutel',
7 advanced: 'Gevorderd',
8 advisoryContentType: 'Aanbevole inhoudstipe',
9 advisoryTitle: 'Aanbevole titel',
10 anchor: {
11 toolbar: 'Anker byvoeg/verander',
12 menu: 'Anker-eienskappe',
13 title: 'Anker-eienskappe',
14 name: 'Ankernaam',
15 errorName: 'Voltooi die ankernaam asseblief',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Op element Id',
19 anchorName: 'Op ankernaam',
20 charset: 'Karakterstel van geskakelde bron',
21 cssClasses: 'CSS klasse',
22 emailAddress: 'E-posadres',
23 emailBody: 'Berig-inhoud',
24 emailSubject: 'Berig-onderwerp',
25 id: 'Id',
26 info: 'Skakel informasie',
27 langCode: 'Taalkode',
28 langDir: 'Skryfrigting',
29 langDirLTR: 'Links na regs (LTR)',
30 langDirRTL: 'Regs na links (RTL)',
31 menu: 'Wysig skakel',
32 name: 'Naam',
33 noAnchors: '(Geen ankers beskikbaar in dokument)',
34 noEmail: 'Gee die e-posadres',
35 noUrl: 'Gee die skakel se URL',
36 other: '<ander>',
37 popupDependent: 'Afhanklik (Netscape)',
38 popupFeatures: 'Eienskappe van opspringvenster',
39 popupFullScreen: 'Volskerm (IE)',
40 popupLeft: 'Posisie links',
41 popupLocationBar: 'Adresbalk',
42 popupMenuBar: 'Spyskaartbalk',
43 popupResizable: 'Herskaalbaar',
44 popupScrollBars: 'Skuifbalke',
45 popupStatusBar: 'Statusbalk',
46 popupToolbar: 'Werkbalk',
47 popupTop: 'Posisie bo',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Kies \'n anker',
50 styles: 'Styl',
51 tabIndex: 'Tab indeks',
52 target: 'Doel',
53 targetFrame: '<raam>',
54 targetFrameName: 'Naam van doelraam',
55 targetPopup: '<opspringvenster>',
56 targetPopupName: 'Naam van opspringvenster',
57 title: 'Skakel',
58 toAnchor: 'Anker in bladsy',
59 toEmail: 'E-pos',
60 toUrl: 'URL',
61 toolbar: 'Skakel invoeg/wysig',
62 type: 'Skakelsoort',
63 unlink: 'Verwyder skakel',
64 upload: 'Oplaai'
65} );
diff --git a/sources/plugins/link/lang/ar.js b/sources/plugins/link/lang/ar.js
new file mode 100644
index 00000000..96328657
--- /dev/null
+++ b/sources/plugins/link/lang/ar.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ar', {
6 acccessKey: 'مفاتيح الإختصار',
7 advanced: 'متقدم',
8 advisoryContentType: 'نوع التقرير',
9 advisoryTitle: 'عنوان التقرير',
10 anchor: {
11 toolbar: 'إشارة مرجعية',
12 menu: 'تحرير الإشارة المرجعية',
13 title: 'خصائص الإشارة المرجعية',
14 name: 'اسم الإشارة المرجعية',
15 errorName: 'الرجاء كتابة اسم الإشارة المرجعية',
16 remove: 'إزالة الإشارة المرجعية'
17 },
18 anchorId: 'حسب رقم العنصر',
19 anchorName: 'حسب إسم الإشارة المرجعية',
20 charset: 'ترميز المادة المطلوبة',
21 cssClasses: 'فئات التنسيق',
22 emailAddress: 'البريد الإلكتروني',
23 emailBody: 'محتوى الرسالة',
24 emailSubject: 'موضوع الرسالة',
25 id: 'هوية',
26 info: 'معلومات الرابط',
27 langCode: 'رمز اللغة',
28 langDir: 'إتجاه نص اللغة',
29 langDirLTR: 'اليسار لليمين (LTR)',
30 langDirRTL: 'اليمين لليسار (RTL)',
31 menu: 'تحرير الرابط',
32 name: 'إسم',
33 noAnchors: '(لا توجد علامات مرجعية في هذا المستند)',
34 noEmail: 'الرجاء كتابة الريد الإلكتروني',
35 noUrl: 'الرجاء كتابة رابط الموقع',
36 other: '<أخرى>',
37 popupDependent: 'تابع (Netscape)',
38 popupFeatures: 'خصائص النافذة المنبثقة',
39 popupFullScreen: 'ملئ الشاشة (IE)',
40 popupLeft: 'التمركز لليسار',
41 popupLocationBar: 'شريط العنوان',
42 popupMenuBar: 'القوائم الرئيسية',
43 popupResizable: 'قابلة التشكيل',
44 popupScrollBars: 'أشرطة التمرير',
45 popupStatusBar: 'شريط الحالة',
46 popupToolbar: 'شريط الأدوات',
47 popupTop: 'التمركز للأعلى',
48 rel: 'العلاقة',
49 selectAnchor: 'اختر علامة مرجعية',
50 styles: 'نمط',
51 tabIndex: 'الترتيب',
52 target: 'هدف الرابط',
53 targetFrame: '<إطار>',
54 targetFrameName: 'اسم الإطار المستهدف',
55 targetPopup: '<نافذة منبثقة>',
56 targetPopupName: 'اسم النافذة المنبثقة',
57 title: 'رابط',
58 toAnchor: 'مكان في هذا المستند',
59 toEmail: 'بريد إلكتروني',
60 toUrl: 'الرابط',
61 toolbar: 'رابط',
62 type: 'نوع الربط',
63 unlink: 'إزالة رابط',
64 upload: 'رفع'
65} );
diff --git a/sources/plugins/link/lang/bg.js b/sources/plugins/link/lang/bg.js
new file mode 100644
index 00000000..7ba8e6f8
--- /dev/null
+++ b/sources/plugins/link/lang/bg.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'bg', {
6 acccessKey: 'Ключ за достъп',
7 advanced: 'Разширено',
8 advisoryContentType: 'Препоръчителен тип на съдържанието',
9 advisoryTitle: 'Препоръчително заглавие',
10 anchor: {
11 toolbar: 'Котва',
12 menu: 'Промяна на котва',
13 title: 'Настройки на котва',
14 name: 'Име на котва',
15 errorName: 'Моля въведете име на котвата',
16 remove: 'Премахване на котва'
17 },
18 anchorId: 'По ID на елемент',
19 anchorName: 'По име на котва',
20 charset: 'Тип на свързания ресурс',
21 cssClasses: 'Класове за CSS',
22 emailAddress: 'E-mail aдрес',
23 emailBody: 'Съдържание',
24 emailSubject: 'Тема',
25 id: 'ID',
26 info: 'Инфо за връзката',
27 langCode: 'Код за езика',
28 langDir: 'Посока на езика',
29 langDirLTR: 'Ляво на Дясно (ЛнД)',
30 langDirRTL: 'Дясно на Ляво (ДнЛ)',
31 menu: 'Промяна на връзка',
32 name: 'Име',
33 noAnchors: '(Няма котви в текущия документ)',
34 noEmail: 'Моля въведете e-mail aдрес',
35 noUrl: 'Моля въведете URL адреса',
36 other: '<друго>',
37 popupDependent: 'Зависимост (Netscape)',
38 popupFeatures: 'Функции на изкачащ прозорец',
39 popupFullScreen: 'Цял екран (IE)',
40 popupLeft: 'Лява позиция',
41 popupLocationBar: 'Лента с локацията',
42 popupMenuBar: 'Лента за меню',
43 popupResizable: 'Оразмеряем',
44 popupScrollBars: 'Скролери',
45 popupStatusBar: 'Статусна лента',
46 popupToolbar: 'Лента с инструменти',
47 popupTop: 'Горна позиция',
48 rel: 'Връзка',
49 selectAnchor: 'Изберете котва',
50 styles: 'Стил',
51 tabIndex: 'Ред на достъп',
52 target: 'Цел',
53 targetFrame: '<frame>',
54 targetFrameName: 'Име на целевият прозорец',
55 targetPopup: '<изкачащ прозорец>',
56 targetPopupName: 'Име на изкачащ прозорец',
57 title: 'Връзка',
58 toAnchor: 'Връзка към котва в текста',
59 toEmail: 'E-mail',
60 toUrl: 'Уеб адрес',
61 toolbar: 'Връзка',
62 type: 'Тип на връзката',
63 unlink: 'Премахни връзката',
64 upload: 'Качване'
65} );
diff --git a/sources/plugins/link/lang/bn.js b/sources/plugins/link/lang/bn.js
new file mode 100644
index 00000000..de679848
--- /dev/null
+++ b/sources/plugins/link/lang/bn.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'bn', {
6 acccessKey: 'এক্সেস কী',
7 advanced: 'এডভান্সড',
8 advisoryContentType: 'পরামর্শ কন্টেন্টের প্রকার',
9 advisoryTitle: 'পরামর্শ শীর্ষক',
10 anchor: {
11 toolbar: 'নোঙ্গর',
12 menu: 'নোঙর প্রোপার্টি',
13 title: 'নোঙর প্রোপার্টি',
14 name: 'নোঙরের নাম',
15 errorName: 'নোঙরের নাম টাইপ করুন',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'নোঙরের আইডি দিয়ে',
19 anchorName: 'নোঙরের নাম দিয়ে',
20 charset: 'লিংক রিসোর্স ক্যারেক্টর সেট',
21 cssClasses: 'স্টাইল-শীট ক্লাস',
22 emailAddress: 'ইমেইল ঠিকানা',
23 emailBody: 'মেসেজের দেহ',
24 emailSubject: 'মেসেজের বিষয়',
25 id: 'আইডি',
26 info: 'লিংক তথ্য',
27 langCode: 'ভাষা লেখার দিক',
28 langDir: 'ভাষা লেখার দিক',
29 langDirLTR: 'বাম থেকে ডান (LTR)',
30 langDirRTL: 'ডান থেকে বাম (RTL)',
31 menu: 'লিংক সম্পাদন',
32 name: 'নাম',
33 noAnchors: '(No anchors available in the document)', // MISSING
34 noEmail: 'অনুগ্রহ করে ইমেইল এড্রেস টাইপ করুন',
35 noUrl: 'অনুগ্রহ করে URL লিংক টাইপ করুন',
36 other: '<other>', // MISSING
37 popupDependent: 'ডিপেন্ডেন্ট (Netscape)',
38 popupFeatures: 'পপআপ উইন্ডো ফীচার সমূহ',
39 popupFullScreen: 'পূর্ণ পর্দা জুড়ে (IE)',
40 popupLeft: 'বামের পজিশন',
41 popupLocationBar: 'লোকেশন বার',
42 popupMenuBar: 'মেন্যু বার',
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'স্ক্রল বার',
45 popupStatusBar: 'স্ট্যাটাস বার',
46 popupToolbar: 'টুল বার',
47 popupTop: 'ডানের পজিশন',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'নোঙর বাছাই',
50 styles: 'স্টাইল',
51 tabIndex: 'ট্যাব ইন্ডেক্স',
52 target: 'টার্গেট',
53 targetFrame: '<ফ্রেম>',
54 targetFrameName: 'টার্গেট ফ্রেমের নাম',
55 targetPopup: '<পপআপ উইন্ডো>',
56 targetPopupName: 'পপআপ উইন্ডোর নাম',
57 title: 'লিংক',
58 toAnchor: 'এই পেজে নোঙর কর',
59 toEmail: 'ইমেইল',
60 toUrl: 'URL',
61 toolbar: 'লিংক যুক্ত কর',
62 type: 'লিংক প্রকার',
63 unlink: 'লিংক সরাও',
64 upload: 'আপলোড'
65} );
diff --git a/sources/plugins/link/lang/bs.js b/sources/plugins/link/lang/bs.js
new file mode 100644
index 00000000..02fec2e1
--- /dev/null
+++ b/sources/plugins/link/lang/bs.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'bs', {
6 acccessKey: 'Pristupna tipka',
7 advanced: 'Naprednije',
8 advisoryContentType: 'Advisory vrsta sadržaja',
9 advisoryTitle: 'Advisory title',
10 anchor: {
11 toolbar: 'Anchor',
12 menu: 'Edit Anchor',
13 title: 'Anchor Properties',
14 name: 'Anchor Name',
15 errorName: 'Please type the anchor name',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Po Id-u elementa',
19 anchorName: 'Po nazivu sidra',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Klase CSS stilova',
22 emailAddress: 'E-Mail Adresa',
23 emailBody: 'Poruka',
24 emailSubject: 'Subjekt poruke',
25 id: 'Id',
26 info: 'Link info',
27 langCode: 'Smjer pisanja',
28 langDir: 'Smjer pisanja',
29 langDirLTR: 'S lijeva na desno (LTR)',
30 langDirRTL: 'S desna na lijevo (RTL)',
31 menu: 'Izmjeni link',
32 name: 'Naziv',
33 noAnchors: '(Nema dostupnih sidra na stranici)',
34 noEmail: 'Molimo ukucajte e-mail adresu',
35 noUrl: 'Molimo ukucajte URL link',
36 other: '<other>', // MISSING
37 popupDependent: 'Ovisno (Netscape)',
38 popupFeatures: 'Moguænosti popup prozora',
39 popupFullScreen: 'Cijeli ekran (IE)',
40 popupLeft: 'Lijeva pozicija',
41 popupLocationBar: 'Traka za lokaciju',
42 popupMenuBar: 'Izborna traka',
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Scroll traka',
45 popupStatusBar: 'Statusna traka',
46 popupToolbar: 'Traka sa alatima',
47 popupTop: 'Gornja pozicija',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Izaberi sidro',
50 styles: 'Stil',
51 tabIndex: 'Tab indeks',
52 target: 'Prozor',
53 targetFrame: '<frejm>',
54 targetFrameName: 'Target Frame Name', // MISSING
55 targetPopup: '<popup prozor>',
56 targetPopupName: 'Naziv popup prozora',
57 title: 'Link',
58 toAnchor: 'Sidro na ovoj stranici',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Ubaci/Izmjeni link',
62 type: 'Tip linka',
63 unlink: 'Izbriši link',
64 upload: 'Šalji'
65} );
diff --git a/sources/plugins/link/lang/ca.js b/sources/plugins/link/lang/ca.js
new file mode 100644
index 00000000..59dde6d4
--- /dev/null
+++ b/sources/plugins/link/lang/ca.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ca', {
6 acccessKey: 'Clau d\'accés',
7 advanced: 'Avançat',
8 advisoryContentType: 'Tipus de contingut consultiu',
9 advisoryTitle: 'Títol consultiu',
10 anchor: {
11 toolbar: 'Insereix/Edita àncora',
12 menu: 'Propietats de l\'àncora',
13 title: 'Propietats de l\'àncora',
14 name: 'Nom de l\'àncora',
15 errorName: 'Si us plau, escriviu el nom de l\'ancora',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Per Id d\'element',
19 anchorName: 'Per nom d\'àncora',
20 charset: 'Conjunt de caràcters font enllaçat',
21 cssClasses: 'Classes del full d\'estil',
22 emailAddress: 'Adreça de correu electrònic',
23 emailBody: 'Cos del missatge',
24 emailSubject: 'Assumpte del missatge',
25 id: 'Id',
26 info: 'Informació de l\'enllaç',
27 langCode: 'Direcció de l\'idioma',
28 langDir: 'Direcció de l\'idioma',
29 langDirLTR: 'D\'esquerra a dreta (LTR)',
30 langDirRTL: 'De dreta a esquerra (RTL)',
31 menu: 'Edita l\'enllaç',
32 name: 'Nom',
33 noAnchors: '(No hi ha àncores disponibles en aquest document)',
34 noEmail: 'Si us plau, escrigui l\'adreça correu electrònic',
35 noUrl: 'Si us plau, escrigui l\'enllaç URL',
36 other: '<altre>',
37 popupDependent: 'Depenent (Netscape)',
38 popupFeatures: 'Característiques finestra popup',
39 popupFullScreen: 'Pantalla completa (IE)',
40 popupLeft: 'Posició esquerra',
41 popupLocationBar: 'Barra d\'adreça',
42 popupMenuBar: 'Barra de menú',
43 popupResizable: 'Redimensionable',
44 popupScrollBars: 'Barres d\'scroll',
45 popupStatusBar: 'Barra d\'estat',
46 popupToolbar: 'Barra d\'eines',
47 popupTop: 'Posició dalt',
48 rel: 'Relació',
49 selectAnchor: 'Selecciona una àncora',
50 styles: 'Estil',
51 tabIndex: 'Index de Tab',
52 target: 'Destí',
53 targetFrame: '<marc>',
54 targetFrameName: 'Nom del marc de destí',
55 targetPopup: '<finestra emergent>',
56 targetPopupName: 'Nom finestra popup',
57 title: 'Enllaç',
58 toAnchor: 'Àncora en aquesta pàgina',
59 toEmail: 'Correu electrònic',
60 toUrl: 'URL',
61 toolbar: 'Insereix/Edita enllaç',
62 type: 'Tipus d\'enllaç',
63 unlink: 'Elimina l\'enllaç',
64 upload: 'Puja'
65} );
diff --git a/sources/plugins/link/lang/cs.js b/sources/plugins/link/lang/cs.js
new file mode 100644
index 00000000..bde72ed0
--- /dev/null
+++ b/sources/plugins/link/lang/cs.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'cs', {
6 acccessKey: 'Přístupový klíč',
7 advanced: 'Rozšířené',
8 advisoryContentType: 'Pomocný typ obsahu',
9 advisoryTitle: 'Pomocný titulek',
10 anchor: {
11 toolbar: 'Záložka',
12 menu: 'Vlastnosti záložky',
13 title: 'Vlastnosti záložky',
14 name: 'Název záložky',
15 errorName: 'Zadejte prosím název záložky',
16 remove: 'Odstranit záložku'
17 },
18 anchorId: 'Podle Id objektu',
19 anchorName: 'Podle jména kotvy',
20 charset: 'Přiřazená znaková sada',
21 cssClasses: 'Třída stylu',
22 emailAddress: 'E-mailová adresa',
23 emailBody: 'Tělo zprávy',
24 emailSubject: 'Předmět zprávy',
25 id: 'Id',
26 info: 'Informace o odkazu',
27 langCode: 'Kód jazyka',
28 langDir: 'Směr jazyka',
29 langDirLTR: 'Zleva doprava (LTR)',
30 langDirRTL: 'Zprava doleva (RTL)',
31 menu: 'Změnit odkaz',
32 name: 'Jméno',
33 noAnchors: '(Ve stránce není definována žádná kotva!)',
34 noEmail: 'Zadejte prosím e-mailovou adresu',
35 noUrl: 'Zadejte prosím URL odkazu',
36 other: '<jiný>',
37 popupDependent: 'Závislost (Netscape)',
38 popupFeatures: 'Vlastnosti vyskakovacího okna',
39 popupFullScreen: 'Celá obrazovka (IE)',
40 popupLeft: 'Levý okraj',
41 popupLocationBar: 'Panel umístění',
42 popupMenuBar: 'Panel nabídky',
43 popupResizable: 'Umožňující měnit velikost',
44 popupScrollBars: 'Posuvníky',
45 popupStatusBar: 'Stavový řádek',
46 popupToolbar: 'Panel nástrojů',
47 popupTop: 'Horní okraj',
48 rel: 'Vztah',
49 selectAnchor: 'Vybrat kotvu',
50 styles: 'Styl',
51 tabIndex: 'Pořadí prvku',
52 target: 'Cíl',
53 targetFrame: '<rámec>',
54 targetFrameName: 'Název cílového rámu',
55 targetPopup: '<vyskakovací okno>',
56 targetPopupName: 'Název vyskakovacího okna',
57 title: 'Odkaz',
58 toAnchor: 'Kotva v této stránce',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Odkaz',
62 type: 'Typ odkazu',
63 unlink: 'Odstranit odkaz',
64 upload: 'Odeslat'
65} );
diff --git a/sources/plugins/link/lang/cy.js b/sources/plugins/link/lang/cy.js
new file mode 100644
index 00000000..5d2b5682
--- /dev/null
+++ b/sources/plugins/link/lang/cy.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'cy', {
6 acccessKey: 'Allwedd Mynediad',
7 advanced: 'Uwch',
8 advisoryContentType: 'Math y Cynnwys Cynghorol',
9 advisoryTitle: 'Teitl Cynghorol',
10 anchor: {
11 toolbar: 'Angor',
12 menu: 'Golygu\'r Angor',
13 title: 'Priodweddau\'r Angor',
14 name: 'Enw\'r Angor',
15 errorName: 'Teipiwch enw\'r angor',
16 remove: 'Tynnwch yr Angor'
17 },
18 anchorId: 'Gan Id yr Elfen',
19 anchorName: 'Gan Enw\'r Angor',
20 charset: 'Set Nodau\'r Adnodd Cysylltiedig',
21 cssClasses: 'Dosbarthiadau Dalen Arddull',
22 emailAddress: 'Cyfeiriad E-Bost',
23 emailBody: 'Corff y Neges',
24 emailSubject: 'Testun y Neges',
25 id: 'Id',
26 info: 'Gwyb y Ddolen',
27 langCode: 'Cod Iaith',
28 langDir: 'Cyfeiriad Iaith',
29 langDirLTR: 'Chwith i\'r Dde (LTR)',
30 langDirRTL: 'Dde i\'r Chwith (RTL)',
31 menu: 'Golygu Dolen',
32 name: 'Enw',
33 noAnchors: '(Dim angorau ar gael yn y ddogfen)',
34 noEmail: 'Teipiwch gyfeiriad yr e-bost',
35 noUrl: 'Teipiwch URL y ddolen',
36 other: '<eraill>',
37 popupDependent: 'Dibynnol (Netscape)',
38 popupFeatures: 'Nodweddion Ffenestr Bop',
39 popupFullScreen: 'Sgrin Llawn (IE)',
40 popupLeft: 'Safle Chwith',
41 popupLocationBar: 'Bar Safle',
42 popupMenuBar: 'Dewislen',
43 popupResizable: 'Ailfeintiol',
44 popupScrollBars: 'Barrau Sgrolio',
45 popupStatusBar: 'Bar Statws',
46 popupToolbar: 'Bar Offer',
47 popupTop: 'Safle Top',
48 rel: 'Perthynas',
49 selectAnchor: 'Dewiswch Angor',
50 styles: 'Arddull',
51 tabIndex: 'Indecs Tab',
52 target: 'Targed',
53 targetFrame: '<ffrâm>',
54 targetFrameName: 'Enw Ffrâm y Targed',
55 targetPopup: '<ffenestr bop>',
56 targetPopupName: 'Enw Ffenestr Bop',
57 title: 'Dolen',
58 toAnchor: 'Dolen at angor yn y testun',
59 toEmail: 'E-bost',
60 toUrl: 'URL',
61 toolbar: 'Dolen',
62 type: 'Math y Ddolen',
63 unlink: 'Datgysylltu',
64 upload: 'Lanlwytho'
65} );
diff --git a/sources/plugins/link/lang/da.js b/sources/plugins/link/lang/da.js
new file mode 100644
index 00000000..c99d9700
--- /dev/null
+++ b/sources/plugins/link/lang/da.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'da', {
6 acccessKey: 'Genvejstast',
7 advanced: 'Avanceret',
8 advisoryContentType: 'Indholdstype',
9 advisoryTitle: 'Titel',
10 anchor: {
11 toolbar: 'Indsæt/redigér bogmærke',
12 menu: 'Egenskaber for bogmærke',
13 title: 'Egenskaber for bogmærke',
14 name: 'Bogmærkenavn',
15 errorName: 'Indtast bogmærkenavn',
16 remove: 'Fjern bogmærke'
17 },
18 anchorId: 'Efter element-Id',
19 anchorName: 'Efter ankernavn',
20 charset: 'Tegnsæt',
21 cssClasses: 'Typografiark',
22 emailAddress: 'E-mailadresse',
23 emailBody: 'Besked',
24 emailSubject: 'Emne',
25 id: 'Id',
26 info: 'Generelt',
27 langCode: 'Tekstretning',
28 langDir: 'Tekstretning',
29 langDirLTR: 'Fra venstre mod højre (LTR)',
30 langDirRTL: 'Fra højre mod venstre (RTL)',
31 menu: 'Redigér hyperlink',
32 name: 'Navn',
33 noAnchors: '(Ingen bogmærker i dokumentet)',
34 noEmail: 'Indtast e-mailadresse!',
35 noUrl: 'Indtast hyperlink-URL!',
36 other: '<anden>',
37 popupDependent: 'Koblet/dependent (Netscape)',
38 popupFeatures: 'Egenskaber for popup',
39 popupFullScreen: 'Fuld skærm (IE)',
40 popupLeft: 'Position fra venstre',
41 popupLocationBar: 'Adresselinje',
42 popupMenuBar: 'Menulinje',
43 popupResizable: 'Justérbar',
44 popupScrollBars: 'Scrollbar',
45 popupStatusBar: 'Statuslinje',
46 popupToolbar: 'Værktøjslinje',
47 popupTop: 'Position fra toppen',
48 rel: 'Relation',
49 selectAnchor: 'Vælg et anker',
50 styles: 'Typografi',
51 tabIndex: 'Tabulatorindeks',
52 target: 'Mål',
53 targetFrame: '<ramme>',
54 targetFrameName: 'Destinationsvinduets navn',
55 targetPopup: '<popup vindue>',
56 targetPopupName: 'Popupvinduets navn',
57 title: 'Egenskaber for hyperlink',
58 toAnchor: 'Bogmærke på denne side',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Indsæt/redigér hyperlink',
62 type: 'Type',
63 unlink: 'Fjern hyperlink',
64 upload: 'Upload'
65} );
diff --git a/sources/plugins/link/lang/de.js b/sources/plugins/link/lang/de.js
new file mode 100644
index 00000000..043045b6
--- /dev/null
+++ b/sources/plugins/link/lang/de.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'de', {
6 acccessKey: 'Zugriffstaste',
7 advanced: 'Erweitert',
8 advisoryContentType: 'Inhaltstyp',
9 advisoryTitle: 'Titel Beschreibung',
10 anchor: {
11 toolbar: 'Anker',
12 menu: 'Anker bearbeiten',
13 title: 'Ankereigenschaften',
14 name: 'Ankername',
15 errorName: 'Bitte geben Sie den Namen des Ankers ein',
16 remove: 'Anker entfernen'
17 },
18 anchorId: 'Nach Elementkennung',
19 anchorName: 'Nach Ankername',
20 charset: 'Verknüpfter Ressourcenzeichensatz',
21 cssClasses: 'Formatvorlagenklasse',
22 emailAddress: 'E-Mail-Adresse',
23 emailBody: 'Nachrichtentext',
24 emailSubject: 'Betreffzeile',
25 id: 'Kennung',
26 info: 'Linkinfo',
27 langCode: 'Sprachcode',
28 langDir: 'Schreibrichtung',
29 langDirLTR: 'Links nach Rechts (LTR)',
30 langDirRTL: 'Rechts nach Links (RTL)',
31 menu: 'Link bearbeiten',
32 name: 'Name',
33 noAnchors: '(Keine Anker im Dokument vorhanden)',
34 noEmail: 'Bitte geben Sie E-Mail-Adresse an',
35 noUrl: 'Bitte geben Sie die Link-URL an',
36 other: '<andere>',
37 popupDependent: 'Abhängig (Netscape)',
38 popupFeatures: 'Pop-up Fenstereigenschaften',
39 popupFullScreen: 'Vollbild (IE)',
40 popupLeft: 'Linke Position',
41 popupLocationBar: 'Adressleiste',
42 popupMenuBar: 'Menüleiste',
43 popupResizable: 'Größe änderbar',
44 popupScrollBars: 'Rollbalken',
45 popupStatusBar: 'Statusleiste',
46 popupToolbar: 'Werkzeugleiste',
47 popupTop: 'Obere Position',
48 rel: 'Beziehung',
49 selectAnchor: 'Anker auswählen',
50 styles: 'Style',
51 tabIndex: 'Tab-Index',
52 target: 'Zielseite',
53 targetFrame: '<Frame>',
54 targetFrameName: 'Ziel-Fenster-Name',
55 targetPopup: '<Pop-up Fenster>',
56 targetPopupName: 'Pop-up Fenster-Name',
57 title: 'Link',
58 toAnchor: 'Anker in dieser Seite',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Link einfügen/editieren',
62 type: 'Link-Typ',
63 unlink: 'Link entfernen',
64 upload: 'Hochladen'
65} );
diff --git a/sources/plugins/link/lang/el.js b/sources/plugins/link/lang/el.js
new file mode 100644
index 00000000..82194ca1
--- /dev/null
+++ b/sources/plugins/link/lang/el.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'el', {
6 acccessKey: 'Συντόμευση',
7 advanced: 'Για Προχωρημένους',
8 advisoryContentType: 'Ενδεικτικός Τύπος Περιεχομένου',
9 advisoryTitle: 'Ενδεικτικός Τίτλος',
10 anchor: {
11 toolbar: 'Εισαγωγή/επεξεργασία Άγκυρας',
12 menu: 'Ιδιότητες άγκυρας',
13 title: 'Ιδιότητες άγκυρας',
14 name: 'Όνομα άγκυρας',
15 errorName: 'Παρακαλούμε εισάγετε όνομα άγκυρας',
16 remove: 'Αφαίρεση Άγκυρας'
17 },
18 anchorId: 'Βάσει του Element Id',
19 anchorName: 'Βάσει του Ονόματος Άγκυρας',
20 charset: 'Κωδικοποίηση Χαρακτήρων Προσαρτημένης Πηγής',
21 cssClasses: 'Κλάσεις Φύλλων Στυλ',
22 emailAddress: 'Διεύθυνση E-mail',
23 emailBody: 'Κείμενο Μηνύματος',
24 emailSubject: 'Θέμα Μηνύματος',
25 id: 'Id',
26 info: 'Πληροφορίες Συνδέσμου',
27 langCode: 'Κατεύθυνση Κειμένου',
28 langDir: 'Κατεύθυνση Κειμένου',
29 langDirLTR: 'Αριστερά προς Δεξιά (LTR)',
30 langDirRTL: 'Δεξιά προς Αριστερά (RTL)',
31 menu: 'Επεξεργασία Συνδέσμου',
32 name: 'Όνομα',
33 noAnchors: '(Δεν υπάρχουν άγκυρες στο κείμενο)',
34 noEmail: 'Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου',
35 noUrl: 'Εισάγετε την τοποθεσία (URL) του συνδέσμου',
36 other: '<άλλο>',
37 popupDependent: 'Εξαρτημένο (Netscape)',
38 popupFeatures: 'Επιλογές Αναδυόμενου Παραθύρου',
39 popupFullScreen: 'Πλήρης Οθόνη (IE)',
40 popupLeft: 'Θέση Αριστερά',
41 popupLocationBar: 'Γραμμή Τοποθεσίας',
42 popupMenuBar: 'Γραμμή Επιλογών',
43 popupResizable: 'Προσαρμοζόμενο Μέγεθος',
44 popupScrollBars: 'Μπάρες Κύλισης',
45 popupStatusBar: 'Γραμμή Κατάστασης',
46 popupToolbar: 'Εργαλειοθήκη',
47 popupTop: 'Θέση Πάνω',
48 rel: 'Σχέση',
49 selectAnchor: 'Επιλέξτε μια Άγκυρα',
50 styles: 'Μορφή',
51 tabIndex: 'Σειρά Μεταπήδησης',
52 target: 'Παράθυρο Προορισμού',
53 targetFrame: '<πλαίσιο>',
54 targetFrameName: 'Όνομα Πλαισίου Προορισμού',
55 targetPopup: '<αναδυόμενο παράθυρο>',
56 targetPopupName: 'Όνομα Αναδυόμενου Παραθύρου',
57 title: 'Σύνδεσμος',
58 toAnchor: 'Άγκυρα σε αυτήν τη σελίδα',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Σύνδεσμος',
62 type: 'Τύπος Συνδέσμου',
63 unlink: 'Αφαίρεση Συνδέσμου',
64 upload: 'Αποστολή'
65} );
diff --git a/sources/plugins/link/lang/en-au.js b/sources/plugins/link/lang/en-au.js
new file mode 100644
index 00000000..71773652
--- /dev/null
+++ b/sources/plugins/link/lang/en-au.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'en-au', {
6 acccessKey: 'Access Key',
7 advanced: 'Advanced',
8 advisoryContentType: 'Advisory Content Type',
9 advisoryTitle: 'Advisory Title',
10 anchor: {
11 toolbar: 'Anchor',
12 menu: 'Edit Anchor',
13 title: 'Anchor Properties',
14 name: 'Anchor Name',
15 errorName: 'Please type the anchor name',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'By Element Id',
19 anchorName: 'By Anchor Name',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Stylesheet Classes',
22 emailAddress: 'E-Mail Address',
23 emailBody: 'Message Body',
24 emailSubject: 'Message Subject',
25 id: 'Id',
26 info: 'Link Info',
27 langCode: 'Language Code',
28 langDir: 'Language Direction',
29 langDirLTR: 'Left to Right (LTR)',
30 langDirRTL: 'Right to Left (RTL)',
31 menu: 'Edit Link',
32 name: 'Name',
33 noAnchors: '(No anchors available in the document)',
34 noEmail: 'Please type the e-mail address',
35 noUrl: 'Please type the link URL',
36 other: '<other>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: 'Popup Window Features',
39 popupFullScreen: 'Full Screen (IE)',
40 popupLeft: 'Left Position',
41 popupLocationBar: 'Location Bar',
42 popupMenuBar: 'Menu Bar',
43 popupResizable: 'Resizable',
44 popupScrollBars: 'Scroll Bars',
45 popupStatusBar: 'Status Bar',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Top Position',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Select an Anchor',
50 styles: 'Style',
51 tabIndex: 'Tab Index',
52 target: 'Target',
53 targetFrame: '<frame>',
54 targetFrameName: 'Target Frame Name',
55 targetPopup: '<popup window>',
56 targetPopupName: 'Popup Window Name',
57 title: 'Link',
58 toAnchor: 'Link to anchor in the text',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Link',
62 type: 'Link Type',
63 unlink: 'Unlink',
64 upload: 'Upload'
65} );
diff --git a/sources/plugins/link/lang/en-ca.js b/sources/plugins/link/lang/en-ca.js
new file mode 100644
index 00000000..6987934a
--- /dev/null
+++ b/sources/plugins/link/lang/en-ca.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'en-ca', {
6 acccessKey: 'Access Key',
7 advanced: 'Advanced',
8 advisoryContentType: 'Advisory Content Type',
9 advisoryTitle: 'Advisory Title',
10 anchor: {
11 toolbar: 'Anchor',
12 menu: 'Edit Anchor',
13 title: 'Anchor Properties',
14 name: 'Anchor Name',
15 errorName: 'Please type the anchor name',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'By Element Id',
19 anchorName: 'By Anchor Name',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Stylesheet Classes',
22 emailAddress: 'E-Mail Address',
23 emailBody: 'Message Body',
24 emailSubject: 'Message Subject',
25 id: 'Id',
26 info: 'Link Info',
27 langCode: 'Language Code',
28 langDir: 'Language Direction',
29 langDirLTR: 'Left to Right (LTR)',
30 langDirRTL: 'Right to Left (RTL)',
31 menu: 'Edit Link',
32 name: 'Name',
33 noAnchors: '(No anchors available in the document)',
34 noEmail: 'Please type the e-mail address',
35 noUrl: 'Please type the link URL',
36 other: '<other>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: 'Popup Window Features',
39 popupFullScreen: 'Full Screen (IE)',
40 popupLeft: 'Left Position',
41 popupLocationBar: 'Location Bar',
42 popupMenuBar: 'Menu Bar',
43 popupResizable: 'Resizable',
44 popupScrollBars: 'Scroll Bars',
45 popupStatusBar: 'Status Bar',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Top Position',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Select an Anchor',
50 styles: 'Style',
51 tabIndex: 'Tab Index',
52 target: 'Target',
53 targetFrame: '<frame>',
54 targetFrameName: 'Target Frame Name',
55 targetPopup: '<popup window>',
56 targetPopupName: 'Popup Window Name',
57 title: 'Link',
58 toAnchor: 'Link to anchor in the text',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Link',
62 type: 'Link Type',
63 unlink: 'Unlink',
64 upload: 'Upload'
65} );
diff --git a/sources/plugins/link/lang/en-gb.js b/sources/plugins/link/lang/en-gb.js
new file mode 100644
index 00000000..f8e7a881
--- /dev/null
+++ b/sources/plugins/link/lang/en-gb.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'en-gb', {
6 acccessKey: 'Access Key',
7 advanced: 'Advanced',
8 advisoryContentType: 'Advisory Content Type',
9 advisoryTitle: 'Advisory Title',
10 anchor: {
11 toolbar: 'Anchor',
12 menu: 'Edit Anchor',
13 title: 'Anchor Properties',
14 name: 'Anchor Name',
15 errorName: 'Please type the anchor name',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'By Element Id',
19 anchorName: 'By Anchor Name',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Stylesheet Classes',
22 emailAddress: 'E-Mail Address',
23 emailBody: 'Message Body',
24 emailSubject: 'Message Subject',
25 id: 'Id',
26 info: 'Link Info',
27 langCode: 'Language Code',
28 langDir: 'Language Direction',
29 langDirLTR: 'Left to Right (LTR)',
30 langDirRTL: 'Right to Left (RTL)',
31 menu: 'Edit Link',
32 name: 'Name',
33 noAnchors: '(No anchors available in the document)',
34 noEmail: 'Please type the e-mail address',
35 noUrl: 'Please type the link URL',
36 other: '<other>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: 'Popup Window Features',
39 popupFullScreen: 'Full Screen (IE)',
40 popupLeft: 'Left Position',
41 popupLocationBar: 'Location Bar',
42 popupMenuBar: 'Menu Bar',
43 popupResizable: 'Resizable',
44 popupScrollBars: 'Scroll Bars',
45 popupStatusBar: 'Status Bar',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Top Position',
48 rel: 'Relationship',
49 selectAnchor: 'Select an Anchor',
50 styles: 'Style',
51 tabIndex: 'Tab Index',
52 target: 'Target',
53 targetFrame: '<frame>',
54 targetFrameName: 'Target Frame Name',
55 targetPopup: '<popup window>',
56 targetPopupName: 'Popup Window Name',
57 title: 'Link',
58 toAnchor: 'Link to anchor in the text',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Link',
62 type: 'Link Type',
63 unlink: 'Unlink',
64 upload: 'Upload'
65} );
diff --git a/sources/plugins/link/lang/en.js b/sources/plugins/link/lang/en.js
new file mode 100644
index 00000000..9f8dbc15
--- /dev/null
+++ b/sources/plugins/link/lang/en.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'en', {
6 acccessKey: 'Access Key',
7 advanced: 'Advanced',
8 advisoryContentType: 'Advisory Content Type',
9 advisoryTitle: 'Advisory Title',
10 anchor: {
11 toolbar: 'Anchor',
12 menu: 'Edit Anchor',
13 title: 'Anchor Properties',
14 name: 'Anchor Name',
15 errorName: 'Please type the anchor name',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'By Element Id',
19 anchorName: 'By Anchor Name',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Stylesheet Classes',
22 emailAddress: 'E-Mail Address',
23 emailBody: 'Message Body',
24 emailSubject: 'Message Subject',
25 id: 'Id',
26 info: 'Link Info',
27 langCode: 'Language Code',
28 langDir: 'Language Direction',
29 langDirLTR: 'Left to Right (LTR)',
30 langDirRTL: 'Right to Left (RTL)',
31 menu: 'Edit Link',
32 name: 'Name',
33 noAnchors: '(No anchors available in the document)',
34 noEmail: 'Please type the e-mail address',
35 noUrl: 'Please type the link URL',
36 other: '<other>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: 'Popup Window Features',
39 popupFullScreen: 'Full Screen (IE)',
40 popupLeft: 'Left Position',
41 popupLocationBar: 'Location Bar',
42 popupMenuBar: 'Menu Bar',
43 popupResizable: 'Resizable',
44 popupScrollBars: 'Scroll Bars',
45 popupStatusBar: 'Status Bar',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Top Position',
48 rel: 'Relationship',
49 selectAnchor: 'Select an Anchor',
50 styles: 'Style',
51 tabIndex: 'Tab Index',
52 target: 'Target',
53 targetFrame: '<frame>',
54 targetFrameName: 'Target Frame Name',
55 targetPopup: '<popup window>',
56 targetPopupName: 'Popup Window Name',
57 title: 'Link',
58 toAnchor: 'Link to anchor in the text',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Link',
62 type: 'Link Type',
63 unlink: 'Unlink',
64 upload: 'Upload'
65} );
diff --git a/sources/plugins/link/lang/eo.js b/sources/plugins/link/lang/eo.js
new file mode 100644
index 00000000..fff3855d
--- /dev/null
+++ b/sources/plugins/link/lang/eo.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'eo', {
6 acccessKey: 'Fulmoklavo',
7 advanced: 'Speciala',
8 advisoryContentType: 'Enhavotipo',
9 advisoryTitle: 'Priskriba Titolo',
10 anchor: {
11 toolbar: 'Ankro',
12 menu: 'Enmeti/Ŝanĝi Ankron',
13 title: 'Ankraj Atributoj',
14 name: 'Ankra Nomo',
15 errorName: 'Bv entajpi la ankran nomon',
16 remove: 'Forigi Ankron'
17 },
18 anchorId: 'Per Elementidentigilo',
19 anchorName: 'Per Ankronomo',
20 charset: 'Signaro de la Ligita Rimedo',
21 cssClasses: 'Klasoj de Stilfolioj',
22 emailAddress: 'Retpoŝto',
23 emailBody: 'Mesaĝa korpo',
24 emailSubject: 'Mesaĝa Temo',
25 id: 'Id',
26 info: 'Informoj pri la Ligilo',
27 langCode: 'Lingva Kodo',
28 langDir: 'Skribdirekto',
29 langDirLTR: 'De maldekstro dekstren (LTR)',
30 langDirRTL: 'De dekstro maldekstren (RTL)',
31 menu: 'Ŝanĝi Ligilon',
32 name: 'Nomo',
33 noAnchors: '<Ne disponeblas ankroj en la dokumento>',
34 noEmail: 'Bonvolu entajpi la retpoŝtadreson',
35 noUrl: 'Bonvolu entajpi la URL-on',
36 other: '<alia>',
37 popupDependent: 'Dependa (Netscape)',
38 popupFeatures: 'Atributoj de la Ŝprucfenestro',
39 popupFullScreen: 'Tutekrane (IE)',
40 popupLeft: 'Maldekstra Pozicio',
41 popupLocationBar: 'Adresobreto',
42 popupMenuBar: 'Menubreto',
43 popupResizable: 'Dimensiŝanĝebla',
44 popupScrollBars: 'Rulumskaloj',
45 popupStatusBar: 'Statobreto',
46 popupToolbar: 'Ilobreto',
47 popupTop: 'Supra Pozicio',
48 rel: 'Rilato',
49 selectAnchor: 'Elekti Ankron',
50 styles: 'Stilo',
51 tabIndex: 'Taba Indekso',
52 target: 'Celo',
53 targetFrame: '<kadro>',
54 targetFrameName: 'Nomo de CelKadro',
55 targetPopup: '<ŝprucfenestro>',
56 targetPopupName: 'Nomo de Ŝprucfenestro',
57 title: 'Ligilo',
58 toAnchor: 'Ankri en tiu ĉi paĝo',
59 toEmail: 'Retpoŝto',
60 toUrl: 'URL',
61 toolbar: 'Enmeti/Ŝanĝi Ligilon',
62 type: 'Tipo de Ligilo',
63 unlink: 'Forigi Ligilon',
64 upload: 'Alŝuti'
65} );
diff --git a/sources/plugins/link/lang/es.js b/sources/plugins/link/lang/es.js
new file mode 100644
index 00000000..29265fa8
--- /dev/null
+++ b/sources/plugins/link/lang/es.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'es', {
6 acccessKey: 'Tecla de Acceso',
7 advanced: 'Avanzado',
8 advisoryContentType: 'Tipo de Contenido',
9 advisoryTitle: 'Título',
10 anchor: {
11 toolbar: 'Referencia',
12 menu: 'Propiedades de Referencia',
13 title: 'Propiedades de Referencia',
14 name: 'Nombre de la Referencia',
15 errorName: 'Por favor, complete el nombre de la Referencia',
16 remove: 'Quitar Referencia'
17 },
18 anchorId: 'Por ID de elemento',
19 anchorName: 'Por Nombre de Referencia',
20 charset: 'Fuente de caracteres vinculado',
21 cssClasses: 'Clases de hojas de estilo',
22 emailAddress: 'Dirección de E-Mail',
23 emailBody: 'Cuerpo del Mensaje',
24 emailSubject: 'Título del Mensaje',
25 id: 'Id',
26 info: 'Información de Vínculo',
27 langCode: 'Código idioma',
28 langDir: 'Orientación',
29 langDirLTR: 'Izquierda a Derecha (LTR)',
30 langDirRTL: 'Derecha a Izquierda (RTL)',
31 menu: 'Editar Vínculo',
32 name: 'Nombre',
33 noAnchors: '(No hay referencias disponibles en el documento)',
34 noEmail: 'Por favor escriba la dirección de e-mail',
35 noUrl: 'Por favor escriba el vínculo URL',
36 other: '<otro>',
37 popupDependent: 'Dependiente (Netscape)',
38 popupFeatures: 'Características de Ventana Emergente',
39 popupFullScreen: 'Pantalla Completa (IE)',
40 popupLeft: 'Posición Izquierda',
41 popupLocationBar: 'Barra de ubicación',
42 popupMenuBar: 'Barra de Menú',
43 popupResizable: 'Redimensionable',
44 popupScrollBars: 'Barras de desplazamiento',
45 popupStatusBar: 'Barra de Estado',
46 popupToolbar: 'Barra de Herramientas',
47 popupTop: 'Posición Derecha',
48 rel: 'Relación',
49 selectAnchor: 'Seleccionar una referencia',
50 styles: 'Estilo',
51 tabIndex: 'Indice de tabulación',
52 target: 'Destino',
53 targetFrame: '<marco>',
54 targetFrameName: 'Nombre del Marco Destino',
55 targetPopup: '<ventana emergente>',
56 targetPopupName: 'Nombre de Ventana Emergente',
57 title: 'Vínculo',
58 toAnchor: 'Referencia en esta página',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Insertar/Editar Vínculo',
62 type: 'Tipo de vínculo',
63 unlink: 'Eliminar Vínculo',
64 upload: 'Cargar'
65} );
diff --git a/sources/plugins/link/lang/et.js b/sources/plugins/link/lang/et.js
new file mode 100644
index 00000000..063dd537
--- /dev/null
+++ b/sources/plugins/link/lang/et.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'et', {
6 acccessKey: 'Juurdepääsu võti',
7 advanced: 'Täpsemalt',
8 advisoryContentType: 'Juhendava sisu tüüp',
9 advisoryTitle: 'Juhendav tiitel',
10 anchor: {
11 toolbar: 'Ankru sisestamine/muutmine',
12 menu: 'Ankru omadused',
13 title: 'Ankru omadused',
14 name: 'Ankru nimi',
15 errorName: 'Palun sisesta ankru nimi',
16 remove: 'Eemalda ankur'
17 },
18 anchorId: 'Elemendi id järgi',
19 anchorName: 'Ankru nime järgi',
20 charset: 'Lingitud ressursi märgistik',
21 cssClasses: 'Stiilistiku klassid',
22 emailAddress: 'E-posti aadress',
23 emailBody: 'Sõnumi tekst',
24 emailSubject: 'Sõnumi teema',
25 id: 'ID',
26 info: 'Lingi info',
27 langCode: 'Keele suund',
28 langDir: 'Keele suund',
29 langDirLTR: 'Vasakult paremale (LTR)',
30 langDirRTL: 'Paremalt vasakule (RTL)',
31 menu: 'Muuda linki',
32 name: 'Nimi',
33 noAnchors: '(Selles dokumendis pole ankruid)',
34 noEmail: 'Palun kirjuta e-posti aadress',
35 noUrl: 'Palun kirjuta lingi URL',
36 other: '<muu>',
37 popupDependent: 'Sõltuv (Netscape)',
38 popupFeatures: 'Hüpikakna omadused',
39 popupFullScreen: 'Täisekraan (IE)',
40 popupLeft: 'Vasak asukoht',
41 popupLocationBar: 'Aadressiriba',
42 popupMenuBar: 'Menüüriba',
43 popupResizable: 'Suurust saab muuta',
44 popupScrollBars: 'Kerimisribad',
45 popupStatusBar: 'Olekuriba',
46 popupToolbar: 'Tööriistariba',
47 popupTop: 'Ülemine asukoht',
48 rel: 'Suhe',
49 selectAnchor: 'Vali ankur',
50 styles: 'Laad',
51 tabIndex: 'Tab indeks',
52 target: 'Sihtkoht',
53 targetFrame: '<raam>',
54 targetFrameName: 'Sihtmärk raami nimi',
55 targetPopup: '<hüpikaken>',
56 targetPopupName: 'Hüpikakna nimi',
57 title: 'Link',
58 toAnchor: 'Ankur sellel lehel',
59 toEmail: 'E-post',
60 toUrl: 'URL',
61 toolbar: 'Lingi lisamine/muutmine',
62 type: 'Lingi liik',
63 unlink: 'Lingi eemaldamine',
64 upload: 'Lae üles'
65} );
diff --git a/sources/plugins/link/lang/eu.js b/sources/plugins/link/lang/eu.js
new file mode 100644
index 00000000..1c046809
--- /dev/null
+++ b/sources/plugins/link/lang/eu.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'eu', {
6 acccessKey: 'Sarbide-tekla',
7 advanced: 'Aurreratua',
8 advisoryContentType: 'Aholkatutako eduki-mota',
9 advisoryTitle: 'Aholkatutako izenburua',
10 anchor: {
11 toolbar: 'Aingura',
12 menu: 'Editatu aingura',
13 title: 'Ainguraren propietateak',
14 name: 'Ainguraren izena',
15 errorName: 'Idatzi ainguraren izena',
16 remove: 'Kendu aingura'
17 },
18 anchorId: 'Elementuaren Id-aren arabera',
19 anchorName: 'Aingura-izenaren arabera',
20 charset: 'Estekatutako baliabide karaktere-jokoa',
21 cssClasses: 'Estilo-orriko klaseak',
22 emailAddress: 'E-posta helbidea',
23 emailBody: 'Mezuaren gorputza',
24 emailSubject: 'Mezuaren gaia',
25 id: 'Id',
26 info: 'Estekaren informazioa',
27 langCode: 'Hizkuntzaren kodea',
28 langDir: 'Hizkuntzaren norabidea',
29 langDirLTR: 'Ezkerretik eskuinera (LTR)',
30 langDirRTL: 'Eskuinetik ezkerrera (RTL)',
31 menu: 'Editatu esteka',
32 name: 'Izena',
33 noAnchors: '(Ez dago aingurarik erabilgarri dokumentuan)',
34 noEmail: 'Mesedez idatzi e-posta helbidea',
35 noUrl: 'Mesedez idatzi estekaren URLa',
36 other: '<bestelakoa>',
37 popupDependent: 'Menpekoa (Netscape)',
38 popupFeatures: 'Laster-leihoaren ezaugarriak',
39 popupFullScreen: 'Pantaila osoa (IE)',
40 popupLeft: 'Ezkerreko posizioa',
41 popupLocationBar: 'Kokaleku-barra',
42 popupMenuBar: 'Menu-barra',
43 popupResizable: 'Tamaina aldakorra',
44 popupScrollBars: 'Korritze-barrak',
45 popupStatusBar: 'Egoera-barra',
46 popupToolbar: 'Tresna-barra',
47 popupTop: 'Goiko posizioa',
48 rel: 'Erlazioa',
49 selectAnchor: 'Hautatu aingura',
50 styles: 'Estiloa',
51 tabIndex: 'Tabulazio indizea',
52 target: 'Helburua',
53 targetFrame: '<frame>',
54 targetFrameName: 'Helburuko markoaren izena',
55 targetPopup: '<laster-leihoa>',
56 targetPopupName: 'Laster-leihoaren izena',
57 title: 'Esteka',
58 toAnchor: 'Estekatu testuko aingurara',
59 toEmail: 'E-posta',
60 toUrl: 'URLa',
61 toolbar: 'Esteka',
62 type: 'Esteka-mota',
63 unlink: 'Kendu esteka',
64 upload: 'Kargatu'
65} );
diff --git a/sources/plugins/link/lang/fa.js b/sources/plugins/link/lang/fa.js
new file mode 100644
index 00000000..092c4ff0
--- /dev/null
+++ b/sources/plugins/link/lang/fa.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'fa', {
6 acccessKey: 'کلید دستیابی',
7 advanced: 'پیشرفته',
8 advisoryContentType: 'نوع محتوای کمکی',
9 advisoryTitle: 'عنوان کمکی',
10 anchor: {
11 toolbar: 'گنجاندن/ویرایش لنگر',
12 menu: 'ویژگی​های لنگر',
13 title: 'ویژگی​های لنگر',
14 name: 'نام لنگر',
15 errorName: 'لطفا نام لنگر را بنویسید',
16 remove: 'حذف لنگر'
17 },
18 anchorId: 'با شناسهٴ المان',
19 anchorName: 'با نام لنگر',
20 charset: 'نویسه​گان منبع پیوند شده',
21 cssClasses: 'کلاس​های شیوه​نامه(Stylesheet)',
22 emailAddress: 'نشانی پست الکترونیکی',
23 emailBody: 'متن پیام',
24 emailSubject: 'موضوع پیام',
25 id: 'شناسه',
26 info: 'اطلاعات پیوند',
27 langCode: 'جهت​نمای زبان',
28 langDir: 'جهت​نمای زبان',
29 langDirLTR: 'چپ به راست (LTR)',
30 langDirRTL: 'راست به چپ (RTL)',
31 menu: 'ویرایش پیوند',
32 name: 'نام',
33 noAnchors: '(در این سند لنگری دردسترس نیست)',
34 noEmail: 'لطفا نشانی پست الکترونیکی را بنویسید',
35 noUrl: 'لطفا URL پیوند را بنویسید',
36 other: '<سایر>',
37 popupDependent: 'وابسته (Netscape)',
38 popupFeatures: 'ویژگی​های پنجرهٴ پاپاپ',
39 popupFullScreen: 'تمام صفحه (IE)',
40 popupLeft: 'موقعیت چپ',
41 popupLocationBar: 'نوار موقعیت',
42 popupMenuBar: 'نوار منو',
43 popupResizable: 'قابل تغییر اندازه',
44 popupScrollBars: 'میله​های پیمایش',
45 popupStatusBar: 'نوار وضعیت',
46 popupToolbar: 'نوار ابزار',
47 popupTop: 'موقعیت بالا',
48 rel: 'وابستگی',
49 selectAnchor: 'یک لنگر برگزینید',
50 styles: 'شیوه (style)',
51 tabIndex: 'نمایهٴ دسترسی با برگه',
52 target: 'مقصد',
53 targetFrame: '<فریم>',
54 targetFrameName: 'نام فریم مقصد',
55 targetPopup: '<پنجرهٴ پاپاپ>',
56 targetPopupName: 'نام پنجرهٴ پاپاپ',
57 title: 'پیوند',
58 toAnchor: 'لنگر در همین صفحه',
59 toEmail: 'پست الکترونیکی',
60 toUrl: 'URL',
61 toolbar: 'گنجاندن/ویرایش پیوند',
62 type: 'نوع پیوند',
63 unlink: 'برداشتن پیوند',
64 upload: 'انتقال به سرور'
65} );
diff --git a/sources/plugins/link/lang/fi.js b/sources/plugins/link/lang/fi.js
new file mode 100644
index 00000000..995789fb
--- /dev/null
+++ b/sources/plugins/link/lang/fi.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'fi', {
6 acccessKey: 'Pikanäppäin',
7 advanced: 'Lisäominaisuudet',
8 advisoryContentType: 'Avustava sisällön tyyppi',
9 advisoryTitle: 'Avustava otsikko',
10 anchor: {
11 toolbar: 'Lisää ankkuri/muokkaa ankkuria',
12 menu: 'Ankkurin ominaisuudet',
13 title: 'Ankkurin ominaisuudet',
14 name: 'Nimi',
15 errorName: 'Ankkurille on kirjoitettava nimi',
16 remove: 'Poista ankkuri'
17 },
18 anchorId: 'Ankkurin ID:n mukaan',
19 anchorName: 'Ankkurin nimen mukaan',
20 charset: 'Linkitetty kirjaimisto',
21 cssClasses: 'Tyyliluokat',
22 emailAddress: 'Sähköpostiosoite',
23 emailBody: 'Viesti',
24 emailSubject: 'Aihe',
25 id: 'Tunniste',
26 info: 'Linkin tiedot',
27 langCode: 'Kielen suunta',
28 langDir: 'Kielen suunta',
29 langDirLTR: 'Vasemmalta oikealle (LTR)',
30 langDirRTL: 'Oikealta vasemmalle (RTL)',
31 menu: 'Muokkaa linkkiä',
32 name: 'Nimi',
33 noAnchors: '(Ei ankkureita tässä dokumentissa)',
34 noEmail: 'Kirjoita sähköpostiosoite',
35 noUrl: 'Linkille on kirjoitettava URL',
36 other: '<muu>',
37 popupDependent: 'Riippuva (Netscape)',
38 popupFeatures: 'Popup ikkunan ominaisuudet',
39 popupFullScreen: 'Täysi ikkuna (IE)',
40 popupLeft: 'Vasemmalta (px)',
41 popupLocationBar: 'Osoiterivi',
42 popupMenuBar: 'Valikkorivi',
43 popupResizable: 'Venytettävä',
44 popupScrollBars: 'Vierityspalkit',
45 popupStatusBar: 'Tilarivi',
46 popupToolbar: 'Vakiopainikkeet',
47 popupTop: 'Ylhäältä (px)',
48 rel: 'Suhde',
49 selectAnchor: 'Valitse ankkuri',
50 styles: 'Tyyli',
51 tabIndex: 'Tabulaattori indeksi',
52 target: 'Kohde',
53 targetFrame: '<kehys>',
54 targetFrameName: 'Kohdekehyksen nimi',
55 targetPopup: '<popup ikkuna>',
56 targetPopupName: 'Popup ikkunan nimi',
57 title: 'Linkki',
58 toAnchor: 'Ankkuri tässä sivussa',
59 toEmail: 'Sähköposti',
60 toUrl: 'Osoite',
61 toolbar: 'Lisää linkki/muokkaa linkkiä',
62 type: 'Linkkityyppi',
63 unlink: 'Poista linkki',
64 upload: 'Lisää tiedosto'
65} );
diff --git a/sources/plugins/link/lang/fo.js b/sources/plugins/link/lang/fo.js
new file mode 100644
index 00000000..31d1f9b5
--- /dev/null
+++ b/sources/plugins/link/lang/fo.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'fo', {
6 acccessKey: 'Snarvegisknöttur',
7 advanced: 'Fjølbroytt',
8 advisoryContentType: 'Vegleiðandi innihaldsslag',
9 advisoryTitle: 'Vegleiðandi heiti',
10 anchor: {
11 toolbar: 'Ger/broyt marknastein',
12 menu: 'Eginleikar fyri marknastein',
13 title: 'Eginleikar fyri marknastein',
14 name: 'Heiti marknasteinsins',
15 errorName: 'Vinarliga rita marknasteinsins heiti',
16 remove: 'Strika marknastein'
17 },
18 anchorId: 'Eftir element Id',
19 anchorName: 'Eftir navni á marknasteini',
20 charset: 'Atknýtt teknsett',
21 cssClasses: 'Typografi klassar',
22 emailAddress: 'Teldupost-adressa',
23 emailBody: 'Breyðtekstur',
24 emailSubject: 'Evni',
25 id: 'Id',
26 info: 'Tilknýtis upplýsingar',
27 langCode: 'Tekstkós',
28 langDir: 'Tekstkós',
29 langDirLTR: 'Frá vinstru til høgru (LTR)',
30 langDirRTL: 'Frá høgru til vinstru (RTL)',
31 menu: 'Broyt tilknýti',
32 name: 'Navn',
33 noAnchors: '(Eingir marknasteinar eru í hesum dokumentið)',
34 noEmail: 'Vinarliga skriva teldupost-adressu',
35 noUrl: 'Vinarliga skriva tilknýti (URL)',
36 other: '<annað>',
37 popupDependent: 'Bundið (Netscape)',
38 popupFeatures: 'Popup vindeygans víðkaðu eginleikar',
39 popupFullScreen: 'Fullur skermur (IE)',
40 popupLeft: 'Frástøða frá vinstru',
41 popupLocationBar: 'Adressulinja',
42 popupMenuBar: 'Skrábjálki',
43 popupResizable: 'Stødd kann broytast',
44 popupScrollBars: 'Rullibjálki',
45 popupStatusBar: 'Støðufrágreiðingarbjálki',
46 popupToolbar: 'Amboðsbjálki',
47 popupTop: 'Frástøða frá íerva',
48 rel: 'Relatión',
49 selectAnchor: 'Vel ein marknastein',
50 styles: 'Typografi',
51 tabIndex: 'Tabulator indeks',
52 target: 'Target',
53 targetFrame: '<ramma>',
54 targetFrameName: 'Vís navn vindeygans',
55 targetPopup: '<popup vindeyga>',
56 targetPopupName: 'Popup vindeygans navn',
57 title: 'Tilknýti',
58 toAnchor: 'Tilknýti til marknastein í tekstinum',
59 toEmail: 'Teldupostur',
60 toUrl: 'URL',
61 toolbar: 'Ger/broyt tilknýti',
62 type: 'Tilknýtisslag',
63 unlink: 'Strika tilknýti',
64 upload: 'Send til ambætaran'
65} );
diff --git a/sources/plugins/link/lang/fr-ca.js b/sources/plugins/link/lang/fr-ca.js
new file mode 100644
index 00000000..a20ff94d
--- /dev/null
+++ b/sources/plugins/link/lang/fr-ca.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'fr-ca', {
6 acccessKey: 'Touche d\'accessibilité',
7 advanced: 'Avancé',
8 advisoryContentType: 'Type de contenu',
9 advisoryTitle: 'Description',
10 anchor: {
11 toolbar: 'Ancre',
12 menu: 'Modifier l\'ancre',
13 title: 'Propriétés de l\'ancre',
14 name: 'Nom de l\'ancre',
15 errorName: 'Veuillez saisir le nom de l\'ancre',
16 remove: 'Supprimer l\'ancre'
17 },
18 anchorId: 'Par ID',
19 anchorName: 'Par nom',
20 charset: 'Encodage de la cible',
21 cssClasses: 'Classes CSS',
22 emailAddress: 'Courriel',
23 emailBody: 'Corps du message',
24 emailSubject: 'Objet du message',
25 id: 'ID',
26 info: 'Informations sur le lien',
27 langCode: 'Code de langue',
28 langDir: 'Sens d\'écriture',
29 langDirLTR: 'De gauche à droite (LTR)',
30 langDirRTL: 'De droite à gauche (RTL)',
31 menu: 'Modifier le lien',
32 name: 'Nom',
33 noAnchors: '(Pas d\'ancre disponible dans le document)',
34 noEmail: 'Veuillez saisir le courriel',
35 noUrl: 'Veuillez saisir l\'URL',
36 other: '<autre>',
37 popupDependent: 'Dépendante (Netscape)',
38 popupFeatures: 'Caractéristiques de la fenêtre popup',
39 popupFullScreen: 'Plein écran (IE)',
40 popupLeft: 'Position de la gauche',
41 popupLocationBar: 'Barre d\'adresse',
42 popupMenuBar: 'Barre de menu',
43 popupResizable: 'Redimensionnable',
44 popupScrollBars: 'Barres de défilement',
45 popupStatusBar: 'Barre d\'état',
46 popupToolbar: 'Barre d\'outils',
47 popupTop: 'Position à partir du haut',
48 rel: 'Relation',
49 selectAnchor: 'Sélectionner une ancre',
50 styles: 'Style',
51 tabIndex: 'Ordre de tabulation',
52 target: 'Destination',
53 targetFrame: '<Cadre>',
54 targetFrameName: 'Nom du cadre de destination',
55 targetPopup: '<fenêtre popup>',
56 targetPopupName: 'Nom de la fenêtre popup',
57 title: 'Lien',
58 toAnchor: 'Ancre dans cette page',
59 toEmail: 'Courriel',
60 toUrl: 'URL',
61 toolbar: 'Lien',
62 type: 'Type de lien',
63 unlink: 'Supprimer le lien',
64 upload: 'Téléverser'
65} );
diff --git a/sources/plugins/link/lang/fr.js b/sources/plugins/link/lang/fr.js
new file mode 100644
index 00000000..c048a293
--- /dev/null
+++ b/sources/plugins/link/lang/fr.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'fr', {
6 acccessKey: 'Touche d\'accessibilité',
7 advanced: 'Avancé',
8 advisoryContentType: 'Type de contenu (ex: text/html)',
9 advisoryTitle: 'Description (title)',
10 anchor: {
11 toolbar: 'Ancre',
12 menu: 'Editer l\'ancre',
13 title: 'Propriétés de l\'ancre',
14 name: 'Nom de l\'ancre',
15 errorName: 'Veuillez entrer le nom de l\'ancre.',
16 remove: 'Supprimer l\'ancre'
17 },
18 anchorId: 'Par ID d\'élément',
19 anchorName: 'Par nom d\'ancre',
20 charset: 'Charset de la cible',
21 cssClasses: 'Classe CSS',
22 emailAddress: 'Adresse E-Mail',
23 emailBody: 'Corps du message',
24 emailSubject: 'Sujet du message',
25 id: 'Id',
26 info: 'Infos sur le lien',
27 langCode: 'Code de langue',
28 langDir: 'Sens d\'écriture',
29 langDirLTR: 'Gauche à droite',
30 langDirRTL: 'Droite à gauche',
31 menu: 'Editer le lien',
32 name: 'Nom',
33 noAnchors: '(Aucune ancre disponible dans ce document)',
34 noEmail: 'Veuillez entrer l\'adresse e-mail',
35 noUrl: 'Veuillez entrer l\'adresse du lien',
36 other: '<autre>',
37 popupDependent: 'Dépendante (Netscape)',
38 popupFeatures: 'Options de la fenêtre popup',
39 popupFullScreen: 'Plein écran (IE)',
40 popupLeft: 'Position gauche',
41 popupLocationBar: 'Barre d\'adresse',
42 popupMenuBar: 'Barre de menu',
43 popupResizable: 'Redimensionnable',
44 popupScrollBars: 'Barres de défilement',
45 popupStatusBar: 'Barre de status',
46 popupToolbar: 'Barre d\'outils',
47 popupTop: 'Position haute',
48 rel: 'Relation',
49 selectAnchor: 'Sélectionner l\'ancre',
50 styles: 'Style',
51 tabIndex: 'Index de tabulation',
52 target: 'Cible',
53 targetFrame: '<cadre>',
54 targetFrameName: 'Nom du Cadre destination',
55 targetPopup: '<fenêtre popup>',
56 targetPopupName: 'Nom de la fenêtre popup',
57 title: 'Lien',
58 toAnchor: 'Ancre',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Lien',
62 type: 'Type de lien',
63 unlink: 'Supprimer le lien',
64 upload: 'Envoyer'
65} );
diff --git a/sources/plugins/link/lang/gl.js b/sources/plugins/link/lang/gl.js
new file mode 100644
index 00000000..015164d3
--- /dev/null
+++ b/sources/plugins/link/lang/gl.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'gl', {
6 acccessKey: 'Chave de acceso',
7 advanced: 'Avanzado',
8 advisoryContentType: 'Tipo de contido informativo',
9 advisoryTitle: 'Título',
10 anchor: {
11 toolbar: 'Ancoraxe',
12 menu: 'Editar a ancoraxe',
13 title: 'Propiedades da ancoraxe',
14 name: 'Nome da ancoraxe',
15 errorName: 'Escriba o nome da ancoraxe',
16 remove: 'Retirar a ancoraxe'
17 },
18 anchorId: 'Polo ID do elemento',
19 anchorName: 'Polo nome da ancoraxe',
20 charset: 'Codificación do recurso ligado',
21 cssClasses: 'Clases da folla de estilos',
22 emailAddress: 'Enderezo de correo',
23 emailBody: 'Corpo da mensaxe',
24 emailSubject: 'Asunto da mensaxe',
25 id: 'ID',
26 info: 'Información da ligazón',
27 langCode: 'Código do idioma',
28 langDir: 'Dirección de escritura do idioma',
29 langDirLTR: 'Esquerda a dereita (LTR)',
30 langDirRTL: 'Dereita a esquerda (RTL)',
31 menu: 'Editar a ligazón',
32 name: 'Nome',
33 noAnchors: '(Non hai ancoraxes dispoñíbeis no documento)',
34 noEmail: 'Escriba o enderezo de correo',
35 noUrl: 'Escriba a ligazón URL',
36 other: '<outro>',
37 popupDependent: 'Dependente (Netscape)',
38 popupFeatures: 'Características da xanela emerxente',
39 popupFullScreen: 'Pantalla completa (IE)',
40 popupLeft: 'Posición esquerda',
41 popupLocationBar: 'Barra de localización',
42 popupMenuBar: 'Barra do menú',
43 popupResizable: 'Redimensionábel',
44 popupScrollBars: 'Barras de desprazamento',
45 popupStatusBar: 'Barra de estado',
46 popupToolbar: 'Barra de ferramentas',
47 popupTop: 'Posición superior',
48 rel: 'Relación',
49 selectAnchor: 'Seleccionar unha ancoraxe',
50 styles: 'Estilo',
51 tabIndex: 'Índice de tabulación',
52 target: 'Destino',
53 targetFrame: '<marco>',
54 targetFrameName: 'Nome do marco de destino',
55 targetPopup: '<xanela emerxente>',
56 targetPopupName: 'Nome da xanela emerxente',
57 title: 'Ligazón',
58 toAnchor: 'Ligar coa ancoraxe no testo',
59 toEmail: 'Correo',
60 toUrl: 'URL',
61 toolbar: 'Ligazón',
62 type: 'Tipo de ligazón',
63 unlink: 'Eliminar a ligazón',
64 upload: 'Enviar'
65} );
diff --git a/sources/plugins/link/lang/gu.js b/sources/plugins/link/lang/gu.js
new file mode 100644
index 00000000..e0c388f4
--- /dev/null
+++ b/sources/plugins/link/lang/gu.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'gu', {
6 acccessKey: 'ઍક્સેસ કી',
7 advanced: 'અડ્વાન્સડ',
8 advisoryContentType: 'મુખ્ય કન્ટેન્ટ પ્રકાર',
9 advisoryTitle: 'મુખ્ય મથાળું',
10 anchor: {
11 toolbar: 'ઍંકર ઇન્સર્ટ/દાખલ કરવી',
12 menu: 'ઍંકરના ગુણ',
13 title: 'ઍંકરના ગુણ',
14 name: 'ઍંકરનું નામ',
15 errorName: 'ઍંકરનું નામ ટાઈપ કરો',
16 remove: 'સ્થિર નકરવું'
17 },
18 anchorId: 'ઍંકર એલિમન્ટ Id થી પસંદ કરો',
19 anchorName: 'ઍંકર નામથી પસંદ કરો',
20 charset: 'લિંક રિસૉર્સ કૅરિક્ટર સેટ',
21 cssClasses: 'સ્ટાઇલ-શીટ ક્લાસ',
22 emailAddress: 'ઈ-મેલ સરનામું',
23 emailBody: 'સંદેશ',
24 emailSubject: 'ઈ-મેલ વિષય',
25 id: 'Id',
26 info: 'લિંક ઇન્ફૉ ટૅબ',
27 langCode: 'ભાષા લેખવાની પદ્ધતિ',
28 langDir: 'ભાષા લેખવાની પદ્ધતિ',
29 langDirLTR: 'ડાબે થી જમણે (LTR)',
30 langDirRTL: 'જમણે થી ડાબે (RTL)',
31 menu: ' લિંક એડિટ/માં ફેરફાર કરવો',
32 name: 'નામ',
33 noAnchors: '(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)',
34 noEmail: 'ઈ-મેલ સરનામું ટાઇપ કરો',
35 noUrl: 'લિંક URL ટાઇપ કરો',
36 other: '<other> <અન્ય>',
37 popupDependent: 'ડિપેન્ડન્ટ (Netscape)',
38 popupFeatures: 'પૉપ-અપ વિન્ડો ફીચરસૅ',
39 popupFullScreen: 'ફુલ સ્ક્રીન (IE)',
40 popupLeft: 'ડાબી બાજુ',
41 popupLocationBar: 'લોકેશન બાર',
42 popupMenuBar: 'મેન્યૂ બાર',
43 popupResizable: 'રીસાઈઝએબલ',
44 popupScrollBars: 'સ્ક્રોલ બાર',
45 popupStatusBar: 'સ્ટૅટસ બાર',
46 popupToolbar: 'ટૂલ બાર',
47 popupTop: 'જમણી બાજુ',
48 rel: 'સંબંધની સ્થિતિ',
49 selectAnchor: 'ઍંકર પસંદ કરો',
50 styles: 'સ્ટાઇલ',
51 tabIndex: 'ટૅબ ઇન્ડેક્સ',
52 target: 'ટાર્ગેટ/લક્ષ્ય',
53 targetFrame: '<ફ્રેમ>',
54 targetFrameName: 'ટાર્ગેટ ફ્રેમ નું નામ',
55 targetPopup: '<પૉપ-અપ વિન્ડો>',
56 targetPopupName: 'પૉપ-અપ વિન્ડો નું નામ',
57 title: 'લિંક',
58 toAnchor: 'આ પેજનો ઍંકર',
59 toEmail: 'ઈ-મેલ',
60 toUrl: 'URL',
61 toolbar: 'લિંક ઇન્સર્ટ/દાખલ કરવી',
62 type: 'લિંક પ્રકાર',
63 unlink: 'લિંક કાઢવી',
64 upload: 'અપલોડ'
65} );
diff --git a/sources/plugins/link/lang/he.js b/sources/plugins/link/lang/he.js
new file mode 100644
index 00000000..d0c74d63
--- /dev/null
+++ b/sources/plugins/link/lang/he.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'he', {
6 acccessKey: 'מקש גישה',
7 advanced: 'אפשרויות מתקדמות',
8 advisoryContentType: 'Content Type מוצע',
9 advisoryTitle: 'כותרת מוצעת',
10 anchor: {
11 toolbar: 'הוספת/עריכת נקודת עיגון',
12 menu: 'מאפייני נקודת עיגון',
13 title: 'מאפייני נקודת עיגון',
14 name: 'שם לנקודת עיגון',
15 errorName: 'יש להקליד שם לנקודת עיגון',
16 remove: 'מחיקת נקודת עיגון'
17 },
18 anchorId: 'עפ"י זיהוי (ID) האלמנט',
19 anchorName: 'עפ"י שם העוגן',
20 charset: 'קידוד המשאב המקושר',
21 cssClasses: 'גיליונות עיצוב קבוצות',
22 emailAddress: 'כתובת הדוא"ל',
23 emailBody: 'גוף ההודעה',
24 emailSubject: 'נושא ההודעה',
25 id: 'זיהוי (ID)',
26 info: 'מידע על הקישור',
27 langCode: 'קוד שפה',
28 langDir: 'כיוון שפה',
29 langDirLTR: 'שמאל לימין (LTR)',
30 langDirRTL: 'ימין לשמאל (RTL)',
31 menu: 'מאפייני קישור',
32 name: 'שם',
33 noAnchors: '(אין עוגנים זמינים בדף)',
34 noEmail: 'יש להקליד את כתובת הדוא"ל',
35 noUrl: 'יש להקליד את כתובת הקישור (URL)',
36 other: '<אחר>',
37 popupDependent: 'תלוי (Netscape)',
38 popupFeatures: 'תכונות החלון הקופץ',
39 popupFullScreen: 'מסך מלא (IE)',
40 popupLeft: 'מיקום צד שמאל',
41 popupLocationBar: 'סרגל כתובת',
42 popupMenuBar: 'סרגל תפריט',
43 popupResizable: 'שינוי גודל',
44 popupScrollBars: 'ניתן לגלילה',
45 popupStatusBar: 'סרגל חיווי',
46 popupToolbar: 'סרגל הכלים',
47 popupTop: 'מיקום צד עליון',
48 rel: 'קשר גומלין',
49 selectAnchor: 'בחירת עוגן',
50 styles: 'סגנון',
51 tabIndex: 'מספר טאב',
52 target: 'מטרה',
53 targetFrame: '<מסגרת>',
54 targetFrameName: 'שם מסגרת היעד',
55 targetPopup: '<חלון קופץ>',
56 targetPopupName: 'שם החלון הקופץ',
57 title: 'קישור',
58 toAnchor: 'עוגן בעמוד זה',
59 toEmail: 'דוא"ל',
60 toUrl: 'כתובת (URL)',
61 toolbar: 'הוספת/עריכת קישור',
62 type: 'סוג קישור',
63 unlink: 'הסרת הקישור',
64 upload: 'העלאה'
65} );
diff --git a/sources/plugins/link/lang/hi.js b/sources/plugins/link/lang/hi.js
new file mode 100644
index 00000000..581f689b
--- /dev/null
+++ b/sources/plugins/link/lang/hi.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'hi', {
6 acccessKey: 'ऍक्सॅस की',
7 advanced: 'ऍड्वान्स्ड',
8 advisoryContentType: 'परामर्श कन्टॅन्ट प्रकार',
9 advisoryTitle: 'परामर्श शीर्शक',
10 anchor: {
11 toolbar: 'ऐंकर इन्सर्ट/संपादन',
12 menu: 'ऐंकर प्रॉपर्टीज़',
13 title: 'ऐंकर प्रॉपर्टीज़',
14 name: 'ऐंकर का नाम',
15 errorName: 'ऐंकर का नाम टाइप करें',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'ऍलीमॅन्ट Id से',
19 anchorName: 'ऐंकर नाम से',
20 charset: 'लिंक रिसोर्स करॅक्टर सॅट',
21 cssClasses: 'स्टाइल-शीट क्लास',
22 emailAddress: 'ई-मेल पता',
23 emailBody: 'संदेश',
24 emailSubject: 'संदेश विषय',
25 id: 'Id',
26 info: 'लिंक ',
27 langCode: 'भाषा लिखने की दिशा',
28 langDir: 'भाषा लिखने की दिशा',
29 langDirLTR: 'बायें से दायें (LTR)',
30 langDirRTL: 'दायें से बायें (RTL)',
31 menu: 'लिंक संपादन',
32 name: 'नाम',
33 noAnchors: '(डॉक्यूमॅन्ट में ऐंकर्स की संख्या)',
34 noEmail: 'ई-मेल पता टाइप करें',
35 noUrl: 'लिंक URL टाइप करें',
36 other: '<अन्य>',
37 popupDependent: 'डिपेन्डॅन्ट (Netscape)',
38 popupFeatures: 'पॉप-अप विन्डो फ़ीचर्स',
39 popupFullScreen: 'फ़ुल स्क्रीन (IE)',
40 popupLeft: 'बायीं तरफ',
41 popupLocationBar: 'लोकेशन बार',
42 popupMenuBar: 'मॅन्यू बार',
43 popupResizable: 'आकार बदलने लायक',
44 popupScrollBars: 'स्क्रॉल बार',
45 popupStatusBar: 'स्टेटस बार',
46 popupToolbar: 'टूल बार',
47 popupTop: 'दायीं तरफ',
48 rel: 'संबंध',
49 selectAnchor: 'ऐंकर चुनें',
50 styles: 'स्टाइल',
51 tabIndex: 'टैब इन्डॅक्स',
52 target: 'टार्गेट',
53 targetFrame: '<फ़्रेम>',
54 targetFrameName: 'टार्गेट फ़्रेम का नाम',
55 targetPopup: '<पॉप-अप विन्डो>',
56 targetPopupName: 'पॉप-अप विन्डो का नाम',
57 title: 'लिंक',
58 toAnchor: 'इस पेज का ऐंकर',
59 toEmail: 'ई-मेल',
60 toUrl: 'URL',
61 toolbar: 'लिंक इन्सर्ट/संपादन',
62 type: 'लिंक प्रकार',
63 unlink: 'लिंक हटायें',
64 upload: 'अपलोड'
65} );
diff --git a/sources/plugins/link/lang/hr.js b/sources/plugins/link/lang/hr.js
new file mode 100644
index 00000000..4f2c04f5
--- /dev/null
+++ b/sources/plugins/link/lang/hr.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'hr', {
6 acccessKey: 'Pristupna tipka',
7 advanced: 'Napredno',
8 advisoryContentType: 'Advisory vrsta sadržaja',
9 advisoryTitle: 'Advisory naslov',
10 anchor: {
11 toolbar: 'Ubaci/promijeni sidro',
12 menu: 'Svojstva sidra',
13 title: 'Svojstva sidra',
14 name: 'Ime sidra',
15 errorName: 'Molimo unesite ime sidra',
16 remove: 'Ukloni sidro'
17 },
18 anchorId: 'Po Id elementa',
19 anchorName: 'Po nazivu sidra',
20 charset: 'Kodna stranica povezanih resursa',
21 cssClasses: 'Stylesheet klase',
22 emailAddress: 'E-Mail adresa',
23 emailBody: 'Sadržaj poruke',
24 emailSubject: 'Naslov',
25 id: 'Id',
26 info: 'Link Info',
27 langCode: 'Smjer jezika',
28 langDir: 'Smjer jezika',
29 langDirLTR: 'S lijeva na desno (LTR)',
30 langDirRTL: 'S desna na lijevo (RTL)',
31 menu: 'Promijeni link',
32 name: 'Naziv',
33 noAnchors: '(Nema dostupnih sidra)',
34 noEmail: 'Molimo upišite e-mail adresu',
35 noUrl: 'Molimo upišite URL link',
36 other: '<drugi>',
37 popupDependent: 'Ovisno (Netscape)',
38 popupFeatures: 'Mogućnosti popup prozora',
39 popupFullScreen: 'Cijeli ekran (IE)',
40 popupLeft: 'Lijeva pozicija',
41 popupLocationBar: 'Traka za lokaciju',
42 popupMenuBar: 'Izborna traka',
43 popupResizable: 'Promjenjiva veličina',
44 popupScrollBars: 'Scroll traka',
45 popupStatusBar: 'Statusna traka',
46 popupToolbar: 'Traka s alatima',
47 popupTop: 'Gornja pozicija',
48 rel: 'Veza',
49 selectAnchor: 'Odaberi sidro',
50 styles: 'Stil',
51 tabIndex: 'Tab Indeks',
52 target: 'Meta',
53 targetFrame: '<okvir>',
54 targetFrameName: 'Ime ciljnog okvira',
55 targetPopup: '<popup prozor>',
56 targetPopupName: 'Naziv popup prozora',
57 title: 'Link',
58 toAnchor: 'Sidro na ovoj stranici',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Ubaci/promijeni link',
62 type: 'Link vrsta',
63 unlink: 'Ukloni link',
64 upload: 'Pošalji'
65} );
diff --git a/sources/plugins/link/lang/hu.js b/sources/plugins/link/lang/hu.js
new file mode 100644
index 00000000..97e82bf7
--- /dev/null
+++ b/sources/plugins/link/lang/hu.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'hu', {
6 acccessKey: 'Billentyűkombináció',
7 advanced: 'További opciók',
8 advisoryContentType: 'Súgó tartalomtípusa',
9 advisoryTitle: 'Súgócimke',
10 anchor: {
11 toolbar: 'Horgony beillesztése/szerkesztése',
12 menu: 'Horgony tulajdonságai',
13 title: 'Horgony tulajdonságai',
14 name: 'Horgony neve',
15 errorName: 'Kérem adja meg a horgony nevét',
16 remove: 'Horgony eltávolítása'
17 },
18 anchorId: 'Azonosító szerint',
19 anchorName: 'Horgony név szerint',
20 charset: 'Hivatkozott tartalom kódlapja',
21 cssClasses: 'Stíluskészlet',
22 emailAddress: 'E-Mail cím',
23 emailBody: 'Üzenet',
24 emailSubject: 'Üzenet tárgya',
25 id: 'Id',
26 info: 'Alaptulajdonságok',
27 langCode: 'Írás iránya',
28 langDir: 'Írás iránya',
29 langDirLTR: 'Balról jobbra',
30 langDirRTL: 'Jobbról balra',
31 menu: 'Hivatkozás módosítása',
32 name: 'Név',
33 noAnchors: '(Nincs horgony a dokumentumban)',
34 noEmail: 'Adja meg az E-Mail címet',
35 noUrl: 'Adja meg a hivatkozás webcímét',
36 other: '<más>',
37 popupDependent: 'Szülőhöz kapcsolt (csak Netscape)',
38 popupFeatures: 'Felugró ablak jellemzői',
39 popupFullScreen: 'Teljes képernyő (csak IE)',
40 popupLeft: 'Bal pozíció',
41 popupLocationBar: 'Címsor',
42 popupMenuBar: 'Menü sor',
43 popupResizable: 'Átméretezés',
44 popupScrollBars: 'Gördítősáv',
45 popupStatusBar: 'Állapotsor',
46 popupToolbar: 'Eszköztár',
47 popupTop: 'Felső pozíció',
48 rel: 'Kapcsolat típusa',
49 selectAnchor: 'Horgony választása',
50 styles: 'Stílus',
51 tabIndex: 'Tabulátor index',
52 target: 'Tartalom megjelenítése',
53 targetFrame: '<keretben>',
54 targetFrameName: 'Keret neve',
55 targetPopup: '<felugró ablakban>',
56 targetPopupName: 'Felugró ablak neve',
57 title: 'Hivatkozás tulajdonságai',
58 toAnchor: 'Horgony az oldalon',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Hivatkozás beillesztése/módosítása',
62 type: 'Hivatkozás típusa',
63 unlink: 'Hivatkozás törlése',
64 upload: 'Feltöltés'
65} );
diff --git a/sources/plugins/link/lang/id.js b/sources/plugins/link/lang/id.js
new file mode 100644
index 00000000..7e94cee7
--- /dev/null
+++ b/sources/plugins/link/lang/id.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'id', {
6 acccessKey: 'Access Key', // MISSING
7 advanced: 'Advanced', // MISSING
8 advisoryContentType: 'Advisory Content Type', // MISSING
9 advisoryTitle: 'Penasehat Judul',
10 anchor: {
11 toolbar: 'Anchor', // MISSING
12 menu: 'Edit Anchor', // MISSING
13 title: 'Anchor Properties', // MISSING
14 name: 'Anchor Name', // MISSING
15 errorName: 'Please type the anchor name', // MISSING
16 remove: 'Remove Anchor' // MISSING
17 },
18 anchorId: 'By Element Id', // MISSING
19 anchorName: 'By Anchor Name', // MISSING
20 charset: 'Linked Resource Charset', // MISSING
21 cssClasses: 'Kelas Stylesheet',
22 emailAddress: 'Alamat E-mail',
23 emailBody: 'Message Body', // MISSING
24 emailSubject: 'Judul Pesan',
25 id: 'Id',
26 info: 'Link Info', // MISSING
27 langCode: 'Kode Bahasa',
28 langDir: 'Arah Bahasa',
29 langDirLTR: 'Kiri ke Kanan (LTR)',
30 langDirRTL: 'Kanan ke Kiri (RTL)',
31 menu: 'Sunting Tautan',
32 name: 'Nama',
33 noAnchors: '(No anchors available in the document)', // MISSING
34 noEmail: 'Silahkan ketikkan alamat e-mail',
35 noUrl: 'Silahkan ketik URL tautan',
36 other: '<lainnya>',
37 popupDependent: 'Dependent (Netscape)', // MISSING
38 popupFeatures: 'Popup Window Features', // MISSING
39 popupFullScreen: 'Full Screen (IE)', // MISSING
40 popupLeft: 'Left Position', // MISSING
41 popupLocationBar: 'Location Bar', // MISSING
42 popupMenuBar: 'Menu Bar', // MISSING
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Scroll Bars', // MISSING
45 popupStatusBar: 'Status Bar', // MISSING
46 popupToolbar: 'Toolbar', // MISSING
47 popupTop: 'Top Position', // MISSING
48 rel: 'Hubungan',
49 selectAnchor: 'Select an Anchor', // MISSING
50 styles: 'Gaya',
51 tabIndex: 'Tab Index', // MISSING
52 target: 'Sasaran',
53 targetFrame: '<frame>', // MISSING
54 targetFrameName: 'Target Frame Name', // MISSING
55 targetPopup: '<popup window>', // MISSING
56 targetPopupName: 'Popup Window Name', // MISSING
57 title: 'Tautan',
58 toAnchor: 'Link to anchor in the text', // MISSING
59 toEmail: 'E-mail', // MISSING
60 toUrl: 'URL',
61 toolbar: 'Tautan',
62 type: 'Link Type', // MISSING
63 unlink: 'Unlink', // MISSING
64 upload: 'Unggah'
65} );
diff --git a/sources/plugins/link/lang/is.js b/sources/plugins/link/lang/is.js
new file mode 100644
index 00000000..a2589363
--- /dev/null
+++ b/sources/plugins/link/lang/is.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'is', {
6 acccessKey: 'Skammvalshnappur',
7 advanced: 'Tæknilegt',
8 advisoryContentType: 'Tegund innihalds',
9 advisoryTitle: 'Titill',
10 anchor: {
11 toolbar: 'Stofna/breyta kaflamerki',
12 menu: 'Eigindi kaflamerkis',
13 title: 'Eigindi kaflamerkis',
14 name: 'Nafn bókamerkis',
15 errorName: 'Sláðu inn nafn bókamerkis!',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Eftir auðkenni einingar',
19 anchorName: 'Eftir akkerisnafni',
20 charset: 'Táknróf',
21 cssClasses: 'Stílsniðsflokkur',
22 emailAddress: 'Netfang',
23 emailBody: 'Meginmál',
24 emailSubject: 'Efni',
25 id: 'Auðkenni',
26 info: 'Almennt',
27 langCode: 'Lesstefna',
28 langDir: 'Lesstefna',
29 langDirLTR: 'Frá vinstri til hægri (LTR)',
30 langDirRTL: 'Frá hægri til vinstri (RTL)',
31 menu: 'Breyta stiklu',
32 name: 'Nafn',
33 noAnchors: '<Engin bókamerki á skrá>',
34 noEmail: 'Sláðu inn netfang!',
35 noUrl: 'Sláðu inn veffang stiklunnar!',
36 other: '<annar>',
37 popupDependent: 'Háð venslum (Netscape)',
38 popupFeatures: 'Eigindi sprettiglugga',
39 popupFullScreen: 'Heilskjár (IE)',
40 popupLeft: 'Fjarlægð frá vinstri',
41 popupLocationBar: 'Fanglína',
42 popupMenuBar: 'Vallína',
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Skrunstikur',
45 popupStatusBar: 'Stöðustika',
46 popupToolbar: 'Verkfærastika',
47 popupTop: 'Fjarlægð frá efri brún',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Veldu akkeri',
50 styles: 'Stíll',
51 tabIndex: 'Raðnúmer innsláttarreits',
52 target: 'Mark',
53 targetFrame: '<rammi>',
54 targetFrameName: 'Nafn markglugga',
55 targetPopup: '<sprettigluggi>',
56 targetPopupName: 'Nafn sprettiglugga',
57 title: 'Stikla',
58 toAnchor: 'Bókamerki á þessari síðu',
59 toEmail: 'Netfang',
60 toUrl: 'Vefslóð',
61 toolbar: 'Stofna/breyta stiklu',
62 type: 'Stikluflokkur',
63 unlink: 'Fjarlægja stiklu',
64 upload: 'Senda upp'
65} );
diff --git a/sources/plugins/link/lang/it.js b/sources/plugins/link/lang/it.js
new file mode 100644
index 00000000..3ea41673
--- /dev/null
+++ b/sources/plugins/link/lang/it.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'it', {
6 acccessKey: 'Scorciatoia da tastiera',
7 advanced: 'Avanzate',
8 advisoryContentType: 'Tipo della risorsa collegata',
9 advisoryTitle: 'Titolo',
10 anchor: {
11 toolbar: 'Inserisci/Modifica Ancora',
12 menu: 'Proprietà ancora',
13 title: 'Proprietà ancora',
14 name: 'Nome ancora',
15 errorName: 'Inserici il nome dell\'ancora',
16 remove: 'Rimuovi l\'ancora'
17 },
18 anchorId: 'Per id elemento',
19 anchorName: 'Per Nome',
20 charset: 'Set di caretteri della risorsa collegata',
21 cssClasses: 'Nome classe CSS',
22 emailAddress: 'Indirizzo E-Mail',
23 emailBody: 'Corpo del messaggio',
24 emailSubject: 'Oggetto del messaggio',
25 id: 'Id',
26 info: 'Informazioni collegamento',
27 langCode: 'Direzione scrittura',
28 langDir: 'Direzione scrittura',
29 langDirLTR: 'Da Sinistra a Destra (LTR)',
30 langDirRTL: 'Da Destra a Sinistra (RTL)',
31 menu: 'Modifica collegamento',
32 name: 'Nome',
33 noAnchors: '(Nessuna ancora disponibile nel documento)',
34 noEmail: 'Devi inserire un\'indirizzo e-mail',
35 noUrl: 'Devi inserire l\'URL del collegamento',
36 other: '<altro>',
37 popupDependent: 'Dipendente (Netscape)',
38 popupFeatures: 'Caratteristiche finestra popup',
39 popupFullScreen: 'A tutto schermo (IE)',
40 popupLeft: 'Posizione da sinistra',
41 popupLocationBar: 'Barra degli indirizzi',
42 popupMenuBar: 'Barra del menu',
43 popupResizable: 'Ridimensionabile',
44 popupScrollBars: 'Barre di scorrimento',
45 popupStatusBar: 'Barra di stato',
46 popupToolbar: 'Barra degli strumenti',
47 popupTop: 'Posizione dall\'alto',
48 rel: 'Relazioni',
49 selectAnchor: 'Scegli Ancora',
50 styles: 'Stile',
51 tabIndex: 'Ordine di tabulazione',
52 target: 'Destinazione',
53 targetFrame: '<riquadro>',
54 targetFrameName: 'Nome del riquadro di destinazione',
55 targetPopup: '<finestra popup>',
56 targetPopupName: 'Nome finestra popup',
57 title: 'Collegamento',
58 toAnchor: 'Ancora nel testo',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Collegamento',
62 type: 'Tipo di Collegamento',
63 unlink: 'Elimina collegamento',
64 upload: 'Carica'
65} );
diff --git a/sources/plugins/link/lang/ja.js b/sources/plugins/link/lang/ja.js
new file mode 100644
index 00000000..2a35b90a
--- /dev/null
+++ b/sources/plugins/link/lang/ja.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ja', {
6 acccessKey: 'アクセスキー',
7 advanced: '高度な設定',
8 advisoryContentType: 'Content Type属性',
9 advisoryTitle: 'Title属性',
10 anchor: {
11 toolbar: 'アンカー挿入/編集',
12 menu: 'アンカーの編集',
13 title: 'アンカーのプロパティ',
14 name: 'アンカー名',
15 errorName: 'アンカー名を入力してください。',
16 remove: 'アンカーを削除'
17 },
18 anchorId: 'エレメントID',
19 anchorName: 'アンカー名',
20 charset: 'リンク先のcharset',
21 cssClasses: 'スタイルシートクラス',
22 emailAddress: 'E-Mail アドレス',
23 emailBody: '本文',
24 emailSubject: '件名',
25 id: 'Id',
26 info: 'ハイパーリンク情報',
27 langCode: '言語コード',
28 langDir: '文字表記の方向',
29 langDirLTR: '左から右 (LTR)',
30 langDirRTL: '右から左 (RTL)',
31 menu: 'リンクを編集',
32 name: 'Name属性',
33 noAnchors: '(このドキュメント内にアンカーはありません)',
34 noEmail: 'メールアドレスを入力してください。',
35 noUrl: 'リンクURLを入力してください。',
36 other: '<その他の>',
37 popupDependent: '開いたウィンドウに連動して閉じる (Netscape)',
38 popupFeatures: 'ポップアップウィンドウ特徴',
39 popupFullScreen: '全画面モード(IE)',
40 popupLeft: '左端からの座標で指定',
41 popupLocationBar: 'ロケーションバー',
42 popupMenuBar: 'メニューバー',
43 popupResizable: 'サイズ可変',
44 popupScrollBars: 'スクロールバー',
45 popupStatusBar: 'ステータスバー',
46 popupToolbar: 'ツールバー',
47 popupTop: '上端からの座標で指定',
48 rel: '関連リンク',
49 selectAnchor: 'アンカーを選択',
50 styles: 'スタイルシート',
51 tabIndex: 'タブインデックス',
52 target: 'ターゲット',
53 targetFrame: '<フレーム>',
54 targetFrameName: 'ターゲットのフレーム名',
55 targetPopup: '<ポップアップウィンドウ>',
56 targetPopupName: 'ポップアップウィンドウ名',
57 title: 'ハイパーリンク',
58 toAnchor: 'ページ内のアンカー',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'リンク挿入/編集',
62 type: 'リンクタイプ',
63 unlink: 'リンクを削除',
64 upload: 'アップロード'
65} );
diff --git a/sources/plugins/link/lang/ka.js b/sources/plugins/link/lang/ka.js
new file mode 100644
index 00000000..9dfdfd11
--- /dev/null
+++ b/sources/plugins/link/lang/ka.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ka', {
6 acccessKey: 'წვდომის ღილაკი',
7 advanced: 'დაწვრილებით',
8 advisoryContentType: 'შიგთავსის ტიპი',
9 advisoryTitle: 'სათაური',
10 anchor: {
11 toolbar: 'ღუზა',
12 menu: 'ღუზის რედაქტირება',
13 title: 'ღუზის პარამეტრები',
14 name: 'ღუზუს სახელი',
15 errorName: 'აკრიფეთ ღუზის სახელი',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'ელემენტის Id-თ',
19 anchorName: 'ღუზის სახელით',
20 charset: 'კოდირება',
21 cssClasses: 'CSS კლასი',
22 emailAddress: 'ელფოსტის მისამართები',
23 emailBody: 'წერილის ტექსტი',
24 emailSubject: 'წერილის სათაური',
25 id: 'Id',
26 info: 'ბმულის ინფორმაცია',
27 langCode: 'ენის კოდი',
28 langDir: 'ენის მიმართულება',
29 langDirLTR: 'მარცხნიდან მარჯვნივ (LTR)',
30 langDirRTL: 'მარჯვნიდან მარცხნივ (RTL)',
31 menu: 'ბმულის რედაქტირება',
32 name: 'სახელი',
33 noAnchors: '(ამ დოკუმენტში ღუზა არაა)',
34 noEmail: 'აკრიფეთ ელფოსტის მისამართი',
35 noUrl: 'აკრიფეთ ბმულის URL',
36 other: '<სხვა>',
37 popupDependent: 'დამოკიდებული (Netscape)',
38 popupFeatures: 'Popup ფანჯრის პარამეტრები',
39 popupFullScreen: 'მთელი ეკრანი (IE)',
40 popupLeft: 'მარცხენა პოზიცია',
41 popupLocationBar: 'ნავიგაციის ზოლი',
42 popupMenuBar: 'მენიუს ზოლი',
43 popupResizable: 'ცვალებადი ზომით',
44 popupScrollBars: 'გადახვევის ზოლები',
45 popupStatusBar: 'სტატუსის ზოლი',
46 popupToolbar: 'ხელსაწყოთა ზოლი',
47 popupTop: 'ზედა პოზიცია',
48 rel: 'კავშირი',
49 selectAnchor: 'აირჩიეთ ღუზა',
50 styles: 'CSS სტილი',
51 tabIndex: 'Tab-ის ინდექსი',
52 target: 'გახსნის ადგილი',
53 targetFrame: '<frame>',
54 targetFrameName: 'Frame-ის სახელი',
55 targetPopup: '<popup ფანჯარა>',
56 targetPopupName: 'Popup ფანჯრის სახელი',
57 title: 'ბმული',
58 toAnchor: 'ბმული ტექსტში ღუზაზე',
59 toEmail: 'ელფოსტა',
60 toUrl: 'URL',
61 toolbar: 'ბმული',
62 type: 'ბმულის ტიპი',
63 unlink: 'ბმულის მოხსნა',
64 upload: 'აქაჩვა'
65} );
diff --git a/sources/plugins/link/lang/km.js b/sources/plugins/link/lang/km.js
new file mode 100644
index 00000000..449d74bb
--- /dev/null
+++ b/sources/plugins/link/lang/km.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'km', {
6 acccessKey: 'សោរ​ចូល',
7 advanced: 'កម្រិត​ខ្ពស់',
8 advisoryContentType: 'ប្រភេទអត្ថបទ​ប្រឹក្សា',
9 advisoryTitle: 'ចំណងជើង​ប្រឹក្សា',
10 anchor: {
11 toolbar: 'យុថ្កា',
12 menu: 'កែ​យុថ្កា',
13 title: 'លក្ខណៈ​យុថ្កា',
14 name: 'ឈ្មោះ​យុថ្កា',
15 errorName: 'សូម​បញ្ចូល​ឈ្មោះ​យុថ្កា',
16 remove: 'ដក​យុថ្កា​ចេញ'
17 },
18 anchorId: 'តាម ID ធាតុ',
19 anchorName: 'តាម​ឈ្មោះ​យុថ្កា',
20 charset: 'លេខកូតអក្សររបស់ឈ្នាប់',
21 cssClasses: 'Stylesheet Classes',
22 emailAddress: 'អាសយដ្ឋាន​អ៊ីមែល',
23 emailBody: 'តួ​អត្ថបទ',
24 emailSubject: 'ប្រធានបទ​សារ',
25 id: 'Id',
26 info: 'ព័ត៌មាន​ពី​តំណ',
27 langCode: 'កូដ​ភាសា',
28 langDir: 'ទិសដៅភាសា',
29 langDirLTR: 'ពីឆ្វេងទៅស្តាំ(LTR)',
30 langDirRTL: 'ពីស្តាំទៅឆ្វេង(RTL)',
31 menu: 'កែ​តំណ',
32 name: 'ឈ្មោះ',
33 noAnchors: '(មិន​មាន​យុថ្កា​នៅ​ក្នុង​ឯកសារ​អត្ថថបទ​ទេ)',
34 noEmail: 'សូម​បញ្ចូល​អាសយដ្ឋាន​អ៊ីមែល',
35 noUrl: 'សូម​បញ្ចូល​តំណ URL',
36 other: '<ផ្សេង​ទៀត>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: 'មុខ​ងារ​ផុស​ផ្ទាំង​វីនដូ​ឡើង',
39 popupFullScreen: 'ពេញ​អេក្រង់ (IE)',
40 popupLeft: 'ទីតាំងខាងឆ្វេង',
41 popupLocationBar: 'របារ​ទីតាំង',
42 popupMenuBar: 'របារ​ម៉ឺនុយ',
43 popupResizable: 'អាច​ប្ដូរ​ទំហំ',
44 popupScrollBars: 'របារ​រំកិល',
45 popupStatusBar: 'របារ​ស្ថានភាព',
46 popupToolbar: 'របារ​ឧបករណ៍',
47 popupTop: 'ទីតាំង​កំពូល',
48 rel: 'សម្ពន្ធ​ភាព',
49 selectAnchor: 'រើស​យក​យុថ្កា​មួយ',
50 styles: 'ស្ទីល',
51 tabIndex: 'លេខ Tab',
52 target: 'គោលដៅ',
53 targetFrame: '<ស៊ុម>',
54 targetFrameName: 'ឈ្មោះ​ស៊ុម​ជា​គោល​ដៅ',
55 targetPopup: '<វីនដូ​ផុស​ឡើង>',
56 targetPopupName: 'ឈ្មោះ​វីនដូត​ផុស​ឡើង',
57 title: 'តំណ',
58 toAnchor: 'ត​ភ្ជាប់​ទៅ​យុថ្កា​ក្នុង​អត្ថបទ',
59 toEmail: 'អ៊ីមែល',
60 toUrl: 'URL',
61 toolbar: 'តំណ',
62 type: 'ប្រភេទ​តំណ',
63 unlink: 'ផ្ដាច់​តំណ',
64 upload: 'ផ្ទុក​ឡើង'
65} );
diff --git a/sources/plugins/link/lang/ko.js b/sources/plugins/link/lang/ko.js
new file mode 100644
index 00000000..dfa0bdbc
--- /dev/null
+++ b/sources/plugins/link/lang/ko.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ko', {
6 acccessKey: '액세스 키',
7 advanced: '고급',
8 advisoryContentType: '보조 콘텐츠 유형',
9 advisoryTitle: '보조 제목',
10 anchor: {
11 toolbar: '책갈피',
12 menu: '책갈피 편집',
13 title: '책갈피 속성',
14 name: '책갈피 이름',
15 errorName: '책갈피 이름을 입력하십시오',
16 remove: '책갈피 제거'
17 },
18 anchorId: '책갈피 ID',
19 anchorName: '책갈피 이름',
20 charset: '링크된 자료 문자열 인코딩',
21 cssClasses: '스타일시트 클래스',
22 emailAddress: '이메일 주소',
23 emailBody: '메시지 내용',
24 emailSubject: '메시지 제목',
25 id: 'ID',
26 info: '링크 정보',
27 langCode: '언어 코드',
28 langDir: '언어 방향',
29 langDirLTR: '왼쪽에서 오른쪽 (LTR)',
30 langDirRTL: '오른쪽에서 왼쪽 (RTL)',
31 menu: '링크 수정',
32 name: '이름',
33 noAnchors: '(문서에 책갈피가 없습니다.)',
34 noEmail: '이메일 주소를 입력하십시오',
35 noUrl: '링크 주소(URL)를 입력하십시오',
36 other: '<기타>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: '팝업창 속성',
39 popupFullScreen: '전체화면 (IE)',
40 popupLeft: '왼쪽 위치',
41 popupLocationBar: '주소 표시줄',
42 popupMenuBar: '메뉴 바',
43 popupResizable: '크기 조절 가능',
44 popupScrollBars: '스크롤 바',
45 popupStatusBar: '상태 바',
46 popupToolbar: '툴바',
47 popupTop: '위쪽 위치',
48 rel: '관계',
49 selectAnchor: '책갈피 선택',
50 styles: '스타일',
51 tabIndex: '탭 순서',
52 target: '타겟',
53 targetFrame: '<프레임>',
54 targetFrameName: '타겟 프레임 이름',
55 targetPopup: '<팝업 창>',
56 targetPopupName: '팝업 창 이름',
57 title: '링크',
58 toAnchor: '책갈피',
59 toEmail: '이메일',
60 toUrl: '주소(URL)',
61 toolbar: '링크 삽입/변경',
62 type: '링크 종류',
63 unlink: '링크 지우기',
64 upload: '업로드'
65} );
diff --git a/sources/plugins/link/lang/ku.js b/sources/plugins/link/lang/ku.js
new file mode 100644
index 00000000..b0066426
--- /dev/null
+++ b/sources/plugins/link/lang/ku.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ku', {
6 acccessKey: 'کلیلی دەستپێگەیشتن',
7 advanced: 'پێشکەوتوو',
8 advisoryContentType: 'جۆری ناوەڕۆکی ڕاویژکار',
9 advisoryTitle: 'ڕاوێژکاری سەردێڕ',
10 anchor: {
11 toolbar: 'دانان/چاکسازی لەنگەر',
12 menu: 'چاکسازی لەنگەر',
13 title: 'خاسیەتی لەنگەر',
14 name: 'ناوی لەنگەر',
15 errorName: 'تکایه ناوی لەنگەر بنووسه',
16 remove: 'لابردنی لەنگەر'
17 },
18 anchorId: 'بەپێی ناسنامەی توخم',
19 anchorName: 'بەپێی ناوی لەنگەر',
20 charset: 'بەستەری سەرچاوەی نووسە',
21 cssClasses: 'شێوازی چینی پەڕه',
22 emailAddress: 'ناونیشانی ئیمەیل',
23 emailBody: 'ناوەڕۆکی نامە',
24 emailSubject: 'بابەتی نامە',
25 id: 'ناسنامە',
26 info: 'زانیاری بەستەر',
27 langCode: 'هێمای زمان',
28 langDir: 'ئاراستەی زمان',
29 langDirLTR: 'چەپ بۆ ڕاست (LTR)',
30 langDirRTL: 'ڕاست بۆ چەپ (RTL)',
31 menu: 'چاکسازی بەستەر',
32 name: 'ناو',
33 noAnchors: '(هیچ جۆرێکی لەنگەر ئامادە نیە لەم پەڕەیه)',
34 noEmail: 'تکایە ناونیشانی ئیمەیل بنووسە',
35 noUrl: 'تکایە ناونیشانی بەستەر بنووسە',
36 other: '<هیتر>',
37 popupDependent: 'پێوەبەستراو (Netscape)',
38 popupFeatures: 'خاسیەتی پەنجەرەی سەرهەڵدەر',
39 popupFullScreen: 'پڕ بەپڕی شاشە (IE)',
40 popupLeft: 'جێگای چەپ',
41 popupLocationBar: 'هێڵی ناونیشانی بەستەر',
42 popupMenuBar: 'هێڵی لیسته',
43 popupResizable: 'توانای گۆڕینی قەباره',
44 popupScrollBars: 'هێڵی هاتووچۆپێکردن',
45 popupStatusBar: 'هێڵی دۆخ',
46 popupToolbar: 'هێڵی تووڵامراز',
47 popupTop: 'جێگای سەرەوە',
48 rel: 'پەیوەندی',
49 selectAnchor: 'هەڵبژاردنی لەنگەرێك',
50 styles: 'شێواز',
51 tabIndex: 'بازدەری تابی ئیندێکس',
52 target: 'ئامانج',
53 targetFrame: '<چووارچێوە>',
54 targetFrameName: 'ناوی ئامانجی چووارچێوە',
55 targetPopup: '<پەنجەرەی سەرهەڵدەر>',
56 targetPopupName: 'ناوی پەنجەرەی سەرهەڵدەر',
57 title: 'بەستەر',
58 toAnchor: 'بەستەر بۆ لەنگەر له دەق',
59 toEmail: 'ئیمەیل',
60 toUrl: 'ناونیشانی بەستەر',
61 toolbar: 'دانان/ڕێکخستنی بەستەر',
62 type: 'جۆری بەستەر',
63 unlink: 'لابردنی بەستەر',
64 upload: 'بارکردن'
65} );
diff --git a/sources/plugins/link/lang/lt.js b/sources/plugins/link/lang/lt.js
new file mode 100644
index 00000000..ed829cae
--- /dev/null
+++ b/sources/plugins/link/lang/lt.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'lt', {
6 acccessKey: 'Prieigos raktas',
7 advanced: 'Papildomas',
8 advisoryContentType: 'Konsultacinio turinio tipas',
9 advisoryTitle: 'Konsultacinė antraštė',
10 anchor: {
11 toolbar: 'Įterpti/modifikuoti žymę',
12 menu: 'Žymės savybės',
13 title: 'Žymės savybės',
14 name: 'Žymės vardas',
15 errorName: 'Prašome įvesti žymės vardą',
16 remove: 'Pašalinti žymę'
17 },
18 anchorId: 'Pagal žymės Id',
19 anchorName: 'Pagal žymės vardą',
20 charset: 'Susietų išteklių simbolių lentelė',
21 cssClasses: 'Stilių lentelės klasės',
22 emailAddress: 'El.pašto adresas',
23 emailBody: 'Žinutės turinys',
24 emailSubject: 'Žinutės tema',
25 id: 'Id',
26 info: 'Nuorodos informacija',
27 langCode: 'Teksto kryptis',
28 langDir: 'Teksto kryptis',
29 langDirLTR: 'Iš kairės į dešinę (LTR)',
30 langDirRTL: 'Iš dešinės į kairę (RTL)',
31 menu: 'Taisyti nuorodą',
32 name: 'Vardas',
33 noAnchors: '(Šiame dokumente žymių nėra)',
34 noEmail: 'Prašome įvesti el.pašto adresą',
35 noUrl: 'Prašome įvesti nuorodos URL',
36 other: '<kitas>',
37 popupDependent: 'Priklausomas (Netscape)',
38 popupFeatures: 'Išskleidžiamo lango savybės',
39 popupFullScreen: 'Visas ekranas (IE)',
40 popupLeft: 'Kairė pozicija',
41 popupLocationBar: 'Adreso juosta',
42 popupMenuBar: 'Meniu juosta',
43 popupResizable: 'Kintamas dydis',
44 popupScrollBars: 'Slinkties juostos',
45 popupStatusBar: 'Būsenos juosta',
46 popupToolbar: 'Mygtukų juosta',
47 popupTop: 'Viršutinė pozicija',
48 rel: 'Sąsajos',
49 selectAnchor: 'Pasirinkite žymę',
50 styles: 'Stilius',
51 tabIndex: 'Tabuliavimo indeksas',
52 target: 'Paskirties vieta',
53 targetFrame: '<kadras>',
54 targetFrameName: 'Paskirties kadro vardas',
55 targetPopup: '<išskleidžiamas langas>',
56 targetPopupName: 'Paskirties lango vardas',
57 title: 'Nuoroda',
58 toAnchor: 'Žymė šiame puslapyje',
59 toEmail: 'El.paštas',
60 toUrl: 'Nuoroda',
61 toolbar: 'Įterpti/taisyti nuorodą',
62 type: 'Nuorodos tipas',
63 unlink: 'Panaikinti nuorodą',
64 upload: 'Siųsti'
65} );
diff --git a/sources/plugins/link/lang/lv.js b/sources/plugins/link/lang/lv.js
new file mode 100644
index 00000000..18a32e8b
--- /dev/null
+++ b/sources/plugins/link/lang/lv.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'lv', {
6 acccessKey: 'Pieejas taustiņš',
7 advanced: 'Izvērstais',
8 advisoryContentType: 'Konsultatīvs satura tips',
9 advisoryTitle: 'Konsultatīvs virsraksts',
10 anchor: {
11 toolbar: 'Ievietot/Labot iezīmi',
12 menu: 'Labot iezīmi',
13 title: 'Iezīmes uzstādījumi',
14 name: 'Iezīmes nosaukums',
15 errorName: 'Lūdzu norādiet iezīmes nosaukumu',
16 remove: 'Noņemt iezīmi'
17 },
18 anchorId: 'Pēc elementa ID',
19 anchorName: 'Pēc iezīmes nosaukuma',
20 charset: 'Pievienotā resursa kodējums',
21 cssClasses: 'Stilu saraksta klases',
22 emailAddress: 'E-pasta adrese',
23 emailBody: 'Ziņas saturs',
24 emailSubject: 'Ziņas tēma',
25 id: 'ID',
26 info: 'Hipersaites informācija',
27 langCode: 'Valodas kods',
28 langDir: 'Valodas lasīšanas virziens',
29 langDirLTR: 'No kreisās uz labo (LTR)',
30 langDirRTL: 'No labās uz kreiso (RTL)',
31 menu: 'Labot hipersaiti',
32 name: 'Nosaukums',
33 noAnchors: '(Šajā dokumentā nav iezīmju)',
34 noEmail: 'Lūdzu norādi e-pasta adresi',
35 noUrl: 'Lūdzu norādi hipersaiti',
36 other: '<cits>',
37 popupDependent: 'Atkarīgs (Netscape)',
38 popupFeatures: 'Uznirstošā loga nosaukums īpašības',
39 popupFullScreen: 'Pilnā ekrānā (IE)',
40 popupLeft: 'Kreisā koordināte',
41 popupLocationBar: 'Atrašanās vietas josla',
42 popupMenuBar: 'Izvēlnes josla',
43 popupResizable: 'Mērogojams',
44 popupScrollBars: 'Ritjoslas',
45 popupStatusBar: 'Statusa josla',
46 popupToolbar: 'Rīku josla',
47 popupTop: 'Augšējā koordināte',
48 rel: 'Relācija',
49 selectAnchor: 'Izvēlēties iezīmi',
50 styles: 'Stils',
51 tabIndex: 'Ciļņu indekss',
52 target: 'Mērķis',
53 targetFrame: '<ietvars>',
54 targetFrameName: 'Mērķa ietvara nosaukums',
55 targetPopup: '<uznirstošā logā>',
56 targetPopupName: 'Uznirstošā loga nosaukums',
57 title: 'Hipersaite',
58 toAnchor: 'Iezīme šajā lapā',
59 toEmail: 'E-pasts',
60 toUrl: 'Adrese',
61 toolbar: 'Ievietot/Labot hipersaiti',
62 type: 'Hipersaites tips',
63 unlink: 'Noņemt hipersaiti',
64 upload: 'Augšupielādēt'
65} );
diff --git a/sources/plugins/link/lang/mk.js b/sources/plugins/link/lang/mk.js
new file mode 100644
index 00000000..2c3e2de7
--- /dev/null
+++ b/sources/plugins/link/lang/mk.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'mk', {
6 acccessKey: 'Access Key', // MISSING
7 advanced: 'Advanced', // MISSING
8 advisoryContentType: 'Advisory Content Type', // MISSING
9 advisoryTitle: 'Advisory Title', // MISSING
10 anchor: {
11 toolbar: 'Anchor',
12 menu: 'Edit Anchor',
13 title: 'Anchor Properties',
14 name: 'Anchor Name',
15 errorName: 'Please type the anchor name',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'By Element Id', // MISSING
19 anchorName: 'By Anchor Name', // MISSING
20 charset: 'Linked Resource Charset', // MISSING
21 cssClasses: 'Stylesheet Classes', // MISSING
22 emailAddress: 'E-Mail Address', // MISSING
23 emailBody: 'Message Body', // MISSING
24 emailSubject: 'Message Subject', // MISSING
25 id: 'Id', // MISSING
26 info: 'Link Info', // MISSING
27 langCode: 'Language Code', // MISSING
28 langDir: 'Language Direction', // MISSING
29 langDirLTR: 'Left to Right (LTR)', // MISSING
30 langDirRTL: 'Right to Left (RTL)', // MISSING
31 menu: 'Edit Link', // MISSING
32 name: 'Name',
33 noAnchors: '(No anchors available in the document)', // MISSING
34 noEmail: 'Please type the e-mail address', // MISSING
35 noUrl: 'Please type the link URL', // MISSING
36 other: '<other>', // MISSING
37 popupDependent: 'Dependent (Netscape)', // MISSING
38 popupFeatures: 'Popup Window Features', // MISSING
39 popupFullScreen: 'Full Screen (IE)', // MISSING
40 popupLeft: 'Left Position', // MISSING
41 popupLocationBar: 'Location Bar', // MISSING
42 popupMenuBar: 'Menu Bar', // MISSING
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Scroll Bars', // MISSING
45 popupStatusBar: 'Status Bar', // MISSING
46 popupToolbar: 'Toolbar', // MISSING
47 popupTop: 'Top Position', // MISSING
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Select an Anchor', // MISSING
50 styles: 'Style', // MISSING
51 tabIndex: 'Tab Index', // MISSING
52 target: 'Target', // MISSING
53 targetFrame: '<frame>', // MISSING
54 targetFrameName: 'Target Frame Name', // MISSING
55 targetPopup: '<popup window>', // MISSING
56 targetPopupName: 'Popup Window Name', // MISSING
57 title: 'Link', // MISSING
58 toAnchor: 'Link to anchor in the text', // MISSING
59 toEmail: 'E-mail', // MISSING
60 toUrl: 'URL', // MISSING
61 toolbar: 'Link', // MISSING
62 type: 'Link Type', // MISSING
63 unlink: 'Unlink', // MISSING
64 upload: 'Upload' // MISSING
65} );
diff --git a/sources/plugins/link/lang/mn.js b/sources/plugins/link/lang/mn.js
new file mode 100644
index 00000000..d047cf81
--- /dev/null
+++ b/sources/plugins/link/lang/mn.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'mn', {
6 acccessKey: 'Холбох түлхүүр',
7 advanced: 'Нэмэлт',
8 advisoryContentType: 'Зөвлөлдөх төрлийн агуулга',
9 advisoryTitle: 'Зөвлөлдөх гарчиг',
10 anchor: {
11 toolbar: 'Зангуу',
12 menu: 'Зангууг болосруулах',
13 title: 'Зангуугийн шинж чанар',
14 name: 'Зангуугийн нэр',
15 errorName: 'Зангуугийн нэрийг оруулна уу',
16 remove: 'Зангууг устгах'
17 },
18 anchorId: 'Элемэнтйн Id нэрээр',
19 anchorName: 'Зангуугийн нэрээр',
20 charset: 'Тэмдэгт оноох нөөцөд холбогдсон',
21 cssClasses: 'Stylesheet классууд',
22 emailAddress: 'Э-шуудангийн хаяг',
23 emailBody: 'Зурвасны их бие',
24 emailSubject: 'Зурвасны гарчиг',
25 id: 'Id',
26 info: 'Холбоосын тухай мэдээлэл',
27 langCode: 'Хэлний код',
28 langDir: 'Хэлний чиглэл',
29 langDirLTR: 'Зүүнээс баруун (LTR)',
30 langDirRTL: 'Баруунаас зүүн (RTL)',
31 menu: 'Холбоос засварлах',
32 name: 'Нэр',
33 noAnchors: '(Баримт бичиг зангуугүй байна)',
34 noEmail: 'Э-шуудангий хаягаа шивнэ үү',
35 noUrl: 'Холбоосны URL хаягийг шивнэ үү',
36 other: '<other>', // MISSING
37 popupDependent: 'Хамаатай (Netscape)',
38 popupFeatures: 'Popup цонхны онцлог',
39 popupFullScreen: 'Цонх дүүргэх (Internet Explorer)',
40 popupLeft: 'Зүүн байрлал',
41 popupLocationBar: 'Location хэсэг',
42 popupMenuBar: 'Цэсний самбар',
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Скрол хэсэгүүд',
45 popupStatusBar: 'Статус хэсэг',
46 popupToolbar: 'Багажны самбар',
47 popupTop: 'Дээд байрлал',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Нэг зангууг сонгоно уу',
50 styles: 'Загвар',
51 tabIndex: 'Tab индекс',
52 target: 'Байрлал',
53 targetFrame: '<Агуулах хүрээ>',
54 targetFrameName: 'Очих фремын нэр',
55 targetPopup: '<popup цонх>',
56 targetPopupName: 'Popup цонхны нэр',
57 title: 'Холбоос',
58 toAnchor: 'Энэ бичвэр дэх зангуу руу очих холбоос',
59 toEmail: 'Э-захиа',
60 toUrl: 'цахим хуудасны хаяг (URL)',
61 toolbar: 'Холбоос',
62 type: 'Линкийн төрөл',
63 unlink: 'Холбоос авч хаях',
64 upload: 'Хуулах'
65} );
diff --git a/sources/plugins/link/lang/ms.js b/sources/plugins/link/lang/ms.js
new file mode 100644
index 00000000..455dd6ca
--- /dev/null
+++ b/sources/plugins/link/lang/ms.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ms', {
6 acccessKey: 'Kunci Akses',
7 advanced: 'Advanced',
8 advisoryContentType: 'Jenis Kandungan Makluman',
9 advisoryTitle: 'Tajuk Makluman',
10 anchor: {
11 toolbar: 'Masukkan/Sunting Pautan',
12 menu: 'Ciri-ciri Pautan',
13 title: 'Ciri-ciri Pautan',
14 name: 'Nama Pautan',
15 errorName: 'Sila taip nama pautan',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'dengan menggunakan ID elemen',
19 anchorName: 'dengan menggunakan nama pautan',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Kelas-kelas Stylesheet',
22 emailAddress: 'Alamat E-Mail',
23 emailBody: 'Isi Kandungan Mesej',
24 emailSubject: 'Subjek Mesej',
25 id: 'Id',
26 info: 'Butiran Sambungan',
27 langCode: 'Arah Tulisan',
28 langDir: 'Arah Tulisan',
29 langDirLTR: 'Kiri ke Kanan (LTR)',
30 langDirRTL: 'Kanan ke Kiri (RTL)',
31 menu: 'Sunting Sambungan',
32 name: 'Nama',
33 noAnchors: '(Tiada pautan terdapat dalam dokumen ini)',
34 noEmail: 'Sila taip alamat e-mail',
35 noUrl: 'Sila taip sambungan URL',
36 other: '<lain>',
37 popupDependent: 'Bergantungan (Netscape)',
38 popupFeatures: 'Ciri Tetingkap Popup',
39 popupFullScreen: 'Skrin Penuh (IE)',
40 popupLeft: 'Posisi Kiri',
41 popupLocationBar: 'Bar Lokasi',
42 popupMenuBar: 'Bar Menu',
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Bar-bar skrol',
45 popupStatusBar: 'Bar Status',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Posisi Atas',
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Sila pilih pautan',
50 styles: 'Stail',
51 tabIndex: 'Indeks Tab ',
52 target: 'Sasaran',
53 targetFrame: '<bingkai>',
54 targetFrameName: 'Nama Bingkai Sasaran',
55 targetPopup: '<tetingkap popup>',
56 targetPopupName: 'Nama Tetingkap Popup',
57 title: 'Sambungan',
58 toAnchor: 'Pautan dalam muka surat ini',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Masukkan/Sunting Sambungan',
62 type: 'Jenis Sambungan',
63 unlink: 'Buang Sambungan',
64 upload: 'Muat Naik'
65} );
diff --git a/sources/plugins/link/lang/nb.js b/sources/plugins/link/lang/nb.js
new file mode 100644
index 00000000..7474e27c
--- /dev/null
+++ b/sources/plugins/link/lang/nb.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'nb', {
6 acccessKey: 'Aksessknapp',
7 advanced: 'Avansert',
8 advisoryContentType: 'Type',
9 advisoryTitle: 'Tittel',
10 anchor: {
11 toolbar: 'Sett inn/Rediger anker',
12 menu: 'Egenskaper for anker',
13 title: 'Egenskaper for anker',
14 name: 'Ankernavn',
15 errorName: 'Vennligst skriv inn ankernavnet',
16 remove: 'Fjern anker'
17 },
18 anchorId: 'Element etter ID',
19 anchorName: 'Anker etter navn',
20 charset: 'Lenket tegnsett',
21 cssClasses: 'Stilarkklasser',
22 emailAddress: 'E-postadresse',
23 emailBody: 'Melding',
24 emailSubject: 'Meldingsemne',
25 id: 'Id',
26 info: 'Lenkeinfo',
27 langCode: 'Språkkode',
28 langDir: 'Språkretning',
29 langDirLTR: 'Venstre til høyre (VTH)',
30 langDirRTL: 'Høyre til venstre (HTV)',
31 menu: 'Rediger lenke',
32 name: 'Navn',
33 noAnchors: '(Ingen anker i dokumentet)',
34 noEmail: 'Vennligst skriv inn e-postadressen',
35 noUrl: 'Vennligst skriv inn lenkens URL',
36 other: '<annen>',
37 popupDependent: 'Avhenging (Netscape)',
38 popupFeatures: 'Egenskaper for popup-vindu',
39 popupFullScreen: 'Fullskjerm (IE)',
40 popupLeft: 'Venstre posisjon',
41 popupLocationBar: 'Adresselinje',
42 popupMenuBar: 'Menylinje',
43 popupResizable: 'Skalerbar',
44 popupScrollBars: 'Scrollbar',
45 popupStatusBar: 'Statuslinje',
46 popupToolbar: 'Verktøylinje',
47 popupTop: 'Topp-posisjon',
48 rel: 'Relasjon (rel)',
49 selectAnchor: 'Velg et anker',
50 styles: 'Stil',
51 tabIndex: 'Tabindeks',
52 target: 'Mål',
53 targetFrame: '<ramme>',
54 targetFrameName: 'Målramme',
55 targetPopup: '<popup-vindu>',
56 targetPopupName: 'Navn på popup-vindu',
57 title: 'Lenke',
58 toAnchor: 'Lenke til anker i teksten',
59 toEmail: 'E-post',
60 toUrl: 'URL',
61 toolbar: 'Sett inn/Rediger lenke',
62 type: 'Lenketype',
63 unlink: 'Fjern lenke',
64 upload: 'Last opp'
65} );
diff --git a/sources/plugins/link/lang/nl.js b/sources/plugins/link/lang/nl.js
new file mode 100644
index 00000000..84569cdd
--- /dev/null
+++ b/sources/plugins/link/lang/nl.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'nl', {
6 acccessKey: 'Toegangstoets',
7 advanced: 'Geavanceerd',
8 advisoryContentType: 'Aanbevolen content-type',
9 advisoryTitle: 'Adviserende titel',
10 anchor: {
11 toolbar: 'Interne link',
12 menu: 'Eigenschappen interne link',
13 title: 'Eigenschappen interne link',
14 name: 'Naam interne link',
15 errorName: 'Geef de naam van de interne link op',
16 remove: 'Interne link verwijderen'
17 },
18 anchorId: 'Op kenmerk interne link',
19 anchorName: 'Op naam interne link',
20 charset: 'Karakterset van gelinkte bron',
21 cssClasses: 'Stylesheet-klassen',
22 emailAddress: 'E-mailadres',
23 emailBody: 'Inhoud bericht',
24 emailSubject: 'Onderwerp bericht',
25 id: 'Id',
26 info: 'Linkomschrijving',
27 langCode: 'Taalcode',
28 langDir: 'Schrijfrichting',
29 langDirLTR: 'Links naar rechts (LTR)',
30 langDirRTL: 'Rechts naar links (RTL)',
31 menu: 'Link wijzigen',
32 name: 'Naam',
33 noAnchors: '(Geen interne links in document gevonden)',
34 noEmail: 'Geef een e-mailadres',
35 noUrl: 'Geef de link van de URL',
36 other: '<ander>',
37 popupDependent: 'Afhankelijk (Netscape)',
38 popupFeatures: 'Instellingen popupvenster',
39 popupFullScreen: 'Volledig scherm (IE)',
40 popupLeft: 'Positie links',
41 popupLocationBar: 'Locatiemenu',
42 popupMenuBar: 'Menubalk',
43 popupResizable: 'Herschaalbaar',
44 popupScrollBars: 'Schuifbalken',
45 popupStatusBar: 'Statusbalk',
46 popupToolbar: 'Werkbalk',
47 popupTop: 'Positie boven',
48 rel: 'Relatie',
49 selectAnchor: 'Kies een interne link',
50 styles: 'Stijl',
51 tabIndex: 'Tabvolgorde',
52 target: 'Doelvenster',
53 targetFrame: '<frame>',
54 targetFrameName: 'Naam doelframe',
55 targetPopup: '<popupvenster>',
56 targetPopupName: 'Naam popupvenster',
57 title: 'Link',
58 toAnchor: 'Interne link in pagina',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Link invoegen/wijzigen',
62 type: 'Linktype',
63 unlink: 'Link verwijderen',
64 upload: 'Upload'
65} );
diff --git a/sources/plugins/link/lang/no.js b/sources/plugins/link/lang/no.js
new file mode 100644
index 00000000..c5a79533
--- /dev/null
+++ b/sources/plugins/link/lang/no.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'no', {
6 acccessKey: 'Aksessknapp',
7 advanced: 'Avansert',
8 advisoryContentType: 'Type',
9 advisoryTitle: 'Tittel',
10 anchor: {
11 toolbar: 'Sett inn/Rediger anker',
12 menu: 'Egenskaper for anker',
13 title: 'Egenskaper for anker',
14 name: 'Ankernavn',
15 errorName: 'Vennligst skriv inn ankernavnet',
16 remove: 'Fjern anker'
17 },
18 anchorId: 'Element etter ID',
19 anchorName: 'Anker etter navn',
20 charset: 'Lenket tegnsett',
21 cssClasses: 'Stilarkklasser',
22 emailAddress: 'E-postadresse',
23 emailBody: 'Melding',
24 emailSubject: 'Meldingsemne',
25 id: 'Id',
26 info: 'Lenkeinfo',
27 langCode: 'Språkkode',
28 langDir: 'Språkretning',
29 langDirLTR: 'Venstre til høyre (VTH)',
30 langDirRTL: 'Høyre til venstre (HTV)',
31 menu: 'Rediger lenke',
32 name: 'Navn',
33 noAnchors: '(Ingen anker i dokumentet)',
34 noEmail: 'Vennligst skriv inn e-postadressen',
35 noUrl: 'Vennligst skriv inn lenkens URL',
36 other: '<annen>',
37 popupDependent: 'Avhenging (Netscape)',
38 popupFeatures: 'Egenskaper for popup-vindu',
39 popupFullScreen: 'Fullskjerm (IE)',
40 popupLeft: 'Venstre posisjon',
41 popupLocationBar: 'Adresselinje',
42 popupMenuBar: 'Menylinje',
43 popupResizable: 'Skalerbar',
44 popupScrollBars: 'Scrollbar',
45 popupStatusBar: 'Statuslinje',
46 popupToolbar: 'Verktøylinje',
47 popupTop: 'Topp-posisjon',
48 rel: 'Relasjon (rel)',
49 selectAnchor: 'Velg et anker',
50 styles: 'Stil',
51 tabIndex: 'Tabindeks',
52 target: 'Mål',
53 targetFrame: '<ramme>',
54 targetFrameName: 'Målramme',
55 targetPopup: '<popup-vindu>',
56 targetPopupName: 'Navn på popup-vindu',
57 title: 'Lenke',
58 toAnchor: 'Lenke til anker i teksten',
59 toEmail: 'E-post',
60 toUrl: 'URL',
61 toolbar: 'Sett inn/Rediger lenke',
62 type: 'Lenketype',
63 unlink: 'Fjern lenke',
64 upload: 'Last opp'
65} );
diff --git a/sources/plugins/link/lang/pl.js b/sources/plugins/link/lang/pl.js
new file mode 100644
index 00000000..1b483788
--- /dev/null
+++ b/sources/plugins/link/lang/pl.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'pl', {
6 acccessKey: 'Klawisz dostępu',
7 advanced: 'Zaawansowane',
8 advisoryContentType: 'Typ MIME obiektu docelowego',
9 advisoryTitle: 'Opis obiektu docelowego',
10 anchor: {
11 toolbar: 'Wstaw/edytuj kotwicę',
12 menu: 'Właściwości kotwicy',
13 title: 'Właściwości kotwicy',
14 name: 'Nazwa kotwicy',
15 errorName: 'Wpisz nazwę kotwicy',
16 remove: 'Usuń kotwicę'
17 },
18 anchorId: 'Wg identyfikatora',
19 anchorName: 'Wg nazwy',
20 charset: 'Kodowanie znaków obiektu docelowego',
21 cssClasses: 'Nazwa klasy CSS',
22 emailAddress: 'Adres e-mail',
23 emailBody: 'Treść',
24 emailSubject: 'Temat',
25 id: 'Id',
26 info: 'Informacje ',
27 langCode: 'Kod języka',
28 langDir: 'Kierunek tekstu',
29 langDirLTR: 'Od lewej do prawej (LTR)',
30 langDirRTL: 'Od prawej do lewej (RTL)',
31 menu: 'Edytuj odnośnik',
32 name: 'Nazwa',
33 noAnchors: '(W dokumencie nie zdefiniowano żadnych kotwic)',
34 noEmail: 'Podaj adres e-mail',
35 noUrl: 'Podaj adres URL',
36 other: '<inny>',
37 popupDependent: 'Okno zależne (Netscape)',
38 popupFeatures: 'Właściwości wyskakującego okna',
39 popupFullScreen: 'Pełny ekran (IE)',
40 popupLeft: 'Pozycja w poziomie',
41 popupLocationBar: 'Pasek adresu',
42 popupMenuBar: 'Pasek menu',
43 popupResizable: 'Skalowalny',
44 popupScrollBars: 'Paski przewijania',
45 popupStatusBar: 'Pasek statusu',
46 popupToolbar: 'Pasek narzędzi',
47 popupTop: 'Pozycja w pionie',
48 rel: 'Relacja',
49 selectAnchor: 'Wybierz kotwicę',
50 styles: 'Styl',
51 tabIndex: 'Indeks kolejności',
52 target: 'Obiekt docelowy',
53 targetFrame: '<ramka>',
54 targetFrameName: 'Nazwa ramki docelowej',
55 targetPopup: '<wyskakujące okno>',
56 targetPopupName: 'Nazwa wyskakującego okna',
57 title: 'Odnośnik',
58 toAnchor: 'Odnośnik wewnątrz strony (kotwica)',
59 toEmail: 'Adres e-mail',
60 toUrl: 'Adres URL',
61 toolbar: 'Wstaw/edytuj odnośnik',
62 type: 'Typ odnośnika',
63 unlink: 'Usuń odnośnik',
64 upload: 'Wyślij'
65} );
diff --git a/sources/plugins/link/lang/pt-br.js b/sources/plugins/link/lang/pt-br.js
new file mode 100644
index 00000000..731bd682
--- /dev/null
+++ b/sources/plugins/link/lang/pt-br.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'pt-br', {
6 acccessKey: 'Chave de Acesso',
7 advanced: 'Avançado',
8 advisoryContentType: 'Tipo de Conteúdo',
9 advisoryTitle: 'Título',
10 anchor: {
11 toolbar: 'Inserir/Editar Âncora',
12 menu: 'Formatar Âncora',
13 title: 'Formatar Âncora',
14 name: 'Nome da Âncora',
15 errorName: 'Por favor, digite o nome da âncora',
16 remove: 'Remover Âncora'
17 },
18 anchorId: 'Id da âncora',
19 anchorName: 'Nome da âncora',
20 charset: 'Charset do Link',
21 cssClasses: 'Classe de CSS',
22 emailAddress: 'Endereço E-Mail',
23 emailBody: 'Corpo da Mensagem',
24 emailSubject: 'Assunto da Mensagem',
25 id: 'Id',
26 info: 'Informações',
27 langCode: 'Direção do idioma',
28 langDir: 'Direção do idioma',
29 langDirLTR: 'Esquerda para Direita (LTR)',
30 langDirRTL: 'Direita para Esquerda (RTL)',
31 menu: 'Editar Link',
32 name: 'Nome',
33 noAnchors: '(Não há âncoras no documento)',
34 noEmail: 'Por favor, digite o endereço de e-mail',
35 noUrl: 'Por favor, digite o endereço do Link',
36 other: '<outro>',
37 popupDependent: 'Dependente (Netscape)',
38 popupFeatures: 'Propriedades da Janela Pop-up',
39 popupFullScreen: 'Modo Tela Cheia (IE)',
40 popupLeft: 'Esquerda',
41 popupLocationBar: 'Barra de Endereços',
42 popupMenuBar: 'Barra de Menus',
43 popupResizable: 'Redimensionável',
44 popupScrollBars: 'Barras de Rolagem',
45 popupStatusBar: 'Barra de Status',
46 popupToolbar: 'Barra de Ferramentas',
47 popupTop: 'Topo',
48 rel: 'Tipo de Relação',
49 selectAnchor: 'Selecione uma âncora',
50 styles: 'Estilos',
51 tabIndex: 'Índice de Tabulação',
52 target: 'Destino',
53 targetFrame: '<frame>',
54 targetFrameName: 'Nome do Frame de Destino',
55 targetPopup: '<janela popup>',
56 targetPopupName: 'Nome da Janela Pop-up',
57 title: 'Editar Link',
58 toAnchor: 'Âncora nesta página',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Inserir/Editar Link',
62 type: 'Tipo de hiperlink',
63 unlink: 'Remover Link',
64 upload: 'Enviar ao Servidor'
65} );
diff --git a/sources/plugins/link/lang/pt.js b/sources/plugins/link/lang/pt.js
new file mode 100644
index 00000000..eabaf9e5
--- /dev/null
+++ b/sources/plugins/link/lang/pt.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'pt', {
6 acccessKey: 'Chave de Acesso',
7 advanced: 'Avançado',
8 advisoryContentType: 'Tipo de Conteúdo',
9 advisoryTitle: 'Título',
10 anchor: {
11 toolbar: ' Inserir/Editar Âncora',
12 menu: 'Propriedades da Âncora',
13 title: 'Propriedades da Âncora',
14 name: 'Nome da Âncora',
15 errorName: 'Por favor, introduza o nome da âncora',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Por ID de elemento',
19 anchorName: 'Por Nome de Referência',
20 charset: 'Fonte de caracteres vinculado',
21 cssClasses: 'Classes de Estilo de Folhas Classes',
22 emailAddress: 'Endereço de E-Mail',
23 emailBody: 'Corpo da Mensagem',
24 emailSubject: 'Título de Mensagem',
25 id: 'ID',
26 info: 'Informação de Hiperligação',
27 langCode: 'Orientação de idioma',
28 langDir: 'Orientação de idioma',
29 langDirLTR: 'Esquerda à Direita (LTR)',
30 langDirRTL: 'Direita a Esquerda (RTL)',
31 menu: 'Editar Hiperligação',
32 name: 'Nome',
33 noAnchors: '(Não há referências disponíveis no documento)',
34 noEmail: 'Por favor introduza o endereço de e-mail',
35 noUrl: 'Por favor introduza a hiperligação URL',
36 other: '<outro>',
37 popupDependent: 'Dependente (Netscape)',
38 popupFeatures: 'Características de Janela de Popup',
39 popupFullScreen: 'Janela Completa (IE)',
40 popupLeft: 'Posição Esquerda',
41 popupLocationBar: 'Barra de localização',
42 popupMenuBar: 'Barra de Menu',
43 popupResizable: 'Redimensionável',
44 popupScrollBars: 'Barras de deslocamento',
45 popupStatusBar: 'Barra de Estado',
46 popupToolbar: 'Barra de ferramentas',
47 popupTop: 'Posição Direita',
48 rel: 'Relação',
49 selectAnchor: 'Seleccionar una referência',
50 styles: 'Estilo',
51 tabIndex: 'Índice de tabulação',
52 target: 'Alvo',
53 targetFrame: '<frame>',
54 targetFrameName: 'Nome do Frame Destino',
55 targetPopup: '<janela de popup>',
56 targetPopupName: 'Nome da Janela de Popup',
57 title: 'Hiperligação',
58 toAnchor: 'Referência a esta página',
59 toEmail: 'Email',
60 toUrl: 'URL',
61 toolbar: 'Inserir/Editar Hiperligação',
62 type: 'Tipo de Hiperligação',
63 unlink: 'Eliminar Hiperligação',
64 upload: 'Carregar'
65} );
diff --git a/sources/plugins/link/lang/ro.js b/sources/plugins/link/lang/ro.js
new file mode 100644
index 00000000..41e02311
--- /dev/null
+++ b/sources/plugins/link/lang/ro.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ro', {
6 acccessKey: 'Tasta de acces',
7 advanced: 'Avansat',
8 advisoryContentType: 'Tipul consultativ al titlului',
9 advisoryTitle: 'Titlul consultativ',
10 anchor: {
11 toolbar: 'Inserează/Editează ancoră',
12 menu: 'Proprietăţi ancoră',
13 title: 'Proprietăţi ancoră',
14 name: 'Numele ancorei',
15 errorName: 'Vă rugăm scrieţi numele ancorei',
16 remove: 'Elimină ancora'
17 },
18 anchorId: 'după Id-ul elementului',
19 anchorName: 'după numele ancorei',
20 charset: 'Setul de caractere al resursei legate',
21 cssClasses: 'Clasele cu stilul paginii (CSS)',
22 emailAddress: 'Adresă de e-mail',
23 emailBody: 'Opțiuni Meniu Contextual',
24 emailSubject: 'Subiectul mesajului',
25 id: 'Id',
26 info: 'Informaţii despre link (Legătură web)',
27 langCode: 'Direcţia cuvintelor',
28 langDir: 'Direcţia cuvintelor',
29 langDirLTR: 'stânga-dreapta (LTR)',
30 langDirRTL: 'dreapta-stânga (RTL)',
31 menu: 'Editează Link',
32 name: 'Nume',
33 noAnchors: '(Nicio ancoră disponibilă în document)',
34 noEmail: 'Vă rugăm să scrieţi adresa de e-mail',
35 noUrl: 'Vă rugăm să scrieţi URL-ul',
36 other: '<alt>',
37 popupDependent: 'Dependent (Netscape)',
38 popupFeatures: 'Proprietăţile ferestrei popup',
39 popupFullScreen: 'Tot ecranul (Full Screen)(IE)',
40 popupLeft: 'Poziţia la stânga',
41 popupLocationBar: 'Bara de locaţie',
42 popupMenuBar: 'Bara de meniu',
43 popupResizable: 'Redimensionabil',
44 popupScrollBars: 'Bare de derulare',
45 popupStatusBar: 'Bara de status',
46 popupToolbar: 'Bara de opţiuni',
47 popupTop: 'Poziţia la dreapta',
48 rel: 'Relație',
49 selectAnchor: 'Selectaţi o ancoră',
50 styles: 'Stil',
51 tabIndex: 'Indexul tabului',
52 target: 'Ţintă (Target)',
53 targetFrame: '<frame>',
54 targetFrameName: 'Numele frameului ţintă',
55 targetPopup: '<fereastra popup>',
56 targetPopupName: 'Numele ferestrei popup',
57 title: 'Link (Legătură web)',
58 toAnchor: 'Ancoră în această pagină',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Inserează/Editează link (legătură web)',
62 type: 'Tipul link-ului (al legăturii web)',
63 unlink: 'Înlătură link (legătură web)',
64 upload: 'Încarcă'
65} );
diff --git a/sources/plugins/link/lang/ru.js b/sources/plugins/link/lang/ru.js
new file mode 100644
index 00000000..d950420c
--- /dev/null
+++ b/sources/plugins/link/lang/ru.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ru', {
6 acccessKey: 'Клавиша доступа',
7 advanced: 'Дополнительно',
8 advisoryContentType: 'Тип содержимого',
9 advisoryTitle: 'Заголовок',
10 anchor: {
11 toolbar: 'Вставить / редактировать якорь',
12 menu: 'Изменить якорь',
13 title: 'Свойства якоря',
14 name: 'Имя якоря',
15 errorName: 'Пожалуйста, введите имя якоря',
16 remove: 'Удалить якорь'
17 },
18 anchorId: 'По идентификатору',
19 anchorName: 'По имени',
20 charset: 'Кодировка ресурса',
21 cssClasses: 'Классы CSS',
22 emailAddress: 'Email адрес',
23 emailBody: 'Текст сообщения',
24 emailSubject: 'Тема сообщения',
25 id: 'Идентификатор',
26 info: 'Информация о ссылке',
27 langCode: 'Код языка',
28 langDir: 'Направление текста',
29 langDirLTR: 'Слева направо (LTR)',
30 langDirRTL: 'Справа налево (RTL)',
31 menu: 'Редактировать ссылку',
32 name: 'Имя',
33 noAnchors: '(В документе нет ни одного якоря)',
34 noEmail: 'Пожалуйста, введите email адрес',
35 noUrl: 'Пожалуйста, введите ссылку',
36 other: '<другой>',
37 popupDependent: 'Зависимое (Netscape)',
38 popupFeatures: 'Параметры всплывающего окна',
39 popupFullScreen: 'Полноэкранное (IE)',
40 popupLeft: 'Отступ слева',
41 popupLocationBar: 'Панель адреса',
42 popupMenuBar: 'Панель меню',
43 popupResizable: 'Изменяемый размер',
44 popupScrollBars: 'Полосы прокрутки',
45 popupStatusBar: 'Строка состояния',
46 popupToolbar: 'Панель инструментов',
47 popupTop: 'Отступ сверху',
48 rel: 'Отношение',
49 selectAnchor: 'Выберите якорь',
50 styles: 'Стиль',
51 tabIndex: 'Последовательность перехода',
52 target: 'Цель',
53 targetFrame: '<фрейм>',
54 targetFrameName: 'Имя целевого фрейма',
55 targetPopup: '<всплывающее окно>',
56 targetPopupName: 'Имя всплывающего окна',
57 title: 'Ссылка',
58 toAnchor: 'Ссылка на якорь в тексте',
59 toEmail: 'Email',
60 toUrl: 'Ссылка',
61 toolbar: 'Вставить/Редактировать ссылку',
62 type: 'Тип ссылки',
63 unlink: 'Убрать ссылку',
64 upload: 'Загрузка'
65} );
diff --git a/sources/plugins/link/lang/si.js b/sources/plugins/link/lang/si.js
new file mode 100644
index 00000000..0545fbad
--- /dev/null
+++ b/sources/plugins/link/lang/si.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'si', {
6 acccessKey: 'ප්‍රවේශ යතුර',
7 advanced: 'දීය',
8 advisoryContentType: 'උපදේශාත්මක අන්තර්ගත ආකාරය',
9 advisoryTitle: 'උපදේශාත්මක නාමය',
10 anchor: {
11 toolbar: 'ආධාරය',
12 menu: 'ආධාරය වෙනස් කිරීම',
13 title: 'ආධාරක ',
14 name: 'ආධාරකයේ නාමය',
15 errorName: 'කරුණාකර ආධාරකයේ නාමය ඇතුල් කරන්න',
16 remove: 'ආධාරකය ඉවත් කිරීම'
17 },
18 anchorId: 'By Element Id', // MISSING
19 anchorName: 'By Anchor Name', // MISSING
20 charset: 'Linked Resource Charset', // MISSING
21 cssClasses: 'විලාසපත්‍ර පන්තිය',
22 emailAddress: 'E-Mail Address', // MISSING
23 emailBody: 'Message Body', // MISSING
24 emailSubject: 'Message Subject', // MISSING
25 id: 'අංකය',
26 info: 'Link Info', // MISSING
27 langCode: 'භාෂා කේතය',
28 langDir: 'භාෂා දිශාව',
29 langDirLTR: 'වමේසිට දකුණුට',
30 langDirRTL: 'දකුණේ සිට වමට',
31 menu: 'Edit Link', // MISSING
32 name: 'නම',
33 noAnchors: '(No anchors available in the document)', // MISSING
34 noEmail: 'Please type the e-mail address', // MISSING
35 noUrl: 'Please type the link URL', // MISSING
36 other: '<other>', // MISSING
37 popupDependent: 'Dependent (Netscape)', // MISSING
38 popupFeatures: 'Popup Window Features', // MISSING
39 popupFullScreen: 'Full Screen (IE)', // MISSING
40 popupLeft: 'Left Position', // MISSING
41 popupLocationBar: 'Location Bar', // MISSING
42 popupMenuBar: 'Menu Bar', // MISSING
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Scroll Bars', // MISSING
45 popupStatusBar: 'Status Bar', // MISSING
46 popupToolbar: 'Toolbar', // MISSING
47 popupTop: 'Top Position', // MISSING
48 rel: 'Relationship', // MISSING
49 selectAnchor: 'Select an Anchor', // MISSING
50 styles: 'විලාසය',
51 tabIndex: 'Tab Index', // MISSING
52 target: 'අරමුණ',
53 targetFrame: '<frame>', // MISSING
54 targetFrameName: 'Target Frame Name', // MISSING
55 targetPopup: '<popup window>', // MISSING
56 targetPopupName: 'Popup Window Name', // MISSING
57 title: 'සබැඳිය',
58 toAnchor: 'Link to anchor in the text', // MISSING
59 toEmail: 'E-mail', // MISSING
60 toUrl: 'URL',
61 toolbar: 'සබැඳිය',
62 type: 'Link Type', // MISSING
63 unlink: 'Unlink', // MISSING
64 upload: 'උඩුගතකිරීම'
65} );
diff --git a/sources/plugins/link/lang/sk.js b/sources/plugins/link/lang/sk.js
new file mode 100644
index 00000000..107d5c0a
--- /dev/null
+++ b/sources/plugins/link/lang/sk.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'sk', {
6 acccessKey: 'Prístupový kľúč',
7 advanced: 'Rozšírené',
8 advisoryContentType: 'Pomocný typ obsahu',
9 advisoryTitle: 'Pomocný titulok',
10 anchor: {
11 toolbar: 'Kotva',
12 menu: 'Upraviť kotvu',
13 title: 'Vlastnosti kotvy',
14 name: 'Názov kotvy',
15 errorName: 'Zadajte prosím názov kotvy',
16 remove: 'Odstrániť kotvu'
17 },
18 anchorId: 'Podľa Id objektu',
19 anchorName: 'Podľa mena kotvy',
20 charset: 'Priradená znaková sada',
21 cssClasses: 'Triedy štýlu',
22 emailAddress: 'E-Mailová adresa',
23 emailBody: 'Telo správy',
24 emailSubject: 'Predmet správy',
25 id: 'Id',
26 info: 'Informácie o odkaze',
27 langCode: 'Orientácia jazyka',
28 langDir: 'Orientácia jazyka',
29 langDirLTR: 'Zľava doprava (LTR)',
30 langDirRTL: 'Sprava doľava (RTL)',
31 menu: 'Upraviť odkaz',
32 name: 'Názov',
33 noAnchors: '(V dokumente nie sú dostupné žiadne kotvy)',
34 noEmail: 'Zadajte prosím e-mailovú adresu',
35 noUrl: 'Zadajte prosím URL odkazu',
36 other: '<iný>',
37 popupDependent: 'Závislosť (Netscape)',
38 popupFeatures: 'Vlastnosti vyskakovacieho okna',
39 popupFullScreen: 'Celá obrazovka (IE)',
40 popupLeft: 'Ľavý okraj',
41 popupLocationBar: 'Panel umiestnenia (location bar)',
42 popupMenuBar: 'Panel ponuky (menu bar)',
43 popupResizable: 'Meniteľná veľkosť (resizable)',
44 popupScrollBars: 'Posuvníky (scroll bars)',
45 popupStatusBar: 'Stavový riadok (status bar)',
46 popupToolbar: 'Panel nástrojov (toolbar)',
47 popupTop: 'Horný okraj',
48 rel: 'Vzťah (rel)',
49 selectAnchor: 'Vybrať kotvu',
50 styles: 'Štýl',
51 tabIndex: 'Poradie prvku (tab index)',
52 target: 'Cieľ',
53 targetFrame: '<rámec>',
54 targetFrameName: 'Názov rámu cieľa',
55 targetPopup: '<vyskakovacie okno>',
56 targetPopupName: 'Názov vyskakovacieho okna',
57 title: 'Odkaz',
58 toAnchor: 'Odkaz na kotvu v texte',
59 toEmail: 'E-mail',
60 toUrl: 'URL',
61 toolbar: 'Odkaz',
62 type: 'Typ odkazu',
63 unlink: 'Odstrániť odkaz',
64 upload: 'Nahrať'
65} );
diff --git a/sources/plugins/link/lang/sl.js b/sources/plugins/link/lang/sl.js
new file mode 100644
index 00000000..bfd2be61
--- /dev/null
+++ b/sources/plugins/link/lang/sl.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'sl', {
6 acccessKey: 'Dostopno Geslo',
7 advanced: 'Napredno',
8 advisoryContentType: 'Predlagani tip vsebine (content-type)',
9 advisoryTitle: 'Predlagani naslov',
10 anchor: {
11 toolbar: 'Vstavi/uredi zaznamek',
12 menu: 'Lastnosti zaznamka',
13 title: 'Lastnosti zaznamka',
14 name: 'Ime zaznamka',
15 errorName: 'Prosim vnesite ime zaznamka',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Po ID-ju elementa',
19 anchorName: 'Po imenu zaznamka',
20 charset: 'Kodna tabela povezanega vira',
21 cssClasses: 'Razred stilne predloge',
22 emailAddress: 'Elektronski naslov',
23 emailBody: 'Vsebina sporočila',
24 emailSubject: 'Predmet sporočila',
25 id: 'Id',
26 info: 'Podatki o povezavi',
27 langCode: 'Smer jezika',
28 langDir: 'Smer jezika',
29 langDirLTR: 'Od leve proti desni (LTR)',
30 langDirRTL: 'Od desne proti levi (RTL)',
31 menu: 'Uredi povezavo',
32 name: 'Ime',
33 noAnchors: '(V tem dokumentu ni zaznamkov)',
34 noEmail: 'Vnesite elektronski naslov',
35 noUrl: 'Vnesite URL povezave',
36 other: '<drug>',
37 popupDependent: 'Podokno (Netscape)',
38 popupFeatures: 'Značilnosti pojavnega okna',
39 popupFullScreen: 'Celozaslonska slika (IE)',
40 popupLeft: 'Lega levo',
41 popupLocationBar: 'Naslovna vrstica',
42 popupMenuBar: 'Menijska vrstica',
43 popupResizable: 'Spremenljive velikosti',
44 popupScrollBars: 'Drsniki',
45 popupStatusBar: 'Vrstica stanja',
46 popupToolbar: 'Orodna vrstica',
47 popupTop: 'Lega na vrhu',
48 rel: 'Odnos',
49 selectAnchor: 'Izberi zaznamek',
50 styles: 'Slog',
51 tabIndex: 'Številka tabulatorja',
52 target: 'Cilj',
53 targetFrame: '<okvir>',
54 targetFrameName: 'Ime ciljnega okvirja',
55 targetPopup: '<pojavno okno>',
56 targetPopupName: 'Ime pojavnega okna',
57 title: 'Povezava',
58 toAnchor: 'Zaznamek na tej strani',
59 toEmail: 'Elektronski naslov',
60 toUrl: 'URL',
61 toolbar: 'Vstavi/uredi povezavo',
62 type: 'Vrsta povezave',
63 unlink: 'Odstrani povezavo',
64 upload: 'Prenesi'
65} );
diff --git a/sources/plugins/link/lang/sq.js b/sources/plugins/link/lang/sq.js
new file mode 100644
index 00000000..dfdff6aa
--- /dev/null
+++ b/sources/plugins/link/lang/sq.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'sq', {
6 acccessKey: 'Sipas ID-së së Elementit',
7 advanced: 'Të përparuara',
8 advisoryContentType: 'Lloji i Përmbajtjes Këshillimore',
9 advisoryTitle: 'Titull',
10 anchor: {
11 toolbar: 'Spirancë',
12 menu: 'Redakto Spirancën',
13 title: 'Anchor Properties', // MISSING
14 name: 'Emri i Spirancës',
15 errorName: 'Ju lutemi shkruani emrin e spirancës',
16 remove: 'Largo Spirancën'
17 },
18 anchorId: 'Sipas ID-së së Elementit',
19 anchorName: 'Sipas Emrit të Spirancës',
20 charset: 'Seti i Karaktereve të Burimeve të Nëdlidhura',
21 cssClasses: 'Klasa stili CSS',
22 emailAddress: 'Posta Elektronike',
23 emailBody: 'Trupi i Porosisë',
24 emailSubject: 'Titulli i Porosisë',
25 id: 'Id',
26 info: 'Informacione të Nyjes',
27 langCode: 'Kod gjuhe',
28 langDir: 'Drejtim teksti',
29 langDirLTR: 'Nga e majta në të djathë (LTR)',
30 langDirRTL: 'Nga e djathta në të majtë (RTL)',
31 menu: 'Redakto Nyjen',
32 name: 'Emër',
33 noAnchors: '(Nuk ka asnjë spirancë në dokument)',
34 noEmail: 'Ju lutemi shkruani postën elektronike',
35 noUrl: 'Ju lutemi shkruani URL-në e nyjes',
36 other: '<tjetër>',
37 popupDependent: 'E Varur (Netscape)',
38 popupFeatures: 'Karakteristikat e Dritares së Dialogut',
39 popupFullScreen: 'Ekran i Plotë (IE)',
40 popupLeft: 'Pozita Majtas',
41 popupLocationBar: 'Shiriti i Lokacionit',
42 popupMenuBar: 'Shiriti i Menysë',
43 popupResizable: 'I ndryshueshëm',
44 popupScrollBars: 'Shiritat zvarritës',
45 popupStatusBar: 'Shiriti i Statutit',
46 popupToolbar: 'Shiriti i Mejteve',
47 popupTop: 'Top Pozita',
48 rel: 'Marrëdhëniet',
49 selectAnchor: 'Përzgjidh një Spirancë',
50 styles: 'Stil',
51 tabIndex: 'Indeksi i fletave',
52 target: 'Objektivi',
53 targetFrame: '<frame>',
54 targetFrameName: 'Emri i Kornizës së Synuar',
55 targetPopup: '<popup window>',
56 targetPopupName: 'Emri i Dritares së Dialogut',
57 title: 'Nyja',
58 toAnchor: 'Lidhu me spirancën në tekst',
59 toEmail: 'Posta Elektronike',
60 toUrl: 'URL',
61 toolbar: 'Nyja',
62 type: 'Lloji i Nyjes',
63 unlink: 'Largo Nyjen',
64 upload: 'Ngarko'
65} );
diff --git a/sources/plugins/link/lang/sr-latn.js b/sources/plugins/link/lang/sr-latn.js
new file mode 100644
index 00000000..6a2a076a
--- /dev/null
+++ b/sources/plugins/link/lang/sr-latn.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'sr-latn', {
6 acccessKey: 'Pristupni taster',
7 advanced: 'Napredni tagovi',
8 advisoryContentType: 'Advisory vrsta sadržaja',
9 advisoryTitle: 'Advisory naslov',
10 anchor: {
11 toolbar: 'Unesi/izmeni sidro',
12 menu: 'Osobine sidra',
13 title: 'Osobine sidra',
14 name: 'Naziv sidra',
15 errorName: 'Unesite naziv sidra',
16 remove: 'Ukloni sidro'
17 },
18 anchorId: 'Po Id-u elementa',
19 anchorName: 'Po nazivu sidra',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Stylesheet klase',
22 emailAddress: 'E-Mail adresa',
23 emailBody: 'Sadržaj poruke',
24 emailSubject: 'Naslov',
25 id: 'Id',
26 info: 'Link Info',
27 langCode: 'Smer jezika',
28 langDir: 'Smer jezika',
29 langDirLTR: 'S leva na desno (LTR)',
30 langDirRTL: 'S desna na levo (RTL)',
31 menu: 'Izmeni link',
32 name: 'Naziv',
33 noAnchors: '(Nema dostupnih sidra)',
34 noEmail: 'Otkucajte adresu elektronske pote',
35 noUrl: 'Unesite URL linka',
36 other: '<остало>',
37 popupDependent: 'Zavisno (Netscape)',
38 popupFeatures: 'Mogućnosti popup prozora',
39 popupFullScreen: 'Prikaz preko celog ekrana (IE)',
40 popupLeft: 'Od leve ivice ekrana (px)',
41 popupLocationBar: 'Lokacija',
42 popupMenuBar: 'Kontekstni meni',
43 popupResizable: 'Promenljive veličine',
44 popupScrollBars: 'Scroll bar',
45 popupStatusBar: 'Statusna linija',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Od vrha ekrana (px)',
48 rel: 'Odnos',
49 selectAnchor: 'Odaberi sidro',
50 styles: 'Stil',
51 tabIndex: 'Tab indeks',
52 target: 'Meta',
53 targetFrame: '<okvir>',
54 targetFrameName: 'Naziv odredišnog frejma',
55 targetPopup: '<popup prozor>',
56 targetPopupName: 'Naziv popup prozora',
57 title: 'Link',
58 toAnchor: 'Sidro na ovoj stranici',
59 toEmail: 'E-Mail',
60 toUrl: 'URL',
61 toolbar: 'Unesi/izmeni link',
62 type: 'Vrsta linka',
63 unlink: 'Ukloni link',
64 upload: 'Pošalji'
65} );
diff --git a/sources/plugins/link/lang/sr.js b/sources/plugins/link/lang/sr.js
new file mode 100644
index 00000000..86f5ce3c
--- /dev/null
+++ b/sources/plugins/link/lang/sr.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'sr', {
6 acccessKey: 'Приступни тастер',
7 advanced: 'Напредни тагови',
8 advisoryContentType: 'Advisory врста садржаја',
9 advisoryTitle: 'Advisory наслов',
10 anchor: {
11 toolbar: 'Унеси/измени сидро',
12 menu: 'Особине сидра',
13 title: 'Особине сидра',
14 name: 'Име сидра',
15 errorName: 'Молимо Вас да унесете име сидра',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'Пo Ид-jу елемента',
19 anchorName: 'По називу сидра',
20 charset: 'Linked Resource Charset',
21 cssClasses: 'Stylesheet класе',
22 emailAddress: 'Адреса електронске поште',
23 emailBody: 'Садржај поруке',
24 emailSubject: 'Наслов',
25 id: 'Ид',
26 info: 'Линк инфо',
27 langCode: 'Смер језика',
28 langDir: 'Смер језика',
29 langDirLTR: 'С лева на десно (LTR)',
30 langDirRTL: 'С десна на лево (RTL)',
31 menu: 'Промени линк',
32 name: 'Назив',
33 noAnchors: '(Нема доступних сидра)',
34 noEmail: 'Откуцајте адресу електронске поште',
35 noUrl: 'Унесите УРЛ линка',
36 other: '<друго>',
37 popupDependent: 'Зависно (Netscape)',
38 popupFeatures: 'Могућности искачућег прозора',
39 popupFullScreen: 'Приказ преко целог екрана (ИE)',
40 popupLeft: 'Од леве ивице екрана (пиксела)',
41 popupLocationBar: 'Локација',
42 popupMenuBar: 'Контекстни мени',
43 popupResizable: 'Величина се мења',
44 popupScrollBars: 'Скрол бар',
45 popupStatusBar: 'Статусна линија',
46 popupToolbar: 'Toolbar',
47 popupTop: 'Од врха екрана (пиксела)',
48 rel: 'Однос',
49 selectAnchor: 'Одабери сидро',
50 styles: 'Стил',
51 tabIndex: 'Таб индекс',
52 target: 'Meтa',
53 targetFrame: '<оквир>',
54 targetFrameName: 'Назив одредишног фрејма',
55 targetPopup: '<искачући прозор>',
56 targetPopupName: 'Назив искачућег прозора',
57 title: 'Линк',
58 toAnchor: 'Сидро на овој страници',
59 toEmail: 'Eлектронска пошта',
60 toUrl: 'УРЛ',
61 toolbar: 'Унеси/измени линк',
62 type: 'Врста линка',
63 unlink: 'Уклони линк',
64 upload: 'Пошаљи'
65} );
diff --git a/sources/plugins/link/lang/sv.js b/sources/plugins/link/lang/sv.js
new file mode 100644
index 00000000..52e3ec39
--- /dev/null
+++ b/sources/plugins/link/lang/sv.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'sv', {
6 acccessKey: 'Behörighetsnyckel',
7 advanced: 'Avancerad',
8 advisoryContentType: 'Innehållstyp',
9 advisoryTitle: 'Titel',
10 anchor: {
11 toolbar: 'Infoga/Redigera ankarlänk',
12 menu: 'Egenskaper för ankarlänk',
13 title: 'Egenskaper för ankarlänk',
14 name: 'Ankarnamn',
15 errorName: 'Var god ange ett ankarnamn',
16 remove: 'Radera ankare'
17 },
18 anchorId: 'Efter element-id',
19 anchorName: 'Efter ankarnamn',
20 charset: 'Teckenuppställning',
21 cssClasses: 'Stilmall',
22 emailAddress: 'E-postadress',
23 emailBody: 'Innehåll',
24 emailSubject: 'Ämne',
25 id: 'Id',
26 info: 'Länkinformation',
27 langCode: 'Språkkod',
28 langDir: 'Språkriktning',
29 langDirLTR: 'Vänster till höger (VTH)',
30 langDirRTL: 'Höger till vänster (HTV)',
31 menu: 'Redigera länk',
32 name: 'Namn',
33 noAnchors: '(Inga ankare kunde hittas)',
34 noEmail: 'Var god ange e-postadress',
35 noUrl: 'Var god ange länkens URL',
36 other: '<annan>',
37 popupDependent: 'Beroende (endast Netscape)',
38 popupFeatures: 'Popup-fönstrets egenskaper',
39 popupFullScreen: 'Helskärm (endast IE)',
40 popupLeft: 'Position från vänster',
41 popupLocationBar: 'Adressfält',
42 popupMenuBar: 'Menyfält',
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Scrolllista',
45 popupStatusBar: 'Statusfält',
46 popupToolbar: 'Verktygsfält',
47 popupTop: 'Position från sidans topp',
48 rel: 'Förhållande',
49 selectAnchor: 'Välj ett ankare',
50 styles: 'Stilmall',
51 tabIndex: 'Tabindex',
52 target: 'Mål',
53 targetFrame: '<ram>',
54 targetFrameName: 'Målets ramnamn',
55 targetPopup: '<popup-fönster>',
56 targetPopupName: 'Popup-fönstrets namn',
57 title: 'Länk',
58 toAnchor: 'Länk till ankare i texten',
59 toEmail: 'E-post',
60 toUrl: 'URL',
61 toolbar: 'Infoga/Redigera länk',
62 type: 'Länktyp',
63 unlink: 'Radera länk',
64 upload: 'Ladda upp'
65} );
diff --git a/sources/plugins/link/lang/th.js b/sources/plugins/link/lang/th.js
new file mode 100644
index 00000000..a6809c82
--- /dev/null
+++ b/sources/plugins/link/lang/th.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'th', {
6 acccessKey: 'แอคเซส คีย์',
7 advanced: 'ขั้นสูง',
8 advisoryContentType: 'ชนิดของคำเกริ่นนำ',
9 advisoryTitle: 'คำเกริ่นนำ',
10 anchor: {
11 toolbar: 'แทรก/แก้ไข Anchor',
12 menu: 'รายละเอียด Anchor',
13 title: 'รายละเอียด Anchor',
14 name: 'ชื่อ Anchor',
15 errorName: 'กรุณาระบุชื่อของ Anchor',
16 remove: 'Remove Anchor'
17 },
18 anchorId: 'ไอดี',
19 anchorName: 'ชื่อ',
20 charset: 'ลิงค์เชื่อมโยงไปยังชุดตัวอักษร',
21 cssClasses: 'คลาสของไฟล์กำหนดลักษณะการแสดงผล',
22 emailAddress: 'อีเมล์ (E-Mail)',
23 emailBody: 'ข้อความ',
24 emailSubject: 'หัวเรื่อง',
25 id: 'ไอดี',
26 info: 'รายละเอียด',
27 langCode: 'การเขียน-อ่านภาษา',
28 langDir: 'การเขียน-อ่านภาษา',
29 langDirLTR: 'จากซ้ายไปขวา (LTR)',
30 langDirRTL: 'จากขวามาซ้าย (RTL)',
31 menu: 'แก้ไข ลิงค์',
32 name: 'ชื่อ',
33 noAnchors: '(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอกสารนี้)',
34 noEmail: 'กรุณาระบุอีเมล์ (E-mail)',
35 noUrl: 'กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)',
36 other: '<อื่น ๆ>',
37 popupDependent: 'แสดงเต็มหน้าจอ (Netscape)',
38 popupFeatures: 'คุณสมบัติของหน้าจอเล็ก (Pop-up)',
39 popupFullScreen: 'แสดงเต็มหน้าจอ (IE5.5++ เท่านั้น)',
40 popupLeft: 'พิกัดซ้าย (Left Position)',
41 popupLocationBar: 'แสดงที่อยู่ของไฟล์',
42 popupMenuBar: 'แสดงแถบเมนู',
43 popupResizable: 'สามารถปรับขนาดได้',
44 popupScrollBars: 'แสดงแถบเลื่อน',
45 popupStatusBar: 'แสดงแถบสถานะ',
46 popupToolbar: 'แสดงแถบเครื่องมือ',
47 popupTop: 'พิกัดบน (Top Position)',
48 rel: 'ความสัมพันธ์',
49 selectAnchor: 'ระบุข้อมูลของจุดเชื่อมโยง (Anchor)',
50 styles: 'ลักษณะการแสดงผล',
51 tabIndex: 'ลำดับของ แท็บ',
52 target: 'การเปิดหน้าลิงค์',
53 targetFrame: '<เปิดในเฟรม>',
54 targetFrameName: 'ชื่อทาร์เก็ตเฟรม',
55 targetPopup: '<เปิดหน้าจอเล็ก (Pop-up)>',
56 targetPopupName: 'ระบุชื่อหน้าจอเล็ก (Pop-up)',
57 title: 'ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ',
58 toAnchor: 'จุดเชื่อมโยง (Anchor)',
59 toEmail: 'ส่งอีเมล์ (E-Mail)',
60 toUrl: 'ที่อยู่อ้างอิง URL',
61 toolbar: 'แทรก/แก้ไข ลิงค์',
62 type: 'ประเภทของลิงค์',
63 unlink: 'ลบ ลิงค์',
64 upload: 'อัพโหลดไฟล์'
65} );
diff --git a/sources/plugins/link/lang/tr.js b/sources/plugins/link/lang/tr.js
new file mode 100644
index 00000000..2f763441
--- /dev/null
+++ b/sources/plugins/link/lang/tr.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'tr', {
6 acccessKey: 'Erişim Tuşu',
7 advanced: 'Gelişmiş',
8 advisoryContentType: 'Danışma İçerik Türü',
9 advisoryTitle: 'Danışma Başlığı',
10 anchor: {
11 toolbar: 'Bağlantı Ekle/Düzenle',
12 menu: 'Bağlantı Özellikleri',
13 title: 'Bağlantı Özellikleri',
14 name: 'Bağlantı Adı',
15 errorName: 'Lütfen bağlantı için ad giriniz',
16 remove: 'Bağlantıyı Kaldır'
17 },
18 anchorId: 'Eleman Kimlik Numarası ile',
19 anchorName: 'Bağlantı Adı ile',
20 charset: 'Bağlı Kaynak Karakter Gurubu',
21 cssClasses: 'Biçem Sayfası Sınıfları',
22 emailAddress: 'E-Posta Adresi',
23 emailBody: 'İleti Gövdesi',
24 emailSubject: 'İleti Konusu',
25 id: 'Id',
26 info: 'Link Bilgisi',
27 langCode: 'Dil Yönü',
28 langDir: 'Dil Yönü',
29 langDirLTR: 'Soldan Sağa (LTR)',
30 langDirRTL: 'Sağdan Sola (RTL)',
31 menu: 'Link Düzenle',
32 name: 'Ad',
33 noAnchors: '(Bu belgede hiç çapa yok)',
34 noEmail: 'Lütfen E-posta adresini yazın',
35 noUrl: 'Lütfen Link URL\'sini yazın',
36 other: '<diğer>',
37 popupDependent: 'Bağımlı (Netscape)',
38 popupFeatures: 'Yeni Açılan Pencere Özellikleri',
39 popupFullScreen: 'Tam Ekran (IE)',
40 popupLeft: 'Sola Göre Konum',
41 popupLocationBar: 'Yer Çubuğu',
42 popupMenuBar: 'Menü Çubuğu',
43 popupResizable: 'Resizable',
44 popupScrollBars: 'Kaydırma Çubukları',
45 popupStatusBar: 'Durum Çubuğu',
46 popupToolbar: 'Araç Çubuğu',
47 popupTop: 'Yukarıya Göre Konum',
48 rel: 'İlişki',
49 selectAnchor: 'Bağlantı Seç',
50 styles: 'Biçem',
51 tabIndex: 'Sekme İndeksi',
52 target: 'Hedef',
53 targetFrame: '<çerçeve>',
54 targetFrameName: 'Hedef Çerçeve Adı',
55 targetPopup: '<yeni açılan pencere>',
56 targetPopupName: 'Yeni Açılan Pencere Adı',
57 title: 'Link',
58 toAnchor: 'Bu sayfada çapa',
59 toEmail: 'E-Posta',
60 toUrl: 'URL',
61 toolbar: 'Link Ekle/Düzenle',
62 type: 'Link Türü',
63 unlink: 'Köprü Kaldır',
64 upload: 'Karşıya Yükle'
65} );
diff --git a/sources/plugins/link/lang/tt.js b/sources/plugins/link/lang/tt.js
new file mode 100644
index 00000000..f08d8750
--- /dev/null
+++ b/sources/plugins/link/lang/tt.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'tt', {
6 acccessKey: 'Access Key', // MISSING
7 advanced: 'Киңәйтелгән көйләүләр',
8 advisoryContentType: 'Advisory Content Type', // MISSING
9 advisoryTitle: 'Киңәш исем',
10 anchor: {
11 toolbar: 'Якорь',
12 menu: 'Якорьне үзгәртү',
13 title: 'Якорь үзлекләре',
14 name: 'Якорь исеме',
15 errorName: 'Якорьнең исемен языгыз',
16 remove: 'Якорьне бетерү'
17 },
18 anchorId: 'Элемент идентификаторы буенча',
19 anchorName: 'Якорь исеме буенча',
20 charset: 'Linked Resource Charset', // MISSING
21 cssClasses: 'Стильләр класслары',
22 emailAddress: 'Электрон почта адресы',
23 emailBody: 'Хат эчтәлеге',
24 emailSubject: 'Хат темасы',
25 id: 'Идентификатор',
26 info: 'Сылталама тасвирламасы',
27 langCode: 'Тел коды',
28 langDir: 'Язылыш юнəлеше',
29 langDirLTR: 'Сулдан уңга язылыш (LTR)',
30 langDirRTL: 'Уңнан сулга язылыш (RTL)',
31 menu: 'Сылталамаyны үзгәртү',
32 name: 'Исем',
33 noAnchors: '(Әлеге документта якорьләр табылмады)',
34 noEmail: 'Электрон почта адресын языгыз',
35 noUrl: 'Сылталаманы языгыз',
36 other: '<бүтән>',
37 popupDependent: 'Бәйле (Netscape)',
38 popupFeatures: 'Popup Window Features', // MISSING
39 popupFullScreen: 'Тулы экран (IE)',
40 popupLeft: 'Left Position', // MISSING
41 popupLocationBar: 'Location Bar', // MISSING
42 popupMenuBar: 'Menu Bar', // MISSING
43 popupResizable: 'Resizable', // MISSING
44 popupScrollBars: 'Scroll Bars', // MISSING
45 popupStatusBar: 'Status Bar', // MISSING
46 popupToolbar: 'Toolbar', // MISSING
47 popupTop: 'Top Position', // MISSING
48 rel: 'Бәйләнеш',
49 selectAnchor: 'Якорьне сайлау',
50 styles: 'Стиль',
51 tabIndex: 'Tab Index', // MISSING
52 target: 'Максат',
53 targetFrame: '<frame>',
54 targetFrameName: 'Target Frame Name', // MISSING
55 targetPopup: '<popup window>',
56 targetPopupName: 'Попап тәрәзәсе исеме',
57 title: 'Сылталама',
58 toAnchor: 'Якорьне текст белән бәйләү',
59 toEmail: 'Электрон почта',
60 toUrl: 'Сылталама',
61 toolbar: 'Сылталама',
62 type: 'Сылталама төре',
63 unlink: 'Сылталаманы бетерү',
64 upload: 'Йөкләү'
65} );
diff --git a/sources/plugins/link/lang/ug.js b/sources/plugins/link/lang/ug.js
new file mode 100644
index 00000000..7229a2fa
--- /dev/null
+++ b/sources/plugins/link/lang/ug.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'ug', {
6 acccessKey: 'زىيارەت كۇنۇپكا',
7 advanced: 'ئالىي',
8 advisoryContentType: 'مەزمۇن تىپى',
9 advisoryTitle: 'ماۋزۇ',
10 anchor: {
11 toolbar: 'لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە',
12 menu: 'لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى',
13 title: 'لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى',
14 name: 'لەڭگەرلىك نۇقتا ئاتى',
15 errorName: 'لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ',
16 remove: 'لەڭگەرلىك نۇقتا ئۆچۈر'
17 },
18 anchorId: 'لەڭگەرلىك نۇقتا ID سى بويىچە',
19 anchorName: 'لەڭگەرلىك نۇقتا ئاتى بويىچە',
20 charset: 'ھەرپ كودلىنىشى',
21 cssClasses: 'ئۇسلۇب خىلى ئاتى',
22 emailAddress: 'ئادرېس',
23 emailBody: 'مەزمۇن',
24 emailSubject: 'ماۋزۇ',
25 id: 'ID',
26 info: 'ئۇلانما ئۇچۇرى',
27 langCode: 'تىل كودى',
28 langDir: 'تىل يۆنىلىشى',
29 langDirLTR: 'سولدىن ئوڭغا (LTR)',
30 langDirRTL: 'ئوڭدىن سولغا (RTL)',
31 menu: 'ئۇلانما تەھرىر',
32 name: 'ئات',
33 noAnchors: '(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)',
34 noEmail: 'ئېلخەت ئادرېسىنى كىرگۈزۈڭ',
35 noUrl: 'ئۇلانما ئادرېسىنى كىرگۈزۈڭ',
36 other: '‹باشقا›',
37 popupDependent: 'تەۋە (NS)',
38 popupFeatures: 'قاڭقىش كۆزنەك خاسلىقى',
39 popupFullScreen: 'پۈتۈن ئېكران (IE)',
40 popupLeft: 'سول',
41 popupLocationBar: 'ئادرېس بالداق',
42 popupMenuBar: 'تىزىملىك بالداق',
43 popupResizable: 'چوڭلۇقى ئۆزگەرتىشچان',
44 popupScrollBars: 'دومىلىما سۈرگۈچ',
45 popupStatusBar: 'ھالەت بالداق',
46 popupToolbar: 'قورال بالداق',
47 popupTop: 'ئوڭ',
48 rel: 'باغلىنىش',
49 selectAnchor: 'بىر لەڭگەرلىك نۇقتا تاللاڭ',
50 styles: 'قۇر ئىچىدىكى ئۇسلۇبى',
51 tabIndex: 'Tab تەرتىپى',
52 target: 'نىشان',
53 targetFrame: '‹كاندۇك›',
54 targetFrameName: 'نىشان كاندۇك ئاتى',
55 targetPopup: '‹قاڭقىش كۆزنەك›',
56 targetPopupName: 'قاڭقىش كۆزنەك ئاتى',
57 title: 'ئۇلانما',
58 toAnchor: 'بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى',
59 toEmail: 'ئېلخەت',
60 toUrl: 'ئادرېس',
61 toolbar: 'ئۇلانما قىستۇر/تەھرىرلە',
62 type: 'ئۇلانما تىپى',
63 unlink: 'ئۇلانما بىكار قىل',
64 upload: 'يۈكلە'
65} );
diff --git a/sources/plugins/link/lang/uk.js b/sources/plugins/link/lang/uk.js
new file mode 100644
index 00000000..05d913d5
--- /dev/null
+++ b/sources/plugins/link/lang/uk.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'uk', {
6 acccessKey: 'Гаряча клавіша',
7 advanced: 'Додаткове',
8 advisoryContentType: 'Тип вмісту',
9 advisoryTitle: 'Заголовок',
10 anchor: {
11 toolbar: 'Вставити/Редагувати якір',
12 menu: 'Властивості якоря',
13 title: 'Властивості якоря',
14 name: 'Ім\'я якоря',
15 errorName: 'Будь ласка, вкажіть ім\'я якоря',
16 remove: 'Прибрати якір'
17 },
18 anchorId: 'За ідентифікатором елементу',
19 anchorName: 'За ім\'ям елементу',
20 charset: 'Кодування',
21 cssClasses: 'Клас CSS',
22 emailAddress: 'Адреса ел. пошти',
23 emailBody: 'Тіло повідомлення',
24 emailSubject: 'Тема листа',
25 id: 'Ідентифікатор',
26 info: 'Інформація посилання',
27 langCode: 'Код мови',
28 langDir: 'Напрямок мови',
29 langDirLTR: 'Зліва направо (LTR)',
30 langDirRTL: 'Справа наліво (RTL)',
31 menu: 'Вставити посилання',
32 name: 'Ім\'я',
33 noAnchors: '(В цьому документі немає якорів)',
34 noEmail: 'Будь ласка, вкажіть адрес ел. пошти',
35 noUrl: 'Будь ласка, вкажіть URL посилання',
36 other: '<інший>',
37 popupDependent: 'Залежний (Netscape)',
38 popupFeatures: 'Властивості випливаючого вікна',
39 popupFullScreen: 'Повний екран (IE)',
40 popupLeft: 'Позиція зліва',
41 popupLocationBar: 'Панель локації',
42 popupMenuBar: 'Панель меню',
43 popupResizable: 'Масштабоване',
44 popupScrollBars: 'Стрічки прокрутки',
45 popupStatusBar: 'Рядок статусу',
46 popupToolbar: 'Панель інструментів',
47 popupTop: 'Позиція зверху',
48 rel: 'Зв\'язок',
49 selectAnchor: 'Оберіть якір',
50 styles: 'Стиль CSS',
51 tabIndex: 'Послідовність переходу',
52 target: 'Ціль',
53 targetFrame: '<фрейм>',
54 targetFrameName: 'Ім\'я цільового фрейму',
55 targetPopup: '<випливаюче вікно>',
56 targetPopupName: 'Ім\'я випливаючого вікна',
57 title: 'Посилання',
58 toAnchor: 'Якір на цю сторінку',
59 toEmail: 'Ел. пошта',
60 toUrl: 'URL',
61 toolbar: 'Вставити/Редагувати посилання',
62 type: 'Тип посилання',
63 unlink: 'Видалити посилання',
64 upload: 'Надіслати'
65} );
diff --git a/sources/plugins/link/lang/vi.js b/sources/plugins/link/lang/vi.js
new file mode 100644
index 00000000..b7dc1941
--- /dev/null
+++ b/sources/plugins/link/lang/vi.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'vi', {
6 acccessKey: 'Phím hỗ trợ truy cập',
7 advanced: 'Mở rộng',
8 advisoryContentType: 'Nội dung hướng dẫn',
9 advisoryTitle: 'Nhan đề hướng dẫn',
10 anchor: {
11 toolbar: 'Chèn/Sửa điểm neo',
12 menu: 'Thuộc tính điểm neo',
13 title: 'Thuộc tính điểm neo',
14 name: 'Tên của điểm neo',
15 errorName: 'Hãy nhập vào tên của điểm neo',
16 remove: 'Xóa neo'
17 },
18 anchorId: 'Theo định danh thành phần',
19 anchorName: 'Theo tên điểm neo',
20 charset: 'Bảng mã của tài nguyên được liên kết đến',
21 cssClasses: 'Lớp Stylesheet',
22 emailAddress: 'Thư điện tử',
23 emailBody: 'Nội dung thông điệp',
24 emailSubject: 'Tiêu đề thông điệp',
25 id: 'Định danh',
26 info: 'Thông tin liên kết',
27 langCode: 'Mã ngôn ngữ',
28 langDir: 'Hướng ngôn ngữ',
29 langDirLTR: 'Trái sang phải (LTR)',
30 langDirRTL: 'Phải sang trái (RTL)',
31 menu: 'Sửa liên kết',
32 name: 'Tên',
33 noAnchors: '(Không có điểm neo nào trong tài liệu)',
34 noEmail: 'Hãy đưa vào địa chỉ thư điện tử',
35 noUrl: 'Hãy đưa vào đường dẫn liên kết (URL)',
36 other: '<khác>',
37 popupDependent: 'Phụ thuộc (Netscape)',
38 popupFeatures: 'Đặc điểm của cửa sổ Popup',
39 popupFullScreen: 'Toàn màn hình (IE)',
40 popupLeft: 'Vị trí bên trái',
41 popupLocationBar: 'Thanh vị trí',
42 popupMenuBar: 'Thanh Menu',
43 popupResizable: 'Có thể thay đổi kích cỡ',
44 popupScrollBars: 'Thanh cuộn',
45 popupStatusBar: 'Thanh trạng thái',
46 popupToolbar: 'Thanh công cụ',
47 popupTop: 'Vị trí phía trên',
48 rel: 'Quan hệ',
49 selectAnchor: 'Chọn một điểm neo',
50 styles: 'Kiểu (style)',
51 tabIndex: 'Chỉ số của Tab',
52 target: 'Đích',
53 targetFrame: '<khung>',
54 targetFrameName: 'Tên khung đích',
55 targetPopup: '<cửa sổ popup>',
56 targetPopupName: 'Tên cửa sổ Popup',
57 title: 'Liên kết',
58 toAnchor: 'Neo trong trang này',
59 toEmail: 'Thư điện tử',
60 toUrl: 'URL',
61 toolbar: 'Chèn/Sửa liên kết',
62 type: 'Kiểu liên kết',
63 unlink: 'Xoá liên kết',
64 upload: 'Tải lên'
65} );
diff --git a/sources/plugins/link/lang/zh-cn.js b/sources/plugins/link/lang/zh-cn.js
new file mode 100644
index 00000000..0d859306
--- /dev/null
+++ b/sources/plugins/link/lang/zh-cn.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'zh-cn', {
6 acccessKey: '访问键',
7 advanced: '高级',
8 advisoryContentType: '内容类型',
9 advisoryTitle: '标题',
10 anchor: {
11 toolbar: '插入/编辑锚点链接',
12 menu: '锚点链接属性',
13 title: '锚点链接属性',
14 name: '锚点名称',
15 errorName: '请输入锚点名称',
16 remove: '删除锚点'
17 },
18 anchorId: '按锚点 ID',
19 anchorName: '按锚点名称',
20 charset: '字符编码',
21 cssClasses: '样式类名称',
22 emailAddress: '地址',
23 emailBody: '内容',
24 emailSubject: '主题',
25 id: 'ID',
26 info: '超链接信息',
27 langCode: '语言代码',
28 langDir: '语言方向',
29 langDirLTR: '从左到右 (LTR)',
30 langDirRTL: '从右到左 (RTL)',
31 menu: '编辑超链接',
32 name: '名称',
33 noAnchors: '(此文档没有可用的锚点)',
34 noEmail: '请输入电子邮件地址',
35 noUrl: '请输入超链接地址',
36 other: '<其他>',
37 popupDependent: '依附 (NS)',
38 popupFeatures: '弹出窗口属性',
39 popupFullScreen: '全屏 (IE)',
40 popupLeft: '左',
41 popupLocationBar: '地址栏',
42 popupMenuBar: '菜单栏',
43 popupResizable: '可缩放',
44 popupScrollBars: '滚动条',
45 popupStatusBar: '状态栏',
46 popupToolbar: '工具栏',
47 popupTop: '右',
48 rel: '关联',
49 selectAnchor: '选择一个锚点',
50 styles: '行内样式',
51 tabIndex: 'Tab 键次序',
52 target: '目标',
53 targetFrame: '<框架>',
54 targetFrameName: '目标框架名称',
55 targetPopup: '<弹出窗口>',
56 targetPopupName: '弹出窗口名称',
57 title: '超链接',
58 toAnchor: '页内锚点链接',
59 toEmail: '电子邮件',
60 toUrl: '地址',
61 toolbar: '插入/编辑超链接',
62 type: '超链接类型',
63 unlink: '取消超链接',
64 upload: '上传'
65} );
diff --git a/sources/plugins/link/lang/zh.js b/sources/plugins/link/lang/zh.js
new file mode 100644
index 00000000..6d97a534
--- /dev/null
+++ b/sources/plugins/link/lang/zh.js
@@ -0,0 +1,65 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'link', 'zh', {
6 acccessKey: '便捷鍵',
7 advanced: '進階',
8 advisoryContentType: '建議內容類型',
9 advisoryTitle: '標題',
10 anchor: {
11 toolbar: '錨點',
12 menu: '編輯錨點',
13 title: '錨點內容',
14 name: '錨點名稱',
15 errorName: '請輸入錨點名稱',
16 remove: '移除錨點'
17 },
18 anchorId: '依元件編號',
19 anchorName: '依錨點名稱',
20 charset: '連結資源的字元集',
21 cssClasses: '樣式表類別',
22 emailAddress: '電子郵件地址',
23 emailBody: '郵件本文',
24 emailSubject: '郵件主旨',
25 id: 'ID',
26 info: '連結資訊',
27 langCode: '語言碼',
28 langDir: '語言方向',
29 langDirLTR: '由左至右 (LTR)',
30 langDirRTL: '由右至左 (RTL)',
31 menu: '編輯連結',
32 name: '名稱',
33 noAnchors: '(本文件中無可用之錨點)',
34 noEmail: '請輸入電子郵件',
35 noUrl: '請輸入連結 URL',
36 other: '<其他>',
37 popupDependent: '獨立 (Netscape)',
38 popupFeatures: '快顯視窗功能',
39 popupFullScreen: '全螢幕 (IE)',
40 popupLeft: '左側位置',
41 popupLocationBar: '位置列',
42 popupMenuBar: '功能表列',
43 popupResizable: '可調大小',
44 popupScrollBars: '捲軸',
45 popupStatusBar: '狀態列',
46 popupToolbar: '工具列',
47 popupTop: '頂端位置',
48 rel: '關係',
49 selectAnchor: '選取一個錨點',
50 styles: '樣式',
51 tabIndex: '定位順序',
52 target: '目標',
53 targetFrame: '<框架>',
54 targetFrameName: '目標框架名稱',
55 targetPopup: '<快顯視窗>',
56 targetPopupName: '快顯視窗名稱',
57 title: '連結',
58 toAnchor: '文字中的錨點連結',
59 toEmail: '電子郵件',
60 toUrl: '網址',
61 toolbar: '連結',
62 type: '連結類型',
63 unlink: '取消連結',
64 upload: '上傳'
65} );
diff --git a/sources/plugins/link/plugin.js b/sources/plugins/link/plugin.js
new file mode 100644
index 00000000..bd5a6231
--- /dev/null
+++ b/sources/plugins/link/plugin.js
@@ -0,0 +1,787 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6'use strict';
7
8( function() {
9 CKEDITOR.plugins.add( 'link', {
10 requires: 'dialog,fakeobjects',
11 // jscs:disable maximumLineLength
12 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
13 // jscs:enable maximumLineLength
14 icons: 'anchor,anchor-rtl,link,unlink', // %REMOVE_LINE_CORE%
15 hidpi: true, // %REMOVE_LINE_CORE%
16 onLoad: function() {
17 // Add the CSS styles for anchor placeholders.
18 var iconPath = CKEDITOR.getUrl( this.path + 'images' + ( CKEDITOR.env.hidpi ? '/hidpi' : '' ) + '/anchor.png' ),
19 baseStyle = 'background:url(' + iconPath + ') no-repeat %1 center;border:1px dotted #00f;background-size:16px;';
20
21 var template = '.%2 a.cke_anchor,' +
22 '.%2 a.cke_anchor_empty' +
23 ',.cke_editable.%2 a[name]' +
24 ',.cke_editable.%2 a[data-cke-saved-name]' +
25 '{' +
26 baseStyle +
27 'padding-%1:18px;' +
28 // Show the arrow cursor for the anchor image (FF at least).
29 'cursor:auto;' +
30 '}' +
31 '.%2 img.cke_anchor' +
32 '{' +
33 baseStyle +
34 'width:16px;' +
35 'min-height:15px;' +
36 // The default line-height on IE.
37 'height:1.15em;' +
38 // Opera works better with "middle" (even if not perfect)
39 'vertical-align:text-bottom;' +
40 '}';
41
42 // Styles with contents direction awareness.
43 function cssWithDir( dir ) {
44 return template.replace( /%1/g, dir == 'rtl' ? 'right' : 'left' ).replace( /%2/g, 'cke_contents_' + dir );
45 }
46
47 CKEDITOR.addCss( cssWithDir( 'ltr' ) + cssWithDir( 'rtl' ) );
48 },
49
50 init: function( editor ) {
51 var allowed = 'a[!href]',
52 required = 'a[href]';
53
54 if ( CKEDITOR.dialog.isTabEnabled( editor, 'link', 'advanced' ) )
55 allowed = allowed.replace( ']', ',accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)' );
56 if ( CKEDITOR.dialog.isTabEnabled( editor, 'link', 'target' ) )
57 allowed = allowed.replace( ']', ',target,onclick]' );
58
59 // Add the link and unlink buttons.
60 editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link', {
61 allowedContent: allowed,
62 requiredContent: required
63 } ) );
64 editor.addCommand( 'anchor', new CKEDITOR.dialogCommand( 'anchor', {
65 allowedContent: 'a[!name,id]',
66 requiredContent: 'a[name]'
67 } ) );
68 editor.addCommand( 'unlink', new CKEDITOR.unlinkCommand() );
69 editor.addCommand( 'removeAnchor', new CKEDITOR.removeAnchorCommand() );
70
71 editor.setKeystroke( CKEDITOR.CTRL + 76 /*L*/, 'link' );
72
73 if ( editor.ui.addButton ) {
74 editor.ui.addButton( 'Link', {
75 label: editor.lang.link.toolbar,
76 command: 'link',
77 toolbar: 'links,10'
78 } );
79 editor.ui.addButton( 'Unlink', {
80 label: editor.lang.link.unlink,
81 command: 'unlink',
82 toolbar: 'links,20'
83 } );
84 editor.ui.addButton( 'Anchor', {
85 label: editor.lang.link.anchor.toolbar,
86 command: 'anchor',
87 toolbar: 'links,30'
88 } );
89 }
90
91 CKEDITOR.dialog.add( 'link', this.path + 'dialogs/link.js' );
92 CKEDITOR.dialog.add( 'anchor', this.path + 'dialogs/anchor.js' );
93
94 editor.on( 'doubleclick', function( evt ) {
95 var element = CKEDITOR.plugins.link.getSelectedLink( editor ) || evt.data.element;
96
97 if ( !element.isReadOnly() ) {
98 if ( element.is( 'a' ) ) {
99 evt.data.dialog = ( element.getAttribute( 'name' ) && ( !element.getAttribute( 'href' ) || !element.getChildCount() ) ) ? 'anchor' : 'link';
100
101 // Pass the link to be selected along with event data.
102 evt.data.link = element;
103 } else if ( CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, element ) ) {
104 evt.data.dialog = 'anchor';
105 }
106 }
107 }, null, null, 0 );
108
109 // If event was cancelled, link passed in event data will not be selected.
110 editor.on( 'doubleclick', function( evt ) {
111 // Make sure both links and anchors are selected (#11822).
112 if ( evt.data.dialog in { link: 1, anchor: 1 } && evt.data.link )
113 editor.getSelection().selectElement( evt.data.link );
114 }, null, null, 20 );
115
116 // If the "menu" plugin is loaded, register the menu items.
117 if ( editor.addMenuItems ) {
118 editor.addMenuItems( {
119 anchor: {
120 label: editor.lang.link.anchor.menu,
121 command: 'anchor',
122 group: 'anchor',
123 order: 1
124 },
125
126 removeAnchor: {
127 label: editor.lang.link.anchor.remove,
128 command: 'removeAnchor',
129 group: 'anchor',
130 order: 5
131 },
132
133 link: {
134 label: editor.lang.link.menu,
135 command: 'link',
136 group: 'link',
137 order: 1
138 },
139
140 unlink: {
141 label: editor.lang.link.unlink,
142 command: 'unlink',
143 group: 'link',
144 order: 5
145 }
146 } );
147 }
148
149 // If the "contextmenu" plugin is loaded, register the listeners.
150 if ( editor.contextMenu ) {
151 editor.contextMenu.addListener( function( element ) {
152 if ( !element || element.isReadOnly() )
153 return null;
154
155 var anchor = CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, element );
156
157 if ( !anchor && !( anchor = CKEDITOR.plugins.link.getSelectedLink( editor ) ) )
158 return null;
159
160 var menu = {};
161
162 if ( anchor.getAttribute( 'href' ) && anchor.getChildCount() )
163 menu = { link: CKEDITOR.TRISTATE_OFF, unlink: CKEDITOR.TRISTATE_OFF };
164
165 if ( anchor && anchor.hasAttribute( 'name' ) )
166 menu.anchor = menu.removeAnchor = CKEDITOR.TRISTATE_OFF;
167
168 return menu;
169 } );
170 }
171
172 this.compiledProtectionFunction = getCompiledProtectionFunction( editor );
173 },
174
175 afterInit: function( editor ) {
176 // Empty anchors upcasting to fake objects.
177 editor.dataProcessor.dataFilter.addRules( {
178 elements: {
179 a: function( element ) {
180 if ( !element.attributes.name )
181 return null;
182
183 if ( !element.children.length )
184 return editor.createFakeParserElement( element, 'cke_anchor', 'anchor' );
185
186 return null;
187 }
188 }
189 } );
190
191 var pathFilters = editor._.elementsPath && editor._.elementsPath.filters;
192 if ( pathFilters ) {
193 pathFilters.push( function( element, name ) {
194 if ( name == 'a' ) {
195 if ( CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, element ) || ( element.getAttribute( 'name' ) && ( !element.getAttribute( 'href' ) || !element.getChildCount() ) ) )
196 return 'anchor';
197 }
198 } );
199 }
200 }
201 } );
202
203 // Loads the parameters in a selected link to the link dialog fields.
204 var javascriptProtocolRegex = /^javascript:/,
205 emailRegex = /^mailto:([^?]+)(?:\?(.+))?$/,
206 emailSubjectRegex = /subject=([^;?:@&=$,\/]*)/i,
207 emailBodyRegex = /body=([^;?:@&=$,\/]*)/i,
208 anchorRegex = /^#(.*)$/,
209 urlRegex = /^((?:http|https|ftp|news):\/\/)?(.*)$/,
210 selectableTargets = /^(_(?:self|top|parent|blank))$/,
211 encodedEmailLinkRegex = /^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,
212 functionCallProtectedEmailLinkRegex = /^javascript:([^(]+)\(([^)]+)\)$/,
213 popupRegex = /\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,
214 popupFeaturesRegex = /(?:^|,)([^=]+)=(\d+|yes|no)/gi;
215
216 var advAttrNames = {
217 id: 'advId',
218 dir: 'advLangDir',
219 accessKey: 'advAccessKey',
220 // 'data-cke-saved-name': 'advName',
221 name: 'advName',
222 lang: 'advLangCode',
223 tabindex: 'advTabIndex',
224 title: 'advTitle',
225 type: 'advContentType',
226 'class': 'advCSSClasses',
227 charset: 'advCharset',
228 style: 'advStyles',
229 rel: 'advRel'
230 };
231
232 function unescapeSingleQuote( str ) {
233 return str.replace( /\\'/g, '\'' );
234 }
235
236 function escapeSingleQuote( str ) {
237 return str.replace( /'/g, '\\$&' );
238 }
239
240 function protectEmailAddressAsEncodedString( address ) {
241 var charCode,
242 length = address.length,
243 encodedChars = [];
244
245 for ( var i = 0; i < length; i++ ) {
246 charCode = address.charCodeAt( i );
247 encodedChars.push( charCode );
248 }
249
250 return 'String.fromCharCode(' + encodedChars.join( ',' ) + ')';
251 }
252
253 function protectEmailLinkAsFunction( editor, email ) {
254 var plugin = editor.plugins.link,
255 name = plugin.compiledProtectionFunction.name,
256 params = plugin.compiledProtectionFunction.params,
257 paramName, paramValue, retval;
258
259 retval = [ name, '(' ];
260 for ( var i = 0; i < params.length; i++ ) {
261 paramName = params[ i ].toLowerCase();
262 paramValue = email[ paramName ];
263
264 i > 0 && retval.push( ',' );
265 retval.push( '\'', paramValue ? escapeSingleQuote( encodeURIComponent( email[ paramName ] ) ) : '', '\'' );
266 }
267 retval.push( ')' );
268 return retval.join( '' );
269 }
270
271 function getCompiledProtectionFunction( editor ) {
272 var emailProtection = editor.config.emailProtection || '',
273 compiledProtectionFunction;
274
275 // Compile the protection function pattern.
276 if ( emailProtection && emailProtection != 'encode' ) {
277 compiledProtectionFunction = {};
278
279 emailProtection.replace( /^([^(]+)\(([^)]+)\)$/, function( match, funcName, params ) {
280 compiledProtectionFunction.name = funcName;
281 compiledProtectionFunction.params = [];
282 params.replace( /[^,\s]+/g, function( param ) {
283 compiledProtectionFunction.params.push( param );
284 } );
285 } );
286 }
287
288 return compiledProtectionFunction;
289 }
290
291 /**
292 * Set of Link plugin helpers.
293 *
294 * @class
295 * @singleton
296 */
297 CKEDITOR.plugins.link = {
298 /**
299 * Get the surrounding link element of the current selection.
300 *
301 * CKEDITOR.plugins.link.getSelectedLink( editor );
302 *
303 * // The following selections will all return the link element.
304 *
305 * <a href="#">li^nk</a>
306 * <a href="#">[link]</a>
307 * text[<a href="#">link]</a>
308 * <a href="#">li[nk</a>]
309 * [<b><a href="#">li]nk</a></b>]
310 * [<a href="#"><b>li]nk</b></a>
311 *
312 * @since 3.2.1
313 * @param {CKEDITOR.editor} editor
314 */
315 getSelectedLink: function( editor ) {
316 var selection = editor.getSelection();
317 var selectedElement = selection.getSelectedElement();
318 if ( selectedElement && selectedElement.is( 'a' ) )
319 return selectedElement;
320
321 var range = selection.getRanges()[ 0 ];
322
323 if ( range ) {
324 range.shrink( CKEDITOR.SHRINK_TEXT );
325 return editor.elementPath( range.getCommonAncestor() ).contains( 'a', 1 );
326 }
327 return null;
328 },
329
330 /**
331 * Collects anchors available in the editor (i.e. used by the Link plugin).
332 * Note that the scope of search is different for inline (the "global" document) and
333 * classic (`iframe`-based) editors (the "inner" document).
334 *
335 * @since 4.3.3
336 * @param {CKEDITOR.editor} editor
337 * @returns {CKEDITOR.dom.element[]} An array of anchor elements.
338 */
339 getEditorAnchors: function( editor ) {
340 var editable = editor.editable(),
341
342 // The scope of search for anchors is the entire document for inline editors
343 // and editor's editable for classic editor/divarea (#11359).
344 scope = ( editable.isInline() && !editor.plugins.divarea ) ? editor.document : editable,
345
346 links = scope.getElementsByTag( 'a' ),
347 imgs = scope.getElementsByTag( 'img' ),
348 anchors = [],
349 i = 0,
350 item;
351
352 // Retrieve all anchors within the scope.
353 while ( ( item = links.getItem( i++ ) ) ) {
354 if ( item.data( 'cke-saved-name' ) || item.hasAttribute( 'name' ) ) {
355 anchors.push( {
356 name: item.data( 'cke-saved-name' ) || item.getAttribute( 'name' ),
357 id: item.getAttribute( 'id' )
358 } );
359 }
360 }
361 // Retrieve all "fake anchors" within the scope.
362 i = 0;
363
364 while ( ( item = imgs.getItem( i++ ) ) ) {
365 if ( ( item = this.tryRestoreFakeAnchor( editor, item ) ) ) {
366 anchors.push( {
367 name: item.getAttribute( 'name' ),
368 id: item.getAttribute( 'id' )
369 } );
370 }
371 }
372
373 return anchors;
374 },
375
376 /**
377 * Opera and WebKit do not make it possible to select empty anchors. Fake
378 * elements must be used for them.
379 *
380 * @readonly
381 * @deprecated 4.3.3 It is set to `true` in every browser.
382 * @property {Boolean}
383 */
384 fakeAnchor: true,
385
386 /**
387 * For browsers that do not support CSS3 `a[name]:empty()`. Note that IE9 is included because of #7783.
388 *
389 * @readonly
390 * @deprecated 4.3.3 It is set to `false` in every browser.
391 * @property {Boolean} synAnchorSelector
392 */
393
394 /**
395 * For browsers that have editing issues with an empty anchor.
396 *
397 * @readonly
398 * @deprecated 4.3.3 It is set to `false` in every browser.
399 * @property {Boolean} emptyAnchorFix
400 */
401
402 /**
403 * Returns an element representing a real anchor restored from a fake anchor.
404 *
405 * @param {CKEDITOR.editor} editor
406 * @param {CKEDITOR.dom.element} element
407 * @returns {CKEDITOR.dom.element} Restored anchor element or nothing if the
408 * passed element was not a fake anchor.
409 */
410 tryRestoreFakeAnchor: function( editor, element ) {
411 if ( element && element.data( 'cke-real-element-type' ) && element.data( 'cke-real-element-type' ) == 'anchor' ) {
412 var link = editor.restoreRealElement( element );
413 if ( link.data( 'cke-saved-name' ) )
414 return link;
415 }
416 },
417
418 /**
419 * Parses attributes of the link element and returns an object representing
420 * the current state (data) of the link. This data format is a plain object accepted
421 * e.g. by the Link dialog window and {@link #getLinkAttributes}.
422 *
423 * **Note:** Data model format produced by the parser must be compatible with the Link
424 * plugin dialog because it is passed directly to {@link CKEDITOR.dialog#setupContent}.
425 *
426 * @since 4.4
427 * @param {CKEDITOR.editor} editor
428 * @param {CKEDITOR.dom.element} element
429 * @returns {Object} An object of link data.
430 */
431 parseLinkAttributes: function( editor, element ) {
432 var href = ( element && ( element.data( 'cke-saved-href' ) || element.getAttribute( 'href' ) ) ) || '',
433 compiledProtectionFunction = editor.plugins.link.compiledProtectionFunction,
434 emailProtection = editor.config.emailProtection,
435 javascriptMatch, emailMatch, anchorMatch, urlMatch,
436 retval = {};
437
438 if ( ( javascriptMatch = href.match( javascriptProtocolRegex ) ) ) {
439 if ( emailProtection == 'encode' ) {
440 href = href.replace( encodedEmailLinkRegex, function( match, protectedAddress, rest ) {
441 // Without it 'undefined' is appended to e-mails without subject and body (#9192).
442 rest = rest || '';
443
444 return 'mailto:' +
445 String.fromCharCode.apply( String, protectedAddress.split( ',' ) ) +
446 unescapeSingleQuote( rest );
447 } );
448 }
449 // Protected email link as function call.
450 else if ( emailProtection ) {
451 href.replace( functionCallProtectedEmailLinkRegex, function( match, funcName, funcArgs ) {
452 if ( funcName == compiledProtectionFunction.name ) {
453 retval.type = 'email';
454 var email = retval.email = {};
455
456 var paramRegex = /[^,\s]+/g,
457 paramQuoteRegex = /(^')|('$)/g,
458 paramsMatch = funcArgs.match( paramRegex ),
459 paramsMatchLength = paramsMatch.length,
460 paramName, paramVal;
461
462 for ( var i = 0; i < paramsMatchLength; i++ ) {
463 paramVal = decodeURIComponent( unescapeSingleQuote( paramsMatch[ i ].replace( paramQuoteRegex, '' ) ) );
464 paramName = compiledProtectionFunction.params[ i ].toLowerCase();
465 email[ paramName ] = paramVal;
466 }
467 email.address = [ email.name, email.domain ].join( '@' );
468 }
469 } );
470 }
471 }
472
473 if ( !retval.type ) {
474 if ( ( anchorMatch = href.match( anchorRegex ) ) ) {
475 retval.type = 'anchor';
476 retval.anchor = {};
477 retval.anchor.name = retval.anchor.id = anchorMatch[ 1 ];
478 }
479 // Protected email link as encoded string.
480 else if ( ( emailMatch = href.match( emailRegex ) ) ) {
481 var subjectMatch = href.match( emailSubjectRegex ),
482 bodyMatch = href.match( emailBodyRegex );
483
484 retval.type = 'email';
485 var email = ( retval.email = {} );
486 email.address = emailMatch[ 1 ];
487 subjectMatch && ( email.subject = decodeURIComponent( subjectMatch[ 1 ] ) );
488 bodyMatch && ( email.body = decodeURIComponent( bodyMatch[ 1 ] ) );
489 }
490 // urlRegex matches empty strings, so need to check for href as well.
491 else if ( href && ( urlMatch = href.match( urlRegex ) ) ) {
492 retval.type = 'url';
493 retval.url = {};
494 retval.url.protocol = urlMatch[ 1 ];
495 retval.url.url = urlMatch[ 2 ];
496 }
497 }
498
499 // Load target and popup settings.
500 if ( element ) {
501 var target = element.getAttribute( 'target' );
502
503 // IE BUG: target attribute is an empty string instead of null in IE if it's not set.
504 if ( !target ) {
505 var onclick = element.data( 'cke-pa-onclick' ) || element.getAttribute( 'onclick' ),
506 onclickMatch = onclick && onclick.match( popupRegex );
507
508 if ( onclickMatch ) {
509 retval.target = {
510 type: 'popup',
511 name: onclickMatch[ 1 ]
512 };
513
514 var featureMatch;
515 while ( ( featureMatch = popupFeaturesRegex.exec( onclickMatch[ 2 ] ) ) ) {
516 // Some values should remain numbers (#7300)
517 if ( ( featureMatch[ 2 ] == 'yes' || featureMatch[ 2 ] == '1' ) && !( featureMatch[ 1 ] in { height: 1, width: 1, top: 1, left: 1 } ) )
518 retval.target[ featureMatch[ 1 ] ] = true;
519 else if ( isFinite( featureMatch[ 2 ] ) )
520 retval.target[ featureMatch[ 1 ] ] = featureMatch[ 2 ];
521 }
522 }
523 } else {
524 retval.target = {
525 type: target.match( selectableTargets ) ? target : 'frame',
526 name: target
527 };
528 }
529
530 var advanced = {};
531
532 for ( var a in advAttrNames ) {
533 var val = element.getAttribute( a );
534
535 if ( val )
536 advanced[ advAttrNames[ a ] ] = val;
537 }
538
539 var advName = element.data( 'cke-saved-name' ) || advanced.advName;
540
541 if ( advName )
542 advanced.advName = advName;
543
544 if ( !CKEDITOR.tools.isEmpty( advanced ) )
545 retval.advanced = advanced;
546 }
547
548 return retval;
549 },
550
551 /**
552 * Converts link data produced by {@link #parseLinkAttributes} into an object which consists
553 * of attributes to be set (with their values) and an array of attributes to be removed.
554 * This method can be used to compose or to update any link element with the given data.
555 *
556 * @since 4.4
557 * @param {CKEDITOR.editor} editor
558 * @param {Object} data Data in {@link #parseLinkAttributes} format.
559 * @returns {Object} An object consisting of two keys, i.e.:
560 *
561 * {
562 * // Attributes to be set.
563 * set: {
564 * href: 'http://foo.bar',
565 * target: 'bang'
566 * },
567 * // Attributes to be removed.
568 * removed: [
569 * 'id', 'style'
570 * ]
571 * }
572 *
573 */
574 getLinkAttributes: function( editor, data ) {
575 var emailProtection = editor.config.emailProtection || '',
576 set = {};
577
578 // Compose the URL.
579 switch ( data.type ) {
580 case 'url':
581 var protocol = ( data.url && data.url.protocol !== undefined ) ? data.url.protocol : 'http://',
582 url = ( data.url && CKEDITOR.tools.trim( data.url.url ) ) || '';
583
584 set[ 'data-cke-saved-href' ] = ( url.indexOf( '/' ) === 0 ) ? url : protocol + url;
585
586 break;
587 case 'anchor':
588 var name = ( data.anchor && data.anchor.name ),
589 id = ( data.anchor && data.anchor.id );
590
591 set[ 'data-cke-saved-href' ] = '#' + ( name || id || '' );
592
593 break;
594 case 'email':
595 var email = data.email,
596 address = email.address,
597 linkHref;
598
599 switch ( emailProtection ) {
600 case '':
601 case 'encode':
602 var subject = encodeURIComponent( email.subject || '' ),
603 body = encodeURIComponent( email.body || '' ),
604 argList = [];
605
606 // Build the e-mail parameters first.
607 subject && argList.push( 'subject=' + subject );
608 body && argList.push( 'body=' + body );
609 argList = argList.length ? '?' + argList.join( '&' ) : '';
610
611 if ( emailProtection == 'encode' ) {
612 linkHref = [
613 'javascript:void(location.href=\'mailto:\'+', // jshint ignore:line
614 protectEmailAddressAsEncodedString( address )
615 ];
616 // parameters are optional.
617 argList && linkHref.push( '+\'', escapeSingleQuote( argList ), '\'' );
618
619 linkHref.push( ')' );
620 } else {
621 linkHref = [ 'mailto:', address, argList ];
622 }
623
624 break;
625 default:
626 // Separating name and domain.
627 var nameAndDomain = address.split( '@', 2 );
628 email.name = nameAndDomain[ 0 ];
629 email.domain = nameAndDomain[ 1 ];
630
631 linkHref = [ 'javascript:', protectEmailLinkAsFunction( editor, email ) ]; // jshint ignore:line
632 }
633
634 set[ 'data-cke-saved-href' ] = linkHref.join( '' );
635 break;
636 }
637
638 // Popups and target.
639 if ( data.target ) {
640 if ( data.target.type == 'popup' ) {
641 var onclickList = [
642 'window.open(this.href, \'', data.target.name || '', '\', \''
643 ],
644 featureList = [
645 'resizable', 'status', 'location', 'toolbar', 'menubar', 'fullscreen', 'scrollbars', 'dependent'
646 ],
647 featureLength = featureList.length,
648 addFeature = function( featureName ) {
649 if ( data.target[ featureName ] )
650 featureList.push( featureName + '=' + data.target[ featureName ] );
651 };
652
653 for ( var i = 0; i < featureLength; i++ )
654 featureList[ i ] = featureList[ i ] + ( data.target[ featureList[ i ] ] ? '=yes' : '=no' );
655
656 addFeature( 'width' );
657 addFeature( 'left' );
658 addFeature( 'height' );
659 addFeature( 'top' );
660
661 onclickList.push( featureList.join( ',' ), '\'); return false;' );
662 set[ 'data-cke-pa-onclick' ] = onclickList.join( '' );
663 }
664 else if ( data.target.type != 'notSet' && data.target.name ) {
665 set.target = data.target.name;
666 }
667 }
668
669 // Advanced attributes.
670 if ( data.advanced ) {
671 for ( var a in advAttrNames ) {
672 var val = data.advanced[ advAttrNames[ a ] ];
673
674 if ( val )
675 set[ a ] = val;
676 }
677
678 if ( set.name )
679 set[ 'data-cke-saved-name' ] = set.name;
680 }
681
682 // Browser need the "href" fro copy/paste link to work. (#6641)
683 if ( set[ 'data-cke-saved-href' ] )
684 set.href = set[ 'data-cke-saved-href' ];
685
686 var removed = {
687 target: 1,
688 onclick: 1,
689 'data-cke-pa-onclick': 1,
690 'data-cke-saved-name': 1
691 };
692
693 if ( data.advanced )
694 CKEDITOR.tools.extend( removed, advAttrNames );
695
696 // Remove all attributes which are not currently set.
697 for ( var s in set )
698 delete removed[ s ];
699
700 return {
701 set: set,
702 removed: CKEDITOR.tools.objectKeys( removed )
703 };
704 }
705 };
706
707 // TODO Much probably there's no need to expose these as public objects.
708
709 CKEDITOR.unlinkCommand = function() {};
710 CKEDITOR.unlinkCommand.prototype = {
711 exec: function( editor ) {
712 var style = new CKEDITOR.style( { element: 'a', type: CKEDITOR.STYLE_INLINE, alwaysRemoveElement: 1 } );
713 editor.removeStyle( style );
714 },
715
716 refresh: function( editor, path ) {
717 // Despite our initial hope, document.queryCommandEnabled() does not work
718 // for this in Firefox. So we must detect the state by element paths.
719
720 var element = path.lastElement && path.lastElement.getAscendant( 'a', true );
721
722 if ( element && element.getName() == 'a' && element.getAttribute( 'href' ) && element.getChildCount() )
723 this.setState( CKEDITOR.TRISTATE_OFF );
724 else
725 this.setState( CKEDITOR.TRISTATE_DISABLED );
726 },
727
728 contextSensitive: 1,
729 startDisabled: 1,
730 requiredContent: 'a[href]'
731 };
732
733 CKEDITOR.removeAnchorCommand = function() {};
734 CKEDITOR.removeAnchorCommand.prototype = {
735 exec: function( editor ) {
736 var sel = editor.getSelection(),
737 bms = sel.createBookmarks(),
738 anchor;
739 if ( sel && ( anchor = sel.getSelectedElement() ) && ( !anchor.getChildCount() ? CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, anchor ) : anchor.is( 'a' ) ) )
740 anchor.remove( 1 );
741 else {
742 if ( ( anchor = CKEDITOR.plugins.link.getSelectedLink( editor ) ) ) {
743 if ( anchor.hasAttribute( 'href' ) ) {
744 anchor.removeAttributes( { name: 1, 'data-cke-saved-name': 1 } );
745 anchor.removeClass( 'cke_anchor' );
746 } else {
747 anchor.remove( 1 );
748 }
749 }
750 }
751 sel.selectBookmarks( bms );
752 },
753 requiredContent: 'a[name]'
754 };
755
756 CKEDITOR.tools.extend( CKEDITOR.config, {
757 /**
758 * Whether to show the Advanced tab in the Link dialog window.
759 *
760 * @cfg {Boolean} [linkShowAdvancedTab=true]
761 * @member CKEDITOR.config
762 */
763 linkShowAdvancedTab: true,
764
765 /**
766 * Whether to show the Target tab in the Link dialog window.
767 *
768 * @cfg {Boolean} [linkShowTargetTab=true]
769 * @member CKEDITOR.config
770 */
771 linkShowTargetTab: true
772
773 /**
774 * Whether JavaScript code is allowed as a `href` attribute in an anchor tag.
775 * With this option enabled it is possible to create links like:
776 *
777 * <a href="javascript:alert('Hello world!')">hello world</a>
778 *
779 * By default JavaScript links are not allowed and will not pass
780 * the Link dialog window validation.
781 *
782 * @since 4.4.1
783 * @cfg {Boolean} [linkJavaScriptLinksAllowed=false]
784 * @member CKEDITOR.config
785 */
786 } );
787} )();
diff --git a/sources/plugins/list/icons/bulletedlist-rtl.png b/sources/plugins/list/icons/bulletedlist-rtl.png
new file mode 100644
index 00000000..766814a9
--- /dev/null
+++ b/sources/plugins/list/icons/bulletedlist-rtl.png
Binary files differ
diff --git a/sources/plugins/list/icons/bulletedlist.png b/sources/plugins/list/icons/bulletedlist.png
new file mode 100644
index 00000000..e57ec7a5
--- /dev/null
+++ b/sources/plugins/list/icons/bulletedlist.png
Binary files differ
diff --git a/sources/plugins/list/icons/hidpi/bulletedlist-rtl.png b/sources/plugins/list/icons/hidpi/bulletedlist-rtl.png
new file mode 100644
index 00000000..50e31560
--- /dev/null
+++ b/sources/plugins/list/icons/hidpi/bulletedlist-rtl.png
Binary files differ
diff --git a/sources/plugins/list/icons/hidpi/bulletedlist.png b/sources/plugins/list/icons/hidpi/bulletedlist.png
new file mode 100644
index 00000000..00f84d0d
--- /dev/null
+++ b/sources/plugins/list/icons/hidpi/bulletedlist.png
Binary files differ
diff --git a/sources/plugins/list/icons/hidpi/numberedlist-rtl.png b/sources/plugins/list/icons/hidpi/numberedlist-rtl.png
new file mode 100644
index 00000000..1dff87d2
--- /dev/null
+++ b/sources/plugins/list/icons/hidpi/numberedlist-rtl.png
Binary files differ
diff --git a/sources/plugins/list/icons/hidpi/numberedlist.png b/sources/plugins/list/icons/hidpi/numberedlist.png
new file mode 100644
index 00000000..c20b88f4
--- /dev/null
+++ b/sources/plugins/list/icons/hidpi/numberedlist.png
Binary files differ
diff --git a/sources/plugins/list/icons/numberedlist-rtl.png b/sources/plugins/list/icons/numberedlist-rtl.png
new file mode 100644
index 00000000..2c398586
--- /dev/null
+++ b/sources/plugins/list/icons/numberedlist-rtl.png
Binary files differ
diff --git a/sources/plugins/list/icons/numberedlist.png b/sources/plugins/list/icons/numberedlist.png
new file mode 100644
index 00000000..f509a85b
--- /dev/null
+++ b/sources/plugins/list/icons/numberedlist.png
Binary files differ
diff --git a/sources/plugins/list/lang/af.js b/sources/plugins/list/lang/af.js
new file mode 100644
index 00000000..5afe7e8b
--- /dev/null
+++ b/sources/plugins/list/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'af', {
6 bulletedlist: 'Ongenommerde lys',
7 numberedlist: 'Genommerde lys'
8} );
diff --git a/sources/plugins/list/lang/ar.js b/sources/plugins/list/lang/ar.js
new file mode 100644
index 00000000..f0f02834
--- /dev/null
+++ b/sources/plugins/list/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ar', {
6 bulletedlist: 'ادخال/حذف تعداد نقطي',
7 numberedlist: 'ادخال/حذف تعداد رقمي'
8} );
diff --git a/sources/plugins/list/lang/bg.js b/sources/plugins/list/lang/bg.js
new file mode 100644
index 00000000..2e206ec1
--- /dev/null
+++ b/sources/plugins/list/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'bg', {
6 bulletedlist: 'Вмъкване/Премахване на точков списък',
7 numberedlist: 'Вмъкване/Премахване на номериран списък'
8} );
diff --git a/sources/plugins/list/lang/bn.js b/sources/plugins/list/lang/bn.js
new file mode 100644
index 00000000..1301b111
--- /dev/null
+++ b/sources/plugins/list/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'bn', {
6 bulletedlist: 'বুলেট লিস্ট লেবেল',
7 numberedlist: 'সাংখ্যিক লিস্টের লেবেল'
8} );
diff --git a/sources/plugins/list/lang/bs.js b/sources/plugins/list/lang/bs.js
new file mode 100644
index 00000000..ca0b9a09
--- /dev/null
+++ b/sources/plugins/list/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'bs', {
6 bulletedlist: 'Lista',
7 numberedlist: 'Numerisana lista'
8} );
diff --git a/sources/plugins/list/lang/ca.js b/sources/plugins/list/lang/ca.js
new file mode 100644
index 00000000..07b27372
--- /dev/null
+++ b/sources/plugins/list/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ca', {
6 bulletedlist: 'Llista de pics',
7 numberedlist: 'Llista numerada'
8} );
diff --git a/sources/plugins/list/lang/cs.js b/sources/plugins/list/lang/cs.js
new file mode 100644
index 00000000..14d81e97
--- /dev/null
+++ b/sources/plugins/list/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'cs', {
6 bulletedlist: 'Odrážky',
7 numberedlist: 'Číslování'
8} );
diff --git a/sources/plugins/list/lang/cy.js b/sources/plugins/list/lang/cy.js
new file mode 100644
index 00000000..dada3e09
--- /dev/null
+++ b/sources/plugins/list/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'cy', {
6 bulletedlist: 'Mewnosod/Tynnu Rhestr Bwled',
7 numberedlist: 'Mewnosod/Tynnu Rhestr Rhifol'
8} );
diff --git a/sources/plugins/list/lang/da.js b/sources/plugins/list/lang/da.js
new file mode 100644
index 00000000..2f0f1be3
--- /dev/null
+++ b/sources/plugins/list/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'da', {
6 bulletedlist: 'Punktopstilling',
7 numberedlist: 'Talopstilling'
8} );
diff --git a/sources/plugins/list/lang/de.js b/sources/plugins/list/lang/de.js
new file mode 100644
index 00000000..d5d5dbed
--- /dev/null
+++ b/sources/plugins/list/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'de', {
6 bulletedlist: 'Liste',
7 numberedlist: 'Nummerierte Liste einfügen/entfernen'
8} );
diff --git a/sources/plugins/list/lang/el.js b/sources/plugins/list/lang/el.js
new file mode 100644
index 00000000..733abf2e
--- /dev/null
+++ b/sources/plugins/list/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'el', {
6 bulletedlist: 'Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων',
7 numberedlist: 'Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας'
8} );
diff --git a/sources/plugins/list/lang/en-au.js b/sources/plugins/list/lang/en-au.js
new file mode 100644
index 00000000..95a49124
--- /dev/null
+++ b/sources/plugins/list/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'en-au', {
6 bulletedlist: 'Insert/Remove Bulleted List',
7 numberedlist: 'Insert/Remove Numbered List'
8} );
diff --git a/sources/plugins/list/lang/en-ca.js b/sources/plugins/list/lang/en-ca.js
new file mode 100644
index 00000000..f315fbae
--- /dev/null
+++ b/sources/plugins/list/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'en-ca', {
6 bulletedlist: 'Insert/Remove Bulleted List',
7 numberedlist: 'Insert/Remove Numbered List'
8} );
diff --git a/sources/plugins/list/lang/en-gb.js b/sources/plugins/list/lang/en-gb.js
new file mode 100644
index 00000000..6828ea14
--- /dev/null
+++ b/sources/plugins/list/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'en-gb', {
6 bulletedlist: 'Insert/Remove Bulleted List',
7 numberedlist: 'Insert/Remove Numbered List'
8} );
diff --git a/sources/plugins/list/lang/en.js b/sources/plugins/list/lang/en.js
new file mode 100644
index 00000000..4179db1f
--- /dev/null
+++ b/sources/plugins/list/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'en', {
6 bulletedlist: 'Insert/Remove Bulleted List',
7 numberedlist: 'Insert/Remove Numbered List'
8} );
diff --git a/sources/plugins/list/lang/eo.js b/sources/plugins/list/lang/eo.js
new file mode 100644
index 00000000..acdcff73
--- /dev/null
+++ b/sources/plugins/list/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'eo', {
6 bulletedlist: 'Bula Listo',
7 numberedlist: 'Numera Listo'
8} );
diff --git a/sources/plugins/list/lang/es.js b/sources/plugins/list/lang/es.js
new file mode 100644
index 00000000..7aab7739
--- /dev/null
+++ b/sources/plugins/list/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'es', {
6 bulletedlist: 'Viñetas',
7 numberedlist: 'Numeración'
8} );
diff --git a/sources/plugins/list/lang/et.js b/sources/plugins/list/lang/et.js
new file mode 100644
index 00000000..ea405047
--- /dev/null
+++ b/sources/plugins/list/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'et', {
6 bulletedlist: 'Punktloend',
7 numberedlist: 'Numberloend'
8} );
diff --git a/sources/plugins/list/lang/eu.js b/sources/plugins/list/lang/eu.js
new file mode 100644
index 00000000..b8004a92
--- /dev/null
+++ b/sources/plugins/list/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'eu', {
6 bulletedlist: 'Buletdun Zerrenda',
7 numberedlist: 'Zenbakidun Zerrenda'
8} );
diff --git a/sources/plugins/list/lang/fa.js b/sources/plugins/list/lang/fa.js
new file mode 100644
index 00000000..613612e9
--- /dev/null
+++ b/sources/plugins/list/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'fa', {
6 bulletedlist: 'فهرست نقطه​ای',
7 numberedlist: 'فهرست شماره​دار'
8} );
diff --git a/sources/plugins/list/lang/fi.js b/sources/plugins/list/lang/fi.js
new file mode 100644
index 00000000..134a559e
--- /dev/null
+++ b/sources/plugins/list/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'fi', {
6 bulletedlist: 'Luettelomerkit',
7 numberedlist: 'Numerointi'
8} );
diff --git a/sources/plugins/list/lang/fo.js b/sources/plugins/list/lang/fo.js
new file mode 100644
index 00000000..50007a90
--- /dev/null
+++ b/sources/plugins/list/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'fo', {
6 bulletedlist: 'Punktmerktur listi',
7 numberedlist: 'Talmerktur listi'
8} );
diff --git a/sources/plugins/list/lang/fr-ca.js b/sources/plugins/list/lang/fr-ca.js
new file mode 100644
index 00000000..89789824
--- /dev/null
+++ b/sources/plugins/list/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'fr-ca', {
6 bulletedlist: 'Liste à puces',
7 numberedlist: 'Liste numérotée'
8} );
diff --git a/sources/plugins/list/lang/fr.js b/sources/plugins/list/lang/fr.js
new file mode 100644
index 00000000..f83b06bb
--- /dev/null
+++ b/sources/plugins/list/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'fr', {
6 bulletedlist: 'Insérer/Supprimer la liste à puces',
7 numberedlist: 'Insérer/Supprimer la liste numérotée'
8} );
diff --git a/sources/plugins/list/lang/gl.js b/sources/plugins/list/lang/gl.js
new file mode 100644
index 00000000..80866a12
--- /dev/null
+++ b/sources/plugins/list/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'gl', {
6 bulletedlist: 'Inserir/retirar lista viñeteada',
7 numberedlist: 'Inserir/retirar lista numerada'
8} );
diff --git a/sources/plugins/list/lang/gu.js b/sources/plugins/list/lang/gu.js
new file mode 100644
index 00000000..1ae9f965
--- /dev/null
+++ b/sources/plugins/list/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'gu', {
6 bulletedlist: 'બુલેટ સૂચિ',
7 numberedlist: 'સંખ્યાંકન સૂચિ'
8} );
diff --git a/sources/plugins/list/lang/he.js b/sources/plugins/list/lang/he.js
new file mode 100644
index 00000000..d58c6746
--- /dev/null
+++ b/sources/plugins/list/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'he', {
6 bulletedlist: 'רשימת נקודות',
7 numberedlist: 'רשימה ממוספרת'
8} );
diff --git a/sources/plugins/list/lang/hi.js b/sources/plugins/list/lang/hi.js
new file mode 100644
index 00000000..8336d8c3
--- /dev/null
+++ b/sources/plugins/list/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'hi', {
6 bulletedlist: 'बुलॅट सूची',
7 numberedlist: 'अंकीय सूची'
8} );
diff --git a/sources/plugins/list/lang/hr.js b/sources/plugins/list/lang/hr.js
new file mode 100644
index 00000000..87029ac7
--- /dev/null
+++ b/sources/plugins/list/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'hr', {
6 bulletedlist: 'Obična lista',
7 numberedlist: 'Brojčana lista'
8} );
diff --git a/sources/plugins/list/lang/hu.js b/sources/plugins/list/lang/hu.js
new file mode 100644
index 00000000..b4c5dd8f
--- /dev/null
+++ b/sources/plugins/list/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'hu', {
6 bulletedlist: 'Felsorolás',
7 numberedlist: 'Számozás'
8} );
diff --git a/sources/plugins/list/lang/id.js b/sources/plugins/list/lang/id.js
new file mode 100644
index 00000000..1ca94e62
--- /dev/null
+++ b/sources/plugins/list/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'id', {
6 bulletedlist: 'Sisip/Hapus Daftar Bullet',
7 numberedlist: 'Sisip/Hapus Daftar Bernomor'
8} );
diff --git a/sources/plugins/list/lang/is.js b/sources/plugins/list/lang/is.js
new file mode 100644
index 00000000..d61328fb
--- /dev/null
+++ b/sources/plugins/list/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'is', {
6 bulletedlist: 'Punktalisti',
7 numberedlist: 'Númeraður listi'
8} );
diff --git a/sources/plugins/list/lang/it.js b/sources/plugins/list/lang/it.js
new file mode 100644
index 00000000..0eeab916
--- /dev/null
+++ b/sources/plugins/list/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'it', {
6 bulletedlist: 'Inserisci/Rimuovi Elenco Puntato',
7 numberedlist: 'Inserisci/Rimuovi Elenco Numerato'
8} );
diff --git a/sources/plugins/list/lang/ja.js b/sources/plugins/list/lang/ja.js
new file mode 100644
index 00000000..7e0998b9
--- /dev/null
+++ b/sources/plugins/list/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ja', {
6 bulletedlist: '番号無しリスト',
7 numberedlist: '番号付きリスト'
8} );
diff --git a/sources/plugins/list/lang/ka.js b/sources/plugins/list/lang/ka.js
new file mode 100644
index 00000000..f257f606
--- /dev/null
+++ b/sources/plugins/list/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ka', {
6 bulletedlist: 'ღილიანი სია',
7 numberedlist: 'გადანომრილი სია'
8} );
diff --git a/sources/plugins/list/lang/km.js b/sources/plugins/list/lang/km.js
new file mode 100644
index 00000000..a713f664
--- /dev/null
+++ b/sources/plugins/list/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'km', {
6 bulletedlist: 'បញ្ចូល / លុប​បញ្ជី​ជា​ចំណុច​មូល',
7 numberedlist: 'បញ្ចូល / លុប​បញ្ជី​ជា​លេខ'
8} );
diff --git a/sources/plugins/list/lang/ko.js b/sources/plugins/list/lang/ko.js
new file mode 100644
index 00000000..279c6851
--- /dev/null
+++ b/sources/plugins/list/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ko', {
6 bulletedlist: '순서 없는 목록',
7 numberedlist: '순서 있는 목록'
8} );
diff --git a/sources/plugins/list/lang/ku.js b/sources/plugins/list/lang/ku.js
new file mode 100644
index 00000000..39b0def0
--- /dev/null
+++ b/sources/plugins/list/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ku', {
6 bulletedlist: 'دانان/لابردنی خاڵی لیست',
7 numberedlist: 'دانان/لابردنی ژمارەی لیست'
8} );
diff --git a/sources/plugins/list/lang/lt.js b/sources/plugins/list/lang/lt.js
new file mode 100644
index 00000000..8ed7dcbf
--- /dev/null
+++ b/sources/plugins/list/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'lt', {
6 bulletedlist: 'Suženklintas sąrašas',
7 numberedlist: 'Numeruotas sąrašas'
8} );
diff --git a/sources/plugins/list/lang/lv.js b/sources/plugins/list/lang/lv.js
new file mode 100644
index 00000000..0a6439eb
--- /dev/null
+++ b/sources/plugins/list/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'lv', {
6 bulletedlist: 'Pievienot/Noņemt vienkāršu sarakstu',
7 numberedlist: 'Numurēts saraksts'
8} );
diff --git a/sources/plugins/list/lang/mk.js b/sources/plugins/list/lang/mk.js
new file mode 100644
index 00000000..e86a8800
--- /dev/null
+++ b/sources/plugins/list/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'mk', {
6 bulletedlist: 'Insert/Remove Bulleted List', // MISSING
7 numberedlist: 'Insert/Remove Numbered List' // MISSING
8} );
diff --git a/sources/plugins/list/lang/mn.js b/sources/plugins/list/lang/mn.js
new file mode 100644
index 00000000..2df6cf31
--- /dev/null
+++ b/sources/plugins/list/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'mn', {
6 bulletedlist: 'Цэгтэй жагсаалт',
7 numberedlist: 'Дугаарлагдсан жагсаалт'
8} );
diff --git a/sources/plugins/list/lang/ms.js b/sources/plugins/list/lang/ms.js
new file mode 100644
index 00000000..44a72c4e
--- /dev/null
+++ b/sources/plugins/list/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ms', {
6 bulletedlist: 'Senarai tidak bernombor',
7 numberedlist: 'Senarai bernombor'
8} );
diff --git a/sources/plugins/list/lang/nb.js b/sources/plugins/list/lang/nb.js
new file mode 100644
index 00000000..f0221f00
--- /dev/null
+++ b/sources/plugins/list/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'nb', {
6 bulletedlist: 'Legg til / fjern punktmerket liste',
7 numberedlist: 'Legg til / fjern nummerert liste'
8} );
diff --git a/sources/plugins/list/lang/nl.js b/sources/plugins/list/lang/nl.js
new file mode 100644
index 00000000..3566f737
--- /dev/null
+++ b/sources/plugins/list/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'nl', {
6 bulletedlist: 'Opsomming invoegen',
7 numberedlist: 'Genummerde lijst invoegen'
8} );
diff --git a/sources/plugins/list/lang/no.js b/sources/plugins/list/lang/no.js
new file mode 100644
index 00000000..9fbc648f
--- /dev/null
+++ b/sources/plugins/list/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'no', {
6 bulletedlist: 'Legg til/Fjern punktmerket liste',
7 numberedlist: 'Legg til/Fjern nummerert liste'
8} );
diff --git a/sources/plugins/list/lang/pl.js b/sources/plugins/list/lang/pl.js
new file mode 100644
index 00000000..82ca3044
--- /dev/null
+++ b/sources/plugins/list/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'pl', {
6 bulletedlist: 'Lista wypunktowana',
7 numberedlist: 'Lista numerowana'
8} );
diff --git a/sources/plugins/list/lang/pt-br.js b/sources/plugins/list/lang/pt-br.js
new file mode 100644
index 00000000..f3fc91e2
--- /dev/null
+++ b/sources/plugins/list/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'pt-br', {
6 bulletedlist: 'Lista sem números',
7 numberedlist: 'Lista numerada'
8} );
diff --git a/sources/plugins/list/lang/pt.js b/sources/plugins/list/lang/pt.js
new file mode 100644
index 00000000..cce733b1
--- /dev/null
+++ b/sources/plugins/list/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'pt', {
6 bulletedlist: 'Marcas',
7 numberedlist: 'Numeração'
8} );
diff --git a/sources/plugins/list/lang/ro.js b/sources/plugins/list/lang/ro.js
new file mode 100644
index 00000000..f3748f73
--- /dev/null
+++ b/sources/plugins/list/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ro', {
6 bulletedlist: 'Inserează / Elimină Listă cu puncte',
7 numberedlist: 'Inserează / Elimină Listă numerotată'
8} );
diff --git a/sources/plugins/list/lang/ru.js b/sources/plugins/list/lang/ru.js
new file mode 100644
index 00000000..9da34a94
--- /dev/null
+++ b/sources/plugins/list/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ru', {
6 bulletedlist: 'Вставить / удалить маркированный список',
7 numberedlist: 'Вставить / удалить нумерованный список'
8} );
diff --git a/sources/plugins/list/lang/si.js b/sources/plugins/list/lang/si.js
new file mode 100644
index 00000000..620699bd
--- /dev/null
+++ b/sources/plugins/list/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'si', {
6 bulletedlist: 'ඇතුලත් / ඉවත් කිරීම ලඉස්තුව',
7 numberedlist: 'ඇතුලත් / ඉවත් කිරීම අන්න්කිත ලඉස්තුව'
8} );
diff --git a/sources/plugins/list/lang/sk.js b/sources/plugins/list/lang/sk.js
new file mode 100644
index 00000000..88ebd0de
--- /dev/null
+++ b/sources/plugins/list/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'sk', {
6 bulletedlist: 'Vložiť/Odstrániť zoznam s odrážkami',
7 numberedlist: 'Vložiť/Odstrániť číslovaný zoznam'
8} );
diff --git a/sources/plugins/list/lang/sl.js b/sources/plugins/list/lang/sl.js
new file mode 100644
index 00000000..b1ea7a72
--- /dev/null
+++ b/sources/plugins/list/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'sl', {
6 bulletedlist: 'Označen seznam',
7 numberedlist: 'Oštevilčen seznam'
8} );
diff --git a/sources/plugins/list/lang/sq.js b/sources/plugins/list/lang/sq.js
new file mode 100644
index 00000000..814ef8f2
--- /dev/null
+++ b/sources/plugins/list/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'sq', {
6 bulletedlist: 'Vendos/Largo Listën me Pika',
7 numberedlist: 'Vendos/Largo Listën me Numra'
8} );
diff --git a/sources/plugins/list/lang/sr-latn.js b/sources/plugins/list/lang/sr-latn.js
new file mode 100644
index 00000000..79280bf1
--- /dev/null
+++ b/sources/plugins/list/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'sr-latn', {
6 bulletedlist: 'Nenabrojiva lista',
7 numberedlist: 'Nabrojiva lista'
8} );
diff --git a/sources/plugins/list/lang/sr.js b/sources/plugins/list/lang/sr.js
new file mode 100644
index 00000000..56d868be
--- /dev/null
+++ b/sources/plugins/list/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'sr', {
6 bulletedlist: 'Ненабројива листа',
7 numberedlist: 'Набројиву листу'
8} );
diff --git a/sources/plugins/list/lang/sv.js b/sources/plugins/list/lang/sv.js
new file mode 100644
index 00000000..e24f4a2f
--- /dev/null
+++ b/sources/plugins/list/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'sv', {
6 bulletedlist: 'Infoga/ta bort punktlista',
7 numberedlist: 'Infoga/ta bort numrerad lista'
8} );
diff --git a/sources/plugins/list/lang/th.js b/sources/plugins/list/lang/th.js
new file mode 100644
index 00000000..f583a6ce
--- /dev/null
+++ b/sources/plugins/list/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'th', {
6 bulletedlist: 'ลำดับรายการแบบสัญลักษณ์',
7 numberedlist: 'ลำดับรายการแบบตัวเลข'
8} );
diff --git a/sources/plugins/list/lang/tr.js b/sources/plugins/list/lang/tr.js
new file mode 100644
index 00000000..9da38cc2
--- /dev/null
+++ b/sources/plugins/list/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'tr', {
6 bulletedlist: 'Simgeli Liste',
7 numberedlist: 'Numaralı Liste'
8} );
diff --git a/sources/plugins/list/lang/tt.js b/sources/plugins/list/lang/tt.js
new file mode 100644
index 00000000..caa29b7e
--- /dev/null
+++ b/sources/plugins/list/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'tt', {
6 bulletedlist: 'Маркерлы тезмә өстәү/бетерү',
7 numberedlist: ' Номерланган тезмә өстәү/бетерү'
8} );
diff --git a/sources/plugins/list/lang/ug.js b/sources/plugins/list/lang/ug.js
new file mode 100644
index 00000000..94f9362c
--- /dev/null
+++ b/sources/plugins/list/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'ug', {
6 bulletedlist: 'تۈر بەلگە تىزىمى',
7 numberedlist: 'تەرتىپ نومۇر تىزىمى'
8} );
diff --git a/sources/plugins/list/lang/uk.js b/sources/plugins/list/lang/uk.js
new file mode 100644
index 00000000..f8256448
--- /dev/null
+++ b/sources/plugins/list/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'uk', {
6 bulletedlist: 'Маркірований список',
7 numberedlist: 'Нумерований список'
8} );
diff --git a/sources/plugins/list/lang/vi.js b/sources/plugins/list/lang/vi.js
new file mode 100644
index 00000000..d221e0e6
--- /dev/null
+++ b/sources/plugins/list/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'vi', {
6 bulletedlist: 'Chèn/Xoá Danh sách không thứ tự',
7 numberedlist: 'Chèn/Xoá Danh sách có thứ tự'
8} );
diff --git a/sources/plugins/list/lang/zh-cn.js b/sources/plugins/list/lang/zh-cn.js
new file mode 100644
index 00000000..d4d3983c
--- /dev/null
+++ b/sources/plugins/list/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'zh-cn', {
6 bulletedlist: '项目列表',
7 numberedlist: '编号列表'
8} );
diff --git a/sources/plugins/list/lang/zh.js b/sources/plugins/list/lang/zh.js
new file mode 100644
index 00000000..b707c384
--- /dev/null
+++ b/sources/plugins/list/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'list', 'zh', {
6 bulletedlist: '插入/移除項目符號清單',
7 numberedlist: '插入/移除編號清單清單'
8} );
diff --git a/sources/plugins/list/plugin.js b/sources/plugins/list/plugin.js
new file mode 100644
index 00000000..267bd3b0
--- /dev/null
+++ b/sources/plugins/list/plugin.js
@@ -0,0 +1,1111 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Insert and remove numbered and bulleted lists.
8 */
9
10( function() {
11 var listNodeNames = { ol: 1, ul: 1 };
12
13 var whitespaces = CKEDITOR.dom.walker.whitespaces(),
14 bookmarks = CKEDITOR.dom.walker.bookmark(),
15 nonEmpty = function( node ) {
16 return !( whitespaces( node ) || bookmarks( node ) );
17 },
18 blockBogus = CKEDITOR.dom.walker.bogus();
19
20 function cleanUpDirection( element ) {
21 var dir, parent, parentDir;
22 if ( ( dir = element.getDirection() ) ) {
23 parent = element.getParent();
24 while ( parent && !( parentDir = parent.getDirection() ) )
25 parent = parent.getParent();
26
27 if ( dir == parentDir )
28 element.removeAttribute( 'dir' );
29 }
30 }
31
32 // Inherit inline styles from another element.
33 function inheritInlineStyles( parent, el ) {
34 var style = parent.getAttribute( 'style' );
35
36 // Put parent styles before child styles.
37 style && el.setAttribute( 'style', style.replace( /([^;])$/, '$1;' ) + ( el.getAttribute( 'style' ) || '' ) );
38 }
39
40 CKEDITOR.plugins.list = {
41 /**
42 * Convert a DOM list tree into a data structure that is easier to
43 * manipulate. This operation should be non-intrusive in the sense that it
44 * does not change the DOM tree, with the exception that it may add some
45 * markers to the list item nodes when database is specified.
46 *
47 * @member CKEDITOR.plugins.list
48 * @todo params
49 */
50 listToArray: function( listNode, database, baseArray, baseIndentLevel, grandparentNode ) {
51 if ( !listNodeNames[ listNode.getName() ] )
52 return [];
53
54 if ( !baseIndentLevel )
55 baseIndentLevel = 0;
56 if ( !baseArray )
57 baseArray = [];
58
59 // Iterate over all list items to and look for inner lists.
60 for ( var i = 0, count = listNode.getChildCount(); i < count; i++ ) {
61 var listItem = listNode.getChild( i );
62
63 // Fixing malformed nested lists by moving it into a previous list item. (#6236)
64 if ( listItem.type == CKEDITOR.NODE_ELEMENT && listItem.getName() in CKEDITOR.dtd.$list )
65 CKEDITOR.plugins.list.listToArray( listItem, database, baseArray, baseIndentLevel + 1 );
66
67 // It may be a text node or some funny stuff.
68 if ( listItem.$.nodeName.toLowerCase() != 'li' )
69 continue;
70
71 var itemObj = { 'parent': listNode, indent: baseIndentLevel, element: listItem, contents: [] };
72 if ( !grandparentNode ) {
73 itemObj.grandparent = listNode.getParent();
74 if ( itemObj.grandparent && itemObj.grandparent.$.nodeName.toLowerCase() == 'li' )
75 itemObj.grandparent = itemObj.grandparent.getParent();
76 } else {
77 itemObj.grandparent = grandparentNode;
78 }
79
80 if ( database )
81 CKEDITOR.dom.element.setMarker( database, listItem, 'listarray_index', baseArray.length );
82 baseArray.push( itemObj );
83
84 for ( var j = 0, itemChildCount = listItem.getChildCount(), child; j < itemChildCount; j++ ) {
85 child = listItem.getChild( j );
86 if ( child.type == CKEDITOR.NODE_ELEMENT && listNodeNames[ child.getName() ] )
87 // Note the recursion here, it pushes inner list items with
88 // +1 indentation in the correct order.
89 CKEDITOR.plugins.list.listToArray( child, database, baseArray, baseIndentLevel + 1, itemObj.grandparent );
90 else
91 itemObj.contents.push( child );
92 }
93 }
94 return baseArray;
95 },
96
97 /**
98 * Convert our internal representation of a list back to a DOM forest.
99 *
100 * @member CKEDITOR.plugins.list
101 * @todo params
102 */
103 arrayToList: function( listArray, database, baseIndex, paragraphMode, dir ) {
104 if ( !baseIndex )
105 baseIndex = 0;
106 if ( !listArray || listArray.length < baseIndex + 1 )
107 return null;
108
109 var i,
110 doc = listArray[ baseIndex ].parent.getDocument(),
111 retval = new CKEDITOR.dom.documentFragment( doc ),
112 rootNode = null,
113 currentIndex = baseIndex,
114 indentLevel = Math.max( listArray[ baseIndex ].indent, 0 ),
115 currentListItem = null,
116 orgDir, block,
117 paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
118
119 while ( 1 ) {
120 var item = listArray[ currentIndex ],
121 itemGrandParent = item.grandparent;
122
123 orgDir = item.element.getDirection( 1 );
124
125 if ( item.indent == indentLevel ) {
126 if ( !rootNode || listArray[ currentIndex ].parent.getName() != rootNode.getName() ) {
127 rootNode = listArray[ currentIndex ].parent.clone( false, 1 );
128 dir && rootNode.setAttribute( 'dir', dir );
129 retval.append( rootNode );
130 }
131 currentListItem = rootNode.append( item.element.clone( 0, 1 ) );
132
133 if ( orgDir != rootNode.getDirection( 1 ) )
134 currentListItem.setAttribute( 'dir', orgDir );
135
136 for ( i = 0; i < item.contents.length; i++ )
137 currentListItem.append( item.contents[ i ].clone( 1, 1 ) );
138 currentIndex++;
139 } else if ( item.indent == Math.max( indentLevel, 0 ) + 1 ) {
140 // Maintain original direction (#6861).
141 var currDir = listArray[ currentIndex - 1 ].element.getDirection( 1 ),
142 listData = CKEDITOR.plugins.list.arrayToList( listArray, null, currentIndex, paragraphMode, currDir != orgDir ? orgDir : null );
143
144 // If the next block is an <li> with another list tree as the first
145 // child, we'll need to append a filler (<br>/NBSP) or the list item
146 // wouldn't be editable. (#6724)
147 if ( !currentListItem.getChildCount() && CKEDITOR.env.needsNbspFiller && doc.$.documentMode <= 7 )
148 currentListItem.append( doc.createText( '\xa0' ) );
149 currentListItem.append( listData.listNode );
150 currentIndex = listData.nextIndex;
151 } else if ( item.indent == -1 && !baseIndex && itemGrandParent ) {
152 if ( listNodeNames[ itemGrandParent.getName() ] ) {
153 currentListItem = item.element.clone( false, true );
154 if ( orgDir != itemGrandParent.getDirection( 1 ) )
155 currentListItem.setAttribute( 'dir', orgDir );
156 } else {
157 currentListItem = new CKEDITOR.dom.documentFragment( doc );
158 }
159
160 // Migrate all children to the new container,
161 // apply the proper text direction.
162 var dirLoose = itemGrandParent.getDirection( 1 ) != orgDir,
163 li = item.element,
164 className = li.getAttribute( 'class' ),
165 style = li.getAttribute( 'style' );
166
167 var needsBlock = currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT && ( paragraphMode != CKEDITOR.ENTER_BR || dirLoose || style || className );
168
169 var child,
170 count = item.contents.length,
171 cachedBookmark;
172
173 for ( i = 0; i < count; i++ ) {
174 child = item.contents[ i ];
175
176 // Append bookmark if we can, or cache it and append it when we'll know
177 // what to do with it. Generally - we want to keep it next to its original neighbour.
178 // Exception: if bookmark is the only child it hasn't got any neighbour, so handle it normally
179 // (wrap with block if needed).
180 if ( bookmarks( child ) && count > 1 ) {
181 // If we don't need block, it's simple - append bookmark directly to the current list item.
182 if ( !needsBlock )
183 currentListItem.append( child.clone( 1, 1 ) );
184 else
185 cachedBookmark = child.clone( 1, 1 );
186 }
187 // Block content goes directly to the current list item, without wrapping.
188 else if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() ) {
189 // Apply direction on content blocks.
190 if ( dirLoose && !child.getDirection() )
191 child.setAttribute( 'dir', orgDir );
192
193 inheritInlineStyles( li, child );
194
195 className && child.addClass( className );
196
197 // Close the block which we started for inline content.
198 block = null;
199 // Append bookmark directly before current child.
200 if ( cachedBookmark ) {
201 currentListItem.append( cachedBookmark );
202 cachedBookmark = null;
203 }
204 // Append this block element to the list item.
205 currentListItem.append( child.clone( 1, 1 ) );
206 }
207 // Some inline content was found - wrap it with block and append that
208 // block to the current list item or append it to the block previously created.
209 else if ( needsBlock ) {
210 // Establish new block to hold text direction and styles.
211 if ( !block ) {
212 block = doc.createElement( paragraphName );
213 currentListItem.append( block );
214 dirLoose && block.setAttribute( 'dir', orgDir );
215 }
216
217 // Copy over styles to new block;
218 style && block.setAttribute( 'style', style );
219 className && block.setAttribute( 'class', className );
220
221 // Append bookmark directly before current child.
222 if ( cachedBookmark ) {
223 block.append( cachedBookmark );
224 cachedBookmark = null;
225 }
226 block.append( child.clone( 1, 1 ) );
227 }
228 // E.g. BR mode - inline content appended directly to the list item.
229 else {
230 currentListItem.append( child.clone( 1, 1 ) );
231 }
232 }
233
234 // No content after bookmark - append it to the block if we had one
235 // or directly to the current list item if we finished directly in the current list item.
236 if ( cachedBookmark ) {
237 ( block || currentListItem ).append( cachedBookmark );
238 cachedBookmark = null;
239 }
240
241 if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT && currentIndex != listArray.length - 1 ) {
242 var last;
243
244 // Remove bogus <br> if this browser uses them.
245 if ( CKEDITOR.env.needsBrFiller ) {
246 last = currentListItem.getLast();
247 if ( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( 'br' ) )
248 last.remove();
249 }
250
251 // If the last element is not a block, append <br> to separate merged list items.
252 last = currentListItem.getLast( nonEmpty );
253 if ( !( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( CKEDITOR.dtd.$block ) ) )
254 currentListItem.append( doc.createElement( 'br' ) );
255 }
256
257 var currentListItemName = currentListItem.$.nodeName.toLowerCase();
258 if ( currentListItemName == 'div' || currentListItemName == 'p' ) {
259 currentListItem.appendBogus();
260 }
261 retval.append( currentListItem );
262 rootNode = null;
263 currentIndex++;
264 } else {
265 return null;
266 }
267
268 block = null;
269
270 if ( listArray.length <= currentIndex || Math.max( listArray[ currentIndex ].indent, 0 ) < indentLevel )
271 break;
272 }
273
274 if ( database ) {
275 var currentNode = retval.getFirst();
276
277 while ( currentNode ) {
278 if ( currentNode.type == CKEDITOR.NODE_ELEMENT ) {
279 // Clear marker attributes for the new list tree made of cloned nodes, if any.
280 CKEDITOR.dom.element.clearMarkers( database, currentNode );
281
282 // Clear redundant direction attribute specified on list items.
283 if ( currentNode.getName() in CKEDITOR.dtd.$listItem )
284 cleanUpDirection( currentNode );
285 }
286
287 currentNode = currentNode.getNextSourceNode();
288 }
289 }
290
291 return { listNode: retval, nextIndex: currentIndex };
292 }
293 };
294
295 function changeListType( editor, groupObj, database, listsCreated ) {
296 // This case is easy...
297 // 1. Convert the whole list into a one-dimensional array.
298 // 2. Change the list type by modifying the array.
299 // 3. Recreate the whole list by converting the array to a list.
300 // 4. Replace the original list with the recreated list.
301 var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
302 selectedListItems = [];
303
304 for ( var i = 0; i < groupObj.contents.length; i++ ) {
305 var itemNode = groupObj.contents[ i ];
306 itemNode = itemNode.getAscendant( 'li', true );
307 if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
308 continue;
309 selectedListItems.push( itemNode );
310 CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
311 }
312
313 var root = groupObj.root,
314 doc = root.getDocument(),
315 listNode, newListNode;
316
317 for ( i = 0; i < selectedListItems.length; i++ ) {
318 var listIndex = selectedListItems[ i ].getCustomData( 'listarray_index' );
319 listNode = listArray[ listIndex ].parent;
320
321 // Switch to new list node for this particular item.
322 if ( !listNode.is( this.type ) ) {
323 newListNode = doc.createElement( this.type );
324 // Copy all attributes, except from 'start' and 'type'.
325 listNode.copyAttributes( newListNode, { start: 1, type: 1 } );
326 // The list-style-type property should be ignored.
327 newListNode.removeStyle( 'list-style-type' );
328 listArray[ listIndex ].parent = newListNode;
329 }
330 }
331
332 var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode );
333 var child,
334 length = newList.listNode.getChildCount();
335 for ( i = 0; i < length && ( child = newList.listNode.getChild( i ) ); i++ ) {
336 if ( child.getName() == this.type )
337 listsCreated.push( child );
338 }
339 newList.listNode.replace( groupObj.root );
340
341 editor.fire( 'contentDomInvalidated' );
342 }
343
344 function createList( editor, groupObj, listsCreated ) {
345 var contents = groupObj.contents,
346 doc = groupObj.root.getDocument(),
347 listContents = [];
348
349 // It is possible to have the contents returned by DomRangeIterator to be the same as the root.
350 // e.g. when we're running into table cells.
351 // In such a case, enclose the childNodes of contents[0] into a <div>.
352 if ( contents.length == 1 && contents[ 0 ].equals( groupObj.root ) ) {
353 var divBlock = doc.createElement( 'div' );
354 contents[ 0 ].moveChildren && contents[ 0 ].moveChildren( divBlock );
355 contents[ 0 ].append( divBlock );
356 contents[ 0 ] = divBlock;
357 }
358
359 // Calculate the common parent node of all content blocks.
360 var commonParent = groupObj.contents[ 0 ].getParent();
361 for ( var i = 0; i < contents.length; i++ )
362 commonParent = commonParent.getCommonAncestor( contents[ i ].getParent() );
363
364 var useComputedState = editor.config.useComputedState,
365 listDir, explicitDirection;
366
367 useComputedState = useComputedState === undefined || useComputedState;
368
369 // We want to insert things that are in the same tree level only, so calculate the contents again
370 // by expanding the selected blocks to the same tree level.
371 for ( i = 0; i < contents.length; i++ ) {
372 var contentNode = contents[ i ],
373 parentNode;
374 while ( ( parentNode = contentNode.getParent() ) ) {
375 if ( parentNode.equals( commonParent ) ) {
376 listContents.push( contentNode );
377
378 // Determine the lists's direction.
379 if ( !explicitDirection && contentNode.getDirection() )
380 explicitDirection = 1;
381
382 var itemDir = contentNode.getDirection( useComputedState );
383
384 if ( listDir !== null ) {
385 // If at least one LI have a different direction than current listDir, we can't have listDir.
386 if ( listDir && listDir != itemDir )
387 listDir = null;
388 else
389 listDir = itemDir;
390 }
391
392 break;
393 }
394 contentNode = parentNode;
395 }
396 }
397
398 if ( listContents.length < 1 )
399 return;
400
401 // Insert the list to the DOM tree.
402 var insertAnchor = listContents[ listContents.length - 1 ].getNext(),
403 listNode = doc.createElement( this.type );
404
405 listsCreated.push( listNode );
406
407 var contentBlock, listItem;
408
409 while ( listContents.length ) {
410 contentBlock = listContents.shift();
411 listItem = doc.createElement( 'li' );
412
413 // If current block should be preserved, append it to list item instead of
414 // transforming it to <li> element.
415 if ( shouldPreserveBlock( contentBlock ) )
416 contentBlock.appendTo( listItem );
417 else {
418 contentBlock.copyAttributes( listItem );
419 // Remove direction attribute after it was merged into list root. (#7657)
420 if ( listDir && contentBlock.getDirection() ) {
421 listItem.removeStyle( 'direction' );
422 listItem.removeAttribute( 'dir' );
423 }
424 contentBlock.moveChildren( listItem );
425 contentBlock.remove();
426 }
427
428 listItem.appendTo( listNode );
429 }
430
431 // Apply list root dir only if it has been explicitly declared.
432 if ( listDir && explicitDirection )
433 listNode.setAttribute( 'dir', listDir );
434
435 if ( insertAnchor )
436 listNode.insertBefore( insertAnchor );
437 else
438 listNode.appendTo( commonParent );
439 }
440
441 function removeList( editor, groupObj, database ) {
442 // This is very much like the change list type operation.
443 // Except that we're changing the selected items' indent to -1 in the list array.
444 var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
445 selectedListItems = [];
446
447 for ( var i = 0; i < groupObj.contents.length; i++ ) {
448 var itemNode = groupObj.contents[ i ];
449 itemNode = itemNode.getAscendant( 'li', true );
450 if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
451 continue;
452 selectedListItems.push( itemNode );
453 CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
454 }
455
456 var lastListIndex = null;
457 for ( i = 0; i < selectedListItems.length; i++ ) {
458 var listIndex = selectedListItems[ i ].getCustomData( 'listarray_index' );
459 listArray[ listIndex ].indent = -1;
460 lastListIndex = listIndex;
461 }
462
463 // After cutting parts of the list out with indent=-1, we still have to maintain the array list
464 // model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
465 // list cannot be converted back to a real DOM list.
466 for ( i = lastListIndex + 1; i < listArray.length; i++ ) {
467 if ( listArray[ i ].indent > listArray[ i - 1 ].indent + 1 ) {
468 var indentOffset = listArray[ i - 1 ].indent + 1 - listArray[ i ].indent;
469 var oldIndent = listArray[ i ].indent;
470 while ( listArray[ i ] && listArray[ i ].indent >= oldIndent ) {
471 listArray[ i ].indent += indentOffset;
472 i++;
473 }
474 i--;
475 }
476 }
477
478 var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, groupObj.root.getAttribute( 'dir' ) );
479
480 // Compensate <br> before/after the list node if the surrounds are non-blocks.(#3836)
481 var docFragment = newList.listNode,
482 boundaryNode, siblingNode;
483
484 function compensateBrs( isStart ) {
485 if (
486 ( boundaryNode = docFragment[ isStart ? 'getFirst' : 'getLast' ]() ) &&
487 !( boundaryNode.is && boundaryNode.isBlockBoundary() ) &&
488 ( siblingNode = groupObj.root[ isStart ? 'getPrevious' : 'getNext' ]( CKEDITOR.dom.walker.invisible( true ) ) ) &&
489 !( siblingNode.is && siblingNode.isBlockBoundary( { br: 1 } ) )
490 ) {
491 editor.document.createElement( 'br' )[ isStart ? 'insertBefore' : 'insertAfter' ]( boundaryNode );
492 }
493 }
494 compensateBrs( true );
495 compensateBrs();
496
497 docFragment.replace( groupObj.root );
498
499 editor.fire( 'contentDomInvalidated' );
500 }
501
502 var headerTagRegex = /^h[1-6]$/;
503
504 // Checks wheather this block should be element preserved (not transformed to <li>) when creating list.
505 function shouldPreserveBlock( block ) {
506 return (
507 // #5335
508 block.is( 'pre' ) ||
509 // #5271 - this is a header.
510 headerTagRegex.test( block.getName() ) ||
511 // 11083 - this is a non-editable element.
512 block.getAttribute( 'contenteditable' ) == 'false'
513 );
514 }
515
516 function listCommand( name, type ) {
517 this.name = name;
518 this.type = type;
519 this.context = type;
520 this.allowedContent = type + ' li';
521 this.requiredContent = type;
522 }
523
524 var elementType = CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT );
525
526 // Merge child nodes with direction preserved. (#7448)
527 function mergeChildren( from, into, refNode, forward ) {
528 var child, itemDir;
529 while ( ( child = from[ forward ? 'getLast' : 'getFirst' ]( elementType ) ) ) {
530 if ( ( itemDir = child.getDirection( 1 ) ) !== into.getDirection( 1 ) )
531 child.setAttribute( 'dir', itemDir );
532
533 child.remove();
534
535 refNode ? child[ forward ? 'insertBefore' : 'insertAfter' ]( refNode ) : into.append( child, forward );
536 }
537 }
538
539 listCommand.prototype = {
540 exec: function( editor ) {
541 // Run state check first of all.
542 this.refresh( editor, editor.elementPath() );
543
544 var config = editor.config,
545 selection = editor.getSelection(),
546 ranges = selection && selection.getRanges();
547
548 // Midas lists rule #1 says we can create a list even in an empty document.
549 // But DOM iterator wouldn't run if the document is really empty.
550 // So create a paragraph if the document is empty and we're going to create a list.
551 if ( this.state == CKEDITOR.TRISTATE_OFF ) {
552 var editable = editor.editable();
553 if ( !editable.getFirst( nonEmpty ) ) {
554 config.enterMode == CKEDITOR.ENTER_BR ? editable.appendBogus() : ranges[ 0 ].fixBlock( 1, config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
555
556 selection.selectRanges( ranges );
557 }
558 // Maybe a single range there enclosing the whole list,
559 // turn on the list state manually(#4129).
560 else {
561 var range = ranges.length == 1 && ranges[ 0 ],
562 enclosedNode = range && range.getEnclosedNode();
563 if ( enclosedNode && enclosedNode.is && this.type == enclosedNode.getName() )
564 this.setState( CKEDITOR.TRISTATE_ON );
565 }
566 }
567
568 var bookmarks = selection.createBookmarks( true );
569
570 // Group the blocks up because there are many cases where multiple lists have to be created,
571 // or multiple lists have to be cancelled.
572 var listGroups = [],
573 database = {},
574 rangeIterator = ranges.createIterator(),
575 index = 0;
576
577 while ( ( range = rangeIterator.getNextRange() ) && ++index ) {
578 var boundaryNodes = range.getBoundaryNodes(),
579 startNode = boundaryNodes.startNode,
580 endNode = boundaryNodes.endNode;
581
582 if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' )
583 range.setStartAt( boundaryNodes.startNode, CKEDITOR.POSITION_AFTER_START );
584
585 if ( endNode.type == CKEDITOR.NODE_ELEMENT && endNode.getName() == 'td' )
586 range.setEndAt( boundaryNodes.endNode, CKEDITOR.POSITION_BEFORE_END );
587
588 var iterator = range.createIterator(),
589 block;
590
591 iterator.forceBrBreak = ( this.state == CKEDITOR.TRISTATE_OFF );
592
593 while ( ( block = iterator.getNextParagraph() ) ) {
594 // Avoid duplicate blocks get processed across ranges.
595 if ( block.getCustomData( 'list_block' ) )
596 continue;
597 else
598 CKEDITOR.dom.element.setMarker( database, block, 'list_block', 1 );
599
600 var path = editor.elementPath( block ),
601 pathElements = path.elements,
602 pathElementsCount = pathElements.length,
603 processedFlag = 0,
604 blockLimit = path.blockLimit,
605 element;
606
607 // First, try to group by a list ancestor.
608 for ( var i = pathElementsCount - 1; i >= 0 && ( element = pathElements[ i ] ); i-- ) {
609 // Don't leak outside block limit (#3940).
610 if ( listNodeNames[ element.getName() ] && blockLimit.contains( element ) ) {
611 // If we've encountered a list inside a block limit
612 // The last group object of the block limit element should
613 // no longer be valid. Since paragraphs after the list
614 // should belong to a different group of paragraphs before
615 // the list. (Bug #1309)
616 blockLimit.removeCustomData( 'list_group_object_' + index );
617
618 var groupObj = element.getCustomData( 'list_group_object' );
619 if ( groupObj )
620 groupObj.contents.push( block );
621 else {
622 groupObj = { root: element, contents: [ block ] };
623 listGroups.push( groupObj );
624 CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj );
625 }
626 processedFlag = 1;
627 break;
628 }
629 }
630
631 if ( processedFlag )
632 continue;
633
634 // No list ancestor? Group by block limit, but don't mix contents from different ranges.
635 var root = blockLimit;
636 if ( root.getCustomData( 'list_group_object_' + index ) )
637 root.getCustomData( 'list_group_object_' + index ).contents.push( block );
638 else {
639 groupObj = { root: root, contents: [ block ] };
640 CKEDITOR.dom.element.setMarker( database, root, 'list_group_object_' + index, groupObj );
641 listGroups.push( groupObj );
642 }
643 }
644 }
645
646 // Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
647 // We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
648 // at the group that's not rooted at lists. So we have three cases to handle.
649 var listsCreated = [];
650 while ( listGroups.length > 0 ) {
651 groupObj = listGroups.shift();
652 if ( this.state == CKEDITOR.TRISTATE_OFF ) {
653 if ( listNodeNames[ groupObj.root.getName() ] )
654 changeListType.call( this, editor, groupObj, database, listsCreated );
655 else
656 createList.call( this, editor, groupObj, listsCreated );
657 } else if ( this.state == CKEDITOR.TRISTATE_ON && listNodeNames[ groupObj.root.getName() ] ) {
658 removeList.call( this, editor, groupObj, database );
659 }
660 }
661
662 // For all new lists created, merge into adjacent, same type lists.
663 for ( i = 0; i < listsCreated.length; i++ )
664 mergeListSiblings( listsCreated[ i ] );
665
666 // Clean up, restore selection and update toolbar button states.
667 CKEDITOR.dom.element.clearAllMarkers( database );
668 selection.selectBookmarks( bookmarks );
669 editor.focus();
670 },
671
672 refresh: function( editor, path ) {
673 var list = path.contains( listNodeNames, 1 ),
674 limit = path.blockLimit || path.root;
675
676 // 1. Only a single type of list activate.
677 // 2. Do not show list outside of block limit.
678 if ( list && limit.contains( list ) )
679 this.setState( list.is( this.type ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
680 else
681 this.setState( CKEDITOR.TRISTATE_OFF );
682 }
683 };
684
685 // Merge list adjacent, of same type lists.
686 function mergeListSiblings( listNode ) {
687
688 function mergeSibling( rtl ) {
689 var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ]( nonEmpty );
690 if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT && sibling.is( listNode.getName() ) ) {
691 // Move children order by merge direction.(#3820)
692 mergeChildren( listNode, sibling, null, !rtl );
693
694 listNode.remove();
695 listNode = sibling;
696 }
697 }
698
699 mergeSibling();
700 mergeSibling( 1 );
701 }
702
703 // Check if node is block element that recieves text.
704 function isTextBlock( node ) {
705 return node.type == CKEDITOR.NODE_ELEMENT && ( node.getName() in CKEDITOR.dtd.$block || node.getName() in CKEDITOR.dtd.$listItem ) && CKEDITOR.dtd[ node.getName() ][ '#' ];
706 }
707
708 // Join visually two block lines.
709 function joinNextLineToCursor( editor, cursor, nextCursor ) {
710 editor.fire( 'saveSnapshot' );
711
712 // Merge with previous block's content.
713 nextCursor.enlarge( CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS );
714 var frag = nextCursor.extractContents();
715
716 cursor.trim( false, true );
717 var bm = cursor.createBookmark();
718
719 // Kill original bogus;
720 var currentPath = new CKEDITOR.dom.elementPath( cursor.startContainer ),
721 pathBlock = currentPath.block,
722 currentBlock = currentPath.lastElement.getAscendant( 'li', 1 ) || pathBlock,
723 nextPath = new CKEDITOR.dom.elementPath( nextCursor.startContainer ),
724 nextLi = nextPath.contains( CKEDITOR.dtd.$listItem ),
725 nextList = nextPath.contains( CKEDITOR.dtd.$list ),
726 last;
727
728 // Remove bogus node the current block/pseudo block.
729 if ( pathBlock ) {
730 var bogus = pathBlock.getBogus();
731 bogus && bogus.remove();
732 }
733 else if ( nextList ) {
734 last = nextList.getPrevious( nonEmpty );
735 if ( last && blockBogus( last ) )
736 last.remove();
737 }
738
739 // Kill the tail br in extracted.
740 last = frag.getLast();
741 if ( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( 'br' ) )
742 last.remove();
743
744 // Insert fragment at the range position.
745 var nextNode = cursor.startContainer.getChild( cursor.startOffset );
746 if ( nextNode )
747 frag.insertBefore( nextNode );
748 else
749 cursor.startContainer.append( frag );
750
751 // Move the sub list nested in the next list item.
752 if ( nextLi ) {
753 var sublist = getSubList( nextLi );
754 if ( sublist ) {
755 // If next line is in the sub list of the current list item.
756 if ( currentBlock.contains( nextLi ) ) {
757 mergeChildren( sublist, nextLi.getParent(), nextLi );
758 sublist.remove();
759 }
760 // Migrate the sub list to current list item.
761 else {
762 currentBlock.append( sublist );
763 }
764 }
765 }
766
767 var nextBlock, parent;
768 // Remove any remaining zombies path blocks at the end after line merged.
769 while ( nextCursor.checkStartOfBlock() && nextCursor.checkEndOfBlock() ) {
770 nextPath = nextCursor.startPath();
771 nextBlock = nextPath.block;
772
773 // Abort when nothing to be removed (#10890).
774 if ( !nextBlock )
775 break;
776
777 // Check if also to remove empty list.
778 if ( nextBlock.is( 'li' ) ) {
779 parent = nextBlock.getParent();
780 if ( nextBlock.equals( parent.getLast( nonEmpty ) ) && nextBlock.equals( parent.getFirst( nonEmpty ) ) )
781 nextBlock = parent;
782 }
783
784 nextCursor.moveToPosition( nextBlock, CKEDITOR.POSITION_BEFORE_START );
785 nextBlock.remove();
786 }
787
788 // Check if need to further merge with the list resides after the merged block. (#9080)
789 var walkerRng = nextCursor.clone(), editable = editor.editable();
790 walkerRng.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END );
791 var walker = new CKEDITOR.dom.walker( walkerRng );
792 walker.evaluator = function( node ) {
793 return nonEmpty( node ) && !blockBogus( node );
794 };
795 var next = walker.next();
796 if ( next && next.type == CKEDITOR.NODE_ELEMENT && next.getName() in CKEDITOR.dtd.$list )
797 mergeListSiblings( next );
798
799 cursor.moveToBookmark( bm );
800
801 // Make fresh selection.
802 cursor.select();
803
804 editor.fire( 'saveSnapshot' );
805 }
806
807 function getSubList( li ) {
808 var last = li.getLast( nonEmpty );
809 return last && last.type == CKEDITOR.NODE_ELEMENT && last.getName() in listNodeNames ? last : null;
810 }
811
812 CKEDITOR.plugins.add( 'list', {
813 // jscs:disable maximumLineLength
814 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
815 // jscs:enable maximumLineLength
816 icons: 'bulletedlist,bulletedlist-rtl,numberedlist,numberedlist-rtl', // %REMOVE_LINE_CORE%
817 hidpi: true, // %REMOVE_LINE_CORE%
818 requires: 'indentlist',
819 init: function( editor ) {
820 if ( editor.blockless )
821 return;
822
823 // Register commands.
824 editor.addCommand( 'numberedlist', new listCommand( 'numberedlist', 'ol' ) );
825 editor.addCommand( 'bulletedlist', new listCommand( 'bulletedlist', 'ul' ) );
826
827 // Register the toolbar button.
828 if ( editor.ui.addButton ) {
829 editor.ui.addButton( 'NumberedList', {
830 label: editor.lang.list.numberedlist,
831 command: 'numberedlist',
832 directional: true,
833 toolbar: 'list,10'
834 } );
835 editor.ui.addButton( 'BulletedList', {
836 label: editor.lang.list.bulletedlist,
837 command: 'bulletedlist',
838 directional: true,
839 toolbar: 'list,20'
840 } );
841 }
842
843 // Handled backspace/del key to join list items. (#8248,#9080)
844 editor.on( 'key', function( evt ) {
845 // Use getKey directly in order to ignore modifiers.
846 // Justification: http://dev.ckeditor.com/ticket/11861#comment:13
847 var key = evt.data.domEvent.getKey(), li;
848
849 // DEl/BACKSPACE
850 if ( editor.mode == 'wysiwyg' && key in { 8: 1, 46: 1 } ) {
851 var sel = editor.getSelection(),
852 range = sel.getRanges()[ 0 ],
853 path = range && range.startPath();
854
855 if ( !range || !range.collapsed )
856 return;
857
858 var isBackspace = key == 8;
859 var editable = editor.editable();
860 var walker = new CKEDITOR.dom.walker( range.clone() );
861 walker.evaluator = function( node ) {
862 return nonEmpty( node ) && !blockBogus( node );
863 };
864 // Backspace/Del behavior at the start/end of table is handled in core.
865 walker.guard = function( node, isOut ) {
866 return !( isOut && node.type == CKEDITOR.NODE_ELEMENT && node.is( 'table' ) );
867 };
868
869 var cursor = range.clone();
870
871 if ( isBackspace ) {
872 var previous, joinWith;
873
874 // Join a sub list's first line, with the previous visual line in parent.
875 if (
876 ( previous = path.contains( listNodeNames ) ) &&
877 range.checkBoundaryOfElement( previous, CKEDITOR.START ) &&
878 ( previous = previous.getParent() ) && previous.is( 'li' ) &&
879 ( previous = getSubList( previous ) )
880 ) {
881 joinWith = previous;
882 previous = previous.getPrevious( nonEmpty );
883 // Place cursor before the nested list.
884 cursor.moveToPosition(
885 previous && blockBogus( previous ) ? previous : joinWith,
886 CKEDITOR.POSITION_BEFORE_START );
887 }
888 // Join any line following a list, with the last visual line of the list.
889 else {
890 walker.range.setStartAt( editable, CKEDITOR.POSITION_AFTER_START );
891 walker.range.setEnd( range.startContainer, range.startOffset );
892
893 previous = walker.previous();
894
895 if (
896 previous && previous.type == CKEDITOR.NODE_ELEMENT &&
897 ( previous.getName() in listNodeNames ||
898 previous.is( 'li' ) )
899 ) {
900 if ( !previous.is( 'li' ) ) {
901 walker.range.selectNodeContents( previous );
902 walker.reset();
903 walker.evaluator = isTextBlock;
904 previous = walker.previous();
905 }
906
907 joinWith = previous;
908 // Place cursor at the end of previous block.
909 cursor.moveToElementEditEnd( joinWith );
910
911 // And then just before end of closest block element (#12729).
912 cursor.moveToPosition( cursor.endPath().block, CKEDITOR.POSITION_BEFORE_END );
913 }
914 }
915
916 if ( joinWith ) {
917 joinNextLineToCursor( editor, cursor, range );
918 evt.cancel();
919 }
920 else {
921 var list = path.contains( listNodeNames );
922 // Backspace pressed at the start of list outdents the first list item. (#9129)
923 if ( list && range.checkBoundaryOfElement( list, CKEDITOR.START ) ) {
924 li = list.getFirst( nonEmpty );
925
926 if ( range.checkBoundaryOfElement( li, CKEDITOR.START ) ) {
927 previous = list.getPrevious( nonEmpty );
928
929 // Only if the list item contains a sub list, do nothing but
930 // simply move cursor backward one character.
931 if ( getSubList( li ) ) {
932 if ( previous ) {
933 range.moveToElementEditEnd( previous );
934 range.select();
935 }
936
937 evt.cancel();
938 }
939 else {
940 editor.execCommand( 'outdent' );
941 evt.cancel();
942 }
943 }
944 }
945 }
946
947 } else {
948 var next, nextLine;
949
950 li = path.contains( 'li' );
951
952 if ( li ) {
953 walker.range.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END );
954
955 var last = li.getLast( nonEmpty );
956 var block = last && isTextBlock( last ) ? last : li;
957
958 // Indicate cursor at the visual end of an list item.
959 var isAtEnd = 0;
960
961 next = walker.next();
962
963 // When list item contains a sub list.
964 if (
965 next && next.type == CKEDITOR.NODE_ELEMENT &&
966 next.getName() in listNodeNames &&
967 next.equals( last )
968 ) {
969 isAtEnd = 1;
970
971 // Move to the first item in sub list.
972 next = walker.next();
973 }
974 // Right at the end of list item.
975 else if ( range.checkBoundaryOfElement( block, CKEDITOR.END ) ) {
976 isAtEnd = 2;
977 }
978
979 if ( isAtEnd && next ) {
980 // Put cursor range there.
981 nextLine = range.clone();
982 nextLine.moveToElementEditStart( next );
983
984 // #13409
985 // For the following case and similar
986 //
987 // <ul>
988 // <li>
989 // <p><a href="#one"><em>x^</em></a></p>
990 // <ul>
991 // <li><span>y</span></li>
992 // </ul>
993 // </li>
994 // </ul>
995 if ( isAtEnd == 1 ) {
996 // Move the cursor to <em> if attached to "x" text node.
997 cursor.optimize();
998
999 // Abort if the range is attached directly in <li>, like
1000 //
1001 // <ul>
1002 // <li>
1003 // x^
1004 // <ul>
1005 // <li><span>y</span></li>
1006 // </ul>
1007 // </li>
1008 // </ul>
1009 if ( !cursor.startContainer.equals( li ) ) {
1010 var node = cursor.startContainer,
1011 farthestInlineAscendant;
1012
1013 // Find <a>, which is farthest from <em> but still inline element.
1014 while ( node.is( CKEDITOR.dtd.$inline ) ) {
1015 farthestInlineAscendant = node;
1016 node = node.getParent();
1017 }
1018
1019 // Move the range so it does not contain inline elements.
1020 // It prevents <span> from being included in <em>.
1021 //
1022 // <ul>
1023 // <li>
1024 // <p><a href="#one"><em>x</em></a>^</p>
1025 // <ul>
1026 // <li><span>y</span></li>
1027 // </ul>
1028 // </li>
1029 // </ul>
1030 //
1031 // so instead of
1032 //
1033 // <ul>
1034 // <li>
1035 // <p><a href="#one"><em>x^<span>y</span></em></a></p>
1036 // </li>
1037 // </ul>
1038 //
1039 // pressing DELETE produces
1040 //
1041 // <ul>
1042 // <li>
1043 // <p><a href="#one"><em>x</em></a>^<span>y</span></p>
1044 // </li>
1045 // </ul>
1046 if ( farthestInlineAscendant ) {
1047 cursor.moveToPosition( farthestInlineAscendant, CKEDITOR.POSITION_AFTER_END );
1048 }
1049 }
1050 }
1051
1052 // Moving `cursor` and `next line` only when at the end literally (#12729).
1053 if ( isAtEnd == 2 ) {
1054 cursor.moveToPosition( cursor.endPath().block, CKEDITOR.POSITION_BEFORE_END );
1055
1056 // Next line might be text node not wrapped in block element.
1057 if ( nextLine.endPath().block ) {
1058 nextLine.moveToPosition( nextLine.endPath().block, CKEDITOR.POSITION_AFTER_START );
1059 }
1060 }
1061
1062 joinNextLineToCursor( editor, cursor, nextLine );
1063 evt.cancel();
1064 }
1065 } else {
1066 // Handle Del key pressed before the list.
1067 walker.range.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END );
1068 next = walker.next();
1069
1070 if ( next && next.type == CKEDITOR.NODE_ELEMENT && next.is( listNodeNames ) ) {
1071 // The start <li>
1072 next = next.getFirst( nonEmpty );
1073
1074 // Simply remove the current empty block, move cursor to the
1075 // subsequent list.
1076 if ( path.block && range.checkStartOfBlock() && range.checkEndOfBlock() ) {
1077 path.block.remove();
1078 range.moveToElementEditStart( next );
1079 range.select();
1080 evt.cancel();
1081 }
1082 // Preventing the default (merge behavior), but simply move
1083 // the cursor one character forward if subsequent list item
1084 // contains sub list.
1085 else if ( getSubList( next ) ) {
1086 range.moveToElementEditStart( next );
1087 range.select();
1088 evt.cancel();
1089 }
1090 // Merge the first list item with the current line.
1091 else {
1092 nextLine = range.clone();
1093 nextLine.moveToElementEditStart( next );
1094 joinNextLineToCursor( editor, cursor, nextLine );
1095 evt.cancel();
1096 }
1097 }
1098 }
1099
1100 }
1101
1102 // The backspace/del could potentially put cursor at a bad position,
1103 // being it handled or not, check immediately the selection to have it fixed.
1104 setTimeout( function() {
1105 editor.selectionChange( 1 );
1106 } );
1107 }
1108 } );
1109 }
1110 } );
1111} )();
diff --git a/sources/plugins/listblock/plugin.js b/sources/plugins/listblock/plugin.js
new file mode 100644
index 00000000..8b0f13cd
--- /dev/null
+++ b/sources/plugins/listblock/plugin.js
@@ -0,0 +1,241 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'listblock', {
7 requires: 'panel',
8
9 onLoad: function() {
10 var list = CKEDITOR.addTemplate( 'panel-list', '<ul role="presentation" class="cke_panel_list">{items}</ul>' ),
11 listItem = CKEDITOR.addTemplate( 'panel-list-item', '<li id="{id}" class="cke_panel_listItem" role=presentation>' +
12 '<a id="{id}_option" _cke_focus=1 hidefocus=true' +
13 ' title="{title}"' +
14 ' href="javascript:void(\'{val}\')" ' +
15 ' {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;"' + // #188
16 ' role="option">' +
17 '{text}' +
18 '</a>' +
19 '</li>' ),
20 listGroup = CKEDITOR.addTemplate( 'panel-list-group', '<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>' ),
21 reSingleQuote = /\'/g,
22 escapeSingleQuotes = function( str ) {
23 return str.replace( reSingleQuote, '\\\'' );
24 };
25
26 CKEDITOR.ui.panel.prototype.addListBlock = function( name, definition ) {
27 return this.addBlock( name, new CKEDITOR.ui.listBlock( this.getHolderElement(), definition ) );
28 };
29
30 CKEDITOR.ui.listBlock = CKEDITOR.tools.createClass( {
31 base: CKEDITOR.ui.panel.block,
32
33 $: function( blockHolder, blockDefinition ) {
34 blockDefinition = blockDefinition || {};
35
36 var attribs = blockDefinition.attributes || ( blockDefinition.attributes = {} );
37 ( this.multiSelect = !!blockDefinition.multiSelect ) && ( attribs[ 'aria-multiselectable' ] = true );
38 // Provide default role of 'listbox'.
39 !attribs.role && ( attribs.role = 'listbox' );
40
41 // Call the base contructor.
42 this.base.apply( this, arguments );
43
44 // Set the proper a11y attributes.
45 this.element.setAttribute( 'role', attribs.role );
46
47 var keys = this.keys;
48 keys[ 40 ] = 'next'; // ARROW-DOWN
49 keys[ 9 ] = 'next'; // TAB
50 keys[ 38 ] = 'prev'; // ARROW-UP
51 keys[ CKEDITOR.SHIFT + 9 ] = 'prev'; // SHIFT + TAB
52 keys[ 32 ] = CKEDITOR.env.ie ? 'mouseup' : 'click'; // SPACE
53 CKEDITOR.env.ie && ( keys[ 13 ] = 'mouseup' ); // Manage ENTER, since onclick is blocked in IE (#8041).
54
55 this._.pendingHtml = [];
56 this._.pendingList = [];
57 this._.items = {};
58 this._.groups = {};
59 },
60
61 _: {
62 close: function() {
63 if ( this._.started ) {
64 var output = list.output( { items: this._.pendingList.join( '' ) } );
65 this._.pendingList = [];
66 this._.pendingHtml.push( output );
67 delete this._.started;
68 }
69 },
70
71 getClick: function() {
72 if ( !this._.click ) {
73 this._.click = CKEDITOR.tools.addFunction( function( value ) {
74 var marked = this.toggle( value );
75 if ( this.onClick )
76 this.onClick( value, marked );
77 }, this );
78 }
79 return this._.click;
80 }
81 },
82
83 proto: {
84 add: function( value, html, title ) {
85 var id = CKEDITOR.tools.getNextId();
86
87 if ( !this._.started ) {
88 this._.started = 1;
89 this._.size = this._.size || 0;
90 }
91
92 this._.items[ value ] = id;
93
94 var data = {
95 id: id,
96 val: escapeSingleQuotes( CKEDITOR.tools.htmlEncodeAttr( value ) ),
97 onclick: CKEDITOR.env.ie ? 'onclick="return false;" onmouseup' : 'onclick',
98 clickFn: this._.getClick(),
99 title: CKEDITOR.tools.htmlEncodeAttr( title || value ),
100 text: html || value
101 };
102
103 this._.pendingList.push( listItem.output( data ) );
104 },
105
106 startGroup: function( title ) {
107 this._.close();
108
109 var id = CKEDITOR.tools.getNextId();
110
111 this._.groups[ title ] = id;
112
113 this._.pendingHtml.push( listGroup.output( { id: id, label: title } ) );
114 },
115
116 commit: function() {
117 this._.close();
118 this.element.appendHtml( this._.pendingHtml.join( '' ) );
119 delete this._.size;
120
121 this._.pendingHtml = [];
122 },
123
124 toggle: function( value ) {
125 var isMarked = this.isMarked( value );
126
127 if ( isMarked )
128 this.unmark( value );
129 else
130 this.mark( value );
131
132 return !isMarked;
133 },
134
135 hideGroup: function( groupTitle ) {
136 var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),
137 list = group && group.getNext();
138
139 if ( group ) {
140 group.setStyle( 'display', 'none' );
141
142 if ( list && list.getName() == 'ul' )
143 list.setStyle( 'display', 'none' );
144 }
145 },
146
147 hideItem: function( value ) {
148 this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );
149 },
150
151 showAll: function() {
152 var items = this._.items,
153 groups = this._.groups,
154 doc = this.element.getDocument();
155
156 for ( var value in items ) {
157 doc.getById( items[ value ] ).setStyle( 'display', '' );
158 }
159
160 for ( var title in groups ) {
161 var group = doc.getById( groups[ title ] ),
162 list = group.getNext();
163
164 group.setStyle( 'display', '' );
165
166 if ( list && list.getName() == 'ul' )
167 list.setStyle( 'display', '' );
168 }
169 },
170
171 mark: function( value ) {
172 if ( !this.multiSelect )
173 this.unmarkAll();
174
175 var itemId = this._.items[ value ],
176 item = this.element.getDocument().getById( itemId );
177 item.addClass( 'cke_selected' );
178
179 this.element.getDocument().getById( itemId + '_option' ).setAttribute( 'aria-selected', true );
180 this.onMark && this.onMark( item );
181 },
182
183 unmark: function( value ) {
184 var doc = this.element.getDocument(),
185 itemId = this._.items[ value ],
186 item = doc.getById( itemId );
187
188 item.removeClass( 'cke_selected' );
189 doc.getById( itemId + '_option' ).removeAttribute( 'aria-selected' );
190
191 this.onUnmark && this.onUnmark( item );
192 },
193
194 unmarkAll: function() {
195 var items = this._.items,
196 doc = this.element.getDocument();
197
198 for ( var value in items ) {
199 var itemId = items[ value ];
200
201 doc.getById( itemId ).removeClass( 'cke_selected' );
202 doc.getById( itemId + '_option' ).removeAttribute( 'aria-selected' );
203 }
204
205 this.onUnmark && this.onUnmark();
206 },
207
208 isMarked: function( value ) {
209 return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );
210 },
211
212 focus: function( value ) {
213 this._.focusIndex = -1;
214
215 var links = this.element.getElementsByTag( 'a' ),
216 link,
217 selected,
218 i = -1;
219
220 if ( value ) {
221 selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();
222
223 while ( ( link = links.getItem( ++i ) ) ) {
224 if ( link.equals( selected ) ) {
225 this._.focusIndex = i;
226 break;
227 }
228 }
229 }
230 else {
231 this.element.focus();
232 }
233
234 selected && setTimeout( function() {
235 selected.focus();
236 }, 0 );
237 }
238 }
239 } );
240 }
241} );
diff --git a/sources/plugins/liststyle/dialogs/liststyle.js b/sources/plugins/liststyle/dialogs/liststyle.js
new file mode 100644
index 00000000..4c3f8673
--- /dev/null
+++ b/sources/plugins/liststyle/dialogs/liststyle.js
@@ -0,0 +1,189 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 function getListElement( editor, listTag ) {
8 var range;
9 try {
10 range = editor.getSelection().getRanges()[ 0 ];
11 } catch ( e ) {
12 return null;
13 }
14
15 range.shrink( CKEDITOR.SHRINK_TEXT );
16 return editor.elementPath( range.getCommonAncestor() ).contains( listTag, 1 );
17 }
18
19 var listItem = function( node ) {
20 return node.type == CKEDITOR.NODE_ELEMENT && node.is( 'li' );
21 };
22
23 var mapListStyle = {
24 'a': 'lower-alpha',
25 'A': 'upper-alpha',
26 'i': 'lower-roman',
27 'I': 'upper-roman',
28 '1': 'decimal',
29 'disc': 'disc',
30 'circle': 'circle',
31 'square': 'square'
32 };
33
34 function listStyle( editor, startupPage ) {
35 var lang = editor.lang.liststyle;
36 if ( startupPage == 'bulletedListStyle' ) {
37 return {
38 title: lang.bulletedTitle,
39 minWidth: 300,
40 minHeight: 50,
41 contents: [ {
42 id: 'info',
43 accessKey: 'I',
44 elements: [ {
45 type: 'select',
46 label: lang.type,
47 id: 'type',
48 align: 'center',
49 style: 'width:150px',
50 items: [
51 [ lang.notset, '' ],
52 [ lang.circle, 'circle' ],
53 [ lang.disc, 'disc' ],
54 [ lang.square, 'square' ]
55 ],
56 setup: function( element ) {
57 var value = element.getStyle( 'list-style-type' ) || mapListStyle[ element.getAttribute( 'type' ) ] || element.getAttribute( 'type' ) || '';
58
59 this.setValue( value );
60 },
61 commit: function( element ) {
62 var value = this.getValue();
63 if ( value )
64 element.setStyle( 'list-style-type', value );
65 else
66 element.removeStyle( 'list-style-type' );
67 }
68 } ]
69 } ],
70 onShow: function() {
71 var editor = this.getParentEditor(),
72 element = getListElement( editor, 'ul' );
73
74 element && this.setupContent( element );
75 },
76 onOk: function() {
77 var editor = this.getParentEditor(),
78 element = getListElement( editor, 'ul' );
79
80 element && this.commitContent( element );
81 }
82 };
83 } else if ( startupPage == 'numberedListStyle' ) {
84
85 var listStyleOptions = [
86 [ lang.notset, '' ],
87 [ lang.lowerRoman, 'lower-roman' ],
88 [ lang.upperRoman, 'upper-roman' ],
89 [ lang.lowerAlpha, 'lower-alpha' ],
90 [ lang.upperAlpha, 'upper-alpha' ],
91 [ lang.decimal, 'decimal' ]
92 ];
93
94 if ( !CKEDITOR.env.ie || CKEDITOR.env.version > 7 ) {
95 listStyleOptions.concat( [
96 [ lang.armenian, 'armenian' ],
97 [ lang.decimalLeadingZero, 'decimal-leading-zero' ],
98 [ lang.georgian, 'georgian' ],
99 [ lang.lowerGreek, 'lower-greek' ]
100 ] );
101 }
102
103 return {
104 title: lang.numberedTitle,
105 minWidth: 300,
106 minHeight: 50,
107 contents: [ {
108 id: 'info',
109 accessKey: 'I',
110 elements: [ {
111 type: 'hbox',
112 widths: [ '25%', '75%' ],
113 children: [ {
114 label: lang.start,
115 type: 'text',
116 id: 'start',
117 validate: CKEDITOR.dialog.validate.integer( lang.validateStartNumber ),
118 setup: function( element ) {
119 // List item start number dominates.
120 var value = element.getFirst( listItem ).getAttribute( 'value' ) || element.getAttribute( 'start' ) || 1;
121 value && this.setValue( value );
122 },
123 commit: function( element ) {
124 var firstItem = element.getFirst( listItem );
125 var oldStart = firstItem.getAttribute( 'value' ) || element.getAttribute( 'start' ) || 1;
126
127 // Force start number on list root.
128 element.getFirst( listItem ).removeAttribute( 'value' );
129 var val = parseInt( this.getValue(), 10 );
130 if ( isNaN( val ) )
131 element.removeAttribute( 'start' );
132 else
133 element.setAttribute( 'start', val );
134
135 // Update consequent list item numbering.
136 var nextItem = firstItem,
137 conseq = oldStart,
138 startNumber = isNaN( val ) ? 1 : val;
139 while ( ( nextItem = nextItem.getNext( listItem ) ) && conseq++ ) {
140 if ( nextItem.getAttribute( 'value' ) == conseq )
141 nextItem.setAttribute( 'value', startNumber + conseq - oldStart );
142 }
143 }
144 },
145 {
146 type: 'select',
147 label: lang.type,
148 id: 'type',
149 style: 'width: 100%;',
150 items: listStyleOptions,
151 setup: function( element ) {
152 var value = element.getStyle( 'list-style-type' ) || mapListStyle[ element.getAttribute( 'type' ) ] || element.getAttribute( 'type' ) || '';
153
154 this.setValue( value );
155 },
156 commit: function( element ) {
157 var value = this.getValue();
158 if ( value )
159 element.setStyle( 'list-style-type', value );
160 else
161 element.removeStyle( 'list-style-type' );
162 }
163 } ]
164 } ]
165 } ],
166 onShow: function() {
167 var editor = this.getParentEditor(),
168 element = getListElement( editor, 'ol' );
169
170 element && this.setupContent( element );
171 },
172 onOk: function() {
173 var editor = this.getParentEditor(),
174 element = getListElement( editor, 'ol' );
175
176 element && this.commitContent( element );
177 }
178 };
179 }
180 }
181
182 CKEDITOR.dialog.add( 'numberedListStyle', function( editor ) {
183 return listStyle( editor, 'numberedListStyle' );
184 } );
185
186 CKEDITOR.dialog.add( 'bulletedListStyle', function( editor ) {
187 return listStyle( editor, 'bulletedListStyle' );
188 } );
189} )();
diff --git a/sources/plugins/liststyle/lang/af.js b/sources/plugins/liststyle/lang/af.js
new file mode 100644
index 00000000..506e3344
--- /dev/null
+++ b/sources/plugins/liststyle/lang/af.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'af', {
6 armenian: 'Armeense nommering',
7 bulletedTitle: 'Eienskappe van ongenommerde lys',
8 circle: 'Sirkel',
9 decimal: 'Desimale syfers (1, 2, 3, ens.)',
10 decimalLeadingZero: 'Desimale syfers met voorloopnul (01, 02, 03, ens.)',
11 disc: 'Skyf',
12 georgian: 'Georgiese nommering (an, ban, gan, ens.)',
13 lowerAlpha: 'Kleinletters (a, b, c, d, e, ens.)',
14 lowerGreek: 'Griekse kleinletters (alpha, beta, gamma, ens.)',
15 lowerRoman: 'Romeinse kleinletters (i, ii, iii, iv, v, ens.)',
16 none: 'Geen',
17 notset: '<nie ingestel nie>',
18 numberedTitle: 'Eienskappe van genommerde lys',
19 square: 'Vierkant',
20 start: 'Begin',
21 type: 'Tipe',
22 upperAlpha: 'Hoofletters (A, B, C, D, E, ens.)',
23 upperRoman: 'Romeinse hoofletters (I, II, III, IV, V, ens.)',
24 validateStartNumber: 'Beginnommer van lys moet \'n heelgetal wees.'
25} );
diff --git a/sources/plugins/liststyle/lang/ar.js b/sources/plugins/liststyle/lang/ar.js
new file mode 100644
index 00000000..142ae057
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ar.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ar', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/bg.js b/sources/plugins/liststyle/lang/bg.js
new file mode 100644
index 00000000..0abd4743
--- /dev/null
+++ b/sources/plugins/liststyle/lang/bg.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'bg', {
6 armenian: 'Арменско номериране',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Кръг',
9 decimal: 'Числа (1, 2, 3 и др.)',
10 decimalLeadingZero: 'Числа с водеща нула (01, 02, 03 и т.н.)',
11 disc: 'Диск',
12 georgian: 'Грузинско номериране (an, ban, gan, и т.н.)',
13 lowerAlpha: 'Малки букви (а, б, в, г, д и т.н.)',
14 lowerGreek: 'Малки гръцки букви (алфа, бета, гама и т.н.)',
15 lowerRoman: 'Малки римски числа (i, ii, iii, iv, v и т.н.)',
16 none: 'Няма',
17 notset: '<не е указано>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Квадрат',
20 start: 'Старт',
21 type: 'Тип',
22 upperAlpha: 'Големи букви (А, Б, В, Г, Д и т.н.)',
23 upperRoman: 'Големи римски числа (I, II, III, IV, V и т.н.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/bn.js b/sources/plugins/liststyle/lang/bn.js
new file mode 100644
index 00000000..3716333d
--- /dev/null
+++ b/sources/plugins/liststyle/lang/bn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'bn', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/bs.js b/sources/plugins/liststyle/lang/bs.js
new file mode 100644
index 00000000..9e0cfc6a
--- /dev/null
+++ b/sources/plugins/liststyle/lang/bs.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'bs', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/ca.js b/sources/plugins/liststyle/lang/ca.js
new file mode 100644
index 00000000..8eceddd8
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ca.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ca', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/cs.js b/sources/plugins/liststyle/lang/cs.js
new file mode 100644
index 00000000..95bd76cb
--- /dev/null
+++ b/sources/plugins/liststyle/lang/cs.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'cs', {
6 armenian: 'Arménské',
7 bulletedTitle: 'Vlastnosti odrážek',
8 circle: 'Kroužky',
9 decimal: 'Arabská čísla (1, 2, 3, atd.)',
10 decimalLeadingZero: 'Arabská čísla uvozená nulou (01, 02, 03, atd.)',
11 disc: 'Kolečka',
12 georgian: 'Gruzínské (an, ban, gan, atd.)',
13 lowerAlpha: 'Malá latinka (a, b, c, d, e, atd.)',
14 lowerGreek: 'Malé řecké (alpha, beta, gamma, atd.)',
15 lowerRoman: 'Malé římské (i, ii, iii, iv, v, atd.)',
16 none: 'Nic',
17 notset: '<nenastaveno>',
18 numberedTitle: 'Vlastnosti číslování',
19 square: 'Čtverce',
20 start: 'Počátek',
21 type: 'Typ',
22 upperAlpha: 'Velká latinka (A, B, C, D, E, atd.)',
23 upperRoman: 'Velké římské (I, II, III, IV, V, atd.)',
24 validateStartNumber: 'Číslování musí začínat celým číslem.'
25} );
diff --git a/sources/plugins/liststyle/lang/cy.js b/sources/plugins/liststyle/lang/cy.js
new file mode 100644
index 00000000..f45d82c7
--- /dev/null
+++ b/sources/plugins/liststyle/lang/cy.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'cy', {
6 armenian: 'Rhifo Armeneg',
7 bulletedTitle: 'Priodweddau Rhestr Fwled',
8 circle: 'Cylch',
9 decimal: 'Degol (1, 2, 3, ayyb.)',
10 decimalLeadingZero: 'Degol â sero arweiniol (01, 02, 03, ayyb.)',
11 disc: 'Disg',
12 georgian: 'Rhifau Sioraidd (an, ban, gan, ayyb.)',
13 lowerAlpha: 'Alffa Is (a, b, c, d, e, ayyb.)',
14 lowerGreek: 'Groeg Is (alpha, beta, gamma, ayyb.)',
15 lowerRoman: 'Rhufeinig Is (i, ii, iii, iv, v, ayyb.)',
16 none: 'Dim',
17 notset: '<heb osod>',
18 numberedTitle: 'Priodweddau Rhestr Rifol',
19 square: 'Sgwâr',
20 start: 'Dechrau',
21 type: 'Math',
22 upperAlpha: 'Alffa Uwch (A, B, C, D, E, ayyb.)',
23 upperRoman: 'Rhufeinig Uwch (I, II, III, IV, V, ayyb.)',
24 validateStartNumber: 'Rhaid bod y rhif cychwynnol yn gyfanrif.'
25} );
diff --git a/sources/plugins/liststyle/lang/da.js b/sources/plugins/liststyle/lang/da.js
new file mode 100644
index 00000000..ac78502c
--- /dev/null
+++ b/sources/plugins/liststyle/lang/da.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'da', {
6 armenian: 'Armensk nummering',
7 bulletedTitle: 'Værdier for cirkelpunktopstilling',
8 circle: 'Cirkel',
9 decimal: 'Decimal (1, 2, 3, osv.)',
10 decimalLeadingZero: 'Decimaler med 0 først (01, 02, 03, etc.)',
11 disc: 'Værdier for diskpunktopstilling',
12 georgian: 'Georgiansk nummering (an, ban, gan, etc.)',
13 lowerAlpha: 'Små alfabet (a, b, c, d, e, etc.)',
14 lowerGreek: 'Små græsk (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Små romerske (i, ii, iii, iv, v, etc.)',
16 none: 'Ingen',
17 notset: '<ikke defineret>',
18 numberedTitle: 'Egenskaber for nummereret liste',
19 square: 'Firkant',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Store alfabet (A, B, C, D, E, etc.)',
23 upperRoman: 'Store romerske (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Den nummererede liste skal starte med et rundt nummer'
25} );
diff --git a/sources/plugins/liststyle/lang/de.js b/sources/plugins/liststyle/lang/de.js
new file mode 100644
index 00000000..5aaac1c6
--- /dev/null
+++ b/sources/plugins/liststyle/lang/de.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'de', {
6 armenian: 'Armenische Nummerierung',
7 bulletedTitle: 'Aufzählungslisteneigenschaften',
8 circle: 'Ring',
9 decimal: 'Dezimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Dezimal mit führender Null (01, 02, 03, usw.)',
11 disc: 'Kreis',
12 georgian: 'Georgische Nummerierung (an, ban, gan, usw.)',
13 lowerAlpha: 'Klein Alpha (a, b, c, d, e, usw.)',
14 lowerGreek: 'Klein griechisch (alpha, beta, gamma, usw.)',
15 lowerRoman: 'Klein römisch (i, ii, iii, iv, v, usw.)',
16 none: 'Keine',
17 notset: '<nicht festgelegt>',
18 numberedTitle: 'Nummerierte Listeneigenschaften',
19 square: 'Quadrat',
20 start: 'Start',
21 type: 'Typ',
22 upperAlpha: 'Groß alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Groß römisch (I, II, III, IV, V, usw.)',
24 validateStartNumber: 'Listenstartnummer muss eine ganze Zahl sein.'
25} );
diff --git a/sources/plugins/liststyle/lang/el.js b/sources/plugins/liststyle/lang/el.js
new file mode 100644
index 00000000..191f7b22
--- /dev/null
+++ b/sources/plugins/liststyle/lang/el.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'el', {
6 armenian: 'Αρμενική αρίθμηση',
7 bulletedTitle: 'Ιδιότητες Λίστας Σημείων',
8 circle: 'Κύκλος',
9 decimal: 'Δεκαδική (1, 2, 3, κτλ)',
10 decimalLeadingZero: 'Δεκαδική με αρχικό μηδεν (01, 02, 03, κτλ)',
11 disc: 'Δίσκος',
12 georgian: 'Γεωργιανή αρίθμηση (ა, ბ, გ, κτλ)',
13 lowerAlpha: 'Μικρά Λατινικά (a, b, c, d, e, κτλ.)',
14 lowerGreek: 'Μικρά Ελληνικά (α, β, γ, κτλ)',
15 lowerRoman: 'Μικρά Ρωμαϊκά (i, ii, iii, iv, v, κτλ)',
16 none: 'Καμία',
17 notset: '<δεν έχει οριστεί>',
18 numberedTitle: 'Ιδιότητες Αριθμημένης Λίστας ',
19 square: 'Τετράγωνο',
20 start: 'Εκκίνηση',
21 type: 'Τύπος',
22 upperAlpha: 'Κεφαλαία Λατινικά (A, B, C, D, E, κτλ)',
23 upperRoman: 'Κεφαλαία Ρωμαϊκά (I, II, III, IV, V, κτλ)',
24 validateStartNumber: 'Ο αριθμός εκκίνησης της αρίθμησης πρέπει να είναι ακέραιος αριθμός.'
25} );
diff --git a/sources/plugins/liststyle/lang/en-au.js b/sources/plugins/liststyle/lang/en-au.js
new file mode 100644
index 00000000..399a6489
--- /dev/null
+++ b/sources/plugins/liststyle/lang/en-au.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'en-au', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/en-ca.js b/sources/plugins/liststyle/lang/en-ca.js
new file mode 100644
index 00000000..c26cd11f
--- /dev/null
+++ b/sources/plugins/liststyle/lang/en-ca.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'en-ca', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/en-gb.js b/sources/plugins/liststyle/lang/en-gb.js
new file mode 100644
index 00000000..1e0f4ee3
--- /dev/null
+++ b/sources/plugins/liststyle/lang/en-gb.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'en-gb', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/en.js b/sources/plugins/liststyle/lang/en.js
new file mode 100644
index 00000000..43b18705
--- /dev/null
+++ b/sources/plugins/liststyle/lang/en.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'en', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/eo.js b/sources/plugins/liststyle/lang/eo.js
new file mode 100644
index 00000000..6044b476
--- /dev/null
+++ b/sources/plugins/liststyle/lang/eo.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'eo', {
6 armenian: 'Armena nombrado',
7 bulletedTitle: 'Atributoj de Bula Listo',
8 circle: 'Cirklo',
9 decimal: 'Dekumaj Nombroj (1, 2, 3, ktp.)',
10 decimalLeadingZero: 'Dekumaj Nombroj malantaŭ nulo (01, 02, 03, ktp.)',
11 disc: 'Disko',
12 georgian: 'Gruza nombrado (an, ban, gan, ktp.)',
13 lowerAlpha: 'Minusklaj Literoj (a, b, c, d, e, ktp.)',
14 lowerGreek: 'Grekaj Minusklaj Literoj (alpha, beta, gamma, ktp.)',
15 lowerRoman: 'Minusklaj Romanaj Nombroj (i, ii, iii, iv, v, ktp.)',
16 none: 'Neniu',
17 notset: '<Defaŭlta>',
18 numberedTitle: 'Atributoj de Numera Listo',
19 square: 'kvadrato',
20 start: 'Komenco',
21 type: 'Tipo',
22 upperAlpha: 'Majusklaj Literoj (A, B, C, D, E, ktp.)',
23 upperRoman: 'Majusklaj Romanaj Nombroj (I, II, III, IV, V, ktp.)',
24 validateStartNumber: 'La unua listero devas esti entjera nombro.'
25} );
diff --git a/sources/plugins/liststyle/lang/es.js b/sources/plugins/liststyle/lang/es.js
new file mode 100644
index 00000000..1abfcd46
--- /dev/null
+++ b/sources/plugins/liststyle/lang/es.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'es', {
6 armenian: 'Numeración armenia',
7 bulletedTitle: 'Propiedades de viñetas',
8 circle: 'Círculo',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal con cero inicial (01, 02, 03, etc.)',
11 disc: 'Disco',
12 georgian: 'Numeración georgiana (an, ban, gan, etc.)',
13 lowerAlpha: 'Alfabeto en minúsculas (a, b, c, d, e, etc.)',
14 lowerGreek: 'Letras griegas (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Números romanos en minúsculas (i, ii, iii, iv, v, etc.)',
16 none: 'Ninguno',
17 notset: '<sin establecer>',
18 numberedTitle: 'Propiedades de lista numerada',
19 square: 'Cuadrado',
20 start: 'Inicio',
21 type: 'Tipo',
22 upperAlpha: 'Alfabeto en mayúsculas (A, B, C, D, E, etc.)',
23 upperRoman: 'Números romanos en mayúsculas (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'El Inicio debe ser un número entero.'
25} );
diff --git a/sources/plugins/liststyle/lang/et.js b/sources/plugins/liststyle/lang/et.js
new file mode 100644
index 00000000..39ffa604
--- /dev/null
+++ b/sources/plugins/liststyle/lang/et.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'et', {
6 armenian: 'Armeenia numbrid',
7 bulletedTitle: 'Punktloendi omadused',
8 circle: 'Ring',
9 decimal: 'Numbrid (1, 2, 3, jne)',
10 decimalLeadingZero: 'Numbrid algusnulliga (01, 02, 03, jne)',
11 disc: 'Täpp',
12 georgian: 'Gruusia numbrid (an, ban, gan, jne)',
13 lowerAlpha: 'Väiketähed (a, b, c, d, e, jne)',
14 lowerGreek: 'Kreeka väiketähed (alpha, beta, gamma, jne)',
15 lowerRoman: 'Väiksed rooma numbrid (i, ii, iii, iv, v, jne)',
16 none: 'Puudub',
17 notset: '<pole määratud>',
18 numberedTitle: 'Numberloendi omadused',
19 square: 'Ruut',
20 start: 'Algus',
21 type: 'Liik',
22 upperAlpha: 'Suurtähed (A, B, C, D, E, jne)',
23 upperRoman: 'Suured rooma numbrid (I, II, III, IV, V, jne)',
24 validateStartNumber: 'Loendi algusnumber peab olema täisarv.'
25} );
diff --git a/sources/plugins/liststyle/lang/eu.js b/sources/plugins/liststyle/lang/eu.js
new file mode 100644
index 00000000..ad67ab44
--- /dev/null
+++ b/sources/plugins/liststyle/lang/eu.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'eu', {
6 armenian: 'Zenbakitze armeniarra',
7 bulletedTitle: 'Buletadun zerrendaren propietateak',
8 circle: 'Zirkulua',
9 decimal: 'Hamartarra (1, 2, 3...)',
10 decimalLeadingZero: 'Aurretik zeroa duen hamartarra (01, 02, 03...)',
11 disc: 'Diskoa',
12 georgian: 'Zenbakitze georgiarra (an, ban, gan...)',
13 lowerAlpha: 'Alfabetoa minuskulaz (a, b, c, d, e...)',
14 lowerGreek: 'Greziera minuskulaz (alpha, beta, gamma...)',
15 lowerRoman: 'Erromatarra minuskulaz (i, ii, iii, iv, v...)',
16 none: 'Bat ere ez',
17 notset: '<ezarri gabea>',
18 numberedTitle: 'Zenbakidun zerrendaren propietateak',
19 square: 'Karratua',
20 start: 'Hasi',
21 type: 'Mota',
22 upperAlpha: 'Alfabetoa maiuskulaz (A, B, C, D, E...)',
23 upperRoman: 'Erromatarra maiuskulaz (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Zerrendaren hasierako zenbakiak zenbaki osoa izan behar du.'
25} );
diff --git a/sources/plugins/liststyle/lang/fa.js b/sources/plugins/liststyle/lang/fa.js
new file mode 100644
index 00000000..bd32a838
--- /dev/null
+++ b/sources/plugins/liststyle/lang/fa.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'fa', {
6 armenian: 'شماره‌گذاری ارمنی',
7 bulletedTitle: 'خصوصیات فهرست نقطه‌ای',
8 circle: 'دایره',
9 decimal: 'ده‌دهی (۱، ۲، ۳، ...)',
10 decimalLeadingZero: 'دهدهی همراه با صفر (۰۱، ۰۲، ۰۳، ...)',
11 disc: 'صفحه گرد',
12 georgian: 'شمارهگذاری گریگورین (an, ban, gan, etc.)',
13 lowerAlpha: 'پانویس الفبایی (a, b, c, d, e, etc.)',
14 lowerGreek: 'پانویس یونانی (alpha, beta, gamma, etc.)',
15 lowerRoman: 'پانویس رومی (i, ii, iii, iv, v, etc.)',
16 none: 'هیچ',
17 notset: '<تنظیم نشده>',
18 numberedTitle: 'ویژگیهای فهرست شمارهدار',
19 square: 'چهارگوش',
20 start: 'شروع',
21 type: 'نوع',
22 upperAlpha: 'بالانویس الفبایی (A, B, C, D, E, etc.)',
23 upperRoman: 'بالانویس رومی (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'فهرست شماره شروع باید یک عدد صحیح باشد.'
25} );
diff --git a/sources/plugins/liststyle/lang/fi.js b/sources/plugins/liststyle/lang/fi.js
new file mode 100644
index 00000000..8f127856
--- /dev/null
+++ b/sources/plugins/liststyle/lang/fi.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'fi', {
6 armenian: 'Armeenialainen numerointi',
7 bulletedTitle: 'Numeroimattoman listan ominaisuudet',
8 circle: 'Ympyrä',
9 decimal: 'Desimaalit (1, 2, 3, jne.)',
10 decimalLeadingZero: 'Desimaalit, alussa nolla (01, 02, 03, jne.)',
11 disc: 'Levy',
12 georgian: 'Georgialainen numerointi (an, ban, gan, etc.)',
13 lowerAlpha: 'Pienet aakkoset (a, b, c, d, e, jne.)',
14 lowerGreek: 'Pienet kreikkalaiset (alpha, beta, gamma, jne.)',
15 lowerRoman: 'Pienet roomalaiset (i, ii, iii, iv, v, jne.)',
16 none: 'Ei mikään',
17 notset: '<ei asetettu>',
18 numberedTitle: 'Numeroidun listan ominaisuudet',
19 square: 'Neliö',
20 start: 'Alku',
21 type: 'Tyyppi',
22 upperAlpha: 'Isot aakkoset (A, B, C, D, E, jne.)',
23 upperRoman: 'Isot roomalaiset (I, II, III, IV, V, jne.)',
24 validateStartNumber: 'Listan ensimmäisen numeron tulee olla kokonaisluku.'
25} );
diff --git a/sources/plugins/liststyle/lang/fo.js b/sources/plugins/liststyle/lang/fo.js
new file mode 100644
index 00000000..50b39e35
--- /dev/null
+++ b/sources/plugins/liststyle/lang/fo.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'fo', {
6 armenian: 'Armensk talskipan',
7 bulletedTitle: 'Eginleikar fyri lista við prikkum',
8 circle: 'Sirkul',
9 decimal: 'Vanlig tøl (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Tøl við null frammanfyri (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgisk talskipan (an, ban, gan, osv.)',
13 lowerAlpha: 'Lítlir bókstavir (a, b, c, d, e, etc.)',
14 lowerGreek: 'Grikskt við lítlum (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lítil rómaratøl (i, ii, iii, iv, v, etc.)',
16 none: 'Einki',
17 notset: '<ikki sett>',
18 numberedTitle: 'Eginleikar fyri lista við tølum',
19 square: 'Fýrkantur',
20 start: 'Byrjan',
21 type: 'Slag',
22 upperAlpha: 'Stórir bókstavir (A, B, C, D, E, etc.)',
23 upperRoman: 'Stór rómaratøl (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Byrjunartalið fyri lista má vera eitt heiltal.'
25} );
diff --git a/sources/plugins/liststyle/lang/fr-ca.js b/sources/plugins/liststyle/lang/fr-ca.js
new file mode 100644
index 00000000..cfd123af
--- /dev/null
+++ b/sources/plugins/liststyle/lang/fr-ca.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'fr-ca', {
6 armenian: 'Numération arménienne',
7 bulletedTitle: 'Propriété de liste à puce',
8 circle: 'Cercle',
9 decimal: 'Décimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Décimal avec zéro (01, 02, 03, etc.)',
11 disc: 'Disque',
12 georgian: 'Numération géorgienne (an, ban, gan, etc.)',
13 lowerAlpha: 'Alphabétique minuscule (a, b, c, d, e, etc.)',
14 lowerGreek: 'Grecque minuscule (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Romain minuscule (i, ii, iii, iv, v, etc.)',
16 none: 'Aucun',
17 notset: '<non défini>',
18 numberedTitle: 'Propriété de la liste numérotée',
19 square: 'Carré',
20 start: 'Début',
21 type: 'Type',
22 upperAlpha: 'Alphabétique majuscule (A, B, C, D, E, etc.)',
23 upperRoman: 'Romain Majuscule (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Le numéro de début de liste doit être un entier.'
25} );
diff --git a/sources/plugins/liststyle/lang/fr.js b/sources/plugins/liststyle/lang/fr.js
new file mode 100644
index 00000000..862b88c1
--- /dev/null
+++ b/sources/plugins/liststyle/lang/fr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'fr', {
6 armenian: 'Numération arménienne',
7 bulletedTitle: 'Propriétés de la liste à puces',
8 circle: 'Cercle',
9 decimal: 'Décimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Décimal précédé par un 0 (01, 02, 03, etc.)',
11 disc: 'Disque',
12 georgian: 'Numération géorgienne (an, ban, gan, etc.)',
13 lowerAlpha: 'Alphabétique minuscules (a, b, c, d, e, etc.)',
14 lowerGreek: 'Grec minuscule (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Nombres romains minuscules (i, ii, iii, iv, v, etc.)',
16 none: 'Aucun',
17 notset: '<Non défini>',
18 numberedTitle: 'Propriétés de la liste numérotée',
19 square: 'Carré',
20 start: 'Début',
21 type: 'Type',
22 upperAlpha: 'Alphabétique majuscules (A, B, C, D, E, etc.)',
23 upperRoman: 'Nombres romains majuscules (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Le premier élément de la liste doit être un nombre entier.'
25} );
diff --git a/sources/plugins/liststyle/lang/gl.js b/sources/plugins/liststyle/lang/gl.js
new file mode 100644
index 00000000..b465a97a
--- /dev/null
+++ b/sources/plugins/liststyle/lang/gl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'gl', {
6 armenian: 'Numeración armenia',
7 bulletedTitle: 'Propiedades da lista viñeteada',
8 circle: 'Circulo',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal con cero á esquerda (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Numeración xeorxiana (an, ban, gan, etc.)',
13 lowerAlpha: 'Alfabeto en minúsculas (a, b, c, d, e, etc.)',
14 lowerGreek: 'Grego en minúsculas (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Números romanos en minúsculas (i, ii, iii, iv, v, etc.)',
16 none: 'Ningún',
17 notset: '<sen estabelecer>',
18 numberedTitle: 'Propiedades da lista numerada',
19 square: 'Cadrado',
20 start: 'Inicio',
21 type: 'Tipo',
22 upperAlpha: 'Alfabeto en maiúsculas (A, B, C, D, E, etc.)',
23 upperRoman: 'Números romanos en maiúsculas (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'O número de inicio da lista debe ser un número enteiro.'
25} );
diff --git a/sources/plugins/liststyle/lang/gu.js b/sources/plugins/liststyle/lang/gu.js
new file mode 100644
index 00000000..740c659a
--- /dev/null
+++ b/sources/plugins/liststyle/lang/gu.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'gu', {
6 armenian: 'અરમેનિયન આંકડા પદ્ધતિ',
7 bulletedTitle: 'બુલેટેડ લીસ્ટના ગુણ',
8 circle: 'વર્તુળ',
9 decimal: 'આંકડા (1, 2, 3, etc.)',
10 decimalLeadingZero: 'સુન્ય આગળ આંકડા (01, 02, 03, etc.)',
11 disc: 'ડિસ્ક',
12 georgian: 'ગેઓર્ગિયન આંકડા પદ્ધતિ (an, ban, gan, etc.)',
13 lowerAlpha: 'આલ્ફા નાના (a, b, c, d, e, etc.)',
14 lowerGreek: 'ગ્રીક નાના (alpha, beta, gamma, etc.)',
15 lowerRoman: 'રોમન નાના (i, ii, iii, iv, v, etc.)',
16 none: 'કસુ ',
17 notset: '<સેટ નથી>',
18 numberedTitle: 'આંકડાના લીસ્ટના ગુણ',
19 square: 'ચોરસ',
20 start: 'શરુ કરવું',
21 type: 'પ્રકાર',
22 upperAlpha: 'આલ્ફા મોટા (A, B, C, D, E, etc.)',
23 upperRoman: 'રોમન મોટા (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'લીસ્ટના સરુઆતનો આંકડો પુરો હોવો જોઈએ.'
25} );
diff --git a/sources/plugins/liststyle/lang/he.js b/sources/plugins/liststyle/lang/he.js
new file mode 100644
index 00000000..69367c3a
--- /dev/null
+++ b/sources/plugins/liststyle/lang/he.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'he', {
6 armenian: 'ספרות ארמניות',
7 bulletedTitle: 'תכונות רשימת תבליטים',
8 circle: 'עיגול ריק',
9 decimal: 'ספרות (1, 2, 3 וכו\')',
10 decimalLeadingZero: 'ספרות עם 0 בהתחלה (01, 02, 03 וכו\')',
11 disc: 'עיגול מלא',
12 georgian: 'ספרות גיאורגיות (an, ban, gan וכו\')',
13 lowerAlpha: 'אותיות אנגליות קטנות (a, b, c, d, e וכו\')',
14 lowerGreek: 'אותיות יווניות קטנות (alpha, beta, gamma וכו\')',
15 lowerRoman: 'ספירה רומית באותיות קטנות (i, ii, iii, iv, v וכו\')',
16 none: 'ללא',
17 notset: '<לא נקבע>',
18 numberedTitle: 'תכונות רשימה ממוספרת',
19 square: 'ריבוע',
20 start: 'תחילת מספור',
21 type: 'סוג',
22 upperAlpha: 'אותיות אנגליות גדולות (A, B, C, D, E וכו\')',
23 upperRoman: 'ספירה רומיות באותיות גדולות (I, II, III, IV, V וכו\')',
24 validateStartNumber: 'שדה תחילת המספור חייב להכיל מספר שלם.'
25} );
diff --git a/sources/plugins/liststyle/lang/hi.js b/sources/plugins/liststyle/lang/hi.js
new file mode 100644
index 00000000..62da6052
--- /dev/null
+++ b/sources/plugins/liststyle/lang/hi.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'hi', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/hr.js b/sources/plugins/liststyle/lang/hr.js
new file mode 100644
index 00000000..50f07660
--- /dev/null
+++ b/sources/plugins/liststyle/lang/hr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'hr', {
6 armenian: 'Armenijska numeracija',
7 bulletedTitle: 'Svojstva liste',
8 circle: 'Krug',
9 decimal: 'Decimalna numeracija (1, 2, 3, itd.)',
10 decimalLeadingZero: 'Decimalna s vodećom nulom (01, 02, 03, itd)',
11 disc: 'Disk',
12 georgian: 'Gruzijska numeracija(an, ban, gan, etc.)',
13 lowerAlpha: 'Znakovi mala slova (a, b, c, d, e, itd.)',
14 lowerGreek: 'Grčka numeracija mala slova (alfa, beta, gama, itd).',
15 lowerRoman: 'Romanska numeracija mala slova (i, ii, iii, iv, v, itd.)',
16 none: 'Bez',
17 notset: '<nije određen>',
18 numberedTitle: 'Svojstva brojčane liste',
19 square: 'Kvadrat',
20 start: 'Početak',
21 type: 'Vrsta',
22 upperAlpha: 'Znakovi velika slova (A, B, C, D, E, itd.)',
23 upperRoman: 'Romanska numeracija velika slova (I, II, III, IV, V, itd.)',
24 validateStartNumber: 'Početak brojčane liste mora biti cijeli broj.'
25} );
diff --git a/sources/plugins/liststyle/lang/hu.js b/sources/plugins/liststyle/lang/hu.js
new file mode 100644
index 00000000..d9616459
--- /dev/null
+++ b/sources/plugins/liststyle/lang/hu.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'hu', {
6 armenian: 'Örmény számozás',
7 bulletedTitle: 'Pontozott lista tulajdonságai',
8 circle: 'Kör',
9 decimal: 'Arab számozás (1, 2, 3, stb.)',
10 decimalLeadingZero: 'Számozás bevezető nullákkal (01, 02, 03, stb.)',
11 disc: 'Korong',
12 georgian: 'Grúz számozás (an, ban, gan, stb.)',
13 lowerAlpha: 'Kisbetűs (a, b, c, d, e, stb.)',
14 lowerGreek: 'Görög (alpha, beta, gamma, stb.)',
15 lowerRoman: 'Római kisbetűs (i, ii, iii, iv, v, stb.)',
16 none: 'Nincs',
17 notset: '<Nincs beállítva>',
18 numberedTitle: 'Sorszámozott lista tulajdonságai',
19 square: 'Négyzet',
20 start: 'Kezdőszám',
21 type: 'Típus',
22 upperAlpha: 'Nagybetűs (A, B, C, D, E, stb.)',
23 upperRoman: 'Római nagybetűs (I, II, III, IV, V, stb.)',
24 validateStartNumber: 'A kezdőszám nem lehet tört érték.'
25} );
diff --git a/sources/plugins/liststyle/lang/id.js b/sources/plugins/liststyle/lang/id.js
new file mode 100644
index 00000000..4622d2d3
--- /dev/null
+++ b/sources/plugins/liststyle/lang/id.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'id', {
6 armenian: 'Armenian numbering', // MISSING
7 bulletedTitle: 'Bulleted List Properties', // MISSING
8 circle: 'Lingkaran',
9 decimal: 'Desimal (1, 2, 3, dst.)',
10 decimalLeadingZero: 'Desimal diawali angka nol (01, 02, 03, dst.)',
11 disc: 'Cakram',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)', // MISSING
13 lowerAlpha: 'Huruf Kecil (a, b, c, d, e, dst.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)', // MISSING
15 lowerRoman: 'Angka Romawi (i, ii, iii, iv, v, dst.)',
16 none: 'Tidak ada',
17 notset: '<tidak diatur>',
18 numberedTitle: 'Numbered List Properties', // MISSING
19 square: 'Persegi',
20 start: 'Mulai',
21 type: 'Tipe',
22 upperAlpha: 'Huruf Besar (A, B, C, D, E, dst.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)', // MISSING
24 validateStartNumber: 'List start number must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/liststyle/lang/is.js b/sources/plugins/liststyle/lang/is.js
new file mode 100644
index 00000000..c745d330
--- /dev/null
+++ b/sources/plugins/liststyle/lang/is.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'is', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/it.js b/sources/plugins/liststyle/lang/it.js
new file mode 100644
index 00000000..14c2b9f7
--- /dev/null
+++ b/sources/plugins/liststyle/lang/it.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'it', {
6 armenian: 'Numerazione Armena',
7 bulletedTitle: 'Proprietà liste puntate',
8 circle: 'Cerchio',
9 decimal: 'Decimale (1, 2, 3, ecc.)',
10 decimalLeadingZero: 'Decimale preceduto da 0 (01, 02, 03, ecc.)',
11 disc: 'Disco',
12 georgian: 'Numerazione Georgiana (an, ban, gan, ecc.)',
13 lowerAlpha: 'Alfabetico minuscolo (a, b, c, d, e, ecc.)',
14 lowerGreek: 'Greco minuscolo (alpha, beta, gamma, ecc.)',
15 lowerRoman: 'Numerazione Romana minuscola (i, ii, iii, iv, v, ecc.)',
16 none: 'Nessuno',
17 notset: '<non impostato>',
18 numberedTitle: 'Proprietà liste numerate',
19 square: 'Quadrato',
20 start: 'Inizio',
21 type: 'Tipo',
22 upperAlpha: 'Alfabetico maiuscolo (A, B, C, D, E, ecc.)',
23 upperRoman: 'Numerazione Romana maiuscola (I, II, III, IV, V, ecc.)',
24 validateStartNumber: 'Il numero di inizio di una lista numerata deve essere un numero intero.'
25} );
diff --git a/sources/plugins/liststyle/lang/ja.js b/sources/plugins/liststyle/lang/ja.js
new file mode 100644
index 00000000..eec8c95d
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ja.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ja', {
6 armenian: 'アルメニア数字',
7 bulletedTitle: '箇条書きのプロパティ',
8 circle: '白丸',
9 decimal: '数字 (1, 2, 3, etc.)',
10 decimalLeadingZero: '0付きの数字 (01, 02, 03, etc.)',
11 disc: '黒丸',
12 georgian: 'グルジア数字 (an, ban, gan, etc.)',
13 lowerAlpha: '小文字アルファベット (a, b, c, d, e, etc.)',
14 lowerGreek: '小文字ギリシャ文字 (alpha, beta, gamma, etc.)',
15 lowerRoman: '小文字ローマ数字 (i, ii, iii, iv, v, etc.)',
16 none: 'なし',
17 notset: '<なし>',
18 numberedTitle: '番号付きリストのプロパティ',
19 square: '四角',
20 start: '開始',
21 type: '種類',
22 upperAlpha: '大文字アルファベット (A, B, C, D, E, etc.)',
23 upperRoman: '大文字ローマ数字 (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'リストの開始番号は数値で入力してください。'
25} );
diff --git a/sources/plugins/liststyle/lang/ka.js b/sources/plugins/liststyle/lang/ka.js
new file mode 100644
index 00000000..8ba1097f
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ka.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ka', {
6 armenian: 'სომხური გადანომრვა',
7 bulletedTitle: 'ღილებიანი სიის პარამეტრები',
8 circle: 'წრეწირი',
9 decimal: 'რიცხვებით (1, 2, 3, ..)',
10 decimalLeadingZero: 'ნულით დაწყებული რიცხვებით (01, 02, 03, ..)',
11 disc: 'წრე',
12 georgian: 'ქართული გადანომრვა (ან, ბან, გან, ..)',
13 lowerAlpha: 'პატარა ლათინური ასოებით (a, b, c, d, e, ..)',
14 lowerGreek: 'პატარა ბერძნული ასოებით (ალფა, ბეტა, გამა, ..)',
15 lowerRoman: 'რომაული გადანომრვცა პატარა ციფრებით (i, ii, iii, iv, v, ..)',
16 none: 'არაფერი',
17 notset: '<არაფერი>',
18 numberedTitle: 'გადანომრილი სიის პარამეტრები',
19 square: 'კვადრატი',
20 start: 'საწყისი',
21 type: 'ტიპი',
22 upperAlpha: 'დიდი ლათინური ასოებით (A, B, C, D, E, ..)',
23 upperRoman: 'რომაული გადანომრვა დიდი ციფრებით (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'სიის საწყისი მთელი რიცხვი უნდა იყოს.'
25} );
diff --git a/sources/plugins/liststyle/lang/km.js b/sources/plugins/liststyle/lang/km.js
new file mode 100644
index 00000000..90feb8f0
--- /dev/null
+++ b/sources/plugins/liststyle/lang/km.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'km', {
6 armenian: 'លេខ​អារមេនី',
7 bulletedTitle: 'លក្ខណៈ​សម្បត្តិ​បញ្ជី​ជា​ចំណុច',
8 circle: 'រង្វង់​មូល',
9 decimal: 'លេខ​ទសភាគ (1, 2, 3, ...)',
10 decimalLeadingZero: 'ទសភាគ​ចាប់​ផ្ដើម​ពី​សូន្យ (01, 02, 03, ...)',
11 disc: 'ថាស',
12 georgian: 'លេខ​ចចជា (an, ban, gan, ...)',
13 lowerAlpha: 'ព្យញ្ជនៈ​តូច (a, b, c, d, e, ...)',
14 lowerGreek: 'លេខ​ក្រិក​តូច (alpha, beta, gamma, ...)',
15 lowerRoman: 'លេខ​រ៉ូម៉ាំង​តូច (i, ii, iii, iv, v, ...)',
16 none: 'គ្មាន',
17 notset: '<not set>',
18 numberedTitle: 'លក្ខណៈ​សម្បត្តិ​បញ្ជី​ជា​លេខ',
19 square: 'ការេ',
20 start: 'ចាប់​ផ្ដើម',
21 type: 'ប្រភេទ',
22 upperAlpha: 'អក្សរ​ធំ (A, B, C, D, E, ...)',
23 upperRoman: 'លេខ​រ៉ូម៉ាំង​ធំ (I, II, III, IV, V, ...)',
24 validateStartNumber: 'លេខ​ចាប់​ផ្ដើម​បញ្ជី ត្រូវ​តែ​ជា​តួ​លេខ​ពិត​ប្រាកដ។'
25} );
diff --git a/sources/plugins/liststyle/lang/ko.js b/sources/plugins/liststyle/lang/ko.js
new file mode 100644
index 00000000..5378845d
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ko.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ko', {
6 armenian: '아르메니아 숫자',
7 bulletedTitle: '순서 없는 목록 속성',
8 circle: '원',
9 decimal: '수 (1, 2, 3, 등)',
10 decimalLeadingZero: '0이 붙은 수 (01, 02, 03, 등)',
11 disc: '내림차순',
12 georgian: '그루지야 숫자 (an, ban, gan, 등)',
13 lowerAlpha: '영소문자 (a, b, c, d, e, 등)',
14 lowerGreek: '그리스 소문자 (alpha, beta, gamma, 등)',
15 lowerRoman: '로마 소문자 (i, ii, iii, iv, v, 등)',
16 none: '없음',
17 notset: '<설정 없음>',
18 numberedTitle: '순서 있는 목록 속성',
19 square: '사각',
20 start: '시작',
21 type: '유형',
22 upperAlpha: '영대문자 (A, B, C, D, E, 등)',
23 upperRoman: '로마 대문자 (I, II, III, IV, V, 등)',
24 validateStartNumber: '목록 시작 숫자는 정수여야 합니다.'
25} );
diff --git a/sources/plugins/liststyle/lang/ku.js b/sources/plugins/liststyle/lang/ku.js
new file mode 100644
index 00000000..01689c72
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ku.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ku', {
6 armenian: 'ئاراستەی ژمارەی ئەرمەنی',
7 bulletedTitle: 'خاسیەتی لیستی خاڵی',
8 circle: 'بازنه',
9 decimal: 'ژمارە (1, 2, 3, وە هیتر.)',
10 decimalLeadingZero: 'ژمارە سفڕی لەپێشەوه (01, 02, 03, وە هیتر.)',
11 disc: 'پەپکە',
12 georgian: 'ئاراستەی ژمارەی جۆڕجی (an, ban, gan, وە هیتر.)',
13 lowerAlpha: 'ئەلفابێی بچووك (a, b, c, d, e, وە هیتر.)',
14 lowerGreek: 'یۆنانی بچووك (alpha, beta, gamma, وە هیتر.)',
15 lowerRoman: 'ژمارەی ڕۆمی بچووك (i, ii, iii, iv, v, وە هیتر.)',
16 none: 'هیچ',
17 notset: '<دانەندراوه>',
18 numberedTitle: 'خاسیەتی لیستی ژمارەیی',
19 square: 'چووراگۆشە',
20 start: 'دەستپێکردن',
21 type: 'جۆر',
22 upperAlpha: 'ئەلفابێی گەوره (A, B, C, D, E, وە هیتر.)',
23 upperRoman: 'ژمارەی ڕۆمی گەوره (I, II, III, IV, V, وە هیتر.)',
24 validateStartNumber: 'دەستپێکەری لیستی ژمارەیی دەبێت تەنها ژمارە بێت.'
25} );
diff --git a/sources/plugins/liststyle/lang/lt.js b/sources/plugins/liststyle/lang/lt.js
new file mode 100644
index 00000000..8f118519
--- /dev/null
+++ b/sources/plugins/liststyle/lang/lt.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'lt', {
6 armenian: 'Armėniški skaitmenys',
7 bulletedTitle: 'Ženklelinio sąrašo nustatymai',
8 circle: 'Apskritimas',
9 decimal: 'Dešimtainis (1, 2, 3, t.t)',
10 decimalLeadingZero: 'Dešimtainis su nuliu priekyje (01, 02, 03, t.t)',
11 disc: 'Diskas',
12 georgian: 'Gruziniški skaitmenys (an, ban, gan, t.t)',
13 lowerAlpha: 'Mažosios Alpha (a, b, c, d, e, t.t)',
14 lowerGreek: 'Mažosios Graikų (alpha, beta, gamma, t.t)',
15 lowerRoman: 'Mažosios Romėnų (i, ii, iii, iv, v, t.t)',
16 none: 'Niekas',
17 notset: '<nenurodytas>',
18 numberedTitle: 'Skaitmeninio sąrašo nustatymai',
19 square: 'Kvadratas',
20 start: 'Pradžia',
21 type: 'Rūšis',
22 upperAlpha: 'Didžiosios Alpha (A, B, C, D, E, t.t)',
23 upperRoman: 'Didžiosios Romėnų (I, II, III, IV, V, t.t)',
24 validateStartNumber: 'Sąrašo pradžios skaitmuo turi būti sveikas skaičius.'
25} );
diff --git a/sources/plugins/liststyle/lang/lv.js b/sources/plugins/liststyle/lang/lv.js
new file mode 100644
index 00000000..2271436e
--- /dev/null
+++ b/sources/plugins/liststyle/lang/lv.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'lv', {
6 armenian: 'Armēņu skaitļi',
7 bulletedTitle: 'Vienkārša saraksta uzstādījumi',
8 circle: 'Aplis',
9 decimal: 'Decimālie (1, 2, 3, utt)',
10 decimalLeadingZero: 'Decimālie ar nulli (01, 02, 03, utt)',
11 disc: 'Disks',
12 georgian: 'Gruzīņu skaitļi (an, ban, gan, utt)',
13 lowerAlpha: 'Mazie alfabēta (a, b, c, d, e, utt)',
14 lowerGreek: 'Mazie grieķu (alfa, beta, gamma, utt)',
15 lowerRoman: 'Mazie romāņu (i, ii, iii, iv, v, utt)',
16 none: 'Nekas',
17 notset: '<nav norādīts>',
18 numberedTitle: 'Numurēta saraksta uzstādījumi',
19 square: 'Kvadrāts',
20 start: 'Sākt',
21 type: 'Tips',
22 upperAlpha: 'Lielie alfabēta (A, B, C, D, E, utt)',
23 upperRoman: 'Lielie romāņu (I, II, III, IV, V, utt)',
24 validateStartNumber: 'Saraksta sākuma numuram jābūt veselam skaitlim'
25} );
diff --git a/sources/plugins/liststyle/lang/mk.js b/sources/plugins/liststyle/lang/mk.js
new file mode 100644
index 00000000..c6f16c89
--- /dev/null
+++ b/sources/plugins/liststyle/lang/mk.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'mk', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/mn.js b/sources/plugins/liststyle/lang/mn.js
new file mode 100644
index 00000000..bd8e8eb8
--- /dev/null
+++ b/sources/plugins/liststyle/lang/mn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'mn', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Төрөл',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/ms.js b/sources/plugins/liststyle/lang/ms.js
new file mode 100644
index 00000000..182c4257
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ms.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ms', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/nb.js b/sources/plugins/liststyle/lang/nb.js
new file mode 100644
index 00000000..e6582286
--- /dev/null
+++ b/sources/plugins/liststyle/lang/nb.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'nb', {
6 armenian: 'Armensk nummerering',
7 bulletedTitle: 'Egenskaper for punktmerket liste',
8 circle: 'Sirkel',
9 decimal: 'Tall (1, 2, 3, osv.)',
10 decimalLeadingZero: 'Tall, med førstesiffer null (01, 02, 03, osv.)',
11 disc: 'Disk',
12 georgian: 'Georgisk nummerering (an, ban, gan, osv.)',
13 lowerAlpha: 'Alfabetisk, små (a, b, c, d, e, osv.)',
14 lowerGreek: 'Gresk, små (alpha, beta, gamma, osv.)',
15 lowerRoman: 'Romertall, små (i, ii, iii, iv, v, osv.)',
16 none: 'Ingen',
17 notset: '<ikke satt>',
18 numberedTitle: 'Egenskaper for nummerert liste',
19 square: 'Firkant',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Alfabetisk, store (A, B, C, D, E, osv.)',
23 upperRoman: 'Romertall, store (I, II, III, IV, V, osv.)',
24 validateStartNumber: 'Starten på listen må være et heltall.'
25} );
diff --git a/sources/plugins/liststyle/lang/nl.js b/sources/plugins/liststyle/lang/nl.js
new file mode 100644
index 00000000..3d314fac
--- /dev/null
+++ b/sources/plugins/liststyle/lang/nl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'nl', {
6 armenian: 'Armeense nummering',
7 bulletedTitle: 'Eigenschappen lijst met opsommingstekens',
8 circle: 'Cirkel',
9 decimal: 'Cijfers (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Cijfers beginnen met nul (01, 02, 03, etc.)',
11 disc: 'Schijf',
12 georgian: 'Georgische nummering (an, ban, gan, etc.)',
13 lowerAlpha: 'Kleine letters (a, b, c, d, e, etc.)',
14 lowerGreek: 'Grieks kleine letters (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Romeins kleine letters (i, ii, iii, iv, v, etc.)',
16 none: 'Geen',
17 notset: '<niet gezet>',
18 numberedTitle: 'Eigenschappen genummerde lijst',
19 square: 'Vierkant',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Hoofdletters (A, B, C, D, E, etc.)',
23 upperRoman: 'Romeinse hoofdletters (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Startnummer van de lijst moet een heel nummer zijn.'
25} );
diff --git a/sources/plugins/liststyle/lang/no.js b/sources/plugins/liststyle/lang/no.js
new file mode 100644
index 00000000..df1ac7a3
--- /dev/null
+++ b/sources/plugins/liststyle/lang/no.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'no', {
6 armenian: 'Armensk nummerering',
7 bulletedTitle: 'Egenskaper for punktmerket liste',
8 circle: 'Sirkel',
9 decimal: 'Tall (1, 2, 3, osv.)',
10 decimalLeadingZero: 'Tall, med førstesiffer null (01, 02, 03, osv.)',
11 disc: 'Disk',
12 georgian: 'Georgisk nummerering (an, ban, gan, osv.)',
13 lowerAlpha: 'Alfabetisk, små (a, b, c, d, e, osv.)',
14 lowerGreek: 'Gresk, små (alpha, beta, gamma, osv.)',
15 lowerRoman: 'Romertall, små (i, ii, iii, iv, v, osv.)',
16 none: 'Ingen',
17 notset: '<ikke satt>',
18 numberedTitle: 'Egenskaper for nummerert liste',
19 square: 'Firkant',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Alfabetisk, store (A, B, C, D, E, osv.)',
23 upperRoman: 'Romertall, store (I, II, III, IV, V, osv.)',
24 validateStartNumber: 'Starten på listen må være et heltall.'
25} );
diff --git a/sources/plugins/liststyle/lang/pl.js b/sources/plugins/liststyle/lang/pl.js
new file mode 100644
index 00000000..611198c4
--- /dev/null
+++ b/sources/plugins/liststyle/lang/pl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'pl', {
6 armenian: 'Numerowanie armeńskie',
7 bulletedTitle: 'Właściwości list wypunktowanych',
8 circle: 'Koło',
9 decimal: 'Liczby (1, 2, 3 itd.)',
10 decimalLeadingZero: 'Liczby z początkowym zerem (01, 02, 03 itd.)',
11 disc: 'Okrąg',
12 georgian: 'Numerowanie gruzińskie (an, ban, gan itd.)',
13 lowerAlpha: 'Małe litery (a, b, c, d, e itd.)',
14 lowerGreek: 'Małe litery greckie (alpha, beta, gamma itd.)',
15 lowerRoman: 'Małe cyfry rzymskie (i, ii, iii, iv, v itd.)',
16 none: 'Brak',
17 notset: '<nie ustawiono>',
18 numberedTitle: 'Właściwości list numerowanych',
19 square: 'Kwadrat',
20 start: 'Początek',
21 type: 'Typ punktora',
22 upperAlpha: 'Duże litery (A, B, C, D, E itd.)',
23 upperRoman: 'Duże cyfry rzymskie (I, II, III, IV, V itd.)',
24 validateStartNumber: 'Listę musi rozpoczynać liczba całkowita.'
25} );
diff --git a/sources/plugins/liststyle/lang/pt-br.js b/sources/plugins/liststyle/lang/pt-br.js
new file mode 100644
index 00000000..c6c8d69d
--- /dev/null
+++ b/sources/plugins/liststyle/lang/pt-br.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'pt-br', {
6 armenian: 'Numeração Armêna',
7 bulletedTitle: 'Propriedades da Lista sem Numeros',
8 circle: 'Círculo',
9 decimal: 'Numeração Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Numeração Decimal com zeros (01, 02, 03, etc.)',
11 disc: 'Disco',
12 georgian: 'Numeração da Geórgia (an, ban, gan, etc.)',
13 lowerAlpha: 'Numeração Alfabética minúscula (a, b, c, d, e, etc.)',
14 lowerGreek: 'Numeração Grega minúscula (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Numeração Romana minúscula (i, ii, iii, iv, v, etc.)',
16 none: 'Nenhum',
17 notset: '<não definido>',
18 numberedTitle: 'Propriedades da Lista Numerada',
19 square: 'Quadrado',
20 start: 'Início',
21 type: 'Tipo',
22 upperAlpha: 'Numeração Alfabética Maiúscula (A, B, C, D, E, etc.)',
23 upperRoman: 'Numeração Romana maiúscula (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'O número inicial da lista deve ser um número inteiro.'
25} );
diff --git a/sources/plugins/liststyle/lang/pt.js b/sources/plugins/liststyle/lang/pt.js
new file mode 100644
index 00000000..f0fb7c7b
--- /dev/null
+++ b/sources/plugins/liststyle/lang/pt.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'pt', {
6 armenian: 'Numeração armênia',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Círculo',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disco',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'Nenhum',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Quadrado',
20 start: 'Iniciar',
21 type: 'Tipo',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/ro.js b/sources/plugins/liststyle/lang/ro.js
new file mode 100644
index 00000000..83b03d96
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ro.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ro', {
6 armenian: 'Numerotare armeniană',
7 bulletedTitle: 'Proprietățile listei cu simboluri',
8 circle: 'Cerc',
9 decimal: 'Decimale (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimale cu zero în față (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Numerotare georgiană (an, ban, gan, etc.)',
13 lowerAlpha: 'Litere mici (a, b, c, d, e, etc.)',
14 lowerGreek: 'Litere grecești mici (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Cifre romane mici (i, ii, iii, iv, v, etc.)',
16 none: 'Nimic',
17 notset: '<nesetat>',
18 numberedTitle: 'Proprietățile listei numerotate',
19 square: 'Pătrat',
20 start: 'Start',
21 type: 'Tip',
22 upperAlpha: 'Litere mari (A, B, C, D, E, etc.)',
23 upperRoman: 'Cifre romane mari (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Începutul listei trebuie să fie un număr întreg.'
25} );
diff --git a/sources/plugins/liststyle/lang/ru.js b/sources/plugins/liststyle/lang/ru.js
new file mode 100644
index 00000000..389d435c
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ru.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ru', {
6 armenian: 'Армянская нумерация',
7 bulletedTitle: 'Свойства маркированного списка',
8 circle: 'Круг',
9 decimal: 'Десятичные (1, 2, 3, и т.д.)',
10 decimalLeadingZero: 'Десятичные с ведущим нулём (01, 02, 03, и т.д.)',
11 disc: 'Окружность',
12 georgian: 'Грузинская нумерация (ани, бани, гани, и т.д.)',
13 lowerAlpha: 'Строчные латинские (a, b, c, d, e, и т.д.)',
14 lowerGreek: 'Строчные греческие (альфа, бета, гамма, и т.д.)',
15 lowerRoman: 'Строчные римские (i, ii, iii, iv, v, и т.д.)',
16 none: 'Нет',
17 notset: '<не указано>',
18 numberedTitle: 'Свойства нумерованного списка',
19 square: 'Квадрат',
20 start: 'Начиная с',
21 type: 'Тип',
22 upperAlpha: 'Заглавные латинские (A, B, C, D, E, и т.д.)',
23 upperRoman: 'Заглавные римские (I, II, III, IV, V, и т.д.)',
24 validateStartNumber: 'Первый номер списка должен быть задан обычным целым числом.'
25} );
diff --git a/sources/plugins/liststyle/lang/si.js b/sources/plugins/liststyle/lang/si.js
new file mode 100644
index 00000000..45ebcfc3
--- /dev/null
+++ b/sources/plugins/liststyle/lang/si.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'si', {
6 armenian: 'Armenian numbering', // MISSING
7 bulletedTitle: 'Bulleted List Properties', // MISSING
8 circle: 'Circle', // MISSING
9 decimal: 'Decimal (1, 2, 3, etc.)', // MISSING
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)', // MISSING
11 disc: 'Disc', // MISSING
12 georgian: 'Georgian numbering (an, ban, gan, etc.)', // MISSING
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)', // MISSING
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)', // MISSING
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)', // MISSING
16 none: 'කිසිවක්ම නොවේ',
17 notset: '<යොදා >',
18 numberedTitle: 'Numbered List Properties', // MISSING
19 square: 'Square', // MISSING
20 start: 'Start', // MISSING
21 type: 'වර්ගය',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)', // MISSING
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)', // MISSING
24 validateStartNumber: 'List start number must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/liststyle/lang/sk.js b/sources/plugins/liststyle/lang/sk.js
new file mode 100644
index 00000000..fca2a24d
--- /dev/null
+++ b/sources/plugins/liststyle/lang/sk.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'sk', {
6 armenian: 'Arménske číslovanie',
7 bulletedTitle: 'Vlastnosti odrážkového zoznamu',
8 circle: 'Kruh',
9 decimal: 'Číselné (1, 2, 3, atď.)',
10 decimalLeadingZero: 'Číselné s nulou (01, 02, 03, atď.)',
11 disc: 'Disk',
12 georgian: 'Gregoriánske číslovanie (an, ban, gan, atď.)',
13 lowerAlpha: 'Malé latinské (a, b, c, d, e, atď.)',
14 lowerGreek: 'Malé grécke (alfa, beta, gama, atď.)',
15 lowerRoman: 'Malé rímske (i, ii, iii, iv, v, atď.)',
16 none: 'Nič',
17 notset: '<nenastavené>',
18 numberedTitle: 'Vlastnosti číselného zoznamu',
19 square: 'Štvorec',
20 start: 'Začiatok',
21 type: 'Typ',
22 upperAlpha: 'Veľké latinské (A, B, C, D, E, atď.)',
23 upperRoman: 'Veľké rímske (I, II, III, IV, V, atď.)',
24 validateStartNumber: 'Začiatočné číslo číselného zoznamu musí byť celé číslo.'
25} );
diff --git a/sources/plugins/liststyle/lang/sl.js b/sources/plugins/liststyle/lang/sl.js
new file mode 100644
index 00000000..2b760cb2
--- /dev/null
+++ b/sources/plugins/liststyle/lang/sl.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'sl', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/sq.js b/sources/plugins/liststyle/lang/sq.js
new file mode 100644
index 00000000..6178da77
--- /dev/null
+++ b/sources/plugins/liststyle/lang/sq.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'sq', {
6 armenian: 'Numërim armenian',
7 bulletedTitle: 'Karakteristikat e Listës me Pulla',
8 circle: 'Rreth',
9 decimal: 'Decimal (1, 2, 3, etj.)',
10 decimalLeadingZero: 'Decimal me zerro udhëheqëse (01, 02, 03, etj.)',
11 disc: 'Disk',
12 georgian: 'Numërim gjeorgjian (an, ban, gan, etj.)',
13 lowerAlpha: 'Të vogla alfa (a, b, c, d, e, etj.)',
14 lowerGreek: 'Të vogla greke (alpha, beta, gamma, etj.)',
15 lowerRoman: 'Të vogla romake (i, ii, iii, iv, v, etj.)',
16 none: 'Asnjë',
17 notset: '<e pazgjedhur>',
18 numberedTitle: 'Karakteristikat e Listës me Numra',
19 square: 'Katror',
20 start: 'Fillimi',
21 type: 'LLoji',
22 upperAlpha: 'Të mëdha alfa (A, B, C, D, E, etj.)',
23 upperRoman: 'Të mëdha romake (I, II, III, IV, V, etj.)',
24 validateStartNumber: 'Numri i fillimit të listës duhet të është numër i plotë.'
25} );
diff --git a/sources/plugins/liststyle/lang/sr-latn.js b/sources/plugins/liststyle/lang/sr-latn.js
new file mode 100644
index 00000000..a8ab9190
--- /dev/null
+++ b/sources/plugins/liststyle/lang/sr-latn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'sr-latn', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/sr.js b/sources/plugins/liststyle/lang/sr.js
new file mode 100644
index 00000000..d32c65a6
--- /dev/null
+++ b/sources/plugins/liststyle/lang/sr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'sr', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/sv.js b/sources/plugins/liststyle/lang/sv.js
new file mode 100644
index 00000000..eacbe7e2
--- /dev/null
+++ b/sources/plugins/liststyle/lang/sv.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'sv', {
6 armenian: 'Armenisk numrering',
7 bulletedTitle: 'Egenskaper för punktlista',
8 circle: 'Cirkel',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal nolla (01, 02, 03, etc.)',
11 disc: 'Disk',
12 georgian: 'Georgisk numrering (an, ban, gan, etc.)',
13 lowerAlpha: 'Alpha gemener (a, b, c, d, e, etc.)',
14 lowerGreek: 'Grekiska gemener (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Romerska gemener (i, ii, iii, iv, v, etc.)',
16 none: 'Ingen',
17 notset: '<ej angiven>',
18 numberedTitle: 'Egenskaper för punktlista',
19 square: 'Fyrkant',
20 start: 'Start',
21 type: 'Typ',
22 upperAlpha: 'Alpha versaler (A, B, C, D, E, etc.)',
23 upperRoman: 'Romerska versaler (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'Listans startnummer måste vara ett heltal.'
25} );
diff --git a/sources/plugins/liststyle/lang/th.js b/sources/plugins/liststyle/lang/th.js
new file mode 100644
index 00000000..3a05e696
--- /dev/null
+++ b/sources/plugins/liststyle/lang/th.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'th', {
6 armenian: 'Armenian numbering',
7 bulletedTitle: 'Bulleted List Properties',
8 circle: 'Circle',
9 decimal: 'Decimal (1, 2, 3, etc.)',
10 decimalLeadingZero: 'Decimal leading zero (01, 02, 03, etc.)',
11 disc: 'Disc',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)',
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)',
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)',
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)',
16 none: 'None',
17 notset: '<not set>',
18 numberedTitle: 'Numbered List Properties',
19 square: 'Square',
20 start: 'Start',
21 type: 'Type',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)',
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)',
24 validateStartNumber: 'List start number must be a whole number.'
25} );
diff --git a/sources/plugins/liststyle/lang/tr.js b/sources/plugins/liststyle/lang/tr.js
new file mode 100644
index 00000000..98bb0838
--- /dev/null
+++ b/sources/plugins/liststyle/lang/tr.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'tr', {
6 armenian: 'Ermenice sayılandırma',
7 bulletedTitle: 'Simgeli Liste Özellikleri',
8 circle: 'Daire',
9 decimal: 'Ondalık (1, 2, 3, vs.)',
10 decimalLeadingZero: 'Başı sıfırlı ondalık (01, 02, 03, vs.)',
11 disc: 'Disk',
12 georgian: 'Gürcüce numaralandırma (an, ban, gan, vs.)',
13 lowerAlpha: 'Küçük Alpha (a, b, c, d, e, vs.)',
14 lowerGreek: 'Küçük Greek (alpha, beta, gamma, vs.)',
15 lowerRoman: 'Küçük Roman (i, ii, iii, iv, v, vs.)',
16 none: 'Yok',
17 notset: '<ayarlanmamış>',
18 numberedTitle: 'Sayılandırılmış Liste Özellikleri',
19 square: 'Kare',
20 start: 'Başla',
21 type: 'Tipi',
22 upperAlpha: 'Büyük Alpha (A, B, C, D, E, vs.)',
23 upperRoman: 'Büyük Roman (I, II, III, IV, V, vs.)',
24 validateStartNumber: 'Liste başlangıcı tam sayı olmalıdır.'
25} );
diff --git a/sources/plugins/liststyle/lang/tt.js b/sources/plugins/liststyle/lang/tt.js
new file mode 100644
index 00000000..4edc7c53
--- /dev/null
+++ b/sources/plugins/liststyle/lang/tt.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'tt', {
6 armenian: 'Әрмән номерлавы',
7 bulletedTitle: 'Маркерлы тезмә үзлекләре',
8 circle: 'Түгәрәк',
9 decimal: 'Унарлы (1, 2, 3, ...)',
10 decimalLeadingZero: 'Ноль белән башланган унарлы (01, 02, 03, ...)',
11 disc: 'Диск',
12 georgian: 'Georgian numbering (an, ban, gan, etc.)', // MISSING
13 lowerAlpha: 'Lower Alpha (a, b, c, d, e, etc.)', // MISSING
14 lowerGreek: 'Lower Greek (alpha, beta, gamma, etc.)', // MISSING
15 lowerRoman: 'Lower Roman (i, ii, iii, iv, v, etc.)', // MISSING
16 none: 'Һичбер',
17 notset: '<билгеләнмәгән>',
18 numberedTitle: 'Номерлы тезмә үзлекләре',
19 square: 'Шакмак',
20 start: 'Башлау',
21 type: 'Төр',
22 upperAlpha: 'Upper Alpha (A, B, C, D, E, etc.)', // MISSING
23 upperRoman: 'Upper Roman (I, II, III, IV, V, etc.)', // MISSING
24 validateStartNumber: 'List start number must be a whole number.' // MISSING
25} );
diff --git a/sources/plugins/liststyle/lang/ug.js b/sources/plugins/liststyle/lang/ug.js
new file mode 100644
index 00000000..27407b7e
--- /dev/null
+++ b/sources/plugins/liststyle/lang/ug.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'ug', {
6 armenian: 'قەدىمكى ئەرمىنىيە تەرتىپ نومۇرى شەكلى',
7 bulletedTitle: 'تۈر بەلگە تىزىم خاسلىقى',
8 circle: 'بوش چەمبەر',
9 decimal: 'سان (1, 2, 3 قاتارلىق)',
10 decimalLeadingZero: 'نۆلدىن باشلانغان سان بەلگە (01, 02, 03 قاتارلىق)',
11 disc: 'تولدۇرۇلغان چەمبەر',
12 georgian: 'قەدىمكى جورجىيە تەرتىپ نومۇرى شەكلى (an, ban, gan قاتارلىق)',
13 lowerAlpha: 'ئىنگلىزچە كىچىك ھەرپ (a, b, c, d, e قاتارلىق)',
14 lowerGreek: 'گرېكچە كىچىك ھەرپ (alpha, beta, gamma قاتارلىق)',
15 lowerRoman: 'كىچىك ھەرپلىك رىم رەقىمى (i, ii, iii, iv, v قاتارلىق)',
16 none: 'بەلگە يوق',
17 notset: '‹تەڭشەلمىگەن›',
18 numberedTitle: 'تەرتىپ نومۇر تىزىم خاسلىقى',
19 square: 'تولدۇرۇلغان تۆت چاسا',
20 start: 'باشلىنىش نومۇرى',
21 type: 'بەلگە تىپى',
22 upperAlpha: 'ئىنگلىزچە چوڭ ھەرپ (A, B, C, D, E قاتارلىق)',
23 upperRoman: 'چوڭ ھەرپلىك رىم رەقىمى (I, II, III, IV, V قاتارلىق)',
24 validateStartNumber: 'تىزىم باشلىنىش تەرتىپ نومۇرى چوقۇم پۈتۈن سان پىچىمىدا بولۇشى لازىم'
25} );
diff --git a/sources/plugins/liststyle/lang/uk.js b/sources/plugins/liststyle/lang/uk.js
new file mode 100644
index 00000000..4d4fc2f9
--- /dev/null
+++ b/sources/plugins/liststyle/lang/uk.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'uk', {
6 armenian: 'Вірменська нумерація',
7 bulletedTitle: 'Опції маркованого списку',
8 circle: 'Кільце',
9 decimal: 'Десяткові (1, 2, 3 і т.д.)',
10 decimalLeadingZero: 'Десяткові з нулем (01, 02, 03 і т.д.)',
11 disc: 'Кружечок',
12 georgian: 'Грузинська нумерація (an, ban, gan і т.д.)',
13 lowerAlpha: 'Малі лат. букви (a, b, c, d, e і т.д.)',
14 lowerGreek: 'Малі гр. букви (альфа, бета, гамма і т.д.)',
15 lowerRoman: 'Малі римські (i, ii, iii, iv, v і т.д.)',
16 none: 'Нема',
17 notset: '<не вказано>',
18 numberedTitle: 'Опції нумерованого списку',
19 square: 'Квадратик',
20 start: 'Почати з...',
21 type: 'Тип',
22 upperAlpha: 'Великі лат. букви (A, B, C, D, E і т.д.)',
23 upperRoman: 'Великі римські (I, II, III, IV, V і т.д.)',
24 validateStartNumber: 'Початковий номер списку повинен бути цілим числом.'
25} );
diff --git a/sources/plugins/liststyle/lang/vi.js b/sources/plugins/liststyle/lang/vi.js
new file mode 100644
index 00000000..ffa0cf8c
--- /dev/null
+++ b/sources/plugins/liststyle/lang/vi.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'vi', {
6 armenian: 'Số theo kiểu Armenian',
7 bulletedTitle: 'Thuộc tính danh sách không thứ tự',
8 circle: 'Khuyên tròn',
9 decimal: 'Kiểu số (1, 2, 3 ...)',
10 decimalLeadingZero: 'Kiểu số (01, 02, 03...)',
11 disc: 'Hình đĩa',
12 georgian: 'Số theo kiểu Georgian (an, ban, gan...)',
13 lowerAlpha: 'Kiểu abc thường (a, b, c, d, e...)',
14 lowerGreek: 'Kiểu Hy Lạp (alpha, beta, gamma...)',
15 lowerRoman: 'Số La Mã kiểu thường (i, ii, iii, iv, v...)',
16 none: 'Không gì cả',
17 notset: '<không thiết lập>',
18 numberedTitle: 'Thuộc tính danh sách có thứ tự',
19 square: 'Hình vuông',
20 start: 'Bắt đầu',
21 type: 'Kiểu loại',
22 upperAlpha: 'Kiểu ABC HOA (A, B, C, D, E...)',
23 upperRoman: 'Số La Mã kiểu HOA (I, II, III, IV, V...)',
24 validateStartNumber: 'Số bắt đầu danh sách phải là một số nguyên.'
25} );
diff --git a/sources/plugins/liststyle/lang/zh-cn.js b/sources/plugins/liststyle/lang/zh-cn.js
new file mode 100644
index 00000000..44ea2e6b
--- /dev/null
+++ b/sources/plugins/liststyle/lang/zh-cn.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'zh-cn', {
6 armenian: '传统的亚美尼亚编号方式',
7 bulletedTitle: '项目列表属性',
8 circle: '空心圆',
9 decimal: '数字 (1, 2, 3, 等)',
10 decimalLeadingZero: '0开头的数字标记(01, 02, 03, 等)',
11 disc: '实心圆',
12 georgian: '传统的乔治亚编号方式(an, ban, gan, 等)',
13 lowerAlpha: '小写英文字母(a, b, c, d, e, 等)',
14 lowerGreek: '小写希腊字母(alpha, beta, gamma, 等)',
15 lowerRoman: '小写罗马数字(i, ii, iii, iv, v, 等)',
16 none: '无标记',
17 notset: '<没有设置>',
18 numberedTitle: '编号列表属性',
19 square: '实心方块',
20 start: '开始序号',
21 type: '标记类型',
22 upperAlpha: '大写英文字母(A, B, C, D, E, 等)',
23 upperRoman: '大写罗马数字(I, II, III, IV, V, 等)',
24 validateStartNumber: '列表开始序号必须为整数格式'
25} );
diff --git a/sources/plugins/liststyle/lang/zh.js b/sources/plugins/liststyle/lang/zh.js
new file mode 100644
index 00000000..9deb441e
--- /dev/null
+++ b/sources/plugins/liststyle/lang/zh.js
@@ -0,0 +1,25 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'liststyle', 'zh', {
6 armenian: '亞美尼亞數字',
7 bulletedTitle: '項目符號清單屬性',
8 circle: '圓圈',
9 decimal: '小數點 (1, 2, 3, etc.)',
10 decimalLeadingZero: '前綴 0 十位數字 (01, 02, 03, 等)',
11 disc: '圓點',
12 georgian: '喬治王時代數字 (an, ban, gan, 等)',
13 lowerAlpha: '小寫字母 (a, b, c, d, e 等)',
14 lowerGreek: '小寫希臘字母 (alpha, beta, gamma, 等)',
15 lowerRoman: '小寫羅馬數字 (i, ii, iii, iv, v 等)',
16 none: '無',
17 notset: '<未設定>',
18 numberedTitle: '編號清單屬性',
19 square: '方塊',
20 start: '開始',
21 type: '類型',
22 upperAlpha: '大寫字母 (A, B, C, D, E 等)',
23 upperRoman: '大寫羅馬數字 (I, II, III, IV, V 等)',
24 validateStartNumber: '清單起始號碼須為一完整數字。'
25} );
diff --git a/sources/plugins/liststyle/plugin.js b/sources/plugins/liststyle/plugin.js
new file mode 100644
index 00000000..04da5dd4
--- /dev/null
+++ b/sources/plugins/liststyle/plugin.js
@@ -0,0 +1,69 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 CKEDITOR.plugins.liststyle = {
8 requires: 'dialog,contextmenu',
9 // jscs:disable maximumLineLength
10 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
11 // jscs:enable maximumLineLength
12 init: function( editor ) {
13 if ( editor.blockless )
14 return;
15
16 var def, cmd;
17
18 def = new CKEDITOR.dialogCommand( 'numberedListStyle', {
19 requiredContent: 'ol',
20 allowedContent: 'ol{list-style-type}[start]'
21 } );
22 cmd = editor.addCommand( 'numberedListStyle', def );
23 editor.addFeature( cmd );
24 CKEDITOR.dialog.add( 'numberedListStyle', this.path + 'dialogs/liststyle.js' );
25
26 def = new CKEDITOR.dialogCommand( 'bulletedListStyle', {
27 requiredContent: 'ul',
28 allowedContent: 'ul{list-style-type}'
29 } );
30 cmd = editor.addCommand( 'bulletedListStyle', def );
31 editor.addFeature( cmd );
32 CKEDITOR.dialog.add( 'bulletedListStyle', this.path + 'dialogs/liststyle.js' );
33
34 //Register map group;
35 editor.addMenuGroup( 'list', 108 );
36
37 editor.addMenuItems( {
38 numberedlist: {
39 label: editor.lang.liststyle.numberedTitle,
40 group: 'list',
41 command: 'numberedListStyle'
42 },
43 bulletedlist: {
44 label: editor.lang.liststyle.bulletedTitle,
45 group: 'list',
46 command: 'bulletedListStyle'
47 }
48 } );
49
50 editor.contextMenu.addListener( function( element ) {
51 if ( !element || element.isReadOnly() )
52 return null;
53
54 while ( element ) {
55 var name = element.getName();
56 if ( name == 'ol' )
57 return { numberedlist: CKEDITOR.TRISTATE_OFF };
58 else if ( name == 'ul' )
59 return { bulletedlist: CKEDITOR.TRISTATE_OFF };
60
61 element = element.getParent();
62 }
63 return null;
64 } );
65 }
66 };
67
68 CKEDITOR.plugins.add( 'liststyle', CKEDITOR.plugins.liststyle );
69} )();
diff --git a/sources/plugins/magicline/dev/magicline.html b/sources/plugins/magicline/dev/magicline.html
new file mode 100644
index 00000000..84e59474
--- /dev/null
+++ b/sources/plugins/magicline/dev/magicline.html
@@ -0,0 +1,594 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Magicline muddy trenches &ndash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <link href="../../../samples/old/sample.css" rel="stylesheet">
12 <style>
13 body {
14 margin: 0 0 130px;
15 }
16 #dev {
17 border-top: 1px solid #555;
18 position: fixed;
19 bottom: 0px;
20 left: 0px;
21 right: 0px;
22 height: 110px;
23 background: #B5E5EE;
24 font-size: 15px;
25 }
26 #dev .hl {
27 color: red;
28 }
29 #tr_upper, #tr_lower {
30 padding: 3px 6px;
31 }
32 #tr_upper {
33 background: rgba(255,0,0,.3);
34 }
35 #tr_lower {
36 background: rgba(0,255,0,.3);
37 }
38
39 #dev p {
40 margin: 0;
41 padding: 0;
42 }
43
44 #timeData,
45 #triggerData,
46 #mouseData,
47 #hiddenData {
48 position: absolute;
49 }
50 #timeData {
51 right: 10px;
52 top: 10px;
53 }
54 #hiddenData {
55 right: 10px;
56 top: 40px;
57 }
58 #mouseData {
59 left: 10px;
60 top: 10px;
61 }
62 #dev h2 {
63 top: 10px;
64 left: 10px;
65 }
66 #triggerData {
67 bottom: 10px;
68 left: 10px;
69 }
70 </style>
71</head>
72<body>
73 <h1 class="samples">
74 CKEditor Sample &mdash; magicline muddy trenches
75 </h1>
76
77 <h2>Various cases</h2>
78 <textarea cols="80" id="editor1" name="editor1" rows="10">
79 <div style="padding: 20px; background: gray; width: 300px" class="1">Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim.</div>
80 <div style="background: violet; padding: 30px" class="static">Position static</div>
81 <dl class="2">
82 <dt>Key</dt><dd>Value</dd>
83 </dl>
84 <div>Whatever</div>
85 <hr id="hr">
86 <div style="
87 display: block;
88 cursor: pointer;
89 background: green;
90 height: 50px; width: 50px;" >aasd
91 </div>
92 <p>Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies</p>
93 <hr>
94 <hr>
95 <p>Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies</p>
96 <table border="1" class="first">
97 <tbody><tr>
98 <td>
99 Table Cell 1
100 </td>
101 </tr>
102 <tr>
103 <td>
104 Table Cell 2<br>
105 Table Cell 2<br>
106 </td>
107 </tr>
108 </tbody>
109 </table>
110 <div style="border: 1px solid red; padding: 50px">
111 Parent
112 <div style="border: 10px solid green; padding: 10px">Child</div>
113 </div>
114 I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body.
115 I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body. I'm in a body.
116 <p>Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies</p>
117 <table border="1" style="margin: 15px 0 100px" class="outer">
118 <tbody>
119 <tr>
120 <td>Table Cell 1</td>
121 <td>Table Cell 1</td>
122 </tr>
123 <tr>
124 <td>
125 <table border="10" class="inner">
126 <tbody>
127 <tr>
128 <td>Table Cell 1</td>
129 </tr>
130 <tr>
131 <td>Table Cell 2<br> Table Cell 2<br></td>
132 </tr>
133 </tbody>
134 </table>
135 </td>
136 </tr>
137 </tbody>
138 </table>
139 <table border="1" style="margin: 15px" class="third">
140 <tbody><tr>
141 <td>
142 Table Cell 1
143 </td>
144 <td>
145 Table Cell 1
146 </td>
147 <td>
148 Table Cell 1
149 </td>
150 <td>
151 Table Cell 1
152 </td>
153 </tr>
154 <tr>
155 <td>
156 Table Cell 2
157 </td>
158 </tr>
159 </tbody>
160 </table>
161 <table border="1" style="margin: 15px" class="fourth">
162 <tbody><tr>
163 <td>
164 Table Cell 1
165 </td>
166 <td>
167 Table Cell 1
168 </td>
169 <td>
170 Table Cell 1
171 </td>
172 <td>
173 Table Cell 1
174 </td>
175 </tr>
176 <tr>
177 <td>
178 Table Cell 2
179 </td>
180 </tr>
181 </tbody>
182 </table>
183 <ul style="" class="fifth">
184 <li name="ul_first">List item</li>
185 <li name="ul_second">
186 <ol style="">
187 <li name="ol_first">Nested item</li>
188 <li>Nested item</li>
189 <li>Nested item</li>
190 </ol>
191 </li>
192 <li>List item</li>
193 </ul>
194 <table border="1" class="table#123">
195 <tbody>
196 <tr>
197 <td>Table Cell 1</td>
198 </tr>
199 <tr>
200 <td>Table Cell 2<br> Table Cell 2<br></td>
201 </tr>
202 </tbody>
203 </table>
204 <table border="1" align="right" class="aligned">
205 <tbody>
206 <tr>
207 <td>Table Cell 1</td>
208 </tr>
209 <tr>
210 <td>Table Cell 2<br> Table Cell 2<br></td>
211 </tr>
212 </tbody>
213 </table>
214 <table border="1" style="float: right" class="floated">
215 <tbody>
216 <tr>
217 <td>Table Cell 1</td>
218 </tr>
219 <tr>
220 <td>Table Cell 2<br> Table Cell 2<br></td>
221 </tr>
222 </tbody>
223 </table>
224 <table border="1" align=""class="table#124">
225 <tbody>
226 <tr>
227 <td>Table Cell 1</td>
228 </tr>
229 <tr>
230 <td>Table Cell 2<br> Table Cell 2<br></td>
231 </tr>
232 </tbody>
233 </table>
234 <table border="1"class="table#125">
235 <tbody>
236 <tr>
237 <td>Table Cell 1</td>
238 </tr>
239 <tr>
240 <td>Table Cell 2<br> Table Cell 2<br></td>
241 </tr>
242 </tbody>
243 </table>
244 <p> enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas male</p>
245 <table border="1"class="table#126">
246 <tbody>
247 <tr>
248 <td>Table Cell 1</td>
249 </tr>
250 <tr>
251 <td>Table Cell 2<br> Table Cell 2<br></td>
252 </tr>
253 </tbody>
254 </table>
255 <div style="background: orange; margin: 20px">Upper div</div>
256 <table style="background: blue; margin: 20px"><tr><td>Lower table</td></tr></table>
257 <p>Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies</p>
258 <div><strong>I'm a div. Let me stay here.</strong></div><dl>
259 <dt>Key</dt>
260 <dd>pendisse a pellentesque dui, non felis</dd>
261 <dt>Key</dt>
262 <dd>pendisse a pellentesque dui, non felis</dd>
263 </dl>
264 <div class="11" style="padding: 20px; background: pink; width: 400px">
265 Parent
266 <div class="12" style="padding: 20px; background: orange">
267 <!-- comment -->
268 <!-- another comment -->
269 <div class="13" style="padding: 20px; background: green">
270 Child#2
271 </div>
272 </div>
273 </div>
274 </textarea>
275
276 <h2>Odd case: first (last) element at the very beginning, short editable</h2>
277 <textarea cols="80" id="editor2" name="editor1a" rows="10">
278 <table border="1" style="width: 300px">
279 <tbody>
280 <tr>
281 <td>
282 Test</td>
283 </tr>
284 </tbody>
285 </table>
286 </textarea>
287
288 <h2>Large document, put everywhere</h2>
289 <textarea id="editor3">
290 <p><div class="navbar" align="center" style="color: rgb(0, 0, 0);font-family: sans-serif;font-size: medium;"><a accesskey="p" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">previous</a>   <a accesskey="n" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/idl-definitions.html" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">next</a>   <a accesskey="c" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/Overview.html#contents" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">contents</a>   <a accesskey="i" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/def-index.html" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">index</a><hr title="Navigation area separator"></div><div class="noprint" style="color: rgb(0, 0, 0);font-family: sans-serif;font-size: medium;text-align: right;"><p style="font-family: monospace;font-size: small;">13 November, 2000</p></div><div class="div1" style="color: rgb(0, 0, 0);font-family: sans-serif;font-size: medium;"><a id="Range" name="Range"></a><h1 id="Range-h1" class="div1" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 27px;font-weight: normal; background-color: violet">2. Document Object Model Range</h1><dl style="background: green"><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><i>Editors</i></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Peter Sharpe, SoftQuad Software Inc.</dd><dd style="margin-top: 0px;margin-bottom: 0px;">Vidur Apparao, Netscape Communications Corp.</dd><dd style="margin-top: 0px;margin-bottom: 0px;">Lauren Wood, SoftQuad Software Inc.</dd></dl><div class="noprint"><h2 id="table-of-contents" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">Table of contents</h2><ul class="toc" style="list-style-type: none;list-style-position: initial;list-style-image: initial;"><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-introduction" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.1. Introduction</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Definitions" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial; background: red">2.2. Definitions and Notation</a><ul class="toc" style="list-style-type: none;list-style-position: initial;list-style-image: initial;"><li class="tocline4" style="font-style: italic;"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.2.1. Position</a></li><li class="tocline4" style="font-style: italic;"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Containment" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.2.2. Selection and Partial Selection</a></li><li class="tocline4" style="font-style: italic;"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Notation" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.2.3. Notation</a></li></ul></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Creating" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.3. Creating a Range</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Changing" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.4. Changing a Range's Position</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.5. Comparing Range Boundary-Points</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Deleting-Content" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.6. Deleting Content with a Range</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Extracting" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.7. Extracting Content</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Cloning" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.8. Cloning Content</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Inserting" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.9. Inserting Content</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Surrounding" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.10. Surrounding Content</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Misc" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.11. Miscellaneous Members</a></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.12. Range modification under document mutation</a><ul class="toc" style="list-style-type: none;list-style-position: initial;list-style-image: initial;"><li class="tocline4" style="font-style: italic;"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Insertions" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.12.1. Insertions</a></li><li class="tocline4" style="font-style: italic;"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Deletions" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.12.2. Deletions</a></li></ul></li><li class="tocline3"><a class="tocxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Interface" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">2.13. Formal Description of the Range Interface</a><ul class="toc" style="list-style-type: none;list-style-position: initial;list-style-image: initial;"><li class="tocline4" style="font-style: italic;"><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">Range</a>, <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-DocumentRange-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">DocumentRange</a>, <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">RangeException</a>, <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeExceptionCode" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">RangeExceptionCode</a></li></ul></li></ul></div><div class="div2"><a id="Level-2-Range-introduction" name="Level-2-Range-introduction"></a><h2 id="Level-2-Range-introduction-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.1. Introduction</h2><p>A Range identifies a range of content in a Document, DocumentFragment or Attr. It is contiguous in the sense that it can be characterized as selecting all of the content between a pair of boundary-points.</p><p><b>Note:</b> In a text editor or a word processor, a user can make a selection by pressing down the mouse at one point in a document, moving the mouse to another point, and releasing the mouse. The resulting selection is contiguous and consists of the content between the two points.</p><p>The term 'selecting' does not mean that every Range corresponds to a selection made by a GUI user;however, such a selection can be returned to a DOM user as a Range.</p><p><b>Note:</b> In bidirectional writing (Arabic, Hebrew), a range may correspond to a logical selection that is not necessarily contiguous when displayed. A visually contiguous selection, also used in some cases, may not correspond to a single logical selection, and may therefore have to be represented by more than one range.</p><p>The Range interface provides methods for accessing and manipulating the document tree at a higher level than similar methods in the Node interface. The expectation is that each of the methods provided by the Range interface for the insertion, deletion and copying of content can be directly mapped to a series of Node editing operations enabled by DOM Core. In this sense, the Range operations can be viewed as convenience methods that also enable the implementation to optimize common editing patterns.</p><p>This chapter describes the Range interface, including methods for creating and moving a Range and methods for manipulating content with Ranges.</p><p>The interfaces found within this section are not mandatory. A DOM application may use the <code>hasFeature(feature, version)</code> method of the <code>DOMImplementation</code> interface with parameter values "Range" and "2.0" (respectively) to determine whether or not this module is supported by the implementation. In order to fully support this module, an implementation must also support the "Core" feature defined defined in the DOM Level 2 Core specification [<a class="noxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/references.html#DOMCore" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">DOM Level 2 Core</a>]. Please refer to additional information about <a href="http://www.w3.org/TR/DOM-Level-2-Core/introduction.html#ID-Conformance" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>conformance</em></a> in the DOM Level 2 Core specification [<a class="noxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/references.html#DOMCore" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">DOM Level 2 Core</a>].</p></div><div class="div2" style="background: blue;"><a id="Level-2-Range-Definitions" name="Level-2-Range-Definitions"></a><h2 id="Level-2-Range-Definitions-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal; background: red">2.2. Definitions and Notation</h2><div style="background: yellow" class="div3"><a id="Level-2-Range-Position" name="Level-2-Range-Position"></a><h3 id="Level-2-Range-Position-h3" class="div3" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 19px;font-weight: normal;">2.2.1. Position</h3><p>This chapter refers to two different representations of a document: the text or source form that includes the document markup and the tree representation similar to the one described in the introduction section of the DOM Level 2 Core [<a class="noxref" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/references.html#DOMCore" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">DOM Level 2 Core</a>].</p><p>A Range consists of two <i>boundary-points</i> corresponding to the start and the end of the Range. <a id="td-boundarypoint" name="td-boundarypoint"></a>A boundary-point's position in a Document or DocumentFragment tree can be characterized by a node and an offset. <a id="td-container" name="td-container"></a>The node is called the <i>container</i> of the boundary-point and of its position. <a id="td-ancestor-container" name="td-ancestor-container"></a>The container and its ancestors are the <i>ancestor container</i>s of the boundary-point and of its position.<a id="td-offset" name="td-offset"></a>The offset within the node is called the <i>offset</i> of the boundary-point and its position. If the container is an Attr, Document, DocumentFragment, Element or EntityReference node, the offset is between its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-child" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>child</em></a> nodes. If the container is a CharacterData, Comment or ProcessingInstruction node, the offset is between the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-16-bit-unit" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>16-bit units</em></a> of the UTF-16 encoded string contained by it.</p><p>The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-points</em></a> of a Range must have a common <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> which is either a Document, DocumentFragment or Attr node. That is, the content of a Range must be entirely within the subtree rooted by a single Document, DocumentFragment or Attr Node. <a id="td-root-container" name="td-root-container"></a>This common <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> is known as the <i>root container</i> of the Range. <a id="td-context-tree" name="td-context-tree"></a>The tree rooted by the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-root-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>root container</em></a> is known as the Range's <i>context tree</i>.</p><p>The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of a <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of a Range must be an Element, Comment, ProcessingInstruction, EntityReference, CDATASection, Document, DocumentFragment, Attr, or Text node. None of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a>s of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of a Range can be a DocumentType, Entity or Notation node.</p><p>In terms of the text representation of a document, the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-points</em></a> of a Range can only be on token boundaries. That is, the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of the text range cannot be in the middle of a start- or end-tag of an element or within the name of an entity or character reference. A Range locates a contiguous portion of the content of the structure model.</p><p>The relationship between locations in a text representation of the document and in the Node tree interface of the DOM is illustrated in the following diagram:<br></p><div align="center"><hr width="90%" size="2"><img src="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/images/RangeExample.gif" alt="Range Example"><hr width="90%" size="2"><b>Range Example</b><hr width="90%" size="2"></div><p>In this diagram, four different Ranges are illustrated. The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-points</em></a> of each Range are labelled with <i>s#</i> (the start of the Range) and <i>e#</i> (the end of the Range), where # is the number of the Range. For Range 2, the start is in the BODY element and is immediately after the H1 element and immediately before the P element, so its position is between the H1 and P children of BODY. The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of a <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> whose <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> is not a CharacterData node is 0 if it is before the first child, 1 if between the first and second child, and so on. So, for the start of the Range 2, the<a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> is BODY and the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> is 1. The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of a <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> whose <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> is a CharacterData node is obtained similarly but using <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-16-bit-unit" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>16-bit unit</em></a> positions instead. For example, the<a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> labelled s1 of the Range 1 has a Text node (the one containing "Title") as its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> and an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of 2 since it is between the second and third <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-16-bit-unit" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>16-bit unit</em></a>.</p><p>Notice that the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s of Ranges 3 and 4 correspond to the same location in the text representation. An important feature of the Range is that a <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of a Range can unambiguously represent every position within the document tree.</p><p>The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>s and <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a>s of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s can be obtained through the following read-only Range attributes:</p><div class="eg"><pre style="margin-left: 2em;"> readonly attribute Node startContainer;readonly attribute long startOffset;readonly attribute Node endContainer;readonly attribute long endOffset;</pre></div><p><a id="td-collapsed" name="td-collapsed"></a>If the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s of a Range have the same <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>s and <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a>s, the Range is said to be a <i>collapsed</i> Range. (This is often referred to as an insertion point in a user agent.)</p></div><div class="div3"><a id="Level-2-Range-Containment" name="Level-2-Range-Containment"></a><h3 id="Level-2-Range-Containment-h3" class="div3" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 19px;font-weight: normal;">2.2.2. Selection and Partial Selection</h3><p><a id="td-selected" name="td-selected"></a>A node or <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-16-bit-unit" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>16-bit unit</em></a> unit is said to be <i>selected</i> by a Range if it is between the two <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s of the Range, that is, if the position immediately before the node or 16-bit unit is before the end of the Range and the position immediately after the node or 16-bit unit is after the start of the range. For example, in terms of a text representation of the document, an element would be <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>selected</em></a>by a Range if its corresponding start-tag was located after the start of the Range and its end-tag was located before the end of the Range. In the examples in the above diagram, the Range 2<a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>selects</em></a> the P node and the Range 3 <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>selects</em></a> the text node containing the text "Blah xyz."</p><p><a id="td-partially-selected" name="td-partially-selected"></a>A node is said to be <i>partially selected</i> by a Range if it is an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of exactly one <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of the Range. For example, consider Range 1 in the above diagram. The element H1 is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selected</em></a> by that Range since the start of the Range is within one of its children.</p></div><div class="div3"><a id="Level-2-Range-Notation" name="Level-2-Range-Notation"></a><h3 id="Level-2-Range-Notation-h3" class="div3" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 19px;font-weight: normal;">2.2.3. Notation</h3><p>Many of the examples in this chapter are illustrated using a text representation of a document. The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s of a Range are indicated by displaying the characters (be they markup or data characters) between the two <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s in bold, as in</p><div class="eg"><pre style="margin-left: 2em;"> <FOO>A<b>BC<BAR>DE</b>F</BAR></FOO></pre></div><p>When both <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s are at the same position, they are indicated with a bold caret ('<b>^</b>'), as in</p><div class="eg"><pre style="margin-left: 2em;"> <FOO>A<b>^</b>BC<BAR>DEF</BAR></FOO></pre></div></div></div><div class="div2"><a id="Level-2-Range-Creating" name="Level-2-Range-Creating"></a><h2 id="Level-2-Range-Creating-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.3. Creating a Range</h2><p>A Range is created by calling the <code>createRange()</code> method on the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-DocumentRange-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>DocumentRange</code></a> interface. This interface can be obtained from the object implementing the <code>Document</code> interface using binding-specific casting methods.</p><div class="eg"><pre style="margin-left: 2em;"> interface DocumentRange{Range createRange();}</pre></div><p>The initial state of the Range returned from this method is such that both of its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a>s are positioned at the beginning of the corresponding Document, before any content. In other words, the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of each <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> is the Document node and the offset within that node is 0.</p><p>Like some objects created using methods in the Document interface (such as Nodes and DocumentFragments), Ranges created via a particular document instance can select only content associated with that Document, or with DocumentFragments and Attrs for which that Document is the <code>ownerDocument</code>. Such Ranges, then, can not be used with other Document instances.</p></div><div class="div2"><a id="Level-2-Range-Changing" name="Level-2-Range-Changing"></a><h2 id="Level-2-Range-Changing-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.4. Changing a Range's Position</h2><p>A Range's position can be specified by setting the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> and <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of each boundary-point with the <code>setStart</code> and <code>setEnd</code> methods.</p><div class="eg"><pre style="margin-left: 2em;"> void setStart(in Node parent, in long offset) raises(RangeException);void setEnd(in Node parent, in long offset) raises(RangeException);</pre></div><p>If one boundary-point of a Range is set to have a <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-root-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>root container</em></a> other than the current one for the Range, the Range is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a> to the new position. This enforces the restriction that both boundary-points of a Range must have the same <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-root-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>root container</em></a>.</p><p>The start position of a Range is guaranteed to never be after the end position. To enforce this restriction, if the start is set to be at a position after the end, the Range is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a> to that position. Similarly, if the end is set to be at a position before the start, the Range is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a> to that position.</p><p>It is also possible to set a Range's position relative to nodes in the tree:</p><div class="eg"><pre style="margin-left: 2em;"> void setStartBefore(in Node node);raises(RangeException);void setStartAfter(in Node node);raises(RangeException);void setEndBefore(in Node node);raises(RangeException);void setEndAfter(in Node node);raises(RangeException);</pre></div><p>The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-parent" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>parent</em></a> of the node becomes the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> and the Range is subject to the same restrictions as given above in the description of <code>setStart()</code>and <code>setEnd()</code>.</p><p>A Range can be <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a> to either boundary-point:</p><div class="eg"><pre style="margin-left: 2em;"> void collapse(in boolean toStart);</pre></div><p>Passing <code>TRUE</code> as the parameter <code>toStart</code> will <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapse</em></a> the Range to its start, <code>FALSE</code> to its end.</p><p>Testing whether a Range is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a> can be done by examining the <code>collapsed</code> attribute:</p><div class="eg"><pre style="margin-left: 2em;"> readonly attribute boolean collapsed;</pre></div><p>The following methods can be used to make a Range select the contents of a node or the node itself.</p><div class="eg"><pre style="margin-left: 2em;"> void selectNode(in Node n);void selectNodeContents(in Node n);</pre></div><p>The following examples demonstrate the operation of the methods <code>selectNode</code> and <code>selectNodeContents</code>:</p><div class="eg"><pre style="margin-left: 2em;">Before: <b>^</b><BAR><FOO>A<MOO>B</MOO>C</FOO></BAR>After Range.selectNodeContents(FOO): <BAR><FOO><b>A<MOO>B</MOO>C</b></FOO></BAR>(In this case, FOO is the parent of both boundary-points)After Range.selectNode(FOO):<BAR><b><FOO>A<MOO>B</MOO>C</FOO></b></BAR></pre></div></div><div class="div2"><a id="Level-2-Range-Comparing" name="Level-2-Range-Comparing"></a><h2 id="Level-2-Range-Comparing-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.5. Comparing Range Boundary-Points</h2><p>It is possible to compare two Ranges by comparing their boundary-points:</p><div class="eg"><pre style="margin-left: 2em;"> short compareBoundaryPoints(in CompareHow how, in Range sourceRange) raises(RangeException);</pre></div><p>where <code>CompareHow</code> is one of four values: <code>START_TO_START</code>, <code>START_TO_END</code>, <code>END_TO_END</code> and <code>END_TO_START</code>. The return value is -1, 0 or 1 depending on whether the corresponding boundary-point of the Range is before, equal to, or after the corresponding boundary-point of <code>sourceRange</code>. An exception is thrown if the two Ranges have different <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-root-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>root container</em></a>s.</p><p>The result of comparing two boundary-points (or positions) is specified below. An informal but not always correct specification is that an boundary-point is before, equal to, or after another if it corresponds to a location in a text representation before, equal to, or after the other's corresponding location.</p><p><a id="td-comparison" name="td-comparison"></a>Let A and B be two boundary-points or positions. Then one of the following holds: A is <i>before</i> B, A is <i>equal to</i> B, or A is <i>after</i> B. Which one holds is specified in the following by examining four cases:</p><p>In the first case the boundary-points have the same <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>. A is <i>before</i> B if its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> is less than the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of B, A is <i>equal to</i> B if its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> is equal to the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of B, and A is <i>after</i> B if its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> is greater than the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of B.</p><p>In the second case a child node C of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of A is an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of B. In this case, A is <i>before</i> B if the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of A is less than or equal to the index of the child node C and A is <i>after</i>B otherwise.</p><p>In the third case a child node C of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of B is an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of A. In this case, A is <i>before</i> B if the index of the child node C is less than the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of B and A is <i>after</i> B otherwise.</p><p>In the fourth case, none of three other cases hold: the containers of A and B are <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-sibling" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>siblings</em></a> or <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-descendant" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>descendants</em></a> of sibling nodes. In this case, A is <i>before</i> B if the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of A is before the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of B in a pre-order traversal of the Ranges' <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a> and A is <i>after</i> B otherwise.</p><p>Note that because the same location in a text representation of the document can correspond to two different positions in the DOM tree, it is possible for two boundary-points to not compare equal even though they would be equal in the text representation. For this reason, the informal definition above can sometimes be incorrect.</p></div><div class="div2"><a id="Level-2-Range-Deleting-Content" name="Level-2-Range-Deleting-Content"></a><h2 id="Level-2-Range-Deleting-Content-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.6. Deleting Content with a Range</h2><p>One can delete the contents selected by a Range with:</p><div class="eg"><pre style="margin-left: 2em;"> void deleteContents();</pre></div><p><code>deleteContents()</code> deletes all nodes and characters selected by the Range. All other nodes and characters remain in the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a> of the Range. Some examples of this deletion operation are:</p><div class="eg"><pre style="margin-left: 2em;">(1) <FOO>A<b>B<MOO>CD</MOO></b>CD</FOO>--><FOO>A<b>^</b>CD</FOO></pre></div><div class="eg"><pre style="margin-left: 2em;">(2) <FOO>A<MOO>B<b>C</MOO>D</b>E</FOO>--><FOO>A<MOO>B</MOO><b>^</b>E</FOO></pre></div><div class="eg"><pre style="margin-left: 2em;">(3) <FOO>X<b>Y<BAR>Z</b>W</BAR>Q</FOO>--><FOO>X<b>^</b><BAR>W</BAR>Q</FOO></pre></div><div class="eg"><pre style="margin-left: 2em;">(4) <FOO><BAR1>A<b>B</BAR1><BAR2/><BAR3>C</b>D</BAR3></FOO>--><FOO><BAR1>A</BAR1><b>^</b><BAR3>D</BAR3></pre></div><p>After <code>deleteContents()</code> is invoked on a Range, the Range is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a>. If no node was <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selected</em></a> by the Range, then it is <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a> to its original start point, as in example (1). If a node was <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selected</em></a> by the Range and was an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of the start of the Range and no <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-ancestor" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor</em></a> of the node satisfies these two conditions, then the Range is collapsed to the position immediately after the node, as in examples (2) and (4). If a node was <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selected</em></a> by the Range and was an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of the end of the Range and no ancestor of the node satisfies these two conditions, then the Range is collapsed to the position immediately before the node, as in examples (3) and (4).</p><p>Note that if deletion of a Range leaves adjacent Text nodes, they are not automatically merged, and empty Text nodes are not automatically removed. Two Text nodes should be joined only if each is the container of one of the boundary-points of a Range whose contents are deleted. To merge adjacent Text nodes, or remove empty text nodes, the <code>normalize()</code> method on the <code>Node</code>interface should be used.</p></div><div class="div2"><a id="Level-2-Range-Extracting" name="Level-2-Range-Extracting"></a><h2 id="Level-2-Range-Extracting-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.7. Extracting Content</h2><p>If the contents of a Range need to be extracted rather than deleted, the following method may be used:</p><div class="eg"><pre style="margin-left: 2em;"> DocumentFragment extractContents();</pre></div><p>The <code>extractContents()</code> method removes nodes from the Range's <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a> similarly to the <code>deleteContents()</code> method. In addition, it places the deleted contents in a new <code>DocumentFragment</code>. The following examples illustrate the contents of the returned DocumentFragment:</p><div class="eg"><pre style="margin-left: 2em;">(1) <FOO>A<b>B<MOO>CD</MOO></b>CD</FOO>-->B<MOO>CD</MOO></pre></div><div class="eg"><pre style="margin-left: 2em;">(2) <FOO>A<MOO>B<b>C</MOO>D</b>E</FOO>--><MOO>C<MOO>D</pre></div><div class="eg"><pre style="margin-left: 2em;">(3) <FOO>X<b>Y<BAR>Z</b>W</BAR>Q</FOO>-->Y<BAR>Z</BAR></pre></div><div class="eg"><pre style="margin-left: 2em;">(4)<FOO><BAR1>A<b>B</BAR1><BAR2/><BAR3>C</b>D</BAR3></FOO>--><BAR1>B</BAR1><BAR2/><BAR3>C</BAR3></pre></div><p>It is important to note that nodes that are <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selected</em></a> by the Range are cloned. Since part of such a node's contents must remain in the Range's <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a> and part of the contents must be moved to the new DocumentFragment, a clone of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selected</em></a> node is included in the new DocumentFragment. Note that cloning does not take place for <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>selected</em></a> elements;these nodes are moved to the new DocumentFragment.</p></div><div class="div2"><a id="Level-2-Range-Cloning" name="Level-2-Range-Cloning"></a><h2 id="Level-2-Range-Cloning-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.8. Cloning Content</h2><p>The contents of a Range may be duplicated using the following method:</p><div class="eg"><pre style="margin-left: 2em;"> DocumentFragment cloneContents();</pre></div><p>This method returns a <code>DocumentFragment</code> that is similar to the one returned by the method <code>extractContents()</code>. However, in this case, the original nodes and character data in the Range are not removed from the Range's <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a>. Instead, all of the nodes and text content within the returned <code>DocumentFragment</code> are cloned.</p></div><div class="div2"><a id="Level-2-Range-Inserting" name="Level-2-Range-Inserting"></a><h2 id="Level-2-Range-Inserting-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.9. Inserting Content</h2><p>A node may be inserted into a Range using the following method:</p><div class="eg"><pre style="margin-left: 2em;"> void insertNode(in Node n) raises(RangeException);</pre></div><p>The <code>insertNode()</code> method inserts the specified node into the Range's <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a>. The node is inserted at the start <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of the Range, without modifying it.</p><p>If the start boundary point of the Range is in a <code>Text</code> node, the <code>insertNode</code> operation splits the <code>Text</code> node at the boundary point. If the node to be inserted is also a <code>Text</code> node, the resulting adjacent<code>Text</code> nodes are not normalized automatically;this operation is left to the application.</p><p>The Node passed into this method can be a <code>DocumentFragment</code>. In that case, the contents of the <code>DocumentFragment</code> are inserted at the start <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>boundary-point</em></a> of the Range, but the <code>DocumentFragment</code>itself is not. Note that if the Node represents the root of a sub-tree, the entire sub-tree is inserted.</p><p>The same rules that apply to the <code>insertBefore()</code> method on the Node interface apply here. Specifically, the Node passed in, if it already has a parent, will be removed from its existing position.</p></div><div class="div2"><a id="Level-2-Range-Surrounding" name="Level-2-Range-Surrounding"></a><h2 id="Level-2-Range-Surrounding-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.10. Surrounding Content</h2><p>The insertion of a single node to subsume the content selected by a Range can be performed with:</p><div class="eg"><pre style="margin-left: 2em;"> void surroundContents(in Node newParent);</pre></div><p>The <code>surroundContents()</code> method causes all of the content selected by the Range to be rooted by the specified node. The nodes may not be Attr, Entity, DocumentType, Notation, Document, or DocumentFragment nodes. Calling <code>surroundContents()</code> with the Element node FOO in the following examples yields:</p><div class="eg"><pre style="margin-left: 2em;"> Before: <BAR>A<b>B<MOO>C</MOO>D</b>E</BAR>After surroundContents(FOO):<BAR>A<b><FOO>B<MOO>C</MOO>D</FOO></b>E</BAR></pre></div><p>Another way of describing the effect of this method on the Range's <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-context-tree" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>context tree</em></a> is to decompose it in terms of other operations:</p><ol><li>Remove the contents selected by the Range with a call to <code>extractContents()</code>.</li><li>Insert the node <code>newParent</code> where the Range is collapsed (after the extraction) with <code>insertNode().</code></li><li>Insert the entire contents of the extracted DocumentFragment into <code>newParent</code>. Specifically, invoke the <code>appendChild()</code> on <code>newParent</code> passing in the DocumentFragment returned as a result of the call to <code>extractContents()</code></li><li>Select <code>newParent</code> and all of its contents with <code>selectNode()</code>.</li></ol><p>The <code>surroundContents()</code> method raises an exception if the Range <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selects</em></a> a non-Text node. An example of a Range for which <code>surroundContents()</code>raises an exception is:</p><div class="eg"><pre style="margin-left: 2em;"> <FOO>A<b>B<BAR>C</b>D</BAR>E</FOO></pre></div><p>If the node <code>newParent</code> has any children, those children are removed before its insertion. Also, if the node <code>newParent</code> already has a parent, it is removed from the original parent's <code>childNodes</code> list.</p></div><div class="div2"><a id="Level-2-Range-Misc" name="Level-2-Range-Misc"></a><h2 id="Level-2-Range-Misc-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.11. Miscellaneous Members</h2><p>One can clone a Range:</p><div class="eg"><pre style="margin-left: 2em;"> Range cloneRange();</pre></div><p>This creates a new Range which selects exactly the same content as that selected by the Range on which the method <code>cloneRange</code> was invoked. No content is affected by this operation.</p><p>Because the boundary-points of a Range do not necessarily have the same <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>s, use:</p><div class="eg"><pre style="margin-left: 2em;"> readonly attribute Node commonAncestorContainer;</pre></div><p>to get the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of both boundary-points that is furthest down from the Range's <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-root-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>root container</em></a></p><p>One can get a copy of all the character data selected or partially selected by a Range with:</p><div class="eg"><pre style="margin-left: 2em;"> DOMString toString();</pre></div><p>This does nothing more than simply concatenate all the character data selected by the Range. This includes character data in both <code>Text</code> and <code>CDATASection</code> nodes.</p></div><div class="div2"><a id="Level-2-Range-Mutation" name="Level-2-Range-Mutation"></a><h2 id="Level-2-Range-Mutation-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.12. Range modification under document mutation</h2><p>As a document is modified, the Ranges within the document need to be updated. For example, if one boundary-point of a Range is within a node and that node is removed from the document, then the Range would be invalid unless it is fixed up in some way. This section describes how Ranges are modified under document mutations so that they remain valid.</p><p>There are two general principles which apply to Ranges under document mutation: The first is that all Ranges in a document will remain valid after any mutation operation and the second is that, as much as possible, all Ranges will select the same portion of the document after any mutation operation.</p><p>Any mutation of the document tree which affect Ranges can be considered to be a combination of basic deletion and insertion operations. In fact, it can be convenient to think of those operations as being accomplished using the <code>deleteContents()</code> and <code>insertNode()</code> Range methods and, in the case of Text mutations, the <code>splitText()</code> and <code>normalize()</code> methods.</p><div class="div3"><a id="Level-2-Range-Insertions" name="Level-2-Range-Insertions"></a><h3 id="Level-2-Range-Insertions-h3" class="div3" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 19px;font-weight: normal;">2.12.1. Insertions</h3><p>An insertion occurs at a single point, the insertion point, in the document. For any Range in the document tree, consider each boundary-point. The only case in which the boundary-point will be changed after the insertion is when the boundary-point and the insertion point have the same <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> and the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of the insertion point is strictly less than the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of the Range's boundary-point. In that case the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of the Range's boundary-point will be increased so that it is between the same nodes or characters as it was before the insertion.</p><p>Note that when content is inserted at a boundary-point, it is ambiguous as to where the boundary-point should be repositioned if its relative position is to be maintained. There are two possibilities: at the start or at the end of the newly inserted content. We have chosen that in this case neither the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> nor <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-offset" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>offset</em></a> of the boundary-point is changed. As a result, the boundary-point will be positioned at the start of the newly inserted content.</p><p><em>Examples:</em></p><p>Suppose the Range selects the following:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd efgh X<b>Y blah i</b>jkl</P></pre></div><p>Consider the insertion of the text "<i>inserted text</i>" at the following positions:</p><div class="eg"><pre style="margin-left: 2em;">1. Before the 'X':<P>Abcd efgh <i>inserted text</i>X<b>Y blah i</b>jkl</P>2. After the 'X':<P>Abcd efgh X<b><i>inserted text</i>Y blah i</b>jkl</P>3. After the 'Y':<P>Abcd efgh X<b>Y<i>inserted text</i> blah i</b>jkl</P>4. After the 'h' in "Y blah":<P>Abcd efgh X<b>Y blah<i>inserted text</i> i</b>jkl</P></pre></div></div><div class="div3"><a id="Level-2-Range-Deletions" name="Level-2-Range-Deletions"></a><h3 id="Level-2-Range-Deletions-h3" class="div3" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 19px;font-weight: normal;">2.12.2. Deletions</h3><p>Any deletion from the document tree can be considered as a sequence of <code>deleteContents()</code> operations applied to a minimal set of disjoint Ranges. To specify how a Range is modified under deletions we need only consider what happens to a Range under a single <code>deleteContents()</code>operation of another Range. And, in fact, we need only consider what happens to a single boundary-point of the Range since both boundary-points are modified using the same algorithm.</p><p>If a boundary-point of the original Range is within the content being deleted, then after the deletion it will be at the same position as the resulting boundary-point of the (now <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-collapsed" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>collapsed</em></a>) Range used to delete the contents.</p><p>If a boundary-point is after the content being deleted then it is not affected by the deletion unless its <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> is also the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of one of the boundary-points of the Range being deleted. If there is such a common <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>, then the index of the boundary-point is modified so that the boundary-point maintains its position relative to the content of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>.</p><p>If a boundary-point is before the content being deleted then it is not affected by the deletion at all.</p><p><em>Examples:</em></p><p>In these examples, the Range on which <code>deleteContents()</code>is invoked is indicated by the underline.</p><p><em>Example 1.</em></p><p>Before:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd <u>efgh T</u><b><u>he</u> Range i</b>jkl</P></pre></div><p>After:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd <b>Range i</b>jkl</P></pre></div><p><em>Example 2.</em></p><p>Before:</p><div class="eg"><pre style="margin-left: 2em;"><p>Abcd <u>efgh T<b>he Range i</b>j</u>kl</p></pre></div><p>After:</p><div class="eg"><pre style="margin-left: 2em;"><p>Abcd <b>^</b>kl</p></pre></div><p><em>Example 3.</em></p><p>Before:</p><div class="eg"><pre style="margin-left: 2em;"><P>ABCD <u>efgh T</u><b><u>he <EM>R</u>ange</b></EM>ijkl</P></pre></div><p>After:</p><div class="eg"><pre style="margin-left: 2em;"><P>ABCD <EM><b>ange</b></EM>ijkl</P></pre></div><p>In this example, the container of the start boundary-point after the deletion is the Text node holding the string "ange".</p><p><em>Example 4.</em></p><p>Before:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd <u>efgh T</u><b>he Range i</b>jkl</P></pre></div><p>After:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd <b>he Range i</b>jkl</P></pre></div><p><em>Example 5.</em></p><p>Before:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd <u><EM>efgh T<b>he Range i</b>j</EM></u>kl</P></pre></div><p>After:</p><div class="eg"><pre style="margin-left: 2em;"><P>Abcd <b>^</b>kl</P></pre></div></div></div><div class="div2"><a id="Level-2-Range-Interface" name="Level-2-Range-Interface"></a><h2 id="Level-2-Range-Interface-h2" class="div2" style="text-align: left;color: rgb(0, 90, 156);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: white;font-size: 22px;font-weight: normal;">2.13. Formal Description of the Range Interface</h2><p>To summarize, the complete, formal description of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>Range</code></a> interface is given below:</p><dl ><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Interface <i><a id="Level-2-Range-idl" name="Level-2-Range-idl">Range</a></i></b> (introduced in <b class="since">DOM Level 2</b>)</dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><br><b>IDL Definition</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="idl-code" style="font-family: monospace;border-top-width: 1px;border-right-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-top-style: solid;border-right-style: solid;border-bottom-style: solid;border-left-style: solid;border-top-color: black;border-right-color: black;border-bottom-color: black;border-left-color: black;border-image: initial;white-space: pre;background-color: rgb(223, 223, 223);"><pre style="margin-left: 2em;">// Introduced in DOM Level 2:interface Range{readonly attribute Node startContainer;// raises(DOMException) on retrieval readonly attribute long startOffset;// raises(DOMException) on retrieval readonly attribute Node endContainer;// raises(DOMException) on retrieval readonly attribute long endOffset;// raises(DOMException) on retrieval readonly attribute boolean collapsed;// raises(DOMException) on retrieval readonly attribute Node commonAncestorContainer;// raises(DOMException) on retrieval void setStart(in Node refNode, in long offset) raises(RangeException, DOMException);void setEnd(in Node refNode, in long offset) raises(RangeException, DOMException);void setStartBefore(in Node refNode) raises(RangeException, DOMException);void setStartAfter(in Node refNode) raises(RangeException, DOMException);void setEndBefore(in Node refNode) raises(RangeException, DOMException);void setEndAfter(in Node refNode) raises(RangeException, DOMException);void collapse(in boolean toStart) raises(DOMException);void selectNode(in Node refNode) raises(RangeException, DOMException);void selectNodeContents(in Node refNode) raises(RangeException, DOMException);// CompareHow const unsigned short START_TO_START=0;const unsigned short START_TO_END=1;const unsigned short END_TO_END=2;const unsigned short END_TO_START=3;short compareBoundaryPoints(in unsigned short how, in Range sourceRange) raises(DOMException);void deleteContents() raises(DOMException);DocumentFragment extractContents() raises(DOMException);DocumentFragment cloneContents() raises(DOMException);void insertNode(in Node newNode) raises(DOMException, RangeException);void surroundContents(in Node newParent) raises(DOMException, RangeException);Range cloneRange() raises(DOMException);DOMString toString() raises(DOMException);void detach() raises(DOMException);};</pre></div><br></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Definition group <i><a id="Level2-Range-compareHow" name="Level2-Range-compareHow">CompareHow</a></i></b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><p>Passed as a parameter to the <code>compareBoundaryPoints</code> method.</p><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Defined Constants</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="constant-name" style="background-color: rgb(221, 255, 210);">END_TO_END</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Compare end boundary-point of <code>sourceRange</code> to end boundary-point of Range on which <code>compareBoundaryPoints</code> is invoked.</dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="constant-name" style="background-color: rgb(221, 255, 210);">END_TO_START</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Compare end boundary-point of <code>sourceRange</code> to start boundary-point of Range on which <code>compareBoundaryPoints</code> is invoked.</dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="constant-name" style="background-color: rgb(221, 255, 210);">START_TO_END</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Compare start boundary-point of <code>sourceRange</code> to end boundary-point of Range on which <code>compareBoundaryPoints</code> is invoked.</dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="constant-name" style="background-color: rgb(221, 255, 210);">START_TO_START</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Compare start boundary-point of <code>sourceRange</code> to start boundary-point of Range on which <code>compareBoundaryPoints</code> is invoked.</dd></dl></dd></dl></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Attributes</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="attribute-name" style="background-color: rgb(255, 255, 210);"><a id="Level-2-Range-attr-collapsed" name="Level-2-Range-attr-collapsed">collapsed</a></code> of type <code>boolean</code>, readonly</dt><dd style="margin-top: 0px;margin-bottom: 0px;">TRUE if the Range is collapsed<br><div class="exceptions"><b>Exceptions on retrieval</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="attribute-name" style="background-color: rgb(255, 255, 210);"><a id="Level-2-Range-attr-commonParent" name="Level-2-Range-attr-commonParent">commonAncestorContainer</a></code> of type <code>Node</code>, readonly</dt><dd style="margin-top: 0px;margin-bottom: 0px;">The <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-deepest" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>deepest</em></a> common <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of the Range's two boundary-points.<br><div class="exceptions"><b>Exceptions on retrieval</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="attribute-name" style="background-color: rgb(255, 255, 210);"><a id="Level-2-Range-attr-endParent" name="Level-2-Range-attr-endParent">endContainer</a></code> of type <code>Node</code>, readonly</dt><dd style="margin-top: 0px;margin-bottom: 0px;">Node within which the Range ends<br><div class="exceptions"><b>Exceptions on retrieval</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="attribute-name" style="background-color: rgb(255, 255, 210);"><a id="Level-2-Range-attr-endOffset" name="Level-2-Range-attr-endOffset">endOffset</a></code> of type <code>long</code>, readonly</dt><dd style="margin-top: 0px;margin-bottom: 0px;">Offset within the ending node of the Range.<br><div class="exceptions"><b>Exceptions on retrieval</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="attribute-name" style="background-color: rgb(255, 255, 210);"><a id="Level-2-Range-attr-startParent" name="Level-2-Range-attr-startParent">startContainer</a></code> of type <code>Node</code>, readonly</dt><dd style="margin-top: 0px;margin-bottom: 0px;">Node within which the Range begins<br><div class="exceptions"><b>Exceptions on retrieval</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="attribute-name" style="background-color: rgb(255, 255, 210);"><a id="Level-2-Range-attr-startOffset" name="Level-2-Range-attr-startOffset">startOffset</a></code> of type <code>long</code>, readonly</dt><dd style="margin-top: 0px;margin-bottom: 0px;">Offset within the starting node of the Range.<br><div class="exceptions"><b>Exceptions on retrieval</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></dd></dl></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Methods</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-cloneContents" name="Level2-Range-method-cloneContents">cloneContents</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Duplicates the contents of a Range<div class="return"><b>Return Value</b><div class="returntable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the return value, the second contains a short description" border="0"><tbody><tr><td valign="top"><p><code>DocumentFragment</code></p></td><td><p>A DocumentFragment that contains content equivalent to this Range.</p></td></tr></tbody></table></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be extracted into the new DocumentFragment.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-clone" name="Level2-Range-method-clone">cloneRange</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Produces a new Range whose boundary-points are equal to the boundary-points of the Range.<div class="return"><b>Return Value</b><div class="returntable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the return value, the second contains a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>Range</code></a></p></td><td><p>The duplicated Range.</p></td></tr></tbody></table></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-collapse" name="Level2-Range-method-collapse">collapse</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Collapse a Range onto one of its boundary-points<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">toStart</code> of type <code>boolean</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">If TRUE, collapses the Range onto its start;if FALSE, collapses it onto its end.<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-compareBoundaryPoints" name="Level2-Range-method-compareBoundaryPoints">compareBoundaryPoints</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Compare the boundary-points of two Ranges in a document.<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">how</code> of type <code>unsigned short</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">A code representing the type of comparison, as defined above.<br></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">sourceRange</code> of type <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>Range</code></a></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The <code>Range</code> on which this current <code>Range</code> is compared to.<br></dd></dl></div></div><div class="return"><b>Return Value</b><div class="returntable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the return value, the second contains a short description" border="0"><tbody><tr><td valign="top"><p><code>short</code></p></td><td><p>-1, 0 or 1 depending on whether the corresponding boundary-point of the Range is respectively before, equal to, or after the corresponding boundary-point of<code>sourceRange</code>.</p></td></tr></tbody></table></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the same Document or DocumentFragment.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-deleteContents" name="Level2-Range-method-deleteContents">deleteContents</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Removes the contents of a Range from the containing document or document fragment without returning a reference to the removed content.<div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of the Range is read-only or any of the nodes that contain any of the content of the Range are read-only.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-detach" name="Level2-Range-method-detach">detach</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Called to indicate that the Range is no longer in use and that the implementation may relinquish any resources associated with this Range. Subsequent calls to any methods or attribute getters on this Range will result in a <code>DOMException</code> being thrown with an error code of <code>INVALID_STATE_ERR</code>.<div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-extractContents" name="Level2-Range-method-extractContents">extractContents</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Moves the contents of a Range from the containing document or document fragment to a new DocumentFragment.<div class="return"><b>Return Value</b><div class="returntable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the return value, the second contains a short description" border="0"><tbody><tr><td valign="top"><p><code>DocumentFragment</code></p></td><td><p>A DocumentFragment containing the extracted contents.</p></td></tr></tbody></table></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of the Range is read-only or any of the nodes which contain any of the content of the Range are read-only.</p><p>HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be extracted into the new DocumentFragment.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-insertNode" name="Level2-Range-method-insertNode">insertNode</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Inserts a node into the Document or DocumentFragment at the start of the Range. If the container is a Text node, this will be split at the start of the Range (as if the Text node's splitText method was performed at the insertion point) and the insertion will occur between the two resulting Text nodes. Adjacent Text nodes will not be automatically merged. If the node to be inserted is a DocumentFragment node, the children will be inserted rather than the DocumentFragment node itself.<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">newNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The node to insert at the start of the Range<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>NO_MODIFICATION_ALLOWED_ERR: Raised if an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of the start of the Range is read-only.</p><p>WRONG_DOCUMENT_ERR: Raised if <code>newNode</code> and the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of the start of the Range were not created from the same document.</p><p>HIERARCHY_REQUEST_ERR: Raised if the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of the start of the Range is of a type that does not allow children of the type of <code>newNode</code> or if <code>newNode</code>is an ancestor of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a>.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if <code>newNode</code> is an Attr, Entity, Notation, or Document node.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-selectNode" name="Level2-Range-method-selectNode">selectNode</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Select a node and its contents<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The node to select.<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if an ancestor of <code>refNode</code> is an Entity, Notation or DocumentType node or if <code>refNode</code> is a Document, DocumentFragment, Attr, Entity, or Notation node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-selectNodeContents" name="Level2-Range-method-selectNodeContents">selectNodeContents</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Select the contents within a node<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Node to select from<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor of <code>refNode</code> is an Entity, Notation or DocumentType node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-setEnd" name="Level2-Range-method-setEnd">setEnd</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Sets the attributes describing the end of a Range.<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The <code>refNode</code> value. This parameter must be different from <code>null</code>.<br></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">offset</code> of type <code>long</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The <code>endOffset</code> value.<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor of <code>refNode</code> is an Entity, Notation, or DocumentType node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater than the number of child units in <code>refNode</code>. Child units are <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-16-bit-unit" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>16-bit units</em></a> if <code>refNode</code> is a type of CharacterData node (e.g., a Text or Comment node) or a ProcessingInstruction node. Child units are Nodes in all other cases.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-setEndAfter" name="Level2-Range-method-setEndAfter">setEndAfter</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Sets the end of a Range to be after a node<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Range ends after <code>refNode</code>.<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if the root container of <code>refNode</code> is not an Attr, Document or DocumentFragment node or if <code>refNode</code> is a Document, DocumentFragment, Attr, Entity, or Notation node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-setEndBefore" name="Level2-Range-method-setEndBefore">setEndBefore</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Sets the end position to be before a node.<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Range ends before <code>refNode</code><br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if the root container of <code>refNode</code> is not an Attr, Document, or DocumentFragment node or if <code>refNode</code> is a Document, DocumentFragment, Attr, Entity, or Notation node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-setStart" name="Level2-Range-method-setStart">setStart</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Sets the attributes describing the start of the Range.<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The <code>refNode</code> value. This parameter must be different from <code>null</code>.<br></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">offset</code> of type <code>long</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The <code>startOffset</code> value.<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor of <code>refNode</code> is an Entity, Notation, or DocumentType node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater than the number of child units in <code>refNode</code>. Child units are <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/glossary.html#dt-16-bit-unit" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>16-bit units</em></a> if <code>refNode</code> is a type of CharacterData node (e.g., a Text or Comment node) or a ProcessingInstruction node. Child units are Nodes in all other cases.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-setStartAfter" name="Level2-Range-method-setStartAfter">setStartAfter</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Sets the start position to be after a node<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Range starts after <code>refNode</code><br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if the root container of <code>refNode</code> is not an Attr, Document, or DocumentFragment node or if <code>refNode</code> is a Document, DocumentFragment, Attr, Entity, or Notation node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-setStartBefore" name="Level2-Range-setStartBefore">setStartBefore</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Sets the start position to be before a node<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">refNode</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">Range starts before <code>refNode</code><br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>INVALID_NODE_TYPE_ERR: Raised if the root container of <code>refNode</code> is not an Attr, Document, or DocumentFragment node or if <code>refNode</code> is a Document, DocumentFragment, Attr, Entity, or Notation node.</p></td></tr><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-surroundContents" name="Level2-Range-method-surroundContents">surroundContents</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Reparents the contents of the Range to the given node and inserts the node at the position of the start of the Range.<div class="parameters"><b>Parameters</b><div class="paramtable" style="margin-left: 1em;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="parameter-name" style="background-color: rgb(254, 230, 248);">newParent</code> of type <code>Node</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">The node to surround the contents with.<br></dd></dl></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>NO_MODIFICATION_ALLOWED_ERR: Raised if an <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-ancestor-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>ancestor container</em></a> of either boundary-point of the Range is read-only.</p><p>WRONG_DOCUMENT_ERR: Raised if <code>newParent</code> and the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of the start of the Range were not created from the same document.</p><p>HIERARCHY_REQUEST_ERR: Raised if the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of the start of the Range is of a type that does not allow children of the type of <code>newParent</code> or if<code>newParent</code> is an ancestor of the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> or if <code>node</code> would end up with a child node of a type not allowed by the type of <code>node</code>.</p><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a></p></td><td><p>BAD_BOUNDARYPOINTS_ERR: Raised if the Range <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-partially-selected" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>partially selects</em></a> a non-text node.</p><p>INVALID_NODE_TYPE_ERR: Raised if <code>node</code> is an Attr, Entity, DocumentType, Notation, Document, or DocumentFragment node.</p></td></tr></tbody></table></div></div><div><b>No Return Value</b></div></div></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-Range-method-toString" name="Level2-Range-method-toString">toString</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">Returns the contents of a Range as a string. This string contains only the data characters, not any markup.<div class="return"><b>Return Value</b><div class="returntable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the return value, the second contains a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMString</code></p></td><td><p>The contents of the Range.</p></td></tr></tbody></table></div></div><div class="exceptions"><b>Exceptions</b><div class="exceptiontable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the exception, the second contains the specific error code and a short description" border="0"><tbody><tr><td valign="top"><p><code>DOMException</code></p></td><td><p>INVALID_STATE_ERR: Raised if <code>detach()</code> has already been invoked on this object.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div></div></dd></dl></dd></dl></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Interface <i><a id="Level-2-DocumentRange-idl" name="Level-2-DocumentRange-idl">DocumentRange</a></i></b> (introduced in <b class="since">DOM Level 2</b>)</dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><br><b>IDL Definition</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="idl-code" style="font-family: monospace;border-top-width: 1px;border-right-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-top-style: solid;border-right-style: solid;border-bottom-style: solid;border-left-style: solid;border-top-color: black;border-right-color: black;border-bottom-color: black;border-left-color: black;border-image: initial;white-space: pre;background-color: rgb(223, 223, 223);"><pre style="margin-left: 2em;">// Introduced in DOM Level 2:interface DocumentRange{Range createRange();};</pre></div><br></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Methods</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="method-name" style="background-color: rgb(217, 230, 248);"><a id="Level2-DocumentRange-method-createRange" name="Level2-DocumentRange-method-createRange">createRange</a></code></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="method">This interface can be obtained from the object implementing the <code>Document</code> interface using binding-specific casting methods.<div class="return"><b>Return Value</b><div class="returntable" style="margin-left: 1em;"><table summary="Layout table: the first cell contains the type of the return value, the second contains a short description" border="0"><tbody><tr><td valign="top"><p><a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-idl" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>Range</code></a></p></td><td><p>The initial state of the Range returned from this method is such that both of its boundary-points are positioned at the beginning of the corresponding Document, before any content. The Range returned can only be used to select content associated with this Document, or with DocumentFragments and Attrs for which this Document is the <code>ownerDocument</code>.</p></td></tr></tbody></table></div></div><div><b>No Parameters</b></div><div><b>No Exceptions</b></div></div></dd></dl></dd></dl></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Exception <i><a id="RangeException" name="RangeException">RangeException</a></i></b> introduced in <b class="version">DOM Level 2</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><p>Range operations may throw a <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#RangeException" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><code>RangeException</code></a> as specified in their method descriptions.</p><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><br><b>IDL Definition</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><div class="idl-code" style="font-family: monospace;border-top-width: 1px;border-right-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-top-style: solid;border-right-style: solid;border-bottom-style: solid;border-left-style: solid;border-top-color: black;border-right-color: black;border-bottom-color: black;border-left-color: black;border-image: initial;white-space: pre;background-color: rgb(223, 223, 223);"><pre style="margin-left: 2em;">// Introduced in DOM Level 2:exception RangeException{unsigned short code;};// RangeExceptionCodeconst unsigned short BAD_BOUNDARYPOINTS_ERR=1;const unsigned short INVALID_NODE_TYPE_ERR=2;</pre></div><br></dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Definition group <i><a id="RangeExceptionCode" name="RangeExceptionCode">RangeExceptionCode</a></i></b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><p>An integer indicating the type of error generated.</p><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><b>Defined Constants</b></dt><dd style="margin-top: 0px;margin-bottom: 0px;"><dl><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="constant-name" style="background-color: rgb(221, 255, 210);">BAD_BOUNDARYPOINTS_ERR</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">If the boundary-points of a Range do not meet specific requirements.</dd><dt style="margin-top: 0px;margin-bottom: 0px;font-weight: bold;"><code class="constant-name" style="background-color: rgb(221, 255, 210);">INVALID_NODE_TYPE_ERR</code></dt><dd style="margin-top: 0px;margin-bottom: 0px;">If the <a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-container" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;"><em>container</em></a> of an boundary-point of a Range is being set to either a node of an invalid type or a node with an ancestor of an invalid type.</dd></dl></dd></dl></dd></dl></dd></dl></div></div><div class="navbar" align="center" style="color: rgb(0, 0, 0);font-family: sans-serif;font-size: medium;"><hr title="Navigation area separator"><a accesskey="p" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">previous</a>   <a accesskey="n" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/idl-definitions.html" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">next</a>   <a accesskey="c" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/Overview.html#contents" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">contents</a>   <a accesskey="i" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/def-index.html" style="color: rgb(102, 0, 153);background-image: initial;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: transparent;background-position: initial initial;background-repeat: initial initial;">index</a></div></p><dl></dl>
291 </textarea>
292
293 <h2>Deeply nested divs</h2>
294 <textarea name="editor4">
295 <p> </p><h1 id="mainHeader" style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; font-weight: normal; font-size: 26px; color: rgb(7, 130, 193); font-family: Arial, Helvetica, sans-serif; background-color: rgb(226, 226, 226); ">Jobs</h1><div id="node-438" class="node node-type-page" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 18px; color: rgb(85, 85, 85); font-family: Arial, Helvetica, sans-serif; background-color: rgb(226, 226, 226); "><div class="node-inner" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><div class="meta" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "> </div><div class="content" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><div class="contentBox" style="margin-top: 0px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; padding-top: 15px; padding-right: 15px; padding-bottom: 1px; padding-left: 15px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; background-color: rgb(239, 239, 239); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(226, 226, 226); border-right-color: rgb(226, 226, 226); border-bottom-color: rgb(226, 226, 226); border-left-color: rgb(226, 226, 226); position: relative; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">CKSource is a successful company with thousands of customers all around the world, including top names like IBM and Oracle. Our company is growing fast, with impressive sales results. This strong growth expands our range of opportunities, followed by the growth of our team. Take this chance and&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">join us!</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Working in a&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">successful Open Source project&nbsp;</strong>is certainly a lot of fun. CKEditor is one of the most frequently used text editors out there, and this success means new responsibilities. We are providing a key component for the software that is powering the Web today. It is downloaded daily by thousands of people all around the world and used by hundreds of thousands out there.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">We are constantly looking for top-notch, creative, and enthusiastic professionals ready to join our international team.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">We offer a work culture where ideas are free to fly and diversity is our everyday life.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">There is no need to relocate. No matter where you are, as long as you love what you do, you are the right person for us!</p><div class="post joboffer" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; border-top-style: solid; border-top-color: rgb(229, 230, 231); " id=""><h2 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; font-size: 15px; color: rgb(0, 0, 0); ">AJD - Advanced JavaScript Developer</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Location:&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Europe and Its Neighbourhood</strong>&nbsp;(from GMT 0 to GMT +2).</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Employment type:&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Full time</strong>.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">We are looking for talented people to join our team. Ideal candidates will have:</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-right: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Several years of experience with professional JavaScript programming, which we consider is;<ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-right: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Writing pure, object-oriented JavaScript applications.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Ability to create complex JavaScript applications based on your own skills only (excluding usage of external libraries such as jQuery, Prototype, Dojo, or MooTools).</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Being aware and able to solving asynchronous issues.</li></ul></li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">In-depth knowledge of core Web standards, like HTML, XML, DOM, and CSS — including their intrinsic implementation differences among browsers (with IE6 also);</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Ability to understand and fix complicated DOM manipulation problems.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Good (enough) English speaking and writing skills. This is the language used in the company.</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">"Wow" candidates will also have (not required though):</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-right: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Experience with CKEditor or FCKeditor, having possibly collaborated with the project;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Experience with rich text editors;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Experience with HTML5, CSS3 development;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Experience with Test Cases (like YUI Test);</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">A Bachelor's or Master's degree in Computer Science;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Passion for Open Source.</li></ul></div><div class="post" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 0px; padding-bottom: 30px; padding-left: 0px; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; border-top-style: solid; border-top-color: rgb(229, 230, 231); " id=""><h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; font-size: 14px; ">In return we offer:</h3><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-right: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Permanent full time employment contract;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Flexible working hours;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Competitive salary;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Work&nbsp;</strong>from&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">home</strong>&nbsp;(you will forget what a traffic jam is);</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Working with smart and motivated&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">professionals</strong>;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Becoming a&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">part of great team</strong>&nbsp;who delivers worldwide known software.</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Let us start talking. Tell us about the projects you have worked on and your role in them; point to your experience and anything you think might make you a perfect candidate. Contact us with your CV at:&nbsp;<a href="" title="jobs at (spam protection) cksource dot com" id="jobmail1" style="color: rgb(24, 157, 225); ">jobs@cksource.com</a>&nbsp;now!</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">We are sure you will enjoy it!</p></div><div class="post" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 0px; padding-bottom: 30px; padding-left: 0px; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; border-top-style: solid; border-top-color: rgb(229, 230, 231); "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">Please note we only accept CV's in English. Your application must include the following note:</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; line-height: 1.5em; ">"I hereby authorize you to process my personal data included in my job application for the needs of the recruitment process (in accordance to the Personal Data Protection Act 29.08.1997 no 133 position 883).”</p></div></div></div></div></div><dl></dl>
296 </textarea>
297
298 <h2>Line custom look</h2>
299 <div id="hood">
300 <h1>
301 <img alt="" src="http://a.cksource.com/c/1/inc/img/demo-little-red.jpg" style="margin-left: 10px; margin-right: 10px; float: left; width: 120px; height: 168px;" />Little Red Riding Hood</h1>
302 <p>
303 &quot;<b>Little Red Riding Hood</b>&quot; is a famous <a href="http://en.wikipedia.org/wiki/Fairy_tale" title="Fairy tale">fairy tale</a> about a young girl&#39;s encounter with a wolf. The story has been changed considerably in its history and subject to numerous modern adaptations and readings.</p>
304 <table align="right" border="1" cellpadding="1" cellspacing="1" style="width: 200px;">
305 <caption>
306 <strong>International Names</strong></caption>
307 <tbody>
308 <tr>
309 <td>
310 Chinese</td>
311 <td>
312 <i>小紅帽</i></td>
313 </tr>
314 <tr>
315 <td>
316 Italian</td>
317 <td>
318 <i>Cappuccetto Rosso</i></td>
319 </tr>
320 <tr>
321 <td>
322 Spanish</td>
323 <td>
324 <i>Caperucita Roja</i></td>
325 </tr>
326 </tbody>
327 </table>
328 <hr>
329 <hr>
330 <p>
331 The version most widely known today is based on the <a href="http://en.wikipedia.org/wiki/Brothers_Grimm" title="Brothers Grimm">Brothers Grimm</a> variant. It is about a girl called Little Red Riding Hood, after the red <a href="http://en.wikipedia.org/wiki/Hood_%28headgear%29" title="Hood (headgear)">hooded</a> <a href="http://en.wikipedia.org/wiki/Cape" title="Cape">cape</a> or <a href="http://en.wikipedia.org/wiki/Cloak" title="Cloak">cloak</a> she wears. The girl walks through the woods to deliver food to her sick grandmother.</p>
332 <p>
333 A wolf wants to eat the girl but is afraid to do so in public. He approaches the girl, and she na&iuml;vely tells him where she is going. He suggests the girl pick some flowers, which she does. In the meantime, he goes to the grandmother&#39;s house and gains entry by pretending to be the girl. He swallows the grandmother whole, and waits for the girl, disguised as the grandmother.</p>
334 <p>
335 When the girl arrives, she notices he looks very strange to be her grandma. In most retellings, this eventually culminates with Little Red Riding Hood saying, &quot;My, what big teeth you have!&quot;<br />
336 To which the wolf replies, &quot;The better to eat you with,&quot; and swallows her whole, too.</p>
337 <p>
338 A <a href="http://en.wikipedia.org/wiki/Hunter" title="Hunter">hunter</a>, however, comes to the rescue and cuts the wolf open. Little Red Riding Hood and her grandmother emerge unharmed. They fill the wolf&#39;s body with heavy stones, which drown him when he falls into a well. Other versions of the story have had the grandmother shut in the closet instead of eaten, and some have Little Red Riding Hood saved by the hunter as the wolf advances on her rather than after she is eaten.</p>
339 <p>
340 The tale makes the clearest contrast between the safe world of the village and the dangers of the <a href="http://en.wikipedia.org/wiki/Enchanted_forest" title="Enchanted forest">forest</a>, conventional antitheses that are essentially medieval, though no written versions are as old as that.</p>
341 </div>
342
343 <h2>Extreme inline editing</h2>
344 <div id="interpret" contenteditable="true" style="left: 123px; outline: 1px solid red; border: 15px solid green; position: relative; top: 30; left: 30px;">
345 <div style="padding: 20px; background: gray; width: 300px" class="1">Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim.</div>
346 <div style="background: violet; padding: 30px;" class="static">
347 Position static
348 <div style="background: green; padding: 30px; border: 14px solid orange">foo</div>
349 </div>
350 <dl class="2">
351 <dt>Key</dt><dd>Value</dd>
352 </dl>
353 <div>Whatever</div>
354 <hr id="hr">
355 <p>Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies</p>
356 <hr>
357 <hr>
358 <p>Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies</p>
359 <div style="background: green; padding: 30px; width: 200px">foo</div>
360 </div>
361
362 <h2>Enter mode: BR</h2>
363 <textarea cols="80" id="editor5" name="editor5" rows="10">
364 Foo<br />
365 <hr style="margin: 50px" />
366 <hr style="margin: 50px" />
367 Foo
368 </textarea>
369
370 <div id="dev">
371 <p id="mouseData">
372 <span>Mouse over: <strong id="over"></strong></span>
373 <span style="display: block">Mouse Y-pos.: <span id="my"></span></span>
374 </p>
375 <p id="triggerData">
376 <span id="tr_type"></span>
377 <span id="tr_upper"></span>
378 <span id="tr_lower"></span>
379 <span id="tr_edge"></span>
380 </dl>
381 <p id="timeData">Time: <span id="time"></span></p>
382 <p id="hiddenData">Hidden state: <span id="hid"></span></p>
383 </div>
384 <script>
385
386 'use strict';
387
388 function fixedWidthNumber( text, chars ) {
389 return ( Array( chars ).join( 0 ) + text ).slice( -chars );
390 }
391
392 var DEBUG = {
393 startTimer: function() {
394 DEBUG.timer = new Date().getTime();
395 },
396
397 stopTimer: (function() {
398 var label = CKEDITOR.document.getById( 'time' ),
399 max = 0,
400 count = 0,
401 values = [],
402 mean = 0,
403 time = 0;
404
405 return function() {
406 time = new Date().getTime() - DEBUG.timer;
407 max = Math.max( time, max );
408
409 values.unshift( time );
410 ( 20 in values ) && values.pop();
411 mean = 0;
412
413 for( var i = 0 ; i < values.length ; i++ )
414 mean += values[ i ];
415
416 mean = mean / i;
417
418 label.setText( fixedWidthNumber( time, 3 ) +
419 ' ms, mean: ' + fixedWidthNumber( 0 | mean, 3 ) +
420 ' ms, max: ' + fixedWidthNumber( max, 3 ) +
421 ' ms' )
422 count++;
423 }
424 })(),
425
426 mousePos: (function( y, element )
427 {
428 var my = CKEDITOR.document.getById( 'my' ),
429 over = CKEDITOR.document.getById( 'over' ),
430 name;
431
432 return function( y, element ) {
433 my.setText( y );
434
435 if( element && element.$ && element.type == CKEDITOR.NODE_ELEMENT ) {
436 try {
437 name = element.getName();
438 over.setText( name + '.' + element.getAttribute( 'class' ) );
439 } catch( e ) {}
440 }
441 else
442 over.setText( '-' );
443 }
444 })(),
445
446 showTrigger: (function( trigger )
447 {
448 var tr_type = CKEDITOR.document.getById( 'tr_type' ),
449 tr_upper = CKEDITOR.document.getById( 'tr_upper' ),
450 tr_lower = CKEDITOR.document.getById( 'tr_lower' ),
451 tr_edge = CKEDITOR.document.getById( 'tr_edge' ),
452 tup, tbo, upper, lower;
453
454 return function( trigger ) {
455 tup && tup.removeAttribute('id') && ( tup = null );
456 tbo && tbo.removeAttribute('id') && ( tbo = null );
457
458 if ( !trigger )
459 return tr_type.setText( '-' ) &&
460 tr_upper.setText( '-' ) &&
461 tr_lower.setText( '-' ) &&
462 tr_edge.setText( '-' );
463
464 upper = trigger.upper,
465 lower = trigger.lower;
466
467 tr_type.setText( trigger.type == 2 ? 'EXPAND': 'EDGE' );
468 tr_upper.setText( upper ? upper.getName() + '.' + upper.getAttribute( 'class' ): 'NULL' );
469 tr_lower.setText( lower ? lower.getName() + '.' + lower.getAttribute( 'class' ): 'NULL' );
470 tr_edge.setText( trigger.edge ? [ 'EDGE_TOP', 'EDGE_BOTTOM', 'EDGE_MIDDLE' ][ trigger.edge - 1 ]: 'NULL' );
471
472 upper && ( tup = upper ) && tup.setAttribute( 'id', 'tup' );
473 lower && ( tbo = lower ) && tbo.setAttribute( 'id', 'tbo' );
474 }
475 })(),
476
477 showHidden: (function( state )
478 {
479 var cnt = CKEDITOR.document.getById( 'hid' );
480
481 return function( state ) {
482 cnt[ state ? 'addClass': 'removeClass' ]( 'hl' );
483 cnt.setText( state ? 'enabled': 'disabled' );
484 }
485 })(),
486
487 markElement: function( element ) {
488 if( !isHtml( element ))
489 return;
490
491 DEBUG.marked && DEBUG.marked.setStyles( {
492 'outline': 'none'
493 } );
494
495 DEBUG.marked = element;
496
497 element.setStyles( {
498 'outline': 'red solid 2px'
499 } );
500 },
501
502 // Log functions.
503 log: function() {},
504 logElements: function() {},
505 groupStart: function() {},
506 groupEnd: function() {},
507 logEnd: function() {},
508 logElementsEnd: function() {}
509 };
510
511 var logEnable = {
512 log: function() {
513 var args = [];
514 for( var i = 0; i < arguments.length ; i++ )
515 args.push( arguments[ i ] );
516
517 console.log.apply( console, args );
518 },
519
520 logElements: function( elements, labels, info ) {
521 var log = {},
522 label;
523
524 for ( var i = 0 ; i < elements.length; i++ ) {
525 label = labels ? labels [ i ] : i;
526
527 if( !elements[ i ] ) {
528 log[ label ] = {
529 'name': 'null',
530 'class': 'null'
531 }
532 }
533 else {
534 log[ labels ? labels [ i ]: i ] = {
535 'name': elements[ i ].is ? elements[ i ].getName(): 'null',
536 'class': elements[ i ].is ? elements[ i ].getAttribute( 'class' ): 'null'
537 }
538 }
539 }
540
541 typeof JSON != 'undefined' && DEBUG.log( ( info ? info.toUpperCase() + ' ': '' ) + JSON.stringify( log ) );
542 },
543
544 groupStart: function( label ) {
545 console.group( label );
546 },
547
548 groupEnd: function() {
549 console.groupEnd();
550 },
551
552 logEnd: function() {
553 DEBUG.log.apply( null, arguments );
554 DEBUG.groupEnd();
555 },
556
557 logElementsEnd: function() {
558 DEBUG.logElements.apply( null, arguments );
559 DEBUG.groupEnd();
560 }
561 }
562
563 // Enable console.log debugging with ?debug address parameter.
564 window.location.href.match( /debug$/g ) ? CKEDITOR.tools.extend( DEBUG, logEnable, true ): null;
565
566 // CKEDITOR.addCss('\
567 // #tup { outline: #FEB2B2 solid 2px; box-shadow: 3px 3px 0 #FEB2B2; } \
568 // #tbo { outline: #B2FEB2 solid 2px; box-shadow: 3px 3px 0 #B2FEB2; } \
569 // p { background: pink }\
570 // ');
571
572 CKEDITOR.replace( 'editor1' );
573
574 CKEDITOR.replace( 'editor2', { height: 150 } );
575
576 CKEDITOR.replace( 'editor3', {
577 magicline_everywhere: 1,
578 magicline_holdDistance: .2,
579 language: 'pl'
580 });
581
582 CKEDITOR.replace( 'editor4' );
583
584 CKEDITOR.replace( 'hood', {
585 magicline_color: 'green'
586 });
587
588 CKEDITOR.replace( 'editor5', {
589 enterMode : CKEDITOR.ENTER_BR
590 });
591
592 </script>
593</body>
594</html>
diff --git a/sources/plugins/magicline/images/hidpi/icon-rtl.png b/sources/plugins/magicline/images/hidpi/icon-rtl.png
new file mode 100644
index 00000000..4a8d2bfd
--- /dev/null
+++ b/sources/plugins/magicline/images/hidpi/icon-rtl.png
Binary files differ
diff --git a/sources/plugins/magicline/images/hidpi/icon.png b/sources/plugins/magicline/images/hidpi/icon.png
new file mode 100644
index 00000000..b981bb5c
--- /dev/null
+++ b/sources/plugins/magicline/images/hidpi/icon.png
Binary files differ
diff --git a/sources/plugins/magicline/images/icon-rtl.png b/sources/plugins/magicline/images/icon-rtl.png
new file mode 100644
index 00000000..55b5b5f9
--- /dev/null
+++ b/sources/plugins/magicline/images/icon-rtl.png
Binary files differ
diff --git a/sources/plugins/magicline/images/icon.png b/sources/plugins/magicline/images/icon.png
new file mode 100644
index 00000000..e0634336
--- /dev/null
+++ b/sources/plugins/magicline/images/icon.png
Binary files differ
diff --git a/sources/plugins/magicline/lang/af.js b/sources/plugins/magicline/lang/af.js
new file mode 100644
index 00000000..0bca7589
--- /dev/null
+++ b/sources/plugins/magicline/lang/af.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'af', {
7 title: 'Voeg paragraaf hier in'
8} );
diff --git a/sources/plugins/magicline/lang/ar.js b/sources/plugins/magicline/lang/ar.js
new file mode 100644
index 00000000..806bde8e
--- /dev/null
+++ b/sources/plugins/magicline/lang/ar.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ar', {
7 title: 'إدراج فقرة هنا'
8} );
diff --git a/sources/plugins/magicline/lang/bg.js b/sources/plugins/magicline/lang/bg.js
new file mode 100644
index 00000000..235e415e
--- /dev/null
+++ b/sources/plugins/magicline/lang/bg.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'bg', {
7 title: 'Вмъкнете параграф тук'
8} );
diff --git a/sources/plugins/magicline/lang/ca.js b/sources/plugins/magicline/lang/ca.js
new file mode 100644
index 00000000..8ecc84c1
--- /dev/null
+++ b/sources/plugins/magicline/lang/ca.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ca', {
7 title: 'Insereix el paràgraf aquí'
8} );
diff --git a/sources/plugins/magicline/lang/cs.js b/sources/plugins/magicline/lang/cs.js
new file mode 100644
index 00000000..7dedde35
--- /dev/null
+++ b/sources/plugins/magicline/lang/cs.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'cs', {
7 title: 'zde vložit odstavec'
8} );
diff --git a/sources/plugins/magicline/lang/cy.js b/sources/plugins/magicline/lang/cy.js
new file mode 100644
index 00000000..cce06efd
--- /dev/null
+++ b/sources/plugins/magicline/lang/cy.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'cy', {
7 title: 'Mewnosod paragraff yma'
8} );
diff --git a/sources/plugins/magicline/lang/da.js b/sources/plugins/magicline/lang/da.js
new file mode 100644
index 00000000..87885710
--- /dev/null
+++ b/sources/plugins/magicline/lang/da.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'da', {
7 title: 'Indsæt afsnit'
8} );
diff --git a/sources/plugins/magicline/lang/de.js b/sources/plugins/magicline/lang/de.js
new file mode 100644
index 00000000..ff7ca340
--- /dev/null
+++ b/sources/plugins/magicline/lang/de.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'de', {
7 title: 'Absatz hier einfügen'
8} );
diff --git a/sources/plugins/magicline/lang/el.js b/sources/plugins/magicline/lang/el.js
new file mode 100644
index 00000000..e1de7d82
--- /dev/null
+++ b/sources/plugins/magicline/lang/el.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'el', {
7 title: 'Εισάγετε παράγραφο εδώ'
8} );
diff --git a/sources/plugins/magicline/lang/en-gb.js b/sources/plugins/magicline/lang/en-gb.js
new file mode 100644
index 00000000..3c469afa
--- /dev/null
+++ b/sources/plugins/magicline/lang/en-gb.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'en-gb', {
7 title: 'Insert paragraph here'
8} );
diff --git a/sources/plugins/magicline/lang/en.js b/sources/plugins/magicline/lang/en.js
new file mode 100644
index 00000000..180e0c83
--- /dev/null
+++ b/sources/plugins/magicline/lang/en.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'en', {
7 title: 'Insert paragraph here'
8} );
diff --git a/sources/plugins/magicline/lang/eo.js b/sources/plugins/magicline/lang/eo.js
new file mode 100644
index 00000000..08a9c952
--- /dev/null
+++ b/sources/plugins/magicline/lang/eo.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'eo', {
7 title: 'Enmeti paragrafon ĉi-tien'
8} );
diff --git a/sources/plugins/magicline/lang/es.js b/sources/plugins/magicline/lang/es.js
new file mode 100644
index 00000000..6a01bf5c
--- /dev/null
+++ b/sources/plugins/magicline/lang/es.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'es', {
7 title: 'Insertar párrafo aquí'
8} );
diff --git a/sources/plugins/magicline/lang/et.js b/sources/plugins/magicline/lang/et.js
new file mode 100644
index 00000000..fd93f8f5
--- /dev/null
+++ b/sources/plugins/magicline/lang/et.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'et', {
7 title: 'Sisesta siia lõigu tekst'
8} );
diff --git a/sources/plugins/magicline/lang/eu.js b/sources/plugins/magicline/lang/eu.js
new file mode 100644
index 00000000..c528787e
--- /dev/null
+++ b/sources/plugins/magicline/lang/eu.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'eu', {
7 title: 'Txertatu paragrafoa hemen'
8} );
diff --git a/sources/plugins/magicline/lang/fa.js b/sources/plugins/magicline/lang/fa.js
new file mode 100644
index 00000000..73756d64
--- /dev/null
+++ b/sources/plugins/magicline/lang/fa.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'fa', {
7 title: 'قرار دادن بند در اینجا'
8} );
diff --git a/sources/plugins/magicline/lang/fi.js b/sources/plugins/magicline/lang/fi.js
new file mode 100644
index 00000000..7f2eb8d5
--- /dev/null
+++ b/sources/plugins/magicline/lang/fi.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'fi', {
7 title: 'Lisää kappale tähän.'
8} );
diff --git a/sources/plugins/magicline/lang/fr-ca.js b/sources/plugins/magicline/lang/fr-ca.js
new file mode 100644
index 00000000..aed21a8b
--- /dev/null
+++ b/sources/plugins/magicline/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'fr-ca', {
7 title: 'Insérer le paragraphe ici'
8} );
diff --git a/sources/plugins/magicline/lang/fr.js b/sources/plugins/magicline/lang/fr.js
new file mode 100644
index 00000000..b14996c6
--- /dev/null
+++ b/sources/plugins/magicline/lang/fr.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'fr', {
7 title: 'Insérez un paragraphe ici'
8} );
diff --git a/sources/plugins/magicline/lang/gl.js b/sources/plugins/magicline/lang/gl.js
new file mode 100644
index 00000000..a6d0cabc
--- /dev/null
+++ b/sources/plugins/magicline/lang/gl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'gl', {
7 title: 'Inserir aquí o parágrafo'
8} );
diff --git a/sources/plugins/magicline/lang/he.js b/sources/plugins/magicline/lang/he.js
new file mode 100644
index 00000000..b6f90e50
--- /dev/null
+++ b/sources/plugins/magicline/lang/he.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'he', {
7 title: 'הכנס פסקה כאן'
8} );
diff --git a/sources/plugins/magicline/lang/hr.js b/sources/plugins/magicline/lang/hr.js
new file mode 100644
index 00000000..503051d5
--- /dev/null
+++ b/sources/plugins/magicline/lang/hr.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'hr', {
7 title: 'Ubaci paragraf ovdje'
8} );
diff --git a/sources/plugins/magicline/lang/hu.js b/sources/plugins/magicline/lang/hu.js
new file mode 100644
index 00000000..0e83cf8f
--- /dev/null
+++ b/sources/plugins/magicline/lang/hu.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'hu', {
7 title: 'Szúrja be a bekezdést ide'
8} );
diff --git a/sources/plugins/magicline/lang/id.js b/sources/plugins/magicline/lang/id.js
new file mode 100644
index 00000000..5594ca60
--- /dev/null
+++ b/sources/plugins/magicline/lang/id.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'id', {
7 title: 'Masukkan paragraf disini'
8} );
diff --git a/sources/plugins/magicline/lang/it.js b/sources/plugins/magicline/lang/it.js
new file mode 100644
index 00000000..bc478261
--- /dev/null
+++ b/sources/plugins/magicline/lang/it.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'it', {
7 title: 'Inserisci paragrafo qui'
8} );
diff --git a/sources/plugins/magicline/lang/ja.js b/sources/plugins/magicline/lang/ja.js
new file mode 100644
index 00000000..2f2efe1f
--- /dev/null
+++ b/sources/plugins/magicline/lang/ja.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ja', {
7 title: 'ここに段落を挿入'
8} );
diff --git a/sources/plugins/magicline/lang/km.js b/sources/plugins/magicline/lang/km.js
new file mode 100644
index 00000000..f9c47321
--- /dev/null
+++ b/sources/plugins/magicline/lang/km.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'km', {
7 title: 'បញ្ចូល​កថាខណ្ឌ​នៅ​ទីនេះ'
8} );
diff --git a/sources/plugins/magicline/lang/ko.js b/sources/plugins/magicline/lang/ko.js
new file mode 100644
index 00000000..902060b6
--- /dev/null
+++ b/sources/plugins/magicline/lang/ko.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ko', {
7 title: '여기에 단락 삽입'
8} );
diff --git a/sources/plugins/magicline/lang/ku.js b/sources/plugins/magicline/lang/ku.js
new file mode 100644
index 00000000..94e8c760
--- /dev/null
+++ b/sources/plugins/magicline/lang/ku.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ku', {
7 title: 'بڕگە لێرە دابنێ'
8} );
diff --git a/sources/plugins/magicline/lang/lv.js b/sources/plugins/magicline/lang/lv.js
new file mode 100644
index 00000000..6dcfb82c
--- /dev/null
+++ b/sources/plugins/magicline/lang/lv.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'lv', {
7 title: 'Ievietot šeit rindkopu'
8} );
diff --git a/sources/plugins/magicline/lang/nb.js b/sources/plugins/magicline/lang/nb.js
new file mode 100644
index 00000000..36a3ad55
--- /dev/null
+++ b/sources/plugins/magicline/lang/nb.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'nb', {
7 title: 'Sett inn nytt avsnitt her'
8} );
diff --git a/sources/plugins/magicline/lang/nl.js b/sources/plugins/magicline/lang/nl.js
new file mode 100644
index 00000000..95d76caf
--- /dev/null
+++ b/sources/plugins/magicline/lang/nl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'nl', {
7 title: 'Hier paragraaf invoeren'
8} );
diff --git a/sources/plugins/magicline/lang/no.js b/sources/plugins/magicline/lang/no.js
new file mode 100644
index 00000000..e0f414cb
--- /dev/null
+++ b/sources/plugins/magicline/lang/no.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'no', {
7 title: 'Sett inn nytt avsnitt her'
8} );
diff --git a/sources/plugins/magicline/lang/pl.js b/sources/plugins/magicline/lang/pl.js
new file mode 100644
index 00000000..6c1c6d0d
--- /dev/null
+++ b/sources/plugins/magicline/lang/pl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'pl', {
7 title: 'Wstaw nowy akapit'
8} );
diff --git a/sources/plugins/magicline/lang/pt-br.js b/sources/plugins/magicline/lang/pt-br.js
new file mode 100644
index 00000000..bee3c383
--- /dev/null
+++ b/sources/plugins/magicline/lang/pt-br.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'pt-br', {
7 title: 'Insera um parágrafo aqui'
8} );
diff --git a/sources/plugins/magicline/lang/pt.js b/sources/plugins/magicline/lang/pt.js
new file mode 100644
index 00000000..0f40e616
--- /dev/null
+++ b/sources/plugins/magicline/lang/pt.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'pt', {
7 title: 'Insira aqui o parágrafo'
8} );
diff --git a/sources/plugins/magicline/lang/ru.js b/sources/plugins/magicline/lang/ru.js
new file mode 100644
index 00000000..645d50da
--- /dev/null
+++ b/sources/plugins/magicline/lang/ru.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ru', {
7 title: 'Вставить здесь параграф'
8} );
diff --git a/sources/plugins/magicline/lang/si.js b/sources/plugins/magicline/lang/si.js
new file mode 100644
index 00000000..4c134131
--- /dev/null
+++ b/sources/plugins/magicline/lang/si.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'si', {
7 title: 'චේදය ඇතුලත් කරන්න'
8} );
diff --git a/sources/plugins/magicline/lang/sk.js b/sources/plugins/magicline/lang/sk.js
new file mode 100644
index 00000000..8473e68d
--- /dev/null
+++ b/sources/plugins/magicline/lang/sk.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'sk', {
7 title: 'Sem vložte paragraf'
8} );
diff --git a/sources/plugins/magicline/lang/sl.js b/sources/plugins/magicline/lang/sl.js
new file mode 100644
index 00000000..fab392c5
--- /dev/null
+++ b/sources/plugins/magicline/lang/sl.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'sl', {
7 title: 'Vstavite odstavek tukaj'
8} );
diff --git a/sources/plugins/magicline/lang/sq.js b/sources/plugins/magicline/lang/sq.js
new file mode 100644
index 00000000..4b83c92a
--- /dev/null
+++ b/sources/plugins/magicline/lang/sq.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'sq', {
7 title: 'Vendos paragraf këtu'
8} );
diff --git a/sources/plugins/magicline/lang/sv.js b/sources/plugins/magicline/lang/sv.js
new file mode 100644
index 00000000..aa0e5487
--- /dev/null
+++ b/sources/plugins/magicline/lang/sv.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'sv', {
7 title: 'Infoga paragraf här'
8} );
diff --git a/sources/plugins/magicline/lang/tr.js b/sources/plugins/magicline/lang/tr.js
new file mode 100644
index 00000000..cf12ff28
--- /dev/null
+++ b/sources/plugins/magicline/lang/tr.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'tr', {
7 title: 'Parağrafı buraya ekle'
8} );
diff --git a/sources/plugins/magicline/lang/tt.js b/sources/plugins/magicline/lang/tt.js
new file mode 100644
index 00000000..bc2c94a9
--- /dev/null
+++ b/sources/plugins/magicline/lang/tt.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'tt', {
7 title: 'Бирегә параграф өстәү'
8} );
diff --git a/sources/plugins/magicline/lang/ug.js b/sources/plugins/magicline/lang/ug.js
new file mode 100644
index 00000000..653bc5fb
--- /dev/null
+++ b/sources/plugins/magicline/lang/ug.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'ug', {
7 title: 'بۇ جايغا ئابزاس قىستۇر'
8} );
diff --git a/sources/plugins/magicline/lang/uk.js b/sources/plugins/magicline/lang/uk.js
new file mode 100644
index 00000000..efd589a6
--- /dev/null
+++ b/sources/plugins/magicline/lang/uk.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'uk', {
7 title: 'Вставити абзац'
8} );
diff --git a/sources/plugins/magicline/lang/vi.js b/sources/plugins/magicline/lang/vi.js
new file mode 100644
index 00000000..29156c3b
--- /dev/null
+++ b/sources/plugins/magicline/lang/vi.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'vi', {
7 title: 'Chèn đoạn vào đây'
8} );
diff --git a/sources/plugins/magicline/lang/zh-cn.js b/sources/plugins/magicline/lang/zh-cn.js
new file mode 100644
index 00000000..2990f181
--- /dev/null
+++ b/sources/plugins/magicline/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'zh-cn', {
7 title: '在这插入段落'
8} );
diff --git a/sources/plugins/magicline/lang/zh.js b/sources/plugins/magicline/lang/zh.js
new file mode 100644
index 00000000..3c06265b
--- /dev/null
+++ b/sources/plugins/magicline/lang/zh.js
@@ -0,0 +1,8 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'magicline', 'zh', {
7 title: '在此插入段落'
8} );
diff --git a/sources/plugins/magicline/plugin.js b/sources/plugins/magicline/plugin.js
new file mode 100644
index 00000000..0a2d9fbe
--- /dev/null
+++ b/sources/plugins/magicline/plugin.js
@@ -0,0 +1,1874 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The [Magic Line](http://ckeditor.com/addon/magicline) plugin that makes it easier to access some document areas that
8 * are difficult to focus.
9 */
10
11'use strict';
12
13( function() {
14 CKEDITOR.plugins.add( 'magicline', {
15 lang: 'af,ar,bg,ca,cs,cy,da,de,el,en,en-gb,eo,es,et,eu,fa,fi,fr,fr-ca,gl,he,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,pl,pt,pt-br,ru,si,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
16 init: initPlugin
17 } );
18
19 // Activates the box inside of an editor.
20 function initPlugin( editor ) {
21 // Configurables
22 var config = editor.config,
23 triggerOffset = config.magicline_triggerOffset || 30,
24 enterMode = config.enterMode,
25 that = {
26 // Global stuff is being initialized here.
27 editor: editor,
28 enterMode: enterMode,
29 triggerOffset: triggerOffset,
30 holdDistance: 0 | triggerOffset * ( config.magicline_holdDistance || 0.5 ),
31 boxColor: config.magicline_color || '#ff0000',
32 rtl: config.contentsLangDirection == 'rtl',
33 tabuList: [ 'data-cke-hidden-sel' ].concat( config.magicline_tabuList || [] ),
34 triggers: config.magicline_everywhere ? DTD_BLOCK : { table: 1, hr: 1, div: 1, ul: 1, ol: 1, dl: 1, form: 1, blockquote: 1 }
35 },
36 scrollTimeout, checkMouseTimeoutPending, checkMouseTimer;
37
38 // %REMOVE_START%
39 // Internal DEBUG uses tools located in the topmost window.
40
41 // (#9701) Due to security limitations some browsers may throw
42 // errors when accessing window.top object. Do it safely first then.
43 try {
44 that.debug = window.top.DEBUG;
45 }
46 catch ( e ) {}
47
48 that.debug = that.debug || {
49 groupEnd: function() {},
50 groupStart: function() {},
51 log: function() {},
52 logElements: function() {},
53 logElementsEnd: function() {},
54 logEnd: function() {},
55 mousePos: function() {},
56 showHidden: function() {},
57 showTrigger: function() {},
58 startTimer: function() {},
59 stopTimer: function() {}
60 };
61 // %REMOVE_END%
62
63 // Simple irrelevant elements filter.
64 that.isRelevant = function( node ) {
65 return isHtml( node ) && // -> Node must be an existing HTML element.
66 !isLine( that, node ) && // -> Node can be neither the box nor its child.
67 !isFlowBreaker( node ); // -> Node can be neither floated nor positioned nor aligned.
68 };
69
70 editor.on( 'contentDom', addListeners, this );
71
72 function addListeners() {
73 var editable = editor.editable(),
74 doc = editor.document,
75 win = editor.window;
76
77 // Global stuff is being initialized here.
78 extend( that, {
79 editable: editable,
80 inInlineMode: editable.isInline(),
81 doc: doc,
82 win: win,
83 hotNode: null
84 }, true );
85
86 // This is the boundary of the editor. For inline the boundary is editable itself.
87 // For classic (`iframe`-based) editor, the HTML element is a real boundary.
88 that.boundary = that.inInlineMode ? that.editable : that.doc.getDocumentElement();
89
90 // Enabling the box inside of inline editable is pointless.
91 // There's no need to access spaces inside paragraphs, links, spans, etc.
92 if ( editable.is( dtd.$inline ) )
93 return;
94
95 // Handle in-line editing by setting appropriate position.
96 // If current position is static, make it relative and clear top/left coordinates.
97 if ( that.inInlineMode && !isPositioned( editable ) ) {
98 editable.setStyles( {
99 position: 'relative',
100 top: null,
101 left: null
102 } );
103 }
104 // Enable the box. Let it produce children elements, initialize
105 // event handlers and own methods.
106 initLine.call( this, that );
107
108 // Get view dimensions and scroll positions.
109 // At this stage (before any checkMouse call) it is used mostly
110 // by tests. Nevertheless it a crucial thing.
111 updateWindowSize( that );
112
113 // Remove the box before an undo image is created.
114 // This is important. If we didn't do that, the *undo thing* would revert the box into an editor.
115 // Thanks to that, undo doesn't even know about the existence of the box.
116 editable.attachListener( editor, 'beforeUndoImage', function() {
117 that.line.detach();
118 } );
119
120 // Removes the box HTML from editor data string if getData is called.
121 // Thanks to that, an editor never yields data polluted by the box.
122 // Listen with very high priority, so line will be removed before other
123 // listeners will see it.
124 editable.attachListener( editor, 'beforeGetData', function() {
125 // If the box is in editable, remove it.
126 if ( that.line.wrap.getParent() ) {
127 that.line.detach();
128
129 // Restore line in the last listener for 'getData'.
130 editor.once( 'getData', function() {
131 that.line.attach();
132 }, null, null, 1000 );
133 }
134 }, null, null, 0 );
135
136 // Hide the box on mouseout if mouse leaves document.
137 editable.attachListener( that.inInlineMode ? doc : doc.getWindow().getFrame(), 'mouseout', function( event ) {
138 if ( editor.mode != 'wysiwyg' )
139 return;
140
141 // Check for inline-mode editor. If so, check mouse position
142 // and remove the box if mouse outside of an editor.
143 if ( that.inInlineMode ) {
144 var mouse = {
145 x: event.data.$.clientX,
146 y: event.data.$.clientY
147 };
148
149 updateWindowSize( that );
150 updateEditableSize( that, true );
151
152 var size = that.view.editable,
153 scroll = that.view.scroll;
154
155 // If outside of an editor...
156 if ( !inBetween( mouse.x, size.left - scroll.x, size.right - scroll.x ) || !inBetween( mouse.y, size.top - scroll.y, size.bottom - scroll.y ) ) {
157 clearTimeout( checkMouseTimer );
158 checkMouseTimer = null;
159 that.line.detach();
160 }
161 }
162
163 else {
164 clearTimeout( checkMouseTimer );
165 checkMouseTimer = null;
166 that.line.detach();
167 }
168 } );
169
170 // This one deactivates hidden mode of an editor which
171 // prevents the box from being shown.
172 editable.attachListener( editable, 'keyup', function() {
173 that.hiddenMode = 0;
174 that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE%
175 } );
176
177 editable.attachListener( editable, 'keydown', function( event ) {
178 if ( editor.mode != 'wysiwyg' )
179 return;
180
181 var keyStroke = event.data.getKeystroke();
182
183 switch ( keyStroke ) {
184 // Shift pressed
185 case 2228240: // IE
186 case 16:
187 that.hiddenMode = 1;
188 that.line.detach();
189 }
190
191 that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE%
192 } );
193
194 // This method ensures that checkMouse aren't executed
195 // in parallel and no more frequently than specified in timeout function.
196 // In classic (`iframe`-based) editor, document is used as a trigger, to provide magicline
197 // functionality when mouse is below the body (short content, short body).
198 editable.attachListener( that.inInlineMode ? editable : doc, 'mousemove', function( event ) {
199 checkMouseTimeoutPending = true;
200
201 if ( editor.mode != 'wysiwyg' || editor.readOnly || checkMouseTimer )
202 return;
203
204 // IE<9 requires this event-driven object to be created
205 // outside of the setTimeout statement.
206 // Otherwise it loses the event object with its properties.
207 var mouse = {
208 x: event.data.$.clientX,
209 y: event.data.$.clientY
210 };
211
212 checkMouseTimer = setTimeout( function() {
213 checkMouse( mouse );
214 }, 30 ); // balances performance and accessibility
215 } );
216
217 // This one removes box on scroll event.
218 // It is to avoid box displacement.
219 editable.attachListener( win, 'scroll', function() {
220 if ( editor.mode != 'wysiwyg' )
221 return;
222
223 that.line.detach();
224
225 // To figure this out just look at the mouseup
226 // event handler below.
227 if ( env.webkit ) {
228 that.hiddenMode = 1;
229
230 clearTimeout( scrollTimeout );
231 scrollTimeout = setTimeout( function() {
232 // Don't leave hidden mode until mouse remains pressed and
233 // scroll is being used, i.e. when dragging something.
234 if ( !that.mouseDown )
235 that.hiddenMode = 0;
236 that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE%
237 }, 50 );
238
239 that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE%
240 }
241 } );
242
243 // Those event handlers remove the box on mousedown
244 // and don't reveal it until the mouse is released.
245 // It is to prevent box insertion e.g. while scrolling
246 // (w/ scrollbar), selecting and so on.
247 editable.attachListener( env_ie8 ? doc : win, 'mousedown', function() {
248 if ( editor.mode != 'wysiwyg' )
249 return;
250
251 that.line.detach();
252 that.hiddenMode = 1;
253 that.mouseDown = 1;
254
255 that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE%
256 } );
257
258 // Google Chrome doesn't trigger this on the scrollbar (since 2009...)
259 // so it is totally useless to check for scroll finish
260 // see: http://code.google.com/p/chromium/issues/detail?id=14204
261 editable.attachListener( env_ie8 ? doc : win, 'mouseup', function() {
262 that.hiddenMode = 0;
263 that.mouseDown = 0;
264 that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE%
265 } );
266
267 // Editor commands for accessing difficult focus spaces.
268 editor.addCommand( 'accessPreviousSpace', accessFocusSpaceCmd( that ) );
269 editor.addCommand( 'accessNextSpace', accessFocusSpaceCmd( that, true ) );
270
271 editor.setKeystroke( [
272 [ config.magicline_keystrokePrevious, 'accessPreviousSpace' ],
273 [ config.magicline_keystrokeNext, 'accessNextSpace' ]
274 ] );
275
276 // Revert magicline hot node on undo/redo.
277 editor.on( 'loadSnapshot', function() {
278 var elements, element, i;
279
280 for ( var t in { p: 1, br: 1, div: 1 } ) {
281 // document.find is not available in QM (#11149).
282 elements = editor.document.getElementsByTag( t );
283
284 for ( i = elements.count(); i--; ) {
285 if ( ( element = elements.getItem( i ) ).data( 'cke-magicline-hot' ) ) {
286 // Restore hotNode
287 that.hotNode = element;
288 // Restore last access direction
289 that.lastCmdDirection = element.data( 'cke-magicline-dir' ) === 'true' ? true : false;
290
291 return;
292 }
293 }
294 }
295 } );
296
297 // This method handles mousemove mouse for box toggling.
298 // It uses mouse position to determine underlying element, then
299 // it tries to use different trigger type in order to place the box
300 // in correct place. The following procedure is executed periodically.
301 function checkMouse( mouse ) {
302 that.debug.groupStart( 'CheckMouse' ); // %REMOVE_LINE%
303 that.debug.startTimer(); // %REMOVE_LINE%
304
305 that.mouse = mouse;
306 that.trigger = null;
307
308 checkMouseTimer = null;
309 updateWindowSize( that );
310
311 if (
312 checkMouseTimeoutPending && // There must be an event pending.
313 !that.hiddenMode && // Can't be in hidden mode.
314 editor.focusManager.hasFocus && // Editor must have focus.
315 !that.line.mouseNear() && // Mouse pointer can't be close to the box.
316 ( that.element = elementFromMouse( that, true ) ) // There must be valid element.
317 ) {
318 // If trigger exists, and trigger is correct -> show the box.
319 // Don't show the line if trigger is a descendant of some tabu-list element.
320 if ( ( that.trigger = triggerEditable( that ) || triggerEdge( that ) || triggerExpand( that ) ) &&
321 !isInTabu( that, that.trigger.upper || that.trigger.lower ) ) {
322 that.line.attach().place();
323 }
324
325 // Otherwise remove the box
326 else {
327 that.trigger = null;
328 that.line.detach();
329 }
330
331 that.debug.showTrigger( that.trigger ); // %REMOVE_LINE%
332 that.debug.mousePos( mouse.y, that.element ); // %REMOVE_LINE%
333
334 checkMouseTimeoutPending = false;
335 }
336
337 that.debug.stopTimer(); // %REMOVE_LINE%
338 that.debug.groupEnd(); // %REMOVE_LINE%
339 }
340
341 // This one allows testing and debugging. It reveals some
342 // inner methods to the world.
343 this.backdoor = {
344 accessFocusSpace: accessFocusSpace,
345 boxTrigger: boxTrigger,
346 isLine: isLine,
347 getAscendantTrigger: getAscendantTrigger,
348 getNonEmptyNeighbour: getNonEmptyNeighbour,
349 getSize: getSize,
350 that: that,
351 triggerEdge: triggerEdge,
352 triggerEditable: triggerEditable,
353 triggerExpand: triggerExpand
354 };
355 }
356 }
357
358 // Some shorthands for common methods to save bytes
359 var extend = CKEDITOR.tools.extend,
360 newElement = CKEDITOR.dom.element,
361 newElementFromHtml = newElement.createFromHtml,
362 env = CKEDITOR.env,
363 env_ie8 = CKEDITOR.env.ie && CKEDITOR.env.version < 9,
364 dtd = CKEDITOR.dtd,
365
366 // Global object associating enter modes with elements.
367 enterElements = {},
368
369 // Constant values, types and so on.
370 EDGE_TOP = 128,
371 EDGE_BOTTOM = 64,
372 EDGE_MIDDLE = 32,
373 TYPE_EDGE = 16,
374 TYPE_EXPAND = 8,
375 LOOK_TOP = 4,
376 LOOK_BOTTOM = 2,
377 LOOK_NORMAL = 1,
378 WHITE_SPACE = '\u00A0',
379 DTD_LISTITEM = dtd.$listItem,
380 DTD_TABLECONTENT = dtd.$tableContent,
381 DTD_NONACCESSIBLE = extend( {}, dtd.$nonEditable, dtd.$empty ),
382 DTD_BLOCK = dtd.$block,
383
384 // Minimum time that must elapse between two update*Size calls.
385 // It prevents constant getComuptedStyle calls and improves performance.
386 CACHE_TIME = 100,
387
388 // Shared CSS stuff for box elements
389 CSS_COMMON = 'width:0px;height:0px;padding:0px;margin:0px;display:block;' + 'z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;',
390 CSS_TRIANGLE = CSS_COMMON + 'border-color:transparent;display:block;border-style:solid;',
391 TRIANGLE_HTML = '<span>' + WHITE_SPACE + '</span>';
392
393 enterElements[ CKEDITOR.ENTER_BR ] = 'br';
394 enterElements[ CKEDITOR.ENTER_P ] = 'p';
395 enterElements[ CKEDITOR.ENTER_DIV ] = 'div';
396
397 function areSiblings( that, upper, lower ) {
398 return isHtml( upper ) && isHtml( lower ) && lower.equals( upper.getNext( function( node ) {
399 return !( isEmptyTextNode( node ) || isComment( node ) || isFlowBreaker( node ) );
400 } ) );
401 }
402
403 // boxTrigger is an abstract type which describes
404 // the relationship between elements that may result
405 // in showing the box.
406 //
407 // The following type is used by numerous methods
408 // to share information about the hypothetical box placement
409 // and look by referring to boxTrigger properties.
410 function boxTrigger( triggerSetup ) {
411 this.upper = triggerSetup[ 0 ];
412 this.lower = triggerSetup[ 1 ];
413 this.set.apply( this, triggerSetup.slice( 2 ) );
414 }
415
416 boxTrigger.prototype = {
417 set: function( edge, type, look ) {
418 this.properties = edge + type + ( look || LOOK_NORMAL );
419 return this;
420 },
421
422 is: function( property ) {
423 return ( this.properties & property ) == property;
424 }
425 };
426
427 var elementFromMouse = ( function() {
428 function elementFromPoint( doc, mouse ) {
429 var pointedElement = doc.$.elementFromPoint( mouse.x, mouse.y );
430
431 // IE9QM: from times to times it will return an empty object on scroll bar hover. (#12185)
432 return pointedElement && pointedElement.nodeType ?
433 new CKEDITOR.dom.element( pointedElement ) :
434 null;
435 }
436
437 return function( that, ignoreBox, forceMouse ) {
438 if ( !that.mouse )
439 return null;
440
441 var doc = that.doc,
442 lineWrap = that.line.wrap,
443 mouse = forceMouse || that.mouse,
444 // Note: element might be null.
445 element = elementFromPoint( doc, mouse );
446
447 // If ignoreBox is set and element is the box, it means that we
448 // need to hide the box for a while, repeat elementFromPoint
449 // and show it again.
450 if ( ignoreBox && isLine( that, element ) ) {
451 lineWrap.hide();
452 element = elementFromPoint( doc, mouse );
453 lineWrap.show();
454 }
455
456 // Return nothing if:
457 // \-> Element is not HTML.
458 if ( !( element && element.type == CKEDITOR.NODE_ELEMENT && element.$ ) )
459 return null;
460
461 // Also return nothing if:
462 // \-> We're IE<9 and element is out of the top-level element (editable for inline and HTML for classic (`iframe`-based)).
463 // This is due to the bug which allows IE<9 firing mouse events on element
464 // with contenteditable=true while doing selection out (far, away) of the element.
465 // Thus we must always be sure that we stay in editable or HTML.
466 if ( env.ie && env.version < 9 ) {
467 if ( !( that.boundary.equals( element ) || that.boundary.contains( element ) ) )
468 return null;
469 }
470
471 return element;
472 };
473 } )();
474
475 // Gets the closest parent node that belongs to triggers group.
476 function getAscendantTrigger( that ) {
477 var node = that.element,
478 trigger;
479
480 if ( node && isHtml( node ) ) {
481 trigger = node.getAscendant( that.triggers, true );
482
483 // If trigger is an element, neither editable nor editable's ascendant.
484 if ( trigger && that.editable.contains( trigger ) ) {
485 // Check for closest editable limit.
486 // Don't consider trigger as a limit as it may be nested editable (includeSelf=false) (#12009).
487 var limit = getClosestEditableLimit( trigger );
488
489 // Trigger in nested editable area.
490 if ( limit.getAttribute( 'contenteditable' ) == 'true' )
491 return trigger;
492 // Trigger in non-editable area.
493 else if ( limit.is( that.triggers ) )
494 return limit;
495 else
496 return null;
497 } else {
498 return null;
499 }
500 }
501
502 return null;
503 }
504
505 function getMidpoint( that, upper, lower ) {
506 updateSize( that, upper );
507 updateSize( that, lower );
508
509 var upperSizeBottom = upper.size.bottom,
510 lowerSizeTop = lower.size.top;
511
512 return upperSizeBottom && lowerSizeTop ? 0 | ( upperSizeBottom + lowerSizeTop ) / 2 : upperSizeBottom || lowerSizeTop;
513 }
514
515 // Get nearest node (either text or HTML), but:
516 // \-> Omit all empty text nodes (containing white characters only).
517 // \-> Omit BR elements
518 // \-> Omit flow breakers.
519 function getNonEmptyNeighbour( that, node, goBack ) {
520 node = node[ goBack ? 'getPrevious' : 'getNext' ]( function( node ) {
521 return ( isTextNode( node ) && !isEmptyTextNode( node ) ) ||
522 ( isHtml( node ) && !isFlowBreaker( node ) && !isLine( that, node ) );
523 } );
524
525 return node;
526 }
527
528 function inBetween( val, lower, upper ) {
529 return val > lower && val < upper;
530 }
531
532 // Returns the closest ancestor that has contenteditable attribute.
533 // Such ancestor is the limit of (non-)editable DOM branch that element
534 // belongs to. This method omits editor editable.
535 function getClosestEditableLimit( element, includeSelf ) {
536 if ( element.data( 'cke-editable' ) )
537 return null;
538
539 if ( !includeSelf )
540 element = element.getParent();
541
542 while ( element ) {
543 if ( element.data( 'cke-editable' ) )
544 return null;
545
546 if ( element.hasAttribute( 'contenteditable' ) )
547 return element;
548
549 element = element.getParent();
550 }
551
552 return null;
553 }
554
555 // Access space line consists of a few elements (spans):
556 // \-> Line wrapper.
557 // \-> Line.
558 // \-> Line triangles: left triangle (LT), right triangle (RT).
559 // \-> Button handler (BTN).
560 //
561 // +--------------------------------------------------- line.wrap (span) -----+
562 // | +---------------------------------------------------- line (span) -----+ |
563 // | | +- LT \ +- BTN -+ / RT -+ | |
564 // | | | \ | | | / | | |
565 // | | | / | <__| | \ | | |
566 // | | +-----/ +-------+ \-----+ | |
567 // | +----------------------------------------------------------------------+ |
568 // +--------------------------------------------------------------------------+
569 //
570 function initLine( that ) {
571 var doc = that.doc,
572 // This the main box element that holds triangles and the insertion button
573 line = newElementFromHtml( '<span contenteditable="false" style="' + CSS_COMMON + 'position:absolute;border-top:1px dashed ' + that.boxColor + '"></span>', doc ),
574 iconPath = CKEDITOR.getUrl( this.path + 'images/' + ( env.hidpi ? 'hidpi/' : '' ) + 'icon' + ( that.rtl ? '-rtl' : '' ) + '.png' );
575
576 extend( line, {
577
578 attach: function() {
579 // Only if not already attached
580 if ( !this.wrap.getParent() )
581 this.wrap.appendTo( that.editable, true );
582
583 return this;
584 },
585
586 // Looks are as follows: [ LOOK_TOP, LOOK_BOTTOM, LOOK_NORMAL ].
587 lineChildren: [
588 extend(
589 newElementFromHtml(
590 '<span title="' + that.editor.lang.magicline.title +
591 '" contenteditable="false">&#8629;</span>', doc
592 ), {
593 base: CSS_COMMON + 'height:17px;width:17px;' + ( that.rtl ? 'left' : 'right' ) + ':17px;' +
594 'background:url(' + iconPath + ') center no-repeat ' + that.boxColor + ';cursor:pointer;' +
595 ( env.hc ? 'font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;' : '' ) +
596 ( env.hidpi ? 'background-size: 9px 10px;' : '' ),
597 looks: [
598 'top:-8px; border-radius: 2px;',
599 'top:-17px; border-radius: 2px 2px 0px 0px;',
600 'top:-1px; border-radius: 0px 0px 2px 2px;'
601 ]
602 }
603 ),
604 extend( newElementFromHtml( TRIANGLE_HTML, doc ), {
605 base: CSS_TRIANGLE + 'left:0px;border-left-color:' + that.boxColor + ';',
606 looks: [
607 'border-width:8px 0 8px 8px;top:-8px',
608 'border-width:8px 0 0 8px;top:-8px',
609 'border-width:0 0 8px 8px;top:0px'
610 ]
611 } ),
612 extend( newElementFromHtml( TRIANGLE_HTML, doc ), {
613 base: CSS_TRIANGLE + 'right:0px;border-right-color:' + that.boxColor + ';',
614 looks: [
615 'border-width:8px 8px 8px 0;top:-8px',
616 'border-width:8px 8px 0 0;top:-8px',
617 'border-width:0 8px 8px 0;top:0px'
618 ]
619 } )
620 ],
621
622 detach: function() {
623 // Detach only if already attached.
624 if ( this.wrap.getParent() )
625 this.wrap.remove();
626
627 return this;
628 },
629
630 // Checks whether mouseY is around an element by comparing boundaries and considering
631 // an offset distance.
632 mouseNear: function() {
633 that.debug.groupStart( 'mouseNear' ); // %REMOVE_LINE%
634
635 updateSize( that, this );
636 var offset = that.holdDistance,
637 size = this.size;
638
639 // Determine neighborhood by element dimensions and offsets.
640 if ( size && inBetween( that.mouse.y, size.top - offset, size.bottom + offset ) && inBetween( that.mouse.x, size.left - offset, size.right + offset ) ) {
641 that.debug.logEnd( 'Mouse is near.' ); // %REMOVE_LINE%
642 return true;
643 }
644
645 that.debug.logEnd( 'Mouse isn\'t near.' ); // %REMOVE_LINE%
646 return false;
647 },
648
649 // Adjusts position of the box according to the trigger properties.
650 // If also affects look of the box depending on the type of the trigger.
651 place: function() {
652 var view = that.view,
653 editable = that.editable,
654 trigger = that.trigger,
655 upper = trigger.upper,
656 lower = trigger.lower,
657 any = upper || lower,
658 parent = any.getParent(),
659 styleSet = {};
660
661 // Save recent trigger for further insertion.
662 // It is necessary due to the fact, that that.trigger may
663 // contain different boxTrigger at the moment of insertion
664 // or may be even null.
665 this.trigger = trigger;
666
667 upper && updateSize( that, upper, true );
668 lower && updateSize( that, lower, true );
669 updateSize( that, parent, true );
670
671 // Yeah, that's gonna be useful in inline-mode case.
672 if ( that.inInlineMode )
673 updateEditableSize( that, true );
674
675 // Set X coordinate (left, right, width).
676 if ( parent.equals( editable ) ) {
677 styleSet.left = view.scroll.x;
678 styleSet.right = -view.scroll.x;
679 styleSet.width = '';
680 } else {
681 styleSet.left = any.size.left - any.size.margin.left + view.scroll.x - ( that.inInlineMode ? view.editable.left + view.editable.border.left : 0 );
682 styleSet.width = any.size.outerWidth + any.size.margin.left + any.size.margin.right + view.scroll.x;
683 styleSet.right = '';
684 }
685
686 // Set Y coordinate (top) for trigger consisting of two elements.
687 if ( upper && lower ) {
688 // No margins at all or they're equal. Place box right between.
689 if ( upper.size.margin.bottom === lower.size.margin.top )
690 styleSet.top = 0 | ( upper.size.bottom + upper.size.margin.bottom / 2 );
691 else {
692 // Upper margin < lower margin. Place at lower margin.
693 if ( upper.size.margin.bottom < lower.size.margin.top )
694 styleSet.top = upper.size.bottom + upper.size.margin.bottom;
695 // Upper margin > lower margin. Place at upper margin - lower margin.
696 else
697 styleSet.top = upper.size.bottom + upper.size.margin.bottom - lower.size.margin.top;
698 }
699 }
700 // Set Y coordinate (top) for single-edge trigger.
701 else if ( !upper )
702 styleSet.top = lower.size.top - lower.size.margin.top;
703 else if ( !lower ) {
704 styleSet.top = upper.size.bottom + upper.size.margin.bottom;
705 }
706
707 // Set box button modes if close to the viewport horizontal edge
708 // or look forced by the trigger.
709 if ( trigger.is( LOOK_TOP ) || inBetween( styleSet.top, view.scroll.y - 15, view.scroll.y + 5 ) ) {
710 styleSet.top = that.inInlineMode ? 0 : view.scroll.y;
711 this.look( LOOK_TOP );
712 } else if ( trigger.is( LOOK_BOTTOM ) || inBetween( styleSet.top, view.pane.bottom - 5, view.pane.bottom + 15 ) ) {
713 styleSet.top = that.inInlineMode ? (
714 view.editable.height + view.editable.padding.top + view.editable.padding.bottom
715 ) : (
716 view.pane.bottom - 1
717 );
718
719 this.look( LOOK_BOTTOM );
720 } else {
721 if ( that.inInlineMode )
722 styleSet.top -= view.editable.top + view.editable.border.top;
723
724 this.look( LOOK_NORMAL );
725 }
726
727 if ( that.inInlineMode ) {
728 // 1px bug here...
729 styleSet.top--;
730
731 // Consider the editable to be an element with overflow:scroll
732 // and non-zero scrollTop/scrollLeft value.
733 // For example: divarea editable. (#9383)
734 styleSet.top += view.editable.scroll.top;
735 styleSet.left += view.editable.scroll.left;
736 }
737
738 // Append `px` prefixes.
739 for ( var style in styleSet )
740 styleSet[ style ] = CKEDITOR.tools.cssLength( styleSet[ style ] );
741
742 this.setStyles( styleSet );
743 },
744
745 // Changes look of the box according to current needs.
746 // Three different styles are available: [ LOOK_TOP, LOOK_BOTTOM, LOOK_NORMAL ].
747 look: function( look ) {
748 if ( this.oldLook == look )
749 return;
750
751 for ( var i = this.lineChildren.length, child; i--; )
752 ( child = this.lineChildren[ i ] ).setAttribute( 'style', child.base + child.looks[ 0 | look / 2 ] );
753
754 this.oldLook = look;
755 },
756
757 wrap: new newElement( 'span', that.doc )
758
759 } );
760
761 // Insert children into the box.
762 for ( var i = line.lineChildren.length; i--; )
763 line.lineChildren[ i ].appendTo( line );
764
765 // Set default look of the box.
766 line.look( LOOK_NORMAL );
767
768 // Using that wrapper prevents IE (8,9) from resizing editable area at the moment
769 // of box insertion. This works thanks to the fact, that positioned box is wrapped by
770 // an inline element. So much tricky.
771 line.appendTo( line.wrap );
772
773 // Make the box unselectable.
774 line.unselectable();
775
776 // Handle accessSpace node insertion.
777 line.lineChildren[ 0 ].on( 'mouseup', function( event ) {
778 line.detach();
779
780 accessFocusSpace( that, function( accessNode ) {
781 // Use old trigger that was saved by 'place' method. Look: line.place
782 var trigger = that.line.trigger;
783
784 accessNode[ trigger.is( EDGE_TOP ) ? 'insertBefore' : 'insertAfter' ](
785 trigger.is( EDGE_TOP ) ? trigger.lower : trigger.upper );
786 }, true );
787
788 that.editor.focus();
789
790 if ( !env.ie && that.enterMode != CKEDITOR.ENTER_BR )
791 that.hotNode.scrollIntoView();
792
793 event.data.preventDefault( true );
794 } );
795
796 // Prevents IE9 from displaying the resize box and disables drag'n'drop functionality.
797 line.on( 'mousedown', function( event ) {
798 event.data.preventDefault( true );
799 } );
800
801 that.line = line;
802 }
803
804 // This function allows accessing any focus space according to the insert function:
805 // * For enterMode ENTER_P it creates P element filled with dummy white-space.
806 // * For enterMode ENTER_DIV it creates DIV element filled with dummy white-space.
807 // * For enterMode ENTER_BR it creates BR element or &nbsp; in IE.
808 //
809 // The node is being inserted according to insertFunction. Finally the method
810 // selects the non-breaking space making the node ready for typing.
811 function accessFocusSpace( that, insertFunction, doSave ) {
812 var range = new CKEDITOR.dom.range( that.doc ),
813 editor = that.editor,
814 accessNode;
815
816 // IE requires text node of &nbsp; in ENTER_BR mode.
817 if ( env.ie && that.enterMode == CKEDITOR.ENTER_BR )
818 accessNode = that.doc.createText( WHITE_SPACE );
819
820 // In other cases a regular element is used.
821 else {
822 // Use the enterMode of editable's limit or editor's
823 // enter mode if not in nested editable.
824 var limit = getClosestEditableLimit( that.element, true ),
825
826 // This is an enter mode for the context. We cannot use
827 // editor.activeEnterMode because the focused nested editable will
828 // have a different enterMode as editor but magicline will be inserted
829 // directly into editor's editable.
830 enterMode = limit && limit.data( 'cke-enter-mode' ) || that.enterMode;
831
832 accessNode = new newElement( enterElements[ enterMode ], that.doc );
833
834 if ( !accessNode.is( 'br' ) ) {
835 var dummy = that.doc.createText( WHITE_SPACE );
836 dummy.appendTo( accessNode );
837 }
838 }
839
840 doSave && editor.fire( 'saveSnapshot' );
841
842 insertFunction( accessNode );
843 //dummy.appendTo( accessNode );
844 range.moveToPosition( accessNode, CKEDITOR.POSITION_AFTER_START );
845 editor.getSelection().selectRanges( [ range ] );
846 that.hotNode = accessNode;
847
848 doSave && editor.fire( 'saveSnapshot' );
849 }
850
851 // Access focus space on demand by taking an element under the caret as a reference.
852 // The space is accessed provided the element under the caret is trigger AND:
853 //
854 // 1. First/last-child of its parent:
855 // +----------------------- Parent element -+
856 // | +------------------------------ DIV -+ | <-- Access before
857 // | | Foo^ | |
858 // | | | |
859 // | +------------------------------------+ | <-- Access after
860 // +----------------------------------------+
861 //
862 // OR
863 //
864 // 2. It has a direct sibling element, which is also a trigger:
865 // +-------------------------------- DIV#1 -+
866 // | Foo^ |
867 // | |
868 // +----------------------------------------+
869 // <-- Access here
870 // +-------------------------------- DIV#2 -+
871 // | Bar |
872 // | |
873 // +----------------------------------------+
874 //
875 // OR
876 //
877 // 3. It has a direct sibling, which is a trigger and has a valid neighbour trigger,
878 // but belongs to dtd.$.empty/nonEditable:
879 // +------------------------------------ P -+
880 // | Foo^ |
881 // | |
882 // +----------------------------------------+
883 // +----------------------------------- HR -+
884 // <-- Access here
885 // +-------------------------------- DIV#2 -+
886 // | Bar |
887 // | |
888 // +----------------------------------------+
889 //
890 function accessFocusSpaceCmd( that, insertAfter ) {
891 return {
892 canUndo: true,
893 modes: { wysiwyg: 1 },
894 exec: ( function() {
895
896 // Inserts line (accessNode) at the position by taking target node as a reference.
897 function doAccess( target ) {
898 // Remove old hotNode under certain circumstances.
899 var hotNodeChar = ( env.ie && env.version < 9 ? ' ' : WHITE_SPACE ),
900 removeOld = that.hotNode && // Old hotNode must exist.
901 that.hotNode.getText() == hotNodeChar && // Old hotNode hasn't been changed.
902 that.element.equals( that.hotNode ) && // Caret is inside old hotNode.
903 // Command is executed in the same direction.
904 that.lastCmdDirection === !!insertAfter; // jshint ignore:line
905
906 accessFocusSpace( that, function( accessNode ) {
907 if ( removeOld && that.hotNode )
908 that.hotNode.remove();
909
910 accessNode[ insertAfter ? 'insertAfter' : 'insertBefore' ]( target );
911
912 // Make this element distinguishable. Also remember the direction
913 // it's been inserted into document.
914 accessNode.setAttributes( {
915 'data-cke-magicline-hot': 1,
916 'data-cke-magicline-dir': !!insertAfter
917 } );
918
919 // Save last direction of the command (is insertAfter?).
920 that.lastCmdDirection = !!insertAfter;
921 } );
922
923 if ( !env.ie && that.enterMode != CKEDITOR.ENTER_BR )
924 that.hotNode.scrollIntoView();
925
926 // Detach the line if was visible (previously triggered by mouse).
927 that.line.detach();
928 }
929
930 return function( editor ) {
931 var selected = editor.getSelection().getStartElement(),
932 limit;
933
934 // (#9833) Go down to the closest non-inline element in DOM structure
935 // since inline elements don't participate in in magicline.
936 selected = selected.getAscendant( DTD_BLOCK, 1 );
937
938 // Stop if selected is a child of a tabu-list element.
939 if ( isInTabu( that, selected ) )
940 return;
941
942 // Sometimes it may happen that there's no parent block below selected element
943 // or, for example, getAscendant reaches editable or editable parent.
944 // We must avoid such pathological cases.
945 if ( !selected || selected.equals( that.editable ) || selected.contains( that.editable ) )
946 return;
947
948 // Executing the command directly in nested editable should
949 // access space before/after it.
950 if ( ( limit = getClosestEditableLimit( selected ) ) && limit.getAttribute( 'contenteditable' ) == 'false' )
951 selected = limit;
952
953 // That holds element from mouse. Replace it with the
954 // element under the caret.
955 that.element = selected;
956
957 // (3.) Handle the following cases where selected neighbour
958 // is a trigger inaccessible for the caret AND:
959 // - Is first/last-child
960 // OR
961 // - Has a sibling, which is also a trigger.
962 var neighbor = getNonEmptyNeighbour( that, selected, !insertAfter ),
963 neighborSibling;
964
965 // Check for a neighbour that belongs to triggers.
966 // Consider only non-accessible elements (they cannot have any children)
967 // since they cannot be given a caret inside, to run the command
968 // the regular way (1. & 2.).
969 if (
970 isHtml( neighbor ) && neighbor.is( that.triggers ) && neighbor.is( DTD_NONACCESSIBLE ) &&
971 (
972 // Check whether neighbor is first/last-child.
973 !getNonEmptyNeighbour( that, neighbor, !insertAfter ) ||
974 // Check for a sibling of a neighbour that also is a trigger.
975 (
976 ( neighborSibling = getNonEmptyNeighbour( that, neighbor, !insertAfter ) ) &&
977 isHtml( neighborSibling ) &&
978 neighborSibling.is( that.triggers )
979 )
980 )
981 ) {
982 doAccess( neighbor );
983 return;
984 }
985
986 // Look for possible target element DOWN "selected" DOM branch (towards editable)
987 // that belong to that.triggers
988 var target = getAscendantTrigger( that, selected );
989
990 // No HTML target -> no access.
991 if ( !isHtml( target ) )
992 return;
993
994 // (1.) Target is first/last child -> access.
995 if ( !getNonEmptyNeighbour( that, target, !insertAfter ) ) {
996 doAccess( target );
997 return;
998 }
999
1000 var sibling = getNonEmptyNeighbour( that, target, !insertAfter );
1001
1002 // (2.) Target has a sibling that belongs to that.triggers -> access.
1003 if ( sibling && isHtml( sibling ) && sibling.is( that.triggers ) ) {
1004 doAccess( target );
1005 return;
1006 }
1007 };
1008 } )()
1009 };
1010 }
1011
1012 function isLine( that, node ) {
1013 if ( !( node && node.type == CKEDITOR.NODE_ELEMENT && node.$ ) )
1014 return false;
1015
1016 var line = that.line;
1017
1018 return line.wrap.equals( node ) || line.wrap.contains( node );
1019 }
1020
1021 // Is text node containing white-spaces only?
1022 var isEmptyTextNode = CKEDITOR.dom.walker.whitespaces();
1023
1024 // Is fully visible HTML node?
1025 function isHtml( node ) {
1026 return node && node.type == CKEDITOR.NODE_ELEMENT && node.$; // IE requires that
1027 }
1028
1029 function isFloated( element ) {
1030 if ( !isHtml( element ) )
1031 return false;
1032
1033 var options = { left: 1, right: 1, center: 1 };
1034
1035 return !!( options[ element.getComputedStyle( 'float' ) ] || options[ element.getAttribute( 'align' ) ] );
1036 }
1037
1038 function isFlowBreaker( element ) {
1039 if ( !isHtml( element ) )
1040 return false;
1041
1042 return isPositioned( element ) || isFloated( element );
1043 }
1044
1045 // Isn't node of NODE_COMMENT type?
1046 var isComment = CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_COMMENT );
1047
1048 function isPositioned( element ) {
1049 return !!{ absolute: 1, fixed: 1 }[ element.getComputedStyle( 'position' ) ];
1050 }
1051
1052 // Is text node?
1053 function isTextNode( node ) {
1054 return node && node.type == CKEDITOR.NODE_TEXT;
1055 }
1056
1057 function isTrigger( that, element ) {
1058 return isHtml( element ) ? element.is( that.triggers ) : null;
1059 }
1060
1061 function isInTabu( that, element ) {
1062 if ( !element )
1063 return false;
1064
1065 var parents = element.getParents( 1 );
1066
1067 for ( var i = parents.length ; i-- ; ) {
1068 for ( var j = that.tabuList.length ; j-- ; ) {
1069 if ( parents[ i ].hasAttribute( that.tabuList[ j ] ) )
1070 return true;
1071 }
1072 }
1073
1074 return false;
1075 }
1076
1077 // This function checks vertically is there's a relevant child between element's edge
1078 // and the pointer.
1079 // \-> Table contents are omitted.
1080 function isChildBetweenPointerAndEdge( that, parent, edgeBottom ) {
1081 var edgeChild = parent[ edgeBottom ? 'getLast' : 'getFirst' ]( function( node ) {
1082 return that.isRelevant( node ) && !node.is( DTD_TABLECONTENT );
1083 } );
1084
1085 if ( !edgeChild )
1086 return false;
1087
1088 updateSize( that, edgeChild );
1089
1090 return edgeBottom ? edgeChild.size.top > that.mouse.y : edgeChild.size.bottom < that.mouse.y;
1091 }
1092
1093 // This method handles edge cases:
1094 // \-> Mouse is around upper or lower edge of view pane.
1095 // \-> Also scroll position is either minimal or maximal.
1096 // \-> It's OK to show LOOK_TOP(BOTTOM) type line.
1097 //
1098 // This trigger doesn't need additional post-filtering.
1099 //
1100 // +----------------------------- Editable -+ /--
1101 // | +---------------------- First child -+ | | <-- Top edge (first child)
1102 // | | | | |
1103 // | | | | | * Mouse activation area *
1104 // | | | | |
1105 // | | ... | | \-- Top edge + trigger offset
1106 // | . . |
1107 // | |
1108 // | . . |
1109 // | | ... | | /-- Bottom edge - trigger offset
1110 // | | | | |
1111 // | | | | | * Mouse activation area *
1112 // | | | | |
1113 // | +----------------------- Last child -+ | | <-- Bottom edge (last child)
1114 // +----------------------------------------+ \--
1115 //
1116 function triggerEditable( that ) {
1117 that.debug.groupStart( 'triggerEditable' ); // %REMOVE_LINE%
1118
1119 var editable = that.editable,
1120 mouse = that.mouse,
1121 view = that.view,
1122 triggerOffset = that.triggerOffset,
1123 triggerLook;
1124
1125 // Update editable dimensions.
1126 updateEditableSize( that );
1127
1128 // This flag determines whether checking bottom trigger.
1129 var bottomTrigger = mouse.y > (
1130 that.inInlineMode ? (
1131 view.editable.top + view.editable.height / 2
1132 ) : (
1133 // This is to handle case when editable.height / 2 <<< pane.height.
1134 Math.min( view.editable.height, view.pane.height ) / 2
1135 )
1136 ),
1137
1138 // Edge node according to bottomTrigger.
1139 edgeNode = editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( function( node ) {
1140 return !( isEmptyTextNode( node ) || isComment( node ) );
1141 } );
1142
1143 // There's no edge node. Abort.
1144 if ( !edgeNode ) {
1145 that.debug.logEnd( 'ABORT. No edge node found.' ); // %REMOVE_LINE%
1146 return null;
1147 }
1148
1149 // If the edgeNode in editable is ML, get the next one.
1150 if ( isLine( that, edgeNode ) ) {
1151 edgeNode = that.line.wrap[ bottomTrigger ? 'getPrevious' : 'getNext' ]( function( node ) {
1152 return !( isEmptyTextNode( node ) || isComment( node ) );
1153 } );
1154 }
1155
1156 // Exclude bad nodes (no ML needed then):
1157 // \-> Edge node is text.
1158 // \-> Edge node is floated, etc.
1159 //
1160 // Edge node *must be* a valid trigger at this stage as well.
1161 if ( !isHtml( edgeNode ) || isFlowBreaker( edgeNode ) || !isTrigger( that, edgeNode ) ) {
1162 that.debug.logEnd( 'ABORT. Invalid edge node.' ); // %REMOVE_LINE%
1163 return null;
1164 }
1165
1166 // Update size of edge node. Dimensions will be necessary.
1167 updateSize( that, edgeNode );
1168
1169 // Return appropriate trigger according to bottomTrigger.
1170 // \-> Top edge trigger case first.
1171 if ( !bottomTrigger && // Top trigger case.
1172 edgeNode.size.top >= 0 && // Check if the first element is fully visible.
1173 inBetween( mouse.y, 0, edgeNode.size.top + triggerOffset ) ) { // Check if mouse in [0, edgeNode.top + triggerOffset].
1174
1175 // Determine trigger look.
1176 triggerLook = that.inInlineMode || view.scroll.y === 0 ?
1177 LOOK_TOP : LOOK_NORMAL;
1178
1179 that.debug.logEnd( 'SUCCESS. Created box trigger. EDGE_TOP.' ); // %REMOVE_LINE%
1180
1181 return new boxTrigger( [ null, edgeNode,
1182 EDGE_TOP,
1183 TYPE_EDGE,
1184 triggerLook
1185 ] );
1186 }
1187
1188 // \-> Bottom case.
1189 else if ( bottomTrigger &&
1190 edgeNode.size.bottom <= view.pane.height && // Check if the last element is fully visible
1191 inBetween( mouse.y, // Check if mouse in...
1192 edgeNode.size.bottom - triggerOffset, view.pane.height ) ) { // [ edgeNode.bottom - triggerOffset, paneHeight ]
1193
1194 // Determine trigger look.
1195 triggerLook = that.inInlineMode ||
1196 inBetween( edgeNode.size.bottom, view.pane.height - triggerOffset, view.pane.height ) ?
1197 LOOK_BOTTOM : LOOK_NORMAL;
1198
1199 that.debug.logEnd( 'SUCCESS. Created box trigger. EDGE_BOTTOM.' ); // %REMOVE_LINE%
1200
1201 return new boxTrigger( [ edgeNode, null,
1202 EDGE_BOTTOM,
1203 TYPE_EDGE,
1204 triggerLook
1205 ] );
1206 }
1207
1208 that.debug.logEnd( 'ABORT. No trigger created.' ); // %REMOVE_LINE%
1209 return null;
1210 }
1211
1212 // This method covers cases *inside* of an element:
1213 // \-> The pointer is in the top (bottom) area of an element and there's
1214 // HTML node before (after) this element.
1215 // \-> An element being the first or last child of its parent.
1216 //
1217 // +----------------------- Parent element -+
1218 // | +----------------------- Element #1 -+ | /--
1219 // | | | | | * Mouse activation area (as first child) *
1220 // | | | | \--
1221 // | | | | /--
1222 // | | | | | * Mouse activation area (Element #2) *
1223 // | +------------------------------------+ | \--
1224 // | |
1225 // | +----------------------- Element #2 -+ | /--
1226 // | | | | | * Mouse activation area (Element #1) *
1227 // | | | | \--
1228 // | | | |
1229 // | +------------------------------------+ |
1230 // | |
1231 // | Text node is here. |
1232 // | |
1233 // | +----------------------- Element #3 -+ |
1234 // | | | |
1235 // | | | |
1236 // | | | | /--
1237 // | | | | | * Mouse activation area (as last child) *
1238 // | +------------------------------------+ | \--
1239 // +----------------------------------------+
1240 //
1241 function triggerEdge( that ) {
1242 that.debug.groupStart( 'triggerEdge' ); // %REMOVE_LINE%
1243
1244 var mouse = that.mouse,
1245 view = that.view,
1246 triggerOffset = that.triggerOffset;
1247
1248 // Get the ascendant trigger basing on elementFromMouse.
1249 var element = getAscendantTrigger( that );
1250
1251 that.debug.logElements( [ element ], [ 'Ascendant trigger' ], 'First stage' ); // %REMOVE_LINE%
1252
1253 // Abort if there's no appropriate element.
1254 if ( !element ) {
1255 that.debug.logEnd( 'ABORT. No element, element is editable or element contains editable.' ); // %REMOVE_LINE%
1256 return null;
1257 }
1258
1259 // Dimensions will be necessary.
1260 updateSize( that, element );
1261
1262 // If triggerOffset is larger than a half of element's height,
1263 // use an offset of 1/2 of element's height. If the offset wasn't reduced,
1264 // top area would cover most (all) cases.
1265 var fixedOffset = Math.min( triggerOffset,
1266 0 | ( element.size.outerHeight / 2 ) ),
1267
1268 // This variable will hold the trigger to be returned.
1269 triggerSetup = [],
1270 triggerLook,
1271
1272 // This flag determines whether dealing with a bottom trigger.
1273 bottomTrigger;
1274
1275 // \-> Top trigger.
1276 if ( inBetween( mouse.y, element.size.top - 1, element.size.top + fixedOffset ) )
1277 bottomTrigger = false;
1278 // \-> Bottom trigger.
1279 else if ( inBetween( mouse.y, element.size.bottom - fixedOffset, element.size.bottom + 1 ) )
1280 bottomTrigger = true;
1281 // \-> Abort. Not in a valid trigger space.
1282 else {
1283 that.debug.logEnd( 'ABORT. Not around of any edge.' ); // %REMOVE_LINE%
1284 return null;
1285 }
1286
1287 // Reject wrong elements.
1288 // \-> Reject an element which is a flow breaker.
1289 // \-> Reject an element which has a child above/below the mouse pointer.
1290 // \-> Reject an element which belongs to list items.
1291 if (
1292 isFlowBreaker( element ) ||
1293 isChildBetweenPointerAndEdge( that, element, bottomTrigger ) ||
1294 element.getParent().is( DTD_LISTITEM )
1295 ) {
1296 that.debug.logEnd( 'ABORT. element is wrong', element ); // %REMOVE_LINE%
1297 return null;
1298 }
1299
1300 // Get sibling according to bottomTrigger.
1301 var elementSibling = getNonEmptyNeighbour( that, element, !bottomTrigger );
1302
1303 // No sibling element.
1304 // This is a first or last child case.
1305 if ( !elementSibling ) {
1306 // No need to reject the element as it has already been done before.
1307 // Prepare a trigger.
1308
1309 // Determine trigger look.
1310 if ( element.equals( that.editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( that.isRelevant ) ) ) {
1311 updateEditableSize( that );
1312
1313 if (
1314 bottomTrigger && inBetween( mouse.y,
1315 element.size.bottom - fixedOffset, view.pane.height ) &&
1316 inBetween( element.size.bottom, view.pane.height - fixedOffset, view.pane.height )
1317 ) {
1318 triggerLook = LOOK_BOTTOM;
1319 } else if ( inBetween( mouse.y, 0, element.size.top + fixedOffset ) ) {
1320 triggerLook = LOOK_TOP;
1321 }
1322 } else {
1323 triggerLook = LOOK_NORMAL;
1324 }
1325
1326 triggerSetup = [ null, element ][ bottomTrigger ? 'reverse' : 'concat' ]().concat( [
1327 bottomTrigger ? EDGE_BOTTOM : EDGE_TOP,
1328 TYPE_EDGE,
1329 triggerLook,
1330 element.equals( that.editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( that.isRelevant ) ) ?
1331 ( bottomTrigger ? LOOK_BOTTOM : LOOK_TOP ) : LOOK_NORMAL
1332 ] );
1333
1334 that.debug.log( 'Configured edge trigger of ' + ( bottomTrigger ? 'EDGE_BOTTOM' : 'EDGE_TOP' ) ); // %REMOVE_LINE%
1335 }
1336
1337 // Abort. Sibling is a text element.
1338 else if ( isTextNode( elementSibling ) ) {
1339 that.debug.logEnd( 'ABORT. Sibling is non-empty text element' ); // %REMOVE_LINE%
1340 return null;
1341 }
1342
1343 // Check if the sibling is a HTML element.
1344 // If so, create an TYPE_EDGE, EDGE_MIDDLE trigger.
1345 else if ( isHtml( elementSibling ) ) {
1346 // Reject wrong elementSiblings.
1347 // \-> Reject an elementSibling which is a flow breaker.
1348 // \-> Reject an elementSibling which isn't a trigger.
1349 // \-> Reject an elementSibling which belongs to list items.
1350 if (
1351 isFlowBreaker( elementSibling ) ||
1352 !isTrigger( that, elementSibling ) ||
1353 elementSibling.getParent().is( DTD_LISTITEM )
1354 ) {
1355 that.debug.logEnd( 'ABORT. elementSibling is wrong', elementSibling ); // %REMOVE_LINE%
1356 return null;
1357 }
1358
1359 // Prepare a trigger.
1360 triggerSetup = [ elementSibling, element ][ bottomTrigger ? 'reverse' : 'concat' ]().concat( [
1361 EDGE_MIDDLE,
1362 TYPE_EDGE
1363 ] );
1364
1365 that.debug.log( 'Configured edge trigger of EDGE_MIDDLE' ); // %REMOVE_LINE%
1366 }
1367
1368 if ( 0 in triggerSetup ) {
1369 that.debug.logEnd( 'SUCCESS. Returning a trigger.' ); // %REMOVE_LINE%
1370 return new boxTrigger( triggerSetup );
1371 }
1372
1373 that.debug.logEnd( 'ABORT. No trigger generated.' ); // %REMOVE_LINE%
1374 return null;
1375 }
1376
1377 // Checks iteratively up and down in search for elements using elementFromMouse method.
1378 // Useful if between two triggers.
1379 //
1380 // +----------------------- Parent element -+
1381 // | +----------------------- Element #1 -+ |
1382 // | | | |
1383 // | | | |
1384 // | | | |
1385 // | +------------------------------------+ |
1386 // | | /--
1387 // | . | |
1388 // | . +-- Floated -+ | |
1389 // | | | | | | * Mouse activation area *
1390 // | | | IGNORE | | |
1391 // | X | | | | Method searches vertically for sibling elements.
1392 // | | +------------+ | | Start point is X (mouse-y coordinate).
1393 // | | | | Floated elements, comments and empty text nodes are omitted.
1394 // | . | |
1395 // | . | |
1396 // | | \--
1397 // | +----------------------- Element #2 -+ |
1398 // | | | |
1399 // | | | |
1400 // | | | |
1401 // | | | |
1402 // | +------------------------------------+ |
1403 // +----------------------------------------+
1404 //
1405 var triggerExpand = ( function() {
1406 // The heart of the procedure. This method creates triggers that are
1407 // filtered by expandFilter method.
1408 function expandEngine( that ) {
1409 that.debug.groupStart( 'expandEngine' ); // %REMOVE_LINE%
1410
1411 var startElement = that.element,
1412 upper, lower, trigger;
1413
1414 if ( !isHtml( startElement ) || startElement.contains( that.editable ) ) {
1415 that.debug.logEnd( 'ABORT. No start element, or start element contains editable.' ); // %REMOVE_LINE%
1416 return null;
1417 }
1418
1419 // Stop searching if element is in non-editable branch of DOM.
1420 if ( startElement.isReadOnly() )
1421 return null;
1422
1423 trigger = verticalSearch( that,
1424 function( current, startElement ) {
1425 return !startElement.equals( current ); // stop when start element and the current one differ
1426 }, function( that, mouse ) {
1427 return elementFromMouse( that, true, mouse );
1428 }, startElement ),
1429
1430 upper = trigger.upper,
1431 lower = trigger.lower;
1432
1433 that.debug.logElements( [ upper, lower ], [ 'Upper', 'Lower' ], 'Pair found' ); // %REMOVE_LINE%
1434
1435 // Success: two siblings have been found
1436 if ( areSiblings( that, upper, lower ) ) {
1437 that.debug.logEnd( 'SUCCESS. Expand trigger created.' ); // %REMOVE_LINE%
1438 return trigger.set( EDGE_MIDDLE, TYPE_EXPAND );
1439 }
1440
1441 that.debug.logElements( [ startElement, upper, lower ], // %REMOVE_LINE%
1442 [ 'Start', 'Upper', 'Lower' ], 'Post-processing' ); // %REMOVE_LINE%
1443
1444 // Danger. Dragons ahead.
1445 // No siblings have been found during previous phase, post-processing may be necessary.
1446 // We can traverse DOM until a valid pair of elements around the pointer is found.
1447
1448 // Prepare for post-processing:
1449 // 1. Determine if upper and lower are children of startElement.
1450 // 1.1. If so, find their ascendants that are closest to startElement (one level deeper than startElement).
1451 // 1.2. Otherwise use first/last-child of the startElement as upper/lower. Why?:
1452 // a) upper/lower belongs to another branch of the DOM tree.
1453 // b) verticalSearch encountered an edge of the viewport and failed.
1454 // 1.3. Make sure upper and lower still exist. Why?:
1455 // a) Upper and lower may be not belong to the branch of the startElement (may not exist at all) and
1456 // startElement has no children.
1457 // 2. Perform the post-processing.
1458 // 2.1. Gather dimensions of an upper element.
1459 // 2.2. Abort if lower edge of upper is already under the mouse pointer. Why?:
1460 // a) We expect upper to be above and lower below the mouse pointer.
1461 // 3. Perform iterative search while upper != lower.
1462 // 3.1. Find the upper-next element. If there's no such element, break current search. Why?:
1463 // a) There's no point in further search if there are only text nodes ahead.
1464 // 3.2. Calculate the distance between the middle point of ( upper, upperNext ) and mouse-y.
1465 // 3.3. If the distance is shorter than the previous best, save it (save upper, upperNext as well).
1466 // 3.4. If the optimal pair is found, assign it back to the trigger.
1467
1468 // 1.1., 1.2.
1469 if ( upper && startElement.contains( upper ) ) {
1470 while ( !upper.getParent().equals( startElement ) )
1471 upper = upper.getParent();
1472 } else {
1473 upper = startElement.getFirst( function( node ) {
1474 return expandSelector( that, node );
1475 } );
1476 }
1477
1478 if ( lower && startElement.contains( lower ) ) {
1479 while ( !lower.getParent().equals( startElement ) )
1480 lower = lower.getParent();
1481 } else {
1482 lower = startElement.getLast( function( node ) {
1483 return expandSelector( that, node );
1484 } );
1485 }
1486
1487 // 1.3.
1488 if ( !upper || !lower ) {
1489 that.debug.logEnd( 'ABORT. There is no upper or no lower element.' ); // %REMOVE_LINE%
1490 return null;
1491 }
1492
1493 // 2.1.
1494 updateSize( that, upper );
1495 updateSize( that, lower );
1496
1497 if ( !checkMouseBetweenElements( that, upper, lower ) ) {
1498 that.debug.logEnd( 'ABORT. Mouse is already above upper or below lower.' ); // %REMOVE_LINE%
1499 return null;
1500 }
1501
1502 var minDistance = Number.MAX_VALUE,
1503 currentDistance, upperNext, minElement, minElementNext;
1504
1505 while ( lower && !lower.equals( upper ) ) {
1506 // 3.1.
1507 if ( !( upperNext = upper.getNext( that.isRelevant ) ) )
1508 break;
1509
1510 // 3.2.
1511 currentDistance = Math.abs( getMidpoint( that, upper, upperNext ) - that.mouse.y );
1512
1513 // 3.3.
1514 if ( currentDistance < minDistance ) {
1515 minDistance = currentDistance;
1516 minElement = upper;
1517 minElementNext = upperNext;
1518 }
1519
1520 upper = upperNext;
1521 updateSize( that, upper );
1522 }
1523
1524 that.debug.logElements( [ minElement, minElementNext ], // %REMOVE_LINE%
1525 [ 'Min', 'MinNext' ], 'Post-processing results' ); // %REMOVE_LINE%
1526
1527 // 3.4.
1528 if ( !minElement || !minElementNext ) {
1529 that.debug.logEnd( 'ABORT. No Min or MinNext' ); // %REMOVE_LINE%
1530 return null;
1531 }
1532
1533 if ( !checkMouseBetweenElements( that, minElement, minElementNext ) ) {
1534 that.debug.logEnd( 'ABORT. Mouse is already above minElement or below minElementNext.' ); // %REMOVE_LINE%
1535 return null;
1536 }
1537
1538 // An element of minimal distance has been found. Assign it to the trigger.
1539 trigger.upper = minElement;
1540 trigger.lower = minElementNext;
1541
1542 // Success: post-processing revealed a pair of elements.
1543 that.debug.logEnd( 'SUCCESSFUL post-processing. Trigger created.' ); // %REMOVE_LINE%
1544 return trigger.set( EDGE_MIDDLE, TYPE_EXPAND );
1545 }
1546
1547 // This is default element selector used by the engine.
1548 function expandSelector( that, node ) {
1549 return !( isTextNode( node ) ||
1550 isComment( node ) ||
1551 isFlowBreaker( node ) ||
1552 isLine( that, node ) ||
1553 ( node.type == CKEDITOR.NODE_ELEMENT && node.$ && node.is( 'br' ) ) );
1554 }
1555
1556 // This method checks whether mouse-y is between the top edge of upper
1557 // and bottom edge of lower.
1558 //
1559 // NOTE: This method assumes that updateSize has already been called
1560 // for the elements and is up-to-date.
1561 //
1562 // +---------------------------- Upper -+ /--
1563 // | | |
1564 // +------------------------------------+ |
1565 // |
1566 // ... |
1567 // |
1568 // X | * Return true for mouse-y in this range *
1569 // |
1570 // ... |
1571 // |
1572 // +---------------------------- Lower -+ |
1573 // | | |
1574 // +------------------------------------+ \--
1575 //
1576 function checkMouseBetweenElements( that, upper, lower ) {
1577 return inBetween( that.mouse.y, upper.size.top, lower.size.bottom );
1578 }
1579
1580 // A method for trigger filtering. Accepts or rejects trigger pairs
1581 // by their location in DOM etc.
1582 function expandFilter( that, trigger ) {
1583 that.debug.groupStart( 'expandFilter' ); // %REMOVE_LINE%
1584
1585 var upper = trigger.upper,
1586 lower = trigger.lower;
1587
1588 if (
1589 !upper || !lower || // NOT: EDGE_MIDDLE trigger ALWAYS has two elements.
1590 isFlowBreaker( lower ) || isFlowBreaker( upper ) || // NOT: one of the elements is floated or positioned
1591 lower.equals( upper ) || upper.equals( lower ) || // NOT: two trigger elements, one equals another.
1592 lower.contains( upper ) || upper.contains( lower )
1593 ) { // NOT: two trigger elements, one contains another.
1594 that.debug.logEnd( 'REJECTED. No upper or no lower or they contain each other.' ); // %REMOVE_LINE%
1595
1596 return false;
1597 }
1598
1599 // YES: two trigger elements, pure siblings.
1600 else if ( isTrigger( that, upper ) && isTrigger( that, lower ) && areSiblings( that, upper, lower ) ) {
1601 that.debug.logElementsEnd( [ upper, lower ], // %REMOVE_LINE%
1602 [ 'upper', 'lower' ], 'APPROVED EDGE_MIDDLE' ); // %REMOVE_LINE%
1603
1604 return true;
1605 }
1606
1607 that.debug.logElementsEnd( [ upper, lower ], // %REMOVE_LINE%
1608 [ 'upper', 'lower' ], 'Rejected unknown pair' ); // %REMOVE_LINE%
1609
1610 return false;
1611 }
1612
1613 // Simple wrapper for expandEngine and expandFilter.
1614 return function( that ) {
1615 that.debug.groupStart( 'triggerExpand' ); // %REMOVE_LINE%
1616
1617 var trigger = expandEngine( that );
1618
1619 that.debug.groupEnd(); // %REMOVE_LINE%
1620 return trigger && expandFilter( that, trigger ) ? trigger : null;
1621 };
1622 } )();
1623
1624 // Collects dimensions of an element.
1625 var sizePrefixes = [ 'top', 'left', 'right', 'bottom' ];
1626
1627 function getSize( that, element, ignoreScroll, force ) {
1628 var docPosition = element.getDocumentPosition(),
1629 border = {},
1630 margin = {},
1631 padding = {},
1632 box = {};
1633
1634 for ( var i = sizePrefixes.length; i--; ) {
1635 border[ sizePrefixes[ i ] ] = parseInt( getStyle( 'border-' + sizePrefixes[ i ] + '-width' ), 10 ) || 0;
1636 padding[ sizePrefixes[ i ] ] = parseInt( getStyle( 'padding-' + sizePrefixes[ i ] ), 10 ) || 0;
1637 margin[ sizePrefixes[ i ] ] = parseInt( getStyle( 'margin-' + sizePrefixes[ i ] ), 10 ) || 0;
1638 }
1639
1640 // updateWindowSize if forced to do so OR NOT ignoring scroll.
1641 if ( !ignoreScroll || force )
1642 updateWindowSize( that, force );
1643
1644 box.top = docPosition.y - ( ignoreScroll ? 0 : that.view.scroll.y ), box.left = docPosition.x - ( ignoreScroll ? 0 : that.view.scroll.x ),
1645
1646 // w/ borders and paddings.
1647 box.outerWidth = element.$.offsetWidth, box.outerHeight = element.$.offsetHeight,
1648
1649 // w/o borders and paddings.
1650 box.height = box.outerHeight - ( padding.top + padding.bottom + border.top + border.bottom ), box.width = box.outerWidth - ( padding.left + padding.right + border.left + border.right ),
1651
1652 box.bottom = box.top + box.outerHeight, box.right = box.left + box.outerWidth;
1653
1654 if ( that.inInlineMode ) {
1655 box.scroll = {
1656 top: element.$.scrollTop,
1657 left: element.$.scrollLeft
1658 };
1659 }
1660
1661 return extend( {
1662 border: border,
1663 padding: padding,
1664 margin: margin,
1665 ignoreScroll: ignoreScroll
1666 }, box, true );
1667
1668 function getStyle( propertyName ) {
1669 return element.getComputedStyle.call( element, propertyName );
1670 }
1671 }
1672
1673 function updateSize( that, element, ignoreScroll ) {
1674 if ( !isHtml( element ) ) // i.e. an element is hidden
1675 return ( element.size = null ); // -> reset size to make it useless for other methods
1676
1677 if ( !element.size )
1678 element.size = {};
1679
1680 // Abort if there was a similar query performed recently.
1681 // This kind of caching provides great performance improvement.
1682 else if ( element.size.ignoreScroll == ignoreScroll && element.size.date > new Date() - CACHE_TIME ) {
1683 that.debug.log( 'element.size: get from cache' ); // %REMOVE_LINE%
1684 return null;
1685 }
1686
1687 that.debug.log( 'element.size: capture' ); // %REMOVE_LINE%
1688
1689 return extend( element.size, getSize( that, element, ignoreScroll ), {
1690 date: +new Date()
1691 }, true );
1692 }
1693
1694 // Updates that.view.editable object.
1695 // This one must be called separately outside of updateWindowSize
1696 // to prevent cyclic dependency getSize<->updateWindowSize.
1697 // It calls getSize with force flag to avoid getWindowSize cache (look: getSize).
1698 function updateEditableSize( that, ignoreScroll ) {
1699 that.view.editable = getSize( that, that.editable, ignoreScroll, true );
1700 }
1701
1702 function updateWindowSize( that, force ) {
1703 if ( !that.view )
1704 that.view = {};
1705
1706 var view = that.view;
1707
1708 if ( !force && view && view.date > new Date() - CACHE_TIME ) {
1709 that.debug.log( 'win.size: get from cache' ); // %REMOVE_LINE%
1710 return;
1711 }
1712
1713 that.debug.log( 'win.size: capturing' ); // %REMOVE_LINE%
1714
1715 var win = that.win,
1716 scroll = win.getScrollPosition(),
1717 paneSize = win.getViewPaneSize();
1718
1719 extend( that.view, {
1720 scroll: {
1721 x: scroll.x,
1722 y: scroll.y,
1723 width: that.doc.$.documentElement.scrollWidth - paneSize.width,
1724 height: that.doc.$.documentElement.scrollHeight - paneSize.height
1725 },
1726 pane: {
1727 width: paneSize.width,
1728 height: paneSize.height,
1729 bottom: paneSize.height + scroll.y
1730 },
1731 date: +new Date()
1732 }, true );
1733 }
1734
1735 // This method searches document vertically using given
1736 // select criterion until stop criterion is fulfilled.
1737 function verticalSearch( that, stopCondition, selectCriterion, startElement ) {
1738 var upper = startElement,
1739 lower = startElement,
1740 mouseStep = 0,
1741 upperFound = false,
1742 lowerFound = false,
1743 viewPaneHeight = that.view.pane.height,
1744 mouse = that.mouse;
1745
1746 while ( mouse.y + mouseStep < viewPaneHeight && mouse.y - mouseStep > 0 ) {
1747 if ( !upperFound )
1748 upperFound = stopCondition( upper, startElement );
1749
1750 if ( !lowerFound )
1751 lowerFound = stopCondition( lower, startElement );
1752
1753 // Still not found...
1754 if ( !upperFound && mouse.y - mouseStep > 0 )
1755 upper = selectCriterion( that, { x: mouse.x, y: mouse.y - mouseStep } );
1756
1757 if ( !lowerFound && mouse.y + mouseStep < viewPaneHeight )
1758 lower = selectCriterion( that, { x: mouse.x, y: mouse.y + mouseStep } );
1759
1760 if ( upperFound && lowerFound )
1761 break;
1762
1763 // Instead of ++ to reduce the number of invocations by half.
1764 // It's trades off accuracy in some edge cases for improved performance.
1765 mouseStep += 2;
1766 }
1767
1768 return new boxTrigger( [ upper, lower, null, null ] );
1769 }
1770
1771} )();
1772
1773/**
1774 * Sets the default vertical distance between the edge of the element and the mouse pointer that
1775 * causes the magic line to appear. This option accepts a value in pixels, without the unit (for example:
1776 * `15` for 15 pixels).
1777 *
1778 * Read more in the [documentation](#!/guide/dev_magicline)
1779 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1780 *
1781 * // Changes the offset to 15px.
1782 * CKEDITOR.config.magicline_triggerOffset = 15;
1783 *
1784 * @cfg {Number} [magicline_triggerOffset=30]
1785 * @member CKEDITOR.config
1786 * @see CKEDITOR.config#magicline_holdDistance
1787 */
1788
1789/**
1790 * Defines the distance between the mouse pointer and the box within
1791 * which the magic line stays revealed and no other focus space is offered to be accessed.
1792 * This value is relative to {@link #magicline_triggerOffset}.
1793 *
1794 * Read more in the [documentation](#!/guide/dev_magicline)
1795 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1796 *
1797 * // Increases the distance to 80% of CKEDITOR.config.magicline_triggerOffset.
1798 * CKEDITOR.config.magicline_holdDistance = .8;
1799 *
1800 * @cfg {Number} [magicline_holdDistance=0.5]
1801 * @member CKEDITOR.config
1802 * @see CKEDITOR.config#magicline_triggerOffset
1803 */
1804
1805/**
1806 * Defines the default keystroke that accesses the closest unreachable focus space **before**
1807 * the caret (start of the selection). If there is no focus space available, the selection remains unchanged.
1808 *
1809 * Read more in the [documentation](#!/guide/dev_magicline)
1810 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1811 *
1812 * // Changes the default keystroke to "Ctrl + ,".
1813 * CKEDITOR.config.magicline_keystrokePrevious = CKEDITOR.CTRL + 188;
1814 *
1815 * @cfg {Number} [magicline_keystrokePrevious=CKEDITOR.CTRL + CKEDITOR.SHIFT + 51 (CTRL + SHIFT + 3)]
1816 * @member CKEDITOR.config
1817 */
1818CKEDITOR.config.magicline_keystrokePrevious = CKEDITOR.CTRL + CKEDITOR.SHIFT + 51; // CTRL + SHIFT + 3
1819
1820/**
1821 * Defines the default keystroke that accesses the closest unreachable focus space **after**
1822 * the caret (start of the selection). If there is no focus space available, the selection remains unchanged.
1823 *
1824 * Read more in the [documentation](#!/guide/dev_magicline)
1825 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1826 *
1827 * // Changes keystroke to "Ctrl + .".
1828 * CKEDITOR.config.magicline_keystrokeNext = CKEDITOR.CTRL + 190;
1829 *
1830 * @cfg {Number} [magicline_keystrokeNext=CKEDITOR.CTRL + CKEDITOR.SHIFT + 52 (CTRL + SHIFT + 4)]
1831 * @member CKEDITOR.config
1832 */
1833CKEDITOR.config.magicline_keystrokeNext = CKEDITOR.CTRL + CKEDITOR.SHIFT + 52; // CTRL + SHIFT + 4
1834
1835/**
1836 * Defines a list of attributes that, if assigned to some elements, prevent the magic line from being
1837 * used within these elements.
1838 *
1839 * Read more in the [documentation](#!/guide/dev_magicline)
1840 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1841 *
1842 * // Adds the "data-tabu" attribute to the magic line tabu list.
1843 * CKEDITOR.config.magicline_tabuList = [ 'data-tabu' ];
1844 *
1845 * @cfg {Number} [magicline_tabuList=[ 'data-widget-wrapper' ]]
1846 * @member CKEDITOR.config
1847 */
1848
1849/**
1850 * Defines the color of the magic line. The color may be adjusted to enhance readability.
1851 *
1852 * Read more in the [documentation](#!/guide/dev_magicline)
1853 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1854 *
1855 * // Changes magic line color to blue.
1856 * CKEDITOR.config.magicline_color = '#0000FF';
1857 *
1858 * @cfg {String} [magicline_color='#FF0000']
1859 * @member CKEDITOR.config
1860 */
1861
1862/**
1863 * Activates the special all-encompassing mode that considers all focus spaces between
1864 * {@link CKEDITOR.dtd#$block} elements as accessible by the magic line.
1865 *
1866 * Read more in the [documentation](#!/guide/dev_magicline)
1867 * and see the [SDK sample](http://sdk.ckeditor.com/samples/magicline.html).
1868 *
1869 * // Enables the greedy "put everywhere" mode.
1870 * CKEDITOR.config.magicline_everywhere = true;
1871 *
1872 * @cfg {Boolean} [magicline_everywhere=false]
1873 * @member CKEDITOR.config
1874 */
diff --git a/sources/plugins/magicline/samples/magicline.html b/sources/plugins/magicline/samples/magicline.html
new file mode 100644
index 00000000..21d1d071
--- /dev/null
+++ b/sources/plugins/magicline/samples/magicline.html
@@ -0,0 +1,209 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Using Magicline plugin &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <link rel="stylesheet" href="../../../samples/old/sample.css">
12 <meta name="ckeditor-sample-name" content="Magicline plugin">
13 <meta name="ckeditor-sample-group" content="Plugins">
14 <meta name="ckeditor-sample-description" content="Using the Magicline plugin to access difficult focus spaces.">
15</head>
16<body>
17 <h1 class="samples">
18 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Using Magicline plugin
19 </h1>
20 <div class="warning deprecated">
21 This sample is not maintained anymore. Check out its <a href="http://sdk.ckeditor.com/samples/magicline.html">brand new version in CKEditor SDK</a>.
22 </div>
23 <div class="description">
24 <p>
25 This sample shows the advantages of <strong>Magicline</strong> plugin
26 which is to enhance the editing process. Thanks to this plugin,
27 a number of difficult focus spaces which are inaccessible due to
28 browser issues can now be focused.
29 </p>
30 <p>
31 <strong>Magicline</strong> plugin shows a red line with a handler
32 which, when clicked, inserts a paragraph and allows typing. To see this,
33 focus an editor and move your mouse above the focus space you want
34 to access. The plugin is enabled by default so no additional
35 configuration is necessary.
36 </p>
37 </div>
38 <div>
39 <label for="editor1">
40 Editor 1:
41 </label>
42 <div class="description">
43 <p>
44 This editor uses a default <strong>Magicline</strong> setup.
45 </p>
46 </div>
47 <textarea cols="80" id="editor1" name="editor1" rows="10">
48 &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
49 &lt;tbody&gt;
50 &lt;tr&gt;
51 &lt;td&gt;This table&lt;/td&gt;
52 &lt;td&gt;is the&lt;/td&gt;
53 &lt;td&gt;very first&lt;/td&gt;
54 &lt;td&gt;element of the document.&lt;/td&gt;
55 &lt;/tr&gt;
56 &lt;tr&gt;
57 &lt;td&gt;We are still&lt;/td&gt;
58 &lt;td&gt;able to acces&lt;/td&gt;
59 &lt;td&gt;the space before it.&lt;/td&gt;
60 &lt;td&gt;
61 &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
62 &lt;tbody&gt;
63 &lt;tr&gt;
64 &lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
65 &lt;/tr&gt;
66 &lt;tr&gt;
67 &lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
68 &lt;/tr&gt;
69 &lt;/tbody&gt;
70 &lt;/table&gt;
71 &lt;/td&gt;
72 &lt;/tr&gt;
73 &lt;/tbody&gt;
74 &lt;/table&gt;
75
76 &lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
77
78 &lt;hr /&gt;
79 &lt;hr /&gt;
80 &lt;ol&gt;
81 &lt;li&gt;This numbered list...&lt;/li&gt;
82 &lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
83 &lt;li&gt;...and another list.&lt;/li&gt;
84 &lt;/ol&gt;
85
86 &lt;ul&gt;
87 &lt;li&gt;We can type between the lists...&lt;/li&gt;
88 &lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
89 &lt;/ul&gt;
90
91 &lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
92
93 &lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
94
95 &lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
96
97 &lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
98 &lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
99 &lt;/div&gt;
100 </textarea>
101 <script>
102
103 // This call can be placed at any point after the
104 // <textarea>, or inside a <head><script> in a
105 // window.onload event handler.
106
107 CKEDITOR.replace( 'editor1', {
108 extraPlugins: 'magicline', // Ensure that magicline plugin, which is required for this sample, is loaded.
109 allowedContent: true // Switch off the ACF, so very complex content created to
110 // show magicline's power isn't filtered.
111 } );
112
113 </script>
114 </div>
115 <br>
116 <div>
117 <label for="editor2">
118 Editor 2:
119 </label>
120 <div class="description">
121 <p>
122 This editor is using a blue line.
123 </p>
124<pre class="samples">
125CKEDITOR.replace( 'editor2', {
126 magicline_color: 'blue'
127});</pre>
128 </div>
129 <textarea cols="80" id="editor2" name="editor2" rows="10">
130 &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
131 &lt;tbody&gt;
132 &lt;tr&gt;
133 &lt;td&gt;This table&lt;/td&gt;
134 &lt;td&gt;is the&lt;/td&gt;
135 &lt;td&gt;very first&lt;/td&gt;
136 &lt;td&gt;element of the document.&lt;/td&gt;
137 &lt;/tr&gt;
138 &lt;tr&gt;
139 &lt;td&gt;We are still&lt;/td&gt;
140 &lt;td&gt;able to acces&lt;/td&gt;
141 &lt;td&gt;the space before it.&lt;/td&gt;
142 &lt;td&gt;
143 &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
144 &lt;tbody&gt;
145 &lt;tr&gt;
146 &lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
147 &lt;/tr&gt;
148 &lt;tr&gt;
149 &lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
150 &lt;/tr&gt;
151 &lt;/tbody&gt;
152 &lt;/table&gt;
153 &lt;/td&gt;
154 &lt;/tr&gt;
155 &lt;/tbody&gt;
156 &lt;/table&gt;
157
158 &lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
159
160 &lt;hr /&gt;
161 &lt;hr /&gt;
162 &lt;ol&gt;
163 &lt;li&gt;This numbered list...&lt;/li&gt;
164 &lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
165 &lt;li&gt;...and another list.&lt;/li&gt;
166 &lt;/ol&gt;
167
168 &lt;ul&gt;
169 &lt;li&gt;We can type between the lists...&lt;/li&gt;
170 &lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
171 &lt;/ul&gt;
172
173 &lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
174
175 &lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
176
177 &lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
178
179 &lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
180 &lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
181 &lt;/div&gt;
182 </textarea>
183 <script>
184
185 // This call can be placed at any point after the
186 // <textarea>, or inside a <head><script> in a
187 // window.onload event handler.
188
189 CKEDITOR.replace( 'editor2', {
190 extraPlugins: 'magicline', // Ensure that magicline plugin, which is required for this sample, is loaded.
191 magicline_color: 'blue', // Blue line
192 allowedContent: true // Switch off the ACF, so very complex content created to
193 // show magicline's power isn't filtered.
194 });
195
196 </script>
197 </div>
198 <div id="footer">
199 <hr>
200 <p>
201 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
202 </p>
203 <p id="copy">
204 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
205 Knabben. All rights reserved.
206 </p>
207 </div>
208</body>
209</html>
diff --git a/sources/plugins/maximize/icons/hidpi/maximize.png b/sources/plugins/maximize/icons/hidpi/maximize.png
new file mode 100644
index 00000000..1d1ed455
--- /dev/null
+++ b/sources/plugins/maximize/icons/hidpi/maximize.png
Binary files differ
diff --git a/sources/plugins/maximize/icons/maximize.png b/sources/plugins/maximize/icons/maximize.png
new file mode 100644
index 00000000..db01908b
--- /dev/null
+++ b/sources/plugins/maximize/icons/maximize.png
Binary files differ
diff --git a/sources/plugins/maximize/lang/af.js b/sources/plugins/maximize/lang/af.js
new file mode 100644
index 00000000..f8ac65ad
--- /dev/null
+++ b/sources/plugins/maximize/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'af', {
6 maximize: 'Maksimaliseer',
7 minimize: 'Minimaliseer'
8} );
diff --git a/sources/plugins/maximize/lang/ar.js b/sources/plugins/maximize/lang/ar.js
new file mode 100644
index 00000000..41ee9851
--- /dev/null
+++ b/sources/plugins/maximize/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ar', {
6 maximize: 'تكبير',
7 minimize: 'تصغير'
8} );
diff --git a/sources/plugins/maximize/lang/bg.js b/sources/plugins/maximize/lang/bg.js
new file mode 100644
index 00000000..a25cfb3b
--- /dev/null
+++ b/sources/plugins/maximize/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'bg', {
6 maximize: 'Максимизиране',
7 minimize: 'Минимизиране'
8} );
diff --git a/sources/plugins/maximize/lang/bn.js b/sources/plugins/maximize/lang/bn.js
new file mode 100644
index 00000000..82098507
--- /dev/null
+++ b/sources/plugins/maximize/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'bn', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/bs.js b/sources/plugins/maximize/lang/bs.js
new file mode 100644
index 00000000..685f4370
--- /dev/null
+++ b/sources/plugins/maximize/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'bs', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/ca.js b/sources/plugins/maximize/lang/ca.js
new file mode 100644
index 00000000..b4e35450
--- /dev/null
+++ b/sources/plugins/maximize/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ca', {
6 maximize: 'Maximitza',
7 minimize: 'Minimitza'
8} );
diff --git a/sources/plugins/maximize/lang/cs.js b/sources/plugins/maximize/lang/cs.js
new file mode 100644
index 00000000..3d844a9b
--- /dev/null
+++ b/sources/plugins/maximize/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'cs', {
6 maximize: 'Maximalizovat',
7 minimize: 'Minimalizovat'
8} );
diff --git a/sources/plugins/maximize/lang/cy.js b/sources/plugins/maximize/lang/cy.js
new file mode 100644
index 00000000..d26b5834
--- /dev/null
+++ b/sources/plugins/maximize/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'cy', {
6 maximize: 'Mwyhau',
7 minimize: 'Lleihau'
8} );
diff --git a/sources/plugins/maximize/lang/da.js b/sources/plugins/maximize/lang/da.js
new file mode 100644
index 00000000..628abb34
--- /dev/null
+++ b/sources/plugins/maximize/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'da', {
6 maximize: 'Maksimér',
7 minimize: 'Minimér'
8} );
diff --git a/sources/plugins/maximize/lang/de.js b/sources/plugins/maximize/lang/de.js
new file mode 100644
index 00000000..dbca07e3
--- /dev/null
+++ b/sources/plugins/maximize/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'de', {
6 maximize: 'Maximieren',
7 minimize: 'Minimieren'
8} );
diff --git a/sources/plugins/maximize/lang/el.js b/sources/plugins/maximize/lang/el.js
new file mode 100644
index 00000000..954c28bb
--- /dev/null
+++ b/sources/plugins/maximize/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'el', {
6 maximize: 'Μεγιστοποίηση',
7 minimize: 'Ελαχιστοποίηση'
8} );
diff --git a/sources/plugins/maximize/lang/en-au.js b/sources/plugins/maximize/lang/en-au.js
new file mode 100644
index 00000000..c71c1164
--- /dev/null
+++ b/sources/plugins/maximize/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'en-au', {
6 maximize: 'Maximize',
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/en-ca.js b/sources/plugins/maximize/lang/en-ca.js
new file mode 100644
index 00000000..7a7fa3f5
--- /dev/null
+++ b/sources/plugins/maximize/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'en-ca', {
6 maximize: 'Maximize',
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/en-gb.js b/sources/plugins/maximize/lang/en-gb.js
new file mode 100644
index 00000000..6fa838e8
--- /dev/null
+++ b/sources/plugins/maximize/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'en-gb', {
6 maximize: 'Maximise',
7 minimize: 'Minimise'
8} );
diff --git a/sources/plugins/maximize/lang/en.js b/sources/plugins/maximize/lang/en.js
new file mode 100644
index 00000000..d0f9ef45
--- /dev/null
+++ b/sources/plugins/maximize/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'en', {
6 maximize: 'Maximize',
7 minimize: 'Minimize'
8} );
diff --git a/sources/plugins/maximize/lang/eo.js b/sources/plugins/maximize/lang/eo.js
new file mode 100644
index 00000000..48e90e17
--- /dev/null
+++ b/sources/plugins/maximize/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'eo', {
6 maximize: 'Pligrandigi',
7 minimize: 'Malgrandigi'
8} );
diff --git a/sources/plugins/maximize/lang/es.js b/sources/plugins/maximize/lang/es.js
new file mode 100644
index 00000000..0264dd91
--- /dev/null
+++ b/sources/plugins/maximize/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'es', {
6 maximize: 'Maximizar',
7 minimize: 'Minimizar'
8} );
diff --git a/sources/plugins/maximize/lang/et.js b/sources/plugins/maximize/lang/et.js
new file mode 100644
index 00000000..f6eae18f
--- /dev/null
+++ b/sources/plugins/maximize/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'et', {
6 maximize: 'Maksimeerimine',
7 minimize: 'Minimeerimine'
8} );
diff --git a/sources/plugins/maximize/lang/eu.js b/sources/plugins/maximize/lang/eu.js
new file mode 100644
index 00000000..e1cbcaa1
--- /dev/null
+++ b/sources/plugins/maximize/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'eu', {
6 maximize: 'Maximizatu',
7 minimize: 'Minimizatu'
8} );
diff --git a/sources/plugins/maximize/lang/fa.js b/sources/plugins/maximize/lang/fa.js
new file mode 100644
index 00000000..41dc13cc
--- /dev/null
+++ b/sources/plugins/maximize/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'fa', {
6 maximize: 'بیشنه کردن',
7 minimize: 'کمینه کردن'
8} );
diff --git a/sources/plugins/maximize/lang/fi.js b/sources/plugins/maximize/lang/fi.js
new file mode 100644
index 00000000..a471d65e
--- /dev/null
+++ b/sources/plugins/maximize/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'fi', {
6 maximize: 'Suurenna',
7 minimize: 'Pienennä'
8} );
diff --git a/sources/plugins/maximize/lang/fo.js b/sources/plugins/maximize/lang/fo.js
new file mode 100644
index 00000000..ec255263
--- /dev/null
+++ b/sources/plugins/maximize/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'fo', {
6 maximize: 'Maksimera',
7 minimize: 'Minimera'
8} );
diff --git a/sources/plugins/maximize/lang/fr-ca.js b/sources/plugins/maximize/lang/fr-ca.js
new file mode 100644
index 00000000..4da38be9
--- /dev/null
+++ b/sources/plugins/maximize/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'fr-ca', {
6 maximize: 'Maximizer',
7 minimize: 'Minimizer'
8} );
diff --git a/sources/plugins/maximize/lang/fr.js b/sources/plugins/maximize/lang/fr.js
new file mode 100644
index 00000000..f6736fd1
--- /dev/null
+++ b/sources/plugins/maximize/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'fr', {
6 maximize: 'Agrandir',
7 minimize: 'Minimiser'
8} );
diff --git a/sources/plugins/maximize/lang/gl.js b/sources/plugins/maximize/lang/gl.js
new file mode 100644
index 00000000..bde13f65
--- /dev/null
+++ b/sources/plugins/maximize/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'gl', {
6 maximize: 'Maximizar',
7 minimize: 'Minimizar'
8} );
diff --git a/sources/plugins/maximize/lang/gu.js b/sources/plugins/maximize/lang/gu.js
new file mode 100644
index 00000000..8355c681
--- /dev/null
+++ b/sources/plugins/maximize/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'gu', {
6 maximize: 'મોટું કરવું',
7 minimize: 'નાનું કરવું'
8} );
diff --git a/sources/plugins/maximize/lang/he.js b/sources/plugins/maximize/lang/he.js
new file mode 100644
index 00000000..185cd9fc
--- /dev/null
+++ b/sources/plugins/maximize/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'he', {
6 maximize: 'הגדלה למקסימום',
7 minimize: 'הקטנה למינימום'
8} );
diff --git a/sources/plugins/maximize/lang/hi.js b/sources/plugins/maximize/lang/hi.js
new file mode 100644
index 00000000..cb2dcd3c
--- /dev/null
+++ b/sources/plugins/maximize/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'hi', {
6 maximize: 'मेक्सिमाईज़',
7 minimize: 'मिनिमाईज़'
8} );
diff --git a/sources/plugins/maximize/lang/hr.js b/sources/plugins/maximize/lang/hr.js
new file mode 100644
index 00000000..6177fdd9
--- /dev/null
+++ b/sources/plugins/maximize/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'hr', {
6 maximize: 'Povećaj',
7 minimize: 'Smanji'
8} );
diff --git a/sources/plugins/maximize/lang/hu.js b/sources/plugins/maximize/lang/hu.js
new file mode 100644
index 00000000..14234b31
--- /dev/null
+++ b/sources/plugins/maximize/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'hu', {
6 maximize: 'Teljes méret',
7 minimize: 'Kis méret'
8} );
diff --git a/sources/plugins/maximize/lang/id.js b/sources/plugins/maximize/lang/id.js
new file mode 100644
index 00000000..0a3af02b
--- /dev/null
+++ b/sources/plugins/maximize/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'id', {
6 maximize: 'Memperbesar',
7 minimize: 'Memperkecil'
8} );
diff --git a/sources/plugins/maximize/lang/is.js b/sources/plugins/maximize/lang/is.js
new file mode 100644
index 00000000..b3643e87
--- /dev/null
+++ b/sources/plugins/maximize/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'is', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/it.js b/sources/plugins/maximize/lang/it.js
new file mode 100644
index 00000000..d4739c7d
--- /dev/null
+++ b/sources/plugins/maximize/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'it', {
6 maximize: 'Massimizza',
7 minimize: 'Minimizza'
8} );
diff --git a/sources/plugins/maximize/lang/ja.js b/sources/plugins/maximize/lang/ja.js
new file mode 100644
index 00000000..74ecd38d
--- /dev/null
+++ b/sources/plugins/maximize/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ja', {
6 maximize: '最大化',
7 minimize: '最小化'
8} );
diff --git a/sources/plugins/maximize/lang/ka.js b/sources/plugins/maximize/lang/ka.js
new file mode 100644
index 00000000..6b3e2738
--- /dev/null
+++ b/sources/plugins/maximize/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ka', {
6 maximize: 'გადიდება',
7 minimize: 'დაპატარავება'
8} );
diff --git a/sources/plugins/maximize/lang/km.js b/sources/plugins/maximize/lang/km.js
new file mode 100644
index 00000000..d85ba887
--- /dev/null
+++ b/sources/plugins/maximize/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'km', {
6 maximize: 'ពង្រីក​អតិបរមា',
7 minimize: 'បង្រួម​អប្បបរមា'
8} );
diff --git a/sources/plugins/maximize/lang/ko.js b/sources/plugins/maximize/lang/ko.js
new file mode 100644
index 00000000..a9aaffb0
--- /dev/null
+++ b/sources/plugins/maximize/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ko', {
6 maximize: '최대화',
7 minimize: '최소화'
8} );
diff --git a/sources/plugins/maximize/lang/ku.js b/sources/plugins/maximize/lang/ku.js
new file mode 100644
index 00000000..3e6ee45f
--- /dev/null
+++ b/sources/plugins/maximize/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ku', {
6 maximize: 'ئەوپەڕی گەورەیی',
7 minimize: 'ئەوپەڕی بچووکی'
8} );
diff --git a/sources/plugins/maximize/lang/lt.js b/sources/plugins/maximize/lang/lt.js
new file mode 100644
index 00000000..e5a8cc65
--- /dev/null
+++ b/sources/plugins/maximize/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'lt', {
6 maximize: 'Išdidinti',
7 minimize: 'Sumažinti'
8} );
diff --git a/sources/plugins/maximize/lang/lv.js b/sources/plugins/maximize/lang/lv.js
new file mode 100644
index 00000000..8d1c7d74
--- /dev/null
+++ b/sources/plugins/maximize/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'lv', {
6 maximize: 'Maksimizēt',
7 minimize: 'Minimizēt'
8} );
diff --git a/sources/plugins/maximize/lang/mk.js b/sources/plugins/maximize/lang/mk.js
new file mode 100644
index 00000000..b4c766b2
--- /dev/null
+++ b/sources/plugins/maximize/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'mk', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/mn.js b/sources/plugins/maximize/lang/mn.js
new file mode 100644
index 00000000..6d6645c7
--- /dev/null
+++ b/sources/plugins/maximize/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'mn', {
6 maximize: 'Дэлгэц дүүргэх',
7 minimize: 'Цонхыг багсгаж харуулах'
8} );
diff --git a/sources/plugins/maximize/lang/ms.js b/sources/plugins/maximize/lang/ms.js
new file mode 100644
index 00000000..96ff0bd5
--- /dev/null
+++ b/sources/plugins/maximize/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ms', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/nb.js b/sources/plugins/maximize/lang/nb.js
new file mode 100644
index 00000000..16ec19c6
--- /dev/null
+++ b/sources/plugins/maximize/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'nb', {
6 maximize: 'Maksimer',
7 minimize: 'Minimer'
8} );
diff --git a/sources/plugins/maximize/lang/nl.js b/sources/plugins/maximize/lang/nl.js
new file mode 100644
index 00000000..13cb9344
--- /dev/null
+++ b/sources/plugins/maximize/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'nl', {
6 maximize: 'Maximaliseren',
7 minimize: 'Minimaliseren'
8} );
diff --git a/sources/plugins/maximize/lang/no.js b/sources/plugins/maximize/lang/no.js
new file mode 100644
index 00000000..9c4972a4
--- /dev/null
+++ b/sources/plugins/maximize/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'no', {
6 maximize: 'Maksimer',
7 minimize: 'Minimer'
8} );
diff --git a/sources/plugins/maximize/lang/pl.js b/sources/plugins/maximize/lang/pl.js
new file mode 100644
index 00000000..1e9596c3
--- /dev/null
+++ b/sources/plugins/maximize/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'pl', {
6 maximize: 'Maksymalizuj',
7 minimize: 'Minimalizuj'
8} );
diff --git a/sources/plugins/maximize/lang/pt-br.js b/sources/plugins/maximize/lang/pt-br.js
new file mode 100644
index 00000000..b331c423
--- /dev/null
+++ b/sources/plugins/maximize/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'pt-br', {
6 maximize: 'Maximizar',
7 minimize: 'Minimize'
8} );
diff --git a/sources/plugins/maximize/lang/pt.js b/sources/plugins/maximize/lang/pt.js
new file mode 100644
index 00000000..f5ae9e89
--- /dev/null
+++ b/sources/plugins/maximize/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'pt', {
6 maximize: 'Maximizar',
7 minimize: 'Minimizar'
8} );
diff --git a/sources/plugins/maximize/lang/ro.js b/sources/plugins/maximize/lang/ro.js
new file mode 100644
index 00000000..6da0d2f0
--- /dev/null
+++ b/sources/plugins/maximize/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ro', {
6 maximize: 'Mărește',
7 minimize: 'Micșorează'
8} );
diff --git a/sources/plugins/maximize/lang/ru.js b/sources/plugins/maximize/lang/ru.js
new file mode 100644
index 00000000..605822c7
--- /dev/null
+++ b/sources/plugins/maximize/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ru', {
6 maximize: 'Развернуть',
7 minimize: 'Свернуть'
8} );
diff --git a/sources/plugins/maximize/lang/si.js b/sources/plugins/maximize/lang/si.js
new file mode 100644
index 00000000..00d30095
--- /dev/null
+++ b/sources/plugins/maximize/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'si', {
6 maximize: 'විශාල කිරීම',
7 minimize: 'කුඩා කිරීම'
8} );
diff --git a/sources/plugins/maximize/lang/sk.js b/sources/plugins/maximize/lang/sk.js
new file mode 100644
index 00000000..c25b0520
--- /dev/null
+++ b/sources/plugins/maximize/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'sk', {
6 maximize: 'Maximalizovať',
7 minimize: 'Minimalizovať'
8} );
diff --git a/sources/plugins/maximize/lang/sl.js b/sources/plugins/maximize/lang/sl.js
new file mode 100644
index 00000000..afcdf4d3
--- /dev/null
+++ b/sources/plugins/maximize/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'sl', {
6 maximize: 'Maksimiraj',
7 minimize: 'Minimiraj'
8} );
diff --git a/sources/plugins/maximize/lang/sq.js b/sources/plugins/maximize/lang/sq.js
new file mode 100644
index 00000000..d7e51318
--- /dev/null
+++ b/sources/plugins/maximize/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'sq', {
6 maximize: 'Zmadho',
7 minimize: 'Zvogëlo'
8} );
diff --git a/sources/plugins/maximize/lang/sr-latn.js b/sources/plugins/maximize/lang/sr-latn.js
new file mode 100644
index 00000000..8416bf16
--- /dev/null
+++ b/sources/plugins/maximize/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'sr-latn', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/sr.js b/sources/plugins/maximize/lang/sr.js
new file mode 100644
index 00000000..0713bef4
--- /dev/null
+++ b/sources/plugins/maximize/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'sr', {
6 maximize: 'Maximize', // MISSING
7 minimize: 'Minimize' // MISSING
8} );
diff --git a/sources/plugins/maximize/lang/sv.js b/sources/plugins/maximize/lang/sv.js
new file mode 100644
index 00000000..89530af2
--- /dev/null
+++ b/sources/plugins/maximize/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'sv', {
6 maximize: 'Maximera',
7 minimize: 'Minimera'
8} );
diff --git a/sources/plugins/maximize/lang/th.js b/sources/plugins/maximize/lang/th.js
new file mode 100644
index 00000000..48fa67ad
--- /dev/null
+++ b/sources/plugins/maximize/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'th', {
6 maximize: 'ขยายใหญ่',
7 minimize: 'ย่อขนาด'
8} );
diff --git a/sources/plugins/maximize/lang/tr.js b/sources/plugins/maximize/lang/tr.js
new file mode 100644
index 00000000..f8f9a0bf
--- /dev/null
+++ b/sources/plugins/maximize/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'tr', {
6 maximize: 'Büyült',
7 minimize: 'Küçült'
8} );
diff --git a/sources/plugins/maximize/lang/tt.js b/sources/plugins/maximize/lang/tt.js
new file mode 100644
index 00000000..e03103f5
--- /dev/null
+++ b/sources/plugins/maximize/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'tt', {
6 maximize: 'Зурайту',
7 minimize: 'Кечерәйтү'
8} );
diff --git a/sources/plugins/maximize/lang/ug.js b/sources/plugins/maximize/lang/ug.js
new file mode 100644
index 00000000..9aef954d
--- /dev/null
+++ b/sources/plugins/maximize/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'ug', {
6 maximize: 'چوڭايت',
7 minimize: 'كىچىكلەت'
8} );
diff --git a/sources/plugins/maximize/lang/uk.js b/sources/plugins/maximize/lang/uk.js
new file mode 100644
index 00000000..4e4fe151
--- /dev/null
+++ b/sources/plugins/maximize/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'uk', {
6 maximize: 'Максимізувати',
7 minimize: 'Мінімізувати'
8} );
diff --git a/sources/plugins/maximize/lang/vi.js b/sources/plugins/maximize/lang/vi.js
new file mode 100644
index 00000000..4cf8304d
--- /dev/null
+++ b/sources/plugins/maximize/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'vi', {
6 maximize: 'Phóng to tối đa',
7 minimize: 'Thu nhỏ'
8} );
diff --git a/sources/plugins/maximize/lang/zh-cn.js b/sources/plugins/maximize/lang/zh-cn.js
new file mode 100644
index 00000000..f18450b6
--- /dev/null
+++ b/sources/plugins/maximize/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'zh-cn', {
6 maximize: '全屏',
7 minimize: '最小化'
8} );
diff --git a/sources/plugins/maximize/lang/zh.js b/sources/plugins/maximize/lang/zh.js
new file mode 100644
index 00000000..98f04dd9
--- /dev/null
+++ b/sources/plugins/maximize/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'maximize', 'zh', {
6 maximize: '最大化',
7 minimize: '最小化'
8} );
diff --git a/sources/plugins/maximize/plugin.js b/sources/plugins/maximize/plugin.js
new file mode 100644
index 00000000..8da9ada9
--- /dev/null
+++ b/sources/plugins/maximize/plugin.js
@@ -0,0 +1,314 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 function protectFormStyles( formElement ) {
8 if ( !formElement || formElement.type != CKEDITOR.NODE_ELEMENT || formElement.getName() != 'form' )
9 return [];
10
11 var hijackRecord = [],
12 hijackNames = [ 'style', 'className' ];
13 for ( var i = 0; i < hijackNames.length; i++ ) {
14 var name = hijackNames[ i ];
15 var $node = formElement.$.elements.namedItem( name );
16 if ( $node ) {
17 var hijackNode = new CKEDITOR.dom.element( $node );
18 hijackRecord.push( [ hijackNode, hijackNode.nextSibling ] );
19 hijackNode.remove();
20 }
21 }
22
23 return hijackRecord;
24 }
25
26 function restoreFormStyles( formElement, hijackRecord ) {
27 if ( !formElement || formElement.type != CKEDITOR.NODE_ELEMENT || formElement.getName() != 'form' )
28 return;
29
30 if ( hijackRecord.length > 0 ) {
31 for ( var i = hijackRecord.length - 1; i >= 0; i-- ) {
32 var node = hijackRecord[ i ][ 0 ];
33 var sibling = hijackRecord[ i ][ 1 ];
34 if ( sibling )
35 node.insertBefore( sibling );
36 else
37 node.appendTo( formElement );
38 }
39 }
40 }
41
42 function saveStyles( element, isInsideEditor ) {
43 var data = protectFormStyles( element );
44 var retval = {};
45
46 var $element = element.$;
47
48 if ( !isInsideEditor ) {
49 retval[ 'class' ] = $element.className || '';
50 $element.className = '';
51 }
52
53 retval.inline = $element.style.cssText || '';
54 if ( !isInsideEditor ) // Reset any external styles that might interfere. (#2474)
55 $element.style.cssText = 'position: static; overflow: visible';
56
57 restoreFormStyles( data );
58 return retval;
59 }
60
61 function restoreStyles( element, savedStyles ) {
62 var data = protectFormStyles( element );
63 var $element = element.$;
64 if ( 'class' in savedStyles )
65 $element.className = savedStyles[ 'class' ];
66 if ( 'inline' in savedStyles )
67 $element.style.cssText = savedStyles.inline;
68 restoreFormStyles( data );
69 }
70
71 function refreshCursor( editor ) {
72 if ( editor.editable().isInline() )
73 return;
74
75 // Refresh all editor instances on the page (#5724).
76 var all = CKEDITOR.instances;
77 for ( var i in all ) {
78 var one = all[ i ];
79 if ( one.mode == 'wysiwyg' && !one.readOnly ) {
80 var body = one.document.getBody();
81 // Refresh 'contentEditable' otherwise
82 // DOM lifting breaks design mode. (#5560)
83 body.setAttribute( 'contentEditable', false );
84 body.setAttribute( 'contentEditable', true );
85 }
86 }
87
88 if ( editor.editable().hasFocus ) {
89 editor.toolbox.focus();
90 editor.focus();
91 }
92 }
93
94 CKEDITOR.plugins.add( 'maximize', {
95 // jscs:disable maximumLineLength
96 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
97 // jscs:enable maximumLineLength
98 icons: 'maximize', // %REMOVE_LINE_CORE%
99 hidpi: true, // %REMOVE_LINE_CORE%
100 init: function( editor ) {
101 // Maximize plugin isn't available in inline mode yet.
102 if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
103 return;
104
105 var lang = editor.lang;
106 var mainDocument = CKEDITOR.document,
107 mainWindow = mainDocument.getWindow();
108
109 // Saved selection and scroll position for the editing area.
110 var savedSelection, savedScroll;
111
112 // Saved scroll position for the outer window.
113 var outerScroll;
114
115 // Saved resize handler function.
116 function resizeHandler() {
117 var viewPaneSize = mainWindow.getViewPaneSize();
118 editor.resize( viewPaneSize.width, viewPaneSize.height, null, true );
119 }
120
121 // Retain state after mode switches.
122 var savedState = CKEDITOR.TRISTATE_OFF;
123
124 editor.addCommand( 'maximize', {
125 // Disabled on iOS (#8307).
126 modes: { wysiwyg: !CKEDITOR.env.iOS, source: !CKEDITOR.env.iOS },
127 readOnly: 1,
128 editorFocus: false,
129 exec: function() {
130 var container = editor.container.getFirst( function( node ) {
131 return node.type == CKEDITOR.NODE_ELEMENT && node.hasClass( 'cke_inner' );
132 } );
133 var contents = editor.ui.space( 'contents' );
134
135 // Save current selection and scroll position in editing area.
136 if ( editor.mode == 'wysiwyg' ) {
137 var selection = editor.getSelection();
138 savedSelection = selection && selection.getRanges();
139 savedScroll = mainWindow.getScrollPosition();
140 } else {
141 var $textarea = editor.editable().$;
142 savedSelection = !CKEDITOR.env.ie && [ $textarea.selectionStart, $textarea.selectionEnd ];
143 savedScroll = [ $textarea.scrollLeft, $textarea.scrollTop ];
144 }
145
146 // Go fullscreen if the state is off.
147 if ( this.state == CKEDITOR.TRISTATE_OFF ) {
148 // Add event handler for resizing.
149 mainWindow.on( 'resize', resizeHandler );
150
151 // Save the scroll bar position.
152 outerScroll = mainWindow.getScrollPosition();
153
154 // Save and reset the styles for the entire node tree.
155 var currentNode = editor.container;
156 while ( ( currentNode = currentNode.getParent() ) ) {
157 currentNode.setCustomData( 'maximize_saved_styles', saveStyles( currentNode ) );
158 // Show under floatpanels (-1) and context menu (-2).
159 currentNode.setStyle( 'z-index', editor.config.baseFloatZIndex - 5 );
160 }
161 contents.setCustomData( 'maximize_saved_styles', saveStyles( contents, true ) );
162 container.setCustomData( 'maximize_saved_styles', saveStyles( container, true ) );
163
164 // Hide scroll bars.
165 var styles = {
166 overflow: CKEDITOR.env.webkit ? '' : 'hidden', // #6896
167 width: 0,
168 height: 0
169 };
170
171 mainDocument.getDocumentElement().setStyles( styles );
172 !CKEDITOR.env.gecko && mainDocument.getDocumentElement().setStyle( 'position', 'fixed' );
173 !( CKEDITOR.env.gecko && CKEDITOR.env.quirks ) && mainDocument.getBody().setStyles( styles );
174
175 // Scroll to the top left (IE needs some time for it - #4923).
176 CKEDITOR.env.ie ? setTimeout( function() {
177 mainWindow.$.scrollTo( 0, 0 );
178 }, 0 ) : mainWindow.$.scrollTo( 0, 0 );
179
180 // Resize and move to top left.
181 // Special treatment for FF Quirks (#7284)
182 container.setStyle( 'position', CKEDITOR.env.gecko && CKEDITOR.env.quirks ? 'fixed' : 'absolute' );
183 container.$.offsetLeft; // SAFARI BUG: See #2066.
184 container.setStyles( {
185 // Show under floatpanels (-1) and context menu (-2).
186 'z-index': editor.config.baseFloatZIndex - 5,
187 left: '0px',
188 top: '0px'
189 } );
190
191 // Add cke_maximized class before resize handle since that will change things sizes (#5580)
192 container.addClass( 'cke_maximized' );
193
194 resizeHandler();
195
196 // Still not top left? Fix it. (Bug #174)
197 var offset = container.getDocumentPosition();
198 container.setStyles( {
199 left: ( -1 * offset.x ) + 'px',
200 top: ( -1 * offset.y ) + 'px'
201 } );
202
203 // Fixing positioning editor chrome in Firefox break design mode. (#5149)
204 CKEDITOR.env.gecko && refreshCursor( editor );
205 }
206 // Restore from fullscreen if the state is on.
207 else if ( this.state == CKEDITOR.TRISTATE_ON ) {
208 // Remove event handler for resizing.
209 mainWindow.removeListener( 'resize', resizeHandler );
210
211 // Restore CSS styles for the entire node tree.
212 var editorElements = [ contents, container ];
213 for ( var i = 0; i < editorElements.length; i++ ) {
214 restoreStyles( editorElements[ i ], editorElements[ i ].getCustomData( 'maximize_saved_styles' ) );
215 editorElements[ i ].removeCustomData( 'maximize_saved_styles' );
216 }
217
218 currentNode = editor.container;
219 while ( ( currentNode = currentNode.getParent() ) ) {
220 restoreStyles( currentNode, currentNode.getCustomData( 'maximize_saved_styles' ) );
221 currentNode.removeCustomData( 'maximize_saved_styles' );
222 }
223
224 // Restore the window scroll position.
225 CKEDITOR.env.ie ? setTimeout( function() {
226 mainWindow.$.scrollTo( outerScroll.x, outerScroll.y );
227 }, 0 ) : mainWindow.$.scrollTo( outerScroll.x, outerScroll.y );
228
229 // Remove cke_maximized class.
230 container.removeClass( 'cke_maximized' );
231
232 // Webkit requires a re-layout on editor chrome. (#6695)
233 if ( CKEDITOR.env.webkit ) {
234 container.setStyle( 'display', 'inline' );
235 setTimeout( function() {
236 container.setStyle( 'display', 'block' );
237 }, 0 );
238 }
239
240 // Emit a resize event, because this time the size is modified in
241 // restoreStyles.
242 editor.fire( 'resize', {
243 outerHeight: editor.container.$.offsetHeight,
244 contentsHeight: contents.$.offsetHeight,
245 outerWidth: editor.container.$.offsetWidth
246 } );
247 }
248
249 this.toggleState();
250
251 // Toggle button label.
252 var button = this.uiItems[ 0 ];
253 // Only try to change the button if it exists (#6166)
254 if ( button ) {
255 var label = ( this.state == CKEDITOR.TRISTATE_OFF ) ? lang.maximize.maximize : lang.maximize.minimize;
256 var buttonNode = CKEDITOR.document.getById( button._.id );
257 buttonNode.getChild( 1 ).setHtml( label );
258 buttonNode.setAttribute( 'title', label );
259 buttonNode.setAttribute( 'href', 'javascript:void("' + label + '");' ); // jshint ignore:line
260 }
261
262 // Restore selection and scroll position in editing area.
263 if ( editor.mode == 'wysiwyg' ) {
264 if ( savedSelection ) {
265 // Fixing positioning editor chrome in Firefox break design mode. (#5149)
266 CKEDITOR.env.gecko && refreshCursor( editor );
267
268 editor.getSelection().selectRanges( savedSelection );
269 var element = editor.getSelection().getStartElement();
270 element && element.scrollIntoView( true );
271 } else {
272 mainWindow.$.scrollTo( savedScroll.x, savedScroll.y );
273 }
274 } else {
275 if ( savedSelection ) {
276 $textarea.selectionStart = savedSelection[ 0 ];
277 $textarea.selectionEnd = savedSelection[ 1 ];
278 }
279 $textarea.scrollLeft = savedScroll[ 0 ];
280 $textarea.scrollTop = savedScroll[ 1 ];
281 }
282
283 savedSelection = savedScroll = null;
284 savedState = this.state;
285
286 editor.fire( 'maximize', this.state );
287 },
288 canUndo: false
289 } );
290
291 editor.ui.addButton && editor.ui.addButton( 'Maximize', {
292 label: lang.maximize.maximize,
293 command: 'maximize',
294 toolbar: 'tools,10'
295 } );
296
297 // Restore the command state after mode change, unless it has been changed to disabled (#6467)
298 editor.on( 'mode', function() {
299 var command = editor.getCommand( 'maximize' );
300 command.setState( command.state == CKEDITOR.TRISTATE_DISABLED ? CKEDITOR.TRISTATE_DISABLED : savedState );
301 }, null, null, 100 );
302 }
303 } );
304} )();
305
306/**
307 * Event fired when the maximize command is called.
308 * It also indicates whether an editor is maximized or not.
309 *
310 * @event maximize
311 * @member CKEDITOR.editor
312 * @param {CKEDITOR.editor} editor This editor instance.
313 * @param {Number} data Current state of the command. See {@link CKEDITOR#TRISTATE_ON} and {@link CKEDITOR#TRISTATE_OFF}.
314 */
diff --git a/sources/plugins/menu/plugin.js b/sources/plugins/menu/plugin.js
new file mode 100644
index 00000000..5b33f1d6
--- /dev/null
+++ b/sources/plugins/menu/plugin.js
@@ -0,0 +1,545 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'menu', {
7 requires: 'floatpanel',
8
9 beforeInit: function( editor ) {
10 var groups = editor.config.menu_groups.split( ',' ),
11 groupsOrder = editor._.menuGroups = {},
12 menuItems = editor._.menuItems = {};
13
14 for ( var i = 0; i < groups.length; i++ )
15 groupsOrder[ groups[ i ] ] = i + 1;
16
17 /**
18 * Registers an item group to the editor context menu in order to make it
19 * possible to associate it with menu items later.
20 *
21 * @param {String} name Specify a group name.
22 * @param {Number} [order=100] Define the display sequence of this group
23 * inside the menu. A smaller value gets displayed first.
24 * @member CKEDITOR.editor
25 */
26 editor.addMenuGroup = function( name, order ) {
27 groupsOrder[ name ] = order || 100;
28 };
29
30 /**
31 * Adds an item from the specified definition to the editor context menu.
32 *
33 * @method
34 * @param {String} name The menu item name.
35 * @param {Object} definition The menu item definition.
36 * @member CKEDITOR.editor
37 */
38 editor.addMenuItem = function( name, definition ) {
39 if ( groupsOrder[ definition.group ] )
40 menuItems[ name ] = new CKEDITOR.menuItem( this, name, definition );
41 };
42
43 /**
44 * Adds one or more items from the specified definition array to the editor context menu.
45 *
46 * @method
47 * @param {Array} definitions List of definitions for each menu item as if {@link #addMenuItem} is called.
48 * @member CKEDITOR.editor
49 */
50 editor.addMenuItems = function( definitions ) {
51 for ( var itemName in definitions ) {
52 this.addMenuItem( itemName, definitions[ itemName ] );
53 }
54 };
55
56 /**
57 * Retrieves a particular menu item definition from the editor context menu.
58 *
59 * @method
60 * @param {String} name The name of the desired menu item.
61 * @returns {Object}
62 * @member CKEDITOR.editor
63 */
64 editor.getMenuItem = function( name ) {
65 return menuItems[ name ];
66 };
67
68 /**
69 * Removes a particular menu item added before from the editor context menu.
70 *
71 * @since 3.6.1
72 * @method
73 * @param {String} name The name of the desired menu item.
74 * @member CKEDITOR.editor
75 */
76 editor.removeMenuItem = function( name ) {
77 delete menuItems[ name ];
78 };
79 }
80} );
81
82( function() {
83 var menuItemSource = '<span class="cke_menuitem">' +
84 '<a id="{id}"' +
85 ' class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}"' +
86 ' title="{title}"' +
87 ' tabindex="-1"' +
88 '_cke_focus=1' +
89 ' hidefocus="true"' +
90 ' role="{role}"' +
91 ' aria-haspopup="{hasPopup}"' +
92 ' aria-disabled="{disabled}"' +
93 ' {ariaChecked}';
94
95 // Some browsers don't cancel key events in the keydown but in the
96 // keypress.
97 // TODO: Check if really needed.
98 if ( CKEDITOR.env.gecko && CKEDITOR.env.mac )
99 menuItemSource += ' onkeypress="return false;"';
100
101 // With Firefox, we need to force the button to redraw, otherwise it
102 // will remain in the focus state.
103 if ( CKEDITOR.env.gecko )
104 menuItemSource += ' onblur="this.style.cssText = this.style.cssText;"';
105
106 // #188
107 menuItemSource += ' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});"' +
108 ' onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" ' +
109 ( CKEDITOR.env.ie ? 'onclick="return false;" onmouseup' : 'onclick' ) +
110 '="CKEDITOR.tools.callFunction({clickFn},{index}); return false;"' +
111 '>';
112
113 menuItemSource +=
114 '<span class="cke_menubutton_inner">' +
115 '<span class="cke_menubutton_icon">' +
116 '<span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span>' +
117 '</span>' +
118 '<span class="cke_menubutton_label">' +
119 '{label}' +
120 '</span>' +
121 '{arrowHtml}' +
122 '</span>' +
123 '</a></span>';
124
125 var menuArrowSource = '<span class="cke_menuarrow">' +
126 '<span>{label}</span>' +
127 '</span>';
128
129 var menuItemTpl = CKEDITOR.addTemplate( 'menuItem', menuItemSource ),
130 menuArrowTpl = CKEDITOR.addTemplate( 'menuArrow', menuArrowSource );
131
132 /**
133 * @class
134 * @todo
135 */
136 CKEDITOR.menu = CKEDITOR.tools.createClass( {
137 /**
138 * @constructor
139 */
140 $: function( editor, definition ) {
141 definition = this._.definition = definition || {};
142 this.id = CKEDITOR.tools.getNextId();
143
144 this.editor = editor;
145 this.items = [];
146 this._.listeners = [];
147
148 this._.level = definition.level || 1;
149
150 var panelDefinition = CKEDITOR.tools.extend( {}, definition.panel, {
151 css: [ CKEDITOR.skin.getPath( 'editor' ) ],
152 level: this._.level - 1,
153 block: {}
154 } );
155
156 var attrs = panelDefinition.block.attributes = ( panelDefinition.attributes || {} );
157 // Provide default role of 'menu'.
158 !attrs.role && ( attrs.role = 'menu' );
159 this._.panelDefinition = panelDefinition;
160 },
161
162 _: {
163 onShow: function() {
164 var selection = this.editor.getSelection(),
165 start = selection && selection.getStartElement(),
166 path = this.editor.elementPath(),
167 listeners = this._.listeners;
168
169 this.removeAll();
170 // Call all listeners, filling the list of items to be displayed.
171 for ( var i = 0; i < listeners.length; i++ ) {
172 var listenerItems = listeners[ i ]( start, selection, path );
173
174 if ( listenerItems ) {
175 for ( var itemName in listenerItems ) {
176 var item = this.editor.getMenuItem( itemName );
177
178 if ( item && ( !item.command || this.editor.getCommand( item.command ).state ) ) {
179 item.state = listenerItems[ itemName ];
180 this.add( item );
181 }
182 }
183 }
184 }
185 },
186
187 onClick: function( item ) {
188 this.hide();
189
190 if ( item.onClick )
191 item.onClick();
192 else if ( item.command )
193 this.editor.execCommand( item.command );
194 },
195
196 onEscape: function( keystroke ) {
197 var parent = this.parent;
198 // 1. If it's sub-menu, close it, with focus restored on this.
199 // 2. In case of a top-menu, close it, with focus returned to page.
200 if ( parent )
201 parent._.panel.hideChild( 1 );
202 else if ( keystroke == 27 )
203 this.hide( 1 );
204
205 return false;
206 },
207
208 onHide: function() {
209 this.onHide && this.onHide();
210 },
211
212 showSubMenu: function( index ) {
213 var menu = this._.subMenu,
214 item = this.items[ index ],
215 subItemDefs = item.getItems && item.getItems();
216
217 // If this item has no subitems, we just hide the submenu, if
218 // available, and return back.
219 if ( !subItemDefs ) {
220 // Hide sub menu with focus returned.
221 this._.panel.hideChild( 1 );
222 return;
223 }
224
225 // Create the submenu, if not available, or clean the existing
226 // one.
227 if ( menu )
228 menu.removeAll();
229 else {
230 menu = this._.subMenu = new CKEDITOR.menu( this.editor, CKEDITOR.tools.extend( {}, this._.definition, { level: this._.level + 1 }, true ) );
231 menu.parent = this;
232 menu._.onClick = CKEDITOR.tools.bind( this._.onClick, this );
233 }
234
235 // Add all submenu items to the menu.
236 for ( var subItemName in subItemDefs ) {
237 var subItem = this.editor.getMenuItem( subItemName );
238 if ( subItem ) {
239 subItem.state = subItemDefs[ subItemName ];
240 menu.add( subItem );
241 }
242 }
243
244 // Get the element representing the current item.
245 var element = this._.panel.getBlock( this.id ).element.getDocument().getById( this.id + String( index ) );
246
247 // Show the submenu.
248 // This timeout is needed to give time for the sub-menu get
249 // focus when JAWS is running. (#9844)
250 setTimeout( function() {
251 menu.show( element, 2 );
252 }, 0 );
253 }
254 },
255
256 proto: {
257 /**
258 * Adds an item.
259 *
260 * @param item
261 */
262 add: function( item ) {
263 // Later we may sort the items, but Array#sort is not stable in
264 // some browsers, here we're forcing the original sequence with
265 // 'order' attribute if it hasn't been assigned. (#3868)
266 if ( !item.order )
267 item.order = this.items.length;
268
269 this.items.push( item );
270 },
271
272 /**
273 * Removes all items.
274 */
275 removeAll: function() {
276 this.items = [];
277 },
278
279 /**
280 * Shows the menu in given location.
281 *
282 * @param {CKEDITOR.dom.element} offsetParent
283 * @param {Number} [corner]
284 * @param {Number} [offsetX]
285 * @param {Number} [offsetY]
286 */
287 show: function( offsetParent, corner, offsetX, offsetY ) {
288 // Not for sub menu.
289 if ( !this.parent ) {
290 this._.onShow();
291 // Don't menu with zero items.
292 if ( !this.items.length )
293 return;
294 }
295
296 corner = corner || ( this.editor.lang.dir == 'rtl' ? 2 : 1 );
297
298 var items = this.items,
299 editor = this.editor,
300 panel = this._.panel,
301 element = this._.element;
302
303 // Create the floating panel for this menu.
304 if ( !panel ) {
305 panel = this._.panel = new CKEDITOR.ui.floatPanel( this.editor, CKEDITOR.document.getBody(), this._.panelDefinition, this._.level );
306
307 panel.onEscape = CKEDITOR.tools.bind( function( keystroke ) {
308 if ( this._.onEscape( keystroke ) === false )
309 return false;
310 }, this );
311
312 panel.onShow = function() {
313 // Menu need CSS resets, compensate class name.
314 var holder = panel._.panel.getHolderElement();
315 holder.getParent().addClass( 'cke' ).addClass( 'cke_reset_all' );
316 };
317
318 panel.onHide = CKEDITOR.tools.bind( function() {
319 this._.onHide && this._.onHide();
320 }, this );
321
322 // Create an autosize block inside the panel.
323 var block = panel.addBlock( this.id, this._.panelDefinition.block );
324 block.autoSize = true;
325
326 var keys = block.keys;
327 keys[ 40 ] = 'next'; // ARROW-DOWN
328 keys[ 9 ] = 'next'; // TAB
329 keys[ 38 ] = 'prev'; // ARROW-UP
330 keys[ CKEDITOR.SHIFT + 9 ] = 'prev'; // SHIFT + TAB
331 keys[ ( editor.lang.dir == 'rtl' ? 37 : 39 ) ] = CKEDITOR.env.ie ? 'mouseup' : 'click'; // ARROW-RIGHT/ARROW-LEFT(rtl)
332 keys[ 32 ] = CKEDITOR.env.ie ? 'mouseup' : 'click'; // SPACE
333 CKEDITOR.env.ie && ( keys[ 13 ] = 'mouseup' ); // Manage ENTER, since onclick is blocked in IE (#8041).
334
335 element = this._.element = block.element;
336
337 var elementDoc = element.getDocument();
338 elementDoc.getBody().setStyle( 'overflow', 'hidden' );
339 elementDoc.getElementsByTag( 'html' ).getItem( 0 ).setStyle( 'overflow', 'hidden' );
340
341 this._.itemOverFn = CKEDITOR.tools.addFunction( function( index ) {
342 clearTimeout( this._.showSubTimeout );
343 this._.showSubTimeout = CKEDITOR.tools.setTimeout( this._.showSubMenu, editor.config.menu_subMenuDelay || 400, this, [ index ] );
344 }, this );
345
346 this._.itemOutFn = CKEDITOR.tools.addFunction( function() {
347 clearTimeout( this._.showSubTimeout );
348 }, this );
349
350 this._.itemClickFn = CKEDITOR.tools.addFunction( function( index ) {
351 var item = this.items[ index ];
352
353 if ( item.state == CKEDITOR.TRISTATE_DISABLED ) {
354 this.hide( 1 );
355 return;
356 }
357
358 if ( item.getItems )
359 this._.showSubMenu( index );
360 else
361 this._.onClick( item );
362 }, this );
363 }
364
365 // Put the items in the right order.
366 sortItems( items );
367
368 // Apply the editor mixed direction status to menu.
369 var path = editor.elementPath(),
370 mixedDirCls = ( path && path.direction() != editor.lang.dir ) ? ' cke_mixed_dir_content' : '';
371
372 // Build the HTML that composes the menu and its items.
373 var output = [ '<div class="cke_menu' + mixedDirCls + '" role="presentation">' ];
374
375 var length = items.length,
376 lastGroup = length && items[ 0 ].group;
377
378 for ( var i = 0; i < length; i++ ) {
379 var item = items[ i ];
380 if ( lastGroup != item.group ) {
381 output.push( '<div class="cke_menuseparator" role="separator"></div>' );
382 lastGroup = item.group;
383 }
384
385 item.render( this, i, output );
386 }
387
388 output.push( '</div>' );
389
390 // Inject the HTML inside the panel.
391 element.setHtml( output.join( '' ) );
392
393 CKEDITOR.ui.fire( 'ready', this );
394
395 // Show the panel.
396 if ( this.parent )
397 this.parent._.panel.showAsChild( panel, this.id, offsetParent, corner, offsetX, offsetY );
398 else
399 panel.showBlock( this.id, offsetParent, corner, offsetX, offsetY );
400
401 editor.fire( 'menuShow', [ panel ] );
402 },
403
404 /**
405 * Adds a callback executed on opening the menu. Items
406 * returned by that callback are added to the menu.
407 *
408 * @param {Function} listenerFn
409 * @param {CKEDITOR.dom.element} listenerFn.startElement The selection start anchor element.
410 * @param {CKEDITOR.dom.selection} listenerFn.selection The current selection.
411 * @param {CKEDITOR.dom.elementPath} listenerFn.path The current elements path.
412 * @param listenerFn.return Object (`commandName` => `state`) of items that should be added to the menu.
413 */
414 addListener: function( listenerFn ) {
415 this._.listeners.push( listenerFn );
416 },
417
418 /**
419 * Hides the menu.
420 *
421 * @param {Boolean} [returnFocus]
422 */
423 hide: function( returnFocus ) {
424 this._.onHide && this._.onHide();
425 this._.panel && this._.panel.hide( returnFocus );
426 }
427 }
428 } );
429
430 function sortItems( items ) {
431 items.sort( function( itemA, itemB ) {
432 if ( itemA.group < itemB.group )
433 return -1;
434 else if ( itemA.group > itemB.group )
435 return 1;
436
437 return itemA.order < itemB.order ? -1 : itemA.order > itemB.order ? 1 : 0;
438 } );
439 }
440
441 /**
442 * @class
443 * @todo
444 */
445 CKEDITOR.menuItem = CKEDITOR.tools.createClass( {
446 $: function( editor, name, definition ) {
447 CKEDITOR.tools.extend( this, definition,
448 // Defaults
449 {
450 order: 0,
451 className: 'cke_menubutton__' + name
452 } );
453
454 // Transform the group name into its order number.
455 this.group = editor._.menuGroups[ this.group ];
456
457 this.editor = editor;
458 this.name = name;
459 },
460
461 proto: {
462 render: function( menu, index, output ) {
463 var id = menu.id + String( index ),
464 state = ( typeof this.state == 'undefined' ) ? CKEDITOR.TRISTATE_OFF : this.state,
465 ariaChecked = '';
466
467 var stateName = state == CKEDITOR.TRISTATE_ON ? 'on' : state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' : 'off';
468
469 if ( this.role in { menuitemcheckbox: 1, menuitemradio: 1 } )
470 ariaChecked = ' aria-checked="' + ( state == CKEDITOR.TRISTATE_ON ? 'true' : 'false' ) + '"';
471
472 var hasSubMenu = this.getItems;
473 // ltr: BLACK LEFT-POINTING POINTER
474 // rtl: BLACK RIGHT-POINTING POINTER
475 var arrowLabel = '&#' + ( this.editor.lang.dir == 'rtl' ? '9668' : '9658' ) + ';';
476
477 var iconName = this.name;
478 if ( this.icon && !( /\./ ).test( this.icon ) )
479 iconName = this.icon;
480
481 var params = {
482 id: id,
483 name: this.name,
484 iconName: iconName,
485 label: this.label,
486 cls: this.className || '',
487 state: stateName,
488 hasPopup: hasSubMenu ? 'true' : 'false',
489 disabled: state == CKEDITOR.TRISTATE_DISABLED,
490 title: this.label,
491 href: 'javascript:void(\'' + ( this.label || '' ).replace( "'" + '' ) + '\')', // jshint ignore:line
492 hoverFn: menu._.itemOverFn,
493 moveOutFn: menu._.itemOutFn,
494 clickFn: menu._.itemClickFn,
495 index: index,
496 iconStyle: CKEDITOR.skin.getIconStyle( iconName, ( this.editor.lang.dir == 'rtl' ), iconName == this.icon ? null : this.icon, this.iconOffset ),
497 arrowHtml: hasSubMenu ? menuArrowTpl.output( { label: arrowLabel } ) : '',
498 role: this.role ? this.role : 'menuitem',
499 ariaChecked: ariaChecked
500 };
501
502 menuItemTpl.output( params, output );
503 }
504 }
505 } );
506
507} )();
508
509
510/**
511 * The amount of time, in milliseconds, the editor waits before displaying submenu
512 * options when moving the mouse over options that contain submenus, like the
513 * "Cell Properties" entry for tables.
514 *
515 * // Remove the submenu delay.
516 * config.menu_subMenuDelay = 0;
517 *
518 * @cfg {Number} [menu_subMenuDelay=400]
519 * @member CKEDITOR.config
520 */
521
522/**
523 * Fired when a menu is shown.
524 *
525 * @event menuShow
526 * @member CKEDITOR.editor
527 * @param {CKEDITOR.editor} editor This editor instance.
528 * @param {CKEDITOR.ui.panel[]} data
529 */
530
531/**
532 * A comma separated list of items group names to be displayed in the context
533 * menu. The order of items will reflect the order specified in this list if
534 * no priority was defined in the groups.
535 *
536 * config.menu_groups = 'clipboard,table,anchor,link,image';
537 *
538 * @cfg {String} [menu_groups=see source]
539 * @member CKEDITOR.config
540 */
541CKEDITOR.config.menu_groups = 'clipboard,' +
542 'form,' +
543 'tablecell,tablecellproperties,tablerow,tablecolumn,table,' +
544 'anchor,link,image,flash,' +
545 'checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div';
diff --git a/sources/plugins/menubutton/plugin.js b/sources/plugins/menubutton/plugin.js
new file mode 100644
index 00000000..7f57f876
--- /dev/null
+++ b/sources/plugins/menubutton/plugin.js
@@ -0,0 +1,101 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'menubutton', {
7 requires: 'button,menu',
8 onLoad: function() {
9 var clickFn = function( editor ) {
10 var _ = this._,
11 menu = _.menu;
12
13 // Do nothing if this button is disabled.
14 if ( _.state === CKEDITOR.TRISTATE_DISABLED )
15 return;
16
17 if ( _.on && menu ) {
18 menu.hide();
19 return;
20 }
21
22 _.previousState = _.state;
23
24 // Check if we already have a menu for it, otherwise just create it.
25 if ( !menu ) {
26 menu = _.menu = new CKEDITOR.menu( editor, {
27 panel: {
28 className: 'cke_menu_panel',
29 attributes: { 'aria-label': editor.lang.common.options }
30 }
31 } );
32
33 menu.onHide = CKEDITOR.tools.bind( function() {
34 var modes = this.command ? editor.getCommand( this.command ).modes : this.modes;
35 this.setState( !modes || modes[ editor.mode ] ? _.previousState : CKEDITOR.TRISTATE_DISABLED );
36 _.on = 0;
37 }, this );
38
39 // Initialize the menu items at this point.
40 if ( this.onMenu )
41 menu.addListener( this.onMenu );
42 }
43
44 this.setState( CKEDITOR.TRISTATE_ON );
45 _.on = 1;
46
47 // This timeout is needed to give time for the panel get focus
48 // when JAWS is running. (#9842)
49 setTimeout( function() {
50 menu.show( CKEDITOR.document.getById( _.id ), 4 );
51 }, 0 );
52 };
53
54 /**
55 * @class
56 * @extends CKEDITOR.ui.button
57 * @todo
58 */
59 CKEDITOR.ui.menuButton = CKEDITOR.tools.createClass( {
60 base: CKEDITOR.ui.button,
61
62 /**
63 * Creates a menuButton class instance.
64 *
65 * @constructor
66 * @param Object definition
67 * @todo
68 */
69 $: function( definition ) {
70 // We don't want the panel definition in this object.
71 delete definition.panel;
72
73 this.base( definition );
74
75 this.hasArrow = true;
76
77 this.click = clickFn;
78 },
79
80 statics: {
81 handler: {
82 create: function( definition ) {
83 return new CKEDITOR.ui.menuButton( definition );
84 }
85 }
86 }
87 } );
88 },
89 beforeInit: function( editor ) {
90 editor.ui.addHandler( CKEDITOR.UI_MENUBUTTON, CKEDITOR.ui.menuButton.handler );
91 }
92} );
93
94/**
95 * Button UI element.
96 *
97 * @readonly
98 * @property {String} [='menubutton']
99 * @member CKEDITOR
100 */
101CKEDITOR.UI_MENUBUTTON = 'menubutton';
diff --git a/sources/plugins/newpage/icons/hidpi/newpage-rtl.png b/sources/plugins/newpage/icons/hidpi/newpage-rtl.png
new file mode 100644
index 00000000..1a7551c2
--- /dev/null
+++ b/sources/plugins/newpage/icons/hidpi/newpage-rtl.png
Binary files differ
diff --git a/sources/plugins/newpage/icons/hidpi/newpage.png b/sources/plugins/newpage/icons/hidpi/newpage.png
new file mode 100644
index 00000000..8cbe2230
--- /dev/null
+++ b/sources/plugins/newpage/icons/hidpi/newpage.png
Binary files differ
diff --git a/sources/plugins/newpage/icons/newpage-rtl.png b/sources/plugins/newpage/icons/newpage-rtl.png
new file mode 100644
index 00000000..2c8ef7fe
--- /dev/null
+++ b/sources/plugins/newpage/icons/newpage-rtl.png
Binary files differ
diff --git a/sources/plugins/newpage/icons/newpage.png b/sources/plugins/newpage/icons/newpage.png
new file mode 100644
index 00000000..8e18c8a2
--- /dev/null
+++ b/sources/plugins/newpage/icons/newpage.png
Binary files differ
diff --git a/sources/plugins/newpage/lang/af.js b/sources/plugins/newpage/lang/af.js
new file mode 100644
index 00000000..fee36aae
--- /dev/null
+++ b/sources/plugins/newpage/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'af', {
6 toolbar: 'Nuwe bladsy'
7} );
diff --git a/sources/plugins/newpage/lang/ar.js b/sources/plugins/newpage/lang/ar.js
new file mode 100644
index 00000000..cad53adb
--- /dev/null
+++ b/sources/plugins/newpage/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ar', {
6 toolbar: 'صفحة جديدة'
7} );
diff --git a/sources/plugins/newpage/lang/bg.js b/sources/plugins/newpage/lang/bg.js
new file mode 100644
index 00000000..ec95b297
--- /dev/null
+++ b/sources/plugins/newpage/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'bg', {
6 toolbar: 'Нова страница'
7} );
diff --git a/sources/plugins/newpage/lang/bn.js b/sources/plugins/newpage/lang/bn.js
new file mode 100644
index 00000000..884de420
--- /dev/null
+++ b/sources/plugins/newpage/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'bn', {
6 toolbar: 'নতুন পেজ'
7} );
diff --git a/sources/plugins/newpage/lang/bs.js b/sources/plugins/newpage/lang/bs.js
new file mode 100644
index 00000000..cf85d954
--- /dev/null
+++ b/sources/plugins/newpage/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'bs', {
6 toolbar: 'Novi dokument'
7} );
diff --git a/sources/plugins/newpage/lang/ca.js b/sources/plugins/newpage/lang/ca.js
new file mode 100644
index 00000000..2e13a174
--- /dev/null
+++ b/sources/plugins/newpage/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ca', {
6 toolbar: 'Nova pàgina'
7} );
diff --git a/sources/plugins/newpage/lang/cs.js b/sources/plugins/newpage/lang/cs.js
new file mode 100644
index 00000000..55a61f88
--- /dev/null
+++ b/sources/plugins/newpage/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'cs', {
6 toolbar: 'Nová stránka'
7} );
diff --git a/sources/plugins/newpage/lang/cy.js b/sources/plugins/newpage/lang/cy.js
new file mode 100644
index 00000000..d5733ea9
--- /dev/null
+++ b/sources/plugins/newpage/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'cy', {
6 toolbar: 'Tudalen Newydd'
7} );
diff --git a/sources/plugins/newpage/lang/da.js b/sources/plugins/newpage/lang/da.js
new file mode 100644
index 00000000..8d623a92
--- /dev/null
+++ b/sources/plugins/newpage/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'da', {
6 toolbar: 'Ny side'
7} );
diff --git a/sources/plugins/newpage/lang/de.js b/sources/plugins/newpage/lang/de.js
new file mode 100644
index 00000000..974875db
--- /dev/null
+++ b/sources/plugins/newpage/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'de', {
6 toolbar: 'Neue Seite'
7} );
diff --git a/sources/plugins/newpage/lang/el.js b/sources/plugins/newpage/lang/el.js
new file mode 100644
index 00000000..7e7c022e
--- /dev/null
+++ b/sources/plugins/newpage/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'el', {
6 toolbar: 'Νέα Σελίδα'
7} );
diff --git a/sources/plugins/newpage/lang/en-au.js b/sources/plugins/newpage/lang/en-au.js
new file mode 100644
index 00000000..42926f43
--- /dev/null
+++ b/sources/plugins/newpage/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'en-au', {
6 toolbar: 'New Page'
7} );
diff --git a/sources/plugins/newpage/lang/en-ca.js b/sources/plugins/newpage/lang/en-ca.js
new file mode 100644
index 00000000..cf5736c9
--- /dev/null
+++ b/sources/plugins/newpage/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'en-ca', {
6 toolbar: 'New Page'
7} );
diff --git a/sources/plugins/newpage/lang/en-gb.js b/sources/plugins/newpage/lang/en-gb.js
new file mode 100644
index 00000000..884ff82d
--- /dev/null
+++ b/sources/plugins/newpage/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'en-gb', {
6 toolbar: 'New Page'
7} );
diff --git a/sources/plugins/newpage/lang/en.js b/sources/plugins/newpage/lang/en.js
new file mode 100644
index 00000000..6e5fb992
--- /dev/null
+++ b/sources/plugins/newpage/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'en', {
6 toolbar: 'New Page'
7} );
diff --git a/sources/plugins/newpage/lang/eo.js b/sources/plugins/newpage/lang/eo.js
new file mode 100644
index 00000000..2e25fee7
--- /dev/null
+++ b/sources/plugins/newpage/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'eo', {
6 toolbar: 'Nova Paĝo'
7} );
diff --git a/sources/plugins/newpage/lang/es.js b/sources/plugins/newpage/lang/es.js
new file mode 100644
index 00000000..f080d79b
--- /dev/null
+++ b/sources/plugins/newpage/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'es', {
6 toolbar: 'Nueva Página'
7} );
diff --git a/sources/plugins/newpage/lang/et.js b/sources/plugins/newpage/lang/et.js
new file mode 100644
index 00000000..3dee3a99
--- /dev/null
+++ b/sources/plugins/newpage/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'et', {
6 toolbar: 'Uus leht'
7} );
diff --git a/sources/plugins/newpage/lang/eu.js b/sources/plugins/newpage/lang/eu.js
new file mode 100644
index 00000000..4ce953d6
--- /dev/null
+++ b/sources/plugins/newpage/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'eu', {
6 toolbar: 'Orrialde berria'
7} );
diff --git a/sources/plugins/newpage/lang/fa.js b/sources/plugins/newpage/lang/fa.js
new file mode 100644
index 00000000..13e8ab1f
--- /dev/null
+++ b/sources/plugins/newpage/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'fa', {
6 toolbar: 'برگهٴ تازه'
7} );
diff --git a/sources/plugins/newpage/lang/fi.js b/sources/plugins/newpage/lang/fi.js
new file mode 100644
index 00000000..a244dcdc
--- /dev/null
+++ b/sources/plugins/newpage/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'fi', {
6 toolbar: 'Tyhjennä'
7} );
diff --git a/sources/plugins/newpage/lang/fo.js b/sources/plugins/newpage/lang/fo.js
new file mode 100644
index 00000000..171c5969
--- /dev/null
+++ b/sources/plugins/newpage/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'fo', {
6 toolbar: 'Nýggj síða'
7} );
diff --git a/sources/plugins/newpage/lang/fr-ca.js b/sources/plugins/newpage/lang/fr-ca.js
new file mode 100644
index 00000000..9e7a7b80
--- /dev/null
+++ b/sources/plugins/newpage/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'fr-ca', {
6 toolbar: 'Nouvelle page'
7} );
diff --git a/sources/plugins/newpage/lang/fr.js b/sources/plugins/newpage/lang/fr.js
new file mode 100644
index 00000000..132f254c
--- /dev/null
+++ b/sources/plugins/newpage/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'fr', {
6 toolbar: 'Nouvelle page'
7} );
diff --git a/sources/plugins/newpage/lang/gl.js b/sources/plugins/newpage/lang/gl.js
new file mode 100644
index 00000000..bdb804cd
--- /dev/null
+++ b/sources/plugins/newpage/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'gl', {
6 toolbar: 'Páxina nova'
7} );
diff --git a/sources/plugins/newpage/lang/gu.js b/sources/plugins/newpage/lang/gu.js
new file mode 100644
index 00000000..b0fa4cc6
--- /dev/null
+++ b/sources/plugins/newpage/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'gu', {
6 toolbar: 'નવુ પાનું'
7} );
diff --git a/sources/plugins/newpage/lang/he.js b/sources/plugins/newpage/lang/he.js
new file mode 100644
index 00000000..cb0ba3cb
--- /dev/null
+++ b/sources/plugins/newpage/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'he', {
6 toolbar: 'דף חדש'
7} );
diff --git a/sources/plugins/newpage/lang/hi.js b/sources/plugins/newpage/lang/hi.js
new file mode 100644
index 00000000..6529c3ab
--- /dev/null
+++ b/sources/plugins/newpage/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'hi', {
6 toolbar: 'नया पेज'
7} );
diff --git a/sources/plugins/newpage/lang/hr.js b/sources/plugins/newpage/lang/hr.js
new file mode 100644
index 00000000..a5ab1e09
--- /dev/null
+++ b/sources/plugins/newpage/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'hr', {
6 toolbar: 'Nova stranica'
7} );
diff --git a/sources/plugins/newpage/lang/hu.js b/sources/plugins/newpage/lang/hu.js
new file mode 100644
index 00000000..7349d804
--- /dev/null
+++ b/sources/plugins/newpage/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'hu', {
6 toolbar: 'Új oldal'
7} );
diff --git a/sources/plugins/newpage/lang/id.js b/sources/plugins/newpage/lang/id.js
new file mode 100644
index 00000000..3d2ed0fc
--- /dev/null
+++ b/sources/plugins/newpage/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'id', {
6 toolbar: 'Halaman Baru'
7} );
diff --git a/sources/plugins/newpage/lang/is.js b/sources/plugins/newpage/lang/is.js
new file mode 100644
index 00000000..8eabde2f
--- /dev/null
+++ b/sources/plugins/newpage/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'is', {
6 toolbar: 'Ný síða'
7} );
diff --git a/sources/plugins/newpage/lang/it.js b/sources/plugins/newpage/lang/it.js
new file mode 100644
index 00000000..b07c144a
--- /dev/null
+++ b/sources/plugins/newpage/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'it', {
6 toolbar: 'Nuova pagina'
7} );
diff --git a/sources/plugins/newpage/lang/ja.js b/sources/plugins/newpage/lang/ja.js
new file mode 100644
index 00000000..83bfb07d
--- /dev/null
+++ b/sources/plugins/newpage/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ja', {
6 toolbar: '新しいページ'
7} );
diff --git a/sources/plugins/newpage/lang/ka.js b/sources/plugins/newpage/lang/ka.js
new file mode 100644
index 00000000..643da6c1
--- /dev/null
+++ b/sources/plugins/newpage/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ka', {
6 toolbar: 'ახალი გვერდი'
7} );
diff --git a/sources/plugins/newpage/lang/km.js b/sources/plugins/newpage/lang/km.js
new file mode 100644
index 00000000..98d70be1
--- /dev/null
+++ b/sources/plugins/newpage/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'km', {
6 toolbar: 'ទំព័រ​ថ្មី'
7} );
diff --git a/sources/plugins/newpage/lang/ko.js b/sources/plugins/newpage/lang/ko.js
new file mode 100644
index 00000000..9f97f529
--- /dev/null
+++ b/sources/plugins/newpage/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ko', {
6 toolbar: '새 페이지'
7} );
diff --git a/sources/plugins/newpage/lang/ku.js b/sources/plugins/newpage/lang/ku.js
new file mode 100644
index 00000000..eb125361
--- /dev/null
+++ b/sources/plugins/newpage/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ku', {
6 toolbar: 'پەڕەیەکی نوێ'
7} );
diff --git a/sources/plugins/newpage/lang/lt.js b/sources/plugins/newpage/lang/lt.js
new file mode 100644
index 00000000..08f21989
--- /dev/null
+++ b/sources/plugins/newpage/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'lt', {
6 toolbar: 'Naujas puslapis'
7} );
diff --git a/sources/plugins/newpage/lang/lv.js b/sources/plugins/newpage/lang/lv.js
new file mode 100644
index 00000000..d0889a94
--- /dev/null
+++ b/sources/plugins/newpage/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'lv', {
6 toolbar: 'Jauna lapa'
7} );
diff --git a/sources/plugins/newpage/lang/mk.js b/sources/plugins/newpage/lang/mk.js
new file mode 100644
index 00000000..736ce57f
--- /dev/null
+++ b/sources/plugins/newpage/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'mk', {
6 toolbar: 'New Page' // MISSING
7} );
diff --git a/sources/plugins/newpage/lang/mn.js b/sources/plugins/newpage/lang/mn.js
new file mode 100644
index 00000000..0a0a1728
--- /dev/null
+++ b/sources/plugins/newpage/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'mn', {
6 toolbar: 'Шинэ хуудас'
7} );
diff --git a/sources/plugins/newpage/lang/ms.js b/sources/plugins/newpage/lang/ms.js
new file mode 100644
index 00000000..c5b8936c
--- /dev/null
+++ b/sources/plugins/newpage/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ms', {
6 toolbar: 'Helaian Baru'
7} );
diff --git a/sources/plugins/newpage/lang/nb.js b/sources/plugins/newpage/lang/nb.js
new file mode 100644
index 00000000..16a58aa0
--- /dev/null
+++ b/sources/plugins/newpage/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'nb', {
6 toolbar: 'Ny side'
7} );
diff --git a/sources/plugins/newpage/lang/nl.js b/sources/plugins/newpage/lang/nl.js
new file mode 100644
index 00000000..37788b07
--- /dev/null
+++ b/sources/plugins/newpage/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'nl', {
6 toolbar: 'Nieuwe pagina'
7} );
diff --git a/sources/plugins/newpage/lang/no.js b/sources/plugins/newpage/lang/no.js
new file mode 100644
index 00000000..324ed97b
--- /dev/null
+++ b/sources/plugins/newpage/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'no', {
6 toolbar: 'Ny side'
7} );
diff --git a/sources/plugins/newpage/lang/pl.js b/sources/plugins/newpage/lang/pl.js
new file mode 100644
index 00000000..25cb325f
--- /dev/null
+++ b/sources/plugins/newpage/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'pl', {
6 toolbar: 'Nowa strona'
7} );
diff --git a/sources/plugins/newpage/lang/pt-br.js b/sources/plugins/newpage/lang/pt-br.js
new file mode 100644
index 00000000..19a2bd76
--- /dev/null
+++ b/sources/plugins/newpage/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'pt-br', {
6 toolbar: 'Novo'
7} );
diff --git a/sources/plugins/newpage/lang/pt.js b/sources/plugins/newpage/lang/pt.js
new file mode 100644
index 00000000..8223fe7f
--- /dev/null
+++ b/sources/plugins/newpage/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'pt', {
6 toolbar: 'Nova Página'
7} );
diff --git a/sources/plugins/newpage/lang/ro.js b/sources/plugins/newpage/lang/ro.js
new file mode 100644
index 00000000..35a80767
--- /dev/null
+++ b/sources/plugins/newpage/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ro', {
6 toolbar: 'Pagină nouă'
7} );
diff --git a/sources/plugins/newpage/lang/ru.js b/sources/plugins/newpage/lang/ru.js
new file mode 100644
index 00000000..087ddd51
--- /dev/null
+++ b/sources/plugins/newpage/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ru', {
6 toolbar: 'Новая страница'
7} );
diff --git a/sources/plugins/newpage/lang/si.js b/sources/plugins/newpage/lang/si.js
new file mode 100644
index 00000000..818853a0
--- /dev/null
+++ b/sources/plugins/newpage/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'si', {
6 toolbar: 'නව පිටුවක්'
7} );
diff --git a/sources/plugins/newpage/lang/sk.js b/sources/plugins/newpage/lang/sk.js
new file mode 100644
index 00000000..d9eaf83e
--- /dev/null
+++ b/sources/plugins/newpage/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'sk', {
6 toolbar: 'Nová stránka'
7} );
diff --git a/sources/plugins/newpage/lang/sl.js b/sources/plugins/newpage/lang/sl.js
new file mode 100644
index 00000000..abfbc738
--- /dev/null
+++ b/sources/plugins/newpage/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'sl', {
6 toolbar: 'Nova stran'
7} );
diff --git a/sources/plugins/newpage/lang/sq.js b/sources/plugins/newpage/lang/sq.js
new file mode 100644
index 00000000..d5a1a01e
--- /dev/null
+++ b/sources/plugins/newpage/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'sq', {
6 toolbar: 'Faqe e Re'
7} );
diff --git a/sources/plugins/newpage/lang/sr-latn.js b/sources/plugins/newpage/lang/sr-latn.js
new file mode 100644
index 00000000..d67e20e5
--- /dev/null
+++ b/sources/plugins/newpage/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'sr-latn', {
6 toolbar: 'Nova stranica'
7} );
diff --git a/sources/plugins/newpage/lang/sr.js b/sources/plugins/newpage/lang/sr.js
new file mode 100644
index 00000000..8547facc
--- /dev/null
+++ b/sources/plugins/newpage/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'sr', {
6 toolbar: 'Нова страница'
7} );
diff --git a/sources/plugins/newpage/lang/sv.js b/sources/plugins/newpage/lang/sv.js
new file mode 100644
index 00000000..a68f4d0a
--- /dev/null
+++ b/sources/plugins/newpage/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'sv', {
6 toolbar: 'Ny sida'
7} );
diff --git a/sources/plugins/newpage/lang/th.js b/sources/plugins/newpage/lang/th.js
new file mode 100644
index 00000000..7b936afd
--- /dev/null
+++ b/sources/plugins/newpage/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'th', {
6 toolbar: 'สร้างหน้าเอกสารใหม่'
7} );
diff --git a/sources/plugins/newpage/lang/tr.js b/sources/plugins/newpage/lang/tr.js
new file mode 100644
index 00000000..0fe09b82
--- /dev/null
+++ b/sources/plugins/newpage/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'tr', {
6 toolbar: 'Yeni Sayfa'
7} );
diff --git a/sources/plugins/newpage/lang/tt.js b/sources/plugins/newpage/lang/tt.js
new file mode 100644
index 00000000..2943fde9
--- /dev/null
+++ b/sources/plugins/newpage/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'tt', {
6 toolbar: 'Яңа бит'
7} );
diff --git a/sources/plugins/newpage/lang/ug.js b/sources/plugins/newpage/lang/ug.js
new file mode 100644
index 00000000..6fb3e328
--- /dev/null
+++ b/sources/plugins/newpage/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'ug', {
6 toolbar: 'يېڭى بەت'
7} );
diff --git a/sources/plugins/newpage/lang/uk.js b/sources/plugins/newpage/lang/uk.js
new file mode 100644
index 00000000..088526c4
--- /dev/null
+++ b/sources/plugins/newpage/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'uk', {
6 toolbar: 'Нова сторінка'
7} );
diff --git a/sources/plugins/newpage/lang/vi.js b/sources/plugins/newpage/lang/vi.js
new file mode 100644
index 00000000..6517aa80
--- /dev/null
+++ b/sources/plugins/newpage/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'vi', {
6 toolbar: 'Trang mới'
7} );
diff --git a/sources/plugins/newpage/lang/zh-cn.js b/sources/plugins/newpage/lang/zh-cn.js
new file mode 100644
index 00000000..d1a7c747
--- /dev/null
+++ b/sources/plugins/newpage/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'zh-cn', {
6 toolbar: '新建'
7} );
diff --git a/sources/plugins/newpage/lang/zh.js b/sources/plugins/newpage/lang/zh.js
new file mode 100644
index 00000000..e216116f
--- /dev/null
+++ b/sources/plugins/newpage/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'newpage', 'zh', {
6 toolbar: '新增網頁'
7} );
diff --git a/sources/plugins/newpage/plugin.js b/sources/plugins/newpage/plugin.js
new file mode 100644
index 00000000..3a4e3e33
--- /dev/null
+++ b/sources/plugins/newpage/plugin.js
@@ -0,0 +1,53 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Horizontal Page Break.
8 */
9
10// Register a plugin named "newpage".
11CKEDITOR.plugins.add( 'newpage', {
12 // jscs:disable maximumLineLength
13 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
14 // jscs:enable maximumLineLength
15 icons: 'newpage,newpage-rtl', // %REMOVE_LINE_CORE%
16 hidpi: true, // %REMOVE_LINE_CORE%
17 init: function( editor ) {
18 editor.addCommand( 'newpage', { modes: { wysiwyg: 1, source: 1 },
19
20 exec: function( editor ) {
21 var command = this;
22 editor.setData( editor.config.newpage_html || '', function() {
23 editor.focus();
24 // Save the undo snapshot after all document changes are affected. (#4889)
25 setTimeout( function() {
26 editor.fire( 'afterCommandExec', {
27 name: 'newpage',
28 command: command
29 } );
30 editor.selectionChange();
31
32 }, 200 );
33 } );
34 },
35 async: true
36 } );
37
38 editor.ui.addButton && editor.ui.addButton( 'NewPage', {
39 label: editor.lang.newpage.toolbar,
40 command: 'newpage',
41 toolbar: 'document,20'
42 } );
43 }
44} );
45
46/**
47 * The HTML to load in the editor when the "new page" command is executed.
48 *
49 * config.newpage_html = '<p>Type your text here.</p>';
50 *
51 * @cfg {String} [newpage_html='']
52 * @member CKEDITOR.config
53 */
diff --git a/sources/plugins/pagebreak/icons/hidpi/pagebreak-rtl.png b/sources/plugins/pagebreak/icons/hidpi/pagebreak-rtl.png
new file mode 100644
index 00000000..4a5418cb
--- /dev/null
+++ b/sources/plugins/pagebreak/icons/hidpi/pagebreak-rtl.png
Binary files differ
diff --git a/sources/plugins/pagebreak/icons/hidpi/pagebreak.png b/sources/plugins/pagebreak/icons/hidpi/pagebreak.png
new file mode 100644
index 00000000..8d3930bb
--- /dev/null
+++ b/sources/plugins/pagebreak/icons/hidpi/pagebreak.png
Binary files differ
diff --git a/sources/plugins/pagebreak/icons/pagebreak-rtl.png b/sources/plugins/pagebreak/icons/pagebreak-rtl.png
new file mode 100644
index 00000000..b5b342b0
--- /dev/null
+++ b/sources/plugins/pagebreak/icons/pagebreak-rtl.png
Binary files differ
diff --git a/sources/plugins/pagebreak/icons/pagebreak.png b/sources/plugins/pagebreak/icons/pagebreak.png
new file mode 100644
index 00000000..5280a6e9
--- /dev/null
+++ b/sources/plugins/pagebreak/icons/pagebreak.png
Binary files differ
diff --git a/sources/plugins/pagebreak/images/pagebreak.gif b/sources/plugins/pagebreak/images/pagebreak.gif
new file mode 100644
index 00000000..a27b1684
--- /dev/null
+++ b/sources/plugins/pagebreak/images/pagebreak.gif
Binary files differ
diff --git a/sources/plugins/pagebreak/lang/af.js b/sources/plugins/pagebreak/lang/af.js
new file mode 100644
index 00000000..584570eb
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'af', {
6 alt: 'Bladsy-einde',
7 toolbar: 'Bladsy-einde invoeg'
8} );
diff --git a/sources/plugins/pagebreak/lang/ar.js b/sources/plugins/pagebreak/lang/ar.js
new file mode 100644
index 00000000..6fd3edfe
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ar', {
6 alt: 'فاصل الصفحة',
7 toolbar: 'إدخال صفحة جديدة'
8} );
diff --git a/sources/plugins/pagebreak/lang/bg.js b/sources/plugins/pagebreak/lang/bg.js
new file mode 100644
index 00000000..8e67d700
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'bg', {
6 alt: 'Разделяне на страници',
7 toolbar: 'Вмъкване на нова страница при печат'
8} );
diff --git a/sources/plugins/pagebreak/lang/bn.js b/sources/plugins/pagebreak/lang/bn.js
new file mode 100644
index 00000000..aa535e41
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'bn', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'পেজ ব্রেক'
8} );
diff --git a/sources/plugins/pagebreak/lang/bs.js b/sources/plugins/pagebreak/lang/bs.js
new file mode 100644
index 00000000..cfca7142
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'bs', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing' // MISSING
8} );
diff --git a/sources/plugins/pagebreak/lang/ca.js b/sources/plugins/pagebreak/lang/ca.js
new file mode 100644
index 00000000..3fdafae7
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ca', {
6 alt: 'Salt de pàgina',
7 toolbar: 'Insereix salt de pàgina'
8} );
diff --git a/sources/plugins/pagebreak/lang/cs.js b/sources/plugins/pagebreak/lang/cs.js
new file mode 100644
index 00000000..1e51edcf
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'cs', {
6 alt: 'Konec stránky',
7 toolbar: 'Vložit konec stránky'
8} );
diff --git a/sources/plugins/pagebreak/lang/cy.js b/sources/plugins/pagebreak/lang/cy.js
new file mode 100644
index 00000000..fbcc1c73
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'cy', {
6 alt: 'Toriad Tudalen',
7 toolbar: 'Mewnosod Toriad Tudalen i Argraffu'
8} );
diff --git a/sources/plugins/pagebreak/lang/da.js b/sources/plugins/pagebreak/lang/da.js
new file mode 100644
index 00000000..52753780
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'da', {
6 alt: 'Sideskift',
7 toolbar: 'Indsæt sideskift'
8} );
diff --git a/sources/plugins/pagebreak/lang/de.js b/sources/plugins/pagebreak/lang/de.js
new file mode 100644
index 00000000..081f6919
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'de', {
6 alt: 'Seitenumbruch',
7 toolbar: 'Seitenumbruch zum Drucken einfügen'
8} );
diff --git a/sources/plugins/pagebreak/lang/el.js b/sources/plugins/pagebreak/lang/el.js
new file mode 100644
index 00000000..26c51741
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'el', {
6 alt: 'Αλλαγή Σελίδας',
7 toolbar: 'Εισαγωγή Τέλους Σελίδας για Εκτύπωση'
8} );
diff --git a/sources/plugins/pagebreak/lang/en-au.js b/sources/plugins/pagebreak/lang/en-au.js
new file mode 100644
index 00000000..08cdcf1b
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'en-au', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing'
8} );
diff --git a/sources/plugins/pagebreak/lang/en-ca.js b/sources/plugins/pagebreak/lang/en-ca.js
new file mode 100644
index 00000000..1e0d9a94
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'en-ca', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing'
8} );
diff --git a/sources/plugins/pagebreak/lang/en-gb.js b/sources/plugins/pagebreak/lang/en-gb.js
new file mode 100644
index 00000000..6f55f8c9
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'en-gb', {
6 alt: 'Page Break',
7 toolbar: 'Insert Page Break for Printing'
8} );
diff --git a/sources/plugins/pagebreak/lang/en.js b/sources/plugins/pagebreak/lang/en.js
new file mode 100644
index 00000000..a59f566a
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'en', {
6 alt: 'Page Break',
7 toolbar: 'Insert Page Break for Printing'
8} );
diff --git a/sources/plugins/pagebreak/lang/eo.js b/sources/plugins/pagebreak/lang/eo.js
new file mode 100644
index 00000000..90f49396
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'eo', {
6 alt: 'Paĝavanco',
7 toolbar: 'Enmeti Paĝavancon por Presado'
8} );
diff --git a/sources/plugins/pagebreak/lang/es.js b/sources/plugins/pagebreak/lang/es.js
new file mode 100644
index 00000000..e687d779
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'es', {
6 alt: 'Salto de página',
7 toolbar: 'Insertar Salto de Página'
8} );
diff --git a/sources/plugins/pagebreak/lang/et.js b/sources/plugins/pagebreak/lang/et.js
new file mode 100644
index 00000000..aca67553
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'et', {
6 alt: 'Lehevahetuskoht',
7 toolbar: 'Lehevahetuskoha sisestamine'
8} );
diff --git a/sources/plugins/pagebreak/lang/eu.js b/sources/plugins/pagebreak/lang/eu.js
new file mode 100644
index 00000000..3b05b600
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'eu', {
6 alt: 'Orrialde-jauzia',
7 toolbar: 'Txertatu orrialde-jauzia inprimatzean'
8} );
diff --git a/sources/plugins/pagebreak/lang/fa.js b/sources/plugins/pagebreak/lang/fa.js
new file mode 100644
index 00000000..6afd12e9
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'fa', {
6 alt: 'شکستن صفحه',
7 toolbar: 'گنجاندن شکستگی پایان برگه'
8} );
diff --git a/sources/plugins/pagebreak/lang/fi.js b/sources/plugins/pagebreak/lang/fi.js
new file mode 100644
index 00000000..9dfa2369
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'fi', {
6 alt: 'Sivunvaihto',
7 toolbar: 'Lisää sivunvaihto'
8} );
diff --git a/sources/plugins/pagebreak/lang/fo.js b/sources/plugins/pagebreak/lang/fo.js
new file mode 100644
index 00000000..6e2e818c
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'fo', {
6 alt: 'Síðuskift',
7 toolbar: 'Ger síðuskift'
8} );
diff --git a/sources/plugins/pagebreak/lang/fr-ca.js b/sources/plugins/pagebreak/lang/fr-ca.js
new file mode 100644
index 00000000..4e41474d
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'fr-ca', {
6 alt: 'Saut de page',
7 toolbar: 'Insérer un saut de page à l\'impression'
8} );
diff --git a/sources/plugins/pagebreak/lang/fr.js b/sources/plugins/pagebreak/lang/fr.js
new file mode 100644
index 00000000..60fcf907
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'fr', {
6 alt: 'Saut de page',
7 toolbar: 'Saut de page'
8} );
diff --git a/sources/plugins/pagebreak/lang/gl.js b/sources/plugins/pagebreak/lang/gl.js
new file mode 100644
index 00000000..1f7ac38c
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'gl', {
6 alt: 'Quebra de páxina',
7 toolbar: 'Inserir quebra de páxina'
8} );
diff --git a/sources/plugins/pagebreak/lang/gu.js b/sources/plugins/pagebreak/lang/gu.js
new file mode 100644
index 00000000..ddff0233
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'gu', {
6 alt: 'નવું પાનું',
7 toolbar: 'ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું'
8} );
diff --git a/sources/plugins/pagebreak/lang/he.js b/sources/plugins/pagebreak/lang/he.js
new file mode 100644
index 00000000..ad6ad6ee
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'he', {
6 alt: 'שבירת דף',
7 toolbar: 'הוספת שבירת דף'
8} );
diff --git a/sources/plugins/pagebreak/lang/hi.js b/sources/plugins/pagebreak/lang/hi.js
new file mode 100644
index 00000000..5dde08ae
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'hi', {
6 alt: 'पेज ब्रेक',
7 toolbar: 'पेज ब्रेक इन्सर्ट् करें'
8} );
diff --git a/sources/plugins/pagebreak/lang/hr.js b/sources/plugins/pagebreak/lang/hr.js
new file mode 100644
index 00000000..84470207
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'hr', {
6 alt: 'Prijelom stranice',
7 toolbar: 'Ubaci prijelom stranice'
8} );
diff --git a/sources/plugins/pagebreak/lang/hu.js b/sources/plugins/pagebreak/lang/hu.js
new file mode 100644
index 00000000..2fa477db
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'hu', {
6 alt: 'Oldaltörés',
7 toolbar: 'Oldaltörés beillesztése'
8} );
diff --git a/sources/plugins/pagebreak/lang/id.js b/sources/plugins/pagebreak/lang/id.js
new file mode 100644
index 00000000..a0deb770
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'id', {
6 alt: 'Halaman Istirahat',
7 toolbar: 'Sisip Halaman Istirahat untuk Pencetakan '
8} );
diff --git a/sources/plugins/pagebreak/lang/is.js b/sources/plugins/pagebreak/lang/is.js
new file mode 100644
index 00000000..d2ca4682
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'is', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Setja inn síðuskil'
8} );
diff --git a/sources/plugins/pagebreak/lang/it.js b/sources/plugins/pagebreak/lang/it.js
new file mode 100644
index 00000000..d1d13146
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'it', {
6 alt: 'Interruzione di pagina',
7 toolbar: 'Inserisci interruzione di pagina per la stampa'
8} );
diff --git a/sources/plugins/pagebreak/lang/ja.js b/sources/plugins/pagebreak/lang/ja.js
new file mode 100644
index 00000000..a2a70e72
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ja', {
6 alt: '改ページ',
7 toolbar: '印刷の為に改ページ挿入'
8} );
diff --git a/sources/plugins/pagebreak/lang/ka.js b/sources/plugins/pagebreak/lang/ka.js
new file mode 100644
index 00000000..fb51570c
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ka', {
6 alt: 'გვერდის წყვეტა',
7 toolbar: 'გვერდის წყვეტა ბეჭდვისთვის'
8} );
diff --git a/sources/plugins/pagebreak/lang/km.js b/sources/plugins/pagebreak/lang/km.js
new file mode 100644
index 00000000..6e2aac76
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'km', {
6 alt: 'បំបែក​ទំព័រ',
7 toolbar: 'បន្ថែម​ការ​បំបែក​ទំព័រ​មុន​បោះពុម្ព'
8} );
diff --git a/sources/plugins/pagebreak/lang/ko.js b/sources/plugins/pagebreak/lang/ko.js
new file mode 100644
index 00000000..7047dfa6
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ko', {
6 alt: '페이지 나누기',
7 toolbar: '인쇄시 페이지 나누기 삽입'
8} );
diff --git a/sources/plugins/pagebreak/lang/ku.js b/sources/plugins/pagebreak/lang/ku.js
new file mode 100644
index 00000000..78015e01
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ku', {
6 alt: 'پشووی پەڕە',
7 toolbar: 'دانانی پشووی پەڕە بۆ چاپکردن'
8} );
diff --git a/sources/plugins/pagebreak/lang/lt.js b/sources/plugins/pagebreak/lang/lt.js
new file mode 100644
index 00000000..5cf10005
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'lt', {
6 alt: 'Puslapio skirtukas',
7 toolbar: 'Įterpti puslapių skirtuką'
8} );
diff --git a/sources/plugins/pagebreak/lang/lv.js b/sources/plugins/pagebreak/lang/lv.js
new file mode 100644
index 00000000..087cc81b
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'lv', {
6 alt: 'Lapas pārnesums',
7 toolbar: 'Ievietot lapas pārtraukumu drukai'
8} );
diff --git a/sources/plugins/pagebreak/lang/mk.js b/sources/plugins/pagebreak/lang/mk.js
new file mode 100644
index 00000000..1ce57e73
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'mk', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing' // MISSING
8} );
diff --git a/sources/plugins/pagebreak/lang/mn.js b/sources/plugins/pagebreak/lang/mn.js
new file mode 100644
index 00000000..8d529b87
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'mn', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Хуудас тусгаарлагч оруулах'
8} );
diff --git a/sources/plugins/pagebreak/lang/ms.js b/sources/plugins/pagebreak/lang/ms.js
new file mode 100644
index 00000000..1d1611cd
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ms', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing' // MISSING
8} );
diff --git a/sources/plugins/pagebreak/lang/nb.js b/sources/plugins/pagebreak/lang/nb.js
new file mode 100644
index 00000000..0703b149
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'nb', {
6 alt: 'Sideskift',
7 toolbar: 'Sett inn sideskift for utskrift'
8} );
diff --git a/sources/plugins/pagebreak/lang/nl.js b/sources/plugins/pagebreak/lang/nl.js
new file mode 100644
index 00000000..3a17a16a
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'nl', {
6 alt: 'Pagina-einde',
7 toolbar: 'Pagina-einde invoegen'
8} );
diff --git a/sources/plugins/pagebreak/lang/no.js b/sources/plugins/pagebreak/lang/no.js
new file mode 100644
index 00000000..8d66edf2
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'no', {
6 alt: 'Sideskift',
7 toolbar: 'Sett inn sideskift for utskrift'
8} );
diff --git a/sources/plugins/pagebreak/lang/pl.js b/sources/plugins/pagebreak/lang/pl.js
new file mode 100644
index 00000000..37be09e6
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'pl', {
6 alt: 'Wstaw podział strony',
7 toolbar: 'Wstaw podział strony'
8} );
diff --git a/sources/plugins/pagebreak/lang/pt-br.js b/sources/plugins/pagebreak/lang/pt-br.js
new file mode 100644
index 00000000..0cc58f83
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'pt-br', {
6 alt: 'Quebra de Página',
7 toolbar: 'Inserir Quebra de Página'
8} );
diff --git a/sources/plugins/pagebreak/lang/pt.js b/sources/plugins/pagebreak/lang/pt.js
new file mode 100644
index 00000000..848f8f65
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'pt', {
6 alt: 'Quebra de página',
7 toolbar: 'Inserir Quebra de Página'
8} );
diff --git a/sources/plugins/pagebreak/lang/ro.js b/sources/plugins/pagebreak/lang/ro.js
new file mode 100644
index 00000000..de27778d
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ro', {
6 alt: 'Page Break',
7 toolbar: 'Inserează separator de pagină (Page Break)'
8} );
diff --git a/sources/plugins/pagebreak/lang/ru.js b/sources/plugins/pagebreak/lang/ru.js
new file mode 100644
index 00000000..83c57202
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ru', {
6 alt: 'Разрыв страницы',
7 toolbar: 'Вставить разрыв страницы для печати'
8} );
diff --git a/sources/plugins/pagebreak/lang/si.js b/sources/plugins/pagebreak/lang/si.js
new file mode 100644
index 00000000..4eb311e6
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'si', {
6 alt: 'පිටු බිදුම',
7 toolbar: 'මුද්‍රණය සඳහා පිටු බිදුමක් ඇතුලත් කරන්න'
8} );
diff --git a/sources/plugins/pagebreak/lang/sk.js b/sources/plugins/pagebreak/lang/sk.js
new file mode 100644
index 00000000..5b9b35a7
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'sk', {
6 alt: 'Zalomenie strany',
7 toolbar: 'Vložiť oddeľovač stránky pre tlač'
8} );
diff --git a/sources/plugins/pagebreak/lang/sl.js b/sources/plugins/pagebreak/lang/sl.js
new file mode 100644
index 00000000..c24495e1
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'sl', {
6 alt: 'Prelom Strani',
7 toolbar: 'Vstavi prelom strani'
8} );
diff --git a/sources/plugins/pagebreak/lang/sq.js b/sources/plugins/pagebreak/lang/sq.js
new file mode 100644
index 00000000..1116407c
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'sq', {
6 alt: 'Thyerja e Faqes',
7 toolbar: 'Vendos Thyerje Faqeje për Shtyp'
8} );
diff --git a/sources/plugins/pagebreak/lang/sr-latn.js b/sources/plugins/pagebreak/lang/sr-latn.js
new file mode 100644
index 00000000..38b520e5
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'sr-latn', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing' // MISSING
8} );
diff --git a/sources/plugins/pagebreak/lang/sr.js b/sources/plugins/pagebreak/lang/sr.js
new file mode 100644
index 00000000..b08dbea2
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'sr', {
6 alt: 'Page Break', // MISSING
7 toolbar: 'Insert Page Break for Printing' // MISSING
8} );
diff --git a/sources/plugins/pagebreak/lang/sv.js b/sources/plugins/pagebreak/lang/sv.js
new file mode 100644
index 00000000..01098ef8
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'sv', {
6 alt: 'Sidbrytning',
7 toolbar: 'Infoga sidbrytning för utskrift'
8} );
diff --git a/sources/plugins/pagebreak/lang/th.js b/sources/plugins/pagebreak/lang/th.js
new file mode 100644
index 00000000..1716504f
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'th', {
6 alt: 'ตัวแบ่งหน้า',
7 toolbar: 'แทรกตัวแบ่งหน้า Page Break'
8} );
diff --git a/sources/plugins/pagebreak/lang/tr.js b/sources/plugins/pagebreak/lang/tr.js
new file mode 100644
index 00000000..1f2d2833
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'tr', {
6 alt: 'Sayfa Sonu',
7 toolbar: 'Sayfa Sonu Ekle'
8} );
diff --git a/sources/plugins/pagebreak/lang/tt.js b/sources/plugins/pagebreak/lang/tt.js
new file mode 100644
index 00000000..afd9a4b1
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'tt', {
6 alt: 'Бит бүлгече',
7 toolbar: 'Бастыру өчен бит бүлгечен өстәү'
8} );
diff --git a/sources/plugins/pagebreak/lang/ug.js b/sources/plugins/pagebreak/lang/ug.js
new file mode 100644
index 00000000..c8a080dc
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'ug', {
6 alt: 'بەت ئايرىغۇچ',
7 toolbar: 'بەت ئايرىغۇچ قىستۇر'
8} );
diff --git a/sources/plugins/pagebreak/lang/uk.js b/sources/plugins/pagebreak/lang/uk.js
new file mode 100644
index 00000000..f0457263
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'uk', {
6 alt: 'Розрив Сторінки',
7 toolbar: 'Вставити розрив сторінки'
8} );
diff --git a/sources/plugins/pagebreak/lang/vi.js b/sources/plugins/pagebreak/lang/vi.js
new file mode 100644
index 00000000..8abafde1
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'vi', {
6 alt: 'Ngắt trang',
7 toolbar: 'Chèn ngắt trang'
8} );
diff --git a/sources/plugins/pagebreak/lang/zh-cn.js b/sources/plugins/pagebreak/lang/zh-cn.js
new file mode 100644
index 00000000..70c3915a
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'zh-cn', {
6 alt: '分页符',
7 toolbar: '插入打印分页符'
8} );
diff --git a/sources/plugins/pagebreak/lang/zh.js b/sources/plugins/pagebreak/lang/zh.js
new file mode 100644
index 00000000..17ec065c
--- /dev/null
+++ b/sources/plugins/pagebreak/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pagebreak', 'zh', {
6 alt: '換頁',
7 toolbar: '插入換頁符號以便列印'
8} );
diff --git a/sources/plugins/pagebreak/plugin.js b/sources/plugins/pagebreak/plugin.js
new file mode 100644
index 00000000..26f8fe50
--- /dev/null
+++ b/sources/plugins/pagebreak/plugin.js
@@ -0,0 +1,160 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Horizontal Page Break
8 */
9
10'use strict';
11
12( function() {
13 // Register a plugin named "pagebreak".
14 CKEDITOR.plugins.add( 'pagebreak', {
15 requires: 'fakeobjects',
16 // jscs:disable maximumLineLength
17 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
18 // jscs:enable maximumLineLength
19 icons: 'pagebreak,pagebreak-rtl', // %REMOVE_LINE_CORE%
20 hidpi: true, // %REMOVE_LINE_CORE%
21 onLoad: function() {
22 var cssStyles = (
23 'background:url(' + CKEDITOR.getUrl( this.path + 'images/pagebreak.gif' ) + ') no-repeat center center;' +
24 'clear:both;' +
25 'width:100%;' +
26 'border-top:#999 1px dotted;' +
27 'border-bottom:#999 1px dotted;' +
28 'padding:0;' +
29 'height:7px;' +
30 'cursor:default;'
31 ).replace( /;/g, ' !important;' ); // Increase specificity to override other styles, e.g. block outline.
32
33 // Add the style that renders our placeholder.
34 CKEDITOR.addCss( 'div.cke_pagebreak{' + cssStyles + '}' );
35 },
36
37 init: function( editor ) {
38 if ( editor.blockless )
39 return;
40
41 // Register the command.
42 editor.addCommand( 'pagebreak', CKEDITOR.plugins.pagebreakCmd );
43
44 // Register the toolbar button.
45 editor.ui.addButton && editor.ui.addButton( 'PageBreak', {
46 label: editor.lang.pagebreak.toolbar,
47 command: 'pagebreak',
48 toolbar: 'insert,70'
49 } );
50
51 // Webkit based browsers needs help to select the page-break.
52 CKEDITOR.env.webkit && editor.on( 'contentDom', function() {
53 editor.document.on( 'click', function( evt ) {
54 var target = evt.data.getTarget();
55 if ( target.is( 'div' ) && target.hasClass( 'cke_pagebreak' ) )
56 editor.getSelection().selectElement( target );
57 } );
58 } );
59 },
60
61 afterInit: function( editor ) {
62 // Register a filter to displaying placeholders after mode change.
63 var dataProcessor = editor.dataProcessor,
64 dataFilter = dataProcessor && dataProcessor.dataFilter,
65 htmlFilter = dataProcessor && dataProcessor.htmlFilter,
66 styleRegex = /page-break-after\s*:\s*always/i,
67 childStyleRegex = /display\s*:\s*none/i;
68
69 function upcastPageBreak( element ) {
70 CKEDITOR.tools.extend( element.attributes, attributesSet( editor.lang.pagebreak.alt ), true );
71
72 element.children.length = 0;
73 }
74
75 if ( htmlFilter ) {
76 htmlFilter.addRules( {
77 attributes: {
78 'class': function( value, element ) {
79 var className = value.replace( 'cke_pagebreak', '' );
80 if ( className != value ) {
81 var span = CKEDITOR.htmlParser.fragment.fromHtml( '<span style="display: none;">&nbsp;</span>' ).children[ 0 ];
82 element.children.length = 0;
83 element.add( span );
84 var attrs = element.attributes;
85 delete attrs[ 'aria-label' ];
86 delete attrs.contenteditable;
87 delete attrs.title;
88 }
89 return className;
90 }
91 }
92 }, { applyToAll: true, priority: 5 } );
93 }
94
95 if ( dataFilter ) {
96 dataFilter.addRules( {
97 elements: {
98 div: function( element ) {
99 // The "internal form" of a pagebreak is pasted from clipboard.
100 // ACF may have distorted the HTML because "internal form" is
101 // different than "data form". Make sure that element remains valid
102 // by re-upcasting it (#11133).
103 if ( element.attributes[ 'data-cke-pagebreak' ] )
104 upcastPageBreak( element );
105
106 // Check for "data form" of the pagebreak. If both element and
107 // descendants match, convert them to internal form.
108 else if ( styleRegex.test( element.attributes.style ) ) {
109 var child = element.children[ 0 ];
110
111 if ( child && child.name == 'span' && childStyleRegex.test( child.attributes.style ) )
112 upcastPageBreak( element );
113 }
114 }
115 }
116 } );
117 }
118 }
119 } );
120
121 // TODO Much probably there's no need to expose this object as public object.
122 CKEDITOR.plugins.pagebreakCmd = {
123 exec: function( editor ) {
124 // Create read-only element that represents a print break.
125 var pagebreak = editor.document.createElement( 'div', {
126 attributes: attributesSet( editor.lang.pagebreak.alt )
127 } );
128
129 editor.insertElement( pagebreak );
130 },
131 context: 'div',
132 allowedContent: {
133 div: {
134 styles: '!page-break-after'
135 },
136 span: {
137 match: function( element ) {
138 var parent = element.parent;
139 return parent && parent.name == 'div' && parent.styles && parent.styles[ 'page-break-after' ];
140 },
141 styles: 'display'
142 }
143 },
144 requiredContent: 'div{page-break-after}'
145 };
146
147 // Returns an object representing all the attributes
148 // of the "internal form" of the pagebreak element.
149 function attributesSet( label ) {
150 return {
151 'aria-label': label,
152 'class': 'cke_pagebreak',
153 contenteditable: 'false',
154 'data-cke-display-name': 'pagebreak',
155 'data-cke-pagebreak': 1,
156 style: 'page-break-after: always',
157 title: label
158 };
159 }
160} )();
diff --git a/sources/plugins/panel/plugin.js b/sources/plugins/panel/plugin.js
new file mode 100644
index 00000000..1d4697ff
--- /dev/null
+++ b/sources/plugins/panel/plugin.js
@@ -0,0 +1,403 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 CKEDITOR.plugins.add( 'panel', {
8 beforeInit: function( editor ) {
9 editor.ui.addHandler( CKEDITOR.UI_PANEL, CKEDITOR.ui.panel.handler );
10 }
11 } );
12
13 /**
14 * Panel UI element.
15 *
16 * @readonly
17 * @property {String} [='panel']
18 * @member CKEDITOR
19 */
20 CKEDITOR.UI_PANEL = 'panel';
21
22 /**
23 * @class
24 * @constructor Creates a panel class instance.
25 * @param {CKEDITOR.dom.document} document
26 * @param {Object} definition
27 */
28 CKEDITOR.ui.panel = function( document, definition ) {
29 // Copy all definition properties to this object.
30 if ( definition )
31 CKEDITOR.tools.extend( this, definition );
32
33 // Set defaults.
34 CKEDITOR.tools.extend( this, {
35 className: '',
36 css: []
37 } );
38
39 this.id = CKEDITOR.tools.getNextId();
40 this.document = document;
41 this.isFramed = this.forceIFrame || this.css.length;
42
43 this._ = {
44 blocks: {}
45 };
46 };
47
48 /**
49 * Represents panel handler object.
50 *
51 * @class
52 * @singleton
53 * @extends CKEDITOR.ui.handlerDefinition
54 */
55 CKEDITOR.ui.panel.handler = {
56 /**
57 * Transforms a panel definition in a {@link CKEDITOR.ui.panel} instance.
58 *
59 * @param {Object} definition
60 * @returns {CKEDITOR.ui.panel}
61 */
62 create: function( definition ) {
63 return new CKEDITOR.ui.panel( definition );
64 }
65 };
66
67 var panelTpl = CKEDITOR.addTemplate( 'panel', '<div lang="{langCode}" id="{id}" dir={dir}' +
68 ' class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}"' +
69 ' style="z-index:{z-index}" role="presentation">' +
70 '{frame}' +
71 '</div>' );
72
73 var frameTpl = CKEDITOR.addTemplate( 'panel-frame', '<iframe id="{id}" class="cke_panel_frame" role="presentation" frameborder="0" src="{src}"></iframe>' );
74
75 var frameDocTpl = CKEDITOR.addTemplate( 'panel-frame-inner', '<!DOCTYPE html>' +
76 '<html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}">' +
77 '<head>{css}</head>' +
78 '<body class="cke_{dir}"' +
79 ' style="margin:0;padding:0" onload="{onload}"></body>' +
80 '<\/html>' );
81
82 /** @class CKEDITOR.ui.panel */
83 CKEDITOR.ui.panel.prototype = {
84 /**
85 * Renders the combo.
86 *
87 * @param {CKEDITOR.editor} editor The editor instance which this button is
88 * to be used by.
89 * @param {Array} [output] The output array to which append the HTML relative
90 * to this button.
91 */
92 render: function( editor, output ) {
93 this.getHolderElement = function() {
94 var holder = this._.holder;
95
96 if ( !holder ) {
97 if ( this.isFramed ) {
98 var iframe = this.document.getById( this.id + '_frame' ),
99 parentDiv = iframe.getParent(),
100 doc = iframe.getFrameDocument();
101
102 // Make it scrollable on iOS. (#8308)
103 CKEDITOR.env.iOS && parentDiv.setStyles( {
104 'overflow': 'scroll',
105 '-webkit-overflow-scrolling': 'touch'
106 } );
107
108 var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function() {
109 this.isLoaded = true;
110 if ( this.onLoad )
111 this.onLoad();
112 }, this ) );
113
114 doc.write( frameDocTpl.output( CKEDITOR.tools.extend( {
115 css: CKEDITOR.tools.buildStyleHtml( this.css ),
116 onload: 'window.parent.CKEDITOR.tools.callFunction(' + onLoad + ');'
117 }, data ) ) );
118
119 var win = doc.getWindow();
120
121 // Register the CKEDITOR global.
122 win.$.CKEDITOR = CKEDITOR;
123
124 // Arrow keys for scrolling is only preventable with 'keypress' event in Opera (#4534).
125 doc.on( 'keydown', function( evt ) {
126 var keystroke = evt.data.getKeystroke(),
127 dir = this.document.getById( this.id ).getAttribute( 'dir' );
128
129 // Delegate key processing to block.
130 if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false ) {
131 evt.data.preventDefault();
132 return;
133 }
134
135 // ESC/ARROW-LEFT(ltr) OR ARROW-RIGHT(rtl)
136 if ( keystroke == 27 || keystroke == ( dir == 'rtl' ? 39 : 37 ) ) {
137 if ( this.onEscape && this.onEscape( keystroke ) === false )
138 evt.data.preventDefault();
139 }
140 }, this );
141
142 holder = doc.getBody();
143 holder.unselectable();
144 CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad );
145 } else {
146 holder = this.document.getById( this.id );
147 }
148
149 this._.holder = holder;
150 }
151
152 return holder;
153 };
154
155 var data = {
156 editorId: editor.id,
157 id: this.id,
158 langCode: editor.langCode,
159 dir: editor.lang.dir,
160 cls: this.className,
161 frame: '',
162 env: CKEDITOR.env.cssClass,
163 'z-index': editor.config.baseFloatZIndex + 1
164 };
165
166 if ( this.isFramed ) {
167 // With IE, the custom domain has to be taken care at first,
168 // for other browers, the 'src' attribute should be left empty to
169 // trigger iframe's 'load' event.
170 var src =
171 CKEDITOR.env.air ? 'javascript:void(0)' : // jshint ignore:line
172 CKEDITOR.env.ie ? 'javascript:void(function(){' + encodeURIComponent( // jshint ignore:line
173 'document.open();' +
174 // In IE, the document domain must be set any time we call document.open().
175 '(' + CKEDITOR.tools.fixDomain + ')();' +
176 'document.close();'
177 ) + '}())' :
178 '';
179
180 data.frame = frameTpl.output( {
181 id: this.id + '_frame',
182 src: src
183 } );
184 }
185
186 var html = panelTpl.output( data );
187
188 if ( output )
189 output.push( html );
190
191 return html;
192 },
193
194 /**
195 * @todo
196 */
197 addBlock: function( name, block ) {
198 block = this._.blocks[ name ] = block instanceof CKEDITOR.ui.panel.block ? block : new CKEDITOR.ui.panel.block( this.getHolderElement(), block );
199
200 if ( !this._.currentBlock )
201 this.showBlock( name );
202
203 return block;
204 },
205
206 /**
207 * @todo
208 */
209 getBlock: function( name ) {
210 return this._.blocks[ name ];
211 },
212
213 /**
214 * @todo
215 */
216 showBlock: function( name ) {
217 var blocks = this._.blocks,
218 block = blocks[ name ],
219 current = this._.currentBlock;
220
221 // ARIA role works better in IE on the body element, while on the iframe
222 // for FF. (#8864)
223 var holder = !this.forceIFrame || CKEDITOR.env.ie ? this._.holder : this.document.getById( this.id + '_frame' );
224
225 if ( current )
226 current.hide();
227
228 this._.currentBlock = block;
229
230 CKEDITOR.fire( 'ariaWidget', holder );
231
232 // Reset the focus index, so it will always go into the first one.
233 block._.focusIndex = -1;
234
235 this._.onKeyDown = block.onKeyDown && CKEDITOR.tools.bind( block.onKeyDown, block );
236
237 block.show();
238
239 return block;
240 },
241
242 /**
243 * @todo
244 */
245 destroy: function() {
246 this.element && this.element.remove();
247 }
248 };
249
250 /**
251 * @class
252 *
253 * @todo class and all methods
254 */
255 CKEDITOR.ui.panel.block = CKEDITOR.tools.createClass( {
256 /**
257 * Creates a block class instances.
258 *
259 * @constructor
260 * @todo
261 */
262 $: function( blockHolder, blockDefinition ) {
263 this.element = blockHolder.append( blockHolder.getDocument().createElement( 'div', {
264 attributes: {
265 'tabindex': -1,
266 'class': 'cke_panel_block'
267 },
268 styles: {
269 display: 'none'
270 }
271 } ) );
272
273 // Copy all definition properties to this object.
274 if ( blockDefinition )
275 CKEDITOR.tools.extend( this, blockDefinition );
276
277 // Set the a11y attributes of this element ...
278 this.element.setAttributes( {
279 'role': this.attributes.role || 'presentation',
280 'aria-label': this.attributes[ 'aria-label' ],
281 'title': this.attributes.title || this.attributes[ 'aria-label' ]
282 } );
283
284 this.keys = {};
285
286 this._.focusIndex = -1;
287
288 // Disable context menu for panels.
289 this.element.disableContextMenu();
290 },
291
292 _: {
293
294 /**
295 * Mark the item specified by the index as current activated.
296 */
297 markItem: function( index ) {
298 if ( index == -1 )
299 return;
300 var links = this.element.getElementsByTag( 'a' );
301 var item = links.getItem( this._.focusIndex = index );
302
303 // Safari need focus on the iframe window first(#3389), but we need
304 // lock the blur to avoid hiding the panel.
305 if ( CKEDITOR.env.webkit )
306 item.getDocument().getWindow().focus();
307 item.focus();
308
309 this.onMark && this.onMark( item );
310 }
311 },
312
313 proto: {
314 show: function() {
315 this.element.setStyle( 'display', '' );
316 },
317
318 hide: function() {
319 if ( !this.onHide || this.onHide.call( this ) !== true )
320 this.element.setStyle( 'display', 'none' );
321 },
322
323 onKeyDown: function( keystroke, noCycle ) {
324 var keyAction = this.keys[ keystroke ];
325 switch ( keyAction ) {
326 // Move forward.
327 case 'next':
328 var index = this._.focusIndex,
329 links = this.element.getElementsByTag( 'a' ),
330 link;
331
332 while ( ( link = links.getItem( ++index ) ) ) {
333 // Move the focus only if the element is marked with
334 // the _cke_focus and it it's visible (check if it has
335 // width).
336 if ( link.getAttribute( '_cke_focus' ) && link.$.offsetWidth ) {
337 this._.focusIndex = index;
338 link.focus();
339 break;
340 }
341 }
342
343 // If no link was found, cycle and restart from the top. (#11125)
344 if ( !link && !noCycle ) {
345 this._.focusIndex = -1;
346 return this.onKeyDown( keystroke, 1 );
347 }
348
349 return false;
350
351 // Move backward.
352 case 'prev':
353 index = this._.focusIndex;
354 links = this.element.getElementsByTag( 'a' );
355
356 while ( index > 0 && ( link = links.getItem( --index ) ) ) {
357 // Move the focus only if the element is marked with
358 // the _cke_focus and it it's visible (check if it has
359 // width).
360 if ( link.getAttribute( '_cke_focus' ) && link.$.offsetWidth ) {
361 this._.focusIndex = index;
362 link.focus();
363 break;
364 }
365
366 // Make sure link is null when the loop ends and nothing was
367 // found (#11125).
368 link = null;
369 }
370
371 // If no link was found, cycle and restart from the bottom. (#11125)
372 if ( !link && !noCycle ) {
373 this._.focusIndex = links.count();
374 return this.onKeyDown( keystroke, 1 );
375 }
376
377 return false;
378
379 case 'click':
380 case 'mouseup':
381 index = this._.focusIndex;
382 link = index >= 0 && this.element.getElementsByTag( 'a' ).getItem( index );
383
384 if ( link )
385 link.$[ keyAction ] ? link.$[ keyAction ]() : link.$[ 'on' + keyAction ]();
386
387 return false;
388 }
389
390 return true;
391 }
392 }
393 } );
394
395} )();
396
397/**
398 * Fired when a panel is added to the document.
399 *
400 * @event ariaWidget
401 * @member CKEDITOR
402 * @param {Object} data The element wrapping the panel.
403 */
diff --git a/sources/plugins/panelbutton/plugin.js b/sources/plugins/panelbutton/plugin.js
new file mode 100644
index 00000000..7eab829a
--- /dev/null
+++ b/sources/plugins/panelbutton/plugin.js
@@ -0,0 +1,138 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'panelbutton', {
7 requires: 'button',
8 onLoad: function() {
9 function clickFn( editor ) {
10 var _ = this._;
11
12 if ( _.state == CKEDITOR.TRISTATE_DISABLED )
13 return;
14
15 this.createPanel( editor );
16
17 if ( _.on ) {
18 _.panel.hide();
19 return;
20 }
21
22 _.panel.showBlock( this._.id, this.document.getById( this._.id ), 4 );
23 }
24
25 /**
26 * @class
27 * @extends CKEDITOR.ui.button
28 * @todo class and methods
29 */
30 CKEDITOR.ui.panelButton = CKEDITOR.tools.createClass( {
31 base: CKEDITOR.ui.button,
32
33 /**
34 * Creates a panelButton class instance.
35 *
36 * @constructor
37 */
38 $: function( definition ) {
39 // We don't want the panel definition in this object.
40 var panelDefinition = definition.panel || {};
41 delete definition.panel;
42
43 this.base( definition );
44
45 this.document = ( panelDefinition.parent && panelDefinition.parent.getDocument() ) || CKEDITOR.document;
46
47 panelDefinition.block = {
48 attributes: panelDefinition.attributes
49 };
50 panelDefinition.toolbarRelated = true;
51
52 this.hasArrow = true;
53
54 this.click = clickFn;
55
56 this._ = {
57 panelDefinition: panelDefinition
58 };
59 },
60
61 statics: {
62 handler: {
63 create: function( definition ) {
64 return new CKEDITOR.ui.panelButton( definition );
65 }
66 }
67 },
68
69 proto: {
70 createPanel: function( editor ) {
71 var _ = this._;
72
73 if ( _.panel )
74 return;
75
76 var panelDefinition = this._.panelDefinition,
77 panelBlockDefinition = this._.panelDefinition.block,
78 panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(),
79 panel = this._.panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ),
80 block = panel.addBlock( _.id, panelBlockDefinition ),
81 me = this;
82
83 panel.onShow = function() {
84 if ( me.className )
85 this.element.addClass( me.className + '_panel' );
86
87 me.setState( CKEDITOR.TRISTATE_ON );
88
89 _.on = 1;
90
91 me.editorFocus && editor.focus();
92
93 if ( me.onOpen )
94 me.onOpen();
95 };
96
97 panel.onHide = function( preventOnClose ) {
98 if ( me.className )
99 this.element.getFirst().removeClass( me.className + '_panel' );
100
101 me.setState( me.modes && me.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
102
103 _.on = 0;
104
105 if ( !preventOnClose && me.onClose )
106 me.onClose();
107 };
108
109 panel.onEscape = function() {
110 panel.hide( 1 );
111 me.document.getById( _.id ).focus();
112 };
113
114 if ( this.onBlock )
115 this.onBlock( panel, block );
116
117 block.onHide = function() {
118 _.on = 0;
119 me.setState( CKEDITOR.TRISTATE_OFF );
120 };
121 }
122 }
123 } );
124
125 },
126 beforeInit: function( editor ) {
127 editor.ui.addHandler( CKEDITOR.UI_PANELBUTTON, CKEDITOR.ui.panelButton.handler );
128 }
129} );
130
131/**
132 * Button UI element.
133 *
134 * @readonly
135 * @property {String} [='panelbutton']
136 * @member CKEDITOR
137 */
138CKEDITOR.UI_PANELBUTTON = 'panelbutton';
diff --git a/sources/plugins/pastefromword/filter/default.js b/sources/plugins/pastefromword/filter/default.js
new file mode 100644
index 00000000..0c97ef52
--- /dev/null
+++ b/sources/plugins/pastefromword/filter/default.js
@@ -0,0 +1,1251 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var fragmentPrototype = CKEDITOR.htmlParser.fragment.prototype,
8 elementPrototype = CKEDITOR.htmlParser.element.prototype;
9
10 fragmentPrototype.onlyChild = elementPrototype.onlyChild = function() {
11 var children = this.children,
12 count = children.length,
13 firstChild = ( count == 1 ) && children[ 0 ];
14 return firstChild || null;
15 };
16
17 elementPrototype.removeAnyChildWithName = function( tagName ) {
18 var children = this.children,
19 childs = [],
20 child;
21
22 for ( var i = 0; i < children.length; i++ ) {
23 child = children[ i ];
24 if ( !child.name )
25 continue;
26
27 if ( child.name == tagName ) {
28 childs.push( child );
29 children.splice( i--, 1 );
30 }
31 childs = childs.concat( child.removeAnyChildWithName( tagName ) );
32 }
33 return childs;
34 };
35
36 elementPrototype.getAncestor = function( tagNameRegex ) {
37 var parent = this.parent;
38 while ( parent && !( parent.name && parent.name.match( tagNameRegex ) ) )
39 parent = parent.parent;
40 return parent;
41 };
42
43 fragmentPrototype.firstChild = elementPrototype.firstChild = function( evaluator ) {
44 var child;
45
46 for ( var i = 0; i < this.children.length; i++ ) {
47 child = this.children[ i ];
48 if ( evaluator( child ) )
49 return child;
50 else if ( child.name ) {
51 child = child.firstChild( evaluator );
52 if ( child )
53 return child;
54 }
55 }
56
57 return null;
58 };
59
60 // Adding a (set) of styles to the element's 'style' attributes.
61 elementPrototype.addStyle = function( name, value, isPrepend ) {
62 var styleText,
63 addingStyleText = '';
64 // name/value pair.
65 if ( typeof value == 'string' )
66 addingStyleText += name + ':' + value + ';';
67 else {
68 // style literal.
69 if ( typeof name == 'object' ) {
70 for ( var style in name ) {
71 if ( name.hasOwnProperty( style ) )
72 addingStyleText += style + ':' + name[ style ] + ';';
73 }
74 }
75 // raw style text form.
76 else {
77 addingStyleText += name;
78 }
79
80 isPrepend = value;
81 }
82
83 if ( !this.attributes )
84 this.attributes = {};
85
86 styleText = this.attributes.style || '';
87
88 styleText = ( isPrepend ? [ addingStyleText, styleText ] : [ styleText, addingStyleText ] ).join( ';' );
89
90 this.attributes.style = styleText.replace( /^;+|;(?=;)/g, '' );
91 };
92
93 // Retrieve a style property value of the element.
94 elementPrototype.getStyle = function( name ) {
95 var styles = this.attributes.style;
96 if ( styles ) {
97 styles = CKEDITOR.tools.parseCssText( styles, 1 );
98 return styles[ name ];
99 }
100 };
101
102 /**
103 * Return the DTD-valid parent tag names of the specified one.
104 *
105 * @member CKEDITOR.dtd
106 * @param {String} tagName
107 * @returns {Object}
108 */
109 CKEDITOR.dtd.parentOf = function( tagName ) {
110 var result = {};
111 for ( var tag in this ) {
112 if ( tag.indexOf( '$' ) == -1 && this[ tag ][ tagName ] )
113 result[ tag ] = 1;
114 }
115 return result;
116 };
117
118 // 1. move consistent list item styles up to list root.
119 // 2. clear out unnecessary list item numbering.
120 function postProcessList( list ) {
121 var children = list.children,
122 child, attrs,
123 count = list.children.length,
124 match, mergeStyle,
125 styleTypeRegexp = /list-style-type:(.*?)(?:;|$)/,
126 stylesFilter = CKEDITOR.plugins.pastefromword.filters.stylesFilter;
127
128 attrs = list.attributes;
129 if ( styleTypeRegexp.exec( attrs.style ) )
130 return;
131
132 for ( var i = 0; i < count; i++ ) {
133 child = children[ i ];
134
135 if ( child.attributes.value && Number( child.attributes.value ) == i + 1 )
136 delete child.attributes.value;
137
138 match = styleTypeRegexp.exec( child.attributes.style );
139
140 if ( match ) {
141 if ( match[ 1 ] == mergeStyle || !mergeStyle )
142 mergeStyle = match[ 1 ];
143 else {
144 mergeStyle = null;
145 break;
146 }
147 }
148 }
149
150 if ( mergeStyle ) {
151 for ( i = 0; i < count; i++ ) {
152 attrs = children[ i ].attributes;
153 attrs.style && ( attrs.style = stylesFilter( [ [ 'list-style-type' ] ] )( attrs.style ) || '' );
154 }
155
156 list.addStyle( 'list-style-type', mergeStyle );
157 }
158 }
159
160 var emptyMarginRegex = /^(?:\b0[^\s]*\s*){1,4}$/; // e.g. 0px 0pt 0px
161 var romanLiternalPattern = '^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$',
162 lowerRomanLiteralRegex = new RegExp( romanLiternalPattern ),
163 upperRomanLiteralRegex = new RegExp( romanLiternalPattern.toUpperCase() );
164
165 var orderedPatterns = { 'decimal': /\d+/, 'lower-roman': lowerRomanLiteralRegex, 'upper-roman': upperRomanLiteralRegex, 'lower-alpha': /^[a-z]+$/, 'upper-alpha': /^[A-Z]+$/ },
166 unorderedPatterns = { 'disc': /[l\u00B7\u2002]/, 'circle': /[\u006F\u00D8]/, 'square': /[\u006E\u25C6]/ },
167 listMarkerPatterns = { 'ol': orderedPatterns, 'ul': unorderedPatterns },
168 romans = [ [ 1000, 'M' ], [ 900, 'CM' ], [ 500, 'D' ], [ 400, 'CD' ], [ 100, 'C' ], [ 90, 'XC' ], [ 50, 'L' ], [ 40, 'XL' ], [ 10, 'X' ], [ 9, 'IX' ], [ 5, 'V' ], [ 4, 'IV' ], [ 1, 'I' ] ],
169 alpahbets = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
170
171 // Convert roman numbering back to decimal.
172 function fromRoman( str ) {
173 str = str.toUpperCase();
174 var l = romans.length,
175 retVal = 0;
176 for ( var i = 0; i < l; ++i ) {
177 for ( var j = romans[ i ], k = j[ 1 ].length; str.substr( 0, k ) == j[ 1 ]; str = str.substr( k ) )
178 retVal += j[ 0 ];
179 }
180 return retVal;
181 }
182
183 // Convert alphabet numbering back to decimal.
184 function fromAlphabet( str ) {
185 str = str.toUpperCase();
186 var l = alpahbets.length,
187 retVal = 1;
188 for ( var x = 1; str.length > 0; x *= l ) {
189 retVal += alpahbets.indexOf( str.charAt( str.length - 1 ) ) * x;
190 str = str.substr( 0, str.length - 1 );
191 }
192 return retVal;
193 }
194
195 var listBaseIndent = 0,
196 previousListItemMargin = null,
197 previousListId;
198
199 var plugin = ( CKEDITOR.plugins.pastefromword = {
200 utils: {
201 // Create a <cke:listbullet> which indicate an list item type.
202 createListBulletMarker: function( bullet, bulletText ) {
203 var marker = new CKEDITOR.htmlParser.element( 'cke:listbullet' );
204 marker.attributes = { 'cke:listsymbol': bullet[ 0 ] };
205 marker.add( new CKEDITOR.htmlParser.text( bulletText ) );
206 return marker;
207 },
208
209 isListBulletIndicator: function( element ) {
210 var styleText = element.attributes && element.attributes.style;
211 if ( /mso-list\s*:\s*Ignore/i.test( styleText ) )
212 return true;
213 },
214
215 isContainingOnlySpaces: function( element ) {
216 var text;
217 return ( ( text = element.onlyChild() ) && ( /^(:?\s|&nbsp;)+$/ ).test( text.value ) );
218 },
219
220 resolveList: function( element ) {
221 // <cke:listbullet> indicate a list item.
222 var attrs = element.attributes,
223 listMarker;
224
225 if ( ( listMarker = element.removeAnyChildWithName( 'cke:listbullet' ) ) && listMarker.length && ( listMarker = listMarker[ 0 ] ) ) {
226 element.name = 'cke:li';
227
228 if ( attrs.style ) {
229 attrs.style = plugin.filters.stylesFilter( [
230 // Text-indent is not representing list item level any more.
231 [ 'text-indent' ],
232 [ 'line-height' ],
233 // First attempt is to resolve indent level from on a constant margin increment.
234 [ ( /^margin(:?-left)?$/ ), null, function( margin ) {
235 // Deal with component/short-hand form.
236 var values = margin.split( ' ' );
237 margin = CKEDITOR.tools.convertToPx( values[ 3 ] || values[ 1 ] || values[ 0 ] );
238
239 // Figure out the indent unit by checking the first time of incrementation.
240 if ( !listBaseIndent && previousListItemMargin !== null && margin > previousListItemMargin )
241 listBaseIndent = margin - previousListItemMargin;
242
243 previousListItemMargin = margin;
244
245 attrs[ 'cke:indent' ] = listBaseIndent && ( Math.ceil( margin / listBaseIndent ) + 1 ) || 1;
246 } ],
247 // The best situation: "mso-list:l0 level1 lfo2" tells the belonged list root, list item indentation, etc.
248 [ ( /^mso-list$/ ), null, function( val ) {
249 val = val.split( ' ' );
250 // Ignore values like "mso-list:Ignore". (FF #11976)
251 if ( val.length < 2 ) {
252 return;
253 }
254
255 var listId = Number( val[ 0 ].match( /\d+/ ) ),
256 indent = Number( val[ 1 ].match( /\d+/ ) );
257
258 if ( indent == 1 ) {
259 listId !== previousListId && ( attrs[ 'cke:reset' ] = 1 );
260 previousListId = listId;
261 }
262 attrs[ 'cke:indent' ] = indent;
263 } ]
264 ] )( attrs.style, element ) || '';
265 }
266
267 // First level list item might be presented without a margin.
268
269
270 // In case all above doesn't apply.
271 if ( !attrs[ 'cke:indent' ] ) {
272 previousListItemMargin = 0;
273 attrs[ 'cke:indent' ] = 1;
274 }
275
276 // Inherit attributes from bullet.
277 CKEDITOR.tools.extend( attrs, listMarker.attributes );
278 return true;
279 }
280 // Current list disconnected.
281 else {
282 previousListId = previousListItemMargin = listBaseIndent = null;
283 }
284
285 return false;
286 },
287
288 // Providing a shorthand style then retrieve one or more style component values.
289 getStyleComponents: ( function() {
290 var calculator = CKEDITOR.dom.element.createFromHtml( '<div style="position:absolute;left:-9999px;top:-9999px;"></div>', CKEDITOR.document );
291 CKEDITOR.document.getBody().append( calculator );
292
293 return function( name, styleValue, fetchList ) {
294 calculator.setStyle( name, styleValue );
295 var styles = {},
296 count = fetchList.length;
297 for ( var i = 0; i < count; i++ )
298 styles[ fetchList[ i ] ] = calculator.getStyle( fetchList[ i ] );
299
300 return styles;
301 };
302 } )(),
303
304 listDtdParents: CKEDITOR.dtd.parentOf( 'ol' )
305 },
306
307 filters: {
308 // Transform a normal list into flat list items only presentation.
309 // E.g. <ul><li>level1<ol><li>level2</li></ol></li> =>
310 // <cke:li cke:listtype="ul" cke:indent="1">level1</cke:li>
311 // <cke:li cke:listtype="ol" cke:indent="2">level2</cke:li>
312 flattenList: function( element, level ) {
313 level = typeof level == 'number' ? level : 1;
314
315 var attrs = element.attributes,
316 listStyleType;
317
318 // All list items are of the same type.
319 switch ( attrs.type ) {
320 case 'a':
321 listStyleType = 'lower-alpha';
322 break;
323 case '1':
324 listStyleType = 'decimal';
325 break;
326 // TODO: Support more list style type from MS-Word.
327 }
328
329 var children = element.children,
330 child;
331
332 for ( var i = 0; i < children.length; i++ ) {
333 child = children[ i ];
334
335 if ( child.name in CKEDITOR.dtd.$listItem ) {
336 var attributes = child.attributes,
337 listItemChildren = child.children,
338 count = listItemChildren.length,
339 first = listItemChildren[ 0 ],
340 last = listItemChildren[ count - 1 ];
341
342 // Converts <li><p style="_MSO_LIST_STYLES_">{...}</p></li> -> <li style="_MSO_LIST_STYLES_">{...}</li>.
343 // The above format is what we got when pasting from Word 2010 to IE11 and possibly some others.
344 // Existence of extra <p> tag that can be later recognized as list item (see #getRules.return.elements.p)
345 // creates incorrect and problematic structures similar to <cke:li><cke:li>{...}</cke:li></cke:li>. (#11376)
346 if ( first.attributes && first.attributes.style && first.attributes.style.indexOf( 'mso-list' ) > -1 ) {
347 child.attributes.style = first.attributes.style;
348 first.replaceWithChildren();
349 }
350
351 // Move out nested list.
352 if ( last.name in CKEDITOR.dtd.$list ) {
353 element.add( last, i + 1 );
354
355 // Remove the parent list item if it's just a holder.
356 if ( !--listItemChildren.length )
357 children.splice( i--, 1 );
358 }
359
360 child.name = 'cke:li';
361
362 // Inherit numbering from list root on the first list item.
363 attrs.start && !i && ( attributes.value = attrs.start );
364
365 plugin.filters.stylesFilter( [
366 [ 'tab-stops', null, function( val ) {
367 // val = [left|center|right|decimal] <value><unit> Source: W3C, WD-tabs-970117.
368 // In some cases the first word is missing - hence the square brackets.
369 var margin = val.match( /0$|\d+\.?\d*\w+/ );
370 margin && ( previousListItemMargin = CKEDITOR.tools.convertToPx( margin[ 0 ] ) );
371 } ],
372 ( level == 1 ? [ 'mso-list', null, function( val ) {
373 val = val.split( ' ' );
374 var listId = Number( val[ 0 ].match( /\d+/ ) );
375 listId !== previousListId && ( attributes[ 'cke:reset' ] = 1 );
376 previousListId = listId;
377 } ] : null )
378 ] )( attributes.style );
379
380 attributes[ 'cke:indent' ] = level;
381 attributes[ 'cke:listtype' ] = element.name;
382 attributes[ 'cke:list-style-type' ] = listStyleType;
383 }
384 // Flatten sub list.
385 else if ( child.name in CKEDITOR.dtd.$list ) {
386 // Absorb sub list children.
387 arguments.callee.apply( this, [ child, level + 1 ] );
388 children = children.slice( 0, i ).concat( child.children ).concat( children.slice( i + 1 ) );
389 element.children = [];
390 for ( var j = 0, num = children.length; j < num; j++ )
391 element.add( children[ j ] );
392
393 children = element.children;
394 }
395 }
396
397 delete element.name;
398
399 // We're loosing tag name here, signalize this element as a list.
400 attrs[ 'cke:list' ] = 1;
401 },
402
403 // Try to collect all list items among the children and establish one
404 // or more HTML list structures for them.
405 // @param element
406 assembleList: function( element ) {
407 var children = element.children,
408 child, listItem, // The current processing cke:li element.
409 listItemAttrs, listItemIndent, // Indent level of current list item.
410 lastIndent, lastListItem, // The previous one just been added to the list.
411 list, // Current staging list and it's parent list if any.
412 openedLists = [],
413 previousListStyleType, previousListType;
414
415 // Properties of the list item are to be resolved from the list bullet.
416 var bullet, listType, listStyleType, itemNumeric;
417
418 for ( var i = 0; i < children.length; i++ ) {
419 child = children[ i ];
420
421 if ( child.name == 'cke:li' ) {
422 child.name = 'li';
423 listItem = child;
424 listItemAttrs = listItem.attributes;
425 bullet = listItemAttrs[ 'cke:listsymbol' ];
426 bullet = bullet && bullet.match( /^(?:[(]?)([^\s]+?)([.)]?)$/ );
427 listType = listStyleType = itemNumeric = null;
428
429 if ( listItemAttrs[ 'cke:ignored' ] ) {
430 children.splice( i--, 1 );
431 continue;
432 }
433
434
435 // This's from a new list root.
436 listItemAttrs[ 'cke:reset' ] && ( list = lastIndent = lastListItem = null );
437
438 // List item indent level might come from a real list indentation or
439 // been resolved from a pseudo list item's margin value, even get
440 // no indentation at all.
441 listItemIndent = Number( listItemAttrs[ 'cke:indent' ] );
442
443 // We're moving out of the current list, cleaning up.
444 if ( listItemIndent != lastIndent )
445 previousListType = previousListStyleType = null;
446
447 // List type and item style are already resolved.
448 if ( !bullet ) {
449 listType = listItemAttrs[ 'cke:listtype' ] || 'ol';
450 listStyleType = listItemAttrs[ 'cke:list-style-type' ];
451 } else {
452 // Probably share the same list style type with previous list item,
453 // give it priority to avoid ambiguous between C(Alpha) and C.(Roman).
454 if ( previousListType && listMarkerPatterns[ previousListType ][ previousListStyleType ].test( bullet[ 1 ] ) ) {
455 listType = previousListType;
456 listStyleType = previousListStyleType;
457 } else {
458 for ( var type in listMarkerPatterns ) {
459 for ( var style in listMarkerPatterns[ type ] ) {
460 if ( listMarkerPatterns[ type ][ style ].test( bullet[ 1 ] ) ) {
461 // Small numbering has higher priority, when dealing with ambiguous
462 // between C(Alpha) and C.(Roman).
463 if ( type == 'ol' && ( /alpha|roman/ ).test( style ) ) {
464 var num = /roman/.test( style ) ? fromRoman( bullet[ 1 ] ) : fromAlphabet( bullet[ 1 ] );
465 if ( !itemNumeric || num < itemNumeric ) {
466 itemNumeric = num;
467 listType = type;
468 listStyleType = style;
469 }
470 } else {
471 listType = type;
472 listStyleType = style;
473 break;
474 }
475 }
476 }
477 }
478 }
479
480 // Simply use decimal/disc for the rest forms of unrepresentable
481 // numerals, e.g. Chinese..., but as long as there a second part
482 // included, it has a bigger chance of being a order list ;)
483 !listType && ( listType = bullet[ 2 ] ? 'ol' : 'ul' );
484 }
485
486 previousListType = listType;
487 previousListStyleType = listStyleType || ( listType == 'ol' ? 'decimal' : 'disc' );
488 if ( listStyleType && listStyleType != ( listType == 'ol' ? 'decimal' : 'disc' ) )
489 listItem.addStyle( 'list-style-type', listStyleType );
490
491 // Figure out start numbering.
492 if ( listType == 'ol' && bullet ) {
493 switch ( listStyleType ) {
494 case 'decimal':
495 itemNumeric = Number( bullet[ 1 ] );
496 break;
497 case 'lower-roman':
498 case 'upper-roman':
499 itemNumeric = fromRoman( bullet[ 1 ] );
500 break;
501 case 'lower-alpha':
502 case 'upper-alpha':
503 itemNumeric = fromAlphabet( bullet[ 1 ] );
504 break;
505 }
506
507 // Always create the numbering, swipe out unnecessary ones later.
508 listItem.attributes.value = itemNumeric;
509 }
510
511 // Start the list construction.
512 if ( !list ) {
513 openedLists.push( list = new CKEDITOR.htmlParser.element( listType ) );
514 list.add( listItem );
515 children[ i ] = list;
516 } else {
517 if ( listItemIndent > lastIndent ) {
518 openedLists.push( list = new CKEDITOR.htmlParser.element( listType ) );
519 list.add( listItem );
520 lastListItem.add( list );
521 } else if ( listItemIndent < lastIndent ) {
522 // There might be a negative gap between two list levels. (#4944)
523 var diff = lastIndent - listItemIndent,
524 parent;
525 while ( diff-- && ( parent = list.parent ) )
526 list = parent.parent;
527
528 list.add( listItem );
529 } else {
530 list.add( listItem );
531 }
532
533 children.splice( i--, 1 );
534 }
535
536 lastListItem = listItem;
537 lastIndent = listItemIndent;
538 } else if ( list ) {
539 list = lastIndent = lastListItem = null;
540 }
541 }
542
543 for ( i = 0; i < openedLists.length; i++ )
544 postProcessList( openedLists[ i ] );
545
546 list = lastIndent = lastListItem = previousListId = previousListItemMargin = listBaseIndent = null;
547 },
548
549 // A simple filter which always rejecting.
550 falsyFilter: function() {
551 return false;
552 },
553
554 // A filter dedicated on the 'style' attribute filtering, e.g. dropping/replacing style properties.
555 // @param styles {Array} in form of [ styleNameRegexp, styleValueRegexp,
556 // newStyleValue/newStyleGenerator, newStyleName ] where only the first
557 // parameter is mandatory.
558 // @param whitelist {Boolean} Whether the {@param styles} will be considered as a white-list.
559 stylesFilter: function( styles, whitelist ) {
560 return function( styleText, element ) {
561 var rules = [];
562 // html-encoded quote might be introduced by 'font-family'
563 // from MS-Word which confused the following regexp. e.g.
564 //'font-family: &quot;Lucida, Console&quot;'
565 ( styleText || '' ).replace( /&quot;/g, '"' ).replace( /\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function( match, name, value ) {
566 name = name.toLowerCase();
567 name == 'font-family' && ( value = value.replace( /["']/g, '' ) );
568
569 var namePattern, valuePattern, newValue, newName;
570 for ( var i = 0; i < styles.length; i++ ) {
571 if ( styles[ i ] ) {
572 namePattern = styles[ i ][ 0 ];
573 valuePattern = styles[ i ][ 1 ];
574 newValue = styles[ i ][ 2 ];
575 newName = styles[ i ][ 3 ];
576
577 if ( name.match( namePattern ) && ( !valuePattern || value.match( valuePattern ) ) ) {
578 name = newName || name;
579 whitelist && ( newValue = newValue || value );
580
581 if ( typeof newValue == 'function' )
582 newValue = newValue( value, element, name );
583
584 // Return an couple indicate both name and value
585 // changed.
586 if ( newValue && newValue.push )
587 name = newValue[ 0 ], newValue = newValue[ 1 ];
588
589 if ( typeof newValue == 'string' )
590 rules.push( [ name, newValue ] );
591 return;
592 }
593 }
594 }
595
596 !whitelist && rules.push( [ name, value ] );
597
598 } );
599
600 for ( var i = 0; i < rules.length; i++ )
601 rules[ i ] = rules[ i ].join( ':' );
602 return rules.length ? ( rules.join( ';' ) + ';' ) : false;
603 };
604 },
605
606 // Migrate the element by decorate styles on it.
607 // @param styleDefinition
608 // @param variables
609 elementMigrateFilter: function( styleDefinition, variables ) {
610 return styleDefinition ? function( element ) {
611 var styleDef = variables ? new CKEDITOR.style( styleDefinition, variables )._.definition : styleDefinition;
612 element.name = styleDef.element;
613 CKEDITOR.tools.extend( element.attributes, CKEDITOR.tools.clone( styleDef.attributes ) );
614 element.addStyle( CKEDITOR.style.getStyleText( styleDef ) );
615 // Mark style classes as allowed so they will not be filtered out (#12256).
616 if ( styleDef.attributes && styleDef.attributes[ 'class' ] ) {
617 element.classWhiteList = ' ' + styleDef.attributes[ 'class' ] + ' ';
618 }
619 } : function() {};
620 },
621
622 // Migrate styles by creating a new nested stylish element.
623 // @param styleDefinition
624 styleMigrateFilter: function( styleDefinition, variableName ) {
625
626 var elementMigrateFilter = this.elementMigrateFilter;
627 return styleDefinition ? function( value, element ) {
628 // Build an stylish element first.
629 var styleElement = new CKEDITOR.htmlParser.element( null ),
630 variables = {};
631
632 variables[ variableName ] = value;
633 elementMigrateFilter( styleDefinition, variables )( styleElement );
634 // Place the new element inside the existing span.
635 styleElement.children = element.children;
636 element.children = [ styleElement ];
637
638 // #10285 - later on styleElement will replace element if element won't have any attributes.
639 // However, in some cases styleElement is identical to element and therefore should not be filtered
640 // to avoid inf loop. Unfortunately calling element.filterChildren() does not prevent from that (#10327).
641 // However, we can assume that we don't need to filter styleElement at all, so it is safe to replace
642 // its filter method.
643 styleElement.filter = function() {};
644 styleElement.parent = element;
645 } : function() {};
646 },
647
648 // A filter which remove cke-namespaced-attribute on
649 // all none-cke-namespaced elements.
650 // @param value
651 // @param element
652 bogusAttrFilter: function( value, element ) {
653 if ( element.name.indexOf( 'cke:' ) == -1 )
654 return false;
655 },
656
657 // A filter which will be used to apply inline css style according the stylesheet
658 // definition rules, is generated lazily when filtering.
659 applyStyleFilter: null
660
661 },
662
663 getRules: function( editor, filter ) {
664 var dtd = CKEDITOR.dtd,
665 blockLike = CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent ),
666 config = editor.config,
667 filters = this.filters,
668 falsyFilter = filters.falsyFilter,
669 stylesFilter = filters.stylesFilter,
670 elementMigrateFilter = filters.elementMigrateFilter,
671 styleMigrateFilter = CKEDITOR.tools.bind( this.filters.styleMigrateFilter, this.filters ),
672 createListBulletMarker = this.utils.createListBulletMarker,
673 flattenList = filters.flattenList,
674 assembleList = filters.assembleList,
675 isListBulletIndicator = this.utils.isListBulletIndicator,
676 containsNothingButSpaces = this.utils.isContainingOnlySpaces,
677 resolveListItem = this.utils.resolveList,
678 convertToPx = function( value ) {
679 value = CKEDITOR.tools.convertToPx( value );
680 return isNaN( value ) ? value : value + 'px';
681 },
682 getStyleComponents = this.utils.getStyleComponents,
683 listDtdParents = this.utils.listDtdParents,
684 removeFontStyles = config.pasteFromWordRemoveFontStyles !== false,
685 removeStyles = config.pasteFromWordRemoveStyles !== false;
686
687 return {
688
689 elementNames: [
690 // Remove script, meta and link elements.
691 [ ( /meta|link|script/ ), '' ]
692 ],
693
694 root: function( element ) {
695 element.filterChildren( filter );
696 assembleList( element );
697 },
698
699 elements: {
700 '^': function( element ) {
701 // Transform CSS style declaration to inline style.
702 var applyStyleFilter;
703 if ( CKEDITOR.env.gecko && ( applyStyleFilter = filters.applyStyleFilter ) )
704 applyStyleFilter( element );
705 },
706
707 $: function( element ) {
708 var tagName = element.name || '',
709 attrs = element.attributes;
710
711 // Convert length unit of width/height on blocks to
712 // a more editor-friendly way (px).
713 if ( tagName in blockLike && attrs.style )
714 attrs.style = stylesFilter( [ [ ( /^(:?width|height)$/ ), null, convertToPx ] ] )( attrs.style ) || '';
715
716 // Processing headings.
717 if ( tagName.match( /h\d/ ) ) {
718 element.filterChildren( filter );
719 // Is the heading actually a list item?
720 if ( resolveListItem( element ) )
721 return;
722
723 // Adapt heading styles to editor's convention.
724 elementMigrateFilter( config[ 'format_' + tagName ] )( element );
725 }
726 // Remove inline elements which contain only empty spaces.
727 else if ( tagName in dtd.$inline ) {
728 element.filterChildren( filter );
729 if ( containsNothingButSpaces( element ) )
730 delete element.name;
731 }
732 // Remove element with ms-office namespace,
733 // with it's content preserved, e.g. 'o:p'.
734 else if ( tagName.indexOf( ':' ) != -1 && tagName.indexOf( 'cke' ) == -1 ) {
735 element.filterChildren( filter );
736
737 // Restore image real link from vml.
738 if ( tagName == 'v:imagedata' ) {
739 var href = element.attributes[ 'o:href' ];
740 if ( href )
741 element.attributes.src = href;
742 element.name = 'img';
743 return;
744 }
745 delete element.name;
746 }
747
748 // Assembling list items into a whole list.
749 if ( tagName in listDtdParents ) {
750 element.filterChildren( filter );
751 assembleList( element );
752 }
753 },
754
755 // We'll drop any style sheet, but Firefox conclude
756 // certain styles in a single style element, which are
757 // required to be changed into inline ones.
758 'style': function( element ) {
759 if ( CKEDITOR.env.gecko ) {
760 // Grab only the style definition section.
761 var styleDefSection = element.onlyChild().value.match( /\/\* Style Definitions \*\/([\s\S]*?)\/\*/ ),
762 styleDefText = styleDefSection && styleDefSection[ 1 ],
763 rules = {}; // Storing the parsed result.
764
765 if ( styleDefText ) {
766 styleDefText
767 // Remove line-breaks.
768 .replace( /[\n\r]/g, '' )
769 // Extract selectors and style properties.
770 .replace( /(.+?)\{(.+?)\}/g, function( rule, selectors, styleBlock ) {
771 selectors = selectors.split( ',' );
772 var length = selectors.length;
773 for ( var i = 0; i < length; i++ ) {
774 // Assume MS-Word mostly generate only simple
775 // selector( [Type selector][Class selector]).
776 CKEDITOR.tools.trim( selectors[ i ] ).replace( /^(\w+)(\.[\w-]+)?$/g, function( match, tagName, className ) {
777 tagName = tagName || '*';
778 className = className.substring( 1, className.length );
779
780 // Reject MS-Word Normal styles.
781 if ( className.match( /MsoNormal/ ) )
782 return;
783
784 if ( !rules[ tagName ] )
785 rules[ tagName ] = {};
786 if ( className )
787 rules[ tagName ][ className ] = styleBlock;
788 else
789 rules[ tagName ] = styleBlock;
790 } );
791 }
792 } );
793
794 filters.applyStyleFilter = function( element ) {
795 var name = rules[ '*' ] ? '*' : element.name,
796 className = element.attributes && element.attributes[ 'class' ],
797 style;
798 if ( name in rules ) {
799 style = rules[ name ];
800 if ( typeof style == 'object' )
801 style = style[ className ];
802 // Maintain style rules priorities.
803 style && element.addStyle( style, true );
804 }
805 };
806 }
807 }
808 return false;
809 },
810
811 'p': function( element ) {
812 // A a fall-back approach to resolve list item in browsers
813 // that doesn't include "mso-list:Ignore" on list bullets,
814 // note it's not perfect as not all list style (e.g. "heading list") is shipped
815 // with this pattern. (#6662)
816 if ( ( /MsoListParagraph/i ).exec( element.attributes[ 'class' ] ) ||
817 ( element.getStyle( 'mso-list' ) && !element.getStyle( 'mso-list' ).match( /^(none|skip)$/i ) ) ) {
818 var bulletText = element.firstChild( function( node ) {
819 return node.type == CKEDITOR.NODE_TEXT && !containsNothingButSpaces( node.parent );
820 } );
821
822 var bullet = bulletText && bulletText.parent;
823 if ( bullet )
824 bullet.addStyle( 'mso-list', 'Ignore' );
825
826 }
827
828 element.filterChildren( filter );
829
830 // Is the paragraph actually a list item?
831 if ( resolveListItem( element ) )
832 return;
833
834 // Adapt paragraph formatting to editor's convention
835 // according to enter-mode.
836 if ( config.enterMode == CKEDITOR.ENTER_BR ) {
837 // We suffer from attribute/style lost in this situation.
838 delete element.name;
839 element.add( new CKEDITOR.htmlParser.element( 'br' ) );
840 } else {
841 elementMigrateFilter( config[ 'format_' + ( config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ] )( element );
842 }
843 },
844
845 'div': function( element ) {
846 // Aligned table with no text surrounded is represented by a wrapper div, from which
847 // table cells inherit as text-align styles, which is wrong.
848 // Instead we use a clear-float div after the table to properly achieve the same layout.
849 var singleChild = element.onlyChild();
850 if ( singleChild && singleChild.name == 'table' ) {
851 var attrs = element.attributes;
852 singleChild.attributes = CKEDITOR.tools.extend( singleChild.attributes, attrs );
853 attrs.style && singleChild.addStyle( attrs.style );
854
855 var clearFloatDiv = new CKEDITOR.htmlParser.element( 'div' );
856 clearFloatDiv.addStyle( 'clear', 'both' );
857 element.add( clearFloatDiv );
858 delete element.name;
859 }
860 },
861
862 'td': function( element ) {
863 // 'td' in 'thead' is actually <th>.
864 if ( element.getAncestor( 'thead' ) )
865 element.name = 'th';
866 },
867
868 // MS-Word sometimes present list as a mixing of normal list
869 // and pseudo-list, normalize the previous ones into pseudo form.
870 'ol': flattenList,
871 'ul': flattenList,
872 'dl': flattenList,
873
874 'font': function( element ) {
875 // Drop the font tag if it comes from list bullet text.
876 if ( isListBulletIndicator( element.parent ) ) {
877 delete element.name;
878 return;
879 }
880
881 element.filterChildren( filter );
882
883 var attrs = element.attributes,
884 styleText = attrs.style,
885 parent = element.parent;
886
887 if ( parent.name == 'font' ) { // Merge nested <font> tags.
888 CKEDITOR.tools.extend( parent.attributes, element.attributes );
889 styleText && parent.addStyle( styleText );
890 delete element.name;
891 }
892 // Convert the merged into a span with all attributes preserved.
893 else {
894 // Use array to avoid string concatenation and get rid of problems with trailing ";" (#12243).
895 styleText = ( styleText || '' ).split( ';' );
896
897 // IE's having those deprecated attributes, normalize them.
898 if ( attrs.color ) {
899 if ( attrs.color != '#000000' )
900 styleText.push( 'color:' + attrs.color );
901 delete attrs.color;
902 }
903 if ( attrs.face ) {
904 styleText.push( 'font-family:' + attrs.face );
905 delete attrs.face;
906 }
907 // TODO: Mapping size in ranges of xx-small,
908 // x-small, small, medium, large, x-large, xx-large.
909 if ( attrs.size ) {
910 styleText.push( 'font-size:' +
911 ( attrs.size > 3 ? 'large' : ( attrs.size < 3 ? 'small' : 'medium' ) ) );
912 delete attrs.size;
913 }
914
915 element.name = 'span';
916 element.addStyle( styleText.join( ';' ) );
917 }
918 },
919
920 'span': function( element ) {
921 // Remove the span if it comes from list bullet text.
922 if ( isListBulletIndicator( element.parent ) )
923 return false;
924
925 element.filterChildren( filter );
926 if ( containsNothingButSpaces( element ) ) {
927 delete element.name;
928 return null;
929 }
930
931 // List item bullet type is supposed to be indicated by
932 // the text of a span with style 'mso-list : Ignore' or an image.
933 if ( isListBulletIndicator( element ) ) {
934 var listSymbolNode = element.firstChild( function( node ) {
935 return node.value || node.name == 'img';
936 } );
937
938 var listSymbol = listSymbolNode && ( listSymbolNode.value || 'l.' ),
939 listType = listSymbol && listSymbol.match( /^(?:[(]?)([^\s]+?)([.)]?)$/ );
940
941 if ( listType ) {
942 var marker = createListBulletMarker( listType, listSymbol );
943 // Some non-existed list items might be carried by an inconsequential list, indicate by "mso-hide:all/display:none",
944 // those are to be removed later, now mark it with "cke:ignored".
945 var ancestor = element.getAncestor( 'span' );
946 if ( ancestor && ( / mso-hide:\s*all|display:\s*none / ).test( ancestor.attributes.style ) )
947 marker.attributes[ 'cke:ignored' ] = 1;
948 return marker;
949 }
950 }
951
952 // Update the src attribute of image element with href.
953 var attrs = element.attributes,
954 styleText = attrs && attrs.style;
955
956 // Assume MS-Word mostly carry font related styles on <span>,
957 // adapting them to editor's convention.
958 if ( styleText ) {
959 attrs.style = stylesFilter( [
960 // Drop 'inline-height' style which make lines overlapping.
961 [ 'line-height' ],
962 [ ( /^font-family$/ ), null, !removeFontStyles ? styleMigrateFilter( config.font_style, 'family' ) : null ],
963 [ ( /^font-size$/ ), null, !removeFontStyles ? styleMigrateFilter( config.fontSize_style, 'size' ) : null ],
964 [ ( /^color$/ ), null, !removeFontStyles ? styleMigrateFilter( config.colorButton_foreStyle, 'color' ) : null ],
965 [ ( /^background-color$/ ), null, !removeFontStyles ? styleMigrateFilter( config.colorButton_backStyle, 'color' ) : null ]
966 ] )( styleText, element ) || '';
967 }
968
969 if ( !attrs.style )
970 delete attrs.style;
971
972 if ( CKEDITOR.tools.isEmpty( attrs ) )
973 delete element.name;
974
975 return null;
976 },
977
978 // Migrate basic style formats to editor configured ones.
979 b: elementMigrateFilter( config.coreStyles_bold ),
980 i: elementMigrateFilter( config.coreStyles_italic ),
981 u: elementMigrateFilter( config.coreStyles_underline ),
982 s: elementMigrateFilter( config.coreStyles_strike ),
983 sup: elementMigrateFilter( config.coreStyles_superscript ),
984 sub: elementMigrateFilter( config.coreStyles_subscript ),
985
986 // Remove full paths from links to anchors.
987 a: function( element ) {
988 var attrs = element.attributes;
989
990 if ( attrs.name && attrs.name.match( /ole_link\d+/i ) ) {
991 delete element.name;
992 return;
993 }
994
995 if ( attrs.href && attrs.href.match( /^file:\/\/\/[\S]+#/i ) )
996 attrs.href = attrs.href.replace( /^file:\/\/\/[^#]+/i, '' );
997 },
998
999 'cke:listbullet': function( element ) {
1000 if ( element.getAncestor( /h\d/ ) && !config.pasteFromWordNumberedHeadingToList )
1001 delete element.name;
1002 }
1003 },
1004
1005 attributeNames: [
1006 // Remove onmouseover and onmouseout events (from MS Word comments effect)
1007 [ ( /^onmouse(:?out|over)/ ), '' ],
1008 // Onload on image element.
1009 [ ( /^onload$/ ), '' ],
1010 // Remove office and vml attribute from elements.
1011 [ ( /(?:v|o):\w+/ ), '' ],
1012 // Remove lang/language attributes.
1013 [ ( /^lang/ ), '' ]
1014 ],
1015
1016 attributes: {
1017 'style': stylesFilter( removeStyles ?
1018 // Provide a white-list of styles that we preserve, those should
1019 // be the ones that could later be altered with editor tools.
1020 [
1021 // Leave list-style-type
1022 [ ( /^list-style-type$/ ), null ],
1023
1024 // Preserve margin-left/right which used as default indent style in the editor.
1025 [ ( /^margin$|^margin-(?!bottom|top)/ ), null, function( value, element, name ) {
1026 if ( element.name in { p: 1, div: 1 } ) {
1027 var indentStyleName = config.contentsLangDirection == 'ltr' ? 'margin-left' : 'margin-right';
1028
1029 // Extract component value from 'margin' shorthand.
1030 if ( name == 'margin' )
1031 value = getStyleComponents( name, value, [ indentStyleName ] )[ indentStyleName ];
1032 else if ( name != indentStyleName )
1033 return null;
1034
1035 if ( value && !emptyMarginRegex.test( value ) )
1036 return [ indentStyleName, value ];
1037 }
1038
1039 return null;
1040 } ],
1041
1042 // Preserve clear float style.
1043 [ ( /^clear$/ ) ],
1044
1045 [ ( /^border.*|margin.*|vertical-align|float$/ ), null, function( value, element ) {
1046 if ( element.name == 'img' )
1047 return value;
1048 } ],
1049
1050 [ ( /^width|height$/ ), null, function( value, element ) {
1051 if ( element.name in { table: 1, td: 1, th: 1, img: 1 } )
1052 return value;
1053 } ]
1054 ] :
1055 // Otherwise provide a black-list of styles that we remove.
1056 [
1057 [ ( /^mso-/ ) ],
1058 // Fixing color values.
1059 [ ( /-color$/ ), null, function( value ) {
1060 if ( value == 'transparent' )
1061 return false;
1062 if ( CKEDITOR.env.gecko )
1063 return value.replace( /-moz-use-text-color/g, 'transparent' );
1064 } ],
1065 // Remove empty margin values, e.g. 0.00001pt 0em 0pt
1066 [ ( /^margin$/ ), emptyMarginRegex ],
1067 [ 'text-indent', '0cm' ],
1068 [ 'page-break-before' ],
1069 [ 'tab-stops' ],
1070 [ 'display', 'none' ],
1071 removeFontStyles ? [ ( /font-?/ ) ] : null
1072 ], removeStyles ),
1073
1074 // Prefer width styles over 'width' attributes.
1075 'width': function( value, element ) {
1076 if ( element.name in dtd.$tableContent )
1077 return false;
1078 },
1079 // Prefer border styles over table 'border' attributes.
1080 'border': function( value, element ) {
1081 if ( element.name in dtd.$tableContent )
1082 return false;
1083 },
1084
1085 // Only Firefox carry style sheet from MS-Word, which
1086 // will be applied by us manually. For other browsers
1087 // the css className is useless.
1088 // We need to keep classes added as a style (#12256).
1089 'class': function( value, element ) {
1090 if ( element.classWhiteList && element.classWhiteList.indexOf( ' ' + value + ' ' ) != -1 ) {
1091 return value;
1092 }
1093 return false;
1094 },
1095
1096 // MS-Word always generate 'background-color' along with 'bgcolor',
1097 // simply drop the deprecated attributes.
1098 'bgcolor': falsyFilter,
1099
1100 // Deprecate 'valign' attribute in favor of 'vertical-align'.
1101 'valign': removeStyles ? falsyFilter : function( value, element ) {
1102 element.addStyle( 'vertical-align', value );
1103 return false;
1104 }
1105 },
1106
1107 // Fore none-IE, some useful data might be buried under these IE-conditional
1108 // comments where RegExp were the right approach to dig them out where usual approach
1109 // is transform it into a fake element node which hold the desired data.
1110 comment: !CKEDITOR.env.ie ? function( value, node ) {
1111 var imageInfo = value.match( /<img.*?>/ ),
1112 listInfo = value.match( /^\[if !supportLists\]([\s\S]*?)\[endif\]$/ );
1113
1114 // Seek for list bullet indicator.
1115 if ( listInfo ) {
1116 // Bullet symbol could be either text or an image.
1117 var listSymbol = listInfo[ 1 ] || ( imageInfo && 'l.' ),
1118 listType = listSymbol && listSymbol.match( />(?:[(]?)([^\s]+?)([.)]?)</ );
1119 return createListBulletMarker( listType, listSymbol );
1120 }
1121
1122 // Reveal the <img> element in conditional comments for Firefox.
1123 if ( CKEDITOR.env.gecko && imageInfo ) {
1124 var img = CKEDITOR.htmlParser.fragment.fromHtml( imageInfo[ 0 ] ).children[ 0 ],
1125 previousComment = node.previous,
1126 // Try to dig the real image link from vml markup from previous comment text.
1127 imgSrcInfo = previousComment && previousComment.value.match( /<v:imagedata[^>]*o:href=['"](.*?)['"]/ ),
1128 imgSrc = imgSrcInfo && imgSrcInfo[ 1 ];
1129
1130 // Is there a real 'src' url to be used?
1131 imgSrc && ( img.attributes.src = imgSrc );
1132 return img;
1133 }
1134
1135 return false;
1136 } : falsyFilter
1137 };
1138 }
1139 } );
1140
1141 // The paste processor here is just a reduced copy of html data processor.
1142 var pasteProcessor = function() {
1143 this.dataFilter = new CKEDITOR.htmlParser.filter();
1144 };
1145
1146 pasteProcessor.prototype = {
1147 toHtml: function( data ) {
1148 var fragment = CKEDITOR.htmlParser.fragment.fromHtml( data ),
1149 writer = new CKEDITOR.htmlParser.basicWriter();
1150
1151 fragment.writeHtml( writer, this.dataFilter );
1152 return writer.getHtml( true );
1153 }
1154 };
1155
1156 CKEDITOR.cleanWord = function( data, editor ) {
1157 // We get <![if !supportLists]> and <![endif]> when we started using `dataTransfer` instead of pasteBin, so we need to
1158 // change <![if !supportLists]> to <!--[if !supportLists]--> and <![endif]> to <!--[endif]-->.
1159 data = data.replace( /<!\[([^\]]*?)\]>/g, '<!--[$1]-->' );
1160
1161 // Firefox will be confused by those downlevel-revealed IE conditional
1162 // comments, fixing them first( convert it to upperlevel-revealed one ).
1163 // e.g. <![if !vml]>...<![endif]>
1164 if ( CKEDITOR.env.gecko )
1165 data = data.replace( /(<!--\[if[^<]*?\])-->([\S\s]*?)<!--(\[endif\]-->)/gi, '$1$2$3' );
1166
1167 // #9456 - Webkit doesn't wrap list number with span, which is crucial for filter to recognize list.
1168 //
1169 // <p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2">
1170 // <!--[if !supportLists]-->
1171 // 3.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
1172 // <!--[endif]-->Test3<o:p></o:p>
1173 // </p>
1174 //
1175 // Transform to:
1176 //
1177 // <p class="MsoListParagraphCxSpLast" style="text-indent:-18.0pt;mso-list:l0 level1 lfo2">
1178 // <!--[if !supportLists]-->
1179 // <span>
1180 // 3.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
1181 // </span>
1182 // <!--[endif]-->Test3<o:p></o:p>
1183 // </p>
1184 if ( CKEDITOR.env.webkit )
1185 data = data.replace( /(class="MsoListParagraph[^>]+><!--\[if !supportLists\]-->)([^<]+<span[^<]+<\/span>)(<!--\[endif\]-->)/gi, '$1<span>$2</span>$3' );
1186
1187 var dataProcessor = new pasteProcessor(),
1188 dataFilter = dataProcessor.dataFilter;
1189
1190 // These rules will have higher priorities than default ones.
1191 dataFilter.addRules( CKEDITOR.plugins.pastefromword.getRules( editor, dataFilter ) );
1192
1193 // Allow extending data filter rules.
1194 editor.fire( 'beforeCleanWord', { filter: dataFilter } );
1195
1196 try {
1197 data = dataProcessor.toHtml( data );
1198 } catch ( e ) {
1199 editor.showNotification( editor.lang.pastefromword.error );
1200 }
1201
1202 // Below post processing those things that are unable to delivered by filter rules.
1203
1204 // Remove 'cke' namespaced attribute used in filter rules as marker.
1205 data = data.replace( /cke:.*?".*?"/g, '' );
1206
1207 // Remove empty style attribute.
1208 data = data.replace( /style=""/g, '' );
1209
1210 // Remove the dummy spans ( having no inline style ).
1211 data = data.replace( /<span>/g, '' );
1212
1213 return data;
1214 };
1215} )();
1216
1217/**
1218 * Whether to ignore all font related formatting styles, including:
1219 *
1220 * * font size;
1221 * * font family;
1222 * * font foreground/background color.
1223 *
1224 * config.pasteFromWordRemoveFontStyles = false;
1225 *
1226 * @since 3.1
1227 * @cfg {Boolean} [pasteFromWordRemoveFontStyles=true]
1228 * @member CKEDITOR.config
1229 */
1230
1231/**
1232 * Whether to transform MS Word outline numbered headings into lists.
1233 *
1234 * config.pasteFromWordNumberedHeadingToList = true;
1235 *
1236 * @since 3.1
1237 * @cfg {Boolean} [pasteFromWordNumberedHeadingToList=false]
1238 * @member CKEDITOR.config
1239 */
1240
1241/**
1242 * Whether to remove element styles that can't be managed with the editor. Note
1243 * that this doesn't handle the font specific styles, which depends on the
1244 * {@link #pasteFromWordRemoveFontStyles} setting instead.
1245 *
1246 * config.pasteFromWordRemoveStyles = false;
1247 *
1248 * @since 3.1
1249 * @cfg {Boolean} [pasteFromWordRemoveStyles=true]
1250 * @member CKEDITOR.config
1251 */
diff --git a/sources/plugins/pastefromword/icons/hidpi/pastefromword-rtl.png b/sources/plugins/pastefromword/icons/hidpi/pastefromword-rtl.png
new file mode 100644
index 00000000..142bd569
--- /dev/null
+++ b/sources/plugins/pastefromword/icons/hidpi/pastefromword-rtl.png
Binary files differ
diff --git a/sources/plugins/pastefromword/icons/hidpi/pastefromword.png b/sources/plugins/pastefromword/icons/hidpi/pastefromword.png
new file mode 100644
index 00000000..ac043cdd
--- /dev/null
+++ b/sources/plugins/pastefromword/icons/hidpi/pastefromword.png
Binary files differ
diff --git a/sources/plugins/pastefromword/icons/pastefromword-rtl.png b/sources/plugins/pastefromword/icons/pastefromword-rtl.png
new file mode 100644
index 00000000..7b69c555
--- /dev/null
+++ b/sources/plugins/pastefromword/icons/pastefromword-rtl.png
Binary files differ
diff --git a/sources/plugins/pastefromword/icons/pastefromword.png b/sources/plugins/pastefromword/icons/pastefromword.png
new file mode 100644
index 00000000..61a0ae43
--- /dev/null
+++ b/sources/plugins/pastefromword/icons/pastefromword.png
Binary files differ
diff --git a/sources/plugins/pastefromword/lang/af.js b/sources/plugins/pastefromword/lang/af.js
new file mode 100644
index 00000000..0e047b32
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/af.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'af', {
6 confirmCleanup: 'Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?',
7 error: 'Die geplakte teks kon nie skoongemaak word nie, weens \'n interne fout',
8 title: 'Plak vanuit Word',
9 toolbar: 'Plak vanuit Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/ar.js b/sources/plugins/pastefromword/lang/ar.js
new file mode 100644
index 00000000..37d6c35d
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ar.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ar', {
6 confirmCleanup: 'يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟',
7 error: 'لم يتم مسح المعلومات الملصقة لخلل داخلي',
8 title: 'لصق من وورد',
9 toolbar: 'لصق من وورد'
10} );
diff --git a/sources/plugins/pastefromword/lang/bg.js b/sources/plugins/pastefromword/lang/bg.js
new file mode 100644
index 00000000..eb4a6fab
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/bg.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'bg', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Вмъкни от MS Word',
9 toolbar: 'Вмъкни от MS Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/bn.js b/sources/plugins/pastefromword/lang/bn.js
new file mode 100644
index 00000000..9fedb959
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/bn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'bn', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'পেস্ট (শব্দ)',
9 toolbar: 'পেস্ট (শব্দ)'
10} );
diff --git a/sources/plugins/pastefromword/lang/bs.js b/sources/plugins/pastefromword/lang/bs.js
new file mode 100644
index 00000000..2b0528a7
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/bs.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'bs', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Zalijepi iz Word-a',
9 toolbar: 'Zalijepi iz Word-a'
10} );
diff --git a/sources/plugins/pastefromword/lang/ca.js b/sources/plugins/pastefromword/lang/ca.js
new file mode 100644
index 00000000..b2da5cd8
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ca.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ca', {
6 confirmCleanup: 'El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?',
7 error: 'No ha estat possible netejar les dades enganxades degut a un error intern',
8 title: 'Enganxa des del Word',
9 toolbar: 'Enganxa des del Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/cs.js b/sources/plugins/pastefromword/lang/cs.js
new file mode 100644
index 00000000..5cb7c174
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/cs.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'cs', {
6 confirmCleanup: 'Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?',
7 error: 'Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.',
8 title: 'Vložit z Wordu',
9 toolbar: 'Vložit z Wordu'
10} );
diff --git a/sources/plugins/pastefromword/lang/cy.js b/sources/plugins/pastefromword/lang/cy.js
new file mode 100644
index 00000000..75fe3662
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/cy.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'cy', {
6 confirmCleanup: 'Mae\'r testun rydych chi am ludo wedi\'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?',
7 error: 'Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol',
8 title: 'Gludo o Word',
9 toolbar: 'Gludo o Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/da.js b/sources/plugins/pastefromword/lang/da.js
new file mode 100644
index 00000000..81b26307
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/da.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'da', {
6 confirmCleanup: 'Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?',
7 error: 'Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl',
8 title: 'Indsæt fra Word',
9 toolbar: 'Indsæt fra Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/de.js b/sources/plugins/pastefromword/lang/de.js
new file mode 100644
index 00000000..836b7d74
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/de.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'de', {
6 confirmCleanup: 'Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?',
7 error: 'Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen',
8 title: 'Aus Word einfügen',
9 toolbar: 'Aus Word einfügen'
10} );
diff --git a/sources/plugins/pastefromword/lang/el.js b/sources/plugins/pastefromword/lang/el.js
new file mode 100644
index 00000000..96d1e878
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/el.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'el', {
6 confirmCleanup: 'Το κείμενο που επικολλάται φαίνεται να είναι αντιγραμμένο από το Word. Μήπως θα θέλατε να καθαριστεί προτού επικολληθεί;',
7 error: 'Δεν ήταν δυνατό να καθαριστούν τα δεδομένα λόγω ενός εσωτερικού σφάλματος',
8 title: 'Επικόλληση από το Word',
9 toolbar: 'Επικόλληση από το Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/en-au.js b/sources/plugins/pastefromword/lang/en-au.js
new file mode 100644
index 00000000..0f677593
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/en-au.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'en-au', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Paste from Word',
9 toolbar: 'Paste from Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/en-ca.js b/sources/plugins/pastefromword/lang/en-ca.js
new file mode 100644
index 00000000..c3386622
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/en-ca.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'en-ca', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Paste from Word',
9 toolbar: 'Paste from Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/en-gb.js b/sources/plugins/pastefromword/lang/en-gb.js
new file mode 100644
index 00000000..085e6bce
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/en-gb.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'en-gb', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',
7 error: 'It was not possible to clean up the pasted data due to an internal error',
8 title: 'Paste from Word',
9 toolbar: 'Paste from Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/en.js b/sources/plugins/pastefromword/lang/en.js
new file mode 100644
index 00000000..396c85b8
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/en.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'en', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',
7 error: 'It was not possible to clean up the pasted data due to an internal error',
8 title: 'Paste from Word',
9 toolbar: 'Paste from Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/eo.js b/sources/plugins/pastefromword/lang/eo.js
new file mode 100644
index 00000000..b9fc8e57
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/eo.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'eo', {
6 confirmCleanup: 'La teksto, kiun vi volas interglui, ŝajnas esti kopiita el Word. Ĉu vi deziras purigi ĝin antaŭ intergluo?',
7 error: 'Ne eblis purigi la intergluitajn datenojn pro interna eraro',
8 title: 'Interglui el Word',
9 toolbar: 'Interglui el Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/es.js b/sources/plugins/pastefromword/lang/es.js
new file mode 100644
index 00000000..031de57f
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/es.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'es', {
6 confirmCleanup: 'El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?',
7 error: 'No ha sido posible limpiar los datos debido a un error interno',
8 title: 'Pegar desde Word',
9 toolbar: 'Pegar desde Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/et.js b/sources/plugins/pastefromword/lang/et.js
new file mode 100644
index 00000000..f41c5ac9
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/et.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'et', {
6 confirmCleanup: 'Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?',
7 error: 'Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik',
8 title: 'Asetamine Wordist',
9 toolbar: 'Asetamine Wordist'
10} );
diff --git a/sources/plugins/pastefromword/lang/eu.js b/sources/plugins/pastefromword/lang/eu.js
new file mode 100644
index 00000000..3035a14c
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/eu.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'eu', {
6 confirmCleanup: 'Itsatsi nahi duzun testua Word-etik kopiatua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?',
7 error: 'Barne-errore bat dela eta ezin izan da itsatsitako testua garbitu',
8 title: 'Itsatsi Word-etik',
9 toolbar: 'Itsatsi Word-etik'
10} );
diff --git a/sources/plugins/pastefromword/lang/fa.js b/sources/plugins/pastefromword/lang/fa.js
new file mode 100644
index 00000000..029209ba
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/fa.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'fa', {
6 confirmCleanup: 'متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟',
7 error: 'به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.',
8 title: 'چسباندن از Word',
9 toolbar: 'چسباندن از Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/fi.js b/sources/plugins/pastefromword/lang/fi.js
new file mode 100644
index 00000000..7b368fe7
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/fi.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'fi', {
6 confirmCleanup: 'Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)',
7 error: 'Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia',
8 title: 'Liitä Word-dokumentista',
9 toolbar: 'Liitä Word-dokumentista'
10} );
diff --git a/sources/plugins/pastefromword/lang/fo.js b/sources/plugins/pastefromword/lang/fo.js
new file mode 100644
index 00000000..dc994220
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/fo.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'fo', {
6 confirmCleanup: 'Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?',
7 error: 'Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil',
8 title: 'Innrita frá Word',
9 toolbar: 'Innrita frá Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/fr-ca.js b/sources/plugins/pastefromword/lang/fr-ca.js
new file mode 100644
index 00000000..4e27e997
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/fr-ca.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'fr-ca', {
6 confirmCleanup: 'Le texte que vous tentez de coller semble provenir de Word. Désirez vous le nettoyer avant de coller?',
7 error: 'Il n\'a pas été possible de nettoyer les données collées du à une erreur interne',
8 title: 'Coller de Word',
9 toolbar: 'Coller de Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/fr.js b/sources/plugins/pastefromword/lang/fr.js
new file mode 100644
index 00000000..13126f7a
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/fr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'fr', {
6 confirmCleanup: 'Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?',
7 error: 'Il n\'a pas été possible de nettoyer les données collées à la suite d\'une erreur interne.',
8 title: 'Coller depuis Word',
9 toolbar: 'Coller depuis Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/gl.js b/sources/plugins/pastefromword/lang/gl.js
new file mode 100644
index 00000000..655cc3d5
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/gl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'gl', {
6 confirmCleanup: 'O texto que quere pegar semella ser copiado desde o Word. Quere depuralo antes de pegalo?',
7 error: 'Non foi posíbel depurar os datos pegados por mor dun erro interno',
8 title: 'Pegar desde Word',
9 toolbar: 'Pegar desde Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/gu.js b/sources/plugins/pastefromword/lang/gu.js
new file mode 100644
index 00000000..6ea245d6
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/gu.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'gu', {
6 confirmCleanup: 'તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?',
7 error: 'પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.',
8 title: 'પેસ્ટ (વડૅ ટેક્સ્ટ)',
9 toolbar: 'પેસ્ટ (વડૅ ટેક્સ્ટ)'
10} );
diff --git a/sources/plugins/pastefromword/lang/he.js b/sources/plugins/pastefromword/lang/he.js
new file mode 100644
index 00000000..80666c70
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/he.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'he', {
6 confirmCleanup: 'נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?',
7 error: 'לא ניתן היה לנקות את המידע בשל תקלה פנימית.',
8 title: 'הדבקה מ-Word',
9 toolbar: 'הדבקה מ-Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/hi.js b/sources/plugins/pastefromword/lang/hi.js
new file mode 100644
index 00000000..2e39fee2
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/hi.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'hi', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'पेस्ट (वर्ड से)',
9 toolbar: 'पेस्ट (वर्ड से)'
10} );
diff --git a/sources/plugins/pastefromword/lang/hr.js b/sources/plugins/pastefromword/lang/hr.js
new file mode 100644
index 00000000..2a765328
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/hr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'hr', {
6 confirmCleanup: 'Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?',
7 error: 'Nije moguće očistiti podatke za ljepljenje zbog interne greške',
8 title: 'Zalijepi iz Worda',
9 toolbar: 'Zalijepi iz Worda'
10} );
diff --git a/sources/plugins/pastefromword/lang/hu.js b/sources/plugins/pastefromword/lang/hu.js
new file mode 100644
index 00000000..5f670e1e
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/hu.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'hu', {
6 confirmCleanup: 'Úgy tűnik a beillesztett szöveget Word-ből másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)',
7 error: 'Egy belső hiba miatt nem sikerült megtisztítani a szöveget',
8 title: 'Beillesztés Word-ből',
9 toolbar: 'Beillesztés Word-ből'
10} );
diff --git a/sources/plugins/pastefromword/lang/id.js b/sources/plugins/pastefromword/lang/id.js
new file mode 100644
index 00000000..be60dd24
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/id.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'id', {
6 confirmCleanup: 'Teks yang ingin anda tempel sepertinya di salin dari Word. Apakah anda mau membersihkannya sebelum menempel?',
7 error: 'Tidak mungkin membersihkan data yang ditempel dikerenakan kesalahan internal',
8 title: 'Tempel dari Word',
9 toolbar: 'Tempel dari Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/is.js b/sources/plugins/pastefromword/lang/is.js
new file mode 100644
index 00000000..35dfe084
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/is.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'is', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Líma úr Word',
9 toolbar: 'Líma úr Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/it.js b/sources/plugins/pastefromword/lang/it.js
new file mode 100644
index 00000000..68020681
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/it.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'it', {
6 confirmCleanup: 'Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?',
7 error: 'Non è stato possibile eliminare il testo incollato a causa di un errore interno.',
8 title: 'Incolla da Word',
9 toolbar: 'Incolla da Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/ja.js b/sources/plugins/pastefromword/lang/ja.js
new file mode 100644
index 00000000..a1269c98
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ja.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ja', {
6 confirmCleanup: '貼り付けを行うテキストはワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか?',
7 error: '内部エラーにより貼り付けたデータをクリアできませんでした',
8 title: 'ワード文章から貼り付け',
9 toolbar: 'ワード文章から貼り付け'
10} );
diff --git a/sources/plugins/pastefromword/lang/ka.js b/sources/plugins/pastefromword/lang/ka.js
new file mode 100644
index 00000000..472ff533
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ka.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ka', {
6 confirmCleanup: 'ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?',
7 error: 'შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა',
8 title: 'ვორდიდან ჩასმა',
9 toolbar: 'ვორდიდან ჩასმა'
10} );
diff --git a/sources/plugins/pastefromword/lang/km.js b/sources/plugins/pastefromword/lang/km.js
new file mode 100644
index 00000000..cd5268dc
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/km.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'km', {
6 confirmCleanup: 'អត្ថបទ​ដែល​អ្នក​ចង់​បិទ​ភ្ជាប់​នេះ ទំនង​ដូច​ជា​ចម្លង​មក​ពី Word។ តើ​អ្នក​ចង់​សម្អាត​វា​មុន​បិទ​ភ្ជាប់​ទេ?',
7 error: 'ដោយ​សារ​មាន​បញ្ហា​ផ្នែក​ក្នុង​ធ្វើ​ឲ្យ​មិន​អាច​សម្អាត​ទិន្នន័យ​ដែល​បាន​បិទ​ភ្ជាប់',
8 title: 'បិទ​ភ្ជាប់​ពី Word',
9 toolbar: 'បិទ​ភ្ជាប់​ពី Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/ko.js b/sources/plugins/pastefromword/lang/ko.js
new file mode 100644
index 00000000..54870707
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ko.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ko', {
6 confirmCleanup: '붙여 넣을 내용은 MS Word에서 복사 한 것입니다. 붙여 넣기 전에 정리 하시겠습니까?',
7 error: '내부 오류로 붙여 넣은 데이터를 정리 할 수 없습니다.',
8 title: 'MS Word 에서 붙여넣기',
9 toolbar: 'MS Word 에서 붙여넣기'
10} );
diff --git a/sources/plugins/pastefromword/lang/ku.js b/sources/plugins/pastefromword/lang/ku.js
new file mode 100644
index 00000000..7fa47dd7
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ku.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ku', {
6 confirmCleanup: 'ئەم دەقەی بەتەمای بیلکێنی پێدەچێت له word هێنرابێت. دەتەوێت پاکی بکەیوه پێش ئەوەی بیلکێنی؟',
7 error: 'هیچ ڕێگەیەك نەبوو لەلکاندنی دەقەکه بەهۆی هەڵەیەکی ناوەخۆیی',
8 title: 'لکاندنی لەلایەن Word',
9 toolbar: 'لکاندنی لەڕێی Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/lt.js b/sources/plugins/pastefromword/lang/lt.js
new file mode 100644
index 00000000..b46b34f4
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/lt.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'lt', {
6 confirmCleanup: 'Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?',
7 error: 'Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto',
8 title: 'Įdėti iš Word',
9 toolbar: 'Įdėti iš Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/lv.js b/sources/plugins/pastefromword/lang/lv.js
new file mode 100644
index 00000000..c82f2093
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/lv.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'lv', {
6 confirmCleanup: 'Teksts, kuru vēlaties ielīmēt, izskatās ir nokopēts no Word. Vai vēlaties to iztīrīt pirms ielīmēšanas?',
7 error: 'Iekšējas kļūdas dēļ, neizdevās iztīrīt ielīmētos datus.',
8 title: 'Ievietot no Worda',
9 toolbar: 'Ievietot no Worda'
10} );
diff --git a/sources/plugins/pastefromword/lang/mk.js b/sources/plugins/pastefromword/lang/mk.js
new file mode 100644
index 00000000..b856a05e
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/mk.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'mk', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Paste from Word', // MISSING
9 toolbar: 'Paste from Word' // MISSING
10} );
diff --git a/sources/plugins/pastefromword/lang/mn.js b/sources/plugins/pastefromword/lang/mn.js
new file mode 100644
index 00000000..2e6fb128
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/mn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'mn', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Word-оос буулгах',
9 toolbar: 'Word-оос буулгах'
10} );
diff --git a/sources/plugins/pastefromword/lang/ms.js b/sources/plugins/pastefromword/lang/ms.js
new file mode 100644
index 00000000..ce6ffe6e
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ms.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ms', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Tampal dari Word',
9 toolbar: 'Tampal dari Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/nb.js b/sources/plugins/pastefromword/lang/nb.js
new file mode 100644
index 00000000..edd15bdd
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/nb.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'nb', {
6 confirmCleanup: 'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?',
7 error: 'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil',
8 title: 'Lim inn fra Word',
9 toolbar: 'Lim inn fra Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/nl.js b/sources/plugins/pastefromword/lang/nl.js
new file mode 100644
index 00000000..a699f3d0
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/nl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'nl', {
6 confirmCleanup: 'De tekst die u wilt plakken lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?',
7 error: 'Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout',
8 title: 'Plakken vanuit Word',
9 toolbar: 'Plakken vanuit Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/no.js b/sources/plugins/pastefromword/lang/no.js
new file mode 100644
index 00000000..fbb970be
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/no.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'no', {
6 confirmCleanup: 'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?',
7 error: 'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil',
8 title: 'Lim inn fra Word',
9 toolbar: 'Lim inn fra Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/pl.js b/sources/plugins/pastefromword/lang/pl.js
new file mode 100644
index 00000000..245b7d05
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/pl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'pl', {
6 confirmCleanup: 'Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?',
7 error: 'Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.',
8 title: 'Wklej z programu MS Word',
9 toolbar: 'Wklej z programu MS Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/pt-br.js b/sources/plugins/pastefromword/lang/pt-br.js
new file mode 100644
index 00000000..199b5a6b
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/pt-br.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'pt-br', {
6 confirmCleanup: 'O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?',
7 error: 'Não foi possível limpar os dados colados devido a um erro interno',
8 title: 'Colar do Word',
9 toolbar: 'Colar do Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/pt.js b/sources/plugins/pastefromword/lang/pt.js
new file mode 100644
index 00000000..06cdee8a
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/pt.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'pt', {
6 confirmCleanup: 'O texto que pretende colar parece ter sido copiado do Word. Deseja limpá-lo antes de colar?',
7 error: 'Não foi possivel limpar a informação colada decido a um erro interno.',
8 title: 'Colar do Word',
9 toolbar: 'Colar do Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/ro.js b/sources/plugins/pastefromword/lang/ro.js
new file mode 100644
index 00000000..5871070c
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ro.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ro', {
6 confirmCleanup: 'Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?',
7 error: 'Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne',
8 title: 'Adaugă din Word',
9 toolbar: 'Adaugă din Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/ru.js b/sources/plugins/pastefromword/lang/ru.js
new file mode 100644
index 00000000..1a8e159d
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ru.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ru', {
6 confirmCleanup: 'Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?',
7 error: 'Невозможно очистить вставленные данные из-за внутренней ошибки',
8 title: 'Вставить из Word',
9 toolbar: 'Вставить из Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/si.js b/sources/plugins/pastefromword/lang/si.js
new file mode 100644
index 00000000..e66b0cbd
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/si.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'si', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'වචන වලින් අලවන්න',
9 toolbar: 'වචන වලින් අලවන්න'
10} );
diff --git a/sources/plugins/pastefromword/lang/sk.js b/sources/plugins/pastefromword/lang/sk.js
new file mode 100644
index 00000000..8386c681
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/sk.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'sk', {
6 confirmCleanup: 'Vkladaný text vyzerá byť skopírovaný z Wordu. Chcete ho automaticky vyčistiť pred vkladaním?',
7 error: 'Nebolo možné vyčistiť vložené dáta kvôli internej chybe',
8 title: 'Vložiť z Wordu',
9 toolbar: 'Vložiť z Wordu'
10} );
diff --git a/sources/plugins/pastefromword/lang/sl.js b/sources/plugins/pastefromword/lang/sl.js
new file mode 100644
index 00000000..b558ca8a
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/sl.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'sl', {
6 confirmCleanup: 'Besedilo, ki ga želite prilepiti je kopirano iz Word-a. Ali ga želite očistiti, preden ga prilepite?',
7 error: 'Ni bilo mogoče očistiti prilepljenih podatkov zaradi notranje napake',
8 title: 'Prilepi iz Worda',
9 toolbar: 'Prilepi iz Worda'
10} );
diff --git a/sources/plugins/pastefromword/lang/sq.js b/sources/plugins/pastefromword/lang/sq.js
new file mode 100644
index 00000000..41c7c775
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/sq.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'sq', {
6 confirmCleanup: 'Teksti që dëshironi të e hidhni siç duket është kopjuar nga Word-i. Dëshironi të e pastroni para se të e hidhni?',
7 error: 'Nuk ishte e mundur të fshiheshin të dhënat e hedhura për shkak të një gabimi të brendshëm',
8 title: 'Hidhe nga Word-i',
9 toolbar: 'Hidhe nga Word-i'
10} );
diff --git a/sources/plugins/pastefromword/lang/sr-latn.js b/sources/plugins/pastefromword/lang/sr-latn.js
new file mode 100644
index 00000000..3774a3de
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/sr-latn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'sr-latn', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Zalepi iz Worda',
9 toolbar: 'Zalepi iz Worda'
10} );
diff --git a/sources/plugins/pastefromword/lang/sr.js b/sources/plugins/pastefromword/lang/sr.js
new file mode 100644
index 00000000..259715b3
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/sr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'sr', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Залепи из Worda',
9 toolbar: 'Залепи из Worda'
10} );
diff --git a/sources/plugins/pastefromword/lang/sv.js b/sources/plugins/pastefromword/lang/sv.js
new file mode 100644
index 00000000..d5954b49
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/sv.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'sv', {
6 confirmCleanup: 'Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa den innan du klistrar in den?',
7 error: 'Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel',
8 title: 'Klistra in från Word',
9 toolbar: 'Klistra in från Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/th.js b/sources/plugins/pastefromword/lang/th.js
new file mode 100644
index 00000000..2ddcca55
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/th.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'th', {
6 confirmCleanup: 'ข้อความที่คุณต้องการวางลงไปเป็นข้อความที่คัดลอกมาจากโปรแกรมไมโครซอฟท์เวิร์ด คุณต้องการล้างค่าข้อความดังกล่าวก่อนวางลงไปหรือไม่?',
7 error: 'ไม่สามารถล้างข้อมูลที่ต้องการวางได้เนื่องจากเกิดข้อผิดพลาดภายในระบบ',
8 title: 'วางสำเนาจากตัวอักษรเวิร์ด',
9 toolbar: 'วางสำเนาจากตัวอักษรเวิร์ด'
10} );
diff --git a/sources/plugins/pastefromword/lang/tr.js b/sources/plugins/pastefromword/lang/tr.js
new file mode 100644
index 00000000..12331e38
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/tr.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'tr', {
6 confirmCleanup: 'Yapıştırmaya çalıştığınız metin Word\'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?',
7 error: 'Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir',
8 title: 'Word\'den Yapıştır',
9 toolbar: 'Word\'den Yapıştır'
10} );
diff --git a/sources/plugins/pastefromword/lang/tt.js b/sources/plugins/pastefromword/lang/tt.js
new file mode 100644
index 00000000..a5876219
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/tt.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'tt', {
6 confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
7 error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING
8 title: 'Word\'тан өстәү',
9 toolbar: 'Word\'тан өстәү'
10} );
diff --git a/sources/plugins/pastefromword/lang/ug.js b/sources/plugins/pastefromword/lang/ug.js
new file mode 100644
index 00000000..8285b371
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/ug.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'ug', {
6 confirmCleanup: 'سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟',
7 error: 'ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ',
8 title: 'MS Word تىن چاپلا',
9 toolbar: 'MS Word تىن چاپلا'
10} );
diff --git a/sources/plugins/pastefromword/lang/uk.js b/sources/plugins/pastefromword/lang/uk.js
new file mode 100644
index 00000000..ff3fe230
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/uk.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'uk', {
6 confirmCleanup: 'Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?',
7 error: 'Неможливо очистити форматування через внутрішню помилку.',
8 title: 'Вставити з Word',
9 toolbar: 'Вставити з Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/vi.js b/sources/plugins/pastefromword/lang/vi.js
new file mode 100644
index 00000000..e967297f
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/vi.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'vi', {
6 confirmCleanup: 'Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?',
7 error: 'Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ',
8 title: 'Dán với định dạng Word',
9 toolbar: 'Dán với định dạng Word'
10} );
diff --git a/sources/plugins/pastefromword/lang/zh-cn.js b/sources/plugins/pastefromword/lang/zh-cn.js
new file mode 100644
index 00000000..f9e1a952
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/zh-cn.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'zh-cn', {
6 confirmCleanup: '您要粘贴的内容好像是来自 MS Word,是否要清除 MS Word 格式后再粘贴?',
7 error: '由于内部错误无法清理要粘贴的数据',
8 title: '从 MS Word 粘贴',
9 toolbar: '从 MS Word 粘贴'
10} );
diff --git a/sources/plugins/pastefromword/lang/zh.js b/sources/plugins/pastefromword/lang/zh.js
new file mode 100644
index 00000000..fc460ba6
--- /dev/null
+++ b/sources/plugins/pastefromword/lang/zh.js
@@ -0,0 +1,10 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastefromword', 'zh', {
6 confirmCleanup: '您想貼上的文字似乎是自 Word 複製而來,請問您是否要先清除 Word 的格式後再行貼上?',
7 error: '由於發生內部錯誤,無法清除清除 Word 的格式。',
8 title: '自 Word 貼上',
9 toolbar: '自 Word 貼上'
10} );
diff --git a/sources/plugins/pastefromword/plugin.js b/sources/plugins/pastefromword/plugin.js
new file mode 100644
index 00000000..3bc93798
--- /dev/null
+++ b/sources/plugins/pastefromword/plugin.js
@@ -0,0 +1,149 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 CKEDITOR.plugins.add( 'pastefromword', {
8 requires: 'clipboard',
9 // jscs:disable maximumLineLength
10 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
11 // jscs:enable maximumLineLength
12 icons: 'pastefromword,pastefromword-rtl', // %REMOVE_LINE_CORE%
13 hidpi: true, // %REMOVE_LINE_CORE%
14 init: function( editor ) {
15 var commandName = 'pastefromword',
16 // Flag indicate this command is actually been asked instead of a generic pasting.
17 forceFromWord = 0,
18 path = this.path;
19
20 editor.addCommand( commandName, {
21 // Snapshots are done manually by editable.insertXXX methods.
22 canUndo: false,
23 async: true,
24
25 exec: function( editor ) {
26 var cmd = this;
27
28 forceFromWord = 1;
29 // Force html mode for incomming paste events sequence.
30 editor.once( 'beforePaste', forceHtmlMode );
31
32 editor.getClipboardData( { title: editor.lang.pastefromword.title }, function( data ) {
33 // Do not use editor#paste, because it would start from beforePaste event.
34 data && editor.fire( 'paste', {
35 type: 'html',
36 dataValue: data.dataValue,
37 method: 'paste',
38 dataTransfer: CKEDITOR.plugins.clipboard.initPasteDataTransfer()
39 } );
40
41 editor.fire( 'afterCommandExec', {
42 name: commandName,
43 command: cmd,
44 returnValue: !!data
45 } );
46 } );
47 }
48 } );
49
50 // Register the toolbar button.
51 editor.ui.addButton && editor.ui.addButton( 'PasteFromWord', {
52 label: editor.lang.pastefromword.toolbar,
53 command: commandName,
54 toolbar: 'clipboard,50'
55 } );
56
57 editor.on( 'pasteState', function( evt ) {
58 editor.getCommand( commandName ).setState( evt.data );
59 } );
60
61 // Features bring by this command beside the normal process:
62 // 1. No more bothering of user about the clean-up.
63 // 2. Perform the clean-up even if content is not from MS-Word.
64 // (e.g. from a MS-Word similar application.)
65 // 3. Listen with high priority (3), so clean up is done before content
66 // type sniffing (priority = 6).
67 editor.on( 'paste', function( evt ) {
68 var data = evt.data,
69 mswordHtml = data.dataValue;
70
71 // MS-WORD format sniffing.
72 if ( mswordHtml && ( forceFromWord || ( /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/ ).test( mswordHtml ) ) ) {
73 // Do not apply paste filter to data filtered by the Word filter (#13093).
74 data.dontFilter = true;
75
76 // If filter rules aren't loaded then cancel 'paste' event,
77 // load them and when they'll get loaded fire new paste event
78 // for which data will be filtered in second execution of
79 // this listener.
80 var isLazyLoad = loadFilterRules( editor, path, function() {
81 // Event continuation with the original data.
82 if ( isLazyLoad )
83 editor.fire( 'paste', data );
84 else if ( !editor.config.pasteFromWordPromptCleanup || ( forceFromWord || confirm( editor.lang.pastefromword.confirmCleanup ) ) ) // jshint ignore:line
85 data.dataValue = CKEDITOR.cleanWord( mswordHtml, editor );
86
87 // Reset forceFromWord.
88 forceFromWord = 0;
89 } );
90
91 // The cleanup rules are to be loaded, we should just cancel
92 // this event.
93 isLazyLoad && evt.cancel();
94 }
95 }, null, null, 3 );
96 }
97
98 } );
99
100 function loadFilterRules( editor, path, callback ) {
101 var isLoaded = CKEDITOR.cleanWord;
102
103 if ( isLoaded )
104 callback();
105 else {
106 var filterFilePath = CKEDITOR.getUrl( editor.config.pasteFromWordCleanupFile || ( path + 'filter/default.js' ) );
107
108 // Load with busy indicator.
109 CKEDITOR.scriptLoader.load( filterFilePath, callback, null, true );
110 }
111
112 return !isLoaded;
113 }
114
115 function forceHtmlMode( evt ) {
116 evt.data.type = 'html';
117 }
118} )();
119
120
121/**
122 * Whether to prompt the user about the clean up of content being pasted from MS Word.
123 *
124 * config.pasteFromWordPromptCleanup = true;
125 *
126 * @since 3.1
127 * @cfg {Boolean} [pasteFromWordPromptCleanup=false]
128 * @member CKEDITOR.config
129 */
130
131/**
132 * The file that provides the MS Word cleanup function for pasting operations.
133 *
134 * **Note:** This is a global configuration shared by all editor instances present
135 * in the page.
136 *
137 * // Load from 'pastefromword' plugin 'filter' sub folder (custom.js file) using path relative to CKEditor installation folder.
138 * CKEDITOR.config.pasteFromWordCleanupFile = 'plugins/pastefromword/filter/custom.js';
139 *
140 * // Load from 'pastefromword' plugin 'filter' sub folder (custom.js file) using full path (including CKEditor installation folder).
141 * CKEDITOR.config.pasteFromWordCleanupFile = '/ckeditor/plugins/pastefromword/filter/custom.js';
142 *
143 * // Load custom.js file from 'customFilerts' folder (located in server's root) using full URL.
144 * CKEDITOR.config.pasteFromWordCleanupFile = 'http://my.example.com/customFilerts/custom.js';
145 *
146 * @since 3.1
147 * @cfg {String} [pasteFromWordCleanupFile=<plugin path> + 'filter/default.js']
148 * @member CKEDITOR.config
149 */
diff --git a/sources/plugins/pastetext/icons/hidpi/pastetext-rtl.png b/sources/plugins/pastetext/icons/hidpi/pastetext-rtl.png
new file mode 100644
index 00000000..35354a5f
--- /dev/null
+++ b/sources/plugins/pastetext/icons/hidpi/pastetext-rtl.png
Binary files differ
diff --git a/sources/plugins/pastetext/icons/hidpi/pastetext.png b/sources/plugins/pastetext/icons/hidpi/pastetext.png
new file mode 100644
index 00000000..f82900fa
--- /dev/null
+++ b/sources/plugins/pastetext/icons/hidpi/pastetext.png
Binary files differ
diff --git a/sources/plugins/pastetext/icons/pastetext-rtl.png b/sources/plugins/pastetext/icons/pastetext-rtl.png
new file mode 100644
index 00000000..9393b347
--- /dev/null
+++ b/sources/plugins/pastetext/icons/pastetext-rtl.png
Binary files differ
diff --git a/sources/plugins/pastetext/icons/pastetext.png b/sources/plugins/pastetext/icons/pastetext.png
new file mode 100644
index 00000000..20816a4f
--- /dev/null
+++ b/sources/plugins/pastetext/icons/pastetext.png
Binary files differ
diff --git a/sources/plugins/pastetext/lang/af.js b/sources/plugins/pastetext/lang/af.js
new file mode 100644
index 00000000..d917fa32
--- /dev/null
+++ b/sources/plugins/pastetext/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'af', {
6 button: 'Plak as eenvoudige teks',
7 title: 'Plak as eenvoudige teks'
8} );
diff --git a/sources/plugins/pastetext/lang/ar.js b/sources/plugins/pastetext/lang/ar.js
new file mode 100644
index 00000000..ff5627f4
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ar', {
6 button: 'لصق كنص بسيط',
7 title: 'لصق كنص بسيط'
8} );
diff --git a/sources/plugins/pastetext/lang/bg.js b/sources/plugins/pastetext/lang/bg.js
new file mode 100644
index 00000000..5ff58b77
--- /dev/null
+++ b/sources/plugins/pastetext/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'bg', {
6 button: 'Вмъкни като чист текст',
7 title: 'Вмъкни като чист текст'
8} );
diff --git a/sources/plugins/pastetext/lang/bn.js b/sources/plugins/pastetext/lang/bn.js
new file mode 100644
index 00000000..3d1098ef
--- /dev/null
+++ b/sources/plugins/pastetext/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'bn', {
6 button: 'সাদা টেক্সট হিসেবে পেস্ট কর',
7 title: 'সাদা টেক্সট হিসেবে পেস্ট কর'
8} );
diff --git a/sources/plugins/pastetext/lang/bs.js b/sources/plugins/pastetext/lang/bs.js
new file mode 100644
index 00000000..c466d309
--- /dev/null
+++ b/sources/plugins/pastetext/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'bs', {
6 button: 'Zalijepi kao obièan tekst',
7 title: 'Zalijepi kao obièan tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/ca.js b/sources/plugins/pastetext/lang/ca.js
new file mode 100644
index 00000000..2aa68fa8
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ca', {
6 button: 'Enganxa com a text no formatat',
7 title: 'Enganxa com a text no formatat'
8} );
diff --git a/sources/plugins/pastetext/lang/cs.js b/sources/plugins/pastetext/lang/cs.js
new file mode 100644
index 00000000..99c40827
--- /dev/null
+++ b/sources/plugins/pastetext/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'cs', {
6 button: 'Vložit jako čistý text',
7 title: 'Vložit jako čistý text'
8} );
diff --git a/sources/plugins/pastetext/lang/cy.js b/sources/plugins/pastetext/lang/cy.js
new file mode 100644
index 00000000..82047b61
--- /dev/null
+++ b/sources/plugins/pastetext/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'cy', {
6 button: 'Gludo fel testun plaen',
7 title: 'Gludo fel Testun Plaen'
8} );
diff --git a/sources/plugins/pastetext/lang/da.js b/sources/plugins/pastetext/lang/da.js
new file mode 100644
index 00000000..11e2b974
--- /dev/null
+++ b/sources/plugins/pastetext/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'da', {
6 button: 'Indsæt som ikke-formateret tekst',
7 title: 'Indsæt som ikke-formateret tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/de.js b/sources/plugins/pastetext/lang/de.js
new file mode 100644
index 00000000..40045c4b
--- /dev/null
+++ b/sources/plugins/pastetext/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'de', {
6 button: 'Als Klartext einfügen',
7 title: 'Als Klartext einfügen'
8} );
diff --git a/sources/plugins/pastetext/lang/el.js b/sources/plugins/pastetext/lang/el.js
new file mode 100644
index 00000000..48bc65f6
--- /dev/null
+++ b/sources/plugins/pastetext/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'el', {
6 button: 'Επικόλληση ως απλό κείμενο',
7 title: 'Επικόλληση ως απλό κείμενο'
8} );
diff --git a/sources/plugins/pastetext/lang/en-au.js b/sources/plugins/pastetext/lang/en-au.js
new file mode 100644
index 00000000..8818ccea
--- /dev/null
+++ b/sources/plugins/pastetext/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'en-au', {
6 button: 'Paste as plain text',
7 title: 'Paste as Plain Text'
8} );
diff --git a/sources/plugins/pastetext/lang/en-ca.js b/sources/plugins/pastetext/lang/en-ca.js
new file mode 100644
index 00000000..410af417
--- /dev/null
+++ b/sources/plugins/pastetext/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'en-ca', {
6 button: 'Paste as plain text',
7 title: 'Paste as Plain Text'
8} );
diff --git a/sources/plugins/pastetext/lang/en-gb.js b/sources/plugins/pastetext/lang/en-gb.js
new file mode 100644
index 00000000..40767086
--- /dev/null
+++ b/sources/plugins/pastetext/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'en-gb', {
6 button: 'Paste as plain text',
7 title: 'Paste as Plain Text'
8} );
diff --git a/sources/plugins/pastetext/lang/en.js b/sources/plugins/pastetext/lang/en.js
new file mode 100644
index 00000000..f79eefea
--- /dev/null
+++ b/sources/plugins/pastetext/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'en', {
6 button: 'Paste as plain text',
7 title: 'Paste as Plain Text'
8} );
diff --git a/sources/plugins/pastetext/lang/eo.js b/sources/plugins/pastetext/lang/eo.js
new file mode 100644
index 00000000..9b51ba0e
--- /dev/null
+++ b/sources/plugins/pastetext/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'eo', {
6 button: 'Interglui kiel platan tekston',
7 title: 'Interglui kiel platan tekston'
8} );
diff --git a/sources/plugins/pastetext/lang/es.js b/sources/plugins/pastetext/lang/es.js
new file mode 100644
index 00000000..e8e189c6
--- /dev/null
+++ b/sources/plugins/pastetext/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'es', {
6 button: 'Pegar como Texto Plano',
7 title: 'Pegar como Texto Plano'
8} );
diff --git a/sources/plugins/pastetext/lang/et.js b/sources/plugins/pastetext/lang/et.js
new file mode 100644
index 00000000..f849310d
--- /dev/null
+++ b/sources/plugins/pastetext/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'et', {
6 button: 'Asetamine tavalise tekstina',
7 title: 'Asetamine tavalise tekstina'
8} );
diff --git a/sources/plugins/pastetext/lang/eu.js b/sources/plugins/pastetext/lang/eu.js
new file mode 100644
index 00000000..6fee40ff
--- /dev/null
+++ b/sources/plugins/pastetext/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'eu', {
6 button: 'Itsatsi testu arrunta bezala',
7 title: 'Itsatsi testu arrunta bezala'
8} );
diff --git a/sources/plugins/pastetext/lang/fa.js b/sources/plugins/pastetext/lang/fa.js
new file mode 100644
index 00000000..366087ab
--- /dev/null
+++ b/sources/plugins/pastetext/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'fa', {
6 button: 'چسباندن به عنوان متن ساده',
7 title: 'چسباندن به عنوان متن ساده'
8} );
diff --git a/sources/plugins/pastetext/lang/fi.js b/sources/plugins/pastetext/lang/fi.js
new file mode 100644
index 00000000..7e9b6ce1
--- /dev/null
+++ b/sources/plugins/pastetext/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'fi', {
6 button: 'Liitä tekstinä',
7 title: 'Liitä tekstinä'
8} );
diff --git a/sources/plugins/pastetext/lang/fo.js b/sources/plugins/pastetext/lang/fo.js
new file mode 100644
index 00000000..f40f3690
--- /dev/null
+++ b/sources/plugins/pastetext/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'fo', {
6 button: 'Innrita som reinan tekst',
7 title: 'Innrita som reinan tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/fr-ca.js b/sources/plugins/pastetext/lang/fr-ca.js
new file mode 100644
index 00000000..26fe8368
--- /dev/null
+++ b/sources/plugins/pastetext/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'fr-ca', {
6 button: 'Coller comme texte',
7 title: 'Coller comme texte'
8} );
diff --git a/sources/plugins/pastetext/lang/fr.js b/sources/plugins/pastetext/lang/fr.js
new file mode 100644
index 00000000..d7472a08
--- /dev/null
+++ b/sources/plugins/pastetext/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'fr', {
6 button: 'Coller comme texte sans mise en forme',
7 title: 'Coller comme texte sans mise en forme'
8} );
diff --git a/sources/plugins/pastetext/lang/gl.js b/sources/plugins/pastetext/lang/gl.js
new file mode 100644
index 00000000..4440f7c6
--- /dev/null
+++ b/sources/plugins/pastetext/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'gl', {
6 button: 'Pegar como texto simple',
7 title: 'Pegar como texto simple'
8} );
diff --git a/sources/plugins/pastetext/lang/gu.js b/sources/plugins/pastetext/lang/gu.js
new file mode 100644
index 00000000..b50fd31e
--- /dev/null
+++ b/sources/plugins/pastetext/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'gu', {
6 button: 'પેસ્ટ (ટેક્સ્ટ)',
7 title: 'પેસ્ટ (ટેક્સ્ટ)'
8} );
diff --git a/sources/plugins/pastetext/lang/he.js b/sources/plugins/pastetext/lang/he.js
new file mode 100644
index 00000000..c9f1996f
--- /dev/null
+++ b/sources/plugins/pastetext/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'he', {
6 button: 'הדבקה כטקסט פשוט',
7 title: 'הדבקה כטקסט פשוט'
8} );
diff --git a/sources/plugins/pastetext/lang/hi.js b/sources/plugins/pastetext/lang/hi.js
new file mode 100644
index 00000000..bcada839
--- /dev/null
+++ b/sources/plugins/pastetext/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'hi', {
6 button: 'पेस्ट (सादा टॅक्स्ट)',
7 title: 'पेस्ट (सादा टॅक्स्ट)'
8} );
diff --git a/sources/plugins/pastetext/lang/hr.js b/sources/plugins/pastetext/lang/hr.js
new file mode 100644
index 00000000..40d02a8f
--- /dev/null
+++ b/sources/plugins/pastetext/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'hr', {
6 button: 'Zalijepi kao čisti tekst',
7 title: 'Zalijepi kao čisti tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/hu.js b/sources/plugins/pastetext/lang/hu.js
new file mode 100644
index 00000000..26293b4f
--- /dev/null
+++ b/sources/plugins/pastetext/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'hu', {
6 button: 'Beillesztés formázatlan szövegként',
7 title: 'Beillesztés formázatlan szövegként'
8} );
diff --git a/sources/plugins/pastetext/lang/id.js b/sources/plugins/pastetext/lang/id.js
new file mode 100644
index 00000000..6469321b
--- /dev/null
+++ b/sources/plugins/pastetext/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'id', {
6 button: 'Tempel sebagai teks polos',
7 title: 'Tempel sebagai Teks Polos'
8} );
diff --git a/sources/plugins/pastetext/lang/is.js b/sources/plugins/pastetext/lang/is.js
new file mode 100644
index 00000000..8f4d4c19
--- /dev/null
+++ b/sources/plugins/pastetext/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'is', {
6 button: 'Líma sem ósniðinn texta',
7 title: 'Líma sem ósniðinn texta'
8} );
diff --git a/sources/plugins/pastetext/lang/it.js b/sources/plugins/pastetext/lang/it.js
new file mode 100644
index 00000000..f266c9eb
--- /dev/null
+++ b/sources/plugins/pastetext/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'it', {
6 button: 'Incolla come testo semplice',
7 title: 'Incolla come testo semplice'
8} );
diff --git a/sources/plugins/pastetext/lang/ja.js b/sources/plugins/pastetext/lang/ja.js
new file mode 100644
index 00000000..0f470c4f
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ja', {
6 button: 'プレーンテキストとして貼り付け',
7 title: 'プレーンテキストとして貼り付け'
8} );
diff --git a/sources/plugins/pastetext/lang/ka.js b/sources/plugins/pastetext/lang/ka.js
new file mode 100644
index 00000000..5177458e
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ka', {
6 button: 'მხოლოდ ტექსტის ჩასმა',
7 title: 'მხოლოდ ტექსტის ჩასმა'
8} );
diff --git a/sources/plugins/pastetext/lang/km.js b/sources/plugins/pastetext/lang/km.js
new file mode 100644
index 00000000..529fd92a
--- /dev/null
+++ b/sources/plugins/pastetext/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'km', {
6 button: 'បិទ​ភ្ជាប់​ជា​អត្ថបទ​ធម្មតា',
7 title: 'បិទ​ភ្ជាប់​ជា​អត្ថបទ​ធម្មតា'
8} );
diff --git a/sources/plugins/pastetext/lang/ko.js b/sources/plugins/pastetext/lang/ko.js
new file mode 100644
index 00000000..ba79a8a7
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ko', {
6 button: '텍스트로 붙여넣기',
7 title: '텍스트로 붙여넣기'
8} );
diff --git a/sources/plugins/pastetext/lang/ku.js b/sources/plugins/pastetext/lang/ku.js
new file mode 100644
index 00000000..98f464ea
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ku', {
6 button: 'لکاندنی وەك دەقی ڕوون',
7 title: 'لکاندنی وەك دەقی ڕوون'
8} );
diff --git a/sources/plugins/pastetext/lang/lt.js b/sources/plugins/pastetext/lang/lt.js
new file mode 100644
index 00000000..71b8b388
--- /dev/null
+++ b/sources/plugins/pastetext/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'lt', {
6 button: 'Įdėti kaip gryną tekstą',
7 title: 'Įdėti kaip gryną tekstą'
8} );
diff --git a/sources/plugins/pastetext/lang/lv.js b/sources/plugins/pastetext/lang/lv.js
new file mode 100644
index 00000000..392d71a9
--- /dev/null
+++ b/sources/plugins/pastetext/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'lv', {
6 button: 'Ievietot kā vienkāršu tekstu',
7 title: 'Ievietot kā vienkāršu tekstu'
8} );
diff --git a/sources/plugins/pastetext/lang/mk.js b/sources/plugins/pastetext/lang/mk.js
new file mode 100644
index 00000000..6c3b171c
--- /dev/null
+++ b/sources/plugins/pastetext/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'mk', {
6 button: 'Paste as plain text', // MISSING
7 title: 'Paste as Plain Text' // MISSING
8} );
diff --git a/sources/plugins/pastetext/lang/mn.js b/sources/plugins/pastetext/lang/mn.js
new file mode 100644
index 00000000..d8ee0ef7
--- /dev/null
+++ b/sources/plugins/pastetext/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'mn', {
6 button: 'Энгийн бичвэрээр буулгах',
7 title: 'Энгийн бичвэрээр буулгах'
8} );
diff --git a/sources/plugins/pastetext/lang/ms.js b/sources/plugins/pastetext/lang/ms.js
new file mode 100644
index 00000000..02310e5d
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ms', {
6 button: 'Tampal sebagai text biasa',
7 title: 'Tampal sebagai text biasa'
8} );
diff --git a/sources/plugins/pastetext/lang/nb.js b/sources/plugins/pastetext/lang/nb.js
new file mode 100644
index 00000000..0bea7da8
--- /dev/null
+++ b/sources/plugins/pastetext/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'nb', {
6 button: 'Lim inn som ren tekst',
7 title: 'Lim inn som ren tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/nl.js b/sources/plugins/pastetext/lang/nl.js
new file mode 100644
index 00000000..13891bac
--- /dev/null
+++ b/sources/plugins/pastetext/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'nl', {
6 button: 'Plakken als platte tekst',
7 title: 'Plakken als platte tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/no.js b/sources/plugins/pastetext/lang/no.js
new file mode 100644
index 00000000..80423925
--- /dev/null
+++ b/sources/plugins/pastetext/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'no', {
6 button: 'Lim inn som ren tekst',
7 title: 'Lim inn som ren tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/pl.js b/sources/plugins/pastetext/lang/pl.js
new file mode 100644
index 00000000..68ada7cc
--- /dev/null
+++ b/sources/plugins/pastetext/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'pl', {
6 button: 'Wklej jako czysty tekst',
7 title: 'Wklej jako czysty tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/pt-br.js b/sources/plugins/pastetext/lang/pt-br.js
new file mode 100644
index 00000000..27234104
--- /dev/null
+++ b/sources/plugins/pastetext/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'pt-br', {
6 button: 'Colar como Texto sem Formatação',
7 title: 'Colar como Texto sem Formatação'
8} );
diff --git a/sources/plugins/pastetext/lang/pt.js b/sources/plugins/pastetext/lang/pt.js
new file mode 100644
index 00000000..edcbd524
--- /dev/null
+++ b/sources/plugins/pastetext/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'pt', {
6 button: 'Colar como Texto Simples',
7 title: 'Colar como Texto Simples'
8} );
diff --git a/sources/plugins/pastetext/lang/ro.js b/sources/plugins/pastetext/lang/ro.js
new file mode 100644
index 00000000..818838a6
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ro', {
6 button: 'Adaugă ca text simplu (Plain Text)',
7 title: 'Adaugă ca text simplu (Plain Text)'
8} );
diff --git a/sources/plugins/pastetext/lang/ru.js b/sources/plugins/pastetext/lang/ru.js
new file mode 100644
index 00000000..ea9061f0
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ru', {
6 button: 'Вставить только текст',
7 title: 'Вставить только текст'
8} );
diff --git a/sources/plugins/pastetext/lang/si.js b/sources/plugins/pastetext/lang/si.js
new file mode 100644
index 00000000..4a338f9a
--- /dev/null
+++ b/sources/plugins/pastetext/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'si', {
6 button: 'සාමාන්‍ය අක්ෂර ලෙස අලවන්න',
7 title: 'සාමාන්‍ය අක්ෂර ලෙස අලවන්න'
8} );
diff --git a/sources/plugins/pastetext/lang/sk.js b/sources/plugins/pastetext/lang/sk.js
new file mode 100644
index 00000000..38912c79
--- /dev/null
+++ b/sources/plugins/pastetext/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'sk', {
6 button: 'Vložiť ako čistý text',
7 title: 'Vložiť ako čistý text'
8} );
diff --git a/sources/plugins/pastetext/lang/sl.js b/sources/plugins/pastetext/lang/sl.js
new file mode 100644
index 00000000..0673e4ff
--- /dev/null
+++ b/sources/plugins/pastetext/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'sl', {
6 button: 'Prilepi kot golo besedilo',
7 title: 'Prilepi kot golo besedilo'
8} );
diff --git a/sources/plugins/pastetext/lang/sq.js b/sources/plugins/pastetext/lang/sq.js
new file mode 100644
index 00000000..93234684
--- /dev/null
+++ b/sources/plugins/pastetext/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'sq', {
6 button: 'Hidhe si tekst të thjeshtë',
7 title: 'Hidhe si Tekst të Thjeshtë'
8} );
diff --git a/sources/plugins/pastetext/lang/sr-latn.js b/sources/plugins/pastetext/lang/sr-latn.js
new file mode 100644
index 00000000..7fb5f5e7
--- /dev/null
+++ b/sources/plugins/pastetext/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'sr-latn', {
6 button: 'Zalepi kao čist tekst',
7 title: 'Zalepi kao čist tekst'
8} );
diff --git a/sources/plugins/pastetext/lang/sr.js b/sources/plugins/pastetext/lang/sr.js
new file mode 100644
index 00000000..bc22aca3
--- /dev/null
+++ b/sources/plugins/pastetext/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'sr', {
6 button: 'Залепи као чист текст',
7 title: 'Залепи као чист текст'
8} );
diff --git a/sources/plugins/pastetext/lang/sv.js b/sources/plugins/pastetext/lang/sv.js
new file mode 100644
index 00000000..28a0233c
--- /dev/null
+++ b/sources/plugins/pastetext/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'sv', {
6 button: 'Klistra in som vanlig text',
7 title: 'Klistra in som vanlig text'
8} );
diff --git a/sources/plugins/pastetext/lang/th.js b/sources/plugins/pastetext/lang/th.js
new file mode 100644
index 00000000..90d3389e
--- /dev/null
+++ b/sources/plugins/pastetext/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'th', {
6 button: 'วางแบบตัวอักษรธรรมดา',
7 title: 'วางแบบตัวอักษรธรรมดา'
8} );
diff --git a/sources/plugins/pastetext/lang/tr.js b/sources/plugins/pastetext/lang/tr.js
new file mode 100644
index 00000000..ee134d81
--- /dev/null
+++ b/sources/plugins/pastetext/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'tr', {
6 button: 'Düz Metin Olarak Yapıştır',
7 title: 'Düz Metin Olarak Yapıştır'
8} );
diff --git a/sources/plugins/pastetext/lang/tt.js b/sources/plugins/pastetext/lang/tt.js
new file mode 100644
index 00000000..cbd60c42
--- /dev/null
+++ b/sources/plugins/pastetext/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'tt', {
6 button: 'Форматлаусыз текст өстәү',
7 title: 'Форматлаусыз текст өстәү'
8} );
diff --git a/sources/plugins/pastetext/lang/ug.js b/sources/plugins/pastetext/lang/ug.js
new file mode 100644
index 00000000..e774edd4
--- /dev/null
+++ b/sources/plugins/pastetext/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'ug', {
6 button: 'پىچىمى يوق تېكىست سۈپىتىدە چاپلا',
7 title: 'پىچىمى يوق تېكىست سۈپىتىدە چاپلا'
8} );
diff --git a/sources/plugins/pastetext/lang/uk.js b/sources/plugins/pastetext/lang/uk.js
new file mode 100644
index 00000000..59653aac
--- /dev/null
+++ b/sources/plugins/pastetext/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'uk', {
6 button: 'Вставити тільки текст',
7 title: 'Вставити тільки текст'
8} );
diff --git a/sources/plugins/pastetext/lang/vi.js b/sources/plugins/pastetext/lang/vi.js
new file mode 100644
index 00000000..cd94e29e
--- /dev/null
+++ b/sources/plugins/pastetext/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'vi', {
6 button: 'Dán theo định dạng văn bản thuần',
7 title: 'Dán theo định dạng văn bản thuần'
8} );
diff --git a/sources/plugins/pastetext/lang/zh-cn.js b/sources/plugins/pastetext/lang/zh-cn.js
new file mode 100644
index 00000000..42f97ed7
--- /dev/null
+++ b/sources/plugins/pastetext/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'zh-cn', {
6 button: '粘贴为无格式文本',
7 title: '粘贴为无格式文本'
8} );
diff --git a/sources/plugins/pastetext/lang/zh.js b/sources/plugins/pastetext/lang/zh.js
new file mode 100644
index 00000000..8c524d6b
--- /dev/null
+++ b/sources/plugins/pastetext/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'pastetext', 'zh', {
6 button: '貼成純文字',
7 title: '貼成純文字'
8} );
diff --git a/sources/plugins/pastetext/plugin.js b/sources/plugins/pastetext/plugin.js
new file mode 100644
index 00000000..0c410e31
--- /dev/null
+++ b/sources/plugins/pastetext/plugin.js
@@ -0,0 +1,83 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Paste as plain text plugin.
8 */
9
10( function() {
11 // The pastetext command definition.
12 var pasteTextCmd = {
13 // Snapshots are done manually by editable.insertXXX methods.
14 canUndo: false,
15 async: true,
16
17 exec: function( editor ) {
18 editor.getClipboardData( { title: editor.lang.pastetext.title }, function( data ) {
19 // Do not use editor#paste, because it would start from beforePaste event.
20 data && editor.fire( 'paste', {
21 type: 'text',
22 dataValue: data.dataValue,
23 method: 'paste',
24 dataTransfer: CKEDITOR.plugins.clipboard.initPasteDataTransfer()
25 } );
26
27 editor.fire( 'afterCommandExec', {
28 name: 'pastetext',
29 command: pasteTextCmd,
30 returnValue: !!data
31 } );
32 } );
33 }
34 };
35
36 // Register the plugin.
37 CKEDITOR.plugins.add( 'pastetext', {
38 requires: 'clipboard',
39 // jscs:disable maximumLineLength
40 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
41 // jscs:enable maximumLineLength
42 icons: 'pastetext,pastetext-rtl', // %REMOVE_LINE_CORE%
43 hidpi: true, // %REMOVE_LINE_CORE%
44 init: function( editor ) {
45 var commandName = 'pastetext';
46
47 editor.addCommand( commandName, pasteTextCmd );
48
49 editor.ui.addButton && editor.ui.addButton( 'PasteText', {
50 label: editor.lang.pastetext.button,
51 command: commandName,
52 toolbar: 'clipboard,40'
53 } );
54
55 if ( editor.config.forcePasteAsPlainText ) {
56 editor.on( 'beforePaste', function( evt ) {
57 // Do NOT overwrite if HTML format is explicitly requested.
58 // This allows pastefromword dominates over pastetext.
59 if ( evt.data.type != 'html' )
60 evt.data.type = 'text';
61 } );
62 }
63
64 editor.on( 'pasteState', function( evt ) {
65 editor.getCommand( commandName ).setState( evt.data );
66 } );
67 }
68 } );
69} )();
70
71
72/**
73 * Whether to force all pasting operations to insert on plain text into the
74 * editor, loosing any formatting information possibly available in the source
75 * text.
76 *
77 * **Note:** paste from word (dialog) is not affected by this configuration.
78 *
79 * config.forcePasteAsPlainText = true;
80 *
81 * @cfg {Boolean} [forcePasteAsPlainText=false]
82 * @member CKEDITOR.config
83 */
diff --git a/sources/plugins/popup/plugin.js b/sources/plugins/popup/plugin.js
new file mode 100644
index 00000000..8cfe1848
--- /dev/null
+++ b/sources/plugins/popup/plugin.js
@@ -0,0 +1,65 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'popup' );
7
8CKEDITOR.tools.extend( CKEDITOR.editor.prototype, {
9 /**
10 * Opens Browser in a popup. The `width` and `height` parameters accept
11 * numbers (pixels) or percent (of screen size) values.
12 *
13 * @member CKEDITOR.editor
14 * @param {String} url The url of the external file browser.
15 * @param {Number/String} [width='80%'] Popup window width.
16 * @param {Number/String} [height='70%'] Popup window height.
17 * @param {String} [options='location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes']
18 * Popup window features.
19 */
20 popup: function( url, width, height, options ) {
21 width = width || '80%';
22 height = height || '70%';
23
24 if ( typeof width == 'string' && width.length > 1 && width.substr( width.length - 1, 1 ) == '%' )
25 width = parseInt( window.screen.width * parseInt( width, 10 ) / 100, 10 );
26
27 if ( typeof height == 'string' && height.length > 1 && height.substr( height.length - 1, 1 ) == '%' )
28 height = parseInt( window.screen.height * parseInt( height, 10 ) / 100, 10 );
29
30 if ( width < 640 )
31 width = 640;
32
33 if ( height < 420 )
34 height = 420;
35
36 var top = parseInt( ( window.screen.height - height ) / 2, 10 ),
37 left = parseInt( ( window.screen.width - width ) / 2, 10 );
38
39 options = ( options || 'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes' ) + ',width=' + width +
40 ',height=' + height +
41 ',top=' + top +
42 ',left=' + left;
43
44 var popupWindow = window.open( '', null, options, true );
45
46 // Blocked by a popup blocker.
47 if ( !popupWindow )
48 return false;
49
50 try {
51 // Chrome is problematic with moveTo/resizeTo, but it's not really needed here (#8855).
52 var ua = navigator.userAgent.toLowerCase();
53 if ( ua.indexOf( ' chrome/' ) == -1 ) {
54 popupWindow.moveTo( left, top );
55 popupWindow.resizeTo( width, height );
56 }
57 popupWindow.focus();
58 popupWindow.location.href = url;
59 } catch ( e ) {
60 popupWindow = window.open( url, null, options, true );
61 }
62
63 return true;
64 }
65} );
diff --git a/sources/plugins/preview/icons/hidpi/preview-rtl.png b/sources/plugins/preview/icons/hidpi/preview-rtl.png
new file mode 100644
index 00000000..cd64e19a
--- /dev/null
+++ b/sources/plugins/preview/icons/hidpi/preview-rtl.png
Binary files differ
diff --git a/sources/plugins/preview/icons/hidpi/preview.png b/sources/plugins/preview/icons/hidpi/preview.png
new file mode 100644
index 00000000..402db20e
--- /dev/null
+++ b/sources/plugins/preview/icons/hidpi/preview.png
Binary files differ
diff --git a/sources/plugins/preview/icons/preview-rtl.png b/sources/plugins/preview/icons/preview-rtl.png
new file mode 100644
index 00000000..1c9d9787
--- /dev/null
+++ b/sources/plugins/preview/icons/preview-rtl.png
Binary files differ
diff --git a/sources/plugins/preview/icons/preview.png b/sources/plugins/preview/icons/preview.png
new file mode 100644
index 00000000..162b44b8
--- /dev/null
+++ b/sources/plugins/preview/icons/preview.png
Binary files differ
diff --git a/sources/plugins/preview/lang/af.js b/sources/plugins/preview/lang/af.js
new file mode 100644
index 00000000..c3129122
--- /dev/null
+++ b/sources/plugins/preview/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'af', {
6 preview: 'Voorbeeld'
7} );
diff --git a/sources/plugins/preview/lang/ar.js b/sources/plugins/preview/lang/ar.js
new file mode 100644
index 00000000..ff24304b
--- /dev/null
+++ b/sources/plugins/preview/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ar', {
6 preview: 'معاينة الصفحة'
7} );
diff --git a/sources/plugins/preview/lang/bg.js b/sources/plugins/preview/lang/bg.js
new file mode 100644
index 00000000..d74194d9
--- /dev/null
+++ b/sources/plugins/preview/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'bg', {
6 preview: 'Преглед'
7} );
diff --git a/sources/plugins/preview/lang/bn.js b/sources/plugins/preview/lang/bn.js
new file mode 100644
index 00000000..6b6a7a38
--- /dev/null
+++ b/sources/plugins/preview/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'bn', {
6 preview: 'প্রিভিউ'
7} );
diff --git a/sources/plugins/preview/lang/bs.js b/sources/plugins/preview/lang/bs.js
new file mode 100644
index 00000000..40f674df
--- /dev/null
+++ b/sources/plugins/preview/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'bs', {
6 preview: 'Prikaži'
7} );
diff --git a/sources/plugins/preview/lang/ca.js b/sources/plugins/preview/lang/ca.js
new file mode 100644
index 00000000..fe205416
--- /dev/null
+++ b/sources/plugins/preview/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ca', {
6 preview: 'Visualització prèvia'
7} );
diff --git a/sources/plugins/preview/lang/cs.js b/sources/plugins/preview/lang/cs.js
new file mode 100644
index 00000000..6552515a
--- /dev/null
+++ b/sources/plugins/preview/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'cs', {
6 preview: 'Náhled'
7} );
diff --git a/sources/plugins/preview/lang/cy.js b/sources/plugins/preview/lang/cy.js
new file mode 100644
index 00000000..47db9de0
--- /dev/null
+++ b/sources/plugins/preview/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'cy', {
6 preview: 'Rhagolwg'
7} );
diff --git a/sources/plugins/preview/lang/da.js b/sources/plugins/preview/lang/da.js
new file mode 100644
index 00000000..a88b1af3
--- /dev/null
+++ b/sources/plugins/preview/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'da', {
6 preview: 'Vis eksempel'
7} );
diff --git a/sources/plugins/preview/lang/de.js b/sources/plugins/preview/lang/de.js
new file mode 100644
index 00000000..be6e986c
--- /dev/null
+++ b/sources/plugins/preview/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'de', {
6 preview: 'Vorschau'
7} );
diff --git a/sources/plugins/preview/lang/el.js b/sources/plugins/preview/lang/el.js
new file mode 100644
index 00000000..51dfff2f
--- /dev/null
+++ b/sources/plugins/preview/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'el', {
6 preview: 'Προεπισκόπιση'
7} );
diff --git a/sources/plugins/preview/lang/en-au.js b/sources/plugins/preview/lang/en-au.js
new file mode 100644
index 00000000..ebaa47b2
--- /dev/null
+++ b/sources/plugins/preview/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'en-au', {
6 preview: 'Preview'
7} );
diff --git a/sources/plugins/preview/lang/en-ca.js b/sources/plugins/preview/lang/en-ca.js
new file mode 100644
index 00000000..a6a520db
--- /dev/null
+++ b/sources/plugins/preview/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'en-ca', {
6 preview: 'Preview'
7} );
diff --git a/sources/plugins/preview/lang/en-gb.js b/sources/plugins/preview/lang/en-gb.js
new file mode 100644
index 00000000..21c416d4
--- /dev/null
+++ b/sources/plugins/preview/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'en-gb', {
6 preview: 'Preview'
7} );
diff --git a/sources/plugins/preview/lang/en.js b/sources/plugins/preview/lang/en.js
new file mode 100644
index 00000000..093335a9
--- /dev/null
+++ b/sources/plugins/preview/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'en', {
6 preview: 'Preview'
7} );
diff --git a/sources/plugins/preview/lang/eo.js b/sources/plugins/preview/lang/eo.js
new file mode 100644
index 00000000..8c29fb80
--- /dev/null
+++ b/sources/plugins/preview/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'eo', {
6 preview: 'Vidigi Aspekton'
7} );
diff --git a/sources/plugins/preview/lang/es.js b/sources/plugins/preview/lang/es.js
new file mode 100644
index 00000000..5562fb8f
--- /dev/null
+++ b/sources/plugins/preview/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'es', {
6 preview: 'Vista Previa'
7} );
diff --git a/sources/plugins/preview/lang/et.js b/sources/plugins/preview/lang/et.js
new file mode 100644
index 00000000..88685f93
--- /dev/null
+++ b/sources/plugins/preview/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'et', {
6 preview: 'Eelvaade'
7} );
diff --git a/sources/plugins/preview/lang/eu.js b/sources/plugins/preview/lang/eu.js
new file mode 100644
index 00000000..683e157a
--- /dev/null
+++ b/sources/plugins/preview/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'eu', {
6 preview: 'Aurrebista'
7} );
diff --git a/sources/plugins/preview/lang/fa.js b/sources/plugins/preview/lang/fa.js
new file mode 100644
index 00000000..f3e3ce3a
--- /dev/null
+++ b/sources/plugins/preview/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'fa', {
6 preview: 'پیشنمایش'
7} );
diff --git a/sources/plugins/preview/lang/fi.js b/sources/plugins/preview/lang/fi.js
new file mode 100644
index 00000000..f8322356
--- /dev/null
+++ b/sources/plugins/preview/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'fi', {
6 preview: 'Esikatsele'
7} );
diff --git a/sources/plugins/preview/lang/fo.js b/sources/plugins/preview/lang/fo.js
new file mode 100644
index 00000000..0a364971
--- /dev/null
+++ b/sources/plugins/preview/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'fo', {
6 preview: 'Frumsýning'
7} );
diff --git a/sources/plugins/preview/lang/fr-ca.js b/sources/plugins/preview/lang/fr-ca.js
new file mode 100644
index 00000000..6e67d06a
--- /dev/null
+++ b/sources/plugins/preview/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'fr-ca', {
6 preview: 'Prévisualiser'
7} );
diff --git a/sources/plugins/preview/lang/fr.js b/sources/plugins/preview/lang/fr.js
new file mode 100644
index 00000000..fc164303
--- /dev/null
+++ b/sources/plugins/preview/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'fr', {
6 preview: 'Aperçu'
7} );
diff --git a/sources/plugins/preview/lang/gl.js b/sources/plugins/preview/lang/gl.js
new file mode 100644
index 00000000..6a446582
--- /dev/null
+++ b/sources/plugins/preview/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'gl', {
6 preview: 'Vista previa'
7} );
diff --git a/sources/plugins/preview/lang/gu.js b/sources/plugins/preview/lang/gu.js
new file mode 100644
index 00000000..c9f8906f
--- /dev/null
+++ b/sources/plugins/preview/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'gu', {
6 preview: 'પૂર્વદર્શન'
7} );
diff --git a/sources/plugins/preview/lang/he.js b/sources/plugins/preview/lang/he.js
new file mode 100644
index 00000000..792a1170
--- /dev/null
+++ b/sources/plugins/preview/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'he', {
6 preview: 'תצוגה מקדימה'
7} );
diff --git a/sources/plugins/preview/lang/hi.js b/sources/plugins/preview/lang/hi.js
new file mode 100644
index 00000000..92c7e40d
--- /dev/null
+++ b/sources/plugins/preview/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'hi', {
6 preview: 'प्रीव्यू'
7} );
diff --git a/sources/plugins/preview/lang/hr.js b/sources/plugins/preview/lang/hr.js
new file mode 100644
index 00000000..a489a418
--- /dev/null
+++ b/sources/plugins/preview/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'hr', {
6 preview: 'Pregledaj'
7} );
diff --git a/sources/plugins/preview/lang/hu.js b/sources/plugins/preview/lang/hu.js
new file mode 100644
index 00000000..8ae9d9fd
--- /dev/null
+++ b/sources/plugins/preview/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'hu', {
6 preview: 'Előnézet'
7} );
diff --git a/sources/plugins/preview/lang/id.js b/sources/plugins/preview/lang/id.js
new file mode 100644
index 00000000..88cf3620
--- /dev/null
+++ b/sources/plugins/preview/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'id', {
6 preview: 'Pratinjau'
7} );
diff --git a/sources/plugins/preview/lang/is.js b/sources/plugins/preview/lang/is.js
new file mode 100644
index 00000000..7f407390
--- /dev/null
+++ b/sources/plugins/preview/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'is', {
6 preview: 'Forskoða'
7} );
diff --git a/sources/plugins/preview/lang/it.js b/sources/plugins/preview/lang/it.js
new file mode 100644
index 00000000..f2767ba2
--- /dev/null
+++ b/sources/plugins/preview/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'it', {
6 preview: 'Anteprima'
7} );
diff --git a/sources/plugins/preview/lang/ja.js b/sources/plugins/preview/lang/ja.js
new file mode 100644
index 00000000..80eea689
--- /dev/null
+++ b/sources/plugins/preview/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ja', {
6 preview: 'プレビュー'
7} );
diff --git a/sources/plugins/preview/lang/ka.js b/sources/plugins/preview/lang/ka.js
new file mode 100644
index 00000000..d597a2c3
--- /dev/null
+++ b/sources/plugins/preview/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ka', {
6 preview: 'გადახედვა'
7} );
diff --git a/sources/plugins/preview/lang/km.js b/sources/plugins/preview/lang/km.js
new file mode 100644
index 00000000..d19f98e6
--- /dev/null
+++ b/sources/plugins/preview/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'km', {
6 preview: 'មើល​ជា​មុន'
7} );
diff --git a/sources/plugins/preview/lang/ko.js b/sources/plugins/preview/lang/ko.js
new file mode 100644
index 00000000..252a77fe
--- /dev/null
+++ b/sources/plugins/preview/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ko', {
6 preview: '미리보기'
7} );
diff --git a/sources/plugins/preview/lang/ku.js b/sources/plugins/preview/lang/ku.js
new file mode 100644
index 00000000..cf83583c
--- /dev/null
+++ b/sources/plugins/preview/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ku', {
6 preview: 'پێشبینین'
7} );
diff --git a/sources/plugins/preview/lang/lt.js b/sources/plugins/preview/lang/lt.js
new file mode 100644
index 00000000..3436bab4
--- /dev/null
+++ b/sources/plugins/preview/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'lt', {
6 preview: 'Peržiūra'
7} );
diff --git a/sources/plugins/preview/lang/lv.js b/sources/plugins/preview/lang/lv.js
new file mode 100644
index 00000000..3cdb26b0
--- /dev/null
+++ b/sources/plugins/preview/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'lv', {
6 preview: 'Priekšskatīt'
7} );
diff --git a/sources/plugins/preview/lang/mk.js b/sources/plugins/preview/lang/mk.js
new file mode 100644
index 00000000..e5478a84
--- /dev/null
+++ b/sources/plugins/preview/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'mk', {
6 preview: 'Preview' // MISSING
7} );
diff --git a/sources/plugins/preview/lang/mn.js b/sources/plugins/preview/lang/mn.js
new file mode 100644
index 00000000..2e578f1e
--- /dev/null
+++ b/sources/plugins/preview/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'mn', {
6 preview: 'Уридчлан харах'
7} );
diff --git a/sources/plugins/preview/lang/ms.js b/sources/plugins/preview/lang/ms.js
new file mode 100644
index 00000000..64db268a
--- /dev/null
+++ b/sources/plugins/preview/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ms', {
6 preview: 'Prebiu'
7} );
diff --git a/sources/plugins/preview/lang/nb.js b/sources/plugins/preview/lang/nb.js
new file mode 100644
index 00000000..ea92da7a
--- /dev/null
+++ b/sources/plugins/preview/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'nb', {
6 preview: 'Forhåndsvis'
7} );
diff --git a/sources/plugins/preview/lang/nl.js b/sources/plugins/preview/lang/nl.js
new file mode 100644
index 00000000..5db2f755
--- /dev/null
+++ b/sources/plugins/preview/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'nl', {
6 preview: 'Voorbeeld'
7} );
diff --git a/sources/plugins/preview/lang/no.js b/sources/plugins/preview/lang/no.js
new file mode 100644
index 00000000..7c6c4ce2
--- /dev/null
+++ b/sources/plugins/preview/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'no', {
6 preview: 'Forhåndsvis'
7} );
diff --git a/sources/plugins/preview/lang/pl.js b/sources/plugins/preview/lang/pl.js
new file mode 100644
index 00000000..1534907a
--- /dev/null
+++ b/sources/plugins/preview/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'pl', {
6 preview: 'Podgląd'
7} );
diff --git a/sources/plugins/preview/lang/pt-br.js b/sources/plugins/preview/lang/pt-br.js
new file mode 100644
index 00000000..0e24087d
--- /dev/null
+++ b/sources/plugins/preview/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'pt-br', {
6 preview: 'Visualizar'
7} );
diff --git a/sources/plugins/preview/lang/pt.js b/sources/plugins/preview/lang/pt.js
new file mode 100644
index 00000000..709fe77f
--- /dev/null
+++ b/sources/plugins/preview/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'pt', {
6 preview: 'Pré-visualizar'
7} );
diff --git a/sources/plugins/preview/lang/ro.js b/sources/plugins/preview/lang/ro.js
new file mode 100644
index 00000000..5e23b41e
--- /dev/null
+++ b/sources/plugins/preview/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ro', {
6 preview: 'Previzualizare'
7} );
diff --git a/sources/plugins/preview/lang/ru.js b/sources/plugins/preview/lang/ru.js
new file mode 100644
index 00000000..9e1556ef
--- /dev/null
+++ b/sources/plugins/preview/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ru', {
6 preview: 'Предварительный просмотр'
7} );
diff --git a/sources/plugins/preview/lang/si.js b/sources/plugins/preview/lang/si.js
new file mode 100644
index 00000000..c03c538e
--- /dev/null
+++ b/sources/plugins/preview/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'si', {
6 preview: 'නැවත '
7} );
diff --git a/sources/plugins/preview/lang/sk.js b/sources/plugins/preview/lang/sk.js
new file mode 100644
index 00000000..380b2364
--- /dev/null
+++ b/sources/plugins/preview/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'sk', {
6 preview: 'Náhľad'
7} );
diff --git a/sources/plugins/preview/lang/sl.js b/sources/plugins/preview/lang/sl.js
new file mode 100644
index 00000000..aeec46db
--- /dev/null
+++ b/sources/plugins/preview/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'sl', {
6 preview: 'Predogled'
7} );
diff --git a/sources/plugins/preview/lang/sq.js b/sources/plugins/preview/lang/sq.js
new file mode 100644
index 00000000..8e001b8a
--- /dev/null
+++ b/sources/plugins/preview/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'sq', {
6 preview: 'Parashiko'
7} );
diff --git a/sources/plugins/preview/lang/sr-latn.js b/sources/plugins/preview/lang/sr-latn.js
new file mode 100644
index 00000000..7338823b
--- /dev/null
+++ b/sources/plugins/preview/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'sr-latn', {
6 preview: 'Izgled stranice'
7} );
diff --git a/sources/plugins/preview/lang/sr.js b/sources/plugins/preview/lang/sr.js
new file mode 100644
index 00000000..273d4193
--- /dev/null
+++ b/sources/plugins/preview/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'sr', {
6 preview: 'Изглед странице'
7} );
diff --git a/sources/plugins/preview/lang/sv.js b/sources/plugins/preview/lang/sv.js
new file mode 100644
index 00000000..d1b34367
--- /dev/null
+++ b/sources/plugins/preview/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'sv', {
6 preview: 'Förhandsgranska'
7} );
diff --git a/sources/plugins/preview/lang/th.js b/sources/plugins/preview/lang/th.js
new file mode 100644
index 00000000..25b5b49e
--- /dev/null
+++ b/sources/plugins/preview/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'th', {
6 preview: 'ดูหน้าเอกสารตัวอย่าง'
7} );
diff --git a/sources/plugins/preview/lang/tr.js b/sources/plugins/preview/lang/tr.js
new file mode 100644
index 00000000..5f034bb4
--- /dev/null
+++ b/sources/plugins/preview/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'tr', {
6 preview: 'Ön İzleme'
7} );
diff --git a/sources/plugins/preview/lang/tt.js b/sources/plugins/preview/lang/tt.js
new file mode 100644
index 00000000..9511dbaf
--- /dev/null
+++ b/sources/plugins/preview/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'tt', {
6 preview: 'Карап алу'
7} );
diff --git a/sources/plugins/preview/lang/ug.js b/sources/plugins/preview/lang/ug.js
new file mode 100644
index 00000000..0398cd94
--- /dev/null
+++ b/sources/plugins/preview/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'ug', {
6 preview: 'ئالدىن كۆزەت'
7} );
diff --git a/sources/plugins/preview/lang/uk.js b/sources/plugins/preview/lang/uk.js
new file mode 100644
index 00000000..20b295dd
--- /dev/null
+++ b/sources/plugins/preview/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'uk', {
6 preview: 'Попередній перегляд'
7} );
diff --git a/sources/plugins/preview/lang/vi.js b/sources/plugins/preview/lang/vi.js
new file mode 100644
index 00000000..e7f3c799
--- /dev/null
+++ b/sources/plugins/preview/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'vi', {
6 preview: 'Xem trước'
7} );
diff --git a/sources/plugins/preview/lang/zh-cn.js b/sources/plugins/preview/lang/zh-cn.js
new file mode 100644
index 00000000..7a34a0d5
--- /dev/null
+++ b/sources/plugins/preview/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'zh-cn', {
6 preview: '预览'
7} );
diff --git a/sources/plugins/preview/lang/zh.js b/sources/plugins/preview/lang/zh.js
new file mode 100644
index 00000000..21f3aceb
--- /dev/null
+++ b/sources/plugins/preview/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'preview', 'zh', {
6 preview: '預覽'
7} );
diff --git a/sources/plugins/preview/plugin.js b/sources/plugins/preview/plugin.js
new file mode 100644
index 00000000..5f814995
--- /dev/null
+++ b/sources/plugins/preview/plugin.js
@@ -0,0 +1,145 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Preview plugin.
8 */
9
10( function() {
11 var pluginPath;
12
13 var previewCmd = { modes: { wysiwyg: 1, source: 1 },
14 canUndo: false,
15 readOnly: 1,
16 exec: function( editor ) {
17 var sHTML,
18 config = editor.config,
19 baseTag = config.baseHref ? '<base href="' + config.baseHref + '"/>' : '',
20 eventData;
21
22 if ( config.fullPage )
23 sHTML = editor.getData().replace( /<head>/, '$&' + baseTag ).replace( /[^>]*(?=<\/title>)/, '$& &mdash; ' + editor.lang.preview.preview );
24 else {
25 var bodyHtml = '<body ',
26 body = editor.document && editor.document.getBody();
27
28 if ( body ) {
29 if ( body.getAttribute( 'id' ) )
30 bodyHtml += 'id="' + body.getAttribute( 'id' ) + '" ';
31 if ( body.getAttribute( 'class' ) )
32 bodyHtml += 'class="' + body.getAttribute( 'class' ) + '" ';
33 }
34
35 bodyHtml += '>';
36
37 sHTML = editor.config.docType + '<html dir="' + editor.config.contentsLangDirection + '">' +
38 '<head>' +
39 baseTag +
40 '<title>' + editor.lang.preview.preview + '</title>' +
41 CKEDITOR.tools.buildStyleHtml( editor.config.contentsCss ) +
42 '</head>' + bodyHtml +
43 editor.getData() +
44 '</body></html>';
45 }
46
47 var iWidth = 640,
48 // 800 * 0.8,
49 iHeight = 420,
50 // 600 * 0.7,
51 iLeft = 80; // (800 - 0.8 * 800) /2 = 800 * 0.1.
52 try {
53 var screen = window.screen;
54 iWidth = Math.round( screen.width * 0.8 );
55 iHeight = Math.round( screen.height * 0.7 );
56 iLeft = Math.round( screen.width * 0.1 );
57 } catch ( e ) {}
58
59 // (#9907) Allow data manipulation before preview is displayed.
60 // Also don't open the preview window when event cancelled.
61 if ( editor.fire( 'contentPreview', eventData = { dataValue: sHTML } ) === false )
62 return false;
63
64 var sOpenUrl = '',
65 ieLocation;
66
67 if ( CKEDITOR.env.ie ) {
68 window._cke_htmlToLoad = eventData.dataValue;
69 ieLocation = 'javascript:void( (function(){' + // jshint ignore:line
70 'document.open();' +
71 // Support for custom document.domain.
72 // Strip comments and replace parent with window.opener in the function body.
73 ( '(' + CKEDITOR.tools.fixDomain + ')();' ).replace( /\/\/.*?\n/g, '' ).replace( /parent\./g, 'window.opener.' ) +
74 'document.write( window.opener._cke_htmlToLoad );' +
75 'document.close();' +
76 'window.opener._cke_htmlToLoad = null;' +
77 '})() )';
78 // For IE we should use window.location rather than setting url in window.open. (#11146)
79 sOpenUrl = '';
80 }
81
82 // With Firefox only, we need to open a special preview page, so
83 // anchors will work properly on it. (#9047)
84 if ( CKEDITOR.env.gecko ) {
85 window._cke_htmlToLoad = eventData.dataValue;
86 sOpenUrl = CKEDITOR.getUrl( pluginPath + 'preview.html' );
87 }
88
89 var oWindow = window.open( sOpenUrl, null, 'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=' +
90 iWidth + ',height=' + iHeight + ',left=' + iLeft );
91
92 // For IE we want to assign whole js stored in ieLocation, but in case of
93 // popup blocker activation oWindow variable will be null. (#11597)
94 if ( CKEDITOR.env.ie && oWindow )
95 oWindow.location = ieLocation;
96
97 if ( !CKEDITOR.env.ie && !CKEDITOR.env.gecko ) {
98 var doc = oWindow.document;
99 doc.open();
100 doc.write( eventData.dataValue );
101 doc.close();
102 }
103
104 return true;
105 }
106 };
107
108 var pluginName = 'preview';
109
110 // Register a plugin named "preview".
111 CKEDITOR.plugins.add( pluginName, {
112 // jscs:disable maximumLineLength
113 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
114 // jscs:enable maximumLineLength
115 icons: 'preview,preview-rtl', // %REMOVE_LINE_CORE%
116 hidpi: true, // %REMOVE_LINE_CORE%
117 init: function( editor ) {
118
119 // Preview is not used for the inline creator.
120 if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
121 return;
122
123 pluginPath = this.path;
124
125 editor.addCommand( pluginName, previewCmd );
126 editor.ui.addButton && editor.ui.addButton( 'Preview', {
127 label: editor.lang.preview.preview,
128 command: pluginName,
129 toolbar: 'document,40'
130 } );
131 }
132 } );
133} )();
134
135/**
136 * Event fired when executing `preview` command, which allows additional data manipulation.
137 * With this event, the raw HTML content of the preview window to be displayed can be altered
138 * or modified.
139 *
140 * @event contentPreview
141 * @member CKEDITOR
142 * @param {CKEDITOR.editor} editor This editor instance.
143 * @param data
144 * @param {String} data.dataValue The data that will go to the preview.
145 */
diff --git a/sources/plugins/preview/preview.html b/sources/plugins/preview/preview.html
new file mode 100644
index 00000000..8c028262
--- /dev/null
+++ b/sources/plugins/preview/preview.html
@@ -0,0 +1,13 @@
1<script>
2
3// Prevent from DOM clobbering.
4if ( typeof window.opener._cke_htmlToLoad == 'string' ) {
5 var doc = document;
6 doc.open();
7 doc.write( window.opener._cke_htmlToLoad );
8 doc.close();
9
10 delete window.opener._cke_htmlToLoad;
11}
12
13</script>
diff --git a/sources/plugins/print/icons/hidpi/print.png b/sources/plugins/print/icons/hidpi/print.png
new file mode 100644
index 00000000..4b72460d
--- /dev/null
+++ b/sources/plugins/print/icons/hidpi/print.png
Binary files differ
diff --git a/sources/plugins/print/icons/print.png b/sources/plugins/print/icons/print.png
new file mode 100644
index 00000000..06f797dc
--- /dev/null
+++ b/sources/plugins/print/icons/print.png
Binary files differ
diff --git a/sources/plugins/print/lang/af.js b/sources/plugins/print/lang/af.js
new file mode 100644
index 00000000..b6148b4a
--- /dev/null
+++ b/sources/plugins/print/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'af', {
6 toolbar: 'Druk'
7} );
diff --git a/sources/plugins/print/lang/ar.js b/sources/plugins/print/lang/ar.js
new file mode 100644
index 00000000..20a813c8
--- /dev/null
+++ b/sources/plugins/print/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ar', {
6 toolbar: 'طباعة'
7} );
diff --git a/sources/plugins/print/lang/bg.js b/sources/plugins/print/lang/bg.js
new file mode 100644
index 00000000..c6d14a58
--- /dev/null
+++ b/sources/plugins/print/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'bg', {
6 toolbar: 'Печат'
7} );
diff --git a/sources/plugins/print/lang/bn.js b/sources/plugins/print/lang/bn.js
new file mode 100644
index 00000000..7bb9a02e
--- /dev/null
+++ b/sources/plugins/print/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'bn', {
6 toolbar: 'প্রিন্ট'
7} );
diff --git a/sources/plugins/print/lang/bs.js b/sources/plugins/print/lang/bs.js
new file mode 100644
index 00000000..be3860dc
--- /dev/null
+++ b/sources/plugins/print/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'bs', {
6 toolbar: 'Štampaj'
7} );
diff --git a/sources/plugins/print/lang/ca.js b/sources/plugins/print/lang/ca.js
new file mode 100644
index 00000000..a700f02d
--- /dev/null
+++ b/sources/plugins/print/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ca', {
6 toolbar: 'Imprimeix'
7} );
diff --git a/sources/plugins/print/lang/cs.js b/sources/plugins/print/lang/cs.js
new file mode 100644
index 00000000..cf3c9772
--- /dev/null
+++ b/sources/plugins/print/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'cs', {
6 toolbar: 'Tisk'
7} );
diff --git a/sources/plugins/print/lang/cy.js b/sources/plugins/print/lang/cy.js
new file mode 100644
index 00000000..851fee9c
--- /dev/null
+++ b/sources/plugins/print/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'cy', {
6 toolbar: 'Argraffu'
7} );
diff --git a/sources/plugins/print/lang/da.js b/sources/plugins/print/lang/da.js
new file mode 100644
index 00000000..d2384c1f
--- /dev/null
+++ b/sources/plugins/print/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'da', {
6 toolbar: 'Udskriv'
7} );
diff --git a/sources/plugins/print/lang/de.js b/sources/plugins/print/lang/de.js
new file mode 100644
index 00000000..e02c544c
--- /dev/null
+++ b/sources/plugins/print/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'de', {
6 toolbar: 'Drucken'
7} );
diff --git a/sources/plugins/print/lang/el.js b/sources/plugins/print/lang/el.js
new file mode 100644
index 00000000..cb04ec2f
--- /dev/null
+++ b/sources/plugins/print/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'el', {
6 toolbar: 'Εκτύπωση'
7} );
diff --git a/sources/plugins/print/lang/en-au.js b/sources/plugins/print/lang/en-au.js
new file mode 100644
index 00000000..dfef21a6
--- /dev/null
+++ b/sources/plugins/print/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'en-au', {
6 toolbar: 'Print'
7} );
diff --git a/sources/plugins/print/lang/en-ca.js b/sources/plugins/print/lang/en-ca.js
new file mode 100644
index 00000000..019ddd99
--- /dev/null
+++ b/sources/plugins/print/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'en-ca', {
6 toolbar: 'Print'
7} );
diff --git a/sources/plugins/print/lang/en-gb.js b/sources/plugins/print/lang/en-gb.js
new file mode 100644
index 00000000..88ffbfdd
--- /dev/null
+++ b/sources/plugins/print/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'en-gb', {
6 toolbar: 'Print'
7} );
diff --git a/sources/plugins/print/lang/en.js b/sources/plugins/print/lang/en.js
new file mode 100644
index 00000000..7be9ec15
--- /dev/null
+++ b/sources/plugins/print/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'en', {
6 toolbar: 'Print'
7} );
diff --git a/sources/plugins/print/lang/eo.js b/sources/plugins/print/lang/eo.js
new file mode 100644
index 00000000..61c8be4e
--- /dev/null
+++ b/sources/plugins/print/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'eo', {
6 toolbar: 'Presi'
7} );
diff --git a/sources/plugins/print/lang/es.js b/sources/plugins/print/lang/es.js
new file mode 100644
index 00000000..e1bdb6d2
--- /dev/null
+++ b/sources/plugins/print/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'es', {
6 toolbar: 'Imprimir'
7} );
diff --git a/sources/plugins/print/lang/et.js b/sources/plugins/print/lang/et.js
new file mode 100644
index 00000000..c7fd13c6
--- /dev/null
+++ b/sources/plugins/print/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'et', {
6 toolbar: 'Printimine'
7} );
diff --git a/sources/plugins/print/lang/eu.js b/sources/plugins/print/lang/eu.js
new file mode 100644
index 00000000..d4316628
--- /dev/null
+++ b/sources/plugins/print/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'eu', {
6 toolbar: 'Inprimatu'
7} );
diff --git a/sources/plugins/print/lang/fa.js b/sources/plugins/print/lang/fa.js
new file mode 100644
index 00000000..8ab4d6ba
--- /dev/null
+++ b/sources/plugins/print/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'fa', {
6 toolbar: 'چاپ'
7} );
diff --git a/sources/plugins/print/lang/fi.js b/sources/plugins/print/lang/fi.js
new file mode 100644
index 00000000..7b2d3778
--- /dev/null
+++ b/sources/plugins/print/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'fi', {
6 toolbar: 'Tulosta'
7} );
diff --git a/sources/plugins/print/lang/fo.js b/sources/plugins/print/lang/fo.js
new file mode 100644
index 00000000..cbdfc86e
--- /dev/null
+++ b/sources/plugins/print/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'fo', {
6 toolbar: 'Prenta'
7} );
diff --git a/sources/plugins/print/lang/fr-ca.js b/sources/plugins/print/lang/fr-ca.js
new file mode 100644
index 00000000..84b3c349
--- /dev/null
+++ b/sources/plugins/print/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'fr-ca', {
6 toolbar: 'Imprimer'
7} );
diff --git a/sources/plugins/print/lang/fr.js b/sources/plugins/print/lang/fr.js
new file mode 100644
index 00000000..01967d8d
--- /dev/null
+++ b/sources/plugins/print/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'fr', {
6 toolbar: 'Imprimer'
7} );
diff --git a/sources/plugins/print/lang/gl.js b/sources/plugins/print/lang/gl.js
new file mode 100644
index 00000000..73711791
--- /dev/null
+++ b/sources/plugins/print/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'gl', {
6 toolbar: 'Imprimir'
7} );
diff --git a/sources/plugins/print/lang/gu.js b/sources/plugins/print/lang/gu.js
new file mode 100644
index 00000000..441619ec
--- /dev/null
+++ b/sources/plugins/print/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'gu', {
6 toolbar: 'પ્રિન્ટ'
7} );
diff --git a/sources/plugins/print/lang/he.js b/sources/plugins/print/lang/he.js
new file mode 100644
index 00000000..eb29d376
--- /dev/null
+++ b/sources/plugins/print/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'he', {
6 toolbar: 'הדפסה'
7} );
diff --git a/sources/plugins/print/lang/hi.js b/sources/plugins/print/lang/hi.js
new file mode 100644
index 00000000..d983068b
--- /dev/null
+++ b/sources/plugins/print/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'hi', {
6 toolbar: 'प्रिन्ट'
7} );
diff --git a/sources/plugins/print/lang/hr.js b/sources/plugins/print/lang/hr.js
new file mode 100644
index 00000000..e827346d
--- /dev/null
+++ b/sources/plugins/print/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'hr', {
6 toolbar: 'Ispiši'
7} );
diff --git a/sources/plugins/print/lang/hu.js b/sources/plugins/print/lang/hu.js
new file mode 100644
index 00000000..d4640b8e
--- /dev/null
+++ b/sources/plugins/print/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'hu', {
6 toolbar: 'Nyomtatás'
7} );
diff --git a/sources/plugins/print/lang/id.js b/sources/plugins/print/lang/id.js
new file mode 100644
index 00000000..a2136467
--- /dev/null
+++ b/sources/plugins/print/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'id', {
6 toolbar: 'Cetak'
7} );
diff --git a/sources/plugins/print/lang/is.js b/sources/plugins/print/lang/is.js
new file mode 100644
index 00000000..fd94420f
--- /dev/null
+++ b/sources/plugins/print/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'is', {
6 toolbar: 'Prenta'
7} );
diff --git a/sources/plugins/print/lang/it.js b/sources/plugins/print/lang/it.js
new file mode 100644
index 00000000..e6cf48ae
--- /dev/null
+++ b/sources/plugins/print/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'it', {
6 toolbar: 'Stampa'
7} );
diff --git a/sources/plugins/print/lang/ja.js b/sources/plugins/print/lang/ja.js
new file mode 100644
index 00000000..b0ddd826
--- /dev/null
+++ b/sources/plugins/print/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ja', {
6 toolbar: '印刷'
7} );
diff --git a/sources/plugins/print/lang/ka.js b/sources/plugins/print/lang/ka.js
new file mode 100644
index 00000000..a95653e9
--- /dev/null
+++ b/sources/plugins/print/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ka', {
6 toolbar: 'ბეჭდვა'
7} );
diff --git a/sources/plugins/print/lang/km.js b/sources/plugins/print/lang/km.js
new file mode 100644
index 00000000..7be82362
--- /dev/null
+++ b/sources/plugins/print/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'km', {
6 toolbar: 'បោះពុម្ព'
7} );
diff --git a/sources/plugins/print/lang/ko.js b/sources/plugins/print/lang/ko.js
new file mode 100644
index 00000000..ff0adf3a
--- /dev/null
+++ b/sources/plugins/print/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ko', {
6 toolbar: '인쇄'
7} );
diff --git a/sources/plugins/print/lang/ku.js b/sources/plugins/print/lang/ku.js
new file mode 100644
index 00000000..1650f88b
--- /dev/null
+++ b/sources/plugins/print/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ku', {
6 toolbar: 'چاپکردن'
7} );
diff --git a/sources/plugins/print/lang/lt.js b/sources/plugins/print/lang/lt.js
new file mode 100644
index 00000000..e31b1966
--- /dev/null
+++ b/sources/plugins/print/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'lt', {
6 toolbar: 'Spausdinti'
7} );
diff --git a/sources/plugins/print/lang/lv.js b/sources/plugins/print/lang/lv.js
new file mode 100644
index 00000000..f8ace80d
--- /dev/null
+++ b/sources/plugins/print/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'lv', {
6 toolbar: 'Drukāt'
7} );
diff --git a/sources/plugins/print/lang/mk.js b/sources/plugins/print/lang/mk.js
new file mode 100644
index 00000000..cf76c295
--- /dev/null
+++ b/sources/plugins/print/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'mk', {
6 toolbar: 'Print' // MISSING
7} );
diff --git a/sources/plugins/print/lang/mn.js b/sources/plugins/print/lang/mn.js
new file mode 100644
index 00000000..5402896a
--- /dev/null
+++ b/sources/plugins/print/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'mn', {
6 toolbar: 'Хэвлэх'
7} );
diff --git a/sources/plugins/print/lang/ms.js b/sources/plugins/print/lang/ms.js
new file mode 100644
index 00000000..a589b47f
--- /dev/null
+++ b/sources/plugins/print/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ms', {
6 toolbar: 'Cetak'
7} );
diff --git a/sources/plugins/print/lang/nb.js b/sources/plugins/print/lang/nb.js
new file mode 100644
index 00000000..ad07c698
--- /dev/null
+++ b/sources/plugins/print/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'nb', {
6 toolbar: 'Skriv ut'
7} );
diff --git a/sources/plugins/print/lang/nl.js b/sources/plugins/print/lang/nl.js
new file mode 100644
index 00000000..78684df6
--- /dev/null
+++ b/sources/plugins/print/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'nl', {
6 toolbar: 'Afdrukken'
7} );
diff --git a/sources/plugins/print/lang/no.js b/sources/plugins/print/lang/no.js
new file mode 100644
index 00000000..d181c25b
--- /dev/null
+++ b/sources/plugins/print/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'no', {
6 toolbar: 'Skriv ut'
7} );
diff --git a/sources/plugins/print/lang/pl.js b/sources/plugins/print/lang/pl.js
new file mode 100644
index 00000000..627f7722
--- /dev/null
+++ b/sources/plugins/print/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'pl', {
6 toolbar: 'Drukuj'
7} );
diff --git a/sources/plugins/print/lang/pt-br.js b/sources/plugins/print/lang/pt-br.js
new file mode 100644
index 00000000..68f540ce
--- /dev/null
+++ b/sources/plugins/print/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'pt-br', {
6 toolbar: 'Imprimir'
7} );
diff --git a/sources/plugins/print/lang/pt.js b/sources/plugins/print/lang/pt.js
new file mode 100644
index 00000000..79cfc1a3
--- /dev/null
+++ b/sources/plugins/print/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'pt', {
6 toolbar: 'Imprimir'
7} );
diff --git a/sources/plugins/print/lang/ro.js b/sources/plugins/print/lang/ro.js
new file mode 100644
index 00000000..1b734090
--- /dev/null
+++ b/sources/plugins/print/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ro', {
6 toolbar: 'Printează'
7} );
diff --git a/sources/plugins/print/lang/ru.js b/sources/plugins/print/lang/ru.js
new file mode 100644
index 00000000..5f060461
--- /dev/null
+++ b/sources/plugins/print/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ru', {
6 toolbar: 'Печать'
7} );
diff --git a/sources/plugins/print/lang/si.js b/sources/plugins/print/lang/si.js
new file mode 100644
index 00000000..84cf9b9b
--- /dev/null
+++ b/sources/plugins/print/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'si', {
6 toolbar: 'මුද්‍රණය කරන්න'
7} );
diff --git a/sources/plugins/print/lang/sk.js b/sources/plugins/print/lang/sk.js
new file mode 100644
index 00000000..cf5baad0
--- /dev/null
+++ b/sources/plugins/print/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'sk', {
6 toolbar: 'Tlač'
7} );
diff --git a/sources/plugins/print/lang/sl.js b/sources/plugins/print/lang/sl.js
new file mode 100644
index 00000000..3336a970
--- /dev/null
+++ b/sources/plugins/print/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'sl', {
6 toolbar: 'Natisni'
7} );
diff --git a/sources/plugins/print/lang/sq.js b/sources/plugins/print/lang/sq.js
new file mode 100644
index 00000000..3e81de15
--- /dev/null
+++ b/sources/plugins/print/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'sq', {
6 toolbar: 'Shtype'
7} );
diff --git a/sources/plugins/print/lang/sr-latn.js b/sources/plugins/print/lang/sr-latn.js
new file mode 100644
index 00000000..f313a96f
--- /dev/null
+++ b/sources/plugins/print/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'sr-latn', {
6 toolbar: 'Štampa'
7} );
diff --git a/sources/plugins/print/lang/sr.js b/sources/plugins/print/lang/sr.js
new file mode 100644
index 00000000..32eaf11e
--- /dev/null
+++ b/sources/plugins/print/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'sr', {
6 toolbar: 'Штампа'
7} );
diff --git a/sources/plugins/print/lang/sv.js b/sources/plugins/print/lang/sv.js
new file mode 100644
index 00000000..5daade92
--- /dev/null
+++ b/sources/plugins/print/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'sv', {
6 toolbar: 'Skriv ut'
7} );
diff --git a/sources/plugins/print/lang/th.js b/sources/plugins/print/lang/th.js
new file mode 100644
index 00000000..0a331243
--- /dev/null
+++ b/sources/plugins/print/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'th', {
6 toolbar: 'สั่งพิมพ์'
7} );
diff --git a/sources/plugins/print/lang/tr.js b/sources/plugins/print/lang/tr.js
new file mode 100644
index 00000000..61cfb0c5
--- /dev/null
+++ b/sources/plugins/print/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'tr', {
6 toolbar: 'Yazdır'
7} );
diff --git a/sources/plugins/print/lang/tt.js b/sources/plugins/print/lang/tt.js
new file mode 100644
index 00000000..53371af8
--- /dev/null
+++ b/sources/plugins/print/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'tt', {
6 toolbar: 'Бастыру'
7} );
diff --git a/sources/plugins/print/lang/ug.js b/sources/plugins/print/lang/ug.js
new file mode 100644
index 00000000..86cc4d6a
--- /dev/null
+++ b/sources/plugins/print/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'ug', {
6 toolbar: 'باس '
7} );
diff --git a/sources/plugins/print/lang/uk.js b/sources/plugins/print/lang/uk.js
new file mode 100644
index 00000000..e7d07d8a
--- /dev/null
+++ b/sources/plugins/print/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'uk', {
6 toolbar: 'Друк'
7} );
diff --git a/sources/plugins/print/lang/vi.js b/sources/plugins/print/lang/vi.js
new file mode 100644
index 00000000..1b965858
--- /dev/null
+++ b/sources/plugins/print/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'vi', {
6 toolbar: 'In'
7} );
diff --git a/sources/plugins/print/lang/zh-cn.js b/sources/plugins/print/lang/zh-cn.js
new file mode 100644
index 00000000..2f1ec326
--- /dev/null
+++ b/sources/plugins/print/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'zh-cn', {
6 toolbar: '打印'
7} );
diff --git a/sources/plugins/print/lang/zh.js b/sources/plugins/print/lang/zh.js
new file mode 100644
index 00000000..e12f1e8b
--- /dev/null
+++ b/sources/plugins/print/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'print', 'zh', {
6 toolbar: '列印'
7} );
diff --git a/sources/plugins/print/plugin.js b/sources/plugins/print/plugin.js
new file mode 100644
index 00000000..faa567b6
--- /dev/null
+++ b/sources/plugins/print/plugin.js
@@ -0,0 +1,46 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Print Plugin
8 */
9
10CKEDITOR.plugins.add( 'print', {
11 // jscs:disable maximumLineLength
12 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
13 // jscs:enable maximumLineLength
14 icons: 'print,', // %REMOVE_LINE_CORE%
15 hidpi: true, // %REMOVE_LINE_CORE%
16 init: function( editor ) {
17 // Print plugin isn't available in inline mode yet.
18 if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
19 return;
20
21 var pluginName = 'print';
22
23 // Register the command.
24 editor.addCommand( pluginName, CKEDITOR.plugins.print );
25
26 // Register the toolbar button.
27 editor.ui.addButton && editor.ui.addButton( 'Print', {
28 label: editor.lang.print.toolbar,
29 command: pluginName,
30 toolbar: 'document,50'
31 } );
32 }
33} );
34
35CKEDITOR.plugins.print = {
36 exec: function( editor ) {
37 if ( CKEDITOR.env.gecko ) {
38 editor.window.$.print();
39 } else {
40 editor.document.$.execCommand( 'Print' );
41 }
42 },
43 canUndo: false,
44 readOnly: 1,
45 modes: { wysiwyg: 1 }
46};
diff --git a/sources/plugins/removeformat/icons/hidpi/removeformat.png b/sources/plugins/removeformat/icons/hidpi/removeformat.png
new file mode 100644
index 00000000..910b0a3c
--- /dev/null
+++ b/sources/plugins/removeformat/icons/hidpi/removeformat.png
Binary files differ
diff --git a/sources/plugins/removeformat/icons/removeformat.png b/sources/plugins/removeformat/icons/removeformat.png
new file mode 100644
index 00000000..1bc9b386
--- /dev/null
+++ b/sources/plugins/removeformat/icons/removeformat.png
Binary files differ
diff --git a/sources/plugins/removeformat/lang/af.js b/sources/plugins/removeformat/lang/af.js
new file mode 100644
index 00000000..a4aa5367
--- /dev/null
+++ b/sources/plugins/removeformat/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'af', {
6 toolbar: 'Verwyder opmaak'
7} );
diff --git a/sources/plugins/removeformat/lang/ar.js b/sources/plugins/removeformat/lang/ar.js
new file mode 100644
index 00000000..16217eb3
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ar', {
6 toolbar: 'إزالة التنسيقات'
7} );
diff --git a/sources/plugins/removeformat/lang/bg.js b/sources/plugins/removeformat/lang/bg.js
new file mode 100644
index 00000000..01d1348f
--- /dev/null
+++ b/sources/plugins/removeformat/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'bg', {
6 toolbar: 'Премахване на форматирането'
7} );
diff --git a/sources/plugins/removeformat/lang/bn.js b/sources/plugins/removeformat/lang/bn.js
new file mode 100644
index 00000000..0e54f499
--- /dev/null
+++ b/sources/plugins/removeformat/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'bn', {
6 toolbar: 'ফরমেট সরাও'
7} );
diff --git a/sources/plugins/removeformat/lang/bs.js b/sources/plugins/removeformat/lang/bs.js
new file mode 100644
index 00000000..55e0b7e5
--- /dev/null
+++ b/sources/plugins/removeformat/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'bs', {
6 toolbar: 'Poništi format'
7} );
diff --git a/sources/plugins/removeformat/lang/ca.js b/sources/plugins/removeformat/lang/ca.js
new file mode 100644
index 00000000..d2507469
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ca', {
6 toolbar: 'Elimina Format'
7} );
diff --git a/sources/plugins/removeformat/lang/cs.js b/sources/plugins/removeformat/lang/cs.js
new file mode 100644
index 00000000..3e16778e
--- /dev/null
+++ b/sources/plugins/removeformat/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'cs', {
6 toolbar: 'Odstranit formátování'
7} );
diff --git a/sources/plugins/removeformat/lang/cy.js b/sources/plugins/removeformat/lang/cy.js
new file mode 100644
index 00000000..3c8606e6
--- /dev/null
+++ b/sources/plugins/removeformat/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'cy', {
6 toolbar: 'Tynnu Fformat'
7} );
diff --git a/sources/plugins/removeformat/lang/da.js b/sources/plugins/removeformat/lang/da.js
new file mode 100644
index 00000000..5599b638
--- /dev/null
+++ b/sources/plugins/removeformat/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'da', {
6 toolbar: 'Fjern formatering'
7} );
diff --git a/sources/plugins/removeformat/lang/de.js b/sources/plugins/removeformat/lang/de.js
new file mode 100644
index 00000000..8361c14b
--- /dev/null
+++ b/sources/plugins/removeformat/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'de', {
6 toolbar: 'Formatierung entfernen'
7} );
diff --git a/sources/plugins/removeformat/lang/el.js b/sources/plugins/removeformat/lang/el.js
new file mode 100644
index 00000000..6f69f98c
--- /dev/null
+++ b/sources/plugins/removeformat/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'el', {
6 toolbar: 'Εκκαθάριση Μορφοποίησης'
7} );
diff --git a/sources/plugins/removeformat/lang/en-au.js b/sources/plugins/removeformat/lang/en-au.js
new file mode 100644
index 00000000..61bc04ee
--- /dev/null
+++ b/sources/plugins/removeformat/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'en-au', {
6 toolbar: 'Remove Format'
7} );
diff --git a/sources/plugins/removeformat/lang/en-ca.js b/sources/plugins/removeformat/lang/en-ca.js
new file mode 100644
index 00000000..213048cc
--- /dev/null
+++ b/sources/plugins/removeformat/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'en-ca', {
6 toolbar: 'Remove Format'
7} );
diff --git a/sources/plugins/removeformat/lang/en-gb.js b/sources/plugins/removeformat/lang/en-gb.js
new file mode 100644
index 00000000..020d1e46
--- /dev/null
+++ b/sources/plugins/removeformat/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'en-gb', {
6 toolbar: 'Remove Format'
7} );
diff --git a/sources/plugins/removeformat/lang/en.js b/sources/plugins/removeformat/lang/en.js
new file mode 100644
index 00000000..6a27bd00
--- /dev/null
+++ b/sources/plugins/removeformat/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'en', {
6 toolbar: 'Remove Format'
7} );
diff --git a/sources/plugins/removeformat/lang/eo.js b/sources/plugins/removeformat/lang/eo.js
new file mode 100644
index 00000000..c7e8057b
--- /dev/null
+++ b/sources/plugins/removeformat/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'eo', {
6 toolbar: 'Forigi Formaton'
7} );
diff --git a/sources/plugins/removeformat/lang/es.js b/sources/plugins/removeformat/lang/es.js
new file mode 100644
index 00000000..fca22159
--- /dev/null
+++ b/sources/plugins/removeformat/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'es', {
6 toolbar: 'Eliminar Formato'
7} );
diff --git a/sources/plugins/removeformat/lang/et.js b/sources/plugins/removeformat/lang/et.js
new file mode 100644
index 00000000..5d2b3361
--- /dev/null
+++ b/sources/plugins/removeformat/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'et', {
6 toolbar: 'Vormingu eemaldamine'
7} );
diff --git a/sources/plugins/removeformat/lang/eu.js b/sources/plugins/removeformat/lang/eu.js
new file mode 100644
index 00000000..ba7a0e5d
--- /dev/null
+++ b/sources/plugins/removeformat/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'eu', {
6 toolbar: 'Kendu formatua'
7} );
diff --git a/sources/plugins/removeformat/lang/fa.js b/sources/plugins/removeformat/lang/fa.js
new file mode 100644
index 00000000..c31b7b2c
--- /dev/null
+++ b/sources/plugins/removeformat/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'fa', {
6 toolbar: 'برداشتن فرمت'
7} );
diff --git a/sources/plugins/removeformat/lang/fi.js b/sources/plugins/removeformat/lang/fi.js
new file mode 100644
index 00000000..9f34c3bc
--- /dev/null
+++ b/sources/plugins/removeformat/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'fi', {
6 toolbar: 'Poista muotoilu'
7} );
diff --git a/sources/plugins/removeformat/lang/fo.js b/sources/plugins/removeformat/lang/fo.js
new file mode 100644
index 00000000..b30ac5f9
--- /dev/null
+++ b/sources/plugins/removeformat/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'fo', {
6 toolbar: 'Strika sniðgeving'
7} );
diff --git a/sources/plugins/removeformat/lang/fr-ca.js b/sources/plugins/removeformat/lang/fr-ca.js
new file mode 100644
index 00000000..b266ef7e
--- /dev/null
+++ b/sources/plugins/removeformat/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'fr-ca', {
6 toolbar: 'Supprimer le formatage'
7} );
diff --git a/sources/plugins/removeformat/lang/fr.js b/sources/plugins/removeformat/lang/fr.js
new file mode 100644
index 00000000..8822f12d
--- /dev/null
+++ b/sources/plugins/removeformat/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'fr', {
6 toolbar: 'Supprimer la mise en forme'
7} );
diff --git a/sources/plugins/removeformat/lang/gl.js b/sources/plugins/removeformat/lang/gl.js
new file mode 100644
index 00000000..7c8ad55b
--- /dev/null
+++ b/sources/plugins/removeformat/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'gl', {
6 toolbar: 'Retirar o formato'
7} );
diff --git a/sources/plugins/removeformat/lang/gu.js b/sources/plugins/removeformat/lang/gu.js
new file mode 100644
index 00000000..4c92c3d6
--- /dev/null
+++ b/sources/plugins/removeformat/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'gu', {
6 toolbar: 'ફૉર્મટ કાઢવું'
7} );
diff --git a/sources/plugins/removeformat/lang/he.js b/sources/plugins/removeformat/lang/he.js
new file mode 100644
index 00000000..082c285e
--- /dev/null
+++ b/sources/plugins/removeformat/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'he', {
6 toolbar: 'הסרת העיצוב'
7} );
diff --git a/sources/plugins/removeformat/lang/hi.js b/sources/plugins/removeformat/lang/hi.js
new file mode 100644
index 00000000..90202b4a
--- /dev/null
+++ b/sources/plugins/removeformat/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'hi', {
6 toolbar: 'फ़ॉर्मैट हटायें'
7} );
diff --git a/sources/plugins/removeformat/lang/hr.js b/sources/plugins/removeformat/lang/hr.js
new file mode 100644
index 00000000..804bcfe9
--- /dev/null
+++ b/sources/plugins/removeformat/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'hr', {
6 toolbar: 'Ukloni formatiranje'
7} );
diff --git a/sources/plugins/removeformat/lang/hu.js b/sources/plugins/removeformat/lang/hu.js
new file mode 100644
index 00000000..b3190cbc
--- /dev/null
+++ b/sources/plugins/removeformat/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'hu', {
6 toolbar: 'Formázás eltávolítása'
7} );
diff --git a/sources/plugins/removeformat/lang/id.js b/sources/plugins/removeformat/lang/id.js
new file mode 100644
index 00000000..c1449777
--- /dev/null
+++ b/sources/plugins/removeformat/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'id', {
6 toolbar: 'Hapus Format'
7} );
diff --git a/sources/plugins/removeformat/lang/is.js b/sources/plugins/removeformat/lang/is.js
new file mode 100644
index 00000000..2df2ecc0
--- /dev/null
+++ b/sources/plugins/removeformat/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'is', {
6 toolbar: 'Fjarlægja snið'
7} );
diff --git a/sources/plugins/removeformat/lang/it.js b/sources/plugins/removeformat/lang/it.js
new file mode 100644
index 00000000..97f531a4
--- /dev/null
+++ b/sources/plugins/removeformat/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'it', {
6 toolbar: 'Elimina formattazione'
7} );
diff --git a/sources/plugins/removeformat/lang/ja.js b/sources/plugins/removeformat/lang/ja.js
new file mode 100644
index 00000000..9b897f69
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ja', {
6 toolbar: '書式を解除'
7} );
diff --git a/sources/plugins/removeformat/lang/ka.js b/sources/plugins/removeformat/lang/ka.js
new file mode 100644
index 00000000..aa1f91ae
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ka', {
6 toolbar: 'ფორმატირების მოხსნა'
7} );
diff --git a/sources/plugins/removeformat/lang/km.js b/sources/plugins/removeformat/lang/km.js
new file mode 100644
index 00000000..f7550dc1
--- /dev/null
+++ b/sources/plugins/removeformat/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'km', {
6 toolbar: 'ជម្រះ​ទ្រង់​ទ្រាយ'
7} );
diff --git a/sources/plugins/removeformat/lang/ko.js b/sources/plugins/removeformat/lang/ko.js
new file mode 100644
index 00000000..b19a77e9
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ko', {
6 toolbar: '형식 지우기'
7} );
diff --git a/sources/plugins/removeformat/lang/ku.js b/sources/plugins/removeformat/lang/ku.js
new file mode 100644
index 00000000..7471b2f8
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ku', {
6 toolbar: 'لابردنی داڕشتەکە'
7} );
diff --git a/sources/plugins/removeformat/lang/lt.js b/sources/plugins/removeformat/lang/lt.js
new file mode 100644
index 00000000..69666fcb
--- /dev/null
+++ b/sources/plugins/removeformat/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'lt', {
6 toolbar: 'Panaikinti formatą'
7} );
diff --git a/sources/plugins/removeformat/lang/lv.js b/sources/plugins/removeformat/lang/lv.js
new file mode 100644
index 00000000..8421e6b2
--- /dev/null
+++ b/sources/plugins/removeformat/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'lv', {
6 toolbar: 'Noņemt stilus'
7} );
diff --git a/sources/plugins/removeformat/lang/mk.js b/sources/plugins/removeformat/lang/mk.js
new file mode 100644
index 00000000..70908a22
--- /dev/null
+++ b/sources/plugins/removeformat/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'mk', {
6 toolbar: 'Remove Format' // MISSING
7} );
diff --git a/sources/plugins/removeformat/lang/mn.js b/sources/plugins/removeformat/lang/mn.js
new file mode 100644
index 00000000..96a7fbe4
--- /dev/null
+++ b/sources/plugins/removeformat/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'mn', {
6 toolbar: 'Параргафын загварыг авч хаях'
7} );
diff --git a/sources/plugins/removeformat/lang/ms.js b/sources/plugins/removeformat/lang/ms.js
new file mode 100644
index 00000000..aec04ae7
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ms', {
6 toolbar: 'Buang Format'
7} );
diff --git a/sources/plugins/removeformat/lang/nb.js b/sources/plugins/removeformat/lang/nb.js
new file mode 100644
index 00000000..63aca263
--- /dev/null
+++ b/sources/plugins/removeformat/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'nb', {
6 toolbar: 'Fjern formatering'
7} );
diff --git a/sources/plugins/removeformat/lang/nl.js b/sources/plugins/removeformat/lang/nl.js
new file mode 100644
index 00000000..a5775f68
--- /dev/null
+++ b/sources/plugins/removeformat/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'nl', {
6 toolbar: 'Opmaak verwijderen'
7} );
diff --git a/sources/plugins/removeformat/lang/no.js b/sources/plugins/removeformat/lang/no.js
new file mode 100644
index 00000000..6ae98eb2
--- /dev/null
+++ b/sources/plugins/removeformat/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'no', {
6 toolbar: 'Fjern formatering'
7} );
diff --git a/sources/plugins/removeformat/lang/pl.js b/sources/plugins/removeformat/lang/pl.js
new file mode 100644
index 00000000..81442e17
--- /dev/null
+++ b/sources/plugins/removeformat/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'pl', {
6 toolbar: 'Usuń formatowanie'
7} );
diff --git a/sources/plugins/removeformat/lang/pt-br.js b/sources/plugins/removeformat/lang/pt-br.js
new file mode 100644
index 00000000..56efddd1
--- /dev/null
+++ b/sources/plugins/removeformat/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'pt-br', {
6 toolbar: 'Remover Formatação'
7} );
diff --git a/sources/plugins/removeformat/lang/pt.js b/sources/plugins/removeformat/lang/pt.js
new file mode 100644
index 00000000..4ec568b4
--- /dev/null
+++ b/sources/plugins/removeformat/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'pt', {
6 toolbar: 'Eliminar Formato'
7} );
diff --git a/sources/plugins/removeformat/lang/ro.js b/sources/plugins/removeformat/lang/ro.js
new file mode 100644
index 00000000..4b689bbf
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ro', {
6 toolbar: 'Înlătură formatarea'
7} );
diff --git a/sources/plugins/removeformat/lang/ru.js b/sources/plugins/removeformat/lang/ru.js
new file mode 100644
index 00000000..dcba65a8
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ru', {
6 toolbar: 'Убрать форматирование'
7} );
diff --git a/sources/plugins/removeformat/lang/si.js b/sources/plugins/removeformat/lang/si.js
new file mode 100644
index 00000000..e1efff63
--- /dev/null
+++ b/sources/plugins/removeformat/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'si', {
6 toolbar: 'සැකසීම වෙනස් කරන්න'
7} );
diff --git a/sources/plugins/removeformat/lang/sk.js b/sources/plugins/removeformat/lang/sk.js
new file mode 100644
index 00000000..9ce3fc30
--- /dev/null
+++ b/sources/plugins/removeformat/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'sk', {
6 toolbar: 'Odstrániť formátovanie'
7} );
diff --git a/sources/plugins/removeformat/lang/sl.js b/sources/plugins/removeformat/lang/sl.js
new file mode 100644
index 00000000..6edc4abd
--- /dev/null
+++ b/sources/plugins/removeformat/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'sl', {
6 toolbar: 'Odstrani oblikovanje'
7} );
diff --git a/sources/plugins/removeformat/lang/sq.js b/sources/plugins/removeformat/lang/sq.js
new file mode 100644
index 00000000..7bf36689
--- /dev/null
+++ b/sources/plugins/removeformat/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'sq', {
6 toolbar: 'Largo Formatin'
7} );
diff --git a/sources/plugins/removeformat/lang/sr-latn.js b/sources/plugins/removeformat/lang/sr-latn.js
new file mode 100644
index 00000000..8c008213
--- /dev/null
+++ b/sources/plugins/removeformat/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'sr-latn', {
6 toolbar: 'Ukloni formatiranje'
7} );
diff --git a/sources/plugins/removeformat/lang/sr.js b/sources/plugins/removeformat/lang/sr.js
new file mode 100644
index 00000000..42c78b19
--- /dev/null
+++ b/sources/plugins/removeformat/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'sr', {
6 toolbar: 'Уклони форматирање'
7} );
diff --git a/sources/plugins/removeformat/lang/sv.js b/sources/plugins/removeformat/lang/sv.js
new file mode 100644
index 00000000..4f32fad1
--- /dev/null
+++ b/sources/plugins/removeformat/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'sv', {
6 toolbar: 'Radera formatering'
7} );
diff --git a/sources/plugins/removeformat/lang/th.js b/sources/plugins/removeformat/lang/th.js
new file mode 100644
index 00000000..78d2d6ed
--- /dev/null
+++ b/sources/plugins/removeformat/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'th', {
6 toolbar: 'ล้างรูปแบบ'
7} );
diff --git a/sources/plugins/removeformat/lang/tr.js b/sources/plugins/removeformat/lang/tr.js
new file mode 100644
index 00000000..6c63b545
--- /dev/null
+++ b/sources/plugins/removeformat/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'tr', {
6 toolbar: 'Biçimi Kaldır'
7} );
diff --git a/sources/plugins/removeformat/lang/tt.js b/sources/plugins/removeformat/lang/tt.js
new file mode 100644
index 00000000..95206995
--- /dev/null
+++ b/sources/plugins/removeformat/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'tt', {
6 toolbar: 'Форматлауны бетерү'
7} );
diff --git a/sources/plugins/removeformat/lang/ug.js b/sources/plugins/removeformat/lang/ug.js
new file mode 100644
index 00000000..d4664f12
--- /dev/null
+++ b/sources/plugins/removeformat/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'ug', {
6 toolbar: 'پىچىمنى چىقىرىۋەت'
7} );
diff --git a/sources/plugins/removeformat/lang/uk.js b/sources/plugins/removeformat/lang/uk.js
new file mode 100644
index 00000000..143f69af
--- /dev/null
+++ b/sources/plugins/removeformat/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'uk', {
6 toolbar: 'Видалити форматування'
7} );
diff --git a/sources/plugins/removeformat/lang/vi.js b/sources/plugins/removeformat/lang/vi.js
new file mode 100644
index 00000000..d129e2a0
--- /dev/null
+++ b/sources/plugins/removeformat/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'vi', {
6 toolbar: 'Xoá định dạng'
7} );
diff --git a/sources/plugins/removeformat/lang/zh-cn.js b/sources/plugins/removeformat/lang/zh-cn.js
new file mode 100644
index 00000000..762a88d7
--- /dev/null
+++ b/sources/plugins/removeformat/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'zh-cn', {
6 toolbar: '清除格式'
7} );
diff --git a/sources/plugins/removeformat/lang/zh.js b/sources/plugins/removeformat/lang/zh.js
new file mode 100644
index 00000000..d4be5286
--- /dev/null
+++ b/sources/plugins/removeformat/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'removeformat', 'zh', {
6 toolbar: '移除格式'
7} );
diff --git a/sources/plugins/removeformat/plugin.js b/sources/plugins/removeformat/plugin.js
new file mode 100644
index 00000000..9a808df1
--- /dev/null
+++ b/sources/plugins/removeformat/plugin.js
@@ -0,0 +1,193 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'removeformat', {
7 // jscs:disable maximumLineLength
8 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
9 // jscs:enable maximumLineLength
10 icons: 'removeformat', // %REMOVE_LINE_CORE%
11 hidpi: true, // %REMOVE_LINE_CORE%
12 init: function( editor ) {
13 editor.addCommand( 'removeFormat', CKEDITOR.plugins.removeformat.commands.removeformat );
14 editor.ui.addButton && editor.ui.addButton( 'RemoveFormat', {
15 label: editor.lang.removeformat.toolbar,
16 command: 'removeFormat',
17 toolbar: 'cleanup,10'
18 } );
19 }
20} );
21
22CKEDITOR.plugins.removeformat = {
23 commands: {
24 removeformat: {
25 exec: function( editor ) {
26 var tagsRegex = editor._.removeFormatRegex || ( editor._.removeFormatRegex = new RegExp( '^(?:' + editor.config.removeFormatTags.replace( /,/g, '|' ) + ')$', 'i' ) );
27
28 var removeAttributes = editor._.removeAttributes || ( editor._.removeAttributes = editor.config.removeFormatAttributes.split( ',' ) ),
29 filter = CKEDITOR.plugins.removeformat.filter,
30 ranges = editor.getSelection().getRanges(),
31 iterator = ranges.createIterator(),
32 isElement = function( element ) {
33 return element.type == CKEDITOR.NODE_ELEMENT;
34 },
35 range;
36
37 while ( ( range = iterator.getNextRange() ) ) {
38 if ( !range.collapsed )
39 range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
40
41 // Bookmark the range so we can re-select it after processing.
42 var bookmark = range.createBookmark(),
43 // The style will be applied within the bookmark boundaries.
44 startNode = bookmark.startNode,
45 endNode = bookmark.endNode,
46 currentNode;
47
48 // We need to check the selection boundaries (bookmark spans) to break
49 // the code in a way that we can properly remove partially selected nodes.
50 // For example, removing a <b> style from
51 // <b>This is [some text</b> to show <b>the] problem</b>
52 // ... where [ and ] represent the selection, must result:
53 // <b>This is </b>[some text to show the]<b> problem</b>
54 // The strategy is simple, we just break the partial nodes before the
55 // removal logic, having something that could be represented this way:
56 // <b>This is </b>[<b>some text</b> to show <b>the</b>]<b> problem</b>
57
58 var breakParent = function( node ) {
59 // Let's start checking the start boundary.
60 var path = editor.elementPath( node ),
61 pathElements = path.elements;
62
63 for ( var i = 1, pathElement; pathElement = pathElements[ i ]; i++ ) {
64 if ( pathElement.equals( path.block ) || pathElement.equals( path.blockLimit ) )
65 break;
66
67 // If this element can be removed (even partially).
68 if ( tagsRegex.test( pathElement.getName() ) && filter( editor, pathElement ) )
69 node.breakParent( pathElement );
70 }
71 };
72
73 breakParent( startNode );
74 if ( endNode ) {
75 breakParent( endNode );
76
77 // Navigate through all nodes between the bookmarks.
78 currentNode = startNode.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT );
79
80 while ( currentNode ) {
81 // If we have reached the end of the selection, stop looping.
82 if ( currentNode.equals( endNode ) )
83 break;
84
85 if ( currentNode.isReadOnly() ) {
86 // In case of non-editable we're skipping to the next sibling *elmenet*.
87
88 // We need to be aware that endNode can be nested within current non-editable.
89 // This condition tests if currentNode (non-editable) contains endNode. If it does
90 // then we should break the filtering
91 if ( currentNode.getPosition( endNode ) & CKEDITOR.POSITION_CONTAINS ) {
92 break;
93 }
94
95 currentNode = currentNode.getNext( isElement );
96 continue;
97 }
98
99 // Cache the next node to be processed. Do it now, because
100 // currentNode may be removed.
101 var nextNode = currentNode.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT ),
102 isFakeElement = currentNode.getName() == 'img' && currentNode.data( 'cke-realelement' );
103
104 // This node must not be a fake element, and must not be read-only.
105 if ( !isFakeElement && filter( editor, currentNode ) ) {
106 // Remove elements nodes that match with this style rules.
107 if ( tagsRegex.test( currentNode.getName() ) )
108 currentNode.remove( 1 );
109 else {
110 currentNode.removeAttributes( removeAttributes );
111 editor.fire( 'removeFormatCleanup', currentNode );
112 }
113 }
114
115 currentNode = nextNode;
116 }
117 }
118
119 range.moveToBookmark( bookmark );
120 }
121
122 // The selection path may not changed, but we should force a selection
123 // change event to refresh command states, due to the above attribution change. (#9238)
124 editor.forceNextSelectionCheck();
125 editor.getSelection().selectRanges( ranges );
126 }
127 }
128 },
129
130 // Perform the remove format filters on the passed element.
131 // @param {CKEDITOR.editor} editor
132 // @param {CKEDITOR.dom.element} element
133 filter: function( editor, element ) {
134 // If editor#addRemoveFotmatFilter hasn't been executed yet value is not initialized.
135 var filters = editor._.removeFormatFilters || [];
136 for ( var i = 0; i < filters.length; i++ ) {
137 if ( filters[ i ]( element ) === false )
138 return false;
139 }
140 return true;
141 }
142};
143
144/**
145 * Add to a collection of functions to decide whether a specific
146 * element should be considered as formatting element and thus
147 * could be removed during `removeFormat` command.
148 *
149 * **Note:** Only available with the existence of `removeformat` plugin.
150 *
151 * // Don't remove empty span.
152 * editor.addRemoveFormatFilter( function( element ) {
153 * return !( element.is( 'span' ) && CKEDITOR.tools.isEmpty( element.getAttributes() ) );
154 * } );
155 *
156 * @since 3.3
157 * @member CKEDITOR.editor
158 * @param {Function} func The function to be called, which will be passed a {CKEDITOR.dom.element} element to test.
159 */
160CKEDITOR.editor.prototype.addRemoveFormatFilter = function( func ) {
161 if ( !this._.removeFormatFilters )
162 this._.removeFormatFilters = [];
163
164 this._.removeFormatFilters.push( func );
165};
166
167/**
168 * A comma separated list of elements to be removed when executing the `remove
169 * format` command. Note that only inline elements are allowed.
170 *
171 * @cfg
172 * @member CKEDITOR.config
173 */
174CKEDITOR.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';
175
176/**
177 * A comma separated list of elements attributes to be removed when executing
178 * the `remove format` command.
179 *
180 * @cfg
181 * @member CKEDITOR.config
182 */
183CKEDITOR.config.removeFormatAttributes = 'class,style,lang,width,height,align,hspace,valign';
184
185/**
186 * Fired after an element was cleaned by the removeFormat plugin.
187 *
188 * @event removeFormatCleanup
189 * @member CKEDITOR.editor
190 * @param {CKEDITOR.editor} editor This editor instance.
191 * @param data
192 * @param {CKEDITOR.dom.element} data.element The element that was cleaned up.
193 */
diff --git a/sources/plugins/resize/plugin.js b/sources/plugins/resize/plugin.js
new file mode 100644
index 00000000..f57990c8
--- /dev/null
+++ b/sources/plugins/resize/plugin.js
@@ -0,0 +1,187 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'resize', {
7 init: function( editor ) {
8 function dragHandler( evt ) {
9 var dx = evt.data.$.screenX - origin.x,
10 dy = evt.data.$.screenY - origin.y,
11 width = startSize.width,
12 height = startSize.height,
13 internalWidth = width + dx * ( resizeDir == 'rtl' ? -1 : 1 ),
14 internalHeight = height + dy;
15
16 if ( resizeHorizontal )
17 width = Math.max( config.resize_minWidth, Math.min( internalWidth, config.resize_maxWidth ) );
18
19 if ( resizeVertical )
20 height = Math.max( config.resize_minHeight, Math.min( internalHeight, config.resize_maxHeight ) );
21
22 // DO NOT impose fixed size with single direction resize. (#6308)
23 editor.resize( resizeHorizontal ? width : null, height );
24 }
25
26 function dragEndHandler() {
27 CKEDITOR.document.removeListener( 'mousemove', dragHandler );
28 CKEDITOR.document.removeListener( 'mouseup', dragEndHandler );
29
30 if ( editor.document ) {
31 editor.document.removeListener( 'mousemove', dragHandler );
32 editor.document.removeListener( 'mouseup', dragEndHandler );
33 }
34 }
35
36 var config = editor.config;
37 var spaceId = editor.ui.spaceId( 'resizer' );
38
39 // Resize in the same direction of chrome,
40 // which is identical to dir of editor element. (#6614)
41 var resizeDir = editor.element ? editor.element.getDirection( 1 ) : 'ltr';
42
43 !config.resize_dir && ( config.resize_dir = 'vertical' );
44 ( config.resize_maxWidth === undefined ) && ( config.resize_maxWidth = 3000 );
45 ( config.resize_maxHeight === undefined ) && ( config.resize_maxHeight = 3000 );
46 ( config.resize_minWidth === undefined ) && ( config.resize_minWidth = 750 );
47 ( config.resize_minHeight === undefined ) && ( config.resize_minHeight = 250 );
48
49 if ( config.resize_enabled !== false ) {
50 var container = null,
51 origin, startSize,
52 resizeHorizontal = ( config.resize_dir == 'both' || config.resize_dir == 'horizontal' ) && ( config.resize_minWidth != config.resize_maxWidth ),
53 resizeVertical = ( config.resize_dir == 'both' || config.resize_dir == 'vertical' ) && ( config.resize_minHeight != config.resize_maxHeight );
54
55 var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) {
56 if ( !container )
57 container = editor.getResizable();
58
59 startSize = { width: container.$.offsetWidth || 0, height: container.$.offsetHeight || 0 };
60 origin = { x: $event.screenX, y: $event.screenY };
61
62 config.resize_minWidth > startSize.width && ( config.resize_minWidth = startSize.width );
63 config.resize_minHeight > startSize.height && ( config.resize_minHeight = startSize.height );
64
65 CKEDITOR.document.on( 'mousemove', dragHandler );
66 CKEDITOR.document.on( 'mouseup', dragEndHandler );
67
68 if ( editor.document ) {
69 editor.document.on( 'mousemove', dragHandler );
70 editor.document.on( 'mouseup', dragEndHandler );
71 }
72
73 $event.preventDefault && $event.preventDefault();
74 } );
75
76 editor.on( 'destroy', function() {
77 CKEDITOR.tools.removeFunction( mouseDownFn );
78 } );
79
80 editor.on( 'uiSpace', function( event ) {
81 if ( event.data.space == 'bottom' ) {
82 var direction = '';
83 if ( resizeHorizontal && !resizeVertical )
84 direction = ' cke_resizer_horizontal';
85 if ( !resizeHorizontal && resizeVertical )
86 direction = ' cke_resizer_vertical';
87
88 var resizerHtml =
89 '<span' +
90 ' id="' + spaceId + '"' +
91 ' class="cke_resizer' + direction + ' cke_resizer_' + resizeDir + '"' +
92 ' title="' + CKEDITOR.tools.htmlEncode( editor.lang.common.resize ) + '"' +
93 ' onmousedown="CKEDITOR.tools.callFunction(' + mouseDownFn + ', event)"' +
94 '>' +
95 // BLACK LOWER RIGHT TRIANGLE (ltr)
96 // BLACK LOWER LEFT TRIANGLE (rtl)
97 ( resizeDir == 'ltr' ? '\u25E2' : '\u25E3' ) +
98 '</span>';
99
100 // Always sticks the corner of botttom space.
101 resizeDir == 'ltr' && direction == 'ltr' ? event.data.html += resizerHtml : event.data.html = resizerHtml + event.data.html;
102 }
103 }, editor, null, 100 );
104
105 // Toggle the visibility of the resizer when an editor is being maximized or minimized.
106 editor.on( 'maximize', function( event ) {
107 editor.ui.space( 'resizer' )[ event.data == CKEDITOR.TRISTATE_ON ? 'hide' : 'show' ]();
108 } );
109 }
110 }
111} );
112
113/**
114 * The minimum editor width, in pixels, when resizing the editor interface by using the resize handle.
115 * Note: It falls back to editor's actual width if it is smaller than the default value.
116 *
117 * Read more in the [documentation](#!/guide/dev_resize)
118 * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html).
119 *
120 * config.resize_minWidth = 500;
121 *
122 * @cfg {Number} [resize_minWidth=750]
123 * @member CKEDITOR.config
124 */
125
126/**
127 * The minimum editor height, in pixels, when resizing the editor interface by using the resize handle.
128 * Note: It falls back to editor's actual height if it is smaller than the default value.
129 *
130 * Read more in the [documentation](#!/guide/dev_resize)
131 * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html).
132 *
133 * config.resize_minHeight = 600;
134 *
135 * @cfg {Number} [resize_minHeight=250]
136 * @member CKEDITOR.config
137 */
138
139/**
140 * The maximum editor width, in pixels, when resizing the editor interface by using the resize handle.
141 *
142 * Read more in the [documentation](#!/guide/dev_resize)
143 * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html).
144 *
145 * config.resize_maxWidth = 750;
146 *
147 * @cfg {Number} [resize_maxWidth=3000]
148 * @member CKEDITOR.config
149 */
150
151/**
152 * The maximum editor height, in pixels, when resizing the editor interface by using the resize handle.
153 *
154 * Read more in the [documentation](#!/guide/dev_resize)
155 * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html).
156 *
157 * config.resize_maxHeight = 600;
158 *
159 * @cfg {Number} [resize_maxHeight=3000]
160 * @member CKEDITOR.config
161 */
162
163/**
164 * Whether to enable the resizing feature. If this feature is disabled, the resize handle will not be visible.
165 *
166 * Read more in the [documentation](#!/guide/dev_resize)
167 * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html).
168 *
169 * config.resize_enabled = false;
170 *
171 * @cfg {Boolean} [resize_enabled=true]
172 * @member CKEDITOR.config
173 */
174
175/**
176 * The dimensions for which the editor resizing is enabled. Possible values
177 * are `both`, `vertical`, and `horizontal`.
178 *
179 * Read more in the [documentation](#!/guide/dev_resize)
180 * and see the [SDK sample](http://sdk.ckeditor.com/samples/resize.html).
181 *
182 * config.resize_dir = 'both';
183 *
184 * @since 3.3
185 * @cfg {String} [resize_dir='vertical']
186 * @member CKEDITOR.config
187 */
diff --git a/sources/plugins/richcombo/plugin.js b/sources/plugins/richcombo/plugin.js
new file mode 100644
index 00000000..4395b2a4
--- /dev/null
+++ b/sources/plugins/richcombo/plugin.js
@@ -0,0 +1,434 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'richcombo', {
7 requires: 'floatpanel,listblock,button',
8
9 beforeInit: function( editor ) {
10 editor.ui.addHandler( CKEDITOR.UI_RICHCOMBO, CKEDITOR.ui.richCombo.handler );
11 }
12} );
13
14( function() {
15 var template = '<span id="{id}"' +
16 ' class="cke_combo cke_combo__{name} {cls}"' +
17 ' role="presentation">' +
18 '<span id="{id}_label" class="cke_combo_label">{label}</span>' +
19 '<a class="cke_combo_button" title="{title}" tabindex="-1"' +
20 ( CKEDITOR.env.gecko && !CKEDITOR.env.hc ? '' : ' href="javascript:void(\'{titleJs}\')"' ) +
21 ' hidefocus="true"' +
22 ' role="button"' +
23 ' aria-labelledby="{id}_label"' +
24 ' aria-haspopup="true"';
25
26 // Some browsers don't cancel key events in the keydown but in the
27 // keypress.
28 // TODO: Check if really needed.
29 if ( CKEDITOR.env.gecko && CKEDITOR.env.mac )
30 template += ' onkeypress="return false;"';
31
32 // With Firefox, we need to force the button to redraw, otherwise it
33 // will remain in the focus state.
34 if ( CKEDITOR.env.gecko )
35 template += ' onblur="this.style.cssText = this.style.cssText;"';
36
37 template +=
38 ' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);"' +
39 ' onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" ' +
40 ( CKEDITOR.env.ie ? 'onclick="return false;" onmouseup' : 'onclick' ) + // #188
41 '="CKEDITOR.tools.callFunction({clickFn},this);return false;">' +
42 '<span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span>' +
43 '<span class="cke_combo_open">' +
44 '<span class="cke_combo_arrow">' +
45 // BLACK DOWN-POINTING TRIANGLE
46 ( CKEDITOR.env.hc ? '&#9660;' : CKEDITOR.env.air ? '&nbsp;' : '' ) +
47 '</span>' +
48 '</span>' +
49 '</a>' +
50 '</span>';
51
52 var rcomboTpl = CKEDITOR.addTemplate( 'combo', template );
53
54 /**
55 * Button UI element.
56 *
57 * @readonly
58 * @property {String} [='richcombo']
59 * @member CKEDITOR
60 */
61 CKEDITOR.UI_RICHCOMBO = 'richcombo';
62
63 /**
64 * @class
65 * @todo
66 */
67 CKEDITOR.ui.richCombo = CKEDITOR.tools.createClass( {
68 $: function( definition ) {
69 // Copy all definition properties to this object.
70 CKEDITOR.tools.extend( this, definition,
71 // Set defaults.
72 {
73 // The combo won't participate in toolbar grouping.
74 canGroup: false,
75 title: definition.label,
76 modes: { wysiwyg: 1 },
77 editorFocus: 1
78 } );
79
80 // We don't want the panel definition in this object.
81 var panelDefinition = this.panel || {};
82 delete this.panel;
83
84 this.id = CKEDITOR.tools.getNextNumber();
85
86 this.document = ( panelDefinition.parent && panelDefinition.parent.getDocument() ) || CKEDITOR.document;
87
88 panelDefinition.className = 'cke_combopanel';
89 panelDefinition.block = {
90 multiSelect: panelDefinition.multiSelect,
91 attributes: panelDefinition.attributes
92 };
93 panelDefinition.toolbarRelated = true;
94
95 this._ = {
96 panelDefinition: panelDefinition,
97 items: {}
98 };
99 },
100
101 proto: {
102 renderHtml: function( editor ) {
103 var output = [];
104 this.render( editor, output );
105 return output.join( '' );
106 },
107
108 /**
109 * Renders the combo.
110 *
111 * @param {CKEDITOR.editor} editor The editor instance which this button is
112 * to be used by.
113 * @param {Array} output The output array to which append the HTML relative
114 * to this button.
115 */
116 render: function( editor, output ) {
117 var env = CKEDITOR.env;
118
119 var id = 'cke_' + this.id;
120 var clickFn = CKEDITOR.tools.addFunction( function( el ) {
121 // Restore locked selection in Opera.
122 if ( selLocked ) {
123 editor.unlockSelection( 1 );
124 selLocked = 0;
125 }
126 instance.execute( el );
127 }, this );
128
129 var combo = this;
130 var instance = {
131 id: id,
132 combo: this,
133 focus: function() {
134 var element = CKEDITOR.document.getById( id ).getChild( 1 );
135 element.focus();
136 },
137 execute: function( el ) {
138 var _ = combo._;
139
140 if ( _.state == CKEDITOR.TRISTATE_DISABLED )
141 return;
142
143 combo.createPanel( editor );
144
145 if ( _.on ) {
146 _.panel.hide();
147 return;
148 }
149
150 combo.commit();
151 var value = combo.getValue();
152 if ( value )
153 _.list.mark( value );
154 else
155 _.list.unmarkAll();
156
157 _.panel.showBlock( combo.id, new CKEDITOR.dom.element( el ), 4 );
158 },
159 clickFn: clickFn
160 };
161
162 function updateState() {
163 // Don't change state while richcombo is active (#11793).
164 if ( this.getState() == CKEDITOR.TRISTATE_ON )
165 return;
166
167 var state = this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
168
169 if ( editor.readOnly && !this.readOnly )
170 state = CKEDITOR.TRISTATE_DISABLED;
171
172 this.setState( state );
173 this.setValue( '' );
174
175 // Let plugin to disable button.
176 if ( state != CKEDITOR.TRISTATE_DISABLED && this.refresh )
177 this.refresh();
178 }
179
180 // Update status when activeFilter, mode, selection or readOnly changes.
181 editor.on( 'activeFilterChange', updateState, this );
182 editor.on( 'mode', updateState, this );
183 editor.on( 'selectionChange', updateState, this );
184 // If this combo is sensitive to readOnly state, update it accordingly.
185 !this.readOnly && editor.on( 'readOnly', updateState, this );
186
187 var keyDownFn = CKEDITOR.tools.addFunction( function( ev, element ) {
188 ev = new CKEDITOR.dom.event( ev );
189
190 var keystroke = ev.getKeystroke();
191
192 // ARROW-DOWN
193 // This call is duplicated in plugins/toolbar/plugin.js in itemKeystroke().
194 // Move focus to the first element after drop down was opened by the arrow down key.
195 if ( keystroke == 40 ) {
196 editor.once( 'panelShow', function( evt ) {
197 evt.data._.panel._.currentBlock.onKeyDown( 40 );
198 } );
199 }
200
201 switch ( keystroke ) {
202 case 13: // ENTER
203 case 32: // SPACE
204 case 40: // ARROW-DOWN
205 // Show panel
206 CKEDITOR.tools.callFunction( clickFn, element );
207 break;
208 default:
209 // Delegate the default behavior to toolbar button key handling.
210 instance.onkey( instance, keystroke );
211 }
212
213 // Avoid subsequent focus grab on editor document.
214 ev.preventDefault();
215 } );
216
217 var focusFn = CKEDITOR.tools.addFunction( function() {
218 instance.onfocus && instance.onfocus();
219 } );
220
221 var selLocked = 0;
222
223 // For clean up
224 instance.keyDownFn = keyDownFn;
225
226 var params = {
227 id: id,
228 name: this.name || this.command,
229 label: this.label,
230 title: this.title,
231 cls: this.className || '',
232 titleJs: env.gecko && !env.hc ? '' : ( this.title || '' ).replace( "'", '' ),
233 keydownFn: keyDownFn,
234 focusFn: focusFn,
235 clickFn: clickFn
236 };
237
238 rcomboTpl.output( params, output );
239
240 if ( this.onRender )
241 this.onRender();
242
243 return instance;
244 },
245
246 createPanel: function( editor ) {
247 if ( this._.panel )
248 return;
249
250 var panelDefinition = this._.panelDefinition,
251 panelBlockDefinition = this._.panelDefinition.block,
252 panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(),
253 namedPanelCls = 'cke_combopanel__' + this.name,
254 panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ),
255 list = panel.addListBlock( this.id, panelBlockDefinition ),
256 me = this;
257
258 panel.onShow = function() {
259 this.element.addClass( namedPanelCls );
260
261 me.setState( CKEDITOR.TRISTATE_ON );
262
263 me._.on = 1;
264
265 me.editorFocus && !editor.focusManager.hasFocus && editor.focus();
266
267 if ( me.onOpen )
268 me.onOpen();
269
270 // The "panelShow" event is fired assinchronously, after the
271 // onShow method call.
272 editor.once( 'panelShow', function() {
273 list.focus( !list.multiSelect && me.getValue() );
274 } );
275 };
276
277 panel.onHide = function( preventOnClose ) {
278 this.element.removeClass( namedPanelCls );
279
280 me.setState( me.modes && me.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
281
282 me._.on = 0;
283
284 if ( !preventOnClose && me.onClose )
285 me.onClose();
286 };
287
288 panel.onEscape = function() {
289 // Hide drop-down with focus returned.
290 panel.hide( 1 );
291 };
292
293 list.onClick = function( value, marked ) {
294
295 if ( me.onClick )
296 me.onClick.call( me, value, marked );
297
298 panel.hide();
299 };
300
301 this._.panel = panel;
302 this._.list = list;
303
304 panel.getBlock( this.id ).onHide = function() {
305 me._.on = 0;
306 me.setState( CKEDITOR.TRISTATE_OFF );
307 };
308
309 if ( this.init )
310 this.init();
311 },
312
313 setValue: function( value, text ) {
314 this._.value = value;
315
316 var textElement = this.document.getById( 'cke_' + this.id + '_text' );
317 if ( textElement ) {
318 if ( !( value || text ) ) {
319 text = this.label;
320 textElement.addClass( 'cke_combo_inlinelabel' );
321 } else {
322 textElement.removeClass( 'cke_combo_inlinelabel' );
323 }
324
325 textElement.setText( typeof text != 'undefined' ? text : value );
326 }
327 },
328
329 getValue: function() {
330 return this._.value || '';
331 },
332
333 unmarkAll: function() {
334 this._.list.unmarkAll();
335 },
336
337 mark: function( value ) {
338 this._.list.mark( value );
339 },
340
341 hideItem: function( value ) {
342 this._.list.hideItem( value );
343 },
344
345 hideGroup: function( groupTitle ) {
346 this._.list.hideGroup( groupTitle );
347 },
348
349 showAll: function() {
350 this._.list.showAll();
351 },
352
353 add: function( value, html, text ) {
354 this._.items[ value ] = text || value;
355 this._.list.add( value, html, text );
356 },
357
358 startGroup: function( title ) {
359 this._.list.startGroup( title );
360 },
361
362 commit: function() {
363 if ( !this._.committed ) {
364 this._.list.commit();
365 this._.committed = 1;
366 CKEDITOR.ui.fire( 'ready', this );
367 }
368 this._.committed = 1;
369 },
370
371 setState: function( state ) {
372 if ( this._.state == state )
373 return;
374
375 var el = this.document.getById( 'cke_' + this.id );
376 el.setState( state, 'cke_combo' );
377
378 state == CKEDITOR.TRISTATE_DISABLED ?
379 el.setAttribute( 'aria-disabled', true ) :
380 el.removeAttribute( 'aria-disabled' );
381
382 this._.state = state;
383 },
384
385 getState: function() {
386 return this._.state;
387 },
388
389 enable: function() {
390 if ( this._.state == CKEDITOR.TRISTATE_DISABLED )
391 this.setState( this._.lastState );
392 },
393
394 disable: function() {
395 if ( this._.state != CKEDITOR.TRISTATE_DISABLED ) {
396 this._.lastState = this._.state;
397 this.setState( CKEDITOR.TRISTATE_DISABLED );
398 }
399 }
400 },
401
402 /**
403 * Represents richCombo handler object.
404 *
405 * @class CKEDITOR.ui.richCombo.handler
406 * @singleton
407 * @extends CKEDITOR.ui.handlerDefinition
408 */
409 statics: {
410 handler: {
411 /**
412 * Transforms a richCombo definition in a {@link CKEDITOR.ui.richCombo} instance.
413 *
414 * @param {Object} definition
415 * @returns {CKEDITOR.ui.richCombo}
416 */
417 create: function( definition ) {
418 return new CKEDITOR.ui.richCombo( definition );
419 }
420 }
421 }
422 } );
423
424 /**
425 * @param {String} name
426 * @param {Object} definition
427 * @member CKEDITOR.ui
428 * @todo
429 */
430 CKEDITOR.ui.prototype.addRichCombo = function( name, definition ) {
431 this.add( name, CKEDITOR.UI_RICHCOMBO, definition );
432 };
433
434} )();
diff --git a/sources/plugins/save/icons/hidpi/save.png b/sources/plugins/save/icons/hidpi/save.png
new file mode 100644
index 00000000..fc59f677
--- /dev/null
+++ b/sources/plugins/save/icons/hidpi/save.png
Binary files differ
diff --git a/sources/plugins/save/icons/save.png b/sources/plugins/save/icons/save.png
new file mode 100644
index 00000000..51b8f6ee
--- /dev/null
+++ b/sources/plugins/save/icons/save.png
Binary files differ
diff --git a/sources/plugins/save/lang/af.js b/sources/plugins/save/lang/af.js
new file mode 100644
index 00000000..8f019845
--- /dev/null
+++ b/sources/plugins/save/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'af', {
6 toolbar: 'Bewaar'
7} );
diff --git a/sources/plugins/save/lang/ar.js b/sources/plugins/save/lang/ar.js
new file mode 100644
index 00000000..7b911a61
--- /dev/null
+++ b/sources/plugins/save/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ar', {
6 toolbar: 'حفظ'
7} );
diff --git a/sources/plugins/save/lang/bg.js b/sources/plugins/save/lang/bg.js
new file mode 100644
index 00000000..980170c1
--- /dev/null
+++ b/sources/plugins/save/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'bg', {
6 toolbar: 'Запис'
7} );
diff --git a/sources/plugins/save/lang/bn.js b/sources/plugins/save/lang/bn.js
new file mode 100644
index 00000000..aeaf0616
--- /dev/null
+++ b/sources/plugins/save/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'bn', {
6 toolbar: 'সংরক্ষন কর'
7} );
diff --git a/sources/plugins/save/lang/bs.js b/sources/plugins/save/lang/bs.js
new file mode 100644
index 00000000..9823a2bd
--- /dev/null
+++ b/sources/plugins/save/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'bs', {
6 toolbar: 'Snimi'
7} );
diff --git a/sources/plugins/save/lang/ca.js b/sources/plugins/save/lang/ca.js
new file mode 100644
index 00000000..9938a2e5
--- /dev/null
+++ b/sources/plugins/save/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ca', {
6 toolbar: 'Desa'
7} );
diff --git a/sources/plugins/save/lang/cs.js b/sources/plugins/save/lang/cs.js
new file mode 100644
index 00000000..597db8d7
--- /dev/null
+++ b/sources/plugins/save/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'cs', {
6 toolbar: 'Uložit'
7} );
diff --git a/sources/plugins/save/lang/cy.js b/sources/plugins/save/lang/cy.js
new file mode 100644
index 00000000..64be9138
--- /dev/null
+++ b/sources/plugins/save/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'cy', {
6 toolbar: 'Cadw'
7} );
diff --git a/sources/plugins/save/lang/da.js b/sources/plugins/save/lang/da.js
new file mode 100644
index 00000000..6586d44d
--- /dev/null
+++ b/sources/plugins/save/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'da', {
6 toolbar: 'Gem'
7} );
diff --git a/sources/plugins/save/lang/de.js b/sources/plugins/save/lang/de.js
new file mode 100644
index 00000000..14379b2c
--- /dev/null
+++ b/sources/plugins/save/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'de', {
6 toolbar: 'Speichern'
7} );
diff --git a/sources/plugins/save/lang/el.js b/sources/plugins/save/lang/el.js
new file mode 100644
index 00000000..dea5622c
--- /dev/null
+++ b/sources/plugins/save/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'el', {
6 toolbar: 'Αποθήκευση'
7} );
diff --git a/sources/plugins/save/lang/en-au.js b/sources/plugins/save/lang/en-au.js
new file mode 100644
index 00000000..f05aa6c2
--- /dev/null
+++ b/sources/plugins/save/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'en-au', {
6 toolbar: 'Save'
7} );
diff --git a/sources/plugins/save/lang/en-ca.js b/sources/plugins/save/lang/en-ca.js
new file mode 100644
index 00000000..ffa5e8e5
--- /dev/null
+++ b/sources/plugins/save/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'en-ca', {
6 toolbar: 'Save'
7} );
diff --git a/sources/plugins/save/lang/en-gb.js b/sources/plugins/save/lang/en-gb.js
new file mode 100644
index 00000000..bf17d87f
--- /dev/null
+++ b/sources/plugins/save/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'en-gb', {
6 toolbar: 'Save'
7} );
diff --git a/sources/plugins/save/lang/en.js b/sources/plugins/save/lang/en.js
new file mode 100644
index 00000000..1da76ddc
--- /dev/null
+++ b/sources/plugins/save/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'en', {
6 toolbar: 'Save'
7} );
diff --git a/sources/plugins/save/lang/eo.js b/sources/plugins/save/lang/eo.js
new file mode 100644
index 00000000..28ecc6ef
--- /dev/null
+++ b/sources/plugins/save/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'eo', {
6 toolbar: 'Konservi'
7} );
diff --git a/sources/plugins/save/lang/es.js b/sources/plugins/save/lang/es.js
new file mode 100644
index 00000000..e71316ab
--- /dev/null
+++ b/sources/plugins/save/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'es', {
6 toolbar: 'Guardar'
7} );
diff --git a/sources/plugins/save/lang/et.js b/sources/plugins/save/lang/et.js
new file mode 100644
index 00000000..a5464059
--- /dev/null
+++ b/sources/plugins/save/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'et', {
6 toolbar: 'Salvestamine'
7} );
diff --git a/sources/plugins/save/lang/eu.js b/sources/plugins/save/lang/eu.js
new file mode 100644
index 00000000..fe3a900d
--- /dev/null
+++ b/sources/plugins/save/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'eu', {
6 toolbar: 'Gorde'
7} );
diff --git a/sources/plugins/save/lang/fa.js b/sources/plugins/save/lang/fa.js
new file mode 100644
index 00000000..fef1704f
--- /dev/null
+++ b/sources/plugins/save/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'fa', {
6 toolbar: 'ذخیره'
7} );
diff --git a/sources/plugins/save/lang/fi.js b/sources/plugins/save/lang/fi.js
new file mode 100644
index 00000000..288635b6
--- /dev/null
+++ b/sources/plugins/save/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'fi', {
6 toolbar: 'Tallenna'
7} );
diff --git a/sources/plugins/save/lang/fo.js b/sources/plugins/save/lang/fo.js
new file mode 100644
index 00000000..9f813786
--- /dev/null
+++ b/sources/plugins/save/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'fo', {
6 toolbar: 'Goym'
7} );
diff --git a/sources/plugins/save/lang/fr-ca.js b/sources/plugins/save/lang/fr-ca.js
new file mode 100644
index 00000000..2658de99
--- /dev/null
+++ b/sources/plugins/save/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'fr-ca', {
6 toolbar: 'Sauvegarder'
7} );
diff --git a/sources/plugins/save/lang/fr.js b/sources/plugins/save/lang/fr.js
new file mode 100644
index 00000000..343eb2a3
--- /dev/null
+++ b/sources/plugins/save/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'fr', {
6 toolbar: 'Enregistrer'
7} );
diff --git a/sources/plugins/save/lang/gl.js b/sources/plugins/save/lang/gl.js
new file mode 100644
index 00000000..be320708
--- /dev/null
+++ b/sources/plugins/save/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'gl', {
6 toolbar: 'Gardar'
7} );
diff --git a/sources/plugins/save/lang/gu.js b/sources/plugins/save/lang/gu.js
new file mode 100644
index 00000000..44a2d6ba
--- /dev/null
+++ b/sources/plugins/save/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'gu', {
6 toolbar: 'સેવ'
7} );
diff --git a/sources/plugins/save/lang/he.js b/sources/plugins/save/lang/he.js
new file mode 100644
index 00000000..44113764
--- /dev/null
+++ b/sources/plugins/save/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'he', {
6 toolbar: 'שמירה'
7} );
diff --git a/sources/plugins/save/lang/hi.js b/sources/plugins/save/lang/hi.js
new file mode 100644
index 00000000..d68a1e96
--- /dev/null
+++ b/sources/plugins/save/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'hi', {
6 toolbar: 'सेव'
7} );
diff --git a/sources/plugins/save/lang/hr.js b/sources/plugins/save/lang/hr.js
new file mode 100644
index 00000000..92486d6e
--- /dev/null
+++ b/sources/plugins/save/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'hr', {
6 toolbar: 'Snimi'
7} );
diff --git a/sources/plugins/save/lang/hu.js b/sources/plugins/save/lang/hu.js
new file mode 100644
index 00000000..7c609f66
--- /dev/null
+++ b/sources/plugins/save/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'hu', {
6 toolbar: 'Mentés'
7} );
diff --git a/sources/plugins/save/lang/id.js b/sources/plugins/save/lang/id.js
new file mode 100644
index 00000000..8f5c6034
--- /dev/null
+++ b/sources/plugins/save/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'id', {
6 toolbar: 'Simpan'
7} );
diff --git a/sources/plugins/save/lang/is.js b/sources/plugins/save/lang/is.js
new file mode 100644
index 00000000..2a6b3dae
--- /dev/null
+++ b/sources/plugins/save/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'is', {
6 toolbar: 'Vista'
7} );
diff --git a/sources/plugins/save/lang/it.js b/sources/plugins/save/lang/it.js
new file mode 100644
index 00000000..6181e482
--- /dev/null
+++ b/sources/plugins/save/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'it', {
6 toolbar: 'Salva'
7} );
diff --git a/sources/plugins/save/lang/ja.js b/sources/plugins/save/lang/ja.js
new file mode 100644
index 00000000..6fefc175
--- /dev/null
+++ b/sources/plugins/save/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ja', {
6 toolbar: '保存'
7} );
diff --git a/sources/plugins/save/lang/ka.js b/sources/plugins/save/lang/ka.js
new file mode 100644
index 00000000..556c4963
--- /dev/null
+++ b/sources/plugins/save/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ka', {
6 toolbar: 'ჩაწერა'
7} );
diff --git a/sources/plugins/save/lang/km.js b/sources/plugins/save/lang/km.js
new file mode 100644
index 00000000..7e43926b
--- /dev/null
+++ b/sources/plugins/save/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'km', {
6 toolbar: 'រក្សាទុក'
7} );
diff --git a/sources/plugins/save/lang/ko.js b/sources/plugins/save/lang/ko.js
new file mode 100644
index 00000000..7d2155fd
--- /dev/null
+++ b/sources/plugins/save/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ko', {
6 toolbar: '저장'
7} );
diff --git a/sources/plugins/save/lang/ku.js b/sources/plugins/save/lang/ku.js
new file mode 100644
index 00000000..428ebbc7
--- /dev/null
+++ b/sources/plugins/save/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ku', {
6 toolbar: 'پاشکەوتکردن'
7} );
diff --git a/sources/plugins/save/lang/lt.js b/sources/plugins/save/lang/lt.js
new file mode 100644
index 00000000..6f80d48c
--- /dev/null
+++ b/sources/plugins/save/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'lt', {
6 toolbar: 'Išsaugoti'
7} );
diff --git a/sources/plugins/save/lang/lv.js b/sources/plugins/save/lang/lv.js
new file mode 100644
index 00000000..ed763045
--- /dev/null
+++ b/sources/plugins/save/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'lv', {
6 toolbar: 'Saglabāt'
7} );
diff --git a/sources/plugins/save/lang/mk.js b/sources/plugins/save/lang/mk.js
new file mode 100644
index 00000000..61819d31
--- /dev/null
+++ b/sources/plugins/save/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'mk', {
6 toolbar: 'Save' // MISSING
7} );
diff --git a/sources/plugins/save/lang/mn.js b/sources/plugins/save/lang/mn.js
new file mode 100644
index 00000000..ba625c4c
--- /dev/null
+++ b/sources/plugins/save/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'mn', {
6 toolbar: 'Хадгалах'
7} );
diff --git a/sources/plugins/save/lang/ms.js b/sources/plugins/save/lang/ms.js
new file mode 100644
index 00000000..4818a8fd
--- /dev/null
+++ b/sources/plugins/save/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ms', {
6 toolbar: 'Simpan'
7} );
diff --git a/sources/plugins/save/lang/nb.js b/sources/plugins/save/lang/nb.js
new file mode 100644
index 00000000..47158ee9
--- /dev/null
+++ b/sources/plugins/save/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'nb', {
6 toolbar: 'Lagre'
7} );
diff --git a/sources/plugins/save/lang/nl.js b/sources/plugins/save/lang/nl.js
new file mode 100644
index 00000000..9611b028
--- /dev/null
+++ b/sources/plugins/save/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'nl', {
6 toolbar: 'Opslaan'
7} );
diff --git a/sources/plugins/save/lang/no.js b/sources/plugins/save/lang/no.js
new file mode 100644
index 00000000..1a15d996
--- /dev/null
+++ b/sources/plugins/save/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'no', {
6 toolbar: 'Lagre'
7} );
diff --git a/sources/plugins/save/lang/pl.js b/sources/plugins/save/lang/pl.js
new file mode 100644
index 00000000..cb41e863
--- /dev/null
+++ b/sources/plugins/save/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'pl', {
6 toolbar: 'Zapisz'
7} );
diff --git a/sources/plugins/save/lang/pt-br.js b/sources/plugins/save/lang/pt-br.js
new file mode 100644
index 00000000..c78840b2
--- /dev/null
+++ b/sources/plugins/save/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'pt-br', {
6 toolbar: 'Salvar'
7} );
diff --git a/sources/plugins/save/lang/pt.js b/sources/plugins/save/lang/pt.js
new file mode 100644
index 00000000..087b2603
--- /dev/null
+++ b/sources/plugins/save/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'pt', {
6 toolbar: 'Guardar'
7} );
diff --git a/sources/plugins/save/lang/ro.js b/sources/plugins/save/lang/ro.js
new file mode 100644
index 00000000..31cef218
--- /dev/null
+++ b/sources/plugins/save/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ro', {
6 toolbar: 'Salvează'
7} );
diff --git a/sources/plugins/save/lang/ru.js b/sources/plugins/save/lang/ru.js
new file mode 100644
index 00000000..19f85cde
--- /dev/null
+++ b/sources/plugins/save/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ru', {
6 toolbar: 'Сохранить'
7} );
diff --git a/sources/plugins/save/lang/si.js b/sources/plugins/save/lang/si.js
new file mode 100644
index 00000000..ed66b7cd
--- /dev/null
+++ b/sources/plugins/save/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'si', {
6 toolbar: 'ආරක්ෂා කරන්න'
7} );
diff --git a/sources/plugins/save/lang/sk.js b/sources/plugins/save/lang/sk.js
new file mode 100644
index 00000000..650be532
--- /dev/null
+++ b/sources/plugins/save/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'sk', {
6 toolbar: 'Uložiť'
7} );
diff --git a/sources/plugins/save/lang/sl.js b/sources/plugins/save/lang/sl.js
new file mode 100644
index 00000000..0ad06fdf
--- /dev/null
+++ b/sources/plugins/save/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'sl', {
6 toolbar: 'Shrani'
7} );
diff --git a/sources/plugins/save/lang/sq.js b/sources/plugins/save/lang/sq.js
new file mode 100644
index 00000000..666e8cfa
--- /dev/null
+++ b/sources/plugins/save/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'sq', {
6 toolbar: 'Ruaje'
7} );
diff --git a/sources/plugins/save/lang/sr-latn.js b/sources/plugins/save/lang/sr-latn.js
new file mode 100644
index 00000000..0b6ad39f
--- /dev/null
+++ b/sources/plugins/save/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'sr-latn', {
6 toolbar: 'Sačuvaj'
7} );
diff --git a/sources/plugins/save/lang/sr.js b/sources/plugins/save/lang/sr.js
new file mode 100644
index 00000000..c0c4c5e2
--- /dev/null
+++ b/sources/plugins/save/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'sr', {
6 toolbar: 'Сачувај'
7} );
diff --git a/sources/plugins/save/lang/sv.js b/sources/plugins/save/lang/sv.js
new file mode 100644
index 00000000..cf0b9de1
--- /dev/null
+++ b/sources/plugins/save/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'sv', {
6 toolbar: 'Spara'
7} );
diff --git a/sources/plugins/save/lang/th.js b/sources/plugins/save/lang/th.js
new file mode 100644
index 00000000..4f09b831
--- /dev/null
+++ b/sources/plugins/save/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'th', {
6 toolbar: 'บันทึก'
7} );
diff --git a/sources/plugins/save/lang/tr.js b/sources/plugins/save/lang/tr.js
new file mode 100644
index 00000000..faae6d88
--- /dev/null
+++ b/sources/plugins/save/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'tr', {
6 toolbar: 'Kaydet'
7} );
diff --git a/sources/plugins/save/lang/tt.js b/sources/plugins/save/lang/tt.js
new file mode 100644
index 00000000..3a93eb34
--- /dev/null
+++ b/sources/plugins/save/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'tt', {
6 toolbar: 'Саклау'
7} );
diff --git a/sources/plugins/save/lang/ug.js b/sources/plugins/save/lang/ug.js
new file mode 100644
index 00000000..7e919d56
--- /dev/null
+++ b/sources/plugins/save/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'ug', {
6 toolbar: 'ساقلا'
7} );
diff --git a/sources/plugins/save/lang/uk.js b/sources/plugins/save/lang/uk.js
new file mode 100644
index 00000000..ea3922f7
--- /dev/null
+++ b/sources/plugins/save/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'uk', {
6 toolbar: 'Зберегти'
7} );
diff --git a/sources/plugins/save/lang/vi.js b/sources/plugins/save/lang/vi.js
new file mode 100644
index 00000000..f7c8734c
--- /dev/null
+++ b/sources/plugins/save/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'vi', {
6 toolbar: 'Lưu'
7} );
diff --git a/sources/plugins/save/lang/zh-cn.js b/sources/plugins/save/lang/zh-cn.js
new file mode 100644
index 00000000..e2950e34
--- /dev/null
+++ b/sources/plugins/save/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'zh-cn', {
6 toolbar: '保存'
7} );
diff --git a/sources/plugins/save/lang/zh.js b/sources/plugins/save/lang/zh.js
new file mode 100644
index 00000000..e9bf39c1
--- /dev/null
+++ b/sources/plugins/save/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'save', 'zh', {
6 toolbar: '儲存'
7} );
diff --git a/sources/plugins/save/plugin.js b/sources/plugins/save/plugin.js
new file mode 100644
index 00000000..54ac3acd
--- /dev/null
+++ b/sources/plugins/save/plugin.js
@@ -0,0 +1,67 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The Save plugin.
8 */
9
10( function() {
11 var saveCmd = {
12 readOnly: 1,
13
14 exec: function( editor ) {
15 if ( editor.fire( 'save' ) ) {
16 var $form = editor.element.$.form;
17
18 if ( $form ) {
19 try {
20 $form.submit();
21 } catch ( e ) {
22 // If there's a button named "submit" then the form.submit
23 // function is masked and can't be called in IE/FF, so we
24 // call the click() method of that button.
25 if ( $form.submit.click )
26 $form.submit.click();
27 }
28 }
29 }
30 }
31 };
32
33 var pluginName = 'save';
34
35 // Register a plugin named "save".
36 CKEDITOR.plugins.add( pluginName, {
37 // jscs:disable maximumLineLength
38 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
39 // jscs:enable maximumLineLength
40 icons: 'save', // %REMOVE_LINE_CORE%
41 hidpi: true, // %REMOVE_LINE_CORE%
42 init: function( editor ) {
43 // Save plugin is for replace mode only.
44 if ( editor.elementMode != CKEDITOR.ELEMENT_MODE_REPLACE )
45 return;
46
47 var command = editor.addCommand( pluginName, saveCmd );
48 command.modes = { wysiwyg: !!( editor.element.$.form ) };
49
50 editor.ui.addButton && editor.ui.addButton( 'Save', {
51 label: editor.lang.save.toolbar,
52 command: pluginName,
53 toolbar: 'document,10'
54 } );
55 }
56 } );
57} )();
58
59/**
60 * Fired when the user clicks the Save button on the editor toolbar.
61 * This event allows to overwrite the default Save button behavior.
62 *
63 * @since 4.2
64 * @event save
65 * @member CKEDITOR.editor
66 * @param {CKEDITOR.editor} editor This editor instance.
67 */
diff --git a/sources/plugins/scayt/CHANGELOG.md b/sources/plugins/scayt/CHANGELOG.md
new file mode 100644
index 00000000..ac33d966
--- /dev/null
+++ b/sources/plugins/scayt/CHANGELOG.md
@@ -0,0 +1,20 @@
1SCAYT plugin for CKEditor 4 Changelog
2====================
3### CKEditor 4.5.6
4
5New Features:
6* CKEditor [language adddon](http://ckeditor.com/addon/language) support
7* CKEditor [placeholder adddon](http://ckeditor.com/addon/placeholder) support
8* Drag and Drop support
9* *Experimental* GRAYT functionality http://www.webspellchecker.net/samples/scayt-ckeditor-plugin.html#25
10
11Fixed issues:
12* [#98](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/98) SCAYT Affects Dialog Double Click. Fixed in SCAYT Core.
13* [#102](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/102) SCAYT Core performance enhancements
14* [#104](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/104) SCAYT's spans leak into the clipboard and after pasting
15* [#105](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/105) Javascript error fired in case of multiple instances of CKEditor in one page
16* [#107](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/107) SCAYT should not check non-editable parts of content
17* [#108](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/108) Latest SCAYT copies id of editor element to the iframe
18* SCAYT stops working when CKEditor Undo plug-in not enabled
19* Issue with pasting SCAYT markup in CKEditor
20* SCAYT stops working after pressing Cancel button in WSC dialog
diff --git a/sources/plugins/scayt/LICENSE.md b/sources/plugins/scayt/LICENSE.md
new file mode 100644
index 00000000..844ab4de
--- /dev/null
+++ b/sources/plugins/scayt/LICENSE.md
@@ -0,0 +1,28 @@
1Software License Agreement
2==========================
3
4**CKEditor SCAYT Plugin**
5Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
6
7Licensed under the terms of any of the following licenses at your choice:
8
9* GNU General Public License Version 2 or later (the "GPL"):
10 http://www.gnu.org/licenses/gpl.html
11
12* GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
13 http://www.gnu.org/licenses/lgpl.html
14
15* Mozilla Public License Version 1.1 or later (the "MPL"):
16 http://www.mozilla.org/MPL/MPL-1.1.html
17
18You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
19
20Sources of Intellectual Property Included in this plugin
21--------------------------------------------------------
22
23Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
24
25Trademarks
26----------
27
28CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/sources/plugins/scayt/README.md b/sources/plugins/scayt/README.md
new file mode 100644
index 00000000..1231d91e
--- /dev/null
+++ b/sources/plugins/scayt/README.md
@@ -0,0 +1,25 @@
1CKEditor SCAYT Plugin
2=====================
3
4This plugin brings Spell Check As You Type (SCAYT) into up to CKEditor 4+.
5
6SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
7
8Installation
9------------
10
111. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation.
122. Enable the "scayt" plugin in the CKEditor configuration file (config.js):
13
14 config.extraPlugins = 'scayt';
15
16That's all. SCAYT will appear on the editor toolbar and will be ready to use.
17
18License
19-------
20
21Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
22
23See LICENSE.md for more information.
24
25Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/sources/plugins/scayt/dialogs/options.js b/sources/plugins/scayt/dialogs/options.js
new file mode 100644
index 00000000..c26b3506
--- /dev/null
+++ b/sources/plugins/scayt/dialogs/options.js
@@ -0,0 +1,573 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5
6CKEDITOR.dialog.add( 'scaytDialog', function( editor ) {
7 var scayt_instance = editor.scayt;
8
9 var aboutTabDefinition = '<p><img src="' + scayt_instance.getLogo() + '" /></p>' +
10 '<p>' + scayt_instance.getLocal('version') + scayt_instance.getVersion() + '</p>' +
11 '<p>' + scayt_instance.getLocal('text_copyrights') + '</p>';
12
13 var doc = CKEDITOR.document;
14
15 var optionGenerator = function() {
16 var scayt_instance_ = editor.scayt,
17 applicationConfig = scayt_instance.getApplicationConfig(),
18 optionArrayUiCheckboxes = [],
19 optionLocalizationList = {
20 "ignore-all-caps-words" : "label_allCaps",
21 "ignore-domain-names" : "label_ignoreDomainNames",
22 "ignore-words-with-mixed-cases" : "label_mixedCase",
23 "ignore-words-with-numbers" : "label_mixedWithDigits"
24 };
25
26 for(var option in applicationConfig) {
27
28 var checkboxConfig = {
29 type: "checkbox"
30 };
31
32 checkboxConfig.id = option;
33 checkboxConfig.label = scayt_instance.getLocal(optionLocalizationList[option]);
34
35 optionArrayUiCheckboxes.push(checkboxConfig);
36 }
37
38 return optionArrayUiCheckboxes;
39 };
40
41 var languageModelState = {
42 isChanged : function() {
43 return (this.newLang === null || this.currentLang === this.newLang) ? false : true;
44 },
45 currentLang: scayt_instance.getLang(),
46 newLang: null,
47 reset: function() {
48 this.currentLang = scayt_instance.getLang();
49 this.newLang = null;
50 },
51 id: 'lang'
52 };
53
54 var generateDialogTabs = function(tabsList, editor) {
55 var tabs = [],
56 uiTabs = editor.config.scayt_uiTabs;
57
58 if(!uiTabs) {
59 return tabsList;
60 } else {
61 for(var i in uiTabs) {
62 (uiTabs[i] == 1) && tabs.push(tabsList[i]);
63 }
64
65 tabs.push(tabsList[tabsList.length - 1]);
66 }
67
68 return tabs;
69 };
70
71 var dialogTabs = [{
72 id : 'options',
73 label : scayt_instance.getLocal('tab_options'),
74 onShow: function() {
75 // console.log("tab show");
76 },
77 elements : [
78 {
79 type: 'vbox',
80 id: 'scaytOptions',
81 children: optionGenerator(),
82 onShow: function() {
83 var optionsTab = this.getChild(),
84 scayt_instance = editor.scayt;
85 for(var i = 0; i < this.getChild().length; i++) {
86 this.getChild()[i].setValue(scayt_instance.getApplicationConfig()[this.getChild()[i].id]);
87 }
88
89 }
90 }
91
92 ]
93 },
94 {
95 id : 'langs',
96 label : scayt_instance.getLocal('tab_languages'),
97 elements : [
98 {
99 id: "leftLangColumn",
100 type: 'vbox',
101 align: 'left',
102 widths: ['100'],
103 children: [
104 {
105 type: 'html',
106 id: 'langBox',
107 style: 'overflow: hidden; white-space: normal;margin-bottom:15px;',
108 html: '<div><div style="float:left;width:45%;margin-left:5px;" id="left-col-' + editor.name + '"></div><div style="float:left;width:45%;margin-left:15px;" id="right-col-' + editor.name + '"></div></div>',
109 onShow: function() {
110 var scayt_instance = editor.scayt;
111 var lang = scayt_instance.getLang(),
112 prefix_id = "scaytLang_",
113 radio = doc.getById(prefix_id + editor.name + '_' + lang);
114
115 radio.$.checked = true;
116 }
117 },
118 {
119 type: 'html',
120 id: 'graytLanguagesHint',
121 html: '<div style="margin:5px auto; width:95%;white-space:normal;" id="' + editor.name + 'graytLanguagesHint"><span style="width:10px;height:10px;display: inline-block; background:#02b620;vertical-align:top;margin-top:2px;"></span> - This languages are supported by Grammar As You Type(GRAYT).</div>',
122 onShow: function() {
123 var graytLanguagesHint = doc.getById(editor.name + 'graytLanguagesHint');
124
125 if (!editor.config.grayt_autoStartup) {
126 graytLanguagesHint.$.style.display = 'none';
127 }
128 }
129 }
130 ]
131 }
132 ]
133 },
134 {
135 id : 'dictionaries',
136 label : scayt_instance.getLocal('tab_dictionaries'),
137 elements : [
138 {
139 type: 'vbox',
140 id: 'rightCol_col__left',
141 children: [
142 {
143 type: 'html',
144 id: 'dictionaryNote',
145 html: ''
146 },
147 {
148 type: 'text',
149 id: 'dictionaryName',
150 label: scayt_instance.getLocal('label_fieldNameDic') || 'Dictionary name',
151 onShow: function(data) {
152 var dialog = data.sender,
153 scayt_instance = editor.scayt;
154
155 // IE7 specific fix
156 setTimeout(function() {
157 // clear dictionaryNote field
158 dialog.getContentElement("dictionaries", "dictionaryNote").getElement().setText('');
159
160 // restore/clear dictionaryName field
161 if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
162 dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
163 }
164 }, 0);
165 }
166 },
167 {
168 type: 'hbox',
169 id: 'notExistDic',
170 align: 'left',
171 style: 'width:auto;',
172 widths: [ '50%', '50%' ],
173 children: [
174 {
175 type: 'button',
176 id: 'createDic',
177 label: scayt_instance.getLocal('btn_createDic'),
178 title: scayt_instance.getLocal('btn_createDic'),
179 onClick: function() {
180 var dialog = this.getDialog(),
181 self = dialogDefinition,
182 scayt_instance = editor.scayt,
183 name = dialog.getContentElement("dictionaries", "dictionaryName").getValue();
184
185 scayt_instance.createUserDictionary(name, function(response) {
186 if(!response.error) {
187 self.toggleDictionaryButtons.call(dialog, true);
188 }
189 response.dialog = dialog;
190 response.command = "create";
191 response.name = name;
192 editor.fire("scaytUserDictionaryAction", response);
193 }, function(error) {
194 error.dialog = dialog;
195 error.command = "create";
196 error.name = name;
197 editor.fire("scaytUserDictionaryActionError", error);
198 });
199 }
200 },
201 {
202 type: 'button',
203 id: 'restoreDic',
204 label: scayt_instance.getLocal('btn_restoreDic'),
205 title: scayt_instance.getLocal('btn_restoreDic'),
206 onClick: function() {
207 var dialog = this.getDialog(),
208 scayt_instance = editor.scayt,
209 self = dialogDefinition,
210 name = dialog.getContentElement("dictionaries", "dictionaryName").getValue();
211
212 scayt_instance.restoreUserDictionary(name, function(response) {
213 response.dialog = dialog;
214 if(!response.error) {
215 self.toggleDictionaryButtons.call(dialog, true);
216 }
217 response.command = "restore";
218 response.name = name;
219 editor.fire("scaytUserDictionaryAction", response);
220 }, function(error) {
221 error.dialog = dialog;
222 error.command = "restore";
223 error.name = name;
224 editor.fire("scaytUserDictionaryActionError", error);
225 });
226 }
227 }
228 ]
229 },
230 {
231 type: 'hbox',
232 id: 'existDic',
233 align: 'left',
234 style: 'width:auto;',
235 widths: [ '50%', '50%' ],
236 children: [
237 {
238 type: 'button',
239 id: 'removeDic',
240 label: scayt_instance.getLocal('btn_deleteDic'),
241 title: scayt_instance.getLocal('btn_deleteDic'),
242 onClick: function() {
243 var dialog = this.getDialog(),
244 scayt_instance = editor.scayt,
245 self = dialogDefinition,
246 dictionaryNameField = dialog.getContentElement("dictionaries", "dictionaryName"),
247 name = dictionaryNameField.getValue();
248
249 scayt_instance.removeUserDictionary(name, function(response) {
250 dictionaryNameField.setValue("");
251 if(!response.error) {
252 self.toggleDictionaryButtons.call(dialog, false);
253 }
254 response.dialog = dialog;
255 response.command = "remove";
256 response.name = name;
257 editor.fire("scaytUserDictionaryAction", response);
258 }, function(error) {
259 error.dialog = dialog;
260 error.command = "remove";
261 error.name = name;
262 editor.fire("scaytUserDictionaryActionError", error);
263 });
264 }
265 },
266 {
267 type: 'button',
268 id: 'renameDic',
269 label: scayt_instance.getLocal('btn_renameDic'),
270 title: scayt_instance.getLocal('btn_renameDic'),
271 onClick: function() {
272 var dialog = this.getDialog(),
273 scayt_instance = editor.scayt,
274 name = dialog.getContentElement("dictionaries", "dictionaryName").getValue();
275
276 scayt_instance.renameUserDictionary(name, function(response) {
277 response.dialog = dialog;
278 response.command = "rename";
279 response.name = name;
280 editor.fire("scaytUserDictionaryAction", response);
281 }, function(error) {
282 error.dialog = dialog;
283 error.command = "rename";
284 error.name = name;
285 editor.fire("scaytUserDictionaryActionError", error);
286 });
287 }
288 }
289 ]
290 },
291 {
292 type: 'html',
293 id: 'dicInfo',
294 html: '<div id="dic_info_editor1" style="margin:5px auto; width:95%;white-space:normal;">' + scayt_instance.getLocal('text_descriptionDic') + '</div>'
295 }
296 ]
297 }
298 ]
299 },
300 {
301 id : 'about',
302 label : scayt_instance.getLocal('tab_about'),
303 elements : [
304 {
305 type : 'html',
306 id : 'about',
307 style : 'margin: 5px 5px;',
308 html : '<div><div id="scayt_about_">' +
309 aboutTabDefinition +
310 '</div></div>'
311 }
312 ]
313 }];
314
315 editor.on("scaytUserDictionaryAction", function(event) {
316 var UILib = SCAYT.prototype.UILib,
317 dialog = event.data.dialog,
318 dictionaryNote = dialog.getContentElement("dictionaries", "dictionaryNote").getElement(),
319 scayt_instance = event.editor.scayt,
320 messageTemplate;
321
322 if(event.data.error === undefined) {
323
324 // success message
325 messageTemplate = scayt_instance.getLocal("message_success_" + event.data.command + "Dic");
326 messageTemplate = messageTemplate.replace('%s', event.data.name);
327 dictionaryNote.setText(messageTemplate);
328 UILib.css(dictionaryNote.$, {color: 'blue'});
329 } else {
330
331 // error message
332 if(event.data.name === '') {
333
334 // empty dictionary name
335 dictionaryNote.setText(scayt_instance.getLocal('message_info_emptyDic'));
336 } else {
337 messageTemplate = scayt_instance.getLocal("message_error_" + event.data.command + "Dic");
338 messageTemplate = messageTemplate.replace('%s', event.data.name);
339 dictionaryNote.setText(messageTemplate);
340 }
341 UILib.css(dictionaryNote.$, {color: 'red'});
342
343 if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
344 dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
345 } else {
346 dialog.getContentElement("dictionaries", "dictionaryName").setValue("");
347 }
348 }
349 });
350
351 editor.on("scaytUserDictionaryActionError", function(event) {
352 var UILib = SCAYT.prototype.UILib,
353 dialog = event.data.dialog,
354 dictionaryNote = dialog.getContentElement("dictionaries", "dictionaryNote").getElement(),
355 scayt_instance = event.editor.scayt,
356 messageTemplate;
357
358 if(event.data.name === '') {
359
360 // empty dictionary name
361 dictionaryNote.setText(scayt_instance.getLocal('message_info_emptyDic'));
362 } else {
363 messageTemplate = scayt_instance.getLocal("message_error_" + event.data.command + "Dic");
364 messageTemplate = messageTemplate.replace('%s', event.data.name);
365 dictionaryNote.setText(messageTemplate);
366 }
367 UILib.css(dictionaryNote.$, {color: 'red'});
368
369
370 if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
371 dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
372 } else {
373 dialog.getContentElement("dictionaries", "dictionaryName").setValue("");
374 }
375
376 });
377
378 var plugin = CKEDITOR.plugins.scayt;
379
380 var dialogDefinition = {
381 title: scayt_instance.getLocal('text_title'),
382 resizable: CKEDITOR.DIALOG_RESIZE_BOTH,
383 minWidth: 340,
384 minHeight: 260,
385 onLoad: function() {
386 if(editor.config.scayt_uiTabs[1] == 0) {
387 return;
388 }
389
390 var dialog = this,
391 self = dialogDefinition,
392 langBoxes = self.getLangBoxes.call(dialog);
393
394 langBoxes.getParent().setStyle("white-space", "normal");
395
396 //dialog.data = editor.fire( 'scaytDialog', {} );
397 self.renderLangList(langBoxes);
398
399 var scayt_instance = editor.scayt;
400
401 this.definition.minWidth = this.getSize().width;
402 this.resize(this.definition.minWidth, this.definition.minHeight);
403 },
404 onCancel: function() {
405 languageModelState.reset();
406 },
407 onHide: function() {
408 editor.unlockSelection();
409 },
410 onShow: function() {
411 editor.fire("scaytDialogShown", this);
412
413 if(editor.config.scayt_uiTabs[2] == 0) {
414 return;
415 }
416
417 var scayt_instance = editor.scayt,
418 self = dialogDefinition,
419 dialog = this,
420 dictionaryNameField = dialog.getContentElement("dictionaries", "dictionaryName"),
421 existance = dialog.getContentElement("dictionaries", "existDic").getElement().getParent(),
422 notExistance = dialog.getContentElement("dictionaries", "notExistDic").getElement().getParent();
423
424 existance.hide();
425 notExistance.hide();
426
427 if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
428 dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
429 existance.show();
430 } else {
431 dictionaryNameField.setValue("");
432 notExistance.show();
433 }
434 },
435 onOk: function() {
436 var dialog = this,
437 self = dialogDefinition,
438 scayt_instance = editor.scayt,
439 scaytOptions = dialog.getContentElement("options", "scaytOptions"),
440 changedOptions = self.getChangedOption.call(dialog);
441
442 scayt_instance.commitOption({ changedOptions: changedOptions });
443 },
444 toggleDictionaryButtons: function(exist) {
445 var existance = this.getContentElement("dictionaries", "existDic").getElement().getParent(),
446 notExistance = this.getContentElement("dictionaries", "notExistDic").getElement().getParent();
447
448 if(exist) {
449 existance.show();
450 notExistance.hide();
451 } else {
452 existance.hide();
453 notExistance.show();
454 }
455
456 },
457 getChangedOption: function() {
458 var changedOption = {};
459
460 if(editor.config.scayt_uiTabs[0] == 1) {
461 var dialog = this,
462 scaytOptions = dialog.getContentElement("options", "scaytOptions").getChild();
463
464 for(var i = 0; i < scaytOptions.length; i++) {
465 if(scaytOptions[i].isChanged()) {
466 changedOption[scaytOptions[i].id] = scaytOptions[i].getValue();
467 }
468 }
469 }
470
471 if(languageModelState.isChanged()) {
472 changedOption[languageModelState.id] = editor.config.scayt_sLang = languageModelState.currentLang = languageModelState.newLang;
473 }
474
475 return changedOption;
476 },
477 buildRadioInputs: function(key, value, isSupportedByGrayt) {
478 var divContainer = new CKEDITOR.dom.element( 'div' ),
479 doc = CKEDITOR.document,
480 id = "scaytLang_" + editor.name + '_' + value,
481 radio = CKEDITOR.dom.element.createFromHtml( '<input id="' +
482 id + '" type="radio" ' +
483 ' value="' + value + '" name="scayt_lang" />' ),
484
485 radioLabel = new CKEDITOR.dom.element( 'label' ),
486 scayt_instance = editor.scayt;
487
488 divContainer.setStyles({
489 "white-space": "normal",
490 'position': 'relative',
491 'padding-bottom': '2px'
492 });
493
494 radio.on( 'click', function(data) {
495 languageModelState.newLang = data.sender.getValue();
496 });
497
498 radioLabel.appendText(key);
499 radioLabel.setAttribute("for", id);
500
501 if(isSupportedByGrayt && editor.config.grayt_autoStartup) {
502 radioLabel.setStyles({
503 'color': '#02b620'
504 });
505 }
506
507 divContainer.append(radio);
508 divContainer.append(radioLabel);
509
510 if(value === scayt_instance.getLang()) {
511 radio.setAttribute("checked", true);
512 radio.setAttribute('defaultChecked', 'defaultChecked');
513 }
514
515 return divContainer;
516 },
517 renderLangList: function(langBoxes) {
518 var dialog = this,
519 leftCol = langBoxes.find('#left-col-' + editor.name).getItem(0),
520 rightCol = langBoxes.find('#right-col-' + editor.name).getItem(0),
521 scaytLangList = scayt_instance.getScaytLangList(),
522 graytLangList = scayt_instance.getGraytLangList(),
523 mergedLangList = {},
524 sortable = [],
525 counter = 0,
526 isSupportedByGrayt = false,
527 half, lang;
528
529 for(lang in scaytLangList.ltr) {
530 mergedLangList[lang] = scaytLangList.ltr[lang];
531 }
532
533 for(lang in scaytLangList.rtl) {
534 mergedLangList[lang] = scaytLangList.rtl[lang];
535 }
536
537 // sort alphabetically lang list
538 for(lang in mergedLangList) {
539 sortable.push([lang, mergedLangList[lang]]);
540 }
541 sortable.sort(function(a, b) {
542 var result = 0;
543 if(a[1] > b[1]) {
544 result = 1;
545 } else if(a[1] < b[1]) {
546 result = -1;
547 }
548 return result;
549 });
550 mergedLangList = {};
551 for(var i = 0; i < sortable.length; i++) {
552 mergedLangList[sortable[i][0]] = sortable[i][1];
553 }
554
555 half = Math.round(sortable.length / 2);
556
557 for(lang in mergedLangList) {
558 counter++;
559 isSupportedByGrayt = (lang in graytLangList.ltr) || (lang in graytLangList.rtl);
560 dialog.buildRadioInputs(mergedLangList[lang], lang, isSupportedByGrayt).appendTo(counter <= half ? leftCol : rightCol);
561 }
562 },
563 getLangBoxes: function() {
564 var dialog = this,
565 langboxes = dialog.getContentElement("langs", "langBox").getElement();
566
567 return langboxes;
568 },
569 contents: generateDialogTabs(dialogTabs, editor)
570 };
571
572 return dialogDefinition;
573});
diff --git a/sources/plugins/scayt/dialogs/toolbar.css b/sources/plugins/scayt/dialogs/toolbar.css
new file mode 100644
index 00000000..ecabdac9
--- /dev/null
+++ b/sources/plugins/scayt/dialogs/toolbar.css
@@ -0,0 +1,71 @@
1a
2{
3 text-decoration:none;
4 padding: 2px 4px 4px 6px;
5 display : block;
6 border-width: 1px;
7 border-style: solid;
8 margin : 0px;
9}
10
11a.cke_scayt_toogle:hover,
12a.cke_scayt_toogle:focus,
13a.cke_scayt_toogle:active
14{
15 border-color: #316ac5;
16 background-color: #dff1ff;
17 color : #000;
18 cursor: pointer;
19 margin : 0px;
20}
21a.cke_scayt_toogle {
22 color : #316ac5;
23 border-color: #fff;
24}
25.scayt_enabled a.cke_scayt_item {
26 color : #316ac5;
27 border-color: #fff;
28 margin : 0px;
29}
30.scayt_disabled a.cke_scayt_item {
31 color : gray;
32 border-color : #fff;
33}
34.scayt_enabled a.cke_scayt_item:hover,
35.scayt_enabled a.cke_scayt_item:focus,
36.scayt_enabled a.cke_scayt_item:active
37{
38 border-color: #316ac5;
39 background-color: #dff1ff;
40 color : #000;
41 cursor: pointer;
42}
43.scayt_disabled a.cke_scayt_item:hover,
44.scayt_disabled a.cke_scayt_item:focus,
45.scayt_disabled a.cke_scayt_item:active
46{
47 border-color: gray;
48 background-color: #dff1ff;
49 color : gray;
50 cursor: no-drop;
51}
52.cke_scayt_set_on, .cke_scayt_set_off
53{
54 display: none;
55}
56.scayt_enabled .cke_scayt_set_on
57{
58 display: none;
59}
60.scayt_disabled .cke_scayt_set_on
61{
62 display: inline;
63}
64.scayt_disabled .cke_scayt_set_off
65{
66 display: none;
67}
68.scayt_enabled .cke_scayt_set_off
69{
70 display: inline;
71}
diff --git a/sources/plugins/scayt/icons/hidpi/scayt.png b/sources/plugins/scayt/icons/hidpi/scayt.png
new file mode 100644
index 00000000..58a9f4c1
--- /dev/null
+++ b/sources/plugins/scayt/icons/hidpi/scayt.png
Binary files differ
diff --git a/sources/plugins/scayt/icons/scayt.png b/sources/plugins/scayt/icons/scayt.png
new file mode 100644
index 00000000..701ceee6
--- /dev/null
+++ b/sources/plugins/scayt/icons/scayt.png
Binary files differ
diff --git a/sources/plugins/scayt/lang/af.js b/sources/plugins/scayt/lang/af.js
new file mode 100644
index 00000000..57e54237
--- /dev/null
+++ b/sources/plugins/scayt/lang/af.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'af', {
6 btn_about: 'SCAYT info',
7 btn_dictionaries: 'Woordeboeke',
8 btn_disable: 'SCAYT af',
9 btn_enable: 'SCAYT aan',
10 btn_langs:'Tale',
11 btn_options: 'Opsies',
12 text_title: 'Speltoets terwyl u tik'
13});
diff --git a/sources/plugins/scayt/lang/ar.js b/sources/plugins/scayt/lang/ar.js
new file mode 100644
index 00000000..d7a5cace
--- /dev/null
+++ b/sources/plugins/scayt/lang/ar.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ar', {
6 btn_about: 'عن SCAYT',
7 btn_dictionaries: 'قواميس',
8 btn_disable: 'تعطيل SCAYT',
9 btn_enable: 'تفعيل SCAYT',
10 btn_langs:'لغات',
11 btn_options: 'خيارات',
12 text_title: 'تدقيق إملائي أثناء الكتابة'
13});
diff --git a/sources/plugins/scayt/lang/bg.js b/sources/plugins/scayt/lang/bg.js
new file mode 100644
index 00000000..550e82f2
--- /dev/null
+++ b/sources/plugins/scayt/lang/bg.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'bg', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Речници',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/bn.js b/sources/plugins/scayt/lang/bn.js
new file mode 100644
index 00000000..f0398d8c
--- /dev/null
+++ b/sources/plugins/scayt/lang/bn.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'bn', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/bs.js b/sources/plugins/scayt/lang/bs.js
new file mode 100644
index 00000000..268fab28
--- /dev/null
+++ b/sources/plugins/scayt/lang/bs.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'bs', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/ca.js b/sources/plugins/scayt/lang/ca.js
new file mode 100644
index 00000000..798cd0f3
--- /dev/null
+++ b/sources/plugins/scayt/lang/ca.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ca', {
6 btn_about: 'Quant a l\'SCAYT',
7 btn_dictionaries: 'Diccionaris',
8 btn_disable: 'Deshabilita SCAYT',
9 btn_enable: 'Habilitat l\'SCAYT',
10 btn_langs:'Idiomes',
11 btn_options: 'Opcions',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/cs.js b/sources/plugins/scayt/lang/cs.js
new file mode 100644
index 00000000..a0ec6141
--- /dev/null
+++ b/sources/plugins/scayt/lang/cs.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'cs', {
6 btn_about: 'O aplikaci SCAYT',
7 btn_dictionaries: 'Slovníky',
8 btn_disable: 'Vypnout SCAYT',
9 btn_enable: 'Zapnout SCAYT',
10 btn_langs:'Jazyky',
11 btn_options: 'Nastavení',
12 text_title: 'Kontrola pravopisu během psaní (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/cy.js b/sources/plugins/scayt/lang/cy.js
new file mode 100644
index 00000000..b94d6c31
--- /dev/null
+++ b/sources/plugins/scayt/lang/cy.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'cy', {
6 btn_about: 'Ynghylch SCAYT',
7 btn_dictionaries: 'Geiriaduron',
8 btn_disable: 'Analluogi SCAYT',
9 btn_enable: 'Galluogi SCAYT',
10 btn_langs:'Ieithoedd',
11 btn_options: 'Opsiynau',
12 text_title: 'Gwirio\'r Sillafu Wrth Deipio'
13});
diff --git a/sources/plugins/scayt/lang/da.js b/sources/plugins/scayt/lang/da.js
new file mode 100644
index 00000000..de05a38a
--- /dev/null
+++ b/sources/plugins/scayt/lang/da.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'da', {
6 btn_about: 'Om SCAYT',
7 btn_dictionaries: 'Ordbøger',
8 btn_disable: 'Deaktivér SCAYT',
9 btn_enable: 'Aktivér SCAYT',
10 btn_langs:'Sprog',
11 btn_options: 'Indstillinger',
12 text_title: 'Stavekontrol mens du skriver'
13});
diff --git a/sources/plugins/scayt/lang/de.js b/sources/plugins/scayt/lang/de.js
new file mode 100644
index 00000000..1b68c7b7
--- /dev/null
+++ b/sources/plugins/scayt/lang/de.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'de', {
6 btn_about: 'Über SCAYT',
7 btn_dictionaries: 'Wörterbücher',
8 btn_disable: 'SCAYT ausschalten',
9 btn_enable: 'SCAYT einschalten',
10 btn_langs:'Sprachen',
11 btn_options: 'Optionen',
12 text_title: 'Rechtschreibprüfung während der Texteingabe (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/el.js b/sources/plugins/scayt/lang/el.js
new file mode 100644
index 00000000..0bfe6209
--- /dev/null
+++ b/sources/plugins/scayt/lang/el.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'el', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Λεξικά',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Γλώσσες',
11 btn_options: 'Επιλογές',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/en-au.js b/sources/plugins/scayt/lang/en-au.js
new file mode 100644
index 00000000..f86d0db6
--- /dev/null
+++ b/sources/plugins/scayt/lang/en-au.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'en-au', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/en-ca.js b/sources/plugins/scayt/lang/en-ca.js
new file mode 100644
index 00000000..fa67a845
--- /dev/null
+++ b/sources/plugins/scayt/lang/en-ca.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'en-ca', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/en-gb.js b/sources/plugins/scayt/lang/en-gb.js
new file mode 100644
index 00000000..53923dfc
--- /dev/null
+++ b/sources/plugins/scayt/lang/en-gb.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'en-gb', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/en.js b/sources/plugins/scayt/lang/en.js
new file mode 100644
index 00000000..a9fb9047
--- /dev/null
+++ b/sources/plugins/scayt/lang/en.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'en', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/eo.js b/sources/plugins/scayt/lang/eo.js
new file mode 100644
index 00000000..f539e031
--- /dev/null
+++ b/sources/plugins/scayt/lang/eo.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'eo', {
6 btn_about: 'Pri OKDVT',
7 btn_dictionaries: 'Vortaroj',
8 btn_disable: 'Malebligi OKDVT',
9 btn_enable: 'Ebligi OKDVT',
10 btn_langs:'Lingvoj',
11 btn_options: 'Opcioj',
12 text_title: 'OrtografiKontrolado Dum Vi Tajpas (OKDVT)'
13});
diff --git a/sources/plugins/scayt/lang/es.js b/sources/plugins/scayt/lang/es.js
new file mode 100644
index 00000000..15c29d12
--- /dev/null
+++ b/sources/plugins/scayt/lang/es.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'es', {
6 btn_about: 'Acerca de Corrector',
7 btn_dictionaries: 'Diccionarios',
8 btn_disable: 'Desactivar Corrector',
9 btn_enable: 'Activar Corrector',
10 btn_langs:'Idiomas',
11 btn_options: 'Opciones',
12 text_title: 'Comprobar Ortografía Mientras Escribe'
13});
diff --git a/sources/plugins/scayt/lang/et.js b/sources/plugins/scayt/lang/et.js
new file mode 100644
index 00000000..a107bd82
--- /dev/null
+++ b/sources/plugins/scayt/lang/et.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'et', {
6 btn_about: 'SCAYT-ist lähemalt',
7 btn_dictionaries: 'Sõnaraamatud',
8 btn_disable: 'SCAYT keelatud',
9 btn_enable: 'SCAYT lubatud',
10 btn_langs:'Keeled',
11 btn_options: 'Valikud',
12 text_title: 'Õigekirjakontroll kirjutamise ajal'
13});
diff --git a/sources/plugins/scayt/lang/eu.js b/sources/plugins/scayt/lang/eu.js
new file mode 100644
index 00000000..deeeadaf
--- /dev/null
+++ b/sources/plugins/scayt/lang/eu.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'eu', {
6 btn_about: 'SCAYTi buruz',
7 btn_dictionaries: 'Hiztegiak',
8 btn_disable: 'Desgaitu SCAYT',
9 btn_enable: 'Gaitu SCAYT',
10 btn_langs:'Hizkuntzak',
11 btn_options: 'Aukerak',
12 text_title: 'Ortografia Zuzenketa Idatzi Ahala (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/fa.js b/sources/plugins/scayt/lang/fa.js
new file mode 100644
index 00000000..0830f689
--- /dev/null
+++ b/sources/plugins/scayt/lang/fa.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'fa', {
6 btn_about: 'درباره SCAYT',
7 btn_dictionaries: 'دیکشنریها',
8 btn_disable: 'غیرفعالسازی SCAYT',
9 btn_enable: 'فعالسازی SCAYT',
10 btn_langs:'زبانها',
11 btn_options: 'گزینهها',
12 text_title: 'بررسی املای تایپ شما'
13});
diff --git a/sources/plugins/scayt/lang/fi.js b/sources/plugins/scayt/lang/fi.js
new file mode 100644
index 00000000..3d2a1b17
--- /dev/null
+++ b/sources/plugins/scayt/lang/fi.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'fi', {
6 btn_about: 'Tietoja oikoluvusta kirjoitetaessa',
7 btn_dictionaries: 'Sanakirjat',
8 btn_disable: 'Poista käytöstä oikoluku kirjoitetaessa',
9 btn_enable: 'Ota käyttöön oikoluku kirjoitettaessa',
10 btn_langs:'Kielet',
11 btn_options: 'Asetukset',
12 text_title: 'Oikolue kirjoitettaessa'
13});
diff --git a/sources/plugins/scayt/lang/fo.js b/sources/plugins/scayt/lang/fo.js
new file mode 100644
index 00000000..61f5c66c
--- /dev/null
+++ b/sources/plugins/scayt/lang/fo.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'fo', {
6 btn_about: 'Um SCAYT',
7 btn_dictionaries: 'Orðabøkur',
8 btn_disable: 'Nokta SCAYT',
9 btn_enable: 'Loyv SCAYT',
10 btn_langs:'Tungumál',
11 btn_options: 'Uppseting',
12 text_title: 'Kanna stavseting, meðan tú skrivar'
13});
diff --git a/sources/plugins/scayt/lang/fr-ca.js b/sources/plugins/scayt/lang/fr-ca.js
new file mode 100644
index 00000000..18a14f51
--- /dev/null
+++ b/sources/plugins/scayt/lang/fr-ca.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'fr-ca', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/fr.js b/sources/plugins/scayt/lang/fr.js
new file mode 100644
index 00000000..c2c0ffb9
--- /dev/null
+++ b/sources/plugins/scayt/lang/fr.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'fr', {
6 btn_about: 'A propos de SCAYT',
7 btn_dictionaries: 'Dictionnaires',
8 btn_disable: 'Désactiver SCAYT',
9 btn_enable: 'Activer SCAYT',
10 btn_langs:'Langues',
11 btn_options: 'Options',
12 text_title: 'Vérification de l\'Orthographe en Cours de Frappe (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/gl.js b/sources/plugins/scayt/lang/gl.js
new file mode 100644
index 00000000..665c10d9
--- /dev/null
+++ b/sources/plugins/scayt/lang/gl.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'gl', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/gu.js b/sources/plugins/scayt/lang/gu.js
new file mode 100644
index 00000000..5b7b5d0b
--- /dev/null
+++ b/sources/plugins/scayt/lang/gu.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'gu', {
6 btn_about: 'SCAYT વિષે',
7 btn_dictionaries: 'શબ્દકોશ',
8 btn_disable: 'SCAYT ડિસેબલ કરવું',
9 btn_enable: 'SCAYT એનેબલ કરવું',
10 btn_langs:'ભાષાઓ',
11 btn_options: 'વિકલ્પો',
12 text_title: 'ટાઈપ કરતા સ્પેલ તપાસો'
13});
diff --git a/sources/plugins/scayt/lang/he.js b/sources/plugins/scayt/lang/he.js
new file mode 100644
index 00000000..3f4301a9
--- /dev/null
+++ b/sources/plugins/scayt/lang/he.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'he', {
6 btn_about: 'אודות SCAYT',
7 btn_dictionaries: 'מילון',
8 btn_disable: 'בטל SCAYT',
9 btn_enable: 'אפשר SCAYT',
10 btn_langs:'שפות',
11 btn_options: 'אפשרויות',
12 text_title: 'בדיקת איות בזמן כתיבה (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/hi.js b/sources/plugins/scayt/lang/hi.js
new file mode 100644
index 00000000..d05d1976
--- /dev/null
+++ b/sources/plugins/scayt/lang/hi.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'hi', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/hr.js b/sources/plugins/scayt/lang/hr.js
new file mode 100644
index 00000000..94da1a4a
--- /dev/null
+++ b/sources/plugins/scayt/lang/hr.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'hr', {
6 btn_about: 'O SCAYT',
7 btn_dictionaries: 'Rječnici',
8 btn_disable: 'Onemogući SCAYT',
9 btn_enable: 'Omogući SCAYT',
10 btn_langs:'Jezici',
11 btn_options: 'Opcije',
12 text_title: 'Provjeri pravopis tijekom tipkanja (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/hu.js b/sources/plugins/scayt/lang/hu.js
new file mode 100644
index 00000000..5c1fff35
--- /dev/null
+++ b/sources/plugins/scayt/lang/hu.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'hu', {
6 btn_about: 'SCAYT névjegy',
7 btn_dictionaries: 'Szótár',
8 btn_disable: 'SCAYT letiltása',
9 btn_enable: 'SCAYT engedélyezése',
10 btn_langs:'Nyelvek',
11 btn_options: 'Beállítások',
12 text_title: 'Helyesírás ellenőrzés gépelés közben'
13});
diff --git a/sources/plugins/scayt/lang/is.js b/sources/plugins/scayt/lang/is.js
new file mode 100644
index 00000000..d3c488f0
--- /dev/null
+++ b/sources/plugins/scayt/lang/is.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'is', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/it.js b/sources/plugins/scayt/lang/it.js
new file mode 100644
index 00000000..05fe90f2
--- /dev/null
+++ b/sources/plugins/scayt/lang/it.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'it', {
6 btn_about: 'About COMS',
7 btn_dictionaries: 'Dizionari',
8 btn_disable: 'Disabilita COMS',
9 btn_enable: 'Abilita COMS',
10 btn_langs:'Lingue',
11 btn_options: 'Opzioni',
12 text_title: 'Controllo Ortografico Mentre Scrivi'
13});
diff --git a/sources/plugins/scayt/lang/ja.js b/sources/plugins/scayt/lang/ja.js
new file mode 100644
index 00000000..bc66e6e9
--- /dev/null
+++ b/sources/plugins/scayt/lang/ja.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ja', {
6 btn_about: 'SCAYTバージョン',
7 btn_dictionaries: '辞書',
8 btn_disable: 'SCAYT無効',
9 btn_enable: 'SCAYT有効',
10 btn_langs:'言語',
11 btn_options: 'オプション',
12 text_title: 'スペルチェック設定(SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/ka.js b/sources/plugins/scayt/lang/ka.js
new file mode 100644
index 00000000..2504a998
--- /dev/null
+++ b/sources/plugins/scayt/lang/ka.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ka', {
6 btn_about: 'SCAYT-ის შესახებ',
7 btn_dictionaries: 'ლექსიკონები',
8 btn_disable: 'SCAYT-ის გამორთვა',
9 btn_enable: 'SCAYT-ის ჩართვა',
10 btn_langs:'ენები',
11 btn_options: 'პარამეტრები',
12 text_title: 'მართლწერის შემოწმება კრეფისას'
13});
diff --git a/sources/plugins/scayt/lang/km.js b/sources/plugins/scayt/lang/km.js
new file mode 100644
index 00000000..e0749431
--- /dev/null
+++ b/sources/plugins/scayt/lang/km.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'km', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/ko.js b/sources/plugins/scayt/lang/ko.js
new file mode 100644
index 00000000..26311081
--- /dev/null
+++ b/sources/plugins/scayt/lang/ko.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ko', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/ku.js b/sources/plugins/scayt/lang/ku.js
new file mode 100644
index 00000000..b811be52
--- /dev/null
+++ b/sources/plugins/scayt/lang/ku.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ku', {
6 btn_about: 'دهربارهی SCAYT',
7 btn_dictionaries: 'فهرههنگهکان',
8 btn_disable: 'ناچالاککردنی SCAYT',
9 btn_enable: 'چالاککردنی SCAYT',
10 btn_langs:'زمانهکان',
11 btn_options: 'ههڵبژارده',
12 text_title: 'پشکنینی نووسه لهکاتی نووسین'
13});
diff --git a/sources/plugins/scayt/lang/lt.js b/sources/plugins/scayt/lang/lt.js
new file mode 100644
index 00000000..f9744ce8
--- /dev/null
+++ b/sources/plugins/scayt/lang/lt.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'lt', {
6 btn_about: 'Apie SCAYT',
7 btn_dictionaries: 'Žodynai',
8 btn_disable: 'Išjungti SCAYT',
9 btn_enable: 'Įjungti SCAYT',
10 btn_langs:'Kalbos',
11 btn_options: 'Parametrai',
12 text_title: 'Tikrinti klaidas kai rašoma'
13});
diff --git a/sources/plugins/scayt/lang/lv.js b/sources/plugins/scayt/lang/lv.js
new file mode 100644
index 00000000..b839a5b5
--- /dev/null
+++ b/sources/plugins/scayt/lang/lv.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'lv', {
6 btn_about: 'Par SCAYT',
7 btn_dictionaries: 'Vārdnīcas',
8 btn_disable: 'Atslēgt SCAYT',
9 btn_enable: 'Ieslēgt SCAYT',
10 btn_langs:'Valodas',
11 btn_options: 'Uzstādījumi',
12 text_title: 'Pārbaudīt gramatiku rakstot'
13});
diff --git a/sources/plugins/scayt/lang/mk.js b/sources/plugins/scayt/lang/mk.js
new file mode 100644
index 00000000..f740b8a3
--- /dev/null
+++ b/sources/plugins/scayt/lang/mk.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'mk', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/mn.js b/sources/plugins/scayt/lang/mn.js
new file mode 100644
index 00000000..5df4bf0b
--- /dev/null
+++ b/sources/plugins/scayt/lang/mn.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'mn', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Толь бичгүүд',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Хэлүүд',
11 btn_options: 'Сонголт',
12 text_title: 'Spell Check As You Type'
13});
diff --git a/sources/plugins/scayt/lang/ms.js b/sources/plugins/scayt/lang/ms.js
new file mode 100644
index 00000000..0c6b31c7
--- /dev/null
+++ b/sources/plugins/scayt/lang/ms.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ms', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type' // MISSING
13});
diff --git a/sources/plugins/scayt/lang/nb.js b/sources/plugins/scayt/lang/nb.js
new file mode 100644
index 00000000..73cb009a
--- /dev/null
+++ b/sources/plugins/scayt/lang/nb.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'nb', {
6 btn_about: 'Om SCAYT',
7 btn_dictionaries: 'Ordbøker',
8 btn_disable: 'Slå av SCAYT',
9 btn_enable: 'Slå på SCAYT',
10 btn_langs:'Språk',
11 btn_options: 'Valg',
12 text_title: 'Stavekontroll mens du skriver'
13});
diff --git a/sources/plugins/scayt/lang/nl.js b/sources/plugins/scayt/lang/nl.js
new file mode 100644
index 00000000..4d6ed02b
--- /dev/null
+++ b/sources/plugins/scayt/lang/nl.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'nl', {
6 btn_about: 'Over SCAYT',
7 btn_dictionaries: 'Woordenboeken',
8 btn_disable: 'SCAYT uitschakelen',
9 btn_enable: 'SCAYT inschakelen',
10 btn_langs:'Talen',
11 btn_options: 'Opties',
12 text_title: 'Controleer de spelling tijdens het typen'
13});
diff --git a/sources/plugins/scayt/lang/no.js b/sources/plugins/scayt/lang/no.js
new file mode 100644
index 00000000..0d0006aa
--- /dev/null
+++ b/sources/plugins/scayt/lang/no.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'no', {
6 btn_about: 'Om SCAYT',
7 btn_dictionaries: 'Ordbøker',
8 btn_disable: 'Slå av SCAYT',
9 btn_enable: 'Slå på SCAYT',
10 btn_langs:'Språk',
11 btn_options: 'Valg',
12 text_title: 'Stavekontroll mens du skriver'
13});
diff --git a/sources/plugins/scayt/lang/pl.js b/sources/plugins/scayt/lang/pl.js
new file mode 100644
index 00000000..db3eb362
--- /dev/null
+++ b/sources/plugins/scayt/lang/pl.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'pl', {
6 btn_about: 'Informacje o SCAYT',
7 btn_dictionaries: 'Słowniki',
8 btn_disable: 'Wyłącz SCAYT',
9 btn_enable: 'Włącz SCAYT',
10 btn_langs:'Języki',
11 btn_options: 'Opcje',
12 text_title: 'Sprawdź pisownię podczas pisania (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/pt-br.js b/sources/plugins/scayt/lang/pt-br.js
new file mode 100644
index 00000000..ac37fc42
--- /dev/null
+++ b/sources/plugins/scayt/lang/pt-br.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'pt-br', {
6 btn_about: 'Sobre a correção ortográfica durante a digitação',
7 btn_dictionaries: 'Dicionários',
8 btn_disable: 'Desabilitar correção ortográfica durante a digitação',
9 btn_enable: 'Habilitar correção ortográfica durante a digitação',
10 btn_langs:'Idiomas',
11 btn_options: 'Opções',
12 text_title: 'Correção ortográfica durante a digitação'
13});
diff --git a/sources/plugins/scayt/lang/pt.js b/sources/plugins/scayt/lang/pt.js
new file mode 100644
index 00000000..932b2df2
--- /dev/null
+++ b/sources/plugins/scayt/lang/pt.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'pt', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type' // MISSING
13});
diff --git a/sources/plugins/scayt/lang/ro.js b/sources/plugins/scayt/lang/ro.js
new file mode 100644
index 00000000..b2c84b2d
--- /dev/null
+++ b/sources/plugins/scayt/lang/ro.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ro', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type' // MISSING
13});
diff --git a/sources/plugins/scayt/lang/ru.js b/sources/plugins/scayt/lang/ru.js
new file mode 100644
index 00000000..0f142cd1
--- /dev/null
+++ b/sources/plugins/scayt/lang/ru.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ru', {
6 btn_about: 'О SCAYT',
7 btn_dictionaries: 'Словари',
8 btn_disable: 'Отключить SCAYT',
9 btn_enable: 'Включить SCAYT',
10 btn_langs:'Языки',
11 btn_options: 'Настройки',
12 text_title: 'Проверка орфографии по мере ввода (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/sk.js b/sources/plugins/scayt/lang/sk.js
new file mode 100644
index 00000000..81ca5bcc
--- /dev/null
+++ b/sources/plugins/scayt/lang/sk.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'sk', {
6 btn_about: 'O KPPP (Kontrola pravopisu počas písania)',
7 btn_dictionaries: 'Slovníky',
8 btn_disable: 'Zakázať KPPP (Kontrola pravopisu počas písania)',
9 btn_enable: 'Povoliť KPPP (Kontrola pravopisu počas písania)',
10 btn_langs:'Jazyky',
11 btn_options: 'Možnosti',
12 text_title: 'Kontrola pravopisu počas písania'
13});
diff --git a/sources/plugins/scayt/lang/sl.js b/sources/plugins/scayt/lang/sl.js
new file mode 100644
index 00000000..44f1c122
--- /dev/null
+++ b/sources/plugins/scayt/lang/sl.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'sl', {
6 btn_about: 'O storitvi SCAYT',
7 btn_dictionaries: 'Slovarji',
8 btn_disable: 'Onemogoči SCAYT',
9 btn_enable: 'Omogoči SCAYT',
10 btn_langs:'Jeziki',
11 btn_options: 'Možnosti',
12 text_title: 'Črkovanje med tipkanjem'
13});
diff --git a/sources/plugins/scayt/lang/sr-latn.js b/sources/plugins/scayt/lang/sr-latn.js
new file mode 100644
index 00000000..d2dbbd3d
--- /dev/null
+++ b/sources/plugins/scayt/lang/sr-latn.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'sr-latn', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type' // MISSING
13});
diff --git a/sources/plugins/scayt/lang/sr.js b/sources/plugins/scayt/lang/sr.js
new file mode 100644
index 00000000..6fa35d2c
--- /dev/null
+++ b/sources/plugins/scayt/lang/sr.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'sr', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type' // MISSING
13});
diff --git a/sources/plugins/scayt/lang/sv.js b/sources/plugins/scayt/lang/sv.js
new file mode 100644
index 00000000..738ac7e3
--- /dev/null
+++ b/sources/plugins/scayt/lang/sv.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'sv', {
6 btn_about: 'Om SCAYT',
7 btn_dictionaries: 'Ordlistor',
8 btn_disable: 'Inaktivera SCAYT',
9 btn_enable: 'Aktivera SCAYT',
10 btn_langs:'Språk',
11 btn_options: 'Inställningar',
12 text_title: 'Stavningskontroll medan du skriver'
13});
diff --git a/sources/plugins/scayt/lang/th.js b/sources/plugins/scayt/lang/th.js
new file mode 100644
index 00000000..f129315b
--- /dev/null
+++ b/sources/plugins/scayt/lang/th.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'th', {
6 btn_about: 'About SCAYT',
7 btn_dictionaries: 'Dictionaries',
8 btn_disable: 'Disable SCAYT',
9 btn_enable: 'Enable SCAYT',
10 btn_langs:'Languages',
11 btn_options: 'Options',
12 text_title: 'Spell Check As You Type' // MISSING
13});
diff --git a/sources/plugins/scayt/lang/tr.js b/sources/plugins/scayt/lang/tr.js
new file mode 100644
index 00000000..0e315091
--- /dev/null
+++ b/sources/plugins/scayt/lang/tr.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'tr', {
6 btn_about: 'SCAYT\'ı hakkında',
7 btn_dictionaries: 'Sözlükler',
8 btn_disable: 'SCAYT\'ı pasifleştir',
9 btn_enable: 'SCAYT\'ı etkinleştir',
10 btn_langs:'Diller',
11 btn_options: 'Seçenekler',
12 text_title: 'Girmiş olduğunuz kelime denetimi'
13});
diff --git a/sources/plugins/scayt/lang/ug.js b/sources/plugins/scayt/lang/ug.js
new file mode 100644
index 00000000..e453cc71
--- /dev/null
+++ b/sources/plugins/scayt/lang/ug.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'ug', {
6 btn_about: 'شۇئان ئىملا تەكشۈرۈش ھەققىدە',
7 btn_dictionaries: 'لۇغەت',
8 btn_disable: 'شۇئان ئىملا تەكشۈرۈشنى چەكلە',
9 btn_enable: 'شۇئان ئىملا تەكشۈرۈشنى قوزغات',
10 btn_langs:'تىل',
11 btn_options: 'تاللانما',
12 text_title: 'شۇئان ئىملا تەكشۈر'
13});
diff --git a/sources/plugins/scayt/lang/uk.js b/sources/plugins/scayt/lang/uk.js
new file mode 100644
index 00000000..682a897b
--- /dev/null
+++ b/sources/plugins/scayt/lang/uk.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'uk', {
6 btn_about: 'Про SCAYT',
7 btn_dictionaries: 'Словники',
8 btn_disable: 'Вимкнути SCAYT',
9 btn_enable: 'Ввімкнути SCAYT',
10 btn_langs:'Мови',
11 btn_options: 'Опції',
12 text_title: 'Перефірка орфографії по мірі набору'
13});
diff --git a/sources/plugins/scayt/lang/vi.js b/sources/plugins/scayt/lang/vi.js
new file mode 100644
index 00000000..fcdfeabe
--- /dev/null
+++ b/sources/plugins/scayt/lang/vi.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'vi', {
6 btn_about: 'Thông tin về SCAYT',
7 btn_dictionaries: 'Từ điển',
8 btn_disable: 'Tắt SCAYT',
9 btn_enable: 'Bật SCAYT',
10 btn_langs:'Ngôn ngữ',
11 btn_options: 'Tùy chọn',
12 text_title: 'Kiểm tra chính tả ngay khi gõ chữ (SCAYT)'
13});
diff --git a/sources/plugins/scayt/lang/zh-cn.js b/sources/plugins/scayt/lang/zh-cn.js
new file mode 100644
index 00000000..a58502af
--- /dev/null
+++ b/sources/plugins/scayt/lang/zh-cn.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'zh-cn', {
6 btn_about: '关于即时拼写检查',
7 btn_dictionaries: '字典',
8 btn_disable: '禁用即时拼写检查',
9 btn_enable: '启用即时拼写检查',
10 btn_langs:'语言',
11 btn_options: '选项',
12 text_title: '即时拼写检查'
13});
diff --git a/sources/plugins/scayt/lang/zh.js b/sources/plugins/scayt/lang/zh.js
new file mode 100644
index 00000000..0bb259e1
--- /dev/null
+++ b/sources/plugins/scayt/lang/zh.js
@@ -0,0 +1,13 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'scayt', 'zh', {
6 btn_about: '關於即時拼寫檢查',
7 btn_dictionaries: '字典',
8 btn_disable: '關閉即時拼寫檢查',
9 btn_enable: '啟用即時拼寫檢查',
10 btn_langs: '語言',
11 btn_options: '選項',
12 text_title: '即時拼寫檢查'
13});
diff --git a/sources/plugins/scayt/plugin.js b/sources/plugins/scayt/plugin.js
new file mode 100644
index 00000000..ef315263
--- /dev/null
+++ b/sources/plugins/scayt/plugin.js
@@ -0,0 +1,1800 @@
1'use strict';
2CKEDITOR.plugins.add('scayt', {
3
4 //requires : ['menubutton', 'dialog'],
5 requires: 'menubutton,dialog',
6 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en-au,en-ca,en-gb,en,eo,es,et,eu,fa,fi,fo,fr-ca,fr,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,lt,lv,mk,mn,ms,nb,nl,no,pl,pt-br,pt,ro,ru,sk,sl,sr-latn,sr,sv,th,tr,ug,uk,vi,zh-cn,zh', // %REMOVE_LINE_CORE%
7 icons: 'scayt', // %REMOVE_LINE_CORE%
8 hidpi: true, // %REMOVE_LINE_CORE%
9 tabToOpen : null,
10 dialogName: 'scaytDialog',
11 init: function(editor) {
12 var self = this,
13 plugin = CKEDITOR.plugins.scayt;
14
15 this.bindEvents(editor);
16 this.parseConfig(editor);
17 this.addRule(editor);
18
19 // source mode
20 CKEDITOR.dialog.add(this.dialogName, CKEDITOR.getUrl(this.path + 'dialogs/options.js'));
21 // end source mode
22
23 this.addMenuItems(editor);
24 var config = editor.config,
25 lang = editor.lang.scayt,
26 env = CKEDITOR.env;
27
28 editor.ui.add('Scayt', CKEDITOR.UI_MENUBUTTON, {
29 label : lang.text_title,
30 title : ( editor.plugins.wsc ? editor.lang.wsc.title : lang.text_title ),
31 // SCAYT doesn't work in IE Compatibility Mode and IE (8 & 9) Quirks Mode
32 modes : {wysiwyg: !(env.ie && ( env.version < 8 || env.quirks ) ) },
33 toolbar: 'spellchecker,20',
34 refresh: function() {
35 var buttonState = editor.ui.instances.Scayt.getState();
36
37 // check if scayt is created
38 if(editor.scayt) {
39 // check if scayt is enabled
40 if(plugin.state.scayt[editor.name]) {
41 buttonState = CKEDITOR.TRISTATE_ON;
42 } else {
43 buttonState = CKEDITOR.TRISTATE_OFF;
44 }
45 }
46
47 editor.fire('scaytButtonState', buttonState);
48 },
49 onRender: function() {
50 var that = this;
51
52 editor.on('scaytButtonState', function(ev) {
53 if(typeof ev.data !== undefined) {
54 that.setState(ev.data);
55 }
56 });
57 },
58 onMenu : function() {
59 var scaytInstance = editor.scayt;
60
61 editor.getMenuItem('scaytToggle').label = editor.lang.scayt[(scaytInstance ? plugin.state.scayt[editor.name] : false) ? 'btn_disable' : 'btn_enable'];
62
63 // If UI tab is disabled we shouldn't show menu item
64 var menuDefinition = {
65 scaytToggle : CKEDITOR.TRISTATE_OFF,
66 scaytOptions : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
67 scaytLangs : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
68 scaytDict : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
69 scaytAbout : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
70 WSC : editor.plugins.wsc ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
71 };
72
73 if(!editor.config.scayt_uiTabs[0]) {
74 delete menuDefinition.scaytOptions;
75 }
76
77 if(!editor.config.scayt_uiTabs[1]) {
78 delete menuDefinition.scaytLangs;
79 }
80
81 if(!editor.config.scayt_uiTabs[2]) {
82 delete menuDefinition.scaytDict;
83 }
84
85 return menuDefinition;
86 }
87 });
88
89 // If the 'contextmenu' plugin is loaded, register the listeners.
90 if(editor.contextMenu && editor.addMenuItems) {
91 editor.contextMenu.addListener(function(element, selection) {
92 var scaytInstance = editor.scayt,
93 result, selectionNode;
94
95 if(scaytInstance) {
96 selectionNode = scaytInstance.getSelectionNode();
97
98 // SCAYT shouldn't build context menu if instance isnot created or word is without misspelling or grammar problem
99 if(selectionNode) {
100 var items = self.menuGenerator(editor, selectionNode);
101
102 scaytInstance.showBanner('.' + editor.contextMenu._.definition.panel.className.split(' ').join(' .'));
103 result = items;
104 }
105 }
106
107 return result;
108 });
109
110 editor.contextMenu._.onHide = CKEDITOR.tools.override(editor.contextMenu._.onHide, function(org) {
111 return function() {
112 var scaytInstance = editor.scayt;
113
114 if(scaytInstance) {
115 scaytInstance.hideBanner();
116 }
117
118 return org.apply(this);
119 };
120 });
121 }
122 },
123 addMenuItems: function(editor) {
124 var self = this,
125 plugin = CKEDITOR.plugins.scayt,
126 graytGroups = ['grayt_description', 'grayt_suggest', 'grayt_control'],
127 menuGroup = 'scaytButton';
128
129 editor.addMenuGroup(menuGroup);
130
131 var items_order = editor.config.scayt_contextMenuItemsOrder.split('|');
132
133 for(var pos = 0 ; pos < items_order.length ; pos++) {
134 items_order[pos] = 'scayt_' + items_order[pos];
135 }
136 items_order = graytGroups.concat(items_order);
137
138 if(items_order && items_order.length) {
139 for(var pos = 0 ; pos < items_order.length ; pos++) {
140 editor.addMenuGroup(items_order[pos], pos - 10);
141 }
142 }
143
144 editor.addCommand( 'scaytToggle', {
145 exec: function(editor) {
146 var scaytInstance = editor.scayt;
147
148 plugin.state.scayt[editor.name] = !plugin.state.scayt[editor.name];
149
150 if(plugin.state.scayt[editor.name] === true) {
151 if(!scaytInstance) {
152 plugin.createScayt(editor);
153 }
154 } else {
155 if(scaytInstance) {
156 plugin.destroy(editor);
157 }
158 }
159 }
160 } );
161
162 editor.addCommand( 'scaytAbout', {
163 exec: function(editor) {
164 var scaytInstance = editor.scayt;
165
166 scaytInstance.tabToOpen = 'about';
167 editor.lockSelection();
168 editor.openDialog(self.dialogName);
169 }
170 } );
171
172 editor.addCommand( 'scaytOptions', {
173 exec: function(editor) {
174 var scaytInstance = editor.scayt;
175
176 scaytInstance.tabToOpen = 'options';
177 editor.lockSelection();
178 editor.openDialog(self.dialogName);
179 }
180 } );
181
182 editor.addCommand( 'scaytLangs', {
183 exec: function(editor) {
184 var scaytInstance = editor.scayt;
185
186 scaytInstance.tabToOpen = 'langs';
187 editor.lockSelection();
188 editor.openDialog(self.dialogName);
189 }
190 } );
191
192 editor.addCommand( 'scaytDict', {
193 exec: function(editor) {
194 var scaytInstance = editor.scayt;
195
196 scaytInstance.tabToOpen = 'dictionaries';
197 editor.lockSelection();
198 editor.openDialog(self.dialogName);
199 }
200 } );
201
202 var uiMenuItems = {
203 scaytToggle: {
204 label : editor.lang.scayt.btn_enable,
205 group : menuGroup,
206 command: 'scaytToggle'
207 },
208 scaytAbout: {
209 label : editor.lang.scayt.btn_about,
210 group : menuGroup,
211 command: 'scaytAbout'
212 },
213 scaytOptions: {
214 label : editor.lang.scayt.btn_options,
215 group : menuGroup,
216 command: 'scaytOptions'
217 },
218 scaytLangs: {
219 label : editor.lang.scayt.btn_langs,
220 group : menuGroup,
221 command: 'scaytLangs'
222 },
223 scaytDict: {
224 label : editor.lang.scayt.btn_dictionaries,
225 group : menuGroup,
226 command: 'scaytDict'
227 }
228 };
229
230 if(editor.plugins.wsc) {
231 uiMenuItems.WSC = {
232 label : editor.lang.wsc.toolbar,
233 group : menuGroup,
234 onClick: function() {
235 var inlineMode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE),
236 plugin = CKEDITOR.plugins.scayt,
237 scaytInstance = editor.scayt,
238 text = inlineMode ? editor.container.getText() : editor.document.getBody().getText();
239
240 text = text.replace(/\s/g, '');
241
242 if(text) {
243 if(scaytInstance && plugin.state.scayt[editor.name] && scaytInstance.setMarkupPaused) {
244 scaytInstance.setMarkupPaused(true);
245 }
246
247 editor.lockSelection();
248 editor.execCommand('checkspell');
249 } else {
250 alert('Nothing to check!');
251 }
252 }
253 }
254 }
255
256 editor.addMenuItems(uiMenuItems);
257 },
258 bindEvents: function(editor) {
259 var self = this,
260 plugin = CKEDITOR.plugins.scayt,
261 inline_mode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE);
262
263 var scaytDestroy = function() {
264 plugin.destroy(editor);
265 };
266
267 /**
268 * Dirty fix for placeholder drag&drop
269 * Should be fixed with next release
270 */
271 /*
272 editor.on('drop', function(evt) {
273 var dropRange = evt.data.dropRange;
274 var b = dropRange.createBookmark(true);
275 editor.scayt.removeMarkupInSelectionNode({ selectionNode: evt.data.target.$, forceBookmark: false });
276 dropRange.moveToBookmark(b);
277
278 evt.data.dropRange = dropRange;
279 return evt;
280 }, this, null, 0); // We should be sure that we modify dropRange before CKEDITOR.plugins.clipboard calls
281 */
282
283 var contentDomReady = function() {
284 // The event is fired when editable iframe node was reinited so we should restart our service
285 if (plugin.state.scayt[editor.name] && !editor.readOnly && !editor.scayt) {
286 plugin.createScayt(editor);
287 }
288 };
289
290 var addMarkupStateHandlers = function() {
291 var editable = editor.editable();
292
293 editable.attachListener( editable, 'focus', function( evt ) {
294 if( CKEDITOR.plugins.scayt && !editor.scayt ) {
295 setTimeout(contentDomReady, 0); // we need small timeout in order to correctly set initial 'focused' option value in SCAYT core
296 }
297
298 var pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[editor.name] && editor.scayt,
299 selectedElement, ranges, textLength, range;
300
301 if((inline_mode ? true : pluginStatus) && editor._.savedSelection) {
302 selectedElement = editor._.savedSelection.getSelectedElement();
303 ranges = !selectedElement && editor._.savedSelection.getRanges();
304
305 for(var i = 0; i < ranges.length; i++) {
306 range = ranges[i];
307 // we need to check type of node value in order to avoid error in IE when accessing 'nodeValue' property
308 if(typeof range.startContainer.$.nodeValue === 'string') {
309 textLength = range.startContainer.getText().length;
310 if(textLength < range.startOffset || textLength < range.endOffset) {
311 editor.unlockSelection(false);
312 }
313 }
314 }
315 }
316 }, this, null, -10 ); // priority "-10" is set to call SCAYT CKEDITOR.editor#unlockSelection before CKEDITOR.editor#unlockSelection call
317 };
318
319 var contentDomHandler = function() {
320 if(inline_mode) {
321
322 if (!editor.config.scayt_inlineModeImmediateMarkup) {
323 /**
324 * Give an opportunity to CKEditor to perform all needed updates
325 * and only after that call 'scaytDestroy' method (#72725)
326 */
327 editor.on('blur', function () { setTimeout( scaytDestroy, 0 ); } );
328 editor.on('focus', contentDomReady);
329
330 // We need to check if editor has focus(created) right now.
331 // If editor is active - make attempt to create scayt
332 if(editor.focusManager.hasFocus) {
333 contentDomReady();
334 }
335
336 } else {
337 contentDomReady();
338 }
339
340 } else {
341 contentDomReady();
342 }
343
344 addMarkupStateHandlers();
345
346 /**
347 * 'mousedown' handler handle widget selection (click on widget). To
348 * fix the issue when widget#wrapper referenced to element which can
349 * be broken after markup.
350 */
351 var editable = editor.editable();
352 editable.attachListener(editable, 'mousedown', function( evt ) {
353 var target = evt.data.getTarget();
354 var widget = editor.widgets && editor.widgets.getByElement( target );
355 if ( widget ) {
356 widget.wrapper = target.getAscendant( function( el ) {
357 return el.hasAttribute( 'data-cke-widget-wrapper' )
358 }, true );
359 }
360 }, this, null, -10); // '-10': we need to be shure that widget#wrapper updated before any other calls
361 };
362
363 editor.on('contentDom', contentDomHandler);
364
365 editor.on('beforeCommandExec', function(ev) {
366 var scaytInstance = editor.scayt,
367 selectedLangElement = null,
368 forceBookmark = false,
369 removeMarkupInsideSelection = true;
370
371 // TODO: after switching in source mode not recreate SCAYT instance, try to just rerun markuping to don't make requests to server
372 if(ev.data.name in plugin.options.disablingCommandExec && editor.mode == 'wysiwyg') {
373 if(scaytInstance) {
374 plugin.destroy(editor);
375 editor.fire('scaytButtonState', CKEDITOR.TRISTATE_DISABLED);
376 }
377 } else if( ev.data.name === 'bold' || ev.data.name === 'italic' || ev.data.name === 'underline' ||
378 ev.data.name === 'strike' || ev.data.name === 'subscript' || ev.data.name === 'superscript' ||
379 ev.data.name === 'enter' || ev.data.name === 'cut' || ev.data.name === 'language') {
380 if(scaytInstance) {
381 if(ev.data.name === 'cut') {
382 removeMarkupInsideSelection = false;
383 // We need to force bookmark before we remove our markup.
384 // Otherwise we will get issues with cutting text via context menu.
385 forceBookmark = true;
386 }
387
388 // We need to remove all SCAYT markup from 'lang' node before it will be deleted.
389 // We need to remove SCAYT markup from selected text before creating 'lang' node as well.
390 if(ev.data.name === 'language') {
391 selectedLangElement = editor.plugins.language.getCurrentLangElement(editor);
392 selectedLangElement = selectedLangElement && selectedLangElement.$;
393 // We need to force bookmark before we remove our markup.
394 // Otherwise we will get issues with cutting text via language plugin menu.
395 forceBookmark = true;
396 }
397
398 editor.fire('reloadMarkupScayt', {
399 removeOptions: {
400 removeInside: removeMarkupInsideSelection,
401 forceBookmark: forceBookmark,
402 selectionNode: selectedLangElement
403 },
404 timeout: 0
405 });
406 }
407 }
408 });
409
410 editor.on('beforeSetMode', function(ev) {
411 var scaytInstance;
412 // needed when we use:
413 // CKEDITOR.instances.editor_ID.setMode("source")
414 // CKEDITOR.instances.editor_ID.setMode("wysiwyg")
415 // can't be implemented in editor.on('mode', function(ev) {});
416 if (ev.data == 'source') {
417 scaytInstance = editor.scayt;
418 if(scaytInstance) {
419 plugin.destroy(editor);
420 editor.fire('scaytButtonState', CKEDITOR.TRISTATE_DISABLED);
421 }
422
423 // remove custom data from body, to prevent waste properties showing in IE8
424 if(editor.document) { //GitHub #84 : make sure that document exists(e.g. when startup mode set to 'source')
425 editor.document.getBody().removeAttribute('_jquid');
426 }
427 }
428 });
429
430 editor.on('afterCommandExec', function(ev) {
431 if(editor.mode == 'wysiwyg' && (ev.data.name == 'undo' || ev.data.name == 'redo')) {
432 setTimeout(function() {
433 var scaytInstance = editor.scayt,
434 scaytLangList = scaytInstance && scaytInstance.getScaytLangList();
435
436 /**
437 * Checks SCAYT initialization of LangList. To prevent immediate
438 * markup which is triggered by 'startSpellCheck' event.
439 * E.g.: Drop into inline CKEDITOR with scayt_autoStartup = true;
440 */
441 if (!scaytLangList || !(scaytLangList.ltr && scaytLangList.rtl)) return;
442
443 scaytInstance.fire('startSpellCheck, startGrammarCheck');
444 }, 250);
445 }
446 });
447
448 // handle readonly changes
449 editor.on('readOnly', function(ev) {
450 var scaytInstance;
451
452 if(ev) {
453 scaytInstance = editor.scayt;
454
455 if(ev.editor.readOnly === true) {
456 if(scaytInstance) {
457 scaytInstance.fire('removeMarkupInDocument', {});
458 }
459 } else {
460 if(scaytInstance) {
461 scaytInstance.fire('startSpellCheck, startGrammarCheck');
462 } else if(ev.editor.mode == 'wysiwyg' && plugin.state.scayt[ev.editor.name] === true) {
463 plugin.createScayt(editor);
464 ev.editor.fire('scaytButtonState', CKEDITOR.TRISTATE_ON);
465 }
466 }
467 }
468 });
469
470 // we need to destroy SCAYT before CK editor will be completely destroyed
471 editor.on('beforeDestroy', scaytDestroy);
472
473 //#9439 after SetData method fires contentDom event and SCAYT create additional instanse
474 // This way we should destroy SCAYT on setData event when contenteditable Iframe was re-created
475 editor.on('setData', function() {
476 scaytDestroy();
477
478 // in inline mode SetData does not fire contentDom event
479 if(editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE || editor.plugins.divarea) {
480 contentDomHandler();
481 }
482 }, this, null, 50);
483
484 /**
485 * Main entry point to react on changes in document
486 */
487 editor.on('reloadMarkupScayt', function(ev) {
488 var removeOptions = ev.data && ev.data.removeOptions,
489 timeout = ev.data && ev.data.timeout;
490
491 /**
492 * Perform removeMarkupInSelectionNode and 'startSpellCheck' fire
493 * asynchroniosly and keep CKEDITOR flow as expected
494 */
495 setTimeout(function() {
496 var scaytInstance = editor.scayt,
497 scaytLangList = scaytInstance && scaytInstance.getScaytLangList();
498
499 /**
500 * Checks SCAYT initialization of LangList. To prevent immediate
501 * markup which is triggered by 'startSpellCheck' event.
502 * E.g.: Drop into inline CKEDITOR with scayt_autoStartup = true;
503 */
504 if (!scaytLangList || !(scaytLangList.ltr && scaytLangList.rtl)) return;
505
506 /**
507 * CKEditor can keep \u200B character in document (with selection#selectRanges)
508 * we need to take care about that. For this case we fire
509 * 'keydown' [left arrow], what will trigger 'removeFillingChar' on Webkit
510 * to cleanup the document
511 */
512 editor.document.fire( 'keydown', new CKEDITOR.dom.event( { keyCode: 37 } ) );
513
514 /* trigger remove markup with 'startSpellCheck' */
515 scaytInstance.removeMarkupInSelectionNode(removeOptions);
516 scaytInstance.fire('startSpellCheck, startGrammarCheck');
517 }, timeout || 0 );
518 });
519
520 // Reload spell-checking for current word after insertion completed.
521 editor.on('insertElement', function() {
522 // IE bug: we need wait here to make sure that focus is returned to editor, and we can store the selection before we proceed with markup
523 editor.fire('reloadMarkupScayt', {removeOptions: {forceBookmark: true}});
524 }, this, null, 50);
525
526 editor.on('insertHtml', function() {
527 editor.fire('reloadMarkupScayt');
528 }, this, null, 50);
529
530 editor.on('insertText', function() {
531 editor.fire('reloadMarkupScayt');
532 }, this, null, 50);
533
534 // The event is listening to open necessary dialog tab
535 editor.on('scaytDialogShown', function(ev) {
536 var dialog = ev.data,
537 scaytInstance = editor.scayt;
538
539 dialog.selectPage(scaytInstance.tabToOpen);
540 });
541 },
542 parseConfig: function(editor) {
543 var plugin = CKEDITOR.plugins.scayt;
544
545 // preprocess config for backward compatibility
546 plugin.replaceOldOptionsNames(editor.config);
547
548 // Checking editor's config after initialization
549 if(typeof editor.config.scayt_autoStartup !== 'boolean') {
550 editor.config.scayt_autoStartup = false;
551 }
552 plugin.state.scayt[editor.name] = editor.config.scayt_autoStartup;
553
554 if(typeof editor.config.grayt_autoStartup !== 'boolean') {
555 editor.config.grayt_autoStartup = false;
556 }
557 if(typeof editor.config.scayt_inlineModeImmediateMarkup !== 'boolean') {
558 editor.config.scayt_inlineModeImmediateMarkup = false;
559 }
560 plugin.state.grayt[editor.name] = editor.config.grayt_autoStartup;
561
562 if(!editor.config.scayt_contextCommands) {
563 editor.config.scayt_contextCommands = 'ignore|ignoreall|add';
564 }
565
566 if(!editor.config.scayt_contextMenuItemsOrder) {
567 editor.config.scayt_contextMenuItemsOrder = 'suggest|moresuggest|control';
568 }
569
570 if(!editor.config.scayt_sLang) {
571 editor.config.scayt_sLang = 'en_US';
572 }
573
574 if(editor.config.scayt_maxSuggestions === undefined || typeof editor.config.scayt_maxSuggestions != 'number' || editor.config.scayt_maxSuggestions < 0) {
575 editor.config.scayt_maxSuggestions = 5;
576 }
577
578 if(editor.config.scayt_minWordLength === undefined || typeof editor.config.scayt_minWordLength != 'number' || editor.config.scayt_minWordLength < 1) {
579 editor.config.scayt_minWordLength = 4;
580 }
581
582 if(editor.config.scayt_customDictionaryIds === undefined || typeof editor.config.scayt_customDictionaryIds !== 'string') {
583 editor.config.scayt_customDictionaryIds = '';
584 }
585
586 if(editor.config.scayt_userDictionaryName === undefined || typeof editor.config.scayt_userDictionaryName !== 'string') {
587 editor.config.scayt_userDictionaryName = null;
588 }
589
590 if(typeof editor.config.scayt_uiTabs === 'string' && editor.config.scayt_uiTabs.split(',').length === 3) {
591 var scayt_uiTabs = [], _tempUITabs = [];
592 editor.config.scayt_uiTabs = editor.config.scayt_uiTabs.split(',');
593
594 CKEDITOR.tools.search(editor.config.scayt_uiTabs, function(value) {
595 if (Number(value) === 1 || Number(value) === 0) {
596 _tempUITabs.push(true);
597 scayt_uiTabs.push(Number(value));
598 } else {
599 _tempUITabs.push(false);
600 }
601 });
602
603 if (CKEDITOR.tools.search(_tempUITabs, false) === null) {
604 editor.config.scayt_uiTabs = scayt_uiTabs;
605 } else {
606 editor.config.scayt_uiTabs = [1,1,1];
607 }
608
609 } else {
610 editor.config.scayt_uiTabs = [1,1,1];
611 }
612
613 if(typeof editor.config.scayt_serviceProtocol != 'string') {
614 editor.config.scayt_serviceProtocol = null;
615 }
616
617 if(typeof editor.config.scayt_serviceHost != 'string') {
618 editor.config.scayt_serviceHost = null;
619 }
620
621 if(typeof editor.config.scayt_servicePort != 'string') {
622 editor.config.scayt_servicePort = null;
623 }
624
625 if(typeof editor.config.scayt_servicePath != 'string') {
626 editor.config.scayt_servicePath = null;
627 }
628
629 if(!editor.config.scayt_moreSuggestions) {
630 editor.config.scayt_moreSuggestions = 'on';
631 }
632
633 if(typeof editor.config.scayt_customerId !== 'string') {
634 editor.config.scayt_customerId = '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';
635 }
636
637 if(typeof editor.config.scayt_srcUrl !== 'string') {
638 var protocol = document.location.protocol;
639 protocol = protocol.search(/https?:/) != -1 ? protocol : 'http:';
640
641 editor.config.scayt_srcUrl = protocol + '//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js';
642 }
643
644 if(typeof CKEDITOR.config.scayt_handleCheckDirty !== 'boolean') {
645 CKEDITOR.config.scayt_handleCheckDirty = true;
646 }
647
648 if(typeof CKEDITOR.config.scayt_handleUndoRedo !== 'boolean') {
649 /* set default as 'true' */
650 CKEDITOR.config.scayt_handleUndoRedo = true;
651 }
652 /* checking 'undo' plugin, if no disable SCAYT handler */
653 CKEDITOR.config.scayt_handleUndoRedo = CKEDITOR.plugins.undo ? CKEDITOR.config.scayt_handleUndoRedo : false;
654
655 if(typeof editor.config.scayt_multiLanguageMode !== 'boolean') {
656 editor.config.scayt_multiLanguageMode = false;
657 }
658
659 if(typeof editor.config.scayt_multiLanguageStyles !== 'object') {
660 editor.config.scayt_multiLanguageStyles = {};
661 }
662
663 if(editor.config.scayt_ignoreAllCapsWords && typeof editor.config.scayt_ignoreAllCapsWords !== 'boolean') {
664 editor.config.scayt_ignoreAllCapsWords = false;
665 }
666
667 if(editor.config.scayt_ignoreDomainNames && typeof editor.config.scayt_ignoreDomainNames !== 'boolean') {
668 editor.config.scayt_ignoreDomainNames = false;
669 }
670
671 if(editor.config.scayt_ignoreWordsWithMixedCases && typeof editor.config.scayt_ignoreWordsWithMixedCases !== 'boolean') {
672 editor.config.scayt_ignoreWordsWithMixedCases = false;
673 }
674
675 if(editor.config.scayt_ignoreWordsWithNumbers && typeof editor.config.scayt_ignoreWordsWithNumbers !== 'boolean') {
676 editor.config.scayt_ignoreWordsWithNumbers = false;
677 }
678
679 if( editor.config.scayt_disableOptionsStorage ) {
680 var userOptions = CKEDITOR.tools.isArray( editor.config.scayt_disableOptionsStorage ) ? editor.config.scayt_disableOptionsStorage : ( typeof editor.config.scayt_disableOptionsStorage === 'string' ) ? [ editor.config.scayt_disableOptionsStorage ] : undefined,
681 availableValue = [ 'all', 'options', 'lang', 'ignore-all-caps-words', 'ignore-domain-names', 'ignore-words-with-mixed-cases', 'ignore-words-with-numbers'],
682 valuesOption = ['lang', 'ignore-all-caps-words', 'ignore-domain-names', 'ignore-words-with-mixed-cases', 'ignore-words-with-numbers'],
683 search = CKEDITOR.tools.search,
684 indexOf = CKEDITOR.tools.indexOf;
685
686 var isValidOption = function( option ) {
687 return !!search( availableValue, option );
688 };
689
690 var makeOptionsToStorage = function( options ) {
691 var retval = [];
692
693 for (var i = 0; i < options.length; i++) {
694 var value = options[i],
695 isGroupOptionInUserOptions = !!search( options, 'options' );
696
697 if( !isValidOption( value ) || isGroupOptionInUserOptions && !!search( valuesOption, function( val ) { if( val === 'lang' ) { return false; } } ) ) {
698 return;
699 }
700
701 if( !!search( valuesOption, value ) ) {
702 valuesOption.splice( indexOf( valuesOption, value ), 1 );
703 }
704
705 if( value === 'all' || isGroupOptionInUserOptions && !!search( options, 'lang' )) {
706 return [];
707 }
708
709 if( value === 'options' ) {
710 valuesOption = [ 'lang' ];
711 }
712 }
713
714 retval = retval.concat( valuesOption );
715
716 return retval;
717 };
718
719 editor.config.scayt_disableOptionsStorage = makeOptionsToStorage( userOptions );
720 }
721 },
722 addRule: function(editor) {
723 var plugin = CKEDITOR.plugins.scayt,
724 dataProcessor = editor.dataProcessor,
725 htmlFilter = dataProcessor && dataProcessor.htmlFilter,
726 pathFilters = editor._.elementsPath && editor._.elementsPath.filters,
727 dataFilter = dataProcessor && dataProcessor.dataFilter,
728 removeFormatFilter = editor.addRemoveFormatFilter,
729 pathFilter = function(element) {
730 var scaytInstance = editor.scayt;
731
732 if( scaytInstance && (element.hasAttribute(plugin.options.data_attribute_name) || element.hasAttribute(plugin.options.problem_grammar_data_attribute)) ) {
733 return false;
734 }
735 },
736 removeFormatFilterTemplate = function(element) {
737 var scaytInstance = editor.scayt,
738 result = true;
739
740 if( scaytInstance && (element.hasAttribute(plugin.options.data_attribute_name) || element.hasAttribute(plugin.options.problem_grammar_data_attribute)) ) {
741 result = false;
742 }
743
744 return result;
745 };
746
747 if(pathFilters) {
748 pathFilters.push(pathFilter);
749 }
750
751 if(dataFilter) {
752 var dataFilterRules = {
753 elements: {
754 span: function(element) {
755
756 var scaytState = element.hasClass(plugin.options.misspelled_word_class) && element.attributes[plugin.options.data_attribute_name],
757 graytState = element.hasClass(plugin.options.problem_grammar_class) && element.attributes[plugin.options.problem_grammar_data_attribute];
758
759 if(plugin && (scaytState || graytState)) {
760 delete element.name;
761 }
762
763 return element;
764 }
765 }
766 };
767
768 dataFilter.addRules(dataFilterRules);
769 }
770
771 if (htmlFilter) {
772 var htmlFilterRules = {
773 elements: {
774 span: function(element) {
775
776 var scaytState = element.hasClass(plugin.options.misspelled_word_class) && element.attributes[plugin.options.data_attribute_name],
777 graytState = element.hasClass(plugin.options.problem_grammar_class) && element.attributes[plugin.options.problem_grammar_data_attribute];
778
779 if(plugin && (scaytState || graytState)) {
780 delete element.name;
781 }
782
783 return element;
784 }
785 }
786 };
787
788 htmlFilter.addRules(htmlFilterRules);
789 }
790
791 if(removeFormatFilter) {
792 removeFormatFilter.call(editor, removeFormatFilterTemplate);
793 }
794 },
795 scaytMenuDefinition: function(editor) {
796 var self = this,
797 plugin = CKEDITOR.plugins.scayt,
798 scayt_instance = editor.scayt;
799
800 return {
801 scayt: {
802 scayt_ignore: {
803 label: scayt_instance.getLocal('btn_ignore'),
804 group : 'scayt_control',
805 order : 1,
806 exec: function(editor) {
807 var scaytInstance = editor.scayt;
808 scaytInstance.ignoreWord();
809 }
810 },
811 scayt_ignoreall: {
812 label : scayt_instance.getLocal('btn_ignoreAll'),
813 group : 'scayt_control',
814 order : 2,
815 exec: function(editor) {
816 var scaytInstance = editor.scayt;
817 scaytInstance.ignoreAllWords();
818 }
819 },
820 scayt_add: {
821 label : scayt_instance.getLocal('btn_addWord'),
822 group : 'scayt_control',
823 order : 3,
824 exec : function(editor) {
825 var scaytInstance = editor.scayt;
826
827 // @TODO: We need to add set/restore bookmark logic to 'addWordToUserDictionary' method inside dictionarymanager.
828 // Timeout is used as tmp fix for IE9, when after hitting 'Add word' menu item, document container was blurred.
829 setTimeout(function() {
830 scaytInstance.addWordToUserDictionary();
831 }, 10);
832 }
833 },
834 scayt_option: {
835 label : scayt_instance.getLocal('btn_options'),
836 group : 'scayt_control',
837 order : 4,
838 exec: function(editor) {
839 var scaytInstance = editor.scayt;
840
841 scaytInstance.tabToOpen = 'options';
842 editor.lockSelection();
843 editor.openDialog(self.dialogName);
844 },
845 verification: function(editor) {
846 return (editor.config.scayt_uiTabs[0] == 1) ? true : false;
847 }
848 },
849 scayt_language: {
850 label : scayt_instance.getLocal('btn_langs'),
851 group : 'scayt_control',
852 order : 5,
853 exec: function(editor) {
854 var scaytInstance = editor.scayt;
855
856 scaytInstance.tabToOpen = 'langs';
857 editor.lockSelection();
858 editor.openDialog(self.dialogName);
859 },
860 verification: function(editor) {
861 return (editor.config.scayt_uiTabs[1] == 1) ? true : false;
862 }
863 },
864 scayt_dictionary: {
865 label : scayt_instance.getLocal('btn_dictionaries'),
866 group : 'scayt_control',
867 order : 6,
868 exec: function(editor) {
869 var scaytInstance = editor.scayt;
870
871 scaytInstance.tabToOpen = 'dictionaries';
872 editor.lockSelection();
873 editor.openDialog(self.dialogName);
874 },
875 verification: function(editor) {
876 return (editor.config.scayt_uiTabs[2] == 1) ? true : false;
877 }
878 },
879 scayt_about: {
880 label : scayt_instance.getLocal('btn_about'),
881 group : 'scayt_control',
882 order : 7,
883 exec: function(editor) {
884 var scaytInstance = editor.scayt;
885
886 scaytInstance.tabToOpen = 'about';
887 editor.lockSelection();
888 editor.openDialog(self.dialogName);
889 }
890 }
891 },
892 grayt: {
893 grayt_problemdescription: {
894 label : 'Grammar problem description',
895 group : 'grayt_description', // look at addMenuItems method for further info
896 order : 1,
897 state : CKEDITOR.TRISTATE_DISABLED,
898 exec: function(editor) {}
899 },
900 grayt_ignore: {
901 label : scayt_instance.getLocal('btn_ignore'),
902 group : 'grayt_control',
903 order : 2,
904 exec: function(editor) {
905 var scaytInstance = editor.scayt;
906
907 scaytInstance.ignorePhrase();
908 }
909 }
910 }
911 };
912 },
913 buildSuggestionMenuItems: function(editor, suggestions, isScaytNode) {
914 var self = this,
915 itemList = {},
916 subItemList = {},
917 replaceKeyName = isScaytNode ? 'word' : 'phrase',
918 updateEventName = isScaytNode ? 'startGrammarCheck' : 'startSpellCheck',
919 plugin = CKEDITOR.plugins.scayt,
920 scayt_instance = editor.scayt;
921
922 if(suggestions.length > 0 && suggestions[0] !== 'no_any_suggestions') {
923
924 if(isScaytNode) {
925 // build SCAYT suggestions
926 for(var i = 0; i < suggestions.length; i++) {
927
928 var commandName = 'scayt_suggest_' + CKEDITOR.plugins.scayt.suggestions[i].replace(' ', '_');
929
930 editor.addCommand(commandName, self.createCommand(CKEDITOR.plugins.scayt.suggestions[i], replaceKeyName, updateEventName));
931
932 if(i < editor.config.scayt_maxSuggestions) {
933
934 // mainSuggestions
935 editor.addMenuItem(commandName, {
936 label: suggestions[i],
937 command: commandName,
938 group: 'scayt_suggest',
939 order: i + 1
940 });
941
942 itemList[commandName] = CKEDITOR.TRISTATE_OFF;
943
944 } else {
945
946 // moreSuggestions
947 editor.addMenuItem(commandName, {
948 label: suggestions[i],
949 command: commandName,
950 group: 'scayt_moresuggest',
951 order: i + 1
952 });
953
954 subItemList[commandName] = CKEDITOR.TRISTATE_OFF;
955
956 if(editor.config.scayt_moreSuggestions === 'on') {
957
958 editor.addMenuItem('scayt_moresuggest', {
959 label : scayt_instance.getLocal('btn_moreSuggestions'),
960 group : 'scayt_moresuggest',
961 order : 10,
962 getItems : function() {
963 return subItemList;
964 }
965 });
966
967 itemList['scayt_moresuggest'] = CKEDITOR.TRISTATE_OFF;
968 }
969 }
970 }
971 } else {
972 // build GRAYT suggestions
973 for(var i = 0; i < suggestions.length; i++) {
974 var commandName = 'grayt_suggest_' + CKEDITOR.plugins.scayt.suggestions[i].replace(' ', '_');
975
976 editor.addCommand(commandName, self.createCommand(CKEDITOR.plugins.scayt.suggestions[i], replaceKeyName, updateEventName));
977
978 // mainSuggestions
979 editor.addMenuItem(commandName, {
980 label: suggestions[i],
981 command: commandName,
982 group: 'grayt_suggest',
983 order: i + 1
984 });
985
986 itemList[commandName] = CKEDITOR.TRISTATE_OFF;
987 }
988 }
989 } else {
990 var noSuggestionsCommand = 'no_scayt_suggest';
991 itemList[noSuggestionsCommand] = CKEDITOR.TRISTATE_DISABLED;
992
993 editor.addCommand(noSuggestionsCommand, {
994 exec: function() {
995
996 }
997 });
998
999 editor.addMenuItem(noSuggestionsCommand, {
1000 label : scayt_instance.getLocal('btn_noSuggestions') || noSuggestionsCommand,
1001 command: noSuggestionsCommand,
1002 group : 'scayt_suggest',
1003 order : 0
1004 });
1005 }
1006
1007 return itemList;
1008 },
1009 menuGenerator: function(editor, selectionNode) {
1010 var self = this,
1011 scaytInstance = editor.scayt,
1012 menuItems = this.scaytMenuDefinition(editor),
1013 itemList = {},
1014 allowedOption = editor.config.scayt_contextCommands.split('|'),
1015 lang = selectionNode.getAttribute(scaytInstance.getLangAttribute()) || scaytInstance.getLang(),
1016 word, grammarPhrase, isScaytNode, isGrammarNode, problemDescriptionText;
1017
1018
1019 isScaytNode = scaytInstance.isScaytNode(selectionNode);
1020 isGrammarNode = scaytInstance.isGraytNode(selectionNode);
1021
1022 if(isScaytNode) {
1023 // we clicked scayt misspelling
1024 // get suggestions
1025 menuItems = menuItems.scayt;
1026
1027 word = selectionNode.getAttribute(scaytInstance.getScaytNodeAttributeName());
1028
1029 scaytInstance.fire('getSuggestionsList', {
1030 lang: lang,
1031 word: word
1032 });
1033
1034 itemList = this.buildSuggestionMenuItems(editor, CKEDITOR.plugins.scayt.suggestions, isScaytNode);
1035 } else if(isGrammarNode) {
1036 // we clicked grammar problem
1037 // get suggestions
1038 menuItems = menuItems.grayt;
1039 grammarPhrase = selectionNode.getAttribute(scaytInstance.getGraytNodeAttributeName());
1040
1041 // setup grammar problem description
1042 problemDescriptionText = scaytInstance.getProblemDescriptionText(grammarPhrase, lang);
1043 if(menuItems.grayt_problemdescription && problemDescriptionText) {
1044 menuItems.grayt_problemdescription.label = problemDescriptionText;
1045 }
1046
1047 scaytInstance.fire('getGrammarSuggestionsList', {
1048 lang: lang,
1049 phrase: grammarPhrase
1050 });
1051
1052 itemList = this.buildSuggestionMenuItems(editor, CKEDITOR.plugins.scayt.suggestions, isScaytNode);
1053 }
1054
1055 if(isScaytNode && editor.config.scayt_contextCommands == 'off') {
1056 return itemList;
1057 }
1058
1059 for(var key in menuItems) {
1060 if(isScaytNode && CKEDITOR.tools.indexOf(allowedOption, key.replace('scayt_', '')) == -1 && editor.config.scayt_contextCommands != 'all') {
1061 continue;
1062 }
1063
1064 if(typeof menuItems[key].state != 'undefined') {
1065 itemList[key] = menuItems[key].state;
1066 } else {
1067 itemList[key] = CKEDITOR.TRISTATE_OFF;
1068 }
1069
1070 // delete item from context menu if its state isn't verified as allowed
1071 if(typeof menuItems[key].verification === 'function' && !menuItems[key].verification(editor)) {
1072 // itemList[key] = (menuItems[key].verification(editor)) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
1073 delete itemList[key];
1074 }
1075
1076 editor.addCommand(key, {
1077 exec: menuItems[key].exec
1078 });
1079
1080 editor.addMenuItem(key, {
1081 label : editor.lang.scayt[menuItems[key].label] || menuItems[key].label,
1082 command: key,
1083 group : menuItems[key].group,
1084 order : menuItems[key].order
1085 });
1086 }
1087
1088 return itemList;
1089 },
1090 createCommand: function(suggestion, replaceKeyName, updateEventName) {
1091 return {
1092 exec: function(editor) {
1093 var scaytInstance = editor.scayt,
1094 eventObject = {};
1095
1096 eventObject[replaceKeyName] = suggestion;
1097 scaytInstance.replaceSelectionNode(eventObject);
1098
1099 // we need to remove grammar markup from selection node if we just performed replace action for misspelling
1100 if(updateEventName === 'startGrammarCheck') {
1101 scaytInstance.removeMarkupInSelectionNode({grammarOnly: true});
1102 }
1103 // for grayt problem replacement we need to fire 'startSpellCheck'
1104 // for scayt misspelling replacement we need to fire 'startGrammarCheck'
1105 scaytInstance.fire(updateEventName);
1106 }
1107 };
1108 }
1109});
1110
1111CKEDITOR.plugins.scayt = {
1112 state: {
1113 scayt: {},
1114 grayt: {}
1115 },
1116 suggestions: [],
1117 loadingHelper: {
1118 loadOrder: []
1119 },
1120 isLoading: false,
1121 options: {
1122 disablingCommandExec: {
1123 source: true,
1124 newpage: true,
1125 templates: true
1126 },
1127 data_attribute_name: 'data-scayt-word',
1128 misspelled_word_class: 'scayt-misspell-word',
1129 problem_grammar_data_attribute: 'data-grayt-phrase',
1130 problem_grammar_class: 'gramm-problem'
1131 },
1132 backCompatibilityMap: {
1133 'scayt_service_protocol': 'scayt_serviceProtocol',
1134 'scayt_service_host' : 'scayt_serviceHost',
1135 'scayt_service_port' : 'scayt_servicePort',
1136 'scayt_service_path' : 'scayt_servicePath',
1137 'scayt_customerid' : 'scayt_customerId'
1138 },
1139 replaceOldOptionsNames: function(config) {
1140 for(var key in config) {
1141 if(key in this.backCompatibilityMap) {
1142 config[this.backCompatibilityMap[key]] = config[key];
1143 delete config[key];
1144 }
1145 }
1146 },
1147 createScayt : function(editor) {
1148 var self = this,
1149 plugin = CKEDITOR.plugins.scayt;
1150
1151 this.loadScaytLibrary(editor, function(_editor) {
1152 var textContainer = _editor.window && _editor.window.getFrame() || _editor.editable();
1153
1154 // Do not create SCAYT if there is no text container for usage
1155 if(!textContainer) {
1156 plugin.state.scayt[_editor.name] = false;
1157 return;
1158 }
1159
1160 var scaytInstanceOptions = {
1161 lang : _editor.config.scayt_sLang,
1162 container : textContainer.$,
1163 customDictionary : _editor.config.scayt_customDictionaryIds,
1164 userDictionaryName : _editor.config.scayt_userDictionaryName,
1165 localization : _editor.langCode,
1166 customer_id : _editor.config.scayt_customerId,
1167 debug : _editor.config.scayt_debug,
1168 data_attribute_name : self.options.data_attribute_name,
1169 misspelled_word_class: self.options.misspelled_word_class,
1170 problem_grammar_data_attribute: self.options.problem_grammar_data_attribute,
1171 problem_grammar_class: self.options.problem_grammar_class,
1172 'options-to-restore': _editor.config.scayt_disableOptionsStorage,
1173 focused : _editor.editable().hasFocus, // #30260 we need to set focused=true if CKEditor is focused before SCAYT initialization
1174 ignoreElementsRegex : _editor.config.scayt_elementsToIgnore,
1175 minWordLength : _editor.config.scayt_minWordLength,
1176 multiLanguageMode : _editor.config.scayt_multiLanguageMode,
1177 multiLanguageStyles : _editor.config.scayt_multiLanguageStyles,
1178 graytAutoStartup : plugin.state.grayt[_editor.name]
1179 };
1180
1181 if(_editor.config.scayt_serviceProtocol) {
1182 scaytInstanceOptions['service_protocol'] = _editor.config.scayt_serviceProtocol;
1183 }
1184
1185 if(_editor.config.scayt_serviceHost) {
1186 scaytInstanceOptions['service_host'] = _editor.config.scayt_serviceHost;
1187 }
1188
1189 if(_editor.config.scayt_servicePort) {
1190 scaytInstanceOptions['service_port'] = _editor.config.scayt_servicePort;
1191 }
1192
1193 if(_editor.config.scayt_servicePath) {
1194 scaytInstanceOptions['service_path'] = _editor.config.scayt_servicePath;
1195 }
1196
1197 //predefined options
1198 if(typeof _editor.config.scayt_ignoreAllCapsWords === 'boolean') {
1199 scaytInstanceOptions['ignore-all-caps-words'] = _editor.config.scayt_ignoreAllCapsWords;
1200 }
1201
1202 if(typeof _editor.config.scayt_ignoreDomainNames === 'boolean') {
1203 scaytInstanceOptions['ignore-domain-names'] = _editor.config.scayt_ignoreDomainNames;
1204 }
1205
1206 if(typeof _editor.config.scayt_ignoreWordsWithMixedCases === 'boolean') {
1207 scaytInstanceOptions['ignore-words-with-mixed-cases'] = _editor.config.scayt_ignoreWordsWithMixedCases;
1208 }
1209
1210 if(typeof _editor.config.scayt_ignoreWordsWithNumbers === 'boolean') {
1211 scaytInstanceOptions['ignore-words-with-numbers'] = _editor.config.scayt_ignoreWordsWithNumbers;
1212 }
1213
1214 var scaytInstance = new SCAYT.CKSCAYT(scaytInstanceOptions, function() {
1215 // success callback
1216 }, function() {
1217 // error callback
1218 }),
1219 wordsPrefix = 'word_';
1220
1221 scaytInstance.subscribe('suggestionListSend', function(data) {
1222 // TODO: 1. Maybe store suggestions for specific editor
1223 // TODO: 2. Fix issue with suggestion duplicates on on server
1224 //CKEDITOR.plugins.scayt.suggestions = data.suggestionList;
1225 var _wordsCollection = {},
1226 _suggestionList =[];
1227
1228 for (var i = 0; i < data.suggestionList.length; i++) {
1229 if (!_wordsCollection[wordsPrefix + data.suggestionList[i]]) {
1230 _wordsCollection[wordsPrefix + data.suggestionList[i]] = data.suggestionList[i];
1231 _suggestionList.push(data.suggestionList[i]);
1232 }
1233 }
1234
1235 CKEDITOR.plugins.scayt.suggestions = _suggestionList;
1236 });
1237
1238 // if selection has changed programmatically by SCAYT we need to react appropriately
1239 scaytInstance.subscribe('selectionIsChanged', function(data) {
1240 var selection = _editor.getSelection();
1241
1242 if(selection.isLocked) {
1243 _editor.lockSelection();
1244 }
1245 });
1246
1247 scaytInstance.subscribe('graytStateChanged', function(data) {
1248 plugin.state.grayt[_editor.name] = data.state;
1249 });
1250
1251 _editor.scayt = scaytInstance;
1252
1253 _editor.fire('scaytButtonState', _editor.readOnly ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_ON);
1254 });
1255 },
1256 destroy: function(editor) {
1257 if(editor.scayt) {
1258 editor.scayt.destroy();
1259 }
1260
1261 delete editor.scayt;
1262 editor.fire('scaytButtonState', CKEDITOR.TRISTATE_OFF);
1263 },
1264 loadScaytLibrary: function(editor, callback) {
1265 var self = this,
1266 date,
1267 timestamp,
1268 scaytUrl;
1269
1270 // no need to process load requests from same editor as it can cause bugs with
1271 // loading ckscayt app due to subsequent calls of some events
1272 // need to be before 'if' statement, because of timing issue in CKEDITOR.scriptLoader
1273 // when callback executing is delayed for a few milliseconds, and scayt can be created twise
1274 // on one instance
1275 if(this.loadingHelper[editor.name]) return;
1276
1277 if(typeof window.SCAYT === 'undefined' || typeof window.SCAYT.CKSCAYT !== 'function') {
1278
1279 // add onLoad callbacks for editors while SCAYT is loading
1280 this.loadingHelper[editor.name] = callback;
1281 this.loadingHelper.loadOrder.push(editor.name);
1282
1283 //creating unique timestamp for SCAYT URL
1284 date = new Date();
1285 timestamp = date.getTime();
1286 scaytUrl = editor.config.scayt_srcUrl;
1287
1288 //if there already implemented timstamp for scayr_srcURL use it, if not use our timestamp
1289 scaytUrl = scaytUrl + (scaytUrl.indexOf('?') >= 0 ? '' : '?' + timestamp);
1290
1291 if (!this.loadingHelper.ckscaytLoading) {
1292 CKEDITOR.scriptLoader.load(scaytUrl, function(success) {
1293 var editorName;
1294
1295 if ( success ) {
1296 CKEDITOR.fireOnce('scaytReady');
1297
1298 for(var i = 0; i < self.loadingHelper.loadOrder.length; i++) {
1299 editorName = self.loadingHelper.loadOrder[i];
1300
1301 if(typeof self.loadingHelper[editorName] === 'function') {
1302 self.loadingHelper[editorName](CKEDITOR.instances[editorName]);
1303 }
1304
1305 delete self.loadingHelper[editorName];
1306 }
1307 self.loadingHelper.loadOrder = [];
1308 }
1309 });
1310 this.loadingHelper.ckscaytLoading = true;
1311 }
1312
1313
1314 } else if(window.SCAYT && typeof window.SCAYT.CKSCAYT === 'function') {
1315 CKEDITOR.fireOnce('scaytReady');
1316
1317 if(!editor.scayt) {
1318 if(typeof callback === 'function') {
1319 callback(editor);
1320 }
1321 }
1322 }
1323 }
1324};
1325
1326CKEDITOR.on('dialogDefinition', function(dialogDefinitionEvent) {
1327 var dialogName = dialogDefinitionEvent.data.name,
1328 dialogDefinition = dialogDefinitionEvent.data.definition,
1329 dialog = dialogDefinition.dialog;
1330
1331 if (dialogName === 'scaytDialog') {
1332 dialog.on('cancel', function(cancelEvent) {
1333 return false;
1334 }, this, null, -1);
1335 }
1336
1337 if ( dialogName === 'checkspell' ) {
1338 dialog.on( 'cancel', function( cancelEvent ) {
1339 var editor = cancelEvent.sender && cancelEvent.sender.getParentEditor(),
1340 plugin = CKEDITOR.plugins.scayt,
1341 scaytInstance = editor.scayt;
1342
1343 if ( scaytInstance && plugin.state.scayt[ editor.name ] && scaytInstance.setMarkupPaused ) {
1344 scaytInstance.setMarkupPaused( false );
1345 }
1346
1347 editor.unlockSelection();
1348 }, this, null, -2 ); // we need to call cancel callback before WSC plugin
1349 }
1350
1351 if (dialogName === 'link') {
1352 dialog.on('ok', function(okEvent) {
1353 var editor = okEvent.sender && okEvent.sender.getParentEditor();
1354
1355 if(editor) {
1356 setTimeout(function() {
1357 editor.fire('reloadMarkupScayt', {
1358 removeOptions: {
1359 removeInside: true,
1360 forceBookmark: true
1361 },
1362 timeout: 0
1363 });
1364 }, 0);
1365 }
1366 });
1367 }
1368});
1369
1370CKEDITOR.on('scaytReady', function() {
1371
1372 // Override editor.checkDirty method avoid CK checkDirty functionality to fix SCAYT issues with incorrect checkDirty behavior.
1373 if(CKEDITOR.config.scayt_handleCheckDirty === true) {
1374 var editorCheckDirty = CKEDITOR.editor.prototype;
1375
1376 editorCheckDirty.checkDirty = CKEDITOR.tools.override(editorCheckDirty.checkDirty, function(org) {
1377
1378 return function() {
1379 var retval = null,
1380 pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[this.name] && this.scayt,
1381 scaytInstance = this.scayt;
1382
1383 if(!pluginStatus) {
1384 retval = org.call(this);
1385 } else {
1386 retval = (this.status == 'ready');
1387
1388 if (retval) {
1389 var currentData = scaytInstance.removeMarkupFromString(this.getSnapshot()),
1390 prevData = scaytInstance.removeMarkupFromString(this._.previousValue);
1391
1392 retval = (retval && (prevData !== currentData))
1393 }
1394 }
1395
1396 return retval;
1397 };
1398 });
1399
1400 editorCheckDirty.resetDirty = CKEDITOR.tools.override(editorCheckDirty.resetDirty, function(org) {
1401 return function() {
1402 var pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[this.name] && this.scayt,
1403 scaytInstance = this.scayt;//CKEDITOR.plugins.scayt.getScayt(this);
1404
1405 if(!pluginStatus) {
1406 org.call(this);
1407 } else {
1408 this._.previousValue = scaytInstance.removeMarkupFromString(this.getSnapshot());
1409 }
1410 };
1411 });
1412 }
1413
1414 if (CKEDITOR.config.scayt_handleUndoRedo === true) {
1415 var undoImagePrototype = CKEDITOR.plugins.undo.Image.prototype;
1416
1417 // add backword compatibility for CKEDITOR 4.2. method equals was repleced on other method
1418 var equalsContentMethodName = (typeof undoImagePrototype.equalsContent == "function") ? 'equalsContent' : 'equals';
1419
1420 undoImagePrototype[equalsContentMethodName] = CKEDITOR.tools.override(undoImagePrototype[equalsContentMethodName], function(org) {
1421 return function(otherImage) {
1422 var pluginState = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[otherImage.editor.name] && otherImage.editor.scayt,
1423 scaytInstance = otherImage.editor.scayt,
1424 thisContents = this.contents,
1425 otherContents = otherImage.contents,
1426 retval = null;
1427
1428 // Making the comparison based on content without SCAYT word markers.
1429 if(pluginState) {
1430 this.contents = scaytInstance.removeMarkupFromString(thisContents) || '';
1431 otherImage.contents = scaytInstance.removeMarkupFromString(otherContents) || '';
1432 }
1433
1434 var retval = org.apply(this, arguments);
1435
1436 this.contents = thisContents;
1437 otherImage.contents = otherContents;
1438
1439 return retval;
1440 };
1441 });
1442 }
1443});
1444
1445/**
1446 * The parameter turns on/off SCAYT on the autostartup. If 'true', turns on SCAYT automatically after loading the editor.
1447 *
1448 * config.scayt_autoStartup = true;
1449 *
1450 * @cfg {Boolean} [scayt_autoStartup=false]
1451 * @member CKEDITOR.config
1452 */
1453
1454/**
1455 * The parameter turns on/off Grammar As You Type (GRAYT) on the SCAYT startup. If 'true', turns on GRAYT automatically after SCAYT started.
1456 *
1457 * config.grayt_autoStartup = true;
1458 *
1459 * @cfg {Boolean} [grayt_autoStartup=false]
1460 * @member CKEDITOR.config
1461 */
1462
1463/**
1464 * The parameter turns on/off SCAYT initiation when Inline CKEditor is not focused. SCAYT markup is taken place (SCAYT instance is not destroyed)
1465 * in both Inline CKEditor's states, focused and unfocused.
1466 *
1467 * config.scayt_inlineModeImmediateMarkup = true;
1468 *
1469 * @cfg {Boolean} [scayt_inlineModeImmediateMarkup=false]
1470 * @member CKEDITOR.config
1471 */
1472
1473
1474/**
1475 * The parameter defines the number of SCAYT suggestions to show in the main context menu.
1476 * Possible values are:
1477 *
1478 * * `0` (zero) &ndash; No suggestions are shown in the main context menu. All
1479 * entries will be listed in the "More Suggestions" sub-menu.
1480 * * Positive number &ndash; The maximum number of suggestions to show in the context
1481 * menu. Other entries will be shown in the "More Suggestions" sub-menu.
1482 * * Negative number &ndash; 5 suggestions are shown in the main context menu. All other
1483 * entries will be listed in the "More Suggestions" sub-menu.
1484 *
1485 * Examples:
1486 *
1487 * // Display only three suggestions in the main context menu.
1488 * config.scayt_maxSuggestions = 3;
1489 *
1490 * // Do not show the suggestions directly.
1491 * config.scayt_maxSuggestions = 0;
1492 *
1493 * @cfg {Number} [scayt_maxSuggestions=5]
1494 * @member CKEDITOR.config
1495 */
1496
1497/**
1498 * The parameter defines minimum length of the words that will be collected from editor's text for spell checking.
1499 * Possible value is any positive number.
1500 *
1501 * Examples:
1502 *
1503 * // Set minimum length of the words that will be collected from text.
1504 * config.scayt_minWordLength = 5;
1505 *
1506 * @cfg {Number} [scayt_minWordLength=4]
1507 * @member CKEDITOR.config
1508 */
1509
1510/**
1511 * The parameter sets the customer ID for SCAYT. Used for hosted users only. Required for migration from free
1512 * to trial or paid versions.
1513 *
1514 * // Load SCAYT using my customer ID.
1515 * config.scayt_customerId = 'your-encrypted-customer-id';
1516 *
1517 * @cfg {String} [scayt_customerId='1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2']
1518 * @member CKEDITOR.config
1519 */
1520
1521/**
1522 * The parameter enables/disables the "More Suggestions" sub-menu in the context menu.
1523 * Possible values are `'on'` and `'off'`.
1524 *
1525 * // Disables the "More Suggestions" sub-menu.
1526 * config.scayt_moreSuggestions = 'off';
1527 *
1528 * @cfg {String} [scayt_moreSuggestions='on']
1529 * @member CKEDITOR.config
1530 */
1531
1532/**
1533 * The parameter customizes the display of SCAYT context menu commands ("Add Word", "Ignore",
1534 * "Ignore All", "Options", "Languages", "Dictionaries" and "About").
1535 * This must be a string with one or more of the following
1536 * words separated by a pipe character (`'|'`):
1537 *
1538 * * `off` &ndash; disables all options.
1539 * * `all` &ndash; enables all options.
1540 * * `ignore` &ndash; enables the "Ignore" option.
1541 * * `ignoreall` &ndash; enables the "Ignore All" option.
1542 * * `add` &ndash; enables the "Add Word" option.
1543 * * `option` &ndash; enables "Options" menu item.
1544 * * `language` &ndash; enables "Languages" menu item.
1545 * * `dictionary` &ndash; enables "Dictionaries" menu item.
1546 * * `about` &ndash; enables "About" menu item.
1547 *
1548 * Note, that availability of 'Options', 'Languages' and 'Dictionaries' items
1549 * depends on scayt_uiTabs option also.
1550 * Example:
1551 *
1552 * // Show only "Add Word" and "Ignore All" in the context menu.
1553 * config.scayt_contextCommands = 'add|ignoreall';
1554 *
1555 * @cfg {String} [scayt_contextCommands='ignore|ignoreall|add']
1556 * @member CKEDITOR.config
1557 */
1558
1559/**
1560 * The parameter sets the default spell checking language for SCAYT. Possible values are:
1561 * `'en_US'`, `'en_GB'`, `'pt_BR'`, `'da_DK'`,
1562 * `'nl_NL'`, `'en_CA'`, `'fi_FI'`, `'fr_FR'`,
1563 * `'fr_CA'`, `'de_DE'`, `'el_GR'`, `'it_IT'`,
1564 * `'nb_NO'`, `'pt_PT'`, `'es_ES'`, `'sv_SE'`.
1565 *
1566 * // Sets SCAYT to German.
1567 * config.scayt_sLang = 'de_DE';
1568 *
1569 * @cfg {String} [scayt_sLang='en_US']
1570 * @member CKEDITOR.config
1571 */
1572
1573/**
1574 * The parameter customizes the SCAYT dialog and SCAYT toolbar menu to show particular tabs/items.
1575 * This setting must contain a `1` (enabled) or `0`
1576 * (disabled) value for each of the following entries, in this precise order,
1577 * separated by a comma (`','`): `'Options'`, `'Languages'`, and `'Dictionary'`.
1578 *
1579 * // Hides the "Languages" tab.
1580 * config.scayt_uiTabs = '1,0,1';
1581 *
1582 * @cfg {String} [scayt_uiTabs='1,1,1']
1583 * @member CKEDITOR.config
1584 */
1585
1586/**
1587 * The parameter allows to specify protocol for WSC service (ssrv.cgi) full path.
1588 *
1589 * // Defines protocol for WSC service (ssrv.cgi) full path.
1590 * config.scayt_serviceProtocol = 'https';
1591 *
1592 * @cfg {String} [scayt_serviceProtocol='http']
1593 * @member CKEDITOR.config
1594 */
1595
1596/**
1597 * The parameter allows to specify host for WSC service (ssrv.cgi) full path.
1598 *
1599 * // Defines host for WSC service (ssrv.cgi) full path.
1600 * config.scayt_serviceHost = 'my-host';
1601 *
1602 * @cfg {String} [scayt_serviceHost='svc.webspellchecker.net']
1603 * @member CKEDITOR.config
1604 */
1605
1606/**
1607 * The parameter allows to specify port for WSC service (ssrv.cgi) full path.
1608 *
1609 * // Defines port for WSC service (ssrv.cgi) full path.
1610 * config.scayt_servicePort = '2330';
1611 *
1612 * @cfg {String} [scayt_servicePort='80']
1613 * @member CKEDITOR.config
1614 */
1615
1616/**
1617 * The parameter allows to specify path for WSC service (ssrv.cgi) full path.
1618 *
1619 * // Defines host for WSC service (ssrv.cgi) full path.
1620 * config.scayt_servicePath = 'my-path/ssrv.cgi';
1621 *
1622 * @cfg {String} [scayt_servicePath='spellcheck31/script/ssrv.cgi']
1623 * @member CKEDITOR.config
1624 */
1625
1626/**
1627 * The parameter sets the URL to SCAYT core. Required to switch to the licensed version of SCAYT application.
1628 *
1629 * Further details available at [http://wiki.webspellchecker.net/doku.php?id=migration:hosredfreetolicensedck](http://wiki.webspellchecker.net/doku.php?id=migration:hosredfreetolicensedck)
1630 *
1631 * config.scayt_srcUrl = "http://my-host/spellcheck/lf/scayt/scayt.js";
1632 *
1633 * @cfg {String} [scayt_srcUrl='//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js']
1634 * @member CKEDITOR.config
1635 */
1636
1637/**
1638 * The parameter links SCAYT to custom dictionaries. This is a string containing dictionary IDs
1639 * separated by commas (`','`). Available only for the licensed version.
1640 *
1641 * Further details at [http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:customdictionaries:licensed](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:customdictionaries:licensed)
1642 *
1643 * config.scayt_customDictionaryIds = '3021,3456,3478';
1644 *
1645 * @cfg {String} [scayt_customDictionaryIds='']
1646 * @member CKEDITOR.config
1647 */
1648
1649/**
1650 * The parameter activates a User Dictionary in SCAYT. The user
1651 * dictionary name must be used. Available only for the licensed version.
1652 *
1653 * config.scayt_userDictionaryName = 'MyDictionary';
1654 *
1655 * @cfg {String} [scayt_userDictionaryName='']
1656 * @member CKEDITOR.config
1657 */
1658
1659/**
1660 * The parameter defines the order SCAYT context menu items by groups.
1661 * This must be a string with one or more of the following
1662 * words separated by a pipe character (`'|'`):
1663 *
1664 * * `suggest` &ndash; main suggestion word list,
1665 * * `moresuggest` &ndash; more suggestions word list,
1666 * * `control` &ndash; SCAYT commands, such as "Ignore" and "Add Word".
1667 *
1668 * Example:
1669 *
1670 * config.scayt_contextMenuItemsOrder = 'moresuggest|control|suggest';
1671 *
1672 * @cfg {String} [scayt_contextMenuItemsOrder='suggest|moresuggest|control']
1673 * @member CKEDITOR.config
1674 */
1675
1676/**
1677 * If set to `true` &ndash; overrides checkDirty functionality of CK
1678 * to fix SCAYT issues with incorrect checkDirty behavior. If set to `false`,
1679 * provides better performance on big preloaded text.
1680 *
1681 * config.scayt_handleCheckDirty = 'false';
1682 *
1683 * @cfg {String} [scayt_handleCheckDirty='true']
1684 * @member CKEDITOR.config
1685 */
1686
1687/**
1688 * If set to `true` &ndash; overrides undo\redo functionality of CK
1689 * to fix SCAYT issues with incorrect undo\redo behavior. If set to `false`,
1690 * provides better performance on undo\redo text.
1691 *
1692 * config.scayt_handleUndoRedo = 'false';
1693 *
1694 * @cfg {String} [scayt_handleUndoRedo='true']
1695 * @member CKEDITOR.config
1696 */
1697
1698/**
1699 * The parameter that turns off\on 'ignore-all-caps-words' option by default
1700 * It may be needed to disableOptionStorage for this parameter, because optionStorage has higher priority.
1701 *
1702 * config.scayt_ignoreAllCapsWords = false;
1703 *
1704 * @cfg {Boolean} [scayt_ignoreAllCapsWords=false]
1705 * @member CKEDITOR.config
1706 */
1707
1708/**
1709 * The parameter that turns off\on 'ignore-domain-names' option by default
1710 * It may be needed to disableOptionStorage for this parameter, because optionStorage has higher priority.
1711 *
1712 * config.scayt_ignoreDomainNames = false;
1713 *
1714 * @cfg {Boolean} [scayt_ignoreDomainNames=false]
1715 * @member CKEDITOR.config
1716 */
1717
1718/**
1719 * The parameter that turns off\on 'ignore-words-with-mixed-cases' option by default
1720 * It may be needed to disableOptionStorage for this parameter, because optionStorage has higher priority.
1721 *
1722 * config.scayt_ignoreWordsWithMixedCases = false;
1723 *
1724 * @cfg {Boolean} [scayt_ignoreWordsWithMixedCases=false]
1725 * @member CKEDITOR.config
1726 */
1727
1728/**
1729 * The parameter that turns off\on 'ignore-words-with-numbers' option by default
1730 * It may be needed to disableOptionStorage for this parameter, because optionStorage has higher priority.
1731 *
1732 * config.scayt_ignoreWordsWithNumbers = false;
1733 *
1734 * @cfg {Boolean} [scayt_ignoreWordsWithNumbers=false]
1735 * @member CKEDITOR.config
1736 */
1737
1738/**
1739 * Disabling of SCAYT Options storing during several sessions. Options storing will be turned off after page refresh.
1740 *
1741 * * `'options'` - disables all SCAYT Ignore options
1742 * * `'ignore-all-caps-words'` - disables 'Ignore All-Caps Words' option
1743 * * `'ignore-domain-names'` - disables 'Ignore Domain Names' option
1744 * * `'ignore-words-with-mixed-cases'` - disables 'Ignore Words with Mixed Case' option
1745 * * `'ignore-words-with-numbers'` - disables 'Ignore Words with Numbers' option
1746 * * `'lang'` - disables SCAYT spell check language storing
1747 * * `'all'` - disables all SCAYT options storing
1748 *
1749 * Example:
1750 *
1751 * // One options disabling.
1752 * config.scayt_disableOptionsStorage = 'all';
1753 *
1754 * // Several options disabling.
1755 * config.scayt_disableOptionsStorage = ['lang', 'ignore-domain-names', 'ignore-words-with-numbers'];
1756 *
1757 *
1758 * @cfg {String|Array} [scayt_disableOptionsStorage = '']
1759 * @member CKEDITOR.config
1760 */
1761
1762 /**
1763 * Specifies the names of tags that will be skipped while spell checking. This is a string containing tag names
1764 * separated by commas (`','`). Please note that `'style'` tag would be added to specified tags list.
1765 *
1766 * config.scayt_elementsToIgnore = 'del,pre';
1767 *
1768 * @cfg {String} [scayt_elementsToIgnore='style']
1769 * @member CKEDITOR.config
1770 */
1771
1772 /**
1773 * The parameter turns on/off multi language support in SCAYT. If 'true', turns on SCAYT multi language support after loading the editor.
1774 *
1775 * config.scayt_multiLanguageMode = true;
1776 *
1777 * @cfg {Boolean} [scayt_multiLanguageMode=false]
1778 * @member CKEDITOR.config
1779 */
1780
1781 /**
1782 * Defines additional styles for misspellings for specified languages. Styles will be applied only if 'scayt_multiLanguageMode' parameter is set to 'true'
1783 * and 'language' plugin included and loaded into editor. All misspellings still will be underlined with red waveline by default.
1784 *
1785 * Example:
1786 *
1787 * // Display misspellings in French language with green color and underlined with red waveline
1788 * config.scayt_multiLanguageStyles = {
1789 * 'fr': 'color: green'
1790 * };
1791 *
1792 * // Display misspellings in Italian language with green color and underlined with red waveline and German misspellings with red color only
1793 * config.scayt_multiLanguageStyles = {
1794 * 'it': 'color: green',
1795 * 'de': 'background-image: none; color: red'
1796 * };
1797 *
1798 * @cfg {Object} [scayt_multiLanguageStyles = {}]
1799 * @member CKEDITOR.config
1800 */
diff --git a/sources/plugins/selectall/icons/hidpi/selectall.png b/sources/plugins/selectall/icons/hidpi/selectall.png
new file mode 100644
index 00000000..c67f64dd
--- /dev/null
+++ b/sources/plugins/selectall/icons/hidpi/selectall.png
Binary files differ
diff --git a/sources/plugins/selectall/icons/selectall.png b/sources/plugins/selectall/icons/selectall.png
new file mode 100644
index 00000000..0d1e8160
--- /dev/null
+++ b/sources/plugins/selectall/icons/selectall.png
Binary files differ
diff --git a/sources/plugins/selectall/lang/af.js b/sources/plugins/selectall/lang/af.js
new file mode 100644
index 00000000..0ca47415
--- /dev/null
+++ b/sources/plugins/selectall/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'af', {
6 toolbar: 'Selekteer alles'
7} );
diff --git a/sources/plugins/selectall/lang/ar.js b/sources/plugins/selectall/lang/ar.js
new file mode 100644
index 00000000..f28e4c83
--- /dev/null
+++ b/sources/plugins/selectall/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ar', {
6 toolbar: 'تحديد الكل'
7} );
diff --git a/sources/plugins/selectall/lang/bg.js b/sources/plugins/selectall/lang/bg.js
new file mode 100644
index 00000000..252ca9d2
--- /dev/null
+++ b/sources/plugins/selectall/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'bg', {
6 toolbar: 'Избери всичко'
7} );
diff --git a/sources/plugins/selectall/lang/bn.js b/sources/plugins/selectall/lang/bn.js
new file mode 100644
index 00000000..af1540d8
--- /dev/null
+++ b/sources/plugins/selectall/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'bn', {
6 toolbar: 'সব সিলেক্ট কর'
7} );
diff --git a/sources/plugins/selectall/lang/bs.js b/sources/plugins/selectall/lang/bs.js
new file mode 100644
index 00000000..9146aee6
--- /dev/null
+++ b/sources/plugins/selectall/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'bs', {
6 toolbar: 'Selektuj sve'
7} );
diff --git a/sources/plugins/selectall/lang/ca.js b/sources/plugins/selectall/lang/ca.js
new file mode 100644
index 00000000..27ea7940
--- /dev/null
+++ b/sources/plugins/selectall/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ca', {
6 toolbar: 'Selecciona-ho tot'
7} );
diff --git a/sources/plugins/selectall/lang/cs.js b/sources/plugins/selectall/lang/cs.js
new file mode 100644
index 00000000..4a7c8804
--- /dev/null
+++ b/sources/plugins/selectall/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'cs', {
6 toolbar: 'Vybrat vše'
7} );
diff --git a/sources/plugins/selectall/lang/cy.js b/sources/plugins/selectall/lang/cy.js
new file mode 100644
index 00000000..d043acaa
--- /dev/null
+++ b/sources/plugins/selectall/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'cy', {
6 toolbar: 'Dewis Popeth'
7} );
diff --git a/sources/plugins/selectall/lang/da.js b/sources/plugins/selectall/lang/da.js
new file mode 100644
index 00000000..9b892392
--- /dev/null
+++ b/sources/plugins/selectall/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'da', {
6 toolbar: 'Vælg alt'
7} );
diff --git a/sources/plugins/selectall/lang/de.js b/sources/plugins/selectall/lang/de.js
new file mode 100644
index 00000000..9b79ae3a
--- /dev/null
+++ b/sources/plugins/selectall/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'de', {
6 toolbar: 'Alles auswählen'
7} );
diff --git a/sources/plugins/selectall/lang/el.js b/sources/plugins/selectall/lang/el.js
new file mode 100644
index 00000000..faa1860b
--- /dev/null
+++ b/sources/plugins/selectall/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'el', {
6 toolbar: 'Επιλογή όλων'
7} );
diff --git a/sources/plugins/selectall/lang/en-au.js b/sources/plugins/selectall/lang/en-au.js
new file mode 100644
index 00000000..93fcc5e3
--- /dev/null
+++ b/sources/plugins/selectall/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'en-au', {
6 toolbar: 'Select All'
7} );
diff --git a/sources/plugins/selectall/lang/en-ca.js b/sources/plugins/selectall/lang/en-ca.js
new file mode 100644
index 00000000..a47bffc1
--- /dev/null
+++ b/sources/plugins/selectall/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'en-ca', {
6 toolbar: 'Select All'
7} );
diff --git a/sources/plugins/selectall/lang/en-gb.js b/sources/plugins/selectall/lang/en-gb.js
new file mode 100644
index 00000000..a5c9e0f9
--- /dev/null
+++ b/sources/plugins/selectall/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'en-gb', {
6 toolbar: 'Select All'
7} );
diff --git a/sources/plugins/selectall/lang/en.js b/sources/plugins/selectall/lang/en.js
new file mode 100644
index 00000000..4b03171d
--- /dev/null
+++ b/sources/plugins/selectall/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'en', {
6 toolbar: 'Select All'
7} );
diff --git a/sources/plugins/selectall/lang/eo.js b/sources/plugins/selectall/lang/eo.js
new file mode 100644
index 00000000..235ed123
--- /dev/null
+++ b/sources/plugins/selectall/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'eo', {
6 toolbar: 'Elekti ĉion'
7} );
diff --git a/sources/plugins/selectall/lang/es.js b/sources/plugins/selectall/lang/es.js
new file mode 100644
index 00000000..1db52d31
--- /dev/null
+++ b/sources/plugins/selectall/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'es', {
6 toolbar: 'Seleccionar Todo'
7} );
diff --git a/sources/plugins/selectall/lang/et.js b/sources/plugins/selectall/lang/et.js
new file mode 100644
index 00000000..b96f7614
--- /dev/null
+++ b/sources/plugins/selectall/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'et', {
6 toolbar: 'Kõige valimine'
7} );
diff --git a/sources/plugins/selectall/lang/eu.js b/sources/plugins/selectall/lang/eu.js
new file mode 100644
index 00000000..a1b4fe65
--- /dev/null
+++ b/sources/plugins/selectall/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'eu', {
6 toolbar: 'Hautatu dena'
7} );
diff --git a/sources/plugins/selectall/lang/fa.js b/sources/plugins/selectall/lang/fa.js
new file mode 100644
index 00000000..dd17300f
--- /dev/null
+++ b/sources/plugins/selectall/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'fa', {
6 toolbar: 'گزینش همه'
7} );
diff --git a/sources/plugins/selectall/lang/fi.js b/sources/plugins/selectall/lang/fi.js
new file mode 100644
index 00000000..88fff7ef
--- /dev/null
+++ b/sources/plugins/selectall/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'fi', {
6 toolbar: 'Valitse kaikki'
7} );
diff --git a/sources/plugins/selectall/lang/fo.js b/sources/plugins/selectall/lang/fo.js
new file mode 100644
index 00000000..2db6d7bb
--- /dev/null
+++ b/sources/plugins/selectall/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'fo', {
6 toolbar: 'Markera alt'
7} );
diff --git a/sources/plugins/selectall/lang/fr-ca.js b/sources/plugins/selectall/lang/fr-ca.js
new file mode 100644
index 00000000..8359154d
--- /dev/null
+++ b/sources/plugins/selectall/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'fr-ca', {
6 toolbar: 'Sélectionner tout'
7} );
diff --git a/sources/plugins/selectall/lang/fr.js b/sources/plugins/selectall/lang/fr.js
new file mode 100644
index 00000000..bb9285df
--- /dev/null
+++ b/sources/plugins/selectall/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'fr', {
6 toolbar: 'Tout sélectionner'
7} );
diff --git a/sources/plugins/selectall/lang/gl.js b/sources/plugins/selectall/lang/gl.js
new file mode 100644
index 00000000..2ca99354
--- /dev/null
+++ b/sources/plugins/selectall/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'gl', {
6 toolbar: 'Seleccionar todo'
7} );
diff --git a/sources/plugins/selectall/lang/gu.js b/sources/plugins/selectall/lang/gu.js
new file mode 100644
index 00000000..c5a94845
--- /dev/null
+++ b/sources/plugins/selectall/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'gu', {
6 toolbar: 'બઘું પસંદ કરવું'
7} );
diff --git a/sources/plugins/selectall/lang/he.js b/sources/plugins/selectall/lang/he.js
new file mode 100644
index 00000000..732937f8
--- /dev/null
+++ b/sources/plugins/selectall/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'he', {
6 toolbar: 'בחירת הכל'
7} );
diff --git a/sources/plugins/selectall/lang/hi.js b/sources/plugins/selectall/lang/hi.js
new file mode 100644
index 00000000..8f7484fe
--- /dev/null
+++ b/sources/plugins/selectall/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'hi', {
6 toolbar: 'सब सॅलॅक्ट करें'
7} );
diff --git a/sources/plugins/selectall/lang/hr.js b/sources/plugins/selectall/lang/hr.js
new file mode 100644
index 00000000..bcef89a8
--- /dev/null
+++ b/sources/plugins/selectall/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'hr', {
6 toolbar: 'Odaberi sve'
7} );
diff --git a/sources/plugins/selectall/lang/hu.js b/sources/plugins/selectall/lang/hu.js
new file mode 100644
index 00000000..18beda88
--- /dev/null
+++ b/sources/plugins/selectall/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'hu', {
6 toolbar: 'Mindent kijelöl'
7} );
diff --git a/sources/plugins/selectall/lang/id.js b/sources/plugins/selectall/lang/id.js
new file mode 100644
index 00000000..33770bb9
--- /dev/null
+++ b/sources/plugins/selectall/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'id', {
6 toolbar: 'Pilih Semua'
7} );
diff --git a/sources/plugins/selectall/lang/is.js b/sources/plugins/selectall/lang/is.js
new file mode 100644
index 00000000..9d608593
--- /dev/null
+++ b/sources/plugins/selectall/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'is', {
6 toolbar: 'Velja allt'
7} );
diff --git a/sources/plugins/selectall/lang/it.js b/sources/plugins/selectall/lang/it.js
new file mode 100644
index 00000000..f3c1e0ef
--- /dev/null
+++ b/sources/plugins/selectall/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'it', {
6 toolbar: 'Seleziona tutto'
7} );
diff --git a/sources/plugins/selectall/lang/ja.js b/sources/plugins/selectall/lang/ja.js
new file mode 100644
index 00000000..75572f1d
--- /dev/null
+++ b/sources/plugins/selectall/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ja', {
6 toolbar: 'すべて選択'
7} );
diff --git a/sources/plugins/selectall/lang/ka.js b/sources/plugins/selectall/lang/ka.js
new file mode 100644
index 00000000..7d1f2f13
--- /dev/null
+++ b/sources/plugins/selectall/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ka', {
6 toolbar: 'ყველაფრის მონიშნვა'
7} );
diff --git a/sources/plugins/selectall/lang/km.js b/sources/plugins/selectall/lang/km.js
new file mode 100644
index 00000000..bab71cd7
--- /dev/null
+++ b/sources/plugins/selectall/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'km', {
6 toolbar: 'រើស​ទាំង​អស់'
7} );
diff --git a/sources/plugins/selectall/lang/ko.js b/sources/plugins/selectall/lang/ko.js
new file mode 100644
index 00000000..7252ae4a
--- /dev/null
+++ b/sources/plugins/selectall/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ko', {
6 toolbar: '모두 선택'
7} );
diff --git a/sources/plugins/selectall/lang/ku.js b/sources/plugins/selectall/lang/ku.js
new file mode 100644
index 00000000..091b8bd1
--- /dev/null
+++ b/sources/plugins/selectall/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ku', {
6 toolbar: 'دیاریکردنی هەمووی'
7} );
diff --git a/sources/plugins/selectall/lang/lt.js b/sources/plugins/selectall/lang/lt.js
new file mode 100644
index 00000000..d4b9911c
--- /dev/null
+++ b/sources/plugins/selectall/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'lt', {
6 toolbar: 'Pažymėti viską'
7} );
diff --git a/sources/plugins/selectall/lang/lv.js b/sources/plugins/selectall/lang/lv.js
new file mode 100644
index 00000000..8c75d73c
--- /dev/null
+++ b/sources/plugins/selectall/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'lv', {
6 toolbar: 'Iezīmēt visu'
7} );
diff --git a/sources/plugins/selectall/lang/mk.js b/sources/plugins/selectall/lang/mk.js
new file mode 100644
index 00000000..101a3409
--- /dev/null
+++ b/sources/plugins/selectall/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'mk', {
6 toolbar: 'Select All' // MISSING
7} );
diff --git a/sources/plugins/selectall/lang/mn.js b/sources/plugins/selectall/lang/mn.js
new file mode 100644
index 00000000..75ba9b08
--- /dev/null
+++ b/sources/plugins/selectall/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'mn', {
6 toolbar: 'Бүгдийг нь сонгох'
7} );
diff --git a/sources/plugins/selectall/lang/ms.js b/sources/plugins/selectall/lang/ms.js
new file mode 100644
index 00000000..2edd324e
--- /dev/null
+++ b/sources/plugins/selectall/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ms', {
6 toolbar: 'Pilih Semua'
7} );
diff --git a/sources/plugins/selectall/lang/nb.js b/sources/plugins/selectall/lang/nb.js
new file mode 100644
index 00000000..d0e557d1
--- /dev/null
+++ b/sources/plugins/selectall/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'nb', {
6 toolbar: 'Merk alt'
7} );
diff --git a/sources/plugins/selectall/lang/nl.js b/sources/plugins/selectall/lang/nl.js
new file mode 100644
index 00000000..e772d488
--- /dev/null
+++ b/sources/plugins/selectall/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'nl', {
6 toolbar: 'Alles selecteren'
7} );
diff --git a/sources/plugins/selectall/lang/no.js b/sources/plugins/selectall/lang/no.js
new file mode 100644
index 00000000..eaeb8acc
--- /dev/null
+++ b/sources/plugins/selectall/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'no', {
6 toolbar: 'Merk alt'
7} );
diff --git a/sources/plugins/selectall/lang/pl.js b/sources/plugins/selectall/lang/pl.js
new file mode 100644
index 00000000..3a86355b
--- /dev/null
+++ b/sources/plugins/selectall/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'pl', {
6 toolbar: 'Zaznacz wszystko'
7} );
diff --git a/sources/plugins/selectall/lang/pt-br.js b/sources/plugins/selectall/lang/pt-br.js
new file mode 100644
index 00000000..1cfd07b1
--- /dev/null
+++ b/sources/plugins/selectall/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'pt-br', {
6 toolbar: 'Selecionar Tudo'
7} );
diff --git a/sources/plugins/selectall/lang/pt.js b/sources/plugins/selectall/lang/pt.js
new file mode 100644
index 00000000..ce1e1147
--- /dev/null
+++ b/sources/plugins/selectall/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'pt', {
6 toolbar: 'Selecionar tudo'
7} );
diff --git a/sources/plugins/selectall/lang/ro.js b/sources/plugins/selectall/lang/ro.js
new file mode 100644
index 00000000..0bb81714
--- /dev/null
+++ b/sources/plugins/selectall/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ro', {
6 toolbar: 'Selectează tot'
7} );
diff --git a/sources/plugins/selectall/lang/ru.js b/sources/plugins/selectall/lang/ru.js
new file mode 100644
index 00000000..694157d4
--- /dev/null
+++ b/sources/plugins/selectall/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ru', {
6 toolbar: 'Выделить все'
7} );
diff --git a/sources/plugins/selectall/lang/si.js b/sources/plugins/selectall/lang/si.js
new file mode 100644
index 00000000..a25c2d36
--- /dev/null
+++ b/sources/plugins/selectall/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'si', {
6 toolbar: 'සියල්ලම '
7} );
diff --git a/sources/plugins/selectall/lang/sk.js b/sources/plugins/selectall/lang/sk.js
new file mode 100644
index 00000000..85ec8a8e
--- /dev/null
+++ b/sources/plugins/selectall/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'sk', {
6 toolbar: 'Vybrať všetko'
7} );
diff --git a/sources/plugins/selectall/lang/sl.js b/sources/plugins/selectall/lang/sl.js
new file mode 100644
index 00000000..35d93a20
--- /dev/null
+++ b/sources/plugins/selectall/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'sl', {
6 toolbar: 'Izberi vse'
7} );
diff --git a/sources/plugins/selectall/lang/sq.js b/sources/plugins/selectall/lang/sq.js
new file mode 100644
index 00000000..94b08f30
--- /dev/null
+++ b/sources/plugins/selectall/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'sq', {
6 toolbar: 'Përzgjidh të Gjitha'
7} );
diff --git a/sources/plugins/selectall/lang/sr-latn.js b/sources/plugins/selectall/lang/sr-latn.js
new file mode 100644
index 00000000..e7eadb8b
--- /dev/null
+++ b/sources/plugins/selectall/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'sr-latn', {
6 toolbar: 'Označi sve'
7} );
diff --git a/sources/plugins/selectall/lang/sr.js b/sources/plugins/selectall/lang/sr.js
new file mode 100644
index 00000000..6ab510d2
--- /dev/null
+++ b/sources/plugins/selectall/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'sr', {
6 toolbar: 'Означи све'
7} );
diff --git a/sources/plugins/selectall/lang/sv.js b/sources/plugins/selectall/lang/sv.js
new file mode 100644
index 00000000..64af4c9b
--- /dev/null
+++ b/sources/plugins/selectall/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'sv', {
6 toolbar: 'Markera allt'
7} );
diff --git a/sources/plugins/selectall/lang/th.js b/sources/plugins/selectall/lang/th.js
new file mode 100644
index 00000000..817b42b3
--- /dev/null
+++ b/sources/plugins/selectall/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'th', {
6 toolbar: 'เลือกทั้งหมด'
7} );
diff --git a/sources/plugins/selectall/lang/tr.js b/sources/plugins/selectall/lang/tr.js
new file mode 100644
index 00000000..aaf5913d
--- /dev/null
+++ b/sources/plugins/selectall/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'tr', {
6 toolbar: 'Tümünü Seç'
7} );
diff --git a/sources/plugins/selectall/lang/tt.js b/sources/plugins/selectall/lang/tt.js
new file mode 100644
index 00000000..32fd1b0d
--- /dev/null
+++ b/sources/plugins/selectall/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'tt', {
6 toolbar: 'Барысын сайлау'
7} );
diff --git a/sources/plugins/selectall/lang/ug.js b/sources/plugins/selectall/lang/ug.js
new file mode 100644
index 00000000..f43df3e6
--- /dev/null
+++ b/sources/plugins/selectall/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'ug', {
6 toolbar: 'ھەممىنى تاللا'
7} );
diff --git a/sources/plugins/selectall/lang/uk.js b/sources/plugins/selectall/lang/uk.js
new file mode 100644
index 00000000..e5a13f30
--- /dev/null
+++ b/sources/plugins/selectall/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'uk', {
6 toolbar: 'Виділити все'
7} );
diff --git a/sources/plugins/selectall/lang/vi.js b/sources/plugins/selectall/lang/vi.js
new file mode 100644
index 00000000..4872e944
--- /dev/null
+++ b/sources/plugins/selectall/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'vi', {
6 toolbar: 'Chọn tất cả'
7} );
diff --git a/sources/plugins/selectall/lang/zh-cn.js b/sources/plugins/selectall/lang/zh-cn.js
new file mode 100644
index 00000000..823d812f
--- /dev/null
+++ b/sources/plugins/selectall/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'zh-cn', {
6 toolbar: '全选'
7} );
diff --git a/sources/plugins/selectall/lang/zh.js b/sources/plugins/selectall/lang/zh.js
new file mode 100644
index 00000000..799d4932
--- /dev/null
+++ b/sources/plugins/selectall/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'selectall', 'zh', {
6 toolbar: '全選'
7} );
diff --git a/sources/plugins/selectall/plugin.js b/sources/plugins/selectall/plugin.js
new file mode 100644
index 00000000..c8cc3182
--- /dev/null
+++ b/sources/plugins/selectall/plugin.js
@@ -0,0 +1,60 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "selectall" plugin provides an editor command that
8 * allows selecting the entire content of editable area.
9 * This plugin also enables a toolbar button for the feature.
10 */
11
12( function() {
13 CKEDITOR.plugins.add( 'selectall', {
14 // jscs:disable maximumLineLength
15 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
16 // jscs:enable maximumLineLength
17 icons: 'selectall', // %REMOVE_LINE_CORE%
18 hidpi: true, // %REMOVE_LINE_CORE%
19 init: function( editor ) {
20 editor.addCommand( 'selectAll', { modes: { wysiwyg: 1, source: 1 },
21 exec: function( editor ) {
22 var editable = editor.editable();
23
24 if ( editable.is( 'textarea' ) ) {
25 var textarea = editable.$;
26
27 if ( CKEDITOR.env.ie )
28 textarea.createTextRange().execCommand( 'SelectAll' );
29 else {
30 textarea.selectionStart = 0;
31 textarea.selectionEnd = textarea.value.length;
32 }
33
34 textarea.focus();
35 } else {
36 if ( editable.is( 'body' ) )
37 editor.document.$.execCommand( 'SelectAll', false, null );
38 else {
39 var range = editor.createRange();
40 range.selectNodeContents( editable );
41 range.select();
42 }
43
44 // Force triggering selectionChange (#7008)
45 editor.forceNextSelectionCheck();
46 editor.selectionChange();
47 }
48
49 },
50 canUndo: false
51 } );
52
53 editor.ui.addButton && editor.ui.addButton( 'SelectAll', {
54 label: editor.lang.selectall.toolbar,
55 command: 'selectAll',
56 toolbar: 'selection,10'
57 } );
58 }
59 } );
60} )();
diff --git a/sources/plugins/showblocks/icons/hidpi/showblocks-rtl.png b/sources/plugins/showblocks/icons/hidpi/showblocks-rtl.png
new file mode 100644
index 00000000..c88abcb6
--- /dev/null
+++ b/sources/plugins/showblocks/icons/hidpi/showblocks-rtl.png
Binary files differ
diff --git a/sources/plugins/showblocks/icons/hidpi/showblocks.png b/sources/plugins/showblocks/icons/hidpi/showblocks.png
new file mode 100644
index 00000000..a776fcc1
--- /dev/null
+++ b/sources/plugins/showblocks/icons/hidpi/showblocks.png
Binary files differ
diff --git a/sources/plugins/showblocks/icons/showblocks-rtl.png b/sources/plugins/showblocks/icons/showblocks-rtl.png
new file mode 100644
index 00000000..cd87d3e2
--- /dev/null
+++ b/sources/plugins/showblocks/icons/showblocks-rtl.png
Binary files differ
diff --git a/sources/plugins/showblocks/icons/showblocks.png b/sources/plugins/showblocks/icons/showblocks.png
new file mode 100644
index 00000000..41b5f346
--- /dev/null
+++ b/sources/plugins/showblocks/icons/showblocks.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_address.png b/sources/plugins/showblocks/images/block_address.png
new file mode 100644
index 00000000..5abdae12
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_address.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_blockquote.png b/sources/plugins/showblocks/images/block_blockquote.png
new file mode 100644
index 00000000..a8f49735
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_blockquote.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_div.png b/sources/plugins/showblocks/images/block_div.png
new file mode 100644
index 00000000..87b3c171
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_div.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_h1.png b/sources/plugins/showblocks/images/block_h1.png
new file mode 100644
index 00000000..3933325c
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_h1.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_h2.png b/sources/plugins/showblocks/images/block_h2.png
new file mode 100644
index 00000000..c99894c2
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_h2.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_h3.png b/sources/plugins/showblocks/images/block_h3.png
new file mode 100644
index 00000000..cb73d679
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_h3.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_h4.png b/sources/plugins/showblocks/images/block_h4.png
new file mode 100644
index 00000000..7af6bb49
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_h4.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_h5.png b/sources/plugins/showblocks/images/block_h5.png
new file mode 100644
index 00000000..ce5bec16
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_h5.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_h6.png b/sources/plugins/showblocks/images/block_h6.png
new file mode 100644
index 00000000..e67b9829
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_h6.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_p.png b/sources/plugins/showblocks/images/block_p.png
new file mode 100644
index 00000000..63a58202
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_p.png
Binary files differ
diff --git a/sources/plugins/showblocks/images/block_pre.png b/sources/plugins/showblocks/images/block_pre.png
new file mode 100644
index 00000000..955a8689
--- /dev/null
+++ b/sources/plugins/showblocks/images/block_pre.png
Binary files differ
diff --git a/sources/plugins/showblocks/lang/af.js b/sources/plugins/showblocks/lang/af.js
new file mode 100644
index 00000000..9d73dbd5
--- /dev/null
+++ b/sources/plugins/showblocks/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'af', {
6 toolbar: 'Toon blokke'
7} );
diff --git a/sources/plugins/showblocks/lang/ar.js b/sources/plugins/showblocks/lang/ar.js
new file mode 100644
index 00000000..36420bea
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ar', {
6 toolbar: 'مخطط تفصيلي'
7} );
diff --git a/sources/plugins/showblocks/lang/bg.js b/sources/plugins/showblocks/lang/bg.js
new file mode 100644
index 00000000..7ca8b684
--- /dev/null
+++ b/sources/plugins/showblocks/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'bg', {
6 toolbar: 'Показва блокове'
7} );
diff --git a/sources/plugins/showblocks/lang/bn.js b/sources/plugins/showblocks/lang/bn.js
new file mode 100644
index 00000000..d4e8aa21
--- /dev/null
+++ b/sources/plugins/showblocks/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'bn', {
6 toolbar: 'Show Blocks' // MISSING
7} );
diff --git a/sources/plugins/showblocks/lang/bs.js b/sources/plugins/showblocks/lang/bs.js
new file mode 100644
index 00000000..e48e5a25
--- /dev/null
+++ b/sources/plugins/showblocks/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'bs', {
6 toolbar: 'Show Blocks' // MISSING
7} );
diff --git a/sources/plugins/showblocks/lang/ca.js b/sources/plugins/showblocks/lang/ca.js
new file mode 100644
index 00000000..dfab8a1d
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ca', {
6 toolbar: 'Mostra els blocs'
7} );
diff --git a/sources/plugins/showblocks/lang/cs.js b/sources/plugins/showblocks/lang/cs.js
new file mode 100644
index 00000000..3ca977b0
--- /dev/null
+++ b/sources/plugins/showblocks/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'cs', {
6 toolbar: 'Ukázat bloky'
7} );
diff --git a/sources/plugins/showblocks/lang/cy.js b/sources/plugins/showblocks/lang/cy.js
new file mode 100644
index 00000000..945b7958
--- /dev/null
+++ b/sources/plugins/showblocks/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'cy', {
6 toolbar: 'Dangos Blociau'
7} );
diff --git a/sources/plugins/showblocks/lang/da.js b/sources/plugins/showblocks/lang/da.js
new file mode 100644
index 00000000..96bbc5b9
--- /dev/null
+++ b/sources/plugins/showblocks/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'da', {
6 toolbar: 'Vis afsnitsmærker'
7} );
diff --git a/sources/plugins/showblocks/lang/de.js b/sources/plugins/showblocks/lang/de.js
new file mode 100644
index 00000000..7fb53592
--- /dev/null
+++ b/sources/plugins/showblocks/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'de', {
6 toolbar: 'Blöcke anzeigen'
7} );
diff --git a/sources/plugins/showblocks/lang/el.js b/sources/plugins/showblocks/lang/el.js
new file mode 100644
index 00000000..fd89a796
--- /dev/null
+++ b/sources/plugins/showblocks/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'el', {
6 toolbar: 'Προβολή Τμημάτων'
7} );
diff --git a/sources/plugins/showblocks/lang/en-au.js b/sources/plugins/showblocks/lang/en-au.js
new file mode 100644
index 00000000..22299b30
--- /dev/null
+++ b/sources/plugins/showblocks/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'en-au', {
6 toolbar: 'Show Blocks'
7} );
diff --git a/sources/plugins/showblocks/lang/en-ca.js b/sources/plugins/showblocks/lang/en-ca.js
new file mode 100644
index 00000000..c5dfa3ce
--- /dev/null
+++ b/sources/plugins/showblocks/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'en-ca', {
6 toolbar: 'Show Blocks'
7} );
diff --git a/sources/plugins/showblocks/lang/en-gb.js b/sources/plugins/showblocks/lang/en-gb.js
new file mode 100644
index 00000000..0491dbfb
--- /dev/null
+++ b/sources/plugins/showblocks/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'en-gb', {
6 toolbar: 'Show Blocks'
7} );
diff --git a/sources/plugins/showblocks/lang/en.js b/sources/plugins/showblocks/lang/en.js
new file mode 100644
index 00000000..dd121a20
--- /dev/null
+++ b/sources/plugins/showblocks/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'en', {
6 toolbar: 'Show Blocks'
7} );
diff --git a/sources/plugins/showblocks/lang/eo.js b/sources/plugins/showblocks/lang/eo.js
new file mode 100644
index 00000000..a44662f6
--- /dev/null
+++ b/sources/plugins/showblocks/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'eo', {
6 toolbar: 'Montri la blokojn'
7} );
diff --git a/sources/plugins/showblocks/lang/es.js b/sources/plugins/showblocks/lang/es.js
new file mode 100644
index 00000000..f9ea1cdf
--- /dev/null
+++ b/sources/plugins/showblocks/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'es', {
6 toolbar: 'Mostrar bloques'
7} );
diff --git a/sources/plugins/showblocks/lang/et.js b/sources/plugins/showblocks/lang/et.js
new file mode 100644
index 00000000..883d4862
--- /dev/null
+++ b/sources/plugins/showblocks/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'et', {
6 toolbar: 'Blokkide näitamine'
7} );
diff --git a/sources/plugins/showblocks/lang/eu.js b/sources/plugins/showblocks/lang/eu.js
new file mode 100644
index 00000000..c0a75439
--- /dev/null
+++ b/sources/plugins/showblocks/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'eu', {
6 toolbar: 'Erakutsi blokeak'
7} );
diff --git a/sources/plugins/showblocks/lang/fa.js b/sources/plugins/showblocks/lang/fa.js
new file mode 100644
index 00000000..d9bccd24
--- /dev/null
+++ b/sources/plugins/showblocks/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'fa', {
6 toolbar: 'نمایش بلوک‌ها'
7} );
diff --git a/sources/plugins/showblocks/lang/fi.js b/sources/plugins/showblocks/lang/fi.js
new file mode 100644
index 00000000..053fa69f
--- /dev/null
+++ b/sources/plugins/showblocks/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'fi', {
6 toolbar: 'Näytä elementit'
7} );
diff --git a/sources/plugins/showblocks/lang/fo.js b/sources/plugins/showblocks/lang/fo.js
new file mode 100644
index 00000000..2cc79a51
--- /dev/null
+++ b/sources/plugins/showblocks/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'fo', {
6 toolbar: 'Vís blokkar'
7} );
diff --git a/sources/plugins/showblocks/lang/fr-ca.js b/sources/plugins/showblocks/lang/fr-ca.js
new file mode 100644
index 00000000..7b77e25e
--- /dev/null
+++ b/sources/plugins/showblocks/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'fr-ca', {
6 toolbar: 'Afficher les blocs'
7} );
diff --git a/sources/plugins/showblocks/lang/fr.js b/sources/plugins/showblocks/lang/fr.js
new file mode 100644
index 00000000..3f771b06
--- /dev/null
+++ b/sources/plugins/showblocks/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'fr', {
6 toolbar: 'Afficher les blocs'
7} );
diff --git a/sources/plugins/showblocks/lang/gl.js b/sources/plugins/showblocks/lang/gl.js
new file mode 100644
index 00000000..f107a5af
--- /dev/null
+++ b/sources/plugins/showblocks/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'gl', {
6 toolbar: 'Amosar os bloques'
7} );
diff --git a/sources/plugins/showblocks/lang/gu.js b/sources/plugins/showblocks/lang/gu.js
new file mode 100644
index 00000000..4641901d
--- /dev/null
+++ b/sources/plugins/showblocks/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'gu', {
6 toolbar: 'બ્લૉક બતાવવું'
7} );
diff --git a/sources/plugins/showblocks/lang/he.js b/sources/plugins/showblocks/lang/he.js
new file mode 100644
index 00000000..528d04eb
--- /dev/null
+++ b/sources/plugins/showblocks/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'he', {
6 toolbar: 'הצגת בלוקים'
7} );
diff --git a/sources/plugins/showblocks/lang/hi.js b/sources/plugins/showblocks/lang/hi.js
new file mode 100644
index 00000000..4a4869eb
--- /dev/null
+++ b/sources/plugins/showblocks/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'hi', {
6 toolbar: 'ब्लॉक दिखायें'
7} );
diff --git a/sources/plugins/showblocks/lang/hr.js b/sources/plugins/showblocks/lang/hr.js
new file mode 100644
index 00000000..ad60d878
--- /dev/null
+++ b/sources/plugins/showblocks/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'hr', {
6 toolbar: 'Prikaži blokove'
7} );
diff --git a/sources/plugins/showblocks/lang/hu.js b/sources/plugins/showblocks/lang/hu.js
new file mode 100644
index 00000000..6abc3205
--- /dev/null
+++ b/sources/plugins/showblocks/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'hu', {
6 toolbar: 'Blokkok megjelenítése'
7} );
diff --git a/sources/plugins/showblocks/lang/id.js b/sources/plugins/showblocks/lang/id.js
new file mode 100644
index 00000000..b075fa5f
--- /dev/null
+++ b/sources/plugins/showblocks/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'id', {
6 toolbar: 'Perlihatkan Blok'
7} );
diff --git a/sources/plugins/showblocks/lang/is.js b/sources/plugins/showblocks/lang/is.js
new file mode 100644
index 00000000..4ef80ece
--- /dev/null
+++ b/sources/plugins/showblocks/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'is', {
6 toolbar: 'Sýna blokkir'
7} );
diff --git a/sources/plugins/showblocks/lang/it.js b/sources/plugins/showblocks/lang/it.js
new file mode 100644
index 00000000..def22aa7
--- /dev/null
+++ b/sources/plugins/showblocks/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'it', {
6 toolbar: 'Visualizza Blocchi'
7} );
diff --git a/sources/plugins/showblocks/lang/ja.js b/sources/plugins/showblocks/lang/ja.js
new file mode 100644
index 00000000..e1424a87
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ja', {
6 toolbar: 'ブロック表示'
7} );
diff --git a/sources/plugins/showblocks/lang/ka.js b/sources/plugins/showblocks/lang/ka.js
new file mode 100644
index 00000000..e312c057
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ka', {
6 toolbar: 'არეების ჩვენება'
7} );
diff --git a/sources/plugins/showblocks/lang/km.js b/sources/plugins/showblocks/lang/km.js
new file mode 100644
index 00000000..5a8a1416
--- /dev/null
+++ b/sources/plugins/showblocks/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'km', {
6 toolbar: 'បង្ហាញ​ប្លក់'
7} );
diff --git a/sources/plugins/showblocks/lang/ko.js b/sources/plugins/showblocks/lang/ko.js
new file mode 100644
index 00000000..9d41596d
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ko', {
6 toolbar: '블록 보기'
7} );
diff --git a/sources/plugins/showblocks/lang/ku.js b/sources/plugins/showblocks/lang/ku.js
new file mode 100644
index 00000000..27224820
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ku', {
6 toolbar: 'نیشاندانی بەربەستەکان'
7} );
diff --git a/sources/plugins/showblocks/lang/lt.js b/sources/plugins/showblocks/lang/lt.js
new file mode 100644
index 00000000..f711598e
--- /dev/null
+++ b/sources/plugins/showblocks/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'lt', {
6 toolbar: 'Rodyti blokus'
7} );
diff --git a/sources/plugins/showblocks/lang/lv.js b/sources/plugins/showblocks/lang/lv.js
new file mode 100644
index 00000000..b6ee9ee9
--- /dev/null
+++ b/sources/plugins/showblocks/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'lv', {
6 toolbar: 'Parādīt blokus'
7} );
diff --git a/sources/plugins/showblocks/lang/mk.js b/sources/plugins/showblocks/lang/mk.js
new file mode 100644
index 00000000..382be788
--- /dev/null
+++ b/sources/plugins/showblocks/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'mk', {
6 toolbar: 'Show Blocks' // MISSING
7} );
diff --git a/sources/plugins/showblocks/lang/mn.js b/sources/plugins/showblocks/lang/mn.js
new file mode 100644
index 00000000..42144677
--- /dev/null
+++ b/sources/plugins/showblocks/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'mn', {
6 toolbar: 'Хавтангуудыг харуулах'
7} );
diff --git a/sources/plugins/showblocks/lang/ms.js b/sources/plugins/showblocks/lang/ms.js
new file mode 100644
index 00000000..557e4950
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ms', {
6 toolbar: 'Show Blocks' // MISSING
7} );
diff --git a/sources/plugins/showblocks/lang/nb.js b/sources/plugins/showblocks/lang/nb.js
new file mode 100644
index 00000000..3a5e146d
--- /dev/null
+++ b/sources/plugins/showblocks/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'nb', {
6 toolbar: 'Vis blokker'
7} );
diff --git a/sources/plugins/showblocks/lang/nl.js b/sources/plugins/showblocks/lang/nl.js
new file mode 100644
index 00000000..2fbbef26
--- /dev/null
+++ b/sources/plugins/showblocks/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'nl', {
6 toolbar: 'Toon blokken'
7} );
diff --git a/sources/plugins/showblocks/lang/no.js b/sources/plugins/showblocks/lang/no.js
new file mode 100644
index 00000000..14d190fb
--- /dev/null
+++ b/sources/plugins/showblocks/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'no', {
6 toolbar: 'Vis blokker'
7} );
diff --git a/sources/plugins/showblocks/lang/pl.js b/sources/plugins/showblocks/lang/pl.js
new file mode 100644
index 00000000..b33a3c0f
--- /dev/null
+++ b/sources/plugins/showblocks/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'pl', {
6 toolbar: 'Pokaż bloki'
7} );
diff --git a/sources/plugins/showblocks/lang/pt-br.js b/sources/plugins/showblocks/lang/pt-br.js
new file mode 100644
index 00000000..4c7f172c
--- /dev/null
+++ b/sources/plugins/showblocks/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'pt-br', {
6 toolbar: 'Mostrar blocos de código'
7} );
diff --git a/sources/plugins/showblocks/lang/pt.js b/sources/plugins/showblocks/lang/pt.js
new file mode 100644
index 00000000..b27a7e72
--- /dev/null
+++ b/sources/plugins/showblocks/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'pt', {
6 toolbar: 'Exibir blocos'
7} );
diff --git a/sources/plugins/showblocks/lang/ro.js b/sources/plugins/showblocks/lang/ro.js
new file mode 100644
index 00000000..268c2fdb
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ro', {
6 toolbar: 'Arată blocurile'
7} );
diff --git a/sources/plugins/showblocks/lang/ru.js b/sources/plugins/showblocks/lang/ru.js
new file mode 100644
index 00000000..9b3f315d
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ru', {
6 toolbar: 'Отображать блоки'
7} );
diff --git a/sources/plugins/showblocks/lang/si.js b/sources/plugins/showblocks/lang/si.js
new file mode 100644
index 00000000..63722d12
--- /dev/null
+++ b/sources/plugins/showblocks/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'si', {
6 toolbar: 'කොටස පෙන්නන්න'
7} );
diff --git a/sources/plugins/showblocks/lang/sk.js b/sources/plugins/showblocks/lang/sk.js
new file mode 100644
index 00000000..bd4cdc38
--- /dev/null
+++ b/sources/plugins/showblocks/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'sk', {
6 toolbar: 'Ukázať bloky'
7} );
diff --git a/sources/plugins/showblocks/lang/sl.js b/sources/plugins/showblocks/lang/sl.js
new file mode 100644
index 00000000..14ace414
--- /dev/null
+++ b/sources/plugins/showblocks/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'sl', {
6 toolbar: 'Prikaži ograde'
7} );
diff --git a/sources/plugins/showblocks/lang/sq.js b/sources/plugins/showblocks/lang/sq.js
new file mode 100644
index 00000000..8371edab
--- /dev/null
+++ b/sources/plugins/showblocks/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'sq', {
6 toolbar: 'Shfaq Blloqet'
7} );
diff --git a/sources/plugins/showblocks/lang/sr-latn.js b/sources/plugins/showblocks/lang/sr-latn.js
new file mode 100644
index 00000000..8dd9e3b7
--- /dev/null
+++ b/sources/plugins/showblocks/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'sr-latn', {
6 toolbar: 'Show Blocks' // MISSING
7} );
diff --git a/sources/plugins/showblocks/lang/sr.js b/sources/plugins/showblocks/lang/sr.js
new file mode 100644
index 00000000..fa6e4173
--- /dev/null
+++ b/sources/plugins/showblocks/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'sr', {
6 toolbar: 'Show Blocks' // MISSING
7} );
diff --git a/sources/plugins/showblocks/lang/sv.js b/sources/plugins/showblocks/lang/sv.js
new file mode 100644
index 00000000..ec935fcc
--- /dev/null
+++ b/sources/plugins/showblocks/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'sv', {
6 toolbar: 'Visa block'
7} );
diff --git a/sources/plugins/showblocks/lang/th.js b/sources/plugins/showblocks/lang/th.js
new file mode 100644
index 00000000..6e8fbe95
--- /dev/null
+++ b/sources/plugins/showblocks/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'th', {
6 toolbar: 'แสดงบล็อคข้อมูล'
7} );
diff --git a/sources/plugins/showblocks/lang/tr.js b/sources/plugins/showblocks/lang/tr.js
new file mode 100644
index 00000000..b9b430c0
--- /dev/null
+++ b/sources/plugins/showblocks/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'tr', {
6 toolbar: 'Blokları Göster'
7} );
diff --git a/sources/plugins/showblocks/lang/tt.js b/sources/plugins/showblocks/lang/tt.js
new file mode 100644
index 00000000..8de9fb1f
--- /dev/null
+++ b/sources/plugins/showblocks/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'tt', {
6 toolbar: 'Блокларны күрсәтү'
7} );
diff --git a/sources/plugins/showblocks/lang/ug.js b/sources/plugins/showblocks/lang/ug.js
new file mode 100644
index 00000000..187102b9
--- /dev/null
+++ b/sources/plugins/showblocks/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'ug', {
6 toolbar: 'بۆلەكنى كۆرسەت'
7} );
diff --git a/sources/plugins/showblocks/lang/uk.js b/sources/plugins/showblocks/lang/uk.js
new file mode 100644
index 00000000..3f9f0150
--- /dev/null
+++ b/sources/plugins/showblocks/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'uk', {
6 toolbar: 'Показувати блоки'
7} );
diff --git a/sources/plugins/showblocks/lang/vi.js b/sources/plugins/showblocks/lang/vi.js
new file mode 100644
index 00000000..af30a43c
--- /dev/null
+++ b/sources/plugins/showblocks/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'vi', {
6 toolbar: 'Hiển thị các khối'
7} );
diff --git a/sources/plugins/showblocks/lang/zh-cn.js b/sources/plugins/showblocks/lang/zh-cn.js
new file mode 100644
index 00000000..104f8fb1
--- /dev/null
+++ b/sources/plugins/showblocks/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'zh-cn', {
6 toolbar: '显示区块'
7} );
diff --git a/sources/plugins/showblocks/lang/zh.js b/sources/plugins/showblocks/lang/zh.js
new file mode 100644
index 00000000..5990ecfd
--- /dev/null
+++ b/sources/plugins/showblocks/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'showblocks', 'zh', {
6 toolbar: '顯示區塊'
7} );
diff --git a/sources/plugins/showblocks/plugin.js b/sources/plugins/showblocks/plugin.js
new file mode 100644
index 00000000..7bf11c23
--- /dev/null
+++ b/sources/plugins/showblocks/plugin.js
@@ -0,0 +1,153 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "showblocks" plugin. Enable it will make all block level
8 * elements being decorated with a border and the element name
9 * displayed on the left-right corner.
10 */
11
12( function() {
13 'use strict';
14
15 var commandDefinition = {
16 readOnly: 1,
17 preserveState: true,
18 editorFocus: false,
19
20 exec: function( editor ) {
21 this.toggleState();
22 this.refresh( editor );
23 },
24
25 refresh: function( editor ) {
26 if ( editor.document ) {
27 // Show blocks turns inactive after editor loses focus when in inline.
28 var showBlocks = ( this.state == CKEDITOR.TRISTATE_ON && ( editor.elementMode != CKEDITOR.ELEMENT_MODE_INLINE || editor.focusManager.hasFocus ) );
29
30 var funcName = showBlocks ? 'attachClass' : 'removeClass';
31 editor.editable()[ funcName ]( 'cke_show_blocks' );
32 }
33 }
34 };
35
36 CKEDITOR.plugins.add( 'showblocks', {
37 // jscs:disable maximumLineLength
38 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
39 // jscs:enable maximumLineLength
40 icons: 'showblocks,showblocks-rtl', // %REMOVE_LINE_CORE%
41 hidpi: true, // %REMOVE_LINE_CORE%
42 onLoad: function() {
43 var tags = [ 'p', 'div', 'pre', 'address', 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ],
44 cssStd, cssImg, cssLtr, cssRtl,
45 path = CKEDITOR.getUrl( this.path ),
46 // #10884 don't apply showblocks styles to non-editable elements and chosen ones.
47 // IE8 does not support :not() pseudoclass, so we need to reset showblocks rather
48 // than 'prevent' its application. We do that by additional rules.
49 supportsNotPseudoclass = !( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ),
50 notDisabled = supportsNotPseudoclass ? ':not([contenteditable=false]):not(.cke_show_blocks_off)' : '',
51 tag, trailing;
52
53 cssStd = cssImg = cssLtr = cssRtl = '';
54
55 while ( ( tag = tags.pop() ) ) {
56 trailing = tags.length ? ',' : '';
57
58 cssStd += '.cke_show_blocks ' + tag + notDisabled + trailing;
59 cssLtr += '.cke_show_blocks.cke_contents_ltr ' + tag + notDisabled + trailing;
60 cssRtl += '.cke_show_blocks.cke_contents_rtl ' + tag + notDisabled + trailing;
61 cssImg += '.cke_show_blocks ' + tag + notDisabled + '{' +
62 'background-image:url(' + CKEDITOR.getUrl( path + 'images/block_' + tag + '.png' ) + ')' +
63 '}';
64 }
65
66 // .cke_show_blocks p { ... }
67 cssStd += '{' +
68 'background-repeat:no-repeat;' +
69 'border:1px dotted gray;' +
70 'padding-top:8px' +
71 '}';
72
73 // .cke_show_blocks.cke_contents_ltr p { ... }
74 cssLtr += '{' +
75 'background-position:top left;' +
76 'padding-left:8px' +
77 '}';
78
79 // .cke_show_blocks.cke_contents_rtl p { ... }
80 cssRtl += '{' +
81 'background-position:top right;' +
82 'padding-right:8px' +
83 '}';
84
85 CKEDITOR.addCss( cssStd.concat( cssImg, cssLtr, cssRtl ) );
86
87 // [IE8] Reset showblocks styles for non-editables and chosen elements, because
88 // it could not be done using :not() pseudoclass (#10884).
89 if ( !supportsNotPseudoclass ) {
90 CKEDITOR.addCss(
91 '.cke_show_blocks [contenteditable=false],.cke_show_blocks .cke_show_blocks_off{' +
92 'border:none;' +
93 'padding-top:0;' +
94 'background-image:none' +
95 '}' +
96 '.cke_show_blocks.cke_contents_rtl [contenteditable=false],.cke_show_blocks.cke_contents_rtl .cke_show_blocks_off{' +
97 'padding-right:0' +
98 '}' +
99 '.cke_show_blocks.cke_contents_ltr [contenteditable=false],.cke_show_blocks.cke_contents_ltr .cke_show_blocks_off{' +
100 'padding-left:0' +
101 '}'
102 );
103 }
104 },
105 init: function( editor ) {
106 if ( editor.blockless )
107 return;
108
109 var command = editor.addCommand( 'showblocks', commandDefinition );
110 command.canUndo = false;
111
112 if ( editor.config.startupOutlineBlocks )
113 command.setState( CKEDITOR.TRISTATE_ON );
114
115 editor.ui.addButton && editor.ui.addButton( 'ShowBlocks', {
116 label: editor.lang.showblocks.toolbar,
117 command: 'showblocks',
118 toolbar: 'tools,20'
119 } );
120
121 // Refresh the command on setData.
122 editor.on( 'mode', function() {
123 if ( command.state != CKEDITOR.TRISTATE_DISABLED )
124 command.refresh( editor );
125 } );
126
127 // Refresh the command on focus/blur in inline.
128 if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ) {
129 editor.on( 'focus', onFocusBlur );
130 editor.on( 'blur', onFocusBlur );
131 }
132
133 // Refresh the command on setData.
134 editor.on( 'contentDom', function() {
135 if ( command.state != CKEDITOR.TRISTATE_DISABLED )
136 command.refresh( editor );
137 } );
138
139 function onFocusBlur() {
140 command.refresh( editor );
141 }
142 }
143 } );
144} )();
145
146/**
147 * Whether to automaticaly enable the show block" command when the editor loads.
148 *
149 * config.startupOutlineBlocks = true;
150 *
151 * @cfg {Boolean} [startupOutlineBlocks=false]
152 * @member CKEDITOR.config
153 */
diff --git a/sources/plugins/showborders/plugin.js b/sources/plugins/showborders/plugin.js
new file mode 100644
index 00000000..0c569931
--- /dev/null
+++ b/sources/plugins/showborders/plugin.js
@@ -0,0 +1,174 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "show border" plugin. The command display visible outline
8 * border line around all table elements if table doesn't have a none-zero 'border' attribute specified.
9 */
10
11( function() {
12 var commandDefinition = {
13 preserveState: true,
14 editorFocus: false,
15 readOnly: 1,
16
17 exec: function( editor ) {
18 this.toggleState();
19 this.refresh( editor );
20 },
21
22 refresh: function( editor ) {
23 if ( editor.document ) {
24 var funcName = ( this.state == CKEDITOR.TRISTATE_ON ) ? 'attachClass' : 'removeClass';
25 editor.editable()[ funcName ]( 'cke_show_borders' );
26 }
27 }
28 };
29
30 var showBorderClassName = 'cke_show_border';
31
32 CKEDITOR.plugins.add( 'showborders', {
33 modes: { 'wysiwyg': 1 },
34
35 onLoad: function() {
36 var cssStyleText,
37 cssTemplate =
38 // TODO: For IE6, we don't have child selector support,
39 // where nested table cells could be incorrect.
40 ( CKEDITOR.env.ie6Compat ? [
41 '.%1 table.%2,',
42 '.%1 table.%2 td, .%1 table.%2 th',
43 '{',
44 'border : #d3d3d3 1px dotted',
45 '}'
46 ] : [
47 '.%1 table.%2,',
48 '.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,',
49 '.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,',
50 '.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,',
51 '.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th',
52 '{',
53 'border : #d3d3d3 1px dotted',
54 '}'
55 ] ).join( '' );
56
57 cssStyleText = cssTemplate.replace( /%2/g, showBorderClassName ).replace( /%1/g, 'cke_show_borders ' );
58
59 CKEDITOR.addCss( cssStyleText );
60 },
61
62 init: function( editor ) {
63
64 var command = editor.addCommand( 'showborders', commandDefinition );
65 command.canUndo = false;
66
67 if ( editor.config.startupShowBorders !== false )
68 command.setState( CKEDITOR.TRISTATE_ON );
69
70 // Refresh the command on setData.
71 editor.on( 'mode', function() {
72 if ( command.state != CKEDITOR.TRISTATE_DISABLED )
73 command.refresh( editor );
74 }, null, null, 100 );
75
76 // Refresh the command on wysiwyg frame reloads.
77 editor.on( 'contentDom', function() {
78 if ( command.state != CKEDITOR.TRISTATE_DISABLED )
79 command.refresh( editor );
80 } );
81
82 editor.on( 'removeFormatCleanup', function( evt ) {
83 var element = evt.data;
84 if ( editor.getCommand( 'showborders' ).state == CKEDITOR.TRISTATE_ON && element.is( 'table' ) && ( !element.hasAttribute( 'border' ) || parseInt( element.getAttribute( 'border' ), 10 ) <= 0 ) )
85 element.addClass( showBorderClassName );
86 } );
87 },
88
89 afterInit: function( editor ) {
90 var dataProcessor = editor.dataProcessor,
91 dataFilter = dataProcessor && dataProcessor.dataFilter,
92 htmlFilter = dataProcessor && dataProcessor.htmlFilter;
93
94 if ( dataFilter ) {
95 dataFilter.addRules( {
96 elements: {
97 'table': function( element ) {
98 var attributes = element.attributes,
99 cssClass = attributes[ 'class' ],
100 border = parseInt( attributes.border, 10 );
101
102 if ( ( !border || border <= 0 ) && ( !cssClass || cssClass.indexOf( showBorderClassName ) == -1 ) )
103 attributes[ 'class' ] = ( cssClass || '' ) + ' ' + showBorderClassName;
104 }
105 }
106 } );
107 }
108
109 if ( htmlFilter ) {
110 htmlFilter.addRules( {
111 elements: {
112 'table': function( table ) {
113 var attributes = table.attributes,
114 cssClass = attributes[ 'class' ];
115
116 cssClass && ( attributes[ 'class' ] = cssClass.replace( showBorderClassName, '' ).replace( /\s{2}/, ' ' ).replace( /^\s+|\s+$/, '' ) );
117 }
118 }
119 } );
120 }
121 }
122 } );
123
124 // Table dialog must be aware of it.
125 CKEDITOR.on( 'dialogDefinition', function( ev ) {
126 var dialogName = ev.data.name;
127
128 if ( dialogName == 'table' || dialogName == 'tableProperties' ) {
129 var dialogDefinition = ev.data.definition,
130 infoTab = dialogDefinition.getContents( 'info' ),
131 borderField = infoTab.get( 'txtBorder' ),
132 originalCommit = borderField.commit;
133
134 borderField.commit = CKEDITOR.tools.override( originalCommit, function( org ) {
135 return function( data, selectedTable ) {
136 org.apply( this, arguments );
137 var value = parseInt( this.getValue(), 10 );
138 selectedTable[ ( !value || value <= 0 ) ? 'addClass' : 'removeClass' ]( showBorderClassName );
139 };
140 } );
141
142 var advTab = dialogDefinition.getContents( 'advanced' ),
143 classField = advTab && advTab.get( 'advCSSClasses' );
144
145 if ( classField ) {
146 classField.setup = CKEDITOR.tools.override( classField.setup, function( originalSetup ) {
147 return function() {
148 originalSetup.apply( this, arguments );
149 this.setValue( this.getValue().replace( /cke_show_border/, '' ) );
150 };
151 } );
152
153 classField.commit = CKEDITOR.tools.override( classField.commit, function( originalCommit ) {
154 return function( data, element ) {
155 originalCommit.apply( this, arguments );
156
157 if ( !parseInt( element.getAttribute( 'border' ), 10 ) )
158 element.addClass( 'cke_show_border' );
159 };
160 } );
161 }
162 }
163 } );
164
165} )();
166
167/**
168 * Whether to automatically enable the "show borders" command when the editor loads.
169 *
170 * config.startupShowBorders = false;
171 *
172 * @cfg {Boolean} [startupShowBorders=true]
173 * @member CKEDITOR.config
174 */
diff --git a/sources/plugins/smiley/dialogs/smiley.js b/sources/plugins/smiley/dialogs/smiley.js
new file mode 100644
index 00000000..4d9a2723
--- /dev/null
+++ b/sources/plugins/smiley/dialogs/smiley.js
@@ -0,0 +1,193 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'smiley', function( editor ) {
7 var config = editor.config,
8 lang = editor.lang.smiley,
9 images = config.smiley_images,
10 columns = config.smiley_columns || 8,
11 i;
12
13 // Simulate "this" of a dialog for non-dialog events.
14 // @type {CKEDITOR.dialog}
15 var dialog;
16 var onClick = function( evt ) {
17 var target = evt.data.getTarget(),
18 targetName = target.getName();
19
20 if ( targetName == 'a' )
21 target = target.getChild( 0 );
22 else if ( targetName != 'img' )
23 return;
24
25 var src = target.getAttribute( 'cke_src' ),
26 title = target.getAttribute( 'title' );
27
28 var img = editor.document.createElement( 'img', {
29 attributes: {
30 src: src,
31 'data-cke-saved-src': src,
32 title: title,
33 alt: title,
34 width: target.$.width,
35 height: target.$.height
36 }
37 } );
38
39 editor.insertElement( img );
40
41 dialog.hide();
42 evt.data.preventDefault();
43 };
44
45 var onKeydown = CKEDITOR.tools.addFunction( function( ev, element ) {
46 ev = new CKEDITOR.dom.event( ev );
47 element = new CKEDITOR.dom.element( element );
48 var relative, nodeToMove;
49
50 var keystroke = ev.getKeystroke(),
51 rtl = editor.lang.dir == 'rtl';
52 switch ( keystroke ) {
53 // UP-ARROW
54 case 38:
55 // relative is TR
56 if ( ( relative = element.getParent().getParent().getPrevious() ) ) {
57 nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );
58 nodeToMove.focus();
59 }
60 ev.preventDefault();
61 break;
62 // DOWN-ARROW
63 case 40:
64 // relative is TR
65 if ( ( relative = element.getParent().getParent().getNext() ) ) {
66 nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );
67 if ( nodeToMove )
68 nodeToMove.focus();
69 }
70 ev.preventDefault();
71 break;
72 // ENTER
73 // SPACE
74 case 32:
75 onClick( { data: ev } );
76 ev.preventDefault();
77 break;
78
79 // RIGHT-ARROW
80 case rtl ? 37 : 39:
81 // relative is TD
82 if ( ( relative = element.getParent().getNext() ) ) {
83 nodeToMove = relative.getChild( 0 );
84 nodeToMove.focus();
85 ev.preventDefault( true );
86 }
87 // relative is TR
88 else if ( ( relative = element.getParent().getParent().getNext() ) ) {
89 nodeToMove = relative.getChild( [ 0, 0 ] );
90 if ( nodeToMove )
91 nodeToMove.focus();
92 ev.preventDefault( true );
93 }
94 break;
95
96 // LEFT-ARROW
97 case rtl ? 39 : 37:
98 // relative is TD
99 if ( ( relative = element.getParent().getPrevious() ) ) {
100 nodeToMove = relative.getChild( 0 );
101 nodeToMove.focus();
102 ev.preventDefault( true );
103 }
104 // relative is TR
105 else if ( ( relative = element.getParent().getParent().getPrevious() ) ) {
106 nodeToMove = relative.getLast().getChild( 0 );
107 nodeToMove.focus();
108 ev.preventDefault( true );
109 }
110 break;
111 default:
112 // Do not stop not handled events.
113 return;
114 }
115 } );
116
117 // Build the HTML for the smiley images table.
118 var labelId = CKEDITOR.tools.getNextId() + '_smiley_emtions_label';
119 var html = [
120 '<div>' +
121 '<span id="' + labelId + '" class="cke_voice_label">' + lang.options + '</span>',
122 '<table role="listbox" aria-labelledby="' + labelId + '" style="width:100%;height:100%;border-collapse:separate;" cellspacing="2" cellpadding="2"',
123 CKEDITOR.env.ie && CKEDITOR.env.quirks ? ' style="position:absolute;"' : '',
124 '><tbody>'
125 ];
126
127 var size = images.length;
128 for ( i = 0; i < size; i++ ) {
129 if ( i % columns === 0 )
130 html.push( '<tr role="presentation">' );
131
132 var smileyLabelId = 'cke_smile_label_' + i + '_' + CKEDITOR.tools.getNextNumber();
133 html.push(
134 '<td class="cke_dark_background cke_centered" style="vertical-align: middle;" role="presentation">' +
135 '<a href="javascript:void(0)" role="option"', ' aria-posinset="' + ( i + 1 ) + '"', ' aria-setsize="' + size + '"', ' aria-labelledby="' + smileyLabelId + '"',
136 ' class="cke_smile cke_hand" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ', onKeydown, ', event, this );">',
137 '<img class="cke_hand" title="', config.smiley_descriptions[ i ], '"' +
138 ' cke_src="', CKEDITOR.tools.htmlEncode( config.smiley_path + images[ i ] ), '" alt="', config.smiley_descriptions[ i ], '"',
139 ' src="', CKEDITOR.tools.htmlEncode( config.smiley_path + images[ i ] ), '"',
140 // IE BUG: Below is a workaround to an IE image loading bug to ensure the image sizes are correct.
141 ( CKEDITOR.env.ie ? ' onload="this.setAttribute(\'width\', 2); this.removeAttribute(\'width\');" ' : '' ), '>' +
142 '<span id="' + smileyLabelId + '" class="cke_voice_label">' + config.smiley_descriptions[ i ] + '</span>' +
143 '</a>', '</td>'
144 );
145
146 if ( i % columns == columns - 1 )
147 html.push( '</tr>' );
148 }
149
150 if ( i < columns - 1 ) {
151 for ( ; i < columns - 1; i++ )
152 html.push( '<td></td>' );
153 html.push( '</tr>' );
154 }
155
156 html.push( '</tbody></table></div>' );
157
158 var smileySelector = {
159 type: 'html',
160 id: 'smileySelector',
161 html: html.join( '' ),
162 onLoad: function( event ) {
163 dialog = event.sender;
164 },
165 focus: function() {
166 var self = this;
167 // IE need a while to move the focus (#6539).
168 setTimeout( function() {
169 var firstSmile = self.getElement().getElementsByTag( 'a' ).getItem( 0 );
170 firstSmile.focus();
171 }, 0 );
172 },
173 onClick: onClick,
174 style: 'width: 100%; border-collapse: separate;'
175 };
176
177 return {
178 title: editor.lang.smiley.title,
179 minWidth: 270,
180 minHeight: 120,
181 contents: [ {
182 id: 'tab1',
183 label: '',
184 title: '',
185 expand: true,
186 padding: 0,
187 elements: [
188 smileySelector
189 ]
190 } ],
191 buttons: [ CKEDITOR.dialog.cancelButton ]
192 };
193} );
diff --git a/sources/plugins/smiley/icons/hidpi/smiley.png b/sources/plugins/smiley/icons/hidpi/smiley.png
new file mode 100644
index 00000000..bad62eed
--- /dev/null
+++ b/sources/plugins/smiley/icons/hidpi/smiley.png
Binary files differ
diff --git a/sources/plugins/smiley/icons/smiley.png b/sources/plugins/smiley/icons/smiley.png
new file mode 100644
index 00000000..9fafa28a
--- /dev/null
+++ b/sources/plugins/smiley/icons/smiley.png
Binary files differ
diff --git a/sources/plugins/smiley/images/angel_smile.gif b/sources/plugins/smiley/images/angel_smile.gif
new file mode 100644
index 00000000..21f81a2f
--- /dev/null
+++ b/sources/plugins/smiley/images/angel_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/angel_smile.png b/sources/plugins/smiley/images/angel_smile.png
new file mode 100644
index 00000000..559e5e71
--- /dev/null
+++ b/sources/plugins/smiley/images/angel_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/angry_smile.gif b/sources/plugins/smiley/images/angry_smile.gif
new file mode 100644
index 00000000..c912d99b
--- /dev/null
+++ b/sources/plugins/smiley/images/angry_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/angry_smile.png b/sources/plugins/smiley/images/angry_smile.png
new file mode 100644
index 00000000..c05d2be3
--- /dev/null
+++ b/sources/plugins/smiley/images/angry_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/broken_heart.gif b/sources/plugins/smiley/images/broken_heart.gif
new file mode 100644
index 00000000..4162a7b2
--- /dev/null
+++ b/sources/plugins/smiley/images/broken_heart.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/broken_heart.png b/sources/plugins/smiley/images/broken_heart.png
new file mode 100644
index 00000000..a711c0d8
--- /dev/null
+++ b/sources/plugins/smiley/images/broken_heart.png
Binary files differ
diff --git a/sources/plugins/smiley/images/confused_smile.gif b/sources/plugins/smiley/images/confused_smile.gif
new file mode 100644
index 00000000..0e420cba
--- /dev/null
+++ b/sources/plugins/smiley/images/confused_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/confused_smile.png b/sources/plugins/smiley/images/confused_smile.png
new file mode 100644
index 00000000..e0b8e5c6
--- /dev/null
+++ b/sources/plugins/smiley/images/confused_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/cry_smile.gif b/sources/plugins/smiley/images/cry_smile.gif
new file mode 100644
index 00000000..b5133427
--- /dev/null
+++ b/sources/plugins/smiley/images/cry_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/cry_smile.png b/sources/plugins/smiley/images/cry_smile.png
new file mode 100644
index 00000000..a1891a34
--- /dev/null
+++ b/sources/plugins/smiley/images/cry_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/devil_smile.gif b/sources/plugins/smiley/images/devil_smile.gif
new file mode 100644
index 00000000..9b2a1005
--- /dev/null
+++ b/sources/plugins/smiley/images/devil_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/devil_smile.png b/sources/plugins/smiley/images/devil_smile.png
new file mode 100644
index 00000000..53247a88
--- /dev/null
+++ b/sources/plugins/smiley/images/devil_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/embaressed_smile.gif b/sources/plugins/smiley/images/embaressed_smile.gif
new file mode 100644
index 00000000..8d39f252
--- /dev/null
+++ b/sources/plugins/smiley/images/embaressed_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/embarrassed_smile.gif b/sources/plugins/smiley/images/embarrassed_smile.gif
new file mode 100644
index 00000000..8d39f252
--- /dev/null
+++ b/sources/plugins/smiley/images/embarrassed_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/embarrassed_smile.png b/sources/plugins/smiley/images/embarrassed_smile.png
new file mode 100644
index 00000000..34904b66
--- /dev/null
+++ b/sources/plugins/smiley/images/embarrassed_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/envelope.gif b/sources/plugins/smiley/images/envelope.gif
new file mode 100644
index 00000000..5294ec48
--- /dev/null
+++ b/sources/plugins/smiley/images/envelope.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/envelope.png b/sources/plugins/smiley/images/envelope.png
new file mode 100644
index 00000000..44398ad1
--- /dev/null
+++ b/sources/plugins/smiley/images/envelope.png
Binary files differ
diff --git a/sources/plugins/smiley/images/heart.gif b/sources/plugins/smiley/images/heart.gif
new file mode 100644
index 00000000..160be8ef
--- /dev/null
+++ b/sources/plugins/smiley/images/heart.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/heart.png b/sources/plugins/smiley/images/heart.png
new file mode 100644
index 00000000..df409e62
--- /dev/null
+++ b/sources/plugins/smiley/images/heart.png
Binary files differ
diff --git a/sources/plugins/smiley/images/kiss.gif b/sources/plugins/smiley/images/kiss.gif
new file mode 100644
index 00000000..ffb23db0
--- /dev/null
+++ b/sources/plugins/smiley/images/kiss.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/kiss.png b/sources/plugins/smiley/images/kiss.png
new file mode 100644
index 00000000..a4f2f363
--- /dev/null
+++ b/sources/plugins/smiley/images/kiss.png
Binary files differ
diff --git a/sources/plugins/smiley/images/lightbulb.gif b/sources/plugins/smiley/images/lightbulb.gif
new file mode 100644
index 00000000..ceb6e2d9
--- /dev/null
+++ b/sources/plugins/smiley/images/lightbulb.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/lightbulb.png b/sources/plugins/smiley/images/lightbulb.png
new file mode 100644
index 00000000..0c4a9240
--- /dev/null
+++ b/sources/plugins/smiley/images/lightbulb.png
Binary files differ
diff --git a/sources/plugins/smiley/images/omg_smile.gif b/sources/plugins/smiley/images/omg_smile.gif
new file mode 100644
index 00000000..3177355f
--- /dev/null
+++ b/sources/plugins/smiley/images/omg_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/omg_smile.png b/sources/plugins/smiley/images/omg_smile.png
new file mode 100644
index 00000000..abc4e2d0
--- /dev/null
+++ b/sources/plugins/smiley/images/omg_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/regular_smile.gif b/sources/plugins/smiley/images/regular_smile.gif
new file mode 100644
index 00000000..fdcf5c33
--- /dev/null
+++ b/sources/plugins/smiley/images/regular_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/regular_smile.png b/sources/plugins/smiley/images/regular_smile.png
new file mode 100644
index 00000000..0f2649b7
--- /dev/null
+++ b/sources/plugins/smiley/images/regular_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/sad_smile.gif b/sources/plugins/smiley/images/sad_smile.gif
new file mode 100644
index 00000000..cca0729d
--- /dev/null
+++ b/sources/plugins/smiley/images/sad_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/sad_smile.png b/sources/plugins/smiley/images/sad_smile.png
new file mode 100644
index 00000000..f20f3bf3
--- /dev/null
+++ b/sources/plugins/smiley/images/sad_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/shades_smile.gif b/sources/plugins/smiley/images/shades_smile.gif
new file mode 100644
index 00000000..7d93474c
--- /dev/null
+++ b/sources/plugins/smiley/images/shades_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/shades_smile.png b/sources/plugins/smiley/images/shades_smile.png
new file mode 100644
index 00000000..fdaa28b7
--- /dev/null
+++ b/sources/plugins/smiley/images/shades_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/teeth_smile.gif b/sources/plugins/smiley/images/teeth_smile.gif
new file mode 100644
index 00000000..44c37996
--- /dev/null
+++ b/sources/plugins/smiley/images/teeth_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/teeth_smile.png b/sources/plugins/smiley/images/teeth_smile.png
new file mode 100644
index 00000000..5e63785e
--- /dev/null
+++ b/sources/plugins/smiley/images/teeth_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/thumbs_down.gif b/sources/plugins/smiley/images/thumbs_down.gif
new file mode 100644
index 00000000..5c8bee30
--- /dev/null
+++ b/sources/plugins/smiley/images/thumbs_down.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/thumbs_down.png b/sources/plugins/smiley/images/thumbs_down.png
new file mode 100644
index 00000000..1823481f
--- /dev/null
+++ b/sources/plugins/smiley/images/thumbs_down.png
Binary files differ
diff --git a/sources/plugins/smiley/images/thumbs_up.gif b/sources/plugins/smiley/images/thumbs_up.gif
new file mode 100644
index 00000000..9cc37029
--- /dev/null
+++ b/sources/plugins/smiley/images/thumbs_up.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/thumbs_up.png b/sources/plugins/smiley/images/thumbs_up.png
new file mode 100644
index 00000000..d4e8b22a
--- /dev/null
+++ b/sources/plugins/smiley/images/thumbs_up.png
Binary files differ
diff --git a/sources/plugins/smiley/images/tongue_smile.gif b/sources/plugins/smiley/images/tongue_smile.gif
new file mode 100644
index 00000000..81e05b0f
--- /dev/null
+++ b/sources/plugins/smiley/images/tongue_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/tongue_smile.png b/sources/plugins/smiley/images/tongue_smile.png
new file mode 100644
index 00000000..56553fbe
--- /dev/null
+++ b/sources/plugins/smiley/images/tongue_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/tounge_smile.gif b/sources/plugins/smiley/images/tounge_smile.gif
new file mode 100644
index 00000000..81e05b0f
--- /dev/null
+++ b/sources/plugins/smiley/images/tounge_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/whatchutalkingabout_smile.gif b/sources/plugins/smiley/images/whatchutalkingabout_smile.gif
new file mode 100644
index 00000000..eef4fc00
--- /dev/null
+++ b/sources/plugins/smiley/images/whatchutalkingabout_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/whatchutalkingabout_smile.png b/sources/plugins/smiley/images/whatchutalkingabout_smile.png
new file mode 100644
index 00000000..f9714d1b
--- /dev/null
+++ b/sources/plugins/smiley/images/whatchutalkingabout_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/images/wink_smile.gif b/sources/plugins/smiley/images/wink_smile.gif
new file mode 100644
index 00000000..6d3d64bd
--- /dev/null
+++ b/sources/plugins/smiley/images/wink_smile.gif
Binary files differ
diff --git a/sources/plugins/smiley/images/wink_smile.png b/sources/plugins/smiley/images/wink_smile.png
new file mode 100644
index 00000000..7c99c3fc
--- /dev/null
+++ b/sources/plugins/smiley/images/wink_smile.png
Binary files differ
diff --git a/sources/plugins/smiley/lang/af.js b/sources/plugins/smiley/lang/af.js
new file mode 100644
index 00000000..65726fc9
--- /dev/null
+++ b/sources/plugins/smiley/lang/af.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'af', {
6 options: 'Lagbekkie opsies',
7 title: 'Voeg lagbekkie by',
8 toolbar: 'Lagbekkie'
9} );
diff --git a/sources/plugins/smiley/lang/ar.js b/sources/plugins/smiley/lang/ar.js
new file mode 100644
index 00000000..9cc79641
--- /dev/null
+++ b/sources/plugins/smiley/lang/ar.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ar', {
6 options: 'خصائص الإبتسامات',
7 title: 'إدراج ابتسامات',
8 toolbar: 'ابتسامات'
9} );
diff --git a/sources/plugins/smiley/lang/bg.js b/sources/plugins/smiley/lang/bg.js
new file mode 100644
index 00000000..5362eff7
--- /dev/null
+++ b/sources/plugins/smiley/lang/bg.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'bg', {
6 options: 'Опции за усмивката',
7 title: 'Вмъкване на усмивка',
8 toolbar: 'Усмивка'
9} );
diff --git a/sources/plugins/smiley/lang/bn.js b/sources/plugins/smiley/lang/bn.js
new file mode 100644
index 00000000..2ef2c3b8
--- /dev/null
+++ b/sources/plugins/smiley/lang/bn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'bn', {
6 options: 'Smiley Options', // MISSING
7 title: 'স্মাইলী যুক্ত কর',
8 toolbar: 'স্মাইলী'
9} );
diff --git a/sources/plugins/smiley/lang/bs.js b/sources/plugins/smiley/lang/bs.js
new file mode 100644
index 00000000..3c3d3a56
--- /dev/null
+++ b/sources/plugins/smiley/lang/bs.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'bs', {
6 options: 'Smiley Options', // MISSING
7 title: 'Ubaci smješka',
8 toolbar: 'Smješko'
9} );
diff --git a/sources/plugins/smiley/lang/ca.js b/sources/plugins/smiley/lang/ca.js
new file mode 100644
index 00000000..de8dac03
--- /dev/null
+++ b/sources/plugins/smiley/lang/ca.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ca', {
6 options: 'Opcions d\'emoticones',
7 title: 'Insereix una icona',
8 toolbar: 'Icona'
9} );
diff --git a/sources/plugins/smiley/lang/cs.js b/sources/plugins/smiley/lang/cs.js
new file mode 100644
index 00000000..535e363c
--- /dev/null
+++ b/sources/plugins/smiley/lang/cs.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'cs', {
6 options: 'Nastavení smajlíků',
7 title: 'Vkládání smajlíků',
8 toolbar: 'Smajlíci'
9} );
diff --git a/sources/plugins/smiley/lang/cy.js b/sources/plugins/smiley/lang/cy.js
new file mode 100644
index 00000000..4c93cfa0
--- /dev/null
+++ b/sources/plugins/smiley/lang/cy.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'cy', {
6 options: 'Opsiynau Gwenogluniau',
7 title: 'Mewnosod Gwenoglun',
8 toolbar: 'Gwenoglun'
9} );
diff --git a/sources/plugins/smiley/lang/da.js b/sources/plugins/smiley/lang/da.js
new file mode 100644
index 00000000..c9e6450f
--- /dev/null
+++ b/sources/plugins/smiley/lang/da.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'da', {
6 options: 'Smileymuligheder',
7 title: 'Vælg smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/de.js b/sources/plugins/smiley/lang/de.js
new file mode 100644
index 00000000..af95a657
--- /dev/null
+++ b/sources/plugins/smiley/lang/de.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'de', {
6 options: 'Smiley-Optionen',
7 title: 'Smiley auswählen',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/el.js b/sources/plugins/smiley/lang/el.js
new file mode 100644
index 00000000..0a90ba92
--- /dev/null
+++ b/sources/plugins/smiley/lang/el.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'el', {
6 options: 'Επιλογές Φατσούλων',
7 title: 'Εισάγετε μια Φατσούλα',
8 toolbar: 'Φατσούλα'
9} );
diff --git a/sources/plugins/smiley/lang/en-au.js b/sources/plugins/smiley/lang/en-au.js
new file mode 100644
index 00000000..52ee1971
--- /dev/null
+++ b/sources/plugins/smiley/lang/en-au.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'en-au', {
6 options: 'Smiley Options', // MISSING
7 title: 'Insert a Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/en-ca.js b/sources/plugins/smiley/lang/en-ca.js
new file mode 100644
index 00000000..fd5a73e5
--- /dev/null
+++ b/sources/plugins/smiley/lang/en-ca.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'en-ca', {
6 options: 'Smiley Options', // MISSING
7 title: 'Insert a Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/en-gb.js b/sources/plugins/smiley/lang/en-gb.js
new file mode 100644
index 00000000..3c5c7b17
--- /dev/null
+++ b/sources/plugins/smiley/lang/en-gb.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'en-gb', {
6 options: 'Smiley Options',
7 title: 'Insert a Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/en.js b/sources/plugins/smiley/lang/en.js
new file mode 100644
index 00000000..71f399e4
--- /dev/null
+++ b/sources/plugins/smiley/lang/en.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'en', {
6 options: 'Smiley Options',
7 title: 'Insert a Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/eo.js b/sources/plugins/smiley/lang/eo.js
new file mode 100644
index 00000000..c6552b38
--- /dev/null
+++ b/sources/plugins/smiley/lang/eo.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'eo', {
6 options: 'Opcioj pri mienvinjetoj',
7 title: 'Enmeti Mienvinjeton',
8 toolbar: 'Mienvinjeto'
9} );
diff --git a/sources/plugins/smiley/lang/es.js b/sources/plugins/smiley/lang/es.js
new file mode 100644
index 00000000..23bad5dd
--- /dev/null
+++ b/sources/plugins/smiley/lang/es.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'es', {
6 options: 'Opciones de emoticonos',
7 title: 'Insertar un Emoticon',
8 toolbar: 'Emoticonos'
9} );
diff --git a/sources/plugins/smiley/lang/et.js b/sources/plugins/smiley/lang/et.js
new file mode 100644
index 00000000..56701506
--- /dev/null
+++ b/sources/plugins/smiley/lang/et.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'et', {
6 options: 'Emotikonide valikud',
7 title: 'Sisesta emotikon',
8 toolbar: 'Emotikon'
9} );
diff --git a/sources/plugins/smiley/lang/eu.js b/sources/plugins/smiley/lang/eu.js
new file mode 100644
index 00000000..a297f0a2
--- /dev/null
+++ b/sources/plugins/smiley/lang/eu.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'eu', {
6 options: 'Aurpegiera Aukerak',
7 title: 'Aurpegiera Sartu',
8 toolbar: 'Aurpegierak'
9} );
diff --git a/sources/plugins/smiley/lang/fa.js b/sources/plugins/smiley/lang/fa.js
new file mode 100644
index 00000000..14bfa13f
--- /dev/null
+++ b/sources/plugins/smiley/lang/fa.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'fa', {
6 options: 'گزینه​های خندانک',
7 title: 'گنجاندن خندانک',
8 toolbar: 'خندانک'
9} );
diff --git a/sources/plugins/smiley/lang/fi.js b/sources/plugins/smiley/lang/fi.js
new file mode 100644
index 00000000..df4b1385
--- /dev/null
+++ b/sources/plugins/smiley/lang/fi.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'fi', {
6 options: 'Hymiön ominaisuudet',
7 title: 'Lisää hymiö',
8 toolbar: 'Hymiö'
9} );
diff --git a/sources/plugins/smiley/lang/fo.js b/sources/plugins/smiley/lang/fo.js
new file mode 100644
index 00000000..5a833126
--- /dev/null
+++ b/sources/plugins/smiley/lang/fo.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'fo', {
6 options: 'Møguleikar fyri Smiley',
7 title: 'Vel Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/fr-ca.js b/sources/plugins/smiley/lang/fr-ca.js
new file mode 100644
index 00000000..5686a1d4
--- /dev/null
+++ b/sources/plugins/smiley/lang/fr-ca.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'fr-ca', {
6 options: 'Options d\'émoticônes',
7 title: 'Insérer un émoticône',
8 toolbar: 'Émoticône'
9} );
diff --git a/sources/plugins/smiley/lang/fr.js b/sources/plugins/smiley/lang/fr.js
new file mode 100644
index 00000000..9ee67ff8
--- /dev/null
+++ b/sources/plugins/smiley/lang/fr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'fr', {
6 options: 'Options des émoticones',
7 title: 'Insérer un émoticone',
8 toolbar: 'Émoticones'
9} );
diff --git a/sources/plugins/smiley/lang/gl.js b/sources/plugins/smiley/lang/gl.js
new file mode 100644
index 00000000..8f1c67d1
--- /dev/null
+++ b/sources/plugins/smiley/lang/gl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'gl', {
6 options: 'Opcións de emoticonas',
7 title: 'Inserir unha emoticona',
8 toolbar: 'Emoticona'
9} );
diff --git a/sources/plugins/smiley/lang/gu.js b/sources/plugins/smiley/lang/gu.js
new file mode 100644
index 00000000..255a138f
--- /dev/null
+++ b/sources/plugins/smiley/lang/gu.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'gu', {
6 options: 'સમ્ય્લી વિકલ્પો',
7 title: 'સ્માઇલી પસંદ કરો',
8 toolbar: 'સ્માઇલી'
9} );
diff --git a/sources/plugins/smiley/lang/he.js b/sources/plugins/smiley/lang/he.js
new file mode 100644
index 00000000..b69f4aa1
--- /dev/null
+++ b/sources/plugins/smiley/lang/he.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'he', {
6 options: 'אפשרויות סמיילים',
7 title: 'הוספת סמיילי',
8 toolbar: 'סמיילי'
9} );
diff --git a/sources/plugins/smiley/lang/hi.js b/sources/plugins/smiley/lang/hi.js
new file mode 100644
index 00000000..f0168740
--- /dev/null
+++ b/sources/plugins/smiley/lang/hi.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'hi', {
6 options: 'Smiley Options', // MISSING
7 title: 'स्माइली इन्सर्ट करें',
8 toolbar: 'स्माइली'
9} );
diff --git a/sources/plugins/smiley/lang/hr.js b/sources/plugins/smiley/lang/hr.js
new file mode 100644
index 00000000..77763eb5
--- /dev/null
+++ b/sources/plugins/smiley/lang/hr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'hr', {
6 options: 'Opcije smješka',
7 title: 'Ubaci smješka',
8 toolbar: 'Smješko'
9} );
diff --git a/sources/plugins/smiley/lang/hu.js b/sources/plugins/smiley/lang/hu.js
new file mode 100644
index 00000000..9b8a7513
--- /dev/null
+++ b/sources/plugins/smiley/lang/hu.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'hu', {
6 options: 'Hangulatjel opciók',
7 title: 'Hangulatjel beszúrása',
8 toolbar: 'Hangulatjelek'
9} );
diff --git a/sources/plugins/smiley/lang/id.js b/sources/plugins/smiley/lang/id.js
new file mode 100644
index 00000000..3c805ef5
--- /dev/null
+++ b/sources/plugins/smiley/lang/id.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'id', {
6 options: 'Opsi Smiley',
7 title: 'Sisip sebuah Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/is.js b/sources/plugins/smiley/lang/is.js
new file mode 100644
index 00000000..8bdeb247
--- /dev/null
+++ b/sources/plugins/smiley/lang/is.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'is', {
6 options: 'Smiley Options', // MISSING
7 title: 'Velja svip',
8 toolbar: 'Svipur'
9} );
diff --git a/sources/plugins/smiley/lang/it.js b/sources/plugins/smiley/lang/it.js
new file mode 100644
index 00000000..29bb91f3
--- /dev/null
+++ b/sources/plugins/smiley/lang/it.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'it', {
6 options: 'Opzioni Smiley',
7 title: 'Inserisci emoticon',
8 toolbar: 'Emoticon'
9} );
diff --git a/sources/plugins/smiley/lang/ja.js b/sources/plugins/smiley/lang/ja.js
new file mode 100644
index 00000000..856b49cc
--- /dev/null
+++ b/sources/plugins/smiley/lang/ja.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ja', {
6 options: '絵文字オプション',
7 title: '顔文字挿入',
8 toolbar: '絵文字'
9} );
diff --git a/sources/plugins/smiley/lang/ka.js b/sources/plugins/smiley/lang/ka.js
new file mode 100644
index 00000000..b419f04e
--- /dev/null
+++ b/sources/plugins/smiley/lang/ka.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ka', {
6 options: 'სიცილაკის პარამეტრები',
7 title: 'სიცილაკის ჩასმა',
8 toolbar: 'სიცილაკები'
9} );
diff --git a/sources/plugins/smiley/lang/km.js b/sources/plugins/smiley/lang/km.js
new file mode 100644
index 00000000..777c44c9
--- /dev/null
+++ b/sources/plugins/smiley/lang/km.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'km', {
6 options: 'ជម្រើស​រូប​សញ្ញា​អារម្មណ៍',
7 title: 'បញ្ចូល​រូប​សញ្ញា​អារម្មណ៍',
8 toolbar: 'រូប​សញ្ញ​អារម្មណ៍'
9} );
diff --git a/sources/plugins/smiley/lang/ko.js b/sources/plugins/smiley/lang/ko.js
new file mode 100644
index 00000000..50969a67
--- /dev/null
+++ b/sources/plugins/smiley/lang/ko.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ko', {
6 options: '이모티콘 옵션',
7 title: '이모티콘 삽입',
8 toolbar: '이모티콘'
9} );
diff --git a/sources/plugins/smiley/lang/ku.js b/sources/plugins/smiley/lang/ku.js
new file mode 100644
index 00000000..95f1133f
--- /dev/null
+++ b/sources/plugins/smiley/lang/ku.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ku', {
6 options: 'هەڵبژاردەی زەردەخەنه',
7 title: 'دانانی زەردەخەنەیەك',
8 toolbar: 'زەردەخەنه'
9} );
diff --git a/sources/plugins/smiley/lang/lt.js b/sources/plugins/smiley/lang/lt.js
new file mode 100644
index 00000000..518a8d36
--- /dev/null
+++ b/sources/plugins/smiley/lang/lt.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'lt', {
6 options: 'Šypsenėlių nustatymai',
7 title: 'Įterpti veidelį',
8 toolbar: 'Veideliai'
9} );
diff --git a/sources/plugins/smiley/lang/lv.js b/sources/plugins/smiley/lang/lv.js
new file mode 100644
index 00000000..e55c3bc6
--- /dev/null
+++ b/sources/plugins/smiley/lang/lv.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'lv', {
6 options: 'Smaidiņu uzstādījumi',
7 title: 'Ievietot smaidiņu',
8 toolbar: 'Smaidiņi'
9} );
diff --git a/sources/plugins/smiley/lang/mk.js b/sources/plugins/smiley/lang/mk.js
new file mode 100644
index 00000000..5e8d7035
--- /dev/null
+++ b/sources/plugins/smiley/lang/mk.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'mk', {
6 options: 'Smiley Options', // MISSING
7 title: 'Insert a Smiley', // MISSING
8 toolbar: 'Smiley' // MISSING
9} );
diff --git a/sources/plugins/smiley/lang/mn.js b/sources/plugins/smiley/lang/mn.js
new file mode 100644
index 00000000..6dc3e1f4
--- /dev/null
+++ b/sources/plugins/smiley/lang/mn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'mn', {
6 options: 'Smiley Options', // MISSING
7 title: 'Тодорхойлолт оруулах',
8 toolbar: 'Тодорхойлолт'
9} );
diff --git a/sources/plugins/smiley/lang/ms.js b/sources/plugins/smiley/lang/ms.js
new file mode 100644
index 00000000..ae773110
--- /dev/null
+++ b/sources/plugins/smiley/lang/ms.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ms', {
6 options: 'Smiley Options', // MISSING
7 title: 'Masukkan Smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/nb.js b/sources/plugins/smiley/lang/nb.js
new file mode 100644
index 00000000..be0f612c
--- /dev/null
+++ b/sources/plugins/smiley/lang/nb.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'nb', {
6 options: 'Alternativer for smil',
7 title: 'Sett inn smil',
8 toolbar: 'Smil'
9} );
diff --git a/sources/plugins/smiley/lang/nl.js b/sources/plugins/smiley/lang/nl.js
new file mode 100644
index 00000000..4db8d51f
--- /dev/null
+++ b/sources/plugins/smiley/lang/nl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'nl', {
6 options: 'Smiley opties',
7 title: 'Smiley invoegen',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/no.js b/sources/plugins/smiley/lang/no.js
new file mode 100644
index 00000000..21da21c0
--- /dev/null
+++ b/sources/plugins/smiley/lang/no.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'no', {
6 options: 'Alternativer for smil',
7 title: 'Sett inn smil',
8 toolbar: 'Smil'
9} );
diff --git a/sources/plugins/smiley/lang/pl.js b/sources/plugins/smiley/lang/pl.js
new file mode 100644
index 00000000..62d244c9
--- /dev/null
+++ b/sources/plugins/smiley/lang/pl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'pl', {
6 options: 'Opcje emotikonów',
7 title: 'Wstaw emotikona',
8 toolbar: 'Emotikony'
9} );
diff --git a/sources/plugins/smiley/lang/pt-br.js b/sources/plugins/smiley/lang/pt-br.js
new file mode 100644
index 00000000..96498a49
--- /dev/null
+++ b/sources/plugins/smiley/lang/pt-br.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'pt-br', {
6 options: 'Opções de Emoticons',
7 title: 'Inserir Emoticon',
8 toolbar: 'Emoticon'
9} );
diff --git a/sources/plugins/smiley/lang/pt.js b/sources/plugins/smiley/lang/pt.js
new file mode 100644
index 00000000..945f171c
--- /dev/null
+++ b/sources/plugins/smiley/lang/pt.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'pt', {
6 options: 'Opções de Emoticons',
7 title: 'Inserir um Emoticon',
8 toolbar: 'Emoticons'
9} );
diff --git a/sources/plugins/smiley/lang/ro.js b/sources/plugins/smiley/lang/ro.js
new file mode 100644
index 00000000..9c4bc5e8
--- /dev/null
+++ b/sources/plugins/smiley/lang/ro.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ro', {
6 options: 'Opțiuni figuri expresive',
7 title: 'Inserează o figură expresivă (Emoticon)',
8 toolbar: 'Figură expresivă (Emoticon)'
9} );
diff --git a/sources/plugins/smiley/lang/ru.js b/sources/plugins/smiley/lang/ru.js
new file mode 100644
index 00000000..37cee41f
--- /dev/null
+++ b/sources/plugins/smiley/lang/ru.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ru', {
6 options: 'Выбор смайла',
7 title: 'Вставить смайл',
8 toolbar: 'Смайлы'
9} );
diff --git a/sources/plugins/smiley/lang/si.js b/sources/plugins/smiley/lang/si.js
new file mode 100644
index 00000000..62e4b931
--- /dev/null
+++ b/sources/plugins/smiley/lang/si.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'si', {
6 options: 'හාස්‍ය විකල්ප',
7 title: 'හාස්‍යන් ඇතුලත් කිරීම',
8 toolbar: 'හාස්‍යන්'
9} );
diff --git a/sources/plugins/smiley/lang/sk.js b/sources/plugins/smiley/lang/sk.js
new file mode 100644
index 00000000..cca096e5
--- /dev/null
+++ b/sources/plugins/smiley/lang/sk.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'sk', {
6 options: 'Možnosti smajlíkov',
7 title: 'Vložiť smajlíka',
8 toolbar: 'Smajlíky'
9} );
diff --git a/sources/plugins/smiley/lang/sl.js b/sources/plugins/smiley/lang/sl.js
new file mode 100644
index 00000000..703c7481
--- /dev/null
+++ b/sources/plugins/smiley/lang/sl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'sl', {
6 options: 'Možnosti Smeška',
7 title: 'Vstavi smeška',
8 toolbar: 'Smeško'
9} );
diff --git a/sources/plugins/smiley/lang/sq.js b/sources/plugins/smiley/lang/sq.js
new file mode 100644
index 00000000..78dfa437
--- /dev/null
+++ b/sources/plugins/smiley/lang/sq.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'sq', {
6 options: 'Opsionet e Ikonave',
7 title: 'Vendos Ikonë',
8 toolbar: 'Ikona'
9} );
diff --git a/sources/plugins/smiley/lang/sr-latn.js b/sources/plugins/smiley/lang/sr-latn.js
new file mode 100644
index 00000000..2b0b149b
--- /dev/null
+++ b/sources/plugins/smiley/lang/sr-latn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'sr-latn', {
6 options: 'Smiley Options', // MISSING
7 title: 'Unesi smajlija',
8 toolbar: 'Smajli'
9} );
diff --git a/sources/plugins/smiley/lang/sr.js b/sources/plugins/smiley/lang/sr.js
new file mode 100644
index 00000000..d0c38c8b
--- /dev/null
+++ b/sources/plugins/smiley/lang/sr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'sr', {
6 options: 'Smiley Options', // MISSING
7 title: 'Унеси смајлија',
8 toolbar: 'Смајли'
9} );
diff --git a/sources/plugins/smiley/lang/sv.js b/sources/plugins/smiley/lang/sv.js
new file mode 100644
index 00000000..7d54b6d3
--- /dev/null
+++ b/sources/plugins/smiley/lang/sv.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'sv', {
6 options: 'Smileyinställningar',
7 title: 'Infoga smiley',
8 toolbar: 'Smiley'
9} );
diff --git a/sources/plugins/smiley/lang/th.js b/sources/plugins/smiley/lang/th.js
new file mode 100644
index 00000000..27db0098
--- /dev/null
+++ b/sources/plugins/smiley/lang/th.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'th', {
6 options: 'ตัวเลือกไอคอนแสดงอารมณ์',
7 title: 'แทรกสัญลักษณ์สื่ออารมณ์',
8 toolbar: 'รูปสื่ออารมณ์'
9} );
diff --git a/sources/plugins/smiley/lang/tr.js b/sources/plugins/smiley/lang/tr.js
new file mode 100644
index 00000000..e7c46633
--- /dev/null
+++ b/sources/plugins/smiley/lang/tr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'tr', {
6 options: 'İfade Seçenekleri',
7 title: 'İfade Ekle',
8 toolbar: 'İfade'
9} );
diff --git a/sources/plugins/smiley/lang/tt.js b/sources/plugins/smiley/lang/tt.js
new file mode 100644
index 00000000..8fad9914
--- /dev/null
+++ b/sources/plugins/smiley/lang/tt.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'tt', {
6 options: 'Смайл көйләүләре',
7 title: 'Смайл өстәү',
8 toolbar: 'Смайл'
9} );
diff --git a/sources/plugins/smiley/lang/ug.js b/sources/plugins/smiley/lang/ug.js
new file mode 100644
index 00000000..e3a922ba
--- /dev/null
+++ b/sources/plugins/smiley/lang/ug.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'ug', {
6 options: 'چىراي ئىپادە سىنبەلگە تاللانمىسى',
7 title: 'چىراي ئىپادە سىنبەلگە قىستۇر',
8 toolbar: 'چىراي ئىپادە'
9} );
diff --git a/sources/plugins/smiley/lang/uk.js b/sources/plugins/smiley/lang/uk.js
new file mode 100644
index 00000000..677bc913
--- /dev/null
+++ b/sources/plugins/smiley/lang/uk.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'uk', {
6 options: 'Опції смайликів',
7 title: 'Вставити смайлик',
8 toolbar: 'Смайлик'
9} );
diff --git a/sources/plugins/smiley/lang/vi.js b/sources/plugins/smiley/lang/vi.js
new file mode 100644
index 00000000..921175fd
--- /dev/null
+++ b/sources/plugins/smiley/lang/vi.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'vi', {
6 options: 'Tùy chọn hình biểu lộ cảm xúc',
7 title: 'Chèn hình biểu lộ cảm xúc (mặt cười)',
8 toolbar: 'Hình biểu lộ cảm xúc (mặt cười)'
9} );
diff --git a/sources/plugins/smiley/lang/zh-cn.js b/sources/plugins/smiley/lang/zh-cn.js
new file mode 100644
index 00000000..98d09389
--- /dev/null
+++ b/sources/plugins/smiley/lang/zh-cn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'zh-cn', {
6 options: '表情图标选项',
7 title: '插入表情图标',
8 toolbar: '表情符'
9} );
diff --git a/sources/plugins/smiley/lang/zh.js b/sources/plugins/smiley/lang/zh.js
new file mode 100644
index 00000000..477d30e6
--- /dev/null
+++ b/sources/plugins/smiley/lang/zh.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'smiley', 'zh', {
6 options: '表情符號選項',
7 title: '插入表情符號',
8 toolbar: '表情符號'
9} );
diff --git a/sources/plugins/smiley/plugin.js b/sources/plugins/smiley/plugin.js
new file mode 100644
index 00000000..be8b20db
--- /dev/null
+++ b/sources/plugins/smiley/plugin.js
@@ -0,0 +1,98 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'smiley', {
7 requires: 'dialog',
8 // jscs:disable maximumLineLength
9 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
10 // jscs:enable maximumLineLength
11 icons: 'smiley', // %REMOVE_LINE_CORE%
12 hidpi: true, // %REMOVE_LINE_CORE%
13 init: function( editor ) {
14 editor.config.smiley_path = editor.config.smiley_path || ( this.path + 'images/' );
15 editor.addCommand( 'smiley', new CKEDITOR.dialogCommand( 'smiley', {
16 allowedContent: 'img[alt,height,!src,title,width]',
17 requiredContent: 'img'
18 } ) );
19 editor.ui.addButton && editor.ui.addButton( 'Smiley', {
20 label: editor.lang.smiley.toolbar,
21 command: 'smiley',
22 toolbar: 'insert,50'
23 } );
24 CKEDITOR.dialog.add( 'smiley', this.path + 'dialogs/smiley.js' );
25 }
26} );
27
28/**
29 * The base path used to build the URL for the smiley images. It must end with a slash.
30 *
31 * config.smiley_path = 'http://www.example.com/images/smileys/';
32 *
33 * config.smiley_path = '/images/smileys/';
34 *
35 * @cfg {String} [smiley_path=CKEDITOR.basePath + 'plugins/smiley/images/']
36 * @member CKEDITOR.config
37 */
38
39/**
40 * The file names for the smileys to be displayed. These files must be
41 * contained inside the URL path defined with the {@link #smiley_path} setting.
42 *
43 * // This is actually the default value.
44 * config.smiley_images = [
45 * 'regular_smile.png','sad_smile.png','wink_smile.png','teeth_smile.png','confused_smile.png','tongue_smile.png',
46 * 'embarrassed_smile.png','omg_smile.png','whatchutalkingabout_smile.png','angry_smile.png','angel_smile.png','shades_smile.png',
47 * 'devil_smile.png','cry_smile.png','lightbulb.png','thumbs_down.png','thumbs_up.png','heart.png',
48 * 'broken_heart.png','kiss.png','envelope.png'
49 * ];
50 *
51 * @cfg
52 * @member CKEDITOR.config
53 */
54CKEDITOR.config.smiley_images = [
55 'regular_smile.png', 'sad_smile.png', 'wink_smile.png', 'teeth_smile.png', 'confused_smile.png', 'tongue_smile.png',
56 'embarrassed_smile.png', 'omg_smile.png', 'whatchutalkingabout_smile.png', 'angry_smile.png', 'angel_smile.png', 'shades_smile.png',
57 'devil_smile.png', 'cry_smile.png', 'lightbulb.png', 'thumbs_down.png', 'thumbs_up.png', 'heart.png',
58 'broken_heart.png', 'kiss.png', 'envelope.png'
59];
60
61/**
62 * The description to be used for each of the smileys defined in the
63 * {@link CKEDITOR.config#smiley_images} setting. Each entry in this array list
64 * must match its relative pair in the {@link CKEDITOR.config#smiley_images}
65 * setting.
66 *
67 * // Default settings.
68 * config.smiley_descriptions = [
69 * 'smiley', 'sad', 'wink', 'laugh', 'frown', 'cheeky', 'blush', 'surprise',
70 * 'indecision', 'angry', 'angel', 'cool', 'devil', 'crying', 'enlightened', 'no',
71 * 'yes', 'heart', 'broken heart', 'kiss', 'mail'
72 * ];
73 *
74 * // Use textual emoticons as description.
75 * config.smiley_descriptions = [
76 * ':)', ':(', ';)', ':D', ':/', ':P', ':*)', ':-o',
77 * ':|', '>:(', 'o:)', '8-)', '>:-)', ';(', '', '', '',
78 * '', '', ':-*', ''
79 * ];
80 *
81 * @cfg
82 * @member CKEDITOR.config
83 */
84CKEDITOR.config.smiley_descriptions = [
85 'smiley', 'sad', 'wink', 'laugh', 'frown', 'cheeky', 'blush', 'surprise',
86 'indecision', 'angry', 'angel', 'cool', 'devil', 'crying', 'enlightened', 'no',
87 'yes', 'heart', 'broken heart', 'kiss', 'mail'
88];
89
90/**
91 * The number of columns to be generated by the smilies matrix.
92 *
93 * config.smiley_columns = 6;
94 *
95 * @since 3.3.2
96 * @cfg {Number} [smiley_columns=8]
97 * @member CKEDITOR.config
98 */
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 00000000..adf4af3c
--- /dev/null
+++ b/sources/plugins/sourcearea/icons/hidpi/source-rtl.png
Binary files differ
diff --git a/sources/plugins/sourcearea/icons/hidpi/source.png b/sources/plugins/sourcearea/icons/hidpi/source.png
new file mode 100644
index 00000000..b4d0a15a
--- /dev/null
+++ b/sources/plugins/sourcearea/icons/hidpi/source.png
Binary files differ
diff --git a/sources/plugins/sourcearea/icons/source-rtl.png b/sources/plugins/sourcearea/icons/source-rtl.png
new file mode 100644
index 00000000..27d1ba88
--- /dev/null
+++ b/sources/plugins/sourcearea/icons/source-rtl.png
Binary files differ
diff --git a/sources/plugins/sourcearea/icons/source.png b/sources/plugins/sourcearea/icons/source.png
new file mode 100644
index 00000000..e44db379
--- /dev/null
+++ b/sources/plugins/sourcearea/icons/source.png
Binary files differ
diff --git a/sources/plugins/sourcearea/lang/af.js b/sources/plugins/sourcearea/lang/af.js
new file mode 100644
index 00000000..b21d7e61
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/af.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'af', {
6 toolbar: 'Bron'
7} );
diff --git a/sources/plugins/sourcearea/lang/ar.js b/sources/plugins/sourcearea/lang/ar.js
new file mode 100644
index 00000000..71a3a6b1
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ar.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ar', {
6 toolbar: 'المصدر'
7} );
diff --git a/sources/plugins/sourcearea/lang/bg.js b/sources/plugins/sourcearea/lang/bg.js
new file mode 100644
index 00000000..0e9ff33d
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/bg.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'bg', {
6 toolbar: 'Изходен код'
7} );
diff --git a/sources/plugins/sourcearea/lang/bn.js b/sources/plugins/sourcearea/lang/bn.js
new file mode 100644
index 00000000..266a5c0a
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/bn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'bn', {
6 toolbar: 'সোর্স'
7} );
diff --git a/sources/plugins/sourcearea/lang/bs.js b/sources/plugins/sourcearea/lang/bs.js
new file mode 100644
index 00000000..2b0fa706
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/bs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'bs', {
6 toolbar: 'HTML kôd'
7} );
diff --git a/sources/plugins/sourcearea/lang/ca.js b/sources/plugins/sourcearea/lang/ca.js
new file mode 100644
index 00000000..137d2352
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ca', {
6 toolbar: 'Codi font'
7} );
diff --git a/sources/plugins/sourcearea/lang/cs.js b/sources/plugins/sourcearea/lang/cs.js
new file mode 100644
index 00000000..0612de26
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/cs.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'cs', {
6 toolbar: 'Zdroj'
7} );
diff --git a/sources/plugins/sourcearea/lang/cy.js b/sources/plugins/sourcearea/lang/cy.js
new file mode 100644
index 00000000..fb59ec60
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/cy.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'cy', {
6 toolbar: 'HTML'
7} );
diff --git a/sources/plugins/sourcearea/lang/da.js b/sources/plugins/sourcearea/lang/da.js
new file mode 100644
index 00000000..775a23e4
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/da.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'da', {
6 toolbar: 'Kilde'
7} );
diff --git a/sources/plugins/sourcearea/lang/de.js b/sources/plugins/sourcearea/lang/de.js
new file mode 100644
index 00000000..09c496dd
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/de.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'de', {
6 toolbar: 'Quellcode'
7} );
diff --git a/sources/plugins/sourcearea/lang/el.js b/sources/plugins/sourcearea/lang/el.js
new file mode 100644
index 00000000..b04b2569
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/el.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'el', {
6 toolbar: 'Κώδικας'
7} );
diff --git a/sources/plugins/sourcearea/lang/en-au.js b/sources/plugins/sourcearea/lang/en-au.js
new file mode 100644
index 00000000..cb327bbc
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/en-au.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'en-au', {
6 toolbar: 'Source'
7} );
diff --git a/sources/plugins/sourcearea/lang/en-ca.js b/sources/plugins/sourcearea/lang/en-ca.js
new file mode 100644
index 00000000..0ded9408
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/en-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'en-ca', {
6 toolbar: 'Source'
7} );
diff --git a/sources/plugins/sourcearea/lang/en-gb.js b/sources/plugins/sourcearea/lang/en-gb.js
new file mode 100644
index 00000000..4351d839
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/en-gb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'en-gb', {
6 toolbar: 'Source'
7} );
diff --git a/sources/plugins/sourcearea/lang/en.js b/sources/plugins/sourcearea/lang/en.js
new file mode 100644
index 00000000..686ea0ce
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/en.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'en', {
6 toolbar: 'Source'
7} );
diff --git a/sources/plugins/sourcearea/lang/eo.js b/sources/plugins/sourcearea/lang/eo.js
new file mode 100644
index 00000000..cc7a4a71
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/eo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'eo', {
6 toolbar: 'Fonto'
7} );
diff --git a/sources/plugins/sourcearea/lang/es.js b/sources/plugins/sourcearea/lang/es.js
new file mode 100644
index 00000000..df7c9940
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/es.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'es', {
6 toolbar: 'Fuente HTML'
7} );
diff --git a/sources/plugins/sourcearea/lang/et.js b/sources/plugins/sourcearea/lang/et.js
new file mode 100644
index 00000000..90e6400e
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/et.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'et', {
6 toolbar: 'Lähtekood'
7} );
diff --git a/sources/plugins/sourcearea/lang/eu.js b/sources/plugins/sourcearea/lang/eu.js
new file mode 100644
index 00000000..1e375adb
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/eu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'eu', {
6 toolbar: 'Iturburua'
7} );
diff --git a/sources/plugins/sourcearea/lang/fa.js b/sources/plugins/sourcearea/lang/fa.js
new file mode 100644
index 00000000..ed612ca9
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/fa.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'fa', {
6 toolbar: 'منبع'
7} );
diff --git a/sources/plugins/sourcearea/lang/fi.js b/sources/plugins/sourcearea/lang/fi.js
new file mode 100644
index 00000000..a62ae9a5
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/fi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'fi', {
6 toolbar: 'Koodi'
7} );
diff --git a/sources/plugins/sourcearea/lang/fo.js b/sources/plugins/sourcearea/lang/fo.js
new file mode 100644
index 00000000..69dbb4cf
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/fo.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'fo', {
6 toolbar: 'Kelda'
7} );
diff --git a/sources/plugins/sourcearea/lang/fr-ca.js b/sources/plugins/sourcearea/lang/fr-ca.js
new file mode 100644
index 00000000..7a522328
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/fr-ca.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'fr-ca', {
6 toolbar: 'Source'
7} );
diff --git a/sources/plugins/sourcearea/lang/fr.js b/sources/plugins/sourcearea/lang/fr.js
new file mode 100644
index 00000000..0b530686
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/fr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'fr', {
6 toolbar: 'Source'
7} );
diff --git a/sources/plugins/sourcearea/lang/gl.js b/sources/plugins/sourcearea/lang/gl.js
new file mode 100644
index 00000000..ddcfbf9d
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/gl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'gl', {
6 toolbar: 'Orixe'
7} );
diff --git a/sources/plugins/sourcearea/lang/gu.js b/sources/plugins/sourcearea/lang/gu.js
new file mode 100644
index 00000000..cb4f5f3c
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/gu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'gu', {
6 toolbar: 'મૂળ કે પ્રાથમિક દસ્તાવેજ'
7} );
diff --git a/sources/plugins/sourcearea/lang/he.js b/sources/plugins/sourcearea/lang/he.js
new file mode 100644
index 00000000..ddf6d849
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/he.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'he', {
6 toolbar: 'מקור'
7} );
diff --git a/sources/plugins/sourcearea/lang/hi.js b/sources/plugins/sourcearea/lang/hi.js
new file mode 100644
index 00000000..e5d484c4
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/hi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'hi', {
6 toolbar: 'सोर्स'
7} );
diff --git a/sources/plugins/sourcearea/lang/hr.js b/sources/plugins/sourcearea/lang/hr.js
new file mode 100644
index 00000000..d20e6385
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/hr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'hr', {
6 toolbar: 'Kôd'
7} );
diff --git a/sources/plugins/sourcearea/lang/hu.js b/sources/plugins/sourcearea/lang/hu.js
new file mode 100644
index 00000000..bd2eec9e
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/hu.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'hu', {
6 toolbar: 'Forráskód'
7} );
diff --git a/sources/plugins/sourcearea/lang/id.js b/sources/plugins/sourcearea/lang/id.js
new file mode 100644
index 00000000..6e8a5ce4
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/id.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'id', {
6 toolbar: 'Sumber'
7} );
diff --git a/sources/plugins/sourcearea/lang/is.js b/sources/plugins/sourcearea/lang/is.js
new file mode 100644
index 00000000..9551c15c
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/is.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'is', {
6 toolbar: 'Kóði'
7} );
diff --git a/sources/plugins/sourcearea/lang/it.js b/sources/plugins/sourcearea/lang/it.js
new file mode 100644
index 00000000..b4d23dd6
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/it.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'it', {
6 toolbar: 'Sorgente'
7} );
diff --git a/sources/plugins/sourcearea/lang/ja.js b/sources/plugins/sourcearea/lang/ja.js
new file mode 100644
index 00000000..bd767231
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ja.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ja', {
6 toolbar: 'ソース'
7} );
diff --git a/sources/plugins/sourcearea/lang/ka.js b/sources/plugins/sourcearea/lang/ka.js
new file mode 100644
index 00000000..e2d4834b
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ka.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ka', {
6 toolbar: 'კოდები'
7} );
diff --git a/sources/plugins/sourcearea/lang/km.js b/sources/plugins/sourcearea/lang/km.js
new file mode 100644
index 00000000..f7bc88c3
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/km.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'km', {
6 toolbar: 'អក្សរ​កូដ'
7} );
diff --git a/sources/plugins/sourcearea/lang/ko.js b/sources/plugins/sourcearea/lang/ko.js
new file mode 100644
index 00000000..a3375e7e
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ko.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ko', {
6 toolbar: '소스'
7} );
diff --git a/sources/plugins/sourcearea/lang/ku.js b/sources/plugins/sourcearea/lang/ku.js
new file mode 100644
index 00000000..346395df
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ku.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ku', {
6 toolbar: 'سەرچاوە'
7} );
diff --git a/sources/plugins/sourcearea/lang/lt.js b/sources/plugins/sourcearea/lang/lt.js
new file mode 100644
index 00000000..13cdcb3a
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/lt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'lt', {
6 toolbar: 'Šaltinis'
7} );
diff --git a/sources/plugins/sourcearea/lang/lv.js b/sources/plugins/sourcearea/lang/lv.js
new file mode 100644
index 00000000..4c5873ce
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/lv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'lv', {
6 toolbar: 'HTML kods'
7} );
diff --git a/sources/plugins/sourcearea/lang/mk.js b/sources/plugins/sourcearea/lang/mk.js
new file mode 100644
index 00000000..5b6fda09
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/mk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'mk', {
6 toolbar: 'Source' // MISSING
7} );
diff --git a/sources/plugins/sourcearea/lang/mn.js b/sources/plugins/sourcearea/lang/mn.js
new file mode 100644
index 00000000..e6b822fd
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/mn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'mn', {
6 toolbar: 'Код'
7} );
diff --git a/sources/plugins/sourcearea/lang/ms.js b/sources/plugins/sourcearea/lang/ms.js
new file mode 100644
index 00000000..ad5f9026
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ms.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ms', {
6 toolbar: 'Sumber'
7} );
diff --git a/sources/plugins/sourcearea/lang/nb.js b/sources/plugins/sourcearea/lang/nb.js
new file mode 100644
index 00000000..3a9ae66f
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/nb.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'nb', {
6 toolbar: 'Kilde'
7} );
diff --git a/sources/plugins/sourcearea/lang/nl.js b/sources/plugins/sourcearea/lang/nl.js
new file mode 100644
index 00000000..bb3628ec
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/nl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'nl', {
6 toolbar: 'Broncode'
7} );
diff --git a/sources/plugins/sourcearea/lang/no.js b/sources/plugins/sourcearea/lang/no.js
new file mode 100644
index 00000000..d42d9c17
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/no.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'no', {
6 toolbar: 'Kilde'
7} );
diff --git a/sources/plugins/sourcearea/lang/pl.js b/sources/plugins/sourcearea/lang/pl.js
new file mode 100644
index 00000000..44dbb570
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/pl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'pl', {
6 toolbar: 'Źródło dokumentu'
7} );
diff --git a/sources/plugins/sourcearea/lang/pt-br.js b/sources/plugins/sourcearea/lang/pt-br.js
new file mode 100644
index 00000000..bb239b8c
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/pt-br.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'pt-br', {
6 toolbar: 'Código-Fonte'
7} );
diff --git a/sources/plugins/sourcearea/lang/pt.js b/sources/plugins/sourcearea/lang/pt.js
new file mode 100644
index 00000000..5bd68059
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/pt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'pt', {
6 toolbar: 'Fonte'
7} );
diff --git a/sources/plugins/sourcearea/lang/ro.js b/sources/plugins/sourcearea/lang/ro.js
new file mode 100644
index 00000000..2b8e59bd
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ro.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ro', {
6 toolbar: 'Sursa'
7} );
diff --git a/sources/plugins/sourcearea/lang/ru.js b/sources/plugins/sourcearea/lang/ru.js
new file mode 100644
index 00000000..02007aa4
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ru.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ru', {
6 toolbar: 'Источник'
7} );
diff --git a/sources/plugins/sourcearea/lang/si.js b/sources/plugins/sourcearea/lang/si.js
new file mode 100644
index 00000000..0ee21295
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/si.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'si', {
6 toolbar: 'මුලාශ්‍රය'
7} );
diff --git a/sources/plugins/sourcearea/lang/sk.js b/sources/plugins/sourcearea/lang/sk.js
new file mode 100644
index 00000000..17c3209e
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/sk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'sk', {
6 toolbar: 'Zdroj'
7} );
diff --git a/sources/plugins/sourcearea/lang/sl.js b/sources/plugins/sourcearea/lang/sl.js
new file mode 100644
index 00000000..8b5c0445
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/sl.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'sl', {
6 toolbar: 'Izvorna koda'
7} );
diff --git a/sources/plugins/sourcearea/lang/sq.js b/sources/plugins/sourcearea/lang/sq.js
new file mode 100644
index 00000000..918873a2
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/sq.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'sq', {
6 toolbar: 'Burimi'
7} );
diff --git a/sources/plugins/sourcearea/lang/sr-latn.js b/sources/plugins/sourcearea/lang/sr-latn.js
new file mode 100644
index 00000000..b1190c82
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/sr-latn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'sr-latn', {
6 toolbar: 'Kôd'
7} );
diff --git a/sources/plugins/sourcearea/lang/sr.js b/sources/plugins/sourcearea/lang/sr.js
new file mode 100644
index 00000000..738a8af4
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/sr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'sr', {
6 toolbar: 'Kôд'
7} );
diff --git a/sources/plugins/sourcearea/lang/sv.js b/sources/plugins/sourcearea/lang/sv.js
new file mode 100644
index 00000000..ea2c2adb
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/sv.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'sv', {
6 toolbar: 'Källa'
7} );
diff --git a/sources/plugins/sourcearea/lang/th.js b/sources/plugins/sourcearea/lang/th.js
new file mode 100644
index 00000000..41a2b74b
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/th.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'th', {
6 toolbar: 'ดูรหัส HTML'
7} );
diff --git a/sources/plugins/sourcearea/lang/tr.js b/sources/plugins/sourcearea/lang/tr.js
new file mode 100644
index 00000000..ea86c3dc
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/tr.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'tr', {
6 toolbar: 'Kaynak'
7} );
diff --git a/sources/plugins/sourcearea/lang/tt.js b/sources/plugins/sourcearea/lang/tt.js
new file mode 100644
index 00000000..aa4fdfb5
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/tt.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'tt', {
6 toolbar: 'Чыганак'
7} );
diff --git a/sources/plugins/sourcearea/lang/ug.js b/sources/plugins/sourcearea/lang/ug.js
new file mode 100644
index 00000000..c087cf1f
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/ug.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'ug', {
6 toolbar: 'مەنبە'
7} );
diff --git a/sources/plugins/sourcearea/lang/uk.js b/sources/plugins/sourcearea/lang/uk.js
new file mode 100644
index 00000000..0cc25f82
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/uk.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'uk', {
6 toolbar: 'Джерело'
7} );
diff --git a/sources/plugins/sourcearea/lang/vi.js b/sources/plugins/sourcearea/lang/vi.js
new file mode 100644
index 00000000..70401f82
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/vi.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'vi', {
6 toolbar: 'Mã HTML'
7} );
diff --git a/sources/plugins/sourcearea/lang/zh-cn.js b/sources/plugins/sourcearea/lang/zh-cn.js
new file mode 100644
index 00000000..d831a2ee
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/zh-cn.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'zh-cn', {
6 toolbar: '源码'
7} );
diff --git a/sources/plugins/sourcearea/lang/zh.js b/sources/plugins/sourcearea/lang/zh.js
new file mode 100644
index 00000000..1bc7caea
--- /dev/null
+++ b/sources/plugins/sourcearea/lang/zh.js
@@ -0,0 +1,7 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'sourcearea', 'zh', {
6 toolbar: '原始碼'
7} );
diff --git a/sources/plugins/sourcearea/plugin.js b/sources/plugins/sourcearea/plugin.js
new file mode 100644
index 00000000..d8fb4620
--- /dev/null
+++ b/sources/plugins/sourcearea/plugin.js
@@ -0,0 +1,168 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The Source Editing Area plugin. It registers the "source" editing
8 * mode, which displays raw HTML data being edited in the editor.
9 */
10
11( function() {
12 CKEDITOR.plugins.add( 'sourcearea', {
13 // jscs:disable maximumLineLength
14 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
15 // jscs:enable maximumLineLength
16 icons: 'source,source-rtl', // %REMOVE_LINE_CORE%
17 hidpi: true, // %REMOVE_LINE_CORE%
18 init: function( editor ) {
19 // Source mode in inline editors is only available through the "sourcedialog" plugin.
20 if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
21 return;
22
23 var sourcearea = CKEDITOR.plugins.sourcearea;
24
25 editor.addMode( 'source', function( callback ) {
26 var contentsSpace = editor.ui.space( 'contents' ),
27 textarea = contentsSpace.getDocument().createElement( 'textarea' );
28
29 textarea.setStyles(
30 CKEDITOR.tools.extend( {
31 // IE7 has overflow the <textarea> from wrapping table cell.
32 width: CKEDITOR.env.ie7Compat ? '99%' : '100%',
33 height: '100%',
34 resize: 'none',
35 outline: 'none',
36 'text-align': 'left'
37 },
38 CKEDITOR.tools.cssVendorPrefix( 'tab-size', editor.config.sourceAreaTabSize || 4 ) ) );
39
40 // Make sure that source code is always displayed LTR,
41 // regardless of editor language (#10105).
42 textarea.setAttribute( 'dir', 'ltr' );
43
44 textarea.addClass( 'cke_source' ).addClass( 'cke_reset' ).addClass( 'cke_enable_context_menu' );
45
46 editor.ui.space( 'contents' ).append( textarea );
47
48 var editable = editor.editable( new sourceEditable( editor, textarea ) );
49
50 // Fill the textarea with the current editor data.
51 editable.setData( editor.getData( 1 ) );
52
53 // Having to make <textarea> fixed sized to conquer the following bugs:
54 // 1. The textarea height/width='100%' doesn't constraint to the 'td' in IE6/7.
55 // 2. Unexpected vertical-scrolling behavior happens whenever focus is moving out of editor
56 // if text content within it has overflowed. (#4762)
57 if ( CKEDITOR.env.ie ) {
58 editable.attachListener( editor, 'resize', onResize, editable );
59 editable.attachListener( CKEDITOR.document.getWindow(), 'resize', onResize, editable );
60 CKEDITOR.tools.setTimeout( onResize, 0, editable );
61 }
62
63 editor.fire( 'ariaWidget', this );
64
65 callback();
66 } );
67
68 editor.addCommand( 'source', sourcearea.commands.source );
69
70 if ( editor.ui.addButton ) {
71 editor.ui.addButton( 'Source', {
72 label: editor.lang.sourcearea.toolbar,
73 command: 'source',
74 toolbar: 'mode,10'
75 } );
76 }
77
78 editor.on( 'mode', function() {
79 editor.getCommand( 'source' ).setState( editor.mode == 'source' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
80 } );
81
82 var needsFocusHack = CKEDITOR.env.ie && CKEDITOR.env.version == 9;
83
84 function onResize() {
85 // We have to do something with focus on IE9, because if sourcearea had focus
86 // before being resized, the caret ends somewhere in the editor UI (#11839).
87 var wasActive = needsFocusHack && this.equals( CKEDITOR.document.getActive() );
88
89 // Holder rectange size is stretched by textarea,
90 // so hide it just for a moment.
91 this.hide();
92 this.setStyle( 'height', this.getParent().$.clientHeight + 'px' );
93 this.setStyle( 'width', this.getParent().$.clientWidth + 'px' );
94 // When we have proper holder size, show textarea again.
95 this.show();
96
97 if ( wasActive )
98 this.focus();
99 }
100 }
101 } );
102
103 var sourceEditable = CKEDITOR.tools.createClass( {
104 base: CKEDITOR.editable,
105 proto: {
106 setData: function( data ) {
107 this.setValue( data );
108 this.status = 'ready';
109 this.editor.fire( 'dataReady' );
110 },
111
112 getData: function() {
113 return this.getValue();
114 },
115
116 // Insertions are not supported in source editable.
117 insertHtml: function() {},
118 insertElement: function() {},
119 insertText: function() {},
120
121 // Read-only support for textarea.
122 setReadOnly: function( isReadOnly ) {
123 this[ ( isReadOnly ? 'set' : 'remove' ) + 'Attribute' ]( 'readOnly', 'readonly' );
124 },
125
126 detach: function() {
127 sourceEditable.baseProto.detach.call( this );
128 this.clearCustomData();
129 this.remove();
130 }
131 }
132 } );
133} )();
134
135CKEDITOR.plugins.sourcearea = {
136 commands: {
137 source: {
138 modes: { wysiwyg: 1, source: 1 },
139 editorFocus: false,
140 readOnly: 1,
141 exec: function( editor ) {
142 if ( editor.mode == 'wysiwyg' )
143 editor.fire( 'saveSnapshot' );
144 editor.getCommand( 'source' ).setState( CKEDITOR.TRISTATE_DISABLED );
145 editor.setMode( editor.mode == 'source' ? 'wysiwyg' : 'source' );
146 },
147
148 canUndo: false
149 }
150 }
151};
152
153/**
154 * Controls the `tab-size` CSS property of the source editing area. Use it to set the width
155 * of the tab character in the source view. Enter an integer to denote the number of spaces
156 * that the tab will contain.
157 *
158 * **Note:** Works only with {@link #dataIndentationChars}
159 * set to `'\t'`. Please consider that not all browsers support the `tab-size` CSS
160 * property yet.
161 *
162 * // Set tab-size to 10 characters.
163 * config.sourceAreaTabSize = 10;
164 *
165 * @cfg {Number} [sourceAreaTabSize=4]
166 * @member CKEDITOR.config
167 * @see CKEDITOR.config#dataIndentationChars
168 */
diff --git a/sources/plugins/specialchar/dialogs/lang/_translationstatus.txt b/sources/plugins/specialchar/dialogs/lang/_translationstatus.txt
new file mode 100644
index 00000000..0fabceaf
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,20 @@
1Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
2For licensing, see LICENSE.md or http://ckeditor.com/license
3
4cs.js Found: 118 Missing: 0
5cy.js Found: 118 Missing: 0
6de.js Found: 118 Missing: 0
7el.js Found: 16 Missing: 102
8eo.js Found: 118 Missing: 0
9et.js Found: 31 Missing: 87
10fa.js Found: 24 Missing: 94
11fi.js Found: 23 Missing: 95
12fr.js Found: 118 Missing: 0
13hr.js Found: 23 Missing: 95
14it.js Found: 118 Missing: 0
15nb.js Found: 118 Missing: 0
16nl.js Found: 118 Missing: 0
17no.js Found: 118 Missing: 0
18tr.js Found: 118 Missing: 0
19ug.js Found: 39 Missing: 79
20zh-cn.js Found: 118 Missing: 0
diff --git a/sources/plugins/specialchar/dialogs/lang/af.js b/sources/plugins/specialchar/dialogs/lang/af.js
new file mode 100644
index 00000000..cc822234
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/af.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'af', {
7 euro: 'Euroteken',
8 lsquo: 'Linker enkelkwotasie',
9 rsquo: 'Regter enkelkwotasie',
10 ldquo: 'Linker dubbelkwotasie',
11 rdquo: 'Regter dubbelkwotasie',
12 ndash: 'Kortkoppelteken',
13 mdash: 'Langkoppelteken',
14 iexcl: 'Omgekeerdeuitroepteken',
15 cent: 'Centteken',
16 pound: 'Pondteken',
17 curren: 'Geldeenheidteken',
18 yen: 'Yenteken',
19 brvbar: 'Gebreekte balk',
20 sect: 'Afdeelingsteken',
21 uml: 'Deelteken',
22 copy: 'Kopieregteken',
23 ordf: 'Vroulikekenteken',
24 laquo: 'Linkgeoorienteerde aanhaalingsteken',
25 not: 'Verbodeteken',
26 reg: 'Regestrasieteken',
27 macr: 'Lengteteken',
28 deg: 'Gradeteken',
29 sup2: 'Kwadraatteken',
30 sup3: 'Kubiekteken',
31 acute: 'Akuutaksentteken',
32 micro: 'Mikroteken',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ar.js b/sources/plugins/specialchar/dialogs/lang/ar.js
new file mode 100644
index 00000000..d667357d
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ar.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ar', {
7 euro: 'رمز اليورو',
8 lsquo: 'علامة تنصيص فردية علي اليسار',
9 rsquo: 'علامة تنصيص فردية علي اليمين',
10 ldquo: 'علامة تنصيص مزدوجة علي اليسار',
11 rdquo: 'علامة تنصيص مزدوجة علي اليمين',
12 ndash: 'En dash',
13 mdash: 'Em dash',
14 iexcl: 'علامة تعجب مقلوبة',
15 cent: 'رمز السنت',
16 pound: 'رمز الاسترليني',
17 curren: 'رمز العملة',
18 yen: 'رمز الين',
19 brvbar: 'شريط مقطوع',
20 sect: 'رمز القسم',
21 uml: 'Diaeresis',
22 copy: 'علامة حقوق الطبع',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'ليست علامة',
26 reg: 'علامة مسجّلة',
27 macr: 'Macron', // MISSING
28 deg: 'Degree sign', // MISSING
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Micro sign', // MISSING
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'علامة الإستفهام غير صحيحة',
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/bg.js b/sources/plugins/specialchar/dialogs/lang/bg.js
new file mode 100644
index 00000000..c552df59
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/bg.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'bg', {
7 euro: 'Евро знак',
8 lsquo: 'Лява маркировка за цитат',
9 rsquo: 'Дясна маркировка за цитат',
10 ldquo: 'Лява двойна кавичка за цитат',
11 rdquo: 'Дясна двойна кавичка за цитат',
12 ndash: '\\\\',
13 mdash: '/',
14 iexcl: 'Обърната питанка',
15 cent: 'Знак за цент',
16 pound: 'Знак за паунд',
17 curren: 'Валутен знак',
18 yen: 'Знак за йена',
19 brvbar: 'Прекъсната линия',
20 sect: 'Знак за секция',
21 uml: 'Diaeresis', // MISSING
22 copy: 'Знак за Copyright',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Not sign', // MISSING
26 reg: 'Registered sign', // MISSING
27 macr: 'Macron', // MISSING
28 deg: 'Degree sign', // MISSING
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Micro sign', // MISSING
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ca.js b/sources/plugins/specialchar/dialogs/lang/ca.js
new file mode 100644
index 00000000..bf81f8cb
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ca.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ca', {
7 euro: 'Símbol d\'euro',
8 lsquo: 'Signe de cometa simple esquerra',
9 rsquo: 'Signe de cometa simple dreta',
10 ldquo: 'Signe de cometa doble esquerra',
11 rdquo: 'Signe de cometa doble dreta',
12 ndash: 'Guió',
13 mdash: 'Guió baix',
14 iexcl: 'Signe d\'exclamació inversa',
15 cent: 'Símbol de percentatge',
16 pound: 'Símbol de lliura',
17 curren: 'Símbol de moneda',
18 yen: 'Símbol de Yen',
19 brvbar: 'Barra trencada',
20 sect: 'Símbol de secció',
21 uml: 'Dièresi',
22 copy: 'Símbol de Copyright',
23 ordf: 'Indicador ordinal femení',
24 laquo: 'Signe de cometes angulars esquerra',
25 not: 'Símbol de negació',
26 reg: 'Símbol registrat',
27 macr: 'Macron',
28 deg: 'Símbol de grau',
29 sup2: 'Superíndex dos',
30 sup3: 'Superíndex tres',
31 acute: 'Accent agut',
32 micro: 'Símbol de micro',
33 para: 'Símbol de calderó',
34 middot: 'Punt volat',
35 cedil: 'Ce trencada',
36 sup1: 'Superíndex u',
37 ordm: 'Indicador ordinal masculí',
38 raquo: 'Signe de cometes angulars dreta',
39 frac14: 'Fracció vulgar un quart',
40 frac12: 'Fracció vulgar una meitat',
41 frac34: 'Fracció vulgar tres quarts',
42 iquest: 'Símbol d\'interrogació invertit',
43 Agrave: 'Lletra majúscula llatina A amb accent greu',
44 Aacute: 'Lletra majúscula llatina A amb accent agut',
45 Acirc: 'Lletra majúscula llatina A amb circumflex',
46 Atilde: 'Lletra majúscula llatina A amb titlla',
47 Auml: 'Lletra majúscula llatina A amb dièresi',
48 Aring: 'Lletra majúscula llatina A amb anell superior',
49 AElig: 'Lletra majúscula llatina Æ',
50 Ccedil: 'Lletra majúscula llatina C amb ce trencada',
51 Egrave: 'Lletra majúscula llatina E amb accent greu',
52 Eacute: 'Lletra majúscula llatina E amb accent agut',
53 Ecirc: 'Lletra majúscula llatina E amb circumflex',
54 Euml: 'Lletra majúscula llatina E amb dièresi',
55 Igrave: 'Lletra majúscula llatina I amb accent greu',
56 Iacute: 'Lletra majúscula llatina I amb accent agut',
57 Icirc: 'Lletra majúscula llatina I amb circumflex',
58 Iuml: 'Lletra majúscula llatina I amb dièresi',
59 ETH: 'Lletra majúscula llatina Eth',
60 Ntilde: 'Lletra majúscula llatina N amb titlla',
61 Ograve: 'Lletra majúscula llatina O amb accent greu',
62 Oacute: 'Lletra majúscula llatina O amb accent agut',
63 Ocirc: 'Lletra majúscula llatina O amb circumflex',
64 Otilde: 'Lletra majúscula llatina O amb titlla',
65 Ouml: 'Lletra majúscula llatina O amb dièresi',
66 times: 'Símbol de multiplicació',
67 Oslash: 'Lletra majúscula llatina O amb barra',
68 Ugrave: 'Lletra majúscula llatina U amb accent greu',
69 Uacute: 'Lletra majúscula llatina U amb accent agut',
70 Ucirc: 'Lletra majúscula llatina U amb circumflex',
71 Uuml: 'Lletra majúscula llatina U amb dièresi',
72 Yacute: 'Lletra majúscula llatina Y amb accent agut',
73 THORN: 'Lletra majúscula llatina Thorn',
74 szlig: 'Lletra minúscula llatina sharp s',
75 agrave: 'Lletra minúscula llatina a amb accent greu',
76 aacute: 'Lletra minúscula llatina a amb accent agut',
77 acirc: 'Lletra minúscula llatina a amb circumflex',
78 atilde: 'Lletra minúscula llatina a amb titlla',
79 auml: 'Lletra minúscula llatina a amb dièresi',
80 aring: 'Lletra minúscula llatina a amb anell superior',
81 aelig: 'Lletra minúscula llatina æ',
82 ccedil: 'Lletra minúscula llatina c amb ce trencada',
83 egrave: 'Lletra minúscula llatina e amb accent greu',
84 eacute: 'Lletra minúscula llatina e amb accent agut',
85 ecirc: 'Lletra minúscula llatina e amb circumflex',
86 euml: 'Lletra minúscula llatina e amb dièresi',
87 igrave: 'Lletra minúscula llatina i amb accent greu',
88 iacute: 'Lletra minúscula llatina i amb accent agut',
89 icirc: 'Lletra minúscula llatina i amb circumflex',
90 iuml: 'Lletra minúscula llatina i amb dièresi',
91 eth: 'Lletra minúscula llatina eth',
92 ntilde: 'Lletra minúscula llatina n amb titlla',
93 ograve: 'Lletra minúscula llatina o amb accent greu',
94 oacute: 'Lletra minúscula llatina o amb accent agut',
95 ocirc: 'Lletra minúscula llatina o amb circumflex',
96 otilde: 'Lletra minúscula llatina o amb titlla',
97 ouml: 'Lletra minúscula llatina o amb dièresi',
98 divide: 'Símbol de divisió',
99 oslash: 'Lletra minúscula llatina o amb barra',
100 ugrave: 'Lletra minúscula llatina u amb accent greu',
101 uacute: 'Lletra minúscula llatina u amb accent agut',
102 ucirc: 'Lletra minúscula llatina u amb circumflex',
103 uuml: 'Lletra minúscula llatina u amb dièresi',
104 yacute: 'Lletra minúscula llatina y amb accent agut',
105 thorn: 'Lletra minúscula llatina thorn',
106 yuml: 'Lletra minúscula llatina y amb dièresi',
107 OElig: 'Lligadura majúscula llatina OE',
108 oelig: 'Lligadura minúscula llatina oe',
109 '372': 'Lletra majúscula llatina W amb circumflex',
110 '374': 'Lletra majúscula llatina Y amb circumflex',
111 '373': 'Lletra minúscula llatina w amb circumflex',
112 '375': 'Lletra minúscula llatina y amb circumflex',
113 sbquo: 'Signe de cita simple baixa-9',
114 '8219': 'Signe de cita simple alta-invertida-9',
115 bdquo: 'Signe de cita doble baixa-9',
116 hellip: 'Punts suspensius',
117 trade: 'Símbol de marca registrada',
118 '9658': 'Punter negre apuntant cap a la dreta',
119 bull: 'Vinyeta',
120 rarr: 'Fletxa cap a la dreta',
121 rArr: 'Doble fletxa cap a la dreta',
122 hArr: 'Doble fletxa esquerra dreta',
123 diams: 'Vestit negre diamant',
124 asymp: 'Gairebé igual a'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/cs.js b/sources/plugins/specialchar/dialogs/lang/cs.js
new file mode 100644
index 00000000..8e859d56
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/cs.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'cs', {
7 euro: 'Znak eura',
8 lsquo: 'Počáteční uvozovka jednoduchá',
9 rsquo: 'Koncová uvozovka jednoduchá',
10 ldquo: 'Počáteční uvozovka dvojitá',
11 rdquo: 'Koncová uvozovka dvojitá',
12 ndash: 'En pomlčka',
13 mdash: 'Em pomlčka',
14 iexcl: 'Obrácený vykřičník',
15 cent: 'Znak centu',
16 pound: 'Znak libry',
17 curren: 'Znak měny',
18 yen: 'Znak jenu',
19 brvbar: 'Přerušená svislá čára',
20 sect: 'Znak oddílu',
21 uml: 'Přehláska',
22 copy: 'Znak copyrightu',
23 ordf: 'Ženský indikátor rodu',
24 laquo: 'Znak dvojitých lomených uvozovek vlevo',
25 not: 'Logistický zápor',
26 reg: 'Znak registrace',
27 macr: 'Pomlčka nad',
28 deg: 'Znak stupně',
29 sup2: 'Dvojka jako horní index',
30 sup3: 'Trojka jako horní index',
31 acute: 'Čárka nad vpravo',
32 micro: 'Znak mikro',
33 para: 'Znak odstavce',
34 middot: 'Tečka uprostřed',
35 cedil: 'Ocásek vlevo',
36 sup1: 'Jednička jako horní index',
37 ordm: 'Mužský indikátor rodu',
38 raquo: 'Znak dvojitých lomených uvozovek vpravo',
39 frac14: 'Obyčejný zlomek jedna čtvrtina',
40 frac12: 'Obyčejný zlomek jedna polovina',
41 frac34: 'Obyčejný zlomek tři čtvrtiny',
42 iquest: 'Znak obráceného otazníku',
43 Agrave: 'Velké písmeno latinky A s čárkou nad vlevo',
44 Aacute: 'Velké písmeno latinky A s čárkou nad vpravo',
45 Acirc: 'Velké písmeno latinky A s vokáněm',
46 Atilde: 'Velké písmeno latinky A s tildou',
47 Auml: 'Velké písmeno latinky A s dvěma tečkami',
48 Aring: 'Velké písmeno latinky A s kroužkem nad',
49 AElig: 'Velké písmeno latinky Ae',
50 Ccedil: 'Velké písmeno latinky C s ocáskem vlevo',
51 Egrave: 'Velké písmeno latinky E s čárkou nad vlevo',
52 Eacute: 'Velké písmeno latinky E s čárkou nad vpravo',
53 Ecirc: 'Velké písmeno latinky E s vokáněm',
54 Euml: 'Velké písmeno latinky E s dvěma tečkami',
55 Igrave: 'Velké písmeno latinky I s čárkou nad vlevo',
56 Iacute: 'Velké písmeno latinky I s čárkou nad vpravo',
57 Icirc: 'Velké písmeno latinky I s vokáněm',
58 Iuml: 'Velké písmeno latinky I s dvěma tečkami',
59 ETH: 'Velké písmeno latinky Eth',
60 Ntilde: 'Velké písmeno latinky N s tildou',
61 Ograve: 'Velké písmeno latinky O s čárkou nad vlevo',
62 Oacute: 'Velké písmeno latinky O s čárkou nad vpravo',
63 Ocirc: 'Velké písmeno latinky O s vokáněm',
64 Otilde: 'Velké písmeno latinky O s tildou',
65 Ouml: 'Velké písmeno latinky O s dvěma tečkami',
66 times: 'Znak násobení',
67 Oslash: 'Velké písmeno latinky O přeškrtnuté',
68 Ugrave: 'Velké písmeno latinky U s čárkou nad vlevo',
69 Uacute: 'Velké písmeno latinky U s čárkou nad vpravo',
70 Ucirc: 'Velké písmeno latinky U s vokáněm',
71 Uuml: 'Velké písmeno latinky U s dvěma tečkami',
72 Yacute: 'Velké písmeno latinky Y s čárkou nad vpravo',
73 THORN: 'Velké písmeno latinky Thorn',
74 szlig: 'Malé písmeno latinky ostré s',
75 agrave: 'Malé písmeno latinky a s čárkou nad vlevo',
76 aacute: 'Malé písmeno latinky a s čárkou nad vpravo',
77 acirc: 'Malé písmeno latinky a s vokáněm',
78 atilde: 'Malé písmeno latinky a s tildou',
79 auml: 'Malé písmeno latinky a s dvěma tečkami',
80 aring: 'Malé písmeno latinky a s kroužkem nad',
81 aelig: 'Malé písmeno latinky ae',
82 ccedil: 'Malé písmeno latinky c s ocáskem vlevo',
83 egrave: 'Malé písmeno latinky e s čárkou nad vlevo',
84 eacute: 'Malé písmeno latinky e s čárkou nad vpravo',
85 ecirc: 'Malé písmeno latinky e s vokáněm',
86 euml: 'Malé písmeno latinky e s dvěma tečkami',
87 igrave: 'Malé písmeno latinky i s čárkou nad vlevo',
88 iacute: 'Malé písmeno latinky i s čárkou nad vpravo',
89 icirc: 'Malé písmeno latinky i s vokáněm',
90 iuml: 'Malé písmeno latinky i s dvěma tečkami',
91 eth: 'Malé písmeno latinky eth',
92 ntilde: 'Malé písmeno latinky n s tildou',
93 ograve: 'Malé písmeno latinky o s čárkou nad vlevo',
94 oacute: 'Malé písmeno latinky o s čárkou nad vpravo',
95 ocirc: 'Malé písmeno latinky o s vokáněm',
96 otilde: 'Malé písmeno latinky o s tildou',
97 ouml: 'Malé písmeno latinky o s dvěma tečkami',
98 divide: 'Znak dělení',
99 oslash: 'Malé písmeno latinky o přeškrtnuté',
100 ugrave: 'Malé písmeno latinky u s čárkou nad vlevo',
101 uacute: 'Malé písmeno latinky u s čárkou nad vpravo',
102 ucirc: 'Malé písmeno latinky u s vokáněm',
103 uuml: 'Malé písmeno latinky u s dvěma tečkami',
104 yacute: 'Malé písmeno latinky y s čárkou nad vpravo',
105 thorn: 'Malé písmeno latinky thorn',
106 yuml: 'Malé písmeno latinky y s dvěma tečkami',
107 OElig: 'Velká ligatura latinky OE',
108 oelig: 'Malá ligatura latinky OE',
109 '372': 'Velké písmeno latinky W s vokáněm',
110 '374': 'Velké písmeno latinky Y s vokáněm',
111 '373': 'Malé písmeno latinky w s vokáněm',
112 '375': 'Malé písmeno latinky y s vokáněm',
113 sbquo: 'Dolní 9 uvozovka jednoduchá',
114 '8219': 'Horní obrácená 9 uvozovka jednoduchá',
115 bdquo: 'Dolní 9 uvozovka dvojitá',
116 hellip: 'Trojtečkový úvod',
117 trade: 'Obchodní značka',
118 '9658': 'Černý ukazatel směřující vpravo',
119 bull: 'Kolečko',
120 rarr: 'Šipka vpravo',
121 rArr: 'Dvojitá šipka vpravo',
122 hArr: 'Dvojitá šipka vlevo a vpravo',
123 diams: 'Černé piky',
124 asymp: 'Téměř se rovná'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/cy.js b/sources/plugins/specialchar/dialogs/lang/cy.js
new file mode 100644
index 00000000..855e582d
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/cy.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'cy', {
7 euro: 'Arwydd yr Ewro',
8 lsquo: 'Dyfynnod chwith unigol',
9 rsquo: 'Dyfynnod dde unigol',
10 ldquo: 'Dyfynnod chwith dwbl',
11 rdquo: 'Dyfynnod dde dwbl',
12 ndash: 'Cysylltnod en',
13 mdash: 'Cysylltnod em',
14 iexcl: 'Ebychnod gwrthdro',
15 cent: 'Arwydd sent',
16 pound: 'Arwydd punt',
17 curren: 'Arwydd arian cyfred',
18 yen: 'Arwydd yen',
19 brvbar: 'Bar toriedig',
20 sect: 'Arwydd adran',
21 uml: 'Didolnod',
22 copy: 'Arwydd hawlfraint',
23 ordf: 'Dangosydd benywaidd',
24 laquo: 'Dyfynnod dwbl ar ongl i\'r chwith',
25 not: 'Arwydd Nid',
26 reg: 'Arwydd cofrestredig',
27 macr: 'Macron',
28 deg: 'Arwydd gradd',
29 sup2: 'Dau uwchsgript',
30 sup3: 'Tri uwchsgript',
31 acute: 'Acen ddyrchafedig',
32 micro: 'Arwydd micro',
33 para: 'Arwydd pilcrow',
34 middot: 'Dot canol',
35 cedil: 'Sedila',
36 sup1: 'Un uwchsgript',
37 ordm: 'Dangosydd gwrywaidd',
38 raquo: 'Dyfynnod dwbl ar ongl i\'r dde',
39 frac14: 'Ffracsiwn cyffredin un cwarter',
40 frac12: 'Ffracsiwn cyffredin un hanner',
41 frac34: 'Ffracsiwn cyffredin tri chwarter',
42 iquest: 'Marc cwestiwn gwrthdroëdig',
43 Agrave: 'Priflythyren A Lladinaidd gydag acen ddisgynedig',
44 Aacute: 'Priflythyren A Lladinaidd gydag acen ddyrchafedig',
45 Acirc: 'Priflythyren A Lladinaidd gydag acen grom',
46 Atilde: 'Priflythyren A Lladinaidd gyda thild',
47 Auml: 'Priflythyren A Lladinaidd gyda didolnod',
48 Aring: 'Priflythyren A Lladinaidd gyda chylch uwchben',
49 AElig: 'Priflythyren Æ Lladinaidd',
50 Ccedil: 'Priflythyren C Lladinaidd gyda sedila',
51 Egrave: 'Priflythyren E Lladinaidd gydag acen ddisgynedig',
52 Eacute: 'Priflythyren E Lladinaidd gydag acen ddyrchafedig',
53 Ecirc: 'Priflythyren E Lladinaidd gydag acen grom',
54 Euml: 'Priflythyren E Lladinaidd gyda didolnod',
55 Igrave: 'Priflythyren I Lladinaidd gydag acen ddisgynedig',
56 Iacute: 'Priflythyren I Lladinaidd gydag acen ddyrchafedig',
57 Icirc: 'Priflythyren I Lladinaidd gydag acen grom',
58 Iuml: 'Priflythyren I Lladinaidd gyda didolnod',
59 ETH: 'Priflythyren Eth',
60 Ntilde: 'Priflythyren N Lladinaidd gyda thild',
61 Ograve: 'Priflythyren O Lladinaidd gydag acen ddisgynedig',
62 Oacute: 'Priflythyren O Lladinaidd gydag acen ddyrchafedig',
63 Ocirc: 'Priflythyren O Lladinaidd gydag acen grom',
64 Otilde: 'Priflythyren O Lladinaidd gyda thild',
65 Ouml: 'Priflythyren O Lladinaidd gyda didolnod',
66 times: 'Arwydd lluosi',
67 Oslash: 'Priflythyren O Lladinaidd gyda strôc',
68 Ugrave: 'Priflythyren U Lladinaidd gydag acen ddisgynedig',
69 Uacute: 'Priflythyren U Lladinaidd gydag acen ddyrchafedig',
70 Ucirc: 'Priflythyren U Lladinaidd gydag acen grom',
71 Uuml: 'Priflythyren U Lladinaidd gyda didolnod',
72 Yacute: 'Priflythyren Y Lladinaidd gydag acen ddyrchafedig',
73 THORN: 'Priflythyren Thorn',
74 szlig: 'Llythyren s fach Lladinaidd siarp ',
75 agrave: 'Llythyren a fach Lladinaidd gydag acen ddisgynedig',
76 aacute: 'Llythyren a fach Lladinaidd gydag acen ddyrchafedig',
77 acirc: 'Llythyren a fach Lladinaidd gydag acen grom',
78 atilde: 'Llythyren a fach Lladinaidd gyda thild',
79 auml: 'Llythyren a fach Lladinaidd gyda didolnod',
80 aring: 'Llythyren a fach Lladinaidd gyda chylch uwchben',
81 aelig: 'Llythyren æ fach Lladinaidd',
82 ccedil: 'Llythyren c fach Lladinaidd gyda sedila',
83 egrave: 'Llythyren e fach Lladinaidd gydag acen ddisgynedig',
84 eacute: 'Llythyren e fach Lladinaidd gydag acen ddyrchafedig',
85 ecirc: 'Llythyren e fach Lladinaidd gydag acen grom',
86 euml: 'Llythyren e fach Lladinaidd gyda didolnod',
87 igrave: 'Llythyren i fach Lladinaidd gydag acen ddisgynedig',
88 iacute: 'Llythyren i fach Lladinaidd gydag acen ddyrchafedig',
89 icirc: 'Llythyren i fach Lladinaidd gydag acen grom',
90 iuml: 'Llythyren i fach Lladinaidd gyda didolnod',
91 eth: 'Llythyren eth fach',
92 ntilde: 'Llythyren n fach Lladinaidd gyda thild',
93 ograve: 'Llythyren o fach Lladinaidd gydag acen ddisgynedig',
94 oacute: 'Llythyren o fach Lladinaidd gydag acen ddyrchafedig',
95 ocirc: 'Llythyren o fach Lladinaidd gydag acen grom',
96 otilde: 'Llythyren o fach Lladinaidd gyda thild',
97 ouml: 'Llythyren o fach Lladinaidd gyda didolnod',
98 divide: 'Arwydd rhannu',
99 oslash: 'Llythyren o fach Lladinaidd gyda strôc',
100 ugrave: 'Llythyren u fach Lladinaidd gydag acen ddisgynedig',
101 uacute: 'Llythyren u fach Lladinaidd gydag acen ddyrchafedig',
102 ucirc: 'Llythyren u fach Lladinaidd gydag acen grom',
103 uuml: 'Llythyren u fach Lladinaidd gyda didolnod',
104 yacute: 'Llythyren y fach Lladinaidd gydag acen ddisgynedig',
105 thorn: 'Llythyren o fach Lladinaidd gyda strôc',
106 yuml: 'Llythyren y fach Lladinaidd gyda didolnod',
107 OElig: 'Priflythyren cwlwm OE Lladinaidd ',
108 oelig: 'Priflythyren cwlwm oe Lladinaidd ',
109 '372': 'Priflythyren W gydag acen grom',
110 '374': 'Priflythyren Y gydag acen grom',
111 '373': 'Llythyren w fach gydag acen grom',
112 '375': 'Llythyren y fach gydag acen grom',
113 sbquo: 'Dyfynnod sengl 9-isel',
114 '8219': 'Dyfynnod sengl 9-uchel cildro',
115 bdquo: 'Dyfynnod dwbl 9-isel',
116 hellip: 'Coll geiriau llorweddol',
117 trade: 'Arwydd marc masnachol',
118 '9658': 'Pwyntydd du i\'r dde',
119 bull: 'Bwled',
120 rarr: 'Saeth i\'r dde',
121 rArr: 'Saeth ddwbl i\'r dde',
122 hArr: 'Saeth ddwbl i\'r chwith',
123 diams: 'Siwt diemwnt du',
124 asymp: 'Bron yn hafal iddo'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/da.js b/sources/plugins/specialchar/dialogs/lang/da.js
new file mode 100644
index 00000000..135a3056
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/da.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'da', {
7 euro: 'Euro-tegn',
8 lsquo: 'Venstre enkelt anførselstegn',
9 rsquo: 'Højre enkelt anførselstegn',
10 ldquo: 'Venstre dobbelt anførselstegn',
11 rdquo: 'Højre dobbelt anførselstegn',
12 ndash: 'Bindestreg',
13 mdash: 'Tankestreg',
14 iexcl: 'Omvendt udråbstegn',
15 cent: 'Cent-tegn',
16 pound: 'Pund-tegn',
17 curren: 'Kurs-tegn',
18 yen: 'Yen-tegn',
19 brvbar: 'Brudt streg',
20 sect: 'Paragraftegn',
21 uml: 'Umlaut',
22 copy: 'Copyright-tegn',
23 ordf: 'Feminin ordinal indikator',
24 laquo: 'Venstre dobbel citations-vinkel',
25 not: 'Negation',
26 reg: 'Registreret varemærke tegn',
27 macr: 'Macron',
28 deg: 'Grad-tegn',
29 sup2: 'Superscript to',
30 sup3: 'Superscript tre',
31 acute: 'Prim-tegn',
32 micro: 'Mikro-tegn',
33 para: 'Pilcrow-tegn',
34 middot: 'Punkt-tegn',
35 cedil: 'Cedille',
36 sup1: 'Superscript et',
37 ordm: 'Maskulin ordinal indikator',
38 raquo: 'Højre dobbel citations-vinkel',
39 frac14: 'En fjerdedel',
40 frac12: 'En halv',
41 frac34: 'En tredjedel',
42 iquest: 'Omvendt udråbstegn',
43 Agrave: 'Stort A med accent grave',
44 Aacute: 'Stort A med accent aigu',
45 Acirc: 'Stort A med cirkumfleks',
46 Atilde: 'Stort A med tilde',
47 Auml: 'Stort A med umlaut',
48 Aring: 'Stort Å',
49 AElig: 'Stort Æ',
50 Ccedil: 'Stort C med cedille',
51 Egrave: 'Stort E med accent grave',
52 Eacute: 'Stort E med accent aigu',
53 Ecirc: 'Stort E med cirkumfleks',
54 Euml: 'Stort E med umlaut',
55 Igrave: 'Stort I med accent grave',
56 Iacute: 'Stort I med accent aigu',
57 Icirc: 'Stort I med cirkumfleks',
58 Iuml: 'Stort I med umlaut',
59 ETH: 'Stort Ð (edd)',
60 Ntilde: 'Stort N med tilde',
61 Ograve: 'Stort O med accent grave',
62 Oacute: 'Stort O med accent aigu',
63 Ocirc: 'Stort O med cirkumfleks',
64 Otilde: 'Stort O med tilde',
65 Ouml: 'Stort O med umlaut',
66 times: 'Gange-tegn',
67 Oslash: 'Stort Ø',
68 Ugrave: 'Stort U med accent grave',
69 Uacute: 'Stort U med accent aigu',
70 Ucirc: 'Stort U med cirkumfleks',
71 Uuml: 'Stort U med umlaut',
72 Yacute: 'Stort Y med accent aigu',
73 THORN: 'Stort Thorn',
74 szlig: 'Lille eszett',
75 agrave: 'Lille a med accent grave',
76 aacute: 'Lille a med accent aigu',
77 acirc: 'Lille a med cirkumfleks',
78 atilde: 'Lille a med tilde',
79 auml: 'Lille a med umlaut',
80 aring: 'Lilla å',
81 aelig: 'Lille æ',
82 ccedil: 'Lille c med cedille',
83 egrave: 'Lille e med accent grave',
84 eacute: 'Lille e med accent aigu',
85 ecirc: 'Lille e med cirkumfleks',
86 euml: 'Lille e med umlaut',
87 igrave: 'Lille i med accent grave',
88 iacute: 'Lille i med accent aigu',
89 icirc: 'Lille i med cirkumfleks',
90 iuml: 'Lille i med umlaut',
91 eth: 'Lille ð (edd)',
92 ntilde: 'Lille n med tilde',
93 ograve: 'Lille o med accent grave',
94 oacute: 'Lille o med accent aigu',
95 ocirc: 'Lille o med cirkumfleks',
96 otilde: 'Lille o med tilde',
97 ouml: 'Lille o med umlaut',
98 divide: 'Divisions-tegn',
99 oslash: 'Lille ø',
100 ugrave: 'Lille u med accent grave',
101 uacute: 'Lille u med accent aigu',
102 ucirc: 'Lille u med cirkumfleks',
103 uuml: 'Lille u med umlaut',
104 yacute: 'Lille y med accent aigu',
105 thorn: 'Lille thorn',
106 yuml: 'Lille y med umlaut',
107 OElig: 'Stort Æ',
108 oelig: 'Lille æ',
109 '372': 'Stort W med cirkumfleks',
110 '374': 'Stort Y med cirkumfleks',
111 '373': 'Lille w med cirkumfleks',
112 '375': 'Lille y med cirkumfleks',
113 sbquo: 'Lavt enkelt 9-komma citationstegn',
114 '8219': 'Højt enkelt 9-komma citationstegn',
115 bdquo: 'Dobbelt 9-komma citationstegn',
116 hellip: 'Tre horizontale prikker',
117 trade: 'Varemærke-tegn',
118 '9658': 'Sort højre pil',
119 bull: 'Punkt',
120 rarr: 'Højre pil',
121 rArr: 'Højre dobbelt pil',
122 hArr: 'Venstre højre dobbelt pil',
123 diams: 'Sort diamant',
124 asymp: 'Næsten lig med'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/de.js b/sources/plugins/specialchar/dialogs/lang/de.js
new file mode 100644
index 00000000..0225feda
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/de.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'de', {
7 euro: 'Euro Zeichen',
8 lsquo: 'Hochkomma links',
9 rsquo: 'Hochkomma rechts',
10 ldquo: 'Anführungszeichen links',
11 rdquo: 'Anführungszeichen rechts',
12 ndash: 'Kleiner Strich',
13 mdash: 'Mittlerer Strich',
14 iexcl: 'Invertiertes Ausrufezeichen',
15 cent: 'Cent-Zeichen',
16 pound: 'Pfund-Zeichen',
17 curren: 'Währungszeichen',
18 yen: 'Yen',
19 brvbar: 'Gestrichelte Linie',
20 sect: 'Paragrafenzeichen',
21 uml: 'Diäresis',
22 copy: 'Copyright-Zeichen',
23 ordf: 'Feminine ordinal Anzeige',
24 laquo: 'Nach links zeigenden Doppel-Winkel Anführungszeichen',
25 not: 'Not-Zeichen',
26 reg: 'Registriert-Zeichen',
27 macr: 'Längezeichen',
28 deg: 'Grad-Zeichen',
29 sup2: 'Hoch 2',
30 sup3: 'Hoch 3',
31 acute: 'Akzentzeichen ',
32 micro: 'Mikro-Zeichen',
33 para: 'Pilcrow-Zeichen',
34 middot: 'Mittelpunkt',
35 cedil: 'Cedilla',
36 sup1: 'Hoch 1',
37 ordm: 'Männliche Ordnungszahl Anzeige',
38 raquo: 'Nach rechts zeigenden Doppel-Winkel Anführungszeichen',
39 frac14: 'ein Viertel',
40 frac12: 'Hälfte',
41 frac34: 'Dreiviertel',
42 iquest: 'Umgekehrtes Fragezeichen',
43 Agrave: 'Lateinischer Buchstabe A mit AkzentGrave',
44 Aacute: 'Lateinischer Buchstabe A mit Akutakzent',
45 Acirc: 'Lateinischer Buchstabe A mit Zirkumflex',
46 Atilde: 'Lateinischer Buchstabe A mit Tilde',
47 Auml: 'Lateinischer Buchstabe A mit Trema',
48 Aring: 'Lateinischer Buchstabe A mit Ring oben',
49 AElig: 'Lateinischer Buchstabe Æ',
50 Ccedil: 'Lateinischer Buchstabe C mit Cedille',
51 Egrave: 'Lateinischer Buchstabe E mit AkzentGrave',
52 Eacute: 'Lateinischer Buchstabe E mit Akutakzent',
53 Ecirc: 'Lateinischer Buchstabe E mit Zirkumflex',
54 Euml: 'Lateinischer Buchstabe E Trema',
55 Igrave: 'Lateinischer Buchstabe I mit AkzentGrave',
56 Iacute: 'Lateinischer Buchstabe I mit Akutakzent',
57 Icirc: 'Lateinischer Buchstabe I mit Zirkumflex',
58 Iuml: 'Lateinischer Buchstabe I mit Trema',
59 ETH: 'Lateinischer Buchstabe Eth',
60 Ntilde: 'Lateinischer Buchstabe N mit Tilde',
61 Ograve: 'Lateinischer Buchstabe O mit AkzentGrave',
62 Oacute: 'Lateinischer Buchstabe O mit Akutakzent',
63 Ocirc: 'Lateinischer Buchstabe O mit Zirkumflex',
64 Otilde: 'Lateinischer Buchstabe O mit Tilde',
65 Ouml: 'Lateinischer Buchstabe O mit Trema',
66 times: 'Multiplikation',
67 Oslash: 'Lateinischer Buchstabe O durchgestrichen',
68 Ugrave: 'Lateinischer Buchstabe U mit Akzentgrave',
69 Uacute: 'Lateinischer Buchstabe U mit Akutakzent',
70 Ucirc: 'Lateinischer Buchstabe U mit Zirkumflex',
71 Uuml: 'Lateinischer Buchstabe a mit Trema',
72 Yacute: 'Lateinischer Buchstabe a mit Akzent',
73 THORN: 'Lateinischer Buchstabe mit Dorn',
74 szlig: 'Kleiner lateinischer Buchstabe scharfe s',
75 agrave: 'Kleiner lateinischer Buchstabe a mit Accent grave',
76 aacute: 'Kleiner lateinischer Buchstabe a mit Akut',
77 acirc: 'Lateinischer Buchstabe a mit Zirkumflex',
78 atilde: 'Lateinischer Buchstabe a mit Tilde',
79 auml: 'Kleiner lateinischer Buchstabe a mit Trema',
80 aring: 'Kleiner lateinischer Buchstabe a mit Ring oben',
81 aelig: 'Lateinischer Buchstabe æ',
82 ccedil: 'Kleiner lateinischer Buchstabe c mit Cedille',
83 egrave: 'Kleiner lateinischer Buchstabe e mit Accent grave',
84 eacute: 'Kleiner lateinischer Buchstabe e mit Akut',
85 ecirc: 'Kleiner lateinischer Buchstabe e mit Zirkumflex',
86 euml: 'Kleiner lateinischer Buchstabe e mit Trema',
87 igrave: 'Kleiner lateinischer Buchstabe i mit AkzentGrave',
88 iacute: 'Kleiner lateinischer Buchstabe i mit Akzent',
89 icirc: 'Kleiner lateinischer Buchstabe i mit Zirkumflex',
90 iuml: 'Kleiner lateinischer Buchstabe i mit Trema',
91 eth: 'Kleiner lateinischer Buchstabe eth',
92 ntilde: 'Kleiner lateinischer Buchstabe n mit Tilde',
93 ograve: 'Kleiner lateinischer Buchstabe o mit Accent grave',
94 oacute: 'Kleiner lateinischer Buchstabe o mit Akzent',
95 ocirc: 'Kleiner lateinischer Buchstabe o mit Zirkumflex',
96 otilde: 'Lateinischer Buchstabe i mit Tilde',
97 ouml: 'Kleiner lateinischer Buchstabe o mit Trema',
98 divide: 'Divisionszeichen',
99 oslash: 'Kleiner lateinischer Buchstabe o durchgestrichen',
100 ugrave: 'Kleiner lateinischer Buchstabe u mit Accent grave',
101 uacute: 'Kleiner lateinischer Buchstabe u mit Akut',
102 ucirc: 'Kleiner lateinischer Buchstabe u mit Zirkumflex',
103 uuml: 'Kleiner lateinischer Buchstabe u mit Trema',
104 yacute: 'Kleiner lateinischer Buchstabe y mit Akut',
105 thorn: 'Kleiner lateinischer Buchstabe Dorn',
106 yuml: 'Kleiner lateinischer Buchstabe y mit Trema',
107 OElig: 'Lateinischer Buchstabe Ligatur OE',
108 oelig: 'Kleiner lateinischer Buchstabe Ligatur OE',
109 '372': 'Lateinischer Buchstabe W mit Zirkumflex',
110 '374': 'Lateinischer Buchstabe Y mit Zirkumflex',
111 '373': 'Kleiner lateinischer Buchstabe w mit Zirkumflex',
112 '375': 'Kleiner lateinischer Buchstabe y mit Zirkumflex',
113 sbquo: 'Tiefergestelltes Komma',
114 '8219': 'Rumgedrehtes Komma',
115 bdquo: 'Doppeltes Anführungszeichen unten',
116 hellip: 'horizontale Auslassungspunkte',
117 trade: 'Handelszeichen',
118 '9658': 'Dreickspfeil rechts',
119 bull: 'Bullet',
120 rarr: 'Pfeil rechts',
121 rArr: 'Doppelpfeil rechts',
122 hArr: 'Doppelpfeil links',
123 diams: 'Karo',
124 asymp: 'Ungefähr'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/el.js b/sources/plugins/specialchar/dialogs/lang/el.js
new file mode 100644
index 00000000..b47660da
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/el.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'el', {
7 euro: 'Σύμβολο Ευρώ',
8 lsquo: 'Αριστερός χαρακτήρας μονού εισαγωγικού',
9 rsquo: 'Δεξιός χαρακτήρας μονού εισαγωγικού',
10 ldquo: 'Αριστερός χαρακτήρας ευθύγραμμων εισαγωγικών',
11 rdquo: 'Δεξιός χαρακτήρας ευθύγραμμων εισαγωγικών',
12 ndash: 'Παύλα en',
13 mdash: 'Παύλα em',
14 iexcl: 'Ανάποδο θαυμαστικό',
15 cent: 'Σύμβολο σεντ',
16 pound: 'Σύμβολο λίρας',
17 curren: 'Σύμβολο συναλλαγματικής μονάδας',
18 yen: 'Σύμβολο Γιεν',
19 brvbar: 'Σπασμένη μπάρα',
20 sect: 'Σύμβολο τμήματος',
21 uml: 'Διαίρεση',
22 copy: 'Σύμβολο πνευματικών δικαιωμάτων',
23 ordf: 'Θηλυκός τακτικός δείκτης',
24 laquo: 'Γωνιώδη εισαγωγικά αριστερής κατάδειξης',
25 not: 'Σύμβολο άρνησης',
26 reg: 'Σύμβολο σημάτων κατατεθέν',
27 macr: 'Μακρόν',
28 deg: 'Σύμβολο βαθμού',
29 sup2: 'Εκτεθειμένο δύο',
30 sup3: 'Εκτεθειμένο τρία',
31 acute: 'Οξεία',
32 micro: 'Σύμβολο μικρού',
33 para: 'Σύμβολο παραγράφου',
34 middot: 'Μέση τελεία',
35 cedil: 'Υπογεγραμμένη',
36 sup1: 'Εκτεθειμένο ένα',
37 ordm: 'Αρσενικός τακτικός δείκτης',
38 raquo: 'Γωνιώδη εισαγωγικά δεξιάς κατάδειξης',
39 frac14: 'Γνήσιο κλάσμα ενός τετάρτου',
40 frac12: 'Γνήσιο κλάσμα ενός δεύτερου',
41 frac34: 'Γνήσιο κλάσμα τριών τετάρτων',
42 iquest: 'Ανάποδο θαυμαστικό',
43 Agrave: 'Λατινικό κεφαλαίο γράμμα A με βαρεία',
44 Aacute: 'Λατινικό κεφαλαίο γράμμα A με οξεία',
45 Acirc: 'Λατινικό κεφαλαίο γράμμα A με περισπωμένη',
46 Atilde: 'Λατινικό κεφαλαίο γράμμα A με περισπωμένη',
47 Auml: 'Λατινικό κεφαλαίο γράμμα A με διαλυτικά',
48 Aring: 'Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω',
49 AElig: 'Λατινικό κεφαλαίο γράμμα Æ',
50 Ccedil: 'Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη',
51 Egrave: 'Λατινικό κεφαλαίο γράμμα E με βαρεία',
52 Eacute: 'Λατινικό κεφαλαίο γράμμα E με οξεία',
53 Ecirc: 'Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη ',
54 Euml: 'Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά',
55 Igrave: 'Λατινικό κεφαλαίο γράμμα I με βαρεία',
56 Iacute: 'Λατινικό κεφαλαίο γράμμα I με οξεία',
57 Icirc: 'Λατινικό κεφαλαίο γράμμα I με περισπωμένη',
58 Iuml: 'Λατινικό κεφαλαίο γράμμα I με διαλυτικά ',
59 ETH: 'Λατινικό κεφαλαίο γράμμα Eth',
60 Ntilde: 'Λατινικό κεφαλαίο γράμμα N με περισπωμένη',
61 Ograve: 'Λατινικό κεφαλαίο γράμμα O με βαρεία',
62 Oacute: 'Λατινικό κεφαλαίο γράμμα O με οξεία',
63 Ocirc: 'Λατινικό κεφαλαίο γράμμα O με περισπωμένη ',
64 Otilde: 'Λατινικό κεφαλαίο γράμμα O με περισπωμένη',
65 Ouml: 'Λατινικό κεφαλαίο γράμμα O με διαλυτικά',
66 times: 'Σύμβολο πολλαπλασιασμού',
67 Oslash: 'Λατινικό κεφαλαίο γράμμα O με μολυβιά',
68 Ugrave: 'Λατινικό κεφαλαίο γράμμα U με βαρεία',
69 Uacute: 'Λατινικό κεφαλαίο γράμμα U με οξεία',
70 Ucirc: 'Λατινικό κεφαλαίο γράμμα U με περισπωμένη',
71 Uuml: 'Λατινικό κεφαλαίο γράμμα U με διαλυτικά',
72 Yacute: 'Λατινικό κεφαλαίο γράμμα Y με οξεία',
73 THORN: 'Λατινικό κεφαλαίο γράμμα Thorn',
74 szlig: 'Λατινικό μικρό γράμμα απότομο s',
75 agrave: 'Λατινικό μικρό γράμμα a με βαρεία',
76 aacute: 'Λατινικό μικρό γράμμα a με οξεία',
77 acirc: 'Λατινικό μικρό γράμμα a με περισπωμένη',
78 atilde: 'Λατινικό μικρό γράμμα a με περισπωμένη',
79 auml: 'Λατινικό μικρό γράμμα a με διαλυτικά',
80 aring: 'Λατινικό μικρό γράμμα a με δακτύλιο πάνω',
81 aelig: 'Λατινικό μικρό γράμμα æ',
82 ccedil: 'Λατινικό μικρό γράμμα c με υπογεγραμμένη',
83 egrave: 'Λατινικό μικρό γράμμα ε με βαρεία',
84 eacute: 'Λατινικό μικρό γράμμα e με οξεία',
85 ecirc: 'Λατινικό μικρό γράμμα e με περισπωμένη',
86 euml: 'Λατινικό μικρό γράμμα e με διαλυτικά',
87 igrave: 'Λατινικό μικρό γράμμα i με βαρεία',
88 iacute: 'Λατινικό μικρό γράμμα i με οξεία',
89 icirc: 'Λατινικό μικρό γράμμα i με περισπωμένη',
90 iuml: 'Λατινικό μικρό γράμμα i με διαλυτικά',
91 eth: 'Λατινικό μικρό γράμμα eth',
92 ntilde: 'Λατινικό μικρό γράμμα n με περισπωμένη',
93 ograve: 'Λατινικό μικρό γράμμα o με βαρεία',
94 oacute: 'Λατινικό μικρό γράμμα o με οξεία ',
95 ocirc: 'Λατινικό πεζό γράμμα o με περισπωμένη',
96 otilde: 'Λατινικό μικρό γράμμα o με περισπωμένη ',
97 ouml: 'Λατινικό μικρό γράμμα o με διαλυτικά',
98 divide: 'Σύμβολο διαίρεσης',
99 oslash: 'Λατινικό μικρό γράμμα o με περισπωμένη',
100 ugrave: 'Λατινικό μικρό γράμμα u με βαρεία',
101 uacute: 'Λατινικό μικρό γράμμα u με οξεία',
102 ucirc: 'Λατινικό μικρό γράμμα u με περισπωμένη',
103 uuml: 'Λατινικό μικρό γράμμα u με διαλυτικά',
104 yacute: 'Λατινικό μικρό γράμμα y με οξεία',
105 thorn: 'Λατινικό μικρό γράμμα thorn',
106 yuml: 'Λατινικό μικρό γράμμα y με διαλυτικά',
107 OElig: 'Λατινικό κεφαλαίο σύμπλεγμα ΟΕ',
108 oelig: 'Λατινικό μικρό σύμπλεγμα oe',
109 '372': 'Λατινικό κεφαλαίο γράμμα W με περισπωμένη',
110 '374': 'Λατινικό κεφαλαίο γράμμα Y με περισπωμένη',
111 '373': 'Λατινικό μικρό γράμμα w με περισπωμένη',
112 '375': 'Λατινικό μικρό γράμμα y με περισπωμένη',
113 sbquo: 'Ενιαίο χαμηλο -9 εισαγωγικό ',
114 '8219': 'Ενιαίο υψηλο ανεστραμμένο-9 εισαγωγικό ',
115 bdquo: 'Διπλό χαμηλό-9 εισαγωγικό ',
116 hellip: 'Οριζόντια αποσιωπητικά',
117 trade: 'Σύμβολο εμπορικού κατατεθέν',
118 '9658': 'Μαύρος δείκτης που δείχνει προς τα δεξιά',
119 bull: 'Κουκκίδα',
120 rarr: 'Δεξί βελάκι',
121 rArr: 'Διπλό δεξί βελάκι',
122 hArr: 'Διπλό βελάκι αριστερά-δεξιά',
123 diams: 'Μαύρο διαμάντι',
124 asymp: 'Σχεδόν ίσο με'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/en-gb.js b/sources/plugins/specialchar/dialogs/lang/en-gb.js
new file mode 100644
index 00000000..9f9cd90f
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/en-gb.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'en-gb', {
7 euro: 'Euro sign',
8 lsquo: 'Left single quotation mark',
9 rsquo: 'Right single quotation mark',
10 ldquo: 'Left double quotation mark',
11 rdquo: 'Right double quotation mark',
12 ndash: 'En dash',
13 mdash: 'Em dash',
14 iexcl: 'Inverted exclamation mark',
15 cent: 'Cent sign',
16 pound: 'Pound sign',
17 curren: 'Currency sign',
18 yen: 'Yen sign',
19 brvbar: 'Broken bar',
20 sect: 'Section sign',
21 uml: 'Diaeresis',
22 copy: 'Copyright sign',
23 ordf: 'Feminine ordinal indicator',
24 laquo: 'Left-pointing double angle quotation mark',
25 not: 'Not sign',
26 reg: 'Registered sign',
27 macr: 'Macron',
28 deg: 'Degree sign',
29 sup2: 'Superscript two',
30 sup3: 'Superscript three',
31 acute: 'Acute accent',
32 micro: 'Micro sign',
33 para: 'Pilcrow sign',
34 middot: 'Middle dot',
35 cedil: 'Cedilla',
36 sup1: 'Superscript one',
37 ordm: 'Masculine ordinal indicator',
38 raquo: 'Right-pointing double angle quotation mark',
39 frac14: 'Vulgar fraction one quarter',
40 frac12: 'Vulgar fraction one half',
41 frac34: 'Vulgar fraction three quarters',
42 iquest: 'Inverted question mark',
43 Agrave: 'Latin capital letter A with grave accent',
44 Aacute: 'Latin capital letter A with acute accent',
45 Acirc: 'Latin capital letter A with circumflex',
46 Atilde: 'Latin capital letter A with tilde',
47 Auml: 'Latin capital letter A with diaeresis',
48 Aring: 'Latin capital letter A with ring above',
49 AElig: 'Latin Capital letter Æ',
50 Ccedil: 'Latin capital letter C with cedilla',
51 Egrave: 'Latin capital letter E with grave accent',
52 Eacute: 'Latin capital letter E with acute accent',
53 Ecirc: 'Latin capital letter E with circumflex',
54 Euml: 'Latin capital letter E with diaeresis',
55 Igrave: 'Latin capital letter I with grave accent',
56 Iacute: 'Latin capital letter I with acute accent',
57 Icirc: 'Latin capital letter I with circumflex',
58 Iuml: 'Latin capital letter I with diaeresis',
59 ETH: 'Latin capital letter Eth',
60 Ntilde: 'Latin capital letter N with tilde',
61 Ograve: 'Latin capital letter O with grave accent',
62 Oacute: 'Latin capital letter O with acute accent',
63 Ocirc: 'Latin capital letter O with circumflex',
64 Otilde: 'Latin capital letter O with tilde',
65 Ouml: 'Latin capital letter O with diaeresis',
66 times: 'Multiplication sign',
67 Oslash: 'Latin capital letter O with stroke',
68 Ugrave: 'Latin capital letter U with grave accent',
69 Uacute: 'Latin capital letter U with acute accent',
70 Ucirc: 'Latin capital letter U with circumflex',
71 Uuml: 'Latin capital letter U with diaeresis',
72 Yacute: 'Latin capital letter Y with acute accent',
73 THORN: 'Latin capital letter Thorn',
74 szlig: 'Latin small letter sharp s',
75 agrave: 'Latin small letter a with grave accent',
76 aacute: 'Latin small letter a with acute accent',
77 acirc: 'Latin small letter a with circumflex',
78 atilde: 'Latin small letter a with tilde',
79 auml: 'Latin small letter a with diaeresis',
80 aring: 'Latin small letter a with ring above',
81 aelig: 'Latin small letter æ',
82 ccedil: 'Latin small letter c with cedilla',
83 egrave: 'Latin small letter e with grave accent',
84 eacute: 'Latin small letter e with acute accent',
85 ecirc: 'Latin small letter e with circumflex',
86 euml: 'Latin small letter e with diaeresis',
87 igrave: 'Latin small letter i with grave accent',
88 iacute: 'Latin small letter i with acute accent',
89 icirc: 'Latin small letter i with circumflex',
90 iuml: 'Latin small letter i with diaeresis',
91 eth: 'Latin small letter eth',
92 ntilde: 'Latin small letter n with tilde',
93 ograve: 'Latin small letter o with grave accent',
94 oacute: 'Latin small letter o with acute accent',
95 ocirc: 'Latin small letter o with circumflex',
96 otilde: 'Latin small letter o with tilde',
97 ouml: 'Latin small letter o with diaeresis',
98 divide: 'Division sign',
99 oslash: 'Latin small letter o with stroke',
100 ugrave: 'Latin small letter u with grave accent',
101 uacute: 'Latin small letter u with acute accent',
102 ucirc: 'Latin small letter u with circumflex',
103 uuml: 'Latin small letter u with diaeresis',
104 yacute: 'Latin small letter y with acute accent',
105 thorn: 'Latin small letter thorn',
106 yuml: 'Latin small letter y with diaeresis',
107 OElig: 'Latin capital ligature OE',
108 oelig: 'Latin small ligature oe',
109 '372': 'Latin capital letter W with circumflex',
110 '374': 'Latin capital letter Y with circumflex',
111 '373': 'Latin small letter w with circumflex',
112 '375': 'Latin small letter y with circumflex',
113 sbquo: 'Single low-9 quotation mark',
114 '8219': 'Single high-reversed-9 quotation mark',
115 bdquo: 'Double low-9 quotation mark',
116 hellip: 'Horizontal ellipsis',
117 trade: 'Trade mark sign',
118 '9658': 'Black right-pointing pointer',
119 bull: 'Bullet',
120 rarr: 'Rightwards arrow',
121 rArr: 'Rightwards double arrow',
122 hArr: 'Left right double arrow',
123 diams: 'Black diamond suit',
124 asymp: 'Almost equal to'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/en.js b/sources/plugins/specialchar/dialogs/lang/en.js
new file mode 100644
index 00000000..687817b2
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/en.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'en', {
7 euro: 'Euro sign',
8 lsquo: 'Left single quotation mark',
9 rsquo: 'Right single quotation mark',
10 ldquo: 'Left double quotation mark',
11 rdquo: 'Right double quotation mark',
12 ndash: 'En dash',
13 mdash: 'Em dash',
14 iexcl: 'Inverted exclamation mark',
15 cent: 'Cent sign',
16 pound: 'Pound sign',
17 curren: 'Currency sign',
18 yen: 'Yen sign',
19 brvbar: 'Broken bar',
20 sect: 'Section sign',
21 uml: 'Diaeresis',
22 copy: 'Copyright sign',
23 ordf: 'Feminine ordinal indicator',
24 laquo: 'Left-pointing double angle quotation mark',
25 not: 'Not sign',
26 reg: 'Registered sign',
27 macr: 'Macron',
28 deg: 'Degree sign',
29 sup2: 'Superscript two',
30 sup3: 'Superscript three',
31 acute: 'Acute accent',
32 micro: 'Micro sign',
33 para: 'Pilcrow sign',
34 middot: 'Middle dot',
35 cedil: 'Cedilla',
36 sup1: 'Superscript one',
37 ordm: 'Masculine ordinal indicator',
38 raquo: 'Right-pointing double angle quotation mark',
39 frac14: 'Vulgar fraction one quarter',
40 frac12: 'Vulgar fraction one half',
41 frac34: 'Vulgar fraction three quarters',
42 iquest: 'Inverted question mark',
43 Agrave: 'Latin capital letter A with grave accent',
44 Aacute: 'Latin capital letter A with acute accent',
45 Acirc: 'Latin capital letter A with circumflex',
46 Atilde: 'Latin capital letter A with tilde',
47 Auml: 'Latin capital letter A with diaeresis',
48 Aring: 'Latin capital letter A with ring above',
49 AElig: 'Latin Capital letter Æ',
50 Ccedil: 'Latin capital letter C with cedilla',
51 Egrave: 'Latin capital letter E with grave accent',
52 Eacute: 'Latin capital letter E with acute accent',
53 Ecirc: 'Latin capital letter E with circumflex',
54 Euml: 'Latin capital letter E with diaeresis',
55 Igrave: 'Latin capital letter I with grave accent',
56 Iacute: 'Latin capital letter I with acute accent',
57 Icirc: 'Latin capital letter I with circumflex',
58 Iuml: 'Latin capital letter I with diaeresis',
59 ETH: 'Latin capital letter Eth',
60 Ntilde: 'Latin capital letter N with tilde',
61 Ograve: 'Latin capital letter O with grave accent',
62 Oacute: 'Latin capital letter O with acute accent',
63 Ocirc: 'Latin capital letter O with circumflex',
64 Otilde: 'Latin capital letter O with tilde',
65 Ouml: 'Latin capital letter O with diaeresis',
66 times: 'Multiplication sign',
67 Oslash: 'Latin capital letter O with stroke',
68 Ugrave: 'Latin capital letter U with grave accent',
69 Uacute: 'Latin capital letter U with acute accent',
70 Ucirc: 'Latin capital letter U with circumflex',
71 Uuml: 'Latin capital letter U with diaeresis',
72 Yacute: 'Latin capital letter Y with acute accent',
73 THORN: 'Latin capital letter Thorn',
74 szlig: 'Latin small letter sharp s',
75 agrave: 'Latin small letter a with grave accent',
76 aacute: 'Latin small letter a with acute accent',
77 acirc: 'Latin small letter a with circumflex',
78 atilde: 'Latin small letter a with tilde',
79 auml: 'Latin small letter a with diaeresis',
80 aring: 'Latin small letter a with ring above',
81 aelig: 'Latin small letter æ',
82 ccedil: 'Latin small letter c with cedilla',
83 egrave: 'Latin small letter e with grave accent',
84 eacute: 'Latin small letter e with acute accent',
85 ecirc: 'Latin small letter e with circumflex',
86 euml: 'Latin small letter e with diaeresis',
87 igrave: 'Latin small letter i with grave accent',
88 iacute: 'Latin small letter i with acute accent',
89 icirc: 'Latin small letter i with circumflex',
90 iuml: 'Latin small letter i with diaeresis',
91 eth: 'Latin small letter eth',
92 ntilde: 'Latin small letter n with tilde',
93 ograve: 'Latin small letter o with grave accent',
94 oacute: 'Latin small letter o with acute accent',
95 ocirc: 'Latin small letter o with circumflex',
96 otilde: 'Latin small letter o with tilde',
97 ouml: 'Latin small letter o with diaeresis',
98 divide: 'Division sign',
99 oslash: 'Latin small letter o with stroke',
100 ugrave: 'Latin small letter u with grave accent',
101 uacute: 'Latin small letter u with acute accent',
102 ucirc: 'Latin small letter u with circumflex',
103 uuml: 'Latin small letter u with diaeresis',
104 yacute: 'Latin small letter y with acute accent',
105 thorn: 'Latin small letter thorn',
106 yuml: 'Latin small letter y with diaeresis',
107 OElig: 'Latin capital ligature OE',
108 oelig: 'Latin small ligature oe',
109 '372': 'Latin capital letter W with circumflex',
110 '374': 'Latin capital letter Y with circumflex',
111 '373': 'Latin small letter w with circumflex',
112 '375': 'Latin small letter y with circumflex',
113 sbquo: 'Single low-9 quotation mark',
114 '8219': 'Single high-reversed-9 quotation mark',
115 bdquo: 'Double low-9 quotation mark',
116 hellip: 'Horizontal ellipsis',
117 trade: 'Trade mark sign',
118 '9658': 'Black right-pointing pointer',
119 bull: 'Bullet',
120 rarr: 'Rightwards arrow',
121 rArr: 'Rightwards double arrow',
122 hArr: 'Left right double arrow',
123 diams: 'Black diamond suit',
124 asymp: 'Almost equal to'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/eo.js b/sources/plugins/specialchar/dialogs/lang/eo.js
new file mode 100644
index 00000000..dc85231e
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/eo.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'eo', {
7 euro: 'Eŭrosigno',
8 lsquo: 'Supra 6-citilo',
9 rsquo: 'Supra 9-citilo',
10 ldquo: 'Supra 66-citilo',
11 rdquo: 'Supra 99-citilo',
12 ndash: 'Streketo',
13 mdash: 'Substreko',
14 iexcl: 'Renversita krisigno',
15 cent: 'Cendosigno',
16 pound: 'Pundosigno',
17 curren: 'Monersigno',
18 yen: 'Enosigno',
19 brvbar: 'Rompita vertikala streko',
20 sect: 'Kurba paragrafo',
21 uml: 'Tremao',
22 copy: 'Kopirajtosigno',
23 ordf: 'Adjektiva numerfinaĵo',
24 laquo: 'Duobla malplio-citilo',
25 not: 'Negohoko',
26 reg: 'Registrita marko',
27 macr: 'Superstreko',
28 deg: 'Gradosigno',
29 sup2: 'Supra indico 2',
30 sup3: 'Supra indico 3',
31 acute: 'Dekstra korno',
32 micro: 'Mikrosigno',
33 para: 'Rekta paragrafo',
34 middot: 'Meza punkto',
35 cedil: 'Zoeto',
36 sup1: 'Supra indico 1',
37 ordm: 'Substantiva numerfinaĵo',
38 raquo: 'Duobla plio-citilo',
39 frac14: 'Kvaronosigno',
40 frac12: 'Duonosigno',
41 frac34: 'Trikvaronosigno',
42 iquest: 'renversita demandosigno',
43 Agrave: 'Latina ĉeflitero A kun liva korno',
44 Aacute: 'Latina ĉeflitero A kun dekstra korno',
45 Acirc: 'Latina ĉeflitero A kun ĉapelo',
46 Atilde: 'Latina ĉeflitero A kun tildo',
47 Auml: 'Latina ĉeflitero A kun tremao',
48 Aring: 'Latina ĉeflitero A kun superringo',
49 AElig: 'Latina ĉeflitera ligaturo Æ',
50 Ccedil: 'Latina ĉeflitero C kun zoeto',
51 Egrave: 'Latina ĉeflitero E kun liva korno',
52 Eacute: 'Latina ĉeflitero E kun dekstra korno',
53 Ecirc: 'Latina ĉeflitero E kun ĉapelo',
54 Euml: 'Latina ĉeflitero E kun tremao',
55 Igrave: 'Latina ĉeflitero I kun liva korno',
56 Iacute: 'Latina ĉeflitero I kun dekstra korno',
57 Icirc: 'Latina ĉeflitero I kun ĉapelo',
58 Iuml: 'Latina ĉeflitero I kun tremao',
59 ETH: 'Latina ĉeflitero islanda edo',
60 Ntilde: 'Latina ĉeflitero N kun tildo',
61 Ograve: 'Latina ĉeflitero O kun liva korno',
62 Oacute: 'Latina ĉeflitero O kun dekstra korno',
63 Ocirc: 'Latina ĉeflitero O kun ĉapelo',
64 Otilde: 'Latina ĉeflitero O kun tildo',
65 Ouml: 'Latina ĉeflitero O kun tremao',
66 times: 'Multipliko',
67 Oslash: 'Latina ĉeflitero O trastrekita',
68 Ugrave: 'Latina ĉeflitero U kun liva korno',
69 Uacute: 'Latina ĉeflitero U kun dekstra korno',
70 Ucirc: 'Latina ĉeflitero U kun ĉapelo',
71 Uuml: 'Latina ĉeflitero U kun tremao',
72 Yacute: 'Latina ĉeflitero Y kun dekstra korno',
73 THORN: 'Latina ĉeflitero islanda dorno',
74 szlig: 'Latina etlitero germana sozo (akra s)',
75 agrave: 'Latina etlitero a kun liva korno',
76 aacute: 'Latina etlitero a kun dekstra korno',
77 acirc: 'Latina etlitero a kun ĉapelo',
78 atilde: 'Latina etlitero a kun tildo',
79 auml: 'Latina etlitero a kun tremao',
80 aring: 'Latina etlitero a kun superringo',
81 aelig: 'Latina etlitera ligaturo æ',
82 ccedil: 'Latina etlitero c kun zoeto',
83 egrave: 'Latina etlitero e kun liva korno',
84 eacute: 'Latina etlitero e kun dekstra korno',
85 ecirc: 'Latina etlitero e kun ĉapelo',
86 euml: 'Latina etlitero e kun tremao',
87 igrave: 'Latina etlitero i kun liva korno',
88 iacute: 'Latina etlitero i kun dekstra korno',
89 icirc: 'Latina etlitero i kun ĉapelo',
90 iuml: 'Latina etlitero i kun tremao',
91 eth: 'Latina etlitero islanda edo',
92 ntilde: 'Latina etlitero n kun tildo',
93 ograve: 'Latina etlitero o kun liva korno',
94 oacute: 'Latina etlitero o kun dekstra korno',
95 ocirc: 'Latina etlitero o kun ĉapelo',
96 otilde: 'Latina etlitero o kun tildo',
97 ouml: 'Latina etlitero o kun tremao',
98 divide: 'Dividosigno',
99 oslash: 'Latina etlitero o trastrekita',
100 ugrave: 'Latina etlitero u kun liva korno',
101 uacute: 'Latina etlitero u kun dekstra korno',
102 ucirc: 'Latina etlitero u kun ĉapelo',
103 uuml: 'Latina etlitero u kun tremao',
104 yacute: 'Latina etlitero y kun dekstra korno',
105 thorn: 'Latina etlitero islanda dorno',
106 yuml: 'Latina etlitero y kun tremao',
107 OElig: 'Latina ĉeflitera ligaturo Œ',
108 oelig: 'Latina etlitera ligaturo œ',
109 '372': 'Latina ĉeflitero W kun ĉapelo',
110 '374': 'Latina ĉeflitero Y kun ĉapelo',
111 '373': 'Latina etlitero w kun ĉapelo',
112 '375': 'Latina etlitero y kun ĉapelo',
113 sbquo: 'Suba 9-citilo',
114 '8219': 'Supra renversita 9-citilo',
115 bdquo: 'Suba 99-citilo',
116 hellip: 'Tripunkto',
117 trade: 'Varmarka signo',
118 '9658': 'Nigra sago dekstren',
119 bull: 'Bulmarko',
120 rarr: 'Sago dekstren',
121 rArr: 'Duobla sago dekstren',
122 hArr: 'Duobla sago maldekstren',
123 diams: 'Nigra kvadrato',
124 asymp: 'Preskaŭ egala'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/es.js b/sources/plugins/specialchar/dialogs/lang/es.js
new file mode 100644
index 00000000..60d3afaa
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/es.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'es', {
7 euro: 'Símbolo de euro',
8 lsquo: 'Comilla simple izquierda',
9 rsquo: 'Comilla simple derecha',
10 ldquo: 'Comilla doble izquierda',
11 rdquo: 'Comilla doble derecha',
12 ndash: 'Guión corto',
13 mdash: 'Guión medio largo',
14 iexcl: 'Signo de admiración invertido',
15 cent: 'Símbolo centavo',
16 pound: 'Símbolo libra',
17 curren: 'Símbolo moneda',
18 yen: 'Símbolo yen',
19 brvbar: 'Barra vertical rota',
20 sect: 'Símbolo sección',
21 uml: 'Diéresis',
22 copy: 'Signo de derechos de autor',
23 ordf: 'Indicador ordinal femenino',
24 laquo: 'Abre comillas angulares',
25 not: 'Signo negación',
26 reg: 'Signo de marca registrada',
27 macr: 'Guión alto',
28 deg: 'Signo de grado',
29 sup2: 'Superíndice dos',
30 sup3: 'Superíndice tres',
31 acute: 'Acento agudo',
32 micro: 'Signo micro',
33 para: 'Signo de pi',
34 middot: 'Punto medio',
35 cedil: 'Cedilla',
36 sup1: 'Superíndice uno',
37 ordm: 'Indicador orginal masculino',
38 raquo: 'Cierra comillas angulares',
39 frac14: 'Fracción ordinaria de un quarto',
40 frac12: 'Fracción ordinaria de una mitad',
41 frac34: 'Fracción ordinaria de tres cuartos',
42 iquest: 'Signo de interrogación invertido',
43 Agrave: 'Letra A latina mayúscula con acento grave',
44 Aacute: 'Letra A latina mayúscula con acento agudo',
45 Acirc: 'Letra A latina mayúscula con acento circunflejo',
46 Atilde: 'Letra A latina mayúscula con tilde',
47 Auml: 'Letra A latina mayúscula con diéresis',
48 Aring: 'Letra A latina mayúscula con aro arriba',
49 AElig: 'Letra Æ latina mayúscula',
50 Ccedil: 'Letra C latina mayúscula con cedilla',
51 Egrave: 'Letra E latina mayúscula con acento grave',
52 Eacute: 'Letra E latina mayúscula con acento agudo',
53 Ecirc: 'Letra E latina mayúscula con acento circunflejo',
54 Euml: 'Letra E latina mayúscula con diéresis',
55 Igrave: 'Letra I latina mayúscula con acento grave',
56 Iacute: 'Letra I latina mayúscula con acento agudo',
57 Icirc: 'Letra I latina mayúscula con acento circunflejo',
58 Iuml: 'Letra I latina mayúscula con diéresis',
59 ETH: 'Letra Eth latina mayúscula',
60 Ntilde: 'Letra N latina mayúscula con tilde',
61 Ograve: 'Letra O latina mayúscula con acento grave',
62 Oacute: 'Letra O latina mayúscula con acento agudo',
63 Ocirc: 'Letra O latina mayúscula con acento circunflejo',
64 Otilde: 'Letra O latina mayúscula con tilde',
65 Ouml: 'Letra O latina mayúscula con diéresis',
66 times: 'Signo de multiplicación',
67 Oslash: 'Letra O latina mayúscula con barra inclinada',
68 Ugrave: 'Letra U latina mayúscula con acento grave',
69 Uacute: 'Letra U latina mayúscula con acento agudo',
70 Ucirc: 'Letra U latina mayúscula con acento circunflejo',
71 Uuml: 'Letra U latina mayúscula con diéresis',
72 Yacute: 'Letra Y latina mayúscula con acento agudo',
73 THORN: 'Letra Thorn latina mayúscula',
74 szlig: 'Letra s latina fuerte pequeña',
75 agrave: 'Letra a latina pequeña con acento grave',
76 aacute: 'Letra a latina pequeña con acento agudo',
77 acirc: 'Letra a latina pequeña con acento circunflejo',
78 atilde: 'Letra a latina pequeña con tilde',
79 auml: 'Letra a latina pequeña con diéresis',
80 aring: 'Letra a latina pequeña con aro arriba',
81 aelig: 'Letra æ latina pequeña',
82 ccedil: 'Letra c latina pequeña con cedilla',
83 egrave: 'Letra e latina pequeña con acento grave',
84 eacute: 'Letra e latina pequeña con acento agudo',
85 ecirc: 'Letra e latina pequeña con acento circunflejo',
86 euml: 'Letra e latina pequeña con diéresis',
87 igrave: 'Letra i latina pequeña con acento grave',
88 iacute: 'Letra i latina pequeña con acento agudo',
89 icirc: 'Letra i latina pequeña con acento circunflejo',
90 iuml: 'Letra i latina pequeña con diéresis',
91 eth: 'Letra eth latina pequeña',
92 ntilde: 'Letra n latina pequeña con tilde',
93 ograve: 'Letra o latina pequeña con acento grave',
94 oacute: 'Letra o latina pequeña con acento agudo',
95 ocirc: 'Letra o latina pequeña con acento circunflejo',
96 otilde: 'Letra o latina pequeña con tilde',
97 ouml: 'Letra o latina pequeña con diéresis',
98 divide: 'Signo de división',
99 oslash: 'Letra o latina minúscula con barra inclinada',
100 ugrave: 'Letra u latina pequeña con acento grave',
101 uacute: 'Letra u latina pequeña con acento agudo',
102 ucirc: 'Letra u latina pequeña con acento circunflejo',
103 uuml: 'Letra u latina pequeña con diéresis',
104 yacute: 'Letra u latina pequeña con acento agudo',
105 thorn: 'Letra thorn latina minúscula',
106 yuml: 'Letra y latina pequeña con diéresis',
107 OElig: 'Diptongo OE latino en mayúscula',
108 oelig: 'Diptongo oe latino en minúscula',
109 '372': 'Letra W latina mayúscula con acento circunflejo',
110 '374': 'Letra Y latina mayúscula con acento circunflejo',
111 '373': 'Letra w latina pequeña con acento circunflejo',
112 '375': 'Letra y latina pequeña con acento circunflejo',
113 sbquo: 'Comilla simple baja-9',
114 '8219': 'Comilla simple alta invertida-9',
115 bdquo: 'Comillas dobles bajas-9',
116 hellip: 'Puntos suspensivos horizontales',
117 trade: 'Signo de marca registrada',
118 '9658': 'Apuntador negro apuntando a la derecha',
119 bull: 'Viñeta',
120 rarr: 'Flecha a la derecha',
121 rArr: 'Flecha doble a la derecha',
122 hArr: 'Flecha izquierda derecha doble',
123 diams: 'Diamante negro',
124 asymp: 'Casi igual a'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/et.js b/sources/plugins/specialchar/dialogs/lang/et.js
new file mode 100644
index 00000000..d0558ab2
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/et.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'et', {
7 euro: 'Euromärk',
8 lsquo: 'Alustav ühekordne jutumärk',
9 rsquo: 'Lõpetav ühekordne jutumärk',
10 ldquo: 'Alustav kahekordne jutumärk',
11 rdquo: 'Lõpetav kahekordne jutumärk',
12 ndash: 'Enn-kriips',
13 mdash: 'Emm-kriips',
14 iexcl: 'Pööratud hüüumärk',
15 cent: 'Sendimärk',
16 pound: 'Naela märk',
17 curren: 'Valuutamärk',
18 yen: 'Jeeni märk',
19 brvbar: 'Katkestatud kriips',
20 sect: 'Lõigu märk',
21 uml: 'Täpid',
22 copy: 'Autoriõiguse märk',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Ei-märk',
26 reg: 'Registered sign', // MISSING
27 macr: 'Macron', // MISSING
28 deg: 'Kraadimärk',
29 sup2: 'Ülaindeks kaks',
30 sup3: 'Ülaindeks kolm',
31 acute: 'Acute accent', // MISSING
32 micro: 'Mikro-märk',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Keskpunkt',
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Ülaindeks üks',
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Ladina suur A tildega',
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Täppidega ladina suur O',
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Kandilise katusega suur ladina U',
71 Uuml: 'Täppidega ladina suur U',
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Ladina väike terav s',
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Kandilise katusega ladina väike a',
78 atilde: 'Tildega ladina väike a',
79 auml: 'Täppidega ladina väike a',
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Jagamismärk',
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Kaubamärgi märk',
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Kuul',
120 rarr: 'Nool paremale',
121 rArr: 'Topeltnool paremale',
122 hArr: 'Topeltnool vasakule',
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Ligikaudu võrdne'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/eu.js b/sources/plugins/specialchar/dialogs/lang/eu.js
new file mode 100644
index 00000000..610d198f
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/eu.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'eu', {
7 euro: 'Euro zeinua',
8 lsquo: 'Left single quotation mark', // MISSING
9 rsquo: 'Right single quotation mark', // MISSING
10 ldquo: 'Left double quotation mark', // MISSING
11 rdquo: 'Right double quotation mark', // MISSING
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'Inverted exclamation mark', // MISSING
15 cent: 'Cent sign', // MISSING
16 pound: 'Pound sign', // MISSING
17 curren: 'Currency sign', // MISSING
18 yen: 'Yen sign', // MISSING
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Section sign', // MISSING
21 uml: 'Diaeresis', // MISSING
22 copy: 'Copyright sign', // MISSING
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Ez zeinua',
26 reg: 'Registered sign', // MISSING
27 macr: 'Macron', // MISSING
28 deg: 'Degree sign', // MISSING
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Micro sign', // MISSING
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/fa.js b/sources/plugins/specialchar/dialogs/lang/fa.js
new file mode 100644
index 00000000..0900de61
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/fa.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'fa', {
7 euro: 'نشان یورو',
8 lsquo: 'علامت نقل قول تکی چپ',
9 rsquo: 'علامت نقل قول تکی راست',
10 ldquo: 'علامت نقل قول دوتایی چپ',
11 rdquo: 'علامت نقل قول دوتایی راست',
12 ndash: 'خط تیره En',
13 mdash: 'خط تیره Em',
14 iexcl: 'علامت تعجب وارونه',
15 cent: 'نشان سنت',
16 pound: 'نشان پوند',
17 curren: 'نشان ارز',
18 yen: 'نشان ین',
19 brvbar: 'نوار شکسته',
20 sect: 'نشان بخش',
21 uml: 'نشان سواگیری',
22 copy: 'نشان کپی رایت',
23 ordf: 'شاخص ترتیبی مونث',
24 laquo: 'اشاره چپ مکرر برای زاویه علامت نقل قول',
25 not: 'نشان ثبت نشده',
26 reg: 'نشان ثبت شده',
27 macr: 'نشان خط بالای حرف',
28 deg: 'نشان درجه',
29 sup2: 'بالانویس دو',
30 sup3: 'بالانویس سه',
31 acute: 'لهجه غلیظ',
32 micro: 'نشان مایکرو',
33 para: 'نشان محل بند',
34 middot: 'نقطه میانی',
35 cedil: 'سدیل',
36 sup1: 'بالانویس 1',
37 ordm: 'شاخص ترتیبی مذکر',
38 raquo: 'نشان زاویه‌دار دوتایی نقل قول راست چین',
39 frac14: 'واحد عامیانه 1/4',
40 frac12: 'واحد عامینه نصف',
41 frac34: 'واحد عامیانه 3/4',
42 iquest: 'علامت سوال معکوس',
43 Agrave: 'حرف A بزرگ لاتین با تلفظ غلیظ',
44 Aacute: 'حرف A بزرگ لاتین با تلفظ شدید',
45 Acirc: 'حرف A بزرگ لاتین با دور',
46 Atilde: 'حرف A بزرگ لاتین با صدای کامی',
47 Auml: 'حرف A بزرگ لاتین با نشان سواگیری',
48 Aring: 'حرف A بزرگ لاتین با حلقه بالا',
49 AElig: 'حرف Æ بزرگ لاتین',
50 Ccedil: 'حرف C بزرگ لاتین با نشان سواگیری',
51 Egrave: 'حرف E بزرگ لاتین با تلفظ درشت',
52 Eacute: 'حرف E بزرگ لاتین با تلفظ زیر',
53 Ecirc: 'حرف E بزرگ لاتین با خمان',
54 Euml: 'حرف E بزرگ لاتین با نشان سواگیری',
55 Igrave: 'حرف I بزرگ لاتین با تلفظ درشت',
56 Iacute: 'حرف I بزرگ لاتین با تلفظ ریز',
57 Icirc: 'حرف I بزرگ لاتین با خمان',
58 Iuml: 'حرف I بزرگ لاتین با نشان سواگیری',
59 ETH: 'حرف لاتین بزرگ واکه ترتیبی',
60 Ntilde: 'حرف N بزرگ لاتین با مد',
61 Ograve: 'حرف O بزرگ لاتین با تلفظ درشت',
62 Oacute: 'حرف O بزرگ لاتین با تلفظ ریز',
63 Ocirc: 'حرف O بزرگ لاتین با خمان',
64 Otilde: 'حرف O بزرگ لاتین با مد',
65 Ouml: 'حرف O بزرگ لاتین با نشان سواگیری',
66 times: 'نشان ضربدر',
67 Oslash: 'حرف O بزرگ لاتین با میان خط',
68 Ugrave: 'حرف U بزرگ لاتین با تلفظ درشت',
69 Uacute: 'حرف U بزرگ لاتین با تلفظ ریز',
70 Ucirc: 'حرف U بزرگ لاتین با خمان',
71 Uuml: 'حرف U بزرگ لاتین با نشان سواگیری',
72 Yacute: 'حرف Y بزرگ لاتین با تلفظ ریز',
73 THORN: 'حرف بزرگ لاتین خاردار',
74 szlig: 'حرف کوچک لاتین شارپ s',
75 agrave: 'حرف a کوچک لاتین با تلفظ درشت',
76 aacute: 'حرف a کوچک لاتین با تلفظ ریز',
77 acirc: 'حرف a کوچک لاتین با خمان',
78 atilde: 'حرف a کوچک لاتین با صدای کامی',
79 auml: 'حرف a کوچک لاتین با نشان سواگیری',
80 aring: 'حرف a کوچک لاتین گوشواره دار',
81 aelig: 'حرف کوچک لاتین æ',
82 ccedil: 'حرف c کوچک لاتین با نشان سدیل',
83 egrave: 'حرف e کوچک لاتین با تلفظ درشت',
84 eacute: 'حرف e کوچک لاتین با تلفظ ریز',
85 ecirc: 'حرف e کوچک لاتین با خمان',
86 euml: 'حرف e کوچک لاتین با نشان سواگیری',
87 igrave: 'حرف i کوچک لاتین با تلفظ درشت',
88 iacute: 'حرف i کوچک لاتین با تلفظ ریز',
89 icirc: 'حرف i کوچک لاتین با خمان',
90 iuml: 'حرف i کوچک لاتین با نشان سواگیری',
91 eth: 'حرف کوچک لاتین eth',
92 ntilde: 'حرف n کوچک لاتین با صدای کامی',
93 ograve: 'حرف o کوچک لاتین با تلفظ درشت',
94 oacute: 'حرف o کوچک لاتین با تلفظ زیر',
95 ocirc: 'حرف o کوچک لاتین با خمان',
96 otilde: 'حرف o کوچک لاتین با صدای کامی',
97 ouml: 'حرف o کوچک لاتین با نشان سواگیری',
98 divide: 'نشان بخش',
99 oslash: 'حرف o کوچک لاتین با میان خط',
100 ugrave: 'حرف u کوچک لاتین با تلفظ درشت',
101 uacute: 'حرف u کوچک لاتین با تلفظ ریز',
102 ucirc: 'حرف u کوچک لاتین با خمان',
103 uuml: 'حرف u کوچک لاتین با نشان سواگیری',
104 yacute: 'حرف y کوچک لاتین با تلفظ ریز',
105 thorn: 'حرف کوچک لاتین خاردار',
106 yuml: 'حرف y کوچک لاتین با نشان سواگیری',
107 OElig: 'بند بزرگ لاتین OE',
108 oelig: 'بند کوچک لاتین oe',
109 '372': 'حرف W بزرگ لاتین با خمان',
110 '374': 'حرف Y بزرگ لاتین با خمان',
111 '373': 'حرف w کوچک لاتین با خمان',
112 '375': 'حرف y کوچک لاتین با خمان',
113 sbquo: 'نشان نقل قول تکی زیر-9',
114 '8219': 'نشان نقل قول تکی high-reversed-9',
115 bdquo: 'نقل قول دوتایی پایین-9',
116 hellip: 'حذف افقی',
117 trade: 'نشان تجاری',
118 '9658': 'نشانگر سیاه جهت راست',
119 bull: 'گلوله',
120 rarr: 'فلش راست',
121 rArr: 'فلش دوتایی راست',
122 hArr: 'فلش دوتایی چپ راست',
123 diams: 'نشان الماس سیاه',
124 asymp: 'تقریبا برابر با'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/fi.js b/sources/plugins/specialchar/dialogs/lang/fi.js
new file mode 100644
index 00000000..92606253
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/fi.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'fi', {
7 euro: 'Euron merkki',
8 lsquo: 'Vasen yksittäinen lainausmerkki',
9 rsquo: 'Oikea yksittäinen lainausmerkki',
10 ldquo: 'Vasen kaksoislainausmerkki',
11 rdquo: 'Oikea kaksoislainausmerkki',
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'Inverted exclamation mark', // MISSING
15 cent: 'Sentin merkki',
16 pound: 'Punnan merkki',
17 curren: 'Valuuttamerkki',
18 yen: 'Yenin merkki',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Section sign', // MISSING
21 uml: 'Diaeresis', // MISSING
22 copy: 'Copyright sign', // MISSING
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Not sign', // MISSING
26 reg: 'Rekisteröity merkki',
27 macr: 'Macron', // MISSING
28 deg: 'Asteen merkki',
29 sup2: 'Yläindeksi kaksi',
30 sup3: 'Yläindeksi kolme',
31 acute: 'Acute accent', // MISSING
32 micro: 'Mikron merkki',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Yläindeksi yksi',
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Ylösalaisin oleva kysymysmerkki',
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Kertomerkki',
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Jakomerkki',
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Tavaramerkki merkki',
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Nuoli oikealle',
121 rArr: 'Kaksoisnuoli oikealle',
122 hArr: 'Kaksoisnuoli oikealle ja vasemmalle',
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Noin'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/fr-ca.js b/sources/plugins/specialchar/dialogs/lang/fr-ca.js
new file mode 100644
index 00000000..6be36acd
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/fr-ca.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'fr-ca', {
7 euro: 'Symbole Euro',
8 lsquo: 'Guillemet simple ouvrant',
9 rsquo: 'Guillemet simple fermant',
10 ldquo: 'Guillemet double ouvrant',
11 rdquo: 'Guillemet double fermant',
12 ndash: 'Tiret haut',
13 mdash: 'Tiret',
14 iexcl: 'Point d\'exclamation inversé',
15 cent: 'Symbole de cent',
16 pound: 'Symbole de Livre Sterling',
17 curren: 'Symbole monétaire',
18 yen: 'Symbole du Yen',
19 brvbar: 'Barre scindée',
20 sect: 'Symbole de section',
21 uml: 'Tréma',
22 copy: 'Symbole de copyright',
23 ordf: 'Indicateur ordinal féminin',
24 laquo: 'Guillemet français ouvrant',
25 not: 'Indicateur de négation',
26 reg: 'Symbole de marque déposée',
27 macr: 'Macron',
28 deg: 'Degré',
29 sup2: 'Exposant 2',
30 sup3: 'Exposant 3',
31 acute: 'Accent aigüe',
32 micro: 'Symbole micro',
33 para: 'Paragraphe',
34 middot: 'Point médian',
35 cedil: 'Cédille',
36 sup1: 'Exposant 1',
37 ordm: 'Indicateur ordinal masculin',
38 raquo: 'Guillemet français fermant',
39 frac14: 'Un quart',
40 frac12: 'Une demi',
41 frac34: 'Trois quart',
42 iquest: 'Point d\'interrogation inversé',
43 Agrave: 'A accent grave',
44 Aacute: 'A accent aigüe',
45 Acirc: 'A circonflexe',
46 Atilde: 'A tilde',
47 Auml: 'A tréma',
48 Aring: 'A avec un rond au dessus',
49 AElig: 'Æ majuscule',
50 Ccedil: 'C cédille',
51 Egrave: 'E accent grave',
52 Eacute: 'E accent aigüe',
53 Ecirc: 'E accent circonflexe',
54 Euml: 'E tréma',
55 Igrave: 'I accent grave',
56 Iacute: 'I accent aigüe',
57 Icirc: 'I accent circonflexe',
58 Iuml: 'I tréma',
59 ETH: 'Lettre majuscule islandaise ED',
60 Ntilde: 'N tilde',
61 Ograve: 'O accent grave',
62 Oacute: 'O accent aigüe',
63 Ocirc: 'O accent circonflexe',
64 Otilde: 'O tilde',
65 Ouml: 'O tréma',
66 times: 'Symbole de multiplication',
67 Oslash: 'O barré',
68 Ugrave: 'U accent grave',
69 Uacute: 'U accent aigüe',
70 Ucirc: 'U accent circonflexe',
71 Uuml: 'U tréma',
72 Yacute: 'Y accent aigüe',
73 THORN: 'Lettre islandaise Thorn majuscule',
74 szlig: 'Lettre minuscule allemande s dur',
75 agrave: 'a accent grave',
76 aacute: 'a accent aigüe',
77 acirc: 'a accent circonflexe',
78 atilde: 'a tilde',
79 auml: 'a tréma',
80 aring: 'a avec un cercle au dessus',
81 aelig: 'æ',
82 ccedil: 'c cédille',
83 egrave: 'e accent grave',
84 eacute: 'e accent aigüe',
85 ecirc: 'e accent circonflexe',
86 euml: 'e tréma',
87 igrave: 'i accent grave',
88 iacute: 'i accent aigüe',
89 icirc: 'i accent circonflexe',
90 iuml: 'i tréma',
91 eth: 'Lettre minuscule islandaise ED',
92 ntilde: 'n tilde',
93 ograve: 'o accent grave',
94 oacute: 'o accent aigüe',
95 ocirc: 'O accent circonflexe',
96 otilde: 'O tilde',
97 ouml: 'O tréma',
98 divide: 'Symbole de division',
99 oslash: 'o barré',
100 ugrave: 'u accent grave',
101 uacute: 'u accent aigüe',
102 ucirc: 'u accent circonflexe',
103 uuml: 'u tréma',
104 yacute: 'y accent aigüe',
105 thorn: 'Lettre islandaise thorn minuscule',
106 yuml: 'y tréma',
107 OElig: 'ligature majuscule latine Œ',
108 oelig: 'ligature minuscule latine œ',
109 '372': 'W accent circonflexe',
110 '374': 'Y accent circonflexe',
111 '373': 'w accent circonflexe',
112 '375': 'y accent circonflexe',
113 sbquo: 'Guillemet simple fermant',
114 '8219': 'Guillemet-virgule supérieur culbuté',
115 bdquo: 'Guillemet-virgule double inférieur',
116 hellip: 'Points de suspension',
117 trade: 'Symbole de marque déposée',
118 '9658': 'Flèche noire pointant vers la droite',
119 bull: 'Puce',
120 rarr: 'Flèche vers la droite',
121 rArr: 'Flèche double vers la droite',
122 hArr: 'Flèche double vers la gauche',
123 diams: 'Carreau',
124 asymp: 'Presque égal'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/fr.js b/sources/plugins/specialchar/dialogs/lang/fr.js
new file mode 100644
index 00000000..c2f806f8
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/fr.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'fr', {
7 euro: 'Symbole Euro',
8 lsquo: 'Guillemet simple ouvrant',
9 rsquo: 'Guillemet simple fermant',
10 ldquo: 'Guillemet double ouvrant',
11 rdquo: 'Guillemet double fermant',
12 ndash: 'Tiret haut',
13 mdash: 'Tiret cadratin',
14 iexcl: 'Point d\'exclamation inversé',
15 cent: 'Symbole Cent',
16 pound: 'Symbole Livre Sterling',
17 curren: 'Symbole monétaire',
18 yen: 'Symbole Yen',
19 brvbar: 'Barre verticale scindée',
20 sect: 'Section',
21 uml: 'Tréma',
22 copy: 'Symbole Copyright',
23 ordf: 'Indicateur ordinal féminin',
24 laquo: 'Guillemet français ouvrant',
25 not: 'Crochet de négation',
26 reg: 'Marque déposée',
27 macr: 'Macron',
28 deg: 'Degré',
29 sup2: 'Exposant 2',
30 sup3: 'Exposant 3',
31 acute: 'Accent aigu',
32 micro: 'Omicron',
33 para: 'Paragraphe',
34 middot: 'Point médian',
35 cedil: 'Cédille',
36 sup1: 'Exposant 1',
37 ordm: 'Indicateur ordinal masculin',
38 raquo: 'Guillemet français fermant',
39 frac14: 'Un quart',
40 frac12: 'Un demi',
41 frac34: 'Trois quarts',
42 iquest: 'Point d\'interrogation inversé',
43 Agrave: 'A majuscule accent grave',
44 Aacute: 'A majuscule accent aigu',
45 Acirc: 'A majuscule accent circonflexe',
46 Atilde: 'A majuscule avec caron',
47 Auml: 'A majuscule tréma',
48 Aring: 'A majuscule avec un rond au-dessus',
49 AElig: 'Æ majuscule ligaturés',
50 Ccedil: 'C majuscule cédille',
51 Egrave: 'E majuscule accent grave',
52 Eacute: 'E majuscule accent aigu',
53 Ecirc: 'E majuscule accent circonflexe',
54 Euml: 'E majuscule tréma',
55 Igrave: 'I majuscule accent grave',
56 Iacute: 'I majuscule accent aigu',
57 Icirc: 'I majuscule accent circonflexe',
58 Iuml: 'I majuscule tréma',
59 ETH: 'Lettre majuscule islandaise ED',
60 Ntilde: 'N majuscule avec caron',
61 Ograve: 'O majuscule accent grave',
62 Oacute: 'O majuscule accent aigu',
63 Ocirc: 'O majuscule accent circonflexe',
64 Otilde: 'O majuscule avec caron',
65 Ouml: 'O majuscule tréma',
66 times: 'Multiplication',
67 Oslash: 'O majuscule barré',
68 Ugrave: 'U majuscule accent grave',
69 Uacute: 'U majuscule accent aigu',
70 Ucirc: 'U majuscule accent circonflexe',
71 Uuml: 'U majuscule tréma',
72 Yacute: 'Y majuscule accent aigu',
73 THORN: 'Lettre islandaise Thorn majuscule',
74 szlig: 'Lettre minuscule allemande s dur',
75 agrave: 'a minuscule accent grave',
76 aacute: 'a minuscule accent aigu',
77 acirc: 'a minuscule accent circonflexe',
78 atilde: 'a minuscule avec caron',
79 auml: 'a minuscule tréma',
80 aring: 'a minuscule avec un rond au-dessus',
81 aelig: 'æ minuscule ligaturés',
82 ccedil: 'c minuscule cédille',
83 egrave: 'e minuscule accent grave',
84 eacute: 'e minuscule accent aigu',
85 ecirc: 'e minuscule accent circonflexe',
86 euml: 'e minuscule tréma',
87 igrave: 'i minuscule accent grave',
88 iacute: 'i minuscule accent aigu',
89 icirc: 'i minuscule accent circonflexe',
90 iuml: 'i minuscule tréma',
91 eth: 'Lettre minuscule islandaise ED',
92 ntilde: 'n minuscule avec caron',
93 ograve: 'o minuscule accent grave',
94 oacute: 'o minuscule accent aigu',
95 ocirc: 'o minuscule accent circonflexe',
96 otilde: 'o minuscule avec caron',
97 ouml: 'o minuscule tréma',
98 divide: 'Division',
99 oslash: 'o minuscule barré',
100 ugrave: 'u minuscule accent grave',
101 uacute: 'u minuscule accent aigu',
102 ucirc: 'u minuscule accent circonflexe',
103 uuml: 'u minuscule tréma',
104 yacute: 'y minuscule accent aigu',
105 thorn: 'Lettre islandaise thorn minuscule',
106 yuml: 'y minuscule tréma',
107 OElig: 'ligature majuscule latine Œ',
108 oelig: 'ligature minuscule latine œ',
109 '372': 'W majuscule accent circonflexe',
110 '374': 'Y majuscule accent circonflexe',
111 '373': 'w minuscule accent circonflexe',
112 '375': 'y minuscule accent circonflexe',
113 sbquo: 'Guillemet simple fermant (anglais)',
114 '8219': 'Guillemet-virgule supérieur culbuté',
115 bdquo: 'Guillemet-virgule double inférieur',
116 hellip: 'Points de suspension',
117 trade: 'Marque commerciale (trade mark)',
118 '9658': 'Flèche noire pointant vers la droite',
119 bull: 'Gros point médian',
120 rarr: 'Flèche vers la droite',
121 rArr: 'Double flèche vers la droite',
122 hArr: 'Double flèche vers la gauche',
123 diams: 'Carreau noir',
124 asymp: 'Presque égal'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/gl.js b/sources/plugins/specialchar/dialogs/lang/gl.js
new file mode 100644
index 00000000..7ada3dae
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/gl.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'gl', {
7 euro: 'Símbolo do euro',
8 lsquo: 'Comiña simple esquerda',
9 rsquo: 'Comiña simple dereita',
10 ldquo: 'Comiñas dobres esquerda',
11 rdquo: 'Comiñas dobres dereita',
12 ndash: 'Guión',
13 mdash: 'Raia',
14 iexcl: 'Signo de admiración invertido',
15 cent: 'Símbolo do centavo',
16 pound: 'Símbolo da libra',
17 curren: 'Símbolo de moeda',
18 yen: 'Símbolo do yen',
19 brvbar: 'Barra vertical rota',
20 sect: 'Símbolo de sección',
21 uml: 'Diérese',
22 copy: 'Símbolo de dereitos de autoría',
23 ordf: 'Indicador ordinal feminino',
24 laquo: 'Comiñas latinas, apertura',
25 not: 'Signo negación',
26 reg: 'Símbolo de marca rexistrada',
27 macr: 'Guión alto',
28 deg: 'Signo de grao',
29 sup2: 'Superíndice dous',
30 sup3: 'Superíndice tres',
31 acute: 'Acento agudo',
32 micro: 'Signo de micro',
33 para: 'Signo de pi',
34 middot: 'Punto medio',
35 cedil: 'Cedilla',
36 sup1: 'Superíndice un',
37 ordm: 'Indicador ordinal masculino',
38 raquo: 'Comiñas latinas, peche',
39 frac14: 'Fracción ordinaria de un cuarto',
40 frac12: 'Fracción ordinaria de un medio',
41 frac34: 'Fracción ordinaria de tres cuartos',
42 iquest: 'Signo de interrogación invertido',
43 Agrave: 'Letra A latina maiúscula con acento grave',
44 Aacute: 'Letra A latina maiúscula con acento agudo',
45 Acirc: 'Letra A latina maiúscula con acento circunflexo',
46 Atilde: 'Letra A latina maiúscula con til',
47 Auml: 'Letra A latina maiúscula con diérese',
48 Aring: 'Letra A latina maiúscula con aro enriba',
49 AElig: 'Letra Æ latina maiúscula',
50 Ccedil: 'Letra C latina maiúscula con cedilla',
51 Egrave: 'Letra E latina maiúscula con acento grave',
52 Eacute: 'Letra E latina maiúscula con acento agudo',
53 Ecirc: 'Letra E latina maiúscula con acento circunflexo',
54 Euml: 'Letra E latina maiúscula con diérese',
55 Igrave: 'Letra I latina maiúscula con acento grave',
56 Iacute: 'Letra I latina maiúscula con acento agudo',
57 Icirc: 'Letra I latina maiúscula con acento circunflexo',
58 Iuml: 'Letra I latina maiúscula con diérese',
59 ETH: 'Letra Ed latina maiúscula',
60 Ntilde: 'Letra N latina maiúscula con til',
61 Ograve: 'Letra O latina maiúscula con acento grave',
62 Oacute: 'Letra O latina maiúscula con acento agudo',
63 Ocirc: 'Letra O latina maiúscula con acento circunflexo',
64 Otilde: 'Letra O latina maiúscula con til',
65 Ouml: 'Letra O latina maiúscula con diérese',
66 times: 'Signo de multiplicación',
67 Oslash: 'Letra O latina maiúscula con barra transversal',
68 Ugrave: 'Letra U latina maiúscula con acento grave',
69 Uacute: 'Letra U latina maiúscula con acento agudo',
70 Ucirc: 'Letra U latina maiúscula con acento circunflexo',
71 Uuml: 'Letra U latina maiúscula con diérese',
72 Yacute: 'Letra Y latina maiúscula con acento agudo',
73 THORN: 'Letra Thorn latina maiúscula',
74 szlig: 'Letra s latina forte minúscula',
75 agrave: 'Letra a latina minúscula con acento grave',
76 aacute: 'Letra a latina minúscula con acento agudo',
77 acirc: 'Letra a latina minúscula con acento circunflexo',
78 atilde: 'Letra a latina minúscula con til',
79 auml: 'Letra a latina minúscula con diérese',
80 aring: 'Letra a latina minúscula con aro enriba',
81 aelig: 'Letra æ latina minúscula',
82 ccedil: 'Letra c latina minúscula con cedilla',
83 egrave: 'Letra e latina minúscula con acento grave',
84 eacute: 'Letra e latina minúscula con acento agudo',
85 ecirc: 'Letra e latina minúscula con acento circunflexo',
86 euml: 'Letra e latina minúscula con diérese',
87 igrave: 'Letra i latina minúscula con acento grave',
88 iacute: 'Letra i latina minúscula con acento agudo',
89 icirc: 'Letra i latina minúscula con acento circunflexo',
90 iuml: 'Letra i latina minúscula con diérese',
91 eth: 'Letra ed latina minúscula',
92 ntilde: 'Letra n latina minúscula con til',
93 ograve: 'Letra o latina minúscula con acento grave',
94 oacute: 'Letra o latina minúscula con acento agudo',
95 ocirc: 'Letra o latina minúscula con acento circunflexo',
96 otilde: 'Letra o latina minúscula con til',
97 ouml: 'Letra o latina minúscula con diérese',
98 divide: 'Signo de división',
99 oslash: 'Letra o latina minúscula con barra transversal',
100 ugrave: 'Letra u latina minúscula con acento grave',
101 uacute: 'Letra u latina minúscula con acento agudo',
102 ucirc: 'Letra u latina minúscula con acento circunflexo',
103 uuml: 'Letra u latina minúscula con diérese',
104 yacute: 'Letra y latina minúscula con acento agudo',
105 thorn: 'Letra Thorn latina minúscula',
106 yuml: 'Letra y latina minúscula con diérese',
107 OElig: 'Ligadura OE latina maiúscula',
108 oelig: 'Ligadura oe latina minúscula',
109 '372': 'Letra W latina maiúscula con acento circunflexo',
110 '374': 'Letra Y latina maiúscula con acento circunflexo',
111 '373': 'Letra w latina minúscula con acento circunflexo',
112 '375': 'Letra y latina minúscula con acento circunflexo',
113 sbquo: 'Comiña simple baixa, de apertura',
114 '8219': 'Comiña simple alta, de peche',
115 bdquo: 'Comiñas dobres baixas, de apertura',
116 hellip: 'Elipse, puntos suspensivos',
117 trade: 'Signo de marca rexistrada',
118 '9658': 'Apuntador negro apuntando á dereita',
119 bull: 'Viñeta',
120 rarr: 'Frecha á dereita',
121 rArr: 'Frecha dobre á dereita',
122 hArr: 'Frecha dobre da esquerda á dereita',
123 diams: 'Diamante negro',
124 asymp: 'Case igual a'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/he.js b/sources/plugins/specialchar/dialogs/lang/he.js
new file mode 100644
index 00000000..392fa78c
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/he.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'he', {
7 euro: 'יורו',
8 lsquo: 'סימן ציטוט יחיד שמאלי',
9 rsquo: 'סימן ציטוט יחיד ימני',
10 ldquo: 'סימן ציטוט כפול שמאלי',
11 rdquo: 'סימן ציטוט כפול ימני',
12 ndash: 'קו מפריד קצר',
13 mdash: 'קו מפריד ארוך',
14 iexcl: 'סימן קריאה הפוך',
15 cent: 'סנט',
16 pound: 'פאונד',
17 curren: 'מטבע',
18 yen: 'ין',
19 brvbar: 'קו שבור',
20 sect: 'סימן מקטע',
21 uml: 'שתי נקודות אופקיות (Diaeresis)',
22 copy: 'סימן זכויות יוצרים (Copyright)',
23 ordf: 'סימן אורדינאלי נקבי',
24 laquo: 'סימן ציטוט זווית כפולה לשמאל',
25 not: 'סימן שלילה מתמטי',
26 reg: 'סימן רשום',
27 macr: 'מקרון (הגיה ארוכה)',
28 deg: 'מעלות',
29 sup2: '2 בכתיב עילי',
30 sup3: '3 בכתיב עילי',
31 acute: 'סימן דגוש (Acute)',
32 micro: 'מיקרו',
33 para: 'סימון פסקה',
34 middot: 'נקודה אמצעית',
35 cedil: 'סדיליה',
36 sup1: '1 בכתיב עילי',
37 ordm: 'סימן אורדינאלי זכרי',
38 raquo: 'סימן ציטוט זווית כפולה לימין',
39 frac14: 'רבע בשבר פשוט',
40 frac12: 'חצי בשבר פשוט',
41 frac34: 'שלושה רבעים בשבר פשוט',
42 iquest: 'סימן שאלה הפוך',
43 Agrave: 'אות לטינית A עם גרש (Grave)',
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'אות לטינית Æ גדולה',
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'אות לטינית E עם גרש (Grave)',
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'אות לטינית I עם גרש (Grave)',
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'אות לטינית Eth גדולה',
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'אות לטינית O עם גרש (Grave)',
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'סימן כפל',
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'אות לטינית U עם גרש (Grave)',
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'אות לטינית Thorn גדולה',
74 szlig: 'אות לטינית s חדה קטנה',
75 agrave: 'אות לטינית a עם גרש (Grave)',
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'אות לטינית æ קטנה',
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'אות לטינית e עם גרש (Grave)',
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'אות לטינית i עם גרש (Grave)',
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'אות לטינית eth קטנה',
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'אות לטינית o עם גרש (Grave)',
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'סימן חלוקה',
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'אות לטינית u עם גרש (Grave)',
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'אות לטינית thorn קטנה',
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'סימן ציטוט נמוך יחיד',
114 '8219': 'סימן ציטוט',
115 bdquo: 'סימן ציטוט נמוך כפול',
116 hellip: 'שלוש נקודות',
117 trade: 'סימן טריידמארק',
118 '9658': 'סמן שחור לצד ימין',
119 bull: 'תבליט (רשימה)',
120 rarr: 'חץ לימין',
121 rArr: 'חץ כפול לימין',
122 hArr: 'חץ כפול לימין ושמאל',
123 diams: 'יהלום מלא',
124 asymp: 'כמעט שווה'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/hr.js b/sources/plugins/specialchar/dialogs/lang/hr.js
new file mode 100644
index 00000000..f248bbfe
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/hr.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'hr', {
7 euro: 'Euro znak',
8 lsquo: 'Lijevi jednostruki navodnik',
9 rsquo: 'Desni jednostruki navodnik',
10 ldquo: 'Lijevi dvostruki navodnik',
11 rdquo: 'Desni dvostruki navodnik',
12 ndash: 'En crtica',
13 mdash: 'Em crtica',
14 iexcl: 'Naopaki uskličnik',
15 cent: 'Cent znak',
16 pound: 'Funta znak',
17 curren: 'Znak valute',
18 yen: 'Yen znak',
19 brvbar: 'Potrgana prečka',
20 sect: 'Znak odjeljka',
21 uml: 'Prijeglasi',
22 copy: 'Copyright znak',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Lijevi dvostruki uglati navodnik',
25 not: 'Not znak',
26 reg: 'Registered znak',
27 macr: 'Macron', // MISSING
28 deg: 'Stupanj znak',
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Mikro znak',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Srednja točka',
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Desni dvostruku uglati navodnik',
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Naopaki upitnik',
43 Agrave: 'Veliko latinsko slovo A s akcentom',
44 Aacute: 'Latinično veliko slovo A sa oštrim naglaskom',
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/hu.js b/sources/plugins/specialchar/dialogs/lang/hu.js
new file mode 100644
index 00000000..14125deb
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/hu.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'hu', {
7 euro: 'Euró jel',
8 lsquo: 'Bal szimpla idézőjel',
9 rsquo: 'Jobb szimpla idézőjel',
10 ldquo: 'Bal dupla idézőjel',
11 rdquo: 'Jobb dupla idézőjel',
12 ndash: 'Rövid gondolatjel',
13 mdash: 'Hosszú gondolatjel',
14 iexcl: 'Fordított felkiáltójel',
15 cent: 'Cent jel',
16 pound: 'Font jel',
17 curren: 'Valuta jel',
18 yen: 'Yen jel',
19 brvbar: 'Hosszú kettőspont',
20 sect: 'Paragrafus jel',
21 uml: 'Kettős hangzó jel',
22 copy: 'Szerzői jog jel',
23 ordf: 'Női sorrend mutatója',
24 laquo: 'Balra mutató duplanyíl',
25 not: 'Feltételes kötőjel',
26 reg: 'Bejegyzett védjegy jele',
27 macr: 'Hosszúsági jel',
28 deg: 'Fok jel',
29 sup2: 'Négyzeten jel',
30 sup3: 'Köbön jel',
31 acute: 'Éles ékezet',
32 micro: 'Mikro-jel',
33 para: 'Bekezdés jel',
34 middot: 'Közép pont',
35 cedil: 'Cédille',
36 sup1: 'Elsőn jel',
37 ordm: 'Férfi sorrend mutatója',
38 raquo: 'Jobbra mutató duplanyíl',
39 frac14: 'Egy negyed jel',
40 frac12: 'Egy ketted jel',
41 frac34: 'Három negyed jel',
42 iquest: 'Fordított kérdőjel',
43 Agrave: 'Latin nagy A fordított ékezettel',
44 Aacute: 'Latin nagy A normál ékezettel',
45 Acirc: 'Latin nagy A hajtott ékezettel',
46 Atilde: 'Latin nagy A hullámjellel',
47 Auml: 'Latin nagy A kettőspont ékezettel',
48 Aring: 'Latin nagy A gyűrű ékezettel',
49 AElig: 'Latin nagy Æ betű',
50 Ccedil: 'Latin nagy C cedillával',
51 Egrave: 'Latin nagy E fordított ékezettel',
52 Eacute: 'Latin nagy E normál ékezettel',
53 Ecirc: 'Latin nagy E hajtott ékezettel',
54 Euml: 'Latin nagy E dupla kettőspont ékezettel',
55 Igrave: 'Latin nagy I fordított ékezettel',
56 Iacute: 'Latin nagy I normál ékezettel',
57 Icirc: 'Latin nagy I hajtott ékezettel',
58 Iuml: 'Latin nagy I kettőspont ékezettel',
59 ETH: 'Latin nagy Eth betű',
60 Ntilde: 'Latin nagy N hullámjellel',
61 Ograve: 'Latin nagy O fordított ékezettel',
62 Oacute: 'Latin nagy O normál ékezettel',
63 Ocirc: 'Latin nagy O hajtott ékezettel',
64 Otilde: 'Latin nagy O hullámjellel',
65 Ouml: 'Latin nagy O kettőspont ékezettel',
66 times: 'Szorzás jel',
67 Oslash: 'Latin O betű áthúzással',
68 Ugrave: 'Latin nagy U fordított ékezettel',
69 Uacute: 'Latin nagy U normál ékezettel',
70 Ucirc: 'Latin nagy U hajtott ékezettel',
71 Uuml: 'Latin nagy U kettőspont ékezettel',
72 Yacute: 'Latin nagy Y normál ékezettel',
73 THORN: 'Latin nagy Thorn betű',
74 szlig: 'Latin kis s betű',
75 agrave: 'Latin kis a fordított ékezettel',
76 aacute: 'Latin kis a normál ékezettel',
77 acirc: 'Latin kis a hajtott ékezettel',
78 atilde: 'Latin kis a hullámjellel',
79 auml: 'Latin kis a kettőspont ékezettel',
80 aring: 'Latin kis a gyűrű ékezettel',
81 aelig: 'Latin kis æ betű',
82 ccedil: 'Latin kis c cedillával',
83 egrave: 'Latin kis e fordított ékezettel',
84 eacute: 'Latin kis e normál ékezettel',
85 ecirc: 'Latin kis e hajtott ékezettel',
86 euml: 'Latin kis e dupla kettőspont ékezettel',
87 igrave: 'Latin kis i fordított ékezettel',
88 iacute: 'Latin kis i normál ékezettel',
89 icirc: 'Latin kis i hajtott ékezettel',
90 iuml: 'Latin kis i kettőspont ékezettel',
91 eth: 'Latin kis eth betű',
92 ntilde: 'Latin kis n hullámjellel',
93 ograve: 'Latin kis o fordított ékezettel',
94 oacute: 'Latin kis o normál ékezettel',
95 ocirc: 'Latin kis o hajtott ékezettel',
96 otilde: 'Latin kis o hullámjellel',
97 ouml: 'Latin kis o kettőspont ékezettel',
98 divide: 'Osztásjel',
99 oslash: 'Latin kis o betű áthúzással',
100 ugrave: 'Latin kis u fordított ékezettel',
101 uacute: 'Latin kis u normál ékezettel',
102 ucirc: 'Latin kis u hajtott ékezettel',
103 uuml: 'Latin kis u kettőspont ékezettel',
104 yacute: 'Latin kis y normál ékezettel',
105 thorn: 'Latin kis thorn jel',
106 yuml: 'Latin kis y kettőspont ékezettel',
107 OElig: 'Latin nagy OE-jel',
108 oelig: 'Latin kis oe-jel',
109 '372': 'Latin nagy W hajtott ékezettel',
110 '374': 'Latin nagy Y hajtott ékezettel',
111 '373': 'Latin kis w hajtott ékezettel',
112 '375': 'Latin kis y hajtott ékezettel',
113 sbquo: 'Nyitó nyomdai szimpla idézőjel',
114 '8219': 'Záró nyomdai záró idézőjel',
115 bdquo: 'Nyitó nyomdai dupla idézőjel',
116 hellip: 'Három pont',
117 trade: 'Kereskedelmi védjegy jele',
118 '9658': 'Jobbra mutató fekete mutató',
119 bull: 'Golyó',
120 rarr: 'Jobbra mutató nyíl',
121 rArr: 'Jobbra mutató duplanyíl',
122 hArr: 'Bal-jobb duplanyíl',
123 diams: 'Fekete gyémánt jel',
124 asymp: 'Majdnem egyenlő jel'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/id.js b/sources/plugins/specialchar/dialogs/lang/id.js
new file mode 100644
index 00000000..0de4e7c4
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/id.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'id', {
7 euro: 'Tanda Euro',
8 lsquo: 'Left single quotation mark', // MISSING
9 rsquo: 'Right single quotation mark', // MISSING
10 ldquo: 'Left double quotation mark', // MISSING
11 rdquo: 'Right double quotation mark', // MISSING
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'Inverted exclamation mark', // MISSING
15 cent: 'Cent sign', // MISSING
16 pound: 'Pound sign', // MISSING
17 curren: 'Currency sign', // MISSING
18 yen: 'Tanda Yen',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Section sign', // MISSING
21 uml: 'Diaeresis', // MISSING
22 copy: 'Tanda Hak Cipta',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Not sign', // MISSING
26 reg: 'Tanda Telah Terdaftar',
27 macr: 'Macron', // MISSING
28 deg: 'Degree sign', // MISSING
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Micro sign', // MISSING
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/it.js b/sources/plugins/specialchar/dialogs/lang/it.js
new file mode 100644
index 00000000..0ad43d81
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/it.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'it', {
7 euro: 'Simbolo Euro',
8 lsquo: 'Virgoletta singola sinistra',
9 rsquo: 'Virgoletta singola destra',
10 ldquo: 'Virgolette aperte',
11 rdquo: 'Virgolette chiuse',
12 ndash: 'Trattino',
13 mdash: 'Trattino lungo',
14 iexcl: 'Punto esclavamativo invertito',
15 cent: 'Simbolo Cent',
16 pound: 'Simbolo Sterlina',
17 curren: 'Simbolo Moneta',
18 yen: 'Simbolo Yen',
19 brvbar: 'Barra interrotta',
20 sect: 'Simbolo di sezione',
21 uml: 'Dieresi',
22 copy: 'Simbolo Copyright',
23 ordf: 'Indicatore ordinale femminile',
24 laquo: 'Virgolette basse aperte',
25 not: 'Nessun segno',
26 reg: 'Simbolo Registrato',
27 macr: 'Macron',
28 deg: 'Simbolo Grado',
29 sup2: 'Apice Due',
30 sup3: 'Apice Tre',
31 acute: 'Accento acuto',
32 micro: 'Simbolo Micro',
33 para: 'Simbolo Paragrafo',
34 middot: 'Punto centrale',
35 cedil: 'Cediglia',
36 sup1: 'Apice Uno',
37 ordm: 'Indicatore ordinale maschile',
38 raquo: 'Virgolette basse chiuse',
39 frac14: 'Frazione volgare un quarto',
40 frac12: 'Frazione volgare un mezzo',
41 frac34: 'Frazione volgare tre quarti',
42 iquest: 'Punto interrogativo invertito',
43 Agrave: 'Lettera maiuscola latina A con accento grave',
44 Aacute: 'Lettera maiuscola latina A con accento acuto',
45 Acirc: 'Lettera maiuscola latina A con accento circonflesso',
46 Atilde: 'Lettera maiuscola latina A con tilde',
47 Auml: 'Lettera maiuscola latina A con dieresi',
48 Aring: 'Lettera maiuscola latina A con anello sopra',
49 AElig: 'Lettera maiuscola latina AE',
50 Ccedil: 'Lettera maiuscola latina C con cediglia',
51 Egrave: 'Lettera maiuscola latina E con accento grave',
52 Eacute: 'Lettera maiuscola latina E con accento acuto',
53 Ecirc: 'Lettera maiuscola latina E con accento circonflesso',
54 Euml: 'Lettera maiuscola latina E con dieresi',
55 Igrave: 'Lettera maiuscola latina I con accento grave',
56 Iacute: 'Lettera maiuscola latina I con accento acuto',
57 Icirc: 'Lettera maiuscola latina I con accento circonflesso',
58 Iuml: 'Lettera maiuscola latina I con dieresi',
59 ETH: 'Lettera maiuscola latina Eth',
60 Ntilde: 'Lettera maiuscola latina N con tilde',
61 Ograve: 'Lettera maiuscola latina O con accento grave',
62 Oacute: 'Lettera maiuscola latina O con accento acuto',
63 Ocirc: 'Lettera maiuscola latina O con accento circonflesso',
64 Otilde: 'Lettera maiuscola latina O con tilde',
65 Ouml: 'Lettera maiuscola latina O con dieresi',
66 times: 'Simbolo di moltiplicazione',
67 Oslash: 'Lettera maiuscola latina O barrata',
68 Ugrave: 'Lettera maiuscola latina U con accento grave',
69 Uacute: 'Lettera maiuscola latina U con accento acuto',
70 Ucirc: 'Lettera maiuscola latina U con accento circonflesso',
71 Uuml: 'Lettera maiuscola latina U con accento circonflesso',
72 Yacute: 'Lettera maiuscola latina Y con accento acuto',
73 THORN: 'Lettera maiuscola latina Thorn',
74 szlig: 'Lettera latina minuscola doppia S',
75 agrave: 'Lettera minuscola latina a con accento grave',
76 aacute: 'Lettera minuscola latina a con accento acuto',
77 acirc: 'Lettera minuscola latina a con accento circonflesso',
78 atilde: 'Lettera minuscola latina a con tilde',
79 auml: 'Lettera minuscola latina a con dieresi',
80 aring: 'Lettera minuscola latina a con anello superiore',
81 aelig: 'Lettera minuscola latina ae',
82 ccedil: 'Lettera minuscola latina c con cediglia',
83 egrave: 'Lettera minuscola latina e con accento grave',
84 eacute: 'Lettera minuscola latina e con accento acuto',
85 ecirc: 'Lettera minuscola latina e con accento circonflesso',
86 euml: 'Lettera minuscola latina e con dieresi',
87 igrave: 'Lettera minuscola latina i con accento grave',
88 iacute: 'Lettera minuscola latina i con accento acuto',
89 icirc: 'Lettera minuscola latina i con accento circonflesso',
90 iuml: 'Lettera minuscola latina i con dieresi',
91 eth: 'Lettera minuscola latina eth',
92 ntilde: 'Lettera minuscola latina n con tilde',
93 ograve: 'Lettera minuscola latina o con accento grave',
94 oacute: 'Lettera minuscola latina o con accento acuto',
95 ocirc: 'Lettera minuscola latina o con accento circonflesso',
96 otilde: 'Lettera minuscola latina o con tilde',
97 ouml: 'Lettera minuscola latina o con dieresi',
98 divide: 'Simbolo di divisione',
99 oslash: 'Lettera minuscola latina o barrata',
100 ugrave: 'Lettera minuscola latina u con accento grave',
101 uacute: 'Lettera minuscola latina u con accento acuto',
102 ucirc: 'Lettera minuscola latina u con accento circonflesso',
103 uuml: 'Lettera minuscola latina u con dieresi',
104 yacute: 'Lettera minuscola latina y con accento acuto',
105 thorn: 'Lettera minuscola latina thorn',
106 yuml: 'Lettera minuscola latina y con dieresi',
107 OElig: 'Legatura maiuscola latina OE',
108 oelig: 'Legatura minuscola latina oe',
109 '372': 'Lettera maiuscola latina W con accento circonflesso',
110 '374': 'Lettera maiuscola latina Y con accento circonflesso',
111 '373': 'Lettera minuscola latina w con accento circonflesso',
112 '375': 'Lettera minuscola latina y con accento circonflesso',
113 sbquo: 'Singola virgoletta bassa low-9',
114 '8219': 'Singola virgoletta bassa low-9 inversa',
115 bdquo: 'Doppia virgoletta bassa low-9',
116 hellip: 'Ellissi orizzontale',
117 trade: 'Simbolo TM',
118 '9658': 'Puntatore nero rivolto verso destra',
119 bull: 'Punto',
120 rarr: 'Freccia verso destra',
121 rArr: 'Doppia freccia verso destra',
122 hArr: 'Doppia freccia sinistra destra',
123 diams: 'Simbolo nero diamante',
124 asymp: 'Quasi uguale a'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ja.js b/sources/plugins/specialchar/dialogs/lang/ja.js
new file mode 100644
index 00000000..8505febe
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ja.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ja', {
7 euro: 'ユーロ記号',
8 lsquo: '左シングル引用符',
9 rsquo: '右シングル引用符',
10 ldquo: '左ダブル引用符',
11 rdquo: '右ダブル引用符',
12 ndash: '半角ダッシュ',
13 mdash: '全角ダッシュ',
14 iexcl: '逆さ感嘆符',
15 cent: 'セント記号',
16 pound: 'ポンド記号',
17 curren: '通貨記号',
18 yen: '円記号',
19 brvbar: '上下に分かれた縦棒',
20 sect: '節記号',
21 uml: '分音記号(ウムラウト)',
22 copy: '著作権表示記号',
23 ordf: '女性序数標識',
24 laquo: ' 始め二重山括弧引用記号',
25 not: '論理否定記号',
26 reg: '登録商標記号',
27 macr: '長音符',
28 deg: '度記号',
29 sup2: '上つき2, 2乗',
30 sup3: '上つき3, 3乗',
31 acute: '揚音符',
32 micro: 'ミクロン記号',
33 para: '段落記号',
34 middot: '中黒',
35 cedil: 'セディラ',
36 sup1: '上つき1',
37 ordm: '男性序数標識',
38 raquo: '終わり二重山括弧引用記号',
39 frac14: '四分の一',
40 frac12: '二分の一',
41 frac34: '四分の三',
42 iquest: '逆疑問符',
43 Agrave: '抑音符つき大文字A',
44 Aacute: '揚音符つき大文字A',
45 Acirc: '曲折アクセントつき大文字A',
46 Atilde: 'チルダつき大文字A',
47 Auml: '分音記号つき大文字A',
48 Aring: 'リングつき大文字A',
49 AElig: 'AとEの合字',
50 Ccedil: 'セディラつき大文字C',
51 Egrave: '抑音符つき大文字E',
52 Eacute: '揚音符つき大文字E',
53 Ecirc: '曲折アクセントつき大文字E',
54 Euml: '分音記号つき大文字E',
55 Igrave: '抑音符つき大文字I',
56 Iacute: '揚音符つき大文字I',
57 Icirc: '曲折アクセントつき大文字I',
58 Iuml: '分音記号つき大文字I',
59 ETH: '[アイスランド語]大文字ETH',
60 Ntilde: 'チルダつき大文字N',
61 Ograve: '抑音符つき大文字O',
62 Oacute: '揚音符つき大文字O',
63 Ocirc: '曲折アクセントつき大文字O',
64 Otilde: 'チルダつき大文字O',
65 Ouml: ' 分音記号つき大文字O',
66 times: '乗算記号',
67 Oslash: '打ち消し線つき大文字O',
68 Ugrave: '抑音符つき大文字U',
69 Uacute: '揚音符つき大文字U',
70 Ucirc: '曲折アクセントつき大文字U',
71 Uuml: '分音記号つき大文字U',
72 Yacute: '揚音符つき大文字Y',
73 THORN: '[アイスランド語]大文字THORN',
74 szlig: 'ドイツ語エスツェット',
75 agrave: '抑音符つき小文字a',
76 aacute: '揚音符つき小文字a',
77 acirc: '曲折アクセントつき小文字a',
78 atilde: 'チルダつき小文字a',
79 auml: '分音記号つき小文字a',
80 aring: 'リングつき小文字a',
81 aelig: 'aとeの合字',
82 ccedil: 'セディラつき小文字c',
83 egrave: '抑音符つき小文字e',
84 eacute: '揚音符つき小文字e',
85 ecirc: '曲折アクセントつき小文字e',
86 euml: '分音記号つき小文字e',
87 igrave: '抑音符つき小文字i',
88 iacute: '揚音符つき小文字i',
89 icirc: '曲折アクセントつき小文字i',
90 iuml: '分音記号つき小文字i',
91 eth: 'アイスランド語小文字eth',
92 ntilde: 'チルダつき小文字n',
93 ograve: '抑音符つき小文字o',
94 oacute: '揚音符つき小文字o',
95 ocirc: '曲折アクセントつき小文字o',
96 otilde: 'チルダつき小文字o',
97 ouml: '分音記号つき小文字o',
98 divide: '除算記号',
99 oslash: '打ち消し線つき小文字o',
100 ugrave: '抑音符つき小文字u',
101 uacute: '揚音符つき小文字u',
102 ucirc: '曲折アクセントつき小文字u',
103 uuml: '分音記号つき小文字u',
104 yacute: '揚音符つき小文字y',
105 thorn: 'アイスランド語小文字thorn',
106 yuml: '分音記号つき小文字y',
107 OElig: 'OとEの合字',
108 oelig: 'oとeの合字',
109 '372': '曲折アクセントつき大文字W',
110 '374': '曲折アクセントつき大文字Y',
111 '373': '曲折アクセントつき小文字w',
112 '375': '曲折アクセントつき小文字y',
113 sbquo: 'シングル下引用符',
114 '8219': '左右逆の左引用符',
115 bdquo: 'ダブル下引用符',
116 hellip: '三点リーダ',
117 trade: '商標記号',
118 '9658': '右黒三角ポインタ',
119 bull: '黒丸',
120 rarr: '右矢印',
121 rArr: '右二重矢印',
122 hArr: '左右二重矢印',
123 diams: 'ダイヤ',
124 asymp: '漸近'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/km.js b/sources/plugins/specialchar/dialogs/lang/km.js
new file mode 100644
index 00000000..186d7bc5
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/km.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'km', {
7 euro: 'សញ្ញា​អឺរ៉ូ',
8 lsquo: 'Left single quotation mark', // MISSING
9 rsquo: 'Right single quotation mark', // MISSING
10 ldquo: 'Left double quotation mark', // MISSING
11 rdquo: 'Right double quotation mark', // MISSING
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'Inverted exclamation mark', // MISSING
15 cent: 'សញ្ញា​សេន',
16 pound: 'សញ្ញា​ផោន',
17 curren: 'សញ្ញា​រូបិយបណ្ណ',
18 yen: 'សញ្ញា​យ៉េន',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Section sign', // MISSING
21 uml: 'Diaeresis', // MISSING
22 copy: 'សញ្ញា​រក្សា​សិទ្ធិ',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Not sign', // MISSING
26 reg: 'Registered sign', // MISSING
27 macr: 'Macron', // MISSING
28 deg: 'សញ្ញា​ដឺក្រេ',
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'សញ្ញា​មីក្រូ',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ko.js b/sources/plugins/specialchar/dialogs/lang/ko.js
new file mode 100644
index 00000000..691754f7
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ko.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ko', {
7 euro: '유로화 기호',
8 lsquo: '왼쪽 외 따옴표',
9 rsquo: '오른쪽 외 따옴표',
10 ldquo: '왼쪽 쌍 따옴표',
11 rdquo: '오른쪽 쌍 따옴표',
12 ndash: '반각 대시',
13 mdash: '전각 대시',
14 iexcl: '반전된 느낌표',
15 cent: '센트 기호',
16 pound: '파운드화 기호',
17 curren: '커런시 기호',
18 yen: '위안화 기호',
19 brvbar: 'Broken bar', // MISSING
20 sect: '섹션 기호',
21 uml: '분음 부호',
22 copy: '저작권 기호',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: '왼쪽 쌍꺽쇠 인용 부호',
25 not: '금지 기호',
26 reg: '등록 기호',
27 macr: '장음 기호',
28 deg: '도 기호',
29 sup2: '위첨자 2',
30 sup3: '위첨자 3',
31 acute: '양음 악센트 부호',
32 micro: '마이크로 기호',
33 para: '단락 기호',
34 middot: '가운데 점',
35 cedil: '세디유',
36 sup1: '위첨자 1',
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: '오른쪽 쌍꺽쇠 인용 부호',
39 frac14: '분수 사분의 일',
40 frac12: '분수 이분의 일',
41 frac34: '분수 사분의 삼',
42 iquest: '뒤집힌 물음표',
43 Agrave: '억음 부호가 있는 라틴 대문자 A',
44 Aacute: '양음 악센트 부호가 있는 라틴 대문자 A',
45 Acirc: '곡절 악센트 부호가 있는 라틴 대문자 A',
46 Atilde: '틸데가 있는 라틴 대문자 A',
47 Auml: '분음 기호가 있는 라틴 대문자 A',
48 Aring: '윗고리가 있는 라틴 대문자 A',
49 AElig: '라틴 대문자 Æ',
50 Ccedil: '세디유가 있는 라틴 대문자 C',
51 Egrave: '억음 부호가 있는 라틴 대문자 E',
52 Eacute: '양음 악센트 부호가 있는 라틴 대문자 E',
53 Ecirc: '곡절 악센트 부호가 있는 라틴 대문자 E',
54 Euml: '분음 기호가 있는 라틴 대문자 E',
55 Igrave: '억음 부호가 있는 라틴 대문자 I',
56 Iacute: '양음 악센트 부호가 있는 라틴 대문자 I',
57 Icirc: '곡절 악센트 부호가 있는 라틴 대문자 I',
58 Iuml: '분음 기호가 있는 라틴 대문자 I',
59 ETH: '라틴 대문자 Eth',
60 Ntilde: '틸데가 있는 라틴 대문자 N',
61 Ograve: '억음 부호가 있는 라틴 대문자 O',
62 Oacute: '양음 부호가 있는 라틴 대문자 O',
63 Ocirc: '곡절 악센트 부호가 있는 라틴 대문자 O',
64 Otilde: '틸데가 있는 라틴 대문자 O',
65 Ouml: '분음 기호가 있는 라틴 대문자 O',
66 times: '곱하기 기호',
67 Oslash: '사선이 있는 라틴 대문자 O',
68 Ugrave: '억음 부호가 있는 라틴 대문자 U',
69 Uacute: '양음 부호가 있는 라틴 대문자 U',
70 Ucirc: '곡절 악센트 부호가 있는 라틴 대문자 U',
71 Uuml: '분음 기호가 있는 라틴 대문자 U',
72 Yacute: '양음 부호가 있는 라틴 대문자 Y',
73 THORN: '라틴 대문자 Thorn',
74 szlig: '라틴 소문자 sharp s',
75 agrave: '억음 부호가 있는 라틴 소문자 a',
76 aacute: '양음 부호가 있는 라틴 소문자 a',
77 acirc: '곡절 악센트 부호가 있는 라틴 소문자 a',
78 atilde: '틸데가 있는 라틴 소문자 a',
79 auml: '분음 기호가 있는 라틴 소문자 a',
80 aring: '윗고리가 있는 라틴 소문자 a',
81 aelig: '라틴 소문자 æ',
82 ccedil: '세디유가 있는 라틴 소문자 c',
83 egrave: '억음 부호가 있는 라틴 소문자 e',
84 eacute: '양음 부호가 있는 라틴 소문자 e',
85 ecirc: '곡절 악센트 부호가 있는 라틴 소문자 e',
86 euml: '분음 기호가 있는 라틴 소문자 e',
87 igrave: '억음 부호가 있는 라틴 소문자 i',
88 iacute: '양음 부호가 있는 라틴 소문자 i',
89 icirc: '곡절 악센트 부호가 있는 라틴 소문자 i',
90 iuml: '분음 기호가 있는 라틴 소문자 i',
91 eth: '라틴 소문자 eth',
92 ntilde: '틸데가 있는 라틴 소문자 n',
93 ograve: '억음 부호가 있는 라틴 소문자 o',
94 oacute: '양음 부호가 있는 라틴 소문자 o',
95 ocirc: '곡절 악센트 부호가 있는 라틴 소문자 o',
96 otilde: '틸데가 있는 라틴 소문자 o',
97 ouml: '분음 기호가 있는 라틴 소문자 o',
98 divide: '나누기 기호',
99 oslash: '사선이 있는 라틴 소문자 o',
100 ugrave: '억음 부호가 있는 라틴 소문자 u',
101 uacute: '양음 부호가 있는 라틴 소문자 u',
102 ucirc: '곡절 악센트 부호가 있는 라틴 소문자 u',
103 uuml: '분음 기호가 있는 라틴 소문자 u',
104 yacute: '양음 부호가 있는 라틴 소문자 y',
105 thorn: '라틴 소문자 thorn',
106 yuml: '분음 기호가 있는 라틴 소문자 y',
107 OElig: '라틴 대문합자 OE',
108 oelig: '라틴 소문합자 oe',
109 '372': '곡절 악센트 부호가 있는 라틴 대문자 W',
110 '374': '곡절 악센트 부호가 있는 라틴 대문자 Y',
111 '373': '곡절 악센트 부호가 있는 라틴 소문자 w',
112 '375': '곡절 악센트 부호가 있는 라틴 소문자 y',
113 sbquo: '외 아래-9 인용 부호',
114 '8219': '외 위쪽-뒤집힌-9 인용 부호',
115 bdquo: '쌍 아래-9 인용 부호',
116 hellip: '수평 생략 부호',
117 trade: '상표 기호',
118 '9658': '검정 오른쪽 포인터',
119 bull: '큰 점',
120 rarr: '오른쪽 화살표',
121 rArr: '오른쪽 두 줄 화살표',
122 hArr: '양쪽 두 줄 화살표',
123 diams: '검정 다이아몬드',
124 asymp: '근사'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ku.js b/sources/plugins/specialchar/dialogs/lang/ku.js
new file mode 100644
index 00000000..44e93023
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ku.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ku', {
7 euro: 'نیشانەی یۆرۆ',
8 lsquo: 'نیشانەی فاریزەی سەرووژێری تاکی چەپ',
9 rsquo: 'نیشانەی فاریزەی سەرووژێری تاکی ڕاست',
10 ldquo: 'نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ',
11 rdquo: 'نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست',
12 ndash: 'تەقەڵی کورت',
13 mdash: 'تەقەڵی درێژ',
14 iexcl: 'نیشانەی هەڵەوگێڕی سەرسوڕهێنەر',
15 cent: 'نیشانەی سەنت',
16 pound: 'نیشانەی پاوەند',
17 curren: 'نیشانەی دراو',
18 yen: 'نیشانەی یەنی ژاپۆنی',
19 brvbar: 'شریتی ئەستوونی پچڕاو',
20 sect: 'نیشانەی دوو s لەسەریەک',
21 uml: 'خاڵ',
22 copy: 'نیشانەی مافی چاپ',
23 ordf: 'هێڵ لەسەر پیتی a',
24 laquo: 'دوو تیری بەدووایەکی چەپ',
25 not: 'نیشانەی نەخێر',
26 reg: 'نیشانەی R لەناو بازنەدا',
27 macr: 'ماکڕۆن',
28 deg: 'نیشانەی پلە',
29 sup2: 'سەرنووسی دوو',
30 sup3: 'سەرنووسی سێ',
31 acute: 'لاری تیژ',
32 micro: 'نیشانەی u لق درێژی چەپی خواروو',
33 para: 'نیشانەی پەڕەگراف',
34 middot: 'ناوەڕاستی خاڵ',
35 cedil: 'نیشانەی c ژێر چووکرە',
36 sup1: 'سەرنووسی یەک',
37 ordm: 'هێڵ لەژێر پیتی o',
38 raquo: 'دوو تیری بەدووایەکی ڕاست',
39 frac14: 'یەک لەسەر چووار',
40 frac12: 'یەک لەسەر دوو',
41 frac34: 'سێ لەسەر چووار',
42 iquest: 'هێمای هەڵەوگێری پرسیار',
43 Agrave: 'پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار',
44 Aacute: 'پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ',
45 Acirc: 'پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری',
46 Atilde: 'پیتی لاتینی A-ی گەورە لەگەڵ زەڕە',
47 Auml: 'پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری',
48 Aring: 'پیتی لاتینی گەورەی Å',
49 AElig: 'پیتی لاتینی گەورەی Æ',
50 Ccedil: 'پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە',
51 Egrave: 'پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار',
52 Eacute: 'پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ',
53 Ecirc: 'پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری',
54 Euml: 'پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری',
55 Igrave: 'پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار',
56 Iacute: 'پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ',
57 Icirc: 'پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری',
58 Iuml: 'پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری',
59 ETH: 'پیتی لاتینی E-ی گەورەی',
60 Ntilde: 'پیتی لاتینی N-ی گەورە لەگەڵ زەڕە',
61 Ograve: 'پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار',
62 Oacute: 'پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ',
63 Ocirc: 'پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری',
64 Otilde: 'پیتی لاتینی O-ی گەورە لەگەڵ زەڕە',
65 Ouml: 'پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری',
66 times: 'نیشانەی لێکدان',
67 Oslash: 'پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان',
68 Ugrave: 'پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار',
69 Uacute: 'پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ',
70 Ucirc: 'پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری',
71 Uuml: 'پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری',
72 Yacute: 'پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ',
73 THORN: 'پیتی لاتینی دڕکی گەورە',
74 szlig: 'پیتی لاتنی نووک تیژی s',
75 agrave: 'پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار',
76 aacute: 'پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ',
77 acirc: 'پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری',
78 atilde: 'پیتی لاتینی a-ی بچووك لەگەڵ زەڕە',
79 auml: 'پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری',
80 aring: 'پیتی لاتینی å-ی بچووك',
81 aelig: 'پیتی لاتینی æ-ی بچووك',
82 ccedil: 'پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە',
83 egrave: 'پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار',
84 eacute: 'پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ',
85 ecirc: 'پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری',
86 euml: 'پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری',
87 igrave: 'پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار',
88 iacute: 'پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ',
89 icirc: 'پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری',
90 iuml: 'پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری',
91 eth: 'پیتی لاتینی e-ی بچووك',
92 ntilde: 'پیتی لاتینی n-ی بچووك لەگەڵ زەڕە',
93 ograve: 'پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار',
94 oacute: 'پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ',
95 ocirc: 'پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری',
96 otilde: 'پیتی لاتینی o-ی بچووك لەگەڵ زەڕە',
97 ouml: 'پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری',
98 divide: 'نیشانەی دابەش',
99 oslash: 'پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان',
100 ugrave: 'پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار',
101 uacute: 'پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ',
102 ucirc: 'پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری',
103 uuml: 'پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری',
104 yacute: 'پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ',
105 thorn: 'پیتی لاتینی دڕکی بچووك',
106 yuml: 'پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری',
107 OElig: 'پیتی لاتینی گەورەی پێکەوەنووسراوی OE',
108 oelig: 'پیتی لاتینی بچووکی پێکەوەنووسراوی oe',
109 '372': 'پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری',
110 '374': 'پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری',
111 '373': 'پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری',
112 '375': 'پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری',
113 sbquo: 'نیشانەی فاریزەی نزم',
114 '8219': 'نیشانەی فاریزەی بەرزی پێچەوانە',
115 bdquo: 'دوو فاریزەی تەنیش یەك',
116 hellip: 'ئاسۆیی بازنە',
117 trade: 'نیشانەی بازرگانی',
118 '9658': 'ئاراستەی ڕەشی دەستی ڕاست',
119 bull: 'فیشەك',
120 rarr: 'تیری دەستی ڕاست',
121 rArr: 'دووتیری دەستی ڕاست',
122 hArr: 'دوو تیری ڕاست و چەپ',
123 diams: 'ڕەشی پاقڵاوەیی',
124 asymp: 'نیشانەی یەکسانە'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/lt.js b/sources/plugins/specialchar/dialogs/lang/lt.js
new file mode 100644
index 00000000..5ef46c28
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/lt.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'lt', {
7 euro: 'Euro ženklas',
8 lsquo: 'Left single quotation mark', // MISSING
9 rsquo: 'Right single quotation mark', // MISSING
10 ldquo: 'Left double quotation mark', // MISSING
11 rdquo: 'Right double quotation mark', // MISSING
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'Inverted exclamation mark', // MISSING
15 cent: 'Cento ženklas',
16 pound: 'Svaro ženklas',
17 curren: 'Valiutos ženklas',
18 yen: 'Jenos ženklas',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Section sign', // MISSING
21 uml: 'Diaeresis', // MISSING
22 copy: 'Copyright sign', // MISSING
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Ne ženklas',
26 reg: 'Registered sign', // MISSING
27 macr: 'Makronas',
28 deg: 'Laipsnio ženklas',
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Mikro ženklas',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Vidurinis taškas',
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/lv.js b/sources/plugins/specialchar/dialogs/lang/lv.js
new file mode 100644
index 00000000..f1bcdaab
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/lv.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'lv', {
7 euro: 'Euro zīme',
8 lsquo: 'Kreisā vienkārtīga pēdiņa',
9 rsquo: 'Labā vienkārtīga pēdiņa',
10 ldquo: 'Kreisā dubult pēdiņa',
11 rdquo: 'Labā dubult pēdiņa',
12 ndash: 'En svītra',
13 mdash: 'Em svītra',
14 iexcl: 'Apgriezta izsaukuma zīme',
15 cent: 'Centu naudas zīme',
16 pound: 'Sterliņu mārciņu naudas zīme',
17 curren: 'Valūtas zīme',
18 yen: 'Jenu naudas zīme',
19 brvbar: 'Vertikāla pārrauta līnija',
20 sect: 'Paragrāfa zīme',
21 uml: 'Diakritiska zīme',
22 copy: 'Autortiesību zīme',
23 ordf: 'Sievišķas kārtas rādītājs',
24 laquo: 'Kreisā dubult stūra pēdiņu zīme',
25 not: 'Neparakstīts',
26 reg: 'Reģistrēta zīme',
27 macr: 'Garumzīme',
28 deg: 'Grādu zīme',
29 sup2: 'Augšraksts divi',
30 sup3: 'Augšraksts trīs',
31 acute: 'Akūta uzsvara zīme',
32 micro: 'Mikro zīme',
33 para: 'Rindkopas zīme ',
34 middot: 'Vidējs punkts',
35 cedil: 'Āķītis zem burta',
36 sup1: 'Augšraksts viens',
37 ordm: 'Vīrišķīgas kārtas rādītājs',
38 raquo: 'Labā dubult stūra pēdiņu zīme',
39 frac14: 'Vulgāra frakcija 1/4',
40 frac12: 'Vulgāra frakcija 1/2',
41 frac34: 'Vulgāra frakcija 3/4',
42 iquest: 'Apgriezta jautājuma zīme',
43 Agrave: 'Lielais latīņu burts A ar uzsvara zīmi',
44 Aacute: 'Lielais latīņu burts A ar akūtu uzsvara zīmi',
45 Acirc: 'Lielais latīņu burts A ar diakritisku zīmi',
46 Atilde: 'Lielais latīņu burts A ar tildi ',
47 Auml: 'Lielais latīņu burts A ar diakritisko zīmi',
48 Aring: 'Lielais latīņu burts A ar aplīti augšā',
49 AElig: 'Lielais latīņu burts Æ',
50 Ccedil: 'Lielais latīņu burts C ar āķīti zem burta',
51 Egrave: 'Lielais latīņu burts E ar apostrofu',
52 Eacute: 'Lielais latīņu burts E ar akūtu uzsvara zīmi',
53 Ecirc: 'Lielais latīņu burts E ar diakritisko zīmi',
54 Euml: 'Lielais latīņu burts E ar diakritisko zīmi',
55 Igrave: 'Lielais latīņu burts I ar uzsvaras zīmi',
56 Iacute: 'Lielais latīņu burts I ar akūtu uzsvara zīmi',
57 Icirc: 'Lielais latīņu burts I ar diakritisko zīmi',
58 Iuml: 'Lielais latīņu burts I ar diakritisko zīmi',
59 ETH: 'Lielais latīņu burts Eth',
60 Ntilde: 'Lielais latīņu burts N ar tildi',
61 Ograve: 'Lielais latīņu burts O ar uzsvara zīmi',
62 Oacute: 'Lielais latīņu burts O ar akūto uzsvara zīmi',
63 Ocirc: 'Lielais latīņu burts O ar diakritisko zīmi',
64 Otilde: 'Lielais latīņu burts O ar tildi',
65 Ouml: 'Lielais latīņu burts O ar diakritisko zīmi',
66 times: 'Reizināšanas zīme ',
67 Oslash: 'Lielais latīņu burts O ar iesvītrojumu',
68 Ugrave: 'Lielais latīņu burts U ar uzsvaras zīmi',
69 Uacute: 'Lielais latīņu burts U ar akūto uzsvars zīmi',
70 Ucirc: 'Lielais latīņu burts U ar diakritisko zīmi',
71 Uuml: 'Lielais latīņu burts U ar diakritisko zīmi',
72 Yacute: 'Lielais latīņu burts Y ar akūto uzsvaras zīmi',
73 THORN: 'Lielais latīņu burts torn',
74 szlig: 'Mazs latīņu burts ar ligatūru',
75 agrave: 'Mazs latīņu burts a ar uzsvara zīmi',
76 aacute: 'Mazs latīņu burts a ar akūto uzsvara zīmi',
77 acirc: 'Mazs latīņu burts a ar diakritisko zīmi',
78 atilde: 'Mazs latīņu burts a ar tildi',
79 auml: 'Mazs latīņu burts a ar diakritisko zīmi',
80 aring: 'Mazs latīņu burts a ar aplīti augšā',
81 aelig: 'Mazs latīņu burts æ',
82 ccedil: 'Mazs latīņu burts c ar āķīti zem burta',
83 egrave: 'Mazs latīņu burts e ar uzsvara zīmi ',
84 eacute: 'Mazs latīņu burts e ar akūtu uzsvara zīmi',
85 ecirc: 'Mazs latīņu burts e ar diakritisko zīmi',
86 euml: 'Mazs latīņu burts e ar diakritisko zīmi',
87 igrave: 'Mazs latīņu burts i ar uzsvara zīmi ',
88 iacute: 'Mazs latīņu burts i ar akūtu uzsvara zīmi',
89 icirc: 'Mazs latīņu burts i ar diakritisko zīmi',
90 iuml: 'Mazs latīņu burts i ar diakritisko zīmi',
91 eth: 'Mazs latīņu burts eth',
92 ntilde: 'Mazs latīņu burts n ar tildi',
93 ograve: 'Mazs latīņu burts o ar uzsvara zīmi ',
94 oacute: 'Mazs latīņu burts o ar akūtu uzsvara zīmi',
95 ocirc: 'Mazs latīņu burts o ar diakritisko zīmi',
96 otilde: 'Mazs latīņu burts o ar tildi',
97 ouml: 'Mazs latīņu burts o ar diakritisko zīmi',
98 divide: 'Dalīšanas zīme',
99 oslash: 'Mazs latīņu burts o ar iesvītrojumu',
100 ugrave: 'Mazs latīņu burts u ar uzsvara zīmi ',
101 uacute: 'Mazs latīņu burts u ar akūtu uzsvara zīmi',
102 ucirc: 'Mazs latīņu burts u ar diakritisko zīmi',
103 uuml: 'Mazs latīņu burts u ar diakritisko zīmi',
104 yacute: 'Mazs latīņu burts y ar akūtu uzsvaras zīmi',
105 thorn: 'Mazs latīņu burts torns',
106 yuml: 'Mazs latīņu burts y ar diakritisko zīmi',
107 OElig: 'Liela latīņu ligatūra OE',
108 oelig: 'Maza latīņu ligatūra oe',
109 '372': 'Liels latīņu burts W ar diakritisko zīmi ',
110 '374': 'Liels latīņu burts Y ar diakritisko zīmi ',
111 '373': 'Mazs latīņu burts w ar diakritisko zīmi ',
112 '375': 'Mazs latīņu burts y ar diakritisko zīmi ',
113 sbquo: 'Mazas-9 vienkārtīgas pēdiņas',
114 '8219': 'Lielas-9 vienkārtīgas apgrieztas pēdiņas',
115 bdquo: 'Mazas-9 dubultas pēdiņas',
116 hellip: 'Horizontāli daudzpunkti',
117 trade: 'Preču zīmes zīme',
118 '9658': 'Melns pa labi pagriezts radītājs',
119 bull: 'Lode',
120 rarr: 'Bulta pa labi',
121 rArr: 'Dubulta Bulta pa labi',
122 hArr: 'Bulta pa kreisi',
123 diams: 'Dubulta Bulta pa kreisi',
124 asymp: 'Gandrīz vienāds ar'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/nb.js b/sources/plugins/specialchar/dialogs/lang/nb.js
new file mode 100644
index 00000000..ef9be206
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/nb.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'nb', {
7 euro: 'Eurosymbol',
8 lsquo: 'Venstre enkelt anførselstegn',
9 rsquo: 'Høyre enkelt anførselstegn',
10 ldquo: 'Venstre dobbelt anførselstegn',
11 rdquo: 'Høyre anførsesltegn',
12 ndash: 'Kort tankestrek',
13 mdash: 'Lang tankestrek',
14 iexcl: 'Omvendt utropstegn',
15 cent: 'Centsymbol',
16 pound: 'Pundsymbol',
17 curren: 'Valutategn',
18 yen: 'Yensymbol',
19 brvbar: 'Brutt loddrett strek',
20 sect: 'Paragraftegn',
21 uml: 'Tøddel',
22 copy: 'Copyrighttegn',
23 ordf: 'Feminin ordensindikator',
24 laquo: 'Venstre anførselstegn',
25 not: 'Negasjonstegn',
26 reg: 'Registrert varemerke-tegn',
27 macr: 'Makron',
28 deg: 'Gradsymbol',
29 sup2: 'Hevet totall',
30 sup3: 'Hevet tretall',
31 acute: 'Akutt aksent',
32 micro: 'Mikrosymbol',
33 para: 'Avsnittstegn',
34 middot: 'Midtstilt prikk',
35 cedil: 'Cedille',
36 sup1: 'Hevet ettall',
37 ordm: 'Maskulin ordensindikator',
38 raquo: 'Høyre anførselstegn',
39 frac14: 'Fjerdedelsbrøk',
40 frac12: 'Halvbrøk',
41 frac34: 'Tre fjerdedelers brøk',
42 iquest: 'Omvendt spørsmålstegn',
43 Agrave: 'Stor A med grav aksent',
44 Aacute: 'Stor A med akutt aksent',
45 Acirc: 'Stor A med cirkumfleks',
46 Atilde: 'Stor A med tilde',
47 Auml: 'Stor A med tøddel',
48 Aring: 'Stor Å',
49 AElig: 'Stor Æ',
50 Ccedil: 'Stor C med cedille',
51 Egrave: 'Stor E med grav aksent',
52 Eacute: 'Stor E med akutt aksent',
53 Ecirc: 'Stor E med cirkumfleks',
54 Euml: 'Stor E med tøddel',
55 Igrave: 'Stor I med grav aksent',
56 Iacute: 'Stor I med akutt aksent',
57 Icirc: 'Stor I med cirkumfleks',
58 Iuml: 'Stor I med tøddel',
59 ETH: 'Stor Edd/stungen D',
60 Ntilde: 'Stor N med tilde',
61 Ograve: 'Stor O med grav aksent',
62 Oacute: 'Stor O med akutt aksent',
63 Ocirc: 'Stor O med cirkumfleks',
64 Otilde: 'Stor O med tilde',
65 Ouml: 'Stor O med tøddel',
66 times: 'Multiplikasjonstegn',
67 Oslash: 'Stor Ø',
68 Ugrave: 'Stor U med grav aksent',
69 Uacute: 'Stor U med akutt aksent',
70 Ucirc: 'Stor U med cirkumfleks',
71 Uuml: 'Stor U med tøddel',
72 Yacute: 'Stor Y med akutt aksent',
73 THORN: 'Stor Thorn',
74 szlig: 'Liten dobbelt-s/Eszett',
75 agrave: 'Liten a med grav aksent',
76 aacute: 'Liten a med akutt aksent',
77 acirc: 'Liten a med cirkumfleks',
78 atilde: 'Liten a med tilde',
79 auml: 'Liten a med tøddel',
80 aring: 'Liten å',
81 aelig: 'Liten æ',
82 ccedil: 'Liten c med cedille',
83 egrave: 'Liten e med grav aksent',
84 eacute: 'Liten e med akutt aksent',
85 ecirc: 'Liten e med cirkumfleks',
86 euml: 'Liten e med tøddel',
87 igrave: 'Liten i med grav aksent',
88 iacute: 'Liten i med akutt aksent',
89 icirc: 'Liten i med cirkumfleks',
90 iuml: 'Liten i med tøddel',
91 eth: 'Liten edd/stungen d',
92 ntilde: 'Liten n med tilde',
93 ograve: 'Liten o med grav aksent',
94 oacute: 'Liten o med akutt aksent',
95 ocirc: 'Liten o med cirkumfleks',
96 otilde: 'Liten o med tilde',
97 ouml: 'Liten o med tøddel',
98 divide: 'Divisjonstegn',
99 oslash: 'Liten ø',
100 ugrave: 'Liten u med grav aksent',
101 uacute: 'Liten u med akutt aksent',
102 ucirc: 'Liten u med cirkumfleks',
103 uuml: 'Liten u med tøddel',
104 yacute: 'Liten y med akutt aksent',
105 thorn: 'Liten thorn',
106 yuml: 'Liten y med tøddel',
107 OElig: 'Stor ligatur av O og E',
108 oelig: 'Liten ligatur av o og e',
109 '372': 'Stor W med cirkumfleks',
110 '374': 'Stor Y med cirkumfleks',
111 '373': 'Liten w med cirkumfleks',
112 '375': 'Liten y med cirkumfleks',
113 sbquo: 'Enkelt lavt 9-anførselstegn',
114 '8219': 'Enkelt høyt reversert 9-anførselstegn',
115 bdquo: 'Dobbelt lavt 9-anførselstegn',
116 hellip: 'Ellipse',
117 trade: 'Varemerkesymbol',
118 '9658': 'Svart høyrevendt peker',
119 bull: 'Tykk interpunkt',
120 rarr: 'Høyrevendt pil',
121 rArr: 'Dobbel høyrevendt pil',
122 hArr: 'Dobbel venstrevendt pil',
123 diams: 'Svart ruter',
124 asymp: 'Omtrent likhetstegn'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/nl.js b/sources/plugins/specialchar/dialogs/lang/nl.js
new file mode 100644
index 00000000..2cb5537f
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/nl.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'nl', {
7 euro: 'Euro-teken',
8 lsquo: 'Linker enkel aanhalingsteken',
9 rsquo: 'Rechter enkel aanhalingsteken',
10 ldquo: 'Linker dubbel aanhalingsteken',
11 rdquo: 'Rechter dubbel aanhalingsteken',
12 ndash: 'En dash',
13 mdash: 'Em dash',
14 iexcl: 'Omgekeerd uitroepteken',
15 cent: 'Cent-teken',
16 pound: 'Pond-teken',
17 curren: 'Valuta-teken',
18 yen: 'Yen-teken',
19 brvbar: 'Gebroken streep',
20 sect: 'Paragraaf-teken',
21 uml: 'Trema',
22 copy: 'Copyright-teken',
23 ordf: 'Vrouwelijk ordinaal',
24 laquo: 'Linker guillemet',
25 not: 'Ongelijk-teken',
26 reg: 'Geregistreerd handelsmerk-teken',
27 macr: 'Macron',
28 deg: 'Graden-teken',
29 sup2: 'Superscript twee',
30 sup3: 'Superscript drie',
31 acute: 'Accent aigu',
32 micro: 'Micro-teken',
33 para: 'Alinea-teken',
34 middot: 'Halfhoge punt',
35 cedil: 'Cedille',
36 sup1: 'Superscript een',
37 ordm: 'Mannelijk ordinaal',
38 raquo: 'Rechter guillemet',
39 frac14: 'Breuk kwart',
40 frac12: 'Breuk half',
41 frac34: 'Breuk driekwart',
42 iquest: 'Omgekeerd vraagteken',
43 Agrave: 'Latijnse hoofdletter A met een accent grave',
44 Aacute: 'Latijnse hoofdletter A met een accent aigu',
45 Acirc: 'Latijnse hoofdletter A met een circonflexe',
46 Atilde: 'Latijnse hoofdletter A met een tilde',
47 Auml: 'Latijnse hoofdletter A met een trema',
48 Aring: 'Latijnse hoofdletter A met een corona',
49 AElig: 'Latijnse hoofdletter Æ',
50 Ccedil: 'Latijnse hoofdletter C met een cedille',
51 Egrave: 'Latijnse hoofdletter E met een accent grave',
52 Eacute: 'Latijnse hoofdletter E met een accent aigu',
53 Ecirc: 'Latijnse hoofdletter E met een circonflexe',
54 Euml: 'Latijnse hoofdletter E met een trema',
55 Igrave: 'Latijnse hoofdletter I met een accent grave',
56 Iacute: 'Latijnse hoofdletter I met een accent aigu',
57 Icirc: 'Latijnse hoofdletter I met een circonflexe',
58 Iuml: 'Latijnse hoofdletter I met een trema',
59 ETH: 'Latijnse hoofdletter Eth',
60 Ntilde: 'Latijnse hoofdletter N met een tilde',
61 Ograve: 'Latijnse hoofdletter O met een accent grave',
62 Oacute: 'Latijnse hoofdletter O met een accent aigu',
63 Ocirc: 'Latijnse hoofdletter O met een circonflexe',
64 Otilde: 'Latijnse hoofdletter O met een tilde',
65 Ouml: 'Latijnse hoofdletter O met een trema',
66 times: 'Maal-teken',
67 Oslash: 'Latijnse hoofdletter O met een schuine streep',
68 Ugrave: 'Latijnse hoofdletter U met een accent grave',
69 Uacute: 'Latijnse hoofdletter U met een accent aigu',
70 Ucirc: 'Latijnse hoofdletter U met een circonflexe',
71 Uuml: 'Latijnse hoofdletter U met een trema',
72 Yacute: 'Latijnse hoofdletter Y met een accent aigu',
73 THORN: 'Latijnse hoofdletter Thorn',
74 szlig: 'Latijnse kleine ringel-s',
75 agrave: 'Latijnse kleine letter a met een accent grave',
76 aacute: 'Latijnse kleine letter a met een accent aigu',
77 acirc: 'Latijnse kleine letter a met een circonflexe',
78 atilde: 'Latijnse kleine letter a met een tilde',
79 auml: 'Latijnse kleine letter a met een trema',
80 aring: 'Latijnse kleine letter a met een corona',
81 aelig: 'Latijnse kleine letter æ',
82 ccedil: 'Latijnse kleine letter c met een cedille',
83 egrave: 'Latijnse kleine letter e met een accent grave',
84 eacute: 'Latijnse kleine letter e met een accent aigu',
85 ecirc: 'Latijnse kleine letter e met een circonflexe',
86 euml: 'Latijnse kleine letter e met een trema',
87 igrave: 'Latijnse kleine letter i met een accent grave',
88 iacute: 'Latijnse kleine letter i met een accent aigu',
89 icirc: 'Latijnse kleine letter i met een circonflexe',
90 iuml: 'Latijnse kleine letter i met een trema',
91 eth: 'Latijnse kleine letter eth',
92 ntilde: 'Latijnse kleine letter n met een tilde',
93 ograve: 'Latijnse kleine letter o met een accent grave',
94 oacute: 'Latijnse kleine letter o met een accent aigu',
95 ocirc: 'Latijnse kleine letter o met een circonflexe',
96 otilde: 'Latijnse kleine letter o met een tilde',
97 ouml: 'Latijnse kleine letter o met een trema',
98 divide: 'Deel-teken',
99 oslash: 'Latijnse kleine letter o met een schuine streep',
100 ugrave: 'Latijnse kleine letter u met een accent grave',
101 uacute: 'Latijnse kleine letter u met een accent aigu',
102 ucirc: 'Latijnse kleine letter u met een circonflexe',
103 uuml: 'Latijnse kleine letter u met een trema',
104 yacute: 'Latijnse kleine letter y met een accent aigu',
105 thorn: 'Latijnse kleine letter thorn',
106 yuml: 'Latijnse kleine letter y met een trema',
107 OElig: 'Latijnse hoofdletter Œ',
108 oelig: 'Latijnse kleine letter œ',
109 '372': 'Latijnse hoofdletter W met een circonflexe',
110 '374': 'Latijnse hoofdletter Y met een circonflexe',
111 '373': 'Latijnse kleine letter w met een circonflexe',
112 '375': 'Latijnse kleine letter y met een circonflexe',
113 sbquo: 'Lage enkele aanhalingsteken',
114 '8219': 'Hoge omgekeerde enkele aanhalingsteken',
115 bdquo: 'Lage dubbele aanhalingsteken',
116 hellip: 'Beletselteken',
117 trade: 'Trademark-teken',
118 '9658': 'Zwarte driehoek naar rechts',
119 bull: 'Bullet',
120 rarr: 'Pijl naar rechts',
121 rArr: 'Dubbele pijl naar rechts',
122 hArr: 'Dubbele pijl naar links',
123 diams: 'Zwart ruitje',
124 asymp: 'Benaderingsteken'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/no.js b/sources/plugins/specialchar/dialogs/lang/no.js
new file mode 100644
index 00000000..fe32109f
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/no.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'no', {
7 euro: 'Eurosymbol',
8 lsquo: 'Venstre enkelt anførselstegn',
9 rsquo: 'Høyre enkelt anførselstegn',
10 ldquo: 'Venstre dobbelt anførselstegn',
11 rdquo: 'Høyre anførsesltegn',
12 ndash: 'Kort tankestrek',
13 mdash: 'Lang tankestrek',
14 iexcl: 'Omvendt utropstegn',
15 cent: 'Centsymbol',
16 pound: 'Pundsymbol',
17 curren: 'Valutategn',
18 yen: 'Yensymbol',
19 brvbar: 'Brutt loddrett strek',
20 sect: 'Paragraftegn',
21 uml: 'Tøddel',
22 copy: 'Copyrighttegn',
23 ordf: 'Feminin ordensindikator',
24 laquo: 'Venstre anførselstegn',
25 not: 'Negasjonstegn',
26 reg: 'Registrert varemerke-tegn',
27 macr: 'Makron',
28 deg: 'Gradsymbol',
29 sup2: 'Hevet totall',
30 sup3: 'Hevet tretall',
31 acute: 'Akutt aksent',
32 micro: 'Mikrosymbol',
33 para: 'Avsnittstegn',
34 middot: 'Midtstilt prikk',
35 cedil: 'Cedille',
36 sup1: 'Hevet ettall',
37 ordm: 'Maskulin ordensindikator',
38 raquo: 'Høyre anførselstegn',
39 frac14: 'Fjerdedelsbrøk',
40 frac12: 'Halvbrøk',
41 frac34: 'Tre fjerdedelers brøk',
42 iquest: 'Omvendt spørsmålstegn',
43 Agrave: 'Stor A med grav aksent',
44 Aacute: 'Stor A med akutt aksent',
45 Acirc: 'Stor A med cirkumfleks',
46 Atilde: 'Stor A med tilde',
47 Auml: 'Stor A med tøddel',
48 Aring: 'Stor Å',
49 AElig: 'Stor Æ',
50 Ccedil: 'Stor C med cedille',
51 Egrave: 'Stor E med grav aksent',
52 Eacute: 'Stor E med akutt aksent',
53 Ecirc: 'Stor E med cirkumfleks',
54 Euml: 'Stor E med tøddel',
55 Igrave: 'Stor I med grav aksent',
56 Iacute: 'Stor I med akutt aksent',
57 Icirc: 'Stor I med cirkumfleks',
58 Iuml: 'Stor I med tøddel',
59 ETH: 'Stor Edd/stungen D',
60 Ntilde: 'Stor N med tilde',
61 Ograve: 'Stor O med grav aksent',
62 Oacute: 'Stor O med akutt aksent',
63 Ocirc: 'Stor O med cirkumfleks',
64 Otilde: 'Stor O med tilde',
65 Ouml: 'Stor O med tøddel',
66 times: 'Multiplikasjonstegn',
67 Oslash: 'Stor Ø',
68 Ugrave: 'Stor U med grav aksent',
69 Uacute: 'Stor U med akutt aksent',
70 Ucirc: 'Stor U med cirkumfleks',
71 Uuml: 'Stor U med tøddel',
72 Yacute: 'Stor Y med akutt aksent',
73 THORN: 'Stor Thorn',
74 szlig: 'Liten dobbelt-s/Eszett',
75 agrave: 'Liten a med grav aksent',
76 aacute: 'Liten a med akutt aksent',
77 acirc: 'Liten a med cirkumfleks',
78 atilde: 'Liten a med tilde',
79 auml: 'Liten a med tøddel',
80 aring: 'Liten å',
81 aelig: 'Liten æ',
82 ccedil: 'Liten c med cedille',
83 egrave: 'Liten e med grav aksent',
84 eacute: 'Liten e med akutt aksent',
85 ecirc: 'Liten e med cirkumfleks',
86 euml: 'Liten e med tøddel',
87 igrave: 'Liten i med grav aksent',
88 iacute: 'Liten i med akutt aksent',
89 icirc: 'Liten i med cirkumfleks',
90 iuml: 'Liten i med tøddel',
91 eth: 'Liten edd/stungen d',
92 ntilde: 'Liten n med tilde',
93 ograve: 'Liten o med grav aksent',
94 oacute: 'Liten o med akutt aksent',
95 ocirc: 'Liten o med cirkumfleks',
96 otilde: 'Liten o med tilde',
97 ouml: 'Liten o med tøddel',
98 divide: 'Divisjonstegn',
99 oslash: 'Liten ø',
100 ugrave: 'Liten u med grav aksent',
101 uacute: 'Liten u med akutt aksent',
102 ucirc: 'Liten u med cirkumfleks',
103 uuml: 'Liten u med tøddel',
104 yacute: 'Liten y med akutt aksent',
105 thorn: 'Liten thorn',
106 yuml: 'Liten y med tøddel',
107 OElig: 'Stor ligatur av O og E',
108 oelig: 'Liten ligatur av o og e',
109 '372': 'Stor W med cirkumfleks',
110 '374': 'Stor Y med cirkumfleks',
111 '373': 'Liten w med cirkumfleks',
112 '375': 'Liten y med cirkumfleks',
113 sbquo: 'Enkelt lavt 9-anførselstegn',
114 '8219': 'Enkelt høyt reversert 9-anførselstegn',
115 bdquo: 'Dobbelt lavt 9-anførselstegn',
116 hellip: 'Ellipse',
117 trade: 'Varemerkesymbol',
118 '9658': 'Svart høyrevendt peker',
119 bull: 'Tykk interpunkt',
120 rarr: 'Høyrevendt pil',
121 rArr: 'Dobbel høyrevendt pil',
122 hArr: 'Dobbel venstrevendt pil',
123 diams: 'Svart ruter',
124 asymp: 'Omtrent likhetstegn'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/pl.js b/sources/plugins/specialchar/dialogs/lang/pl.js
new file mode 100644
index 00000000..52c8e378
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/pl.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'pl', {
7 euro: 'Znak euro',
8 lsquo: 'Cudzysłów pojedynczy otwierający',
9 rsquo: 'Cudzysłów pojedynczy zamykający',
10 ldquo: 'Cudzysłów apostrofowy otwierający',
11 rdquo: 'Cudzysłów apostrofowy zamykający',
12 ndash: 'Półpauza',
13 mdash: 'Pauza',
14 iexcl: 'Odwrócony wykrzyknik',
15 cent: 'Znak centa',
16 pound: 'Znak funta',
17 curren: 'Znak waluty',
18 yen: 'Znak jena',
19 brvbar: 'Przerwana pionowa kreska',
20 sect: 'Paragraf',
21 uml: 'Diereza',
22 copy: 'Znak praw autorskich',
23 ordf: 'Wskaźnik rodzaju żeńskiego liczebnika porządkowego',
24 laquo: 'Lewy cudzysłów ostrokątny',
25 not: 'Znak negacji',
26 reg: 'Zastrzeżony znak towarowy',
27 macr: 'Makron',
28 deg: 'Znak stopnia',
29 sup2: 'Druga potęga',
30 sup3: 'Trzecia potęga',
31 acute: 'Akcent ostry',
32 micro: 'Znak mikro',
33 para: 'Znak akapitu',
34 middot: 'Kropka środkowa',
35 cedil: 'Cedylla',
36 sup1: 'Pierwsza potęga',
37 ordm: 'Wskaźnik rodzaju męskiego liczebnika porządkowego',
38 raquo: 'Prawy cudzysłów ostrokątny',
39 frac14: 'Ułamek zwykły jedna czwarta',
40 frac12: 'Ułamek zwykły jedna druga',
41 frac34: 'Ułamek zwykły trzy czwarte',
42 iquest: 'Odwrócony znak zapytania',
43 Agrave: 'Wielka litera A z akcentem ciężkim',
44 Aacute: 'Wielka litera A z akcentem ostrym',
45 Acirc: 'Wielka litera A z akcentem przeciągłym',
46 Atilde: 'Wielka litera A z tyldą',
47 Auml: 'Wielka litera A z dierezą',
48 Aring: 'Wielka litera A z kółkiem',
49 AElig: 'Wielka ligatura Æ',
50 Ccedil: 'Wielka litera C z cedyllą',
51 Egrave: 'Wielka litera E z akcentem ciężkim',
52 Eacute: 'Wielka litera E z akcentem ostrym',
53 Ecirc: 'Wielka litera E z akcentem przeciągłym',
54 Euml: 'Wielka litera E z dierezą',
55 Igrave: 'Wielka litera I z akcentem ciężkim',
56 Iacute: 'Wielka litera I z akcentem ostrym',
57 Icirc: 'Wielka litera I z akcentem przeciągłym',
58 Iuml: 'Wielka litera I z dierezą',
59 ETH: 'Wielka litera Eth',
60 Ntilde: 'Wielka litera N z tyldą',
61 Ograve: 'Wielka litera O z akcentem ciężkim',
62 Oacute: 'Wielka litera O z akcentem ostrym',
63 Ocirc: 'Wielka litera O z akcentem przeciągłym',
64 Otilde: 'Wielka litera O z tyldą',
65 Ouml: 'Wielka litera O z dierezą',
66 times: 'Znak mnożenia wektorowego',
67 Oslash: 'Wielka litera O z przekreśleniem',
68 Ugrave: 'Wielka litera U z akcentem ciężkim',
69 Uacute: 'Wielka litera U z akcentem ostrym',
70 Ucirc: 'Wielka litera U z akcentem przeciągłym',
71 Uuml: 'Wielka litera U z dierezą',
72 Yacute: 'Wielka litera Y z akcentem ostrym',
73 THORN: 'Wielka litera Thorn',
74 szlig: 'Mała litera ostre s (eszet)',
75 agrave: 'Mała litera a z akcentem ciężkim',
76 aacute: 'Mała litera a z akcentem ostrym',
77 acirc: 'Mała litera a z akcentem przeciągłym',
78 atilde: 'Mała litera a z tyldą',
79 auml: 'Mała litera a z dierezą',
80 aring: 'Mała litera a z kółkiem',
81 aelig: 'Mała ligatura æ',
82 ccedil: 'Mała litera c z cedyllą',
83 egrave: 'Mała litera e z akcentem ciężkim',
84 eacute: 'Mała litera e z akcentem ostrym',
85 ecirc: 'Mała litera e z akcentem przeciągłym',
86 euml: 'Mała litera e z dierezą',
87 igrave: 'Mała litera i z akcentem ciężkim',
88 iacute: 'Mała litera i z akcentem ostrym',
89 icirc: 'Mała litera i z akcentem przeciągłym',
90 iuml: 'Mała litera i z dierezą',
91 eth: 'Mała litera eth',
92 ntilde: 'Mała litera n z tyldą',
93 ograve: 'Mała litera o z akcentem ciężkim',
94 oacute: 'Mała litera o z akcentem ostrym',
95 ocirc: 'Mała litera o z akcentem przeciągłym',
96 otilde: 'Mała litera o z tyldą',
97 ouml: 'Mała litera o z dierezą',
98 divide: 'Anglosaski znak dzielenia',
99 oslash: 'Mała litera o z przekreśleniem',
100 ugrave: 'Mała litera u z akcentem ciężkim',
101 uacute: 'Mała litera u z akcentem ostrym',
102 ucirc: 'Mała litera u z akcentem przeciągłym',
103 uuml: 'Mała litera u z dierezą',
104 yacute: 'Mała litera y z akcentem ostrym',
105 thorn: 'Mała litera thorn',
106 yuml: 'Mała litera y z dierezą',
107 OElig: 'Wielka ligatura OE',
108 oelig: 'Mała ligatura oe',
109 '372': 'Wielka litera W z akcentem przeciągłym',
110 '374': 'Wielka litera Y z akcentem przeciągłym',
111 '373': 'Mała litera w z akcentem przeciągłym',
112 '375': 'Mała litera y z akcentem przeciągłym',
113 sbquo: 'Pojedynczy apostrof dolny',
114 '8219': 'Pojedynczy apostrof górny',
115 bdquo: 'Podwójny apostrof dolny',
116 hellip: 'Wielokropek',
117 trade: 'Znak towarowy',
118 '9658': 'Czarny wskaźnik wskazujący w prawo',
119 bull: 'Punktor',
120 rarr: 'Strzałka w prawo',
121 rArr: 'Podwójna strzałka w prawo',
122 hArr: 'Podwójna strzałka obustronna',
123 diams: 'Czarny znak karo',
124 asymp: 'Znak prawie równe'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/pt-br.js b/sources/plugins/specialchar/dialogs/lang/pt-br.js
new file mode 100644
index 00000000..05e6dea9
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/pt-br.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'pt-br', {
7 euro: 'Euro',
8 lsquo: 'Aspas simples esquerda',
9 rsquo: 'Aspas simples direita',
10 ldquo: 'Aspas duplas esquerda',
11 rdquo: 'Aspas duplas direita',
12 ndash: 'Traço',
13 mdash: 'Travessão',
14 iexcl: 'Ponto de exclamação invertido',
15 cent: 'Cent',
16 pound: 'Cerquilha',
17 curren: 'Dinheiro',
18 yen: 'Yen',
19 brvbar: 'Bara interrompida',
20 sect: 'Símbolo de Parágrafo',
21 uml: 'Trema',
22 copy: 'Direito de Cópia',
23 ordf: 'Indicador ordinal feminino',
24 laquo: 'Aspas duplas angulares esquerda',
25 not: 'Negação',
26 reg: 'Marca Registrada',
27 macr: 'Mácron',
28 deg: 'Grau',
29 sup2: '2 Superscrito',
30 sup3: '3 Superscrito',
31 acute: 'Acento agudo',
32 micro: 'Micro',
33 para: 'Pé de mosca',
34 middot: 'Ponto mediano',
35 cedil: 'Cedilha',
36 sup1: '1 Superscrito',
37 ordm: 'Indicador ordinal masculino',
38 raquo: 'Aspas duplas angulares direita',
39 frac14: 'Um quarto',
40 frac12: 'Um meio',
41 frac34: 'Três quartos',
42 iquest: 'Interrogação invertida',
43 Agrave: 'A maiúsculo com acento grave',
44 Aacute: 'A maiúsculo com acento agudo',
45 Acirc: 'A maiúsculo com acento circunflexo',
46 Atilde: 'A maiúsculo com til',
47 Auml: 'A maiúsculo com trema',
48 Aring: 'A maiúsculo com anel acima',
49 AElig: 'Æ maiúsculo',
50 Ccedil: 'Ç maiúlculo',
51 Egrave: 'E maiúsculo com acento grave',
52 Eacute: 'E maiúsculo com acento agudo',
53 Ecirc: 'E maiúsculo com acento circumflexo',
54 Euml: 'E maiúsculo com trema',
55 Igrave: 'I maiúsculo com acento grave',
56 Iacute: 'I maiúsculo com acento agudo',
57 Icirc: 'I maiúsculo com acento circunflexo',
58 Iuml: 'I maiúsculo com crase',
59 ETH: 'Eth maiúsculo',
60 Ntilde: 'N maiúsculo com til',
61 Ograve: 'O maiúsculo com acento grave',
62 Oacute: 'O maiúsculo com acento agudo',
63 Ocirc: 'O maiúsculo com acento circunflexo',
64 Otilde: 'O maiúsculo com til',
65 Ouml: 'O maiúsculo com trema',
66 times: 'Multiplicação',
67 Oslash: 'Diâmetro',
68 Ugrave: 'U maiúsculo com acento grave',
69 Uacute: 'U maiúsculo com acento agudo',
70 Ucirc: 'U maiúsculo com acento circunflexo',
71 Uuml: 'U maiúsculo com trema',
72 Yacute: 'Y maiúsculo com acento agudo',
73 THORN: 'Thorn maiúsculo',
74 szlig: 'Eszett minúsculo',
75 agrave: 'a minúsculo com acento grave',
76 aacute: 'a minúsculo com acento agudo',
77 acirc: 'a minúsculo com acento circunflexo',
78 atilde: 'a minúsculo com til',
79 auml: 'a minúsculo com trema',
80 aring: 'a minúsculo com anel acima',
81 aelig: 'æ minúsculo',
82 ccedil: 'ç minúsculo',
83 egrave: 'e minúsculo com acento grave',
84 eacute: 'e minúsculo com acento agudo',
85 ecirc: 'e minúsculo com acento circunflexo',
86 euml: 'e minúsculo com trema',
87 igrave: 'i minúsculo com acento grave',
88 iacute: 'i minúsculo com acento agudo',
89 icirc: 'i minúsculo com acento circunflexo',
90 iuml: 'i minúsculo com trema',
91 eth: 'eth minúsculo',
92 ntilde: 'n minúsculo com til',
93 ograve: 'o minúsculo com acento grave',
94 oacute: 'o minúsculo com acento agudo',
95 ocirc: 'o minúsculo com acento circunflexo',
96 otilde: 'o minúsculo com til',
97 ouml: 'o minúsculo com trema',
98 divide: 'Divisão',
99 oslash: 'o minúsculo com cortado ou diâmetro',
100 ugrave: 'u minúsculo com acento grave',
101 uacute: 'u minúsculo com acento agudo',
102 ucirc: 'u minúsculo com acento circunflexo',
103 uuml: 'u minúsculo com trema',
104 yacute: 'y minúsculo com acento agudo',
105 thorn: 'thorn minúsculo',
106 yuml: 'y minúsculo com trema',
107 OElig: 'Ligação tipográfica OE maiúscula',
108 oelig: 'Ligação tipográfica oe minúscula',
109 '372': 'W maiúsculo com acento circunflexo',
110 '374': 'Y maiúsculo com acento circunflexo',
111 '373': 'w minúsculo com acento circunflexo',
112 '375': 'y minúsculo com acento circunflexo',
113 sbquo: 'Aspas simples inferior direita',
114 '8219': 'Aspas simples superior esquerda',
115 bdquo: 'Aspas duplas inferior direita',
116 hellip: 'Reticências',
117 trade: 'Trade mark',
118 '9658': 'Ponta de seta preta para direita',
119 bull: 'Ponto lista',
120 rarr: 'Seta para direita',
121 rArr: 'Seta dupla para direita',
122 hArr: 'Seta dupla direita e esquerda',
123 diams: 'Ouros',
124 asymp: 'Aproximadamente'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/pt.js b/sources/plugins/specialchar/dialogs/lang/pt.js
new file mode 100644
index 00000000..1de00d15
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/pt.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'pt', {
7 euro: 'Símbolo do Euro',
8 lsquo: 'Aspa esquerda simples',
9 rsquo: 'Aspa direita simples',
10 ldquo: 'Aspa esquerda dupla',
11 rdquo: 'Aspa direita dupla',
12 ndash: 'Travessão Simples',
13 mdash: 'Travessão Longo',
14 iexcl: 'Ponto de exclamação invertido',
15 cent: 'Símbolo do Cêntimo',
16 pound: 'Símbolo da Libra',
17 curren: 'Símbolo de Moeda',
18 yen: 'Símbolo do Iene',
19 brvbar: 'Barra quebrada',
20 sect: 'Símbolo de Secção',
21 uml: 'Trema',
22 copy: 'Símbolo dos Direitos de Autor',
23 ordf: 'Indicador ordinal feminino',
24 laquo: 'Aspa esquerda ângulo duplo',
25 not: 'Não Símbolo',
26 reg: 'Símbolo de Registado',
27 macr: 'Mácron',
28 deg: 'Símbolo de Grau',
29 sup2: 'Expoente 2',
30 sup3: 'Expoente 3',
31 acute: 'Acento agudo',
32 micro: 'Símbolo de Micro',
33 para: 'Símbolo de Parágrafo',
34 middot: 'Ponto do Meio',
35 cedil: 'Cedilha',
36 sup1: 'Expoente 1',
37 ordm: 'Indicador ordinal masculino',
38 raquo: 'Aspas ângulo duplo pra Direita',
39 frac14: 'Fração vulgar 1/4',
40 frac12: 'Fração vulgar 1/2',
41 frac34: 'Fração vulgar 3/4',
42 iquest: 'Ponto de interrogação invertido',
43 Agrave: 'Letra maiúscula latina A com acento grave',
44 Aacute: 'Letra maiúscula latina A com acento agudo',
45 Acirc: 'Letra maiúscula latina A com circunflexo',
46 Atilde: 'Letra maiúscula latina A com til',
47 Auml: 'Letra maiúscula latina A com trema',
48 Aring: 'Letra maiúscula latina A com sinal diacrítico',
49 AElig: 'Letra maiúscula latina Æ',
50 Ccedil: 'Letra maiúscula latina C com cedilha',
51 Egrave: 'Letra maiúscula latina E com acento grave',
52 Eacute: 'Letra maiúscula latina E com acento agudo',
53 Ecirc: 'Letra maiúscula latina E com circunflexo',
54 Euml: 'Letra maiúscula latina E com trema',
55 Igrave: 'Letra maiúscula latina I com acento grave',
56 Iacute: 'Letra maiúscula latina I com acento agudo',
57 Icirc: 'Letra maiúscula latina I com cincunflexo',
58 Iuml: 'Letra maiúscula latina I com trema',
59 ETH: 'Letra maiúscula latina Eth (Ðð)',
60 Ntilde: 'Letra maiúscula latina N com til',
61 Ograve: 'Letra maiúscula latina O com acento grave',
62 Oacute: 'Letra maiúscula latina O com acento agudo',
63 Ocirc: 'Letra maiúscula latina I com circunflexo',
64 Otilde: 'Letra maiúscula latina O com til',
65 Ouml: 'Letra maiúscula latina O com trema',
66 times: 'Símbolo de multiplicação',
67 Oslash: 'Letra maiúscula O com barra',
68 Ugrave: 'Letra maiúscula latina U com acento grave',
69 Uacute: 'Letra maiúscula latina U com acento agudo',
70 Ucirc: 'Letra maiúscula latina U com circunflexo',
71 Uuml: 'Letra maiúscula latina E com trema',
72 Yacute: 'Letra maiúscula latina Y com acento agudo',
73 THORN: 'Letra maiúscula latina Rúnico',
74 szlig: 'Letra minúscula latina s forte',
75 agrave: 'Letra minúscula latina a com acento grave',
76 aacute: 'Letra minúscula latina a com acento agudo',
77 acirc: 'Letra minúscula latina a com circunflexo',
78 atilde: 'Letra minúscula latina a com til',
79 auml: 'Letra minúscula latina a com trema',
80 aring: 'Letra minúscula latina a com sinal diacrítico',
81 aelig: 'Letra minúscula latina æ',
82 ccedil: 'Letra minúscula latina c com cedilha',
83 egrave: 'Letra minúscula latina e com acento grave',
84 eacute: 'Letra minúscula latina e com acento agudo',
85 ecirc: 'Letra minúscula latina e com circunflexo',
86 euml: 'Letra minúscula latina e com trema',
87 igrave: 'Letra minúscula latina i com acento grave',
88 iacute: 'Letra minúscula latina i com acento agudo',
89 icirc: 'Letra minúscula latina i com circunflexo',
90 iuml: 'Letra pequena latina i com trema',
91 eth: 'Letra minúscula latina eth',
92 ntilde: 'Letra minúscula latina n com til',
93 ograve: 'Letra minúscula latina o com acento grave',
94 oacute: 'Letra minúscula latina o com acento agudo',
95 ocirc: 'Letra minúscula latina o com circunflexo',
96 otilde: 'Letra minúscula latina o com til',
97 ouml: 'Letra minúscula latina o com trema',
98 divide: 'Símbolo de divisão',
99 oslash: 'Letra minúscula latina o com barra',
100 ugrave: 'Letra minúscula latina u com acento grave',
101 uacute: 'Letra minúscula latina u com acento agudo',
102 ucirc: 'Letra minúscula latina u com circunflexo',
103 uuml: 'Letra minúscula latina u com trema',
104 yacute: 'Letra minúscula latina y com acento agudo',
105 thorn: 'Letra minúscula latina Rúnico',
106 yuml: 'Letra minúscula latina y com trema',
107 OElig: 'Ligadura maiúscula latina OE',
108 oelig: 'Ligadura minúscula latina oe',
109 '372': 'Letra maiúscula latina W com circunflexo',
110 '374': 'Letra maiúscula latina Y com circunflexo',
111 '373': 'Letra minúscula latina w com circunflexo',
112 '375': 'Letra minúscula latina y com circunflexo',
113 sbquo: 'Aspa Simples inferior-9',
114 '8219': 'Aspa Simples superior invertida-9',
115 bdquo: 'Aspa duplas inferior-9',
116 hellip: 'Elipse Horizontal ',
117 trade: 'Símbolo de Marca Registada',
118 '9658': 'Ponteiro preto direito',
119 bull: 'Marca',
120 rarr: 'Seta para a direita',
121 rArr: 'Seta dupla para a direita',
122 hArr: 'Seta dupla direita esquerda',
123 diams: 'Naipe diamante preto',
124 asymp: 'Quase igual a '
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ru.js b/sources/plugins/specialchar/dialogs/lang/ru.js
new file mode 100644
index 00000000..a5b88f11
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ru.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ru', {
7 euro: 'Знак евро',
8 lsquo: 'Левая одинарная кавычка',
9 rsquo: 'Правая одинарная кавычка',
10 ldquo: 'Левая двойная кавычка',
11 rdquo: 'Левая двойная кавычка',
12 ndash: 'Среднее тире',
13 mdash: 'Длинное тире',
14 iexcl: 'перевёрнутый восклицательный знак',
15 cent: 'Цент',
16 pound: 'Фунт',
17 curren: 'Знак валюты',
18 yen: 'Йена',
19 brvbar: 'Вертикальная черта с разрывом',
20 sect: 'Знак параграфа',
21 uml: 'Умлаут',
22 copy: 'Знак охраны авторского права',
23 ordf: 'Указатель окончания женского рода ...ая',
24 laquo: 'Левая кавычка-«ёлочка»',
25 not: 'Отрицание',
26 reg: 'Знак охраны смежных прав\\t',
27 macr: 'Макрон',
28 deg: 'Градус',
29 sup2: 'Надстрочное два',
30 sup3: 'Надстрочное три',
31 acute: 'Акут',
32 micro: 'Микро',
33 para: 'Абзац',
34 middot: 'Интерпункт',
35 cedil: 'Седиль',
36 sup1: 'Надстрочная единица',
37 ordm: 'Порядковое числительное',
38 raquo: 'Правая кавычка-«ёлочка»',
39 frac14: 'Одна четвертая',
40 frac12: 'Одна вторая',
41 frac34: 'Три четвёртых',
42 iquest: 'Перевёрнутый вопросительный знак',
43 Agrave: 'Латинская заглавная буква А с апострофом',
44 Aacute: 'Латинская заглавная буква A с ударением',
45 Acirc: 'Латинская заглавная буква А с циркумфлексом',
46 Atilde: 'Латинская заглавная буква А с тильдой',
47 Auml: 'Латинская заглавная буква А с тремой',
48 Aring: 'Латинская заглавная буква А с кольцом над ней',
49 AElig: 'Латинская большая буква Æ',
50 Ccedil: 'Латинская заглавная буква C с седилью',
51 Egrave: 'Латинская заглавная буква Е с апострофом',
52 Eacute: 'Латинская заглавная буква Е с ударением',
53 Ecirc: 'Латинская заглавная буква Е с циркумфлексом',
54 Euml: 'Латинская заглавная буква Е с тремой',
55 Igrave: 'Латинская заглавная буква I с апострофом',
56 Iacute: 'Латинская заглавная буква I с ударением',
57 Icirc: 'Латинская заглавная буква I с циркумфлексом',
58 Iuml: 'Латинская заглавная буква I с тремой',
59 ETH: 'Латинская большая буква Eth',
60 Ntilde: 'Латинская заглавная буква N с тильдой',
61 Ograve: 'Латинская заглавная буква O с апострофом',
62 Oacute: 'Латинская заглавная буква O с ударением',
63 Ocirc: 'Латинская заглавная буква O с циркумфлексом',
64 Otilde: 'Латинская заглавная буква O с тильдой',
65 Ouml: 'Латинская заглавная буква O с тремой',
66 times: 'Знак умножения',
67 Oslash: 'Латинская большая перечеркнутая O',
68 Ugrave: 'Латинская заглавная буква U с апострофом',
69 Uacute: 'Латинская заглавная буква U с ударением',
70 Ucirc: 'Латинская заглавная буква U с циркумфлексом',
71 Uuml: 'Латинская заглавная буква U с тремой',
72 Yacute: 'Латинская заглавная буква Y с ударением',
73 THORN: 'Латинская заглавная буква Thorn',
74 szlig: 'Знак диеза',
75 agrave: 'Латинская маленькая буква a с апострофом',
76 aacute: 'Латинская маленькая буква a с ударением',
77 acirc: 'Латинская маленькая буква a с циркумфлексом',
78 atilde: 'Латинская маленькая буква a с тильдой',
79 auml: 'Латинская маленькая буква a с тремой',
80 aring: 'Латинская маленькая буква a с кольцом',
81 aelig: 'Латинская маленькая буква æ',
82 ccedil: 'Латинская маленькая буква с с седилью',
83 egrave: 'Латинская маленькая буква е с апострофом',
84 eacute: 'Латинская маленькая буква е с ударением',
85 ecirc: 'Латинская маленькая буква е с циркумфлексом',
86 euml: 'Латинская маленькая буква е с тремой',
87 igrave: 'Латинская маленькая буква i с апострофом',
88 iacute: 'Латинская маленькая буква i с ударением',
89 icirc: 'Латинская маленькая буква i с циркумфлексом',
90 iuml: 'Латинская маленькая буква i с тремой',
91 eth: 'Латинская маленькая буква eth',
92 ntilde: 'Латинская маленькая буква n с тильдой',
93 ograve: 'Латинская маленькая буква o с апострофом',
94 oacute: 'Латинская маленькая буква o с ударением',
95 ocirc: 'Латинская маленькая буква o с циркумфлексом',
96 otilde: 'Латинская маленькая буква o с тильдой',
97 ouml: 'Латинская маленькая буква o с тремой',
98 divide: 'Знак деления',
99 oslash: 'Латинская строчная перечеркнутая o',
100 ugrave: 'Латинская маленькая буква u с апострофом',
101 uacute: 'Латинская маленькая буква u с ударением',
102 ucirc: 'Латинская маленькая буква u с циркумфлексом',
103 uuml: 'Латинская маленькая буква u с тремой',
104 yacute: 'Латинская маленькая буква y с ударением',
105 thorn: 'Латинская маленькая буква thorn',
106 yuml: 'Латинская маленькая буква y с тремой',
107 OElig: 'Латинская прописная лигатура OE',
108 oelig: 'Латинская строчная лигатура oe',
109 '372': 'Латинская заглавная буква W с циркумфлексом',
110 '374': 'Латинская заглавная буква Y с циркумфлексом',
111 '373': 'Латинская маленькая буква w с циркумфлексом',
112 '375': 'Латинская маленькая буква y с циркумфлексом',
113 sbquo: 'Нижняя одинарная кавычка',
114 '8219': 'Правая одинарная кавычка',
115 bdquo: 'Левая двойная кавычка',
116 hellip: 'Горизонтальное многоточие',
117 trade: 'Товарный знак',
118 '9658': 'Черный указатель вправо',
119 bull: 'Маркер списка',
120 rarr: 'Стрелка вправо',
121 rArr: 'Двойная стрелка вправо',
122 hArr: 'Двойная стрелка влево-вправо',
123 diams: 'Черный ромб',
124 asymp: 'Примерно равно'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/si.js b/sources/plugins/specialchar/dialogs/lang/si.js
new file mode 100644
index 00000000..174e3e44
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/si.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'si', {
7 euro: 'යුරෝ සලකුණ',
8 lsquo: 'වමේ තනි උපුටා දක්වීම ',
9 rsquo: 'දකුණේ තනි උපුටා දක්වීම ',
10 ldquo: 'වමේ දිත්ව උපුටා දක්වීම ',
11 rdquo: 'දකුණේ දිත්ව උපුටා දක්වීම ',
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'යටිකුරු හර්ෂදී ',
15 cent: 'Cent sign', // MISSING
16 pound: 'Pound sign', // MISSING
17 curren: 'මුල්‍යමය ',
18 yen: 'යෙන් ',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'තෙරේම් ',
21 uml: 'Diaeresis', // MISSING
22 copy: 'පිටපත් අයිතිය ',
23 ordf: 'දර්ශකය',
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'සලකුණක් නොවේ',
26 reg: 'සලකුණක් ලියාපදිංචි කිරීම',
27 macr: 'මුද්‍රිත ',
28 deg: 'සලකුණේ ',
29 sup2: 'උඩු ලකුණු දෙක',
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Micro sign', // MISSING
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/sk.js b/sources/plugins/specialchar/dialogs/lang/sk.js
new file mode 100644
index 00000000..ce232aa7
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/sk.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'sk', {
7 euro: 'Znak eura',
8 lsquo: 'Ľavá jednoduchá úvodzovka',
9 rsquo: 'Pravá jednoduchá úvodzovka',
10 ldquo: 'Pravá dvojitá úvodzovka',
11 rdquo: 'Pravá dvojitá úvodzovka',
12 ndash: 'En pomlčka',
13 mdash: 'Em pomlčka',
14 iexcl: 'Obrátený výkričník',
15 cent: 'Znak centu',
16 pound: 'Znak libry',
17 curren: 'Znak meny',
18 yen: 'Znak jenu',
19 brvbar: 'Prerušená zvislá čiara',
20 sect: 'Znak odseku',
21 uml: 'Prehláska',
22 copy: 'Znak copyrightu',
23 ordf: 'Ženský indikátor rodu',
24 laquo: 'Znak dvojitých lomených úvodzoviek vľavo',
25 not: 'Logistický zápor',
26 reg: 'Znak registrácie',
27 macr: 'Pomlčka nad',
28 deg: 'Znak stupňa',
29 sup2: 'Dvojka ako horný index',
30 sup3: 'Trojka ako horný index',
31 acute: 'Dĺžeň',
32 micro: 'Znak mikro',
33 para: 'Znak odstavca',
34 middot: 'Bodka uprostred',
35 cedil: 'Chvost vľavo',
36 sup1: 'Jednotka ako horný index',
37 ordm: 'Mužský indikátor rodu',
38 raquo: 'Znak dvojitých lomených úvodzoviek vpravo',
39 frac14: 'Obyčajný zlomok jedna štvrtina',
40 frac12: 'Obyčajný zlomok jedna polovica',
41 frac34: 'Obyčajný zlomok tri štvrtiny',
42 iquest: 'Otočený otáznik',
43 Agrave: 'Veľké písmeno latinky A s accentom',
44 Aacute: 'Veľké písmeno latinky A s dĺžňom',
45 Acirc: 'Veľké písmeno latinky A s mäkčeňom',
46 Atilde: 'Veľké písmeno latinky A s tildou',
47 Auml: 'Veľké písmeno latinky A s dvoma bodkami',
48 Aring: 'Veľké písmeno latinky A s krúžkom nad',
49 AElig: 'Veľké písmeno latinky Æ',
50 Ccedil: 'Veľké písmeno latinky C s chvostom vľavo',
51 Egrave: 'Veľké písmeno latinky E s accentom',
52 Eacute: 'Veľké písmeno latinky E s dĺžňom',
53 Ecirc: 'Veľké písmeno latinky E s mäkčeňom',
54 Euml: 'Veľké písmeno latinky E s dvoma bodkami',
55 Igrave: 'Veľké písmeno latinky I s accentom',
56 Iacute: 'Veľké písmeno latinky I s dĺžňom',
57 Icirc: 'Veľké písmeno latinky I s mäkčeňom',
58 Iuml: 'Veľké písmeno latinky I s dvoma bodkami',
59 ETH: 'Veľké písmeno latinky Eth',
60 Ntilde: 'Veľké písmeno latinky N s tildou',
61 Ograve: 'Veľké písmeno latinky O s accentom',
62 Oacute: 'Veľké písmeno latinky O s dĺžňom',
63 Ocirc: 'Veľké písmeno latinky O s mäkčeňom',
64 Otilde: 'Veľké písmeno latinky O s tildou',
65 Ouml: 'Veľké písmeno latinky O s dvoma bodkami',
66 times: 'Znak násobenia',
67 Oslash: 'Veľké písmeno latinky O preškrtnuté',
68 Ugrave: 'Veľké písmeno latinky U s accentom',
69 Uacute: 'Veľké písmeno latinky U s dĺžňom',
70 Ucirc: 'Veľké písmeno latinky U s mäkčeňom',
71 Uuml: 'Veľké písmeno latinky U s dvoma bodkami',
72 Yacute: 'Veľké písmeno latinky Y s dĺžňom',
73 THORN: 'Veľké písmeno latinky Thorn',
74 szlig: 'Malé písmeno latinky ostré s',
75 agrave: 'Malé písmeno latinky a s accentom',
76 aacute: 'Malé písmeno latinky a s dĺžňom',
77 acirc: 'Malé písmeno latinky a s mäkčeňom',
78 atilde: 'Malé písmeno latinky a s tildou',
79 auml: 'Malé písmeno latinky a s dvoma bodkami',
80 aring: 'Malé písmeno latinky a s krúžkom nad',
81 aelig: 'Malé písmeno latinky æ',
82 ccedil: 'Malé písmeno latinky c s chvostom vľavo',
83 egrave: 'Malé písmeno latinky e s accentom',
84 eacute: 'Malé písmeno latinky e s dĺžňom',
85 ecirc: 'Malé písmeno latinky e s mäkčeňom',
86 euml: 'Malé písmeno latinky e s dvoma bodkami',
87 igrave: 'Malé písmeno latinky i s accentom',
88 iacute: 'Malé písmeno latinky i s dĺžňom',
89 icirc: 'Malé písmeno latinky i s mäkčeňom',
90 iuml: 'Malé písmeno latinky i s dvoma bodkami',
91 eth: 'Malé písmeno latinky eth',
92 ntilde: 'Malé písmeno latinky n s tildou',
93 ograve: 'Malé písmeno latinky o s accentom',
94 oacute: 'Malé písmeno latinky o s dĺžňom',
95 ocirc: 'Malé písmeno latinky o s mäkčeňom',
96 otilde: 'Malé písmeno latinky o s tildou',
97 ouml: 'Malé písmeno latinky o s dvoma bodkami',
98 divide: 'Znak delenia',
99 oslash: 'Malé písmeno latinky o preškrtnuté',
100 ugrave: 'Malé písmeno latinky u s accentom',
101 uacute: 'Malé písmeno latinky u s dĺžňom',
102 ucirc: 'Malé písmeno latinky u s mäkčeňom',
103 uuml: 'Malé písmeno latinky u s dvoma bodkami',
104 yacute: 'Malé písmeno latinky y s dĺžňom',
105 thorn: 'Malé písmeno latinky thorn',
106 yuml: 'Malé písmeno latinky y s dvoma bodkami',
107 OElig: 'Veľká ligatúra latinky OE',
108 oelig: 'Malá ligatúra latinky OE',
109 '372': 'Veľké písmeno latinky W s mäkčeňom',
110 '374': 'Veľké písmeno latinky Y s mäkčeňom',
111 '373': 'Malé písmeno latinky w s mäkčeňom',
112 '375': 'Malé písmeno latinky y s mäkčeňom',
113 sbquo: 'Dolná jednoduchá 9-úvodzovka',
114 '8219': 'Horná jednoduchá otočená 9-úvodzovka',
115 bdquo: 'Dolná dvojitá 9-úvodzovka',
116 hellip: 'Trojbodkový úvod',
117 trade: 'Znak ibchodnej značky',
118 '9658': 'Čierny ukazovateľ smerujúci vpravo',
119 bull: 'Kruh',
120 rarr: 'Šípka vpravo',
121 rArr: 'Dvojitá šipka vpravo',
122 hArr: 'Dvojitá šipka vľavo a vpravo',
123 diams: 'Čierne piky',
124 asymp: 'Skoro sa rovná'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/sl.js b/sources/plugins/specialchar/dialogs/lang/sl.js
new file mode 100644
index 00000000..34eeeedd
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/sl.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'sl', {
7 euro: 'Evro znak',
8 lsquo: 'Levi enojni narekovaj',
9 rsquo: 'Desni enojni narekovaj',
10 ldquo: 'Levi dvojni narekovaj',
11 rdquo: 'Desni dvojni narekovaj',
12 ndash: 'En pomišljaj',
13 mdash: 'Em pomišljaj',
14 iexcl: 'Obrnjen klicaj',
15 cent: 'Cent znak',
16 pound: 'Funt znak',
17 curren: 'Znak valute',
18 yen: 'Jen znak',
19 brvbar: 'Zlomljena črta',
20 sect: 'Znak oddelka',
21 uml: 'Diaeresis',
22 copy: 'Znak avtorskih pravic',
23 ordf: 'Ženski zaporedni kazalnik',
24 laquo: 'Levi obrnjen dvojni kotni narekovaj',
25 not: 'Ne znak',
26 reg: 'Registrirani znak',
27 macr: 'Macron',
28 deg: 'Znak stopinj',
29 sup2: 'Nadpisano dva',
30 sup3: 'Nadpisano tri',
31 acute: 'Ostrivec',
32 micro: 'Mikro znak',
33 para: 'Pilcrow znak',
34 middot: 'Sredinska pika',
35 cedil: 'Cedilla',
36 sup1: 'Nadpisano ena',
37 ordm: 'Moški zaporedni kazalnik',
38 raquo: 'Desno obrnjen dvojni kotni narekovaj',
39 frac14: 'Ena četrtina',
40 frac12: 'Ena polovica',
41 frac34: 'Tri četrtine',
42 iquest: 'Obrnjen vprašaj',
43 Agrave: 'Velika latinska črka A s krativcem',
44 Aacute: 'Velika latinska črka A z ostrivcem',
45 Acirc: 'Velika latinska črka A s strešico',
46 Atilde: 'Velika latinska črka A z tildo',
47 Auml: 'Velika latinska črka A z diaeresis-om',
48 Aring: 'Velika latinska črka A z obročem',
49 AElig: 'Velika latinska črka Æ',
50 Ccedil: 'Velika latinska črka C s cedillo',
51 Egrave: 'Velika latinska črka E s krativcem',
52 Eacute: 'Velika latinska črka E z ostrivcem',
53 Ecirc: 'Velika latinska črka E s strešico',
54 Euml: 'Velika latinska črka E z diaeresis-om',
55 Igrave: 'Velika latinska črka I s krativcem',
56 Iacute: 'Velika latinska črka I z ostrivcem',
57 Icirc: 'Velika latinska črka I s strešico',
58 Iuml: 'Velika latinska črka I z diaeresis-om',
59 ETH: 'Velika latinska črka Eth',
60 Ntilde: 'Velika latinska črka N s tildo',
61 Ograve: 'Velika latinska črka O s krativcem',
62 Oacute: 'Velika latinska črka O z ostrivcem',
63 Ocirc: 'Velika latinska črka O s strešico',
64 Otilde: 'Velika latinska črka O s tildo',
65 Ouml: 'Velika latinska črka O z diaeresis-om',
66 times: 'Znak za množenje',
67 Oslash: 'Velika prečrtana latinska črka O',
68 Ugrave: 'Velika latinska črka U s krativcem',
69 Uacute: 'Velika latinska črka U z ostrivcem',
70 Ucirc: 'Velika latinska črka U s strešico',
71 Uuml: 'Velika latinska črka U z diaeresis-om',
72 Yacute: 'Velika latinska črka Y z ostrivcem',
73 THORN: 'Velika latinska črka Thorn',
74 szlig: 'Mala ostra latinska črka s',
75 agrave: 'Mala latinska črka a s krativcem',
76 aacute: 'Mala latinska črka a z ostrivcem',
77 acirc: 'Mala latinska črka a s strešico',
78 atilde: 'Mala latinska črka a s tildo',
79 auml: 'Mala latinska črka a z diaeresis-om',
80 aring: 'Mala latinska črka a z obročem',
81 aelig: 'Mala latinska črka æ',
82 ccedil: 'Mala latinska črka c s cedillo',
83 egrave: 'Mala latinska črka e s krativcem',
84 eacute: 'Mala latinska črka e z ostrivcem',
85 ecirc: 'Mala latinska črka e s strešico',
86 euml: 'Mala latinska črka e z diaeresis-om',
87 igrave: 'Mala latinska črka i s krativcem',
88 iacute: 'Mala latinska črka i z ostrivcem',
89 icirc: 'Mala latinska črka i s strešico',
90 iuml: 'Mala latinska črka i z diaeresis-om',
91 eth: 'Mala latinska črka eth',
92 ntilde: 'Mala latinska črka n s tildo',
93 ograve: 'Mala latinska črka o s krativcem',
94 oacute: 'Mala latinska črka o z ostrivcem',
95 ocirc: 'Mala latinska črka o s strešico',
96 otilde: 'Mala latinska črka o s tildo',
97 ouml: 'Mala latinska črka o z diaeresis-om',
98 divide: 'Znak za deljenje',
99 oslash: 'Mala prečrtana latinska črka o',
100 ugrave: 'Mala latinska črka u s krativcem',
101 uacute: 'Mala latinska črka u z ostrivcem',
102 ucirc: 'Mala latinska črka u s strešico',
103 uuml: 'Mala latinska črka u z diaeresis-om',
104 yacute: 'Mala latinska črka y z ostrivcem',
105 thorn: 'Mala latinska črka thorn',
106 yuml: 'Mala latinska črka y z diaeresis-om',
107 OElig: 'Velika latinska ligatura OE',
108 oelig: 'Mala latinska ligatura oe',
109 '372': 'Velika latinska črka W s strešico',
110 '374': 'Velika latinska črka Y s strešico',
111 '373': 'Mala latinska črka w s strešico',
112 '375': 'Mala latinska črka y s strešico',
113 sbquo: 'Enojni nizki-9 narekovaj',
114 '8219': 'Enojni visoki-obrnjen-9 narekovaj',
115 bdquo: 'Dvojni nizki-9 narekovaj',
116 hellip: 'Horizontalni izpust',
117 trade: 'Znak blagovne znamke',
118 '9658': 'Črni desno-usmerjen kazalec',
119 bull: 'Krogla',
120 rarr: 'Desno-usmerjena puščica',
121 rArr: 'Desno-usmerjena dvojna puščica',
122 hArr: 'Leva in desna dvojna puščica',
123 diams: 'Črna kara',
124 asymp: 'Skoraj enako'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/sq.js b/sources/plugins/specialchar/dialogs/lang/sq.js
new file mode 100644
index 00000000..f45e3ec7
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/sq.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'sq', {
7 euro: 'Shenja e Euros',
8 lsquo: 'Thonjëza majtas me një vi',
9 rsquo: 'Thonjëza djathtas me një vi',
10 ldquo: 'Thonjëza majtas',
11 rdquo: 'Thonjëza djathtas',
12 ndash: 'En viza lidhëse',
13 mdash: 'Em viza lidhëse',
14 iexcl: 'Pikëçuditëse e përmbysur',
15 cent: 'Shenja e Centit',
16 pound: 'Shejna e Funtit',
17 curren: 'Shenja e valutës',
18 yen: 'Shenja e Jenit',
19 brvbar: 'Viza e këputur',
20 sect: 'Shenja e pjesës',
21 uml: 'Diaeresis',
22 copy: 'Shenja e të drejtave të kopjimit',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Nuk ka shenjë',
26 reg: 'Shenja e të regjistruarit',
27 macr: 'Macron',
28 deg: 'Shenja e shkallës',
29 sup2: 'Super-skripta dy',
30 sup3: 'Super-skripta tre',
31 acute: 'Theks i mprehtë',
32 micro: 'Shjenja e Mikros',
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Pika e Mesme',
35 cedil: 'Hark nën shkronja',
36 sup1: 'Super-skripta një',
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Thyesa një të katrat',
40 frac12: 'Thyesa një të dytat',
41 frac34: 'Thyesa tre të katrat',
42 iquest: 'Pikëpyetje e përmbysur',
43 Agrave: 'Shkronja e madhe latine A me theks të rëndë',
44 Aacute: 'Shkronja e madhe latine A me theks akute',
45 Acirc: 'Shkronja e madhe latine A me theks lakor',
46 Atilde: 'Shkronja e madhe latine A me tildë',
47 Auml: 'Shkronja e madhe latine A me dy pika',
48 Aring: 'Shkronja e madhe latine A me unazë mbi',
49 AElig: 'Shkronja e madhe latine Æ',
50 Ccedil: 'Shkronja e madhe latine C me hark poshtë',
51 Egrave: 'Shkronja e madhe latine E me theks të rëndë',
52 Eacute: 'Shkronja e madhe latine E me theks akute',
53 Ecirc: 'Shkronja e madhe latine E me theks lakor',
54 Euml: 'Shkronja e madhe latine E me dy pika',
55 Igrave: 'Shkronja e madhe latine I me theks të rëndë',
56 Iacute: 'Shkronja e madhe latine I me theks akute',
57 Icirc: 'Shkronja e madhe latine I me theks lakor',
58 Iuml: 'Shkronja e madhe latine I me dy pika',
59 ETH: 'Shkronja e madhe latine Eth',
60 Ntilde: 'Shkronja e madhe latine N me tildë',
61 Ograve: 'Shkronja e madhe latine O me theks të rëndë',
62 Oacute: 'Shkronja e madhe latine O me theks akute',
63 Ocirc: 'Shkronja e madhe latine O me theks lakor',
64 Otilde: 'Shkronja e madhe latine O me tildë',
65 Ouml: 'Shkronja e madhe latine O me dy pika',
66 times: 'Shenja e shumëzimit',
67 Oslash: 'Shkronja e madhe latine O me vizë në mes',
68 Ugrave: 'Shkronja e madhe latine U me theks të rëndë',
69 Uacute: 'Shkronja e madhe latine U me theks akute',
70 Ucirc: 'Shkronja e madhe latine U me theks lakor',
71 Uuml: 'Shkronja e madhe latine U me dy pika',
72 Yacute: 'Shkronja e madhe latine Y me theks akute',
73 THORN: 'Shkronja e madhe latine Thorn',
74 szlig: 'Shkronja e vogë latine s e mprehtë',
75 agrave: 'Shkronja e vogë latine a me theks të rëndë',
76 aacute: 'Shkronja e vogë latine a me theks të mprehtë',
77 acirc: 'Shkronja e vogël latine a me theks lakor',
78 atilde: 'Shkronja e vogël latine a me tildë',
79 auml: 'Shkronja e vogël latine a me dy pika',
80 aring: 'Shkronja e vogë latine a me unazë mbi',
81 aelig: 'Shkronja e vogë latine æ',
82 ccedil: 'Shkronja e vogël latine c me hark poshtë',
83 egrave: 'Shkronja e vogë latine e me theks të rëndë',
84 eacute: 'Shkronja e vogë latine e me theks të mprehtë',
85 ecirc: 'Shkronja e vogël latine e me theks lakor',
86 euml: 'Shkronja e vogël latine e me dy pika',
87 igrave: 'Shkronja e vogë latine i me theks të rëndë',
88 iacute: 'Shkronja e vogë latine i me theks të mprehtë',
89 icirc: 'Shkronja e vogël latine i me theks lakor',
90 iuml: 'Shkronja e vogël latine i me dy pika',
91 eth: 'Shkronja e vogë latine eth',
92 ntilde: 'Shkronja e vogël latine n me tildë',
93 ograve: 'Shkronja e vogë latine o me theks të rëndë',
94 oacute: 'Shkronja e vogë latine o me theks të mprehtë',
95 ocirc: 'Shkronja e vogël latine o me theks lakor',
96 otilde: 'Shkronja e vogël latine o me tildë',
97 ouml: 'Shkronja e vogël latine o me dy pika',
98 divide: 'Shenja ndarëse',
99 oslash: 'Shkronja e vogël latine o me vizë në mes',
100 ugrave: 'Shkronja e vogë latine u me theks të rëndë',
101 uacute: 'Shkronja e vogë latine u me theks të mprehtë',
102 ucirc: 'Shkronja e vogël latine u me theks lakor',
103 uuml: 'Shkronja e vogël latine u me dy pika',
104 yacute: 'Shkronja e vogë latine y me theks të mprehtë',
105 thorn: 'Shkronja e vogël latine thorn',
106 yuml: 'Shkronja e vogël latine y me dy pika',
107 OElig: 'Shkronja e madhe e bashkuar latine OE',
108 oelig: 'Shkronja e vogël e bashkuar latine oe',
109 '372': 'Shkronja e madhe latine W me theks lakor',
110 '374': 'Shkronja e madhe latine Y me theks lakor',
111 '373': 'Shkronja e vogël latine w me theks lakor',
112 '375': 'Shkronja e vogël latine y me theks lakor',
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Shenja e Simbolit Tregtarë',
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Pulla',
120 rarr: 'Shigjeta djathtas',
121 rArr: 'Shenja të dyfishta djathtas',
122 hArr: 'Shigjeta e dyfishë majtas-djathtas',
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Gati e barabar me'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/sv.js b/sources/plugins/specialchar/dialogs/lang/sv.js
new file mode 100644
index 00000000..68a00f06
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/sv.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'sv', {
7 euro: 'Eurotecken',
8 lsquo: 'Enkelt vänster citattecken',
9 rsquo: 'Enkelt höger citattecken',
10 ldquo: 'Dubbelt vänster citattecken',
11 rdquo: 'Dubbelt höger citattecken',
12 ndash: 'Snedstreck',
13 mdash: 'Långt tankstreck',
14 iexcl: 'Inverterad utropstecken',
15 cent: 'Centtecken',
16 pound: 'Pundtecken',
17 curren: 'Valutatecken',
18 yen: 'Yentecken',
19 brvbar: 'Brutet lodrätt streck',
20 sect: 'Paragraftecken',
21 uml: 'Diaeresis',
22 copy: 'Upphovsrättstecken',
23 ordf: 'Feminit ordningstalsindikator',
24 laquo: 'Vänsterställt dubbelt vinkelcitationstecken',
25 not: 'Icke-tecken',
26 reg: 'Registrerad',
27 macr: 'Macron',
28 deg: 'Grader',
29 sup2: 'Upphöjt två',
30 sup3: 'Upphöjt tre',
31 acute: 'Akut accent',
32 micro: 'Mikrotecken',
33 para: 'Alinea',
34 middot: 'Centrerad prick',
35 cedil: 'Cedilj',
36 sup1: 'Upphöjt en',
37 ordm: 'Maskulina ordningsändelsen',
38 raquo: 'Högerställt dubbelt vinkelcitationstecken',
39 frac14: 'Bråktal - en kvart',
40 frac12: 'Bråktal - en halv',
41 frac34: 'Bråktal - tre fjärdedelar',
42 iquest: 'Inverterat frågetecken',
43 Agrave: 'Stort A med grav accent',
44 Aacute: 'Stort A med akutaccent',
45 Acirc: 'Stort A med circumflex',
46 Atilde: 'Stort A med tilde',
47 Auml: 'Stort A med diaresis',
48 Aring: 'Stort A med ring ovan',
49 AElig: 'Stort Æ',
50 Ccedil: 'Stort C med cedilj',
51 Egrave: 'Stort E med grav accent',
52 Eacute: 'Stort E med aktuaccent',
53 Ecirc: 'Stort E med circumflex',
54 Euml: 'Stort E med diaeresis',
55 Igrave: 'Stort I med grav accent',
56 Iacute: 'Stort I med akutaccent',
57 Icirc: 'Stort I med circumflex',
58 Iuml: 'Stort I med diaeresis',
59 ETH: 'Stort Eth',
60 Ntilde: 'Stort N med tilde',
61 Ograve: 'Stort O med grav accent',
62 Oacute: 'Stort O med aktuaccent',
63 Ocirc: 'Stort O med circumflex',
64 Otilde: 'Stort O med tilde',
65 Ouml: 'Stort O med diaeresis',
66 times: 'Multiplicera',
67 Oslash: 'Stor Ø',
68 Ugrave: 'Stort U med grav accent',
69 Uacute: 'Stort U med akutaccent',
70 Ucirc: 'Stort U med circumflex',
71 Uuml: 'Stort U med diaeresis',
72 Yacute: 'Stort Y med akutaccent',
73 THORN: 'Stort Thorn',
74 szlig: 'Litet dubbel-s/Eszett',
75 agrave: 'Litet a med grav accent',
76 aacute: 'Litet a med akutaccent',
77 acirc: 'Litet a med circumflex',
78 atilde: 'Litet a med tilde',
79 auml: 'Litet a med diaeresis',
80 aring: 'Litet a med ring ovan',
81 aelig: 'Bokstaven æ',
82 ccedil: 'Litet c med cedilj',
83 egrave: 'Litet e med grav accent',
84 eacute: 'Litet e med akutaccent',
85 ecirc: 'Litet e med circumflex',
86 euml: 'Litet e med diaeresis',
87 igrave: 'Litet i med grav accent',
88 iacute: 'Litet i med akutaccent',
89 icirc: 'LItet i med circumflex',
90 iuml: 'Litet i med didaeresis',
91 eth: 'Litet eth',
92 ntilde: 'Litet n med tilde',
93 ograve: 'LItet o med grav accent',
94 oacute: 'LItet o med akutaccent',
95 ocirc: 'Litet o med circumflex',
96 otilde: 'LItet o med tilde',
97 ouml: 'Litet o med diaeresis',
98 divide: 'Division',
99 oslash: 'ø',
100 ugrave: 'Litet u med grav accent',
101 uacute: 'Litet u med akutaccent',
102 ucirc: 'LItet u med circumflex',
103 uuml: 'Litet u med diaeresis',
104 yacute: 'Litet y med akutaccent',
105 thorn: 'Litet thorn',
106 yuml: 'Litet y med diaeresis',
107 OElig: 'Stor ligatur av OE',
108 oelig: 'Liten ligatur av oe',
109 '372': 'Stort W med circumflex',
110 '374': 'Stort Y med circumflex',
111 '373': 'Litet w med circumflex',
112 '375': 'Litet y med circumflex',
113 sbquo: 'Enkelt lågt 9-citationstecken',
114 '8219': 'Enkelt högt bakvänt 9-citationstecken',
115 bdquo: 'Dubbelt lågt 9-citationstecken',
116 hellip: 'Horisontellt uteslutningstecken',
117 trade: 'Varumärke',
118 '9658': 'Svart högervänd pekare',
119 bull: 'Listpunkt',
120 rarr: 'Högerpil',
121 rArr: 'Dubbel högerpil',
122 hArr: 'Dubbel vänsterpil',
123 diams: 'Svart ruter',
124 asymp: 'Ungefär lika med'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/th.js b/sources/plugins/specialchar/dialogs/lang/th.js
new file mode 100644
index 00000000..f4c60cb1
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/th.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'th', {
7 euro: 'Euro sign', // MISSING
8 lsquo: 'Left single quotation mark', // MISSING
9 rsquo: 'Right single quotation mark', // MISSING
10 ldquo: 'Left double quotation mark', // MISSING
11 rdquo: 'Right double quotation mark', // MISSING
12 ndash: 'En dash', // MISSING
13 mdash: 'Em dash', // MISSING
14 iexcl: 'Inverted exclamation mark', // MISSING
15 cent: 'Cent sign', // MISSING
16 pound: 'Pound sign', // MISSING
17 curren: 'สัญลักษณ์สกุลเงิน',
18 yen: 'สัญลักษณ์เงินเยน',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Section sign', // MISSING
21 uml: 'Diaeresis', // MISSING
22 copy: 'Copyright sign', // MISSING
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Left-pointing double angle quotation mark', // MISSING
25 not: 'Not sign', // MISSING
26 reg: 'Registered sign', // MISSING
27 macr: 'Macron', // MISSING
28 deg: 'Degree sign', // MISSING
29 sup2: 'Superscript two', // MISSING
30 sup3: 'Superscript three', // MISSING
31 acute: 'Acute accent', // MISSING
32 micro: 'Micro sign', // MISSING
33 para: 'Pilcrow sign', // MISSING
34 middot: 'Middle dot', // MISSING
35 cedil: 'Cedilla', // MISSING
36 sup1: 'Superscript one', // MISSING
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Right-pointing double angle quotation mark', // MISSING
39 frac14: 'Vulgar fraction one quarter', // MISSING
40 frac12: 'Vulgar fraction one half', // MISSING
41 frac34: 'Vulgar fraction three quarters', // MISSING
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'Latin capital letter O with grave accent', // MISSING
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'Latin small letter n with tilde', // MISSING
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'Division sign', // MISSING
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'Trade mark sign', // MISSING
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'สัญลักษณ์หัวข้อย่อย',
120 rarr: 'Rightwards arrow', // MISSING
121 rArr: 'Rightwards double arrow', // MISSING
122 hArr: 'Left right double arrow', // MISSING
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'Almost equal to' // MISSING
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/tr.js b/sources/plugins/specialchar/dialogs/lang/tr.js
new file mode 100644
index 00000000..fd2cdcaa
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/tr.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'tr', {
7 euro: 'Euro işareti',
8 lsquo: 'Sol tek tırnak işareti',
9 rsquo: 'Sağ tek tırnak işareti',
10 ldquo: 'Sol çift tırnak işareti',
11 rdquo: 'Sağ çift tırnak işareti',
12 ndash: 'En tire',
13 mdash: 'Em tire',
14 iexcl: 'Ters ünlem işareti',
15 cent: 'Cent işareti',
16 pound: 'Pound işareti',
17 curren: 'Para birimi işareti',
18 yen: 'Yen işareti',
19 brvbar: 'Kırık bar',
20 sect: 'Bölüm işareti',
21 uml: 'İki sesli harfin ayrılması',
22 copy: 'Telif hakkı işareti',
23 ordf: 'Dişil sıralı gösterge',
24 laquo: 'Sol-işaret çift açı tırnak işareti',
25 not: 'Not işareti',
26 reg: 'Kayıtlı işareti',
27 macr: 'Makron',
28 deg: 'Derece işareti',
29 sup2: 'İkili üstsimge',
30 sup3: 'Üçlü üstsimge',
31 acute: 'Aksan işareti',
32 micro: 'Mikro işareti',
33 para: 'Pilcrow işareti',
34 middot: 'Orta nokta',
35 cedil: 'Kedilla',
36 sup1: 'Üstsimge',
37 ordm: 'Eril sıralı gösterge',
38 raquo: 'Sağ işaret çift açı tırnak işareti',
39 frac14: 'Bayağı kesrin dörtte biri',
40 frac12: 'Bayağı kesrin bir yarım',
41 frac34: 'Bayağı kesrin dörtte üç',
42 iquest: 'Ters soru işareti',
43 Agrave: 'Aksanlı latin harfi',
44 Aacute: 'Aşırı aksanıyla Latin harfi',
45 Acirc: 'Çarpık Latin harfi',
46 Atilde: 'Tilde latin harfi',
47 Auml: 'Sesli harf ayrılımlıı latin harfi',
48 Aring: 'Halkalı latin büyük A harfi',
49 AElig: 'Latin büyük Æ harfi',
50 Ccedil: 'Latin büyük C harfi ile kedilla',
51 Egrave: 'Aksanlı latin büyük E harfi',
52 Eacute: 'Aşırı vurgulu latin büyük E harfi',
53 Ecirc: 'Çarpık latin büyük E harfi',
54 Euml: 'Sesli harf ayrılımlıı latin büyük E harfi',
55 Igrave: 'Aksanlı latin büyük I harfi',
56 Iacute: 'Aşırı aksanlı latin büyük I harfi',
57 Icirc: 'Çarpık latin büyük I harfi',
58 Iuml: 'Sesli harf ayrılımlıı latin büyük I harfi',
59 ETH: 'Latin büyük Eth harfi',
60 Ntilde: 'Tildeli latin büyük N harfi',
61 Ograve: 'Aksanlı latin büyük O harfi',
62 Oacute: 'Aşırı aksanlı latin büyük O harfi',
63 Ocirc: 'Çarpık latin büyük O harfi',
64 Otilde: 'Tildeli latin büyük O harfi',
65 Ouml: 'Sesli harf ayrılımlı latin büyük O harfi',
66 times: 'Çarpma işareti',
67 Oslash: 'Vurgulu latin büyük O harfi',
68 Ugrave: 'Aksanlı latin büyük U harfi',
69 Uacute: 'Aşırı aksanlı latin büyük U harfi',
70 Ucirc: 'Çarpık latin büyük U harfi',
71 Uuml: 'Sesli harf ayrılımlı latin büyük U harfi',
72 Yacute: 'Aşırı aksanlı latin büyük Y harfi',
73 THORN: 'Latin büyük Thorn harfi',
74 szlig: 'Latin küçük keskin s harfi',
75 agrave: 'Aksanlı latin küçük a harfi',
76 aacute: 'Aşırı aksanlı latin küçük a harfi',
77 acirc: 'Çarpık latin küçük a harfi',
78 atilde: 'Tildeli latin küçük a harfi',
79 auml: 'Sesli harf ayrılımlı latin küçük a harfi',
80 aring: 'Halkalı latin küçük a harfi',
81 aelig: 'Latin büyük æ harfi',
82 ccedil: 'Kedillalı latin küçük c harfi',
83 egrave: 'Aksanlı latin küçük e harfi',
84 eacute: 'Aşırı aksanlı latin küçük e harfi',
85 ecirc: 'Çarpık latin küçük e harfi',
86 euml: 'Sesli harf ayrılımlı latin küçük e harfi',
87 igrave: 'Aksanlı latin küçük i harfi',
88 iacute: 'Aşırı aksanlı latin küçük i harfi',
89 icirc: 'Çarpık latin küçük i harfi',
90 iuml: 'Sesli harf ayrılımlı latin küçük i harfi',
91 eth: 'Latin küçük eth harfi',
92 ntilde: 'Tildeli latin küçük n harfi',
93 ograve: 'Aksanlı latin küçük o harfi',
94 oacute: 'Aşırı aksanlı latin küçük o harfi',
95 ocirc: 'Çarpık latin küçük o harfi',
96 otilde: 'Tildeli latin küçük o harfi',
97 ouml: 'Sesli harf ayrılımlı latin küçük o harfi',
98 divide: 'Bölme işareti',
99 oslash: 'Vurgulu latin küçük o harfi',
100 ugrave: 'Aksanlı latin küçük u harfi',
101 uacute: 'Aşırı aksanlı latin küçük u harfi',
102 ucirc: 'Çarpık latin küçük u harfi',
103 uuml: 'Sesli harf ayrılımlı latin küçük u harfi',
104 yacute: 'Aşırı aksanlı latin küçük y harfi',
105 thorn: 'Latin küçük thorn harfi',
106 yuml: 'Sesli harf ayrılımlı latin küçük y harfi',
107 OElig: 'Latin büyük bağlı OE harfi',
108 oelig: 'Latin küçük bağlı oe harfi',
109 '372': 'Çarpık latin büyük W harfi',
110 '374': 'Çarpık latin büyük Y harfi',
111 '373': 'Çarpık latin küçük w harfi',
112 '375': 'Çarpık latin küçük y harfi',
113 sbquo: 'Tek düşük-9 tırnak işareti',
114 '8219': 'Tek yüksek-ters-9 tırnak işareti',
115 bdquo: 'Çift düşük-9 tırnak işareti',
116 hellip: 'Yatay elips',
117 trade: 'Marka tescili işareti',
118 '9658': 'Siyah sağ işaret işaretçisi',
119 bull: 'Koyu nokta',
120 rarr: 'Sağa doğru ok',
121 rArr: 'Sağa doğru çift ok',
122 hArr: 'Sol, sağ çift ok',
123 diams: 'Siyah elmas takımı',
124 asymp: 'Hemen hemen eşit'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/tt.js b/sources/plugins/specialchar/dialogs/lang/tt.js
new file mode 100644
index 00000000..2d03e7ed
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/tt.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'tt', {
7 euro: 'Евро тамгасы',
8 lsquo: 'Сул бер иңле куштырнаклар',
9 rsquo: 'Уң бер иңле куштырнаклар',
10 ldquo: 'Сул ике иңле куштырнаклар',
11 rdquo: 'Уң ике иңле куштырнаклар',
12 ndash: 'Кыска сызык',
13 mdash: 'Озын сызык',
14 iexcl: 'Әйләндерелгән өндәү билгесе',
15 cent: 'Цент тамгасы',
16 pound: 'Фунт тамгасы',
17 curren: 'Акча берәмлеге тамгасы',
18 yen: 'Иена тамгасы',
19 brvbar: 'Broken bar', // MISSING
20 sect: 'Параграф билгесе',
21 uml: 'Диерезис',
22 copy: 'Хокук иясе булу билгесе',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'Ачылучы чыршысыман җәя',
25 not: 'Юклык ишарəсе',
26 reg: 'Теркәләнгән булу билгесе',
27 macr: 'Макрон',
28 deg: 'Градус билгесе',
29 sup2: 'Икенче өске индекс',
30 sup3: 'Өченче өске индекс',
31 acute: 'Басым билгесе',
32 micro: 'Микро билгесе',
33 para: 'Параграф билгесе',
34 middot: 'Уртадагы нокта',
35 cedil: 'Седиль',
36 sup1: 'Беренче өске индекс',
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'Ябылучы чыршысыман җәя',
39 frac14: 'Гади дүрттән бер билгесе',
40 frac12: 'Гади икедән бер билгесе',
41 frac34: 'Гади дүрттән өч билгесе',
42 iquest: 'Әйләндерелгән өндәү билгесе',
43 Agrave: 'Гравис белән латин A баш хәрефе',
44 Aacute: 'Басым билгесе белән латин A баш хәрефе',
45 Acirc: 'Циркумфлекс белән латин A баш хәрефе',
46 Atilde: 'Тильда белән латин A баш хәрефе',
47 Auml: 'Диерезис белән латин A баш хәрефе',
48 Aring: 'Өстендә боҗра булган латин A баш хәрефе',
49 AElig: 'Латин Æ баш хәрефе',
50 Ccedil: 'Седиль белән латин C баш хәрефе',
51 Egrave: 'Гравис белән латин E баш хәрефе',
52 Eacute: 'Басым билгесе белән латин E баш хәрефе',
53 Ecirc: 'Циркумфлекс белән латин E баш хәрефе',
54 Euml: 'Диерезис белән латин E баш хәрефе',
55 Igrave: 'Гравис белән латин I баш хәрефе',
56 Iacute: 'Басым билгесе белән латин I баш хәрефе',
57 Icirc: 'Циркумфлекс белән латин I баш хәрефе',
58 Iuml: 'Диерезис белән латин I баш хәрефе',
59 ETH: 'Латин Eth баш хәрефе',
60 Ntilde: 'Тильда белән латин N баш хәрефе',
61 Ograve: 'Гравис белән латин O баш хәрефе',
62 Oacute: 'Басым билгесе белән латин O баш хәрефе',
63 Ocirc: 'Циркумфлекс белән латин O баш хәрефе',
64 Otilde: 'Тильда белән латин O баш хәрефе',
65 Ouml: 'Диерезис белән латин O баш хәрефе',
66 times: 'Тапкырлау билгесе',
67 Oslash: 'Сызык белән латин O баш хәрефе',
68 Ugrave: 'Гравис белән латин U баш хәрефе',
69 Uacute: 'Басым билгесе белән латин U баш хәрефе',
70 Ucirc: 'Циркумфлекс белән латин U баш хәрефе',
71 Uuml: 'Диерезис белән латин U баш хәрефе',
72 Yacute: 'Басым билгесе белән латин Y баш хәрефе',
73 THORN: 'Латин Thorn баш хәрефе',
74 szlig: 'Латин beta юл хәрефе',
75 agrave: 'Гравис белән латин a юл хәрефе',
76 aacute: 'Басым билгесе белән латин a юл хәрефе',
77 acirc: 'Циркумфлекс белән латин a юл хәрефе',
78 atilde: 'Тильда белән латин a юл хәрефе',
79 auml: 'Диерезис белән латин a юл хәрефе',
80 aring: 'Өстендә боҗра булган латин a юл хәрефе',
81 aelig: 'Латин æ юл хәрефе',
82 ccedil: 'Седиль белән латин c юл хәрефе',
83 egrave: 'Гравис белән латин e юл хәрефе',
84 eacute: 'Басым билгесе белән латин e юл хәрефе',
85 ecirc: 'Циркумфлекс белән латин e юл хәрефе',
86 euml: 'Диерезис белән латин e юл хәрефе',
87 igrave: 'Гравис белән латин i юл хәрефе',
88 iacute: 'Басым билгесе белән латин i юл хәрефе',
89 icirc: 'Циркумфлекс белән латин i юл хәрефе',
90 iuml: 'Диерезис белән латин i юл хәрефе',
91 eth: 'Латин eth юл хәрефе',
92 ntilde: 'Тильда белән латин n юл хәрефе',
93 ograve: 'Гравис белән латин o юл хәрефе',
94 oacute: 'Басым билгесе белән латин o юл хәрефе',
95 ocirc: 'Циркумфлекс белән латин o юл хәрефе',
96 otilde: 'Тильда белән латин o юл хәрефе',
97 ouml: 'Диерезис белән латин o юл хәрефе',
98 divide: 'Бүлү билгесе',
99 oslash: 'Сызык белән латин o юл хәрефе',
100 ugrave: 'Гравис белән латин u юл хәрефе',
101 uacute: 'Басым билгесе белән латин u юл хәрефе',
102 ucirc: 'Циркумфлекс белән латин u юл хәрефе',
103 uuml: 'Диерезис белән латин u юл хәрефе',
104 yacute: 'Басым билгесе белән латин y юл хәрефе',
105 thorn: 'Латин thorn юл хәрефе',
106 yuml: 'Диерезис белән латин y юл хәрефе',
107 OElig: 'Латин лигатура OE баш хәрефе',
108 oelig: 'Латин лигатура oe юл хәрефе',
109 '372': 'Циркумфлекс белән латин W баш хәрефе',
110 '374': 'Циркумфлекс белән латин Y баш хәрефе',
111 '373': 'Циркумфлекс белән латин w юл хәрефе',
112 '375': 'Циркумфлекс белән латин y юл хәрефе',
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Ятма эллипс',
117 trade: 'Сәүдә маркасы билгесе',
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Маркер',
120 rarr: 'Уң якка ук',
121 rArr: 'Уң якка икеләтә ук',
122 hArr: 'Ике якка икеләтә ук',
123 diams: 'Black diamond suit', // MISSING
124 asymp: 'якынча'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/ug.js b/sources/plugins/specialchar/dialogs/lang/ug.js
new file mode 100644
index 00000000..7e9db8be
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/ug.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'ug', {
7 euro: 'ياۋرو بەلگىسى',
8 lsquo: 'يالاڭ پەش سول',
9 rsquo: 'يالاڭ پەش ئوڭ',
10 ldquo: 'قوش پەش سول',
11 rdquo: 'قوش پەش ئوڭ',
12 ndash: 'سىزىقچە',
13 mdash: 'سىزىق',
14 iexcl: 'ئۈندەش',
15 cent: 'تىيىن بەلگىسى',
16 pound: 'فوند ستېرلىڭ',
17 curren: 'پۇل بەلگىسى',
18 yen: 'ياپونىيە يىنى',
19 brvbar: 'ئۈزۈك بالداق',
20 sect: 'پاراگراف بەلگىسى',
21 uml: 'تاۋۇش ئايرىش بەلگىسى',
22 copy: 'نەشر ھوقۇقى بەلگىسى',
23 ordf: 'Feminine ordinal indicator', // MISSING
24 laquo: 'قوش تىرناق سول',
25 not: 'غەيرى بەلگە',
26 reg: 'خەتلەتكەن تاۋار ماركىسى',
27 macr: 'سوزۇش بەلگىسى',
28 deg: 'گىرادۇس بەلگىسى',
29 sup2: 'يۇقىرى ئىندېكىس 2',
30 sup3: 'يۇقىرى ئىندېكىس 3',
31 acute: 'ئۇرغۇ بەلگىسى',
32 micro: 'Micro sign', // MISSING
33 para: 'ئابزاس بەلگىسى',
34 middot: 'ئوتتۇرا چېكىت',
35 cedil: 'ئاستىغا قوشۇلىدىغان بەلگە',
36 sup1: 'يۇقىرى ئىندېكىس 1',
37 ordm: 'Masculine ordinal indicator', // MISSING
38 raquo: 'قوش تىرناق ئوڭ',
39 frac14: 'ئاددىي كەسىر تۆتتىن بىر',
40 frac12: 'ئاددىي كەسىر ئىككىدىن بىر',
41 frac34: 'ئاددىي كەسىر ئۈچتىن تۆرت',
42 iquest: 'Inverted question mark', // MISSING
43 Agrave: 'Latin capital letter A with grave accent', // MISSING
44 Aacute: 'Latin capital letter A with acute accent', // MISSING
45 Acirc: 'Latin capital letter A with circumflex', // MISSING
46 Atilde: 'Latin capital letter A with tilde', // MISSING
47 Auml: 'Latin capital letter A with diaeresis', // MISSING
48 Aring: 'Latin capital letter A with ring above', // MISSING
49 AElig: 'Latin Capital letter Æ', // MISSING
50 Ccedil: 'Latin capital letter C with cedilla', // MISSING
51 Egrave: 'Latin capital letter E with grave accent', // MISSING
52 Eacute: 'Latin capital letter E with acute accent', // MISSING
53 Ecirc: 'Latin capital letter E with circumflex', // MISSING
54 Euml: 'Latin capital letter E with diaeresis', // MISSING
55 Igrave: 'Latin capital letter I with grave accent', // MISSING
56 Iacute: 'Latin capital letter I with acute accent', // MISSING
57 Icirc: 'Latin capital letter I with circumflex', // MISSING
58 Iuml: 'Latin capital letter I with diaeresis', // MISSING
59 ETH: 'Latin capital letter Eth', // MISSING
60 Ntilde: 'Latin capital letter N with tilde', // MISSING
61 Ograve: 'قوش پەش ئوڭ',
62 Oacute: 'Latin capital letter O with acute accent', // MISSING
63 Ocirc: 'Latin capital letter O with circumflex', // MISSING
64 Otilde: 'Latin capital letter O with tilde', // MISSING
65 Ouml: 'Latin capital letter O with diaeresis', // MISSING
66 times: 'Multiplication sign', // MISSING
67 Oslash: 'Latin capital letter O with stroke', // MISSING
68 Ugrave: 'Latin capital letter U with grave accent', // MISSING
69 Uacute: 'Latin capital letter U with acute accent', // MISSING
70 Ucirc: 'Latin capital letter U with circumflex', // MISSING
71 Uuml: 'Latin capital letter U with diaeresis', // MISSING
72 Yacute: 'Latin capital letter Y with acute accent', // MISSING
73 THORN: 'Latin capital letter Thorn', // MISSING
74 szlig: 'Latin small letter sharp s', // MISSING
75 agrave: 'Latin small letter a with grave accent', // MISSING
76 aacute: 'Latin small letter a with acute accent', // MISSING
77 acirc: 'Latin small letter a with circumflex', // MISSING
78 atilde: 'Latin small letter a with tilde', // MISSING
79 auml: 'Latin small letter a with diaeresis', // MISSING
80 aring: 'Latin small letter a with ring above', // MISSING
81 aelig: 'Latin small letter æ', // MISSING
82 ccedil: 'Latin small letter c with cedilla', // MISSING
83 egrave: 'Latin small letter e with grave accent', // MISSING
84 eacute: 'Latin small letter e with acute accent', // MISSING
85 ecirc: 'Latin small letter e with circumflex', // MISSING
86 euml: 'Latin small letter e with diaeresis', // MISSING
87 igrave: 'Latin small letter i with grave accent', // MISSING
88 iacute: 'Latin small letter i with acute accent', // MISSING
89 icirc: 'Latin small letter i with circumflex', // MISSING
90 iuml: 'Latin small letter i with diaeresis', // MISSING
91 eth: 'Latin small letter eth', // MISSING
92 ntilde: 'تىك موللاق سوئال بەلگىسى',
93 ograve: 'Latin small letter o with grave accent', // MISSING
94 oacute: 'Latin small letter o with acute accent', // MISSING
95 ocirc: 'Latin small letter o with circumflex', // MISSING
96 otilde: 'Latin small letter o with tilde', // MISSING
97 ouml: 'Latin small letter o with diaeresis', // MISSING
98 divide: 'بۆلۈش بەلگىسى',
99 oslash: 'Latin small letter o with stroke', // MISSING
100 ugrave: 'Latin small letter u with grave accent', // MISSING
101 uacute: 'Latin small letter u with acute accent', // MISSING
102 ucirc: 'Latin small letter u with circumflex', // MISSING
103 uuml: 'Latin small letter u with diaeresis', // MISSING
104 yacute: 'Latin small letter y with acute accent', // MISSING
105 thorn: 'Latin small letter thorn', // MISSING
106 yuml: 'Latin small letter y with diaeresis', // MISSING
107 OElig: 'Latin capital ligature OE', // MISSING
108 oelig: 'Latin small ligature oe', // MISSING
109 '372': 'Latin capital letter W with circumflex', // MISSING
110 '374': 'Latin capital letter Y with circumflex', // MISSING
111 '373': 'Latin small letter w with circumflex', // MISSING
112 '375': 'Latin small letter y with circumflex', // MISSING
113 sbquo: 'Single low-9 quotation mark', // MISSING
114 '8219': 'Single high-reversed-9 quotation mark', // MISSING
115 bdquo: 'Double low-9 quotation mark', // MISSING
116 hellip: 'Horizontal ellipsis', // MISSING
117 trade: 'خەتلەتكەن تاۋار ماركىسى بەلگىسى',
118 '9658': 'Black right-pointing pointer', // MISSING
119 bull: 'Bullet', // MISSING
120 rarr: 'ئوڭ يا ئوق',
121 rArr: 'ئوڭ قوش سىزىق يا ئوق',
122 hArr: 'ئوڭ سول قوش سىزىق يا ئوق',
123 diams: 'ئۇيۇل غىچ',
124 asymp: 'تەخمىنەن تەڭ'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/uk.js b/sources/plugins/specialchar/dialogs/lang/uk.js
new file mode 100644
index 00000000..34a3bff9
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/uk.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'uk', {
7 euro: 'Знак євро',
8 lsquo: 'Ліві одинарні лапки',
9 rsquo: 'Праві одинарні лапки',
10 ldquo: 'Ліві подвійні лапки',
11 rdquo: 'Праві подвійні лапки',
12 ndash: 'Середнє тире',
13 mdash: 'Довге тире',
14 iexcl: 'Перевернутий знак оклику',
15 cent: 'Знак цента',
16 pound: 'Знак фунта',
17 curren: 'Знак валюти',
18 yen: 'Знак єни',
19 brvbar: 'Переривчаста вертикальна лінія',
20 sect: 'Знак параграфу',
21 uml: 'Умлаут',
22 copy: 'Знак авторських прав',
23 ordf: 'Жіночий порядковий вказівник',
24 laquo: 'ліві вказівні подвійні кутові дужки',
25 not: 'Заперечення',
26 reg: 'Знак охорони суміжних прав',
27 macr: 'Макрон',
28 deg: 'Знак градуса',
29 sup2: 'два у верхньому індексі',
30 sup3: 'три у верхньому індексі',
31 acute: 'Знак акута',
32 micro: 'Знак мікро',
33 para: 'Знак абзацу',
34 middot: 'Інтерпункт',
35 cedil: 'Седиль',
36 sup1: 'Один у верхньому індексі',
37 ordm: 'Чоловічий порядковий вказівник',
38 raquo: 'праві вказівні подвійні кутові дужки',
39 frac14: 'Одна четвертина',
40 frac12: 'Одна друга',
41 frac34: 'три четвертих',
42 iquest: 'Перевернутий знак питання',
43 Agrave: 'Велика латинська A з гравісом',
44 Aacute: 'Велика латинська А з акутом',
45 Acirc: 'Велика латинська А з циркумфлексом',
46 Atilde: 'Велика латинська А з тильдою',
47 Auml: 'Велике латинське А з умлаутом',
48 Aring: 'Велика латинська A з кільцем згори',
49 AElig: 'Велика латинська Æ',
50 Ccedil: 'Велика латинська C з седиллю',
51 Egrave: 'Велика латинська E з гравісом',
52 Eacute: 'Велика латинська E з акутом',
53 Ecirc: 'Велика латинська E з циркумфлексом',
54 Euml: 'Велика латинська А з умлаутом',
55 Igrave: 'Велика латинська I з гравісом',
56 Iacute: 'Велика латинська I з акутом',
57 Icirc: 'Велика латинська I з циркумфлексом',
58 Iuml: 'Велика латинська І з умлаутом',
59 ETH: 'Велика латинська Eth',
60 Ntilde: 'Велика латинська N з тильдою',
61 Ograve: 'Велика латинська O з гравісом',
62 Oacute: 'Велика латинська O з акутом',
63 Ocirc: 'Велика латинська O з циркумфлексом',
64 Otilde: 'Велика латинська O з тильдою',
65 Ouml: 'Велика латинська О з умлаутом',
66 times: 'Знак множення',
67 Oslash: 'Велика латинська перекреслена O ',
68 Ugrave: 'Велика латинська U з гравісом',
69 Uacute: 'Велика латинська U з акутом',
70 Ucirc: 'Велика латинська U з циркумфлексом',
71 Uuml: 'Велика латинська U з умлаутом',
72 Yacute: 'Велика латинська Y з акутом',
73 THORN: 'Велика латинська Торн',
74 szlig: 'Мала латинська есцет',
75 agrave: 'Мала латинська a з гравісом',
76 aacute: 'Мала латинська a з акутом',
77 acirc: 'Мала латинська a з циркумфлексом',
78 atilde: 'Мала латинська a з тильдою',
79 auml: 'Мала латинська a з умлаутом',
80 aring: 'Мала латинська a з кільцем згори',
81 aelig: 'Мала латинська æ',
82 ccedil: 'Мала латинська C з седиллю',
83 egrave: 'Мала латинська e з гравісом',
84 eacute: 'Мала латинська e з акутом',
85 ecirc: 'Мала латинська e з циркумфлексом',
86 euml: 'Мала латинська e з умлаутом',
87 igrave: 'Мала латинська i з гравісом',
88 iacute: 'Мала латинська i з акутом',
89 icirc: 'Мала латинська i з циркумфлексом',
90 iuml: 'Мала латинська i з умлаутом',
91 eth: 'Мала латинська Eth',
92 ntilde: 'Мала латинська n з тильдою',
93 ograve: 'Мала латинська o з гравісом',
94 oacute: 'Мала латинська o з акутом',
95 ocirc: 'Мала латинська o з циркумфлексом',
96 otilde: 'Мала латинська o з тильдою',
97 ouml: 'Мала латинська o з умлаутом',
98 divide: 'Знак ділення',
99 oslash: 'Мала латинська перекреслена o',
100 ugrave: 'Мала латинська u з гравісом',
101 uacute: 'Мала латинська u з акутом',
102 ucirc: 'Мала латинська u з циркумфлексом',
103 uuml: 'Мала латинська u з умлаутом',
104 yacute: 'Мала латинська y з акутом',
105 thorn: 'Мала латинська торн',
106 yuml: 'Мала латинська y з умлаутом',
107 OElig: 'Велика латинська лігатура OE',
108 oelig: 'Мала латинська лігатура oe',
109 '372': 'Велика латинська W з циркумфлексом',
110 '374': 'Велика латинська Y з циркумфлексом',
111 '373': 'Мала латинська w з циркумфлексом',
112 '375': 'Мала латинська y з циркумфлексом',
113 sbquo: 'Одиничні нижні лабки',
114 '8219': 'Верхні одиничні обернені лабки',
115 bdquo: 'Подвійні нижні лабки',
116 hellip: 'Три крапки',
117 trade: 'Знак торгової марки',
118 '9658': 'Чорний правий вказівник',
119 bull: 'Маркер списку',
120 rarr: 'Стрілка вправо',
121 rArr: 'Подвійна стрілка вправо',
122 hArr: 'Подвійна стрілка вліво-вправо',
123 diams: 'Чорний діамонт',
124 asymp: 'Наближено дорівнює'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/vi.js b/sources/plugins/specialchar/dialogs/lang/vi.js
new file mode 100644
index 00000000..9be09b29
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/vi.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'vi', {
7 euro: 'Ký hiệu Euro',
8 lsquo: 'Dấu ngoặc đơn trái',
9 rsquo: 'Dấu ngoặc đơn phải',
10 ldquo: 'Dấu ngoặc đôi trái',
11 rdquo: 'Dấu ngoặc đôi phải',
12 ndash: 'Gạch ngang tiếng anh',
13 mdash: 'Gạch ngang Em',
14 iexcl: 'Chuyển đổi dấu chấm than',
15 cent: 'Ký tự tiền Mỹ',
16 pound: 'Ký tự tiền Anh',
17 curren: 'Ký tự tiền tệ',
18 yen: 'Ký tự tiền Yên Nhật',
19 brvbar: 'Thanh hỏng',
20 sect: 'Ký tự khu vực',
21 uml: 'Dấu tách đôi',
22 copy: 'Ký tự bản quyền',
23 ordf: 'Phần chỉ thị giống cái',
24 laquo: 'Chọn dấu ngoặc đôi trái',
25 not: 'Không có ký tự',
26 reg: 'Ký tự đăng ký',
27 macr: 'Dấu nguyên âm dài',
28 deg: 'Ký tự độ',
29 sup2: 'Chữ trồi lên trên dạng 2',
30 sup3: 'Chữ trồi lên trên dạng 3',
31 acute: 'Dấu trọng âm',
32 micro: 'Ký tự micro',
33 para: 'Ký tự đoạn văn',
34 middot: 'Dấu chấm tròn',
35 cedil: 'Dấu móc lưới',
36 sup1: 'Ký tự trồi lên cấp 1',
37 ordm: 'Ký tự biểu hiện giống đực',
38 raquo: 'Chọn dấu ngoặc đôi phải',
39 frac14: 'Tỉ lệ một phần tư',
40 frac12: 'Tỉ lệ một nửa',
41 frac34: 'Tỉ lệ ba phần tư',
42 iquest: 'Chuyển đổi dấu chấm hỏi',
43 Agrave: 'Ký tự la-tinh viết hoa A với dấu huyền',
44 Aacute: 'Ký tự la-tinh viết hoa A với dấu sắc',
45 Acirc: 'Ký tự la-tinh viết hoa A với dấu mũ',
46 Atilde: 'Ký tự la-tinh viết hoa A với dấu ngã',
47 Auml: 'Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu',
48 Aring: 'Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu',
49 AElig: 'Ký tự la-tinh viết hoa của Æ',
50 Ccedil: 'Ký tự la-tinh viết hoa C với dấu móc bên dưới',
51 Egrave: 'Ký tự la-tinh viết hoa E với dấu huyền',
52 Eacute: 'Ký tự la-tinh viết hoa E với dấu sắc',
53 Ecirc: 'Ký tự la-tinh viết hoa E với dấu mũ',
54 Euml: 'Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu',
55 Igrave: 'Ký tự la-tinh viết hoa I với dấu huyền',
56 Iacute: 'Ký tự la-tinh viết hoa I với dấu sắc',
57 Icirc: 'Ký tự la-tinh viết hoa I với dấu mũ',
58 Iuml: 'Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu',
59 ETH: 'Viết hoa của ký tự Eth',
60 Ntilde: 'Ký tự la-tinh viết hoa N với dấu ngã',
61 Ograve: 'Ký tự la-tinh viết hoa O với dấu huyền',
62 Oacute: 'Ký tự la-tinh viết hoa O với dấu sắc',
63 Ocirc: 'Ký tự la-tinh viết hoa O với dấu mũ',
64 Otilde: 'Ký tự la-tinh viết hoa O với dấu ngã',
65 Ouml: 'Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu',
66 times: 'Ký tự phép toán nhân',
67 Oslash: 'Ký tự la-tinh viết hoa A với dấu ngã xuống',
68 Ugrave: 'Ký tự la-tinh viết hoa U với dấu huyền',
69 Uacute: 'Ký tự la-tinh viết hoa U với dấu sắc',
70 Ucirc: 'Ký tự la-tinh viết hoa U với dấu mũ',
71 Uuml: 'Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu',
72 Yacute: 'Ký tự la-tinh viết hoa Y với dấu sắc',
73 THORN: 'Phần viết hoa của ký tự Thorn',
74 szlig: 'Ký tự viết nhỏ la-tinh của chữ s',
75 agrave: 'Ký tự la-tinh thường với dấu huyền',
76 aacute: 'Ký tự la-tinh thường với dấu sắc',
77 acirc: 'Ký tự la-tinh thường với dấu mũ',
78 atilde: 'Ký tự la-tinh thường với dấu ngã',
79 auml: 'Ký tự la-tinh thường với dấu hai chấm trên đầu',
80 aring: 'Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu',
81 aelig: 'Ký tự la-tinh viết thường của æ',
82 ccedil: 'Ký tự la-tinh viết thường của c với dấu móc bên dưới',
83 egrave: 'Ký tự la-tinh viết thường e với dấu huyền',
84 eacute: 'Ký tự la-tinh viết thường e với dấu sắc',
85 ecirc: 'Ký tự la-tinh viết thường e với dấu mũ',
86 euml: 'Ký tự la-tinh viết thường e với dấu hai chấm trên đầu',
87 igrave: 'Ký tự la-tinh viết thường i với dấu huyền',
88 iacute: 'Ký tự la-tinh viết thường i với dấu sắc',
89 icirc: 'Ký tự la-tinh viết thường i với dấu mũ',
90 iuml: 'Ký tự la-tinh viết thường i với dấu hai chấm trên đầu',
91 eth: 'Ký tự la-tinh viết thường của eth',
92 ntilde: 'Ký tự la-tinh viết thường n với dấu ngã',
93 ograve: 'Ký tự la-tinh viết thường o với dấu huyền',
94 oacute: 'Ký tự la-tinh viết thường o với dấu sắc',
95 ocirc: 'Ký tự la-tinh viết thường o với dấu mũ',
96 otilde: 'Ký tự la-tinh viết thường o với dấu ngã',
97 ouml: 'Ký tự la-tinh viết thường o với dấu hai chấm trên đầu',
98 divide: 'Ký hiệu phép tính chia',
99 oslash: 'Ký tự la-tinh viết thường o với dấu ngã',
100 ugrave: 'Ký tự la-tinh viết thường u với dấu huyền',
101 uacute: 'Ký tự la-tinh viết thường u với dấu sắc',
102 ucirc: 'Ký tự la-tinh viết thường u với dấu mũ',
103 uuml: 'Ký tự la-tinh viết thường u với dấu hai chấm trên đầu',
104 yacute: 'Ký tự la-tinh viết thường y với dấu sắc',
105 thorn: 'Ký tự la-tinh viết thường của chữ thorn',
106 yuml: 'Ký tự la-tinh viết thường y với dấu hai chấm trên đầu',
107 OElig: 'Ký tự la-tinh viết hoa gạch nối OE',
108 oelig: 'Ký tự la-tinh viết thường gạch nối OE',
109 '372': 'Ký tự la-tinh viết hoa W với dấu mũ',
110 '374': 'Ký tự la-tinh viết hoa Y với dấu mũ',
111 '373': 'Ký tự la-tinh viết thường w với dấu mũ',
112 '375': 'Ký tự la-tinh viết thường y với dấu mũ',
113 sbquo: 'Dấu ngoặc đơn thấp số-9',
114 '8219': 'Dấu ngoặc đơn đảo ngược số-9',
115 bdquo: 'Gấp đôi dấu ngoặc đơn số-9',
116 hellip: 'Tĩnh dược chiều ngang',
117 trade: 'Ký tự thương hiệu',
118 '9658': 'Ký tự trỏ về hướng bên phải màu đen',
119 bull: 'Ký hiệu',
120 rarr: 'Mũi tên hướng bên phải',
121 rArr: 'Mũi tên hướng bên phải dạng đôi',
122 hArr: 'Mũi tên hướng bên trái dạng đôi',
123 diams: 'Ký hiệu hình thoi',
124 asymp: 'Gần bằng với'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/zh-cn.js b/sources/plugins/specialchar/dialogs/lang/zh-cn.js
new file mode 100644
index 00000000..34a72ca2
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/zh-cn.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'zh-cn', {
7 euro: '欧元符号',
8 lsquo: '左单引号',
9 rsquo: '右单引号',
10 ldquo: '左双引号',
11 rdquo: '右双引号',
12 ndash: '短划线',
13 mdash: '长划线',
14 iexcl: '竖翻叹号',
15 cent: '分币符号',
16 pound: '英镑符号',
17 curren: '货币符号',
18 yen: '日元符号',
19 brvbar: '间断条',
20 sect: '节标记',
21 uml: '分音符',
22 copy: '版权所有标记',
23 ordf: '阴性顺序指示符',
24 laquo: '左指双尖引号',
25 not: '非标记',
26 reg: '注册标记',
27 macr: '长音符',
28 deg: '度标记',
29 sup2: '上标二',
30 sup3: '上标三',
31 acute: '锐音符',
32 micro: '微符',
33 para: '段落标记',
34 middot: '中间点',
35 cedil: '下加符',
36 sup1: '上标一',
37 ordm: '阳性顺序指示符',
38 raquo: '右指双尖引号',
39 frac14: '普通分数四分之一',
40 frac12: '普通分数二分之一',
41 frac34: '普通分数四分之三',
42 iquest: '竖翻问号',
43 Agrave: '带抑音符的拉丁文大写字母 A',
44 Aacute: '带锐音符的拉丁文大写字母 A',
45 Acirc: '带扬抑符的拉丁文大写字母 A',
46 Atilde: '带颚化符的拉丁文大写字母 A',
47 Auml: '带分音符的拉丁文大写字母 A',
48 Aring: '带上圆圈的拉丁文大写字母 A',
49 AElig: '拉丁文大写字母 Ae',
50 Ccedil: '带下加符的拉丁文大写字母 C',
51 Egrave: '带抑音符的拉丁文大写字母 E',
52 Eacute: '带锐音符的拉丁文大写字母 E',
53 Ecirc: '带扬抑符的拉丁文大写字母 E',
54 Euml: '带分音符的拉丁文大写字母 E',
55 Igrave: '带抑音符的拉丁文大写字母 I',
56 Iacute: '带锐音符的拉丁文大写字母 I',
57 Icirc: '带扬抑符的拉丁文大写字母 I',
58 Iuml: '带分音符的拉丁文大写字母 I',
59 ETH: '拉丁文大写字母 Eth',
60 Ntilde: '带颚化符的拉丁文大写字母 N',
61 Ograve: '带抑音符的拉丁文大写字母 O',
62 Oacute: '带锐音符的拉丁文大写字母 O',
63 Ocirc: '带扬抑符的拉丁文大写字母 O',
64 Otilde: '带颚化符的拉丁文大写字母 O',
65 Ouml: '带分音符的拉丁文大写字母 O',
66 times: '乘号',
67 Oslash: '带粗线的拉丁文大写字母 O',
68 Ugrave: '带抑音符的拉丁文大写字母 U',
69 Uacute: '带锐音符的拉丁文大写字母 U',
70 Ucirc: '带扬抑符的拉丁文大写字母 U',
71 Uuml: '带分音符的拉丁文大写字母 U',
72 Yacute: '带抑音符的拉丁文大写字母 Y',
73 THORN: '拉丁文大写字母 Thorn',
74 szlig: '拉丁文小写字母清音 S',
75 agrave: '带抑音符的拉丁文小写字母 A',
76 aacute: '带锐音符的拉丁文小写字母 A',
77 acirc: '带扬抑符的拉丁文小写字母 A',
78 atilde: '带颚化符的拉丁文小写字母 A',
79 auml: '带分音符的拉丁文小写字母 A',
80 aring: '带上圆圈的拉丁文小写字母 A',
81 aelig: '拉丁文小写字母 Ae',
82 ccedil: '带下加符的拉丁文小写字母 C',
83 egrave: '带抑音符的拉丁文小写字母 E',
84 eacute: '带锐音符的拉丁文小写字母 E',
85 ecirc: '带扬抑符的拉丁文小写字母 E',
86 euml: '带分音符的拉丁文小写字母 E',
87 igrave: '带抑音符的拉丁文小写字母 I',
88 iacute: '带锐音符的拉丁文小写字母 I',
89 icirc: '带扬抑符的拉丁文小写字母 I',
90 iuml: '带分音符的拉丁文小写字母 I',
91 eth: '拉丁文小写字母 Eth',
92 ntilde: '带颚化符的拉丁文小写字母 N',
93 ograve: '带抑音符的拉丁文小写字母 O',
94 oacute: '带锐音符的拉丁文小写字母 O',
95 ocirc: '带扬抑符的拉丁文小写字母 O',
96 otilde: '带颚化符的拉丁文小写字母 O',
97 ouml: '带分音符的拉丁文小写字母 O',
98 divide: '除号',
99 oslash: '带粗线的拉丁文小写字母 O',
100 ugrave: '带抑音符的拉丁文小写字母 U',
101 uacute: '带锐音符的拉丁文小写字母 U',
102 ucirc: '带扬抑符的拉丁文小写字母 U',
103 uuml: '带分音符的拉丁文小写字母 U',
104 yacute: '带抑音符的拉丁文小写字母 Y',
105 thorn: '拉丁文小写字母 Thorn',
106 yuml: '带分音符的拉丁文小写字母 Y',
107 OElig: '拉丁文大写连字 Oe',
108 oelig: '拉丁文小写连字 Oe',
109 '372': '带扬抑符的拉丁文大写字母 W',
110 '374': '带扬抑符的拉丁文大写字母 Y',
111 '373': '带扬抑符的拉丁文小写字母 W',
112 '375': '带扬抑符的拉丁文小写字母 Y',
113 sbquo: '单下 9 形引号',
114 '8219': '单高横翻 9 形引号',
115 bdquo: '双下 9 形引号',
116 hellip: '水平省略号',
117 trade: '商标标志',
118 '9658': '实心右指指针',
119 bull: '加重号',
120 rarr: '向右箭头',
121 rArr: '向右双线箭头',
122 hArr: '左右双线箭头',
123 diams: '实心方块纸牌',
124 asymp: '约等于'
125} );
diff --git a/sources/plugins/specialchar/dialogs/lang/zh.js b/sources/plugins/specialchar/dialogs/lang/zh.js
new file mode 100644
index 00000000..61b3e5db
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/lang/zh.js
@@ -0,0 +1,125 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.setLang( 'specialchar', 'zh', {
7 euro: '歐元符號',
8 lsquo: '左單引號',
9 rsquo: '右單引號',
10 ldquo: '左雙引號',
11 rdquo: '右雙引號',
12 ndash: '短破折號',
13 mdash: '長破折號',
14 iexcl: '倒置的驚嘆號',
15 cent: '美分符號',
16 pound: '英鎊符號',
17 curren: '貨幣符號',
18 yen: '日圓符號',
19 brvbar: '破折號',
20 sect: '章節符號',
21 uml: '分音符號',
22 copy: '版權符號',
23 ordf: '雌性符號',
24 laquo: '左雙角括號',
25 not: 'Not 符號',
26 reg: '註冊商標符號',
27 macr: '長音符號',
28 deg: '度數符號',
29 sup2: '上標字 2',
30 sup3: '上標字 3',
31 acute: '尖音符號',
32 micro: '微',
33 para: '段落符號',
34 middot: '中間點',
35 cedil: '字母 C 下面的尾型符號 ',
36 sup1: '上標',
37 ordm: '雄性符號',
38 raquo: '右雙角括號',
39 frac14: '四分之一符號',
40 frac12: '二分之一符號',
41 frac34: '四分之三符號',
42 iquest: '倒置的問號',
43 Agrave: '拉丁大寫字母 A 帶抑音符號',
44 Aacute: '拉丁大寫字母 A 帶尖音符號',
45 Acirc: '拉丁大寫字母 A 帶揚抑符',
46 Atilde: '拉丁大寫字母 A 帶波浪號',
47 Auml: '拉丁大寫字母 A 帶分音符號',
48 Aring: '拉丁大寫字母 A 帶上圓圈',
49 AElig: '拉丁大寫字母 Æ',
50 Ccedil: '拉丁大寫字母 C 帶下尾符號',
51 Egrave: '拉丁大寫字母 E 帶抑音符號',
52 Eacute: '拉丁大寫字母 E 帶尖音符號',
53 Ecirc: '拉丁大寫字母 E 帶揚抑符',
54 Euml: '拉丁大寫字母 E 帶分音符號',
55 Igrave: '拉丁大寫字母 I 帶抑音符號',
56 Iacute: '拉丁大寫字母 I 帶尖音符號',
57 Icirc: '拉丁大寫字母 I 帶揚抑符',
58 Iuml: '拉丁大寫字母 I 帶分音符號',
59 ETH: '拉丁大寫字母 Eth',
60 Ntilde: '拉丁大寫字母 N 帶波浪號',
61 Ograve: '拉丁大寫字母 O 帶抑音符號',
62 Oacute: '拉丁大寫字母 O 帶尖音符號',
63 Ocirc: '拉丁大寫字母 O 帶揚抑符',
64 Otilde: '拉丁大寫字母 O 帶波浪號',
65 Ouml: '拉丁大寫字母 O 帶分音符號',
66 times: '乘號',
67 Oslash: '拉丁大寫字母 O 帶粗線符號',
68 Ugrave: '拉丁大寫字母 U 帶抑音符號',
69 Uacute: '拉丁大寫字母 U 帶尖音符號',
70 Ucirc: '拉丁大寫字母 U 帶揚抑符',
71 Uuml: '拉丁大寫字母 U 帶分音符號',
72 Yacute: '拉丁大寫字母 Y 帶尖音符號',
73 THORN: '拉丁大寫字母 Thorn',
74 szlig: '拉丁小寫字母 s',
75 agrave: '拉丁小寫字母 a 帶抑音符號',
76 aacute: '拉丁小寫字母 a 帶尖音符號',
77 acirc: '拉丁小寫字母 a 帶揚抑符',
78 atilde: '拉丁小寫字母 a 帶波浪號',
79 auml: '拉丁小寫字母 a 帶分音符號',
80 aring: '拉丁小寫字母 a 帶上圓圈',
81 aelig: '拉丁小寫字母 æ',
82 ccedil: '拉丁小寫字母 c 帶下尾符號',
83 egrave: '拉丁小寫字母 e 帶抑音符號',
84 eacute: '拉丁小寫字母 e 帶尖音符號',
85 ecirc: '拉丁小寫字母 e 帶揚抑符',
86 euml: '拉丁小寫字母 e 帶分音符號',
87 igrave: '拉丁小寫字母 i 帶抑音符號',
88 iacute: '拉丁小寫字母 i 帶尖音符號',
89 icirc: '拉丁小寫字母 i 帶揚抑符',
90 iuml: '拉丁小寫字母 i 帶分音符號',
91 eth: '拉丁小寫字母 eth',
92 ntilde: '拉丁小寫字母 n 帶波浪號',
93 ograve: '拉丁小寫字母 o 帶抑音符號',
94 oacute: '拉丁小寫字母 o 帶尖音符號',
95 ocirc: '拉丁小寫字母 o 帶揚抑符',
96 otilde: '拉丁小寫字母 o 帶波浪號',
97 ouml: '拉丁小寫字母 o 帶分音符號',
98 divide: '除號',
99 oslash: '拉丁小寫字母 o 帶粗線符號',
100 ugrave: '拉丁小寫字母 u 帶抑音符號',
101 uacute: '拉丁小寫字母 u 帶尖音符號',
102 ucirc: '拉丁小寫字母 u 帶揚抑符',
103 uuml: '拉丁小寫字母 u 帶分音符號',
104 yacute: '拉丁小寫字母 y 帶尖音符號',
105 thorn: '拉丁小寫字母 thorn',
106 yuml: '拉丁小寫字母 y 帶分音符號',
107 OElig: '拉丁大寫字母 OE',
108 oelig: '拉丁小寫字母 oe',
109 '372': '拉丁大寫字母 W 帶揚抑符',
110 '374': '拉丁大寫字母 Y 帶揚抑符',
111 '373': '拉丁小寫字母 w 帶揚抑符',
112 '375': '拉丁小寫字母 y 帶揚抑符',
113 sbquo: '低 9 單引號',
114 '8219': '高 9 反轉單引號',
115 bdquo: '低 9 雙引號',
116 hellip: '水平刪節號',
117 trade: '商標符號',
118 '9658': '黑色向右指箭號',
119 bull: '項目符號',
120 rarr: '向右箭號',
121 rArr: '向右雙箭號',
122 hArr: '左右雙箭號',
123 diams: '黑鑽套裝',
124 asymp: '約等於'
125} );
diff --git a/sources/plugins/specialchar/dialogs/specialchar.js b/sources/plugins/specialchar/dialogs/specialchar.js
new file mode 100644
index 00000000..101d4ddc
--- /dev/null
+++ b/sources/plugins/specialchar/dialogs/specialchar.js
@@ -0,0 +1,297 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'specialchar', function( editor ) {
7 // Simulate "this" of a dialog for non-dialog events.
8 // @type {CKEDITOR.dialog}
9 var dialog,
10 lang = editor.lang.specialchar;
11
12 var onChoice = function( evt ) {
13 var target, value;
14 if ( evt.data )
15 target = evt.data.getTarget();
16 else
17 target = new CKEDITOR.dom.element( evt );
18
19 if ( target.getName() == 'a' && ( value = target.getChild( 0 ).getHtml() ) ) {
20 target.removeClass( 'cke_light_background' );
21 dialog.hide();
22
23 // We must use "insertText" here to keep text styled.
24 var span = editor.document.createElement( 'span' );
25 span.setHtml( value );
26 editor.insertText( span.getText() );
27 }
28 };
29
30 var onClick = CKEDITOR.tools.addFunction( onChoice );
31
32 var focusedNode;
33
34 var onFocus = function( evt, target ) {
35 var value;
36 target = target || evt.data.getTarget();
37
38 if ( target.getName() == 'span' )
39 target = target.getParent();
40
41 if ( target.getName() == 'a' && ( value = target.getChild( 0 ).getHtml() ) ) {
42 // Trigger blur manually if there is focused node.
43 if ( focusedNode )
44 onBlur( null, focusedNode );
45
46 var htmlPreview = dialog.getContentElement( 'info', 'htmlPreview' ).getElement();
47
48 dialog.getContentElement( 'info', 'charPreview' ).getElement().setHtml( value );
49 htmlPreview.setHtml( CKEDITOR.tools.htmlEncode( value ) );
50 target.getParent().addClass( 'cke_light_background' );
51
52 // Memorize focused node.
53 focusedNode = target;
54 }
55 };
56
57 var onBlur = function( evt, target ) {
58 target = target || evt.data.getTarget();
59
60 if ( target.getName() == 'span' )
61 target = target.getParent();
62
63 if ( target.getName() == 'a' ) {
64 dialog.getContentElement( 'info', 'charPreview' ).getElement().setHtml( '&nbsp;' );
65 dialog.getContentElement( 'info', 'htmlPreview' ).getElement().setHtml( '&nbsp;' );
66 target.getParent().removeClass( 'cke_light_background' );
67
68 focusedNode = undefined;
69 }
70 };
71
72 var onKeydown = CKEDITOR.tools.addFunction( function( ev ) {
73 ev = new CKEDITOR.dom.event( ev );
74
75 // Get an Anchor element.
76 var element = ev.getTarget();
77 var relative, nodeToMove;
78 var keystroke = ev.getKeystroke(),
79 rtl = editor.lang.dir == 'rtl';
80
81 switch ( keystroke ) {
82 // UP-ARROW
83 case 38:
84 // relative is TR
85 if ( ( relative = element.getParent().getParent().getPrevious() ) ) {
86 nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );
87 nodeToMove.focus();
88 onBlur( null, element );
89 onFocus( null, nodeToMove );
90 }
91 ev.preventDefault();
92 break;
93 // DOWN-ARROW
94 case 40:
95 // relative is TR
96 if ( ( relative = element.getParent().getParent().getNext() ) ) {
97 nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );
98 if ( nodeToMove && nodeToMove.type == 1 ) {
99 nodeToMove.focus();
100 onBlur( null, element );
101 onFocus( null, nodeToMove );
102 }
103 }
104 ev.preventDefault();
105 break;
106 // SPACE
107 // ENTER is already handled as onClick
108 case 32:
109 onChoice( { data: ev } );
110 ev.preventDefault();
111 break;
112
113 // RIGHT-ARROW
114 case rtl ? 37 : 39:
115 // relative is TD
116 if ( ( relative = element.getParent().getNext() ) ) {
117 nodeToMove = relative.getChild( 0 );
118 if ( nodeToMove.type == 1 ) {
119 nodeToMove.focus();
120 onBlur( null, element );
121 onFocus( null, nodeToMove );
122 ev.preventDefault( true );
123 } else {
124 onBlur( null, element );
125 }
126 }
127 // relative is TR
128 else if ( ( relative = element.getParent().getParent().getNext() ) ) {
129 nodeToMove = relative.getChild( [ 0, 0 ] );
130 if ( nodeToMove && nodeToMove.type == 1 ) {
131 nodeToMove.focus();
132 onBlur( null, element );
133 onFocus( null, nodeToMove );
134 ev.preventDefault( true );
135 } else {
136 onBlur( null, element );
137 }
138 }
139 break;
140
141 // LEFT-ARROW
142 case rtl ? 39 : 37:
143 // relative is TD
144 if ( ( relative = element.getParent().getPrevious() ) ) {
145 nodeToMove = relative.getChild( 0 );
146 nodeToMove.focus();
147 onBlur( null, element );
148 onFocus( null, nodeToMove );
149 ev.preventDefault( true );
150 }
151 // relative is TR
152 else if ( ( relative = element.getParent().getParent().getPrevious() ) ) {
153 nodeToMove = relative.getLast().getChild( 0 );
154 nodeToMove.focus();
155 onBlur( null, element );
156 onFocus( null, nodeToMove );
157 ev.preventDefault( true );
158 } else {
159 onBlur( null, element );
160 }
161 break;
162 default:
163 // Do not stop not handled events.
164 return;
165 }
166 } );
167
168 return {
169 title: lang.title,
170 minWidth: 430,
171 minHeight: 280,
172 buttons: [ CKEDITOR.dialog.cancelButton ],
173 charColumns: 17,
174 onLoad: function() {
175 var columns = this.definition.charColumns,
176 chars = editor.config.specialChars;
177
178 var charsTableLabel = CKEDITOR.tools.getNextId() + '_specialchar_table_label';
179 var html = [ '<table role="listbox" aria-labelledby="' + charsTableLabel + '"' +
180 ' style="width: 320px; height: 100%; border-collapse: separate;"' +
181 ' align="center" cellspacing="2" cellpadding="2" border="0">' ];
182
183 var i = 0,
184 size = chars.length,
185 character, charDesc;
186
187 while ( i < size ) {
188 html.push( '<tr role="presentation">' );
189
190 for ( var j = 0; j < columns; j++, i++ ) {
191 if ( ( character = chars[ i ] ) ) {
192 charDesc = '';
193
194 if ( character instanceof Array ) {
195 charDesc = character[ 1 ];
196 character = character[ 0 ];
197 } else {
198 var _tmpName = character.replace( '&', '' ).replace( ';', '' ).replace( '#', '' );
199
200 // Use character in case description unavailable.
201 charDesc = lang[ _tmpName ] || character;
202 }
203
204 var charLabelId = 'cke_specialchar_label_' + i + '_' + CKEDITOR.tools.getNextNumber();
205
206 html.push( '<td class="cke_dark_background" style="cursor: default" role="presentation">' +
207 '<a href="javascript: void(0);" role="option"' +
208 ' aria-posinset="' + ( i + 1 ) + '"', ' aria-setsize="' + size + '"', ' aria-labelledby="' + charLabelId + '"', ' class="cke_specialchar" title="', CKEDITOR.tools.htmlEncode( charDesc ), '"' +
209 ' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydown + ', event, this )"' +
210 ' onclick="CKEDITOR.tools.callFunction(' + onClick + ', this); return false;"' +
211 ' tabindex="-1">' +
212 '<span style="margin: 0 auto;cursor: inherit">' +
213 character +
214 '</span>' +
215 '<span class="cke_voice_label" id="' + charLabelId + '">' +
216 charDesc +
217 '</span></a>' );
218 } else {
219 html.push( '<td class="cke_dark_background">&nbsp;' );
220 }
221
222 html.push( '</td>' );
223 }
224 html.push( '</tr>' );
225 }
226
227 html.push( '</tbody></table>', '<span id="' + charsTableLabel + '" class="cke_voice_label">' + lang.options + '</span>' );
228
229 this.getContentElement( 'info', 'charContainer' ).getElement().setHtml( html.join( '' ) );
230 },
231 contents: [ {
232 id: 'info',
233 label: editor.lang.common.generalTab,
234 title: editor.lang.common.generalTab,
235 padding: 0,
236 align: 'top',
237 elements: [ {
238 type: 'hbox',
239 align: 'top',
240 widths: [ '320px', '90px' ],
241 children: [ {
242 type: 'html',
243 id: 'charContainer',
244 html: '',
245 onMouseover: onFocus,
246 onMouseout: onBlur,
247 focus: function() {
248 var firstChar = this.getElement().getElementsByTag( 'a' ).getItem( 0 );
249 setTimeout( function() {
250 firstChar.focus();
251 onFocus( null, firstChar );
252 }, 0 );
253 },
254 onShow: function() {
255 var firstChar = this.getElement().getChild( [ 0, 0, 0, 0, 0 ] );
256 setTimeout( function() {
257 firstChar.focus();
258 onFocus( null, firstChar );
259 }, 0 );
260 },
261 onLoad: function( event ) {
262 dialog = event.sender;
263 }
264 },
265 {
266 type: 'hbox',
267 align: 'top',
268 widths: [ '100%' ],
269 children: [ {
270 type: 'vbox',
271 align: 'top',
272 children: [
273 {
274 type: 'html',
275 html: '<div></div>'
276 },
277 {
278 type: 'html',
279 id: 'charPreview',
280 className: 'cke_dark_background',
281 style: 'border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:\'Microsoft Sans Serif\',Arial,Helvetica,Verdana;text-align:center;',
282 html: '<div>&nbsp;</div>'
283 },
284 {
285 type: 'html',
286 id: 'htmlPreview',
287 className: 'cke_dark_background',
288 style: 'border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:\'Microsoft Sans Serif\',Arial,Helvetica,Verdana;text-align:center;',
289 html: '<div>&nbsp;</div>'
290 }
291 ]
292 } ]
293 } ]
294 } ]
295 } ]
296 };
297} );
diff --git a/sources/plugins/specialchar/icons/hidpi/specialchar.png b/sources/plugins/specialchar/icons/hidpi/specialchar.png
new file mode 100644
index 00000000..d47f8453
--- /dev/null
+++ b/sources/plugins/specialchar/icons/hidpi/specialchar.png
Binary files differ
diff --git a/sources/plugins/specialchar/icons/specialchar.png b/sources/plugins/specialchar/icons/specialchar.png
new file mode 100644
index 00000000..6cd278f1
--- /dev/null
+++ b/sources/plugins/specialchar/icons/specialchar.png
Binary files differ
diff --git a/sources/plugins/specialchar/lang/_translationstatus.txt b/sources/plugins/specialchar/lang/_translationstatus.txt
new file mode 100644
index 00000000..b76ef206
--- /dev/null
+++ b/sources/plugins/specialchar/lang/_translationstatus.txt
@@ -0,0 +1,63 @@
1Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
2For licensing, see LICENSE.md or http://ckeditor.com/license
3
4af.js Found: 3 Missing: 118
5ar.js Found: 2 Missing: 119
6bg.js Found: 3 Missing: 118
7bn.js Found: 2 Missing: 119
8bs.js Found: 2 Missing: 119
9ca.js Found: 3 Missing: 118
10cs.js Found: 121 Missing: 0
11cy.js Found: 121 Missing: 0
12da.js Found: 3 Missing: 118
13de.js Found: 121 Missing: 0
14el.js Found: 19 Missing: 102
15en-au.js Found: 2 Missing: 119
16en-ca.js Found: 2 Missing: 119
17en-gb.js Found: 3 Missing: 118
18eo.js Found: 121 Missing: 0
19es.js Found: 3 Missing: 118
20et.js Found: 34 Missing: 87
21eu.js Found: 2 Missing: 119
22fa.js Found: 27 Missing: 94
23fi.js Found: 26 Missing: 95
24fo.js Found: 3 Missing: 118
25fr-ca.js Found: 2 Missing: 119
26fr.js Found: 121 Missing: 0
27gl.js Found: 2 Missing: 119
28gu.js Found: 3 Missing: 118
29he.js Found: 3 Missing: 118
30hi.js Found: 2 Missing: 119
31hr.js Found: 26 Missing: 95
32hu.js Found: 3 Missing: 118
33is.js Found: 2 Missing: 119
34it.js Found: 121 Missing: 0
35ja.js Found: 3 Missing: 118
36ka.js Found: 3 Missing: 118
37km.js Found: 2 Missing: 119
38ko.js Found: 2 Missing: 119
39lt.js Found: 3 Missing: 118
40lv.js Found: 2 Missing: 119
41mk.js Found: 0 Missing: 121
42mn.js Found: 2 Missing: 119
43ms.js Found: 2 Missing: 119
44nb.js Found: 121 Missing: 0
45nl.js Found: 121 Missing: 0
46no.js Found: 121 Missing: 0
47pl.js Found: 3 Missing: 118
48pt-br.js Found: 3 Missing: 118
49pt.js Found: 2 Missing: 119
50ro.js Found: 3 Missing: 118
51ru.js Found: 3 Missing: 118
52sk.js Found: 3 Missing: 118
53sl.js Found: 2 Missing: 119
54sr-latn.js Found: 2 Missing: 119
55sr.js Found: 2 Missing: 119
56sv.js Found: 3 Missing: 118
57th.js Found: 2 Missing: 119
58tr.js Found: 121 Missing: 0
59ug.js Found: 42 Missing: 79
60uk.js Found: 3 Missing: 118
61vi.js Found: 3 Missing: 118
62zh-cn.js Found: 121 Missing: 0
63zh.js Found: 2 Missing: 119
diff --git a/sources/plugins/specialchar/lang/af.js b/sources/plugins/specialchar/lang/af.js
new file mode 100644
index 00000000..aa55c01f
--- /dev/null
+++ b/sources/plugins/specialchar/lang/af.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'af', {
6 options: 'Spesiale karakter-opsies',
7 title: 'Kies spesiale karakter',
8 toolbar: 'Voeg spesiaale karakter in'
9} );
diff --git a/sources/plugins/specialchar/lang/ar.js b/sources/plugins/specialchar/lang/ar.js
new file mode 100644
index 00000000..cc846f29
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ar.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ar', {
6 options: 'خيارات الأحرف الخاصة',
7 title: 'اختر حرف خاص',
8 toolbar: 'إدراج حرف خاص'
9} );
diff --git a/sources/plugins/specialchar/lang/bg.js b/sources/plugins/specialchar/lang/bg.js
new file mode 100644
index 00000000..16910078
--- /dev/null
+++ b/sources/plugins/specialchar/lang/bg.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'bg', {
6 options: 'Опции за специален знак',
7 title: 'Избор на специален знак',
8 toolbar: 'Вмъкване на специален знак'
9} );
diff --git a/sources/plugins/specialchar/lang/bn.js b/sources/plugins/specialchar/lang/bn.js
new file mode 100644
index 00000000..6161ef62
--- /dev/null
+++ b/sources/plugins/specialchar/lang/bn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'bn', {
6 options: 'Special Character Options', // MISSING
7 title: 'বিশেষ ক্যারেক্টার বাছাই কর',
8 toolbar: 'বিশেষ অক্ষর যুক্ত কর'
9} );
diff --git a/sources/plugins/specialchar/lang/bs.js b/sources/plugins/specialchar/lang/bs.js
new file mode 100644
index 00000000..48f6a1a0
--- /dev/null
+++ b/sources/plugins/specialchar/lang/bs.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'bs', {
6 options: 'Special Character Options', // MISSING
7 title: 'Izaberi specijalni karakter',
8 toolbar: 'Ubaci specijalni karater'
9} );
diff --git a/sources/plugins/specialchar/lang/ca.js b/sources/plugins/specialchar/lang/ca.js
new file mode 100644
index 00000000..7d42c0c7
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ca.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ca', {
6 options: 'Opcions de caràcters especials',
7 title: 'Selecciona el caràcter especial',
8 toolbar: 'Insereix caràcter especial'
9} );
diff --git a/sources/plugins/specialchar/lang/cs.js b/sources/plugins/specialchar/lang/cs.js
new file mode 100644
index 00000000..45c9fc8d
--- /dev/null
+++ b/sources/plugins/specialchar/lang/cs.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'cs', {
6 options: 'Nastavení speciálních znaků',
7 title: 'Výběr speciálního znaku',
8 toolbar: 'Vložit speciální znaky'
9} );
diff --git a/sources/plugins/specialchar/lang/cy.js b/sources/plugins/specialchar/lang/cy.js
new file mode 100644
index 00000000..6f60d5d2
--- /dev/null
+++ b/sources/plugins/specialchar/lang/cy.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'cy', {
6 options: 'Opsiynau Nodau Arbennig',
7 title: 'Dewis Nod Arbennig',
8 toolbar: 'Mewnosod Nod Arbennig'
9} );
diff --git a/sources/plugins/specialchar/lang/da.js b/sources/plugins/specialchar/lang/da.js
new file mode 100644
index 00000000..5b79a0b7
--- /dev/null
+++ b/sources/plugins/specialchar/lang/da.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'da', {
6 options: 'Muligheder for specialkarakterer',
7 title: 'Vælg symbol',
8 toolbar: 'Indsæt symbol'
9} );
diff --git a/sources/plugins/specialchar/lang/de.js b/sources/plugins/specialchar/lang/de.js
new file mode 100644
index 00000000..fd2930d9
--- /dev/null
+++ b/sources/plugins/specialchar/lang/de.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'de', {
6 options: 'Sonderzeichenoptionen',
7 title: 'Sonderzeichen auswählen',
8 toolbar: 'Sonderzeichen einfügen'
9} );
diff --git a/sources/plugins/specialchar/lang/el.js b/sources/plugins/specialchar/lang/el.js
new file mode 100644
index 00000000..0ceec1ca
--- /dev/null
+++ b/sources/plugins/specialchar/lang/el.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'el', {
6 options: 'Επιλογές Ειδικών Χαρακτήρων',
7 title: 'Επιλέξτε Έναν Ειδικό Χαρακτήρα',
8 toolbar: 'Εισαγωγή Ειδικού Χαρακτήρα'
9} );
diff --git a/sources/plugins/specialchar/lang/en-au.js b/sources/plugins/specialchar/lang/en-au.js
new file mode 100644
index 00000000..efd6a124
--- /dev/null
+++ b/sources/plugins/specialchar/lang/en-au.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'en-au', {
6 options: 'Special Character Options', // MISSING
7 title: 'Select Special Character',
8 toolbar: 'Insert Special Character'
9} );
diff --git a/sources/plugins/specialchar/lang/en-ca.js b/sources/plugins/specialchar/lang/en-ca.js
new file mode 100644
index 00000000..b4426fca
--- /dev/null
+++ b/sources/plugins/specialchar/lang/en-ca.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'en-ca', {
6 options: 'Special Character Options', // MISSING
7 title: 'Select Special Character',
8 toolbar: 'Insert Special Character'
9} );
diff --git a/sources/plugins/specialchar/lang/en-gb.js b/sources/plugins/specialchar/lang/en-gb.js
new file mode 100644
index 00000000..a2a7ad6a
--- /dev/null
+++ b/sources/plugins/specialchar/lang/en-gb.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'en-gb', {
6 options: 'Special Character Options',
7 title: 'Select Special Character',
8 toolbar: 'Insert Special Character'
9} );
diff --git a/sources/plugins/specialchar/lang/en.js b/sources/plugins/specialchar/lang/en.js
new file mode 100644
index 00000000..5036d1dd
--- /dev/null
+++ b/sources/plugins/specialchar/lang/en.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'en', {
6 options: 'Special Character Options',
7 title: 'Select Special Character',
8 toolbar: 'Insert Special Character'
9} );
diff --git a/sources/plugins/specialchar/lang/eo.js b/sources/plugins/specialchar/lang/eo.js
new file mode 100644
index 00000000..704fd876
--- /dev/null
+++ b/sources/plugins/specialchar/lang/eo.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'eo', {
6 options: 'Opcioj pri Specialaj Signoj',
7 title: 'Selekti Specialan Signon',
8 toolbar: 'Enmeti Specialan Signon'
9} );
diff --git a/sources/plugins/specialchar/lang/es.js b/sources/plugins/specialchar/lang/es.js
new file mode 100644
index 00000000..c672b26a
--- /dev/null
+++ b/sources/plugins/specialchar/lang/es.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'es', {
6 options: 'Opciones de caracteres especiales',
7 title: 'Seleccione un caracter especial',
8 toolbar: 'Insertar Caracter Especial'
9} );
diff --git a/sources/plugins/specialchar/lang/et.js b/sources/plugins/specialchar/lang/et.js
new file mode 100644
index 00000000..6ff026c3
--- /dev/null
+++ b/sources/plugins/specialchar/lang/et.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'et', {
6 options: 'Erimärkide valikud',
7 title: 'Erimärgi valimine',
8 toolbar: 'Erimärgi sisestamine'
9} );
diff --git a/sources/plugins/specialchar/lang/eu.js b/sources/plugins/specialchar/lang/eu.js
new file mode 100644
index 00000000..70afc4b5
--- /dev/null
+++ b/sources/plugins/specialchar/lang/eu.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'eu', {
6 options: 'Karaktere berezien aukerak',
7 title: 'Hautatu karaktere berezia',
8 toolbar: 'Txertatu karaktere berezia'
9} );
diff --git a/sources/plugins/specialchar/lang/fa.js b/sources/plugins/specialchar/lang/fa.js
new file mode 100644
index 00000000..2898fcd1
--- /dev/null
+++ b/sources/plugins/specialchar/lang/fa.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'fa', {
6 options: 'گزینه‌های نویسه‌های ویژه',
7 title: 'گزینش نویسه‌ی ویژه',
8 toolbar: 'گنجاندن نویسه‌ی ویژه'
9} );
diff --git a/sources/plugins/specialchar/lang/fi.js b/sources/plugins/specialchar/lang/fi.js
new file mode 100644
index 00000000..20895830
--- /dev/null
+++ b/sources/plugins/specialchar/lang/fi.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'fi', {
6 options: 'Erikoismerkin ominaisuudet',
7 title: 'Valitse erikoismerkki',
8 toolbar: 'Lisää erikoismerkki'
9} );
diff --git a/sources/plugins/specialchar/lang/fo.js b/sources/plugins/specialchar/lang/fo.js
new file mode 100644
index 00000000..1d85af3b
--- /dev/null
+++ b/sources/plugins/specialchar/lang/fo.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'fo', {
6 options: 'Møguleikar við serteknum',
7 title: 'Vel sertekn',
8 toolbar: 'Set inn sertekn'
9} );
diff --git a/sources/plugins/specialchar/lang/fr-ca.js b/sources/plugins/specialchar/lang/fr-ca.js
new file mode 100644
index 00000000..b94b136a
--- /dev/null
+++ b/sources/plugins/specialchar/lang/fr-ca.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'fr-ca', {
6 options: 'Option des caractères spéciaux',
7 title: 'Sélectionner un caractère spécial',
8 toolbar: 'Insérer un caractère spécial'
9} );
diff --git a/sources/plugins/specialchar/lang/fr.js b/sources/plugins/specialchar/lang/fr.js
new file mode 100644
index 00000000..e2b0934b
--- /dev/null
+++ b/sources/plugins/specialchar/lang/fr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'fr', {
6 options: 'Options des caractères spéciaux',
7 title: 'Sélectionnez un caractère',
8 toolbar: 'Insérer un caractère spécial'
9} );
diff --git a/sources/plugins/specialchar/lang/gl.js b/sources/plugins/specialchar/lang/gl.js
new file mode 100644
index 00000000..45624f4a
--- /dev/null
+++ b/sources/plugins/specialchar/lang/gl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'gl', {
6 options: 'Opcións de caracteres especiais',
7 title: 'Seleccione un carácter especial',
8 toolbar: 'Inserir un carácter especial'
9} );
diff --git a/sources/plugins/specialchar/lang/gu.js b/sources/plugins/specialchar/lang/gu.js
new file mode 100644
index 00000000..157a30c0
--- /dev/null
+++ b/sources/plugins/specialchar/lang/gu.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'gu', {
6 options: 'સ્પેશિઅલ કરેક્ટરના વિકલ્પો',
7 title: 'સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો',
8 toolbar: 'વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું'
9} );
diff --git a/sources/plugins/specialchar/lang/he.js b/sources/plugins/specialchar/lang/he.js
new file mode 100644
index 00000000..4d4d5781
--- /dev/null
+++ b/sources/plugins/specialchar/lang/he.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'he', {
6 options: 'אפשרויות תווים מיוחדים',
7 title: 'בחירת תו מיוחד',
8 toolbar: 'הוספת תו מיוחד'
9} );
diff --git a/sources/plugins/specialchar/lang/hi.js b/sources/plugins/specialchar/lang/hi.js
new file mode 100644
index 00000000..35744721
--- /dev/null
+++ b/sources/plugins/specialchar/lang/hi.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'hi', {
6 options: 'विशेष चरित्र विकल्प',
7 title: 'विशेष करॅक्टर चुनें',
8 toolbar: 'विशेष करॅक्टर इन्सर्ट करें'
9} );
diff --git a/sources/plugins/specialchar/lang/hr.js b/sources/plugins/specialchar/lang/hr.js
new file mode 100644
index 00000000..ae35d948
--- /dev/null
+++ b/sources/plugins/specialchar/lang/hr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'hr', {
6 options: 'Opcije specijalnih znakova',
7 title: 'Odaberite posebni karakter',
8 toolbar: 'Ubaci posebne znakove'
9} );
diff --git a/sources/plugins/specialchar/lang/hu.js b/sources/plugins/specialchar/lang/hu.js
new file mode 100644
index 00000000..b0459056
--- /dev/null
+++ b/sources/plugins/specialchar/lang/hu.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'hu', {
6 options: 'Speciális karakter opciók',
7 title: 'Speciális karakter választása',
8 toolbar: 'Speciális karakter beillesztése'
9} );
diff --git a/sources/plugins/specialchar/lang/id.js b/sources/plugins/specialchar/lang/id.js
new file mode 100644
index 00000000..494246a2
--- /dev/null
+++ b/sources/plugins/specialchar/lang/id.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'id', {
6 options: 'Opsi spesial karakter',
7 title: 'Pilih spesial karakter',
8 toolbar: 'Sisipkan spesial karakter'
9} );
diff --git a/sources/plugins/specialchar/lang/is.js b/sources/plugins/specialchar/lang/is.js
new file mode 100644
index 00000000..6efb20a6
--- /dev/null
+++ b/sources/plugins/specialchar/lang/is.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'is', {
6 options: 'Special Character Options', // MISSING
7 title: 'Velja tákn',
8 toolbar: 'Setja inn merki'
9} );
diff --git a/sources/plugins/specialchar/lang/it.js b/sources/plugins/specialchar/lang/it.js
new file mode 100644
index 00000000..9b09df57
--- /dev/null
+++ b/sources/plugins/specialchar/lang/it.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'it', {
6 options: 'Opzioni carattere speciale',
7 title: 'Seleziona carattere speciale',
8 toolbar: 'Inserisci carattere speciale'
9} );
diff --git a/sources/plugins/specialchar/lang/ja.js b/sources/plugins/specialchar/lang/ja.js
new file mode 100644
index 00000000..773be435
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ja.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ja', {
6 options: '特殊文字オプション',
7 title: '特殊文字の選択',
8 toolbar: '特殊文字を挿入'
9} );
diff --git a/sources/plugins/specialchar/lang/ka.js b/sources/plugins/specialchar/lang/ka.js
new file mode 100644
index 00000000..003cd165
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ka.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ka', {
6 options: 'სპეციალური სიმბოლოს პარამეტრები',
7 title: 'სპეციალური სიმბოლოს არჩევა',
8 toolbar: 'სპეციალური სიმბოლოს ჩასმა'
9} );
diff --git a/sources/plugins/specialchar/lang/km.js b/sources/plugins/specialchar/lang/km.js
new file mode 100644
index 00000000..f6b4b241
--- /dev/null
+++ b/sources/plugins/specialchar/lang/km.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'km', {
6 options: 'ជម្រើស​តួ​អក្សរ​ពិសេស',
7 title: 'រើស​តួអក្សរ​ពិសេស',
8 toolbar: 'បន្ថែមអក្សរពិសេស'
9} );
diff --git a/sources/plugins/specialchar/lang/ko.js b/sources/plugins/specialchar/lang/ko.js
new file mode 100644
index 00000000..7f19d0aa
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ko.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ko', {
6 options: '특수문자 옵션',
7 title: '특수문자 선택',
8 toolbar: '특수문자 삽입'
9} );
diff --git a/sources/plugins/specialchar/lang/ku.js b/sources/plugins/specialchar/lang/ku.js
new file mode 100644
index 00000000..02aadcc3
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ku.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ku', {
6 options: 'هەڵبژاردەی نووسەی تایبەتی',
7 title: 'هەڵبژاردنی نووسەی تایبەتی',
8 toolbar: 'دانانی نووسەی تایبەتی'
9} );
diff --git a/sources/plugins/specialchar/lang/lt.js b/sources/plugins/specialchar/lang/lt.js
new file mode 100644
index 00000000..e05ca754
--- /dev/null
+++ b/sources/plugins/specialchar/lang/lt.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'lt', {
6 options: 'Specialaus simbolio nustatymai',
7 title: 'Pasirinkite specialų simbolį',
8 toolbar: 'Įterpti specialų simbolį'
9} );
diff --git a/sources/plugins/specialchar/lang/lv.js b/sources/plugins/specialchar/lang/lv.js
new file mode 100644
index 00000000..aad351ad
--- /dev/null
+++ b/sources/plugins/specialchar/lang/lv.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'lv', {
6 options: 'Speciālo simbolu uzstādījumi',
7 title: 'Ievietot īpašu simbolu',
8 toolbar: 'Ievietot speciālo simbolu'
9} );
diff --git a/sources/plugins/specialchar/lang/mk.js b/sources/plugins/specialchar/lang/mk.js
new file mode 100644
index 00000000..6fc4911a
--- /dev/null
+++ b/sources/plugins/specialchar/lang/mk.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'mk', {
6 options: 'Special Character Options', // MISSING
7 title: 'Select Special Character', // MISSING
8 toolbar: 'Insert Special Character' // MISSING
9} );
diff --git a/sources/plugins/specialchar/lang/mn.js b/sources/plugins/specialchar/lang/mn.js
new file mode 100644
index 00000000..bdc79571
--- /dev/null
+++ b/sources/plugins/specialchar/lang/mn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'mn', {
6 options: 'Special Character Options', // MISSING
7 title: 'Онцгой тэмдэгт сонгох',
8 toolbar: 'Онцгой тэмдэгт оруулах'
9} );
diff --git a/sources/plugins/specialchar/lang/ms.js b/sources/plugins/specialchar/lang/ms.js
new file mode 100644
index 00000000..a06af9cc
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ms.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ms', {
6 options: 'Special Character Options', // MISSING
7 title: 'Sila pilih huruf istimewa',
8 toolbar: 'Masukkan Huruf Istimewa'
9} );
diff --git a/sources/plugins/specialchar/lang/nb.js b/sources/plugins/specialchar/lang/nb.js
new file mode 100644
index 00000000..ff533b72
--- /dev/null
+++ b/sources/plugins/specialchar/lang/nb.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'nb', {
6 options: 'Alternativer for spesialtegn',
7 title: 'Velg spesialtegn',
8 toolbar: 'Sett inn spesialtegn'
9} );
diff --git a/sources/plugins/specialchar/lang/nl.js b/sources/plugins/specialchar/lang/nl.js
new file mode 100644
index 00000000..30f6a3a5
--- /dev/null
+++ b/sources/plugins/specialchar/lang/nl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'nl', {
6 options: 'Speciale tekens opties',
7 title: 'Selecteer speciaal teken',
8 toolbar: 'Speciaal teken invoegen'
9} );
diff --git a/sources/plugins/specialchar/lang/no.js b/sources/plugins/specialchar/lang/no.js
new file mode 100644
index 00000000..639a1452
--- /dev/null
+++ b/sources/plugins/specialchar/lang/no.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'no', {
6 options: 'Alternativer for spesialtegn',
7 title: 'Velg spesialtegn',
8 toolbar: 'Sett inn spesialtegn'
9} );
diff --git a/sources/plugins/specialchar/lang/pl.js b/sources/plugins/specialchar/lang/pl.js
new file mode 100644
index 00000000..9dacb6f5
--- /dev/null
+++ b/sources/plugins/specialchar/lang/pl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'pl', {
6 options: 'Opcje znaków specjalnych',
7 title: 'Wybierz znak specjalny',
8 toolbar: 'Wstaw znak specjalny'
9} );
diff --git a/sources/plugins/specialchar/lang/pt-br.js b/sources/plugins/specialchar/lang/pt-br.js
new file mode 100644
index 00000000..7b030eb2
--- /dev/null
+++ b/sources/plugins/specialchar/lang/pt-br.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'pt-br', {
6 options: 'Opções de Caractere Especial',
7 title: 'Selecione um Caractere Especial',
8 toolbar: 'Inserir Caractere Especial'
9} );
diff --git a/sources/plugins/specialchar/lang/pt.js b/sources/plugins/specialchar/lang/pt.js
new file mode 100644
index 00000000..fd2ba8a4
--- /dev/null
+++ b/sources/plugins/specialchar/lang/pt.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'pt', {
6 options: 'Opções de caracteres especiais',
7 title: 'Selecione um caracter especial',
8 toolbar: 'Inserir carácter especial'
9} );
diff --git a/sources/plugins/specialchar/lang/ro.js b/sources/plugins/specialchar/lang/ro.js
new file mode 100644
index 00000000..13a33243
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ro.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ro', {
6 options: 'Opțiuni caractere speciale',
7 title: 'Selectează caracter special',
8 toolbar: 'Inserează caracter special'
9} );
diff --git a/sources/plugins/specialchar/lang/ru.js b/sources/plugins/specialchar/lang/ru.js
new file mode 100644
index 00000000..674111ba
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ru.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ru', {
6 options: 'Выбор специального символа',
7 title: 'Выберите специальный символ',
8 toolbar: 'Вставить специальный символ'
9} );
diff --git a/sources/plugins/specialchar/lang/si.js b/sources/plugins/specialchar/lang/si.js
new file mode 100644
index 00000000..af02c017
--- /dev/null
+++ b/sources/plugins/specialchar/lang/si.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'si', {
6 options: 'විශේෂ ගුණාංග වීකල්ප',
7 title: 'විශේෂ ගුණාංග ',
8 toolbar: 'විශේෂ ගුණාංග ඇතුලත් '
9} );
diff --git a/sources/plugins/specialchar/lang/sk.js b/sources/plugins/specialchar/lang/sk.js
new file mode 100644
index 00000000..631e5147
--- /dev/null
+++ b/sources/plugins/specialchar/lang/sk.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'sk', {
6 options: 'Možnosti špeciálneho znaku',
7 title: 'Výber špeciálneho znaku',
8 toolbar: 'Vložiť špeciálny znak'
9} );
diff --git a/sources/plugins/specialchar/lang/sl.js b/sources/plugins/specialchar/lang/sl.js
new file mode 100644
index 00000000..9b25cf78
--- /dev/null
+++ b/sources/plugins/specialchar/lang/sl.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'sl', {
6 options: 'Možnosti Posebnega Znaka',
7 title: 'Izberi Posebni Znak',
8 toolbar: 'Vstavi posebni znak'
9} );
diff --git a/sources/plugins/specialchar/lang/sq.js b/sources/plugins/specialchar/lang/sq.js
new file mode 100644
index 00000000..d3c2b79c
--- /dev/null
+++ b/sources/plugins/specialchar/lang/sq.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'sq', {
6 options: 'Mundësitë për Karaktere Speciale',
7 title: 'Përzgjidh Karakter Special',
8 toolbar: 'Vendos Karakter Special'
9} );
diff --git a/sources/plugins/specialchar/lang/sr-latn.js b/sources/plugins/specialchar/lang/sr-latn.js
new file mode 100644
index 00000000..5c99894b
--- /dev/null
+++ b/sources/plugins/specialchar/lang/sr-latn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'sr-latn', {
6 options: 'Special Character Options', // MISSING
7 title: 'Odaberite specijalni karakter',
8 toolbar: 'Unesi specijalni karakter'
9} );
diff --git a/sources/plugins/specialchar/lang/sr.js b/sources/plugins/specialchar/lang/sr.js
new file mode 100644
index 00000000..e6dc96e2
--- /dev/null
+++ b/sources/plugins/specialchar/lang/sr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'sr', {
6 options: 'Опције специјалног карактера',
7 title: 'Одаберите специјални карактер',
8 toolbar: 'Унеси специјални карактер'
9} );
diff --git a/sources/plugins/specialchar/lang/sv.js b/sources/plugins/specialchar/lang/sv.js
new file mode 100644
index 00000000..b63bfe00
--- /dev/null
+++ b/sources/plugins/specialchar/lang/sv.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'sv', {
6 options: 'Alternativ för utökade tecken',
7 title: 'Välj utökat tecken',
8 toolbar: 'Klistra in utökat tecken'
9} );
diff --git a/sources/plugins/specialchar/lang/th.js b/sources/plugins/specialchar/lang/th.js
new file mode 100644
index 00000000..1a0a1d76
--- /dev/null
+++ b/sources/plugins/specialchar/lang/th.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'th', {
6 options: 'Special Character Options', // MISSING
7 title: 'แทรกตัวอักษรพิเศษ',
8 toolbar: 'แทรกตัวอักษรพิเศษ'
9} );
diff --git a/sources/plugins/specialchar/lang/tr.js b/sources/plugins/specialchar/lang/tr.js
new file mode 100644
index 00000000..bbe6224a
--- /dev/null
+++ b/sources/plugins/specialchar/lang/tr.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'tr', {
6 options: 'Özel Karakter Seçenekleri',
7 title: 'Özel Karakter Seç',
8 toolbar: 'Özel Karakter Ekle'
9} );
diff --git a/sources/plugins/specialchar/lang/tt.js b/sources/plugins/specialchar/lang/tt.js
new file mode 100644
index 00000000..3b14cfd9
--- /dev/null
+++ b/sources/plugins/specialchar/lang/tt.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'tt', {
6 options: 'Махсус символ үзлекләре',
7 title: 'Махсус символ сайлау',
8 toolbar: 'Махсус символ өстәү'
9} );
diff --git a/sources/plugins/specialchar/lang/ug.js b/sources/plugins/specialchar/lang/ug.js
new file mode 100644
index 00000000..5018b4c6
--- /dev/null
+++ b/sources/plugins/specialchar/lang/ug.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'ug', {
6 options: 'ئالاھىدە ھەرپ تاللانمىسى',
7 title: 'ئالاھىدە ھەرپ تاللاڭ',
8 toolbar: 'ئالاھىدە ھەرپ قىستۇر'
9} );
diff --git a/sources/plugins/specialchar/lang/uk.js b/sources/plugins/specialchar/lang/uk.js
new file mode 100644
index 00000000..d9a5daf5
--- /dev/null
+++ b/sources/plugins/specialchar/lang/uk.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'uk', {
6 options: 'Опції',
7 title: 'Оберіть спеціальний символ',
8 toolbar: 'Спеціальний символ'
9} );
diff --git a/sources/plugins/specialchar/lang/vi.js b/sources/plugins/specialchar/lang/vi.js
new file mode 100644
index 00000000..07b0c877
--- /dev/null
+++ b/sources/plugins/specialchar/lang/vi.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'vi', {
6 options: 'Tùy chọn các ký tự đặc biệt',
7 title: 'Hãy chọn ký tự đặc biệt',
8 toolbar: 'Chèn ký tự đặc biệt'
9} );
diff --git a/sources/plugins/specialchar/lang/zh-cn.js b/sources/plugins/specialchar/lang/zh-cn.js
new file mode 100644
index 00000000..9fcdf27f
--- /dev/null
+++ b/sources/plugins/specialchar/lang/zh-cn.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'zh-cn', {
6 options: '特殊符号选项',
7 title: '选择特殊符号',
8 toolbar: '插入特殊符号'
9} );
diff --git a/sources/plugins/specialchar/lang/zh.js b/sources/plugins/specialchar/lang/zh.js
new file mode 100644
index 00000000..17c9b698
--- /dev/null
+++ b/sources/plugins/specialchar/lang/zh.js
@@ -0,0 +1,9 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'specialchar', 'zh', {
6 options: '特殊字元選項',
7 title: '選取特殊字元',
8 toolbar: '插入特殊字元'
9} );
diff --git a/sources/plugins/specialchar/plugin.js b/sources/plugins/specialchar/plugin.js
new file mode 100644
index 00000000..2140a9a9
--- /dev/null
+++ b/sources/plugins/specialchar/plugin.js
@@ -0,0 +1,83 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Special Character plugin
8 */
9
10CKEDITOR.plugins.add( 'specialchar', {
11 // List of available localizations.
12 // jscs:disable
13 availableLangs: { af:1,ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,'en-gb':1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fr:1,'fr-ca':1,gl:1,he:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ko:1,ku:1,lt:1,lv:1,nb:1,nl:1,no:1,pl:1,pt:1,'pt-br':1,ru:1,si:1,sk:1,sl:1,sq:1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,zh:1,'zh-cn':1 },
14 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
15 // jscs:enable
16 requires: 'dialog',
17 icons: 'specialchar', // %REMOVE_LINE_CORE%
18 hidpi: true, // %REMOVE_LINE_CORE%
19 init: function( editor ) {
20 var pluginName = 'specialchar',
21 plugin = this;
22
23 // Register the dialog.
24 CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/specialchar.js' );
25
26 editor.addCommand( pluginName, {
27 exec: function() {
28 var langCode = editor.langCode;
29 langCode =
30 plugin.availableLangs[ langCode ] ? langCode :
31 plugin.availableLangs[ langCode.replace( /-.*/, '' ) ] ? langCode.replace( /-.*/, '' ) :
32 'en';
33
34 CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( plugin.path + 'dialogs/lang/' + langCode + '.js' ), function() {
35 CKEDITOR.tools.extend( editor.lang.specialchar, plugin.langEntries[ langCode ] );
36 editor.openDialog( pluginName );
37 } );
38 },
39 modes: { wysiwyg: 1 },
40 canUndo: false
41 } );
42
43 // Register the toolbar button.
44 editor.ui.addButton && editor.ui.addButton( 'SpecialChar', {
45 label: editor.lang.specialchar.toolbar,
46 command: pluginName,
47 toolbar: 'insert,50'
48 } );
49 }
50} );
51
52/**
53 * The list of special characters visible in the "Special Character" dialog window.
54 *
55 * config.specialChars = [ '&quot;', '&rsquo;', [ '&custom;', 'Custom label' ] ];
56 * config.specialChars = config.specialChars.concat( [ '&quot;', [ '&rsquo;', 'Custom label' ] ] );
57 *
58 * @cfg
59 * @member CKEDITOR.config
60 */
61CKEDITOR.config.specialChars = [
62 '!', '&quot;', '#', '$', '%', '&amp;', "'", '(', ')', '*', '+', '-', '.', '/',
63 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';',
64 '&lt;', '=', '&gt;', '?', '@',
65 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
66 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
67 '[', ']', '^', '_', '`',
68 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
69 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
70 '{', '|', '}', '~',
71 '&euro;', '&lsquo;', '&rsquo;', '&ldquo;', '&rdquo;', '&ndash;', '&mdash;', '&iexcl;', '&cent;', '&pound;',
72 '&curren;', '&yen;', '&brvbar;', '&sect;', '&uml;', '&copy;', '&ordf;', '&laquo;', '&not;', '&reg;', '&macr;',
73 '&deg;', '&sup2;', '&sup3;', '&acute;', '&micro;', '&para;', '&middot;', '&cedil;', '&sup1;', '&ordm;', '&raquo;',
74 '&frac14;', '&frac12;', '&frac34;', '&iquest;', '&Agrave;', '&Aacute;', '&Acirc;', '&Atilde;', '&Auml;', '&Aring;',
75 '&AElig;', '&Ccedil;', '&Egrave;', '&Eacute;', '&Ecirc;', '&Euml;', '&Igrave;', '&Iacute;', '&Icirc;', '&Iuml;',
76 '&ETH;', '&Ntilde;', '&Ograve;', '&Oacute;', '&Ocirc;', '&Otilde;', '&Ouml;', '&times;', '&Oslash;', '&Ugrave;',
77 '&Uacute;', '&Ucirc;', '&Uuml;', '&Yacute;', '&THORN;', '&szlig;', '&agrave;', '&aacute;', '&acirc;', '&atilde;',
78 '&auml;', '&aring;', '&aelig;', '&ccedil;', '&egrave;', '&eacute;', '&ecirc;', '&euml;', '&igrave;', '&iacute;',
79 '&icirc;', '&iuml;', '&eth;', '&ntilde;', '&ograve;', '&oacute;', '&ocirc;', '&otilde;', '&ouml;', '&divide;',
80 '&oslash;', '&ugrave;', '&uacute;', '&ucirc;', '&uuml;', '&yacute;', '&thorn;', '&yuml;', '&OElig;', '&oelig;',
81 '&#372;', '&#374', '&#373', '&#375;', '&sbquo;', '&#8219;', '&bdquo;', '&hellip;', '&trade;', '&#9658;', '&bull;',
82 '&rarr;', '&rArr;', '&hArr;', '&diams;', '&asymp;'
83];
diff --git a/sources/plugins/stylescombo/lang/af.js b/sources/plugins/stylescombo/lang/af.js
new file mode 100644
index 00000000..a3857568
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/af.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'af', {
6 label: 'Styl',
7 panelTitle: 'Vormaat style',
8 panelTitle1: 'Blok style',
9 panelTitle2: 'Inlyn style',
10 panelTitle3: 'Objek style'
11} );
diff --git a/sources/plugins/stylescombo/lang/ar.js b/sources/plugins/stylescombo/lang/ar.js
new file mode 100644
index 00000000..e9bcb405
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ar.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ar', {
6 label: 'أنماط',
7 panelTitle: 'أنماط التنسيق',
8 panelTitle1: 'أنماط الفقرة',
9 panelTitle2: 'أنماط مضمنة',
10 panelTitle3: 'أنماط الكائن'
11} );
diff --git a/sources/plugins/stylescombo/lang/bg.js b/sources/plugins/stylescombo/lang/bg.js
new file mode 100644
index 00000000..a569248f
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/bg.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'bg', {
6 label: 'Стилове',
7 panelTitle: 'Стилове за форматиране',
8 panelTitle1: 'Блокови стилове',
9 panelTitle2: 'Вътрешни стилове',
10 panelTitle3: 'Обектни стилове'
11} );
diff --git a/sources/plugins/stylescombo/lang/bn.js b/sources/plugins/stylescombo/lang/bn.js
new file mode 100644
index 00000000..1a687006
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/bn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'bn', {
6 label: 'স্টাইল',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/bs.js b/sources/plugins/stylescombo/lang/bs.js
new file mode 100644
index 00000000..edde2cac
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/bs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'bs', {
6 label: 'Stil',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/ca.js b/sources/plugins/stylescombo/lang/ca.js
new file mode 100644
index 00000000..d1184a73
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ca', {
6 label: 'Estil',
7 panelTitle: 'Estils de format',
8 panelTitle1: 'Estils de bloc',
9 panelTitle2: 'Estils incrustats',
10 panelTitle3: 'Estils d\'objecte'
11} );
diff --git a/sources/plugins/stylescombo/lang/cs.js b/sources/plugins/stylescombo/lang/cs.js
new file mode 100644
index 00000000..62686cd0
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/cs.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'cs', {
6 label: 'Styl',
7 panelTitle: 'Formátovací styly',
8 panelTitle1: 'Blokové styly',
9 panelTitle2: 'Řádkové styly',
10 panelTitle3: 'Objektové styly'
11} );
diff --git a/sources/plugins/stylescombo/lang/cy.js b/sources/plugins/stylescombo/lang/cy.js
new file mode 100644
index 00000000..60fd8dad
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/cy.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'cy', {
6 label: 'Arddulliau',
7 panelTitle: 'Arddulliau Fformatio',
8 panelTitle1: 'Arddulliau Bloc',
9 panelTitle2: 'Arddulliau Mewnol',
10 panelTitle3: 'Arddulliau Gwrthrych'
11} );
diff --git a/sources/plugins/stylescombo/lang/da.js b/sources/plugins/stylescombo/lang/da.js
new file mode 100644
index 00000000..57b63f97
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/da.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'da', {
6 label: 'Typografi',
7 panelTitle: 'Formattering på stylesheet',
8 panelTitle1: 'Block typografi',
9 panelTitle2: 'Inline typografi',
10 panelTitle3: 'Object typografi'
11} );
diff --git a/sources/plugins/stylescombo/lang/de.js b/sources/plugins/stylescombo/lang/de.js
new file mode 100644
index 00000000..8c8777f5
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/de.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'de', {
6 label: 'Stil',
7 panelTitle: 'Formatierungsstile',
8 panelTitle1: 'Blockstile',
9 panelTitle2: 'Inline Stilart',
10 panelTitle3: 'Objektstile'
11} );
diff --git a/sources/plugins/stylescombo/lang/el.js b/sources/plugins/stylescombo/lang/el.js
new file mode 100644
index 00000000..7359ca94
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/el.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'el', {
6 label: 'Μορφές',
7 panelTitle: 'Στυλ Μορφοποίησης',
8 panelTitle1: 'Στυλ Τμημάτων',
9 panelTitle2: 'Στυλ Εν Σειρά',
10 panelTitle3: 'Στυλ Αντικειμένων'
11} );
diff --git a/sources/plugins/stylescombo/lang/en-au.js b/sources/plugins/stylescombo/lang/en-au.js
new file mode 100644
index 00000000..031ab782
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/en-au.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'en-au', {
6 label: 'Styles',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles',
9 panelTitle2: 'Inline Styles',
10 panelTitle3: 'Object Styles'
11} );
diff --git a/sources/plugins/stylescombo/lang/en-ca.js b/sources/plugins/stylescombo/lang/en-ca.js
new file mode 100644
index 00000000..cd68d244
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/en-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'en-ca', {
6 label: 'Styles',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles',
9 panelTitle2: 'Inline Styles',
10 panelTitle3: 'Object Styles'
11} );
diff --git a/sources/plugins/stylescombo/lang/en-gb.js b/sources/plugins/stylescombo/lang/en-gb.js
new file mode 100644
index 00000000..1225ca8d
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/en-gb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'en-gb', {
6 label: 'Styles',
7 panelTitle: 'Formatting Styles',
8 panelTitle1: 'Block Styles',
9 panelTitle2: 'Inline Styles',
10 panelTitle3: 'Object Styles'
11} );
diff --git a/sources/plugins/stylescombo/lang/en.js b/sources/plugins/stylescombo/lang/en.js
new file mode 100644
index 00000000..a0c1f6c7
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/en.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'en', {
6 label: 'Styles',
7 panelTitle: 'Formatting Styles',
8 panelTitle1: 'Block Styles',
9 panelTitle2: 'Inline Styles',
10 panelTitle3: 'Object Styles'
11} );
diff --git a/sources/plugins/stylescombo/lang/eo.js b/sources/plugins/stylescombo/lang/eo.js
new file mode 100644
index 00000000..c96103da
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/eo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'eo', {
6 label: 'Stiloj',
7 panelTitle: 'Stiloj pri enpaĝigo',
8 panelTitle1: 'Stiloj de blokoj',
9 panelTitle2: 'Enliniaj Stiloj',
10 panelTitle3: 'Stiloj de objektoj'
11} );
diff --git a/sources/plugins/stylescombo/lang/es.js b/sources/plugins/stylescombo/lang/es.js
new file mode 100644
index 00000000..30938393
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/es.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'es', {
6 label: 'Estilo',
7 panelTitle: 'Estilos para formatear',
8 panelTitle1: 'Estilos de párrafo',
9 panelTitle2: 'Estilos de carácter',
10 panelTitle3: 'Estilos de objeto'
11} );
diff --git a/sources/plugins/stylescombo/lang/et.js b/sources/plugins/stylescombo/lang/et.js
new file mode 100644
index 00000000..aa73ef5e
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/et.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'et', {
6 label: 'Stiil',
7 panelTitle: 'Vormindusstiilid',
8 panelTitle1: 'Blokkstiilid',
9 panelTitle2: 'Reasisesed stiilid',
10 panelTitle3: 'Objektistiilid'
11} );
diff --git a/sources/plugins/stylescombo/lang/eu.js b/sources/plugins/stylescombo/lang/eu.js
new file mode 100644
index 00000000..f747066e
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/eu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'eu', {
6 label: 'Estiloak',
7 panelTitle: 'Formatu estiloak',
8 panelTitle1: 'Bloke estiloak',
9 panelTitle2: 'Lineako estiloak',
10 panelTitle3: 'Objektu estiloak'
11} );
diff --git a/sources/plugins/stylescombo/lang/fa.js b/sources/plugins/stylescombo/lang/fa.js
new file mode 100644
index 00000000..2784f281
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/fa.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'fa', {
6 label: 'سبک',
7 panelTitle: 'سبکهای قالببندی',
8 panelTitle1: 'سبکهای بلوک',
9 panelTitle2: 'سبکهای درونخطی',
10 panelTitle3: 'سبکهای شیء'
11} );
diff --git a/sources/plugins/stylescombo/lang/fi.js b/sources/plugins/stylescombo/lang/fi.js
new file mode 100644
index 00000000..bf230f22
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/fi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'fi', {
6 label: 'Tyyli',
7 panelTitle: 'Muotoilujen tyylit',
8 panelTitle1: 'Lohkojen tyylit',
9 panelTitle2: 'Rivinsisäiset tyylit',
10 panelTitle3: 'Objektien tyylit'
11} );
diff --git a/sources/plugins/stylescombo/lang/fo.js b/sources/plugins/stylescombo/lang/fo.js
new file mode 100644
index 00000000..9c5cfe93
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/fo.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'fo', {
6 label: 'Typografi',
7 panelTitle: 'Formatterings stílir',
8 panelTitle1: 'Blokk stílir',
9 panelTitle2: 'Inline stílir',
10 panelTitle3: 'Object stílir'
11} );
diff --git a/sources/plugins/stylescombo/lang/fr-ca.js b/sources/plugins/stylescombo/lang/fr-ca.js
new file mode 100644
index 00000000..38a12ac4
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/fr-ca.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'fr-ca', {
6 label: 'Styles',
7 panelTitle: 'Styles de formattage',
8 panelTitle1: 'Styles de block',
9 panelTitle2: 'Styles en ligne',
10 panelTitle3: 'Styles d\'objet'
11} );
diff --git a/sources/plugins/stylescombo/lang/fr.js b/sources/plugins/stylescombo/lang/fr.js
new file mode 100644
index 00000000..8d215acb
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/fr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'fr', {
6 label: 'Styles',
7 panelTitle: 'Styles de mise en page',
8 panelTitle1: 'Styles de blocs',
9 panelTitle2: 'Styles en ligne',
10 panelTitle3: 'Styles d\'objet'
11} );
diff --git a/sources/plugins/stylescombo/lang/gl.js b/sources/plugins/stylescombo/lang/gl.js
new file mode 100644
index 00000000..344bb9e0
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/gl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'gl', {
6 label: 'Estilos',
7 panelTitle: 'Estilos de formatando',
8 panelTitle1: 'Estilos de bloque',
9 panelTitle2: 'Estilos de liña',
10 panelTitle3: 'Estilos de obxecto'
11} );
diff --git a/sources/plugins/stylescombo/lang/gu.js b/sources/plugins/stylescombo/lang/gu.js
new file mode 100644
index 00000000..244db3ad
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/gu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'gu', {
6 label: 'શૈલી/રીત',
7 panelTitle: 'ફોર્મેટ ',
8 panelTitle1: 'બ્લોક ',
9 panelTitle2: 'ઈનલાઈન ',
10 panelTitle3: 'ઓબ્જેક્ટ પદ્ધતિ'
11} );
diff --git a/sources/plugins/stylescombo/lang/he.js b/sources/plugins/stylescombo/lang/he.js
new file mode 100644
index 00000000..6910e0a2
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/he.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'he', {
6 label: 'סגנון',
7 panelTitle: 'סגנונות פורמט',
8 panelTitle1: 'סגנונות בלוק',
9 panelTitle2: 'סגנונות רצף',
10 panelTitle3: 'סגנונות אובייקט'
11} );
diff --git a/sources/plugins/stylescombo/lang/hi.js b/sources/plugins/stylescombo/lang/hi.js
new file mode 100644
index 00000000..794dd74b
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/hi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'hi', {
6 label: 'स्टाइल',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/hr.js b/sources/plugins/stylescombo/lang/hr.js
new file mode 100644
index 00000000..b44f2ae1
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/hr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'hr', {
6 label: 'Stil',
7 panelTitle: 'Stilovi formatiranja',
8 panelTitle1: 'Block stilovi',
9 panelTitle2: 'Inline stilovi',
10 panelTitle3: 'Object stilovi'
11} );
diff --git a/sources/plugins/stylescombo/lang/hu.js b/sources/plugins/stylescombo/lang/hu.js
new file mode 100644
index 00000000..486bfa26
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/hu.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'hu', {
6 label: 'Stílus',
7 panelTitle: 'Formázási stílusok',
8 panelTitle1: 'Blokk stílusok',
9 panelTitle2: 'Inline stílusok',
10 panelTitle3: 'Objektum stílusok'
11} );
diff --git a/sources/plugins/stylescombo/lang/id.js b/sources/plugins/stylescombo/lang/id.js
new file mode 100644
index 00000000..6650ea89
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/id.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'id', {
6 label: 'Gaya',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/is.js b/sources/plugins/stylescombo/lang/is.js
new file mode 100644
index 00000000..b15c696e
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/is.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'is', {
6 label: 'Stílflokkur',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/it.js b/sources/plugins/stylescombo/lang/it.js
new file mode 100644
index 00000000..a6b7696c
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/it.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'it', {
6 label: 'Stili',
7 panelTitle: 'Stili di formattazione',
8 panelTitle1: 'Stili per blocchi',
9 panelTitle2: 'Stili in linea',
10 panelTitle3: 'Stili per oggetti'
11} );
diff --git a/sources/plugins/stylescombo/lang/ja.js b/sources/plugins/stylescombo/lang/ja.js
new file mode 100644
index 00000000..3777616f
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ja.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ja', {
6 label: 'スタイル',
7 panelTitle: 'スタイル',
8 panelTitle1: 'ブロックスタイル',
9 panelTitle2: 'インラインスタイル',
10 panelTitle3: 'オブジェクトスタイル'
11} );
diff --git a/sources/plugins/stylescombo/lang/ka.js b/sources/plugins/stylescombo/lang/ka.js
new file mode 100644
index 00000000..4c40359f
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ka.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ka', {
6 label: 'სტილები',
7 panelTitle: 'ფორმატირების სტილები',
8 panelTitle1: 'არის სტილები',
9 panelTitle2: 'თანდართული სტილები',
10 panelTitle3: 'ობიექტის სტილები'
11} );
diff --git a/sources/plugins/stylescombo/lang/km.js b/sources/plugins/stylescombo/lang/km.js
new file mode 100644
index 00000000..36acc65a
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/km.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'km', {
6 label: 'រចនាបថ',
7 panelTitle: 'ទ្រង់ទ្រាយ​រចនាបថ',
8 panelTitle1: 'រចនាបថ​ប្លក់',
9 panelTitle2: 'រចនាបថ​ក្នុង​ជួរ',
10 panelTitle3: 'រចនាបថ​វត្ថុ'
11} );
diff --git a/sources/plugins/stylescombo/lang/ko.js b/sources/plugins/stylescombo/lang/ko.js
new file mode 100644
index 00000000..65afa9f3
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ko.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ko', {
6 label: '스타일',
7 panelTitle: '전체 구성 스타일',
8 panelTitle1: '블록 스타일',
9 panelTitle2: '인라인 스타일',
10 panelTitle3: '객체 스타일'
11} );
diff --git a/sources/plugins/stylescombo/lang/ku.js b/sources/plugins/stylescombo/lang/ku.js
new file mode 100644
index 00000000..b975abcd
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ku.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ku', {
6 label: 'شێواز',
7 panelTitle: 'شێوازی ڕازاندنەوە',
8 panelTitle1: 'شێوازی خشت',
9 panelTitle2: 'شێوازی ناوهێڵ',
10 panelTitle3: 'شێوازی بەرکار'
11} );
diff --git a/sources/plugins/stylescombo/lang/lt.js b/sources/plugins/stylescombo/lang/lt.js
new file mode 100644
index 00000000..36ea9f5f
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/lt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'lt', {
6 label: 'Stilius',
7 panelTitle: 'Stilių formatavimas',
8 panelTitle1: 'Blokų stiliai',
9 panelTitle2: 'Vidiniai stiliai',
10 panelTitle3: 'Objektų stiliai'
11} );
diff --git a/sources/plugins/stylescombo/lang/lv.js b/sources/plugins/stylescombo/lang/lv.js
new file mode 100644
index 00000000..d7d14955
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/lv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'lv', {
6 label: 'Stils',
7 panelTitle: 'Formatēšanas stili',
8 panelTitle1: 'Bloka stili',
9 panelTitle2: 'iekļautie stili',
10 panelTitle3: 'Objekta stili'
11} );
diff --git a/sources/plugins/stylescombo/lang/mk.js b/sources/plugins/stylescombo/lang/mk.js
new file mode 100644
index 00000000..83b4db44
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/mk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'mk', {
6 label: 'Styles',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/mn.js b/sources/plugins/stylescombo/lang/mn.js
new file mode 100644
index 00000000..16df60df
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/mn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'mn', {
6 label: 'Загвар',
7 panelTitle: 'Загвар хэлбэржүүлэх',
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/ms.js b/sources/plugins/stylescombo/lang/ms.js
new file mode 100644
index 00000000..b04e615f
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ms.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ms', {
6 label: 'Stail',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/nb.js b/sources/plugins/stylescombo/lang/nb.js
new file mode 100644
index 00000000..0738a4e0
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/nb.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'nb', {
6 label: 'Stil',
7 panelTitle: 'Stilformater',
8 panelTitle1: 'Blokkstiler',
9 panelTitle2: 'Inlinestiler',
10 panelTitle3: 'Objektstiler'
11} );
diff --git a/sources/plugins/stylescombo/lang/nl.js b/sources/plugins/stylescombo/lang/nl.js
new file mode 100644
index 00000000..c24b181e
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/nl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'nl', {
6 label: 'Stijl',
7 panelTitle: 'Opmaakstijlen',
8 panelTitle1: 'Blok stijlen',
9 panelTitle2: 'Inline stijlen',
10 panelTitle3: 'Object stijlen'
11} );
diff --git a/sources/plugins/stylescombo/lang/no.js b/sources/plugins/stylescombo/lang/no.js
new file mode 100644
index 00000000..7b29d03e
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/no.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'no', {
6 label: 'Stil',
7 panelTitle: 'Stilformater',
8 panelTitle1: 'Blokkstiler',
9 panelTitle2: 'Inlinestiler',
10 panelTitle3: 'Objektstiler'
11} );
diff --git a/sources/plugins/stylescombo/lang/pl.js b/sources/plugins/stylescombo/lang/pl.js
new file mode 100644
index 00000000..21fc50da
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/pl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'pl', {
6 label: 'Styl',
7 panelTitle: 'Style formatujące',
8 panelTitle1: 'Style blokowe',
9 panelTitle2: 'Style liniowe',
10 panelTitle3: 'Style obiektowe'
11} );
diff --git a/sources/plugins/stylescombo/lang/pt-br.js b/sources/plugins/stylescombo/lang/pt-br.js
new file mode 100644
index 00000000..ca241162
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/pt-br.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'pt-br', {
6 label: 'Estilo',
7 panelTitle: 'Estilos de Formatação',
8 panelTitle1: 'Estilos de bloco',
9 panelTitle2: 'Estilos de texto corrido',
10 panelTitle3: 'Estilos de objeto'
11} );
diff --git a/sources/plugins/stylescombo/lang/pt.js b/sources/plugins/stylescombo/lang/pt.js
new file mode 100644
index 00000000..9d2e20ae
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/pt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'pt', {
6 label: 'Estilos',
7 panelTitle: 'Estilos de Formatação',
8 panelTitle1: 'Estilos de bloco',
9 panelTitle2: 'Estilos de Linha',
10 panelTitle3: 'Estilos de Objeto'
11} );
diff --git a/sources/plugins/stylescombo/lang/ro.js b/sources/plugins/stylescombo/lang/ro.js
new file mode 100644
index 00000000..ecf004d3
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ro.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ro', {
6 label: 'Stil',
7 panelTitle: 'Formatarea stilurilor',
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/ru.js b/sources/plugins/stylescombo/lang/ru.js
new file mode 100644
index 00000000..56330319
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ru.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ru', {
6 label: 'Стили',
7 panelTitle: 'Стили форматирования',
8 panelTitle1: 'Стили блока',
9 panelTitle2: 'Стили элемента',
10 panelTitle3: 'Стили объекта'
11} );
diff --git a/sources/plugins/stylescombo/lang/si.js b/sources/plugins/stylescombo/lang/si.js
new file mode 100644
index 00000000..b37bdaa0
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/si.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'si', {
6 label: 'විලාසය',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/sk.js b/sources/plugins/stylescombo/lang/sk.js
new file mode 100644
index 00000000..573c7da5
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/sk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'sk', {
6 label: 'Štýly',
7 panelTitle: 'Formátovanie štýlov',
8 panelTitle1: 'Štýly bloku',
9 panelTitle2: 'Vnútroriadkové (inline) štýly',
10 panelTitle3: 'Štýly objeku'
11} );
diff --git a/sources/plugins/stylescombo/lang/sl.js b/sources/plugins/stylescombo/lang/sl.js
new file mode 100644
index 00000000..80dafcda
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/sl.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'sl', {
6 label: 'Slog',
7 panelTitle: 'Oblikovalni Stili',
8 panelTitle1: 'Slogi odstavkov',
9 panelTitle2: 'Slogi besedila',
10 panelTitle3: 'Slogi objektov'
11} );
diff --git a/sources/plugins/stylescombo/lang/sq.js b/sources/plugins/stylescombo/lang/sq.js
new file mode 100644
index 00000000..098e3290
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/sq.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'sq', {
6 label: 'Stil',
7 panelTitle: 'Stilet e Formatimit',
8 panelTitle1: 'Stilet e Bllokut',
9 panelTitle2: 'Stili i Brendshëm',
10 panelTitle3: 'Stilet e Objektit'
11} );
diff --git a/sources/plugins/stylescombo/lang/sr-latn.js b/sources/plugins/stylescombo/lang/sr-latn.js
new file mode 100644
index 00000000..47272433
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/sr-latn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'sr-latn', {
6 label: 'Stil',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/sr.js b/sources/plugins/stylescombo/lang/sr.js
new file mode 100644
index 00000000..ff5aac1e
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/sr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'sr', {
6 label: 'Стил',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/sv.js b/sources/plugins/stylescombo/lang/sv.js
new file mode 100644
index 00000000..1babaff5
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/sv.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'sv', {
6 label: 'Anpassad stil',
7 panelTitle: 'Formatmallar',
8 panelTitle1: 'Blockstil',
9 panelTitle2: 'Inbäddad stil',
10 panelTitle3: 'Objektets stil'
11} );
diff --git a/sources/plugins/stylescombo/lang/th.js b/sources/plugins/stylescombo/lang/th.js
new file mode 100644
index 00000000..fd780050
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/th.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'th', {
6 label: 'ลักษณะ',
7 panelTitle: 'Formatting Styles', // MISSING
8 panelTitle1: 'Block Styles', // MISSING
9 panelTitle2: 'Inline Styles', // MISSING
10 panelTitle3: 'Object Styles' // MISSING
11} );
diff --git a/sources/plugins/stylescombo/lang/tr.js b/sources/plugins/stylescombo/lang/tr.js
new file mode 100644
index 00000000..369ec3dd
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/tr.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'tr', {
6 label: 'Biçem',
7 panelTitle: 'Stilleri Düzenliyor',
8 panelTitle1: 'Blok Stilleri',
9 panelTitle2: 'Inline Stilleri',
10 panelTitle3: 'Nesne Stilleri'
11} );
diff --git a/sources/plugins/stylescombo/lang/tt.js b/sources/plugins/stylescombo/lang/tt.js
new file mode 100644
index 00000000..c1f50d23
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/tt.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'tt', {
6 label: 'Стильләр',
7 panelTitle: 'Форматлау стильләре',
8 panelTitle1: 'Блоклар стильләре',
9 panelTitle2: 'Эчке стильләр',
10 panelTitle3: 'Объектлар стильләре'
11} );
diff --git a/sources/plugins/stylescombo/lang/ug.js b/sources/plugins/stylescombo/lang/ug.js
new file mode 100644
index 00000000..a196ccfa
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/ug.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'ug', {
6 label: 'ئۇسلۇب',
7 panelTitle: 'ئۇسلۇب',
8 panelTitle1: 'بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى',
9 panelTitle2: 'ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى',
10 panelTitle3: 'نەڭ (Object) ئېلېمېنت ئۇسلۇبى'
11} );
diff --git a/sources/plugins/stylescombo/lang/uk.js b/sources/plugins/stylescombo/lang/uk.js
new file mode 100644
index 00000000..0d670543
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/uk.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'uk', {
6 label: 'Стиль',
7 panelTitle: 'Стилі форматування',
8 panelTitle1: 'Блочні стилі',
9 panelTitle2: 'Рядкові стилі',
10 panelTitle3: 'Об\'єктні стилі'
11} );
diff --git a/sources/plugins/stylescombo/lang/vi.js b/sources/plugins/stylescombo/lang/vi.js
new file mode 100644
index 00000000..790c6951
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/vi.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'vi', {
6 label: 'Kiểu',
7 panelTitle: 'Phong cách định dạng',
8 panelTitle1: 'Kiểu khối',
9 panelTitle2: 'Kiểu trực tiếp',
10 panelTitle3: 'Kiểu đối tượng'
11} );
diff --git a/sources/plugins/stylescombo/lang/zh-cn.js b/sources/plugins/stylescombo/lang/zh-cn.js
new file mode 100644
index 00000000..c6dc3332
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/zh-cn.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'zh-cn', {
6 label: '样式',
7 panelTitle: '样式',
8 panelTitle1: '块级元素样式',
9 panelTitle2: '内联元素样式',
10 panelTitle3: '对象元素样式'
11} );
diff --git a/sources/plugins/stylescombo/lang/zh.js b/sources/plugins/stylescombo/lang/zh.js
new file mode 100644
index 00000000..30f689a8
--- /dev/null
+++ b/sources/plugins/stylescombo/lang/zh.js
@@ -0,0 +1,11 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'stylescombo', 'zh', {
6 label: '樣式',
7 panelTitle: '格式化樣式',
8 panelTitle1: '區塊樣式',
9 panelTitle2: '內嵌樣式',
10 panelTitle3: '物件樣式'
11} );
diff --git a/sources/plugins/stylescombo/plugin.js b/sources/plugins/stylescombo/plugin.js
new file mode 100644
index 00000000..df36ddad
--- /dev/null
+++ b/sources/plugins/stylescombo/plugin.js
@@ -0,0 +1,193 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 'use strict';
8
9 CKEDITOR.plugins.add( 'stylescombo', {
10 requires: 'richcombo',
11 // jscs:disable maximumLineLength
12 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
13 // jscs:enable maximumLineLength
14
15 init: function( editor ) {
16 var config = editor.config,
17 lang = editor.lang.stylescombo,
18 styles = {},
19 stylesList = [],
20 combo,
21 allowedContent = [];
22
23 editor.on( 'stylesSet', function( evt ) {
24 var stylesDefinitions = evt.data.styles;
25
26 if ( !stylesDefinitions )
27 return;
28
29 var style, styleName, styleType;
30
31 // Put all styles into an Array.
32 for ( var i = 0, count = stylesDefinitions.length; i < count; i++ ) {
33 var styleDefinition = stylesDefinitions[ i ];
34
35 if ( editor.blockless && ( styleDefinition.element in CKEDITOR.dtd.$block ) )
36 continue;
37
38 styleName = styleDefinition.name;
39 style = new CKEDITOR.style( styleDefinition );
40
41 if ( !editor.filter.customConfig || editor.filter.check( style ) ) {
42 style._name = styleName;
43 style._.enterMode = config.enterMode;
44 // Get the type (which will be used to assign style to one of 3 groups) from assignedTo if it's defined.
45 style._.type = styleType = style.assignedTo || style.type;
46
47 // Weight is used to sort styles (#9029).
48 style._.weight = i + ( styleType == CKEDITOR.STYLE_OBJECT ? 1 : styleType == CKEDITOR.STYLE_BLOCK ? 2 : 3 ) * 1000;
49
50 styles[ styleName ] = style;
51 stylesList.push( style );
52 allowedContent.push( style );
53 }
54 }
55
56 // Sorts the Array, so the styles get grouped by type in proper order (#9029).
57 stylesList.sort( function( styleA, styleB ) {
58 return styleA._.weight - styleB._.weight;
59 } );
60 } );
61
62 editor.ui.addRichCombo( 'Styles', {
63 label: lang.label,
64 title: lang.panelTitle,
65 toolbar: 'styles,10',
66 allowedContent: allowedContent,
67
68 panel: {
69 css: [ CKEDITOR.skin.getPath( 'editor' ) ].concat( config.contentsCss ),
70 multiSelect: true,
71 attributes: { 'aria-label': lang.panelTitle }
72 },
73
74 init: function() {
75 var style, styleName, lastType, type, i, count;
76
77 // Loop over the Array, adding all items to the
78 // combo.
79 for ( i = 0, count = stylesList.length; i < count; i++ ) {
80 style = stylesList[ i ];
81 styleName = style._name;
82 type = style._.type;
83
84 if ( type != lastType ) {
85 this.startGroup( lang[ 'panelTitle' + String( type ) ] );
86 lastType = type;
87 }
88
89 this.add( styleName, style.type == CKEDITOR.STYLE_OBJECT ? styleName : style.buildPreview(), styleName );
90 }
91
92 this.commit();
93 },
94
95 onClick: function( value ) {
96 editor.focus();
97 editor.fire( 'saveSnapshot' );
98
99 var style = styles[ value ],
100 elementPath = editor.elementPath();
101
102 editor[ style.checkActive( elementPath, editor ) ? 'removeStyle' : 'applyStyle' ]( style );
103 editor.fire( 'saveSnapshot' );
104 },
105
106 onRender: function() {
107 editor.on( 'selectionChange', function( ev ) {
108 var currentValue = this.getValue(),
109 elementPath = ev.data.path,
110 elements = elementPath.elements;
111
112 // For each element into the elements path.
113 for ( var i = 0, count = elements.length, element; i < count; i++ ) {
114 element = elements[ i ];
115
116 // Check if the element is removable by any of
117 // the styles.
118 for ( var value in styles ) {
119 if ( styles[ value ].checkElementRemovable( element, true, editor ) ) {
120 if ( value != currentValue )
121 this.setValue( value );
122 return;
123 }
124 }
125 }
126
127 // If no styles match, just empty it.
128 this.setValue( '' );
129 }, this );
130 },
131
132 onOpen: function() {
133 var selection = editor.getSelection(),
134 element = selection.getSelectedElement(),
135 elementPath = editor.elementPath( element ),
136 counter = [ 0, 0, 0, 0 ];
137
138 this.showAll();
139 this.unmarkAll();
140 for ( var name in styles ) {
141 var style = styles[ name ],
142 type = style._.type;
143
144 if ( style.checkApplicable( elementPath, editor, editor.activeFilter ) )
145 counter[ type ]++;
146 else
147 this.hideItem( name );
148
149 if ( style.checkActive( elementPath, editor ) )
150 this.mark( name );
151 }
152
153 if ( !counter[ CKEDITOR.STYLE_BLOCK ] )
154 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] );
155
156 if ( !counter[ CKEDITOR.STYLE_INLINE ] )
157 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] );
158
159 if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
160 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
161 },
162
163 refresh: function() {
164 var elementPath = editor.elementPath();
165
166 if ( !elementPath )
167 return;
168
169 for ( var name in styles ) {
170 var style = styles[ name ];
171
172 if ( style.checkApplicable( elementPath, editor, editor.activeFilter ) )
173 return;
174 }
175 this.setState( CKEDITOR.TRISTATE_DISABLED );
176 },
177
178 // Force a reload of the data
179 reset: function() {
180 if ( combo ) {
181 delete combo._.panel;
182 delete combo._.list;
183 combo._.committed = 0;
184 combo._.items = {};
185 combo._.state = CKEDITOR.TRISTATE_OFF;
186 }
187 styles = {};
188 stylesList = [];
189 }
190 } );
191 }
192 } );
193} )();
diff --git a/sources/plugins/tab/plugin.js b/sources/plugins/tab/plugin.js
new file mode 100644
index 00000000..931bc284
--- /dev/null
+++ b/sources/plugins/tab/plugin.js
@@ -0,0 +1,302 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var meta = {
8 editorFocus: false,
9 modes: { wysiwyg: 1, source: 1 }
10 };
11
12 var blurCommand = {
13 exec: function( editor ) {
14 editor.container.focusNext( true, editor.tabIndex );
15 }
16 };
17
18 var blurBackCommand = {
19 exec: function( editor ) {
20 editor.container.focusPrevious( true, editor.tabIndex );
21 }
22 };
23
24 function selectNextCellCommand( backward ) {
25 return {
26 editorFocus: false,
27 canUndo: false,
28 modes: { wysiwyg: 1 },
29 exec: function( editor ) {
30 if ( editor.editable().hasFocus ) {
31 var sel = editor.getSelection(),
32 path = new CKEDITOR.dom.elementPath( sel.getCommonAncestor(), sel.root ),
33 cell;
34
35 if ( ( cell = path.contains( { td: 1, th: 1 }, 1 ) ) ) {
36 var resultRange = editor.createRange(),
37 next = CKEDITOR.tools.tryThese( function() {
38 var row = cell.getParent(),
39 next = row.$.cells[ cell.$.cellIndex + ( backward ? -1 : 1 ) ];
40
41 // Invalid any empty value.
42 next.parentNode.parentNode;
43 return next;
44 }, function() {
45 var row = cell.getParent(),
46 table = row.getAscendant( 'table' ),
47 nextRow = table.$.rows[ row.$.rowIndex + ( backward ? -1 : 1 ) ];
48
49 return nextRow.cells[ backward ? nextRow.cells.length - 1 : 0 ];
50 } );
51
52 // Clone one more row at the end of table and select the first newly established cell.
53 if ( !( next || backward ) ) {
54 var table = cell.getAscendant( 'table' ).$,
55 cells = cell.getParent().$.cells;
56
57 var newRow = new CKEDITOR.dom.element( table.insertRow( -1 ), editor.document );
58
59 for ( var i = 0, count = cells.length; i < count; i++ ) {
60 var newCell = newRow.append( new CKEDITOR.dom.element( cells[ i ], editor.document ).clone( false, false ) );
61 newCell.appendBogus();
62 }
63
64 resultRange.moveToElementEditStart( newRow );
65 } else if ( next ) {
66 next = new CKEDITOR.dom.element( next );
67 resultRange.moveToElementEditStart( next );
68 // Avoid selecting empty block makes the cursor blind.
69 if ( !( resultRange.checkStartOfBlock() && resultRange.checkEndOfBlock() ) )
70 resultRange.selectNodeContents( next );
71 } else {
72 return true;
73 }
74
75 resultRange.select( true );
76 return true;
77 }
78 }
79
80 return false;
81 }
82 };
83 }
84
85 CKEDITOR.plugins.add( 'tab', {
86 init: function( editor ) {
87 var tabTools = editor.config.enableTabKeyTools !== false,
88 tabSpaces = editor.config.tabSpaces || 0,
89 tabText = '';
90
91 while ( tabSpaces-- )
92 tabText += '\xa0';
93
94 if ( tabText ) {
95 editor.on( 'key', function( ev ) {
96 // TAB.
97 if ( ev.data.keyCode == 9 ) {
98 editor.insertText( tabText );
99 ev.cancel();
100 }
101 } );
102 }
103
104 if ( tabTools ) {
105 editor.on( 'key', function( ev ) {
106 if ( ev.data.keyCode == 9 && editor.execCommand( 'selectNextCell' ) || // TAB
107 ev.data.keyCode == ( CKEDITOR.SHIFT + 9 ) && editor.execCommand( 'selectPreviousCell' ) ) // SHIFT+TAB
108 ev.cancel();
109 } );
110 }
111
112 editor.addCommand( 'blur', CKEDITOR.tools.extend( blurCommand, meta ) );
113 editor.addCommand( 'blurBack', CKEDITOR.tools.extend( blurBackCommand, meta ) );
114 editor.addCommand( 'selectNextCell', selectNextCellCommand() );
115 editor.addCommand( 'selectPreviousCell', selectNextCellCommand( true ) );
116 }
117 } );
118} )();
119
120/**
121 * Moves the UI focus to the element following this element in the tabindex order.
122 *
123 * var element = CKEDITOR.document.getById( 'example' );
124 * element.focusNext();
125 *
126 * @param {Boolean} [ignoreChildren=false]
127 * @param {Number} [indexToUse]
128 * @member CKEDITOR.dom.element
129 */
130CKEDITOR.dom.element.prototype.focusNext = function( ignoreChildren, indexToUse ) {
131 var curTabIndex = ( indexToUse === undefined ? this.getTabIndex() : indexToUse ),
132 passedCurrent, enteredCurrent, elected, electedTabIndex, element, elementTabIndex;
133
134 if ( curTabIndex <= 0 ) {
135 // If this element has tabindex <= 0 then we must simply look for any
136 // element following it containing tabindex=0.
137
138 element = this.getNextSourceNode( ignoreChildren, CKEDITOR.NODE_ELEMENT );
139
140 while ( element ) {
141 if ( element.isVisible() && element.getTabIndex() === 0 ) {
142 elected = element;
143 break;
144 }
145
146 element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT );
147 }
148 } else {
149 // If this element has tabindex > 0 then we must look for:
150 // 1. An element following this element with the same tabindex.
151 // 2. The first element in source other with the lowest tabindex
152 // that is higher than this element tabindex.
153 // 3. The first element with tabindex=0.
154
155 element = this.getDocument().getBody().getFirst();
156
157 while ( ( element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) ) {
158 if ( !passedCurrent ) {
159 if ( !enteredCurrent && element.equals( this ) ) {
160 enteredCurrent = true;
161
162 // Ignore this element, if required.
163 if ( ignoreChildren ) {
164 if ( !( element = element.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
165 break;
166 passedCurrent = 1;
167 }
168 } else if ( enteredCurrent && !this.contains( element ) ) {
169 passedCurrent = 1;
170 }
171 }
172
173 if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
174 continue;
175
176 if ( passedCurrent && elementTabIndex == curTabIndex ) {
177 elected = element;
178 break;
179 }
180
181 if ( elementTabIndex > curTabIndex && ( !elected || !electedTabIndex || elementTabIndex < electedTabIndex ) ) {
182 elected = element;
183 electedTabIndex = elementTabIndex;
184 } else if ( !elected && elementTabIndex === 0 ) {
185 elected = element;
186 electedTabIndex = elementTabIndex;
187 }
188 }
189 }
190
191 if ( elected )
192 elected.focus();
193};
194
195/**
196 * Moves the UI focus to the element before this element in the tabindex order.
197 *
198 * var element = CKEDITOR.document.getById( 'example' );
199 * element.focusPrevious();
200 *
201 * @param {Boolean} [ignoreChildren=false]
202 * @param {Number} [indexToUse]
203 * @member CKEDITOR.dom.element
204 */
205CKEDITOR.dom.element.prototype.focusPrevious = function( ignoreChildren, indexToUse ) {
206 var curTabIndex = ( indexToUse === undefined ? this.getTabIndex() : indexToUse ),
207 passedCurrent, enteredCurrent, elected,
208 electedTabIndex = 0,
209 elementTabIndex;
210
211 var element = this.getDocument().getBody().getLast();
212
213 while ( ( element = element.getPreviousSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) ) {
214 if ( !passedCurrent ) {
215 if ( !enteredCurrent && element.equals( this ) ) {
216 enteredCurrent = true;
217
218 // Ignore this element, if required.
219 if ( ignoreChildren ) {
220 if ( !( element = element.getPreviousSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
221 break;
222 passedCurrent = 1;
223 }
224 } else if ( enteredCurrent && !this.contains( element ) ) {
225 passedCurrent = 1;
226 }
227 }
228
229 if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
230 continue;
231
232 if ( curTabIndex <= 0 ) {
233 // If this element has tabindex <= 0 then we must look for:
234 // 1. An element before this one containing tabindex=0.
235 // 2. The last element with the highest tabindex.
236
237 if ( passedCurrent && elementTabIndex === 0 ) {
238 elected = element;
239 break;
240 }
241
242 if ( elementTabIndex > electedTabIndex ) {
243 elected = element;
244 electedTabIndex = elementTabIndex;
245 }
246 } else {
247 // If this element has tabindex > 0 we must look for:
248 // 1. An element preceeding this one, with the same tabindex.
249 // 2. The last element in source other with the highest tabindex
250 // that is lower than this element tabindex.
251
252 if ( passedCurrent && elementTabIndex == curTabIndex ) {
253 elected = element;
254 break;
255 }
256
257 if ( elementTabIndex < curTabIndex && ( !elected || elementTabIndex > electedTabIndex ) ) {
258 elected = element;
259 electedTabIndex = elementTabIndex;
260 }
261 }
262 }
263
264 if ( elected )
265 elected.focus();
266};
267
268/**
269 * Intructs the editor to add a number of spaces (`&nbsp;`) to the text when
270 * hitting the <kbd>Tab</kbd> key. If set to zero, the <kbd>Tab</kbd> key will be used to move the
271 * cursor focus to the next element in the page, out of the editor focus.
272 *
273 * config.tabSpaces = 4;
274 *
275 * @cfg {Number} [tabSpaces=0]
276 * @member CKEDITOR.config
277 */
278
279/**
280 * Allow context-sensitive <kbd>Tab</kbd> key behaviors, including the following scenarios:
281 *
282 * When selection is anchored inside **table cells**:
283 *
284 * * If <kbd>Tab</kbd> is pressed, select the content of the "next" cell. If in the last
285 * cell in the table, add a new row to it and focus its first cell.
286 * * If <kbd>Shift+Tab</kbd> is pressed, select the content of the "previous" cell.
287 * Do nothing when it is in the first cell.
288 *
289 * Example:
290 *
291 * config.enableTabKeyTools = false;
292 *
293 * @cfg {Boolean} [enableTabKeyTools=true]
294 * @member CKEDITOR.config
295 */
296
297// If the <kbd>Tab</kbd> key is not supposed to be enabled for navigation, the following
298// settings could be used alternatively:
299// config.keystrokes.push(
300// [ CKEDITOR.ALT + 38 /*Arrow Up*/, 'selectPreviousCell' ],
301// [ CKEDITOR.ALT + 40 /*Arrow Down*/, 'selectNextCell' ]
302// );
diff --git a/sources/plugins/table/dialogs/table.js b/sources/plugins/table/dialogs/table.js
new file mode 100644
index 00000000..5c1213ea
--- /dev/null
+++ b/sources/plugins/table/dialogs/table.js
@@ -0,0 +1,541 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var defaultToPixel = CKEDITOR.tools.cssLength;
8
9 var commitValue = function( data ) {
10 var id = this.id;
11 if ( !data.info )
12 data.info = {};
13 data.info[ id ] = this.getValue();
14 };
15
16 function tableColumns( table ) {
17 var cols = 0,
18 maxCols = 0;
19 for ( var i = 0, row, rows = table.$.rows.length; i < rows; i++ ) {
20 row = table.$.rows[ i ], cols = 0;
21 for ( var j = 0, cell, cells = row.cells.length; j < cells; j++ ) {
22 cell = row.cells[ j ];
23 cols += cell.colSpan;
24 }
25
26 cols > maxCols && ( maxCols = cols );
27 }
28
29 return maxCols;
30 }
31
32
33 // Whole-positive-integer validator.
34 function validatorNum( msg ) {
35 return function() {
36 var value = this.getValue(),
37 pass = !!( CKEDITOR.dialog.validate.integer()( value ) && value > 0 );
38
39 if ( !pass ) {
40 alert( msg ); // jshint ignore:line
41 this.select();
42 }
43
44 return pass;
45 };
46 }
47
48 function tableDialog( editor, command ) {
49 var makeElement = function( name ) {
50 return new CKEDITOR.dom.element( name, editor.document );
51 };
52
53 var editable = editor.editable();
54
55 var dialogadvtab = editor.plugins.dialogadvtab;
56
57 return {
58 title: editor.lang.table.title,
59 minWidth: 310,
60 minHeight: CKEDITOR.env.ie ? 310 : 280,
61
62 onLoad: function() {
63 var dialog = this;
64
65 var styles = dialog.getContentElement( 'advanced', 'advStyles' );
66
67 if ( styles ) {
68 styles.on( 'change', function() {
69 // Synchronize width value.
70 var width = this.getStyle( 'width', '' ),
71 txtWidth = dialog.getContentElement( 'info', 'txtWidth' );
72
73 txtWidth && txtWidth.setValue( width, true );
74
75 // Synchronize height value.
76 var height = this.getStyle( 'height', '' ),
77 txtHeight = dialog.getContentElement( 'info', 'txtHeight' );
78
79 txtHeight && txtHeight.setValue( height, true );
80 } );
81 }
82 },
83
84 onShow: function() {
85 // Detect if there's a selected table.
86 var selection = editor.getSelection(),
87 ranges = selection.getRanges(),
88 table;
89
90 var rowsInput = this.getContentElement( 'info', 'txtRows' ),
91 colsInput = this.getContentElement( 'info', 'txtCols' ),
92 widthInput = this.getContentElement( 'info', 'txtWidth' ),
93 heightInput = this.getContentElement( 'info', 'txtHeight' );
94
95 if ( command == 'tableProperties' ) {
96 var selected = selection.getSelectedElement();
97 if ( selected && selected.is( 'table' ) )
98 table = selected;
99 else if ( ranges.length > 0 ) {
100 // Webkit could report the following range on cell selection (#4948):
101 // <table><tr><td>[&nbsp;</td></tr></table>]
102 if ( CKEDITOR.env.webkit )
103 ranges[ 0 ].shrink( CKEDITOR.NODE_ELEMENT );
104
105 table = editor.elementPath( ranges[ 0 ].getCommonAncestor( true ) ).contains( 'table', 1 );
106 }
107
108 // Save a reference to the selected table, and push a new set of default values.
109 this._.selectedElement = table;
110 }
111
112 // Enable or disable the row, cols, width fields.
113 if ( table ) {
114 this.setupContent( table );
115 rowsInput && rowsInput.disable();
116 colsInput && colsInput.disable();
117 } else {
118 rowsInput && rowsInput.enable();
119 colsInput && colsInput.enable();
120 }
121
122 // Call the onChange method for the widht and height fields so
123 // they get reflected into the Advanced tab.
124 widthInput && widthInput.onChange();
125 heightInput && heightInput.onChange();
126 },
127 onOk: function() {
128 var selection = editor.getSelection(),
129 bms = this._.selectedElement && selection.createBookmarks();
130
131 var table = this._.selectedElement || makeElement( 'table' ),
132 data = {};
133
134 this.commitContent( data, table );
135
136 if ( data.info ) {
137 var info = data.info;
138
139 // Generate the rows and cols.
140 if ( !this._.selectedElement ) {
141 var tbody = table.append( makeElement( 'tbody' ) ),
142 rows = parseInt( info.txtRows, 10 ) || 0,
143 cols = parseInt( info.txtCols, 10 ) || 0;
144
145 for ( var i = 0; i < rows; i++ ) {
146 var row = tbody.append( makeElement( 'tr' ) );
147 for ( var j = 0; j < cols; j++ ) {
148 var cell = row.append( makeElement( 'td' ) );
149 cell.appendBogus();
150 }
151 }
152 }
153
154 // Modify the table headers. Depends on having rows and cols generated
155 // correctly so it can't be done in commit functions.
156
157 // Should we make a <thead>?
158 var headers = info.selHeaders;
159 if ( !table.$.tHead && ( headers == 'row' || headers == 'both' ) ) {
160 var thead = new CKEDITOR.dom.element( table.$.createTHead() );
161 tbody = table.getElementsByTag( 'tbody' ).getItem( 0 );
162 var theRow = tbody.getElementsByTag( 'tr' ).getItem( 0 );
163
164 // Change TD to TH:
165 for ( i = 0; i < theRow.getChildCount(); i++ ) {
166 var th = theRow.getChild( i );
167 // Skip bookmark nodes. (#6155)
168 if ( th.type == CKEDITOR.NODE_ELEMENT && !th.data( 'cke-bookmark' ) ) {
169 th.renameNode( 'th' );
170 th.setAttribute( 'scope', 'col' );
171 }
172 }
173 thead.append( theRow.remove() );
174 }
175
176 if ( table.$.tHead !== null && !( headers == 'row' || headers == 'both' ) ) {
177 // Move the row out of the THead and put it in the TBody:
178 thead = new CKEDITOR.dom.element( table.$.tHead );
179 tbody = table.getElementsByTag( 'tbody' ).getItem( 0 );
180
181 var previousFirstRow = tbody.getFirst();
182 while ( thead.getChildCount() > 0 ) {
183 theRow = thead.getFirst();
184 for ( i = 0; i < theRow.getChildCount(); i++ ) {
185 var newCell = theRow.getChild( i );
186 if ( newCell.type == CKEDITOR.NODE_ELEMENT ) {
187 newCell.renameNode( 'td' );
188 newCell.removeAttribute( 'scope' );
189 }
190 }
191 theRow.insertBefore( previousFirstRow );
192 }
193 thead.remove();
194 }
195
196 // Should we make all first cells in a row TH?
197 if ( !this.hasColumnHeaders && ( headers == 'col' || headers == 'both' ) ) {
198 for ( row = 0; row < table.$.rows.length; row++ ) {
199 newCell = new CKEDITOR.dom.element( table.$.rows[ row ].cells[ 0 ] );
200 newCell.renameNode( 'th' );
201 newCell.setAttribute( 'scope', 'row' );
202 }
203 }
204
205 // Should we make all first TH-cells in a row make TD? If 'yes' we do it the other way round :-)
206 if ( ( this.hasColumnHeaders ) && !( headers == 'col' || headers == 'both' ) ) {
207 for ( i = 0; i < table.$.rows.length; i++ ) {
208 row = new CKEDITOR.dom.element( table.$.rows[ i ] );
209 if ( row.getParent().getName() == 'tbody' ) {
210 newCell = new CKEDITOR.dom.element( row.$.cells[ 0 ] );
211 newCell.renameNode( 'td' );
212 newCell.removeAttribute( 'scope' );
213 }
214 }
215 }
216
217 // Set the width and height.
218 info.txtHeight ? table.setStyle( 'height', info.txtHeight ) : table.removeStyle( 'height' );
219 info.txtWidth ? table.setStyle( 'width', info.txtWidth ) : table.removeStyle( 'width' );
220
221 if ( !table.getAttribute( 'style' ) )
222 table.removeAttribute( 'style' );
223 }
224
225 // Insert the table element if we're creating one.
226 if ( !this._.selectedElement ) {
227 editor.insertElement( table );
228 // Override the default cursor position after insertElement to place
229 // cursor inside the first cell (#7959), IE needs a while.
230 setTimeout( function() {
231 var firstCell = new CKEDITOR.dom.element( table.$.rows[ 0 ].cells[ 0 ] );
232 var range = editor.createRange();
233 range.moveToPosition( firstCell, CKEDITOR.POSITION_AFTER_START );
234 range.select();
235 }, 0 );
236 }
237 // Properly restore the selection, (#4822) but don't break
238 // because of this, e.g. updated table caption.
239 else {
240 try {
241 selection.selectBookmarks( bms );
242 } catch ( er ) {
243 }
244 }
245 },
246 contents: [ {
247 id: 'info',
248 label: editor.lang.table.title,
249 elements: [ {
250 type: 'hbox',
251 widths: [ null, null ],
252 styles: [ 'vertical-align:top' ],
253 children: [ {
254 type: 'vbox',
255 padding: 0,
256 children: [ {
257 type: 'text',
258 id: 'txtRows',
259 'default': 3,
260 label: editor.lang.table.rows,
261 required: true,
262 controlStyle: 'width:5em',
263 validate: validatorNum( editor.lang.table.invalidRows ),
264 setup: function( selectedElement ) {
265 this.setValue( selectedElement.$.rows.length );
266 },
267 commit: commitValue
268 },
269 {
270 type: 'text',
271 id: 'txtCols',
272 'default': 2,
273 label: editor.lang.table.columns,
274 required: true,
275 controlStyle: 'width:5em',
276 validate: validatorNum( editor.lang.table.invalidCols ),
277 setup: function( selectedTable ) {
278 this.setValue( tableColumns( selectedTable ) );
279 },
280 commit: commitValue
281 },
282 {
283 type: 'html',
284 html: '&nbsp;'
285 },
286 {
287 type: 'select',
288 id: 'selHeaders',
289 requiredContent: 'th',
290 'default': '',
291 label: editor.lang.table.headers,
292 items: [
293 [ editor.lang.table.headersNone, '' ],
294 [ editor.lang.table.headersRow, 'row' ],
295 [ editor.lang.table.headersColumn, 'col' ],
296 [ editor.lang.table.headersBoth, 'both' ]
297 ],
298 setup: function( selectedTable ) {
299 // Fill in the headers field.
300 var dialog = this.getDialog();
301 dialog.hasColumnHeaders = true;
302
303 // Check if all the first cells in every row are TH
304 for ( var row = 0; row < selectedTable.$.rows.length; row++ ) {
305 // If just one cell isn't a TH then it isn't a header column
306 var headCell = selectedTable.$.rows[ row ].cells[ 0 ];
307 if ( headCell && headCell.nodeName.toLowerCase() != 'th' ) {
308 dialog.hasColumnHeaders = false;
309 break;
310 }
311 }
312
313 // Check if the table contains <thead>.
314 if ( ( selectedTable.$.tHead !== null ) )
315 this.setValue( dialog.hasColumnHeaders ? 'both' : 'row' );
316 else
317 this.setValue( dialog.hasColumnHeaders ? 'col' : '' );
318 },
319 commit: commitValue
320 },
321 {
322 type: 'text',
323 id: 'txtBorder',
324 requiredContent: 'table[border]',
325 // Avoid setting border which will then disappear.
326 'default': editor.filter.check( 'table[border]' ) ? 1 : 0,
327 label: editor.lang.table.border,
328 controlStyle: 'width:3em',
329 validate: CKEDITOR.dialog.validate.number( editor.lang.table.invalidBorder ),
330 setup: function( selectedTable ) {
331 this.setValue( selectedTable.getAttribute( 'border' ) || '' );
332 },
333 commit: function( data, selectedTable ) {
334 if ( this.getValue() )
335 selectedTable.setAttribute( 'border', this.getValue() );
336 else
337 selectedTable.removeAttribute( 'border' );
338 }
339 },
340 {
341 id: 'cmbAlign',
342 type: 'select',
343 requiredContent: 'table[align]',
344 'default': '',
345 label: editor.lang.common.align,
346 items: [
347 [ editor.lang.common.notSet, '' ],
348 [ editor.lang.common.alignLeft, 'left' ],
349 [ editor.lang.common.alignCenter, 'center' ],
350 [ editor.lang.common.alignRight, 'right' ]
351 ],
352 setup: function( selectedTable ) {
353 this.setValue( selectedTable.getAttribute( 'align' ) || '' );
354 },
355 commit: function( data, selectedTable ) {
356 if ( this.getValue() )
357 selectedTable.setAttribute( 'align', this.getValue() );
358 else
359 selectedTable.removeAttribute( 'align' );
360 }
361 } ]
362 },
363 {
364 type: 'vbox',
365 padding: 0,
366 children: [ {
367 type: 'hbox',
368 widths: [ '5em' ],
369 children: [ {
370 type: 'text',
371 id: 'txtWidth',
372 requiredContent: 'table{width}',
373 controlStyle: 'width:5em',
374 label: editor.lang.common.width,
375 title: editor.lang.common.cssLengthTooltip,
376 // Smarter default table width. (#9600)
377 'default': editor.filter.check( 'table{width}' ) ? ( editable.getSize( 'width' ) < 500 ? '100%' : 500 ) : 0,
378 getValue: defaultToPixel,
379 validate: CKEDITOR.dialog.validate.cssLength( editor.lang.common.invalidCssLength.replace( '%1', editor.lang.common.width ) ),
380 onChange: function() {
381 var styles = this.getDialog().getContentElement( 'advanced', 'advStyles' );
382 styles && styles.updateStyle( 'width', this.getValue() );
383 },
384 setup: function( selectedTable ) {
385 var val = selectedTable.getStyle( 'width' );
386 this.setValue( val );
387 },
388 commit: commitValue
389 } ]
390 },
391 {
392 type: 'hbox',
393 widths: [ '5em' ],
394 children: [ {
395 type: 'text',
396 id: 'txtHeight',
397 requiredContent: 'table{height}',
398 controlStyle: 'width:5em',
399 label: editor.lang.common.height,
400 title: editor.lang.common.cssLengthTooltip,
401 'default': '',
402 getValue: defaultToPixel,
403 validate: CKEDITOR.dialog.validate.cssLength( editor.lang.common.invalidCssLength.replace( '%1', editor.lang.common.height ) ),
404 onChange: function() {
405 var styles = this.getDialog().getContentElement( 'advanced', 'advStyles' );
406 styles && styles.updateStyle( 'height', this.getValue() );
407 },
408
409 setup: function( selectedTable ) {
410 var val = selectedTable.getStyle( 'height' );
411 val && this.setValue( val );
412 },
413 commit: commitValue
414 } ]
415 },
416 {
417 type: 'html',
418 html: '&nbsp;'
419 },
420 {
421 type: 'text',
422 id: 'txtCellSpace',
423 requiredContent: 'table[cellspacing]',
424 controlStyle: 'width:3em',
425 label: editor.lang.table.cellSpace,
426 'default': editor.filter.check( 'table[cellspacing]' ) ? 1 : 0,
427 validate: CKEDITOR.dialog.validate.number( editor.lang.table.invalidCellSpacing ),
428 setup: function( selectedTable ) {
429 this.setValue( selectedTable.getAttribute( 'cellSpacing' ) || '' );
430 },
431 commit: function( data, selectedTable ) {
432 if ( this.getValue() )
433 selectedTable.setAttribute( 'cellSpacing', this.getValue() );
434 else
435 selectedTable.removeAttribute( 'cellSpacing' );
436 }
437 },
438 {
439 type: 'text',
440 id: 'txtCellPad',
441 requiredContent: 'table[cellpadding]',
442 controlStyle: 'width:3em',
443 label: editor.lang.table.cellPad,
444 'default': editor.filter.check( 'table[cellpadding]' ) ? 1 : 0,
445 validate: CKEDITOR.dialog.validate.number( editor.lang.table.invalidCellPadding ),
446 setup: function( selectedTable ) {
447 this.setValue( selectedTable.getAttribute( 'cellPadding' ) || '' );
448 },
449 commit: function( data, selectedTable ) {
450 if ( this.getValue() )
451 selectedTable.setAttribute( 'cellPadding', this.getValue() );
452 else
453 selectedTable.removeAttribute( 'cellPadding' );
454 }
455 } ]
456 } ]
457 },
458 {
459 type: 'html',
460 align: 'right',
461 html: ''
462 },
463 {
464 type: 'vbox',
465 padding: 0,
466 children: [ {
467 type: 'text',
468 id: 'txtCaption',
469 requiredContent: 'caption',
470 label: editor.lang.table.caption,
471 setup: function( selectedTable ) {
472 this.enable();
473
474 var nodeList = selectedTable.getElementsByTag( 'caption' );
475 if ( nodeList.count() > 0 ) {
476 var caption = nodeList.getItem( 0 );
477 var firstElementChild = caption.getFirst( CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT ) );
478
479 if ( firstElementChild && !firstElementChild.equals( caption.getBogus() ) ) {
480 this.disable();
481 this.setValue( caption.getText() );
482 return;
483 }
484
485 caption = CKEDITOR.tools.trim( caption.getText() );
486 this.setValue( caption );
487 }
488 },
489 commit: function( data, table ) {
490 if ( !this.isEnabled() )
491 return;
492
493 var caption = this.getValue(),
494 captionElement = table.getElementsByTag( 'caption' );
495 if ( caption ) {
496 if ( captionElement.count() > 0 ) {
497 captionElement = captionElement.getItem( 0 );
498 captionElement.setHtml( '' );
499 } else {
500 captionElement = new CKEDITOR.dom.element( 'caption', editor.document );
501 if ( table.getChildCount() )
502 captionElement.insertBefore( table.getFirst() );
503 else
504 captionElement.appendTo( table );
505 }
506 captionElement.append( new CKEDITOR.dom.text( caption, editor.document ) );
507 } else if ( captionElement.count() > 0 ) {
508 for ( var i = captionElement.count() - 1; i >= 0; i-- )
509 captionElement.getItem( i ).remove();
510 }
511 }
512 },
513 {
514 type: 'text',
515 id: 'txtSummary',
516 bidi: true,
517 requiredContent: 'table[summary]',
518 label: editor.lang.table.summary,
519 setup: function( selectedTable ) {
520 this.setValue( selectedTable.getAttribute( 'summary' ) || '' );
521 },
522 commit: function( data, selectedTable ) {
523 if ( this.getValue() )
524 selectedTable.setAttribute( 'summary', this.getValue() );
525 else
526 selectedTable.removeAttribute( 'summary' );
527 }
528 } ]
529 } ]
530 },
531 dialogadvtab && dialogadvtab.createAdvancedTab( editor, null, 'table' )
532 ] };
533 }
534
535 CKEDITOR.dialog.add( 'table', function( editor ) {
536 return tableDialog( editor, 'table' );
537 } );
538 CKEDITOR.dialog.add( 'tableProperties', function( editor ) {
539 return tableDialog( editor, 'tableProperties' );
540 } );
541} )();
diff --git a/sources/plugins/table/icons/hidpi/table.png b/sources/plugins/table/icons/hidpi/table.png
new file mode 100644
index 00000000..992b9c89
--- /dev/null
+++ b/sources/plugins/table/icons/hidpi/table.png
Binary files differ
diff --git a/sources/plugins/table/icons/table.png b/sources/plugins/table/icons/table.png
new file mode 100644
index 00000000..03817163
--- /dev/null
+++ b/sources/plugins/table/icons/table.png
Binary files differ
diff --git a/sources/plugins/table/lang/af.js b/sources/plugins/table/lang/af.js
new file mode 100644
index 00000000..382ea7e3
--- /dev/null
+++ b/sources/plugins/table/lang/af.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'af', {
6 border: 'Randbreedte',
7 caption: 'Naam',
8 cell: {
9 menu: 'Sel',
10 insertBefore: 'Voeg sel in voor',
11 insertAfter: 'Voeg sel in na',
12 deleteCell: 'Verwyder sel',
13 merge: 'Voeg selle saam',
14 mergeRight: 'Voeg saam na regs',
15 mergeDown: 'Voeg saam ondertoe',
16 splitHorizontal: 'Splits sel horisontaal',
17 splitVertical: 'Splits sel vertikaal',
18 title: 'Sel eienskappe',
19 cellType: 'Sel tipe',
20 rowSpan: 'Omspan rye',
21 colSpan: 'Omspan kolomme',
22 wordWrap: 'Woord terugloop',
23 hAlign: 'Horisontale oplyning',
24 vAlign: 'Vertikale oplyning',
25 alignBaseline: 'Basislyn',
26 bgColor: 'Agtergrondkleur',
27 borderColor: 'Randkleur',
28 data: 'Inhoud',
29 header: 'Opskrif',
30 yes: 'Ja',
31 no: 'Nee',
32 invalidWidth: 'Selbreedte moet \'n getal wees.',
33 invalidHeight: 'Selhoogte moet \'n getal wees.',
34 invalidRowSpan: 'Omspan rye moet \'n heelgetal wees.',
35 invalidColSpan: 'Omspan kolomme moet \'n heelgetal wees.',
36 chooseColor: 'Kies'
37 },
38 cellPad: 'Sel-spasie',
39 cellSpace: 'Sel-afstand',
40 column: {
41 menu: 'Kolom',
42 insertBefore: 'Voeg kolom in voor',
43 insertAfter: 'Voeg kolom in na',
44 deleteColumn: 'Verwyder kolom'
45 },
46 columns: 'Kolomme',
47 deleteTable: 'Verwyder tabel',
48 headers: 'Opskrifte',
49 headersBoth: 'Beide ',
50 headersColumn: 'Eerste kolom',
51 headersNone: 'Geen',
52 headersRow: 'Eerste ry',
53 invalidBorder: 'Randbreedte moet \'n getal wees.',
54 invalidCellPadding: 'Sel-spasie moet \'n getal wees.',
55 invalidCellSpacing: 'Sel-afstand moet \'n getal wees.',
56 invalidCols: 'Aantal kolomme moet \'n getal groter as 0 wees.',
57 invalidHeight: 'Tabelhoogte moet \'n getal wees.',
58 invalidRows: 'Aantal rye moet \'n getal groter as 0 wees.',
59 invalidWidth: 'Tabelbreedte moet \'n getal wees.',
60 menu: 'Tabel eienskappe',
61 row: {
62 menu: 'Ry',
63 insertBefore: 'Voeg ry in voor',
64 insertAfter: 'Voeg ry in na',
65 deleteRow: 'Verwyder ry'
66 },
67 rows: 'Rye',
68 summary: 'Opsomming',
69 title: 'Tabel eienskappe',
70 toolbar: 'Tabel',
71 widthPc: 'persent',
72 widthPx: 'piksels',
73 widthUnit: 'breedte-eenheid'
74} );
diff --git a/sources/plugins/table/lang/ar.js b/sources/plugins/table/lang/ar.js
new file mode 100644
index 00000000..e9d523a5
--- /dev/null
+++ b/sources/plugins/table/lang/ar.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ar', {
6 border: 'الحدود',
7 caption: 'الوصف',
8 cell: {
9 menu: 'خلية',
10 insertBefore: 'إدراج خلية قبل',
11 insertAfter: 'إدراج خلية بعد',
12 deleteCell: 'حذف خلية',
13 merge: 'دمج خلايا',
14 mergeRight: 'دمج لليمين',
15 mergeDown: 'دمج للأسفل',
16 splitHorizontal: 'تقسيم الخلية أفقياً',
17 splitVertical: 'تقسيم الخلية عمودياً',
18 title: 'خصائص الخلية',
19 cellType: 'نوع الخلية',
20 rowSpan: 'امتداد الصفوف',
21 colSpan: 'امتداد الأعمدة',
22 wordWrap: 'التفاف النص',
23 hAlign: 'محاذاة أفقية',
24 vAlign: 'محاذاة رأسية',
25 alignBaseline: 'خط القاعدة',
26 bgColor: 'لون الخلفية',
27 borderColor: 'لون الحدود',
28 data: 'بيانات',
29 header: 'عنوان',
30 yes: 'نعم',
31 no: 'لا',
32 invalidWidth: 'عرض الخلية يجب أن يكون عدداً.',
33 invalidHeight: 'ارتفاع الخلية يجب أن يكون عدداً.',
34 invalidRowSpan: 'امتداد الصفوف يجب أن يكون عدداً صحيحاً.',
35 invalidColSpan: 'امتداد الأعمدة يجب أن يكون عدداً صحيحاً.',
36 chooseColor: 'اختر'
37 },
38 cellPad: 'المسافة البادئة',
39 cellSpace: 'تباعد الخلايا',
40 column: {
41 menu: 'عمود',
42 insertBefore: 'إدراج عمود قبل',
43 insertAfter: 'إدراج عمود بعد',
44 deleteColumn: 'حذف أعمدة'
45 },
46 columns: 'أعمدة',
47 deleteTable: 'حذف الجدول',
48 headers: 'العناوين',
49 headersBoth: 'كلاهما',
50 headersColumn: 'العمود الأول',
51 headersNone: 'بدون',
52 headersRow: 'الصف الأول',
53 invalidBorder: 'حجم الحد يجب أن يكون عدداً.',
54 invalidCellPadding: 'المسافة البادئة يجب أن تكون عدداً',
55 invalidCellSpacing: 'المسافة بين الخلايا يجب أن تكون عدداً.',
56 invalidCols: 'عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.',
57 invalidHeight: 'ارتفاع الجدول يجب أن يكون عدداً.',
58 invalidRows: 'عدد الصفوف يجب أن يكون عدداً أكبر من صفر.',
59 invalidWidth: 'عرض الجدول يجب أن يكون عدداً.',
60 menu: 'خصائص الجدول',
61 row: {
62 menu: 'صف',
63 insertBefore: 'إدراج صف قبل',
64 insertAfter: 'إدراج صف بعد',
65 deleteRow: 'حذف صفوف'
66 },
67 rows: 'صفوف',
68 summary: 'الخلاصة',
69 title: 'خصائص الجدول',
70 toolbar: 'جدول',
71 widthPc: 'بالمئة',
72 widthPx: 'بكسل',
73 widthUnit: 'وحدة العرض'
74} );
diff --git a/sources/plugins/table/lang/bg.js b/sources/plugins/table/lang/bg.js
new file mode 100644
index 00000000..5335e5af
--- /dev/null
+++ b/sources/plugins/table/lang/bg.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'bg', {
6 border: 'Размер на рамката',
7 caption: 'Заглавие',
8 cell: {
9 menu: 'Клетка',
10 insertBefore: 'Вмъкване на клетка преди',
11 insertAfter: 'Вмъкване на клетка след',
12 deleteCell: 'Изтриване на клетки',
13 merge: 'Сливане на клетки',
14 mergeRight: 'Сливане в дясно',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Настройки на клетката',
19 cellType: 'Тип на клетката',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Авто. пренос',
23 hAlign: 'Хоризонтално подравняване',
24 vAlign: 'Вертикално подравняване',
25 alignBaseline: 'Базова линия',
26 bgColor: 'Фон',
27 borderColor: 'Цвят на рамката',
28 data: 'Данни',
29 header: 'Хедър',
30 yes: 'Да',
31 no: 'Не',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Изберете'
37 },
38 cellPad: 'Отделяне на клетките',
39 cellSpace: 'Разтояние между клетките',
40 column: {
41 menu: 'Колона',
42 insertBefore: 'Вмъкване на колона преди',
43 insertAfter: 'Вмъкване на колона след',
44 deleteColumn: 'Изтриване на колони'
45 },
46 columns: 'Колони',
47 deleteTable: 'Изтриване на таблица',
48 headers: 'Хедъри',
49 headersBoth: 'Заедно',
50 headersColumn: 'Първа колона',
51 headersNone: 'Няма',
52 headersRow: 'Първи ред',
53 invalidBorder: 'Размерът на рамката трябва да е число.',
54 invalidCellPadding: 'Отстоянието на клетките трябва да е позитивно число.',
55 invalidCellSpacing: 'Интервала в клетките трябва да е позитивно число.',
56 invalidCols: 'Броят колони трябва да е по-голям от 0.',
57 invalidHeight: 'Височината на таблицата трябва да е число.',
58 invalidRows: 'Броят редове трябва да е по-голям от 0.',
59 invalidWidth: 'Ширината на таблицата трябва да е число.',
60 menu: 'Настройки на таблицата',
61 row: {
62 menu: 'Ред',
63 insertBefore: 'Вмъкване на ред преди',
64 insertAfter: 'Вмъкване на ред след',
65 deleteRow: 'Изтриване на редове'
66 },
67 rows: 'Редове',
68 summary: 'Обща информация',
69 title: 'Настройки на таблицата',
70 toolbar: 'Таблица',
71 widthPc: 'процент',
72 widthPx: 'пиксела',
73 widthUnit: 'единица за ширина'
74} );
diff --git a/sources/plugins/table/lang/bn.js b/sources/plugins/table/lang/bn.js
new file mode 100644
index 00000000..c0846adf
--- /dev/null
+++ b/sources/plugins/table/lang/bn.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'bn', {
6 border: 'বর্ডার সাইজ',
7 caption: 'শীর্ষক',
8 cell: {
9 menu: 'সেল',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'সেল মুছে দাও',
13 merge: 'সেল জোড়া দাও',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'সেল প্যাডিং',
39 cellSpace: 'সেল স্পেস',
40 column: {
41 menu: 'কলাম',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'কলাম মুছে দাও'
45 },
46 columns: 'কলাম',
47 deleteTable: 'টেবিল ডিলীট কর',
48 headers: 'Headers', // MISSING
49 headersBoth: 'Both', // MISSING
50 headersColumn: 'First column', // MISSING
51 headersNone: 'None',
52 headersRow: 'First Row', // MISSING
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'টেবিল প্রোপার্টি',
61 row: {
62 menu: 'রো',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'রো মুছে দাও'
66 },
67 rows: 'রো',
68 summary: 'সারাংশ',
69 title: 'টেবিল প্রোপার্টি',
70 toolbar: 'টেবিলের লেবেল যুক্ত কর',
71 widthPc: 'শতকরা',
72 widthPx: 'পিক্সেল',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/bs.js b/sources/plugins/table/lang/bs.js
new file mode 100644
index 00000000..e81bcc10
--- /dev/null
+++ b/sources/plugins/table/lang/bs.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'bs', {
6 border: 'Okvir',
7 caption: 'Naslov',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Briši æelije',
13 merge: 'Spoji æelije',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Uvod æelija',
39 cellSpace: 'Razmak æelija',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Briši kolone'
45 },
46 columns: 'Kolona',
47 deleteTable: 'Delete Table', // MISSING
48 headers: 'Headers', // MISSING
49 headersBoth: 'Both', // MISSING
50 headersColumn: 'First column', // MISSING
51 headersNone: 'None',
52 headersRow: 'First Row', // MISSING
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'Svojstva tabele',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Briši redove'
66 },
67 rows: 'Redova',
68 summary: 'Summary', // MISSING
69 title: 'Svojstva tabele',
70 toolbar: 'Tabela',
71 widthPc: 'posto',
72 widthPx: 'piksela',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/ca.js b/sources/plugins/table/lang/ca.js
new file mode 100644
index 00000000..0d0f8421
--- /dev/null
+++ b/sources/plugins/table/lang/ca.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ca', {
6 border: 'Mida vora',
7 caption: 'Títol',
8 cell: {
9 menu: 'Cel·la',
10 insertBefore: 'Insereix abans',
11 insertAfter: 'Insereix després',
12 deleteCell: 'Suprimeix',
13 merge: 'Fusiona',
14 mergeRight: 'Fusiona a la dreta',
15 mergeDown: 'Fusiona avall',
16 splitHorizontal: 'Divideix horitzontalment',
17 splitVertical: 'Divideix verticalment',
18 title: 'Propietats de la cel·la',
19 cellType: 'Tipus de cel·la',
20 rowSpan: 'Expansió de files',
21 colSpan: 'Expansió de columnes',
22 wordWrap: 'Ajustar al contingut',
23 hAlign: 'Alineació Horizontal',
24 vAlign: 'Alineació Vertical',
25 alignBaseline: 'A la línia base',
26 bgColor: 'Color de fons',
27 borderColor: 'Color de la vora',
28 data: 'Dades',
29 header: 'Capçalera',
30 yes: 'Sí',
31 no: 'No',
32 invalidWidth: 'L\'amplada de cel·la ha de ser un nombre.',
33 invalidHeight: 'L\'alçada de cel·la ha de ser un nombre.',
34 invalidRowSpan: 'L\'expansió de files ha de ser un nombre enter.',
35 invalidColSpan: 'L\'expansió de columnes ha de ser un nombre enter.',
36 chooseColor: 'Trieu'
37 },
38 cellPad: 'Encoixinament de cel·les',
39 cellSpace: 'Espaiat de cel·les',
40 column: {
41 menu: 'Columna',
42 insertBefore: 'Insereix columna abans de',
43 insertAfter: 'Insereix columna darrera',
44 deleteColumn: 'Suprimeix una columna'
45 },
46 columns: 'Columnes',
47 deleteTable: 'Suprimeix la taula',
48 headers: 'Capçaleres',
49 headersBoth: 'Ambdues',
50 headersColumn: 'Primera columna',
51 headersNone: 'Cap',
52 headersRow: 'Primera fila',
53 invalidBorder: 'El gruix de la vora ha de ser un nombre.',
54 invalidCellPadding: 'L\'encoixinament de cel·la ha de ser un nombre.',
55 invalidCellSpacing: 'L\'espaiat de cel·la ha de ser un nombre.',
56 invalidCols: 'El nombre de columnes ha de ser un nombre major que 0.',
57 invalidHeight: 'L\'alçada de la taula ha de ser un nombre.',
58 invalidRows: 'El nombre de files ha de ser un nombre major que 0.',
59 invalidWidth: 'L\'amplada de la taula ha de ser un nombre.',
60 menu: 'Propietats de la taula',
61 row: {
62 menu: 'Fila',
63 insertBefore: 'Insereix fila abans de',
64 insertAfter: 'Insereix fila darrera',
65 deleteRow: 'Suprimeix una fila'
66 },
67 rows: 'Files',
68 summary: 'Resum',
69 title: 'Propietats de la taula',
70 toolbar: 'Taula',
71 widthPc: 'percentatge',
72 widthPx: 'píxels',
73 widthUnit: 'unitat d\'amplada'
74} );
diff --git a/sources/plugins/table/lang/cs.js b/sources/plugins/table/lang/cs.js
new file mode 100644
index 00000000..00428d3f
--- /dev/null
+++ b/sources/plugins/table/lang/cs.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'cs', {
6 border: 'Ohraničení',
7 caption: 'Popis',
8 cell: {
9 menu: 'Buňka',
10 insertBefore: 'Vložit buňku před',
11 insertAfter: 'Vložit buňku za',
12 deleteCell: 'Smazat buňky',
13 merge: 'Sloučit buňky',
14 mergeRight: 'Sloučit doprava',
15 mergeDown: 'Sloučit dolů',
16 splitHorizontal: 'Rozdělit buňky vodorovně',
17 splitVertical: 'Rozdělit buňky svisle',
18 title: 'Vlastnosti buňky',
19 cellType: 'Typ buňky',
20 rowSpan: 'Spojit řádky',
21 colSpan: 'Spojit sloupce',
22 wordWrap: 'Zalamování',
23 hAlign: 'Vodorovné zarovnání',
24 vAlign: 'Svislé zarovnání',
25 alignBaseline: 'Na účaří',
26 bgColor: 'Barva pozadí',
27 borderColor: 'Barva okraje',
28 data: 'Data',
29 header: 'Hlavička',
30 yes: 'Ano',
31 no: 'Ne',
32 invalidWidth: 'Šířka buňky musí být číslo.',
33 invalidHeight: 'Zadaná výška buňky musí být číslená.',
34 invalidRowSpan: 'Zadaný počet sloučených řádků musí být celé číslo.',
35 invalidColSpan: 'Zadaný počet sloučených sloupců musí být celé číslo.',
36 chooseColor: 'Výběr'
37 },
38 cellPad: 'Odsazení obsahu v buňce',
39 cellSpace: 'Vzdálenost buněk',
40 column: {
41 menu: 'Sloupec',
42 insertBefore: 'Vložit sloupec před',
43 insertAfter: 'Vložit sloupec za',
44 deleteColumn: 'Smazat sloupec'
45 },
46 columns: 'Sloupce',
47 deleteTable: 'Smazat tabulku',
48 headers: 'Záhlaví',
49 headersBoth: 'Obojí',
50 headersColumn: 'První sloupec',
51 headersNone: 'Žádné',
52 headersRow: 'První řádek',
53 invalidBorder: 'Zdaná velikost okraje musí být číselná.',
54 invalidCellPadding: 'Zadané odsazení obsahu v buňce musí být číselné.',
55 invalidCellSpacing: 'Zadaná vzdálenost buněk musí být číselná.',
56 invalidCols: 'Počet sloupců musí být číslo větší než 0.',
57 invalidHeight: 'Zadaná výška tabulky musí být číselná.',
58 invalidRows: 'Počet řádků musí být číslo větší než 0.',
59 invalidWidth: 'Šířka tabulky musí být číslo.',
60 menu: 'Vlastnosti tabulky',
61 row: {
62 menu: 'Řádek',
63 insertBefore: 'Vložit řádek před',
64 insertAfter: 'Vložit řádek za',
65 deleteRow: 'Smazat řádky'
66 },
67 rows: 'Řádky',
68 summary: 'Souhrn',
69 title: 'Vlastnosti tabulky',
70 toolbar: 'Tabulka',
71 widthPc: 'procent',
72 widthPx: 'bodů',
73 widthUnit: 'jednotka šířky'
74} );
diff --git a/sources/plugins/table/lang/cy.js b/sources/plugins/table/lang/cy.js
new file mode 100644
index 00000000..75f210eb
--- /dev/null
+++ b/sources/plugins/table/lang/cy.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'cy', {
6 border: 'Maint yr Ymyl',
7 caption: 'Pennawd',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Mewnosod Cell Cyn',
11 insertAfter: 'Mewnosod Cell Ar Ôl',
12 deleteCell: 'Dileu Celloedd',
13 merge: 'Cyfuno Celloedd',
14 mergeRight: 'Cyfuno i\'r Dde',
15 mergeDown: 'Cyfuno i Lawr',
16 splitHorizontal: 'Hollti\'r Gell yn Lorweddol',
17 splitVertical: 'Hollti\'r Gell yn Fertigol',
18 title: 'Priodweddau\'r Gell',
19 cellType: 'Math y Gell',
20 rowSpan: 'Rhychwant Rhesi',
21 colSpan: 'Rhychwant Colofnau',
22 wordWrap: 'Lapio Geiriau',
23 hAlign: 'Aliniad Llorweddol',
24 vAlign: 'Aliniad Fertigol',
25 alignBaseline: 'Baslinell',
26 bgColor: 'Lliw Cefndir',
27 borderColor: 'Lliw Ymyl',
28 data: 'Data',
29 header: 'Pennyn',
30 yes: 'Ie',
31 no: 'Na',
32 invalidWidth: 'Mae\'n rhaid i led y gell fod yn rhif.',
33 invalidHeight: 'Mae\'n rhaid i uchder y gell fod yn rhif.',
34 invalidRowSpan: 'Mae\'n rhaid i rychwant y rhesi fod yn gyfanrif.',
35 invalidColSpan: 'Mae\'n rhaid i rychwant y colofnau fod yn gyfanrif.',
36 chooseColor: 'Dewis'
37 },
38 cellPad: 'Padio\'r gell',
39 cellSpace: 'Bylchiad y gell',
40 column: {
41 menu: 'Colofn',
42 insertBefore: 'Mewnosod Colofn Cyn',
43 insertAfter: 'Mewnosod Colofn Ar Ôl',
44 deleteColumn: 'Dileu Colofnau'
45 },
46 columns: 'Colofnau',
47 deleteTable: 'Dileu Tabl',
48 headers: 'Penynnau',
49 headersBoth: 'Y Ddau',
50 headersColumn: 'Colofn gyntaf',
51 headersNone: 'Dim',
52 headersRow: 'Rhes gyntaf',
53 invalidBorder: 'Mae\'n rhaid i faint yr ymyl fod yn rhif.',
54 invalidCellPadding: 'Mae\'n rhaid i badiad y gell fod yn rhif positif.',
55 invalidCellSpacing: 'Mae\'n rhaid i fylchiad y gell fod yn rhif positif.',
56 invalidCols: 'Mae\'n rhaid cael o leiaf un golofn.',
57 invalidHeight: 'Mae\'n rhaid i uchder y tabl fod yn rhif.',
58 invalidRows: 'Mae\'n rhaid cael o leiaf un rhes.',
59 invalidWidth: 'Mae\'n rhaid i led y tabl fod yn rhif.',
60 menu: 'Priodweddau\'r Tabl',
61 row: {
62 menu: 'Rhes',
63 insertBefore: 'Mewnosod Rhes Cyn',
64 insertAfter: 'Mewnosod Rhes Ar Ôl',
65 deleteRow: 'Dileu Rhesi'
66 },
67 rows: 'Rhesi',
68 summary: 'Crynodeb',
69 title: 'Priodweddau\'r Tabl',
70 toolbar: 'Tabl',
71 widthPc: 'y cant',
72 widthPx: 'picsel',
73 widthUnit: 'uned lled'
74} );
diff --git a/sources/plugins/table/lang/da.js b/sources/plugins/table/lang/da.js
new file mode 100644
index 00000000..601c2cff
--- /dev/null
+++ b/sources/plugins/table/lang/da.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'da', {
6 border: 'Rammebredde',
7 caption: 'Titel',
8 cell: {
9 menu: 'Celle',
10 insertBefore: 'Indsæt celle før',
11 insertAfter: 'Indsæt celle efter',
12 deleteCell: 'Slet celle',
13 merge: 'Flet celler',
14 mergeRight: 'Flet til højre',
15 mergeDown: 'Flet nedad',
16 splitHorizontal: 'Del celle vandret',
17 splitVertical: 'Del celle lodret',
18 title: 'Celleegenskaber',
19 cellType: 'Celletype',
20 rowSpan: 'Række span (rows span)',
21 colSpan: 'Kolonne span (columns span)',
22 wordWrap: 'Tekstombrydning',
23 hAlign: 'Vandret justering',
24 vAlign: 'Lodret justering',
25 alignBaseline: 'Grundlinje',
26 bgColor: 'Baggrundsfarve',
27 borderColor: 'Rammefarve',
28 data: 'Data',
29 header: 'Hoved',
30 yes: 'Ja',
31 no: 'Nej',
32 invalidWidth: 'Cellebredde skal være et tal.',
33 invalidHeight: 'Cellehøjde skal være et tal.',
34 invalidRowSpan: 'Række span skal være et heltal.',
35 invalidColSpan: 'Kolonne span skal være et heltal.',
36 chooseColor: 'Vælg'
37 },
38 cellPad: 'Cellemargen',
39 cellSpace: 'Celleafstand',
40 column: {
41 menu: 'Kolonne',
42 insertBefore: 'Indsæt kolonne før',
43 insertAfter: 'Indsæt kolonne efter',
44 deleteColumn: 'Slet kolonne'
45 },
46 columns: 'Kolonner',
47 deleteTable: 'Slet tabel',
48 headers: 'Hoved',
49 headersBoth: 'Begge',
50 headersColumn: 'Første kolonne',
51 headersNone: 'Ingen',
52 headersRow: 'Første række',
53 invalidBorder: 'Rammetykkelse skal være et tal.',
54 invalidCellPadding: 'Cellemargen skal være et tal.',
55 invalidCellSpacing: 'Celleafstand skal være et tal.',
56 invalidCols: 'Antallet af kolonner skal være større end 0.',
57 invalidHeight: 'Tabelhøjde skal være et tal.',
58 invalidRows: 'Antallet af rækker skal være større end 0.',
59 invalidWidth: 'Tabelbredde skal være et tal.',
60 menu: 'Egenskaber for tabel',
61 row: {
62 menu: 'Række',
63 insertBefore: 'Indsæt række før',
64 insertAfter: 'Indsæt række efter',
65 deleteRow: 'Slet række'
66 },
67 rows: 'Rækker',
68 summary: 'Resumé',
69 title: 'Egenskaber for tabel',
70 toolbar: 'Tabel',
71 widthPc: 'procent',
72 widthPx: 'pixels',
73 widthUnit: 'Bredde på enhed'
74} );
diff --git a/sources/plugins/table/lang/de.js b/sources/plugins/table/lang/de.js
new file mode 100644
index 00000000..42be01b2
--- /dev/null
+++ b/sources/plugins/table/lang/de.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'de', {
6 border: 'Rahmengröße',
7 caption: 'Überschrift',
8 cell: {
9 menu: 'Zelle',
10 insertBefore: 'Zelle davor einfügen',
11 insertAfter: 'Zelle danach einfügen',
12 deleteCell: 'Zelle löschen',
13 merge: 'Zellen verbinden',
14 mergeRight: 'Nach rechts verbinden',
15 mergeDown: 'Nach unten verbinden',
16 splitHorizontal: 'Zelle horizontal teilen',
17 splitVertical: 'Zelle vertikal teilen',
18 title: 'Zelleneigenschaften',
19 cellType: 'Zellart',
20 rowSpan: 'Anzahl Zeilen verbinden',
21 colSpan: 'Anzahl Spalten verbinden',
22 wordWrap: 'Zeilenumbruch',
23 hAlign: 'Horizontale Ausrichtung',
24 vAlign: 'Vertikale Ausrichtung',
25 alignBaseline: 'Grundlinie',
26 bgColor: 'Hintergrundfarbe',
27 borderColor: 'Rahmenfarbe',
28 data: 'Daten',
29 header: 'Überschrift',
30 yes: 'Ja',
31 no: 'Nein',
32 invalidWidth: 'Zellenbreite muss eine Zahl sein.',
33 invalidHeight: 'Zellenhöhe muss eine Zahl sein.',
34 invalidRowSpan: '"Anzahl Zeilen verbinden" muss eine Ganzzahl sein.',
35 invalidColSpan: '"Anzahl Spalten verbinden" muss eine Ganzzahl sein.',
36 chooseColor: 'Wählen'
37 },
38 cellPad: 'Zellenabstand innen',
39 cellSpace: 'Zellenabstand außen',
40 column: {
41 menu: 'Spalte',
42 insertBefore: 'Spalte links davor einfügen',
43 insertAfter: 'Spalte rechts danach einfügen',
44 deleteColumn: 'Spalte löschen'
45 },
46 columns: 'Spalte',
47 deleteTable: 'Tabelle löschen',
48 headers: 'Kopfzeile',
49 headersBoth: 'Beide',
50 headersColumn: 'Erste Spalte',
51 headersNone: 'Keine',
52 headersRow: 'Erste Zeile',
53 invalidBorder: 'Die Rahmenbreite muß eine Zahl sein.',
54 invalidCellPadding: 'Der Zellenabstand innen muß eine positive Zahl sein.',
55 invalidCellSpacing: 'Der Zellenabstand außen muß eine positive Zahl sein.',
56 invalidCols: 'Die Anzahl der Spalten muß größer als 0 sein..',
57 invalidHeight: 'Die Tabellenbreite muß eine Zahl sein.',
58 invalidRows: 'Die Anzahl der Zeilen muß größer als 0 sein.',
59 invalidWidth: 'Die Tabellenbreite muss eine Zahl sein.',
60 menu: 'Tabellen-Eigenschaften',
61 row: {
62 menu: 'Zeile',
63 insertBefore: 'Zeile oberhalb einfügen',
64 insertAfter: 'Zeile unterhalb einfügen',
65 deleteRow: 'Zeile entfernen'
66 },
67 rows: 'Zeile',
68 summary: 'Inhaltsübersicht',
69 title: 'Tabellen-Eigenschaften',
70 toolbar: 'Tabelle',
71 widthPc: '%',
72 widthPx: 'Pixel',
73 widthUnit: 'Breite Einheit'
74} );
diff --git a/sources/plugins/table/lang/el.js b/sources/plugins/table/lang/el.js
new file mode 100644
index 00000000..6ac4747f
--- /dev/null
+++ b/sources/plugins/table/lang/el.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'el', {
6 border: 'Πάχος Περιγράμματος',
7 caption: 'Λεζάντα',
8 cell: {
9 menu: 'Κελί',
10 insertBefore: 'Εισαγωγή Κελιού Πριν',
11 insertAfter: 'Εισαγωγή Κελιού Μετά',
12 deleteCell: 'Διαγραφή Κελιών',
13 merge: 'Ενοποίηση Κελιών',
14 mergeRight: 'Συγχώνευση Με Δεξιά',
15 mergeDown: 'Συγχώνευση Με Κάτω',
16 splitHorizontal: 'Οριζόντια Διαίρεση Κελιού',
17 splitVertical: 'Κατακόρυφη Διαίρεση Κελιού',
18 title: 'Ιδιότητες Κελιού',
19 cellType: 'Τύπος Κελιού',
20 rowSpan: 'Εύρος Γραμμών',
21 colSpan: 'Εύρος Στηλών',
22 wordWrap: 'Αναδίπλωση Λέξεων',
23 hAlign: 'Οριζόντια Στοίχιση',
24 vAlign: 'Κάθετη Στοίχιση',
25 alignBaseline: 'Γραμμή Βάσης',
26 bgColor: 'Χρώμα Φόντου',
27 borderColor: 'Χρώμα Περιγράμματος',
28 data: 'Δεδομένα',
29 header: 'Κεφαλίδα',
30 yes: 'Ναι',
31 no: 'Όχι',
32 invalidWidth: 'Το πλάτος του κελιού πρέπει να είναι αριθμός.',
33 invalidHeight: 'Το ύψος του κελιού πρέπει να είναι αριθμός.',
34 invalidRowSpan: 'Το εύρος των γραμμών πρέπει να είναι ακέραιος αριθμός.',
35 invalidColSpan: 'Το εύρος των στηλών πρέπει να είναι ακέραιος αριθμός.',
36 chooseColor: 'Επιλέξτε'
37 },
38 cellPad: 'Αναπλήρωση κελιών',
39 cellSpace: 'Απόσταση κελιών',
40 column: {
41 menu: 'Στήλη',
42 insertBefore: 'Εισαγωγή Στήλης Πριν',
43 insertAfter: 'Εισαγωγή Στήλης Μετά',
44 deleteColumn: 'Διαγραφή Στηλών'
45 },
46 columns: 'Στήλες',
47 deleteTable: 'Διαγραφή Πίνακα',
48 headers: 'Κεφαλίδες',
49 headersBoth: 'Και τα δύο',
50 headersColumn: 'Πρώτη στήλη',
51 headersNone: 'Κανένα',
52 headersRow: 'Πρώτη Γραμμή',
53 invalidBorder: 'Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.',
54 invalidCellPadding: 'Η αναπλήρωση των κελιών πρέπει να είναι θετικός αριθμός.',
55 invalidCellSpacing: 'Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.',
56 invalidCols: 'Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.',
57 invalidHeight: 'Το ύψος του πίνακα πρέπει να είναι αριθμός.',
58 invalidRows: 'Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.',
59 invalidWidth: 'Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.',
60 menu: 'Ιδιότητες Πίνακα',
61 row: {
62 menu: 'Γραμμή',
63 insertBefore: 'Εισαγωγή Γραμμής Πριν',
64 insertAfter: 'Εισαγωγή Γραμμής Μετά',
65 deleteRow: 'Διαγραφή Γραμμών'
66 },
67 rows: 'Γραμμές',
68 summary: 'Περίληψη',
69 title: 'Ιδιότητες Πίνακα',
70 toolbar: 'Πίνακας',
71 widthPc: 'τοις εκατό',
72 widthPx: 'pixel',
73 widthUnit: 'μονάδα πλάτους'
74} );
diff --git a/sources/plugins/table/lang/en-au.js b/sources/plugins/table/lang/en-au.js
new file mode 100644
index 00000000..95a53be8
--- /dev/null
+++ b/sources/plugins/table/lang/en-au.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'en-au', {
6 border: 'Border size',
7 caption: 'Caption',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Delete Cells',
13 merge: 'Merge Cells',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Cell padding',
39 cellSpace: 'Cell spacing',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Delete Columns'
45 },
46 columns: 'Columns',
47 deleteTable: 'Delete Table',
48 headers: 'Headers',
49 headersBoth: 'Both',
50 headersColumn: 'First column',
51 headersNone: 'None',
52 headersRow: 'First Row',
53 invalidBorder: 'Border size must be a number.',
54 invalidCellPadding: 'Cell padding must be a number.',
55 invalidCellSpacing: 'Cell spacing must be a number.',
56 invalidCols: 'Number of columns must be a number greater than 0.',
57 invalidHeight: 'Table height must be a number.',
58 invalidRows: 'Number of rows must be a number greater than 0.',
59 invalidWidth: 'Table width must be a number.',
60 menu: 'Table Properties',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Delete Rows'
66 },
67 rows: 'Rows',
68 summary: 'Summary',
69 title: 'Table Properties',
70 toolbar: 'Table',
71 widthPc: 'percent',
72 widthPx: 'pixels',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/en-ca.js b/sources/plugins/table/lang/en-ca.js
new file mode 100644
index 00000000..32351c30
--- /dev/null
+++ b/sources/plugins/table/lang/en-ca.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'en-ca', {
6 border: 'Border size',
7 caption: 'Caption',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Delete Cells',
13 merge: 'Merge Cells',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Cell padding',
39 cellSpace: 'Cell spacing',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Delete Columns'
45 },
46 columns: 'Columns',
47 deleteTable: 'Delete Table',
48 headers: 'Headers',
49 headersBoth: 'Both',
50 headersColumn: 'First column',
51 headersNone: 'None',
52 headersRow: 'First Row',
53 invalidBorder: 'Border size must be a number.',
54 invalidCellPadding: 'Cell padding must be a number.',
55 invalidCellSpacing: 'Cell spacing must be a number.',
56 invalidCols: 'Number of columns must be a number greater than 0.',
57 invalidHeight: 'Table height must be a number.',
58 invalidRows: 'Number of rows must be a number greater than 0.',
59 invalidWidth: 'Table width must be a number.',
60 menu: 'Table Properties',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Delete Rows'
66 },
67 rows: 'Rows',
68 summary: 'Summary',
69 title: 'Table Properties',
70 toolbar: 'Table',
71 widthPc: 'percent',
72 widthPx: 'pixels',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/en-gb.js b/sources/plugins/table/lang/en-gb.js
new file mode 100644
index 00000000..6165b735
--- /dev/null
+++ b/sources/plugins/table/lang/en-gb.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'en-gb', {
6 border: 'Border size',
7 caption: 'Caption',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Delete Cells',
13 merge: 'Merge Cells',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Cell padding',
39 cellSpace: 'Cell spacing',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Delete Columns'
45 },
46 columns: 'Columns',
47 deleteTable: 'Delete Table',
48 headers: 'Headers',
49 headersBoth: 'Both',
50 headersColumn: 'First column',
51 headersNone: 'None',
52 headersRow: 'First Row',
53 invalidBorder: 'Border size must be a number.',
54 invalidCellPadding: 'Cell padding must be a number.',
55 invalidCellSpacing: 'Cell spacing must be a number.',
56 invalidCols: 'Number of columns must be a number greater than 0.',
57 invalidHeight: 'Table height must be a number.',
58 invalidRows: 'Number of rows must be a number greater than 0.',
59 invalidWidth: 'Table width must be a number.',
60 menu: 'Table Properties',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Delete Rows'
66 },
67 rows: 'Rows',
68 summary: 'Summary',
69 title: 'Table Properties',
70 toolbar: 'Table',
71 widthPc: 'percent',
72 widthPx: 'pixels',
73 widthUnit: 'width unit'
74} );
diff --git a/sources/plugins/table/lang/en.js b/sources/plugins/table/lang/en.js
new file mode 100644
index 00000000..c1ab5735
--- /dev/null
+++ b/sources/plugins/table/lang/en.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'en', {
6 border: 'Border size',
7 caption: 'Caption',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Delete Cells',
13 merge: 'Merge Cells',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Cell padding',
39 cellSpace: 'Cell spacing',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Delete Columns'
45 },
46 columns: 'Columns',
47 deleteTable: 'Delete Table',
48 headers: 'Headers',
49 headersBoth: 'Both',
50 headersColumn: 'First column',
51 headersNone: 'None',
52 headersRow: 'First Row',
53 invalidBorder: 'Border size must be a number.',
54 invalidCellPadding: 'Cell padding must be a positive number.',
55 invalidCellSpacing: 'Cell spacing must be a positive number.',
56 invalidCols: 'Number of columns must be a number greater than 0.',
57 invalidHeight: 'Table height must be a number.',
58 invalidRows: 'Number of rows must be a number greater than 0.',
59 invalidWidth: 'Table width must be a number.',
60 menu: 'Table Properties',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Delete Rows'
66 },
67 rows: 'Rows',
68 summary: 'Summary',
69 title: 'Table Properties',
70 toolbar: 'Table',
71 widthPc: 'percent',
72 widthPx: 'pixels',
73 widthUnit: 'width unit'
74} );
diff --git a/sources/plugins/table/lang/eo.js b/sources/plugins/table/lang/eo.js
new file mode 100644
index 00000000..c090c373
--- /dev/null
+++ b/sources/plugins/table/lang/eo.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'eo', {
6 border: 'Bordero',
7 caption: 'Tabeltitolo',
8 cell: {
9 menu: 'Ĉelo',
10 insertBefore: 'Enmeti Ĉelon Antaŭ',
11 insertAfter: 'Enmeti Ĉelon Post',
12 deleteCell: 'Forigi la Ĉelojn',
13 merge: 'Kunfandi la Ĉelojn',
14 mergeRight: 'Kunfandi dekstren',
15 mergeDown: 'Kunfandi malsupren ',
16 splitHorizontal: 'Horizontale dividi',
17 splitVertical: 'Vertikale dividi',
18 title: 'Ĉelatributoj',
19 cellType: 'Ĉeltipo',
20 rowSpan: 'Kunfando de linioj',
21 colSpan: 'Kunfando de kolumnoj',
22 wordWrap: 'Cezuro',
23 hAlign: 'Horizontala ĝisrandigo',
24 vAlign: 'Vertikala ĝisrandigo',
25 alignBaseline: 'Malsupro de la teksto',
26 bgColor: 'Fonkoloro',
27 borderColor: 'Borderkoloro',
28 data: 'Datenoj',
29 header: 'Supra paĝotitolo',
30 yes: 'Jes',
31 no: 'No',
32 invalidWidth: 'Ĉellarĝo devas esti nombro.',
33 invalidHeight: 'Ĉelalto devas esti nombro.',
34 invalidRowSpan: 'Kunfando de linioj devas esti entjera nombro.',
35 invalidColSpan: 'Kunfando de kolumnoj devas esti entjera nombro.',
36 chooseColor: 'Elektu'
37 },
38 cellPad: 'Interna Marĝeno de la ĉeloj',
39 cellSpace: 'Spaco inter la Ĉeloj',
40 column: {
41 menu: 'Kolumno',
42 insertBefore: 'Enmeti kolumnon antaŭ',
43 insertAfter: 'Enmeti kolumnon post',
44 deleteColumn: 'Forigi Kolumnojn'
45 },
46 columns: 'Kolumnoj',
47 deleteTable: 'Forigi Tabelon',
48 headers: 'Supraj Paĝotitoloj',
49 headersBoth: 'Ambaŭ',
50 headersColumn: 'Unua kolumno',
51 headersNone: 'Neniu',
52 headersRow: 'Unua linio',
53 invalidBorder: 'La bordergrando devas esti nombro.',
54 invalidCellPadding: 'La interna marĝeno en la ĉeloj devas esti pozitiva nombro.',
55 invalidCellSpacing: 'La spaco inter la ĉeloj devas esti pozitiva nombro.',
56 invalidCols: 'La nombro de la kolumnoj devas superi 0.',
57 invalidHeight: 'La tabelalto devas esti nombro.',
58 invalidRows: 'La nombro de la linioj devas superi 0.',
59 invalidWidth: 'La tabellarĝo devas esti nombro.',
60 menu: 'Atributoj de Tabelo',
61 row: {
62 menu: 'Linio',
63 insertBefore: 'Enmeti linion antaŭ',
64 insertAfter: 'Enmeti linion post',
65 deleteRow: 'Forigi Liniojn'
66 },
67 rows: 'Linioj',
68 summary: 'Resumo',
69 title: 'Atributoj de Tabelo',
70 toolbar: 'Tabelo',
71 widthPc: 'elcentoj',
72 widthPx: 'Rastrumeroj',
73 widthUnit: 'unuo de larĝo'
74} );
diff --git a/sources/plugins/table/lang/es.js b/sources/plugins/table/lang/es.js
new file mode 100644
index 00000000..fa948a11
--- /dev/null
+++ b/sources/plugins/table/lang/es.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'es', {
6 border: 'Tamaño de Borde',
7 caption: 'Título',
8 cell: {
9 menu: 'Celda',
10 insertBefore: 'Insertar celda a la izquierda',
11 insertAfter: 'Insertar celda a la derecha',
12 deleteCell: 'Eliminar Celdas',
13 merge: 'Combinar Celdas',
14 mergeRight: 'Combinar a la derecha',
15 mergeDown: 'Combinar hacia abajo',
16 splitHorizontal: 'Dividir la celda horizontalmente',
17 splitVertical: 'Dividir la celda verticalmente',
18 title: 'Propiedades de celda',
19 cellType: 'Tipo de Celda',
20 rowSpan: 'Expandir filas',
21 colSpan: 'Expandir columnas',
22 wordWrap: 'Ajustar al contenido',
23 hAlign: 'Alineación Horizontal',
24 vAlign: 'Alineación Vertical',
25 alignBaseline: 'Linea de base',
26 bgColor: 'Color de fondo',
27 borderColor: 'Color de borde',
28 data: 'Datos',
29 header: 'Encabezado',
30 yes: 'Sí',
31 no: 'No',
32 invalidWidth: 'La anchura de celda debe ser un número.',
33 invalidHeight: 'La altura de celda debe ser un número.',
34 invalidRowSpan: 'La expansión de filas debe ser un número entero.',
35 invalidColSpan: 'La expansión de columnas debe ser un número entero.',
36 chooseColor: 'Elegir'
37 },
38 cellPad: 'Esp. interior',
39 cellSpace: 'Esp. e/celdas',
40 column: {
41 menu: 'Columna',
42 insertBefore: 'Insertar columna a la izquierda',
43 insertAfter: 'Insertar columna a la derecha',
44 deleteColumn: 'Eliminar Columnas'
45 },
46 columns: 'Columnas',
47 deleteTable: 'Eliminar Tabla',
48 headers: 'Encabezados',
49 headersBoth: 'Ambas',
50 headersColumn: 'Primera columna',
51 headersNone: 'Ninguno',
52 headersRow: 'Primera fila',
53 invalidBorder: 'El tamaño del borde debe ser un número.',
54 invalidCellPadding: 'El espaciado interior debe ser un número.',
55 invalidCellSpacing: 'El espaciado entre celdas debe ser un número.',
56 invalidCols: 'El número de columnas debe ser un número mayor que 0.',
57 invalidHeight: 'La altura de tabla debe ser un número.',
58 invalidRows: 'El número de filas debe ser un número mayor que 0.',
59 invalidWidth: 'La anchura de tabla debe ser un número.',
60 menu: 'Propiedades de Tabla',
61 row: {
62 menu: 'Fila',
63 insertBefore: 'Insertar fila en la parte superior',
64 insertAfter: 'Insertar fila en la parte inferior',
65 deleteRow: 'Eliminar Filas'
66 },
67 rows: 'Filas',
68 summary: 'Síntesis',
69 title: 'Propiedades de Tabla',
70 toolbar: 'Tabla',
71 widthPc: 'porcentaje',
72 widthPx: 'pixeles',
73 widthUnit: 'unidad de la anchura'
74} );
diff --git a/sources/plugins/table/lang/et.js b/sources/plugins/table/lang/et.js
new file mode 100644
index 00000000..0edfccdb
--- /dev/null
+++ b/sources/plugins/table/lang/et.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'et', {
6 border: 'Joone suurus',
7 caption: 'Tabeli tiitel',
8 cell: {
9 menu: 'Lahter',
10 insertBefore: 'Sisesta lahter enne',
11 insertAfter: 'Sisesta lahter peale',
12 deleteCell: 'Eemalda lahtrid',
13 merge: 'Ühenda lahtrid',
14 mergeRight: 'Ühenda paremale',
15 mergeDown: 'Ühenda alla',
16 splitHorizontal: 'Poolita lahter horisontaalselt',
17 splitVertical: 'Poolita lahter vertikaalselt',
18 title: 'Lahtri omadused',
19 cellType: 'Lahtri liik',
20 rowSpan: 'Ridade vahe',
21 colSpan: 'Tulpade vahe',
22 wordWrap: 'Sõnade murdmine',
23 hAlign: 'Horisontaalne joondus',
24 vAlign: 'Vertikaalne joondus',
25 alignBaseline: 'Baasjoon',
26 bgColor: 'Tausta värv',
27 borderColor: 'Äärise värv',
28 data: 'Andmed',
29 header: 'Päis',
30 yes: 'Jah',
31 no: 'Ei',
32 invalidWidth: 'Lahtri laius peab olema number.',
33 invalidHeight: 'Lahtri kõrgus peab olema number.',
34 invalidRowSpan: 'Ridade vahe peab olema täisarv.',
35 invalidColSpan: 'Tulpade vahe peab olema täisarv.',
36 chooseColor: 'Vali'
37 },
38 cellPad: 'Lahtri täidis',
39 cellSpace: 'Lahtri vahe',
40 column: {
41 menu: 'Veerg',
42 insertBefore: 'Sisesta veerg enne',
43 insertAfter: 'Sisesta veerg peale',
44 deleteColumn: 'Eemalda veerud'
45 },
46 columns: 'Veerud',
47 deleteTable: 'Kustuta tabel',
48 headers: 'Päised',
49 headersBoth: 'Mõlemad',
50 headersColumn: 'Esimene tulp',
51 headersNone: 'Puudub',
52 headersRow: 'Esimene rida',
53 invalidBorder: 'Äärise suurus peab olema number.',
54 invalidCellPadding: 'Lahtrite polsterdus (padding) peab olema positiivne arv.',
55 invalidCellSpacing: 'Lahtrite vahe peab olema positiivne arv.',
56 invalidCols: 'Tulpade arv peab olema nullist suurem.',
57 invalidHeight: 'Tabeli kõrgus peab olema number.',
58 invalidRows: 'Ridade arv peab olema nullist suurem.',
59 invalidWidth: 'Tabeli laius peab olema number.',
60 menu: 'Tabeli omadused',
61 row: {
62 menu: 'Rida',
63 insertBefore: 'Sisesta rida enne',
64 insertAfter: 'Sisesta rida peale',
65 deleteRow: 'Eemalda read'
66 },
67 rows: 'Read',
68 summary: 'Kokkuvõte',
69 title: 'Tabeli omadused',
70 toolbar: 'Tabel',
71 widthPc: 'protsenti',
72 widthPx: 'pikslit',
73 widthUnit: 'laiuse ühik'
74} );
diff --git a/sources/plugins/table/lang/eu.js b/sources/plugins/table/lang/eu.js
new file mode 100644
index 00000000..75fc2932
--- /dev/null
+++ b/sources/plugins/table/lang/eu.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'eu', {
6 border: 'Ertzaren zabalera',
7 caption: 'Epigrafea',
8 cell: {
9 menu: 'Gelaxka',
10 insertBefore: 'Txertatu gelaxka aurretik',
11 insertAfter: 'Txertatu gelaxka ondoren',
12 deleteCell: 'Ezabatu gelaxkak',
13 merge: 'Batu gelaxkak',
14 mergeRight: 'Batu eskuinetara',
15 mergeDown: 'Batu behera',
16 splitHorizontal: 'Banatu gelaxka horizontalki',
17 splitVertical: 'Banatu gelaxka bertikalki',
18 title: 'Gelaxkaren propietateak',
19 cellType: 'Gelaxka-mota',
20 rowSpan: 'Errenkaden hedadura',
21 colSpan: 'Zutabeen hedadura',
22 wordWrap: 'Itzulbira',
23 hAlign: 'Lerrokatze horizontala',
24 vAlign: 'Lerrokatze bertikala',
25 alignBaseline: 'Oinarri-lerroan',
26 bgColor: 'Atzeko planoaren kolorea',
27 borderColor: 'Ertzaren kolorea',
28 data: 'Data',
29 header: 'Goiburua',
30 yes: 'Bai',
31 no: 'Ez',
32 invalidWidth: 'Gelaxkaren zabalera zenbaki bat izan behar da.',
33 invalidHeight: 'Gelaxkaren altuera zenbaki bat izan behar da.',
34 invalidRowSpan: 'Errenkaden hedadura zenbaki osoa izan behar da.',
35 invalidColSpan: 'Zutabeen hedadura zenbaki osoa izan behar da.',
36 chooseColor: 'Aukeratu'
37 },
38 cellPad: 'Gelaxken betegarria',
39 cellSpace: 'Gelaxka arteko tartea',
40 column: {
41 menu: 'Zutabea',
42 insertBefore: 'Txertatu zutabea aurretik',
43 insertAfter: 'Txertatu zutabea ondoren',
44 deleteColumn: 'Ezabatu zutabeak'
45 },
46 columns: 'Zutabeak',
47 deleteTable: 'Ezabatu taula',
48 headers: 'Goiburuak',
49 headersBoth: 'Biak',
50 headersColumn: 'Lehen zutabea',
51 headersNone: 'Bat ere ez',
52 headersRow: 'Lehen errenkada',
53 invalidBorder: 'Ertzaren tamaina zenbaki bat izan behar da.',
54 invalidCellPadding: 'Gelaxken betegarria zenbaki bat izan behar da.',
55 invalidCellSpacing: 'Gelaxka arteko tartea zenbaki bat izan behar da.',
56 invalidCols: 'Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.',
57 invalidHeight: 'Taularen altuera zenbaki bat izan behar da.',
58 invalidRows: 'Errenkada kopurua 0 baino handiagoa den zenbakia izan behar da.',
59 invalidWidth: 'Taularen zabalera zenbaki bat izan behar da.',
60 menu: 'Taularen propietateak',
61 row: {
62 menu: 'Errenkada',
63 insertBefore: 'Txertatu errenkada aurretik',
64 insertAfter: 'Txertatu errenkada ondoren',
65 deleteRow: 'Ezabatu errenkadak'
66 },
67 rows: 'Errenkadak',
68 summary: 'Laburpena',
69 title: 'Taularen propietateak',
70 toolbar: 'Taula',
71 widthPc: 'ehuneko',
72 widthPx: 'pixel',
73 widthUnit: 'zabalera unitatea'
74} );
diff --git a/sources/plugins/table/lang/fa.js b/sources/plugins/table/lang/fa.js
new file mode 100644
index 00000000..02f2907f
--- /dev/null
+++ b/sources/plugins/table/lang/fa.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'fa', {
6 border: 'اندازهٴ لبه',
7 caption: 'عنوان',
8 cell: {
9 menu: 'سلول',
10 insertBefore: 'افزودن سلول قبل از',
11 insertAfter: 'افزودن سلول بعد از',
12 deleteCell: 'حذف سلولها',
13 merge: 'ادغام سلولها',
14 mergeRight: 'ادغام به راست',
15 mergeDown: 'ادغام به پایین',
16 splitHorizontal: 'جدا کردن افقی سلول',
17 splitVertical: 'جدا کردن عمودی سلول',
18 title: 'ویژگیهای سلول',
19 cellType: 'نوع سلول',
20 rowSpan: 'محدوده ردیفها',
21 colSpan: 'محدوده ستونها',
22 wordWrap: 'شکستن کلمه',
23 hAlign: 'چینش افقی',
24 vAlign: 'چینش عمودی',
25 alignBaseline: 'خط مبنا',
26 bgColor: 'رنگ زمینه',
27 borderColor: 'رنگ خطوط',
28 data: 'اطلاعات',
29 header: 'سرنویس',
30 yes: 'بله',
31 no: 'خیر',
32 invalidWidth: 'عرض سلول باید یک عدد باشد.',
33 invalidHeight: 'ارتفاع سلول باید عدد باشد.',
34 invalidRowSpan: 'مقدار محدوده ردیفها باید یک عدد باشد.',
35 invalidColSpan: 'مقدار محدوده ستونها باید یک عدد باشد.',
36 chooseColor: 'انتخاب'
37 },
38 cellPad: 'فاصلهٴ پرشده در سلول',
39 cellSpace: 'فاصلهٴ میان سلولها',
40 column: {
41 menu: 'ستون',
42 insertBefore: 'افزودن ستون قبل از',
43 insertAfter: 'افزودن ستون بعد از',
44 deleteColumn: 'حذف ستونها'
45 },
46 columns: 'ستونها',
47 deleteTable: 'پاک کردن جدول',
48 headers: 'سرنویسها',
49 headersBoth: 'هردو',
50 headersColumn: 'اولین ستون',
51 headersNone: 'هیچ',
52 headersRow: 'اولین ردیف',
53 invalidBorder: 'مقدار اندازه خطوط باید یک عدد باشد.',
54 invalidCellPadding: 'بالشتک سلول باید یک عدد باشد.',
55 invalidCellSpacing: 'مقدار فاصلهگذاری سلول باید یک عدد باشد.',
56 invalidCols: 'تعداد ستونها باید یک عدد بزرگتر از 0 باشد.',
57 invalidHeight: 'مقدار ارتفاع جدول باید یک عدد باشد.',
58 invalidRows: 'تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.',
59 invalidWidth: 'مقدار پهنای جدول باید یک عدد باشد.',
60 menu: 'ویژگیهای جدول',
61 row: {
62 menu: 'سطر',
63 insertBefore: 'افزودن سطر قبل از',
64 insertAfter: 'افزودن سطر بعد از',
65 deleteRow: 'حذف سطرها'
66 },
67 rows: 'سطرها',
68 summary: 'خلاصه',
69 title: 'ویژگیهای جدول',
70 toolbar: 'جدول',
71 widthPc: 'درصد',
72 widthPx: 'پیکسل',
73 widthUnit: 'واحد پهنا'
74} );
diff --git a/sources/plugins/table/lang/fi.js b/sources/plugins/table/lang/fi.js
new file mode 100644
index 00000000..7327f0e3
--- /dev/null
+++ b/sources/plugins/table/lang/fi.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'fi', {
6 border: 'Rajan paksuus',
7 caption: 'Otsikko',
8 cell: {
9 menu: 'Solu',
10 insertBefore: 'Lisää solu eteen',
11 insertAfter: 'Lisää solu perään',
12 deleteCell: 'Poista solut',
13 merge: 'Yhdistä solut',
14 mergeRight: 'Yhdistä oikealla olevan kanssa',
15 mergeDown: 'Yhdistä alla olevan kanssa',
16 splitHorizontal: 'Jaa solu vaakasuunnassa',
17 splitVertical: 'Jaa solu pystysuunnassa',
18 title: 'Solun ominaisuudet',
19 cellType: 'Solun tyyppi',
20 rowSpan: 'Rivin jatkuvuus',
21 colSpan: 'Solun jatkuvuus',
22 wordWrap: 'Rivitys',
23 hAlign: 'Horisontaali kohdistus',
24 vAlign: 'Vertikaali kohdistus',
25 alignBaseline: 'Alas (teksti)',
26 bgColor: 'Taustan väri',
27 borderColor: 'Reunan väri',
28 data: 'Data',
29 header: 'Ylätunniste',
30 yes: 'Kyllä',
31 no: 'Ei',
32 invalidWidth: 'Solun leveyden täytyy olla numero.',
33 invalidHeight: 'Solun korkeuden täytyy olla numero.',
34 invalidRowSpan: 'Rivin jatkuvuuden täytyy olla kokonaisluku.',
35 invalidColSpan: 'Solun jatkuvuuden täytyy olla kokonaisluku.',
36 chooseColor: 'Valitse'
37 },
38 cellPad: 'Solujen sisennys',
39 cellSpace: 'Solujen väli',
40 column: {
41 menu: 'Sarake',
42 insertBefore: 'Lisää sarake vasemmalle',
43 insertAfter: 'Lisää sarake oikealle',
44 deleteColumn: 'Poista sarakkeet'
45 },
46 columns: 'Sarakkeet',
47 deleteTable: 'Poista taulu',
48 headers: 'Ylätunnisteet',
49 headersBoth: 'Molemmat',
50 headersColumn: 'Ensimmäinen sarake',
51 headersNone: 'Ei',
52 headersRow: 'Ensimmäinen rivi',
53 invalidBorder: 'Reunan koon täytyy olla numero.',
54 invalidCellPadding: 'Solujen sisennyksen täytyy olla numero.',
55 invalidCellSpacing: 'Solujen välin täytyy olla numero.',
56 invalidCols: 'Sarakkeiden määrän täytyy olla suurempi kuin 0.',
57 invalidHeight: 'Taulun korkeuden täytyy olla numero.',
58 invalidRows: 'Rivien määrän täytyy olla suurempi kuin 0.',
59 invalidWidth: 'Taulun leveyden täytyy olla numero.',
60 menu: 'Taulun ominaisuudet',
61 row: {
62 menu: 'Rivi',
63 insertBefore: 'Lisää rivi yläpuolelle',
64 insertAfter: 'Lisää rivi alapuolelle',
65 deleteRow: 'Poista rivit'
66 },
67 rows: 'Rivit',
68 summary: 'Yhteenveto',
69 title: 'Taulun ominaisuudet',
70 toolbar: 'Taulu',
71 widthPc: 'prosenttia',
72 widthPx: 'pikseliä',
73 widthUnit: 'leveysyksikkö'
74} );
diff --git a/sources/plugins/table/lang/fo.js b/sources/plugins/table/lang/fo.js
new file mode 100644
index 00000000..f11999ae
--- /dev/null
+++ b/sources/plugins/table/lang/fo.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'fo', {
6 border: 'Bordabreidd',
7 caption: 'Tabellfrágreiðing',
8 cell: {
9 menu: 'Meski',
10 insertBefore: 'Set meska inn áðrenn',
11 insertAfter: 'Set meska inn aftaná',
12 deleteCell: 'Strika meskar',
13 merge: 'Flætta meskar',
14 mergeRight: 'Flætta meskar til høgru',
15 mergeDown: 'Flætta saman',
16 splitHorizontal: 'Kloyv meska vatnrætt',
17 splitVertical: 'Kloyv meska loddrætt',
18 title: 'Mesku eginleikar',
19 cellType: 'Mesku slag',
20 rowSpan: 'Ræð spenni',
21 colSpan: 'Kolonnu spenni',
22 wordWrap: 'Orðkloyving',
23 hAlign: 'Horisontal plasering',
24 vAlign: 'Loddrøtt plasering',
25 alignBaseline: 'Basislinja',
26 bgColor: 'Bakgrundslitur',
27 borderColor: 'Bordalitur',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Ja',
31 no: 'Nei',
32 invalidWidth: 'Meskubreidd má vera eitt tal.',
33 invalidHeight: 'Meskuhædd má vera eitt tal.',
34 invalidRowSpan: 'Raðspennið má vera eitt heiltal.',
35 invalidColSpan: 'Kolonnuspennið má vera eitt heiltal.',
36 chooseColor: 'Vel'
37 },
38 cellPad: 'Meskubreddi',
39 cellSpace: 'Fjarstøða millum meskar',
40 column: {
41 menu: 'Kolonna',
42 insertBefore: 'Set kolonnu inn áðrenn',
43 insertAfter: 'Set kolonnu inn aftaná',
44 deleteColumn: 'Strika kolonnur'
45 },
46 columns: 'Kolonnur',
47 deleteTable: 'Strika tabell',
48 headers: 'Yvirskriftir',
49 headersBoth: 'Báðir',
50 headersColumn: 'Fyrsta kolonna',
51 headersNone: 'Eingin',
52 headersRow: 'Fyrsta rað',
53 invalidBorder: 'Borda-stødd má vera eitt tal.',
54 invalidCellPadding: 'Cell padding má vera eitt tal.',
55 invalidCellSpacing: 'Cell spacing má vera eitt tal.',
56 invalidCols: 'Talið av kolonnum má vera eitt tal størri enn 0.',
57 invalidHeight: 'Tabell-hædd má vera eitt tal.',
58 invalidRows: 'Talið av røðum má vera eitt tal størri enn 0.',
59 invalidWidth: 'Tabell-breidd má vera eitt tal.',
60 menu: 'Eginleikar fyri tabell',
61 row: {
62 menu: 'Rað',
63 insertBefore: 'Set rað inn áðrenn',
64 insertAfter: 'Set rað inn aftaná',
65 deleteRow: 'Strika røðir'
66 },
67 rows: 'Røðir',
68 summary: 'Samandráttur',
69 title: 'Eginleikar fyri tabell',
70 toolbar: 'Tabell',
71 widthPc: 'prosent',
72 widthPx: 'pixels',
73 widthUnit: 'breiddar unit'
74} );
diff --git a/sources/plugins/table/lang/fr-ca.js b/sources/plugins/table/lang/fr-ca.js
new file mode 100644
index 00000000..86130cb2
--- /dev/null
+++ b/sources/plugins/table/lang/fr-ca.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'fr-ca', {
6 border: 'Taille de la bordure',
7 caption: 'Titre',
8 cell: {
9 menu: 'Cellule',
10 insertBefore: 'Insérer une cellule avant',
11 insertAfter: 'Insérer une cellule après',
12 deleteCell: 'Supprimer des cellules',
13 merge: 'Fusionner les cellules',
14 mergeRight: 'Fusionner à droite',
15 mergeDown: 'Fusionner en bas',
16 splitHorizontal: 'Scinder la cellule horizontalement',
17 splitVertical: 'Scinder la cellule verticalement',
18 title: 'Propriétés de la cellule',
19 cellType: 'Type de cellule',
20 rowSpan: 'Fusion de lignes',
21 colSpan: 'Fusion de colonnes',
22 wordWrap: 'Retour à la ligne',
23 hAlign: 'Alignement horizontal',
24 vAlign: 'Alignement vertical',
25 alignBaseline: 'Bas du texte',
26 bgColor: 'Couleur d\'arrière plan',
27 borderColor: 'Couleur de bordure',
28 data: 'Données',
29 header: 'En-tête',
30 yes: 'Oui',
31 no: 'Non',
32 invalidWidth: 'La largeur de cellule doit être un nombre.',
33 invalidHeight: 'La hauteur de cellule doit être un nombre.',
34 invalidRowSpan: 'La fusion de lignes doit être un nombre entier.',
35 invalidColSpan: 'La fusion de colonnes doit être un nombre entier.',
36 chooseColor: 'Sélectionner'
37 },
38 cellPad: 'Marge interne des cellules',
39 cellSpace: 'Espacement des cellules',
40 column: {
41 menu: 'Colonne',
42 insertBefore: 'Insérer une colonne avant',
43 insertAfter: 'Insérer une colonne après',
44 deleteColumn: 'Supprimer des colonnes'
45 },
46 columns: 'Colonnes',
47 deleteTable: 'Supprimer le tableau',
48 headers: 'En-têtes',
49 headersBoth: 'Les deux.',
50 headersColumn: 'Première colonne',
51 headersNone: 'Aucun',
52 headersRow: 'Première ligne',
53 invalidBorder: 'La taille de bordure doit être un nombre.',
54 invalidCellPadding: 'La marge interne des cellules doit être un nombre positif.',
55 invalidCellSpacing: 'L\'espacement des cellules doit être un nombre positif.',
56 invalidCols: 'Le nombre de colonnes doit être supérieur à 0.',
57 invalidHeight: 'La hauteur du tableau doit être un nombre.',
58 invalidRows: 'Le nombre de lignes doit être supérieur à 0.',
59 invalidWidth: 'La largeur du tableau doit être un nombre.',
60 menu: 'Propriétés du tableau',
61 row: {
62 menu: 'Ligne',
63 insertBefore: 'Insérer une ligne avant',
64 insertAfter: 'Insérer une ligne après',
65 deleteRow: 'Supprimer des lignes'
66 },
67 rows: 'Lignes',
68 summary: 'Résumé',
69 title: 'Propriétés du tableau',
70 toolbar: 'Tableau',
71 widthPc: 'pourcentage',
72 widthPx: 'pixels',
73 widthUnit: 'unité de largeur'
74} );
diff --git a/sources/plugins/table/lang/fr.js b/sources/plugins/table/lang/fr.js
new file mode 100644
index 00000000..51d2422e
--- /dev/null
+++ b/sources/plugins/table/lang/fr.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'fr', {
6 border: 'Taille de la bordure',
7 caption: 'Titre du tableau',
8 cell: {
9 menu: 'Cellule',
10 insertBefore: 'Insérer une cellule avant',
11 insertAfter: 'Insérer une cellule après',
12 deleteCell: 'Supprimer les cellules',
13 merge: 'Fusionner les cellules',
14 mergeRight: 'Fusionner à droite',
15 mergeDown: 'Fusionner en bas',
16 splitHorizontal: 'Fractionner horizontalement',
17 splitVertical: 'Fractionner verticalement',
18 title: 'Propriétés de la cellule',
19 cellType: 'Type de cellule',
20 rowSpan: 'Fusion de lignes',
21 colSpan: 'Fusion de colonnes',
22 wordWrap: 'Césure',
23 hAlign: 'Alignement Horizontal',
24 vAlign: 'Alignement Vertical',
25 alignBaseline: 'Bas du texte',
26 bgColor: 'Couleur d\'arrière-plan',
27 borderColor: 'Couleur de Bordure',
28 data: 'Données',
29 header: 'Entête',
30 yes: 'Oui',
31 no: 'Non',
32 invalidWidth: 'La Largeur de Cellule doit être un nombre.',
33 invalidHeight: 'La Hauteur de Cellule doit être un nombre.',
34 invalidRowSpan: 'La fusion de lignes doit être un nombre entier.',
35 invalidColSpan: 'La fusion de colonnes doit être un nombre entier.',
36 chooseColor: 'Choisissez'
37 },
38 cellPad: 'Marge interne des cellules',
39 cellSpace: 'Espacement des cellules',
40 column: {
41 menu: 'Colonnes',
42 insertBefore: 'Insérer une colonne avant',
43 insertAfter: 'Insérer une colonne après',
44 deleteColumn: 'Supprimer les colonnes'
45 },
46 columns: 'Colonnes',
47 deleteTable: 'Supprimer le tableau',
48 headers: 'En-Têtes',
49 headersBoth: 'Les deux',
50 headersColumn: 'Première colonne',
51 headersNone: 'Aucunes',
52 headersRow: 'Première ligne',
53 invalidBorder: 'La taille de la bordure doit être un nombre.',
54 invalidCellPadding: 'La marge intérieure des cellules doit être un nombre positif.',
55 invalidCellSpacing: 'L\'espacement des cellules doit être un nombre positif.',
56 invalidCols: 'Le nombre de colonnes doit être supérieur à 0.',
57 invalidHeight: 'La hauteur du tableau doit être un nombre.',
58 invalidRows: 'Le nombre de lignes doit être supérieur à 0.',
59 invalidWidth: 'La largeur du tableau doit être un nombre.',
60 menu: 'Propriétés du tableau',
61 row: {
62 menu: 'Ligne',
63 insertBefore: 'Insérer une ligne avant',
64 insertAfter: 'Insérer une ligne après',
65 deleteRow: 'Supprimer les lignes'
66 },
67 rows: 'Lignes',
68 summary: 'Résumé (description)',
69 title: 'Propriétés du tableau',
70 toolbar: 'Tableau',
71 widthPc: '% pourcents',
72 widthPx: 'pixels',
73 widthUnit: 'unité de largeur'
74} );
diff --git a/sources/plugins/table/lang/gl.js b/sources/plugins/table/lang/gl.js
new file mode 100644
index 00000000..5957bb11
--- /dev/null
+++ b/sources/plugins/table/lang/gl.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'gl', {
6 border: 'Tamaño do bordo',
7 caption: 'Título',
8 cell: {
9 menu: 'Cela',
10 insertBefore: 'Inserir a cela á esquerda',
11 insertAfter: 'Inserir a cela á dereita',
12 deleteCell: 'Eliminar celas',
13 merge: 'Combinar celas',
14 mergeRight: 'Combinar á dereita',
15 mergeDown: 'Combinar cara abaixo',
16 splitHorizontal: 'Dividir a cela en horizontal',
17 splitVertical: 'Dividir a cela en vertical',
18 title: 'Propiedades da cela',
19 cellType: 'Tipo de cela',
20 rowSpan: 'Expandir filas',
21 colSpan: 'Expandir columnas',
22 wordWrap: 'Axustar ao contido',
23 hAlign: 'Aliñación horizontal',
24 vAlign: 'Aliñación vertical',
25 alignBaseline: 'Liña de base',
26 bgColor: 'Cor do fondo',
27 borderColor: 'Cor do bordo',
28 data: 'Datos',
29 header: 'Cabeceira',
30 yes: 'Si',
31 no: 'Non',
32 invalidWidth: 'O largo da cela debe ser un número.',
33 invalidHeight: 'O alto da cela debe ser un número.',
34 invalidRowSpan: 'A expansión de filas debe ser un número enteiro.',
35 invalidColSpan: 'A expansión de columnas debe ser un número enteiro.',
36 chooseColor: 'Escoller'
37 },
38 cellPad: 'Marxe interior da cela',
39 cellSpace: 'Marxe entre celas',
40 column: {
41 menu: 'Columna',
42 insertBefore: 'Inserir a columna á esquerda',
43 insertAfter: 'Inserir a columna á dereita',
44 deleteColumn: 'Borrar Columnas'
45 },
46 columns: 'Columnas',
47 deleteTable: 'Borrar Táboa',
48 headers: 'Cabeceiras',
49 headersBoth: 'Ambas',
50 headersColumn: 'Primeira columna',
51 headersNone: 'Ningún',
52 headersRow: 'Primeira fila',
53 invalidBorder: 'O tamaño do bordo debe ser un número.',
54 invalidCellPadding: 'A marxe interior debe ser un número positivo.',
55 invalidCellSpacing: 'A marxe entre celas debe ser un número positivo.',
56 invalidCols: 'O número de columnas debe ser un número maior que 0.',
57 invalidHeight: 'O alto da táboa debe ser un número.',
58 invalidRows: 'O número de filas debe ser un número maior que 0',
59 invalidWidth: 'O largo da táboa debe ser un número.',
60 menu: 'Propiedades da táboa',
61 row: {
62 menu: 'Fila',
63 insertBefore: 'Inserir a fila por riba',
64 insertAfter: 'Inserir a fila por baixo',
65 deleteRow: 'Eliminar filas'
66 },
67 rows: 'Filas',
68 summary: 'Resumo',
69 title: 'Propiedades da táboa',
70 toolbar: 'Taboa',
71 widthPc: 'porcentaxe',
72 widthPx: 'píxeles',
73 widthUnit: 'unidade do largo'
74} );
diff --git a/sources/plugins/table/lang/gu.js b/sources/plugins/table/lang/gu.js
new file mode 100644
index 00000000..cbed6a27
--- /dev/null
+++ b/sources/plugins/table/lang/gu.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'gu', {
6 border: 'કોઠાની બાજુ(બોર્ડર) સાઇઝ',
7 caption: 'મથાળું/કૅપ્શન ',
8 cell: {
9 menu: 'કોષના ખાના',
10 insertBefore: 'પહેલાં કોષ ઉમેરવો',
11 insertAfter: 'પછી કોષ ઉમેરવો',
12 deleteCell: 'કોષ ડિલીટ/કાઢી નાખવો',
13 merge: 'કોષ ભેગા કરવા',
14 mergeRight: 'જમણી બાજુ ભેગા કરવા',
15 mergeDown: 'નીચે ભેગા કરવા',
16 splitHorizontal: 'કોષને સમસ્તરીય વિભાજન કરવું',
17 splitVertical: 'કોષને સીધું ને ઊભું વિભાજન કરવું',
18 title: 'સેલના ગુણ',
19 cellType: 'સેલનો પ્રકાર',
20 rowSpan: 'આડી કટારની જગ્યા',
21 colSpan: 'ઊભી કતારની જગ્યા',
22 wordWrap: 'વર્ડ રેપ',
23 hAlign: 'સપાટ લાઈનદોરી',
24 vAlign: 'ઊભી લાઈનદોરી',
25 alignBaseline: 'બસે લાઈન',
26 bgColor: 'પાછાળનો રંગ',
27 borderColor: 'બોર્ડેર રંગ',
28 data: 'સ્વીકૃત માહિતી',
29 header: 'મથાળું',
30 yes: 'હા',
31 no: 'ના',
32 invalidWidth: 'સેલની પોહલાઈ આંકડો હોવો જોઈએ.',
33 invalidHeight: 'સેલની ઊંચાઈ આંકડો હોવો જોઈએ.',
34 invalidRowSpan: 'રો સ્પાન આંકડો હોવો જોઈએ.',
35 invalidColSpan: 'કોલમ સ્પાન આંકડો હોવો જોઈએ.',
36 chooseColor: 'પસંદ કરવું'
37 },
38 cellPad: 'સેલ પૅડિંગ',
39 cellSpace: 'સેલ અંતર',
40 column: {
41 menu: 'કૉલમ/ઊભી કટાર',
42 insertBefore: 'પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી',
43 insertAfter: 'પછી કૉલમ/ઊભી કટાર ઉમેરવી',
44 deleteColumn: 'કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી'
45 },
46 columns: 'કૉલમ/ઊભી કટાર',
47 deleteTable: 'કોઠો ડિલીટ/કાઢી નાખવું',
48 headers: 'મથાળા',
49 headersBoth: 'બેવું',
50 headersColumn: 'પહેલી ઊભી કટાર',
51 headersNone: 'નથી ',
52 headersRow: 'પહેલી કટાર',
53 invalidBorder: 'બોર્ડર એક આંકડો હોવો જોઈએ',
54 invalidCellPadding: 'સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.',
55 invalidCellSpacing: 'સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.',
56 invalidCols: 'ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.',
57 invalidHeight: 'ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.',
58 invalidRows: 'આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.',
59 invalidWidth: 'ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.',
60 menu: 'ટેબલ, કોઠાનું મથાળું',
61 row: {
62 menu: 'પંક્તિના ખાના',
63 insertBefore: 'પહેલાં પંક્તિ ઉમેરવી',
64 insertAfter: 'પછી પંક્તિ ઉમેરવી',
65 deleteRow: 'પંક્તિઓ ડિલીટ/કાઢી નાખવી'
66 },
67 rows: 'પંક્તિના ખાના',
68 summary: 'ટૂંકો એહેવાલ',
69 title: 'ટેબલ, કોઠાનું મથાળું',
70 toolbar: 'ટેબલ, કોઠો',
71 widthPc: 'પ્રતિશત',
72 widthPx: 'પિકસલ',
73 widthUnit: 'પોહાલાઈ એકમ'
74} );
diff --git a/sources/plugins/table/lang/he.js b/sources/plugins/table/lang/he.js
new file mode 100644
index 00000000..8b0aba0a
--- /dev/null
+++ b/sources/plugins/table/lang/he.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'he', {
6 border: 'גודל מסגרת',
7 caption: 'כיתוב',
8 cell: {
9 menu: 'מאפייני תא',
10 insertBefore: 'הוספת תא לפני',
11 insertAfter: 'הוספת תא אחרי',
12 deleteCell: 'מחיקת תאים',
13 merge: 'מיזוג תאים',
14 mergeRight: 'מזג ימינה',
15 mergeDown: 'מזג למטה',
16 splitHorizontal: 'פיצול תא אופקית',
17 splitVertical: 'פיצול תא אנכית',
18 title: 'תכונות התא',
19 cellType: 'סוג התא',
20 rowSpan: 'מתיחת השורות',
21 colSpan: 'מתיחת התאים',
22 wordWrap: 'מניעת גלישת שורות',
23 hAlign: 'יישור אופקי',
24 vAlign: 'יישור אנכי',
25 alignBaseline: 'שורת בסיס',
26 bgColor: 'צבע רקע',
27 borderColor: 'צבע מסגרת',
28 data: 'מידע',
29 header: 'כותרת',
30 yes: 'כן',
31 no: 'לא',
32 invalidWidth: 'שדה רוחב התא חייב להיות מספר.',
33 invalidHeight: 'שדה גובה התא חייב להיות מספר.',
34 invalidRowSpan: 'שדה מתיחת השורות חייב להיות מספר שלם.',
35 invalidColSpan: 'שדה מתיחת העמודות חייב להיות מספר שלם.',
36 chooseColor: 'בחר'
37 },
38 cellPad: 'ריפוד תא',
39 cellSpace: 'מרווח תא',
40 column: {
41 menu: 'עמודה',
42 insertBefore: 'הוספת עמודה לפני',
43 insertAfter: 'הוספת עמודה אחרי',
44 deleteColumn: 'מחיקת עמודות'
45 },
46 columns: 'עמודות',
47 deleteTable: 'מחק טבלה',
48 headers: 'כותרות',
49 headersBoth: 'שניהם',
50 headersColumn: 'עמודה ראשונה',
51 headersNone: 'אין',
52 headersRow: 'שורה ראשונה',
53 invalidBorder: 'שדה גודל המסגרת חייב להיות מספר.',
54 invalidCellPadding: 'שדה ריפוד התאים חייב להיות מספר חיובי.',
55 invalidCellSpacing: 'שדה ריווח התאים חייב להיות מספר חיובי.',
56 invalidCols: 'שדה מספר העמודות חייב להיות מספר גדול מ 0.',
57 invalidHeight: 'שדה גובה הטבלה חייב להיות מספר.',
58 invalidRows: 'שדה מספר השורות חייב להיות מספר גדול מ 0.',
59 invalidWidth: 'שדה רוחב הטבלה חייב להיות מספר.',
60 menu: 'מאפייני טבלה',
61 row: {
62 menu: 'שורה',
63 insertBefore: 'הוספת שורה לפני',
64 insertAfter: 'הוספת שורה אחרי',
65 deleteRow: 'מחיקת שורות'
66 },
67 rows: 'שורות',
68 summary: 'תקציר',
69 title: 'מאפייני טבלה',
70 toolbar: 'טבלה',
71 widthPc: 'אחוז',
72 widthPx: 'פיקסלים',
73 widthUnit: 'יחידת רוחב'
74} );
diff --git a/sources/plugins/table/lang/hi.js b/sources/plugins/table/lang/hi.js
new file mode 100644
index 00000000..82291ca2
--- /dev/null
+++ b/sources/plugins/table/lang/hi.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'hi', {
6 border: 'बॉर्डर साइज़',
7 caption: 'शीर्षक',
8 cell: {
9 menu: 'खाना',
10 insertBefore: 'पहले सैल डालें',
11 insertAfter: 'बाद में सैल डालें',
12 deleteCell: 'सैल डिलीट करें',
13 merge: 'सैल मिलायें',
14 mergeRight: 'बाँया विलय',
15 mergeDown: 'नीचे विलय करें',
16 splitHorizontal: 'सैल को क्षैतिज स्थिति में विभाजित करें',
17 splitVertical: 'सैल को लम्बाकार में विभाजित करें',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'सैल पैडिंग',
39 cellSpace: 'सैल अंतर',
40 column: {
41 menu: 'कालम',
42 insertBefore: 'पहले कालम डालें',
43 insertAfter: 'बाद में कालम डालें',
44 deleteColumn: 'कालम डिलीट करें'
45 },
46 columns: 'कालम',
47 deleteTable: 'टेबल डिलीट करें',
48 headers: 'Headers', // MISSING
49 headersBoth: 'Both', // MISSING
50 headersColumn: 'First column', // MISSING
51 headersNone: 'None',
52 headersRow: 'First Row', // MISSING
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'टेबल प्रॉपर्टीज़',
61 row: {
62 menu: 'पंक्ति',
63 insertBefore: 'पहले पंक्ति डालें',
64 insertAfter: 'बाद में पंक्ति डालें',
65 deleteRow: 'पंक्तियाँ डिलीट करें'
66 },
67 rows: 'पंक्तियाँ',
68 summary: 'सारांश',
69 title: 'टेबल प्रॉपर्टीज़',
70 toolbar: 'टेबल',
71 widthPc: 'प्रतिशत',
72 widthPx: 'पिक्सैल',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/hr.js b/sources/plugins/table/lang/hr.js
new file mode 100644
index 00000000..f8ee9a68
--- /dev/null
+++ b/sources/plugins/table/lang/hr.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'hr', {
6 border: 'Veličina okvira',
7 caption: 'Naslov',
8 cell: {
9 menu: 'Ćelija',
10 insertBefore: 'Ubaci ćeliju prije',
11 insertAfter: 'Ubaci ćeliju poslije',
12 deleteCell: 'Izbriši ćelije',
13 merge: 'Spoji ćelije',
14 mergeRight: 'Spoji desno',
15 mergeDown: 'Spoji dolje',
16 splitHorizontal: 'Podijeli ćeliju vodoravno',
17 splitVertical: 'Podijeli ćeliju okomito',
18 title: 'Svojstva ćelije',
19 cellType: 'Vrsta ćelije',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Prelazak u novi red',
23 hAlign: 'Vodoravno poravnanje',
24 vAlign: 'Okomito poravnanje',
25 alignBaseline: 'Osnovna linija',
26 bgColor: 'Boja pozadine',
27 borderColor: 'Boja ruba',
28 data: 'Podatak',
29 header: 'Zaglavlje',
30 yes: 'Da',
31 no: 'ne',
32 invalidWidth: 'Širina ćelije mora biti broj.',
33 invalidHeight: 'Visina ćelije mora biti broj.',
34 invalidRowSpan: 'Rows span mora biti cijeli broj.',
35 invalidColSpan: 'Columns span mora biti cijeli broj.',
36 chooseColor: 'Odaberi'
37 },
38 cellPad: 'Razmak ćelija',
39 cellSpace: 'Prostornost ćelija',
40 column: {
41 menu: 'Kolona',
42 insertBefore: 'Ubaci kolonu prije',
43 insertAfter: 'Ubaci kolonu poslije',
44 deleteColumn: 'Izbriši kolone'
45 },
46 columns: 'Kolona',
47 deleteTable: 'Izbriši tablicu',
48 headers: 'Zaglavlje',
49 headersBoth: 'Oba',
50 headersColumn: 'Prva kolona',
51 headersNone: 'Ništa',
52 headersRow: 'Prvi red',
53 invalidBorder: 'Debljina ruba mora biti broj.',
54 invalidCellPadding: 'Razmak ćelija mora biti broj.',
55 invalidCellSpacing: 'Prostornost ćelija mora biti broj.',
56 invalidCols: 'Broj kolona mora biti broj veći od 0.',
57 invalidHeight: 'Visina tablice mora biti broj.',
58 invalidRows: 'Broj redova mora biti broj veći od 0.',
59 invalidWidth: 'Širina tablice mora biti broj.',
60 menu: 'Svojstva tablice',
61 row: {
62 menu: 'Red',
63 insertBefore: 'Ubaci red prije',
64 insertAfter: 'Ubaci red poslije',
65 deleteRow: 'Izbriši redove'
66 },
67 rows: 'Redova',
68 summary: 'Sažetak',
69 title: 'Svojstva tablice',
70 toolbar: 'Tablica',
71 widthPc: 'postotaka',
72 widthPx: 'piksela',
73 widthUnit: 'jedinica širine'
74} );
diff --git a/sources/plugins/table/lang/hu.js b/sources/plugins/table/lang/hu.js
new file mode 100644
index 00000000..ce45034e
--- /dev/null
+++ b/sources/plugins/table/lang/hu.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'hu', {
6 border: 'Szegélyméret',
7 caption: 'Felirat',
8 cell: {
9 menu: 'Cella',
10 insertBefore: 'Beszúrás balra',
11 insertAfter: 'Beszúrás jobbra',
12 deleteCell: 'Cellák törlése',
13 merge: 'Cellák egyesítése',
14 mergeRight: 'Cellák egyesítése jobbra',
15 mergeDown: 'Cellák egyesítése lefelé',
16 splitHorizontal: 'Cellák szétválasztása vízszintesen',
17 splitVertical: 'Cellák szétválasztása függőlegesen',
18 title: 'Cella tulajdonságai',
19 cellType: 'Cella típusa',
20 rowSpan: 'Függőleges egyesítés',
21 colSpan: 'Vízszintes egyesítés',
22 wordWrap: 'Hosszú sorok törése',
23 hAlign: 'Vízszintes igazítás',
24 vAlign: 'Függőleges igazítás',
25 alignBaseline: 'Alapvonalra',
26 bgColor: 'Háttér színe',
27 borderColor: 'Keret színe',
28 data: 'Adat',
29 header: 'Fejléc',
30 yes: 'Igen',
31 no: 'Nem',
32 invalidWidth: 'A szélesség mezőbe csak számokat írhat.',
33 invalidHeight: 'A magasság mezőbe csak számokat írhat.',
34 invalidRowSpan: 'A függőleges egyesítés mezőbe csak számokat írhat.',
35 invalidColSpan: 'A vízszintes egyesítés mezőbe csak számokat írhat.',
36 chooseColor: 'Válasszon'
37 },
38 cellPad: 'Cella belső margó',
39 cellSpace: 'Cella térköz',
40 column: {
41 menu: 'Oszlop',
42 insertBefore: 'Beszúrás balra',
43 insertAfter: 'Beszúrás jobbra',
44 deleteColumn: 'Oszlopok törlése'
45 },
46 columns: 'Oszlopok',
47 deleteTable: 'Táblázat törlése',
48 headers: 'Fejlécek',
49 headersBoth: 'Mindkettő',
50 headersColumn: 'Első oszlop',
51 headersNone: 'Nincsenek',
52 headersRow: 'Első sor',
53 invalidBorder: 'A szegélyméret mezőbe csak számokat írhat.',
54 invalidCellPadding: 'A cella belső margó mezőbe csak számokat írhat.',
55 invalidCellSpacing: 'A cella térköz mezőbe csak számokat írhat.',
56 invalidCols: 'Az oszlopok számának nagyobbnak kell lenni mint 0.',
57 invalidHeight: 'A magasság mezőbe csak számokat írhat.',
58 invalidRows: 'A sorok számának nagyobbnak kell lenni mint 0.',
59 invalidWidth: 'A szélesség mezőbe csak számokat írhat.',
60 menu: 'Táblázat tulajdonságai',
61 row: {
62 menu: 'Sor',
63 insertBefore: 'Beszúrás fölé',
64 insertAfter: 'Beszúrás alá',
65 deleteRow: 'Sorok törlése'
66 },
67 rows: 'Sorok',
68 summary: 'Leírás',
69 title: 'Táblázat tulajdonságai',
70 toolbar: 'Táblázat',
71 widthPc: 'százalék',
72 widthPx: 'képpont',
73 widthUnit: 'Szélesség egység'
74} );
diff --git a/sources/plugins/table/lang/id.js b/sources/plugins/table/lang/id.js
new file mode 100644
index 00000000..459fbe9a
--- /dev/null
+++ b/sources/plugins/table/lang/id.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'id', {
6 border: 'Ukuran batas',
7 caption: 'Judul halaman',
8 cell: {
9 menu: 'Sel',
10 insertBefore: 'Sisip Sel Sebelum',
11 insertAfter: 'Sisip Sel Setelah',
12 deleteCell: 'Hapus Sel',
13 merge: 'Gabungkan Sel',
14 mergeRight: 'Gabungkan ke Kanan',
15 mergeDown: 'Gabungkan ke Bawah',
16 splitHorizontal: 'Pisahkan Sel Secara Horisontal',
17 splitVertical: 'Pisahkan Sel Secara Vertikal',
18 title: 'Properti Sel',
19 cellType: 'Tipe Sel',
20 rowSpan: 'Rentang antar baris',
21 colSpan: 'Rentang antar kolom',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Jajaran Horisontal',
24 vAlign: 'Jajaran Vertikal',
25 alignBaseline: 'Dasar',
26 bgColor: 'Warna Latar Belakang',
27 borderColor: 'Warna Batasan',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Ya',
31 no: 'Tidak',
32 invalidWidth: 'Lebar sel harus sebuah angka.',
33 invalidHeight: 'Tinggi sel harus sebuah angka',
34 invalidRowSpan: 'Rentang antar baris harus angka seluruhnya.',
35 invalidColSpan: 'Rentang antar kolom harus angka seluruhnya',
36 chooseColor: 'Pilih'
37 },
38 cellPad: 'Sel spasi dalam',
39 cellSpace: 'Spasi antar sel',
40 column: {
41 menu: 'Kolom',
42 insertBefore: 'Sisip Kolom Sebelum',
43 insertAfter: 'Sisip Kolom Sesudah',
44 deleteColumn: 'Hapus Kolom'
45 },
46 columns: 'Kolom',
47 deleteTable: 'Hapus Tabel',
48 headers: 'Headers',
49 headersBoth: 'Keduanya',
50 headersColumn: 'Kolom pertama',
51 headersNone: 'Tidak ada',
52 headersRow: 'Baris Pertama',
53 invalidBorder: 'Ukuran batasan harus sebuah angka',
54 invalidCellPadding: '\'Spasi dalam\' sel harus angka positif.',
55 invalidCellSpacing: 'Spasi antar sel harus angka positif.',
56 invalidCols: 'Jumlah kolom harus sebuah angka lebih besar dari 0',
57 invalidHeight: 'Tinggi tabel harus sebuah angka.',
58 invalidRows: 'Jumlah barus harus sebuah angka dan lebih besar dari 0.',
59 invalidWidth: 'Lebar tabel harus sebuah angka.',
60 menu: 'Properti Tabel',
61 row: {
62 menu: 'Baris',
63 insertBefore: 'Sisip Baris Sebelum',
64 insertAfter: 'Sisip Baris Sesudah',
65 deleteRow: 'Hapus Baris'
66 },
67 rows: 'Baris',
68 summary: 'Intisari',
69 title: 'Properti Tabel',
70 toolbar: 'Tabe',
71 widthPc: 'persen',
72 widthPx: 'piksel',
73 widthUnit: 'lebar satuan'
74} );
diff --git a/sources/plugins/table/lang/is.js b/sources/plugins/table/lang/is.js
new file mode 100644
index 00000000..6e6f350b
--- /dev/null
+++ b/sources/plugins/table/lang/is.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'is', {
6 border: 'Breidd ramma',
7 caption: 'Titill',
8 cell: {
9 menu: 'Reitur',
10 insertBefore: 'Skjóta inn reiti fyrir aftan',
11 insertAfter: 'Skjóta inn reiti fyrir framan',
12 deleteCell: 'Fella reit',
13 merge: 'Sameina reiti',
14 mergeRight: 'Sameina til hægri',
15 mergeDown: 'Sameina niður á við',
16 splitHorizontal: 'Kljúfa reit lárétt',
17 splitVertical: 'Kljúfa reit lóðrétt',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Reitaspássía',
39 cellSpace: 'Bil milli reita',
40 column: {
41 menu: 'Dálkur',
42 insertBefore: 'Skjóta inn dálki vinstra megin',
43 insertAfter: 'Skjóta inn dálki hægra megin',
44 deleteColumn: 'Fella dálk'
45 },
46 columns: 'Dálkar',
47 deleteTable: 'Fella töflu',
48 headers: 'Fyrirsagnir',
49 headersBoth: 'Hvort tveggja',
50 headersColumn: 'Fyrsti dálkur',
51 headersNone: 'Engar',
52 headersRow: 'Fyrsta röð',
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'Eigindi töflu',
61 row: {
62 menu: 'Röð',
63 insertBefore: 'Skjóta inn röð fyrir ofan',
64 insertAfter: 'Skjóta inn röð fyrir neðan',
65 deleteRow: 'Eyða röð'
66 },
67 rows: 'Raðir',
68 summary: 'Áfram',
69 title: 'Eigindi töflu',
70 toolbar: 'Tafla',
71 widthPc: 'prósent',
72 widthPx: 'myndeindir',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/it.js b/sources/plugins/table/lang/it.js
new file mode 100644
index 00000000..494025ff
--- /dev/null
+++ b/sources/plugins/table/lang/it.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'it', {
6 border: 'Dimensione bordo',
7 caption: 'Intestazione',
8 cell: {
9 menu: 'Cella',
10 insertBefore: 'Inserisci Cella Prima',
11 insertAfter: 'Inserisci Cella Dopo',
12 deleteCell: 'Elimina celle',
13 merge: 'Unisce celle',
14 mergeRight: 'Unisci a Destra',
15 mergeDown: 'Unisci in Basso',
16 splitHorizontal: 'Dividi Cella Orizzontalmente',
17 splitVertical: 'Dividi Cella Verticalmente',
18 title: 'Proprietà della cella',
19 cellType: 'Tipo di cella',
20 rowSpan: 'Su più righe',
21 colSpan: 'Su più colonne',
22 wordWrap: 'Ritorno a capo',
23 hAlign: 'Allineamento orizzontale',
24 vAlign: 'Allineamento verticale',
25 alignBaseline: 'Linea Base',
26 bgColor: 'Colore di Sfondo',
27 borderColor: 'Colore del Bordo',
28 data: 'Dati',
29 header: 'Intestazione',
30 yes: 'Si',
31 no: 'No',
32 invalidWidth: 'La larghezza della cella dev\'essere un numero.',
33 invalidHeight: 'L\'altezza della cella dev\'essere un numero.',
34 invalidRowSpan: 'Il numero di righe dev\'essere un numero intero.',
35 invalidColSpan: 'Il numero di colonne dev\'essere un numero intero.',
36 chooseColor: 'Scegli'
37 },
38 cellPad: 'Padding celle',
39 cellSpace: 'Spaziatura celle',
40 column: {
41 menu: 'Colonna',
42 insertBefore: 'Inserisci Colonna Prima',
43 insertAfter: 'Inserisci Colonna Dopo',
44 deleteColumn: 'Elimina colonne'
45 },
46 columns: 'Colonne',
47 deleteTable: 'Cancella Tabella',
48 headers: 'Intestazione',
49 headersBoth: 'Entrambe',
50 headersColumn: 'Prima Colonna',
51 headersNone: 'Nessuna',
52 headersRow: 'Prima Riga',
53 invalidBorder: 'La dimensione del bordo dev\'essere un numero.',
54 invalidCellPadding: 'Il paging delle celle dev\'essere un numero',
55 invalidCellSpacing: 'La spaziatura tra le celle dev\'essere un numero.',
56 invalidCols: 'Il numero di colonne dev\'essere un numero maggiore di 0.',
57 invalidHeight: 'L\'altezza della tabella dev\'essere un numero.',
58 invalidRows: 'Il numero di righe dev\'essere un numero maggiore di 0.',
59 invalidWidth: 'La larghezza della tabella dev\'essere un numero.',
60 menu: 'Proprietà tabella',
61 row: {
62 menu: 'Riga',
63 insertBefore: 'Inserisci Riga Prima',
64 insertAfter: 'Inserisci Riga Dopo',
65 deleteRow: 'Elimina righe'
66 },
67 rows: 'Righe',
68 summary: 'Indice',
69 title: 'Proprietà tabella',
70 toolbar: 'Tabella',
71 widthPc: 'percento',
72 widthPx: 'pixel',
73 widthUnit: 'unità larghezza'
74} );
diff --git a/sources/plugins/table/lang/ja.js b/sources/plugins/table/lang/ja.js
new file mode 100644
index 00000000..1fe658b6
--- /dev/null
+++ b/sources/plugins/table/lang/ja.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ja', {
6 border: '枠線の幅',
7 caption: 'キャプション',
8 cell: {
9 menu: 'セル',
10 insertBefore: 'セルを前に挿入',
11 insertAfter: 'セルを後に挿入',
12 deleteCell: 'セルを削除',
13 merge: 'セルを結合',
14 mergeRight: '右に結合',
15 mergeDown: '下に結合',
16 splitHorizontal: 'セルを水平方向に分割',
17 splitVertical: 'セルを垂直方向に分割',
18 title: 'セルのプロパティ',
19 cellType: 'セルの種類',
20 rowSpan: '行の結合数',
21 colSpan: '列の結合数',
22 wordWrap: '単語の折り返し',
23 hAlign: '水平方向の配置',
24 vAlign: '垂直方向の配置',
25 alignBaseline: 'ベースライン',
26 bgColor: '背景色',
27 borderColor: 'ボーダーカラー',
28 data: 'テーブルデータ (td)',
29 header: 'ヘッダ',
30 yes: 'はい',
31 no: 'いいえ',
32 invalidWidth: 'セル幅は数値で入力してください。',
33 invalidHeight: 'セル高さは数値で入力してください。',
34 invalidRowSpan: '縦幅(行数)は数値で入力してください。',
35 invalidColSpan: '横幅(列数)は数値で入力してください。',
36 chooseColor: '色の選択'
37 },
38 cellPad: 'セル内間隔',
39 cellSpace: 'セル内余白',
40 column: {
41 menu: '列',
42 insertBefore: '列を左に挿入',
43 insertAfter: '列を右に挿入',
44 deleteColumn: '列を削除'
45 },
46 columns: '列数',
47 deleteTable: '表を削除',
48 headers: 'ヘッダ (th)',
49 headersBoth: '両方',
50 headersColumn: '最初の列のみ',
51 headersNone: 'なし',
52 headersRow: '最初の行のみ',
53 invalidBorder: '枠線の幅は数値で入力してください。',
54 invalidCellPadding: 'セル内余白は数値で入力してください。',
55 invalidCellSpacing: 'セル間余白は数値で入力してください。',
56 invalidCols: '列数は0より大きな数値を入力してください。',
57 invalidHeight: '高さは数値で入力してください。',
58 invalidRows: '行数は0より大きな数値を入力してください。',
59 invalidWidth: '幅は数値で入力してください。',
60 menu: '表のプロパティ',
61 row: {
62 menu: '行',
63 insertBefore: '行を上に挿入',
64 insertAfter: '行を下に挿入',
65 deleteRow: '行を削除'
66 },
67 rows: '行数',
68 summary: '表の概要',
69 title: '表のプロパティ',
70 toolbar: '表',
71 widthPc: 'パーセント',
72 widthPx: 'ピクセル',
73 widthUnit: '幅の単位'
74} );
diff --git a/sources/plugins/table/lang/ka.js b/sources/plugins/table/lang/ka.js
new file mode 100644
index 00000000..4b22b2af
--- /dev/null
+++ b/sources/plugins/table/lang/ka.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ka', {
6 border: 'ჩარჩოს ზომა',
7 caption: 'სათაური',
8 cell: {
9 menu: 'უჯრა',
10 insertBefore: 'უჯრის ჩასმა მანამდე',
11 insertAfter: 'უჯრის ჩასმა მერე',
12 deleteCell: 'უჯრების წაშლა',
13 merge: 'უჯრების შეერთება',
14 mergeRight: 'შეერთება მარჯვენასთან',
15 mergeDown: 'შეერთება ქვემოთასთან',
16 splitHorizontal: 'გაყოფა ჰორიზონტალურად',
17 splitVertical: 'გაყოფა ვერტიკალურად',
18 title: 'უჯრის პარამეტრები',
19 cellType: 'უჯრის ტიპი',
20 rowSpan: 'სტრიქონების ოდენობა',
21 colSpan: 'სვეტების ოდენობა',
22 wordWrap: 'სტრიქონის გადატანა (Word Wrap)',
23 hAlign: 'ჰორიზონტალური სწორება',
24 vAlign: 'ვერტიკალური სწორება',
25 alignBaseline: 'ძირითადი ხაზის გასწვრივ',
26 bgColor: 'ფონის ფერი',
27 borderColor: 'ჩარჩოს ფერი',
28 data: 'მონაცემები',
29 header: 'სათაური',
30 yes: 'დიახ',
31 no: 'არა',
32 invalidWidth: 'უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',
33 invalidHeight: 'უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',
34 invalidRowSpan: 'სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.',
35 invalidColSpan: 'სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.',
36 chooseColor: 'არჩევა'
37 },
38 cellPad: 'უჯრის კიდე (padding)',
39 cellSpace: 'უჯრის სივრცე (spacing)',
40 column: {
41 menu: 'სვეტი',
42 insertBefore: 'სვეტის ჩამატება წინ',
43 insertAfter: 'სვეტის ჩამატება მერე',
44 deleteColumn: 'სვეტების წაშლა'
45 },
46 columns: 'სვეტი',
47 deleteTable: 'ცხრილის წაშლა',
48 headers: 'სათაურები',
49 headersBoth: 'ორივე',
50 headersColumn: 'პირველი სვეტი',
51 headersNone: 'არაფერი',
52 headersRow: 'პირველი სტრიქონი',
53 invalidBorder: 'ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.',
54 invalidCellPadding: 'უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.',
55 invalidCellSpacing: 'უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.',
56 invalidCols: 'სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.',
57 invalidHeight: 'ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',
58 invalidRows: 'სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.',
59 invalidWidth: 'ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',
60 menu: 'ცხრილის პარამეტრები',
61 row: {
62 menu: 'სტრიქონი',
63 insertBefore: 'სტრიქონის ჩამატება წინ',
64 insertAfter: 'სტრიქონის ჩამატება მერე',
65 deleteRow: 'სტრიქონების წაშლა'
66 },
67 rows: 'სტრიქონი',
68 summary: 'შეჯამება',
69 title: 'ცხრილის პარამეტრები',
70 toolbar: 'ცხრილი',
71 widthPc: 'პროცენტი',
72 widthPx: 'წერტილი',
73 widthUnit: 'საზომი ერთეული'
74} );
diff --git a/sources/plugins/table/lang/km.js b/sources/plugins/table/lang/km.js
new file mode 100644
index 00000000..809a8859
--- /dev/null
+++ b/sources/plugins/table/lang/km.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'km', {
6 border: 'ទំហំ​បន្ទាត់​ស៊ុម',
7 caption: 'ចំណងជើង',
8 cell: {
9 menu: 'ក្រឡា',
10 insertBefore: 'បញ្ចូល​ក្រឡា​ពីមុខ',
11 insertAfter: 'បញ្ចូល​ក្រឡា​ពី​ក្រោយ',
12 deleteCell: 'លុប​ក្រឡា',
13 merge: 'បញ្ចូល​ក្រឡា​ចូល​គ្នា',
14 mergeRight: 'បញ្ចូល​គ្នា​ខាង​ស្ដាំ',
15 mergeDown: 'បញ្ចូល​គ្នា​ចុះ​ក្រោម',
16 splitHorizontal: 'ពុះ​ក្រឡា​ផ្ដេក',
17 splitVertical: 'ពុះ​ក្រឡា​បញ្ឈរ',
18 title: 'លក្ខណៈ​ក្រឡា',
19 cellType: 'ប្រភេទ​ក្រឡា',
20 rowSpan: 'ចំនួន​ជួរ​ដេក​លាយ​ចូល​គ្នា',
21 colSpan: 'ចំនួន​ជួរ​ឈរ​លាយ​ចូល​គ្នា',
22 wordWrap: 'រុំ​ពាក្យ',
23 hAlign: 'ការ​តម្រឹម​ផ្ដេក',
24 vAlign: 'ការ​តម្រឹម​បញ្ឈរ',
25 alignBaseline: 'ខ្សែ​បន្ទាត់​គោល',
26 bgColor: 'ពណ៌​ផ្ទៃ​ក្រោយ',
27 borderColor: 'ពណ៌​បន្ទាត់​ស៊ុម',
28 data: 'ទិន្នន័យ',
29 header: 'ក្បាល',
30 yes: 'ព្រម',
31 no: 'ទេ',
32 invalidWidth: 'ទទឹង​ក្រឡា​ត្រូវ​តែ​ជា​លេខ។',
33 invalidHeight: 'កម្ពស់​ក្រឡា​ត្រូវ​តែ​ជា​លេខ។',
34 invalidRowSpan: 'ចំនួន​ជួរ​ដេក​លាយ​ចូល​គ្នា​ត្រូវ​តែ​ជា​លេខ​ទាំង​អស់។',
35 invalidColSpan: 'ចំនួន​ជួរ​ឈរ​លាយ​ចូល​គ្នា​ត្រូវ​តែ​ជា​លេខ​ទាំង​អស់។',
36 chooseColor: 'រើស'
37 },
38 cellPad: 'ចន្លោះ​ក្រឡា',
39 cellSpace: 'គម្លាត​ក្រឡា',
40 column: {
41 menu: 'ជួរ​ឈរ',
42 insertBefore: 'បញ្ចូល​ជួរ​ឈរ​ពីមុខ',
43 insertAfter: 'បញ្ចូល​ជួរ​ឈរ​ពី​ក្រោយ',
44 deleteColumn: 'លុប​ជួរ​ឈរ'
45 },
46 columns: 'ជួរឈរ',
47 deleteTable: 'លុប​តារាង',
48 headers: 'ក្បាល',
49 headersBoth: 'ទាំង​ពីរ',
50 headersColumn: 'ជួរ​ឈរ​ដំបូង',
51 headersNone: 'មិន​មាន',
52 headersRow: 'ជួរ​ដេក​ដំបូង',
53 invalidBorder: 'ទំហំ​បន្ទាត់​ស៊ុម​ត្រូវ​តែ​ជា​លេខ។',
54 invalidCellPadding: 'ចន្លោះ​ក្រឡា​ត្រូវ​តែជា​លេខ​វិជ្ជមាន។',
55 invalidCellSpacing: 'គម្លាត​ក្រឡា​ត្រូវ​តែ​ជា​លេខ​វិជ្ជមាន។',
56 invalidCols: 'ចំនួន​ជួរ​ឈរ​ត្រូវ​តែ​ជា​លេខ​ធំ​ជាង 0។',
57 invalidHeight: 'កម្ពស់​តារាង​ត្រូវ​តែ​ជា​លេខ',
58 invalidRows: 'ចំនួន​ជួរ​ដេក​ត្រូវ​តែ​ជា​លេខ​ធំ​ជាង 0។',
59 invalidWidth: 'ទទឹង​តារាង​ត្រូវ​តែ​ជា​លេខ។',
60 menu: 'លក្ខណៈ​តារាង',
61 row: {
62 menu: 'ជួរ​ដេក',
63 insertBefore: 'បញ្ចូល​ជួរ​ដេក​ពីមុខ',
64 insertAfter: 'បញ្ចូល​ជួរ​ដេក​ពី​ក្រោយ',
65 deleteRow: 'លុប​ជួរ​ដេក'
66 },
67 rows: 'ជួរ​ដេក',
68 summary: 'សេចក្តី​សង្ខេប',
69 title: 'លក្ខណៈ​តារាង',
70 toolbar: 'តារាង',
71 widthPc: 'ភាគរយ',
72 widthPx: 'ភីកសែល',
73 widthUnit: 'ឯកតា​ទទឹង'
74} );
diff --git a/sources/plugins/table/lang/ko.js b/sources/plugins/table/lang/ko.js
new file mode 100644
index 00000000..786636b8
--- /dev/null
+++ b/sources/plugins/table/lang/ko.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ko', {
6 border: '테두리 두께',
7 caption: '주석',
8 cell: {
9 menu: '셀',
10 insertBefore: '앞에 셀 삽입',
11 insertAfter: '뒤에 셀 삽입',
12 deleteCell: '셀 삭제',
13 merge: '셀 합치기',
14 mergeRight: '오른쪽 합치기',
15 mergeDown: '왼쪽 합치기',
16 splitHorizontal: '수평 나누기',
17 splitVertical: '수직 나누기',
18 title: '셀 속성',
19 cellType: '셀 종류',
20 rowSpan: '행 간격',
21 colSpan: '열 간격',
22 wordWrap: '줄 끝 단어 줄 바꿈',
23 hAlign: '가로 정렬',
24 vAlign: '세로 정렬',
25 alignBaseline: '영문 글꼴 기준선',
26 bgColor: '배경색',
27 borderColor: '테두리 색',
28 data: '자료',
29 header: '머릿칸',
30 yes: '예',
31 no: '아니오',
32 invalidWidth: '셀 너비는 숫자여야 합니다.',
33 invalidHeight: '셀 높이는 숫자여야 합니다.',
34 invalidRowSpan: '행 간격은 정수여야 합니다.',
35 invalidColSpan: '열 간격은 정수여야 합니다.',
36 chooseColor: '선택'
37 },
38 cellPad: '셀 여백',
39 cellSpace: '셀 간격',
40 column: {
41 menu: '열',
42 insertBefore: '왼쪽에 열 삽입',
43 insertAfter: '오른쪽에 열 삽입',
44 deleteColumn: '열 삭제'
45 },
46 columns: '열',
47 deleteTable: '표 삭제',
48 headers: '머릿칸',
49 headersBoth: '모두',
50 headersColumn: '첫 열',
51 headersNone: '없음',
52 headersRow: '첫 행',
53 invalidBorder: '테두리 두께는 숫자여야 합니다.',
54 invalidCellPadding: '셀 여백은 0 이상이어야 합니다.',
55 invalidCellSpacing: '셀 간격은 0 이상이어야 합니다.',
56 invalidCols: '열 번호는 0보다 커야 합니다.',
57 invalidHeight: '표 높이는 숫자여야 합니다.',
58 invalidRows: '행 번호는 0보다 커야 합니다.',
59 invalidWidth: '표의 너비는 숫자여야 합니다.',
60 menu: '표 속성',
61 row: {
62 menu: '행',
63 insertBefore: '위에 행 삽입',
64 insertAfter: '아래에 행 삽입',
65 deleteRow: '행 삭제'
66 },
67 rows: '행',
68 summary: '요약',
69 title: '표 속성',
70 toolbar: '표',
71 widthPc: '백분율',
72 widthPx: '픽셀',
73 widthUnit: '너비 단위'
74} );
diff --git a/sources/plugins/table/lang/ku.js b/sources/plugins/table/lang/ku.js
new file mode 100644
index 00000000..4710cfc9
--- /dev/null
+++ b/sources/plugins/table/lang/ku.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ku', {
6 border: 'گەورەیی پەراوێز',
7 caption: 'سەردێڕ',
8 cell: {
9 menu: 'خانه',
10 insertBefore: 'دانانی خانه لەپێش',
11 insertAfter: 'دانانی خانه لەپاش',
12 deleteCell: 'سڕینەوەی خانه',
13 merge: 'تێکەڵکردنی خانە',
14 mergeRight: 'تێکەڵکردنی لەگەڵ ڕاست',
15 mergeDown: 'تێکەڵکردنی لەگەڵ خوارەوە',
16 splitHorizontal: 'دابەشکردنی خانەی ئاسۆیی',
17 splitVertical: 'دابەشکردنی خانەی ئەستونی',
18 title: 'خاسیەتی خانه',
19 cellType: 'جۆری خانه',
20 rowSpan: 'ماوەی نێوان ڕیز',
21 colSpan: 'بستی ئەستونی',
22 wordWrap: 'پێچانەوەی وشە',
23 hAlign: 'ڕیزکردنی ئاسۆیی',
24 vAlign: 'ڕیزکردنی ئەستونی',
25 alignBaseline: 'هێڵەبنەڕەت',
26 bgColor: 'ڕەنگی پاشبنەما',
27 borderColor: 'ڕەنگی پەراوێز',
28 data: 'داتا',
29 header: 'سەرپەڕه',
30 yes: 'بەڵێ',
31 no: 'نەخێر',
32 invalidWidth: 'پانی خانه دەبێت بەتەواوی ژماره بێت.',
33 invalidHeight: 'درێژی خانه بەتەواوی دەبێت ژمارە بێت.',
34 invalidRowSpan: 'ماوەی نێوان ڕیز بەتەواوی دەبێت ژمارە بێت.',
35 invalidColSpan: 'ماوەی نێوان ئەستونی بەتەواوی دەبێت ژمارە بێت.',
36 chooseColor: 'هەڵبژێرە'
37 },
38 cellPad: 'بۆشایی ناوپۆش',
39 cellSpace: 'بۆشایی خانه',
40 column: {
41 menu: 'ئەستون',
42 insertBefore: 'دانانی ئەستون لەپێش',
43 insertAfter: 'دانانی ئەستوون لەپاش',
44 deleteColumn: 'سڕینەوەی ئەستوون'
45 },
46 columns: 'ستوونەکان',
47 deleteTable: 'سڕینەوەی خشتە',
48 headers: 'سەرپەڕه',
49 headersBoth: 'هەردووك',
50 headersColumn: 'یەکەم ئەستوون',
51 headersNone: 'هیچ',
52 headersRow: 'یەکەم ڕیز',
53 invalidBorder: 'ژمارەی پەراوێز دەبێت تەنها ژماره بێت.',
54 invalidCellPadding: 'ناوپۆشی خانه دەبێت ژمارەکی درووست بێت.',
55 invalidCellSpacing: 'بۆشایی خانه دەبێت ژمارەکی درووست بێت.',
56 invalidCols: 'ژمارەی ئەستوونی دەبێت گەورەتر بێت لەژمارەی 0.',
57 invalidHeight: 'درێژی خشته دهبێت تهنها ژماره بێت.',
58 invalidRows: 'ژمارەی ڕیز دەبێت گەورەتر بێت لەژمارەی 0.',
59 invalidWidth: 'پانی خشته دەبێت تەنها ژماره بێت.',
60 menu: 'خاسیەتی خشتە',
61 row: {
62 menu: 'ڕیز',
63 insertBefore: 'دانانی ڕیز لەپێش',
64 insertAfter: 'دانانی ڕیز لەپاش',
65 deleteRow: 'سڕینەوەی ڕیز'
66 },
67 rows: 'ڕیز',
68 summary: 'کورتە',
69 title: 'خاسیەتی خشتە',
70 toolbar: 'خشتە',
71 widthPc: 'لەسەدا',
72 widthPx: 'وێنەخاڵ - پیکسل',
73 widthUnit: 'پانی یەکە'
74} );
diff --git a/sources/plugins/table/lang/lt.js b/sources/plugins/table/lang/lt.js
new file mode 100644
index 00000000..c9d8de0e
--- /dev/null
+++ b/sources/plugins/table/lang/lt.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'lt', {
6 border: 'Rėmelio dydis',
7 caption: 'Antraštė',
8 cell: {
9 menu: 'Langelis',
10 insertBefore: 'Įterpti langelį prieš',
11 insertAfter: 'Įterpti langelį po',
12 deleteCell: 'Šalinti langelius',
13 merge: 'Sujungti langelius',
14 mergeRight: 'Sujungti su dešine',
15 mergeDown: 'Sujungti su apačia',
16 splitHorizontal: 'Skaidyti langelį horizontaliai',
17 splitVertical: 'Skaidyti langelį vertikaliai',
18 title: 'Cell nustatymai',
19 cellType: 'Cell rūšis',
20 rowSpan: 'Eilučių Span',
21 colSpan: 'Stulpelių Span',
22 wordWrap: 'Sutraukti raides',
23 hAlign: 'Horizontalus lygiavimas',
24 vAlign: 'Vertikalus lygiavimas',
25 alignBaseline: 'Apatinė linija',
26 bgColor: 'Fono spalva',
27 borderColor: 'Rėmelio spalva',
28 data: 'Data',
29 header: 'Antraštė',
30 yes: 'Taip',
31 no: 'Ne',
32 invalidWidth: 'Reikšmė turi būti skaičius.',
33 invalidHeight: 'Reikšmė turi būti skaičius.',
34 invalidRowSpan: 'Reikšmė turi būti skaičius.',
35 invalidColSpan: 'Reikšmė turi būti skaičius.',
36 chooseColor: 'Pasirinkite'
37 },
38 cellPad: 'Tarpas nuo langelio rėmo iki teksto',
39 cellSpace: 'Tarpas tarp langelių',
40 column: {
41 menu: 'Stulpelis',
42 insertBefore: 'Įterpti stulpelį prieš',
43 insertAfter: 'Įterpti stulpelį po',
44 deleteColumn: 'Šalinti stulpelius'
45 },
46 columns: 'Stulpeliai',
47 deleteTable: 'Šalinti lentelę',
48 headers: 'Antraštės',
49 headersBoth: 'Abu',
50 headersColumn: 'Pirmas stulpelis',
51 headersNone: 'Nėra',
52 headersRow: 'Pirma eilutė',
53 invalidBorder: 'Reikšmė turi būti nurodyta skaičiumi.',
54 invalidCellPadding: 'Reikšmė turi būti nurodyta skaičiumi.',
55 invalidCellSpacing: 'Reikšmė turi būti nurodyta skaičiumi.',
56 invalidCols: 'Skaičius turi būti didesnis nei 0.',
57 invalidHeight: 'Reikšmė turi būti nurodyta skaičiumi.',
58 invalidRows: 'Skaičius turi būti didesnis nei 0.',
59 invalidWidth: 'Reikšmė turi būti nurodyta skaičiumi.',
60 menu: 'Lentelės savybės',
61 row: {
62 menu: 'Eilutė',
63 insertBefore: 'Įterpti eilutę prieš',
64 insertAfter: 'Įterpti eilutę po',
65 deleteRow: 'Šalinti eilutes'
66 },
67 rows: 'Eilutės',
68 summary: 'Santrauka',
69 title: 'Lentelės savybės',
70 toolbar: 'Lentelė',
71 widthPc: 'procentais',
72 widthPx: 'taškais',
73 widthUnit: 'pločio vienetas'
74} );
diff --git a/sources/plugins/table/lang/lv.js b/sources/plugins/table/lang/lv.js
new file mode 100644
index 00000000..ca057cd5
--- /dev/null
+++ b/sources/plugins/table/lang/lv.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'lv', {
6 border: 'Rāmja izmērs',
7 caption: 'Leģenda',
8 cell: {
9 menu: 'Šūna',
10 insertBefore: 'Pievienot šūnu pirms',
11 insertAfter: 'Pievienot šūnu pēc',
12 deleteCell: 'Dzēst rūtiņas',
13 merge: 'Apvienot rūtiņas',
14 mergeRight: 'Apvieno pa labi',
15 mergeDown: 'Apvienot uz leju',
16 splitHorizontal: 'Sadalīt šūnu horizontāli',
17 splitVertical: 'Sadalīt šūnu vertikāli',
18 title: 'Šūnas uzstādījumi',
19 cellType: 'Šūnas tips',
20 rowSpan: 'Apvienotas rindas',
21 colSpan: 'Apvienotas kolonas',
22 wordWrap: 'Vārdu pārnese',
23 hAlign: 'Horizontālais novietojums',
24 vAlign: 'Vertikālais novietojums',
25 alignBaseline: 'Pamatrinda',
26 bgColor: 'Fona krāsa',
27 borderColor: 'Rāmja krāsa',
28 data: 'Dati',
29 header: 'Virsraksts',
30 yes: 'Jā',
31 no: 'Nē',
32 invalidWidth: 'Šūnas platumam jābūt skaitlim',
33 invalidHeight: 'Šūnas augstumam jābūt skaitlim',
34 invalidRowSpan: 'Apvienojamo rindu skaitam jābūt veselam skaitlim',
35 invalidColSpan: 'Apvienojamo kolonu skaitam jābūt veselam skaitlim',
36 chooseColor: 'Izvēlēties'
37 },
38 cellPad: 'Rūtiņu nobīde',
39 cellSpace: 'Rūtiņu atstatums',
40 column: {
41 menu: 'Kolonna',
42 insertBefore: 'Ievietot kolonu pirms',
43 insertAfter: 'Ievieto kolonu pēc',
44 deleteColumn: 'Dzēst kolonnas'
45 },
46 columns: 'Kolonnas',
47 deleteTable: 'Dzēst tabulu',
48 headers: 'Virsraksti',
49 headersBoth: 'Abi',
50 headersColumn: 'Pirmā kolona',
51 headersNone: 'Nekas',
52 headersRow: 'Pirmā rinda',
53 invalidBorder: 'Rāmju izmēram jābūt skaitlim',
54 invalidCellPadding: 'Šūnu atkāpēm jābūt pozitīvam skaitlim',
55 invalidCellSpacing: 'Šūnu atstarpēm jābūt pozitīvam skaitlim',
56 invalidCols: 'Kolonu skaitam jābūt lielākam par 0',
57 invalidHeight: 'Tabulas augstumam jābūt skaitlim',
58 invalidRows: 'Rindu skaitam jābūt lielākam par 0',
59 invalidWidth: 'Tabulas platumam jābūt skaitlim',
60 menu: 'Tabulas īpašības',
61 row: {
62 menu: 'Rinda',
63 insertBefore: 'Ievietot rindu pirms',
64 insertAfter: 'Ievietot rindu pēc',
65 deleteRow: 'Dzēst rindas'
66 },
67 rows: 'Rindas',
68 summary: 'Anotācija',
69 title: 'Tabulas īpašības',
70 toolbar: 'Tabula',
71 widthPc: 'procentuāli',
72 widthPx: 'pikseļos',
73 widthUnit: 'platuma mērvienība'
74} );
diff --git a/sources/plugins/table/lang/mk.js b/sources/plugins/table/lang/mk.js
new file mode 100644
index 00000000..fa6163ff
--- /dev/null
+++ b/sources/plugins/table/lang/mk.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'mk', {
6 border: 'Border size', // MISSING
7 caption: 'Caption', // MISSING
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Delete Cells',
13 merge: 'Merge Cells',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Cell padding', // MISSING
39 cellSpace: 'Cell spacing', // MISSING
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Delete Columns'
45 },
46 columns: 'Columns',
47 deleteTable: 'Delete Table', // MISSING
48 headers: 'Headers', // MISSING
49 headersBoth: 'Both', // MISSING
50 headersColumn: 'First column', // MISSING
51 headersNone: 'None',
52 headersRow: 'First Row', // MISSING
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'Table Properties', // MISSING
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Delete Rows'
66 },
67 rows: 'Rows',
68 summary: 'Summary', // MISSING
69 title: 'Table Properties', // MISSING
70 toolbar: 'Table', // MISSING
71 widthPc: 'percent', // MISSING
72 widthPx: 'pixels', // MISSING
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/mn.js b/sources/plugins/table/lang/mn.js
new file mode 100644
index 00000000..e69c6b2f
--- /dev/null
+++ b/sources/plugins/table/lang/mn.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'mn', {
6 border: 'Хүрээний хэмжээ',
7 caption: 'Тайлбар',
8 cell: {
9 menu: 'Нүх/зай',
10 insertBefore: 'Нүх/зай өмнө нь оруулах',
11 insertAfter: 'Нүх/зай дараа нь оруулах',
12 deleteCell: 'Нүх устгах',
13 merge: 'Нүх нэгтэх',
14 mergeRight: 'Баруун тийш нэгтгэх',
15 mergeDown: 'Доош нэгтгэх',
16 splitHorizontal: 'Нүх/зайг босоогоор нь тусгаарлах',
17 splitVertical: 'Нүх/зайг хөндлөнгөөр нь тусгаарлах',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Хэвтээд тэгшлэх арга',
24 vAlign: 'Босоод тэгшлэх арга',
25 alignBaseline: 'Baseline',
26 bgColor: 'Дэвсгэр өнгө',
27 borderColor: 'Хүрээний өнгө',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Тийм',
31 no: 'Үгүй',
32 invalidWidth: 'Нүдний өргөн нь тоо байх ёстой.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Сонгох'
37 },
38 cellPad: 'Нүх доторлох(padding)',
39 cellSpace: 'Нүх хоорондын зай (spacing)',
40 column: {
41 menu: 'Багана',
42 insertBefore: 'Багана өмнө нь оруулах',
43 insertAfter: 'Багана дараа нь оруулах',
44 deleteColumn: 'Багана устгах'
45 },
46 columns: 'Багана',
47 deleteTable: 'Хүснэгт устгах',
48 headers: 'Headers', // MISSING
49 headersBoth: 'Both', // MISSING
50 headersColumn: 'First column', // MISSING
51 headersNone: 'None',
52 headersRow: 'First Row', // MISSING
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Хүснэгтийн өргөн нь тоо байх ёстой.',
60 menu: 'Хүснэгт',
61 row: {
62 menu: 'Мөр',
63 insertBefore: 'Мөр өмнө нь оруулах',
64 insertAfter: 'Мөр дараа нь оруулах',
65 deleteRow: 'Мөр устгах'
66 },
67 rows: 'Мөр',
68 summary: 'Тайлбар',
69 title: 'Хүснэгт',
70 toolbar: 'Хүснэгт',
71 widthPc: 'хувь',
72 widthPx: 'цэг',
73 widthUnit: 'өргөний нэгж'
74} );
diff --git a/sources/plugins/table/lang/ms.js b/sources/plugins/table/lang/ms.js
new file mode 100644
index 00000000..c51cdc4d
--- /dev/null
+++ b/sources/plugins/table/lang/ms.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ms', {
6 border: 'Saiz Border',
7 caption: 'Keterangan',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Buangkan Sel-sel',
13 merge: 'Cantumkan Sel-sel',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Tambahan Ruang Sel',
39 cellSpace: 'Ruangan Antara Sel',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Buangkan Lajur'
45 },
46 columns: 'Jaluran',
47 deleteTable: 'Delete Table', // MISSING
48 headers: 'Headers', // MISSING
49 headersBoth: 'Both', // MISSING
50 headersColumn: 'First column', // MISSING
51 headersNone: 'None',
52 headersRow: 'First Row', // MISSING
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'Ciri-ciri Jadual',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Buangkan Baris'
66 },
67 rows: 'Barisan',
68 summary: 'Summary', // MISSING
69 title: 'Ciri-ciri Jadual',
70 toolbar: 'Jadual',
71 widthPc: 'peratus',
72 widthPx: 'piksel-piksel',
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/nb.js b/sources/plugins/table/lang/nb.js
new file mode 100644
index 00000000..3fd81f0b
--- /dev/null
+++ b/sources/plugins/table/lang/nb.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'nb', {
6 border: 'Rammestørrelse',
7 caption: 'Tittel',
8 cell: {
9 menu: 'Celle',
10 insertBefore: 'Sett inn celle før',
11 insertAfter: 'Sett inn celle etter',
12 deleteCell: 'Slett celler',
13 merge: 'Slå sammen celler',
14 mergeRight: 'Slå sammen høyre',
15 mergeDown: 'Slå sammen ned',
16 splitHorizontal: 'Del celle horisontalt',
17 splitVertical: 'Del celle vertikalt',
18 title: 'Celleegenskaper',
19 cellType: 'Celletype',
20 rowSpan: 'Radspenn',
21 colSpan: 'Kolonnespenn',
22 wordWrap: 'Tekstbrytning',
23 hAlign: 'Horisontal justering',
24 vAlign: 'Vertikal justering',
25 alignBaseline: 'Grunnlinje',
26 bgColor: 'Bakgrunnsfarge',
27 borderColor: 'Rammefarge',
28 data: 'Data',
29 header: 'Overskrift',
30 yes: 'Ja',
31 no: 'Nei',
32 invalidWidth: 'Cellebredde må være et tall.',
33 invalidHeight: 'Cellehøyde må være et tall.',
34 invalidRowSpan: 'Radspenn må være et heltall.',
35 invalidColSpan: 'Kolonnespenn må være et heltall.',
36 chooseColor: 'Velg'
37 },
38 cellPad: 'Cellepolstring',
39 cellSpace: 'Cellemarg',
40 column: {
41 menu: 'Kolonne',
42 insertBefore: 'Sett inn kolonne før',
43 insertAfter: 'Sett inn kolonne etter',
44 deleteColumn: 'Slett kolonner'
45 },
46 columns: 'Kolonner',
47 deleteTable: 'Slett tabell',
48 headers: 'Overskrifter',
49 headersBoth: 'Begge',
50 headersColumn: 'Første kolonne',
51 headersNone: 'Ingen',
52 headersRow: 'Første rad',
53 invalidBorder: 'Rammestørrelse må være et tall.',
54 invalidCellPadding: 'Cellepolstring må være et positivt tall.',
55 invalidCellSpacing: 'Cellemarg må være et positivt tall.',
56 invalidCols: 'Antall kolonner må være et tall større enn 0.',
57 invalidHeight: 'Tabellhøyde må være et tall.',
58 invalidRows: 'Antall rader må være et tall større enn 0.',
59 invalidWidth: 'Tabellbredde må være et tall.',
60 menu: 'Egenskaper for tabell',
61 row: {
62 menu: 'Rader',
63 insertBefore: 'Sett inn rad før',
64 insertAfter: 'Sett inn rad etter',
65 deleteRow: 'Slett rader'
66 },
67 rows: 'Rader',
68 summary: 'Sammendrag',
69 title: 'Egenskaper for tabell',
70 toolbar: 'Tabell',
71 widthPc: 'prosent',
72 widthPx: 'piksler',
73 widthUnit: 'Bredde-enhet'
74} );
diff --git a/sources/plugins/table/lang/nl.js b/sources/plugins/table/lang/nl.js
new file mode 100644
index 00000000..87594933
--- /dev/null
+++ b/sources/plugins/table/lang/nl.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'nl', {
6 border: 'Randdikte',
7 caption: 'Onderschrift',
8 cell: {
9 menu: 'Cel',
10 insertBefore: 'Voeg cel in voor',
11 insertAfter: 'Voeg cel in na',
12 deleteCell: 'Cellen verwijderen',
13 merge: 'Cellen samenvoegen',
14 mergeRight: 'Voeg samen naar rechts',
15 mergeDown: 'Voeg samen naar beneden',
16 splitHorizontal: 'Splits cel horizontaal',
17 splitVertical: 'Splits cel vertikaal',
18 title: 'Celeigenschappen',
19 cellType: 'Celtype',
20 rowSpan: 'Rijen samenvoegen',
21 colSpan: 'Kolommen samenvoegen',
22 wordWrap: 'Automatische terugloop',
23 hAlign: 'Horizontale uitlijning',
24 vAlign: 'Verticale uitlijning',
25 alignBaseline: 'Tekstregel',
26 bgColor: 'Achtergrondkleur',
27 borderColor: 'Randkleur',
28 data: 'Gegevens',
29 header: 'Kop',
30 yes: 'Ja',
31 no: 'Nee',
32 invalidWidth: 'De celbreedte moet een getal zijn.',
33 invalidHeight: 'De celhoogte moet een getal zijn.',
34 invalidRowSpan: 'Rijen samenvoegen moet een heel getal zijn.',
35 invalidColSpan: 'Kolommen samenvoegen moet een heel getal zijn.',
36 chooseColor: 'Kies'
37 },
38 cellPad: 'Celopvulling',
39 cellSpace: 'Celafstand',
40 column: {
41 menu: 'Kolom',
42 insertBefore: 'Voeg kolom in voor',
43 insertAfter: 'Voeg kolom in na',
44 deleteColumn: 'Kolommen verwijderen'
45 },
46 columns: 'Kolommen',
47 deleteTable: 'Tabel verwijderen',
48 headers: 'Koppen',
49 headersBoth: 'Beide',
50 headersColumn: 'Eerste kolom',
51 headersNone: 'Geen',
52 headersRow: 'Eerste rij',
53 invalidBorder: 'De randdikte moet een getal zijn.',
54 invalidCellPadding: 'Celopvulling moet een getal zijn.',
55 invalidCellSpacing: 'Celafstand moet een getal zijn.',
56 invalidCols: 'Het aantal kolommen moet een getal zijn groter dan 0.',
57 invalidHeight: 'De tabelhoogte moet een getal zijn.',
58 invalidRows: 'Het aantal rijen moet een getal zijn groter dan 0.',
59 invalidWidth: 'De tabelbreedte moet een getal zijn.',
60 menu: 'Tabeleigenschappen',
61 row: {
62 menu: 'Rij',
63 insertBefore: 'Voeg rij in voor',
64 insertAfter: 'Voeg rij in na',
65 deleteRow: 'Rijen verwijderen'
66 },
67 rows: 'Rijen',
68 summary: 'Samenvatting',
69 title: 'Tabeleigenschappen',
70 toolbar: 'Tabel',
71 widthPc: 'procent',
72 widthPx: 'pixels',
73 widthUnit: 'eenheid breedte'
74} );
diff --git a/sources/plugins/table/lang/no.js b/sources/plugins/table/lang/no.js
new file mode 100644
index 00000000..c9e4987f
--- /dev/null
+++ b/sources/plugins/table/lang/no.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'no', {
6 border: 'Rammestørrelse',
7 caption: 'Tittel',
8 cell: {
9 menu: 'Celle',
10 insertBefore: 'Sett inn celle før',
11 insertAfter: 'Sett inn celle etter',
12 deleteCell: 'Slett celler',
13 merge: 'Slå sammen celler',
14 mergeRight: 'Slå sammen høyre',
15 mergeDown: 'Slå sammen ned',
16 splitHorizontal: 'Del celle horisontalt',
17 splitVertical: 'Del celle vertikalt',
18 title: 'Celleegenskaper',
19 cellType: 'Celletype',
20 rowSpan: 'Radspenn',
21 colSpan: 'Kolonnespenn',
22 wordWrap: 'Tekstbrytning',
23 hAlign: 'Horisontal justering',
24 vAlign: 'Vertikal justering',
25 alignBaseline: 'Grunnlinje',
26 bgColor: 'Bakgrunnsfarge',
27 borderColor: 'Rammefarge',
28 data: 'Data',
29 header: 'Overskrift',
30 yes: 'Ja',
31 no: 'Nei',
32 invalidWidth: 'Cellebredde må være et tall.',
33 invalidHeight: 'Cellehøyde må være et tall.',
34 invalidRowSpan: 'Radspenn må være et heltall.',
35 invalidColSpan: 'Kolonnespenn må være et heltall.',
36 chooseColor: 'Velg'
37 },
38 cellPad: 'Cellepolstring',
39 cellSpace: 'Cellemarg',
40 column: {
41 menu: 'Kolonne',
42 insertBefore: 'Sett inn kolonne før',
43 insertAfter: 'Sett inn kolonne etter',
44 deleteColumn: 'Slett kolonner'
45 },
46 columns: 'Kolonner',
47 deleteTable: 'Slett tabell',
48 headers: 'Overskrifter',
49 headersBoth: 'Begge',
50 headersColumn: 'Første kolonne',
51 headersNone: 'Ingen',
52 headersRow: 'Første rad',
53 invalidBorder: 'Rammestørrelse må være et tall.',
54 invalidCellPadding: 'Cellepolstring må være et positivt tall.',
55 invalidCellSpacing: 'Cellemarg må være et positivt tall.',
56 invalidCols: 'Antall kolonner må være et tall større enn 0.',
57 invalidHeight: 'Tabellhøyde må være et tall.',
58 invalidRows: 'Antall rader må være et tall større enn 0.',
59 invalidWidth: 'Tabellbredde må være et tall.',
60 menu: 'Egenskaper for tabell',
61 row: {
62 menu: 'Rader',
63 insertBefore: 'Sett inn rad før',
64 insertAfter: 'Sett inn rad etter',
65 deleteRow: 'Slett rader'
66 },
67 rows: 'Rader',
68 summary: 'Sammendrag',
69 title: 'Egenskaper for tabell',
70 toolbar: 'Tabell',
71 widthPc: 'prosent',
72 widthPx: 'piksler',
73 widthUnit: 'Bredde-enhet'
74} );
diff --git a/sources/plugins/table/lang/pl.js b/sources/plugins/table/lang/pl.js
new file mode 100644
index 00000000..2b46c201
--- /dev/null
+++ b/sources/plugins/table/lang/pl.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'pl', {
6 border: 'Grubość obramowania',
7 caption: 'Tytuł',
8 cell: {
9 menu: 'Komórka',
10 insertBefore: 'Wstaw komórkę z lewej',
11 insertAfter: 'Wstaw komórkę z prawej',
12 deleteCell: 'Usuń komórki',
13 merge: 'Połącz komórki',
14 mergeRight: 'Połącz z komórką z prawej',
15 mergeDown: 'Połącz z komórką poniżej',
16 splitHorizontal: 'Podziel komórkę poziomo',
17 splitVertical: 'Podziel komórkę pionowo',
18 title: 'Właściwości komórki',
19 cellType: 'Typ komórki',
20 rowSpan: 'Scalenie wierszy',
21 colSpan: 'Scalenie komórek',
22 wordWrap: 'Zawijanie słów',
23 hAlign: 'Wyrównanie poziome',
24 vAlign: 'Wyrównanie pionowe',
25 alignBaseline: 'Linia bazowa',
26 bgColor: 'Kolor tła',
27 borderColor: 'Kolor obramowania',
28 data: 'Dane',
29 header: 'Nagłówek',
30 yes: 'Tak',
31 no: 'Nie',
32 invalidWidth: 'Szerokość komórki musi być liczbą.',
33 invalidHeight: 'Wysokość komórki musi być liczbą.',
34 invalidRowSpan: 'Scalenie wierszy musi być liczbą całkowitą.',
35 invalidColSpan: 'Scalenie komórek musi być liczbą całkowitą.',
36 chooseColor: 'Wybierz'
37 },
38 cellPad: 'Dopełnienie komórek',
39 cellSpace: 'Odstęp pomiędzy komórkami',
40 column: {
41 menu: 'Kolumna',
42 insertBefore: 'Wstaw kolumnę z lewej',
43 insertAfter: 'Wstaw kolumnę z prawej',
44 deleteColumn: 'Usuń kolumny'
45 },
46 columns: 'Liczba kolumn',
47 deleteTable: 'Usuń tabelę',
48 headers: 'Nagłówki',
49 headersBoth: 'Oba',
50 headersColumn: 'Pierwsza kolumna',
51 headersNone: 'Brak',
52 headersRow: 'Pierwszy wiersz',
53 invalidBorder: 'Wartość obramowania musi być liczbą.',
54 invalidCellPadding: 'Dopełnienie komórek musi być liczbą dodatnią.',
55 invalidCellSpacing: 'Odstęp pomiędzy komórkami musi być liczbą dodatnią.',
56 invalidCols: 'Liczba kolumn musi być większa niż 0.',
57 invalidHeight: 'Wysokość tabeli musi być liczbą.',
58 invalidRows: 'Liczba wierszy musi być większa niż 0.',
59 invalidWidth: 'Szerokość tabeli musi być liczbą.',
60 menu: 'Właściwości tabeli',
61 row: {
62 menu: 'Wiersz',
63 insertBefore: 'Wstaw wiersz powyżej',
64 insertAfter: 'Wstaw wiersz poniżej',
65 deleteRow: 'Usuń wiersze'
66 },
67 rows: 'Liczba wierszy',
68 summary: 'Podsumowanie',
69 title: 'Właściwości tabeli',
70 toolbar: 'Tabela',
71 widthPc: '%',
72 widthPx: 'piksele',
73 widthUnit: 'jednostka szerokości'
74} );
diff --git a/sources/plugins/table/lang/pt-br.js b/sources/plugins/table/lang/pt-br.js
new file mode 100644
index 00000000..4fccc79c
--- /dev/null
+++ b/sources/plugins/table/lang/pt-br.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'pt-br', {
6 border: 'Borda',
7 caption: 'Legenda',
8 cell: {
9 menu: 'Célula',
10 insertBefore: 'Inserir célula a esquerda',
11 insertAfter: 'Inserir célula a direita',
12 deleteCell: 'Remover Células',
13 merge: 'Mesclar Células',
14 mergeRight: 'Mesclar com célula a direita',
15 mergeDown: 'Mesclar com célula abaixo',
16 splitHorizontal: 'Dividir célula horizontalmente',
17 splitVertical: 'Dividir célula verticalmente',
18 title: 'Propriedades da célula',
19 cellType: 'Tipo de célula',
20 rowSpan: 'Linhas cobertas',
21 colSpan: 'Colunas cobertas',
22 wordWrap: 'Quebra de palavra',
23 hAlign: 'Alinhamento horizontal',
24 vAlign: 'Alinhamento vertical',
25 alignBaseline: 'Patamar de alinhamento',
26 bgColor: 'Cor de fundo',
27 borderColor: 'Cor das bordas',
28 data: 'Dados',
29 header: 'Cabeçalho',
30 yes: 'Sim',
31 no: 'Não',
32 invalidWidth: 'A largura da célula tem que ser um número.',
33 invalidHeight: 'A altura da célula tem que ser um número.',
34 invalidRowSpan: 'Linhas cobertas tem que ser um número inteiro.',
35 invalidColSpan: 'Colunas cobertas tem que ser um número inteiro.',
36 chooseColor: 'Escolher'
37 },
38 cellPad: 'Margem interna',
39 cellSpace: 'Espaçamento',
40 column: {
41 menu: 'Coluna',
42 insertBefore: 'Inserir coluna a esquerda',
43 insertAfter: 'Inserir coluna a direita',
44 deleteColumn: 'Remover Colunas'
45 },
46 columns: 'Colunas',
47 deleteTable: 'Apagar Tabela',
48 headers: 'Cabeçalho',
49 headersBoth: 'Ambos',
50 headersColumn: 'Primeira coluna',
51 headersNone: 'Nenhum',
52 headersRow: 'Primeira linha',
53 invalidBorder: 'O tamanho da borda tem que ser um número.',
54 invalidCellPadding: 'A margem interna das células tem que ser um número.',
55 invalidCellSpacing: 'O espaçamento das células tem que ser um número.',
56 invalidCols: 'O número de colunas tem que ser um número maior que 0.',
57 invalidHeight: 'A altura da tabela tem que ser um número.',
58 invalidRows: 'O número de linhas tem que ser um número maior que 0.',
59 invalidWidth: 'A largura da tabela tem que ser um número.',
60 menu: 'Formatar Tabela',
61 row: {
62 menu: 'Linha',
63 insertBefore: 'Inserir linha acima',
64 insertAfter: 'Inserir linha abaixo',
65 deleteRow: 'Remover Linhas'
66 },
67 rows: 'Linhas',
68 summary: 'Resumo',
69 title: 'Formatar Tabela',
70 toolbar: 'Tabela',
71 widthPc: '%',
72 widthPx: 'pixels',
73 widthUnit: 'unidade largura'
74} );
diff --git a/sources/plugins/table/lang/pt.js b/sources/plugins/table/lang/pt.js
new file mode 100644
index 00000000..ac5cd6d9
--- /dev/null
+++ b/sources/plugins/table/lang/pt.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'pt', {
6 border: 'Tamanho do contorno',
7 caption: 'Legenda',
8 cell: {
9 menu: 'Célula',
10 insertBefore: 'Inserir célula antes',
11 insertAfter: 'Inserir célula depois',
12 deleteCell: 'Apagar Células',
13 merge: 'Unir Células',
14 mergeRight: 'Unir à Direita',
15 mergeDown: 'Fundir abaixo',
16 splitHorizontal: 'Dividir célula horizontalmente',
17 splitVertical: 'Dividir célula verticalmente',
18 title: 'Propriedades da célula',
19 cellType: 'Tipo de célula',
20 rowSpan: 'Filas na Célula',
21 colSpan: 'Colunas na Célula',
22 wordWrap: 'Moldar texto',
23 hAlign: 'Alinhamento Horizontal',
24 vAlign: 'Alinhamento Vertical',
25 alignBaseline: 'Base',
26 bgColor: 'Cor de Fundo',
27 borderColor: 'Cor da Margem',
28 data: 'Dados',
29 header: 'Cabeçalho',
30 yes: 'Sim',
31 no: 'Não',
32 invalidWidth: 'A largura da célula deve ser um número.',
33 invalidHeight: 'A altura da célula deve ser um número.',
34 invalidRowSpan: 'As filas da célula deve ter um número inteiro.',
35 invalidColSpan: 'As colunas da célula deve ter um número inteiro.',
36 chooseColor: 'Escolher'
37 },
38 cellPad: 'Espaço interior',
39 cellSpace: 'Espaçamento de célula',
40 column: {
41 menu: 'Coluna',
42 insertBefore: 'Inserir Coluna Antes',
43 insertAfter: 'Inserir coluna depois',
44 deleteColumn: 'Apagar colunas'
45 },
46 columns: 'Colunas',
47 deleteTable: 'Apagar tabela',
48 headers: 'Cabeçalhos',
49 headersBoth: 'Ambos',
50 headersColumn: 'Primeira coluna',
51 headersNone: 'Nenhum',
52 headersRow: 'Primeira linha',
53 invalidBorder: 'O tamanho da margem tem de ser um número.',
54 invalidCellPadding: 'A criação do espaço na célula deve ser um número positivo.',
55 invalidCellSpacing: 'O espaçamento da célula deve ser um número positivo.',
56 invalidCols: 'O número de colunas tem de ser um número maior que 0.',
57 invalidHeight: 'A altura da tabela tem de ser um número.',
58 invalidRows: 'O número de linhas tem de ser maior que 0.',
59 invalidWidth: 'A largura da tabela tem de ser um número.',
60 menu: 'Propriedades da Tabela',
61 row: {
62 menu: 'Linha',
63 insertBefore: 'Inserir linha antes',
64 insertAfter: 'Inserir linha depois',
65 deleteRow: 'Apagar linhas'
66 },
67 rows: 'Linhas',
68 summary: 'Sumário',
69 title: 'Propriedades da Tabela',
70 toolbar: 'Tabela',
71 widthPc: 'percentagem',
72 widthPx: 'pontos',
73 widthUnit: 'unidade da largura'
74} );
diff --git a/sources/plugins/table/lang/ro.js b/sources/plugins/table/lang/ro.js
new file mode 100644
index 00000000..58604f16
--- /dev/null
+++ b/sources/plugins/table/lang/ro.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ro', {
6 border: 'Mărimea marginii',
7 caption: 'Titlu (Caption)',
8 cell: {
9 menu: 'Celulă',
10 insertBefore: 'Inserează celulă înainte',
11 insertAfter: 'Inserează celulă după',
12 deleteCell: 'Şterge celule',
13 merge: 'Uneşte celule',
14 mergeRight: 'Uneşte la dreapta',
15 mergeDown: 'Uneşte jos',
16 splitHorizontal: 'Împarte celula pe orizontală',
17 splitVertical: 'Împarte celula pe verticală',
18 title: 'Proprietăți celulă',
19 cellType: 'Tipul celulei',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Aliniament orizontal',
24 vAlign: 'Aliniament vertical',
25 alignBaseline: 'Baseline',
26 bgColor: 'Culoare fundal',
27 borderColor: 'Culoare bordură',
28 data: 'Data',
29 header: 'Antet',
30 yes: 'Da',
31 no: 'Nu',
32 invalidWidth: 'Lățimea celulei trebuie să fie un număr.',
33 invalidHeight: 'Înălțimea celulei trebuie să fie un număr.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Alege'
37 },
38 cellPad: 'Spaţiu în cadrul celulei',
39 cellSpace: 'Spaţiu între celule',
40 column: {
41 menu: 'Coloană',
42 insertBefore: 'Inserează coloană înainte',
43 insertAfter: 'Inserează coloană după',
44 deleteColumn: 'Şterge celule'
45 },
46 columns: 'Coloane',
47 deleteTable: 'Şterge tabel',
48 headers: 'Antente',
49 headersBoth: 'Ambele',
50 headersColumn: 'Prima coloană',
51 headersNone: 'Nimic',
52 headersRow: 'Primul rând',
53 invalidBorder: 'Dimensiunea bordurii trebuie să aibe un număr.',
54 invalidCellPadding: 'Spațierea celulei trebuie sa fie un număr pozitiv',
55 invalidCellSpacing: 'Spațierea celului trebuie să fie un număr pozitiv.',
56 invalidCols: 'Numărul coloanelor trebuie să fie mai mare decât 0.',
57 invalidHeight: 'Inaltimea celulei trebuie sa fie un numar.',
58 invalidRows: 'Numărul rândurilor trebuie să fie mai mare decât 0.',
59 invalidWidth: 'Lățimea tabelului trebuie să fie un număr.',
60 menu: 'Proprietăţile tabelului',
61 row: {
62 menu: 'Rând',
63 insertBefore: 'Inserează rând înainte',
64 insertAfter: 'Inserează rând după',
65 deleteRow: 'Şterge rânduri'
66 },
67 rows: 'Rânduri',
68 summary: 'Rezumat',
69 title: 'Proprietăţile tabelului',
70 toolbar: 'Tabel',
71 widthPc: 'procente',
72 widthPx: 'pixeli',
73 widthUnit: 'unitate lățime'
74} );
diff --git a/sources/plugins/table/lang/ru.js b/sources/plugins/table/lang/ru.js
new file mode 100644
index 00000000..d5dae52c
--- /dev/null
+++ b/sources/plugins/table/lang/ru.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ru', {
6 border: 'Размер границ',
7 caption: 'Заголовок',
8 cell: {
9 menu: 'Ячейка',
10 insertBefore: 'Вставить ячейку слева',
11 insertAfter: 'Вставить ячейку справа',
12 deleteCell: 'Удалить ячейки',
13 merge: 'Объединить ячейки',
14 mergeRight: 'Объединить с правой',
15 mergeDown: 'Объединить с нижней',
16 splitHorizontal: 'Разделить ячейку по горизонтали',
17 splitVertical: 'Разделить ячейку по вертикали',
18 title: 'Свойства ячейки',
19 cellType: 'Тип ячейки',
20 rowSpan: 'Объединяет строк',
21 colSpan: 'Объединяет колонок',
22 wordWrap: 'Перенос по словам',
23 hAlign: 'Горизонтальное выравнивание',
24 vAlign: 'Вертикальное выравнивание',
25 alignBaseline: 'По базовой линии',
26 bgColor: 'Цвет фона',
27 borderColor: 'Цвет границ',
28 data: 'Данные',
29 header: 'Заголовок',
30 yes: 'Да',
31 no: 'Нет',
32 invalidWidth: 'Ширина ячейки должна быть числом.',
33 invalidHeight: 'Высота ячейки должна быть числом.',
34 invalidRowSpan: 'Количество объединяемых строк должно быть задано числом.',
35 invalidColSpan: 'Количество объединяемых колонок должно быть задано числом.',
36 chooseColor: 'Выберите'
37 },
38 cellPad: 'Внутренний отступ ячеек',
39 cellSpace: 'Внешний отступ ячеек',
40 column: {
41 menu: 'Колонка',
42 insertBefore: 'Вставить колонку слева',
43 insertAfter: 'Вставить колонку справа',
44 deleteColumn: 'Удалить колонки'
45 },
46 columns: 'Колонки',
47 deleteTable: 'Удалить таблицу',
48 headers: 'Заголовки',
49 headersBoth: 'Сверху и слева',
50 headersColumn: 'Левая колонка',
51 headersNone: 'Без заголовков',
52 headersRow: 'Верхняя строка',
53 invalidBorder: 'Размер границ должен быть числом.',
54 invalidCellPadding: 'Внутренний отступ ячеек (cellpadding) должен быть числом.',
55 invalidCellSpacing: 'Внешний отступ ячеек (cellspacing) должен быть числом.',
56 invalidCols: 'Количество столбцов должно быть больше 0.',
57 invalidHeight: 'Высота таблицы должна быть числом.',
58 invalidRows: 'Количество строк должно быть больше 0.',
59 invalidWidth: 'Ширина таблицы должна быть числом.',
60 menu: 'Свойства таблицы',
61 row: {
62 menu: 'Строка',
63 insertBefore: 'Вставить строку сверху',
64 insertAfter: 'Вставить строку снизу',
65 deleteRow: 'Удалить строки'
66 },
67 rows: 'Строки',
68 summary: 'Итоги',
69 title: 'Свойства таблицы',
70 toolbar: 'Таблица',
71 widthPc: 'процентов',
72 widthPx: 'пикселей',
73 widthUnit: 'единица измерения'
74} );
diff --git a/sources/plugins/table/lang/si.js b/sources/plugins/table/lang/si.js
new file mode 100644
index 00000000..4bca32b1
--- /dev/null
+++ b/sources/plugins/table/lang/si.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'si', {
6 border: 'සීමාවවල විශාලත්වය',
7 caption: 'Caption', // MISSING
8 cell: {
9 menu: 'කොටුව',
10 insertBefore: 'පෙර කොටුවක් ඇතුල්කිරිම',
11 insertAfter: 'පසුව කොටුවක් ඇතුලත් ',
12 deleteCell: 'කොටුව මැකීම',
13 merge: 'කොටු එකට යාකිරිම',
14 mergeRight: 'දකුණට ',
15 mergeDown: 'පහලට ',
16 splitHorizontal: 'තිරස්ව කොටු පැතිරීම',
17 splitVertical: 'සිරස්ව කොටු පැතිරීම',
18 title: 'කොටු ',
19 cellType: 'කොටු වර්ගය',
20 rowSpan: 'පේළි පළල',
21 colSpan: 'සිරස් පළල',
22 wordWrap: 'වචන ගැලපුම',
23 hAlign: 'තිරස්ව ',
24 vAlign: 'සිරස්ව ',
25 alignBaseline: 'පාද රේඛාව',
26 bgColor: 'පසුබිම් වර්ණය',
27 borderColor: 'මායිම් ',
28 data: 'Data', // MISSING
29 header: 'ශීර්ෂක',
30 yes: 'ඔව්',
31 no: 'නැත',
32 invalidWidth: 'කොටු පළල සංඛ්‍ය්ත්මක වටිනාකමක් විය යුතුය',
33 invalidHeight: 'කොටු උස සංඛ්‍ය්ත්මක වටිනාකමක් විය යුතුය',
34 invalidRowSpan: 'Rows span must be a whole number.', // MISSING
35 invalidColSpan: 'Columns span must be a whole number.', // MISSING
36 chooseColor: 'තෝරන්න'
37 },
38 cellPad: 'Cell padding', // MISSING
39 cellSpace: 'Cell spacing', // MISSING
40 column: {
41 menu: 'Column', // MISSING
42 insertBefore: 'Insert Column Before', // MISSING
43 insertAfter: 'Insert Column After', // MISSING
44 deleteColumn: 'Delete Columns' // MISSING
45 },
46 columns: 'සිරස් ',
47 deleteTable: 'වගුව මකන්න',
48 headers: 'ශීර්ෂක',
49 headersBoth: 'දෙකම',
50 headersColumn: 'පළමූ සිරස් තීරුව',
51 headersNone: 'කිසිවක්ම නොවේ',
52 headersRow: 'පළමූ පේළිය',
53 invalidBorder: 'Border size must be a number.', // MISSING
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Table height must be a number.', // MISSING
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Table width must be a number.', // MISSING
60 menu: 'Table Properties', // MISSING
61 row: {
62 menu: 'Row', // MISSING
63 insertBefore: 'Insert Row Before', // MISSING
64 insertAfter: 'Insert Row After', // MISSING
65 deleteRow: 'Delete Rows' // MISSING
66 },
67 rows: 'Rows', // MISSING
68 summary: 'Summary', // MISSING
69 title: 'Table Properties', // MISSING
70 toolbar: 'Table', // MISSING
71 widthPc: 'percent', // MISSING
72 widthPx: 'pixels', // MISSING
73 widthUnit: 'width unit' // MISSING
74} );
diff --git a/sources/plugins/table/lang/sk.js b/sources/plugins/table/lang/sk.js
new file mode 100644
index 00000000..290f653e
--- /dev/null
+++ b/sources/plugins/table/lang/sk.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'sk', {
6 border: 'Šírka rámu (border)',
7 caption: 'Popis',
8 cell: {
9 menu: 'Bunka',
10 insertBefore: 'Vložiť bunku pred',
11 insertAfter: 'Vložiť bunku za',
12 deleteCell: 'Vymazať bunky',
13 merge: 'Zlúčiť bunky',
14 mergeRight: 'Zlúčiť doprava',
15 mergeDown: 'Zlúčiť dole',
16 splitHorizontal: 'Rozdeliť bunky horizontálne',
17 splitVertical: 'Rozdeliť bunky vertikálne',
18 title: 'Vlastnosti bunky',
19 cellType: 'Typ bunky',
20 rowSpan: 'Rozsah riadkov',
21 colSpan: 'Rozsah stĺpcov',
22 wordWrap: 'Zalomovanie riadkov',
23 hAlign: 'Horizontálne zarovnanie',
24 vAlign: 'Vertikálne zarovnanie',
25 alignBaseline: 'Základná čiara (baseline)',
26 bgColor: 'Farba pozadia',
27 borderColor: 'Farba rámu',
28 data: 'Dáta',
29 header: 'Hlavička',
30 yes: 'Áno',
31 no: 'Nie',
32 invalidWidth: 'Šírka bunky musí byť číslo.',
33 invalidHeight: 'Výška bunky musí byť číslo.',
34 invalidRowSpan: 'Rozsah riadkov musí byť celé číslo.',
35 invalidColSpan: 'Rozsah stĺpcov musí byť celé číslo.',
36 chooseColor: 'Vybrať'
37 },
38 cellPad: 'Odsadenie obsahu (cell padding)',
39 cellSpace: 'Vzdialenosť buniek (cell spacing)',
40 column: {
41 menu: 'Stĺpec',
42 insertBefore: 'Vložiť stĺpec pred',
43 insertAfter: 'Vložiť stĺpec po',
44 deleteColumn: 'Zmazať stĺpce'
45 },
46 columns: 'Stĺpce',
47 deleteTable: 'Vymazať tabuľku',
48 headers: 'Hlavička',
49 headersBoth: 'Obe',
50 headersColumn: 'Prvý stĺpec',
51 headersNone: 'Žiadne',
52 headersRow: 'Prvý riadok',
53 invalidBorder: 'Širka rámu musí byť číslo.',
54 invalidCellPadding: 'Odsadenie v bunkách (cell padding) musí byť kladné číslo.',
55 invalidCellSpacing: 'Medzera mädzi bunkami (cell spacing) musí byť kladné číslo.',
56 invalidCols: 'Počet stĺpcov musí byť číslo väčšie ako 0.',
57 invalidHeight: 'Výška tabuľky musí byť číslo.',
58 invalidRows: 'Počet riadkov musí byť číslo väčšie ako 0.',
59 invalidWidth: 'Širka tabuľky musí byť číslo.',
60 menu: 'Vlastnosti tabuľky',
61 row: {
62 menu: 'Riadok',
63 insertBefore: 'Vložiť riadok pred',
64 insertAfter: 'Vložiť riadok po',
65 deleteRow: 'Vymazať riadky'
66 },
67 rows: 'Riadky',
68 summary: 'Prehľad',
69 title: 'Vlastnosti tabuľky',
70 toolbar: 'Tabuľka',
71 widthPc: 'percent',
72 widthPx: 'pixelov',
73 widthUnit: 'jednotka šírky'
74} );
diff --git a/sources/plugins/table/lang/sl.js b/sources/plugins/table/lang/sl.js
new file mode 100644
index 00000000..9e8a57f2
--- /dev/null
+++ b/sources/plugins/table/lang/sl.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'sl', {
6 border: 'Velikost obrobe',
7 caption: 'Naslov',
8 cell: {
9 menu: 'Celica',
10 insertBefore: 'Vstavi celico pred',
11 insertAfter: 'Vstavi celico za',
12 deleteCell: 'Izbriši celice',
13 merge: 'Združi celice',
14 mergeRight: 'Združi desno',
15 mergeDown: 'Druži navzdol',
16 splitHorizontal: 'Razdeli celico vodoravno',
17 splitVertical: 'Razdeli celico navpično',
18 title: 'Lastnosti celice',
19 cellType: 'Vrsta celice',
20 rowSpan: 'Razpon vrstic',
21 colSpan: 'Razpon stolpcev',
22 wordWrap: 'Prelom besedila',
23 hAlign: 'Vodoravna poravnava',
24 vAlign: 'Navpična poravnava',
25 alignBaseline: 'Osnovnica',
26 bgColor: 'Barva ozadja',
27 borderColor: 'Barva obrobe',
28 data: 'Podatki',
29 header: 'Glava',
30 yes: 'Da',
31 no: 'Ne',
32 invalidWidth: 'Širina celice mora biti število.',
33 invalidHeight: 'Višina celice mora biti število.',
34 invalidRowSpan: 'Razpon vrstic mora biti celo število.',
35 invalidColSpan: 'Razpon stolpcev mora biti celo število.',
36 chooseColor: 'Izberi'
37 },
38 cellPad: 'Polnilo med celicami',
39 cellSpace: 'Razmik med celicami',
40 column: {
41 menu: 'Stolpec',
42 insertBefore: 'Vstavi stolpec pred',
43 insertAfter: 'Vstavi stolpec za',
44 deleteColumn: 'Izbriši stolpce'
45 },
46 columns: 'Stolpci',
47 deleteTable: 'Izbriši tabelo',
48 headers: 'Glave',
49 headersBoth: 'Oboje',
50 headersColumn: 'Prvi stolpec',
51 headersNone: 'Brez',
52 headersRow: 'Prva vrstica',
53 invalidBorder: 'Širina obrobe mora biti število.',
54 invalidCellPadding: 'Zamik celic mora biti število',
55 invalidCellSpacing: 'Razmik med celicami mora biti število.',
56 invalidCols: 'Število stolpcev mora biti večje od 0.',
57 invalidHeight: 'Višina tabele mora biti število.',
58 invalidRows: 'Število vrstic mora biti večje od 0.',
59 invalidWidth: 'Širina tabele mora biti število.',
60 menu: 'Lastnosti tabele',
61 row: {
62 menu: 'Vrstica',
63 insertBefore: 'Vstavi vrstico pred',
64 insertAfter: 'Vstavi vrstico za',
65 deleteRow: 'Izbriši vrstice'
66 },
67 rows: 'Vrstice',
68 summary: 'Povzetek',
69 title: 'Lastnosti tabele',
70 toolbar: 'Tabela',
71 widthPc: 'procentov',
72 widthPx: 'pik',
73 widthUnit: 'enota širine'
74} );
diff --git a/sources/plugins/table/lang/sq.js b/sources/plugins/table/lang/sq.js
new file mode 100644
index 00000000..cf52476d
--- /dev/null
+++ b/sources/plugins/table/lang/sq.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'sq', {
6 border: 'Madhësia e kornizave',
7 caption: 'Titull',
8 cell: {
9 menu: 'Qeli',
10 insertBefore: 'Shto Qeli Para',
11 insertAfter: 'Shto Qeli Prapa',
12 deleteCell: 'Gris Qelitë',
13 merge: 'Bashko Qelitë',
14 mergeRight: 'Bashko Djathtas',
15 mergeDown: 'Bashko Poshtë',
16 splitHorizontal: 'Ndaj Qelinë Horizontalisht',
17 splitVertical: 'Ndaj Qelinë Vertikalisht',
18 title: 'Rekuizitat e Qelisë',
19 cellType: 'Lloji i Qelisë',
20 rowSpan: 'Bashko Rreshtat',
21 colSpan: 'Bashko Kolonat',
22 wordWrap: 'Fund i Fjalës',
23 hAlign: 'Bashkimi Horizontal',
24 vAlign: 'Bashkimi Vertikal',
25 alignBaseline: 'Baza',
26 bgColor: 'Ngjyra e Prapavijës',
27 borderColor: 'Ngjyra e Kornizave',
28 data: 'Të dhënat',
29 header: 'Koka',
30 yes: 'Po',
31 no: 'Jo',
32 invalidWidth: 'Gjerësia e qelisë duhet të jetë numër.',
33 invalidHeight: 'Lartësia e qelisë duhet të jetë numër.',
34 invalidRowSpan: 'Hapësira e rreshtave duhet të jetë numër i plotë.',
35 invalidColSpan: 'Hapësira e kolonave duhet të jetë numër i plotë.',
36 chooseColor: 'Përzgjidh'
37 },
38 cellPad: 'Mbushja e qelisë',
39 cellSpace: 'Hapësira e qelisë',
40 column: {
41 menu: 'Kolona',
42 insertBefore: 'Vendos Kolonë Para',
43 insertAfter: 'Vendos Kolonë Pas',
44 deleteColumn: 'Gris Kolonat'
45 },
46 columns: 'Kolonat',
47 deleteTable: 'Gris Tabelën',
48 headers: 'Kokat',
49 headersBoth: 'Së bashku',
50 headersColumn: 'Kolona e parë',
51 headersNone: 'Asnjë',
52 headersRow: 'Rreshti i Parë',
53 invalidBorder: 'Madhësia e kufinjve duhet të jetë numër.',
54 invalidCellPadding: 'Mbushja e qelisë duhet të jetë numër pozitiv.',
55 invalidCellSpacing: 'Hapësira e qelisë duhet të jetë numër pozitiv.',
56 invalidCols: 'Numri i kolonave duhet të jetë numër më i madh se 0.',
57 invalidHeight: 'Lartësia e tabelës duhet të jetë numër.',
58 invalidRows: 'Numri i rreshtave duhet të jetë numër më i madh se 0.',
59 invalidWidth: 'Gjerësia e tabelës duhet të jetë numër.',
60 menu: 'Karakteristikat e Tabelës',
61 row: {
62 menu: 'Rreshti',
63 insertBefore: 'Shto Rresht Para',
64 insertAfter: 'Shto Rresht Prapa',
65 deleteRow: 'Gris Rreshtat'
66 },
67 rows: 'Rreshtat',
68 summary: 'Përmbledhje',
69 title: 'Karakteristikat e Tabelës',
70 toolbar: 'Tabela',
71 widthPc: 'përqind',
72 widthPx: 'piksell',
73 widthUnit: 'njësia e gjerësisë'
74} );
diff --git a/sources/plugins/table/lang/sr-latn.js b/sources/plugins/table/lang/sr-latn.js
new file mode 100644
index 00000000..0bad7fbb
--- /dev/null
+++ b/sources/plugins/table/lang/sr-latn.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'sr-latn', {
6 border: 'Veličina okvira',
7 caption: 'Naslov tabele',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Obriši ćelije',
13 merge: 'Spoj celije',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Razmak ćelija',
39 cellSpace: 'Ćelijski prostor',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Obriši kolone'
45 },
46 columns: 'Kolona',
47 deleteTable: 'Izbriši tabelu',
48 headers: 'Zaglavlja',
49 headersBoth: 'Oba',
50 headersColumn: 'Prva kolona',
51 headersNone: 'None',
52 headersRow: 'Prvi red',
53 invalidBorder: 'Veličina okvira mora biti broj.',
54 invalidCellPadding: 'Padding polja mora biti pozitivan broj.',
55 invalidCellSpacing: 'Razmak između ćelija mora biti pozitivan broj.',
56 invalidCols: 'Broj kolona mora biti broj veći od 0.',
57 invalidHeight: 'Visina tabele mora biti broj.',
58 invalidRows: 'Broj redova mora biti veći od 0.',
59 invalidWidth: 'Širina tabele mora biti broj.',
60 menu: 'Osobine tabele',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Obriši redove'
66 },
67 rows: 'Redova',
68 summary: 'Sažetak',
69 title: 'Osobine tabele',
70 toolbar: 'Tabela',
71 widthPc: 'procenata',
72 widthPx: 'piksela',
73 widthUnit: 'jedinica za širinu'
74} );
diff --git a/sources/plugins/table/lang/sr.js b/sources/plugins/table/lang/sr.js
new file mode 100644
index 00000000..cbfe35ea
--- /dev/null
+++ b/sources/plugins/table/lang/sr.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'sr', {
6 border: 'Величина оквира',
7 caption: 'Наслов табеле',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'Обриши ћелије',
13 merge: 'Спој ћелије',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'Размак ћелија',
39 cellSpace: 'Ћелијски простор',
40 column: {
41 menu: 'Column',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'Обриши колоне'
45 },
46 columns: 'Kолона',
47 deleteTable: 'Обриши таблу',
48 headers: 'Поглавља',
49 headersBoth: 'Оба',
50 headersColumn: 'Прва колона',
51 headersNone: 'None',
52 headersRow: 'Први ред',
53 invalidBorder: 'Величина ивице треба да буде цифра.',
54 invalidCellPadding: 'Пуњење ћелије треба да буде позитивна цифра.',
55 invalidCellSpacing: 'Размак ћелије треба да буде позитивна цифра.',
56 invalidCols: 'Број колона треба да буде цифра већа од 0.',
57 invalidHeight: 'Висина табеле треба да буде цифра.',
58 invalidRows: 'Број реда треба да буде цифра већа од 0.',
59 invalidWidth: 'Ширина табеле треба да буде цифра.',
60 menu: 'Особине табеле',
61 row: {
62 menu: 'Row',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'Обриши редове'
66 },
67 rows: 'Редова',
68 summary: 'Резиме',
69 title: 'Особине табеле',
70 toolbar: 'Табела',
71 widthPc: 'процената',
72 widthPx: 'пиксела',
73 widthUnit: 'јединица ширине'
74} );
diff --git a/sources/plugins/table/lang/sv.js b/sources/plugins/table/lang/sv.js
new file mode 100644
index 00000000..99c89fe9
--- /dev/null
+++ b/sources/plugins/table/lang/sv.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'sv', {
6 border: 'Kantstorlek',
7 caption: 'Rubrik',
8 cell: {
9 menu: 'Cell',
10 insertBefore: 'Lägg till cell före',
11 insertAfter: 'Lägg till cell efter',
12 deleteCell: 'Radera celler',
13 merge: 'Sammanfoga celler',
14 mergeRight: 'Sammanfoga höger',
15 mergeDown: 'Sammanfoga ner',
16 splitHorizontal: 'Dela cell horisontellt',
17 splitVertical: 'Dela cell vertikalt',
18 title: 'Egenskaper för cell',
19 cellType: 'Celltyp',
20 rowSpan: 'Rad spann',
21 colSpan: 'Kolumnen spann',
22 wordWrap: 'Radbrytning',
23 hAlign: 'Horisontell justering',
24 vAlign: 'Vertikal justering',
25 alignBaseline: 'Baslinje',
26 bgColor: 'Bakgrundsfärg',
27 borderColor: 'Ramfärg',
28 data: 'Data',
29 header: 'Rubrik',
30 yes: 'Ja',
31 no: 'Nej',
32 invalidWidth: 'Cellens bredd måste vara ett nummer.',
33 invalidHeight: 'Cellens höjd måste vara ett nummer.',
34 invalidRowSpan: 'Radutvidgning måste vara ett heltal.',
35 invalidColSpan: 'Kolumn måste vara ett heltal.',
36 chooseColor: 'Välj'
37 },
38 cellPad: 'Cellutfyllnad',
39 cellSpace: 'Cellavstånd',
40 column: {
41 menu: 'Kolumn',
42 insertBefore: 'Lägg till kolumn före',
43 insertAfter: 'Lägg till kolumn efter',
44 deleteColumn: 'Radera kolumn'
45 },
46 columns: 'Kolumner',
47 deleteTable: 'Radera tabell',
48 headers: 'Rubriker',
49 headersBoth: 'Båda',
50 headersColumn: 'Första kolumnen',
51 headersNone: 'Ingen',
52 headersRow: 'Första raden',
53 invalidBorder: 'Ram måste vara ett nummer.',
54 invalidCellPadding: 'Luft i cell måste vara ett nummer.',
55 invalidCellSpacing: 'Luft i cell måste vara ett nummer.',
56 invalidCols: 'Antal kolumner måste vara ett nummer större än 0.',
57 invalidHeight: 'Tabellens höjd måste vara ett nummer.',
58 invalidRows: 'Antal rader måste vara större än 0.',
59 invalidWidth: 'Tabell måste vara ett nummer.',
60 menu: 'Tabellegenskaper',
61 row: {
62 menu: 'Rad',
63 insertBefore: 'Lägg till rad före',
64 insertAfter: 'Lägg till rad efter',
65 deleteRow: 'Radera rad'
66 },
67 rows: 'Rader',
68 summary: 'Sammanfattning',
69 title: 'Tabellegenskaper',
70 toolbar: 'Tabell',
71 widthPc: 'procent',
72 widthPx: 'pixlar',
73 widthUnit: 'enhet bredd'
74} );
diff --git a/sources/plugins/table/lang/th.js b/sources/plugins/table/lang/th.js
new file mode 100644
index 00000000..b4d2c625
--- /dev/null
+++ b/sources/plugins/table/lang/th.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'th', {
6 border: 'ขนาดเส้นขอบ',
7 caption: 'หัวเรื่องของตาราง',
8 cell: {
9 menu: 'ช่องตาราง',
10 insertBefore: 'Insert Cell Before',
11 insertAfter: 'Insert Cell After',
12 deleteCell: 'ลบช่อง',
13 merge: 'ผสานช่อง',
14 mergeRight: 'Merge Right',
15 mergeDown: 'Merge Down',
16 splitHorizontal: 'Split Cell Horizontally',
17 splitVertical: 'Split Cell Vertically',
18 title: 'Cell Properties',
19 cellType: 'Cell Type',
20 rowSpan: 'Rows Span',
21 colSpan: 'Columns Span',
22 wordWrap: 'Word Wrap',
23 hAlign: 'Horizontal Alignment',
24 vAlign: 'Vertical Alignment',
25 alignBaseline: 'Baseline',
26 bgColor: 'Background Color',
27 borderColor: 'Border Color',
28 data: 'Data',
29 header: 'Header',
30 yes: 'Yes',
31 no: 'No',
32 invalidWidth: 'Cell width must be a number.',
33 invalidHeight: 'Cell height must be a number.',
34 invalidRowSpan: 'Rows span must be a whole number.',
35 invalidColSpan: 'Columns span must be a whole number.',
36 chooseColor: 'Choose'
37 },
38 cellPad: 'ระยะแนวตั้ง',
39 cellSpace: 'ระยะแนวนอนน',
40 column: {
41 menu: 'คอลัมน์',
42 insertBefore: 'Insert Column Before',
43 insertAfter: 'Insert Column After',
44 deleteColumn: 'ลบสดมน์'
45 },
46 columns: 'สดมน์',
47 deleteTable: 'ลบตาราง',
48 headers: 'ส่วนหัว',
49 headersBoth: 'ทั้งสองอย่าง',
50 headersColumn: 'คอลัมน์แรก',
51 headersNone: 'None',
52 headersRow: 'แถวแรก',
53 invalidBorder: 'ขนาดเส้นกรอบต้องเป็นจำนวนตัวเลข',
54 invalidCellPadding: 'ช่องว่างภายในเซลล์ต้องเลขจำนวนบวก',
55 invalidCellSpacing: 'ช่องว่างภายในเซลล์ต้องเป็นเลขจำนวนบวก',
56 invalidCols: 'จำนวนคอลัมน์ต้องเป็นจำนวนมากกว่า 0',
57 invalidHeight: 'ส่วนสูงของตารางต้องเป็นตัวเลข',
58 invalidRows: 'จำนวนของแถวต้องเป็นจำนวนมากกว่า 0',
59 invalidWidth: 'ความกว้างตารางต้องเป็นตัวเลข',
60 menu: 'คุณสมบัติของ ตาราง',
61 row: {
62 menu: 'แถว',
63 insertBefore: 'Insert Row Before',
64 insertAfter: 'Insert Row After',
65 deleteRow: 'ลบแถว'
66 },
67 rows: 'แถว',
68 summary: 'สรุปความ',
69 title: 'คุณสมบัติของ ตาราง',
70 toolbar: 'ตาราง',
71 widthPc: 'เปอร์เซ็น',
72 widthPx: 'จุดสี',
73 widthUnit: 'หน่วยความกว้าง'
74} );
diff --git a/sources/plugins/table/lang/tr.js b/sources/plugins/table/lang/tr.js
new file mode 100644
index 00000000..bf0e50ae
--- /dev/null
+++ b/sources/plugins/table/lang/tr.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'tr', {
6 border: 'Kenar Kalınlığı',
7 caption: 'Başlık',
8 cell: {
9 menu: 'Hücre',
10 insertBefore: 'Hücre Ekle - Önce',
11 insertAfter: 'Hücre Ekle - Sonra',
12 deleteCell: 'Hücre Sil',
13 merge: 'Hücreleri Birleştir',
14 mergeRight: 'Birleştir - Sağdaki İle ',
15 mergeDown: 'Birleştir - Aşağıdaki İle ',
16 splitHorizontal: 'Hücreyi Yatay Böl',
17 splitVertical: 'Hücreyi Dikey Böl',
18 title: 'Hücre Özellikleri',
19 cellType: 'Hücre Tipi',
20 rowSpan: 'Satırlar Mesafesi (Span)',
21 colSpan: 'Sütünlar Mesafesi (Span)',
22 wordWrap: 'Kelime Kaydırma',
23 hAlign: 'Düşey Hizalama',
24 vAlign: 'Yataş Hizalama',
25 alignBaseline: 'Tabana',
26 bgColor: 'Arkaplan Rengi',
27 borderColor: 'Çerçeve Rengi',
28 data: 'Veri',
29 header: 'Başlık',
30 yes: 'Evet',
31 no: 'Hayır',
32 invalidWidth: 'Hücre genişliği sayı olmalıdır.',
33 invalidHeight: 'Hücre yüksekliği sayı olmalıdır.',
34 invalidRowSpan: 'Satırların mesafesi tam sayı olmalıdır.',
35 invalidColSpan: 'Sütünların mesafesi tam sayı olmalıdır.',
36 chooseColor: 'Seçiniz'
37 },
38 cellPad: 'Izgara yazı arası',
39 cellSpace: 'Izgara kalınlığı',
40 column: {
41 menu: 'Sütun',
42 insertBefore: 'Kolon Ekle - Önce',
43 insertAfter: 'Kolon Ekle - Sonra',
44 deleteColumn: 'Sütun Sil'
45 },
46 columns: 'Sütunlar',
47 deleteTable: 'Tabloyu Sil',
48 headers: 'Başlıklar',
49 headersBoth: 'Her İkisi',
50 headersColumn: 'İlk Sütun',
51 headersNone: 'Yok',
52 headersRow: 'İlk Satır',
53 invalidBorder: 'Çerceve büyüklüklüğü sayı olmalıdır.',
54 invalidCellPadding: 'Hücre aralığı (padding) sayı olmalıdır.',
55 invalidCellSpacing: 'Hücre boşluğu (spacing) sayı olmalıdır.',
56 invalidCols: 'Sütün sayısı 0 sayısından büyük olmalıdır.',
57 invalidHeight: 'Tablo yüksekliği sayı olmalıdır.',
58 invalidRows: 'Satır sayısı 0 sayısından büyük olmalıdır.',
59 invalidWidth: 'Tablo genişliği sayı olmalıdır.',
60 menu: 'Tablo Özellikleri',
61 row: {
62 menu: 'Satır',
63 insertBefore: 'Satır Ekle - Önce',
64 insertAfter: 'Satır Ekle - Sonra',
65 deleteRow: 'Satır Sil'
66 },
67 rows: 'Satırlar',
68 summary: 'Özet',
69 title: 'Tablo Özellikleri',
70 toolbar: 'Tablo',
71 widthPc: 'yüzde',
72 widthPx: 'piksel',
73 widthUnit: 'genişlik birimi'
74} );
diff --git a/sources/plugins/table/lang/tt.js b/sources/plugins/table/lang/tt.js
new file mode 100644
index 00000000..e9f92b75
--- /dev/null
+++ b/sources/plugins/table/lang/tt.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'tt', {
6 border: 'Чик калынлыгы',
7 caption: 'Исем',
8 cell: {
9 menu: 'Күзәнәк',
10 insertBefore: 'Алдына күзәнәк өстәү',
11 insertAfter: 'Артына күзәнәк өстәү',
12 deleteCell: 'Күзәнәкләрне бетерү',
13 merge: 'Күзәнәкләрне берләштерү',
14 mergeRight: 'Уң яктагы белән берләштерү',
15 mergeDown: 'Астагы белән берләштерү',
16 splitHorizontal: 'Күзәнәкне юлларга бүлү',
17 splitVertical: 'Күзәнәкне баганаларга бүлү',
18 title: 'Күзәнәк үзлекләре',
19 cellType: 'Күзәнәк төре',
20 rowSpan: 'Юлларны берләштерү',
21 colSpan: 'Баганаларны берләштерү',
22 wordWrap: 'Текстны күчерү',
23 hAlign: 'Ятма тигезләү',
24 vAlign: 'Асма тигезләү',
25 alignBaseline: 'Таяныч сызыгы',
26 bgColor: 'Фон төсе',
27 borderColor: 'Чик төсе',
28 data: 'Мәгълүмат',
29 header: 'Башлык',
30 yes: 'Әйе',
31 no: 'Юк',
32 invalidWidth: 'Cell width must be a number.', // MISSING
33 invalidHeight: 'Cell height must be a number.', // MISSING
34 invalidRowSpan: 'Rows span must be a whole number.', // MISSING
35 invalidColSpan: 'Columns span must be a whole number.', // MISSING
36 chooseColor: 'Сайлау'
37 },
38 cellPad: 'Cell padding', // MISSING
39 cellSpace: 'Cell spacing', // MISSING
40 column: {
41 menu: 'Багана',
42 insertBefore: 'Сулдан баганалар өстәү',
43 insertAfter: 'Уңнан баганалар өстәү',
44 deleteColumn: 'Баганаларны бетерү'
45 },
46 columns: 'Баганалар',
47 deleteTable: 'Таблицаны бетерү',
48 headers: 'Башлыклар',
49 headersBoth: 'Икесе дә',
50 headersColumn: 'Беренче багана',
51 headersNone: 'Һичбер',
52 headersRow: 'Беренче юл',
53 invalidBorder: 'Чик киңлеге сан булырга тиеш.',
54 invalidCellPadding: 'Cell padding must be a positive number.', // MISSING
55 invalidCellSpacing: 'Күзәнәкләр аралары уңай сан булырга тиеш.',
56 invalidCols: 'Number of columns must be a number greater than 0.', // MISSING
57 invalidHeight: 'Таблица биеклеге сан булырга тиеш.',
58 invalidRows: 'Number of rows must be a number greater than 0.', // MISSING
59 invalidWidth: 'Таблица киңлеге сан булырга тиеш',
60 menu: 'Таблица үзлекләре',
61 row: {
62 menu: 'Юл',
63 insertBefore: 'Өстән юллар өстәү',
64 insertAfter: 'Астан юллар өстәү',
65 deleteRow: 'Юлларны бетерү'
66 },
67 rows: 'Юллар',
68 summary: 'Йомгаклау',
69 title: 'Таблица үзлекләре',
70 toolbar: 'Таблица',
71 widthPc: 'процент',
72 widthPx: 'Нокталар',
73 widthUnit: 'киңлек берәмлеге'
74} );
diff --git a/sources/plugins/table/lang/ug.js b/sources/plugins/table/lang/ug.js
new file mode 100644
index 00000000..b31492f7
--- /dev/null
+++ b/sources/plugins/table/lang/ug.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'ug', {
6 border: 'گىرۋەك',
7 caption: 'ماۋزۇ',
8 cell: {
9 menu: 'كاتەكچە',
10 insertBefore: 'سولغا كاتەكچە قىستۇر',
11 insertAfter: 'ئوڭغا كاتەكچە قىستۇر',
12 deleteCell: 'كەتەكچە ئۆچۈر',
13 merge: 'كاتەكچە بىرلەشتۈر',
14 mergeRight: 'كاتەكچىنى ئوڭغا بىرلەشتۈر',
15 mergeDown: 'كاتەكچىنى ئاستىغا بىرلەشتۈر',
16 splitHorizontal: 'كاتەكچىنى توغرىسىغا بىرلەشتۈر',
17 splitVertical: 'كاتەكچىنى بويىغا بىرلەشتۈر',
18 title: 'كاتەكچە خاسلىقى',
19 cellType: 'كاتەكچە تىپى',
20 rowSpan: 'بويىغا چات ئارىسى قۇر سانى',
21 colSpan: 'توغرىسىغا چات ئارىسى ئىستون سانى',
22 wordWrap: 'ئۆزلۈكىدىن قۇر قاتلا',
23 hAlign: 'توغرىسىغا توغرىلا',
24 vAlign: 'بويىغا توغرىلا',
25 alignBaseline: 'ئاساسىي سىزىق',
26 bgColor: 'تەگلىك رەڭگى',
27 borderColor: 'گىرۋەك رەڭگى',
28 data: 'سانلىق مەلۇمات',
29 header: 'جەدۋەل باشى',
30 yes: 'ھەئە',
31 no: 'ياق',
32 invalidWidth: 'كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ',
33 invalidHeight: 'كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ',
34 invalidRowSpan: 'قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ',
35 invalidColSpan: 'ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ',
36 chooseColor: 'تاللاڭ'
37 },
38 cellPad: 'يان ئارىلىق',
39 cellSpace: 'ئارىلىق',
40 column: {
41 menu: 'ئىستون',
42 insertBefore: 'سولغا ئىستون قىستۇر',
43 insertAfter: 'ئوڭغا ئىستون قىستۇر',
44 deleteColumn: 'ئىستون ئۆچۈر'
45 },
46 columns: 'ئىستون سانى',
47 deleteTable: 'جەدۋەل ئۆچۈر',
48 headers: 'ماۋزۇ كاتەكچە',
49 headersBoth: 'بىرىنچى ئىستون ۋە بىرىنچى قۇر',
50 headersColumn: 'بىرىنچى ئىستون',
51 headersNone: 'يوق',
52 headersRow: 'بىرىنچى قۇر',
53 invalidBorder: 'گىرۋەك توملۇقى چوقۇم سان بولىدۇ',
54 invalidCellPadding: 'كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ',
55 invalidCellSpacing: 'كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ',
56 invalidCols: 'بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ',
57 invalidHeight: 'جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ',
58 invalidRows: 'بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ',
59 invalidWidth: 'جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ',
60 menu: 'جەدۋەل خاسلىقى',
61 row: {
62 menu: 'قۇر',
63 insertBefore: 'ئۈستىگە قۇر قىستۇر',
64 insertAfter: 'ئاستىغا قۇر قىستۇر',
65 deleteRow: 'قۇر ئۆچۈر'
66 },
67 rows: 'قۇر سانى',
68 summary: 'ئۈزۈندە',
69 title: 'جەدۋەل خاسلىقى',
70 toolbar: 'جەدۋەل',
71 widthPc: 'پىرسەنت',
72 widthPx: 'پىكسېل',
73 widthUnit: 'كەڭلىك بىرلىكى'
74} );
diff --git a/sources/plugins/table/lang/uk.js b/sources/plugins/table/lang/uk.js
new file mode 100644
index 00000000..3c200a54
--- /dev/null
+++ b/sources/plugins/table/lang/uk.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'uk', {
6 border: 'Розмір рамки',
7 caption: 'Заголовок таблиці',
8 cell: {
9 menu: 'Комірки',
10 insertBefore: 'Вставити комірку перед',
11 insertAfter: 'Вставити комірку після',
12 deleteCell: 'Видалити комірки',
13 merge: 'Об\'єднати комірки',
14 mergeRight: 'Об\'єднати справа',
15 mergeDown: 'Об\'єднати донизу',
16 splitHorizontal: 'Розділити комірку по горизонталі',
17 splitVertical: 'Розділити комірку по вертикалі',
18 title: 'Властивості комірки',
19 cellType: 'Тип комірки',
20 rowSpan: 'Об\'єднання рядків',
21 colSpan: 'Об\'єднання стовпців',
22 wordWrap: 'Автоперенесення тексту',
23 hAlign: 'Гориз. вирівнювання',
24 vAlign: 'Верт. вирівнювання',
25 alignBaseline: 'По базовій лінії',
26 bgColor: 'Колір фону',
27 borderColor: 'Колір рамки',
28 data: 'Дані',
29 header: 'Заголовок',
30 yes: 'Так',
31 no: 'Ні',
32 invalidWidth: 'Ширина комірки повинна бути цілим числом.',
33 invalidHeight: 'Висота комірки повинна бути цілим числом.',
34 invalidRowSpan: 'Кількість об\'єднуваних рядків повинна бути цілим числом.',
35 invalidColSpan: 'Кількість об\'єднуваних стовбців повинна бути цілим числом.',
36 chooseColor: 'Обрати'
37 },
38 cellPad: 'Внутр. відступ',
39 cellSpace: 'Проміжок',
40 column: {
41 menu: 'Стовбці',
42 insertBefore: 'Вставити стовбець перед',
43 insertAfter: 'Вставити стовбець після',
44 deleteColumn: 'Видалити стовбці'
45 },
46 columns: 'Стовбці',
47 deleteTable: 'Видалити таблицю',
48 headers: 'Заголовки стовбців/рядків',
49 headersBoth: 'Стовбці і рядки',
50 headersColumn: 'Стовбці',
51 headersNone: 'Без заголовків',
52 headersRow: 'Рядки',
53 invalidBorder: 'Розмір рамки повинен бути цілим числом.',
54 invalidCellPadding: 'Внутр. відступ комірки повинен бути цілим числом.',
55 invalidCellSpacing: 'Проміжок між комірками повинен бути цілим числом.',
56 invalidCols: 'Кількість стовбців повинна бути більшою 0.',
57 invalidHeight: 'Висота таблиці повинна бути цілим числом.',
58 invalidRows: 'Кількість рядків повинна бути більшою 0.',
59 invalidWidth: 'Ширина таблиці повинна бути цілим числом.',
60 menu: 'Властивості таблиці',
61 row: {
62 menu: 'Рядки',
63 insertBefore: 'Вставити рядок перед',
64 insertAfter: 'Вставити рядок після',
65 deleteRow: 'Видалити рядки'
66 },
67 rows: 'Рядки',
68 summary: 'Детальний опис заголовку таблиці',
69 title: 'Властивості таблиці',
70 toolbar: 'Таблиця',
71 widthPc: 'відсотків',
72 widthPx: 'пікселів',
73 widthUnit: 'Одиниці вимір.'
74} );
diff --git a/sources/plugins/table/lang/vi.js b/sources/plugins/table/lang/vi.js
new file mode 100644
index 00000000..e8797314
--- /dev/null
+++ b/sources/plugins/table/lang/vi.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'vi', {
6 border: 'Kích thước đường viền',
7 caption: 'Đầu đề',
8 cell: {
9 menu: 'Ô',
10 insertBefore: 'Chèn ô Phía trước',
11 insertAfter: 'Chèn ô Phía sau',
12 deleteCell: 'Xoá ô',
13 merge: 'Kết hợp ô',
14 mergeRight: 'Kết hợp sang phải',
15 mergeDown: 'Kết hợp xuống dưới',
16 splitHorizontal: 'Phân tách ô theo chiều ngang',
17 splitVertical: 'Phân tách ô theo chiều dọc',
18 title: 'Thuộc tính của ô',
19 cellType: 'Kiểu của ô',
20 rowSpan: 'Kết hợp hàng',
21 colSpan: 'Kết hợp cột',
22 wordWrap: 'Chữ liền hàng',
23 hAlign: 'Canh lề ngang',
24 vAlign: 'Canh lề dọc',
25 alignBaseline: 'Đường cơ sở',
26 bgColor: 'Màu nền',
27 borderColor: 'Màu viền',
28 data: 'Dữ liệu',
29 header: 'Đầu đề',
30 yes: 'Có',
31 no: 'Không',
32 invalidWidth: 'Chiều rộng của ô phải là một số nguyên.',
33 invalidHeight: 'Chiều cao của ô phải là một số nguyên.',
34 invalidRowSpan: 'Số hàng kết hợp phải là một số nguyên.',
35 invalidColSpan: 'Số cột kết hợp phải là một số nguyên.',
36 chooseColor: 'Chọn màu'
37 },
38 cellPad: 'Khoảng đệm giữ ô và nội dung',
39 cellSpace: 'Khoảng cách giữa các ô',
40 column: {
41 menu: 'Cột',
42 insertBefore: 'Chèn cột phía trước',
43 insertAfter: 'Chèn cột phía sau',
44 deleteColumn: 'Xoá cột'
45 },
46 columns: 'Số cột',
47 deleteTable: 'Xóa bảng',
48 headers: 'Đầu đề',
49 headersBoth: 'Cả hai',
50 headersColumn: 'Cột đầu tiên',
51 headersNone: 'Không có',
52 headersRow: 'Hàng đầu tiên',
53 invalidBorder: 'Kích cỡ của đường biên phải là một số nguyên.',
54 invalidCellPadding: 'Khoảng đệm giữa ô và nội dung phải là một số nguyên.',
55 invalidCellSpacing: 'Khoảng cách giữa các ô phải là một số nguyên.',
56 invalidCols: 'Số lượng cột phải là một số lớn hơn 0.',
57 invalidHeight: 'Chiều cao của bảng phải là một số nguyên.',
58 invalidRows: 'Số lượng hàng phải là một số lớn hơn 0.',
59 invalidWidth: 'Chiều rộng của bảng phải là một số nguyên.',
60 menu: 'Thuộc tính bảng',
61 row: {
62 menu: 'Hàng',
63 insertBefore: 'Chèn hàng phía trước',
64 insertAfter: 'Chèn hàng phía sau',
65 deleteRow: 'Xoá hàng'
66 },
67 rows: 'Số hàng',
68 summary: 'Tóm lược',
69 title: 'Thuộc tính bảng',
70 toolbar: 'Bảng',
71 widthPc: 'Phần trăm (%)',
72 widthPx: 'Điểm ảnh (px)',
73 widthUnit: 'Đơn vị'
74} );
diff --git a/sources/plugins/table/lang/zh-cn.js b/sources/plugins/table/lang/zh-cn.js
new file mode 100644
index 00000000..b7a2b64d
--- /dev/null
+++ b/sources/plugins/table/lang/zh-cn.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'zh-cn', {
6 border: '边框',
7 caption: '标题',
8 cell: {
9 menu: '单元格',
10 insertBefore: '在左侧插入单元格',
11 insertAfter: '在右侧插入单元格',
12 deleteCell: '删除单元格',
13 merge: '合并单元格',
14 mergeRight: '向右合并单元格',
15 mergeDown: '向下合并单元格',
16 splitHorizontal: '水平拆分单元格',
17 splitVertical: '垂直拆分单元格',
18 title: '单元格属性',
19 cellType: '单元格类型',
20 rowSpan: '纵跨行数',
21 colSpan: '横跨列数',
22 wordWrap: '自动换行',
23 hAlign: '水平对齐',
24 vAlign: '垂直对齐',
25 alignBaseline: '基线',
26 bgColor: '背景颜色',
27 borderColor: '边框颜色',
28 data: '数据',
29 header: '表头',
30 yes: '是',
31 no: '否',
32 invalidWidth: '单元格宽度必须为数字格式',
33 invalidHeight: '单元格高度必须为数字格式',
34 invalidRowSpan: '行跨度必须为整数格式',
35 invalidColSpan: '列跨度必须为整数格式',
36 chooseColor: '选择'
37 },
38 cellPad: '边距',
39 cellSpace: '间距',
40 column: {
41 menu: '列',
42 insertBefore: '在左侧插入列',
43 insertAfter: '在右侧插入列',
44 deleteColumn: '删除列'
45 },
46 columns: '列数',
47 deleteTable: '删除表格',
48 headers: '标题单元格',
49 headersBoth: '第一列和第一行',
50 headersColumn: '第一列',
51 headersNone: '无',
52 headersRow: '第一行',
53 invalidBorder: '边框粗细必须为数字格式',
54 invalidCellPadding: '单元格填充必须为数字格式',
55 invalidCellSpacing: '单元格间距必须为数字格式',
56 invalidCols: '指定的行数必须大于零',
57 invalidHeight: '表格高度必须为数字格式',
58 invalidRows: '指定的列数必须大于零',
59 invalidWidth: '表格宽度必须为数字格式',
60 menu: '表格属性',
61 row: {
62 menu: '行',
63 insertBefore: '在上方插入行',
64 insertAfter: '在下方插入行',
65 deleteRow: '删除行'
66 },
67 rows: '行数',
68 summary: '摘要',
69 title: '表格属性',
70 toolbar: '表格',
71 widthPc: '百分比',
72 widthPx: '像素',
73 widthUnit: '宽度单位'
74} );
diff --git a/sources/plugins/table/lang/zh.js b/sources/plugins/table/lang/zh.js
new file mode 100644
index 00000000..94bdab52
--- /dev/null
+++ b/sources/plugins/table/lang/zh.js
@@ -0,0 +1,74 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'table', 'zh', {
6 border: '框線大小',
7 caption: '標題',
8 cell: {
9 menu: '儲存格',
10 insertBefore: '前方插入儲存格',
11 insertAfter: '後方插入儲存格',
12 deleteCell: '刪除儲存格',
13 merge: '合併儲存格',
14 mergeRight: '向右合併',
15 mergeDown: '向下合併',
16 splitHorizontal: '水平分割儲存格',
17 splitVertical: '垂直分割儲存格',
18 title: '儲存格屬性',
19 cellType: '儲存格類型',
20 rowSpan: '列全長',
21 colSpan: '行全長',
22 wordWrap: '自動斷行',
23 hAlign: '水平對齊',
24 vAlign: '垂直對齊',
25 alignBaseline: '基準線',
26 bgColor: '背景顏色',
27 borderColor: '框線顏色',
28 data: '資料',
29 header: '頁首',
30 yes: '是',
31 no: '否',
32 invalidWidth: '儲存格寬度必須為數字。',
33 invalidHeight: '儲存格高度必須為數字。',
34 invalidRowSpan: '列全長必須是整數。',
35 invalidColSpan: '行全長必須是整數。',
36 chooseColor: '選擇'
37 },
38 cellPad: '儲存格邊距',
39 cellSpace: '儲存格間距',
40 column: {
41 menu: '行',
42 insertBefore: '左方插入行',
43 insertAfter: '右方插入行',
44 deleteColumn: '刪除行'
45 },
46 columns: '行',
47 deleteTable: '刪除表格',
48 headers: '頁首',
49 headersBoth: '同時',
50 headersColumn: '第一行',
51 headersNone: '無',
52 headersRow: '第一列',
53 invalidBorder: '框線大小必須是整數。',
54 invalidCellPadding: '儲存格邊距必須為正數。',
55 invalidCellSpacing: '儲存格間距必須為正數。',
56 invalidCols: '行數須為大於 0 的正整數。',
57 invalidHeight: '表格高度必須為數字。',
58 invalidRows: '列數須為大於 0 的正整數。',
59 invalidWidth: '表格寬度必須為數字。',
60 menu: '表格屬性',
61 row: {
62 menu: '列',
63 insertBefore: '上方插入列',
64 insertAfter: '下方插入列',
65 deleteRow: '刪除列'
66 },
67 rows: '列',
68 summary: '總結',
69 title: '表格屬性',
70 toolbar: '表格',
71 widthPc: '百分比',
72 widthPx: '像素',
73 widthUnit: '寬度單位'
74} );
diff --git a/sources/plugins/table/plugin.js b/sources/plugins/table/plugin.js
new file mode 100644
index 00000000..a013bc17
--- /dev/null
+++ b/sources/plugins/table/plugin.js
@@ -0,0 +1,109 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.plugins.add( 'table', {
7 requires: 'dialog',
8 // jscs:disable maximumLineLength
9 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
10 // jscs:enable maximumLineLength
11 icons: 'table', // %REMOVE_LINE_CORE%
12 hidpi: true, // %REMOVE_LINE_CORE%
13 init: function( editor ) {
14 if ( editor.blockless )
15 return;
16
17 var lang = editor.lang.table;
18
19 editor.addCommand( 'table', new CKEDITOR.dialogCommand( 'table', {
20 context: 'table',
21 allowedContent: 'table{width,height}[align,border,cellpadding,cellspacing,summary];' +
22 'caption tbody thead tfoot;' +
23 'th td tr[scope];' +
24 ( editor.plugins.dialogadvtab ? 'table' + editor.plugins.dialogadvtab.allowedContent() : '' ),
25 requiredContent: 'table',
26 contentTransformations: [
27 [ 'table{width}: sizeToStyle', 'table[width]: sizeToAttribute' ]
28 ]
29 } ) );
30
31 function createDef( def ) {
32 return CKEDITOR.tools.extend( def || {}, {
33 contextSensitive: 1,
34 refresh: function( editor, path ) {
35 this.setState( path.contains( 'table', 1 ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
36 }
37 } );
38 }
39
40 editor.addCommand( 'tableProperties', new CKEDITOR.dialogCommand( 'tableProperties', createDef() ) );
41 editor.addCommand( 'tableDelete', createDef( {
42 exec: function( editor ) {
43 var path = editor.elementPath(),
44 table = path.contains( 'table', 1 );
45
46 if ( !table )
47 return;
48
49 // If the table's parent has only one child remove it as well (unless it's a table cell, or the editable element) (#5416, #6289, #12110)
50 var parent = table.getParent(),
51 editable = editor.editable();
52
53 if ( parent.getChildCount() == 1 && !parent.is( 'td', 'th' ) && !parent.equals( editable ) )
54 table = parent;
55
56 var range = editor.createRange();
57 range.moveToPosition( table, CKEDITOR.POSITION_BEFORE_START );
58 table.remove();
59 range.select();
60 }
61 } ) );
62
63 editor.ui.addButton && editor.ui.addButton( 'Table', {
64 label: lang.toolbar,
65 command: 'table',
66 toolbar: 'insert,30'
67 } );
68
69 CKEDITOR.dialog.add( 'table', this.path + 'dialogs/table.js' );
70 CKEDITOR.dialog.add( 'tableProperties', this.path + 'dialogs/table.js' );
71
72 // If the "menu" plugin is loaded, register the menu items.
73 if ( editor.addMenuItems ) {
74 editor.addMenuItems( {
75 table: {
76 label: lang.menu,
77 command: 'tableProperties',
78 group: 'table',
79 order: 5
80 },
81
82 tabledelete: {
83 label: lang.deleteTable,
84 command: 'tableDelete',
85 group: 'table',
86 order: 1
87 }
88 } );
89 }
90
91 editor.on( 'doubleclick', function( evt ) {
92 var element = evt.data.element;
93
94 if ( element.is( 'table' ) )
95 evt.data.dialog = 'tableProperties';
96 } );
97
98 // If the "contextmenu" plugin is loaded, register the listeners.
99 if ( editor.contextMenu ) {
100 editor.contextMenu.addListener( function() {
101 // menu item state is resolved on commands.
102 return {
103 tabledelete: CKEDITOR.TRISTATE_OFF,
104 table: CKEDITOR.TRISTATE_OFF
105 };
106 } );
107 }
108 }
109} );
diff --git a/sources/plugins/tabletools/dialogs/tableCell.js b/sources/plugins/tabletools/dialogs/tableCell.js
new file mode 100644
index 00000000..980d3486
--- /dev/null
+++ b/sources/plugins/tabletools/dialogs/tableCell.js
@@ -0,0 +1,474 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'cellProperties', function( editor ) {
7 var langTable = editor.lang.table,
8 langCell = langTable.cell,
9 langCommon = editor.lang.common,
10 validate = CKEDITOR.dialog.validate,
11 widthPattern = /^(\d+(?:\.\d+)?)(px|%)$/,
12 spacer = { type: 'html', html: '&nbsp;' },
13 rtl = editor.lang.dir == 'rtl',
14 colorDialog = editor.plugins.colordialog;
15
16 // Returns a function, which runs regular "setup" for all selected cells to find out
17 // whether the initial value of the field would be the same for all cells. If so,
18 // the value is displayed just as if a regular "setup" was executed. Otherwise,
19 // i.e. when there are several cells of different value of the property, a field
20 // gets empty value.
21 //
22 // * @param {Function} setup Setup function which returns a value instead of setting it.
23 // * @returns {Function} A function to be used in dialog definition.
24 function setupCells( setup ) {
25 return function( cells ) {
26 var fieldValue = setup( cells[ 0 ] );
27
28 // If one of the cells would have a different value of the
29 // property, set the empty value for a field.
30 for ( var i = 1; i < cells.length; i++ ) {
31 if ( setup( cells[ i ] ) !== fieldValue ) {
32 fieldValue = null;
33 break;
34 }
35 }
36
37 // Setting meaningful or empty value only makes sense
38 // when setup returns some value. Otherwise, a *default* value
39 // is used for that field.
40 if ( typeof fieldValue != 'undefined' ) {
41 this.setValue( fieldValue );
42
43 // The only way to have an empty select value in Firefox is
44 // to set a negative selectedIndex.
45 if ( CKEDITOR.env.gecko && this.type == 'select' && !fieldValue )
46 this.getInputElement().$.selectedIndex = -1;
47 }
48 };
49 }
50
51 // Reads the unit of width property of the table cell.
52 //
53 // * @param {CKEDITOR.dom.element} cell An element representing table cell.
54 // * @returns {String} A unit of width: 'px', '%' or undefined if none.
55 function getCellWidthType( cell ) {
56 var match = widthPattern.exec(
57 cell.getStyle( 'width' ) || cell.getAttribute( 'width' ) );
58
59 if ( match )
60 return match[ 2 ];
61 }
62
63 return {
64 title: langCell.title,
65 minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 450 : 410,
66 minHeight: CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ? 230 : 220,
67 contents: [ {
68 id: 'info',
69 label: langCell.title,
70 accessKey: 'I',
71 elements: [ {
72 type: 'hbox',
73 widths: [ '40%', '5%', '40%' ],
74 children: [ {
75 type: 'vbox',
76 padding: 0,
77 children: [ {
78 type: 'hbox',
79 widths: [ '70%', '30%' ],
80 children: [ {
81 type: 'text',
82 id: 'width',
83 width: '100px',
84 label: langCommon.width,
85 validate: validate.number( langCell.invalidWidth ),
86
87 // Extra labelling of width unit type.
88 onLoad: function() {
89 var widthType = this.getDialog().getContentElement( 'info', 'widthType' ),
90 labelElement = widthType.getElement(),
91 inputElement = this.getInputElement(),
92 ariaLabelledByAttr = inputElement.getAttribute( 'aria-labelledby' );
93
94 inputElement.setAttribute( 'aria-labelledby', [ ariaLabelledByAttr, labelElement.$.id ].join( ' ' ) );
95 },
96
97 setup: setupCells( function( element ) {
98 var widthAttr = parseInt( element.getAttribute( 'width' ), 10 ),
99 widthStyle = parseInt( element.getStyle( 'width' ), 10 );
100
101 return !isNaN( widthStyle ) ? widthStyle :
102 !isNaN( widthAttr ) ? widthAttr : '';
103 } ),
104 commit: function( element ) {
105 var value = parseInt( this.getValue(), 10 ),
106
107 // There might be no widthType value, i.e. when multiple cells are
108 // selected but some of them have width expressed in pixels and some
109 // of them in percent. Try to re-read the unit from the cell in such
110 // case (#11439).
111 unit = this.getDialog().getValueOf( 'info', 'widthType' ) || getCellWidthType( element );
112
113 if ( !isNaN( value ) )
114 element.setStyle( 'width', value + unit );
115 else
116 element.removeStyle( 'width' );
117
118 element.removeAttribute( 'width' );
119 },
120 'default': ''
121 },
122 {
123 type: 'select',
124 id: 'widthType',
125 label: editor.lang.table.widthUnit,
126 labelStyle: 'visibility:hidden',
127 'default': 'px',
128 items: [
129 [ langTable.widthPx, 'px' ],
130 [ langTable.widthPc, '%' ]
131 ],
132 setup: setupCells( getCellWidthType )
133 } ]
134 },
135 {
136 type: 'hbox',
137 widths: [ '70%', '30%' ],
138 children: [ {
139 type: 'text',
140 id: 'height',
141 label: langCommon.height,
142 width: '100px',
143 'default': '',
144 validate: validate.number( langCell.invalidHeight ),
145
146 // Extra labelling of height unit type.
147 onLoad: function() {
148 var heightType = this.getDialog().getContentElement( 'info', 'htmlHeightType' ),
149 labelElement = heightType.getElement(),
150 inputElement = this.getInputElement(),
151 ariaLabelledByAttr = inputElement.getAttribute( 'aria-labelledby' );
152
153 inputElement.setAttribute( 'aria-labelledby', [ ariaLabelledByAttr, labelElement.$.id ].join( ' ' ) );
154 },
155
156 setup: setupCells( function( element ) {
157 var heightAttr = parseInt( element.getAttribute( 'height' ), 10 ),
158 heightStyle = parseInt( element.getStyle( 'height' ), 10 );
159
160 return !isNaN( heightStyle ) ? heightStyle :
161 !isNaN( heightAttr ) ? heightAttr : '';
162 } ),
163 commit: function( element ) {
164 var value = parseInt( this.getValue(), 10 );
165
166 if ( !isNaN( value ) )
167 element.setStyle( 'height', CKEDITOR.tools.cssLength( value ) );
168 else
169 element.removeStyle( 'height' );
170
171 element.removeAttribute( 'height' );
172 }
173 },
174 {
175 id: 'htmlHeightType',
176 type: 'html',
177 html: '<br />' + langTable.widthPx
178 } ]
179 },
180 spacer,
181 {
182 type: 'select',
183 id: 'wordWrap',
184 label: langCell.wordWrap,
185 'default': 'yes',
186 items: [
187 [ langCell.yes, 'yes' ],
188 [ langCell.no, 'no' ]
189 ],
190 setup: setupCells( function( element ) {
191 var wordWrapAttr = element.getAttribute( 'noWrap' ),
192 wordWrapStyle = element.getStyle( 'white-space' );
193
194 if ( wordWrapStyle == 'nowrap' || wordWrapAttr )
195 return 'no';
196 } ),
197 commit: function( element ) {
198 if ( this.getValue() == 'no' )
199 element.setStyle( 'white-space', 'nowrap' );
200 else
201 element.removeStyle( 'white-space' );
202
203 element.removeAttribute( 'noWrap' );
204 }
205 },
206 spacer,
207 {
208 type: 'select',
209 id: 'hAlign',
210 label: langCell.hAlign,
211 'default': '',
212 items: [
213 [ langCommon.notSet, '' ],
214 [ langCommon.alignLeft, 'left' ],
215 [ langCommon.alignCenter, 'center' ],
216 [ langCommon.alignRight, 'right' ],
217 [ langCommon.alignJustify, 'justify' ]
218 ],
219 setup: setupCells( function( element ) {
220 var alignAttr = element.getAttribute( 'align' ),
221 textAlignStyle = element.getStyle( 'text-align' );
222
223 return textAlignStyle || alignAttr || '';
224 } ),
225 commit: function( selectedCell ) {
226 var value = this.getValue();
227
228 if ( value )
229 selectedCell.setStyle( 'text-align', value );
230 else
231 selectedCell.removeStyle( 'text-align' );
232
233 selectedCell.removeAttribute( 'align' );
234 }
235 },
236 {
237 type: 'select',
238 id: 'vAlign',
239 label: langCell.vAlign,
240 'default': '',
241 items: [
242 [ langCommon.notSet, '' ],
243 [ langCommon.alignTop, 'top' ],
244 [ langCommon.alignMiddle, 'middle' ],
245 [ langCommon.alignBottom, 'bottom' ],
246 [ langCell.alignBaseline, 'baseline' ]
247 ],
248 setup: setupCells( function( element ) {
249 var vAlignAttr = element.getAttribute( 'vAlign' ),
250 vAlignStyle = element.getStyle( 'vertical-align' );
251
252 switch ( vAlignStyle ) {
253 // Ignore all other unrelated style values..
254 case 'top':
255 case 'middle':
256 case 'bottom':
257 case 'baseline':
258 break;
259 default:
260 vAlignStyle = '';
261 }
262
263 return vAlignStyle || vAlignAttr || '';
264 } ),
265 commit: function( element ) {
266 var value = this.getValue();
267
268 if ( value )
269 element.setStyle( 'vertical-align', value );
270 else
271 element.removeStyle( 'vertical-align' );
272
273 element.removeAttribute( 'vAlign' );
274 }
275 } ]
276 },
277 spacer,
278 {
279 type: 'vbox',
280 padding: 0,
281 children: [ {
282 type: 'select',
283 id: 'cellType',
284 label: langCell.cellType,
285 'default': 'td',
286 items: [
287 [ langCell.data, 'td' ],
288 [ langCell.header, 'th' ]
289 ],
290 setup: setupCells( function( selectedCell ) {
291 return selectedCell.getName();
292 } ),
293 commit: function( selectedCell ) {
294 selectedCell.renameNode( this.getValue() );
295 }
296 },
297 spacer,
298 {
299 type: 'text',
300 id: 'rowSpan',
301 label: langCell.rowSpan,
302 'default': '',
303 validate: validate.integer( langCell.invalidRowSpan ),
304 setup: setupCells( function( selectedCell ) {
305 var attrVal = parseInt( selectedCell.getAttribute( 'rowSpan' ), 10 );
306 if ( attrVal && attrVal != 1 )
307 return attrVal;
308 } ),
309 commit: function( selectedCell ) {
310 var value = parseInt( this.getValue(), 10 );
311 if ( value && value != 1 )
312 selectedCell.setAttribute( 'rowSpan', this.getValue() );
313 else
314 selectedCell.removeAttribute( 'rowSpan' );
315 }
316 },
317 {
318 type: 'text',
319 id: 'colSpan',
320 label: langCell.colSpan,
321 'default': '',
322 validate: validate.integer( langCell.invalidColSpan ),
323 setup: setupCells( function( element ) {
324 var attrVal = parseInt( element.getAttribute( 'colSpan' ), 10 );
325 if ( attrVal && attrVal != 1 )
326 return attrVal;
327 } ),
328 commit: function( selectedCell ) {
329 var value = parseInt( this.getValue(), 10 );
330 if ( value && value != 1 )
331 selectedCell.setAttribute( 'colSpan', this.getValue() );
332 else
333 selectedCell.removeAttribute( 'colSpan' );
334 }
335 },
336 spacer,
337 {
338 type: 'hbox',
339 padding: 0,
340 widths: [ '60%', '40%' ],
341 children: [ {
342 type: 'text',
343 id: 'bgColor',
344 label: langCell.bgColor,
345 'default': '',
346 setup: setupCells( function( element ) {
347 var bgColorAttr = element.getAttribute( 'bgColor' ),
348 bgColorStyle = element.getStyle( 'background-color' );
349
350 return bgColorStyle || bgColorAttr;
351 } ),
352 commit: function( selectedCell ) {
353 var value = this.getValue();
354
355 if ( value )
356 selectedCell.setStyle( 'background-color', this.getValue() );
357 else
358 selectedCell.removeStyle( 'background-color' );
359
360 selectedCell.removeAttribute( 'bgColor' );
361 }
362 },
363 colorDialog ? {
364 type: 'button',
365 id: 'bgColorChoose',
366 'class': 'colorChooser', // jshint ignore:line
367 label: langCell.chooseColor,
368 onLoad: function() {
369 // Stick the element to the bottom (#5587)
370 this.getElement().getParent().setStyle( 'vertical-align', 'bottom' );
371 },
372 onClick: function() {
373 editor.getColorFromDialog( function( color ) {
374 if ( color )
375 this.getDialog().getContentElement( 'info', 'bgColor' ).setValue( color );
376 this.focus();
377 }, this );
378 }
379 } : spacer ]
380 },
381 spacer,
382 {
383 type: 'hbox',
384 padding: 0,
385 widths: [ '60%', '40%' ],
386 children: [ {
387 type: 'text',
388 id: 'borderColor',
389 label: langCell.borderColor,
390 'default': '',
391 setup: setupCells( function( element ) {
392 var borderColorAttr = element.getAttribute( 'borderColor' ),
393 borderColorStyle = element.getStyle( 'border-color' );
394
395 return borderColorStyle || borderColorAttr;
396 } ),
397 commit: function( selectedCell ) {
398 var value = this.getValue();
399 if ( value )
400 selectedCell.setStyle( 'border-color', this.getValue() );
401 else
402 selectedCell.removeStyle( 'border-color' );
403
404 selectedCell.removeAttribute( 'borderColor' );
405 }
406 },
407
408 colorDialog ? {
409 type: 'button',
410 id: 'borderColorChoose',
411 'class': 'colorChooser', // jshint ignore:line
412 label: langCell.chooseColor,
413 style: ( rtl ? 'margin-right' : 'margin-left' ) + ': 10px',
414 onLoad: function() {
415 // Stick the element to the bottom (#5587)
416 this.getElement().getParent().setStyle( 'vertical-align', 'bottom' );
417 },
418 onClick: function() {
419 editor.getColorFromDialog( function( color ) {
420 if ( color )
421 this.getDialog().getContentElement( 'info', 'borderColor' ).setValue( color );
422 this.focus();
423 }, this );
424 }
425 } : spacer ]
426 } ]
427 } ]
428 } ]
429 } ],
430 onShow: function() {
431 this.cells = CKEDITOR.plugins.tabletools.getSelectedCells( this._.editor.getSelection() );
432 this.setupContent( this.cells );
433 },
434 onOk: function() {
435 var selection = this._.editor.getSelection(),
436 bookmarks = selection.createBookmarks();
437
438 var cells = this.cells;
439 for ( var i = 0; i < cells.length; i++ )
440 this.commitContent( cells[ i ] );
441
442 this._.editor.forceNextSelectionCheck();
443 selection.selectBookmarks( bookmarks );
444 this._.editor.selectionChange();
445 },
446 onLoad: function() {
447 var saved = {};
448
449 // Prevent from changing cell properties when the field's value
450 // remains unaltered, i.e. when selected multiple cells and dialog loaded
451 // only the properties of the first cell (#11439).
452 this.foreach( function( field ) {
453 if ( !field.setup || !field.commit )
454 return;
455
456 // Save field's value every time after "setup" is called.
457 field.setup = CKEDITOR.tools.override( field.setup, function( orgSetup ) {
458 return function() {
459 orgSetup.apply( this, arguments );
460 saved[ field.id ] = field.getValue();
461 };
462 } );
463
464 // Compare saved value with actual value. Update cell only if value has changed.
465 field.commit = CKEDITOR.tools.override( field.commit, function( orgCommit ) {
466 return function() {
467 if ( saved[ field.id ] !== field.getValue() )
468 orgCommit.apply( this, arguments );
469 };
470 } );
471 } );
472 }
473 };
474} );
diff --git a/sources/plugins/tabletools/plugin.js b/sources/plugins/tabletools/plugin.js
new file mode 100644
index 00000000..41b08af0
--- /dev/null
+++ b/sources/plugins/tabletools/plugin.js
@@ -0,0 +1,1005 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 var cellNodeRegex = /^(?:td|th)$/;
8
9 function getSelectedCells( selection ) {
10 var ranges = selection.getRanges();
11 var retval = [];
12 var database = {};
13
14 function moveOutOfCellGuard( node ) {
15 // Apply to the first cell only.
16 if ( retval.length > 0 )
17 return;
18
19 // If we are exiting from the first </td>, then the td should definitely be
20 // included.
21 if ( node.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( node.getName() ) && !node.getCustomData( 'selected_cell' ) ) {
22 CKEDITOR.dom.element.setMarker( database, node, 'selected_cell', true );
23 retval.push( node );
24 }
25 }
26
27 for ( var i = 0; i < ranges.length; i++ ) {
28 var range = ranges[ i ];
29
30 if ( range.collapsed ) {
31 // Walker does not handle collapsed ranges yet - fall back to old API.
32 var startNode = range.getCommonAncestor();
33 var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
34 if ( nearestCell )
35 retval.push( nearestCell );
36 } else {
37 var walker = new CKEDITOR.dom.walker( range );
38 var node;
39 walker.guard = moveOutOfCellGuard;
40
41 while ( ( node = walker.next() ) ) {
42 // If may be possible for us to have a range like this:
43 // <td>^1</td><td>^2</td>
44 // The 2nd td shouldn't be included.
45 //
46 // So we have to take care to include a td we've entered only when we've
47 // walked into its children.
48
49 if ( node.type != CKEDITOR.NODE_ELEMENT || !node.is( CKEDITOR.dtd.table ) ) {
50 var parent = node.getAscendant( 'td', true ) || node.getAscendant( 'th', true );
51 if ( parent && !parent.getCustomData( 'selected_cell' ) ) {
52 CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
53 retval.push( parent );
54 }
55 }
56 }
57 }
58 }
59
60 CKEDITOR.dom.element.clearAllMarkers( database );
61
62 return retval;
63 }
64
65 function getFocusElementAfterDelCells( cellsToDelete ) {
66 var i = 0,
67 last = cellsToDelete.length - 1,
68 database = {},
69 cell, focusedCell, tr;
70
71 while ( ( cell = cellsToDelete[ i++ ] ) )
72 CKEDITOR.dom.element.setMarker( database, cell, 'delete_cell', true );
73
74 // 1.first we check left or right side focusable cell row by row;
75 i = 0;
76 while ( ( cell = cellsToDelete[ i++ ] ) ) {
77 if ( ( focusedCell = cell.getPrevious() ) && !focusedCell.getCustomData( 'delete_cell' ) || ( focusedCell = cell.getNext() ) && !focusedCell.getCustomData( 'delete_cell' ) ) {
78 CKEDITOR.dom.element.clearAllMarkers( database );
79 return focusedCell;
80 }
81 }
82
83 CKEDITOR.dom.element.clearAllMarkers( database );
84
85 // 2. then we check the toppest row (outside the selection area square) focusable cell
86 tr = cellsToDelete[ 0 ].getParent();
87 if ( ( tr = tr.getPrevious() ) )
88 return tr.getLast();
89
90 // 3. last we check the lowerest row focusable cell
91 tr = cellsToDelete[ last ].getParent();
92 if ( ( tr = tr.getNext() ) )
93 return tr.getChild( 0 );
94
95 return null;
96 }
97
98 function insertRow( selection, insertBefore ) {
99 var cells = getSelectedCells( selection ),
100 firstCell = cells[ 0 ],
101 table = firstCell.getAscendant( 'table' ),
102 doc = firstCell.getDocument(),
103 startRow = cells[ 0 ].getParent(),
104 startRowIndex = startRow.$.rowIndex,
105 lastCell = cells[ cells.length - 1 ],
106 endRowIndex = lastCell.getParent().$.rowIndex + lastCell.$.rowSpan - 1,
107 endRow = new CKEDITOR.dom.element( table.$.rows[ endRowIndex ] ),
108 rowIndex = insertBefore ? startRowIndex : endRowIndex,
109 row = insertBefore ? startRow : endRow;
110
111 var map = CKEDITOR.tools.buildTableMap( table ),
112 cloneRow = map[ rowIndex ],
113 nextRow = insertBefore ? map[ rowIndex - 1 ] : map[ rowIndex + 1 ],
114 width = map[ 0 ].length;
115
116 var newRow = doc.createElement( 'tr' );
117 for ( var i = 0; cloneRow[ i ] && i < width; i++ ) {
118 var cell;
119 // Check whether there's a spanning row here, do not break it.
120 if ( cloneRow[ i ].rowSpan > 1 && nextRow && cloneRow[ i ] == nextRow[ i ] ) {
121 cell = cloneRow[ i ];
122 cell.rowSpan += 1;
123 } else {
124 cell = new CKEDITOR.dom.element( cloneRow[ i ] ).clone();
125 cell.removeAttribute( 'rowSpan' );
126 cell.appendBogus();
127 newRow.append( cell );
128 cell = cell.$;
129 }
130
131 i += cell.colSpan - 1;
132 }
133
134 insertBefore ? newRow.insertBefore( row ) : newRow.insertAfter( row );
135 }
136
137 function deleteRows( selectionOrRow ) {
138 if ( selectionOrRow instanceof CKEDITOR.dom.selection ) {
139 var cells = getSelectedCells( selectionOrRow ),
140 firstCell = cells[ 0 ],
141 table = firstCell.getAscendant( 'table' ),
142 map = CKEDITOR.tools.buildTableMap( table ),
143 startRow = cells[ 0 ].getParent(),
144 startRowIndex = startRow.$.rowIndex,
145 lastCell = cells[ cells.length - 1 ],
146 endRowIndex = lastCell.getParent().$.rowIndex + lastCell.$.rowSpan - 1,
147 rowsToDelete = [];
148
149 // Delete cell or reduce cell spans by checking through the table map.
150 for ( var i = startRowIndex; i <= endRowIndex; i++ ) {
151 var mapRow = map[ i ],
152 row = new CKEDITOR.dom.element( table.$.rows[ i ] );
153
154 for ( var j = 0; j < mapRow.length; j++ ) {
155 var cell = new CKEDITOR.dom.element( mapRow[ j ] ),
156 cellRowIndex = cell.getParent().$.rowIndex;
157
158 if ( cell.$.rowSpan == 1 )
159 cell.remove();
160 // Row spanned cell.
161 else {
162 // Span row of the cell, reduce spanning.
163 cell.$.rowSpan -= 1;
164 // Root row of the cell, root cell to next row.
165 if ( cellRowIndex == i ) {
166 var nextMapRow = map[ i + 1 ];
167 nextMapRow[ j - 1 ] ? cell.insertAfter( new CKEDITOR.dom.element( nextMapRow[ j - 1 ] ) ) : new CKEDITOR.dom.element( table.$.rows[ i + 1 ] ).append( cell, 1 );
168 }
169 }
170
171 j += cell.$.colSpan - 1;
172 }
173
174 rowsToDelete.push( row );
175 }
176
177 var rows = table.$.rows;
178
179 // Where to put the cursor after rows been deleted?
180 // 1. Into next sibling row if any;
181 // 2. Into previous sibling row if any;
182 // 3. Into table's parent element if it's the very last row.
183 var cursorPosition = new CKEDITOR.dom.element( rows[ endRowIndex + 1 ] || ( startRowIndex > 0 ? rows[ startRowIndex - 1 ] : null ) || table.$.parentNode );
184
185 for ( i = rowsToDelete.length; i >= 0; i-- )
186 deleteRows( rowsToDelete[ i ] );
187
188 return cursorPosition;
189 } else if ( selectionOrRow instanceof CKEDITOR.dom.element ) {
190 table = selectionOrRow.getAscendant( 'table' );
191
192 if ( table.$.rows.length == 1 )
193 table.remove();
194 else
195 selectionOrRow.remove();
196 }
197
198 return null;
199 }
200
201 function getCellColIndex( cell, isStart ) {
202 var row = cell.getParent(),
203 rowCells = row.$.cells;
204
205 var colIndex = 0;
206 for ( var i = 0; i < rowCells.length; i++ ) {
207 var mapCell = rowCells[ i ];
208 colIndex += isStart ? 1 : mapCell.colSpan;
209 if ( mapCell == cell.$ )
210 break;
211 }
212
213 return colIndex - 1;
214 }
215
216 function getColumnsIndices( cells, isStart ) {
217 var retval = isStart ? Infinity : 0;
218 for ( var i = 0; i < cells.length; i++ ) {
219 var colIndex = getCellColIndex( cells[ i ], isStart );
220 if ( isStart ? colIndex < retval : colIndex > retval )
221 retval = colIndex;
222 }
223 return retval;
224 }
225
226 function insertColumn( selection, insertBefore ) {
227 var cells = getSelectedCells( selection ),
228 firstCell = cells[ 0 ],
229 table = firstCell.getAscendant( 'table' ),
230 startCol = getColumnsIndices( cells, 1 ),
231 lastCol = getColumnsIndices( cells ),
232 colIndex = insertBefore ? startCol : lastCol;
233
234 var map = CKEDITOR.tools.buildTableMap( table ),
235 cloneCol = [],
236 nextCol = [],
237 height = map.length;
238
239 for ( var i = 0; i < height; i++ ) {
240 cloneCol.push( map[ i ][ colIndex ] );
241 var nextCell = insertBefore ? map[ i ][ colIndex - 1 ] : map[ i ][ colIndex + 1 ];
242 nextCol.push( nextCell );
243 }
244
245 for ( i = 0; i < height; i++ ) {
246 var cell;
247
248 if ( !cloneCol[ i ] )
249 continue;
250
251 // Check whether there's a spanning column here, do not break it.
252 if ( cloneCol[ i ].colSpan > 1 && nextCol[ i ] == cloneCol[ i ] ) {
253 cell = cloneCol[ i ];
254 cell.colSpan += 1;
255 } else {
256 cell = new CKEDITOR.dom.element( cloneCol[ i ] ).clone();
257 cell.removeAttribute( 'colSpan' );
258 cell.appendBogus();
259 cell[ insertBefore ? 'insertBefore' : 'insertAfter' ].call( cell, new CKEDITOR.dom.element( cloneCol[ i ] ) );
260 cell = cell.$;
261 }
262
263 i += cell.rowSpan - 1;
264 }
265 }
266
267 function deleteColumns( selectionOrCell ) {
268 var cells = getSelectedCells( selectionOrCell ),
269 firstCell = cells[ 0 ],
270 lastCell = cells[ cells.length - 1 ],
271 table = firstCell.getAscendant( 'table' ),
272 map = CKEDITOR.tools.buildTableMap( table ),
273 startColIndex, endColIndex,
274 rowsToDelete = [];
275
276 // Figure out selected cells' column indices.
277 for ( var i = 0, rows = map.length; i < rows; i++ ) {
278 for ( var j = 0, cols = map[ i ].length; j < cols; j++ ) {
279 if ( map[ i ][ j ] == firstCell.$ )
280 startColIndex = j;
281 if ( map[ i ][ j ] == lastCell.$ )
282 endColIndex = j;
283 }
284 }
285
286 // Delete cell or reduce cell spans by checking through the table map.
287 for ( i = startColIndex; i <= endColIndex; i++ ) {
288 for ( j = 0; j < map.length; j++ ) {
289 var mapRow = map[ j ],
290 row = new CKEDITOR.dom.element( table.$.rows[ j ] ),
291 cell = new CKEDITOR.dom.element( mapRow[ i ] );
292
293 if ( cell.$ ) {
294 if ( cell.$.colSpan == 1 )
295 cell.remove();
296 // Reduce the col spans.
297 else
298 cell.$.colSpan -= 1;
299
300 j += cell.$.rowSpan - 1;
301
302 if ( !row.$.cells.length )
303 rowsToDelete.push( row );
304 }
305 }
306 }
307
308 var firstRowCells = table.$.rows[ 0 ] && table.$.rows[ 0 ].cells;
309
310 // Where to put the cursor after columns been deleted?
311 // 1. Into next cell of the first row if any;
312 // 2. Into previous cell of the first row if any;
313 // 3. Into table's parent element;
314 var cursorPosition = new CKEDITOR.dom.element( firstRowCells[ startColIndex ] || ( startColIndex ? firstRowCells[ startColIndex - 1 ] : table.$.parentNode ) );
315
316 // Delete table rows only if all columns are gone (do not remove empty row).
317 if ( rowsToDelete.length == rows )
318 table.remove();
319
320 return cursorPosition;
321 }
322
323 function insertCell( selection, insertBefore ) {
324 var startElement = selection.getStartElement();
325 var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
326
327 if ( !cell )
328 return;
329
330 // Create the new cell element to be added.
331 var newCell = cell.clone();
332 newCell.appendBogus();
333
334 if ( insertBefore )
335 newCell.insertBefore( cell );
336 else
337 newCell.insertAfter( cell );
338 }
339
340 function deleteCells( selectionOrCell ) {
341 if ( selectionOrCell instanceof CKEDITOR.dom.selection ) {
342 var cellsToDelete = getSelectedCells( selectionOrCell );
343 var table = cellsToDelete[ 0 ] && cellsToDelete[ 0 ].getAscendant( 'table' );
344 var cellToFocus = getFocusElementAfterDelCells( cellsToDelete );
345
346 for ( var i = cellsToDelete.length - 1; i >= 0; i-- )
347 deleteCells( cellsToDelete[ i ] );
348
349 if ( cellToFocus )
350 placeCursorInCell( cellToFocus, true );
351 else if ( table )
352 table.remove();
353 } else if ( selectionOrCell instanceof CKEDITOR.dom.element ) {
354 var tr = selectionOrCell.getParent();
355 if ( tr.getChildCount() == 1 )
356 tr.remove();
357 else
358 selectionOrCell.remove();
359 }
360 }
361
362 // Remove filler at end and empty spaces around the cell content.
363 function trimCell( cell ) {
364 var bogus = cell.getBogus();
365 bogus && bogus.remove();
366 cell.trim();
367 }
368
369 function placeCursorInCell( cell, placeAtEnd ) {
370 var docInner = cell.getDocument(),
371 docOuter = CKEDITOR.document;
372
373 // Fixing "Unspecified error" thrown in IE10 by resetting
374 // selection the dirty and shameful way (#10308).
375 // We can not apply this hack to IE8 because
376 // it causes error (#11058).
377 if ( CKEDITOR.env.ie && CKEDITOR.env.version == 10 ) {
378 docOuter.focus();
379 docInner.focus();
380 }
381
382 var range = new CKEDITOR.dom.range( docInner );
383 if ( !range[ 'moveToElementEdit' + ( placeAtEnd ? 'End' : 'Start' ) ]( cell ) ) {
384 range.selectNodeContents( cell );
385 range.collapse( placeAtEnd ? false : true );
386 }
387 range.select( true );
388 }
389
390 function cellInRow( tableMap, rowIndex, cell ) {
391 var oRow = tableMap[ rowIndex ];
392 if ( typeof cell == 'undefined' )
393 return oRow;
394
395 for ( var c = 0; oRow && c < oRow.length; c++ ) {
396 if ( cell.is && oRow[ c ] == cell.$ )
397 return c;
398 else if ( c == cell )
399 return new CKEDITOR.dom.element( oRow[ c ] );
400 }
401 return cell.is ? -1 : null;
402 }
403
404 function cellInCol( tableMap, colIndex ) {
405 var oCol = [];
406 for ( var r = 0; r < tableMap.length; r++ ) {
407 var row = tableMap[ r ];
408 oCol.push( row[ colIndex ] );
409
410 // Avoid adding duplicate cells.
411 if ( row[ colIndex ].rowSpan > 1 )
412 r += row[ colIndex ].rowSpan - 1;
413 }
414 return oCol;
415 }
416
417 function mergeCells( selection, mergeDirection, isDetect ) {
418 var cells = getSelectedCells( selection );
419
420 // Invalid merge request if:
421 // 1. In batch mode despite that less than two selected.
422 // 2. In solo mode while not exactly only one selected.
423 // 3. Cells distributed in different table groups (e.g. from both thead and tbody).
424 var commonAncestor;
425 if ( ( mergeDirection ? cells.length != 1 : cells.length < 2 ) || ( commonAncestor = selection.getCommonAncestor() ) && commonAncestor.type == CKEDITOR.NODE_ELEMENT && commonAncestor.is( 'table' ) )
426 return false;
427
428 var cell,
429 firstCell = cells[ 0 ],
430 table = firstCell.getAscendant( 'table' ),
431 map = CKEDITOR.tools.buildTableMap( table ),
432 mapHeight = map.length,
433 mapWidth = map[ 0 ].length,
434 startRow = firstCell.getParent().$.rowIndex,
435 startColumn = cellInRow( map, startRow, firstCell );
436
437 if ( mergeDirection ) {
438 var targetCell;
439 try {
440 var rowspan = parseInt( firstCell.getAttribute( 'rowspan' ), 10 ) || 1;
441 var colspan = parseInt( firstCell.getAttribute( 'colspan' ), 10 ) || 1;
442
443 targetCell = map[ mergeDirection == 'up' ? ( startRow - rowspan ) : mergeDirection == 'down' ? ( startRow + rowspan ) : startRow ][
444 mergeDirection == 'left' ?
445 ( startColumn - colspan ) :
446 mergeDirection == 'right' ? ( startColumn + colspan ) : startColumn ];
447
448 } catch ( er ) {
449 return false;
450 }
451
452 // 1. No cell could be merged.
453 // 2. Same cell actually.
454 if ( !targetCell || firstCell.$ == targetCell )
455 return false;
456
457 // Sort in map order regardless of the DOM sequence.
458 cells[ ( mergeDirection == 'up' || mergeDirection == 'left' ) ? 'unshift' : 'push' ]( new CKEDITOR.dom.element( targetCell ) );
459 }
460
461 // Start from here are merging way ignorance (merge up/right, batch merge).
462 var doc = firstCell.getDocument(),
463 lastRowIndex = startRow,
464 totalRowSpan = 0,
465 totalColSpan = 0,
466 // Use a documentFragment as buffer when appending cell contents.
467 frag = !isDetect && new CKEDITOR.dom.documentFragment( doc ),
468 dimension = 0;
469
470 for ( var i = 0; i < cells.length; i++ ) {
471 cell = cells[ i ];
472
473 var tr = cell.getParent(),
474 cellFirstChild = cell.getFirst(),
475 colSpan = cell.$.colSpan,
476 rowSpan = cell.$.rowSpan,
477 rowIndex = tr.$.rowIndex,
478 colIndex = cellInRow( map, rowIndex, cell );
479
480 // Accumulated the actual places taken by all selected cells.
481 dimension += colSpan * rowSpan;
482 // Accumulated the maximum virtual spans from column and row.
483 totalColSpan = Math.max( totalColSpan, colIndex - startColumn + colSpan );
484 totalRowSpan = Math.max( totalRowSpan, rowIndex - startRow + rowSpan );
485
486 if ( !isDetect ) {
487 // Trim all cell fillers and check to remove empty cells.
488 if ( trimCell( cell ), cell.getChildren().count() ) {
489 // Merge vertically cells as two separated paragraphs.
490 if ( rowIndex != lastRowIndex && cellFirstChild && !( cellFirstChild.isBlockBoundary && cellFirstChild.isBlockBoundary( { br: 1 } ) ) ) {
491 var last = frag.getLast( CKEDITOR.dom.walker.whitespaces( true ) );
492 if ( last && !( last.is && last.is( 'br' ) ) )
493 frag.append( 'br' );
494 }
495
496 cell.moveChildren( frag );
497 }
498 i ? cell.remove() : cell.setHtml( '' );
499 }
500 lastRowIndex = rowIndex;
501 }
502
503 if ( !isDetect ) {
504 frag.moveChildren( firstCell );
505
506 firstCell.appendBogus();
507
508 if ( totalColSpan >= mapWidth )
509 firstCell.removeAttribute( 'rowSpan' );
510 else
511 firstCell.$.rowSpan = totalRowSpan;
512
513 if ( totalRowSpan >= mapHeight )
514 firstCell.removeAttribute( 'colSpan' );
515 else
516 firstCell.$.colSpan = totalColSpan;
517
518 // Swip empty <tr> left at the end of table due to the merging.
519 var trs = new CKEDITOR.dom.nodeList( table.$.rows ),
520 count = trs.count();
521
522 for ( i = count - 1; i >= 0; i-- ) {
523 var tailTr = trs.getItem( i );
524 if ( !tailTr.$.cells.length ) {
525 tailTr.remove();
526 count++;
527 continue;
528 }
529 }
530
531 return firstCell;
532 }
533 // Be able to merge cells only if actual dimension of selected
534 // cells equals to the caculated rectangle.
535 else {
536 return ( totalRowSpan * totalColSpan ) == dimension;
537 }
538 }
539
540 function horizontalSplitCell( selection, isDetect ) {
541 var cells = getSelectedCells( selection );
542 if ( cells.length > 1 )
543 return false;
544 else if ( isDetect )
545 return true;
546
547 var cell = cells[ 0 ],
548 tr = cell.getParent(),
549 table = tr.getAscendant( 'table' ),
550 map = CKEDITOR.tools.buildTableMap( table ),
551 rowIndex = tr.$.rowIndex,
552 colIndex = cellInRow( map, rowIndex, cell ),
553 rowSpan = cell.$.rowSpan,
554 newCell, newRowSpan, newCellRowSpan, newRowIndex;
555
556 if ( rowSpan > 1 ) {
557 newRowSpan = Math.ceil( rowSpan / 2 );
558 newCellRowSpan = Math.floor( rowSpan / 2 );
559 newRowIndex = rowIndex + newRowSpan;
560 var newCellTr = new CKEDITOR.dom.element( table.$.rows[ newRowIndex ] ),
561 newCellRow = cellInRow( map, newRowIndex ),
562 candidateCell;
563
564 newCell = cell.clone();
565
566 // Figure out where to insert the new cell by checking the vitual row.
567 for ( var c = 0; c < newCellRow.length; c++ ) {
568 candidateCell = newCellRow[ c ];
569 // Catch first cell actually following the column.
570 if ( candidateCell.parentNode == newCellTr.$ && c > colIndex ) {
571 newCell.insertBefore( new CKEDITOR.dom.element( candidateCell ) );
572 break;
573 } else {
574 candidateCell = null;
575 }
576 }
577
578 // The destination row is empty, append at will.
579 if ( !candidateCell )
580 newCellTr.append( newCell );
581 } else {
582 newCellRowSpan = newRowSpan = 1;
583
584 newCellTr = tr.clone();
585 newCellTr.insertAfter( tr );
586 newCellTr.append( newCell = cell.clone() );
587
588 var cellsInSameRow = cellInRow( map, rowIndex );
589 for ( var i = 0; i < cellsInSameRow.length; i++ )
590 cellsInSameRow[ i ].rowSpan++;
591 }
592
593 newCell.appendBogus();
594
595 cell.$.rowSpan = newRowSpan;
596 newCell.$.rowSpan = newCellRowSpan;
597 if ( newRowSpan == 1 )
598 cell.removeAttribute( 'rowSpan' );
599 if ( newCellRowSpan == 1 )
600 newCell.removeAttribute( 'rowSpan' );
601
602 return newCell;
603 }
604
605 function verticalSplitCell( selection, isDetect ) {
606 var cells = getSelectedCells( selection );
607 if ( cells.length > 1 )
608 return false;
609 else if ( isDetect )
610 return true;
611
612 var cell = cells[ 0 ],
613 tr = cell.getParent(),
614 table = tr.getAscendant( 'table' ),
615 map = CKEDITOR.tools.buildTableMap( table ),
616 rowIndex = tr.$.rowIndex,
617 colIndex = cellInRow( map, rowIndex, cell ),
618 colSpan = cell.$.colSpan,
619 newCell, newColSpan, newCellColSpan;
620
621 if ( colSpan > 1 ) {
622 newColSpan = Math.ceil( colSpan / 2 );
623 newCellColSpan = Math.floor( colSpan / 2 );
624 } else {
625 newCellColSpan = newColSpan = 1;
626 var cellsInSameCol = cellInCol( map, colIndex );
627 for ( var i = 0; i < cellsInSameCol.length; i++ )
628 cellsInSameCol[ i ].colSpan++;
629 }
630 newCell = cell.clone();
631 newCell.insertAfter( cell );
632 newCell.appendBogus();
633
634 cell.$.colSpan = newColSpan;
635 newCell.$.colSpan = newCellColSpan;
636 if ( newColSpan == 1 )
637 cell.removeAttribute( 'colSpan' );
638 if ( newCellColSpan == 1 )
639 newCell.removeAttribute( 'colSpan' );
640
641 return newCell;
642 }
643
644 CKEDITOR.plugins.tabletools = {
645 requires: 'table,dialog,contextmenu',
646 init: function( editor ) {
647 var lang = editor.lang.table;
648
649 function createDef( def ) {
650 return CKEDITOR.tools.extend( def || {}, {
651 contextSensitive: 1,
652 refresh: function( editor, path ) {
653 this.setState( path.contains( { td: 1, th: 1 }, 1 ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
654 }
655 } );
656 }
657 function addCmd( name, def ) {
658 var cmd = editor.addCommand( name, def );
659 editor.addFeature( cmd );
660 }
661
662 addCmd( 'cellProperties', new CKEDITOR.dialogCommand( 'cellProperties', createDef( {
663 allowedContent: 'td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]',
664 requiredContent: 'table'
665 } ) ) );
666 CKEDITOR.dialog.add( 'cellProperties', this.path + 'dialogs/tableCell.js' );
667
668 addCmd( 'rowDelete', createDef( {
669 requiredContent: 'table',
670 exec: function( editor ) {
671 var selection = editor.getSelection();
672 placeCursorInCell( deleteRows( selection ) );
673 }
674 } ) );
675
676 addCmd( 'rowInsertBefore', createDef( {
677 requiredContent: 'table',
678 exec: function( editor ) {
679 var selection = editor.getSelection();
680 insertRow( selection, true );
681 }
682 } ) );
683
684 addCmd( 'rowInsertAfter', createDef( {
685 requiredContent: 'table',
686 exec: function( editor ) {
687 var selection = editor.getSelection();
688 insertRow( selection );
689 }
690 } ) );
691
692 addCmd( 'columnDelete', createDef( {
693 requiredContent: 'table',
694 exec: function( editor ) {
695 var selection = editor.getSelection();
696 var element = deleteColumns( selection );
697 element && placeCursorInCell( element, true );
698 }
699 } ) );
700
701 addCmd( 'columnInsertBefore', createDef( {
702 requiredContent: 'table',
703 exec: function( editor ) {
704 var selection = editor.getSelection();
705 insertColumn( selection, true );
706 }
707 } ) );
708
709 addCmd( 'columnInsertAfter', createDef( {
710 requiredContent: 'table',
711 exec: function( editor ) {
712 var selection = editor.getSelection();
713 insertColumn( selection );
714 }
715 } ) );
716
717 addCmd( 'cellDelete', createDef( {
718 requiredContent: 'table',
719 exec: function( editor ) {
720 var selection = editor.getSelection();
721 deleteCells( selection );
722 }
723 } ) );
724
725 addCmd( 'cellMerge', createDef( {
726 allowedContent: 'td[colspan,rowspan]',
727 requiredContent: 'td[colspan,rowspan]',
728 exec: function( editor ) {
729 placeCursorInCell( mergeCells( editor.getSelection() ), true );
730 }
731 } ) );
732
733 addCmd( 'cellMergeRight', createDef( {
734 allowedContent: 'td[colspan]',
735 requiredContent: 'td[colspan]',
736 exec: function( editor ) {
737 placeCursorInCell( mergeCells( editor.getSelection(), 'right' ), true );
738 }
739 } ) );
740
741 addCmd( 'cellMergeDown', createDef( {
742 allowedContent: 'td[rowspan]',
743 requiredContent: 'td[rowspan]',
744 exec: function( editor ) {
745 placeCursorInCell( mergeCells( editor.getSelection(), 'down' ), true );
746 }
747 } ) );
748
749 addCmd( 'cellVerticalSplit', createDef( {
750 allowedContent: 'td[rowspan]',
751 requiredContent: 'td[rowspan]',
752 exec: function( editor ) {
753 placeCursorInCell( verticalSplitCell( editor.getSelection() ) );
754 }
755 } ) );
756
757 addCmd( 'cellHorizontalSplit', createDef( {
758 allowedContent: 'td[colspan]',
759 requiredContent: 'td[colspan]',
760 exec: function( editor ) {
761 placeCursorInCell( horizontalSplitCell( editor.getSelection() ) );
762 }
763 } ) );
764
765 addCmd( 'cellInsertBefore', createDef( {
766 requiredContent: 'table',
767 exec: function( editor ) {
768 var selection = editor.getSelection();
769 insertCell( selection, true );
770 }
771 } ) );
772
773 addCmd( 'cellInsertAfter', createDef( {
774 requiredContent: 'table',
775 exec: function( editor ) {
776 var selection = editor.getSelection();
777 insertCell( selection );
778 }
779 } ) );
780
781 // If the "menu" plugin is loaded, register the menu items.
782 if ( editor.addMenuItems ) {
783 editor.addMenuItems( {
784 tablecell: {
785 label: lang.cell.menu,
786 group: 'tablecell',
787 order: 1,
788 getItems: function() {
789 var selection = editor.getSelection(),
790 cells = getSelectedCells( selection );
791 return {
792 tablecell_insertBefore: CKEDITOR.TRISTATE_OFF,
793 tablecell_insertAfter: CKEDITOR.TRISTATE_OFF,
794 tablecell_delete: CKEDITOR.TRISTATE_OFF,
795 tablecell_merge: mergeCells( selection, null, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
796 tablecell_merge_right: mergeCells( selection, 'right', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
797 tablecell_merge_down: mergeCells( selection, 'down', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
798 tablecell_split_vertical: verticalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
799 tablecell_split_horizontal: horizontalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
800 tablecell_properties: cells.length > 0 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
801 };
802 }
803 },
804
805 tablecell_insertBefore: {
806 label: lang.cell.insertBefore,
807 group: 'tablecell',
808 command: 'cellInsertBefore',
809 order: 5
810 },
811
812 tablecell_insertAfter: {
813 label: lang.cell.insertAfter,
814 group: 'tablecell',
815 command: 'cellInsertAfter',
816 order: 10
817 },
818
819 tablecell_delete: {
820 label: lang.cell.deleteCell,
821 group: 'tablecell',
822 command: 'cellDelete',
823 order: 15
824 },
825
826 tablecell_merge: {
827 label: lang.cell.merge,
828 group: 'tablecell',
829 command: 'cellMerge',
830 order: 16
831 },
832
833 tablecell_merge_right: {
834 label: lang.cell.mergeRight,
835 group: 'tablecell',
836 command: 'cellMergeRight',
837 order: 17
838 },
839
840 tablecell_merge_down: {
841 label: lang.cell.mergeDown,
842 group: 'tablecell',
843 command: 'cellMergeDown',
844 order: 18
845 },
846
847 tablecell_split_horizontal: {
848 label: lang.cell.splitHorizontal,
849 group: 'tablecell',
850 command: 'cellHorizontalSplit',
851 order: 19
852 },
853
854 tablecell_split_vertical: {
855 label: lang.cell.splitVertical,
856 group: 'tablecell',
857 command: 'cellVerticalSplit',
858 order: 20
859 },
860
861 tablecell_properties: {
862 label: lang.cell.title,
863 group: 'tablecellproperties',
864 command: 'cellProperties',
865 order: 21
866 },
867
868 tablerow: {
869 label: lang.row.menu,
870 group: 'tablerow',
871 order: 1,
872 getItems: function() {
873 return {
874 tablerow_insertBefore: CKEDITOR.TRISTATE_OFF,
875 tablerow_insertAfter: CKEDITOR.TRISTATE_OFF,
876 tablerow_delete: CKEDITOR.TRISTATE_OFF
877 };
878 }
879 },
880
881 tablerow_insertBefore: {
882 label: lang.row.insertBefore,
883 group: 'tablerow',
884 command: 'rowInsertBefore',
885 order: 5
886 },
887
888 tablerow_insertAfter: {
889 label: lang.row.insertAfter,
890 group: 'tablerow',
891 command: 'rowInsertAfter',
892 order: 10
893 },
894
895 tablerow_delete: {
896 label: lang.row.deleteRow,
897 group: 'tablerow',
898 command: 'rowDelete',
899 order: 15
900 },
901
902 tablecolumn: {
903 label: lang.column.menu,
904 group: 'tablecolumn',
905 order: 1,
906 getItems: function() {
907 return {
908 tablecolumn_insertBefore: CKEDITOR.TRISTATE_OFF,
909 tablecolumn_insertAfter: CKEDITOR.TRISTATE_OFF,
910 tablecolumn_delete: CKEDITOR.TRISTATE_OFF
911 };
912 }
913 },
914
915 tablecolumn_insertBefore: {
916 label: lang.column.insertBefore,
917 group: 'tablecolumn',
918 command: 'columnInsertBefore',
919 order: 5
920 },
921
922 tablecolumn_insertAfter: {
923 label: lang.column.insertAfter,
924 group: 'tablecolumn',
925 command: 'columnInsertAfter',
926 order: 10
927 },
928
929 tablecolumn_delete: {
930 label: lang.column.deleteColumn,
931 group: 'tablecolumn',
932 command: 'columnDelete',
933 order: 15
934 }
935 } );
936 }
937
938 // If the "contextmenu" plugin is laoded, register the listeners.
939 if ( editor.contextMenu ) {
940 editor.contextMenu.addListener( function( element, selection, path ) {
941 var cell = path.contains( { 'td': 1, 'th': 1 }, 1 );
942 if ( cell && !cell.isReadOnly() ) {
943 return {
944 tablecell: CKEDITOR.TRISTATE_OFF,
945 tablerow: CKEDITOR.TRISTATE_OFF,
946 tablecolumn: CKEDITOR.TRISTATE_OFF
947 };
948 }
949
950 return null;
951 } );
952 }
953 },
954
955 getSelectedCells: getSelectedCells
956
957 };
958 CKEDITOR.plugins.add( 'tabletools', CKEDITOR.plugins.tabletools );
959} )();
960
961/**
962 * Create a two-dimension array that reflects the actual layout of table cells,
963 * with cell spans, with mappings to the original td elements.
964 *
965 * @param {CKEDITOR.dom.element} table
966 * @member CKEDITOR.tools
967 */
968CKEDITOR.tools.buildTableMap = function( table ) {
969 var aRows = table.$.rows;
970
971 // Row and Column counters.
972 var r = -1;
973
974 var aMap = [];
975
976 for ( var i = 0; i < aRows.length; i++ ) {
977 r++;
978 !aMap[ r ] && ( aMap[ r ] = [] );
979
980 var c = -1;
981
982 for ( var j = 0; j < aRows[ i ].cells.length; j++ ) {
983 var oCell = aRows[ i ].cells[ j ];
984
985 c++;
986 while ( aMap[ r ][ c ] )
987 c++;
988
989 var iColSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan;
990 var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : oCell.rowSpan;
991
992 for ( var rs = 0; rs < iRowSpan; rs++ ) {
993 if ( !aMap[ r + rs ] )
994 aMap[ r + rs ] = [];
995
996 for ( var cs = 0; cs < iColSpan; cs++ ) {
997 aMap[ r + rs ][ c + cs ] = aRows[ i ].cells[ j ];
998 }
999 }
1000
1001 c += iColSpan - 1;
1002 }
1003 }
1004 return aMap;
1005};
diff --git a/sources/plugins/templates/dialogs/templates.css b/sources/plugins/templates/dialogs/templates.css
new file mode 100644
index 00000000..7fc4a1bc
--- /dev/null
+++ b/sources/plugins/templates/dialogs/templates.css
@@ -0,0 +1,84 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5
6.cke_tpl_list
7{
8 border: #dcdcdc 2px solid;
9 background-color: #ffffff;
10 overflow-y: auto;
11 overflow-x: hidden;
12 width: 100%;
13 height: 220px;
14}
15
16.cke_tpl_item
17{
18 margin: 5px;
19 padding: 7px;
20 border: #eeeeee 1px solid;
21 *width: 88%;
22}
23
24.cke_tpl_preview
25{
26 border-collapse: separate;
27 text-indent:0;
28 width: 100%;
29}
30.cke_tpl_preview td
31{
32 padding: 2px;
33 vertical-align: middle;
34}
35.cke_tpl_preview .cke_tpl_preview_img
36{
37 width: 100px;
38}
39.cke_tpl_preview span
40{
41 white-space: normal;
42}
43
44.cke_tpl_title
45{
46 font-weight: bold;
47}
48
49.cke_tpl_list a:hover .cke_tpl_item,
50.cke_tpl_list a:focus .cke_tpl_item,
51.cke_tpl_list a:active .cke_tpl_item
52{
53 border: #ff9933 1px solid;
54 background-color: #fffacd;
55}
56
57.cke_tpl_list a:hover *,
58.cke_tpl_list a:focus *,
59.cke_tpl_list a:active *
60{
61 cursor: pointer;
62}
63
64/* IE Quirks contextual selectors children will not get :hover transition until
65 the hover style of the link itself contains certain CSS declarations. */
66.cke_browser_quirks .cke_tpl_list a:active,
67.cke_browser_quirks .cke_tpl_list a:hover,
68.cke_browser_quirks .cke_tpl_list a:focus
69{
70 background-position: 0 0;
71}
72
73.cke_hc .cke_tpl_list a:hover .cke_tpl_item,
74.cke_hc .cke_tpl_list a:focus .cke_tpl_item,
75.cke_hc .cke_tpl_list a:active .cke_tpl_item
76{
77 border-width: 3px;
78}
79
80.cke_tpl_empty, .cke_tpl_loading
81{
82 text-align: center;
83 padding: 5px;
84}
diff --git a/sources/plugins/templates/dialogs/templates.js b/sources/plugins/templates/dialogs/templates.js
new file mode 100644
index 00000000..93dca0a8
--- /dev/null
+++ b/sources/plugins/templates/dialogs/templates.js
@@ -0,0 +1,199 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7
8 CKEDITOR.dialog.add( 'templates', function( editor ) {
9 // Constructs the HTML view of the specified templates data.
10 function renderTemplatesList( container, templatesDefinitions ) {
11 // clear loading wait text.
12 container.setHtml( '' );
13
14 for ( var i = 0, totalDefs = templatesDefinitions.length; i < totalDefs; i++ ) {
15 var definition = CKEDITOR.getTemplates( templatesDefinitions[ i ] ),
16 imagesPath = definition.imagesPath,
17 templates = definition.templates,
18 count = templates.length;
19
20 for ( var j = 0; j < count; j++ ) {
21 var template = templates[ j ],
22 item = createTemplateItem( template, imagesPath );
23 item.setAttribute( 'aria-posinset', j + 1 );
24 item.setAttribute( 'aria-setsize', count );
25 container.append( item );
26 }
27 }
28 }
29
30 function createTemplateItem( template, imagesPath ) {
31 var item = CKEDITOR.dom.element.createFromHtml( '<a href="javascript:void(0)" tabIndex="-1" role="option" >' +
32 '<div class="cke_tpl_item"></div>' +
33 '</a>' );
34
35 // Build the inner HTML of our new item DIV.
36 var html = '<table style="width:350px;" class="cke_tpl_preview" role="presentation"><tr>';
37
38 if ( template.image && imagesPath ) {
39 html += '<td class="cke_tpl_preview_img"><img src="' +
40 CKEDITOR.getUrl( imagesPath + template.image ) + '"' +
41 ( CKEDITOR.env.ie6Compat ? ' onload="this.width=this.width"' : '' ) + ' alt="" title=""></td>';
42 }
43
44 html += '<td style="white-space:normal;"><span class="cke_tpl_title">' + template.title + '</span><br/>';
45
46 if ( template.description )
47 html += '<span>' + template.description + '</span>';
48
49 html += '</td></tr></table>';
50
51 item.getFirst().setHtml( html );
52
53 item.on( 'click', function() {
54 insertTemplate( template.html );
55 } );
56
57 return item;
58 }
59
60 // Insert the specified template content into editor.
61 // @param {Number} index
62 function insertTemplate( html ) {
63 var dialog = CKEDITOR.dialog.getCurrent(),
64 isReplace = dialog.getValueOf( 'selectTpl', 'chkInsertOpt' );
65
66 if ( isReplace ) {
67 editor.fire( 'saveSnapshot' );
68 // Everything should happen after the document is loaded (#4073).
69 editor.setData( html, function() {
70 dialog.hide();
71
72 // Place the cursor at the first editable place.
73 var range = editor.createRange();
74 range.moveToElementEditStart( editor.editable() );
75 range.select();
76 setTimeout( function() {
77 editor.fire( 'saveSnapshot' );
78 }, 0 );
79
80 } );
81 } else {
82 editor.insertHtml( html );
83 dialog.hide();
84 }
85 }
86
87 function keyNavigation( evt ) {
88 var target = evt.data.getTarget(),
89 onList = listContainer.equals( target );
90
91 // Keyboard navigation for template list.
92 if ( onList || listContainer.contains( target ) ) {
93 var keystroke = evt.data.getKeystroke(),
94 items = listContainer.getElementsByTag( 'a' ),
95 focusItem;
96
97 if ( items ) {
98 // Focus not yet onto list items?
99 if ( onList )
100 focusItem = items.getItem( 0 );
101 else {
102 switch ( keystroke ) {
103 case 40: // ARROW-DOWN
104 focusItem = target.getNext();
105 break;
106
107 case 38: // ARROW-UP
108 focusItem = target.getPrevious();
109 break;
110
111 case 13: // ENTER
112 case 32: // SPACE
113 target.fire( 'click' );
114 }
115 }
116
117 if ( focusItem ) {
118 focusItem.focus();
119 evt.data.preventDefault();
120 }
121 }
122 }
123 }
124
125 // Load skin at first.
126 var plugin = CKEDITOR.plugins.get( 'templates' );
127 CKEDITOR.document.appendStyleSheet( CKEDITOR.getUrl( plugin.path + 'dialogs/templates.css' ) );
128
129
130 var listContainer;
131
132 var templateListLabelId = 'cke_tpl_list_label_' + CKEDITOR.tools.getNextNumber(),
133 lang = editor.lang.templates,
134 config = editor.config;
135 return {
136 title: editor.lang.templates.title,
137
138 minWidth: CKEDITOR.env.ie ? 440 : 400,
139 minHeight: 340,
140
141 contents: [ {
142 id: 'selectTpl',
143 label: lang.title,
144 elements: [ {
145 type: 'vbox',
146 padding: 5,
147 children: [ {
148 id: 'selectTplText',
149 type: 'html',
150 html: '<span>' +
151 lang.selectPromptMsg +
152 '</span>'
153 },
154 {
155 id: 'templatesList',
156 type: 'html',
157 focus: true,
158 html: '<div class="cke_tpl_list" tabIndex="-1" role="listbox" aria-labelledby="' + templateListLabelId + '">' +
159 '<div class="cke_tpl_loading"><span></span></div>' +
160 '</div>' +
161 '<span class="cke_voice_label" id="' + templateListLabelId + '">' + lang.options + '</span>'
162 },
163 {
164 id: 'chkInsertOpt',
165 type: 'checkbox',
166 label: lang.insertOption,
167 'default': config.templates_replaceContent
168 } ]
169 } ]
170 } ],
171
172 buttons: [ CKEDITOR.dialog.cancelButton ],
173
174 onShow: function() {
175 var templatesListField = this.getContentElement( 'selectTpl', 'templatesList' );
176 listContainer = templatesListField.getElement();
177
178 CKEDITOR.loadTemplates( config.templates_files, function() {
179 var templates = ( config.templates || 'default' ).split( ',' );
180
181 if ( templates.length ) {
182 renderTemplatesList( listContainer, templates );
183 templatesListField.focus();
184 } else {
185 listContainer.setHtml( '<div class="cke_tpl_empty">' +
186 '<span>' + lang.emptyListMsg + '</span>' +
187 '</div>' );
188 }
189 } );
190
191 this._.element.on( 'keydown', keyNavigation );
192 },
193
194 onHide: function() {
195 this._.element.removeListener( 'keydown', keyNavigation );
196 }
197 };
198 } );
199} )();
diff --git a/sources/plugins/templates/icons/hidpi/templates-rtl.png b/sources/plugins/templates/icons/hidpi/templates-rtl.png
new file mode 100644
index 00000000..9a263404
--- /dev/null
+++ b/sources/plugins/templates/icons/hidpi/templates-rtl.png
Binary files differ
diff --git a/sources/plugins/templates/icons/hidpi/templates.png b/sources/plugins/templates/icons/hidpi/templates.png
new file mode 100644
index 00000000..9a263404
--- /dev/null
+++ b/sources/plugins/templates/icons/hidpi/templates.png
Binary files differ
diff --git a/sources/plugins/templates/icons/templates-rtl.png b/sources/plugins/templates/icons/templates-rtl.png
new file mode 100644
index 00000000..202b6045
--- /dev/null
+++ b/sources/plugins/templates/icons/templates-rtl.png
Binary files differ
diff --git a/sources/plugins/templates/icons/templates.png b/sources/plugins/templates/icons/templates.png
new file mode 100644
index 00000000..202b6045
--- /dev/null
+++ b/sources/plugins/templates/icons/templates.png
Binary files differ
diff --git a/sources/plugins/templates/lang/af.js b/sources/plugins/templates/lang/af.js
new file mode 100644
index 00000000..92290482
--- /dev/null
+++ b/sources/plugins/templates/lang/af.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'af', {
6 button: 'Sjablone',
7 emptyListMsg: '(Geen sjablone gedefineer nie)',
8 insertOption: 'Vervang huidige inhoud',
9 options: 'Sjabloon opsies',
10 selectPromptMsg: 'Kies die sjabloon om te gebruik in die redigeerder (huidige inhoud gaan verlore):',
11 title: 'Inhoud Sjablone'
12} );
diff --git a/sources/plugins/templates/lang/ar.js b/sources/plugins/templates/lang/ar.js
new file mode 100644
index 00000000..39f378de
--- /dev/null
+++ b/sources/plugins/templates/lang/ar.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ar', {
6 button: 'القوالب',
7 emptyListMsg: '(لم يتم تعريف أي قالب)',
8 insertOption: 'استبدال المحتوى',
9 options: 'خصائص القوالب',
10 selectPromptMsg: 'اختر القالب الذي تود وضعه في المحرر',
11 title: 'قوالب المحتوى'
12} );
diff --git a/sources/plugins/templates/lang/bg.js b/sources/plugins/templates/lang/bg.js
new file mode 100644
index 00000000..815fd0b3
--- /dev/null
+++ b/sources/plugins/templates/lang/bg.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'bg', {
6 button: 'Шаблони',
7 emptyListMsg: '(Няма дефинирани шаблони)',
8 insertOption: 'Препокрива актуалното съдържание',
9 options: 'Опции за шаблона',
10 selectPromptMsg: 'Изберете шаблон <br>(текущото съдържание на редактора ще бъде загубено):',
11 title: 'Шаблони'
12} );
diff --git a/sources/plugins/templates/lang/bn.js b/sources/plugins/templates/lang/bn.js
new file mode 100644
index 00000000..84d5a885
--- /dev/null
+++ b/sources/plugins/templates/lang/bn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'bn', {
6 button: 'টেমপ্লেট',
7 emptyListMsg: '(কোন টেমপ্লেট ডিফাইন করা নেই)',
8 insertOption: 'Replace actual contents', // MISSING
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'অনুগ্রহ করে এডিটরে ওপেন করার জন্য টেমপ্লেট বাছাই করুন<br>(আসল কনটেন্ট হারিয়ে যাবে):',
11 title: 'কনটেন্ট টেমপ্লেট'
12} );
diff --git a/sources/plugins/templates/lang/bs.js b/sources/plugins/templates/lang/bs.js
new file mode 100644
index 00000000..78bf198d
--- /dev/null
+++ b/sources/plugins/templates/lang/bs.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'bs', {
6 button: 'Templates', // MISSING
7 emptyListMsg: '(No templates defined)', // MISSING
8 insertOption: 'Replace actual contents', // MISSING
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Please select the template to open in the editor', // MISSING
11 title: 'Content Templates' // MISSING
12} );
diff --git a/sources/plugins/templates/lang/ca.js b/sources/plugins/templates/lang/ca.js
new file mode 100644
index 00000000..e41831a2
--- /dev/null
+++ b/sources/plugins/templates/lang/ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ca', {
6 button: 'Plantilles',
7 emptyListMsg: '(No hi ha plantilles definides)',
8 insertOption: 'Reemplaça el contingut actual',
9 options: 'Opcions de plantilla',
10 selectPromptMsg: 'Seleccioneu una plantilla per usar a l\'editor<br>(per defecte s\'elimina el contingut actual):',
11 title: 'Plantilles de contingut'
12} );
diff --git a/sources/plugins/templates/lang/cs.js b/sources/plugins/templates/lang/cs.js
new file mode 100644
index 00000000..d9d25511
--- /dev/null
+++ b/sources/plugins/templates/lang/cs.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'cs', {
6 button: 'Šablony',
7 emptyListMsg: '(Není definována žádná šablona)',
8 insertOption: 'Nahradit aktuální obsah',
9 options: 'Nastavení šablon',
10 selectPromptMsg: 'Prosím zvolte šablonu pro otevření v editoru<br>(aktuální obsah editoru bude ztracen):',
11 title: 'Šablony obsahu'
12} );
diff --git a/sources/plugins/templates/lang/cy.js b/sources/plugins/templates/lang/cy.js
new file mode 100644
index 00000000..eefb9b86
--- /dev/null
+++ b/sources/plugins/templates/lang/cy.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'cy', {
6 button: 'Templedi',
7 emptyListMsg: '(Dim templedi wedi\'u diffinio)',
8 insertOption: 'Amnewid y cynnwys go iawn',
9 options: 'Opsiynau Templedi',
10 selectPromptMsg: 'Dewiswch dempled i\'w agor yn y golygydd',
11 title: 'Templedi Cynnwys'
12} );
diff --git a/sources/plugins/templates/lang/da.js b/sources/plugins/templates/lang/da.js
new file mode 100644
index 00000000..fe0dd1da
--- /dev/null
+++ b/sources/plugins/templates/lang/da.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'da', {
6 button: 'Skabeloner',
7 emptyListMsg: '(Der er ikke defineret nogen skabelon)',
8 insertOption: 'Erstat det faktiske indhold',
9 options: 'Skabelon muligheder',
10 selectPromptMsg: 'Vælg den skabelon, som skal åbnes i editoren (nuværende indhold vil blive overskrevet):',
11 title: 'Indholdsskabeloner'
12} );
diff --git a/sources/plugins/templates/lang/de.js b/sources/plugins/templates/lang/de.js
new file mode 100644
index 00000000..f354c26f
--- /dev/null
+++ b/sources/plugins/templates/lang/de.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'de', {
6 button: 'Vorlagen',
7 emptyListMsg: '(Keine Vorlagen definiert)',
8 insertOption: 'Aktuelle Inhalte ersetzen',
9 options: 'Vorlagenoptionen',
10 selectPromptMsg: 'Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen',
11 title: 'Inhaltsvorlagen'
12} );
diff --git a/sources/plugins/templates/lang/el.js b/sources/plugins/templates/lang/el.js
new file mode 100644
index 00000000..2d5bbb77
--- /dev/null
+++ b/sources/plugins/templates/lang/el.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'el', {
6 button: 'Πρότυπα',
7 emptyListMsg: '(Δεν έχουν καθοριστεί πρότυπα)',
8 insertOption: 'Αντικατάσταση υπάρχοντων περιεχομένων',
9 options: 'Επιλογές Προτύπου',
10 selectPromptMsg: 'Παρακαλώ επιλέξτε πρότυπο για εισαγωγή στο πρόγραμμα',
11 title: 'Πρότυπα Περιεχομένου'
12} );
diff --git a/sources/plugins/templates/lang/en-au.js b/sources/plugins/templates/lang/en-au.js
new file mode 100644
index 00000000..5c611616
--- /dev/null
+++ b/sources/plugins/templates/lang/en-au.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'en-au', {
6 button: 'Templates',
7 emptyListMsg: '(No templates defined)',
8 insertOption: 'Replace actual contents',
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Please select the template to open in the editor',
11 title: 'Content Templates'
12} );
diff --git a/sources/plugins/templates/lang/en-ca.js b/sources/plugins/templates/lang/en-ca.js
new file mode 100644
index 00000000..16bd7e13
--- /dev/null
+++ b/sources/plugins/templates/lang/en-ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'en-ca', {
6 button: 'Templates',
7 emptyListMsg: '(No templates defined)',
8 insertOption: 'Replace actual contents',
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Please select the template to open in the editor',
11 title: 'Content Templates'
12} );
diff --git a/sources/plugins/templates/lang/en-gb.js b/sources/plugins/templates/lang/en-gb.js
new file mode 100644
index 00000000..794c0074
--- /dev/null
+++ b/sources/plugins/templates/lang/en-gb.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'en-gb', {
6 button: 'Templates',
7 emptyListMsg: '(No templates defined)',
8 insertOption: 'Replace actual contents',
9 options: 'Template Options',
10 selectPromptMsg: 'Please select the template to open in the editor',
11 title: 'Content Templates'
12} );
diff --git a/sources/plugins/templates/lang/en.js b/sources/plugins/templates/lang/en.js
new file mode 100644
index 00000000..1fffcc06
--- /dev/null
+++ b/sources/plugins/templates/lang/en.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'en', {
6 button: 'Templates',
7 emptyListMsg: '(No templates defined)',
8 insertOption: 'Replace actual contents',
9 options: 'Template Options',
10 selectPromptMsg: 'Please select the template to open in the editor',
11 title: 'Content Templates'
12} );
diff --git a/sources/plugins/templates/lang/eo.js b/sources/plugins/templates/lang/eo.js
new file mode 100644
index 00000000..82be7b41
--- /dev/null
+++ b/sources/plugins/templates/lang/eo.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'eo', {
6 button: 'Ŝablonoj',
7 emptyListMsg: '(Neniu ŝablono difinita)',
8 insertOption: 'Anstataŭigi la nunan enhavon',
9 options: 'Opcioj pri ŝablonoj',
10 selectPromptMsg: 'Bonvolu selekti la ŝablonon por malfermi ĝin en la redaktilo',
11 title: 'Enhavo de ŝablonoj'
12} );
diff --git a/sources/plugins/templates/lang/es.js b/sources/plugins/templates/lang/es.js
new file mode 100644
index 00000000..2cf155cb
--- /dev/null
+++ b/sources/plugins/templates/lang/es.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'es', {
6 button: 'Plantillas',
7 emptyListMsg: '(No hay plantillas definidas)',
8 insertOption: 'Reemplazar el contenido actual',
9 options: 'Opciones de plantillas',
10 selectPromptMsg: 'Por favor selecciona la plantilla a abrir en el editor<br>(el contenido actual se perderá):',
11 title: 'Contenido de Plantillas'
12} );
diff --git a/sources/plugins/templates/lang/et.js b/sources/plugins/templates/lang/et.js
new file mode 100644
index 00000000..3e46e4bf
--- /dev/null
+++ b/sources/plugins/templates/lang/et.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'et', {
6 button: 'Mall',
7 emptyListMsg: '(Ühtegi malli ei ole defineeritud)',
8 insertOption: 'Praegune sisu asendatakse',
9 options: 'Malli valikud',
10 selectPromptMsg: 'Palun vali mall, mis avada redaktoris<br />(praegune sisu läheb kaotsi):',
11 title: 'Sisumallid'
12} );
diff --git a/sources/plugins/templates/lang/eu.js b/sources/plugins/templates/lang/eu.js
new file mode 100644
index 00000000..6d680d50
--- /dev/null
+++ b/sources/plugins/templates/lang/eu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'eu', {
6 button: 'Txantiloiak',
7 emptyListMsg: '(Ez dago txantiloirik definituta)',
8 insertOption: 'Ordeztu uneko edukiak',
9 options: 'Txantiloi aukerak',
10 selectPromptMsg: 'Mesedez hautatu txantiloia editorean irekitzeko',
11 title: 'Eduki txantiloiak'
12} );
diff --git a/sources/plugins/templates/lang/fa.js b/sources/plugins/templates/lang/fa.js
new file mode 100644
index 00000000..9b642061
--- /dev/null
+++ b/sources/plugins/templates/lang/fa.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'fa', {
6 button: 'الگوها',
7 emptyListMsg: '(الگوئی تعریف نشده است)',
8 insertOption: 'محتویات کنونی جایگزین شوند',
9 options: 'گزینه‌های الگو',
10 selectPromptMsg: 'لطفاً الگوی مورد نظر را برای بازکردن در ویرایشگر انتخاب کنید',
11 title: 'الگوهای محتویات'
12} );
diff --git a/sources/plugins/templates/lang/fi.js b/sources/plugins/templates/lang/fi.js
new file mode 100644
index 00000000..a7e4d429
--- /dev/null
+++ b/sources/plugins/templates/lang/fi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'fi', {
6 button: 'Pohjat',
7 emptyListMsg: '(Ei määriteltyjä pohjia)',
8 insertOption: 'Korvaa koko sisältö',
9 options: 'Sisältöpohjan ominaisuudet',
10 selectPromptMsg: 'Valitse editoriin avattava pohja',
11 title: 'Sisältöpohjat'
12} );
diff --git a/sources/plugins/templates/lang/fo.js b/sources/plugins/templates/lang/fo.js
new file mode 100644
index 00000000..9ccb4e6a
--- /dev/null
+++ b/sources/plugins/templates/lang/fo.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'fo', {
6 button: 'Skabelónir',
7 emptyListMsg: '(Ongar skabelónir tøkar)',
8 insertOption: 'Yvirskriva núverandi innihald',
9 options: 'Møguleikar fyri Template',
10 selectPromptMsg: 'Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum<br>(Hetta yvirskrivar núverandi innihald):',
11 title: 'Innihaldsskabelónir'
12} );
diff --git a/sources/plugins/templates/lang/fr-ca.js b/sources/plugins/templates/lang/fr-ca.js
new file mode 100644
index 00000000..5996dccb
--- /dev/null
+++ b/sources/plugins/templates/lang/fr-ca.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'fr-ca', {
6 button: 'Modèles',
7 emptyListMsg: '(Aucun modèle disponible)',
8 insertOption: 'Remplacer tout le contenu actuel',
9 options: 'Options de modèles',
10 selectPromptMsg: 'Sélectionner le modèle à ouvrir dans l\'éditeur',
11 title: 'Modèles de contenu'
12} );
diff --git a/sources/plugins/templates/lang/fr.js b/sources/plugins/templates/lang/fr.js
new file mode 100644
index 00000000..49e1165c
--- /dev/null
+++ b/sources/plugins/templates/lang/fr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'fr', {
6 button: 'Modèles',
7 emptyListMsg: '(Aucun modèle disponible)',
8 insertOption: 'Remplacer le contenu actuel',
9 options: 'Options des modèles',
10 selectPromptMsg: 'Veuillez sélectionner le modèle pour l\'ouvrir dans l\'éditeur',
11 title: 'Contenu des modèles'
12} );
diff --git a/sources/plugins/templates/lang/gl.js b/sources/plugins/templates/lang/gl.js
new file mode 100644
index 00000000..b7c0f052
--- /dev/null
+++ b/sources/plugins/templates/lang/gl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'gl', {
6 button: 'Modelos',
7 emptyListMsg: '(Non hai modelos definidos)',
8 insertOption: 'Substituír o contido actual',
9 options: 'Opcións de modelos',
10 selectPromptMsg: 'Seleccione o modelo a abrir no editor',
11 title: 'Modelos de contido'
12} );
diff --git a/sources/plugins/templates/lang/gu.js b/sources/plugins/templates/lang/gu.js
new file mode 100644
index 00000000..d4841fe8
--- /dev/null
+++ b/sources/plugins/templates/lang/gu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'gu', {
6 button: 'ટેમ્પ્લેટ',
7 emptyListMsg: '(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)',
8 insertOption: 'મૂળ શબ્દને બદલો',
9 options: 'ટેમ્પ્લેટના વિકલ્પો',
10 selectPromptMsg: 'એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):',
11 title: 'કન્ટેન્ટ ટેમ્પ્લેટ'
12} );
diff --git a/sources/plugins/templates/lang/he.js b/sources/plugins/templates/lang/he.js
new file mode 100644
index 00000000..b32bd1f1
--- /dev/null
+++ b/sources/plugins/templates/lang/he.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'he', {
6 button: 'תבניות',
7 emptyListMsg: '(לא הוגדרו תבניות)',
8 insertOption: 'החלפת תוכן ממשי',
9 options: 'אפשרויות התבניות',
10 selectPromptMsg: 'יש לבחור תבנית לפתיחה בעורך.<br />התוכן המקורי ימחק:',
11 title: 'תביות תוכן'
12} );
diff --git a/sources/plugins/templates/lang/hi.js b/sources/plugins/templates/lang/hi.js
new file mode 100644
index 00000000..5878fed9
--- /dev/null
+++ b/sources/plugins/templates/lang/hi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'hi', {
6 button: 'टॅम्प्लेट',
7 emptyListMsg: '(कोई टॅम्प्लेट डिफ़ाइन नहीं किया गया है)',
8 insertOption: 'मूल शब्दों को बदलें',
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'ऍडिटर में ओपन करने हेतु टॅम्प्लेट चुनें(वर्तमान कन्टॅन्ट सेव नहीं होंगे):',
11 title: 'कन्टेन्ट टॅम्प्लेट'
12} );
diff --git a/sources/plugins/templates/lang/hr.js b/sources/plugins/templates/lang/hr.js
new file mode 100644
index 00000000..b4ec5ac9
--- /dev/null
+++ b/sources/plugins/templates/lang/hr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'hr', {
6 button: 'Predlošci',
7 emptyListMsg: '(Nema definiranih predložaka)',
8 insertOption: 'Zamijeni trenutne sadržaje',
9 options: 'Opcije predložaka',
10 selectPromptMsg: 'Molimo odaberite predložak koji želite otvoriti<br>(stvarni sadržaj će biti izgubljen):',
11 title: 'Predlošci sadržaja'
12} );
diff --git a/sources/plugins/templates/lang/hu.js b/sources/plugins/templates/lang/hu.js
new file mode 100644
index 00000000..016f2004
--- /dev/null
+++ b/sources/plugins/templates/lang/hu.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'hu', {
6 button: 'Sablonok',
7 emptyListMsg: '(Nincs sablon megadva)',
8 insertOption: 'Kicseréli a jelenlegi tartalmat',
9 options: 'Sablon opciók',
10 selectPromptMsg: 'Válassza ki melyik sablon nyíljon meg a szerkesztőben<br>(a jelenlegi tartalom elveszik):',
11 title: 'Elérhető sablonok'
12} );
diff --git a/sources/plugins/templates/lang/id.js b/sources/plugins/templates/lang/id.js
new file mode 100644
index 00000000..72e2e2e9
--- /dev/null
+++ b/sources/plugins/templates/lang/id.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'id', {
6 button: 'Contoh',
7 emptyListMsg: '(Tidak ada contoh didefinisikan)',
8 insertOption: 'Ganti konten sebenarnya',
9 options: 'Opsi Contoh',
10 selectPromptMsg: 'Mohon pilih contoh untuk dibuka di editor',
11 title: 'Contoh Konten'
12} );
diff --git a/sources/plugins/templates/lang/is.js b/sources/plugins/templates/lang/is.js
new file mode 100644
index 00000000..5168a998
--- /dev/null
+++ b/sources/plugins/templates/lang/is.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'is', {
6 button: 'Sniðmát',
7 emptyListMsg: '(Ekkert sniðmát er skilgreint!)',
8 insertOption: 'Skipta út raunverulegu innihaldi',
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Veldu sniðmát til að opna í ritlinum.<br>(Núverandi innihald víkur fyrir því!):',
11 title: 'Innihaldssniðmát'
12} );
diff --git a/sources/plugins/templates/lang/it.js b/sources/plugins/templates/lang/it.js
new file mode 100644
index 00000000..6beea875
--- /dev/null
+++ b/sources/plugins/templates/lang/it.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'it', {
6 button: 'Modelli',
7 emptyListMsg: '(Nessun modello definito)',
8 insertOption: 'Cancella il contenuto corrente',
9 options: 'Opzioni del Modello',
10 selectPromptMsg: 'Seleziona il modello da aprire nell\'editor',
11 title: 'Contenuto dei modelli'
12} );
diff --git a/sources/plugins/templates/lang/ja.js b/sources/plugins/templates/lang/ja.js
new file mode 100644
index 00000000..59d3cd62
--- /dev/null
+++ b/sources/plugins/templates/lang/ja.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ja', {
6 button: 'テンプレート',
7 emptyListMsg: '(テンプレートが定義されていません)',
8 insertOption: '現在のエディタの内容と置き換えます',
9 options: 'テンプレートオプション',
10 selectPromptMsg: 'エディターで使用するテンプレートを選択してください。<br>(現在のエディタの内容は失われます):',
11 title: '内容テンプレート'
12} );
diff --git a/sources/plugins/templates/lang/ka.js b/sources/plugins/templates/lang/ka.js
new file mode 100644
index 00000000..d48b87f1
--- /dev/null
+++ b/sources/plugins/templates/lang/ka.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ka', {
6 button: 'თარგები',
7 emptyListMsg: '(თარგი არაა განსაზღვრული)',
8 insertOption: 'მიმდინარე შეგთავსის შეცვლა',
9 options: 'თარგების პარამეტრები',
10 selectPromptMsg: 'აირჩიეთ თარგი რედაქტორისთვის',
11 title: 'თარგები'
12} );
diff --git a/sources/plugins/templates/lang/km.js b/sources/plugins/templates/lang/km.js
new file mode 100644
index 00000000..59eb7743
--- /dev/null
+++ b/sources/plugins/templates/lang/km.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'km', {
6 button: 'ពុម្ព​គំរូ',
7 emptyListMsg: '(មិន​មាន​ពុម្ព​គំរូ​ត្រូវ​បាន​កំណត់)',
8 insertOption: 'ជំនួស​ក្នុង​មាតិកា​បច្ចុប្បន្ន',
9 options: 'ជម្រើស​ពុម្ព​គំរូ',
10 selectPromptMsg: 'សូម​រើស​ពុម្ព​គំរូ​ដើម្បី​បើក​ក្នុង​កម្មវិធី​សរសេរ​អត្ថបទ',
11 title: 'ពុម្ព​គំរូ​មាតិកា'
12} );
diff --git a/sources/plugins/templates/lang/ko.js b/sources/plugins/templates/lang/ko.js
new file mode 100644
index 00000000..03beec82
--- /dev/null
+++ b/sources/plugins/templates/lang/ko.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ko', {
6 button: '템플릿',
7 emptyListMsg: '(템플릿이 없습니다)',
8 insertOption: '현재 내용 바꾸기',
9 options: '템플릿 옵션',
10 selectPromptMsg: '에디터에서 사용할 템플릿을 선택하십시오',
11 title: '내용 템플릿'
12} );
diff --git a/sources/plugins/templates/lang/ku.js b/sources/plugins/templates/lang/ku.js
new file mode 100644
index 00000000..ccf7e023
--- /dev/null
+++ b/sources/plugins/templates/lang/ku.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ku', {
6 button: 'ڕووکار',
7 emptyListMsg: '(هیچ ڕووکارێك دیارینەکراوە)',
8 insertOption: 'لە شوێن دانانی ئەم پێکهاتانەی ئێستا',
9 options: 'هەڵبژاردەکانی ڕووکار',
10 selectPromptMsg: 'ڕووکارێك هەڵبژێره بۆ کردنەوەی له سەرنووسەر:',
11 title: 'پێکهاتەی ڕووکار'
12} );
diff --git a/sources/plugins/templates/lang/lt.js b/sources/plugins/templates/lang/lt.js
new file mode 100644
index 00000000..931f7ad9
--- /dev/null
+++ b/sources/plugins/templates/lang/lt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'lt', {
6 button: 'Šablonai',
7 emptyListMsg: '(Šablonų sąrašas tuščias)',
8 insertOption: 'Pakeisti dabartinį turinį pasirinktu šablonu',
9 options: 'Template Options',
10 selectPromptMsg: 'Pasirinkite norimą šabloną<br>(<b>Dėmesio!</b> esamas turinys bus prarastas):',
11 title: 'Turinio šablonai'
12} );
diff --git a/sources/plugins/templates/lang/lv.js b/sources/plugins/templates/lang/lv.js
new file mode 100644
index 00000000..41c7b986
--- /dev/null
+++ b/sources/plugins/templates/lang/lv.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'lv', {
6 button: 'Sagataves',
7 emptyListMsg: '(Nav norādītas sagataves)',
8 insertOption: 'Aizvietot pašreizējo saturu',
9 options: 'Sagataves uzstādījumi',
10 selectPromptMsg: 'Lūdzu, norādiet sagatavi, ko atvērt editorā<br>(patreizējie dati tiks zaudēti):',
11 title: 'Satura sagataves'
12} );
diff --git a/sources/plugins/templates/lang/mk.js b/sources/plugins/templates/lang/mk.js
new file mode 100644
index 00000000..d570cefc
--- /dev/null
+++ b/sources/plugins/templates/lang/mk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'mk', {
6 button: 'Templates', // MISSING
7 emptyListMsg: '(No templates defined)', // MISSING
8 insertOption: 'Replace actual contents', // MISSING
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Please select the template to open in the editor', // MISSING
11 title: 'Content Templates' // MISSING
12} );
diff --git a/sources/plugins/templates/lang/mn.js b/sources/plugins/templates/lang/mn.js
new file mode 100644
index 00000000..cba69a59
--- /dev/null
+++ b/sources/plugins/templates/lang/mn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'mn', {
6 button: 'Загварууд',
7 emptyListMsg: '(Загвар тодорхойлогдоогүй байна)',
8 insertOption: 'Одоогийн агууллагыг дарж бичих',
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Загварыг нээж editor-рүү сонгож оруулна уу<br />(Одоогийн агууллагыг устаж магадгүй):',
11 title: 'Загварын агуулга'
12} );
diff --git a/sources/plugins/templates/lang/ms.js b/sources/plugins/templates/lang/ms.js
new file mode 100644
index 00000000..2223c922
--- /dev/null
+++ b/sources/plugins/templates/lang/ms.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ms', {
6 button: 'Templat',
7 emptyListMsg: '(Tiada Templat Disimpan)',
8 insertOption: 'Replace actual contents', // MISSING
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Sila pilih templat untuk dibuka oleh editor<br>(kandungan sebenar akan hilang):',
11 title: 'Templat Kandungan'
12} );
diff --git a/sources/plugins/templates/lang/nb.js b/sources/plugins/templates/lang/nb.js
new file mode 100644
index 00000000..c6caa8ea
--- /dev/null
+++ b/sources/plugins/templates/lang/nb.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'nb', {
6 button: 'Maler',
7 emptyListMsg: '(Ingen maler definert)',
8 insertOption: 'Erstatt gjeldende innhold',
9 options: 'Alternativer for mal',
10 selectPromptMsg: 'Velg malen du vil åpne i redigeringsverktøyet:',
11 title: 'Innholdsmaler'
12} );
diff --git a/sources/plugins/templates/lang/nl.js b/sources/plugins/templates/lang/nl.js
new file mode 100644
index 00000000..0133c079
--- /dev/null
+++ b/sources/plugins/templates/lang/nl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'nl', {
6 button: 'Sjablonen',
7 emptyListMsg: '(Geen sjablonen gedefinieerd)',
8 insertOption: 'Vervang de huidige inhoud',
9 options: 'Template opties',
10 selectPromptMsg: 'Selecteer het sjabloon dat in de editor geopend moet worden (de actuele inhoud gaat verloren):',
11 title: 'Inhoud sjablonen'
12} );
diff --git a/sources/plugins/templates/lang/no.js b/sources/plugins/templates/lang/no.js
new file mode 100644
index 00000000..1c0eb2dc
--- /dev/null
+++ b/sources/plugins/templates/lang/no.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'no', {
6 button: 'Maler',
7 emptyListMsg: '(Ingen maler definert)',
8 insertOption: 'Erstatt gjeldende innhold',
9 options: 'Alternativer for mal',
10 selectPromptMsg: 'Velg malen du vil åpne i redigeringsverktøyet:',
11 title: 'Innholdsmaler'
12} );
diff --git a/sources/plugins/templates/lang/pl.js b/sources/plugins/templates/lang/pl.js
new file mode 100644
index 00000000..26eea259
--- /dev/null
+++ b/sources/plugins/templates/lang/pl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'pl', {
6 button: 'Szablony',
7 emptyListMsg: '(Brak zdefiniowanych szablonów)',
8 insertOption: 'Zastąp obecną zawartość',
9 options: 'Opcje szablonów',
10 selectPromptMsg: 'Wybierz szablon do otwarcia w edytorze<br>(obecna zawartość okna edytora zostanie utracona):',
11 title: 'Szablony zawartości'
12} );
diff --git a/sources/plugins/templates/lang/pt-br.js b/sources/plugins/templates/lang/pt-br.js
new file mode 100644
index 00000000..a5b3df79
--- /dev/null
+++ b/sources/plugins/templates/lang/pt-br.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'pt-br', {
6 button: 'Modelos de layout',
7 emptyListMsg: '(Não foram definidos modelos de layout)',
8 insertOption: 'Substituir o conteúdo atual',
9 options: 'Opções de Template',
10 selectPromptMsg: 'Selecione um modelo de layout para ser aberto no editor<br>(o conteúdo atual será perdido):',
11 title: 'Modelo de layout de conteúdo'
12} );
diff --git a/sources/plugins/templates/lang/pt.js b/sources/plugins/templates/lang/pt.js
new file mode 100644
index 00000000..5058d609
--- /dev/null
+++ b/sources/plugins/templates/lang/pt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'pt', {
6 button: 'Modelos',
7 emptyListMsg: '(Sem modelos definidos)',
8 insertOption: 'Substituir conteúdos atuais',
9 options: 'Opções do modelo',
10 selectPromptMsg: 'Por favor, selecione o modelo para abrir no editor',
11 title: 'Conteúdo dos Modelos'
12} );
diff --git a/sources/plugins/templates/lang/ro.js b/sources/plugins/templates/lang/ro.js
new file mode 100644
index 00000000..14e691be
--- /dev/null
+++ b/sources/plugins/templates/lang/ro.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ro', {
6 button: 'Template-uri (şabloane)',
7 emptyListMsg: '(Niciun template (şablon) definit)',
8 insertOption: 'Înlocuieşte cuprinsul actual',
9 options: 'Opțiuni șabloane',
10 selectPromptMsg: 'Vă rugăm selectaţi template-ul (şablonul) ce se va deschide în editor<br>(conţinutul actual va fi pierdut):',
11 title: 'Template-uri (şabloane) de conţinut'
12} );
diff --git a/sources/plugins/templates/lang/ru.js b/sources/plugins/templates/lang/ru.js
new file mode 100644
index 00000000..a7462690
--- /dev/null
+++ b/sources/plugins/templates/lang/ru.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ru', {
6 button: 'Шаблоны',
7 emptyListMsg: '(не определено ни одного шаблона)',
8 insertOption: 'Заменить текущее содержимое',
9 options: 'Параметры шаблона',
10 selectPromptMsg: 'Пожалуйста, выберите, какой шаблон следует открыть в редакторе',
11 title: 'Шаблоны содержимого'
12} );
diff --git a/sources/plugins/templates/lang/si.js b/sources/plugins/templates/lang/si.js
new file mode 100644
index 00000000..be41fdb8
--- /dev/null
+++ b/sources/plugins/templates/lang/si.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'si', {
6 button: 'අච්චුව',
7 emptyListMsg: 'කිසිම අච්චුවක් කලින් තීරණය කර ',
8 insertOption: 'සත්‍ය අන්තර්ගතයන් ප්‍රතිස්ථාපනය කරන්න',
9 options: 'අච්චු ',
10 selectPromptMsg: 'කරුණාකර සංස්කරණය සදහා අච්චුවක් ',
11 title: 'අන්තර්ගත් අච්චුන්'
12} );
diff --git a/sources/plugins/templates/lang/sk.js b/sources/plugins/templates/lang/sk.js
new file mode 100644
index 00000000..e87c16a8
--- /dev/null
+++ b/sources/plugins/templates/lang/sk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'sk', {
6 button: 'Šablóny',
7 emptyListMsg: '(Žiadne šablóny nedefinované)',
8 insertOption: 'Nahradiť aktuálny obsah',
9 options: 'Možnosti šablóny',
10 selectPromptMsg: 'Prosím vyberte šablónu na otvorenie v editore',
11 title: 'Šablóny obsahu'
12} );
diff --git a/sources/plugins/templates/lang/sl.js b/sources/plugins/templates/lang/sl.js
new file mode 100644
index 00000000..e8bca32e
--- /dev/null
+++ b/sources/plugins/templates/lang/sl.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'sl', {
6 button: 'Predloge',
7 emptyListMsg: '(Ni pripravljenih predlog)',
8 insertOption: 'Zamenjaj trenutno vsebino',
9 options: 'Možnosti Predloge',
10 selectPromptMsg: 'Izberite predlogo, ki jo želite odpreti v urejevalniku<br>(trenutna vsebina bo izgubljena):',
11 title: 'Vsebinske predloge'
12} );
diff --git a/sources/plugins/templates/lang/sq.js b/sources/plugins/templates/lang/sq.js
new file mode 100644
index 00000000..d724e366
--- /dev/null
+++ b/sources/plugins/templates/lang/sq.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'sq', {
6 button: 'Shabllonet',
7 emptyListMsg: '(Asnjë shabllon nuk është paradefinuar)',
8 insertOption: 'Zëvendëso përmbajtjen aktuale',
9 options: 'Opsionet e Shabllonit',
10 selectPromptMsg: 'Përzgjidhni shabllonin për të hapur tek redaktuesi',
11 title: 'Përmbajtja e Shabllonit'
12} );
diff --git a/sources/plugins/templates/lang/sr-latn.js b/sources/plugins/templates/lang/sr-latn.js
new file mode 100644
index 00000000..3b221d73
--- /dev/null
+++ b/sources/plugins/templates/lang/sr-latn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'sr-latn', {
6 button: 'Obrasci',
7 emptyListMsg: '(Nema definisanih obrazaca)',
8 insertOption: 'Replace actual contents', // MISSING
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Molimo Vas da odaberete obrazac koji ce biti primenjen na stranicu (trenutni sadržaj ce biti obrisan):',
11 title: 'Obrasci za sadržaj'
12} );
diff --git a/sources/plugins/templates/lang/sr.js b/sources/plugins/templates/lang/sr.js
new file mode 100644
index 00000000..4ff9a057
--- /dev/null
+++ b/sources/plugins/templates/lang/sr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'sr', {
6 button: 'Обрасци',
7 emptyListMsg: '(Нема дефинисаних образаца)',
8 insertOption: 'Replace actual contents', // MISSING
9 options: 'Template Options', // MISSING
10 selectPromptMsg: 'Молимо Вас да одаберете образац који ће бити примењен на страницу (тренутни садржај ће бити обрисан):',
11 title: 'Обрасци за садржај'
12} );
diff --git a/sources/plugins/templates/lang/sv.js b/sources/plugins/templates/lang/sv.js
new file mode 100644
index 00000000..07e9300a
--- /dev/null
+++ b/sources/plugins/templates/lang/sv.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'sv', {
6 button: 'Sidmallar',
7 emptyListMsg: '(Ingen mall är vald)',
8 insertOption: 'Ersätt aktuellt innehåll',
9 options: 'Inställningar för mall',
10 selectPromptMsg: 'Var god välj en mall att använda med editorn<br>(allt nuvarande innehåll raderas):',
11 title: 'Sidmallar'
12} );
diff --git a/sources/plugins/templates/lang/th.js b/sources/plugins/templates/lang/th.js
new file mode 100644
index 00000000..2fabf998
--- /dev/null
+++ b/sources/plugins/templates/lang/th.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'th', {
6 button: 'เทมเพลต',
7 emptyListMsg: '(ยังไม่มีการกำหนดเทมเพลต)',
8 insertOption: 'แทนที่เนื้อหาเว็บไซต์ที่เลือก',
9 options: 'ตัวเลือกเกี่ยวกับเทมเพลท',
10 selectPromptMsg: 'กรุณาเลือก เทมเพลต เพื่อนำไปแก้ไขในอีดิตเตอร์<br />(เนื้อหาส่วนนี้จะหายไป):',
11 title: 'เทมเพลตของส่วนเนื้อหาเว็บไซต์'
12} );
diff --git a/sources/plugins/templates/lang/tr.js b/sources/plugins/templates/lang/tr.js
new file mode 100644
index 00000000..a2963bc8
--- /dev/null
+++ b/sources/plugins/templates/lang/tr.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'tr', {
6 button: 'Şablonlar',
7 emptyListMsg: '(Belirli bir şablon seçilmedi)',
8 insertOption: 'Mevcut içerik ile değiştir',
9 options: 'Şablon Seçenekleri',
10 selectPromptMsg: 'Düzenleyicide açmak için lütfen bir şablon seçin.<br>(hali hazırdaki içerik kaybolacaktır.):',
11 title: 'İçerik Şablonları'
12} );
diff --git a/sources/plugins/templates/lang/tt.js b/sources/plugins/templates/lang/tt.js
new file mode 100644
index 00000000..d1745c29
--- /dev/null
+++ b/sources/plugins/templates/lang/tt.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'tt', {
6 button: 'Шаблоннар',
7 emptyListMsg: '(Шаблоннар билгеләнмәгән)',
8 insertOption: 'Әлеге эчтәлекне алмаштыру',
9 options: 'Шаблон үзлекләре',
10 selectPromptMsg: 'Please select the template to open in the editor', // MISSING
11 title: 'Эчтәлек шаблоннары'
12} );
diff --git a/sources/plugins/templates/lang/ug.js b/sources/plugins/templates/lang/ug.js
new file mode 100644
index 00000000..ee883b75
--- /dev/null
+++ b/sources/plugins/templates/lang/ug.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'ug', {
6 button: 'قېلىپ',
7 emptyListMsg: '(قېلىپ يوق)',
8 insertOption: 'نۆۋەتتىكى مەزمۇننى ئالماشتۇر',
9 options: 'قېلىپ تاللانمىسى',
10 selectPromptMsg: 'تەھرىرلىگۈچنىڭ مەزمۇن قېلىپىنى تاللاڭ:',
11 title: 'مەزمۇن قېلىپى'
12} );
diff --git a/sources/plugins/templates/lang/uk.js b/sources/plugins/templates/lang/uk.js
new file mode 100644
index 00000000..031930b5
--- /dev/null
+++ b/sources/plugins/templates/lang/uk.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'uk', {
6 button: 'Шаблони',
7 emptyListMsg: '(Не знайдено жодного шаблону)',
8 insertOption: 'Замінити поточний вміст',
9 options: 'Опції шаблону',
10 selectPromptMsg: 'Оберіть, будь ласка, шаблон для відкриття в редакторі<br>(поточний зміст буде втрачено):',
11 title: 'Шаблони змісту'
12} );
diff --git a/sources/plugins/templates/lang/vi.js b/sources/plugins/templates/lang/vi.js
new file mode 100644
index 00000000..ae701b98
--- /dev/null
+++ b/sources/plugins/templates/lang/vi.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'vi', {
6 button: 'Mẫu dựng sẵn',
7 emptyListMsg: '(Không có mẫu dựng sẵn nào được định nghĩa)',
8 insertOption: 'Thay thế nội dung hiện tại',
9 options: 'Tùy chọn mẫu dựng sẵn',
10 selectPromptMsg: 'Hãy chọn mẫu dựng sẵn để mở trong trình biên tập<br>(nội dung hiện tại sẽ bị mất):',
11 title: 'Nội dung Mẫu dựng sẵn'
12} );
diff --git a/sources/plugins/templates/lang/zh-cn.js b/sources/plugins/templates/lang/zh-cn.js
new file mode 100644
index 00000000..e432b7c2
--- /dev/null
+++ b/sources/plugins/templates/lang/zh-cn.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'zh-cn', {
6 button: '模板',
7 emptyListMsg: '(没有模板)',
8 insertOption: '替换当前内容',
9 options: '模板选项',
10 selectPromptMsg: '请选择要在编辑器中使用的模板:',
11 title: '内容模板'
12} );
diff --git a/sources/plugins/templates/lang/zh.js b/sources/plugins/templates/lang/zh.js
new file mode 100644
index 00000000..9e822ae1
--- /dev/null
+++ b/sources/plugins/templates/lang/zh.js
@@ -0,0 +1,12 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'templates', 'zh', {
6 button: '範本',
7 emptyListMsg: '(尚未定義任何範本)',
8 insertOption: '替代實際內容',
9 options: '範本選項',
10 selectPromptMsg: '請選擇要在編輯器中開啟的範本。',
11 title: '內容範本'
12} );
diff --git a/sources/plugins/templates/plugin.js b/sources/plugins/templates/plugin.js
new file mode 100644
index 00000000..11447308
--- /dev/null
+++ b/sources/plugins/templates/plugin.js
@@ -0,0 +1,93 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6( function() {
7 CKEDITOR.plugins.add( 'templates', {
8 requires: 'dialog',
9 // jscs:disable maximumLineLength
10 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
11 // jscs:enable maximumLineLength
12 icons: 'templates,templates-rtl', // %REMOVE_LINE_CORE%
13 hidpi: true, // %REMOVE_LINE_CORE%
14 init: function( editor ) {
15 CKEDITOR.dialog.add( 'templates', CKEDITOR.getUrl( this.path + 'dialogs/templates.js' ) );
16
17 editor.addCommand( 'templates', new CKEDITOR.dialogCommand( 'templates' ) );
18
19 editor.ui.addButton && editor.ui.addButton( 'Templates', {
20 label: editor.lang.templates.button,
21 command: 'templates',
22 toolbar: 'doctools,10'
23 } );
24 }
25 } );
26
27 var templates = {},
28 loadedTemplatesFiles = {};
29
30 CKEDITOR.addTemplates = function( name, definition ) {
31 templates[ name ] = definition;
32 };
33
34 CKEDITOR.getTemplates = function( name ) {
35 return templates[ name ];
36 };
37
38 CKEDITOR.loadTemplates = function( templateFiles, callback ) {
39 // Holds the templates files to be loaded.
40 var toLoad = [];
41
42 // Look for pending template files to get loaded.
43 for ( var i = 0, count = templateFiles.length; i < count; i++ ) {
44 if ( !loadedTemplatesFiles[ templateFiles[ i ] ] ) {
45 toLoad.push( templateFiles[ i ] );
46 loadedTemplatesFiles[ templateFiles[ i ] ] = 1;
47 }
48 }
49
50 if ( toLoad.length )
51 CKEDITOR.scriptLoader.load( toLoad, callback );
52 else
53 setTimeout( callback, 0 );
54 };
55} )();
56
57
58
59/**
60 * The templates definition set to use. It accepts a list of names separated by
61 * comma. It must match definitions loaded with the {@link #templates_files} setting.
62 *
63 * config.templates = 'my_templates';
64 *
65 * @cfg {String} [templates='default']
66 * @member CKEDITOR.config
67 */
68
69/**
70 * The list of templates definition files to load.
71 *
72 * config.templates_files = [
73 * '/editor_templates/site_default.js',
74 * 'http://www.example.com/user_templates.js
75 * ];
76 *
77 * @cfg
78 * @member CKEDITOR.config
79 */
80CKEDITOR.config.templates_files = [
81 CKEDITOR.getUrl( 'plugins/templates/templates/default.js' )
82];
83
84/**
85 * Whether the "Replace actual contents" checkbox is checked by default in the
86 * Templates dialog.
87 *
88 * config.templates_replaceContent = false;
89 *
90 * @cfg
91 * @member CKEDITOR.config
92 */
93CKEDITOR.config.templates_replaceContent = true;
diff --git a/sources/plugins/templates/templates/default.js b/sources/plugins/templates/templates/default.js
new file mode 100644
index 00000000..a8edaec0
--- /dev/null
+++ b/sources/plugins/templates/templates/default.js
@@ -0,0 +1,87 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6// Register a templates definition set named "default".
7CKEDITOR.addTemplates( 'default', {
8 // The name of sub folder which hold the shortcut preview images of the
9 // templates.
10 imagesPath: CKEDITOR.getUrl( CKEDITOR.plugins.getPath( 'templates' ) + 'templates/images/' ),
11
12 // The templates definitions.
13 templates: [ {
14 title: 'Image and Title',
15 image: 'template1.gif',
16 description: 'One main image with a title and text that surround the image.',
17 html: '<h3>' +
18 // Use src=" " so image is not filtered out by the editor as incorrect (src is required).
19 '<img src=" " alt="" style="margin-right: 10px" height="100" width="100" align="left" />' +
20 'Type the title here' +
21 '</h3>' +
22 '<p>' +
23 'Type the text here' +
24 '</p>'
25 },
26 {
27 title: 'Strange Template',
28 image: 'template2.gif',
29 description: 'A template that defines two colums, each one with a title, and some text.',
30 html: '<table cellspacing="0" cellpadding="0" style="width:100%" border="0">' +
31 '<tr>' +
32 '<td style="width:50%">' +
33 '<h3>Title 1</h3>' +
34 '</td>' +
35 '<td></td>' +
36 '<td style="width:50%">' +
37 '<h3>Title 2</h3>' +
38 '</td>' +
39 '</tr>' +
40 '<tr>' +
41 '<td>' +
42 'Text 1' +
43 '</td>' +
44 '<td></td>' +
45 '<td>' +
46 'Text 2' +
47 '</td>' +
48 '</tr>' +
49 '</table>' +
50 '<p>' +
51 'More text goes here.' +
52 '</p>'
53 },
54 {
55 title: 'Text and Table',
56 image: 'template3.gif',
57 description: 'A title with some text and a table.',
58 html: '<div style="width: 80%">' +
59 '<h3>' +
60 'Title goes here' +
61 '</h3>' +
62 '<table style="width:150px;float: right" cellspacing="0" cellpadding="0" border="1">' +
63 '<caption style="border:solid 1px black">' +
64 '<strong>Table title</strong>' +
65 '</caption>' +
66 '<tr>' +
67 '<td>&nbsp;</td>' +
68 '<td>&nbsp;</td>' +
69 '<td>&nbsp;</td>' +
70 '</tr>' +
71 '<tr>' +
72 '<td>&nbsp;</td>' +
73 '<td>&nbsp;</td>' +
74 '<td>&nbsp;</td>' +
75 '</tr>' +
76 '<tr>' +
77 '<td>&nbsp;</td>' +
78 '<td>&nbsp;</td>' +
79 '<td>&nbsp;</td>' +
80 '</tr>' +
81 '</table>' +
82 '<p>' +
83 'Type the text here' +
84 '</p>' +
85 '</div>'
86 } ]
87} );
diff --git a/sources/plugins/templates/templates/images/template1.gif b/sources/plugins/templates/templates/images/template1.gif
new file mode 100644
index 00000000..efdabbeb
--- /dev/null
+++ b/sources/plugins/templates/templates/images/template1.gif
Binary files differ
diff --git a/sources/plugins/templates/templates/images/template2.gif b/sources/plugins/templates/templates/images/template2.gif
new file mode 100644
index 00000000..d1cebb3a
--- /dev/null
+++ b/sources/plugins/templates/templates/images/template2.gif
Binary files differ
diff --git a/sources/plugins/templates/templates/images/template3.gif b/sources/plugins/templates/templates/images/template3.gif
new file mode 100644
index 00000000..db41cb4f
--- /dev/null
+++ b/sources/plugins/templates/templates/images/template3.gif
Binary files differ
diff --git a/sources/plugins/toolbar/lang/af.js b/sources/plugins/toolbar/lang/af.js
new file mode 100644
index 00000000..620f356a
--- /dev/null
+++ b/sources/plugins/toolbar/lang/af.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'af', {
6 toolbarCollapse: 'Verklein werkbalk',
7 toolbarExpand: 'Vergroot werkbalk',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Knipbord/Undo',
11 editing: 'Verander',
12 forms: 'Vorms',
13 basicstyles: 'Eenvoudige Styl',
14 paragraph: 'Paragraaf',
15 links: 'Skakels',
16 insert: 'Toevoeg',
17 styles: 'Style',
18 colors: 'Kleure',
19 tools: 'Gereedskap'
20 },
21 toolbars: 'Werkbalke'
22} );
diff --git a/sources/plugins/toolbar/lang/ar.js b/sources/plugins/toolbar/lang/ar.js
new file mode 100644
index 00000000..8b3882b5
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ar.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ar', {
6 toolbarCollapse: 'تقليص شريط الأدوت',
7 toolbarExpand: 'تمديد شريط الأدوات',
8 toolbarGroups: {
9 document: 'مستند',
10 clipboard: 'الحافظة/الرجوع',
11 editing: 'تحرير',
12 forms: 'نماذج',
13 basicstyles: 'نمط بسيط',
14 paragraph: 'فقرة',
15 links: 'روابط',
16 insert: 'إدراج',
17 styles: 'أنماط',
18 colors: 'ألوان',
19 tools: 'أدوات'
20 },
21 toolbars: 'أشرطة أدوات المحرر'
22} );
diff --git a/sources/plugins/toolbar/lang/bg.js b/sources/plugins/toolbar/lang/bg.js
new file mode 100644
index 00000000..25b1fa6b
--- /dev/null
+++ b/sources/plugins/toolbar/lang/bg.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'bg', {
6 toolbarCollapse: 'Свиване на лентата с инструменти',
7 toolbarExpand: 'Разширяване на лентата с инструменти',
8 toolbarGroups: {
9 document: 'Документ',
10 clipboard: 'Клипборд/Отмяна',
11 editing: 'Промяна',
12 forms: 'Форми',
13 basicstyles: 'Базови стилове',
14 paragraph: 'Параграф',
15 links: 'Връзки',
16 insert: 'Вмъкване',
17 styles: 'Стилове',
18 colors: 'Цветове',
19 tools: 'Инструменти'
20 },
21 toolbars: 'Ленти с инструменти'
22} );
diff --git a/sources/plugins/toolbar/lang/bn.js b/sources/plugins/toolbar/lang/bn.js
new file mode 100644
index 00000000..8615b2ba
--- /dev/null
+++ b/sources/plugins/toolbar/lang/bn.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'bn', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/bs.js b/sources/plugins/toolbar/lang/bs.js
new file mode 100644
index 00000000..f36d85c9
--- /dev/null
+++ b/sources/plugins/toolbar/lang/bs.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'bs', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/ca.js b/sources/plugins/toolbar/lang/ca.js
new file mode 100644
index 00000000..f81ba494
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ca.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ca', {
6 toolbarCollapse: 'Redueix la barra d\'eines',
7 toolbarExpand: 'Amplia la barra d\'eines',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor de barra d\'eines'
22} );
diff --git a/sources/plugins/toolbar/lang/cs.js b/sources/plugins/toolbar/lang/cs.js
new file mode 100644
index 00000000..5e69b74f
--- /dev/null
+++ b/sources/plugins/toolbar/lang/cs.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'cs', {
6 toolbarCollapse: 'Skrýt panel nástrojů',
7 toolbarExpand: 'Zobrazit panel nástrojů',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Schránka/Zpět',
11 editing: 'Úpravy',
12 forms: 'Formuláře',
13 basicstyles: 'Základní styly',
14 paragraph: 'Odstavec',
15 links: 'Odkazy',
16 insert: 'Vložit',
17 styles: 'Styly',
18 colors: 'Barvy',
19 tools: 'Nástroje'
20 },
21 toolbars: 'Panely nástrojů editoru'
22} );
diff --git a/sources/plugins/toolbar/lang/cy.js b/sources/plugins/toolbar/lang/cy.js
new file mode 100644
index 00000000..e10c2602
--- /dev/null
+++ b/sources/plugins/toolbar/lang/cy.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'cy', {
6 toolbarCollapse: 'Cyfangu\'r Bar Offer',
7 toolbarExpand: 'Ehangu\'r Bar Offer',
8 toolbarGroups: {
9 document: 'Dogfen',
10 clipboard: 'Clipfwrdd/Dadwneud',
11 editing: 'Golygu',
12 forms: 'Ffurflenni',
13 basicstyles: 'Arddulliau Sylfaenol',
14 paragraph: 'Paragraff',
15 links: 'Dolenni',
16 insert: 'Mewnosod',
17 styles: 'Arddulliau',
18 colors: 'Lliwiau',
19 tools: 'Offer'
20 },
21 toolbars: 'Bariau offer y golygydd'
22} );
diff --git a/sources/plugins/toolbar/lang/da.js b/sources/plugins/toolbar/lang/da.js
new file mode 100644
index 00000000..bbcbcb3a
--- /dev/null
+++ b/sources/plugins/toolbar/lang/da.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'da', {
6 toolbarCollapse: 'Sammenklap værktøjslinje',
7 toolbarExpand: 'Udvid værktøjslinje',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Udklipsholder/Fortryd',
11 editing: 'Redigering',
12 forms: 'Formularer',
13 basicstyles: 'Basis styles',
14 paragraph: 'Paragraf',
15 links: 'Links',
16 insert: 'Indsæt',
17 styles: 'Typografier',
18 colors: 'Farver',
19 tools: 'Værktøjer'
20 },
21 toolbars: 'Editors værktøjslinjer'
22} );
diff --git a/sources/plugins/toolbar/lang/de.js b/sources/plugins/toolbar/lang/de.js
new file mode 100644
index 00000000..2e9ffdf7
--- /dev/null
+++ b/sources/plugins/toolbar/lang/de.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'de', {
6 toolbarCollapse: 'Werkzeugleiste einklappen',
7 toolbarExpand: 'Werkzeugleiste ausklappen',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Zwischenablage/Rückgängig',
11 editing: 'Editieren',
12 forms: 'Formulare',
13 basicstyles: 'Grundstile',
14 paragraph: 'Absatz',
15 links: 'Links',
16 insert: 'Einfügen',
17 styles: 'Stile',
18 colors: 'Farben',
19 tools: 'Werkzeuge'
20 },
21 toolbars: 'Editor Werkzeugleisten'
22} );
diff --git a/sources/plugins/toolbar/lang/el.js b/sources/plugins/toolbar/lang/el.js
new file mode 100644
index 00000000..bda09cf4
--- /dev/null
+++ b/sources/plugins/toolbar/lang/el.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'el', {
6 toolbarCollapse: 'Σύμπτυξη Εργαλειοθήκης',
7 toolbarExpand: 'Ανάπτυξη Εργαλειοθήκης',
8 toolbarGroups: {
9 document: 'Έγγραφο',
10 clipboard: 'Πρόχειρο/Αναίρεση',
11 editing: 'Επεξεργασία',
12 forms: 'Φόρμες',
13 basicstyles: 'Βασικά Στυλ',
14 paragraph: 'Παράγραφος',
15 links: 'Σύνδεσμοι',
16 insert: 'Εισαγωγή',
17 styles: 'Στυλ',
18 colors: 'Χρώματα',
19 tools: 'Εργαλεία'
20 },
21 toolbars: 'Εργαλειοθήκες επεξεργαστή'
22} );
diff --git a/sources/plugins/toolbar/lang/en-au.js b/sources/plugins/toolbar/lang/en-au.js
new file mode 100644
index 00000000..e06b86fd
--- /dev/null
+++ b/sources/plugins/toolbar/lang/en-au.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'en-au', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars'
22} );
diff --git a/sources/plugins/toolbar/lang/en-ca.js b/sources/plugins/toolbar/lang/en-ca.js
new file mode 100644
index 00000000..ab84c53b
--- /dev/null
+++ b/sources/plugins/toolbar/lang/en-ca.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'en-ca', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/en-gb.js b/sources/plugins/toolbar/lang/en-gb.js
new file mode 100644
index 00000000..1cc982dc
--- /dev/null
+++ b/sources/plugins/toolbar/lang/en-gb.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'en-gb', {
6 toolbarCollapse: 'Collapse Toolbar',
7 toolbarExpand: 'Expand Toolbar',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars'
22} );
diff --git a/sources/plugins/toolbar/lang/en.js b/sources/plugins/toolbar/lang/en.js
new file mode 100644
index 00000000..13a5ffaf
--- /dev/null
+++ b/sources/plugins/toolbar/lang/en.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'en', {
6 toolbarCollapse: 'Collapse Toolbar',
7 toolbarExpand: 'Expand Toolbar',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars'
22} );
diff --git a/sources/plugins/toolbar/lang/eo.js b/sources/plugins/toolbar/lang/eo.js
new file mode 100644
index 00000000..08309ec3
--- /dev/null
+++ b/sources/plugins/toolbar/lang/eo.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'eo', {
6 toolbarCollapse: 'Faldi la ilbreton',
7 toolbarExpand: 'Malfaldi la ilbreton',
8 toolbarGroups: {
9 document: 'Dokumento',
10 clipboard: 'Poŝo/Malfari',
11 editing: 'Redaktado',
12 forms: 'Formularoj',
13 basicstyles: 'Bazaj stiloj',
14 paragraph: 'Paragrafo',
15 links: 'Ligiloj',
16 insert: 'Enmeti',
17 styles: 'Stiloj',
18 colors: 'Koloroj',
19 tools: 'Iloj'
20 },
21 toolbars: 'Ilobretoj de la redaktilo'
22} );
diff --git a/sources/plugins/toolbar/lang/es.js b/sources/plugins/toolbar/lang/es.js
new file mode 100644
index 00000000..c4b30581
--- /dev/null
+++ b/sources/plugins/toolbar/lang/es.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'es', {
6 toolbarCollapse: 'Contraer barra de herramientas',
7 toolbarExpand: 'Expandir barra de herramientas',
8 toolbarGroups: {
9 document: 'Documento',
10 clipboard: 'Portapapeles/Deshacer',
11 editing: 'Edición',
12 forms: 'Formularios',
13 basicstyles: 'Estilos básicos',
14 paragraph: 'Párrafo',
15 links: 'Enlaces',
16 insert: 'Insertar',
17 styles: 'Estilos',
18 colors: 'Colores',
19 tools: 'Herramientas'
20 },
21 toolbars: 'Barras de herramientas del editor'
22} );
diff --git a/sources/plugins/toolbar/lang/et.js b/sources/plugins/toolbar/lang/et.js
new file mode 100644
index 00000000..0527e714
--- /dev/null
+++ b/sources/plugins/toolbar/lang/et.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'et', {
6 toolbarCollapse: 'Tööriistariba peitmine',
7 toolbarExpand: 'Tööriistariba näitamine',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Lõikelaud/tagasivõtmine',
11 editing: 'Muutmine',
12 forms: 'Vormid',
13 basicstyles: 'Põhistiilid',
14 paragraph: 'Lõik',
15 links: 'Lingid',
16 insert: 'Sisesta',
17 styles: 'Stiilid',
18 colors: 'Värvid',
19 tools: 'Tööriistad'
20 },
21 toolbars: 'Redaktori tööriistaribad'
22} );
diff --git a/sources/plugins/toolbar/lang/eu.js b/sources/plugins/toolbar/lang/eu.js
new file mode 100644
index 00000000..1007c47c
--- /dev/null
+++ b/sources/plugins/toolbar/lang/eu.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'eu', {
6 toolbarCollapse: 'Tolestu tresna-barra',
7 toolbarExpand: 'Zabaldu tresna-barra',
8 toolbarGroups: {
9 document: 'Dokumentua',
10 clipboard: 'Arbela/Desegin',
11 editing: 'Editatu',
12 forms: 'Formularioak',
13 basicstyles: 'Oinarrizko estiloak',
14 paragraph: 'Paragrafoa',
15 links: 'Estekak',
16 insert: 'Txertatu',
17 styles: 'Estiloak',
18 colors: 'Koloreak',
19 tools: 'Tresnak'
20 },
21 toolbars: 'Editorearen tresna-barrak'
22} );
diff --git a/sources/plugins/toolbar/lang/fa.js b/sources/plugins/toolbar/lang/fa.js
new file mode 100644
index 00000000..4afa81bd
--- /dev/null
+++ b/sources/plugins/toolbar/lang/fa.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'fa', {
6 toolbarCollapse: 'بستن نوار ابزار',
7 toolbarExpand: 'بازکردن نوار ابزار',
8 toolbarGroups: {
9 document: 'سند',
10 clipboard: 'حافظه موقت/برگشت',
11 editing: 'در حال ویرایش',
12 forms: 'فرم​ها',
13 basicstyles: 'سبک‌های پایه',
14 paragraph: 'بند',
15 links: 'پیوندها',
16 insert: 'ورود',
17 styles: 'سبک‌ها',
18 colors: 'رنگ​ها',
19 tools: 'ابزارها'
20 },
21 toolbars: 'نوار ابزارهای ویرایش‌گر'
22} );
diff --git a/sources/plugins/toolbar/lang/fi.js b/sources/plugins/toolbar/lang/fi.js
new file mode 100644
index 00000000..09d17363
--- /dev/null
+++ b/sources/plugins/toolbar/lang/fi.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'fi', {
6 toolbarCollapse: 'Kutista työkalupalkki',
7 toolbarExpand: 'Laajenna työkalupalkki',
8 toolbarGroups: {
9 document: 'Dokumentti',
10 clipboard: 'Leikepöytä/Kumoa',
11 editing: 'Muokkaus',
12 forms: 'Lomakkeet',
13 basicstyles: 'Perustyylit',
14 paragraph: 'Kappale',
15 links: 'Linkit',
16 insert: 'Lisää',
17 styles: 'Tyylit',
18 colors: 'Värit',
19 tools: 'Työkalut'
20 },
21 toolbars: 'Editorin työkalupalkit'
22} );
diff --git a/sources/plugins/toolbar/lang/fo.js b/sources/plugins/toolbar/lang/fo.js
new file mode 100644
index 00000000..a9a60306
--- /dev/null
+++ b/sources/plugins/toolbar/lang/fo.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'fo', {
6 toolbarCollapse: 'Lat Toolbar aftur',
7 toolbarExpand: 'Vís Toolbar',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editering',
12 forms: 'Formar',
13 basicstyles: 'Grundleggjandi Styles',
14 paragraph: 'Reglubrot',
15 links: 'Leinkjur',
16 insert: 'Set inn',
17 styles: 'Styles',
18 colors: 'Litir',
19 tools: 'Tól'
20 },
21 toolbars: 'Editor toolbars'
22} );
diff --git a/sources/plugins/toolbar/lang/fr-ca.js b/sources/plugins/toolbar/lang/fr-ca.js
new file mode 100644
index 00000000..ff3af458
--- /dev/null
+++ b/sources/plugins/toolbar/lang/fr-ca.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'fr-ca', {
6 toolbarCollapse: 'Enrouler la barre d\'outils',
7 toolbarExpand: 'Dérouler la barre d\'outils',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Presse papier/Annuler',
11 editing: 'Édition',
12 forms: 'Formulaires',
13 basicstyles: 'Styles de base',
14 paragraph: 'Paragraphe',
15 links: 'Liens',
16 insert: 'Insérer',
17 styles: 'Styles',
18 colors: 'Couleurs',
19 tools: 'Outils'
20 },
21 toolbars: 'Barre d\'outils de l\'éditeur'
22} );
diff --git a/sources/plugins/toolbar/lang/fr.js b/sources/plugins/toolbar/lang/fr.js
new file mode 100644
index 00000000..5f86bf71
--- /dev/null
+++ b/sources/plugins/toolbar/lang/fr.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'fr', {
6 toolbarCollapse: 'Enrouler la barre d\'outils',
7 toolbarExpand: 'Dérouler la barre d\'outils',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Presse-papier/Défaire',
11 editing: 'Editer',
12 forms: 'Formulaires',
13 basicstyles: 'Styles de base',
14 paragraph: 'Paragraphe',
15 links: 'Liens',
16 insert: 'Insérer',
17 styles: 'Styles',
18 colors: 'Couleurs',
19 tools: 'Outils'
20 },
21 toolbars: 'Barre d\'outils de l\'éditeur'
22} );
diff --git a/sources/plugins/toolbar/lang/gl.js b/sources/plugins/toolbar/lang/gl.js
new file mode 100644
index 00000000..dcbc9905
--- /dev/null
+++ b/sources/plugins/toolbar/lang/gl.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'gl', {
6 toolbarCollapse: 'Contraer a barra de ferramentas',
7 toolbarExpand: 'Expandir a barra de ferramentas',
8 toolbarGroups: {
9 document: 'Documento',
10 clipboard: 'Portapapeis/desfacer',
11 editing: 'Edición',
12 forms: 'Formularios',
13 basicstyles: 'Estilos básicos',
14 paragraph: 'Paragrafo',
15 links: 'Ligazóns',
16 insert: 'Inserir',
17 styles: 'Estilos',
18 colors: 'Cores',
19 tools: 'Ferramentas'
20 },
21 toolbars: 'Barras de ferramentas do editor'
22} );
diff --git a/sources/plugins/toolbar/lang/gu.js b/sources/plugins/toolbar/lang/gu.js
new file mode 100644
index 00000000..7ff25356
--- /dev/null
+++ b/sources/plugins/toolbar/lang/gu.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'gu', {
6 toolbarCollapse: 'ટૂલબાર નાનું કરવું',
7 toolbarExpand: 'ટૂલબાર મોટું કરવું',
8 toolbarGroups: {
9 document: 'દસ્તાવેજ',
10 clipboard: 'ક્લિપબોર્ડ/અન',
11 editing: 'એડીટ કરવું',
12 forms: 'ફોર્મ',
13 basicstyles: 'બેસિક્ સ્ટાઇલ',
14 paragraph: 'ફકરો',
15 links: 'લીંક',
16 insert: 'ઉમેરવું',
17 styles: 'સ્ટાઇલ',
18 colors: 'રંગ',
19 tools: 'ટૂલ્સ'
20 },
21 toolbars: 'એડીટર ટૂલ બાર'
22} );
diff --git a/sources/plugins/toolbar/lang/he.js b/sources/plugins/toolbar/lang/he.js
new file mode 100644
index 00000000..774c9a53
--- /dev/null
+++ b/sources/plugins/toolbar/lang/he.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'he', {
6 toolbarCollapse: 'מזעור סרגל כלים',
7 toolbarExpand: 'הרחבת סרגל כלים',
8 toolbarGroups: {
9 document: 'מסמך',
10 clipboard: 'לוח הגזירים (Clipboard)/צעד אחרון',
11 editing: 'עריכה',
12 forms: 'טפסים',
13 basicstyles: 'עיצוב בסיסי',
14 paragraph: 'פסקה',
15 links: 'קישורים',
16 insert: 'הכנסה',
17 styles: 'עיצוב',
18 colors: 'צבעים',
19 tools: 'כלים'
20 },
21 toolbars: 'סרגלי כלים של העורך'
22} );
diff --git a/sources/plugins/toolbar/lang/hi.js b/sources/plugins/toolbar/lang/hi.js
new file mode 100644
index 00000000..65ffae38
--- /dev/null
+++ b/sources/plugins/toolbar/lang/hi.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'hi', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'एडिटर टूलबार'
22} );
diff --git a/sources/plugins/toolbar/lang/hr.js b/sources/plugins/toolbar/lang/hr.js
new file mode 100644
index 00000000..927cfd22
--- /dev/null
+++ b/sources/plugins/toolbar/lang/hr.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'hr', {
6 toolbarCollapse: 'Smanji alatnu traku',
7 toolbarExpand: 'Proširi alatnu traku',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Međuspremnik/Poništi',
11 editing: 'Uređivanje',
12 forms: 'Forme',
13 basicstyles: 'Osnovni stilovi',
14 paragraph: 'Paragraf',
15 links: 'Veze',
16 insert: 'Umetni',
17 styles: 'Stilovi',
18 colors: 'Boje',
19 tools: 'Alatke'
20 },
21 toolbars: 'Alatne trake uređivača teksta'
22} );
diff --git a/sources/plugins/toolbar/lang/hu.js b/sources/plugins/toolbar/lang/hu.js
new file mode 100644
index 00000000..3df38b9e
--- /dev/null
+++ b/sources/plugins/toolbar/lang/hu.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'hu', {
6 toolbarCollapse: 'Eszköztár összecsukása',
7 toolbarExpand: 'Eszköztár szétnyitása',
8 toolbarGroups: {
9 document: 'Dokumentum',
10 clipboard: 'Vágólap/Visszavonás',
11 editing: 'Szerkesztés',
12 forms: 'Űrlapok',
13 basicstyles: 'Alapstílusok',
14 paragraph: 'Bekezdés',
15 links: 'Hivatkozások',
16 insert: 'Beszúrás',
17 styles: 'Stílusok',
18 colors: 'Színek',
19 tools: 'Eszközök'
20 },
21 toolbars: 'Szerkesztő Eszköztár'
22} );
diff --git a/sources/plugins/toolbar/lang/id.js b/sources/plugins/toolbar/lang/id.js
new file mode 100644
index 00000000..d8838a3c
--- /dev/null
+++ b/sources/plugins/toolbar/lang/id.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'id', {
6 toolbarCollapse: 'Ciutkan Toolbar',
7 toolbarExpand: 'Bentangkan Toolbar',
8 toolbarGroups: {
9 document: 'Dokumen',
10 clipboard: 'Papan klip / Kembalikan perlakuan',
11 editing: 'Sunting',
12 forms: 'Formulir',
13 basicstyles: 'Gaya Dasar',
14 paragraph: 'Paragraf',
15 links: 'Tautan',
16 insert: 'Sisip',
17 styles: 'Gaya',
18 colors: 'Warna',
19 tools: 'Alat'
20 },
21 toolbars: 'Toolbar Penyunting'
22} );
diff --git a/sources/plugins/toolbar/lang/is.js b/sources/plugins/toolbar/lang/is.js
new file mode 100644
index 00000000..e6bc9e97
--- /dev/null
+++ b/sources/plugins/toolbar/lang/is.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'is', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/it.js b/sources/plugins/toolbar/lang/it.js
new file mode 100644
index 00000000..67845dc5
--- /dev/null
+++ b/sources/plugins/toolbar/lang/it.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'it', {
6 toolbarCollapse: 'Minimizza Toolbar',
7 toolbarExpand: 'Espandi Toolbar',
8 toolbarGroups: {
9 document: 'Documento',
10 clipboard: 'Copia negli appunti/Annulla',
11 editing: 'Modifica',
12 forms: 'Form',
13 basicstyles: 'Stili di base',
14 paragraph: 'Paragrafo',
15 links: 'Link',
16 insert: 'Inserisci',
17 styles: 'Stili',
18 colors: 'Colori',
19 tools: 'Strumenti'
20 },
21 toolbars: 'Editor toolbar'
22} );
diff --git a/sources/plugins/toolbar/lang/ja.js b/sources/plugins/toolbar/lang/ja.js
new file mode 100644
index 00000000..112e0bb4
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ja.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ja', {
6 toolbarCollapse: 'ツールバーを閉じる',
7 toolbarExpand: 'ツールバーを開く',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: '編集ツールバー'
22} );
diff --git a/sources/plugins/toolbar/lang/ka.js b/sources/plugins/toolbar/lang/ka.js
new file mode 100644
index 00000000..dbbccd7a
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ka.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ka', {
6 toolbarCollapse: 'ხელსაწყოთა ზოლის შეწევა',
7 toolbarExpand: 'ხელსაწყოთა ზოლის გამოწევა',
8 toolbarGroups: {
9 document: 'დოკუმენტი',
10 clipboard: 'Clipboard/გაუქმება',
11 editing: 'რედაქტირება',
12 forms: 'ფორმები',
13 basicstyles: 'ძირითადი სტილები',
14 paragraph: 'აბზაცი',
15 links: 'ბმულები',
16 insert: 'ჩასმა',
17 styles: 'სტილები',
18 colors: 'ფერები',
19 tools: 'ხელსაწყოები'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/km.js b/sources/plugins/toolbar/lang/km.js
new file mode 100644
index 00000000..f1b7253a
--- /dev/null
+++ b/sources/plugins/toolbar/lang/km.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'km', {
6 toolbarCollapse: 'បង្រួម​របារ​ឧបករណ៍',
7 toolbarExpand: 'ពង្រីក​របារ​ឧបករណ៍',
8 toolbarGroups: {
9 document: 'ឯកសារ',
10 clipboard: 'Clipboard/មិន​ធ្វើ​វិញ',
11 editing: 'ការ​កែ​សម្រួល',
12 forms: 'បែបបទ',
13 basicstyles: 'រចនាបថ​មូលដ្ឋាន',
14 paragraph: 'កថាខណ្ឌ',
15 links: 'តំណ',
16 insert: 'បញ្ចូល',
17 styles: 'រចនាបថ',
18 colors: 'ពណ៌',
19 tools: 'ឧបករណ៍'
20 },
21 toolbars: 'របារ​ឧបករណ៍​កែ​សម្រួល'
22} );
diff --git a/sources/plugins/toolbar/lang/ko.js b/sources/plugins/toolbar/lang/ko.js
new file mode 100644
index 00000000..5630c4b3
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ko.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ko', {
6 toolbarCollapse: '툴바 줄이기',
7 toolbarExpand: '툴바 확장',
8 toolbarGroups: {
9 document: '문서',
10 clipboard: '클립보드/실행 취소',
11 editing: '편집',
12 forms: '폼',
13 basicstyles: '기본 스타일',
14 paragraph: '단락',
15 links: '링크',
16 insert: '삽입',
17 styles: '스타일',
18 colors: '색상',
19 tools: '도구'
20 },
21 toolbars: '에디터 툴바'
22} );
diff --git a/sources/plugins/toolbar/lang/ku.js b/sources/plugins/toolbar/lang/ku.js
new file mode 100644
index 00000000..bdd04e19
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ku.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ku', {
6 toolbarCollapse: 'شاردنەوی هێڵی تووڵامراز',
7 toolbarExpand: 'نیشاندانی هێڵی تووڵامراز',
8 toolbarGroups: {
9 document: 'پەڕه',
10 clipboard: 'بڕین/پووچکردنەوە',
11 editing: 'چاکسازی',
12 forms: 'داڕشتە',
13 basicstyles: 'شێوازی بنچینەیی',
14 paragraph: 'بڕگە',
15 links: 'بەستەر',
16 insert: 'خستنە ناو',
17 styles: 'شێواز',
18 colors: 'ڕەنگەکان',
19 tools: 'ئامرازەکان'
20 },
21 toolbars: 'تووڵامرازی دەسکاریکەر'
22} );
diff --git a/sources/plugins/toolbar/lang/lt.js b/sources/plugins/toolbar/lang/lt.js
new file mode 100644
index 00000000..8e117ec3
--- /dev/null
+++ b/sources/plugins/toolbar/lang/lt.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'lt', {
6 toolbarCollapse: 'Apjungti įrankių juostą',
7 toolbarExpand: 'Išplėsti įrankių juostą',
8 toolbarGroups: {
9 document: 'Dokumentas',
10 clipboard: 'Atmintinė/Atgal',
11 editing: 'Redagavimas',
12 forms: 'Formos',
13 basicstyles: 'Pagrindiniai stiliai',
14 paragraph: 'Paragrafas',
15 links: 'Nuorodos',
16 insert: 'Įterpti',
17 styles: 'Stiliai',
18 colors: 'Spalvos',
19 tools: 'Įrankiai'
20 },
21 toolbars: 'Redaktoriaus įrankiai'
22} );
diff --git a/sources/plugins/toolbar/lang/lv.js b/sources/plugins/toolbar/lang/lv.js
new file mode 100644
index 00000000..f06a280e
--- /dev/null
+++ b/sources/plugins/toolbar/lang/lv.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'lv', {
6 toolbarCollapse: 'Aizvērt rīkjoslu',
7 toolbarExpand: 'Atvērt rīkjoslu',
8 toolbarGroups: {
9 document: 'Dokuments',
10 clipboard: 'Starpliktuve/Atcelt',
11 editing: 'Labošana',
12 forms: 'Formas',
13 basicstyles: 'Pamata stili',
14 paragraph: 'Paragrāfs',
15 links: 'Saites',
16 insert: 'Ievietot',
17 styles: 'Stili',
18 colors: 'Krāsas',
19 tools: 'Rīki'
20 },
21 toolbars: 'Redaktora rīkjoslas'
22} );
diff --git a/sources/plugins/toolbar/lang/mk.js b/sources/plugins/toolbar/lang/mk.js
new file mode 100644
index 00000000..c934e3a7
--- /dev/null
+++ b/sources/plugins/toolbar/lang/mk.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'mk', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/mn.js b/sources/plugins/toolbar/lang/mn.js
new file mode 100644
index 00000000..6df016c2
--- /dev/null
+++ b/sources/plugins/toolbar/lang/mn.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'mn', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Холбоосууд',
16 insert: 'Оруулах',
17 styles: 'Загварууд',
18 colors: 'Онгөнүүд',
19 tools: 'Хэрэгслүүд'
20 },
21 toolbars: 'Болосруулагчийн хэрэгслийн самбар'
22} );
diff --git a/sources/plugins/toolbar/lang/ms.js b/sources/plugins/toolbar/lang/ms.js
new file mode 100644
index 00000000..756d3621
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ms.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ms', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/nb.js b/sources/plugins/toolbar/lang/nb.js
new file mode 100644
index 00000000..93c58767
--- /dev/null
+++ b/sources/plugins/toolbar/lang/nb.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'nb', {
6 toolbarCollapse: 'Skjul verktøylinje',
7 toolbarExpand: 'Vis verktøylinje',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Utklippstavle/Angre',
11 editing: 'Redigering',
12 forms: 'Skjema',
13 basicstyles: 'Basisstiler',
14 paragraph: 'Avsnitt',
15 links: 'Lenker',
16 insert: 'Innsetting',
17 styles: 'Stiler',
18 colors: 'Farger',
19 tools: 'Verktøy'
20 },
21 toolbars: 'Verktøylinjer for editor'
22} );
diff --git a/sources/plugins/toolbar/lang/nl.js b/sources/plugins/toolbar/lang/nl.js
new file mode 100644
index 00000000..a061a264
--- /dev/null
+++ b/sources/plugins/toolbar/lang/nl.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'nl', {
6 toolbarCollapse: 'Werkbalk inklappen',
7 toolbarExpand: 'Werkbalk uitklappen',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Klembord/Ongedaan maken',
11 editing: 'Bewerken',
12 forms: 'Formulieren',
13 basicstyles: 'Basisstijlen',
14 paragraph: 'Paragraaf',
15 links: 'Links',
16 insert: 'Invoegen',
17 styles: 'Stijlen',
18 colors: 'Kleuren',
19 tools: 'Toepassingen'
20 },
21 toolbars: 'Werkbalken'
22} );
diff --git a/sources/plugins/toolbar/lang/no.js b/sources/plugins/toolbar/lang/no.js
new file mode 100644
index 00000000..7e1b5eb6
--- /dev/null
+++ b/sources/plugins/toolbar/lang/no.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'no', {
6 toolbarCollapse: 'Skjul verktøylinje',
7 toolbarExpand: 'Vis verktøylinje',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Utklippstavle/Angre',
11 editing: 'Redigering',
12 forms: 'Skjema',
13 basicstyles: 'Basisstiler',
14 paragraph: 'Avsnitt',
15 links: 'Lenker',
16 insert: 'Innsetting',
17 styles: 'Stiler',
18 colors: 'Farger',
19 tools: 'Verktøy'
20 },
21 toolbars: 'Verktøylinjer for editor'
22} );
diff --git a/sources/plugins/toolbar/lang/pl.js b/sources/plugins/toolbar/lang/pl.js
new file mode 100644
index 00000000..51ed44c4
--- /dev/null
+++ b/sources/plugins/toolbar/lang/pl.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'pl', {
6 toolbarCollapse: 'Zwiń pasek narzędzi',
7 toolbarExpand: 'Rozwiń pasek narzędzi',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Schowek/Wstecz',
11 editing: 'Edycja',
12 forms: 'Formularze',
13 basicstyles: 'Style podstawowe',
14 paragraph: 'Akapit',
15 links: 'Hiperłącza',
16 insert: 'Wstawianie',
17 styles: 'Style',
18 colors: 'Kolory',
19 tools: 'Narzędzia'
20 },
21 toolbars: 'Paski narzędzi edytora'
22} );
diff --git a/sources/plugins/toolbar/lang/pt-br.js b/sources/plugins/toolbar/lang/pt-br.js
new file mode 100644
index 00000000..281f48e7
--- /dev/null
+++ b/sources/plugins/toolbar/lang/pt-br.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'pt-br', {
6 toolbarCollapse: 'Diminuir Barra de Ferramentas',
7 toolbarExpand: 'Aumentar Barra de Ferramentas',
8 toolbarGroups: {
9 document: 'Documento',
10 clipboard: 'Clipboard/Desfazer',
11 editing: 'Edição',
12 forms: 'Formulários',
13 basicstyles: 'Estilos Básicos',
14 paragraph: 'Paragrafo',
15 links: 'Links',
16 insert: 'Inserir',
17 styles: 'Estilos',
18 colors: 'Cores',
19 tools: 'Ferramentas'
20 },
21 toolbars: 'Barra de Ferramentas do Editor'
22} );
diff --git a/sources/plugins/toolbar/lang/pt.js b/sources/plugins/toolbar/lang/pt.js
new file mode 100644
index 00000000..7c0da9d4
--- /dev/null
+++ b/sources/plugins/toolbar/lang/pt.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'pt', {
6 toolbarCollapse: 'Ocultar barra de ferramentas',
7 toolbarExpand: 'Expandir barra de ferramentas',
8 toolbarGroups: {
9 document: 'Documento',
10 clipboard: 'Área de transferência/Anular',
11 editing: 'Edição',
12 forms: 'Formulários',
13 basicstyles: 'Estilos Básicos',
14 paragraph: 'Parágrafo',
15 links: 'Hiperligações',
16 insert: 'Inserir',
17 styles: 'Estilos',
18 colors: 'Cores',
19 tools: 'Ferramentas'
20 },
21 toolbars: 'Editor de Barras de Ferramentas'
22} );
diff --git a/sources/plugins/toolbar/lang/ro.js b/sources/plugins/toolbar/lang/ro.js
new file mode 100644
index 00000000..fa18fe2d
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ro.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ro', {
6 toolbarCollapse: 'Micșorează Bara',
7 toolbarExpand: 'Mărește Bara',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Editează bara de unelte'
22} );
diff --git a/sources/plugins/toolbar/lang/ru.js b/sources/plugins/toolbar/lang/ru.js
new file mode 100644
index 00000000..d1fc8809
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ru.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ru', {
6 toolbarCollapse: 'Свернуть панель инструментов',
7 toolbarExpand: 'Развернуть панель инструментов',
8 toolbarGroups: {
9 document: 'Документ',
10 clipboard: 'Буфер обмена / Отмена действий',
11 editing: 'Корректировка',
12 forms: 'Формы',
13 basicstyles: 'Простые стили',
14 paragraph: 'Абзац',
15 links: 'Ссылки',
16 insert: 'Вставка',
17 styles: 'Стили',
18 colors: 'Цвета',
19 tools: 'Инструменты'
20 },
21 toolbars: 'Панели инструментов редактора'
22} );
diff --git a/sources/plugins/toolbar/lang/si.js b/sources/plugins/toolbar/lang/si.js
new file mode 100644
index 00000000..067c4e13
--- /dev/null
+++ b/sources/plugins/toolbar/lang/si.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'si', {
6 toolbarCollapse: 'මෙවලම් තීරුව හැකුලුම.',
7 toolbarExpand: 'මෙවලම් තීරුව දීගහැරුම',
8 toolbarGroups: {
9 document: 'ලිපිය',
10 clipboard: 'ඇමිණුම වෙනස් කිරීම',
11 editing: 'සංස්කරණය',
12 forms: 'පෝරමය',
13 basicstyles: 'මුලික විලාසය',
14 paragraph: 'චේදය',
15 links: 'සබැඳිය',
16 insert: 'ඇතුලත් කිරීම',
17 styles: 'විලාසය',
18 colors: 'වර්ණය',
19 tools: 'මෙවලම්'
20 },
21 toolbars: 'සංස්කරණ මෙවලම් තීරුව'
22} );
diff --git a/sources/plugins/toolbar/lang/sk.js b/sources/plugins/toolbar/lang/sk.js
new file mode 100644
index 00000000..7b4ca3d2
--- /dev/null
+++ b/sources/plugins/toolbar/lang/sk.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'sk', {
6 toolbarCollapse: 'Zbaliť lištu nástrojov',
7 toolbarExpand: 'Rozbaliť lištu nástrojov',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Schránka pre kopírovanie/Späť',
11 editing: 'Upravovanie',
12 forms: 'Formuláre',
13 basicstyles: 'Základné štýly',
14 paragraph: 'Odstavec',
15 links: 'Odkazy',
16 insert: 'Vložiť',
17 styles: 'Štýly',
18 colors: 'Farby',
19 tools: 'Nástroje'
20 },
21 toolbars: 'Lišty nástrojov editora'
22} );
diff --git a/sources/plugins/toolbar/lang/sl.js b/sources/plugins/toolbar/lang/sl.js
new file mode 100644
index 00000000..b0ed1332
--- /dev/null
+++ b/sources/plugins/toolbar/lang/sl.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'sl', {
6 toolbarCollapse: 'Skrči Orodno Vrstico',
7 toolbarExpand: 'Razširi Orodno Vrstico',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Urejevalnik orodne vrstice'
22} );
diff --git a/sources/plugins/toolbar/lang/sq.js b/sources/plugins/toolbar/lang/sq.js
new file mode 100644
index 00000000..a45db222
--- /dev/null
+++ b/sources/plugins/toolbar/lang/sq.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'sq', {
6 toolbarCollapse: 'Zvogëlo Shiritin',
7 toolbarExpand: 'Zgjero Shiritin',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Tabela Punës/Ribëje',
11 editing: 'Duke Redaktuar',
12 forms: 'Formular',
13 basicstyles: 'Stili Bazë',
14 paragraph: 'Paragraf',
15 links: 'Nyjet',
16 insert: 'Shto',
17 styles: 'Stil',
18 colors: 'Ngjyrat',
19 tools: 'Mjetet'
20 },
21 toolbars: 'Shiritet e Redaktuesit'
22} );
diff --git a/sources/plugins/toolbar/lang/sr-latn.js b/sources/plugins/toolbar/lang/sr-latn.js
new file mode 100644
index 00000000..0d1430d9
--- /dev/null
+++ b/sources/plugins/toolbar/lang/sr-latn.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'sr-latn', {
6 toolbarCollapse: 'Suzi alatnu traku',
7 toolbarExpand: 'Proširi alatnu traku',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Alatne trake'
22} );
diff --git a/sources/plugins/toolbar/lang/sr.js b/sources/plugins/toolbar/lang/sr.js
new file mode 100644
index 00000000..782fa35b
--- /dev/null
+++ b/sources/plugins/toolbar/lang/sr.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'sr', {
6 toolbarCollapse: 'Склопи алатну траку',
7 toolbarExpand: 'Прошири алатну траку',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'Едитор алатне траке'
22} );
diff --git a/sources/plugins/toolbar/lang/sv.js b/sources/plugins/toolbar/lang/sv.js
new file mode 100644
index 00000000..5c579400
--- /dev/null
+++ b/sources/plugins/toolbar/lang/sv.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'sv', {
6 toolbarCollapse: 'Dölj verktygsfält',
7 toolbarExpand: 'Visa verktygsfält',
8 toolbarGroups: {
9 document: 'Dokument',
10 clipboard: 'Urklipp/ångra',
11 editing: 'Redigering',
12 forms: 'Formulär',
13 basicstyles: 'Basstilar',
14 paragraph: 'Paragraf',
15 links: 'Länkar',
16 insert: 'Infoga',
17 styles: 'Stilar',
18 colors: 'Färger',
19 tools: 'Verktyg'
20 },
21 toolbars: 'Redigera verktygsfält'
22} );
diff --git a/sources/plugins/toolbar/lang/th.js b/sources/plugins/toolbar/lang/th.js
new file mode 100644
index 00000000..ee8676c4
--- /dev/null
+++ b/sources/plugins/toolbar/lang/th.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'th', {
6 toolbarCollapse: 'ซ่อนแถบเครื่องมือ',
7 toolbarExpand: 'เปิดแถบเครื่องมือ',
8 toolbarGroups: {
9 document: 'Document',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Editing',
12 forms: 'Forms',
13 basicstyles: 'Basic Styles',
14 paragraph: 'Paragraph',
15 links: 'Links',
16 insert: 'Insert',
17 styles: 'Styles',
18 colors: 'Colors',
19 tools: 'Tools'
20 },
21 toolbars: 'แถบเครื่องมือช่วยพิมพ์ข้อความ'
22} );
diff --git a/sources/plugins/toolbar/lang/tr.js b/sources/plugins/toolbar/lang/tr.js
new file mode 100644
index 00000000..5a937c9a
--- /dev/null
+++ b/sources/plugins/toolbar/lang/tr.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'tr', {
6 toolbarCollapse: 'Araç çubuklarını topla',
7 toolbarExpand: 'Araç çubuklarını aç',
8 toolbarGroups: {
9 document: 'Belge',
10 clipboard: 'Pano/Geri al',
11 editing: 'Düzenleme',
12 forms: 'Formlar',
13 basicstyles: 'Temel Stiller',
14 paragraph: 'Paragraf',
15 links: 'Bağlantılar',
16 insert: 'Ekle',
17 styles: 'Stiller',
18 colors: 'Renkler',
19 tools: 'Araçlar'
20 },
21 toolbars: 'Araç çubukları Editörü'
22} );
diff --git a/sources/plugins/toolbar/lang/tt.js b/sources/plugins/toolbar/lang/tt.js
new file mode 100644
index 00000000..4749f2c0
--- /dev/null
+++ b/sources/plugins/toolbar/lang/tt.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'tt', {
6 toolbarCollapse: 'Collapse Toolbar', // MISSING
7 toolbarExpand: 'Expand Toolbar', // MISSING
8 toolbarGroups: {
9 document: 'Документ',
10 clipboard: 'Алмашу буферы/Кайтару',
11 editing: 'Төзәтү',
12 forms: 'Формалар',
13 basicstyles: 'Төп стильләр',
14 paragraph: 'Параграф',
15 links: 'Сылталамалар',
16 insert: 'Өстәү',
17 styles: 'Стильләр',
18 colors: 'Төсләр',
19 tools: 'Кораллар'
20 },
21 toolbars: 'Editor toolbars' // MISSING
22} );
diff --git a/sources/plugins/toolbar/lang/ug.js b/sources/plugins/toolbar/lang/ug.js
new file mode 100644
index 00000000..7b7a6d59
--- /dev/null
+++ b/sources/plugins/toolbar/lang/ug.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'ug', {
6 toolbarCollapse: 'قورال بالداقنى قاتلا',
7 toolbarExpand: 'قورال بالداقنى ياي',
8 toolbarGroups: {
9 document: 'پۈتۈك',
10 clipboard: 'چاپلاش تاختىسى/يېنىۋال',
11 editing: 'تەھرىر',
12 forms: 'جەدۋەل',
13 basicstyles: 'ئاساسىي ئۇسلۇب',
14 paragraph: 'ئابزاس',
15 links: 'ئۇلانما',
16 insert: 'قىستۇر',
17 styles: 'ئۇسلۇب',
18 colors: 'رەڭ',
19 tools: 'قورال'
20 },
21 toolbars: 'قورال بالداق'
22} );
diff --git a/sources/plugins/toolbar/lang/uk.js b/sources/plugins/toolbar/lang/uk.js
new file mode 100644
index 00000000..61158e62
--- /dev/null
+++ b/sources/plugins/toolbar/lang/uk.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'uk', {
6 toolbarCollapse: 'Згорнути панель інструментів',
7 toolbarExpand: 'Розгорнути панель інструментів',
8 toolbarGroups: {
9 document: 'Документ',
10 clipboard: 'Буфер обміну / Скасувати',
11 editing: 'Редагування',
12 forms: 'Форми',
13 basicstyles: 'Основний Стиль',
14 paragraph: 'Параграф',
15 links: 'Посилання',
16 insert: 'Вставити',
17 styles: 'Стилі',
18 colors: 'Кольори',
19 tools: 'Інструменти'
20 },
21 toolbars: 'Панель інструментів редактора'
22} );
diff --git a/sources/plugins/toolbar/lang/vi.js b/sources/plugins/toolbar/lang/vi.js
new file mode 100644
index 00000000..02faf799
--- /dev/null
+++ b/sources/plugins/toolbar/lang/vi.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'vi', {
6 toolbarCollapse: 'Thu gọn thanh công cụ',
7 toolbarExpand: 'Mở rộng thnah công cụ',
8 toolbarGroups: {
9 document: 'Tài liệu',
10 clipboard: 'Clipboard/Undo',
11 editing: 'Chỉnh sửa',
12 forms: 'Bảng biểu',
13 basicstyles: 'Kiểu cơ bản',
14 paragraph: 'Đoạn',
15 links: 'Liên kết',
16 insert: 'Chèn',
17 styles: 'Kiểu',
18 colors: 'Màu sắc',
19 tools: 'Công cụ'
20 },
21 toolbars: 'Thanh công cụ'
22} );
diff --git a/sources/plugins/toolbar/lang/zh-cn.js b/sources/plugins/toolbar/lang/zh-cn.js
new file mode 100644
index 00000000..a3427cef
--- /dev/null
+++ b/sources/plugins/toolbar/lang/zh-cn.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'zh-cn', {
6 toolbarCollapse: '折叠工具栏',
7 toolbarExpand: '展开工具栏',
8 toolbarGroups: {
9 document: '文档',
10 clipboard: '剪贴板/撤销',
11 editing: '编辑',
12 forms: '表单',
13 basicstyles: '基本格式',
14 paragraph: '段落',
15 links: '链接',
16 insert: '插入',
17 styles: '样式',
18 colors: '颜色',
19 tools: '工具'
20 },
21 toolbars: '工具栏'
22} );
diff --git a/sources/plugins/toolbar/lang/zh.js b/sources/plugins/toolbar/lang/zh.js
new file mode 100644
index 00000000..3a9330e0
--- /dev/null
+++ b/sources/plugins/toolbar/lang/zh.js
@@ -0,0 +1,22 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'toolbar', 'zh', {
6 toolbarCollapse: '摺疊工具列',
7 toolbarExpand: '展開工具列',
8 toolbarGroups: {
9 document: '文件',
10 clipboard: '剪貼簿/復原',
11 editing: '編輯選項',
12 forms: '格式',
13 basicstyles: '基本樣式',
14 paragraph: '段落',
15 links: '連結',
16 insert: '插入',
17 styles: '樣式',
18 colors: '顏色',
19 tools: '工具'
20 },
21 toolbars: '編輯器工具列'
22} );
diff --git a/sources/plugins/toolbar/plugin.js b/sources/plugins/toolbar/plugin.js
new file mode 100644
index 00000000..2867e2b6
--- /dev/null
+++ b/sources/plugins/toolbar/plugin.js
@@ -0,0 +1,803 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The "toolbar" plugin. Renders the default toolbar interface in
8 * the editor.
9 */
10
11( function() {
12 var toolbox = function() {
13 this.toolbars = [];
14 this.focusCommandExecuted = false;
15 };
16
17 toolbox.prototype.focus = function() {
18 for ( var t = 0, toolbar; toolbar = this.toolbars[ t++ ]; ) {
19 for ( var i = 0, item; item = toolbar.items[ i++ ]; ) {
20 if ( item.focus ) {
21 item.focus();
22 return;
23 }
24 }
25 }
26 };
27
28 var commands = {
29 toolbarFocus: {
30 modes: { wysiwyg: 1, source: 1 },
31 readOnly: 1,
32
33 exec: function( editor ) {
34 if ( editor.toolbox ) {
35 editor.toolbox.focusCommandExecuted = true;
36
37 // Make the first button focus accessible for IE. (#3417)
38 // Adobe AIR instead need while of delay.
39 if ( CKEDITOR.env.ie || CKEDITOR.env.air ) {
40 setTimeout( function() {
41 editor.toolbox.focus();
42 }, 100 );
43 } else {
44 editor.toolbox.focus();
45 }
46 }
47 }
48 }
49 };
50
51 CKEDITOR.plugins.add( 'toolbar', {
52 requires: 'button',
53 // jscs:disable maximumLineLength
54 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
55 // jscs:enable maximumLineLength
56
57 init: function( editor ) {
58 var endFlag;
59
60 var itemKeystroke = function( item, keystroke ) {
61 var next, toolbar;
62 var rtl = editor.lang.dir == 'rtl',
63 toolbarGroupCycling = editor.config.toolbarGroupCycling,
64 // Picking right/left key codes.
65 rightKeyCode = rtl ? 37 : 39,
66 leftKeyCode = rtl ? 39 : 37;
67
68 toolbarGroupCycling = toolbarGroupCycling === undefined || toolbarGroupCycling;
69
70 switch ( keystroke ) {
71 case 9: // TAB
72 case CKEDITOR.SHIFT + 9: // SHIFT + TAB
73 // Cycle through the toolbars, starting from the one
74 // closest to the current item.
75 while ( !toolbar || !toolbar.items.length ) {
76 if ( keystroke == 9 ) {
77 toolbar = ( ( toolbar ? toolbar.next : item.toolbar.next ) || editor.toolbox.toolbars[ 0 ] );
78 } else {
79 toolbar = ( ( toolbar ? toolbar.previous : item.toolbar.previous ) || editor.toolbox.toolbars[ editor.toolbox.toolbars.length - 1 ] );
80 }
81
82 // Look for the first item that accepts focus.
83 if ( toolbar.items.length ) {
84 item = toolbar.items[ endFlag ? ( toolbar.items.length - 1 ) : 0 ];
85 while ( item && !item.focus ) {
86 item = endFlag ? item.previous : item.next;
87
88 if ( !item )
89 toolbar = 0;
90 }
91 }
92 }
93
94 if ( item )
95 item.focus();
96
97 return false;
98
99 case rightKeyCode:
100 next = item;
101 do {
102 // Look for the next item in the toolbar.
103 next = next.next;
104
105 // If it's the last item, cycle to the first one.
106 if ( !next && toolbarGroupCycling ) next = item.toolbar.items[ 0 ];
107 }
108 while ( next && !next.focus );
109
110 // If available, just focus it, otherwise focus the
111 // first one.
112 if ( next )
113 next.focus();
114 else
115 // Send a TAB.
116 itemKeystroke( item, 9 );
117
118 return false;
119 case 40: // DOWN-ARROW
120 if ( item.button && item.button.hasArrow ) {
121 // Note: code is duplicated in plugins\richcombo\plugin.js in keyDownFn().
122 editor.once( 'panelShow', function( evt ) {
123 evt.data._.panel._.currentBlock.onKeyDown( 40 );
124 } );
125 item.execute();
126 } else {
127 // Send left arrow key.
128 itemKeystroke( item, keystroke == 40 ? rightKeyCode : leftKeyCode );
129 }
130 return false;
131 case leftKeyCode:
132 case 38: // UP-ARROW
133 next = item;
134 do {
135 // Look for the previous item in the toolbar.
136 next = next.previous;
137
138 // If it's the first item, cycle to the last one.
139 if ( !next && toolbarGroupCycling ) next = item.toolbar.items[ item.toolbar.items.length - 1 ];
140 }
141 while ( next && !next.focus );
142
143 // If available, just focus it, otherwise focus the
144 // last one.
145 if ( next )
146 next.focus();
147 else {
148 endFlag = 1;
149 // Send a SHIFT + TAB.
150 itemKeystroke( item, CKEDITOR.SHIFT + 9 );
151 endFlag = 0;
152 }
153
154 return false;
155
156 case 27: // ESC
157 editor.focus();
158 return false;
159
160 case 13: // ENTER
161 case 32: // SPACE
162 item.execute();
163 return false;
164 }
165 return true;
166 };
167
168 editor.on( 'uiSpace', function( event ) {
169 if ( event.data.space != editor.config.toolbarLocation )
170 return;
171
172 // Create toolbar only once.
173 event.removeListener();
174
175 editor.toolbox = new toolbox();
176
177 var labelId = CKEDITOR.tools.getNextId();
178
179 var output = [
180 '<span id="', labelId, '" class="cke_voice_label">', editor.lang.toolbar.toolbars, '</span>',
181 '<span id="' + editor.ui.spaceId( 'toolbox' ) + '" class="cke_toolbox" role="group" aria-labelledby="', labelId, '" onmousedown="return false;">'
182 ];
183
184 var expanded = editor.config.toolbarStartupExpanded !== false,
185 groupStarted, pendingSeparator;
186
187 // If the toolbar collapser will be available, we'll have
188 // an additional container for all toolbars.
189 if ( editor.config.toolbarCanCollapse && editor.elementMode != CKEDITOR.ELEMENT_MODE_INLINE )
190 output.push( '<span class="cke_toolbox_main"' + ( expanded ? '>' : ' style="display:none">' ) );
191
192 var toolbars = editor.toolbox.toolbars,
193 toolbar = getToolbarConfig( editor );
194
195 for ( var r = 0; r < toolbar.length; r++ ) {
196 var toolbarId,
197 toolbarObj = 0,
198 toolbarName,
199 row = toolbar[ r ],
200 items;
201
202 // It's better to check if the row object is really
203 // available because it's a common mistake to leave
204 // an extra comma in the toolbar definition
205 // settings, which leads on the editor not loading
206 // at all in IE. (#3983)
207 if ( !row )
208 continue;
209
210 if ( groupStarted ) {
211 output.push( '</span>' );
212 groupStarted = 0;
213 pendingSeparator = 0;
214 }
215
216 if ( row === '/' ) {
217 output.push( '<span class="cke_toolbar_break"></span>' );
218 continue;
219 }
220
221 items = row.items || row;
222
223 // Create all items defined for this toolbar.
224 for ( var i = 0; i < items.length; i++ ) {
225 var item = items[ i ],
226 canGroup;
227
228 if ( item ) {
229 if ( item.type == CKEDITOR.UI_SEPARATOR ) {
230 // Do not add the separator immediately. Just save
231 // it be included if we already have something in
232 // the toolbar and if a new item is to be added (later).
233 pendingSeparator = groupStarted && item;
234 continue;
235 }
236
237 canGroup = item.canGroup !== false;
238
239 // Initialize the toolbar first, if needed.
240 if ( !toolbarObj ) {
241 // Create the basic toolbar object.
242 toolbarId = CKEDITOR.tools.getNextId();
243 toolbarObj = { id: toolbarId, items: [] };
244 toolbarName = row.name && ( editor.lang.toolbar.toolbarGroups[ row.name ] || row.name );
245
246 // Output the toolbar opener.
247 output.push( '<span id="', toolbarId, '" class="cke_toolbar"', ( toolbarName ? ' aria-labelledby="' + toolbarId + '_label"' : '' ), ' role="toolbar">' );
248
249 // If a toolbar name is available, send the voice label.
250 toolbarName && output.push( '<span id="', toolbarId, '_label" class="cke_voice_label">', toolbarName, '</span>' );
251
252 output.push( '<span class="cke_toolbar_start"></span>' );
253
254 // Add the toolbar to the "editor.toolbox.toolbars"
255 // array.
256 var index = toolbars.push( toolbarObj ) - 1;
257
258 // Create the next/previous reference.
259 if ( index > 0 ) {
260 toolbarObj.previous = toolbars[ index - 1 ];
261 toolbarObj.previous.next = toolbarObj;
262 }
263 }
264
265 if ( canGroup ) {
266 if ( !groupStarted ) {
267 output.push( '<span class="cke_toolgroup" role="presentation">' );
268 groupStarted = 1;
269 }
270 } else if ( groupStarted ) {
271 output.push( '</span>' );
272 groupStarted = 0;
273 }
274
275 function addItem( item ) { // jshint ignore:line
276 var itemObj = item.render( editor, output );
277 index = toolbarObj.items.push( itemObj ) - 1;
278
279 if ( index > 0 ) {
280 itemObj.previous = toolbarObj.items[ index - 1 ];
281 itemObj.previous.next = itemObj;
282 }
283
284 itemObj.toolbar = toolbarObj;
285 itemObj.onkey = itemKeystroke;
286
287 // Fix for #3052:
288 // Prevent JAWS from focusing the toolbar after document load.
289 itemObj.onfocus = function() {
290 if ( !editor.toolbox.focusCommandExecuted )
291 editor.focus();
292 };
293 }
294
295 if ( pendingSeparator ) {
296 addItem( pendingSeparator );
297 pendingSeparator = 0;
298 }
299
300 addItem( item );
301 }
302 }
303
304 if ( groupStarted ) {
305 output.push( '</span>' );
306 groupStarted = 0;
307 pendingSeparator = 0;
308 }
309
310 if ( toolbarObj )
311 output.push( '<span class="cke_toolbar_end"></span></span>' );
312 }
313
314 if ( editor.config.toolbarCanCollapse )
315 output.push( '</span>' );
316
317 // Not toolbar collapser for inline mode.
318 if ( editor.config.toolbarCanCollapse && editor.elementMode != CKEDITOR.ELEMENT_MODE_INLINE ) {
319 var collapserFn = CKEDITOR.tools.addFunction( function() {
320 editor.execCommand( 'toolbarCollapse' );
321 } );
322
323 editor.on( 'destroy', function() {
324 CKEDITOR.tools.removeFunction( collapserFn );
325 } );
326
327 editor.addCommand( 'toolbarCollapse', {
328 readOnly: 1,
329 exec: function( editor ) {
330 var collapser = editor.ui.space( 'toolbar_collapser' ),
331 toolbox = collapser.getPrevious(),
332 contents = editor.ui.space( 'contents' ),
333 toolboxContainer = toolbox.getParent(),
334 contentHeight = parseInt( contents.$.style.height, 10 ),
335 previousHeight = toolboxContainer.$.offsetHeight,
336 minClass = 'cke_toolbox_collapser_min',
337 collapsed = collapser.hasClass( minClass );
338
339 if ( !collapsed ) {
340 toolbox.hide();
341 collapser.addClass( minClass );
342 collapser.setAttribute( 'title', editor.lang.toolbar.toolbarExpand );
343 } else {
344 toolbox.show();
345 collapser.removeClass( minClass );
346 collapser.setAttribute( 'title', editor.lang.toolbar.toolbarCollapse );
347 }
348
349 // Update collapser symbol.
350 collapser.getFirst().setText( collapsed ? '\u25B2' : // BLACK UP-POINTING TRIANGLE
351 '\u25C0' ); // BLACK LEFT-POINTING TRIANGLE
352
353 var dy = toolboxContainer.$.offsetHeight - previousHeight;
354 contents.setStyle( 'height', ( contentHeight - dy ) + 'px' );
355
356 editor.fire( 'resize', {
357 outerHeight: editor.container.$.offsetHeight,
358 contentsHeight: contents.$.offsetHeight,
359 outerWidth: editor.container.$.offsetWidth
360 } );
361 },
362
363 modes: { wysiwyg: 1, source: 1 }
364 } );
365
366 editor.setKeystroke( CKEDITOR.ALT + ( CKEDITOR.env.ie || CKEDITOR.env.webkit ? 189 : 109 ) /*-*/, 'toolbarCollapse' );
367
368 output.push( '<a title="' + ( expanded ? editor.lang.toolbar.toolbarCollapse : editor.lang.toolbar.toolbarExpand ) +
369 '" id="' + editor.ui.spaceId( 'toolbar_collapser' ) +
370 '" tabIndex="-1" class="cke_toolbox_collapser' );
371
372 if ( !expanded )
373 output.push( ' cke_toolbox_collapser_min' );
374
375 output.push( '" onclick="CKEDITOR.tools.callFunction(' + collapserFn + ')">', '<span class="cke_arrow">&#9650;</span>', // BLACK UP-POINTING TRIANGLE
376 '</a>' );
377 }
378
379 output.push( '</span>' );
380 event.data.html += output.join( '' );
381 } );
382
383 editor.on( 'destroy', function() {
384 if ( this.toolbox ) {
385 var toolbars,
386 index = 0,
387 i, items, instance;
388 toolbars = this.toolbox.toolbars;
389 for ( ; index < toolbars.length; index++ ) {
390 items = toolbars[ index ].items;
391 for ( i = 0; i < items.length; i++ ) {
392 instance = items[ i ];
393 if ( instance.clickFn )
394 CKEDITOR.tools.removeFunction( instance.clickFn );
395 if ( instance.keyDownFn )
396 CKEDITOR.tools.removeFunction( instance.keyDownFn );
397 }
398 }
399 }
400 } );
401
402 // Manage editor focus when navigating the toolbar.
403 editor.on( 'uiReady', function() {
404 var toolbox = editor.ui.space( 'toolbox' );
405 toolbox && editor.focusManager.add( toolbox, 1 );
406 } );
407
408 editor.addCommand( 'toolbarFocus', commands.toolbarFocus );
409 editor.setKeystroke( CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' );
410
411 editor.ui.add( '-', CKEDITOR.UI_SEPARATOR, {} );
412 editor.ui.addHandler( CKEDITOR.UI_SEPARATOR, {
413 create: function() {
414 return {
415 render: function( editor, output ) {
416 output.push( '<span class="cke_toolbar_separator" role="separator"></span>' );
417 return {};
418 }
419 };
420 }
421 } );
422 }
423 } );
424
425 function getToolbarConfig( editor ) {
426 var removeButtons = editor.config.removeButtons;
427
428 removeButtons = removeButtons && removeButtons.split( ',' );
429
430 function buildToolbarConfig() {
431
432 // Object containing all toolbar groups used by ui items.
433 var lookup = getItemDefinedGroups();
434
435 // Take the base for the new toolbar, which is basically a toolbar
436 // definition without items.
437 var toolbar = CKEDITOR.tools.clone( editor.config.toolbarGroups ) || getPrivateToolbarGroups( editor );
438
439 // Fill the toolbar groups with the available ui items.
440 for ( var i = 0; i < toolbar.length; i++ ) {
441 var toolbarGroup = toolbar[ i ];
442
443 // Skip toolbar break.
444 if ( toolbarGroup == '/' )
445 continue;
446 // Handle simply group name item.
447 else if ( typeof toolbarGroup == 'string' )
448 toolbarGroup = toolbar[ i ] = { name: toolbarGroup };
449
450 var items, subGroups = toolbarGroup.groups;
451
452 // Look for items that match sub groups.
453 if ( subGroups ) {
454 for ( var j = 0, sub; j < subGroups.length; j++ ) {
455 sub = subGroups[ j ];
456
457 // If any ui item is registered for this subgroup.
458 items = lookup[ sub ];
459 items && fillGroup( toolbarGroup, items );
460 }
461 }
462
463 // Add the main group items as well.
464 items = lookup[ toolbarGroup.name ];
465 items && fillGroup( toolbarGroup, items );
466 }
467
468 return toolbar;
469 }
470
471 // Returns an object containing all toolbar groups used by ui items.
472 function getItemDefinedGroups() {
473 var groups = {},
474 itemName, item, itemToolbar, group, order;
475
476 for ( itemName in editor.ui.items ) {
477 item = editor.ui.items[ itemName ];
478 itemToolbar = item.toolbar || 'others';
479 if ( itemToolbar ) {
480 // Break the toolbar property into its parts: "group_name[,order]".
481 itemToolbar = itemToolbar.split( ',' );
482 group = itemToolbar[ 0 ];
483 order = parseInt( itemToolbar[ 1 ] || -1, 10 );
484
485 // Initialize the group, if necessary.
486 groups[ group ] || ( groups[ group ] = [] );
487
488 // Push the data used to build the toolbar later.
489 groups[ group ].push( { name: itemName, order: order } );
490 }
491 }
492
493 // Put the items in the right order.
494 for ( group in groups ) {
495 groups[ group ] = groups[ group ].sort( function( a, b ) {
496 return a.order == b.order ? 0 :
497 b.order < 0 ? -1 :
498 a.order < 0 ? 1 :
499 a.order < b.order ? -1 :
500 1;
501 } );
502 }
503
504 return groups;
505 }
506
507 function fillGroup( toolbarGroup, uiItems ) {
508 if ( uiItems.length ) {
509 if ( toolbarGroup.items )
510 toolbarGroup.items.push( editor.ui.create( '-' ) );
511 else
512 toolbarGroup.items = [];
513
514 var item, name;
515 while ( ( item = uiItems.shift() ) ) {
516 name = typeof item == 'string' ? item : item.name;
517
518 // Ignore items that are configured to be removed.
519 if ( !removeButtons || CKEDITOR.tools.indexOf( removeButtons, name ) == -1 ) {
520 item = editor.ui.create( name );
521
522 if ( !item )
523 continue;
524
525 if ( !editor.addFeature( item ) )
526 continue;
527
528 toolbarGroup.items.push( item );
529 }
530 }
531 }
532 }
533
534 function populateToolbarConfig( config ) {
535 var toolbar = [],
536 i, group, newGroup;
537
538 for ( i = 0; i < config.length; ++i ) {
539 group = config[ i ];
540 newGroup = {};
541
542 if ( group == '/' )
543 toolbar.push( group );
544 else if ( CKEDITOR.tools.isArray( group ) ) {
545 fillGroup( newGroup, CKEDITOR.tools.clone( group ) );
546 toolbar.push( newGroup );
547 }
548 else if ( group.items ) {
549 fillGroup( newGroup, CKEDITOR.tools.clone( group.items ) );
550 newGroup.name = group.name;
551 toolbar.push( newGroup );
552 }
553 }
554
555 return toolbar;
556 }
557
558 var toolbar = editor.config.toolbar;
559
560 // If it is a string, return the relative "toolbar_name" config.
561 if ( typeof toolbar == 'string' )
562 toolbar = editor.config[ 'toolbar_' + toolbar ];
563
564 return ( editor.toolbar = toolbar ? populateToolbarConfig( toolbar ) : buildToolbarConfig() );
565 }
566
567 /**
568 * Adds a toolbar group. See {@link CKEDITOR.config#toolbarGroups} for more details.
569 *
570 * **Note:** This method will not modify toolbar groups set explicitly by
571 * {@link CKEDITOR.config#toolbarGroups}. It will only extend the default setting.
572 *
573 * @param {String} name Toolbar group name.
574 * @param {Number/String} previous The name of the toolbar group after which this one
575 * should be added or `0` if this group should be the first one.
576 * @param {String} [subgroupOf] The name of the parent group.
577 * @member CKEDITOR.ui
578 */
579 CKEDITOR.ui.prototype.addToolbarGroup = function( name, previous, subgroupOf ) {
580 // The toolbarGroups from the privates is the one we gonna use for automatic toolbar creation.
581 var toolbarGroups = getPrivateToolbarGroups( this.editor ),
582 atStart = previous === 0,
583 newGroup = { name: name };
584
585 if ( subgroupOf ) {
586 // Transform the subgroupOf name in the real subgroup object.
587 subgroupOf = CKEDITOR.tools.search( toolbarGroups, function( group ) {
588 return group.name == subgroupOf;
589 } );
590
591 if ( subgroupOf ) {
592 !subgroupOf.groups && ( subgroupOf.groups = [] ) ;
593
594 if ( previous ) {
595 // Search the "previous" item and add the new one after it.
596 previous = CKEDITOR.tools.indexOf( subgroupOf.groups, previous );
597 if ( previous >= 0 ) {
598 subgroupOf.groups.splice( previous + 1, 0, name );
599 return;
600 }
601 }
602
603 // If no previous found.
604
605 if ( atStart )
606 subgroupOf.groups.splice( 0, 0, name );
607 else
608 subgroupOf.groups.push( name );
609 return;
610 } else {
611 // Ignore "previous" if subgroupOf has not been found.
612 previous = null;
613 }
614 }
615
616 if ( previous ) {
617 // Transform the "previous" name into its index.
618 previous = CKEDITOR.tools.indexOf( toolbarGroups, function( group ) {
619 return group.name == previous;
620 } );
621 }
622
623 if ( atStart )
624 toolbarGroups.splice( 0, 0, name );
625 else if ( typeof previous == 'number' )
626 toolbarGroups.splice( previous + 1, 0, newGroup );
627 else
628 toolbarGroups.push( name );
629 };
630
631 function getPrivateToolbarGroups( editor ) {
632 return editor._.toolbarGroups || ( editor._.toolbarGroups = [
633 { name: 'document', groups: [ 'mode', 'document', 'doctools' ] },
634 { name: 'clipboard', groups: [ 'clipboard', 'undo' ] },
635 { name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] },
636 { name: 'forms' },
637 '/',
638 { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
639 { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] },
640 { name: 'links' },
641 { name: 'insert' },
642 '/',
643 { name: 'styles' },
644 { name: 'colors' },
645 { name: 'tools' },
646 { name: 'others' },
647 { name: 'about' }
648 ] );
649 }
650} )();
651
652/**
653 * Separator UI element.
654 *
655 * @readonly
656 * @property {String} [='separator']
657 * @member CKEDITOR
658 */
659CKEDITOR.UI_SEPARATOR = 'separator';
660
661/**
662 * The part of the user interface where the toolbar will be rendered. For the default
663 * editor implementation, the recommended options are `'top'` and `'bottom'`.
664 *
665 * Please note that this option is only applicable to [classic](#!/guide/dev_framed)
666 * (`iframe`-based) editor. In case of [inline](#!/guide/dev_inline) editor the toolbar
667 * position is set dynamically depending on the position of the editable element on the screen.
668 *
669 * Read more in the [documentation](#!/guide/dev_toolbarlocation)
670 * and see the [SDK sample](http://sdk.ckeditor.com/samples/toolbarlocation.html).
671 *
672 * config.toolbarLocation = 'bottom';
673 *
674 * @cfg
675 * @member CKEDITOR.config
676 */
677CKEDITOR.config.toolbarLocation = 'top';
678
679/**
680 * The toolbox (alias toolbar) definition. It is a toolbar name or an array of
681 * toolbars (strips), each one being also an array, containing a list of UI items.
682 *
683 * If set to `null`, the toolbar will be generated automatically using all available buttons
684 * and {@link #toolbarGroups} as a toolbar groups layout.
685 *
686 * In CKEditor 4.5+ you can generate your toolbar customization code by using the [visual
687 * toolbar configurator](http://docs.ckeditor.com/#!/guide/dev_toolbar).
688 *
689 * // Defines a toolbar with only one strip containing the "Source" button, a
690 * // separator, and the "Bold" and "Italic" buttons.
691 * config.toolbar = [
692 * [ 'Source', '-', 'Bold', 'Italic' ]
693 * ];
694 *
695 * // Similar to the example above, defines a "Basic" toolbar with only one strip containing three buttons.
696 * // Note that this setting is composed by "toolbar_" added to the toolbar name, which in this case is called "Basic".
697 * // This second part of the setting name can be anything. You must use this name in the CKEDITOR.config.toolbar setting
698 * // in order to instruct the editor which `toolbar_(name)` setting should be used.
699 * config.toolbar_Basic = [
700 * [ 'Source', '-', 'Bold', 'Italic' ]
701 * ];
702 * // Load toolbar_Name where Name = Basic.
703 * config.toolbar = 'Basic';
704 *
705 * @cfg {Array/String} [toolbar=null]
706 * @member CKEDITOR.config
707 */
708
709/**
710 * The toolbar groups definition.
711 *
712 * If the toolbar layout is not explicitly defined by the {@link #toolbar} setting, then
713 * this setting is used to group all defined buttons (see {@link CKEDITOR.ui#addButton}).
714 * Buttons are associated with toolbar groups by the `toolbar` property in their definition objects.
715 *
716 * New groups may be dynamically added during the editor and plugin initialization by
717 * {@link CKEDITOR.ui#addToolbarGroup}. This is only possible if the default setting was used.
718 *
719 * // Default setting.
720 * config.toolbarGroups = [
721 * { name: 'document', groups: [ 'mode', 'document', 'doctools' ] },
722 * { name: 'clipboard', groups: [ 'clipboard', 'undo' ] },
723 * { name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] },
724 * { name: 'forms' },
725 * '/',
726 * { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
727 * { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] },
728 * { name: 'links' },
729 * { name: 'insert' },
730 * '/',
731 * { name: 'styles' },
732 * { name: 'colors' },
733 * { name: 'tools' },
734 * { name: 'others' },
735 * { name: 'about' }
736 * ];
737 *
738 * @cfg {Array} [toolbarGroups=see example]
739 * @member CKEDITOR.config
740 */
741
742/**
743 * Whether the toolbar can be collapsed by the user. If disabled, the Collapse Toolbar
744 * button will not be displayed.
745 *
746 * config.toolbarCanCollapse = true;
747 *
748 * @cfg {Boolean} [toolbarCanCollapse=false]
749 * @member CKEDITOR.config
750 */
751
752/**
753 * Whether the toolbar must start expanded when the editor is loaded.
754 *
755 * Setting this option to `false` will affect the toolbar only when
756 * {@link #toolbarCanCollapse} is set to `true`:
757 *
758 * config.toolbarCanCollapse = true;
759 * config.toolbarStartupExpanded = false;
760 *
761 * @cfg {Boolean} [toolbarStartupExpanded=true]
762 * @member CKEDITOR.config
763 */
764
765/**
766 * When enabled, causes the *Arrow* keys navigation to cycle within the current
767 * toolbar group. Otherwise the *Arrow* keys will move through all items available in
768 * the toolbar. The *Tab* key will still be used to quickly jump among the
769 * toolbar groups.
770 *
771 * config.toolbarGroupCycling = false;
772 *
773 * @since 3.6
774 * @cfg {Boolean} [toolbarGroupCycling=true]
775 * @member CKEDITOR.config
776 */
777
778/**
779 * List of toolbar button names that must not be rendered. This will also work
780 * for non-button toolbar items, like the Font drop-down list.
781 *
782 * config.removeButtons = 'Underline,JustifyCenter';
783 *
784 * This configuration option should not be overused. The recommended way is to use the
785 * {@link CKEDITOR.config#removePlugins} setting to remove features from the editor
786 * or even better, [create a custom editor build](http://ckeditor.com/builder) with
787 * just the features that you will use.
788 * In some cases though, a single plugin may define a set of toolbar buttons and
789 * `removeButtons` may be useful when just a few of them are to be removed.
790 *
791 * @cfg {String} [removeButtons]
792 * @member CKEDITOR.config
793 */
794
795/**
796 * The toolbar definition used by the editor. It is created from the
797 * {@link CKEDITOR.config#toolbar} option if it is set or automatically
798 * based on {@link CKEDITOR.config#toolbarGroups}.
799 *
800 * @readonly
801 * @property {Object} toolbar
802 * @member CKEDITOR.editor
803 */
diff --git a/sources/plugins/toolbar/samples/toolbar.html b/sources/plugins/toolbar/samples/toolbar.html
new file mode 100644
index 00000000..923d3611
--- /dev/null
+++ b/sources/plugins/toolbar/samples/toolbar.html
@@ -0,0 +1,235 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Toolbar Configuration &mdash; CKEditor Sample</title>
10 <meta name="ckeditor-sample-name" content="Toolbar Configurations">
11 <meta name="ckeditor-sample-group" content="Advanced Samples">
12 <meta name="ckeditor-sample-description" content="Configuring CKEditor to display full or custom toolbar layout.">
13 <script src="../../../ckeditor.js"></script>
14 <link href="../../../samples/old/sample.css" rel="stylesheet">
15</head>
16<body>
17 <h1 class="samples">
18 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Toolbar Configuration
19 </h1>
20 <div class="warning deprecated">
21 This sample is not maintained anymore. Check out the <a href="../../../samples/toolbarconfigurator/index.html#basic">brand new CKEditor Toolbar Configurator</a>.
22 </div>
23 <div class="description">
24 <p>
25 This sample page demonstrates editor with loaded <a href="#fullToolbar">full toolbar</a> (all registered buttons) and, if
26 current editor's configuration modifies default settings, also editor with <a href="#currentToolbar">modified toolbar</a>.
27 </p>
28
29 <p>Since CKEditor 4 there are two ways to configure toolbar buttons.</p>
30
31 <h2 class="samples">By <a href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbar">config.toolbar</a></h2>
32
33 <p>
34 You can explicitly define which buttons are displayed in which groups and in which order.
35 This is the more precise setting, but less flexible. If newly added plugin adds its
36 own button you'll have to add it manually to your <code>config.toolbar</code> setting as well.
37 </p>
38
39 <p>To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:</p>
40
41 <pre class="samples">
42CKEDITOR.replace( <em>'textarea_id'</em>, {
43 <strong>toolbar:</strong> [
44 { name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] }, // Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
45 [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ], // Defines toolbar group without name.
46 '/', // Line break - next group will be placed in new line.
47 { name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
48 ]
49});</pre>
50
51 <h2 class="samples">By <a href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbarGroups">config.toolbarGroups</a></h2>
52
53 <p>
54 You can define which groups of buttons (like e.g. <code>basicstyles</code>, <code>clipboard</code>
55 and <code>forms</code>) are displayed and in which order. Registered buttons are associated
56 with toolbar groups by <code>toolbar</code> property in their definition.
57 This setting's advantage is that you don't have to modify toolbar configuration
58 when adding/removing plugins which register their own buttons.
59 </p>
60
61 <p>To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:</p>
62
63 <pre class="samples">
64CKEDITOR.replace( <em>'textarea_id'</em>, {
65 <strong>toolbarGroups:</strong> [
66 { name: 'document', groups: [ 'mode', 'document' ] }, // Displays document group with its two subgroups.
67 { name: 'clipboard', groups: [ 'clipboard', 'undo' ] }, // Group's name will be used to create voice label.
68 '/', // Line break - next group will be placed in new line.
69 { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
70 { name: 'links' }
71 ]
72
73 // NOTE: Remember to leave 'toolbar' property with the default value (null).
74});</pre>
75 </div>
76
77 <div id="currentToolbar" style="display: none">
78 <h2 class="samples">Current toolbar configuration</h2>
79 <p>Below you can see editor with current toolbar definition.</p>
80 <textarea cols="80" id="editorCurrent" name="editorCurrent" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
81 <pre id="editorCurrentCfg" class="samples"></pre>
82 </div>
83
84 <div id="fullToolbar">
85 <h2 class="samples">Full toolbar configuration</h2>
86 <p>Below you can see editor with full toolbar, generated automatically by the editor.</p>
87 <p>
88 <strong>Note</strong>: To create editor instance with full toolbar you don't have to set anything.
89 Just leave <code>toolbar</code> and <code>toolbarGroups</code> with the default, <code>null</code> values.
90 </p>
91 <textarea cols="80" id="editorFull" name="editorFull" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
92 <pre id="editorFullCfg" class="samples"></pre>
93 </div>
94
95 <script>
96
97(function() {
98 'use strict';
99
100 var buttonsNames;
101
102 CKEDITOR.config.extraPlugins = 'toolbar';
103
104 CKEDITOR.on( 'instanceReady', function( evt ) {
105 var editor = evt.editor,
106 editorCurrent = editor.name == 'editorCurrent',
107 defaultToolbar = !( editor.config.toolbar || editor.config.toolbarGroups || editor.config.removeButtons ),
108 pre = CKEDITOR.document.getById( editor.name + 'Cfg' ),
109 output = '';
110
111 if ( editorCurrent ) {
112 // If default toolbar configuration has been modified, show "current toolbar" section.
113 if ( !defaultToolbar )
114 CKEDITOR.document.getById( 'currentToolbar' ).show();
115 else
116 return;
117 }
118
119 if ( !buttonsNames )
120 buttonsNames = createButtonsNamesHash( editor.ui.items );
121
122 // Toolbar isn't set explicitly, so it was created automatically from toolbarGroups.
123 if ( !editor.config.toolbar ) {
124 output +=
125 '// Toolbar configuration generated automatically by the editor based on config.toolbarGroups.\n' +
126 dumpToolbarConfiguration( editor ) +
127 '\n\n' +
128 '// Toolbar groups configuration.\n' +
129 dumpToolbarConfiguration( editor, true )
130 }
131 // Toolbar groups doesn't count in this case - print only toolbar.
132 else {
133 output += '// Toolbar configuration.\n' +
134 dumpToolbarConfiguration( editor );
135 }
136
137 // Recreate to avoid old IE from loosing whitespaces on filling <pre> content.
138 var preOutput = pre.getOuterHtml().replace( /(?=<\/)/, output );
139 CKEDITOR.dom.element.createFromHtml( preOutput ).replace( pre );
140 } );
141
142 CKEDITOR.replace( 'editorCurrent', { height: 100 } );
143 CKEDITOR.replace( 'editorFull', {
144 // Reset toolbar settings, so full toolbar will be generated automatically.
145 toolbar: null,
146 toolbarGroups: null,
147 removeButtons: null,
148 height: 100
149 } );
150
151 function dumpToolbarConfiguration( editor, printGroups ) {
152 var output = [],
153 toolbar = editor.toolbar;
154
155 for ( var i = 0; i < toolbar.length; ++i ) {
156 var group = dumpToolbarGroup( toolbar[ i ], printGroups );
157 if ( group )
158 output.push( group );
159 }
160
161 return 'config.toolbar' + ( printGroups ? 'Groups' : '' ) + ' = [\n\t' + output.join( ',\n\t' ) + '\n];';
162 }
163
164 function dumpToolbarGroup( group, printGroups ) {
165 var output = [];
166
167 if ( typeof group == 'string' )
168 return '\'' + group + '\'';
169 if ( CKEDITOR.tools.isArray( group ) )
170 return dumpToolbarItems( group );
171 // Skip group when printing entire toolbar configuration and there are no items in this group.
172 if ( !printGroups && !group.items )
173 return;
174
175 if ( group.name )
176 output.push( 'name: \'' + group.name + '\'' );
177
178 if ( group.groups )
179 output.push( 'groups: ' + dumpToolbarItems( group.groups ) );
180
181 if ( !printGroups )
182 output.push( 'items: ' + dumpToolbarItems( group.items ) );
183
184 return '{ ' + output.join( ', ' ) + ' }';
185 }
186
187 function dumpToolbarItems( items ) {
188 if ( typeof items == 'string' )
189 return '\'' + items + '\'';
190
191 var names = [],
192 i, item;
193
194 for ( var i = 0; i < items.length; ++i ) {
195 item = items[ i ];
196 if ( typeof item == 'string' )
197 names.push( item );
198 else {
199 if ( item.type == CKEDITOR.UI_SEPARATOR )
200 names.push( '-' );
201 else
202 names.push( buttonsNames[ item.name ] );
203 }
204 }
205
206 return '[ \'' + names.join( '\', \'' ) + '\' ]';
207 }
208
209 // Creates { 'lowercased': 'LowerCased' } buttons names hash.
210 function createButtonsNamesHash( items ) {
211 var hash = {},
212 name;
213
214 for ( name in items ) {
215 hash[ items[ name ].name ] = name;
216 }
217
218 return hash;
219 }
220
221})();
222 </script>
223
224 <div id="footer">
225 <hr>
226 <p>
227 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
228 </p>
229 <p id="copy">
230 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
231 Knabben. All rights reserved.
232 </p>
233 </div>
234</body>
235</html>
diff --git a/sources/plugins/undo/dev/snapshot.html b/sources/plugins/undo/dev/snapshot.html
new file mode 100644
index 00000000..c3a61c67
--- /dev/null
+++ b/sources/plugins/undo/dev/snapshot.html
@@ -0,0 +1,86 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Replace Textarea by Code &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <link href="../../../samples/old/sample.css" rel="stylesheet">
12</head>
13<body>
14 <h1 class="samples">
15 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements Using JavaScript Code
16 </h1>
17 <form action="sample_posteddata.php" method="post">
18 <div class="description">
19 <p>
20 This editor is using an <code>&lt;iframe&gt;</code> element-based editing area, provided by the <strong>Wysiwygarea</strong> plugin.
21 </p>
22<pre class="samples">
23CKEDITOR.replace( '<em>textarea_id</em>' )
24</pre>
25 </div>
26 <textarea cols="80" id="editor1" name="editor1" rows="10">
27 &lt;p&gt;Apollo 11&lt;/p&gt;
28 &lt;p&gt;111 222 333 444 555 666 777&lt;/p&gt;
29 </textarea>
30 <p>
31 <input type="submit" value="Submit">
32 </p>
33 </form>
34 <div id="footer">
35 <hr>
36 <p>
37 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
38 </p>
39 <p id="copy">
40 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
41 Knabben. All rights reserved.
42 </p>
43 </div>
44 <div id="debugConsole">
45 <div>Snapshots: <strong id="debugSnapshotsCount">0</strong></div>
46 <div>Typing: <strong id="debugTypingVal">false</strong></div>
47 </div>
48 <div id="undoControls">
49 <a onclick="CKEDITOR.instances.editor1.execCommand('undo');" href="#">&lt; Undo</a>
50 <a onclick="CKEDITOR.instances.editor1.execCommand('redo');" href="#">Redo &gt;</a>
51 </div>
52 <script type="text/javascript">
53 var snapCount = document.getElementById( 'debugSnapshotsCount' ),
54 typingTracer = document.getElementById( 'debugTypingVal' ),
55 updateTypingTracer = function() {
56 typingTracer.innerHTML = String( CKEDITOR.instances.editor1.undoManager.typing );
57 },
58 updateSnapshotCounter = function() {
59 if ( !CKEDITOR && CKEDITOR.instances.editor1 )
60 return;
61
62 snapCount.innerHTML = CKEDITOR.instances.editor1.undoManager.snapshots.length;
63 updateTypingTracer();
64 };
65
66 CKEDITOR.replace( 'editor1', {
67 toolbar: [ [ 'Source', 'Bold', 'Italic' ] ,[ 'Undo' ], [ 'Redo' ] ],
68 on: {
69 instanceReady: function( evt ) {
70 CKEDITOR.instances.editor1.focus();
71 },
72 change: function( evt ) {
73 updateSnapshotCounter();
74 }
75 }
76 } );
77
78 window.setInterval( updateSnapshotCounter, 700 );
79 </script>
80 <style type="text/css">
81 #debugConsole { clear: both; }
82 #undoControls { clear: both; }
83 #undoControls a { padding: 25px 50px; font-size: 19px; margin-right: 15px; outline: 2px solid gray; display: block; float: left; text-decoration: none; }
84 </style>
85</body>
86</html>
diff --git a/sources/plugins/undo/icons/hidpi/redo-rtl.png b/sources/plugins/undo/icons/hidpi/redo-rtl.png
new file mode 100644
index 00000000..206d38ab
--- /dev/null
+++ b/sources/plugins/undo/icons/hidpi/redo-rtl.png
Binary files differ
diff --git a/sources/plugins/undo/icons/hidpi/redo.png b/sources/plugins/undo/icons/hidpi/redo.png
new file mode 100644
index 00000000..a7883643
--- /dev/null
+++ b/sources/plugins/undo/icons/hidpi/redo.png
Binary files differ
diff --git a/sources/plugins/undo/icons/hidpi/undo-rtl.png b/sources/plugins/undo/icons/hidpi/undo-rtl.png
new file mode 100644
index 00000000..a7883643
--- /dev/null
+++ b/sources/plugins/undo/icons/hidpi/undo-rtl.png
Binary files differ
diff --git a/sources/plugins/undo/icons/hidpi/undo.png b/sources/plugins/undo/icons/hidpi/undo.png
new file mode 100644
index 00000000..206d38ab
--- /dev/null
+++ b/sources/plugins/undo/icons/hidpi/undo.png
Binary files differ
diff --git a/sources/plugins/undo/icons/redo-rtl.png b/sources/plugins/undo/icons/redo-rtl.png
new file mode 100644
index 00000000..dd12c682
--- /dev/null
+++ b/sources/plugins/undo/icons/redo-rtl.png
Binary files differ
diff --git a/sources/plugins/undo/icons/redo.png b/sources/plugins/undo/icons/redo.png
new file mode 100644
index 00000000..75a18720
--- /dev/null
+++ b/sources/plugins/undo/icons/redo.png
Binary files differ
diff --git a/sources/plugins/undo/icons/undo-rtl.png b/sources/plugins/undo/icons/undo-rtl.png
new file mode 100644
index 00000000..75a18720
--- /dev/null
+++ b/sources/plugins/undo/icons/undo-rtl.png
Binary files differ
diff --git a/sources/plugins/undo/icons/undo.png b/sources/plugins/undo/icons/undo.png
new file mode 100644
index 00000000..f81b3b39
--- /dev/null
+++ b/sources/plugins/undo/icons/undo.png
Binary files differ
diff --git a/sources/plugins/undo/lang/af.js b/sources/plugins/undo/lang/af.js
new file mode 100644
index 00000000..186256bc
--- /dev/null
+++ b/sources/plugins/undo/lang/af.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'af', {
6 redo: 'Oordoen',
7 undo: 'Ontdoen'
8} );
diff --git a/sources/plugins/undo/lang/ar.js b/sources/plugins/undo/lang/ar.js
new file mode 100644
index 00000000..c5ead34c
--- /dev/null
+++ b/sources/plugins/undo/lang/ar.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ar', {
6 redo: 'إعادة',
7 undo: 'تراجع'
8} );
diff --git a/sources/plugins/undo/lang/bg.js b/sources/plugins/undo/lang/bg.js
new file mode 100644
index 00000000..61e1d2ae
--- /dev/null
+++ b/sources/plugins/undo/lang/bg.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'bg', {
6 redo: 'Връщане на предишен статус',
7 undo: 'Възтанови'
8} );
diff --git a/sources/plugins/undo/lang/bn.js b/sources/plugins/undo/lang/bn.js
new file mode 100644
index 00000000..edf4d93e
--- /dev/null
+++ b/sources/plugins/undo/lang/bn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'bn', {
6 redo: 'রি-ডু',
7 undo: 'আনডু'
8} );
diff --git a/sources/plugins/undo/lang/bs.js b/sources/plugins/undo/lang/bs.js
new file mode 100644
index 00000000..88cd77db
--- /dev/null
+++ b/sources/plugins/undo/lang/bs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'bs', {
6 redo: 'Ponovi',
7 undo: 'Vrati'
8} );
diff --git a/sources/plugins/undo/lang/ca.js b/sources/plugins/undo/lang/ca.js
new file mode 100644
index 00000000..0a44406a
--- /dev/null
+++ b/sources/plugins/undo/lang/ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ca', {
6 redo: 'Refés',
7 undo: 'Desfés'
8} );
diff --git a/sources/plugins/undo/lang/cs.js b/sources/plugins/undo/lang/cs.js
new file mode 100644
index 00000000..51f8979a
--- /dev/null
+++ b/sources/plugins/undo/lang/cs.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'cs', {
6 redo: 'Znovu',
7 undo: 'Zpět'
8} );
diff --git a/sources/plugins/undo/lang/cy.js b/sources/plugins/undo/lang/cy.js
new file mode 100644
index 00000000..1e5a30d3
--- /dev/null
+++ b/sources/plugins/undo/lang/cy.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'cy', {
6 redo: 'Ailwneud',
7 undo: 'Dadwneud'
8} );
diff --git a/sources/plugins/undo/lang/da.js b/sources/plugins/undo/lang/da.js
new file mode 100644
index 00000000..8c1563ed
--- /dev/null
+++ b/sources/plugins/undo/lang/da.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'da', {
6 redo: 'Annullér fortryd',
7 undo: 'Fortryd'
8} );
diff --git a/sources/plugins/undo/lang/de.js b/sources/plugins/undo/lang/de.js
new file mode 100644
index 00000000..93d55862
--- /dev/null
+++ b/sources/plugins/undo/lang/de.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'de', {
6 redo: 'Wiederherstellen',
7 undo: 'Rückgängig'
8} );
diff --git a/sources/plugins/undo/lang/el.js b/sources/plugins/undo/lang/el.js
new file mode 100644
index 00000000..4961355f
--- /dev/null
+++ b/sources/plugins/undo/lang/el.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'el', {
6 redo: 'Επανάληψη',
7 undo: 'Αναίρεση'
8} );
diff --git a/sources/plugins/undo/lang/en-au.js b/sources/plugins/undo/lang/en-au.js
new file mode 100644
index 00000000..9d748e05
--- /dev/null
+++ b/sources/plugins/undo/lang/en-au.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'en-au', {
6 redo: 'Redo',
7 undo: 'Undo'
8} );
diff --git a/sources/plugins/undo/lang/en-ca.js b/sources/plugins/undo/lang/en-ca.js
new file mode 100644
index 00000000..facd173e
--- /dev/null
+++ b/sources/plugins/undo/lang/en-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'en-ca', {
6 redo: 'Redo',
7 undo: 'Undo'
8} );
diff --git a/sources/plugins/undo/lang/en-gb.js b/sources/plugins/undo/lang/en-gb.js
new file mode 100644
index 00000000..5b52e0d4
--- /dev/null
+++ b/sources/plugins/undo/lang/en-gb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'en-gb', {
6 redo: 'Redo',
7 undo: 'Undo'
8} );
diff --git a/sources/plugins/undo/lang/en.js b/sources/plugins/undo/lang/en.js
new file mode 100644
index 00000000..875bfe87
--- /dev/null
+++ b/sources/plugins/undo/lang/en.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'en', {
6 redo: 'Redo',
7 undo: 'Undo'
8} );
diff --git a/sources/plugins/undo/lang/eo.js b/sources/plugins/undo/lang/eo.js
new file mode 100644
index 00000000..9298e2b3
--- /dev/null
+++ b/sources/plugins/undo/lang/eo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'eo', {
6 redo: 'Refari',
7 undo: 'Malfari'
8} );
diff --git a/sources/plugins/undo/lang/es.js b/sources/plugins/undo/lang/es.js
new file mode 100644
index 00000000..e518bce2
--- /dev/null
+++ b/sources/plugins/undo/lang/es.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'es', {
6 redo: 'Rehacer',
7 undo: 'Deshacer'
8} );
diff --git a/sources/plugins/undo/lang/et.js b/sources/plugins/undo/lang/et.js
new file mode 100644
index 00000000..3ad8f16d
--- /dev/null
+++ b/sources/plugins/undo/lang/et.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'et', {
6 redo: 'Toimingu kordamine',
7 undo: 'Tagasivõtmine'
8} );
diff --git a/sources/plugins/undo/lang/eu.js b/sources/plugins/undo/lang/eu.js
new file mode 100644
index 00000000..a9d000ce
--- /dev/null
+++ b/sources/plugins/undo/lang/eu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'eu', {
6 redo: 'Berregin',
7 undo: 'Desegin'
8} );
diff --git a/sources/plugins/undo/lang/fa.js b/sources/plugins/undo/lang/fa.js
new file mode 100644
index 00000000..a6fa2206
--- /dev/null
+++ b/sources/plugins/undo/lang/fa.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'fa', {
6 redo: 'بازچیدن',
7 undo: 'واچیدن'
8} );
diff --git a/sources/plugins/undo/lang/fi.js b/sources/plugins/undo/lang/fi.js
new file mode 100644
index 00000000..2df2f2e1
--- /dev/null
+++ b/sources/plugins/undo/lang/fi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'fi', {
6 redo: 'Toista',
7 undo: 'Kumoa'
8} );
diff --git a/sources/plugins/undo/lang/fo.js b/sources/plugins/undo/lang/fo.js
new file mode 100644
index 00000000..bd64e096
--- /dev/null
+++ b/sources/plugins/undo/lang/fo.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'fo', {
6 redo: 'Vend aftur',
7 undo: 'Angra'
8} );
diff --git a/sources/plugins/undo/lang/fr-ca.js b/sources/plugins/undo/lang/fr-ca.js
new file mode 100644
index 00000000..57c8e1f3
--- /dev/null
+++ b/sources/plugins/undo/lang/fr-ca.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'fr-ca', {
6 redo: 'Refaire',
7 undo: 'Annuler'
8} );
diff --git a/sources/plugins/undo/lang/fr.js b/sources/plugins/undo/lang/fr.js
new file mode 100644
index 00000000..6e799791
--- /dev/null
+++ b/sources/plugins/undo/lang/fr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'fr', {
6 redo: 'Rétablir',
7 undo: 'Annuler'
8} );
diff --git a/sources/plugins/undo/lang/gl.js b/sources/plugins/undo/lang/gl.js
new file mode 100644
index 00000000..2569d825
--- /dev/null
+++ b/sources/plugins/undo/lang/gl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'gl', {
6 redo: 'Refacer',
7 undo: 'Desfacer'
8} );
diff --git a/sources/plugins/undo/lang/gu.js b/sources/plugins/undo/lang/gu.js
new file mode 100644
index 00000000..5fd239ba
--- /dev/null
+++ b/sources/plugins/undo/lang/gu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'gu', {
6 redo: 'રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી',
7 undo: 'રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી'
8} );
diff --git a/sources/plugins/undo/lang/he.js b/sources/plugins/undo/lang/he.js
new file mode 100644
index 00000000..e03d5206
--- /dev/null
+++ b/sources/plugins/undo/lang/he.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'he', {
6 redo: 'חזרה על צעד אחרון',
7 undo: 'ביטול צעד אחרון'
8} );
diff --git a/sources/plugins/undo/lang/hi.js b/sources/plugins/undo/lang/hi.js
new file mode 100644
index 00000000..6306757a
--- /dev/null
+++ b/sources/plugins/undo/lang/hi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'hi', {
6 redo: 'रीडू',
7 undo: 'अन्डू'
8} );
diff --git a/sources/plugins/undo/lang/hr.js b/sources/plugins/undo/lang/hr.js
new file mode 100644
index 00000000..5fbf931f
--- /dev/null
+++ b/sources/plugins/undo/lang/hr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'hr', {
6 redo: 'Ponovi',
7 undo: 'Poništi'
8} );
diff --git a/sources/plugins/undo/lang/hu.js b/sources/plugins/undo/lang/hu.js
new file mode 100644
index 00000000..fc1e4a7a
--- /dev/null
+++ b/sources/plugins/undo/lang/hu.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'hu', {
6 redo: 'Ismétlés',
7 undo: 'Visszavonás'
8} );
diff --git a/sources/plugins/undo/lang/id.js b/sources/plugins/undo/lang/id.js
new file mode 100644
index 00000000..828ad66d
--- /dev/null
+++ b/sources/plugins/undo/lang/id.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'id', {
6 redo: 'Kembali lakukan',
7 undo: 'Batalkan perlakuan'
8} );
diff --git a/sources/plugins/undo/lang/is.js b/sources/plugins/undo/lang/is.js
new file mode 100644
index 00000000..850178bc
--- /dev/null
+++ b/sources/plugins/undo/lang/is.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'is', {
6 redo: 'Hætta við afturköllun',
7 undo: 'Afturkalla'
8} );
diff --git a/sources/plugins/undo/lang/it.js b/sources/plugins/undo/lang/it.js
new file mode 100644
index 00000000..0dd1a1d9
--- /dev/null
+++ b/sources/plugins/undo/lang/it.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'it', {
6 redo: 'Ripristina',
7 undo: 'Annulla'
8} );
diff --git a/sources/plugins/undo/lang/ja.js b/sources/plugins/undo/lang/ja.js
new file mode 100644
index 00000000..c2136f5c
--- /dev/null
+++ b/sources/plugins/undo/lang/ja.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ja', {
6 redo: 'やり直す',
7 undo: '元に戻す'
8} );
diff --git a/sources/plugins/undo/lang/ka.js b/sources/plugins/undo/lang/ka.js
new file mode 100644
index 00000000..6a618af1
--- /dev/null
+++ b/sources/plugins/undo/lang/ka.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ka', {
6 redo: 'გამეორება',
7 undo: 'გაუქმება'
8} );
diff --git a/sources/plugins/undo/lang/km.js b/sources/plugins/undo/lang/km.js
new file mode 100644
index 00000000..51e443c8
--- /dev/null
+++ b/sources/plugins/undo/lang/km.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'km', {
6 redo: 'ធ្វើ​ឡើង​វិញ',
7 undo: 'មិន​ធ្វើ​វិញ'
8} );
diff --git a/sources/plugins/undo/lang/ko.js b/sources/plugins/undo/lang/ko.js
new file mode 100644
index 00000000..a1c54b2a
--- /dev/null
+++ b/sources/plugins/undo/lang/ko.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ko', {
6 redo: '다시 실행',
7 undo: '실행 취소'
8} );
diff --git a/sources/plugins/undo/lang/ku.js b/sources/plugins/undo/lang/ku.js
new file mode 100644
index 00000000..38ae12b1
--- /dev/null
+++ b/sources/plugins/undo/lang/ku.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ku', {
6 redo: 'هەڵگەڕاندنەوە',
7 undo: 'پووچکردنەوە'
8} );
diff --git a/sources/plugins/undo/lang/lt.js b/sources/plugins/undo/lang/lt.js
new file mode 100644
index 00000000..4712429a
--- /dev/null
+++ b/sources/plugins/undo/lang/lt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'lt', {
6 redo: 'Atstatyti',
7 undo: 'Atšaukti'
8} );
diff --git a/sources/plugins/undo/lang/lv.js b/sources/plugins/undo/lang/lv.js
new file mode 100644
index 00000000..134f19c7
--- /dev/null
+++ b/sources/plugins/undo/lang/lv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'lv', {
6 redo: 'Atkārtot',
7 undo: 'Atcelt'
8} );
diff --git a/sources/plugins/undo/lang/mk.js b/sources/plugins/undo/lang/mk.js
new file mode 100644
index 00000000..56b5a85f
--- /dev/null
+++ b/sources/plugins/undo/lang/mk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'mk', {
6 redo: 'Redo', // MISSING
7 undo: 'Undo'
8} );
diff --git a/sources/plugins/undo/lang/mn.js b/sources/plugins/undo/lang/mn.js
new file mode 100644
index 00000000..d1a919dd
--- /dev/null
+++ b/sources/plugins/undo/lang/mn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'mn', {
6 redo: 'Өмнөх үйлдлээ сэргээх',
7 undo: 'Хүчингүй болгох'
8} );
diff --git a/sources/plugins/undo/lang/ms.js b/sources/plugins/undo/lang/ms.js
new file mode 100644
index 00000000..e9fc94d3
--- /dev/null
+++ b/sources/plugins/undo/lang/ms.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ms', {
6 redo: 'Ulangkan',
7 undo: 'Batalkan'
8} );
diff --git a/sources/plugins/undo/lang/nb.js b/sources/plugins/undo/lang/nb.js
new file mode 100644
index 00000000..ca295927
--- /dev/null
+++ b/sources/plugins/undo/lang/nb.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'nb', {
6 redo: 'Gjør om',
7 undo: 'Angre'
8} );
diff --git a/sources/plugins/undo/lang/nl.js b/sources/plugins/undo/lang/nl.js
new file mode 100644
index 00000000..c5b48096
--- /dev/null
+++ b/sources/plugins/undo/lang/nl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'nl', {
6 redo: 'Opnieuw uitvoeren',
7 undo: 'Ongedaan maken'
8} );
diff --git a/sources/plugins/undo/lang/no.js b/sources/plugins/undo/lang/no.js
new file mode 100644
index 00000000..e56f3271
--- /dev/null
+++ b/sources/plugins/undo/lang/no.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'no', {
6 redo: 'Gjør om',
7 undo: 'Angre'
8} );
diff --git a/sources/plugins/undo/lang/pl.js b/sources/plugins/undo/lang/pl.js
new file mode 100644
index 00000000..76ccd5f7
--- /dev/null
+++ b/sources/plugins/undo/lang/pl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'pl', {
6 redo: 'Ponów',
7 undo: 'Cofnij'
8} );
diff --git a/sources/plugins/undo/lang/pt-br.js b/sources/plugins/undo/lang/pt-br.js
new file mode 100644
index 00000000..72a5df9a
--- /dev/null
+++ b/sources/plugins/undo/lang/pt-br.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'pt-br', {
6 redo: 'Refazer',
7 undo: 'Desfazer'
8} );
diff --git a/sources/plugins/undo/lang/pt.js b/sources/plugins/undo/lang/pt.js
new file mode 100644
index 00000000..29ee5267
--- /dev/null
+++ b/sources/plugins/undo/lang/pt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'pt', {
6 redo: 'Refazer',
7 undo: 'Anular'
8} );
diff --git a/sources/plugins/undo/lang/ro.js b/sources/plugins/undo/lang/ro.js
new file mode 100644
index 00000000..bfc197c3
--- /dev/null
+++ b/sources/plugins/undo/lang/ro.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ro', {
6 redo: 'Starea ulterioară (redo)',
7 undo: 'Starea anterioară (undo)'
8} );
diff --git a/sources/plugins/undo/lang/ru.js b/sources/plugins/undo/lang/ru.js
new file mode 100644
index 00000000..acf8ce4d
--- /dev/null
+++ b/sources/plugins/undo/lang/ru.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ru', {
6 redo: 'Повторить',
7 undo: 'Отменить'
8} );
diff --git a/sources/plugins/undo/lang/si.js b/sources/plugins/undo/lang/si.js
new file mode 100644
index 00000000..96c9bc90
--- /dev/null
+++ b/sources/plugins/undo/lang/si.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'si', {
6 redo: 'නැවත කිරීම',
7 undo: 'වෙනස් කිරීම'
8} );
diff --git a/sources/plugins/undo/lang/sk.js b/sources/plugins/undo/lang/sk.js
new file mode 100644
index 00000000..28cf9375
--- /dev/null
+++ b/sources/plugins/undo/lang/sk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'sk', {
6 redo: 'Znovu',
7 undo: 'Späť'
8} );
diff --git a/sources/plugins/undo/lang/sl.js b/sources/plugins/undo/lang/sl.js
new file mode 100644
index 00000000..f649d441
--- /dev/null
+++ b/sources/plugins/undo/lang/sl.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'sl', {
6 redo: 'Ponovi',
7 undo: 'Razveljavi'
8} );
diff --git a/sources/plugins/undo/lang/sq.js b/sources/plugins/undo/lang/sq.js
new file mode 100644
index 00000000..37e17f95
--- /dev/null
+++ b/sources/plugins/undo/lang/sq.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'sq', {
6 redo: 'Ribëje',
7 undo: 'Rizhbëje'
8} );
diff --git a/sources/plugins/undo/lang/sr-latn.js b/sources/plugins/undo/lang/sr-latn.js
new file mode 100644
index 00000000..b2527a7f
--- /dev/null
+++ b/sources/plugins/undo/lang/sr-latn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'sr-latn', {
6 redo: 'Ponovi akciju',
7 undo: 'Poni�ti akciju'
8} );
diff --git a/sources/plugins/undo/lang/sr.js b/sources/plugins/undo/lang/sr.js
new file mode 100644
index 00000000..0b7f9f23
--- /dev/null
+++ b/sources/plugins/undo/lang/sr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'sr', {
6 redo: 'Понови акцију',
7 undo: 'Поништи акцију'
8} );
diff --git a/sources/plugins/undo/lang/sv.js b/sources/plugins/undo/lang/sv.js
new file mode 100644
index 00000000..5537b5ad
--- /dev/null
+++ b/sources/plugins/undo/lang/sv.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'sv', {
6 redo: 'Gör om',
7 undo: 'Ångra'
8} );
diff --git a/sources/plugins/undo/lang/th.js b/sources/plugins/undo/lang/th.js
new file mode 100644
index 00000000..29671829
--- /dev/null
+++ b/sources/plugins/undo/lang/th.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'th', {
6 redo: 'ทำซ้ำคำสั่ง',
7 undo: 'ยกเลิกคำสั่ง'
8} );
diff --git a/sources/plugins/undo/lang/tr.js b/sources/plugins/undo/lang/tr.js
new file mode 100644
index 00000000..3c757f77
--- /dev/null
+++ b/sources/plugins/undo/lang/tr.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'tr', {
6 redo: 'Tekrarla',
7 undo: 'Geri Al'
8} );
diff --git a/sources/plugins/undo/lang/tt.js b/sources/plugins/undo/lang/tt.js
new file mode 100644
index 00000000..d4335572
--- /dev/null
+++ b/sources/plugins/undo/lang/tt.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'tt', {
6 redo: 'Кабатлау',
7 undo: 'Кайтару'
8} );
diff --git a/sources/plugins/undo/lang/ug.js b/sources/plugins/undo/lang/ug.js
new file mode 100644
index 00000000..73348fc3
--- /dev/null
+++ b/sources/plugins/undo/lang/ug.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'ug', {
6 redo: 'قايتىلا ',
7 undo: 'يېنىۋال'
8} );
diff --git a/sources/plugins/undo/lang/uk.js b/sources/plugins/undo/lang/uk.js
new file mode 100644
index 00000000..23e308a2
--- /dev/null
+++ b/sources/plugins/undo/lang/uk.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'uk', {
6 redo: 'Повторити',
7 undo: 'Повернути'
8} );
diff --git a/sources/plugins/undo/lang/vi.js b/sources/plugins/undo/lang/vi.js
new file mode 100644
index 00000000..8b11bfd2
--- /dev/null
+++ b/sources/plugins/undo/lang/vi.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'vi', {
6 redo: 'Làm lại thao tác',
7 undo: 'Khôi phục thao tác'
8} );
diff --git a/sources/plugins/undo/lang/zh-cn.js b/sources/plugins/undo/lang/zh-cn.js
new file mode 100644
index 00000000..48116a7e
--- /dev/null
+++ b/sources/plugins/undo/lang/zh-cn.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'zh-cn', {
6 redo: '重做',
7 undo: '撤消'
8} );
diff --git a/sources/plugins/undo/lang/zh.js b/sources/plugins/undo/lang/zh.js
new file mode 100644
index 00000000..b6a1c4dc
--- /dev/null
+++ b/sources/plugins/undo/lang/zh.js
@@ -0,0 +1,8 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'undo', 'zh', {
6 redo: '取消復原',
7 undo: '復原'
8} );
diff --git a/sources/plugins/undo/plugin.js b/sources/plugins/undo/plugin.js
new file mode 100644
index 00000000..d5479936
--- /dev/null
+++ b/sources/plugins/undo/plugin.js
@@ -0,0 +1,1328 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview Undo/Redo system for saving a shapshot for document modification
8 * and other recordable changes.
9 */
10
11'use strict';
12
13( function() {
14 var keystrokes = [
15 CKEDITOR.CTRL + 90 /*Z*/,
16 CKEDITOR.CTRL + 89 /*Y*/,
17 CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/
18 ],
19 backspaceOrDelete = { 8: 1, 46: 1 };
20
21 CKEDITOR.plugins.add( 'undo', {
22 // jscs:disable maximumLineLength
23 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,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,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%
24 // jscs:enable maximumLineLength
25 icons: 'redo,redo-rtl,undo,undo-rtl', // %REMOVE_LINE_CORE%
26 hidpi: true, // %REMOVE_LINE_CORE%
27 init: function( editor ) {
28 var undoManager = editor.undoManager = new UndoManager( editor ),
29 editingHandler = undoManager.editingHandler = new NativeEditingHandler( undoManager );
30
31 var undoCommand = editor.addCommand( 'undo', {
32 exec: function() {
33 if ( undoManager.undo() ) {
34 editor.selectionChange();
35 this.fire( 'afterUndo' );
36 }
37 },
38 startDisabled: true,
39 canUndo: false
40 } );
41
42 var redoCommand = editor.addCommand( 'redo', {
43 exec: function() {
44 if ( undoManager.redo() ) {
45 editor.selectionChange();
46 this.fire( 'afterRedo' );
47 }
48 },
49 startDisabled: true,
50 canUndo: false
51 } );
52
53 editor.setKeystroke( [
54 [ keystrokes[ 0 ], 'undo' ],
55 [ keystrokes[ 1 ], 'redo' ],
56 [ keystrokes[ 2 ], 'redo' ]
57 ] );
58
59 undoManager.onChange = function() {
60 undoCommand.setState( undoManager.undoable() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
61 redoCommand.setState( undoManager.redoable() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
62 };
63
64 function recordCommand( event ) {
65 // If the command hasn't been marked to not support undo.
66 if ( undoManager.enabled && event.data.command.canUndo !== false )
67 undoManager.save();
68 }
69
70 // We'll save snapshots before and after executing a command.
71 editor.on( 'beforeCommandExec', recordCommand );
72 editor.on( 'afterCommandExec', recordCommand );
73
74 // Save snapshots before doing custom changes.
75 editor.on( 'saveSnapshot', function( evt ) {
76 undoManager.save( evt.data && evt.data.contentOnly );
77 } );
78
79 // Event manager listeners should be attached on contentDom.
80 editor.on( 'contentDom', editingHandler.attachListeners, editingHandler );
81
82 editor.on( 'instanceReady', function() {
83 // Saves initial snapshot.
84 editor.fire( 'saveSnapshot' );
85 } );
86
87 // Always save an undo snapshot - the previous mode might have
88 // changed editor contents.
89 editor.on( 'beforeModeUnload', function() {
90 editor.mode == 'wysiwyg' && undoManager.save( true );
91 } );
92
93 function toggleUndoManager() {
94 undoManager.enabled = editor.readOnly ? false : editor.mode == 'wysiwyg';
95 undoManager.onChange();
96 }
97
98 // Make the undo manager available only in wysiwyg mode.
99 editor.on( 'mode', toggleUndoManager );
100
101 // Disable undo manager when in read-only mode.
102 editor.on( 'readOnly', toggleUndoManager );
103
104 if ( editor.ui.addButton ) {
105 editor.ui.addButton( 'Undo', {
106 label: editor.lang.undo.undo,
107 command: 'undo',
108 toolbar: 'undo,10'
109 } );
110
111 editor.ui.addButton( 'Redo', {
112 label: editor.lang.undo.redo,
113 command: 'redo',
114 toolbar: 'undo,20'
115 } );
116 }
117
118 /**
119 * Resets the undo stack.
120 *
121 * @member CKEDITOR.editor
122 */
123 editor.resetUndo = function() {
124 // Reset the undo stack.
125 undoManager.reset();
126
127 // Create the first image.
128 editor.fire( 'saveSnapshot' );
129 };
130
131 /**
132 * Amends the top of the undo stack (last undo image) with the current DOM changes.
133 *
134 * function() {
135 * editor.fire( 'saveSnapshot' );
136 * editor.document.body.append(...);
137 * // Makes new changes following the last undo snapshot a part of it.
138 * editor.fire( 'updateSnapshot' );
139 * ..
140 * }
141 *
142 * @event updateSnapshot
143 * @member CKEDITOR.editor
144 * @param {CKEDITOR.editor} editor This editor instance.
145 */
146 editor.on( 'updateSnapshot', function() {
147 if ( undoManager.currentImage )
148 undoManager.update();
149 } );
150
151 /**
152 * Locks the undo manager to prevent any save/update operations.
153 *
154 * It is convenient to lock the undo manager before performing DOM operations
155 * that should not be recored (e.g. auto paragraphing).
156 *
157 * See {@link CKEDITOR.plugins.undo.UndoManager#lock} for more details.
158 *
159 * **Note:** In order to unlock the undo manager, {@link #unlockSnapshot} has to be fired
160 * the same number of times that `lockSnapshot` has been fired.
161 *
162 * @since 4.0
163 * @event lockSnapshot
164 * @member CKEDITOR.editor
165 * @param {CKEDITOR.editor} editor This editor instance.
166 * @param data
167 * @param {Boolean} [data.dontUpdate] When set to `true`, the last snapshot will not be updated
168 * with the current content and selection. Read more in the {@link CKEDITOR.plugins.undo.UndoManager#lock} method.
169 * @param {Boolean} [data.forceUpdate] When set to `true`, the last snapshot will always be updated
170 * with the current content and selection. Read more in the {@link CKEDITOR.plugins.undo.UndoManager#lock} method.
171 */
172 editor.on( 'lockSnapshot', function( evt ) {
173 var data = evt.data;
174 undoManager.lock( data && data.dontUpdate, data && data.forceUpdate );
175 } );
176
177 /**
178 * Unlocks the undo manager and updates the latest snapshot.
179 *
180 * @since 4.0
181 * @event unlockSnapshot
182 * @member CKEDITOR.editor
183 * @param {CKEDITOR.editor} editor This editor instance.
184 */
185 editor.on( 'unlockSnapshot', undoManager.unlock, undoManager );
186 }
187 } );
188
189 CKEDITOR.plugins.undo = {};
190
191 /**
192 * Main logic for the Redo/Undo feature.
193 *
194 * @private
195 * @class CKEDITOR.plugins.undo.UndoManager
196 * @constructor Creates an UndoManager class instance.
197 * @param {CKEDITOR.editor} editor
198 */
199 var UndoManager = CKEDITOR.plugins.undo.UndoManager = function( editor ) {
200 /**
201 * An array storing the number of key presses, count in a row. Use {@link #keyGroups} members as index.
202 *
203 * **Note:** The keystroke count will be reset after reaching the limit of characters per snapshot.
204 *
205 * @since 4.4.4
206 */
207 this.strokesRecorded = [ 0, 0 ];
208
209 /**
210 * When the `locked` property is not `null`, the undo manager is locked, so
211 * operations like `save` or `update` are forbidden.
212 *
213 * The manager can be locked and unlocked by the {@link #lock} and {@link #unlock}
214 * methods, respectively.
215 *
216 * @readonly
217 * @property {Object} [locked=null]
218 */
219 this.locked = null;
220
221 /**
222 * Contains the previously processed key group, based on {@link #keyGroups}.
223 * `-1` means an unknown group.
224 *
225 * @since 4.4.4
226 * @readonly
227 * @property {Number} [previousKeyGroup=-1]
228 */
229 this.previousKeyGroup = -1;
230
231 /**
232 * The maximum number of snapshots in the stack. Configurable via {@link CKEDITOR.config#undoStackSize}.
233 *
234 * @readonly
235 * @property {Number} [limit]
236 */
237 this.limit = editor.config.undoStackSize || 20;
238
239 /**
240 * The maximum number of characters typed/deleted in one undo step.
241 *
242 * @since 4.4.5
243 * @readonly
244 */
245 this.strokesLimit = 25;
246
247 this.editor = editor;
248
249 // Reset the undo stack.
250 this.reset();
251 };
252
253 UndoManager.prototype = {
254 /**
255 * Handles keystroke support for the undo manager. It is called on `keyup` event for
256 * keystrokes that can change the editor content.
257 *
258 * @param {Number} keyCode The key code.
259 * @param {Boolean} [strokesPerSnapshotExceeded] When set to `true`, the method will
260 * behave as if the strokes limit was exceeded regardless of the {@link #strokesRecorded} value.
261 */
262 type: function( keyCode, strokesPerSnapshotExceeded ) {
263 var keyGroup = UndoManager.getKeyGroup( keyCode ),
264 // Count of keystrokes in current a row.
265 // Note if strokesPerSnapshotExceeded will be exceeded, it'll be restarted.
266 strokesRecorded = this.strokesRecorded[ keyGroup ] + 1;
267
268 strokesPerSnapshotExceeded =
269 ( strokesPerSnapshotExceeded || strokesRecorded >= this.strokesLimit );
270
271 if ( !this.typing )
272 onTypingStart( this );
273
274 if ( strokesPerSnapshotExceeded ) {
275 // Reset the count of strokes, so it'll be later assigned to this.strokesRecorded.
276 strokesRecorded = 0;
277
278 this.editor.fire( 'saveSnapshot' );
279 } else {
280 // Fire change event.
281 this.editor.fire( 'change' );
282 }
283
284 // Store recorded strokes count.
285 this.strokesRecorded[ keyGroup ] = strokesRecorded;
286 // This prop will tell in next itaration what kind of group was processed previously.
287 this.previousKeyGroup = keyGroup;
288 },
289
290 /**
291 * Whether the new `keyCode` belongs to a different group than the previous one ({@link #previousKeyGroup}).
292 *
293 * @since 4.4.5
294 * @param {Number} keyCode
295 * @returns {Boolean}
296 */
297 keyGroupChanged: function( keyCode ) {
298 return UndoManager.getKeyGroup( keyCode ) != this.previousKeyGroup;
299 },
300
301 /**
302 * Resets the undo stack.
303 */
304 reset: function() {
305 // Stack for all the undo and redo snapshots, they're always created/removed
306 // in consistency.
307 this.snapshots = [];
308
309 // Current snapshot history index.
310 this.index = -1;
311
312 this.currentImage = null;
313
314 this.hasUndo = false;
315 this.hasRedo = false;
316 this.locked = null;
317
318 this.resetType();
319 },
320
321 /**
322 * Resets all typing variables.
323 *
324 * @see #type
325 */
326 resetType: function() {
327 this.strokesRecorded = [ 0, 0 ];
328 this.typing = false;
329 this.previousKeyGroup = -1;
330 },
331
332 /**
333 * Refreshes the state of the {@link CKEDITOR.plugins.undo.UndoManager undo manager}
334 * as well as the state of the `undo` and `redo` commands.
335 */
336 refreshState: function() {
337 // These lines can be handled within onChange() too.
338 this.hasUndo = !!this.getNextImage( true );
339 this.hasRedo = !!this.getNextImage( false );
340 // Reset typing
341 this.resetType();
342 this.onChange();
343 },
344
345 /**
346 * Saves a snapshot of the document image for later retrieval.
347 *
348 * @param {Boolean} onContentOnly If set to `true`, the snapshot will be saved only if the content has changed.
349 * @param {CKEDITOR.plugins.undo.Image} image An optional image to save. If skipped, current editor will be used.
350 * @param {Boolean} [autoFireChange=true] If set to `false`, will not trigger the {@link CKEDITOR.editor#change} event to editor.
351 */
352 save: function( onContentOnly, image, autoFireChange ) {
353 var editor = this.editor;
354 // Do not change snapshots stack when locked, editor is not ready,
355 // editable is not ready or when editor is in mode difference than 'wysiwyg'.
356 if ( this.locked || editor.status != 'ready' || editor.mode != 'wysiwyg' )
357 return false;
358
359 var editable = editor.editable();
360 if ( !editable || editable.status != 'ready' )
361 return false;
362
363 var snapshots = this.snapshots;
364
365 // Get a content image.
366 if ( !image )
367 image = new Image( editor );
368
369 // Do nothing if it was not possible to retrieve an image.
370 if ( image.contents === false )
371 return false;
372
373 // Check if this is a duplicate. In such case, do nothing.
374 if ( this.currentImage ) {
375 if ( image.equalsContent( this.currentImage ) ) {
376 if ( onContentOnly )
377 return false;
378
379 if ( image.equalsSelection( this.currentImage ) )
380 return false;
381 } else if ( autoFireChange !== false ) {
382 editor.fire( 'change' );
383 }
384 }
385
386 // Drop future snapshots.
387 snapshots.splice( this.index + 1, snapshots.length - this.index - 1 );
388
389 // If we have reached the limit, remove the oldest one.
390 if ( snapshots.length == this.limit )
391 snapshots.shift();
392
393 // Add the new image, updating the current index.
394 this.index = snapshots.push( image ) - 1;
395
396 this.currentImage = image;
397
398 if ( autoFireChange !== false )
399 this.refreshState();
400 return true;
401 },
402
403 /**
404 * Sets editor content/selection to the one stored in `image`.
405 *
406 * @param {CKEDITOR.plugins.undo.Image} image
407 */
408 restoreImage: function( image ) {
409 // Bring editor focused to restore selection.
410 var editor = this.editor,
411 sel;
412
413 if ( image.bookmarks ) {
414 editor.focus();
415 // Retrieve the selection beforehand. (#8324)
416 sel = editor.getSelection();
417 }
418
419 // Start transaction - do not allow any mutations to the
420 // snapshots stack done when selecting bookmarks (much probably
421 // by selectionChange listener).
422 this.locked = { level: 999 };
423
424 this.editor.loadSnapshot( image.contents );
425
426 if ( image.bookmarks )
427 sel.selectBookmarks( image.bookmarks );
428 else if ( CKEDITOR.env.ie ) {
429 // IE BUG: If I don't set the selection to *somewhere* after setting
430 // document contents, then IE would create an empty paragraph at the bottom
431 // the next time the document is modified.
432 var $range = this.editor.document.getBody().$.createTextRange();
433 $range.collapse( true );
434 $range.select();
435 }
436
437 this.locked = null;
438
439 this.index = image.index;
440 this.currentImage = this.snapshots[ this.index ];
441
442 // Update current image with the actual editor
443 // content, since actualy content may differ from
444 // the original snapshot due to dom change. (#4622)
445 this.update();
446 this.refreshState();
447
448 editor.fire( 'change' );
449 },
450
451 /**
452 * Gets the closest available image.
453 *
454 * @param {Boolean} isUndo If `true`, it will return the previous image.
455 * @returns {CKEDITOR.plugins.undo.Image} Next image or `null`.
456 */
457 getNextImage: function( isUndo ) {
458 var snapshots = this.snapshots,
459 currentImage = this.currentImage,
460 image, i;
461
462 if ( currentImage ) {
463 if ( isUndo ) {
464 for ( i = this.index - 1; i >= 0; i-- ) {
465 image = snapshots[ i ];
466 if ( !currentImage.equalsContent( image ) ) {
467 image.index = i;
468 return image;
469 }
470 }
471 } else {
472 for ( i = this.index + 1; i < snapshots.length; i++ ) {
473 image = snapshots[ i ];
474 if ( !currentImage.equalsContent( image ) ) {
475 image.index = i;
476 return image;
477 }
478 }
479 }
480 }
481
482 return null;
483 },
484
485 /**
486 * Checks the current redo state.
487 *
488 * @returns {Boolean} Whether the document has a previous state to retrieve.
489 */
490 redoable: function() {
491 return this.enabled && this.hasRedo;
492 },
493
494 /**
495 * Checks the current undo state.
496 *
497 * @returns {Boolean} Whether the document has a future state to restore.
498 */
499 undoable: function() {
500 return this.enabled && this.hasUndo;
501 },
502
503 /**
504 * Performs an undo operation on current index.
505 */
506 undo: function() {
507 if ( this.undoable() ) {
508 this.save( true );
509
510 var image = this.getNextImage( true );
511 if ( image )
512 return this.restoreImage( image ), true;
513 }
514
515 return false;
516 },
517
518 /**
519 * Performs a redo operation on current index.
520 */
521 redo: function() {
522 if ( this.redoable() ) {
523 // Try to save. If no changes have been made, the redo stack
524 // will not change, so it will still be redoable.
525 this.save( true );
526
527 // If instead we had changes, we can't redo anymore.
528 if ( this.redoable() ) {
529 var image = this.getNextImage( false );
530 if ( image )
531 return this.restoreImage( image ), true;
532 }
533 }
534
535 return false;
536 },
537
538 /**
539 * Updates the last snapshot of the undo stack with the current editor content.
540 *
541 * @param {CKEDITOR.plugins.undo.Image} [newImage] The image which will replace the current one.
542 * If it is not set, it defaults to the image taken from the editor.
543 */
544 update: function( newImage ) {
545 // Do not change snapshots stack is locked.
546 if ( this.locked )
547 return;
548
549 if ( !newImage )
550 newImage = new Image( this.editor );
551
552 var i = this.index,
553 snapshots = this.snapshots;
554
555 // Find all previous snapshots made for the same content (which differ
556 // only by selection) and replace all of them with the current image.
557 while ( i > 0 && this.currentImage.equalsContent( snapshots[ i - 1 ] ) )
558 i -= 1;
559
560 snapshots.splice( i, this.index - i + 1, newImage );
561 this.index = i;
562 this.currentImage = newImage;
563 },
564
565 /**
566 * Amends the last snapshot and changes its selection (only in case when content
567 * is equal between these two).
568 *
569 * @since 4.4.4
570 * @param {CKEDITOR.plugins.undo.Image} newSnapshot New snapshot with new selection.
571 * @returns {Boolean} Returns `true` if selection was amended.
572 */
573 updateSelection: function( newSnapshot ) {
574 if ( !this.snapshots.length )
575 return false;
576
577 var snapshots = this.snapshots,
578 lastImage = snapshots[ snapshots.length - 1 ];
579
580 if ( lastImage.equalsContent( newSnapshot ) ) {
581 if ( !lastImage.equalsSelection( newSnapshot ) ) {
582 snapshots[ snapshots.length - 1 ] = newSnapshot;
583 this.currentImage = newSnapshot;
584 return true;
585 }
586 }
587
588 return false;
589 },
590
591 /**
592 * Locks the snapshot stack to prevent any save/update operations and when necessary,
593 * updates the tip of the snapshot stack with the DOM changes introduced during the
594 * locked period, after the {@link #unlock} method is called.
595 *
596 * It is mainly used to ensure any DOM operations that should not be recorded
597 * (e.g. auto paragraphing) are not added to the stack.
598 *
599 * **Note:** For every `lock` call you must call {@link #unlock} once to unlock the undo manager.
600 *
601 * @since 4.0
602 * @param {Boolean} [dontUpdate] When set to `true`, the last snapshot will not be updated
603 * with current content and selection. By default, if undo manager was up to date when the lock started,
604 * the last snapshot will be updated to the current state when unlocking. This means that all changes
605 * done during the lock will be merged into the previous snapshot or the next one. Use this option to gain
606 * more control over this behavior. For example, it is possible to group changes done during the lock into
607 * a separate snapshot.
608 * @param {Boolean} [forceUpdate] When set to `true`, the last snapshot will always be updated with the
609 * current content and selection regardless of the current state of the undo manager.
610 * When not set, the last snapshot will be updated only if the undo manager was up to date when locking.
611 * Additionally, this option makes it possible to lock the snapshot when the editor is not in the `wysiwyg` mode,
612 * because when it is passed, the snapshots will not need to be compared.
613 */
614 lock: function( dontUpdate, forceUpdate ) {
615 if ( !this.locked ) {
616 if ( dontUpdate )
617 this.locked = { level: 1 };
618 else {
619 var update = null;
620
621 if ( forceUpdate )
622 update = true;
623 else {
624 // Make a contents image. Don't include bookmarks, because:
625 // * we don't compare them,
626 // * there's a chance that DOM has been changed since
627 // locked (e.g. fake) selection was made, so createBookmark2 could fail.
628 // http://dev.ckeditor.com/ticket/11027#comment:3
629 var imageBefore = new Image( this.editor, true );
630
631 // If current editor content matches the tip of snapshot stack,
632 // the stack tip must be updated by unlock, to include any changes made
633 // during this period.
634 if ( this.currentImage && this.currentImage.equalsContent( imageBefore ) )
635 update = imageBefore;
636 }
637
638 this.locked = { update: update, level: 1 };
639 }
640
641 // Increase the level of lock.
642 } else {
643 this.locked.level++;
644 }
645 },
646
647 /**
648 * Unlocks the snapshot stack and checks to amend the last snapshot.
649 *
650 * See {@link #lock} for more details.
651 *
652 * @since 4.0
653 */
654 unlock: function() {
655 if ( this.locked ) {
656 // Decrease level of lock and check if equals 0, what means that undoM is completely unlocked.
657 if ( !--this.locked.level ) {
658 var update = this.locked.update;
659
660 this.locked = null;
661
662 // forceUpdate was passed to lock().
663 if ( update === true )
664 this.update();
665 // update is instance of Image.
666 else if ( update ) {
667 var newImage = new Image( this.editor, true );
668
669 if ( !update.equalsContent( newImage ) )
670 this.update();
671 }
672 }
673 }
674 }
675 };
676
677 /**
678 * Codes for navigation keys like *Arrows*, *Page Up/Down*, etc.
679 * Used by the {@link #isNavigationKey} method.
680 *
681 * @since 4.4.5
682 * @readonly
683 * @static
684 */
685 UndoManager.navigationKeyCodes = {
686 37: 1, 38: 1, 39: 1, 40: 1, // Arrows.
687 36: 1, 35: 1, // Home, End.
688 33: 1, 34: 1 // PgUp, PgDn.
689 };
690
691 /**
692 * Key groups identifier mapping. Used for accessing members in
693 * {@link #strokesRecorded}.
694 *
695 * * `FUNCTIONAL` &ndash; identifier for the *Backspace* / *Delete* key.
696 * * `PRINTABLE` &ndash; identifier for printable keys.
697 *
698 * Example usage:
699 *
700 * undoManager.strokesRecorded[ undoManager.keyGroups.FUNCTIONAL ];
701 *
702 * @since 4.4.5
703 * @readonly
704 * @static
705 */
706 UndoManager.keyGroups = {
707 PRINTABLE: 0,
708 FUNCTIONAL: 1
709 };
710
711 /**
712 * Checks whether a key is one of navigation keys (*Arrows*, *Page Up/Down*, etc.).
713 * See also the {@link #navigationKeyCodes} property.
714 *
715 * @since 4.4.5
716 * @static
717 * @param {Number} keyCode
718 * @returns {Boolean}
719 */
720 UndoManager.isNavigationKey = function( keyCode ) {
721 return !!UndoManager.navigationKeyCodes[ keyCode ];
722 };
723
724 /**
725 * Returns the group to which the passed `keyCode` belongs.
726 *
727 * @since 4.4.5
728 * @static
729 * @param {Number} keyCode
730 * @returns {Number}
731 */
732 UndoManager.getKeyGroup = function( keyCode ) {
733 var keyGroups = UndoManager.keyGroups;
734
735 return backspaceOrDelete[ keyCode ] ? keyGroups.FUNCTIONAL : keyGroups.PRINTABLE;
736 };
737
738 /**
739 * @since 4.4.5
740 * @static
741 * @param {Number} keyGroup
742 * @returns {Number}
743 */
744 UndoManager.getOppositeKeyGroup = function( keyGroup ) {
745 var keyGroups = UndoManager.keyGroups;
746 return ( keyGroup == keyGroups.FUNCTIONAL ? keyGroups.PRINTABLE : keyGroups.FUNCTIONAL );
747 };
748
749 /**
750 * Whether we need to use a workaround for functional (*Backspace*, *Delete*) keys not firing
751 * the `keypress` event in Internet Explorer in this environment and for the specified `keyCode`.
752 *
753 * @since 4.4.5
754 * @static
755 * @param {Number} keyCode
756 * @returns {Boolean}
757 */
758 UndoManager.ieFunctionalKeysBug = function( keyCode ) {
759 return CKEDITOR.env.ie && UndoManager.getKeyGroup( keyCode ) == UndoManager.keyGroups.FUNCTIONAL;
760 };
761
762 // Helper method called when undoManager.typing val was changed to true.
763 function onTypingStart( undoManager ) {
764 // It's safe to now indicate typing state.
765 undoManager.typing = true;
766
767 // Manually mark snapshot as available.
768 undoManager.hasUndo = true;
769 undoManager.hasRedo = false;
770
771 undoManager.onChange();
772 }
773
774 /**
775 * Contains a snapshot of the editor content and selection at a given point in time.
776 *
777 * @private
778 * @class CKEDITOR.plugins.undo.Image
779 * @constructor Creates an Image class instance.
780 * @param {CKEDITOR.editor} editor The editor instance on which the image is created.
781 * @param {Boolean} [contentsOnly] If set to `true`, the image will only contain content without the selection.
782 */
783 var Image = CKEDITOR.plugins.undo.Image = function( editor, contentsOnly ) {
784 this.editor = editor;
785
786 editor.fire( 'beforeUndoImage' );
787
788 var contents = editor.getSnapshot();
789
790 // In IE, we need to remove the expando attributes.
791 if ( CKEDITOR.env.ie && contents )
792 contents = contents.replace( /\s+data-cke-expando=".*?"/g, '' );
793
794 this.contents = contents;
795
796 if ( !contentsOnly ) {
797 var selection = contents && editor.getSelection();
798 this.bookmarks = selection && selection.createBookmarks2( true );
799 }
800
801 editor.fire( 'afterUndoImage' );
802 };
803
804 // Attributes that browser may changing them when setting via innerHTML.
805 var protectedAttrs = /\b(?:href|src|name)="[^"]*?"/gi;
806
807 Image.prototype = {
808 /**
809 * @param {CKEDITOR.plugins.undo.Image} otherImage Image to compare to.
810 * @returns {Boolean} Returns `true` if content in `otherImage` is the same.
811 */
812 equalsContent: function( otherImage ) {
813 var thisContents = this.contents,
814 otherContents = otherImage.contents;
815
816 // For IE7 and IE QM: Comparing only the protected attribute values but not the original ones.(#4522)
817 if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ) {
818 thisContents = thisContents.replace( protectedAttrs, '' );
819 otherContents = otherContents.replace( protectedAttrs, '' );
820 }
821
822 if ( thisContents != otherContents )
823 return false;
824
825 return true;
826 },
827
828 /**
829 * @param {CKEDITOR.plugins.undo.Image} otherImage Image to compare to.
830 * @returns {Boolean} Returns `true` if selection in `otherImage` is the same.
831 */
832 equalsSelection: function( otherImage ) {
833 var bookmarksA = this.bookmarks,
834 bookmarksB = otherImage.bookmarks;
835
836 if ( bookmarksA || bookmarksB ) {
837 if ( !bookmarksA || !bookmarksB || bookmarksA.length != bookmarksB.length )
838 return false;
839
840 for ( var i = 0; i < bookmarksA.length; i++ ) {
841 var bookmarkA = bookmarksA[ i ],
842 bookmarkB = bookmarksB[ i ];
843
844 if ( bookmarkA.startOffset != bookmarkB.startOffset || bookmarkA.endOffset != bookmarkB.endOffset ||
845 !CKEDITOR.tools.arrayCompare( bookmarkA.start, bookmarkB.start ) ||
846 !CKEDITOR.tools.arrayCompare( bookmarkA.end, bookmarkB.end ) ) {
847 return false;
848 }
849 }
850 }
851
852 return true;
853 }
854
855 /**
856 * Editor content.
857 *
858 * @readonly
859 * @property {String} contents
860 */
861
862 /**
863 * Bookmarks representing the selection in an image.
864 *
865 * @readonly
866 * @property {Object[]} bookmarks Array of bookmark2 objects, see {@link CKEDITOR.dom.range#createBookmark2} for definition.
867 */
868 };
869
870 /**
871 * A class encapsulating all native event listeners which have to be used in
872 * order to handle undo manager integration for native editing actions (excluding drag and drop and paste support
873 * handled by the Clipboard plugin).
874 *
875 * @since 4.4.4
876 * @private
877 * @class CKEDITOR.plugins.undo.NativeEditingHandler
878 * @member CKEDITOR.plugins.undo Undo manager owning the handler.
879 * @constructor
880 * @param {CKEDITOR.plugins.undo.UndoManager} undoManager
881 */
882 var NativeEditingHandler = CKEDITOR.plugins.undo.NativeEditingHandler = function( undoManager ) {
883 // We'll use keyboard + input events to determine if snapshot should be created.
884 // Since `input` event is fired before `keyup`. We can tell in `keyup` event if input occured.
885 // That will tell us if any printable data was inserted.
886 // On `input` event we'll increase input fired counter for proper key code.
887 // Eventually it might be canceled by paste/drop using `ignoreInputEvent` flag.
888 // Order of events can be found in http://www.w3.org/TR/DOM-Level-3-Events/
889
890 /**
891 * An undo manager instance owning the editing handler.
892 *
893 * @property {CKEDITOR.plugins.undo.UndoManager} undoManager
894 */
895 this.undoManager = undoManager;
896
897 /**
898 * See {@link #ignoreInputEventListener}.
899 *
900 * @since 4.4.5
901 * @private
902 */
903 this.ignoreInputEvent = false;
904
905 /**
906 * A stack of pressed keys.
907 *
908 * @since 4.4.5
909 * @property {CKEDITOR.plugins.undo.KeyEventsStack} keyEventsStack
910 */
911 this.keyEventsStack = new KeyEventsStack();
912
913 /**
914 * An image of the editor during the `keydown` event (therefore without DOM modification).
915 *
916 * @property {CKEDITOR.plugins.undo.Image} lastKeydownImage
917 */
918 this.lastKeydownImage = null;
919 };
920
921 NativeEditingHandler.prototype = {
922 /**
923 * The `keydown` event listener.
924 *
925 * @param {CKEDITOR.dom.event} evt
926 */
927 onKeydown: function( evt ) {
928 var keyCode = evt.data.getKey();
929
930 // The composition is in progress - ignore the key. (#12597)
931 if ( keyCode === 229 ) {
932 return;
933 }
934
935 // Block undo/redo keystrokes when at the bottom/top of the undo stack (#11126 and #11677).
936 if ( CKEDITOR.tools.indexOf( keystrokes, evt.data.getKeystroke() ) > -1 ) {
937 evt.data.preventDefault();
938 return;
939 }
940
941 // Cleaning tab functional keys.
942 this.keyEventsStack.cleanUp( evt );
943
944 var undoManager = this.undoManager;
945
946 // Gets last record for provided keyCode. If not found will create one.
947 var last = this.keyEventsStack.getLast( keyCode );
948 if ( !last ) {
949 this.keyEventsStack.push( keyCode );
950 }
951
952 // We need to store an image which will be used in case of key group
953 // change.
954 this.lastKeydownImage = new Image( undoManager.editor );
955
956 if ( UndoManager.isNavigationKey( keyCode ) || this.undoManager.keyGroupChanged( keyCode ) ) {
957 if ( undoManager.strokesRecorded[ 0 ] || undoManager.strokesRecorded[ 1 ] ) {
958 // We already have image, so we'd like to reuse it.
959
960 // #12300
961 undoManager.save( false, this.lastKeydownImage, false );
962 undoManager.resetType();
963 }
964 }
965 },
966
967 /**
968 * The `input` event listener.
969 */
970 onInput: function() {
971 // Input event is ignored if paste/drop event were fired before.
972 if ( this.ignoreInputEvent ) {
973 // Reset flag - ignore only once.
974 this.ignoreInputEvent = false;
975 return;
976 }
977
978 var lastInput = this.keyEventsStack.getLast();
979 // Nothing in key events stack, but input event called. Interesting...
980 // That's because on Android order of events is buggy and also keyCode is set to 0.
981 if ( !lastInput ) {
982 lastInput = this.keyEventsStack.push( 0 );
983 }
984
985 // Increment inputs counter for provided key code.
986 this.keyEventsStack.increment( lastInput.keyCode );
987
988 // Exceeded limit.
989 if ( this.keyEventsStack.getTotalInputs() >= this.undoManager.strokesLimit ) {
990 this.undoManager.type( lastInput.keyCode, true );
991 this.keyEventsStack.resetInputs();
992 }
993 },
994
995 /**
996 * The `keyup` event listener.
997 *
998 * @param {CKEDITOR.dom.event} evt
999 */
1000 onKeyup: function( evt ) {
1001 var undoManager = this.undoManager,
1002 keyCode = evt.data.getKey(),
1003 totalInputs = this.keyEventsStack.getTotalInputs();
1004
1005 // Remove record from stack for provided key code.
1006 this.keyEventsStack.remove( keyCode );
1007
1008 // Second part of the workaround for IEs functional keys bug. We need to check whether something has really
1009 // changed because we blindly mocked the keypress event.
1010 // Also we need to be aware that lastKeydownImage might not be available (#12327).
1011 if ( UndoManager.ieFunctionalKeysBug( keyCode ) && this.lastKeydownImage &&
1012 this.lastKeydownImage.equalsContent( new Image( undoManager.editor, true ) ) ) {
1013 return;
1014 }
1015
1016 if ( totalInputs > 0 ) {
1017 undoManager.type( keyCode );
1018 } else if ( UndoManager.isNavigationKey( keyCode ) ) {
1019 // Note content snapshot has been checked in keydown.
1020 this.onNavigationKey( true );
1021 }
1022 },
1023
1024 /**
1025 * Method called for navigation change. At first it will check if current content does not differ
1026 * from the last saved snapshot.
1027 *
1028 * * If the content is different, the method creates a standard, extra snapshot.
1029 * * If the content is not different, the method will compare the selection, and will
1030 * amend the last snapshot selection if it changed.
1031 *
1032 * @param {Boolean} skipContentCompare If set to `true`, it will not compare content, and only do a selection check.
1033 */
1034 onNavigationKey: function( skipContentCompare ) {
1035 var undoManager = this.undoManager;
1036
1037 // We attempt to save content snapshot, if content didn't change, we'll
1038 // only amend selection.
1039 if ( skipContentCompare || !undoManager.save( true, null, false ) )
1040 undoManager.updateSelection( new Image( undoManager.editor ) );
1041
1042 undoManager.resetType();
1043 },
1044
1045 /**
1046 * Makes the next `input` event to be ignored.
1047 */
1048 ignoreInputEventListener: function() {
1049 this.ignoreInputEvent = true;
1050 },
1051
1052 /**
1053 * Attaches editable listeners required to provide the undo functionality.
1054 */
1055 attachListeners: function() {
1056 var editor = this.undoManager.editor,
1057 editable = editor.editable(),
1058 that = this;
1059
1060 // We'll create a snapshot here (before DOM modification), because we'll
1061 // need unmodified content when we got keygroup toggled in keyup.
1062 editable.attachListener( editable, 'keydown', function( evt ) {
1063 that.onKeydown( evt );
1064
1065 // On IE keypress isn't fired for functional (backspace/delete) keys.
1066 // Let's pretend that something's changed.
1067 if ( UndoManager.ieFunctionalKeysBug( evt.data.getKey() ) ) {
1068 that.onInput();
1069 }
1070 }, null, null, 999 );
1071
1072 // Only IE can't use input event, because it's not fired in contenteditable.
1073 editable.attachListener( editable, ( CKEDITOR.env.ie ? 'keypress' : 'input' ), that.onInput, that, null, 999 );
1074
1075 // Keyup executes main snapshot logic.
1076 editable.attachListener( editable, 'keyup', that.onKeyup, that, null, 999 );
1077
1078 // On paste and drop we need to ignore input event.
1079 // It would result with calling undoManager.type() on any following key.
1080 editable.attachListener( editable, 'paste', that.ignoreInputEventListener, that, null, 999 );
1081 editable.attachListener( editable, 'drop', that.ignoreInputEventListener, that, null, 999 );
1082
1083 // Click should create a snapshot if needed, but shouldn't cause change event.
1084 // Don't pass onNavigationKey directly as a listener because it accepts one argument which
1085 // will conflict with evt passed to listener.
1086 // #12324 comment:4
1087 editable.attachListener( editable.isInline() ? editable : editor.document.getDocumentElement(), 'click', function() {
1088 that.onNavigationKey();
1089 }, null, null, 999 );
1090
1091 // When pressing `Tab` key while editable is focused, `keyup` event is not fired.
1092 // Which means that record for `tab` key stays in key events stack.
1093 // We assume that when editor is blurred `tab` key is already up.
1094 editable.attachListener( this.undoManager.editor, 'blur', function() {
1095 that.keyEventsStack.remove( 9 /*Tab*/ );
1096 }, null, null, 999 );
1097 }
1098 };
1099
1100 /**
1101 * This class represents a stack of pressed keys and stores information
1102 * about how many `input` events each key press has caused.
1103 *
1104 * @since 4.4.5
1105 * @private
1106 * @class CKEDITOR.plugins.undo.KeyEventsStack
1107 * @constructor
1108 */
1109 var KeyEventsStack = CKEDITOR.plugins.undo.KeyEventsStack = function() {
1110 /**
1111 * @readonly
1112 */
1113 this.stack = [];
1114 };
1115
1116 KeyEventsStack.prototype = {
1117 /**
1118 * Pushes a literal object with two keys: `keyCode` and `inputs` (whose initial value is set to `0`) to stack.
1119 * It is intended to be called on the `keydown` event.
1120 *
1121 * @param {Number} keyCode
1122 */
1123 push: function( keyCode ) {
1124 var length = this.stack.push( { keyCode: keyCode, inputs: 0 } );
1125 return this.stack[ length - 1 ];
1126 },
1127
1128 /**
1129 * Returns the index of the last registered `keyCode` in the stack.
1130 * If no `keyCode` is provided, then the function will return the index of the last item.
1131 * If an item is not found, it will return `-1`.
1132 *
1133 * @param {Number} [keyCode]
1134 * @returns {Number}
1135 */
1136 getLastIndex: function( keyCode ) {
1137 if ( typeof keyCode != 'number' ) {
1138 return this.stack.length - 1; // Last index or -1.
1139 } else {
1140 var i = this.stack.length;
1141 while ( i-- ) {
1142 if ( this.stack[ i ].keyCode == keyCode ) {
1143 return i;
1144 }
1145 }
1146 return -1;
1147 }
1148 },
1149
1150 /**
1151 * Returns the last key recorded in the stack. If `keyCode` is provided, then it will return
1152 * the last record for this `keyCode`.
1153 *
1154 * @param {Number} [keyCode]
1155 * @returns {Object} Last matching record or `null`.
1156 */
1157 getLast: function( keyCode ) {
1158 var index = this.getLastIndex( keyCode );
1159 if ( index != -1 ) {
1160 return this.stack[ index ];
1161 } else {
1162 return null;
1163 }
1164 },
1165
1166 /**
1167 * Increments registered input events for stack record for a given `keyCode`.
1168 *
1169 * @param {Number} keyCode
1170 */
1171 increment: function( keyCode ) {
1172 var found = this.getLast( keyCode );
1173 if ( !found ) { // %REMOVE_LINE%
1174 throw new Error( 'Trying to increment, but could not found by keyCode: ' + keyCode + '.' ); // %REMOVE_LINE%
1175 } // %REMOVE_LINE%
1176
1177 found.inputs++;
1178 },
1179
1180 /**
1181 * Removes the last record from the stack for the provided `keyCode`.
1182 *
1183 * @param {Number} keyCode
1184 */
1185 remove: function( keyCode ) {
1186 var index = this.getLastIndex( keyCode );
1187
1188 if ( index != -1 ) {
1189 this.stack.splice( index, 1 );
1190 }
1191 },
1192
1193 /**
1194 * Resets the `inputs` value to `0` for a given `keyCode` or in entire stack if a
1195 * `keyCode` is not specified.
1196 *
1197 * @param {Number} [keyCode]
1198 */
1199 resetInputs: function( keyCode ) {
1200 if ( typeof keyCode == 'number' ) {
1201 var last = this.getLast( keyCode );
1202
1203 if ( !last ) { // %REMOVE_LINE%
1204 throw new Error( 'Trying to reset inputs count, but could not found by keyCode: ' + keyCode + '.' ); // %REMOVE_LINE%
1205 } // %REMOVE_LINE%
1206
1207 last.inputs = 0;
1208 } else {
1209 var i = this.stack.length;
1210 while ( i-- ) {
1211 this.stack[ i ].inputs = 0;
1212 }
1213 }
1214 },
1215
1216 /**
1217 * Sums up inputs number for each key code and returns it.
1218 *
1219 * @returns {Number}
1220 */
1221 getTotalInputs: function() {
1222 var i = this.stack.length,
1223 total = 0;
1224
1225 while ( i-- ) {
1226 total += this.stack[ i ].inputs;
1227 }
1228 return total;
1229 },
1230
1231 /**
1232 * Cleans the stack based on a provided `keydown` event object. The rationale behind this method
1233 * is that some keystrokes cause the `keydown` event to be fired in the editor, but not the `keyup` event.
1234 * For instance, *Alt+Tab* will fire `keydown`, but since the editor is blurred by it, then there is
1235 * no `keyup`, so the keystroke is not removed from the stack.
1236 *
1237 * @param {CKEDITOR.dom.event} event
1238 */
1239 cleanUp: function( event ) {
1240 var nativeEvent = event.data.$;
1241
1242 if ( !( nativeEvent.ctrlKey || nativeEvent.metaKey ) ) {
1243 this.remove( 17 );
1244 }
1245 if ( !nativeEvent.shiftKey ) {
1246 this.remove( 16 );
1247 }
1248 if ( !nativeEvent.altKey ) {
1249 this.remove( 18 );
1250 }
1251 }
1252 };
1253} )();
1254
1255/**
1256 * The number of undo steps to be saved. The higher value is set, the more
1257 * memory is used for it.
1258 *
1259 * config.undoStackSize = 50;
1260 *
1261 * @cfg {Number} [undoStackSize=20]
1262 * @member CKEDITOR.config
1263 */
1264
1265/**
1266 * Fired when the editor is about to save an undo snapshot. This event can be
1267 * fired by plugins and customizations to make the editor save undo snapshots.
1268 *
1269 * @event saveSnapshot
1270 * @member CKEDITOR.editor
1271 * @param {CKEDITOR.editor} editor This editor instance.
1272 */
1273
1274/**
1275 * Fired before an undo image is to be created. An *undo image* represents the
1276 * editor state at some point. It is saved into the undo store, so the editor is
1277 * able to recover the editor state on undo and redo operations.
1278 *
1279 * @since 3.5.3
1280 * @event beforeUndoImage
1281 * @member CKEDITOR.editor
1282 * @param {CKEDITOR.editor} editor This editor instance.
1283 * @see CKEDITOR.editor#afterUndoImage
1284 */
1285
1286/**
1287 * Fired after an undo image is created. An *undo image* represents the
1288 * editor state at some point. It is saved into the undo store, so the editor is
1289 * able to recover the editor state on undo and redo operations.
1290 *
1291 * @since 3.5.3
1292 * @event afterUndoImage
1293 * @member CKEDITOR.editor
1294 * @param {CKEDITOR.editor} editor This editor instance.
1295 * @see CKEDITOR.editor#beforeUndoImage
1296 */
1297
1298/**
1299 * Fired when the content of the editor is changed.
1300 *
1301 * Due to performance reasons, it is not verified if the content really changed.
1302 * The editor instead watches several editing actions that usually result in
1303 * changes. This event may thus in some cases be fired when no changes happen
1304 * or may even get fired twice.
1305 *
1306 * If it is important not to get the `change` event fired too often, you should compare the
1307 * previous and the current editor content inside the event listener. It is
1308 * not recommended to do that on every `change` event.
1309 *
1310 * Please note that the `change` event is only fired in the {@link #property-mode wysiwyg mode}.
1311 * In order to implement similar functionality in the source mode, you can listen for example to the {@link #key}
1312 * event or the native [`input`](https://developer.mozilla.org/en-US/docs/Web/Reference/Events/input)
1313 * event (not supported by Internet Explorer 8).
1314 *
1315 * editor.on( 'mode', function() {
1316 * if ( this.mode == 'source' ) {
1317 * var editable = editor.editable();
1318 * editable.attachListener( editable, 'input', function() {
1319 * // Handle changes made in the source mode.
1320 * } );
1321 * }
1322 * } );
1323 *
1324 * @since 4.2
1325 * @event change
1326 * @member CKEDITOR.editor
1327 * @param {CKEDITOR.editor} editor This editor instance.
1328 */
diff --git a/sources/plugins/wsc/LICENSE.md b/sources/plugins/wsc/LICENSE.md
new file mode 100644
index 00000000..6096de23
--- /dev/null
+++ b/sources/plugins/wsc/LICENSE.md
@@ -0,0 +1,28 @@
1Software License Agreement
2==========================
3
4**CKEditor WSC Plugin**
5Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
6
7Licensed under the terms of any of the following licenses at your choice:
8
9* GNU General Public License Version 2 or later (the "GPL"):
10 http://www.gnu.org/licenses/gpl.html
11
12* GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
13 http://www.gnu.org/licenses/lgpl.html
14
15* Mozilla Public License Version 1.1 or later (the "MPL"):
16 http://www.mozilla.org/MPL/MPL-1.1.html
17
18You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
19
20Sources of Intellectual Property Included in this plugin
21--------------------------------------------------------
22
23Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
24
25Trademarks
26----------
27
28CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/sources/plugins/wsc/README.md b/sources/plugins/wsc/README.md
new file mode 100644
index 00000000..346e2ab1
--- /dev/null
+++ b/sources/plugins/wsc/README.md
@@ -0,0 +1,25 @@
1CKEditor WebSpellChecker Plugin
2===============================
3
4This plugin brings Web Spell Checker (WSC) into CKEditor.
5
6WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
7
8Installation
9------------
10
111. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation.
122. Enable the "wsc" plugin in the CKEditor configuration file (config.js):
13
14 config.extraPlugins = 'wsc';
15
16That's all. WSC will appear on the editor toolbar and will be ready to use.
17
18License
19-------
20
21Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
22
23See LICENSE.md for more information.
24
25Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/sources/plugins/wsc/dialogs/ciframe.html b/sources/plugins/wsc/dialogs/ciframe.html
new file mode 100644
index 00000000..8e4e6bc9
--- /dev/null
+++ b/sources/plugins/wsc/dialogs/ciframe.html
@@ -0,0 +1,66 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.html or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <title></title>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
10 <script type="text/javascript">
11
12function gup( name )
13{
14 name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
15 var regexS = '[\\?&]' + name + '=([^&#]*)' ;
16 var regex = new RegExp( regexS ) ;
17 var results = regex.exec( window.location.href ) ;
18
19 if ( results )
20 return results[ 1 ] ;
21 else
22 return '' ;
23}
24
25var interval;
26
27function sendData2Master()
28{
29 var destination = window.parent.parent ;
30 try
31 {
32 if ( destination.XDTMaster )
33 {
34 var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
35 window.clearInterval( interval ) ;
36 }
37 }
38 catch (e) {}
39}
40
41function OnMessage (event) {
42 var message = event.data;
43 var destination = window.parent.parent;
44 destination.XDTMaster.read( [ 'end', message, 'fpm' ] ) ;
45}
46
47function listenPostMessage() {
48 if (window.addEventListener) { // all browsers except IE before version 9
49 window.addEventListener ("message", OnMessage, false);
50 }else {
51 if (window.attachEvent) { // IE before version 9
52 window.attachEvent("onmessage", OnMessage);
53 }
54 }
55}
56
57function onLoad()
58{
59 interval = window.setInterval( sendData2Master, 100 );
60 listenPostMessage();
61}
62
63</script>
64</head>
65<body onload="onLoad()"><p></p></body>
66</html>
diff --git a/sources/plugins/wsc/dialogs/tmpFrameset.html b/sources/plugins/wsc/dialogs/tmpFrameset.html
new file mode 100644
index 00000000..19c7c9cc
--- /dev/null
+++ b/sources/plugins/wsc/dialogs/tmpFrameset.html
@@ -0,0 +1,52 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.html or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <title></title>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
10 <script type="text/javascript">
11
12function doLoadScript( url )
13{
14 if ( !url )
15 return false ;
16
17 var s = document.createElement( "script" ) ;
18 s.type = "text/javascript" ;
19 s.src = url ;
20 document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
21
22 return true ;
23}
24
25var opener;
26function tryLoad()
27{
28 opener = window.parent;
29
30 // get access to global parameters
31 var oParams = window.opener.oldFramesetPageParams;
32
33 // make frameset rows string prepare
34 var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
35 document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
36
37 // dynamic including init frames and crossdomain transport code
38 // from config sproxy_js_frameset url
39 var addScriptUrl = oParams.sproxy_js_frameset ;
40 doLoadScript( addScriptUrl ) ;
41}
42
43 </script>
44</head>
45
46<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
47 <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
48 <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
49 <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
50 <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
51</frameset>
52</html>
diff --git a/sources/plugins/wsc/dialogs/wsc.css b/sources/plugins/wsc/dialogs/wsc.css
new file mode 100644
index 00000000..2a622f22
--- /dev/null
+++ b/sources/plugins/wsc/dialogs/wsc.css
@@ -0,0 +1,82 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5
6html, body
7{
8 background-color: transparent;
9 margin: 0px;
10 padding: 0px;
11}
12
13body
14{
15 padding: 10px;
16}
17
18body, td, input, select, textarea
19{
20 font-size: 11px;
21 font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;
22}
23
24.midtext
25{
26 padding:0px;
27 margin:10px;
28}
29
30.midtext p
31{
32 padding:0px;
33 margin:10px;
34}
35
36.Button
37{
38 border: #737357 1px solid;
39 color: #3b3b1f;
40 background-color: #c7c78f;
41}
42
43.PopupTabArea
44{
45 color: #737357;
46 background-color: #e3e3c7;
47}
48
49.PopupTitleBorder
50{
51 border-bottom: #d5d59d 1px solid;
52}
53.PopupTabEmptyArea
54{
55 padding-left: 10px;
56 border-bottom: #d5d59d 1px solid;
57}
58
59.PopupTab, .PopupTabSelected
60{
61 border-right: #d5d59d 1px solid;
62 border-top: #d5d59d 1px solid;
63 border-left: #d5d59d 1px solid;
64 padding: 3px 5px 3px 5px;
65 color: #737357;
66}
67
68.PopupTab
69{
70 margin-top: 1px;
71 border-bottom: #d5d59d 1px solid;
72 cursor: pointer;
73}
74
75.PopupTabSelected
76{
77 font-weight: bold;
78 cursor: default;
79 padding-top: 4px;
80 border-bottom: #f1f1e3 1px solid;
81 background-color: #f1f1e3;
82}
diff --git a/sources/plugins/wsc/dialogs/wsc.js b/sources/plugins/wsc/dialogs/wsc.js
new file mode 100644
index 00000000..eb96af8a
--- /dev/null
+++ b/sources/plugins/wsc/dialogs/wsc.js
@@ -0,0 +1,3152 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.html or http://ckeditor.com/license
4 */
5 (function() {
6 // Create support tools
7 var appTools = (function(){
8 var inited = {};
9
10 var _init = function(handler) {
11 if (window.addEventListener) {
12 window.addEventListener('message', handler, false);
13 } else {
14 window.attachEvent("onmessage", handler);
15 }
16 };
17
18 var unbindHandler = function(handler) {
19 if (window.removeEventListener) {
20 window.removeEventListener('message', handler, false);
21 } else {
22 window.detachEvent('onmessage', handler);
23 }
24 };
25
26 var _sendCmd = function(o) {
27 var str,
28 type = Object.prototype.toString,
29 objObject = "[object Object]",
30 fn = o.fn || null,
31 id = o.id || '',
32 target = o.target || window,
33 message = o.message || {
34 'id': id
35 };
36
37 if (o.message && type.call(o.message) == objObject) {
38 (o.message.id) ? o.message.id : o.message.id = id;
39 message = o.message;
40 }
41
42 str = window.JSON.stringify(message, fn);
43 target.postMessage(str, '*');
44 };
45
46 var _hashCreate = function(o, fn) {
47 fn = fn || null;
48 var str = window.JSON.stringify(o, fn);
49 return str;
50 };
51
52 var _hashParse = function(str, fn) {
53 fn = fn || null;
54 return window.JSON.parse(str, fn);
55 };
56
57 var setCookie = function(name, value, options) {
58 options = options || {};
59
60 var expires = options.expires;
61
62 if (typeof expires == "number" && expires) {
63 var d = new Date();
64 d.setTime(d.getTime() + expires*1000);
65 expires = options.expires = d;
66 }
67 if (expires && expires.toUTCString) {
68 options.expires = expires.toUTCString();
69 }
70
71 value = encodeURIComponent(value);
72 var updatedCookie = name + "=" + value;
73
74 for(var propName in options) {
75 var propValue = options[propName];
76 updatedCookie += "; " + propName;
77 if (propValue !== true) {
78 updatedCookie += "=" + propValue;
79 }
80 }
81 document.cookie = updatedCookie;
82 };
83
84 var getCookie = function(name) {
85 var matches = document.cookie.match(new RegExp(
86 "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
87 ));
88 return matches ? decodeURIComponent(matches[1]) : undefined;
89 };
90
91 var deleteCookie = function(name) {
92 setCookie(name, "", { expires: -1 });
93 };
94
95 var findFocusable = function(ckEl) {
96 var result = null,
97 focusableSelectors = 'a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]';
98
99 if(ckEl) {
100 result = ckEl.find(focusableSelectors);
101 }
102
103 return result;
104 };
105
106 var getStyle = function(el, prop) {
107 if(document.defaultView && document.defaultView.getComputedStyle) {
108 return document.defaultView.getComputedStyle(el, null)[prop];
109 } else if(el.currentStyle) {
110 return el.currentStyle[prop];
111 } else {
112 return el.style[prop];
113 }
114 };
115
116 var isHidden = function(el) {
117 return el.offsetWidth === 0 || el.offsetHeight == 0 || getStyle(el, 'display') === 'none';
118 };
119
120 var isVisible = function(el) {
121 return !isHidden(el);
122 };
123
124 var hasClass = function (obj, cname) {
125 return !!(obj.className ? obj.className.match(new RegExp('(\\s|^)'+cname+'(\\s|$)')) : false);
126 };
127
128 return {
129 postMessage: {
130 init: _init,
131 send: _sendCmd,
132 unbindHandler: unbindHandler
133 },
134 hash: {
135 create: function() {
136
137 },
138
139 parse: function() {
140
141 }
142 },
143 cookie: {
144 set: setCookie,
145 get: getCookie,
146 remove: deleteCookie
147 },
148 misc: {
149 findFocusable: findFocusable,
150 isVisible: isVisible,
151 hasClass: hasClass
152 }
153 };
154 })();
155
156 var NS = NS || {};
157 NS.TextAreaNumber = null;
158 NS.load = true;
159 NS.cmd = {
160 "SpellTab": 'spell',
161 "Thesaurus": 'thes',
162 "GrammTab": 'grammar'
163 };
164 NS.dialog = null;
165 NS.optionNode = null;
166 NS.selectNode = null;
167 NS.grammerSuggest = null;
168 NS.textNode = {};
169 NS.iframeMain = null;
170 NS.dataTemp = '';
171 NS.div_overlay = null;
172 NS.textNodeInfo = {};
173 NS.selectNode = {};
174 NS.selectNodeResponce = {};
175 NS.langList = null;
176 NS.langSelectbox = null;
177 NS.banner = '';
178 NS.show_grammar = null;
179 NS.div_overlay_no_check = null;
180 NS.targetFromFrame = {};
181 NS.onLoadOverlay = null;
182 NS.LocalizationComing = {};
183 NS.OverlayPlace = null;
184 NS.sessionid = '';
185 NS.LocalizationButton = {
186 'ChangeTo_button': {
187 'instance' : null,
188 'text' : 'Change to',
189 'localizationID': 'ChangeTo'
190 },
191
192 'ChangeAll': {
193 'instance' : null,
194 'text' : 'Change All'
195 },
196
197 'IgnoreWord': {
198 'instance' : null,
199 'text' : 'Ignore word'
200 },
201
202 'IgnoreAllWords': {
203 'instance' : null,
204 'text' : 'Ignore all words'
205 },
206
207 'Options': {
208 'instance' : null,
209 'text' : 'Options',
210 'optionsDialog': {
211 'instance' : null
212 }
213 },
214
215 'AddWord': {
216 'instance' : null,
217 'text' : 'Add word'
218 },
219
220 'FinishChecking_button': {
221 'instance' : null,
222 'text' : 'Finish Checking',
223 'localizationID': 'FinishChecking'
224 },
225
226 'FinishChecking_button_block': {
227 'instance' : null,
228 'text' : 'Finish Checking',
229 'localizationID': 'FinishChecking'
230 }
231 };
232
233 NS.LocalizationLabel = {
234 'ChangeTo_label': {
235 'instance' : null,
236 'text' : 'Change to',
237 'localizationID': 'ChangeTo'
238 },
239
240 'Suggestions': {
241 'instance' : null,
242 'text' : 'Suggestions'
243 },
244
245 'Categories': {
246 'instance' : null,
247 'text' : 'Categories'
248 },
249
250 'Synonyms': {
251 'instance' : null,
252 'text' : 'Synonyms'
253 }
254 };
255
256 var SetLocalizationButton = function(obj) {
257 var el, localizationID;
258
259 for(var i in obj) {
260 el = NS.dialog.getContentElement(NS.dialog._.currentTabId, i);
261
262 if(el) {
263 el = el.getElement();
264 } else {
265 el = obj[i].instance.getElement().getFirst() || obj[i].instance.getElement();
266 }
267
268 localizationID = obj[i].localizationID || i;
269 el.setText(NS.LocalizationComing[localizationID]);
270 }
271 };
272
273 var SetLocalizationLabel = function(obj) {
274 var el, localizationID;
275
276 for(var i in obj) {
277 el = NS.dialog.getContentElement(NS.dialog._.currentTabId, i);
278
279 if(!el) {
280 el = obj[i].instance;
281 }
282
283 if(el.setLabel) {
284 localizationID = obj[i].localizationID || i;
285 el.setLabel(NS.LocalizationComing[localizationID] + ':');
286 }
287 }
288 };
289 var OptionsConfirm = function(state) {
290 if (state) {
291 nameNode.setValue('');
292 }
293 };
294
295 var iframeOnload = false;
296 var nameNode, selectNode, frameId;
297
298 NS.framesetHtml = function(tab) {
299 var str = '<iframe id=' + NS.iframeNumber + '_' + tab + ' frameborder="0" allowtransparency="1" style="width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;"></iframe>';
300 return str;
301 };
302
303 NS.setIframe = function(that, nameTab) {
304 var iframe,
305 str = NS.framesetHtml(nameTab),
306 iframeId = NS.iframeNumber + '_' + nameTab,
307 // tmp.html from wsc/dialogs
308 iframeInnerHtml =
309 '<!DOCTYPE html>' +
310 '<html>' +
311 '<head>' +
312 '<meta charset="UTF-8">' +
313 '<title>iframe</title>' +
314
315 '<style>' +
316 'html,body{' +
317 'margin: 0;' +
318 'height: 100%;' +
319 'font: 13px/1.555 "Trebuchet MS", sans-serif;' +
320 '}' +
321 'a{' +
322 'color: #888;' +
323 'font-weight: bold;' +
324 'text-decoration: none;' +
325 'border-bottom: 1px solid #888;' +
326 '}' +
327 '.main-box {' +
328 'color:#252525;' +
329 'padding: 3px 5px;' +
330 'text-align: justify;' +
331 '}' +
332 '.main-box p{margin: 0 0 14px;}' +
333 '.main-box .cerr{' +
334 'color: #f00000;' +
335 'border-bottom-color: #f00000;' +
336 '}' +
337 '</style>' +
338 '</head>' +
339 '<body>' +
340 '<div id="content" class="main-box"></div>' +
341 '<iframe src="" frameborder="0" id="spelltext" name="spelltext" style="display:none; width: 100%" ></iframe>' +
342 '<iframe src="" frameborder="0" id="loadsuggestfirst" name="loadsuggestfirst" style="display:none; width: 100%" ></iframe>' +
343 '<iframe src="" frameborder="0" id="loadspellsuggestall" name="loadspellsuggestall" style="display:none; width: 100%" ></iframe>' +
344 '<iframe src="" frameborder="0" id="loadOptionsForm" name="loadOptionsForm" style="display:none; width: 100%" ></iframe>' +
345 '<script>' +
346 '(function(window) {' +
347 // Constructor Manager PostMessage
348
349 'var ManagerPostMessage = function() {' +
350 'var _init = function(handler) {' +
351 'if (document.addEventListener) {' +
352 'window.addEventListener("message", handler, false);' +
353 '} else {' +
354 'window.attachEvent("onmessage", handler);' +
355 '};' +
356 '};' +
357 'var _sendCmd = function(o) {' +
358 'var str,' +
359 'type = Object.prototype.toString,' +
360 'fn = o.fn || null,' +
361 'id = o.id || "",' +
362 'target = o.target || window,' +
363 'message = o.message || { "id": id };' +
364
365 'if (o.message && type.call(o.message) == "[object Object]") {' +
366 '(o.message["id"]) ? o.message["id"] : o.message["id"] = id;' +
367 'message = o.message;' +
368 '};' +
369
370 'str = JSON.stringify(message, fn);' +
371 'target.postMessage(str, "*");' +
372 '};' +
373
374 'return {' +
375 'init: _init,' +
376 'send: _sendCmd' +
377 '};' +
378 '};' +
379
380 'var manageMessageTmp = new ManagerPostMessage;' +
381
382
383 'var appString = (function(){' +
384 'var spell = parent.CKEDITOR.config.wsc.DefaultParams.scriptPath;' +
385 'var serverUrl = parent.CKEDITOR.config.wsc.DefaultParams.serviceHost;' +
386 'return serverUrl + spell;' +
387 '})();' +
388
389 'function loadScript(src, callback) {' +
390 'var scriptTag = document.createElement("script");' +
391 'scriptTag.type = "text/javascript";' +
392 'callback ? callback : callback = function() {};' +
393 'if(scriptTag.readyState) {' +
394 //IE
395 'scriptTag.onreadystatechange = function() {' +
396 'if (scriptTag.readyState == "loaded" ||' +
397 'scriptTag.readyState == "complete") {' +
398 'scriptTag.onreadystatechange = null;' +
399 'setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);' +
400 'callback();' +
401 '}' +
402 '};' +
403 '}else{' +
404 //Others
405 'scriptTag.onload = function() {' +
406 'setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);' +
407 'callback();' +
408 '};' +
409 '};' +
410 'scriptTag.src = src;' +
411 'document.getElementsByTagName("head")[0].appendChild(scriptTag);' +
412 '};' +
413
414
415 'window.onload = function(){' +
416 'loadScript(appString, function(){' +
417 'manageMessageTmp.send({' +
418 '"id": "iframeOnload",' +
419 '"target": window.parent' +
420 '});' +
421 '});' +
422 '}' +
423 '})(this);' +
424 '</script>' +
425 '</body>' +
426 '</html>';
427
428 that.getElement().setHtml(str);
429 iframe = document.getElementById(iframeId);
430 iframe = (iframe.contentWindow) ? iframe.contentWindow : (iframe.contentDocument.document) ? iframe.contentDocument.document : iframe.contentDocument;
431 iframe.document.open();
432 iframe.document.write(iframeInnerHtml);
433 iframe.document.close();
434 };
435
436 NS.setCurrentIframe = function(currentTab) {
437 var that = NS.dialog._.contents[currentTab].Content,
438 tabID, iframe;
439
440 NS.setIframe(that, currentTab);
441
442 };
443
444 NS.setHeightBannerFrame = function() {
445 var height = "90px",
446 bannerPlaceSpellTab = NS.dialog.getContentElement('SpellTab', 'banner').getElement(),
447 bannerPlaceGrammTab = NS.dialog.getContentElement('GrammTab', 'banner').getElement(),
448 bannerPlaceThesaurus = NS.dialog.getContentElement('Thesaurus', 'banner').getElement();
449
450 bannerPlaceSpellTab.setStyle('height', height);
451 bannerPlaceGrammTab.setStyle('height', height);
452 bannerPlaceThesaurus.setStyle('height', height);
453 };
454
455 NS.setHeightFrame = function() {
456 var currentTab = NS.dialog._.currentTabId,
457 tabID = NS.iframeNumber + '_' + currentTab,
458 iframe = document.getElementById(tabID);
459
460 iframe.style.height = '240px';
461 };
462
463 NS.sendData = function(scope) {
464 var currentTab = scope._.currentTabId,
465 that = scope._.contents[currentTab].Content,
466 tabID, iframe;
467
468 NS.previousTab = currentTab;
469 NS.setIframe(that, currentTab);
470
471 var loadNewTab = function(event) {
472 currentTab = scope._.currentTabId;
473 event = event || window.event;
474
475 if (!event.data.getTarget().is('a')) {
476 return;
477 }
478
479 if(currentTab === NS.previousTab) return;
480 NS.previousTab = currentTab;
481
482 that = scope._.contents[currentTab].Content;
483 tabID = NS.iframeNumber + '_' + currentTab;
484 NS.div_overlay.setEnable();
485
486 if (!that.getElement().getChildCount()) {
487 NS.setIframe(that, currentTab);
488 iframe = document.getElementById(tabID);
489 NS.targetFromFrame[tabID] = iframe.contentWindow;
490 } else {
491 sendData(NS.targetFromFrame[tabID], NS.cmd[currentTab]);
492 }
493 };
494
495 scope.parts.tabs.removeListener('click', loadNewTab);
496 scope.parts.tabs.on('click', loadNewTab);
497 };
498
499 NS.buildSelectLang = function(aId) {
500 var divContainer = new CKEDITOR.dom.element('div'),
501 selectContainer = new CKEDITOR.dom.element('select'),
502 id = "wscLang" + aId;
503
504 divContainer.addClass("cke_dialog_ui_input_select");
505 divContainer.setAttribute("role", "presentation");
506 divContainer.setStyles({
507 'height': 'auto',
508 'position': 'absolute',
509 'right': '0',
510 'top': '-1px',
511 'width': '160px',
512 'white-space': 'normal'
513 });
514
515 selectContainer.setAttribute('id', id);
516 selectContainer.addClass("cke_dialog_ui_input_select");
517 selectContainer.setStyles({
518 'width': '160px'
519 });
520 var currentTabId = NS.dialog._.currentTabId,
521 frameId = NS.iframeNumber + '_' + currentTabId;
522
523 divContainer.append(selectContainer);
524
525 return divContainer;
526
527 };
528
529 NS.buildOptionLang = function(key, aId) {
530 var id = "wscLang" + aId;
531 var select = document.getElementById(id),
532 fragment = document.createDocumentFragment(),
533 create_option, txt_option,
534 sort = [];
535
536 if(select.options.length === 0) {
537 for (var lang in key) {
538 sort.push([lang, key[lang]]);
539 }
540 sort.sort();
541
542 for (var i = 0; i < sort.length; i++) {
543 create_option=document.createElement("option");
544 create_option.setAttribute("value", sort[i][1]);
545 txt_option = document.createTextNode(sort[i][0]);
546 create_option.appendChild(txt_option);
547
548 fragment.appendChild(create_option);
549 }
550 select.appendChild(fragment);
551 }
552
553 // make appropriate option selected according to current selected language
554 for (var j = 0; j < select.options.length; j++) {
555 if (select.options[j].value == NS.selectingLang) {
556 select.options[j].selected = "selected";
557 }
558 }
559 };
560
561 NS.buildOptionSynonyms = function(key) {
562 var syn = NS.selectNodeResponce[key];
563
564 var select = getSelect( NS.selectNode['Synonyms'] );
565
566 NS.selectNode['Synonyms'].clear();
567
568 for (var i = 0; i < syn.length; i++) {
569 var option = document.createElement('option');
570 option.text = syn[i];
571 option.value = syn[i];
572
573 select.$.add(option, i);
574 }
575
576 NS.selectNode['Synonyms'].getInputElement().$.firstChild.selected = true;
577 NS.textNode['Thesaurus'].setValue(NS.selectNode['Synonyms'].getInputElement().getValue());
578 };
579
580 var setBannerInPlace = function(htmlBanner) {
581 var findBannerPlace = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'banner').getElement();
582 findBannerPlace.setHtml(htmlBanner);
583
584 };
585
586 var overlayBlock = function overlayBlock(opt) {
587 var progress = opt.progress || "",
588 doc = document,
589 target = opt.target || doc.body,
590 overlayId = opt.id || "overlayBlock",
591 opacity = opt.opacity || "0.9",
592 background = opt.background || "#f1f1f1",
593 getOverlay = doc.getElementById(overlayId),
594 thisOverlay = getOverlay || doc.createElement("div");
595
596 thisOverlay.style.cssText = "position: absolute;" +
597 "top:30px;" +
598 "bottom:41px;" +
599 "left:1px;" +
600 "right:1px;" +
601 "z-index: 10020;" +
602 "padding:0;" +
603 "margin:0;" +
604 "background:" + background + ";" +
605 "opacity: " + opacity + ";" +
606 "filter: alpha(opacity=" + opacity * 100 + ");" +
607 "display: none;";
608 thisOverlay.id = overlayId;
609
610 if (!getOverlay) {
611 target.appendChild(thisOverlay);
612 }
613
614 return {
615 setDisable: function() {
616 thisOverlay.style.display = "none";
617 },
618 setEnable: function() {
619 thisOverlay.style.display = "block";
620 }
621 };
622 };
623
624 var buildRadioInputs = function(key, value, check) {
625 var divContainer = new CKEDITOR.dom.element('div'),
626 radioButton = new CKEDITOR.dom.element('input'),
627 radioLabel = new CKEDITOR.dom.element('label'),
628 id = "wscGrammerSuggest" + key + "_" + value;
629
630 divContainer.addClass("cke_dialog_ui_input_radio");
631 divContainer.setAttribute("role", "presentation");
632 divContainer.setStyles({
633 width: "97%",
634 padding: "5px",
635 'white-space': 'normal'
636 });
637
638 radioButton.setAttributes({
639 type: "radio",
640 value: value,
641 name: 'wscGrammerSuggest',
642 id: id
643 });
644 radioButton.setStyles({
645 "float":"left"
646 });
647
648 radioButton.on("click", function(data) {
649 NS.textNode['GrammTab'].setValue(data.sender.getValue());
650 });
651
652 (check) ? radioButton.setAttribute("checked", true) : false;
653
654 radioButton.addClass("cke_dialog_ui_radio_input");
655
656 radioLabel.appendText(key);
657 radioLabel.setAttribute("for", id);
658 radioLabel.setStyles({
659 'display': "block",
660 'line-height': '16px',
661 'margin-left': '18px',
662 'white-space': 'normal'
663 });
664
665 divContainer.append(radioButton);
666 divContainer.append(radioLabel);
667
668 return divContainer;
669 };
670
671 var statusGrammarTab = function(aState) { //#19221
672 aState = aState || 'true';
673 if(aState !== null && aState == 'false'){
674 hideGrammTab();
675 }
676 };
677
678 var langConstructor = function(lang) {
679 var langSelectBox = new __constructLangSelectbox(lang),
680 selectId = "wscLang" + NS.dialog.getParentEditor().name,
681 selectContainer = document.getElementById(selectId),
682 currentTabId = NS.dialog._.currentTabId,
683 frameId = NS.iframeNumber + '_' + currentTabId;
684
685 NS.buildOptionLang(langSelectBox.setLangList, NS.dialog.getParentEditor().name);
686 tabView[langSelectBox.getCurrentLangGroup(NS.selectingLang)].onShow();
687 statusGrammarTab(NS.show_grammar);
688
689 selectContainer.onchange = function(e) {
690 var langGroup = langSelectBox.getCurrentLangGroup(this.value),
691 currentTabId = NS.dialog._.currentTabId,
692 cmd;
693
694 e = e || window.event;
695
696 tabView[langGroup].onShow();
697 statusGrammarTab(NS.show_grammar);
698 NS.div_overlay.setEnable();
699 NS.selectingLang = this.value;
700
701 // get command for current opened tan
702 cmd = NS.cmd[currentTabId];
703 // check whether current tab can be opened after language switching
704 if(!langGroup || !tabView[langGroup] || !tabView[langGroup].allowedTabCommands[cmd]) {
705 // if not so - set default tab to open after reload
706 cmd = tabView[langGroup].defaultTabCommand;
707 }
708
709 for(var key in NS.cmd) {
710 if(NS.cmd[key] == cmd) {
711 NS.previousTab = key;
712 break;
713 }
714 }
715
716 appTools.postMessage.send({
717 'message': {
718 'changeLang': NS.selectingLang,
719 'text': NS.dataTemp,
720 'cmd': cmd
721 },
722 'target': NS.targetFromFrame[frameId],
723 'id': 'selectionLang_outer__page'
724 });
725 };
726
727 };
728
729 var disableButtonSuggest = function(word) {
730 var changeToButton, changeAllButton,
731 styleDisable = function(instanceButton) {
732 var button = NS.dialog.getContentElement(NS.dialog._.currentTabId, instanceButton) || NS.LocalizationButton[instanceButton].instance;
733 button.getElement().hasClass('cke_disabled') ? button.getElement().setStyle('color', '#a0a0a0') : button.disable();
734 },
735 styleEnable = function(instanceButton) {
736 var button = NS.dialog.getContentElement(NS.dialog._.currentTabId, instanceButton) || NS.LocalizationButton[instanceButton].instance;
737 button.enable();
738 button.getElement().setStyle('color', '#333');
739 };
740
741 if (word == 'no_any_suggestions') {
742 word = 'No suggestions';
743
744 changeToButton = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'ChangeTo_button') || NS.LocalizationButton['ChangeTo_button'].instance;
745 changeToButton.disable();
746 changeAllButton = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'ChangeAll') || NS.LocalizationButton['ChangeAll'].instance;
747 changeAllButton.disable();
748
749 styleDisable('ChangeTo_button');
750 styleDisable('ChangeAll');
751
752 return word;
753 } else {
754 styleEnable('ChangeTo_button');
755 styleEnable('ChangeAll');
756
757 return word;
758 }
759 };
760
761 function getSelect( obj ) {
762 if ( obj && obj.domId && obj.getInputElement().$ )
763 return obj.getInputElement();
764 else if ( obj && obj.$ )
765 return obj;
766 return false;
767 }
768
769 var handlerId = {
770 iframeOnload: function(response) {
771 NS.div_overlay.setEnable();
772 iframeOnload = true;
773 var currentTab = NS.dialog._.currentTabId,
774 tabId = NS.iframeNumber + '_' + currentTab;
775 sendData(NS.targetFromFrame[tabId], NS.cmd[currentTab]);
776 },
777
778 suggestlist: function(response) {
779 delete response.id;
780 NS.div_overlay_no_check.setDisable();
781 hideCurrentFinishChecking();
782 langConstructor(NS.langList);
783
784 var word = disableButtonSuggest(response.word),
785 suggestionsList = '';
786
787 if (word instanceof Array) {
788 word = response.word[0];
789 }
790
791 word = word.split(',');
792 suggestionsList = word;
793
794 NS.textNode['SpellTab'].setValue(suggestionsList[0]);
795
796 var select = getSelect( selectNode );
797
798 selectNode.clear();
799
800 for (var i = 0; i < suggestionsList.length; i++) {
801 var option = document.createElement('option');
802 option.text = suggestionsList[i];
803 option.value = suggestionsList[i];
804
805 select.$.add(option, i);
806 }
807
808 showCurrentTabs();
809 NS.div_overlay.setDisable();
810
811 },
812
813 grammerSuggest: function(response) {
814 delete response.id;
815 delete response.mocklangs;
816
817 hideCurrentFinishChecking();
818 langConstructor(NS.langList); // Show select language for this command CKEDITOR.config.wsc_cmd
819 var firstSuggestValue = response.grammSuggest[0];// ? firstSuggestValue = response.grammSuggest[0] : firstSuggestValue = 'No suggestion for this words';
820 NS.grammerSuggest.getElement().setHtml('');
821
822 NS.textNode['GrammTab'].reset();
823 NS.textNode['GrammTab'].setValue(firstSuggestValue);
824
825 NS.textNodeInfo['GrammTab'].getElement().setHtml('');
826 NS.textNodeInfo['GrammTab'].getElement().setText(response.info);
827
828 var arr = response.grammSuggest,
829 len = arr.length,
830 check = true;
831
832 for (var i = 0; i < len; i++) {
833 NS.grammerSuggest.getElement().append(buildRadioInputs(arr[i], arr[i], check));
834 check = false;
835 }
836
837 showCurrentTabs();
838 NS.div_overlay.setDisable();
839 },
840
841 thesaurusSuggest: function(response) {
842 delete response.id;
843 delete response.mocklangs;
844
845 hideCurrentFinishChecking();
846 langConstructor(NS.langList); // Show select language for this command CKEDITOR.config.wsc_cmd
847 NS.selectNodeResponce = response;
848
849 NS.textNode['Thesaurus'].reset();
850
851 var select = getSelect( NS.selectNode['Categories'] ),
852 count = 0;
853
854 NS.selectNode['Categories'].clear();
855
856 for (var i in response) {
857
858 var option = document.createElement('option');
859 option.text = i;
860 option.value = i;
861
862 select.$.add(option, count);
863 count++
864 }
865
866 var synKey = NS.selectNode['Categories'].getInputElement().getChildren().$[0].value;
867 NS.selectNode['Categories'].getInputElement().getChildren().$[0].selected = true;
868 NS.buildOptionSynonyms(synKey);
869
870 showCurrentTabs();
871 NS.div_overlay.setDisable();
872 count = 0;
873 },
874 finish: function(response) {
875 delete response.id;
876
877 hideCurrentTabs();
878 showCurrentFinishChecking();
879 NS.div_overlay.setDisable();
880 },
881 settext: function(response) {
882 delete response.id;
883
884 var command = NS.dialog.getParentEditor().getCommand( 'checkspell' ),
885 editor = NS.dialog.getParentEditor();
886
887 //set local storage for synchronization before scayt reinit
888 if (editor.scayt && editor.wsc.isSsrvSame) {
889 var wscUDN = editor.wsc.udn;
890
891 if (!wscUDN) {
892 editor.wsc.DataStorage.setData('scayt_user_dictionary_name', '');
893 } else {
894 editor.wsc.DataStorage.setData('scayt_user_dictionary_name', wscUDN);
895 }
896 }
897
898
899 try {
900 editor.focus();
901 } catch(e) {}
902
903 editor.setData(response.text, function(){
904 NS.dataTemp = '';
905 editor.unlockSelection();
906 editor.fire('saveSnapshot');
907 NS.dialog.hide();
908 });
909
910 },
911 ReplaceText: function(response) {
912
913 delete response.id;
914 NS.div_overlay.setEnable();
915
916 NS.dataTemp = response.text;
917 NS.selectingLang = response.currentLang;
918
919 if (response.cmd = 'spell' && response.len !== '0' && response.len) {
920 NS.div_overlay.setDisable();
921 } else {
922 window.setTimeout(function() {
923 try {
924 NS.div_overlay.setDisable();
925 } catch(e) {}
926 }, 500);
927 }
928
929 SetLocalizationButton(NS.LocalizationButton);
930 SetLocalizationLabel(NS.LocalizationLabel);
931
932 },
933 options_checkbox_send: function(response) {
934 delete response.id;
935
936 var obj = {
937 'osp': appTools.cookie.get('osp'),
938 'udn': appTools.cookie.get('udn'),
939 'cust_dic_ids': NS.cust_dic_ids
940 };
941
942 var currentTabId = NS.dialog._.currentTabId,
943 frameId = NS.iframeNumber + '_' + currentTabId;
944
945 appTools.postMessage.send({
946 'message': obj,
947 'target': NS.targetFromFrame[frameId],
948 'id': 'options_outer__page'
949 });
950 },
951
952 getOptions: function(response) {
953 var udn = response.DefOptions.udn;
954 NS.LocalizationComing = response.DefOptions.localizationButtonsAndText;
955 NS.show_grammar = response.show_grammar;
956 NS.langList = response.lang;
957 NS.bnr = response.bannerId;
958 NS.sessionid = response.sessionid;
959 if (response.bannerId) {
960 NS.setHeightBannerFrame();
961 setBannerInPlace(response.banner);
962 } else {
963 NS.setHeightFrame();
964 }
965
966 if (udn == 'undefined') {
967 if (NS.userDictionaryName) {
968 udn = NS.userDictionaryName;
969
970 var obj = {
971 'osp': appTools.cookie.get('osp'),
972 'udn': NS.userDictionaryName,
973 'cust_dic_ids': NS.cust_dic_ids,
974 'id': 'options_dic_send',
975 'udnCmd': 'create'
976 };
977
978 appTools.postMessage.send({
979 'message': obj,
980 'target': NS.targetFromFrame[frameId]
981 });
982
983 } else{
984 udn = '';
985 }
986 }
987
988 appTools.cookie.set('osp', response.DefOptions.osp);
989 appTools.cookie.set('udn', udn);
990 appTools.cookie.set('cust_dic_ids', response.DefOptions.cust_dic_ids);
991
992 appTools.postMessage.send({
993 'id': 'giveOptions'
994 });
995 },
996
997 options_dic_send: function(response) {
998
999 var obj = {
1000 'osp': appTools.cookie.get('osp'),
1001 'udn': appTools.cookie.get('udn'),
1002 'cust_dic_ids': NS.cust_dic_ids,
1003 'id': 'options_dic_send',
1004 'udnCmd': appTools.cookie.get('udnCmd')
1005 };
1006
1007 var currentTabId = NS.dialog._.currentTabId,
1008 frameId = NS.iframeNumber + '_' + currentTabId;
1009
1010 appTools.postMessage.send({
1011 'message': obj,
1012 'target': NS.targetFromFrame[frameId]
1013 });
1014 },
1015 data: function(response) {
1016 delete response.id;
1017 },
1018
1019 giveOptions: function() {
1020
1021 },
1022
1023 setOptionsConfirmF:function() {
1024 OptionsConfirm(false);
1025 },
1026
1027 setOptionsConfirmT:function() {
1028 OptionsConfirm(true);
1029 },
1030
1031 clickBusy: function() {
1032 NS.div_overlay.setEnable();
1033 },
1034
1035 suggestAllCame: function() {
1036 NS.div_overlay.setDisable();
1037 NS.div_overlay_no_check.setDisable();
1038 },
1039
1040 TextCorrect: function() {
1041 langConstructor(NS.langList);
1042 }
1043
1044 };
1045
1046 var handlerIncomingData = function(event) {
1047 event = event || window.event;
1048 var response = window.JSON.parse(event.data);
1049
1050 if(response && response.id) {
1051 handlerId[response.id](response);
1052 }
1053 };
1054
1055 var handlerButtonOptions = function(event) {
1056 event = event || window.event;
1057
1058 var currentTabId = NS.dialog._.currentTabId,
1059 frameId = NS.iframeNumber + '_' + currentTabId;
1060
1061 appTools.postMessage.send({
1062 'message': {
1063 'cmd': 'Options'
1064 },
1065 'target': NS.targetFromFrame[frameId],
1066 'id': 'cmd'
1067 });
1068
1069 };
1070
1071 var sendData = function(frameTarget, cmd, sendText, reset_suggest) {
1072 cmd = cmd || CKEDITOR.config.wsc_cmd;
1073 reset_suggest = reset_suggest || false;
1074 sendText = sendText || NS.dataTemp;
1075
1076 appTools.postMessage.send({
1077 'message': {
1078 'customerId': NS.wsc_customerId,
1079 'text': sendText,
1080 'txt_ctrl': NS.TextAreaNumber,
1081 'cmd': cmd,
1082 'cust_dic_ids': NS.cust_dic_ids,
1083 'udn': NS.userDictionaryName,
1084 'slang': NS.selectingLang,
1085 'reset_suggest': reset_suggest,
1086 'sessionid': NS.sessionid
1087 },
1088 'target': frameTarget,
1089 'id': 'data_outer__page'
1090 });
1091
1092 NS.div_overlay.setEnable();
1093 };
1094
1095 var tabView = {
1096 "superset": {
1097 onShow: function() {
1098 showThesaurusTab();
1099 showGrammTab();
1100 showSpellTab();
1101 },
1102 allowedTabCommands: {
1103 "spell": true,
1104 "grammar": true,
1105 "thes": true
1106 },
1107 defaultTabCommand: "spell"
1108 },
1109 "usual": {
1110 onShow: function() {
1111 hideThesaurusTab();
1112 hideGrammTab();
1113 showSpellTab();
1114 },
1115 allowedTabCommands: {
1116 "spell": true
1117 },
1118 defaultTabCommand: "spell"
1119 },
1120 "rtl": {
1121 onShow: function() {
1122 hideThesaurusTab();
1123 hideGrammTab();
1124 showSpellTab();
1125 },
1126 allowedTabCommands: {
1127 "spell": true
1128 },
1129 defaultTabCommand: "spell"
1130 },
1131 "spellgrammar": {
1132 onShow: function() {
1133 hideThesaurusTab();
1134 showGrammTab();
1135 showSpellTab();
1136 },
1137 allowedTabCommands: {
1138 "spell": true,
1139 "grammar": true
1140 },
1141 defaultTabCommand: "spell"
1142 },
1143 "spellthes": {
1144 onShow: function() {
1145 showThesaurusTab();
1146 hideGrammTab();
1147 showSpellTab();
1148 },
1149 allowedTabCommands: {
1150 "spell": true,
1151 "thes": true
1152 },
1153 defaultTabCommand: "spell"
1154 }
1155 };
1156
1157 var showFirstTab = function(scope) {
1158 var cmdManger = function(cmdView) {
1159 var obj = {};
1160 var _getCmd = function(cmd) {
1161 for (var tabId in cmdView) {
1162 obj[cmdView[tabId]] = tabId;
1163 }
1164 return obj[cmd];
1165 };
1166 return {
1167 getCmdByTab: _getCmd
1168 };
1169 };
1170
1171 var cmdM = new cmdManger(NS.cmd),
1172 tabToOpen = cmdM.getCmdByTab(CKEDITOR.config.wsc_cmd);
1173
1174 scope.selectPage(tabToOpen);
1175 NS.sendData(scope);
1176 };
1177
1178 var showThesaurusTab = function() {
1179 NS.dialog.showPage('Thesaurus');
1180 };
1181
1182 var hideThesaurusTab = function() {
1183 NS.dialog.hidePage('Thesaurus');
1184 };
1185
1186 var showGrammTab = function() {
1187 NS.dialog.showPage('GrammTab');
1188 };
1189
1190 var hideGrammTab = function() {
1191 NS.dialog.hidePage('GrammTab');
1192 };
1193
1194 var showSpellTab = function() {
1195 NS.dialog.showPage('SpellTab');
1196 };
1197
1198 var hideSpellTab = function() {
1199 NS.dialog.hidePage('SpellTab');
1200 };
1201
1202 var showCurrentTabs = function() {
1203 var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'bottomGroup').getElement();
1204
1205 target.removeStyle('display');
1206 target.removeStyle('position');
1207 target.removeStyle('left');
1208
1209 target.show();
1210 };
1211
1212 var hideCurrentTabs = function() {
1213 var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'bottomGroup').getElement(),
1214 activeElement = document.activeElement,
1215 focusableElements;
1216
1217 target.setStyles({
1218 display: 'block',
1219 position: 'absolute',
1220 left: '-9999px'
1221 });
1222
1223 setTimeout(function() {
1224 target.removeStyle('display');
1225 target.removeStyle('position');
1226 target.removeStyle('left');
1227
1228 target.hide();
1229
1230 NS.dialog._.editor.focusManager.currentActive.focusNext();
1231
1232 focusableElements = appTools.misc.findFocusable(NS.dialog.parts.contents);
1233 if(!appTools.misc.hasClass(activeElement, 'cke_dialog_tab') && !appTools.misc.hasClass(activeElement, 'cke_dialog_contents_body') && appTools.misc.isVisible(activeElement)) {
1234 try {
1235 activeElement.focus();
1236 } catch(e) {}
1237 } else {
1238 for(var i = 0, tmpCkEl; i < focusableElements.count(); i++) {
1239 tmpCkEl = focusableElements.getItem(i);
1240 if(appTools.misc.isVisible(tmpCkEl.$)) {
1241 try {
1242 tmpCkEl.$.focus();
1243 } catch(e) {}
1244
1245 break;
1246 }
1247 }
1248 }
1249 }, 0);
1250 };
1251
1252 var showCurrentFinishChecking = function() {
1253 var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'BlockFinishChecking').getElement();
1254
1255 target.removeStyle('display');
1256 target.removeStyle('position');
1257 target.removeStyle('left');
1258
1259 target.show();
1260 };
1261
1262 var hideCurrentFinishChecking = function() {
1263 var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'BlockFinishChecking').getElement(),
1264 activeElement = document.activeElement,
1265 focusableElements;
1266
1267 target.setStyles({
1268 display: 'block',
1269 position: 'absolute',
1270 left: '-9999px'
1271 });
1272
1273 setTimeout(function() {
1274 target.removeStyle('display');
1275 target.removeStyle('position');
1276 target.removeStyle('left');
1277
1278 target.hide();
1279
1280 NS.dialog._.editor.focusManager.currentActive.focusNext();
1281
1282 focusableElements = appTools.misc.findFocusable(NS.dialog.parts.contents);
1283 if(!appTools.misc.hasClass(activeElement, 'cke_dialog_tab') && !appTools.misc.hasClass(activeElement, 'cke_dialog_contents_body') && appTools.misc.isVisible(activeElement)) {
1284 try {
1285 activeElement.focus();
1286 } catch(e) {}
1287 } else {
1288 for(var i = 0, tmpCkEl; i < focusableElements.count(); i++) {
1289 tmpCkEl = focusableElements.getItem(i);
1290 if(appTools.misc.isVisible(tmpCkEl.$)) {
1291 try {
1292 tmpCkEl.$.focus();
1293 } catch(e) {}
1294
1295 break;
1296 }
1297 }
1298 }
1299 }, 0);
1300 };
1301
1302
1303
1304function __constructLangSelectbox(languageGroup) {
1305 if( !languageGroup ) { throw "Languages-by-groups list are required for construct selectbox"; }
1306
1307 var that = this,
1308 o_arr = [],
1309 priorLang ="en_US",
1310 priorLangTitle = "",
1311 currLang = NS.selectingLang;
1312
1313 for ( var group in languageGroup){
1314 for ( var langCode in languageGroup[group]){
1315 var langName = languageGroup[group][langCode];
1316 if ( langName == priorLang ) {
1317 priorLangTitle = langName;
1318 } else {
1319 o_arr.push( langName );
1320 }
1321 }
1322 }
1323
1324 o_arr.sort();
1325 if(priorLangTitle) {
1326 o_arr.unshift( priorLangTitle );
1327 }
1328
1329 var searchGroup = function ( code ){
1330 for ( var group in languageGroup){
1331 for ( var langCode in languageGroup[group]){
1332 if ( langCode.toUpperCase() === code.toUpperCase() ) {
1333 return group;
1334 }
1335 }
1336 }
1337 return "";
1338 };
1339
1340 var _setLangList = function() {
1341 var langList = {},
1342 langArray = [];
1343 for (var group in languageGroup) {
1344 for ( var langCode in languageGroup[group]){
1345 langList[languageGroup[group][langCode]] = langCode;
1346 }
1347 }
1348 return langList;
1349 };
1350
1351 var _return = {
1352 getCurrentLangGroup: function(code) {
1353 return searchGroup(code);
1354 },
1355 setLangList: _setLangList()
1356 };
1357
1358 return _return;
1359}
1360
1361CKEDITOR.dialog.add('checkspell', function(editor) {
1362 var handlerButtons = function(event) {
1363 event = event || window.event;
1364
1365 // because in chrome and safary document.activeElement returns <body> tag. We need to signal that clicked element is active
1366 this.getElement().focus();
1367
1368 NS.div_overlay.setEnable();
1369 var currentTabId = NS.dialog._.currentTabId,
1370 frameId = NS.iframeNumber + '_' + currentTabId,
1371 new_word = NS.textNode[currentTabId].getValue(),
1372 cmd = this.getElement().getAttribute("title-cmd");
1373
1374 appTools.postMessage.send({
1375 'message': {
1376 'cmd': cmd,
1377 'tabId': currentTabId,
1378 'new_word': new_word
1379 },
1380 'target': NS.targetFromFrame[frameId],
1381 'id': 'cmd_outer__page'
1382 });
1383
1384 if (cmd == 'ChangeTo' || cmd == 'ChangeAll') {
1385 editor.fire('saveSnapshot');
1386 }
1387
1388 if (cmd == 'FinishChecking') {
1389 editor.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame());
1390 }
1391
1392 },
1393 constraints = {
1394 minWidth: 560,
1395 minHeight: 444
1396 };
1397
1398 function initView(dialog) {
1399 var newViewSettings = {
1400 left: parseInt(editor.config.wsc_left, 10),
1401 top: parseInt(editor.config.wsc_top, 10),
1402 width: parseInt(editor.config.wsc_width, 10),
1403 height: parseInt(editor.config.wsc_height, 10)
1404 },
1405 viewSize = CKEDITOR.document.getWindow().getViewPaneSize(),
1406 currentPosition = dialog.getPosition(),
1407 currentSize = dialog.getSize(),
1408 savePosition = 0;
1409
1410 if(!dialog._.resized) {
1411 var wrapperHeight = currentSize.height - dialog.parts.contents.getSize('height', !(CKEDITOR.env.gecko || CKEDITOR.env.opera || CKEDITOR.env.ie && CKEDITOR.env.quirks)),
1412 wrapperWidth = currentSize.width - dialog.parts.contents.getSize('width', 1);
1413
1414 if(newViewSettings.width < constraints.minWidth || isNaN(newViewSettings.width)) {
1415 newViewSettings.width = constraints.minWidth;
1416 }
1417 if(newViewSettings.width > viewSize.width - wrapperWidth) {
1418 newViewSettings.width = viewSize.width - wrapperWidth;
1419 }
1420
1421 if(newViewSettings.height < constraints.minHeight || isNaN(newViewSettings.height)) {
1422 newViewSettings.height = constraints.minHeight;
1423 }
1424 if(newViewSettings.height > viewSize.height - wrapperHeight) {
1425 newViewSettings.height = viewSize.height - wrapperHeight;
1426 }
1427
1428 currentSize.width = newViewSettings.width + wrapperWidth;
1429 currentSize.height = newViewSettings.height + wrapperHeight;
1430
1431 dialog._.fromResizeEvent = false;
1432 dialog.resize(newViewSettings.width, newViewSettings.height);
1433 setTimeout(function() {
1434 dialog._.fromResizeEvent = false;
1435 CKEDITOR.dialog.fire('resize', {
1436 dialog: dialog,
1437 width: newViewSettings.width,
1438 height: newViewSettings.height
1439 }, editor);
1440 }, 300);
1441 }
1442
1443 if(!dialog._.moved) {
1444 savePosition = isNaN(newViewSettings.left) && isNaN(newViewSettings.top) ? 0 : 1;
1445
1446 if(isNaN(newViewSettings.left)) {
1447 newViewSettings.left = (viewSize.width - currentSize.width) / 2;
1448 }
1449 if(newViewSettings.left < 0) {
1450 newViewSettings.left = 0;
1451 }
1452 if(newViewSettings.left > viewSize.width - currentSize.width) {
1453 newViewSettings.left = viewSize.width - currentSize.width;
1454 }
1455
1456 if(isNaN(newViewSettings.top)) {
1457 newViewSettings.top = (viewSize.height - currentSize.height) / 2;
1458 }
1459 if(newViewSettings.top < 0) {
1460 newViewSettings.top = 0;
1461 }
1462 if(newViewSettings.top > viewSize.height - currentSize.height) {
1463 newViewSettings.top = viewSize.height - currentSize.height;
1464 }
1465
1466 dialog.move(newViewSettings.left, newViewSettings.top, savePosition);
1467 }
1468 }
1469
1470 function createWscObjectForUdAndUdnSyncrhonization() {
1471 editor.wsc = {};
1472
1473 //DataStorage object for cookies and localStorage manipulation
1474 (function( object ) {
1475 'use strict';
1476
1477 var DataTypeManager = {
1478 separator: '<$>',
1479 getDataType: function(value) {
1480 var type;
1481
1482 if(typeof value === 'undefined') {
1483 type = 'undefined';
1484 } else if(value === null) {
1485 type = 'null';
1486 } else {
1487 type = Object.prototype.toString.call(value).slice(8, -1);
1488 }
1489 return type;
1490 },
1491 convertDataToString: function(value) {
1492 var str,
1493 type = this.getDataType(value).toLowerCase();
1494
1495 str = type + this.separator + value;
1496 return str;
1497 },
1498 // get value type and convert value due to type, since all stored values are String
1499 restoreDataFromString: function(str) {
1500 var value = str,
1501 type,
1502 separatorStartIndex;
1503
1504 // @TODO: remove this line much later. Support of old format for options
1505 str = this.backCompatibility(str);
1506
1507 if(typeof str === 'string') {
1508 separatorStartIndex = str.indexOf(this.separator);
1509 type = str.substring(0, separatorStartIndex);
1510 value = str.substring(separatorStartIndex + this.separator.length);
1511
1512 switch(type) {
1513 case 'boolean':
1514 value = value === 'true';
1515 break;
1516 case 'number':
1517 value = parseFloat(value);
1518 break;
1519 // we assume that we will store string values only, due to performance
1520 case 'array':
1521 value = value === '' ? [] : value.split(',');
1522 break;
1523 case 'null':
1524 value = null;
1525 break;
1526 case 'undefined':
1527 value = undefined;
1528 break;
1529 }
1530 }
1531 return value;
1532 },
1533 // old data type support
1534 // here we trying to convert data from old format into new
1535 // @TODO: remove this function much later
1536 backCompatibility: function(str) {
1537 var convertedStr = str,
1538 value,
1539 separatorStartIndex;
1540
1541 if(typeof str === 'string') {
1542 separatorStartIndex = str.indexOf(this.separator);
1543 // is it old format?
1544 if(separatorStartIndex < 0) {
1545 // try to get number from string
1546 value = parseFloat(str);
1547 // is it not a number?
1548 if(isNaN(value)) {
1549 // yes, this is not a number. Lets check is this is an array "[comma,separated,values]"
1550 if((str[0] === '[') && (str[str.length - 1] === ']')) {
1551 // this is an array. Lets remove brackets symbols and extract the words
1552 str = str.replace('[', '');
1553 str = str.replace(']', '');
1554 if(str === '') {
1555 value = [];
1556 } else {
1557 value = str.split(',');
1558 }
1559 // value = str === '[]' ? [] : str.split(',');
1560 } else if(str === 'true' || str === 'false') {
1561 // this is boolean value
1562 value = str === 'true';
1563 } else {
1564 // this is string
1565 value = str;
1566 }
1567 }
1568
1569 convertedStr = this.convertDataToString(value);
1570 }
1571 }
1572
1573 return convertedStr;
1574 }
1575 };
1576
1577 var LocalStorage = {
1578
1579 get: function( key ) {
1580 var value = DataTypeManager.restoreDataFromString( window.localStorage.getItem(key) );
1581 return value;
1582 },
1583
1584 set: function( key, value ) {
1585 var _value = DataTypeManager.convertDataToString( value );
1586 window.localStorage.setItem( key, _value );
1587 },
1588
1589 del: function( key ) {
1590 window.localStorage.removeItem( key );
1591 },
1592
1593 clear: function() {
1594 window.localStorage.clear();
1595 }
1596 };
1597
1598 var CookiesStorage = {
1599
1600 expiration: (function() {
1601 return 60 * 60 * 24 * 366;
1602 }()),
1603
1604 get: function(key) {
1605 var value = DataTypeManager.restoreDataFromString(this.getCookie(key));
1606 return value;
1607 },
1608
1609 set: function(key, value) {
1610 var _value = DataTypeManager.convertDataToString(value);
1611 this.setCookie(key, _value, {expires: this.expiration});
1612 },
1613
1614 del: function(key) {
1615 this.deleteCookie(key);
1616 },
1617
1618 getCookie: function(name) {
1619 var matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"));
1620 return matches ? decodeURIComponent(matches[1]) : undefined;
1621 },
1622
1623 setCookie: function(name, value, props) {
1624 props = props || {};
1625 var exp = props.expires;
1626
1627 if (typeof exp === "number" && exp) {
1628 var d = new Date();
1629
1630 d.setTime(d.getTime() + exp * 1000);
1631 exp = props.expires = d;
1632 }
1633
1634 if(exp && exp.toUTCString) {
1635 props.expires = exp.toUTCString();
1636 }
1637
1638 value = encodeURIComponent(value);
1639 var updatedCookie = name + "=" + value;
1640
1641 for(var propName in props) {
1642 var propValue = props[propName];
1643
1644 updatedCookie += "; " + propName;
1645
1646 if(propValue !== true) {
1647 updatedCookie += "=" + propValue;
1648 }
1649 }
1650
1651 document.cookie = updatedCookie;
1652 },
1653
1654 deleteCookie: function(name) {
1655 this.setCookie(name, null, {expires: -1});
1656 },
1657
1658 // delete all cookies
1659 clear: function() {
1660 var cookies = document.cookie.split(";");
1661
1662 for (var i = 0; i < cookies.length; i++) {
1663 var cookie = cookies[i];
1664 var eqPos = cookie.indexOf("=");
1665 var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
1666
1667 this.deleteCookie(name);
1668 }
1669 }
1670 };
1671
1672 var strategy = window.localStorage ? LocalStorage : CookiesStorage;
1673
1674 var DataStorage = {
1675 // Get data within storage for key
1676 getData: function( key ) {
1677 return strategy.get( key );
1678 },
1679
1680 // Set data within storage
1681 setData: function( key, value ) {
1682 strategy.set( key, value );
1683 },
1684
1685 // Delete data within storage for key
1686 deleteData: function( key ) {
1687 strategy.del( key );
1688 },
1689
1690 // Clear storage
1691 clear: function() {
1692 strategy.clear();
1693 }
1694 };
1695
1696 // Static Module of Storage Data in the localStorage.
1697 object.DataStorage = DataStorage;
1698 }( editor.wsc ));
1699
1700 editor.wsc.operationWithUDN = function(command, UDName) {
1701 var obj = {
1702 'udn': UDName,
1703 'id': 'operationWithUDN',
1704 'udnCmd': command
1705 };
1706 var currentTabId = NS.dialog._.currentTabId,
1707 frameId = NS.iframeNumber + '_' + currentTabId;
1708
1709 appTools.postMessage.send({
1710 'message': obj,
1711 'target': NS.targetFromFrame[frameId]
1712 });
1713 };
1714 editor.wsc.getLocalStorageUDN = function() {
1715 var udn = editor.wsc.DataStorage.getData('scayt_user_dictionary_name');
1716
1717 if (!udn) {
1718 return;
1719 }
1720
1721 return udn;
1722 };
1723 editor.wsc.getLocalStorageUD = function() {
1724 var ud = editor.wsc.DataStorage.getData('scayt_user_dictionary');
1725
1726 if (!ud) {
1727 return;
1728 }
1729
1730 return ud;
1731 };
1732 editor.wsc.addWords = function(words, callback) {
1733 var url = editor.config.wsc.DefaultParams.serviceHost + editor.config.wsc.DefaultParams.ssrvHost +
1734 '?cmd=dictionary&format=json&' +
1735 'customerid=1%3AncttD3-fIoSf2-huzwE4-Y5muI2-mD0Tt-kG9Wz-UEDFC-tYu243-1Uq474-d9Z2l3&' +
1736 'action=addword&word='+ words + '&callback=toString&synchronization=true',
1737 script = document.createElement('script');
1738
1739 script['type'] = 'text/javascript';
1740 script['src'] = url;
1741 document.getElementsByTagName("head")[0].appendChild(script);
1742
1743 //chrome, firefox, safari
1744 script.onload = callback;
1745
1746 //IE
1747 script.onreadystatechange = function() {
1748 if (this.readyState === 'loaded') {
1749 callback();
1750 }
1751 };
1752 };
1753 editor.wsc.cgiOrigin = function() {
1754 var wscServiceHostString = editor.config.wsc.DefaultParams.serviceHost,
1755 wscServiceHostArray = wscServiceHostString.split('/'),
1756 cgiOrigin = wscServiceHostArray[0] + '//' + wscServiceHostArray[2];
1757
1758 return cgiOrigin;
1759 };
1760 editor.wsc.isSsrvSame = false;
1761 }
1762
1763 return {
1764 title: editor.config.wsc_dialogTitle || editor.lang.wsc.title,
1765 minWidth: constraints.minWidth,
1766 minHeight: constraints.minHeight,
1767 buttons: [CKEDITOR.dialog.cancelButton],
1768 onLoad: function() {
1769 NS.dialog = this;
1770 hideThesaurusTab();
1771 hideGrammTab();
1772 showSpellTab();
1773
1774 //creating wsc object for UD synchronization between wsc and scayt
1775 if (editor.plugins.scayt) {
1776 createWscObjectForUdAndUdnSyncrhonization();
1777 }
1778 },
1779 onShow: function() {
1780 NS.dialog = this;
1781
1782 editor.lockSelection(editor.getSelection());
1783
1784 NS.TextAreaNumber = 'cke_textarea_' + editor.name;
1785 appTools.postMessage.init(handlerIncomingData);
1786 NS.dataTemp = editor.getData();
1787 //NS.div_overlay.setDisable();
1788 NS.OverlayPlace = NS.dialog.parts.tabs.getParent().$;
1789 if(CKEDITOR && CKEDITOR.config){
1790 NS.wsc_customerId = editor.config.wsc_customerId;
1791 NS.cust_dic_ids = editor.config.wsc_customDictionaryIds;
1792 NS.userDictionaryName = editor.config.wsc_userDictionaryName;
1793 NS.defaultLanguage = CKEDITOR.config.defaultLanguage;
1794 var protocol = document.location.protocol == "file:" ? "http:" : document.location.protocol;
1795 var wscCoreUrl = editor.config.wsc_customLoaderScript || ( protocol + '//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid=' + NS.wsc_customerId + '&cmd=script&doc=wsc&schema=22');
1796 } else {
1797 NS.dialog.hide();
1798 return;
1799 }
1800
1801 initView(this);
1802
1803 CKEDITOR.scriptLoader.load(wscCoreUrl, function(success) {
1804 if(CKEDITOR.config && CKEDITOR.config.wsc && CKEDITOR.config.wsc.DefaultParams){
1805 NS.serverLocationHash = CKEDITOR.config.wsc.DefaultParams.serviceHost;
1806 NS.logotype = CKEDITOR.config.wsc.DefaultParams.logoPath;
1807 NS.loadIcon = CKEDITOR.config.wsc.DefaultParams.iconPath;
1808 NS.loadIconEmptyEditor = CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor;
1809 NS.LangComparer = new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare();
1810 }else{
1811 NS.serverLocationHash = DefaultParams.serviceHost;
1812 NS.logotype = DefaultParams.logoPath;
1813 NS.loadIcon = DefaultParams.iconPath;
1814 NS.loadIconEmptyEditor = DefaultParams.iconPathEmptyEditor;
1815 NS.LangComparer = new _SP_FCK_LangCompare();
1816 }
1817
1818 NS.pluginPath = CKEDITOR.getUrl(editor.plugins.wsc.path);
1819 NS.iframeNumber = NS.TextAreaNumber;
1820 NS.templatePath = NS.pluginPath + 'dialogs/tmp.html';
1821 NS.LangComparer.setDefaulLangCode( NS.defaultLanguage );
1822 NS.currentLang = editor.config.wsc_lang || NS.LangComparer.getSPLangCode( editor.langCode ) || 'en_US';
1823 NS.selectingLang = NS.currentLang;
1824 NS.div_overlay = new overlayBlock({
1825 opacity: "1",
1826 background: "#fff url(" + NS.loadIcon + ") no-repeat 50% 50%",
1827 target: NS.OverlayPlace
1828
1829 });
1830
1831 var number_ck = NS.dialog.parts.tabs.getId(),
1832 dialogPartsTab = CKEDITOR.document.getById(number_ck);
1833
1834 dialogPartsTab.setStyle('width', '97%');
1835 if (!dialogPartsTab.getElementsByTag('DIV').count()){
1836 dialogPartsTab.append(NS.buildSelectLang(NS.dialog.getParentEditor().name));
1837 }
1838
1839 NS.div_overlay_no_check = new overlayBlock({
1840 opacity: "1",
1841 id: 'no_check_over',
1842 background: "#fff url(" + NS.loadIconEmptyEditor + ") no-repeat 50% 50%",
1843 target: NS.OverlayPlace
1844 });
1845
1846 if (success) {
1847 showFirstTab(NS.dialog);
1848 NS.dialog.setupContent(NS.dialog);
1849 }
1850
1851 if (editor.plugins.scayt) {
1852 //is ssrv.cgi path for WSC and scayt same
1853 editor.wsc.isSsrvSame = (function() {
1854 var wscSsrvWholePath,
1855 wscServiceHost = CKEDITOR.config.wsc.DefaultParams.serviceHost.replace('lf/22/js/../../../', '').split('//')[1],
1856 wscSsrvHost = CKEDITOR.config.wsc.DefaultParams.ssrvHost,
1857 scaytSsrvWholePath,
1858 scaytSsrvProtocol,
1859 scaytSsrvHost,
1860 scaytSsrvPath,
1861
1862 scaytSrcUrl = editor.config.scayt_srcUrl,
1863 scaytSsrvSrcUrlSsrvProtocol,
1864 scaytSsrvSrcUrlSsrvHost,
1865 scaytSsrvSrcUrlSsrvPath,
1866
1867 scaytBasePath,
1868 scaytBasePathSsrvProtocol,
1869 scaytBasePathSsrvHost,
1870 scaytBasePathSsrvPath;
1871
1872 if (window.SCAYT && window.SCAYT.CKSCAYT) {
1873 scaytBasePath = SCAYT.CKSCAYT.prototype.basePath;
1874 scaytBasePathSsrvProtocol = scaytBasePath.split('//')[0];
1875 scaytBasePathSsrvHost = scaytBasePath.split('//')[1].split('/')[0];
1876 scaytBasePathSsrvPath = scaytBasePath.split(scaytBasePathSsrvHost + '/')[1].replace('/lf/scayt3/ckscayt/', '') + '/script/ssrv.cgi';
1877 }
1878
1879 if (scaytSrcUrl && !scaytBasePath && !editor.config.scayt_servicePath) {
1880 scaytSsrvSrcUrlSsrvProtocol = scaytSrcUrl.split('//')[0];
1881 scaytSsrvSrcUrlSsrvHost = scaytSrcUrl.split('//')[1].split('/')[0];
1882 scaytSsrvSrcUrlSsrvPath = scaytSrcUrl.split(scaytSsrvSrcUrlSsrvHost + '/')[1].replace('/lf/scayt3/ckscayt/ckscayt.js', '') + '/script/ssrv.cgi';
1883 }
1884
1885 scaytSsrvProtocol = editor.config.scayt_serviceProtocol || scaytBasePathSsrvProtocol || scaytSsrvSrcUrlSsrvProtocol;
1886 scaytSsrvHost = editor.config.scayt_serviceHost || scaytBasePathSsrvHost || scaytSsrvSrcUrlSsrvHost;
1887 scaytSsrvPath = editor.config.scayt_servicePath || scaytBasePathSsrvPath || scaytSsrvSrcUrlSsrvPath;
1888
1889 wscSsrvWholePath = '//' + wscServiceHost + wscSsrvHost;
1890 scaytSsrvWholePath = '//' + scaytSsrvHost + '/' + scaytSsrvPath;
1891
1892 return wscSsrvWholePath === scaytSsrvWholePath;
1893 })();
1894 }
1895
1896 //wsc on scayt UserDictionary and UserDictionaryName synchronization
1897 if (window.SCAYT && editor.wsc && editor.wsc.isSsrvSame) {
1898 var cgiOrigin = editor.wsc.cgiOrigin();
1899 editor.wsc.syncIsDone = false;
1900
1901 var getUdOrUdn = function (e) {
1902 if (e.origin === cgiOrigin) {
1903 var data = JSON.parse(e.data);
1904
1905 if (data.ud && data.ud !== 'undefined') {
1906 editor.wsc.ud = data.ud;
1907 } else if (data.ud === 'undefined') {
1908 editor.wsc.ud = undefined;
1909 }
1910
1911 if (data.udn && data.udn !== 'undefined') {
1912 editor.wsc.udn = data.udn;
1913 } else if (data.udn === 'undefined') {
1914 editor.wsc.udn = undefined;
1915 }
1916
1917 if (!editor.wsc.syncIsDone) {
1918 udSynchronization(editor.wsc.ud);
1919 editor.wsc.syncIsDone = true;
1920 }
1921 }
1922 };
1923
1924 var udSynchronization = function(cookieUd) {
1925 var localStorageUdArray = editor.wsc.getLocalStorageUD(),
1926 newUd;
1927
1928 if (localStorageUdArray instanceof Array) {
1929 newUd = localStorageUdArray.toString();
1930 }
1931
1932 if (newUd !== undefined && newUd !== '') {
1933 setTimeout(function() {
1934 editor.wsc.addWords(newUd, function() {
1935 showFirstTab(NS.dialog);
1936 NS.dialog.setupContent(NS.dialog);
1937 });
1938 }, 400);
1939 }
1940 };
1941
1942 if (window.addEventListener){
1943 addEventListener("message", getUdOrUdn, false);
1944 } else {
1945 window.attachEvent("onmessage", getUdOrUdn);
1946 }
1947
1948 //wsc on scayt UserDictionaryName synchronization
1949 setTimeout(
1950 function() {
1951 var udn = editor.wsc.getLocalStorageUDN();
1952
1953 if (udn !== undefined) {
1954 editor.wsc.operationWithUDN('restore', udn);
1955 }
1956
1957 },
1958 500); //need to wait spell.js file to load
1959
1960 }
1961 });
1962
1963 },
1964 onHide: function() {
1965 var scaytPlugin = CKEDITOR.plugins.scayt,
1966 scaytInstance = editor.scayt;
1967
1968 editor.unlockSelection();
1969
1970 if(scaytPlugin && scaytInstance && scaytPlugin.state[editor.name]) {
1971 scaytInstance.setMarkupPaused(false);
1972 }
1973
1974 NS.dataTemp = '';
1975 NS.sessionid = '';
1976 appTools.postMessage.unbindHandler(handlerIncomingData);
1977
1978 //scayt on wsc UserDictionary and UserDictionaryName synchronization
1979 if (editor.plugins.scayt && editor.wsc && editor.wsc.isSsrvSame) {
1980 var wscUDN = editor.wsc.udn,
1981 wscUD = editor.wsc.ud,
1982 wscUDarray,
1983 i;
1984
1985 if (editor.scayt) { // if SCAYT active
1986 if (!wscUDN) {
1987 editor.wsc.DataStorage.setData('scayt_user_dictionary_name', '');
1988 editor.scayt.removeUserDictionary();
1989 } else {
1990 editor.wsc.DataStorage.setData('scayt_user_dictionary_name', wscUDN);
1991 editor.scayt.restoreUserDictionary(wscUDN);
1992 }
1993
1994 if (wscUD) {
1995 setTimeout(function() {
1996 wscUDarray = wscUD.split(',');
1997 for (i = 0; i < wscUDarray.length; i += 1) {
1998 editor.scayt.addWordToUserDictionary(wscUDarray[i]);
1999 }
2000 }, 200); //wait for 'removeUserDictionary' command response
2001 }
2002
2003 if (!wscUD) {
2004 editor.wsc.DataStorage.setData('scayt_user_dictionary', []);
2005 }
2006
2007 } else { //if SCAYT not active
2008
2009 if (!wscUDN) {
2010 editor.wsc.DataStorage.setData('scayt_user_dictionary_name', '');
2011 } else {
2012 editor.wsc.DataStorage.setData('scayt_user_dictionary_name', wscUDN);
2013 }
2014
2015 if (wscUD) {
2016 wscUDarray = wscUD.split(',');
2017 editor.wsc.DataStorage.setData('scayt_user_dictionary', wscUDarray);
2018 }
2019 }
2020 }
2021 },
2022 contents: [
2023 {
2024 id: 'SpellTab',
2025 label: 'SpellChecker',
2026 accessKey: 'S',
2027 elements: [
2028 {
2029 type: 'html',
2030 id: 'banner',
2031 label: 'banner',
2032 style: '', //TODO
2033 html: '<div></div>'
2034 },
2035 {
2036 type: 'html',
2037 id: 'Content',
2038 label: 'spellContent',
2039 html: '',
2040 setup: function(dialog) {
2041 var tabId = NS.iframeNumber + '_' + dialog._.currentTabId;
2042 var iframe = document.getElementById(tabId);
2043 NS.targetFromFrame[tabId] = iframe.contentWindow;
2044 }
2045 },
2046 {
2047 type: 'hbox',
2048 id: 'bottomGroup',
2049 style: 'width:560px; margin: 0 auto;',
2050 widths: ['50%', '50%'],
2051 children: [
2052 {
2053 type: 'hbox',
2054 id: 'leftCol',
2055 align: 'left',
2056 width: '50%',
2057 children: [
2058 {
2059 type: 'vbox',
2060 id: 'rightCol1',
2061 widths: ['50%', '50%'],
2062 children: [
2063 {
2064 type: 'text',
2065 id: 'ChangeTo_label',
2066 label: NS.LocalizationLabel['ChangeTo_label'].text + ':',
2067 labelLayout: 'horizontal',
2068 labelStyle: 'font: 12px/25px arial, sans-serif;',
2069 width: '140px',
2070 'default': '',
2071 onShow: function() {
2072 NS.textNode['SpellTab'] = this;
2073 NS.LocalizationLabel['ChangeTo_label'].instance = this;
2074 },
2075 onHide: function() {
2076 this.reset();
2077 }
2078 },
2079 {
2080 type: 'hbox',
2081 id: 'rightCol',
2082 align: 'right',
2083 width: '30%',
2084 children: [
2085 {
2086 type: 'vbox',
2087 id: 'rightCol_col__left',
2088 children: [
2089 {
2090 type: 'text',
2091 id: 'labelSuggestions',
2092 label: NS.LocalizationLabel['Suggestions'].text + ':',
2093 onShow: function() {
2094 NS.LocalizationLabel['Suggestions'].instance = this;
2095 this.getInputElement().setStyles({
2096 display: 'none'
2097 });
2098 }
2099 },
2100 {
2101 type: 'html',
2102 id: 'logo',
2103 html: '<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
2104 setup: function(dialog) {
2105 this.getElement().$.src = NS.logotype;
2106 this.getElement().getParent().setStyles({
2107 "text-align": "left"
2108 });
2109 }
2110 }
2111 ]
2112 },
2113 {
2114 type: 'select',
2115 id: 'list_of_suggestions',
2116 labelStyle: 'font: 12px/25px arial, sans-serif;',
2117 size: '6',
2118 inputStyle: 'width: 140px; height: auto;',
2119 items: [['loading...']],
2120 onShow: function() {
2121 selectNode = this;
2122 },
2123 onChange: function() {
2124 NS.textNode['SpellTab'].setValue(this.getValue());
2125 }
2126 }
2127 ]
2128 }
2129 ]
2130 }
2131 ]
2132 },
2133 {
2134 type: 'hbox',
2135 id: 'rightCol',
2136 align: 'right',
2137 width: '50%',
2138 children: [
2139 {
2140 type: 'vbox',
2141 id: 'rightCol_col__left',
2142 widths: ['50%', '50%', '50%', '50%'],
2143 children: [
2144 {
2145 type: 'button',
2146 id: 'ChangeTo_button',
2147 label: NS.LocalizationButton['ChangeTo_button'].text,
2148 title: 'Change to',
2149 style: 'width: 100%;',
2150 onLoad: function() {
2151 this.getElement().setAttribute("title-cmd", 'ChangeTo');
2152 NS.LocalizationButton['ChangeTo_button'].instance = this;
2153 },
2154 onClick: handlerButtons
2155 },
2156 {
2157 type: 'button',
2158 id: 'ChangeAll',
2159 label: NS.LocalizationButton['ChangeAll'].text,
2160 title: 'Change All',
2161 style: 'width: 100%;',
2162 onLoad: function() {
2163 this.getElement().setAttribute("title-cmd", this.id);
2164 NS.LocalizationButton['ChangeAll'].instance = this;
2165 },
2166 onClick: handlerButtons
2167 },
2168 {
2169 type: 'button',
2170 id: 'AddWord',
2171 label: NS.LocalizationButton['AddWord'].text,
2172 title: 'Add word',
2173 style: 'width: 100%;',
2174 onLoad: function() {
2175 this.getElement().setAttribute("title-cmd", this.id);
2176 NS.LocalizationButton['AddWord'].instance = this;
2177 },
2178 onClick: handlerButtons
2179 },
2180 {
2181 type: 'button',
2182 id: 'FinishChecking_button',
2183 label: NS.LocalizationButton['FinishChecking_button'].text,
2184 title: 'Finish Checking',
2185 style: 'width: 100%;margin-top: 9px;',
2186 onLoad: function() {
2187 this.getElement().setAttribute("title-cmd", 'FinishChecking');
2188 NS.LocalizationButton['FinishChecking_button'].instance = this;
2189 },
2190 onClick: handlerButtons
2191 }
2192 ]
2193 },
2194 {
2195 type: 'vbox',
2196 id: 'rightCol_col__right',
2197 widths: ['50%', '50%', '50%'],
2198 children: [
2199 {
2200 type: 'button',
2201 id: 'IgnoreWord',
2202 label: NS.LocalizationButton['IgnoreWord'].text,
2203 title: 'Ignore word',
2204 style: 'width: 100%;',
2205 onLoad: function() {
2206 this.getElement().setAttribute("title-cmd", this.id);
2207 NS.LocalizationButton['IgnoreWord'].instance = this;
2208 },
2209 onClick: handlerButtons
2210 },
2211 {
2212 type: 'button',
2213 id: 'IgnoreAllWords',
2214 label: NS.LocalizationButton['IgnoreAllWords'].text,
2215 title: 'Ignore all words',
2216 style: 'width: 100%;',
2217 onLoad: function() {
2218 this.getElement().setAttribute("title-cmd", this.id);
2219 NS.LocalizationButton['IgnoreAllWords'].instance = this;
2220 },
2221 onClick: handlerButtons
2222 },
2223 {
2224 type: 'button',
2225 id: 'Options',
2226 label: NS.LocalizationButton['Options'].text,
2227 title: 'Option',
2228 style: 'width: 100%;',
2229 onLoad: function() {
2230 NS.LocalizationButton['Options'].instance = this;
2231 if (document.location.protocol == "file:") {
2232 this.disable();
2233 }
2234 },
2235 onClick: function() {
2236 // because in chrome and safary document.activeElement returns <body> tag. We need to signal that clicked element is active
2237 this.getElement().focus();
2238
2239 if (document.location.protocol == "file:") {
2240 alert('WSC: Options functionality is disabled when runing from file system');
2241 } else {
2242 activeElement = document.activeElement;
2243 editor.openDialog('options');
2244 }
2245 }
2246 }
2247 ]
2248 }
2249 ]
2250 }
2251 ]
2252 },
2253 {
2254 type: 'hbox',
2255 id: 'BlockFinishChecking',
2256 style: 'width:560px; margin: 0 auto;',
2257 widths: ['70%', '30%'],
2258 onShow: function() {
2259 this.getElement().setStyles({
2260 display: 'block',
2261 position: 'absolute',
2262 left: '-9999px'
2263 });
2264 },
2265 onHide: showCurrentTabs,
2266 children: [
2267 {
2268 type: 'hbox',
2269 id: 'leftCol',
2270 align: 'left',
2271 width: '70%',
2272 children: [
2273 {
2274 type: 'vbox',
2275 id: 'rightCol1',
2276 setup: function() {
2277 this.getChild()[0].getElement().$.src = NS.logotype;
2278 this.getChild()[0].getElement().getParent().setStyles({
2279 "text-align": "center"
2280 });
2281 },
2282 children: [
2283 {
2284 type: 'html',
2285 id: 'logo',
2286 html: '<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">'
2287 }
2288 ]
2289 }
2290 ]
2291 },
2292 {
2293 type: 'hbox',
2294 id: 'rightCol',
2295 align: 'right',
2296 width: '30%',
2297 children: [
2298 {
2299 type: 'vbox',
2300 id: 'rightCol_col__left',
2301 children: [
2302 {
2303 type: 'button',
2304 id: 'Option_button',
2305 label: NS.LocalizationButton['Options'].text,
2306 title: 'Option',
2307 style: 'width: 100%;',
2308 onLoad: function() {
2309 this.getElement().setAttribute("title-cmd", this.id);
2310 if (document.location.protocol == "file:") {
2311 this.disable();
2312 }
2313 },
2314 onClick: function() {
2315 // because in chrome and safary document.activeElement returns <body> tag. We need to signal that clicked element is active
2316 this.getElement().focus();
2317
2318 if (document.location.protocol == "file:") {
2319 alert('WSC: Options functionality is disabled when runing from file system');
2320 } else {
2321 activeElement = document.activeElement;
2322 editor.openDialog('options');
2323 }
2324 }
2325 },
2326 {
2327 type: 'button',
2328 id: 'FinishChecking_button_block',
2329 label: NS.LocalizationButton['FinishChecking_button_block'].text,
2330 title: 'Finish Checking',
2331 style: 'width: 100%;',
2332 onLoad: function() {
2333 this.getElement().setAttribute("title-cmd", 'FinishChecking');
2334 },
2335 onClick: handlerButtons
2336 }
2337 ]
2338 }
2339 ]
2340 }
2341 ]
2342 }
2343 ]
2344 },
2345 {
2346 id: 'GrammTab',
2347 label: 'Grammar',
2348 accessKey: 'G',
2349 elements: [
2350 {
2351 type: 'html',
2352 id: 'banner',
2353 label: 'banner',
2354 style: '', //TODO
2355 html: '<div></div>'
2356 },
2357 {
2358 type: 'html',
2359 id: 'Content',
2360 label: 'GrammarContent',
2361 html: '',
2362 setup: function() {
2363 var tabId = NS.iframeNumber + '_' + NS.dialog._.currentTabId;
2364 var iframe = document.getElementById(tabId);
2365 NS.targetFromFrame[tabId] = iframe.contentWindow;
2366 }
2367 },
2368 {
2369 type: 'vbox',
2370 id: 'bottomGroup',
2371 style: 'width:560px; margin: 0 auto;',
2372 children: [
2373 {
2374 type: 'hbox',
2375 id: 'leftCol',
2376 widths: ['66%', '34%'],
2377 children: [
2378 {
2379 type: 'vbox',
2380 children: [
2381 {
2382 type: 'text',
2383 id: 'text',
2384 label: "Change to:",
2385 labelLayout: 'horizontal',
2386 labelStyle: 'font: 12px/25px arial, sans-serif;',
2387 inputStyle: 'float: right; width: 200px;',
2388 'default': '',
2389 onShow: function() {
2390 NS.textNode['GrammTab'] = this;
2391 },
2392 onHide: function() {
2393 this.reset();
2394 }
2395 },
2396 {
2397 type: 'html',
2398 id: 'html_text',
2399 html: "<div style='min-height: 17px; line-height: 17px; padding: 5px; text-align: left;background: #F1F1F1;color: #595959; white-space: normal!important;'></div>",
2400 onShow: function(e) {
2401 NS.textNodeInfo['GrammTab'] = this;
2402 }
2403 },
2404 {
2405 type: 'html',
2406 id: 'radio',
2407 html: "",
2408 onShow: function() {
2409 NS.grammerSuggest = this;
2410 }
2411 }
2412 ]
2413 },
2414 {
2415 type: 'vbox',
2416 children: [
2417 {
2418 type: 'button',
2419 id: 'ChangeTo_button',
2420 label: 'Change to',
2421 title: 'Change to',
2422 style: 'width: 133px; float: right;',
2423 onLoad: function() {
2424 this.getElement().setAttribute("title-cmd", 'ChangeTo');
2425 },
2426 onClick: handlerButtons
2427 },
2428 {
2429 type: 'button',
2430 id: 'IgnoreWord',
2431 label: 'Ignore word',
2432 title: 'Ignore word',
2433 style: 'width: 133px; float: right;',
2434 onLoad: function() {
2435 this.getElement().setAttribute("title-cmd", this.id);
2436 },
2437 onClick: handlerButtons
2438 },
2439 {
2440 type: 'button',
2441 id: 'IgnoreAllWords',
2442 label: 'Ignore Problem',
2443 title: 'Ignore Problem',
2444 style: 'width: 133px; float: right;',
2445 onLoad: function() {
2446 this.getElement().setAttribute("title-cmd", this.id);
2447 },
2448 onClick: handlerButtons
2449 },
2450 {
2451 type: 'button',
2452 id: 'FinishChecking_button',
2453 label: NS.LocalizationButton['FinishChecking_button'].text,
2454 title: 'Finish Checking',
2455 style: 'width: 133px; float: right; margin-top: 9px;',
2456 onLoad: function() {
2457 this.getElement().setAttribute("title-cmd", 'FinishChecking');
2458 },
2459 onClick: handlerButtons
2460 }
2461 ]
2462 }
2463 ]
2464 }
2465 ]
2466 },
2467 {
2468 type: 'hbox',
2469 id: 'BlockFinishChecking',
2470 style: 'width:560px; margin: 0 auto;',
2471 widths: ['70%', '30%'],
2472 onShow: function() {
2473 this.getElement().setStyles({
2474 display: 'block',
2475 position: 'absolute',
2476 left: '-9999px'
2477 });
2478 },
2479 onHide: showCurrentTabs,
2480 children: [
2481 {
2482 type: 'hbox',
2483 id: 'leftCol',
2484 align: 'left',
2485 width: '70%',
2486 children: [
2487 {
2488 type: 'vbox',
2489 id: 'rightCol1',
2490 children: [
2491 {
2492 type: 'html',
2493 id: 'logo',
2494 html: '<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
2495 setup: function() {
2496 this.getElement().$.src = NS.logotype;
2497 this.getElement().getParent().setStyles({
2498 "text-align": "center"
2499 });
2500 }
2501 }
2502 ]
2503 }
2504 ]
2505 },
2506 {
2507 type: 'hbox',
2508 id: 'rightCol',
2509 align: 'right',
2510 width: '30%',
2511 children: [
2512 {
2513 type: 'vbox',
2514 id: 'rightCol_col__left',
2515 children: [
2516 {
2517 type: 'button',
2518 id: 'FinishChecking_button_block',
2519 label: NS.LocalizationButton['FinishChecking_button_block'].text,
2520 title: 'Finish Checking',
2521 style: 'width: 100%;',
2522 onLoad: function() {
2523 this.getElement().setAttribute("title-cmd", 'FinishChecking');
2524 },
2525 onClick: handlerButtons
2526 }
2527 ]
2528 }
2529 ]
2530 }
2531 ]
2532 }
2533 ]
2534 },
2535 {
2536 id: 'Thesaurus',
2537 label: 'Thesaurus',
2538 accessKey: 'T',
2539 elements: [
2540 {
2541 type: 'html',
2542 id: 'banner',
2543 label: 'banner',
2544 style: '', //TODO
2545 html: '<div></div>'
2546 },
2547 {
2548 type: 'html',
2549 id: 'Content',
2550 label: 'spellContent',
2551 html: '',
2552 setup: function() {
2553 var tabId = NS.iframeNumber + '_' + NS.dialog._.currentTabId;
2554 var iframe = document.getElementById(tabId);
2555 NS.targetFromFrame[tabId] = iframe.contentWindow;
2556 }
2557 },
2558 {
2559 type: 'vbox',
2560 id: 'bottomGroup',
2561 style: 'width:560px; margin: -10px auto; overflow: hidden;',
2562 children: [
2563 {
2564 type: 'hbox',
2565 widths: ['75%', '25%'],
2566 children: [
2567 {
2568 type: 'vbox',
2569 children: [
2570 {
2571 type: 'hbox',
2572 widths: ['65%', '35%'],
2573 children: [
2574 {
2575 type: 'text',
2576 id: 'ChangeTo_label',
2577 label: NS.LocalizationLabel['ChangeTo_label'].text + ':',
2578 labelLayout: 'horizontal',
2579 inputStyle: 'width: 160px;',
2580 labelStyle: 'font: 12px/25px arial, sans-serif;',
2581 'default': '',
2582 onShow: function(e) {
2583 NS.textNode['Thesaurus'] = this;
2584 NS.LocalizationLabel['ChangeTo_label'].instance = this;
2585 },
2586 onHide: function() {
2587 this.reset();
2588 }
2589 },
2590 {
2591 type: 'button',
2592 id: 'ChangeTo_button',
2593 label: NS.LocalizationButton['ChangeTo_button'].text,
2594 title: 'Change to',
2595 style: 'width: 121px; margin-top: 1px;',
2596 onLoad: function() {
2597 this.getElement().setAttribute("title-cmd", 'ChangeTo');
2598 NS.LocalizationButton['ChangeTo_button'].instance = this;
2599 },
2600 onClick: handlerButtons
2601 }
2602 ]
2603 },
2604 {
2605 type: 'hbox',
2606 children: [
2607 {
2608 type: 'select',
2609 id: 'Categories',
2610 label: NS.LocalizationLabel['Categories'].text + ':',
2611 labelStyle: 'font: 12px/25px arial, sans-serif;',
2612 size: '5',
2613 inputStyle: 'width: 180px; height: auto;',
2614 items: [],
2615 onShow: function() {
2616 NS.selectNode['Categories'] = this;
2617 NS.LocalizationLabel['Categories'].instance = this;
2618 },
2619 onChange: function() {
2620 NS.buildOptionSynonyms(this.getValue());
2621 }
2622 },
2623 {
2624 type: 'select',
2625 id: 'Synonyms',
2626 label: NS.LocalizationLabel['Synonyms'].text + ':',
2627 labelStyle: 'font: 12px/25px arial, sans-serif;',
2628 size: '5',
2629 inputStyle: 'width: 180px; height: auto;',
2630 items: [],
2631 onShow: function() {
2632 NS.selectNode['Synonyms'] = this;
2633 NS.textNode['Thesaurus'].setValue(this.getValue());
2634 NS.LocalizationLabel['Synonyms'].instance = this;
2635 },
2636 onChange: function(e) {
2637 NS.textNode['Thesaurus'].setValue(this.getValue());
2638 }
2639 }
2640 ]
2641 }
2642 ]
2643 },
2644 {
2645 type: 'vbox',
2646 width: '120px',
2647 style: "margin-top:46px;",
2648 children: [
2649 {
2650 type: 'html',
2651 id: 'logotype',
2652 label: 'WebSpellChecker.net',
2653 html: '<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
2654 setup: function() {
2655 this.getElement().$.src = NS.logotype;
2656 this.getElement().getParent().setStyles({
2657 "text-align": "center"
2658 });
2659 }
2660 },
2661 {
2662 type: 'button',
2663 id: 'FinishChecking_button',
2664 label: NS.LocalizationButton['FinishChecking_button'].text,
2665 title: 'Finish Checking',
2666 style: 'width: 100%; float: right; margin-top: 9px;',
2667 onLoad: function() {
2668 this.getElement().setAttribute("title-cmd", 'FinishChecking');
2669 },
2670 onClick: handlerButtons
2671 }
2672 ]
2673 }
2674 ]
2675 }
2676 ]
2677 },
2678 {
2679 type: 'hbox',
2680 id: 'BlockFinishChecking',
2681 style: 'width:560px; margin: 0 auto;',
2682 widths: ['70%', '30%'],
2683 onShow: function() {
2684 this.getElement().setStyles({
2685 display: 'block',
2686 position: 'absolute',
2687 left: '-9999px'
2688 });
2689 },
2690 children: [
2691 {
2692 type: 'hbox',
2693 id: 'leftCol',
2694 align: 'left',
2695 width: '70%',
2696 children: [
2697 {
2698 type: 'vbox',
2699 id: 'rightCol1',
2700 children: [
2701 {
2702 type: 'html',
2703 id: 'logo',
2704 html: '<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
2705 setup: function() {
2706 this.getElement().$.src = NS.logotype;
2707 this.getElement().getParent().setStyles({
2708 "text-align": "center"
2709 });
2710 }
2711 }
2712 ]
2713 }
2714 ]
2715 },
2716 {
2717 type: 'hbox',
2718 id: 'rightCol',
2719 align: 'right',
2720 width: '30%',
2721 children: [
2722 {
2723 type: 'vbox',
2724 id: 'rightCol_col__left',
2725 children: [
2726 {
2727 type: 'button',
2728 id: 'FinishChecking_button_block',
2729 label: NS.LocalizationButton['FinishChecking_button_block'].text,
2730 title: 'Finish Checking',
2731 style: 'width: 100%;',
2732 onLoad: function() {
2733 this.getElement().setAttribute("title-cmd", 'FinishChecking');
2734 },
2735 onClick: handlerButtons
2736 }
2737 ]
2738 }
2739 ]
2740 }
2741 ]
2742 }
2743 ]
2744 }
2745 ]
2746 };
2747});
2748
2749var activeElement = null;
2750
2751// Options dialog
2752CKEDITOR.dialog.add('options', function(editor) {
2753 var dialog = null;
2754 var linkOnCheckbox = {};
2755 var checkboxState = {};
2756 var ospString = null;
2757 var OptionsTextError = null;
2758 var cmd = null;
2759
2760 var set_osp = [];
2761 var dictionaryState = {
2762 'udn': appTools.cookie.get('udn'),
2763 'osp': appTools.cookie.get('osp')
2764 };
2765
2766 var setHandlerOptions = function() {
2767 var osp = appTools.cookie.get('osp'),
2768 strToArr = osp.split("");
2769
2770 checkboxState['IgnoreAllCapsWords'] = strToArr[0];
2771 checkboxState['IgnoreWordsNumbers'] = strToArr[1];
2772 checkboxState['IgnoreMixedCaseWords'] = strToArr[2];
2773 checkboxState['IgnoreDomainNames'] = strToArr[3];
2774 };
2775
2776 var sendDicOptions = function(event) {
2777 event = event || window.event;
2778 cmd = this.getElement().getAttribute("title-cmd");
2779 var osp = [];
2780
2781 osp[0] = checkboxState['IgnoreAllCapsWords'];
2782 osp[1] = checkboxState['IgnoreWordsNumbers'];
2783 osp[2] = checkboxState['IgnoreMixedCaseWords'];
2784 osp[3] = checkboxState['IgnoreDomainNames'];
2785
2786 osp = osp.toString().replace(/,/g, "");
2787
2788
2789 appTools.cookie.set('osp', osp);
2790 appTools.cookie.set('udnCmd', cmd ? cmd : 'ignore');
2791 if (cmd == "delete") {
2792
2793 appTools.postMessage.send({
2794 'id': 'options_dic_send'
2795 });
2796 } else {
2797 var udn = '';
2798 if(nameNode.getValue() !== ''){
2799 udn = nameNode.getValue();
2800 }
2801 appTools.cookie.set('udn', udn);
2802 appTools.postMessage.send({
2803 'id': 'options_dic_send'
2804 });
2805 }
2806
2807 };
2808
2809
2810 var sendAllOptions = function() {
2811 var osp = [];
2812
2813 osp[0] = checkboxState['IgnoreAllCapsWords'];
2814 osp[1] = checkboxState['IgnoreWordsNumbers'];
2815 osp[2] = checkboxState['IgnoreMixedCaseWords'];
2816 osp[3] = checkboxState['IgnoreDomainNames'];
2817
2818 osp = osp.toString().replace(/,/g, "");
2819
2820 appTools.cookie.set('osp', osp);
2821
2822 appTools.postMessage.send({
2823 'id': 'options_checkbox_send'
2824 });
2825
2826
2827 };
2828
2829 var cameOptions = function() {
2830 OptionsTextError.getElement().setHtml(NS.LocalizationComing['error']);
2831 OptionsTextError.getElement().show();
2832 };
2833
2834 return {
2835 title: NS.LocalizationComing['Options'],
2836 minWidth: 430,
2837 minHeight: 130,
2838 resizable: CKEDITOR.DIALOG_RESIZE_NONE,
2839 contents: [
2840 {
2841 id: 'OptionsTab',
2842 label: 'Options',
2843 accessKey: 'O',
2844 elements: [
2845 {
2846 type: 'hbox',
2847 id: 'options_error',
2848 children: [
2849 {
2850 type: 'html',
2851 style: "display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red",
2852 html: '<div></div>',
2853 onShow: function() {
2854 OptionsTextError = this;
2855 }
2856 }
2857 ]
2858 },
2859 {
2860 type: 'vbox',
2861 id: 'Options_content',
2862 children: [
2863 {
2864 type: 'hbox',
2865 id: 'Options_manager',
2866 widths: ['52%', '48%'],
2867 children: [
2868 {
2869 type: 'fieldset',
2870 label: 'Spell Checking Options',
2871 style: 'border: none;margin-top: 13px;padding: 10px 0 10px 10px',
2872 onShow: function() {
2873 this.getInputElement().$.children[0].innerHTML = NS.LocalizationComing['SpellCheckingOptions'];
2874 },
2875 children: [
2876 {
2877 type: 'vbox',
2878 id: 'Options_checkbox',
2879 children: [
2880 {
2881 type: 'checkbox',
2882 id: 'IgnoreAllCapsWords',
2883 label: 'Ignore All-Caps Words',
2884 labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;',
2885 style: "float:left; min-height: 16px;",
2886 'default': '',
2887 onClick: function() {
2888 checkboxState[this.id] = (!this.getValue()) ? 0 : 1;
2889 }
2890 },
2891 {
2892 type: 'checkbox',
2893 id: 'IgnoreWordsNumbers',
2894 label: 'Ignore Words with Numbers',
2895 labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;',
2896 style: "float:left; min-height: 16px;",
2897 'default': '',
2898 onClick: function() {
2899 checkboxState[this.id] = (!this.getValue()) ? 0 : 1;
2900 }
2901 },
2902 {
2903 type: 'checkbox',
2904 id: 'IgnoreMixedCaseWords',
2905 label: 'Ignore Mixed-Case Words',
2906 labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;',
2907 style: "float:left; min-height: 16px;",
2908 'default': '',
2909 onClick: function() {
2910 checkboxState[this.id] = (!this.getValue()) ? 0 : 1;
2911 }
2912 },
2913 {
2914 type: 'checkbox',
2915 id: 'IgnoreDomainNames',
2916 label: 'Ignore Domain Names',
2917 labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;',
2918 style: "float:left; min-height: 16px;",
2919 'default': '',
2920 onClick: function() {
2921 checkboxState[this.id] = (!this.getValue()) ? 0 : 1;
2922 }
2923 }
2924 ]
2925 }
2926 ]
2927 },
2928 {
2929 type: 'vbox',
2930 id: 'Options_DictionaryName',
2931 children: [
2932 {
2933 type: 'text',
2934 id: 'DictionaryName',
2935 style: 'margin-bottom: 10px',
2936 label: 'Dictionary Name:',
2937 labelLayout: 'vertical',
2938 labelStyle: 'font: 12px/25px arial, sans-serif;',
2939 'default': '',
2940 onLoad: function() {
2941 nameNode = this;
2942 var udn = NS.userDictionaryName ? NS.userDictionaryName : appTools.cookie.get('udn') && undefined ? ' ' : this.getValue();
2943 this.setValue(udn);
2944 },
2945 onShow: function() {
2946 nameNode = this;
2947 var udn = !appTools.cookie.get('udn') ? this.getValue() : appTools.cookie.get('udn');
2948 this.setValue(udn);
2949 this.setLabel(NS.LocalizationComing['DictionaryName']);
2950 },
2951 onHide: function() {
2952 this.reset();
2953 }
2954 },
2955 {
2956 type: 'hbox',
2957 id: 'Options_buttons',
2958 children: [
2959 {
2960 type: 'vbox',
2961 id: 'Options_leftCol_col',
2962 widths: ['50%', '50%'],
2963 children: [
2964 {
2965 type: 'button',
2966 id: 'create',
2967 label: 'Create',
2968 title: 'Create',
2969 style: 'width: 100%;',
2970 onLoad: function() {
2971 this.getElement().setAttribute("title-cmd", this.id);
2972 },
2973 onShow: function() {
2974 var el = this.getElement().getFirst() || this.getElement();
2975
2976 el.setText(NS.LocalizationComing['Create']);
2977 },
2978 onClick: sendDicOptions
2979 },
2980 {
2981 type: 'button',
2982 id: 'restore',
2983 label: 'Restore',
2984 title: 'Restore',
2985 style: 'width: 100%;',
2986 onLoad: function() {
2987 this.getElement().setAttribute("title-cmd", this.id);
2988 },
2989 onShow: function() {
2990 var el = this.getElement().getFirst() || this.getElement();
2991
2992 el.setText(NS.LocalizationComing['Restore']);
2993 },
2994 onClick: sendDicOptions
2995 }
2996 ]
2997 },
2998 {
2999 type: 'vbox',
3000 id: 'Options_rightCol_col',
3001 widths: ['50%', '50%'],
3002 children: [
3003 {
3004 type: 'button',
3005 id: 'rename',
3006 label: 'Rename',
3007 title: 'Rename',
3008 style: 'width: 100%;',
3009 onLoad: function() {
3010 this.getElement().setAttribute("title-cmd", this.id);
3011 },
3012 onShow: function() {
3013 var el = this.getElement().getFirst() || this.getElement();
3014
3015 el.setText(NS.LocalizationComing['Rename']);
3016 },
3017 onClick: sendDicOptions
3018 },
3019 {
3020 type: 'button',
3021 id: 'delete',
3022 label: 'Remove',
3023 title: 'Remove',
3024 style: 'width: 100%;',
3025 onLoad: function() {
3026 this.getElement().setAttribute("title-cmd", this.id);
3027 },
3028 onShow: function() {
3029 var el = this.getElement().getFirst() || this.getElement();
3030
3031 el.setText(NS.LocalizationComing['Remove']);
3032 },
3033 onClick: sendDicOptions
3034 }
3035 ]
3036 }
3037 ]
3038 }
3039 ]
3040 }
3041 ]
3042 },
3043 {
3044 type: 'hbox',
3045 id: 'Options_text',
3046 children: [
3047 {
3048 type: 'html',
3049 style: "text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",
3050 html: "<div>" + NS.LocalizationComing['OptionsTextIntro'] + "</div>",
3051 onShow: function() {
3052 this.getElement().setText(NS.LocalizationComing['OptionsTextIntro']);
3053 }
3054 }
3055 ]
3056 }
3057 ]
3058 }
3059 ]
3060}
3061],
3062 buttons: [CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton],
3063 onOk: function() {
3064 sendAllOptions();
3065 OptionsTextError.getElement().hide();
3066 OptionsTextError.getElement().setHtml(' ');
3067 },
3068 onLoad: function() {
3069 dialog = this;
3070 // appTools.postMessage.init(cameOptions);
3071
3072 linkOnCheckbox['IgnoreAllCapsWords'] = dialog.getContentElement('OptionsTab', 'IgnoreAllCapsWords');
3073 linkOnCheckbox['IgnoreWordsNumbers'] = dialog.getContentElement('OptionsTab', 'IgnoreWordsNumbers');
3074 linkOnCheckbox['IgnoreMixedCaseWords'] = dialog.getContentElement('OptionsTab', 'IgnoreMixedCaseWords');
3075 linkOnCheckbox['IgnoreDomainNames'] = dialog.getContentElement('OptionsTab', 'IgnoreDomainNames');
3076
3077 },
3078 onShow: function() {
3079 appTools.postMessage.init(cameOptions);
3080 setHandlerOptions();
3081
3082 (!parseInt(checkboxState['IgnoreAllCapsWords'], 10)) ? linkOnCheckbox['IgnoreAllCapsWords'].setValue('', false) : linkOnCheckbox['IgnoreAllCapsWords'].setValue('checked', false);
3083 (!parseInt(checkboxState['IgnoreWordsNumbers'], 10)) ? linkOnCheckbox['IgnoreWordsNumbers'].setValue('', false) : linkOnCheckbox['IgnoreWordsNumbers'].setValue('checked', false);
3084 (!parseInt(checkboxState['IgnoreMixedCaseWords'], 10)) ? linkOnCheckbox['IgnoreMixedCaseWords'].setValue('', false) : linkOnCheckbox['IgnoreMixedCaseWords'].setValue('checked', false);
3085 (!parseInt(checkboxState['IgnoreDomainNames'], 10)) ? linkOnCheckbox['IgnoreDomainNames'].setValue('', false) : linkOnCheckbox['IgnoreDomainNames'].setValue('checked', false);
3086
3087 checkboxState['IgnoreAllCapsWords'] = (!linkOnCheckbox['IgnoreAllCapsWords'].getValue()) ? 0 : 1;
3088 checkboxState['IgnoreWordsNumbers'] = (!linkOnCheckbox['IgnoreWordsNumbers'].getValue()) ? 0 : 1;
3089 checkboxState['IgnoreMixedCaseWords'] = (!linkOnCheckbox['IgnoreMixedCaseWords'].getValue()) ? 0 : 1;
3090 checkboxState['IgnoreDomainNames'] = (!linkOnCheckbox['IgnoreDomainNames'].getValue()) ? 0 : 1;
3091
3092 linkOnCheckbox['IgnoreAllCapsWords'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreAllCapsWords'];
3093 linkOnCheckbox['IgnoreWordsNumbers'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreWordsWithNumbers'];
3094 linkOnCheckbox['IgnoreMixedCaseWords'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreMixedCaseWords'];
3095 linkOnCheckbox['IgnoreDomainNames'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreDomainNames'];
3096 },
3097 onHide: function() {
3098 appTools.postMessage.unbindHandler(cameOptions);
3099 if(activeElement) {
3100 try {
3101 activeElement.focus();
3102 } catch(e) {}
3103 }
3104 }
3105 };
3106});
3107
3108// Expand the spell-check frame when dialog resized. (#6829)
3109CKEDITOR.dialog.on( 'resize', function( evt ) {
3110 var data = evt.data,
3111 dialog = data.dialog,
3112 currentTabId = dialog._.currentTabId,
3113 tabID = NS.iframeNumber + '_' + currentTabId,
3114 iframe = CKEDITOR.document.getById(tabID);
3115
3116 if ( dialog._.name == 'checkspell' ) {
3117 if (NS.bnr) {
3118 iframe && iframe.setSize( 'height', data.height - '310' );
3119 } else {
3120 iframe && iframe.setSize( 'height', data.height - '220' );
3121 }
3122
3123 // add flag that indicate whether dialog has been resized by user
3124 if(dialog._.fromResizeEvent && !dialog._.resized) {
3125 dialog._.resized = true;
3126 }
3127 dialog._.fromResizeEvent = true;
3128 }
3129});
3130
3131CKEDITOR.on('dialogDefinition', function(dialogDefinitionEvent) {
3132
3133 if(dialogDefinitionEvent.data.name === 'checkspell') {
3134 var dialogDefinition = dialogDefinitionEvent.data.definition;
3135
3136 NS.onLoadOverlay = new overlayBlock({
3137 opacity: "1",
3138 background: "#fff",
3139 target: dialogDefinition.dialog.parts.tabs.getParent().$
3140 });
3141
3142 NS.onLoadOverlay.setEnable();
3143
3144 dialogDefinition.dialog.on('cancel', function(cancelEvent) {
3145 dialogDefinition.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());
3146 NS.div_overlay.setDisable();
3147 NS.onLoadOverlay.setDisable();
3148 return false;
3149 }, this, null, -1);
3150 }
3151});
3152})();
diff --git a/sources/plugins/wsc/dialogs/wsc_ie.js b/sources/plugins/wsc/dialogs/wsc_ie.js
new file mode 100644
index 00000000..f47e507f
--- /dev/null
+++ b/sources/plugins/wsc/dialogs/wsc_ie.js
@@ -0,0 +1,176 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.html or http://ckeditor.com/license
4 */
5
6CKEDITOR.dialog.add( 'checkspell', function( editor ) {
7 var number = CKEDITOR.tools.getNextNumber(),
8 iframeId = 'cke_frame_' + number,
9 textareaId = 'cke_data_' + number,
10 errorBoxId = 'cke_error_' + number,
11 interval,
12 protocol = document.location.protocol || 'http:',
13 errorMsg = editor.lang.wsc.notAvailable;
14
15 var pasteArea =
16 '<textarea' +
17 ' style="display: none"' +
18 ' id="' + textareaId + '"' +
19 ' rows="10"' +
20 ' cols="40">' +
21 ' </textarea><div' +
22 ' id="' + errorBoxId + '"' +
23 ' style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;">' +
24 '</div><iframe' +
25 ' src=""' +
26 ' style="width:100%;background-color:#f1f1e3;"' +
27 ' frameborder="0"' +
28 ' name="' + iframeId + '"' +
29 ' id="' + iframeId + '"' +
30 ' allowtransparency="1">' +
31 '</iframe>';
32
33 var wscCoreUrl = editor.config.wsc_customLoaderScript || ( protocol + '//loader.webspellchecker.net/sproxy_fck/sproxy.php' + '?plugin=fck2'
34 + '&customerid=' + editor.config.wsc_customerId
35 + '&cmd=script&doc=wsc&schema=22'
36 );
37
38 if ( editor.config.wsc_customLoaderScript ) {
39 errorMsg += '<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">' +
40 editor.lang.wsc.errorLoading.replace( /%s/g, editor.config.wsc_customLoaderScript ) + '</p>';
41 }
42
43 function burnSpelling( dialog, errorMsg ) {
44 var i = 0;
45 return function() {
46 if ( typeof( window.doSpell ) == 'function' ) {
47 //Call from window.setInteval expected at once.
48 if ( typeof( interval ) != 'undefined' )
49 window.clearInterval( interval );
50
51 initAndSpell( dialog );
52 } else if ( i++ == 180 ) // Timeout: 180 * 250ms = 45s.
53 window._cancelOnError( errorMsg );
54 };
55 }
56
57 window._cancelOnError = function( m ) {
58 if ( typeof( window.WSC_Error ) == 'undefined' ) {
59 CKEDITOR.document.getById( iframeId ).setStyle( 'display', 'none' );
60 var errorBox = CKEDITOR.document.getById( errorBoxId );
61 errorBox.setStyle( 'display', 'block' );
62 errorBox.setHtml( m || editor.lang.wsc.notAvailable );
63 }
64 };
65
66 function initAndSpell( dialog ) {
67 var LangComparer = new window._SP_FCK_LangCompare(),
68 // Language abbr standarts comparer.
69 pluginPath = CKEDITOR.getUrl( editor.plugins.wsc.path + 'dialogs/' ),
70 // Service paths corecting/preparing.
71 framesetPath = pluginPath + 'tmpFrameset.html';
72
73 // global var is used in FCK specific core
74 // change on equal var used in fckplugin.js
75 window.gFCKPluginName = 'wsc';
76
77 LangComparer.setDefaulLangCode( editor.config.defaultLanguage );
78
79 window.doSpell({
80 ctrl: textareaId,
81
82 lang: editor.config.wsc_lang || LangComparer.getSPLangCode( editor.langCode ),
83 intLang: editor.config.wsc_uiLang || LangComparer.getSPLangCode( editor.langCode ),
84 winType: iframeId, // If not defined app will run on winpopup.
85
86 // Callback binding section.
87 onCancel: function() {
88 dialog.hide();
89 },
90 onFinish: function( dT ) {
91 editor.focus();
92 dialog.getParentEditor().setData( dT.value );
93 dialog.hide();
94 },
95
96 // Some manipulations with client static pages.
97 staticFrame: framesetPath,
98 framesetPath: framesetPath,
99 iframePath: pluginPath + 'ciframe.html',
100
101 // Styles defining.
102 schemaURI: pluginPath + 'wsc.css',
103
104 userDictionaryName: editor.config.wsc_userDictionaryName,
105 customDictionaryName: editor.config.wsc_customDictionaryIds && editor.config.wsc_customDictionaryIds.split( "," ),
106 domainName: editor.config.wsc_domainName
107
108 });
109
110 // Hide user message console (if application was loaded more then after timeout).
111 CKEDITOR.document.getById( errorBoxId ).setStyle( 'display', 'none' );
112 CKEDITOR.document.getById( iframeId ).setStyle( 'display', 'block' );
113 }
114
115 return {
116 title: editor.config.wsc_dialogTitle || editor.lang.wsc.title,
117 minWidth: 485,
118 minHeight: 380,
119 buttons: [ CKEDITOR.dialog.cancelButton ],
120 onShow: function() {
121 var contentArea = this.getContentElement( 'general', 'content' ).getElement();
122 contentArea.setHtml( pasteArea );
123 contentArea.getChild( 2 ).setStyle( 'height', this._.contentSize.height + 'px' );
124
125 if ( typeof( window.doSpell ) != 'function' ) {
126 // Load script.
127 CKEDITOR.document.getHead().append( CKEDITOR.document.createElement( 'script', {
128 attributes: {
129 type: 'text/javascript',
130 src: wscCoreUrl
131 }
132 }));
133 }
134
135 var sData = editor.getData(); // Get the data to be checked.
136
137 CKEDITOR.document.getById( textareaId ).setValue( sData );
138
139 interval = window.setInterval( burnSpelling( this, errorMsg ), 250 );
140 },
141 onHide: function() {
142 window.ooo = undefined;
143 window.int_framsetLoaded = undefined;
144 window.framesetLoaded = undefined;
145 window.is_window_opened = false;
146 },
147 contents: [
148 {
149 id: 'general',
150 label: editor.config.wsc_dialogTitle || editor.lang.wsc.title,
151 padding: 0,
152 elements: [
153 {
154 type: 'html',
155 id: 'content',
156 html: ''
157 }
158 ]
159 }
160 ]
161 };
162});
163
164// Expand the spell-check frame when dialog resized. (#6829)
165CKEDITOR.dialog.on( 'resize', function( evt ) {
166 var data = evt.data,
167 dialog = data.dialog;
168
169 if ( dialog._.name == 'checkspell' ) {
170 var content = dialog.getContentElement( 'general', 'content' ).getElement(),
171 iframe = content && content.getChild( 2 );
172
173 iframe && iframe.setSize( 'height', data.height );
174 iframe && iframe.setSize( 'width', data.width );
175 }
176});
diff --git a/sources/plugins/wsc/icons/hidpi/spellchecker.png b/sources/plugins/wsc/icons/hidpi/spellchecker.png
new file mode 100644
index 00000000..58a9f4c1
--- /dev/null
+++ b/sources/plugins/wsc/icons/hidpi/spellchecker.png
Binary files differ
diff --git a/sources/plugins/wsc/icons/spellchecker.png b/sources/plugins/wsc/icons/spellchecker.png
new file mode 100644
index 00000000..2b50c5c6
--- /dev/null
+++ b/sources/plugins/wsc/icons/spellchecker.png
Binary files differ
diff --git a/sources/plugins/wsc/lang/af.js b/sources/plugins/wsc/lang/af.js
new file mode 100644
index 00000000..9caf6f7e
--- /dev/null
+++ b/sources/plugins/wsc/lang/af.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'af', {
6 btnIgnore: 'Ignoreer',
7 btnIgnoreAll: 'Ignoreer alles',
8 btnReplace: 'Vervang',
9 btnReplaceAll: 'vervang alles',
10 btnUndo: 'Ontdoen',
11 changeTo: 'Verander na',
12 errorLoading: 'Fout by inlaai van diens: %s.',
13 ieSpellDownload: 'Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?',
14 manyChanges: 'Klaar met speltoets: %1 woorde verander',
15 noChanges: 'Klaar met speltoets: Geen woorde verander nie',
16 noMispell: 'Klaar met speltoets: Geen foute nie',
17 noSuggestions: '- Geen voorstel -',
18 notAvailable: 'Jammer, hierdie diens is nie nou beskikbaar nie.',
19 notInDic: 'Nie in woordeboek nie',
20 oneChange: 'Klaar met speltoets: Een woord verander',
21 progress: 'Spelling word getoets...',
22 title: 'Speltoetser',
23 toolbar: 'Speltoets'
24});
diff --git a/sources/plugins/wsc/lang/ar.js b/sources/plugins/wsc/lang/ar.js
new file mode 100644
index 00000000..f152dc15
--- /dev/null
+++ b/sources/plugins/wsc/lang/ar.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ar', {
6 btnIgnore: 'تجاهل',
7 btnIgnoreAll: 'تجاهل الكل',
8 btnReplace: 'تغيير',
9 btnReplaceAll: 'تغيير الكل',
10 btnUndo: 'تراجع',
11 changeTo: 'التغيير إلى',
12 errorLoading: 'خطأ في تحميل تطبيق خدمة الاستضافة: %s.',
13 ieSpellDownload: 'المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟',
14 manyChanges: 'تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات',
15 noChanges: 'تم التدقيق الإملائي: لم يتم تغيير أي كلمة',
16 noMispell: 'تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية',
17 noSuggestions: '- لا توجد إقتراحات -',
18 notAvailable: 'عفواً، ولكن هذه الخدمة غير متاحة الان',
19 notInDic: 'ليست في القاموس',
20 oneChange: 'تم التدقيق الإملائي: تم تغيير كلمة واحدة فقط',
21 progress: 'جاري التدقيق الاملائى',
22 title: 'التدقيق الإملائي',
23 toolbar: 'تدقيق إملائي'
24});
diff --git a/sources/plugins/wsc/lang/bg.js b/sources/plugins/wsc/lang/bg.js
new file mode 100644
index 00000000..e814a9f2
--- /dev/null
+++ b/sources/plugins/wsc/lang/bg.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'bg', {
6 btnIgnore: 'Игнорирай',
7 btnIgnoreAll: 'Игнорирай всичко',
8 btnReplace: 'Препокриване',
9 btnReplaceAll: 'Препокрий всичко',
10 btnUndo: 'Възтанови',
11 changeTo: 'Промени на',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- Няма препоръчани -',
18 notAvailable: 'Съжаляваме, но услугата не е достъпна за момента',
19 notInDic: 'Не е в речника',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Проверява се правописа...',
22 title: 'Проверка на правопис',
23 toolbar: 'Проверка на правопис'
24});
diff --git a/sources/plugins/wsc/lang/bn.js b/sources/plugins/wsc/lang/bn.js
new file mode 100644
index 00000000..03a38130
--- /dev/null
+++ b/sources/plugins/wsc/lang/bn.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'bn', {
6 btnIgnore: 'ইগনোর কর',
7 btnIgnoreAll: 'সব ইগনোর কর',
8 btnReplace: 'বদলে দাও',
9 btnReplaceAll: 'সব বদলে দাও',
10 btnUndo: 'আন্ডু',
11 changeTo: 'এতে বদলাও',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'বানান পরীক্ষক ইনস্টল করা নেই। আপনি কি এখনই এটা ডাউনলোড করতে চান?',
14 manyChanges: 'বানান পরীক্ষা শেষ: %1 গুলো শব্দ বদলে গ্যাছে',
15 noChanges: 'বানান পরীক্ষা শেষ: কোন শব্দ পরিবর্তন করা হয়নি',
16 noMispell: 'বানান পরীক্ষা শেষ: কোন ভুল বানান পাওয়া যায়নি',
17 noSuggestions: '- কোন সাজেশন নেই -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'শব্দকোষে নেই',
20 oneChange: 'বানান পরীক্ষা শেষ: একটি মাত্র শব্দ পরিবর্তন করা হয়েছে',
21 progress: 'বানান পরীক্ষা চলছে...',
22 title: 'Spell Checker',
23 toolbar: 'বানান চেক'
24});
diff --git a/sources/plugins/wsc/lang/bs.js b/sources/plugins/wsc/lang/bs.js
new file mode 100644
index 00000000..b40859c8
--- /dev/null
+++ b/sources/plugins/wsc/lang/bs.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'bs', {
6 btnIgnore: 'Ignore',
7 btnIgnoreAll: 'Ignore All',
8 btnReplace: 'Replace',
9 btnReplaceAll: 'Replace All',
10 btnUndo: 'Undo',
11 changeTo: 'Change to',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- No suggestions -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Not in dictionary',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Spell check in progress...',
22 title: 'Spell Checker',
23 toolbar: 'Check Spelling'
24});
diff --git a/sources/plugins/wsc/lang/ca.js b/sources/plugins/wsc/lang/ca.js
new file mode 100644
index 00000000..857cfaa0
--- /dev/null
+++ b/sources/plugins/wsc/lang/ca.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ca', {
6 btnIgnore: 'Ignora',
7 btnIgnoreAll: 'Ignora-les totes',
8 btnReplace: 'Canvia',
9 btnReplaceAll: 'Canvia-les totes',
10 btnUndo: 'Desfés',
11 changeTo: 'Reemplaça amb',
12 errorLoading: 'Error carregant el servidor: %s.',
13 ieSpellDownload: 'Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?',
14 manyChanges: 'Verificació ortogràfica: s\'han canviat %1 paraules',
15 noChanges: 'Verificació ortogràfica: no s\'ha canviat cap paraula',
16 noMispell: 'Verificació ortogràfica acabada: no hi ha cap paraula mal escrita',
17 noSuggestions: 'Cap suggeriment',
18 notAvailable: 'El servei no es troba disponible ara.',
19 notInDic: 'No és al diccionari',
20 oneChange: 'Verificació ortogràfica: s\'ha canviat una paraula',
21 progress: 'Verificació ortogràfica en curs...',
22 title: 'Comprova l\'ortografia',
23 toolbar: 'Revisa l\'ortografia'
24});
diff --git a/sources/plugins/wsc/lang/cs.js b/sources/plugins/wsc/lang/cs.js
new file mode 100644
index 00000000..fcda7f01
--- /dev/null
+++ b/sources/plugins/wsc/lang/cs.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'cs', {
6 btnIgnore: 'Přeskočit',
7 btnIgnoreAll: 'Přeskakovat vše',
8 btnReplace: 'Zaměnit',
9 btnReplaceAll: 'Zaměňovat vše',
10 btnUndo: 'Zpět',
11 changeTo: 'Změnit na',
12 errorLoading: 'Chyba nahrávání služby aplikace z: %s.',
13 ieSpellDownload: 'Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?',
14 manyChanges: 'Kontrola pravopisu dokončena: %1 slov změněno',
15 noChanges: 'Kontrola pravopisu dokončena: Beze změn',
16 noMispell: 'Kontrola pravopisu dokončena: Žádné pravopisné chyby nenalezeny',
17 noSuggestions: '- žádné návrhy -',
18 notAvailable: 'Omlouváme se, ale služba nyní není dostupná.',
19 notInDic: 'Není ve slovníku',
20 oneChange: 'Kontrola pravopisu dokončena: Jedno slovo změněno',
21 progress: 'Probíhá kontrola pravopisu...',
22 title: 'Kontrola pravopisu',
23 toolbar: 'Zkontrolovat pravopis'
24});
diff --git a/sources/plugins/wsc/lang/cy.js b/sources/plugins/wsc/lang/cy.js
new file mode 100644
index 00000000..308de25c
--- /dev/null
+++ b/sources/plugins/wsc/lang/cy.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'cy', {
6 btnIgnore: 'Anwybyddu Un',
7 btnIgnoreAll: 'Anwybyddu Pob',
8 btnReplace: 'Amnewid Un',
9 btnReplaceAll: 'Amnewid Pob',
10 btnUndo: 'Dadwneud',
11 changeTo: 'Newid i',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?',
14 manyChanges: 'Gwirio sillafu wedi gorffen: Newidiwyd %1 gair',
15 noChanges: 'Gwirio sillafu wedi gorffen: Dim newidiadau',
16 noMispell: 'Gwirio sillafu wedi gorffen: Dim camsillaf.',
17 noSuggestions: '- Dim awgrymiadau -',
18 notAvailable: 'Nid yw\'r gwasanaeth hwn ar gael yn bresennol.',
19 notInDic: 'Nid i\'w gael yn y geiriadur',
20 oneChange: 'Gwirio sillafu wedi gorffen: Newidiwyd 1 gair',
21 progress: 'Gwirio sillafu yn ar y gweill...',
22 title: 'Gwirio Sillafu',
23 toolbar: 'Gwirio Sillafu'
24});
diff --git a/sources/plugins/wsc/lang/da.js b/sources/plugins/wsc/lang/da.js
new file mode 100644
index 00000000..018984e6
--- /dev/null
+++ b/sources/plugins/wsc/lang/da.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'da', {
6 btnIgnore: 'Ignorér',
7 btnIgnoreAll: 'Ignorér alle',
8 btnReplace: 'Erstat',
9 btnReplaceAll: 'Erstat alle',
10 btnUndo: 'Tilbage',
11 changeTo: 'Forslag',
12 errorLoading: 'Fejl ved indlæsning af host: %s.',
13 ieSpellDownload: 'Stavekontrol ikke installeret. Vil du installere den nu?',
14 manyChanges: 'Stavekontrol færdig: %1 ord ændret',
15 noChanges: 'Stavekontrol færdig: Ingen ord ændret',
16 noMispell: 'Stavekontrol færdig: Ingen fejl fundet',
17 noSuggestions: '(ingen forslag)',
18 notAvailable: 'Stavekontrol er desværre ikke tilgængelig.',
19 notInDic: 'Ikke i ordbogen',
20 oneChange: 'Stavekontrol færdig: Et ord ændret',
21 progress: 'Stavekontrollen arbejder...',
22 title: 'Stavekontrol',
23 toolbar: 'Stavekontrol'
24});
diff --git a/sources/plugins/wsc/lang/de.js b/sources/plugins/wsc/lang/de.js
new file mode 100644
index 00000000..d8e541c5
--- /dev/null
+++ b/sources/plugins/wsc/lang/de.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'de', {
6 btnIgnore: 'Ignorieren',
7 btnIgnoreAll: 'Alle Ignorieren',
8 btnReplace: 'Ersetzen',
9 btnReplaceAll: 'Alle Ersetzen',
10 btnUndo: 'Rückgängig',
11 changeTo: 'Ändern in',
12 errorLoading: 'Fehler beim laden des Dienstanbieters: %s.',
13 ieSpellDownload: 'Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?',
14 manyChanges: 'Rechtschreibprüfung abgeschlossen - %1 Wörter geändert',
15 noChanges: 'Rechtschreibprüfung abgeschlossen - keine Worte geändert',
16 noMispell: 'Rechtschreibprüfung abgeschlossen - keine Fehler gefunden',
17 noSuggestions: ' - keine Vorschläge - ',
18 notAvailable: 'Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.',
19 notInDic: 'Nicht im Wörterbuch',
20 oneChange: 'Rechtschreibprüfung abgeschlossen - ein Wort geändert',
21 progress: 'Rechtschreibprüfung läuft...',
22 title: 'Rechtschreibprüfung',
23 toolbar: 'Rechtschreibprüfung'
24});
diff --git a/sources/plugins/wsc/lang/el.js b/sources/plugins/wsc/lang/el.js
new file mode 100644
index 00000000..8bd15cb1
--- /dev/null
+++ b/sources/plugins/wsc/lang/el.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'el', {
6 btnIgnore: 'Αγνόηση',
7 btnIgnoreAll: 'Αγνόηση όλων',
8 btnReplace: 'Αντικατάσταση',
9 btnReplaceAll: 'Αντικατάσταση όλων',
10 btnUndo: 'Αναίρεση',
11 changeTo: 'Αλλαγή σε',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Δεν υπάρχει εγκατεστημένος ορθογράφος. Θέλετε να τον κατεβάσετε τώρα;',
14 manyChanges: 'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξαν %1 λέξεις',
15 noChanges: 'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν άλλαξαν λέξεις',
16 noMispell: 'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν βρέθηκαν λάθη',
17 noSuggestions: '- Δεν υπάρχουν προτάσεις -',
18 notAvailable: 'Η υπηρεσία δεν είναι διαθέσιμη αυτήν την στιγμή.',
19 notInDic: 'Δεν υπάρχει στο λεξικό',
20 oneChange: 'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξε μια λέξη',
21 progress: 'Γίνεται ορθογραφικός έλεγχος...',
22 title: 'Ορθογραφικός Έλεγχος',
23 toolbar: 'Ορθογραφικός Έλεγχος'
24});
diff --git a/sources/plugins/wsc/lang/en-au.js b/sources/plugins/wsc/lang/en-au.js
new file mode 100644
index 00000000..e03a9848
--- /dev/null
+++ b/sources/plugins/wsc/lang/en-au.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'en-au', {
6 btnIgnore: 'Ignore',
7 btnIgnoreAll: 'Ignore All',
8 btnReplace: 'Replace',
9 btnReplaceAll: 'Replace All',
10 btnUndo: 'Undo',
11 changeTo: 'Change to',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- No suggestions -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Not in dictionary',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Spell check in progress...',
22 title: 'Spell Checker',
23 toolbar: 'Check Spelling'
24});
diff --git a/sources/plugins/wsc/lang/en-ca.js b/sources/plugins/wsc/lang/en-ca.js
new file mode 100644
index 00000000..312d285c
--- /dev/null
+++ b/sources/plugins/wsc/lang/en-ca.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'en-ca', {
6 btnIgnore: 'Ignore',
7 btnIgnoreAll: 'Ignore All',
8 btnReplace: 'Replace',
9 btnReplaceAll: 'Replace All',
10 btnUndo: 'Undo',
11 changeTo: 'Change to',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- No suggestions -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Not in dictionary',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Spell check in progress...',
22 title: 'Spell Checker',
23 toolbar: 'Check Spelling'
24});
diff --git a/sources/plugins/wsc/lang/en-gb.js b/sources/plugins/wsc/lang/en-gb.js
new file mode 100644
index 00000000..0f33b994
--- /dev/null
+++ b/sources/plugins/wsc/lang/en-gb.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'en-gb', {
6 btnIgnore: 'Ignore',
7 btnIgnoreAll: 'Ignore All',
8 btnReplace: 'Replace',
9 btnReplaceAll: 'Replace All',
10 btnUndo: 'Undo',
11 changeTo: 'Change to',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- No suggestions -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Not in dictionary',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Spell check in progress...',
22 title: 'Spell Checker',
23 toolbar: 'Check Spelling'
24});
diff --git a/sources/plugins/wsc/lang/en.js b/sources/plugins/wsc/lang/en.js
new file mode 100644
index 00000000..99b4bebf
--- /dev/null
+++ b/sources/plugins/wsc/lang/en.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'en', {
6 btnIgnore: 'Ignore',
7 btnIgnoreAll: 'Ignore All',
8 btnReplace: 'Replace',
9 btnReplaceAll: 'Replace All',
10 btnUndo: 'Undo',
11 changeTo: 'Change to',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- No suggestions -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Not in dictionary',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Spell check in progress...',
22 title: 'Spell Checker',
23 toolbar: 'Check Spelling'
24});
diff --git a/sources/plugins/wsc/lang/eo.js b/sources/plugins/wsc/lang/eo.js
new file mode 100644
index 00000000..399e59ac
--- /dev/null
+++ b/sources/plugins/wsc/lang/eo.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'eo', {
6 btnIgnore: 'Ignori',
7 btnIgnoreAll: 'Ignori Ĉion',
8 btnReplace: 'Anstataŭigi',
9 btnReplaceAll: 'Anstataŭigi Ĉion',
10 btnUndo: 'Malfari',
11 changeTo: 'Ŝanĝi al',
12 errorLoading: 'Eraro en la servoelŝuto el la gastiga komputiko: %s.',
13 ieSpellDownload: 'Ortografikontrolilo ne instalita. Ĉu vi volas elŝuti ĝin nun?',
14 manyChanges: 'Ortografikontrolado finita: %1 vortoj korektitaj',
15 noChanges: 'Ortografikontrolado finita: neniu vorto korektita',
16 noMispell: 'Ortografikontrolado finita: neniu eraro trovita',
17 noSuggestions: '- Neniu propono -',
18 notAvailable: 'Bedaŭrinde la servo ne funkcias nuntempe.',
19 notInDic: 'Ne trovita en la vortaro',
20 oneChange: 'Ortografikontrolado finita: unu vorto korektita',
21 progress: 'La ortografio estas kontrolata...',
22 title: 'Kontroli la ortografion',
23 toolbar: 'Kontroli la ortografion'
24});
diff --git a/sources/plugins/wsc/lang/es.js b/sources/plugins/wsc/lang/es.js
new file mode 100644
index 00000000..0284150d
--- /dev/null
+++ b/sources/plugins/wsc/lang/es.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'es', {
6 btnIgnore: 'Ignorar',
7 btnIgnoreAll: 'Ignorar Todo',
8 btnReplace: 'Reemplazar',
9 btnReplaceAll: 'Reemplazar Todo',
10 btnUndo: 'Deshacer',
11 changeTo: 'Cambiar a',
12 errorLoading: 'Error cargando la aplicación del servidor: %s.',
13 ieSpellDownload: 'Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?',
14 manyChanges: 'Control finalizado: se ha cambiado %1 palabras',
15 noChanges: 'Control finalizado: no se ha cambiado ninguna palabra',
16 noMispell: 'Control finalizado: no se encontraron errores',
17 noSuggestions: '- No hay sugerencias -',
18 notAvailable: 'Lo sentimos pero el servicio no está disponible.',
19 notInDic: 'No se encuentra en el Diccionario',
20 oneChange: 'Control finalizado: se ha cambiado una palabra',
21 progress: 'Control de Ortografía en progreso...',
22 title: 'Comprobar ortografía',
23 toolbar: 'Ortografía'
24});
diff --git a/sources/plugins/wsc/lang/et.js b/sources/plugins/wsc/lang/et.js
new file mode 100644
index 00000000..7e198459
--- /dev/null
+++ b/sources/plugins/wsc/lang/et.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'et', {
6 btnIgnore: 'Ignoreeri',
7 btnIgnoreAll: 'Ignoreeri kõiki',
8 btnReplace: 'Asenda',
9 btnReplaceAll: 'Asenda kõik',
10 btnUndo: 'Võta tagasi',
11 changeTo: 'Muuda',
12 errorLoading: 'Viga rakenduse teenushosti laadimisel: %s.',
13 ieSpellDownload: 'Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?',
14 manyChanges: 'Õigekirja kontroll sooritatud: %1 sõna muudetud',
15 noChanges: 'Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud',
16 noMispell: 'Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud',
17 noSuggestions: '- Soovitused puuduvad -',
18 notAvailable: 'Kahjuks ei ole teenus praegu saadaval.',
19 notInDic: 'Puudub sõnastikust',
20 oneChange: 'Õigekirja kontroll sooritatud: üks sõna muudeti',
21 progress: 'Toimub õigekirja kontroll...',
22 title: 'Õigekirjakontroll',
23 toolbar: 'Õigekirjakontroll'
24});
diff --git a/sources/plugins/wsc/lang/eu.js b/sources/plugins/wsc/lang/eu.js
new file mode 100644
index 00000000..b079af03
--- /dev/null
+++ b/sources/plugins/wsc/lang/eu.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'eu', {
6 btnIgnore: 'Ezikusi',
7 btnIgnoreAll: 'Denak Ezikusi',
8 btnReplace: 'Ordezkatu',
9 btnReplaceAll: 'Denak Ordezkatu',
10 btnUndo: 'Desegin',
11 changeTo: 'Honekin ordezkatu',
12 errorLoading: 'Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.',
13 ieSpellDownload: 'Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?',
14 manyChanges: 'Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira',
15 noChanges: 'Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu',
16 noMispell: 'Zuzenketa ortografikoa bukatuta: Akatsik ez',
17 noSuggestions: '- Iradokizunik ez -',
18 notAvailable: 'Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.',
19 notInDic: 'Ez dago hiztegian',
20 oneChange: 'Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da',
21 progress: 'Zuzenketa ortografikoa martxan...',
22 title: 'Ortografia zuzenketa',
23 toolbar: 'Ortografia'
24});
diff --git a/sources/plugins/wsc/lang/fa.js b/sources/plugins/wsc/lang/fa.js
new file mode 100644
index 00000000..de7041bd
--- /dev/null
+++ b/sources/plugins/wsc/lang/fa.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'fa', {
6 btnIgnore: 'چشمپوشی',
7 btnIgnoreAll: 'چشمپوشی همه',
8 btnReplace: 'جایگزینی',
9 btnReplaceAll: 'جایگزینی همه',
10 btnUndo: 'واچینش',
11 changeTo: 'تغییر به',
12 errorLoading: 'خطا در بارگیری برنامه خدمات میزبان: %s.',
13 ieSpellDownload: 'بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریافت کنید؟',
14 manyChanges: 'بررسی املا انجام شد. %1 واژه تغییر یافت',
15 noChanges: 'بررسی املا انجام شد. هیچ واژهای تغییر نیافت',
16 noMispell: 'بررسی املا انجام شد. هیچ غلط املائی یافت نشد',
17 noSuggestions: '- پیشنهادی نیست -',
18 notAvailable: 'با عرض پوزش خدمات الان در دسترس نیستند.',
19 notInDic: 'در واژه~نامه یافت نشد',
20 oneChange: 'بررسی املا انجام شد. یک واژه تغییر یافت',
21 progress: 'بررسی املا در حال انجام...',
22 title: 'بررسی املا',
23 toolbar: 'بررسی املا'
24});
diff --git a/sources/plugins/wsc/lang/fi.js b/sources/plugins/wsc/lang/fi.js
new file mode 100644
index 00000000..786404b9
--- /dev/null
+++ b/sources/plugins/wsc/lang/fi.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'fi', {
6 btnIgnore: 'Jätä huomioimatta',
7 btnIgnoreAll: 'Jätä kaikki huomioimatta',
8 btnReplace: 'Korvaa',
9 btnReplaceAll: 'Korvaa kaikki',
10 btnUndo: 'Kumoa',
11 changeTo: 'Vaihda',
12 errorLoading: 'Virhe ladattaessa oikolukupalvelua isännältä: %s.',
13 ieSpellDownload: 'Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?',
14 manyChanges: 'Tarkistus valmis: %1 sanaa muutettiin',
15 noChanges: 'Tarkistus valmis: Yhtään sanaa ei muutettu',
16 noMispell: 'Tarkistus valmis: Ei virheitä',
17 noSuggestions: 'Ei ehdotuksia',
18 notAvailable: 'Valitettavasti oikoluku ei ole käytössä tällä hetkellä.',
19 notInDic: 'Ei sanakirjassa',
20 oneChange: 'Tarkistus valmis: Yksi sana muutettiin',
21 progress: 'Tarkistus käynnissä...',
22 title: 'Oikoluku',
23 toolbar: 'Tarkista oikeinkirjoitus'
24});
diff --git a/sources/plugins/wsc/lang/fo.js b/sources/plugins/wsc/lang/fo.js
new file mode 100644
index 00000000..0cf829a8
--- /dev/null
+++ b/sources/plugins/wsc/lang/fo.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'fo', {
6 btnIgnore: 'Forfjóna',
7 btnIgnoreAll: 'Forfjóna alt',
8 btnReplace: 'Yvirskriva',
9 btnReplaceAll: 'Yvirskriva alt',
10 btnUndo: 'Angra',
11 changeTo: 'Broyt til',
12 errorLoading: 'Feilur við innlesing av application service host: %s.',
13 ieSpellDownload: 'Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?',
14 manyChanges: 'Rættstavarin liðugur: %1 orð broytt',
15 noChanges: 'Rættstavarin liðugur: Einki orð varð broytt',
16 noMispell: 'Rættstavarin liðugur: Eingin feilur funnin',
17 noSuggestions: '- Einki uppskot -',
18 notAvailable: 'Tíverri, ikki tøkt í løtuni.',
19 notInDic: 'Finst ikki í orðabókini',
20 oneChange: 'Rættstavarin liðugur: Eitt orð er broytt',
21 progress: 'Rættstavarin arbeiðir...',
22 title: 'Kanna stavseting',
23 toolbar: 'Kanna stavseting'
24});
diff --git a/sources/plugins/wsc/lang/fr-ca.js b/sources/plugins/wsc/lang/fr-ca.js
new file mode 100644
index 00000000..37f84c8a
--- /dev/null
+++ b/sources/plugins/wsc/lang/fr-ca.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'fr-ca', {
6 btnIgnore: 'Ignorer',
7 btnIgnoreAll: 'Ignorer tout',
8 btnReplace: 'Remplacer',
9 btnReplaceAll: 'Remplacer tout',
10 btnUndo: 'Annuler',
11 changeTo: 'Changer en',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Le Correcteur d\'orthographe n\'est pas installé. Souhaitez-vous le télécharger maintenant?',
14 manyChanges: 'Vérification d\'orthographe terminée: %1 mots modifiés',
15 noChanges: 'Vérification d\'orthographe terminée: Pas de modifications',
16 noMispell: 'Vérification d\'orthographe terminée: pas d\'erreur trouvée',
17 noSuggestions: '- Pas de suggestion -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Pas dans le dictionnaire',
20 oneChange: 'Vérification d\'orthographe terminée: Un mot modifié',
21 progress: 'Vérification d\'orthographe en cours...',
22 title: 'Spell Checker',
23 toolbar: 'Orthographe'
24});
diff --git a/sources/plugins/wsc/lang/fr.js b/sources/plugins/wsc/lang/fr.js
new file mode 100644
index 00000000..f442bd9d
--- /dev/null
+++ b/sources/plugins/wsc/lang/fr.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'fr', {
6 btnIgnore: 'Ignorer',
7 btnIgnoreAll: 'Ignorer tout',
8 btnReplace: 'Remplacer',
9 btnReplaceAll: 'Remplacer tout',
10 btnUndo: 'Annuler',
11 changeTo: 'Modifier pour',
12 errorLoading: 'Erreur du chargement du service depuis l\'hôte : %s.',
13 ieSpellDownload: 'La vérification d\'orthographe n\'est pas installée. Voulez-vous la télécharger maintenant?',
14 manyChanges: 'Vérification de l\'orthographe terminée : %1 mots corrigés.',
15 noChanges: 'Vérification de l\'orthographe terminée : Aucun mot corrigé.',
16 noMispell: 'Vérification de l\'orthographe terminée : aucune erreur trouvée.',
17 noSuggestions: '- Aucune suggestion -',
18 notAvailable: 'Désolé, le service est indisponible actuellement.',
19 notInDic: 'N\'existe pas dans le dictionnaire.',
20 oneChange: 'Vérification de l\'orthographe terminée : Un seul mot corrigé.',
21 progress: 'Vérification de l\'orthographe en cours...',
22 title: 'Vérifier l\'orthographe',
23 toolbar: 'Vérifier l\'orthographe'
24});
diff --git a/sources/plugins/wsc/lang/gl.js b/sources/plugins/wsc/lang/gl.js
new file mode 100644
index 00000000..5da1ff7c
--- /dev/null
+++ b/sources/plugins/wsc/lang/gl.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'gl', {
6 btnIgnore: 'Ignorar',
7 btnIgnoreAll: 'Ignorar Todas',
8 btnReplace: 'Substituir',
9 btnReplaceAll: 'Substituir Todas',
10 btnUndo: 'Desfacer',
11 changeTo: 'Cambiar a',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'O corrector ortográfico non está instalado. ¿Quere descargalo agora?',
14 manyChanges: 'Corrección ortográfica rematada: %1 verbas substituidas',
15 noChanges: 'Corrección ortográfica rematada: Non se substituiu nengunha verba',
16 noMispell: 'Corrección ortográfica rematada: Non se atoparon erros',
17 noSuggestions: '- Sen candidatos -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Non está no diccionario',
20 oneChange: 'Corrección ortográfica rematada: Unha verba substituida',
21 progress: 'Corrección ortográfica en progreso...',
22 title: 'Spell Checker',
23 toolbar: 'Corrección Ortográfica'
24});
diff --git a/sources/plugins/wsc/lang/gu.js b/sources/plugins/wsc/lang/gu.js
new file mode 100644
index 00000000..385d9f5b
--- /dev/null
+++ b/sources/plugins/wsc/lang/gu.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'gu', {
6 btnIgnore: 'ઇગ્નોર/અવગણના કરવી',
7 btnIgnoreAll: 'બધાની ઇગ્નોર/અવગણના કરવી',
8 btnReplace: 'બદલવું',
9 btnReplaceAll: 'બધા બદલી કરો',
10 btnUndo: 'અન્ડૂ',
11 changeTo: 'આનાથી બદલવું',
12 errorLoading: 'સર્વિસ એપ્લીકેશન લોડ નથી થ: %s.',
13 ieSpellDownload: 'સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?',
14 manyChanges: 'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે',
15 noChanges: 'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી',
16 noMispell: 'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી',
17 noSuggestions: '- કઇ સજેશન નથી -',
18 notAvailable: 'માફ કરશો, આ સુવિધા ઉપલબ્ધ નથી',
19 notInDic: 'શબ્દકોશમાં નથી',
20 oneChange: 'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે',
21 progress: 'શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...',
22 title: 'સ્પેલ ',
23 toolbar: 'જોડણી (સ્પેલિંગ) તપાસવી'
24});
diff --git a/sources/plugins/wsc/lang/he.js b/sources/plugins/wsc/lang/he.js
new file mode 100644
index 00000000..4b78bde6
--- /dev/null
+++ b/sources/plugins/wsc/lang/he.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'he', {
6 btnIgnore: 'התעלמות',
7 btnIgnoreAll: 'התעלמות מהכל',
8 btnReplace: 'החלפה',
9 btnReplaceAll: 'החלפת הכל',
10 btnUndo: 'החזרה',
11 changeTo: 'שינוי ל',
12 errorLoading: 'שגיאה בהעלאת השירות: %s.',
13 ieSpellDownload: 'בודק האיות לא מותקן, האם להורידו?',
14 manyChanges: 'בדיקות איות הסתיימה: %1 מילים שונו',
15 noChanges: 'בדיקות איות הסתיימה: לא שונתה אף מילה',
16 noMispell: 'בדיקות איות הסתיימה: לא נמצאו שגיאות כתיב',
17 noSuggestions: '- אין הצעות -',
18 notAvailable: 'לא נמצא שירות זמין.',
19 notInDic: 'לא נמצא במילון',
20 oneChange: 'בדיקות איות הסתיימה: שונתה מילה אחת',
21 progress: 'בודק האיות בתהליך בדיקה....',
22 title: 'בדיקת איות',
23 toolbar: 'בדיקת איות'
24});
diff --git a/sources/plugins/wsc/lang/hi.js b/sources/plugins/wsc/lang/hi.js
new file mode 100644
index 00000000..bb1a4dbb
--- /dev/null
+++ b/sources/plugins/wsc/lang/hi.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'hi', {
6 btnIgnore: 'इग्नोर',
7 btnIgnoreAll: 'सभी इग्नोर करें',
8 btnReplace: 'रिप्लेस',
9 btnReplaceAll: 'सभी रिप्लेस करें',
10 btnUndo: 'अन्डू',
11 changeTo: 'इसमें बदलें',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'स्पॅल-चॅकर इन्स्टाल नहीं किया गया है। क्या आप इसे डाउनलोड करना चाहेंगे?',
14 manyChanges: 'वर्तनी की जाँच : %1 शब्द बदले गये',
15 noChanges: 'वर्तनी की जाँच :कोई शब्द नहीं बदला गया',
16 noMispell: 'वर्तनी की जाँच : कोई गलत वर्तनी (स्पॅलिंग) नहीं पाई गई',
17 noSuggestions: '- कोई सुझाव नहीं -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'शब्दकोश में नहीं',
20 oneChange: 'वर्तनी की जाँच : एक शब्द बदला गया',
21 progress: 'वर्तनी की जाँच (स्पॅल-चॅक) जारी है...',
22 title: 'Spell Checker',
23 toolbar: 'वर्तनी (स्पेलिंग) जाँच'
24});
diff --git a/sources/plugins/wsc/lang/hr.js b/sources/plugins/wsc/lang/hr.js
new file mode 100644
index 00000000..1094e079
--- /dev/null
+++ b/sources/plugins/wsc/lang/hr.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'hr', {
6 btnIgnore: 'Zanemari',
7 btnIgnoreAll: 'Zanemari sve',
8 btnReplace: 'Zamijeni',
9 btnReplaceAll: 'Zamijeni sve',
10 btnUndo: 'Vrati',
11 changeTo: 'Promijeni u',
12 errorLoading: 'Greška učitavanja aplikacije: %s.',
13 ieSpellDownload: 'Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?',
14 manyChanges: 'Provjera završena: Promijenjeno %1 riječi',
15 noChanges: 'Provjera završena: Nije napravljena promjena',
16 noMispell: 'Provjera završena: Nema grešaka',
17 noSuggestions: '-Nema preporuke-',
18 notAvailable: 'Žao nam je, ali usluga trenutno nije dostupna.',
19 notInDic: 'Nije u rječniku',
20 oneChange: 'Provjera završena: Jedna riječ promjenjena',
21 progress: 'Provjera u tijeku...',
22 title: 'Provjera pravopisa',
23 toolbar: 'Provjeri pravopis'
24});
diff --git a/sources/plugins/wsc/lang/hu.js b/sources/plugins/wsc/lang/hu.js
new file mode 100644
index 00000000..9e442e75
--- /dev/null
+++ b/sources/plugins/wsc/lang/hu.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'hu', {
6 btnIgnore: 'Kihagyja',
7 btnIgnoreAll: 'Mindet kihagyja',
8 btnReplace: 'Csere',
9 btnReplaceAll: 'Összes cseréje',
10 btnUndo: 'Visszavonás',
11 changeTo: 'Módosítás',
12 errorLoading: 'Hiba a szolgáltatás host betöltése közben: %s.',
13 ieSpellDownload: 'A helyesírás-ellenőrző nincs telepítve. Szeretné letölteni most?',
14 manyChanges: 'Helyesírás-ellenőrzés kész: %1 szó cserélve',
15 noChanges: 'Helyesírás-ellenőrzés kész: Nincs változtatott szó',
16 noMispell: 'Helyesírás-ellenőrzés kész: Nem találtam hibát',
17 noSuggestions: 'Nincs javaslat',
18 notAvailable: 'Sajnálom, de a szolgáltatás jelenleg nem elérhető.',
19 notInDic: 'Nincs a szótárban',
20 oneChange: 'Helyesírás-ellenőrzés kész: Egy szó cserélve',
21 progress: 'Helyesírás-ellenőrzés folyamatban...',
22 title: 'Helyesírás ellenörző',
23 toolbar: 'Helyesírás-ellenőrzés'
24});
diff --git a/sources/plugins/wsc/lang/is.js b/sources/plugins/wsc/lang/is.js
new file mode 100644
index 00000000..96931692
--- /dev/null
+++ b/sources/plugins/wsc/lang/is.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'is', {
6 btnIgnore: 'Hunsa',
7 btnIgnoreAll: 'Hunsa allt',
8 btnReplace: 'Skipta',
9 btnReplaceAll: 'Skipta öllu',
10 btnUndo: 'Til baka',
11 changeTo: 'Tillaga',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Villuleit ekki sett upp.<br>Viltu setja hana upp?',
14 manyChanges: 'Villuleit lokið: %1 orðum breytt',
15 noChanges: 'Villuleit lokið: Engu orði breytt',
16 noMispell: 'Villuleit lokið: Engin villa fannst',
17 noSuggestions: '- engar tillögur -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Ekki í orðabókinni',
20 oneChange: 'Villuleit lokið: Einu orði breytt',
21 progress: 'Villuleit í gangi...',
22 title: 'Spell Checker',
23 toolbar: 'Villuleit'
24});
diff --git a/sources/plugins/wsc/lang/it.js b/sources/plugins/wsc/lang/it.js
new file mode 100644
index 00000000..6e28785e
--- /dev/null
+++ b/sources/plugins/wsc/lang/it.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'it', {
6 btnIgnore: 'Ignora',
7 btnIgnoreAll: 'Ignora tutto',
8 btnReplace: 'Cambia',
9 btnReplaceAll: 'Cambia tutto',
10 btnUndo: 'Annulla',
11 changeTo: 'Cambia in',
12 errorLoading: 'Errore nel caricamento dell\'host col servizio applicativo: %s.',
13 ieSpellDownload: 'Contollo ortografico non installato. Lo vuoi scaricare ora?',
14 manyChanges: 'Controllo ortografico completato: %1 parole cambiate',
15 noChanges: 'Controllo ortografico completato: nessuna parola cambiata',
16 noMispell: 'Controllo ortografico completato: nessun errore trovato',
17 noSuggestions: '- Nessun suggerimento -',
18 notAvailable: 'Il servizio non è momentaneamente disponibile.',
19 notInDic: 'Non nel dizionario',
20 oneChange: 'Controllo ortografico completato: 1 parola cambiata',
21 progress: 'Controllo ortografico in corso',
22 title: 'Controllo ortografico',
23 toolbar: 'Correttore ortografico'
24});
diff --git a/sources/plugins/wsc/lang/ja.js b/sources/plugins/wsc/lang/ja.js
new file mode 100644
index 00000000..fe90d5e9
--- /dev/null
+++ b/sources/plugins/wsc/lang/ja.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ja', {
6 btnIgnore: '無視',
7 btnIgnoreAll: 'すべて無視',
8 btnReplace: '置換',
9 btnReplaceAll: 'すべて置換',
10 btnUndo: 'やり直し',
11 changeTo: '変更',
12 errorLoading: 'アプリケーションサービスホスト読込みエラー: %s.',
13 ieSpellDownload: 'スペルチェッカーがインストールされていません。今すぐダウンロードしますか?',
14 manyChanges: 'スペルチェック完了: %1 語句変更されました',
15 noChanges: 'スペルチェック完了: 語句は変更されませんでした',
16 noMispell: 'スペルチェック完了: スペルの誤りはありませんでした',
17 noSuggestions: '- 該当なし -',
18 notAvailable: '申し訳ありません、現在サービスを利用することができません',
19 notInDic: '辞書にありません',
20 oneChange: 'スペルチェック完了: 1語句変更されました',
21 progress: 'スペルチェック処理中...',
22 title: 'スペルチェック',
23 toolbar: 'スペルチェック'
24});
diff --git a/sources/plugins/wsc/lang/ka.js b/sources/plugins/wsc/lang/ka.js
new file mode 100644
index 00000000..70cc4bed
--- /dev/null
+++ b/sources/plugins/wsc/lang/ka.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ka', {
6 btnIgnore: 'უგულებელყოფა',
7 btnIgnoreAll: 'ყველას უგულებელყოფა',
8 btnReplace: 'შეცვლა',
9 btnReplaceAll: 'ყველას შეცვლა',
10 btnUndo: 'გაუქმება',
11 changeTo: 'შეცვლელი',
12 errorLoading: 'სერვისის გამოძახების შეცდომა: %s.',
13 ieSpellDownload: 'მართლწერის შემოწმება არაა დაინსტალირებული. ჩამოვქაჩოთ ინტერნეტიდან?',
14 manyChanges: 'მართლწერის შემოწმება: %1 სიტყვა შეიცვალა',
15 noChanges: 'მართლწერის შემოწმება: არაფერი შეცვლილა',
16 noMispell: 'მართლწერის შემოწმება: შეცდომა არ მოიძებნა',
17 noSuggestions: '- არაა შემოთავაზება -',
18 notAvailable: 'უკაცრავად, ეს სერვისი ამჟამად მიუწვდომელია.',
19 notInDic: 'არაა ლექსიკონში',
20 oneChange: 'მართლწერის შემოწმება: ერთი სიტყვა შეიცვალა',
21 progress: 'მიმდინარეობს მართლწერის შემოწმება...',
22 title: 'მართლწერა',
23 toolbar: 'მართლწერა'
24});
diff --git a/sources/plugins/wsc/lang/km.js b/sources/plugins/wsc/lang/km.js
new file mode 100644
index 00000000..26693a6d
--- /dev/null
+++ b/sources/plugins/wsc/lang/km.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'km', {
6 btnIgnore: 'មិនផ្លាស់ប្តូរ',
7 btnIgnoreAll: 'មិនផ្លាស់ប្តូរ ទាំងអស់',
8 btnReplace: 'ជំនួស',
9 btnReplaceAll: 'ជំនួសទាំងអស់',
10 btnUndo: 'សារឡើងវិញ',
11 changeTo: 'ផ្លាស់ប្តូរទៅ',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'ពុំមានកម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធ ។ តើចង់ទាញយកពីណា?',
14 manyChanges: 'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្តូរ',
15 noChanges: 'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពុំមានផ្លាស់ប្តូរ',
16 noMispell: 'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: គ្មានកំហុស',
17 noSuggestions: '- គ្មានសំណើរ -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'គ្មានក្នុងវចនានុក្រម',
20 oneChange: 'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពាក្យមួយត្រូចបានផ្លាស់ប្តូរ',
21 progress: 'កំពុងពិនិត្យអក្ខរាវិរុទ្ធ...',
22 title: 'Spell Checker',
23 toolbar: 'ពិនិត្យអក្ខរាវិរុទ្ធ'
24});
diff --git a/sources/plugins/wsc/lang/ko.js b/sources/plugins/wsc/lang/ko.js
new file mode 100644
index 00000000..e71340d5
--- /dev/null
+++ b/sources/plugins/wsc/lang/ko.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ko', {
6 btnIgnore: '건너뜀',
7 btnIgnoreAll: '모두 건너뜀',
8 btnReplace: '변경',
9 btnReplaceAll: '모두 변경',
10 btnUndo: '취소',
11 changeTo: '변경할 단어',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: '철자 검사기가 철치되지 않았습니다. 지금 다운로드하시겠습니까?',
14 manyChanges: '철자검사 완료: %1 단어가 변경되었습니다.',
15 noChanges: '철자검사 완료: 변경된 단어가 없습니다.',
16 noMispell: '철자검사 완료: 잘못된 철자가 없습니다.',
17 noSuggestions: '- 추천단어 없음 -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: '사전에 없는 단어',
20 oneChange: '철자검사 완료: 단어가 변경되었습니다.',
21 progress: '철자검사를 진행중입니다...',
22 title: 'Spell Check',
23 toolbar: '철자검사'
24});
diff --git a/sources/plugins/wsc/lang/ku.js b/sources/plugins/wsc/lang/ku.js
new file mode 100644
index 00000000..a69cdc01
--- /dev/null
+++ b/sources/plugins/wsc/lang/ku.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ku', {
6 btnIgnore: 'پشتگوێ کردن',
7 btnIgnoreAll: 'پشتگوێکردنی ههمووی',
8 btnReplace: 'لهبریدانن',
9 btnReplaceAll: 'لهبریدانانی ههمووی',
10 btnUndo: 'پووچکردنهوه',
11 changeTo: 'گۆڕینی بۆ',
12 errorLoading: 'ههڵه لههێنانی داخوازینامهی خانهخۆێی ڕاژه: %s.',
13 ieSpellDownload: 'پشکنینی ڕێنووس دانهمزراوه. دهتهوێت ئێستا دایبگریت?',
14 manyChanges: 'پشکنینی ڕێنووس کۆتای هات: لهسهدا %1 ی وشهکان گۆڕدرا',
15 noChanges: 'پشکنینی ڕێنووس کۆتای هات: هیچ وشهیهك نۆگۆڕدرا',
16 noMispell: 'پشکنینی ڕێنووس کۆتای هات: هیچ ههڵهیهکی ڕێنووس نهدۆزراوه',
17 noSuggestions: '- هیچ پێشنیارێك -',
18 notAvailable: 'ببووره، لهمکاتهدا ڕاژهکه لهبهردهستا نیه.',
19 notInDic: 'لهفهرههنگ دانیه',
20 oneChange: 'پشکنینی ڕێنووس کۆتای هات: یهك وشه گۆڕدرا',
21 progress: 'پشکنینی ڕێنووس لهبهردهوامبوون دایه...',
22 title: 'پشکنینی ڕێنووس',
23 toolbar: 'پشکنینی ڕێنووس'
24});
diff --git a/sources/plugins/wsc/lang/lt.js b/sources/plugins/wsc/lang/lt.js
new file mode 100644
index 00000000..ce87d11e
--- /dev/null
+++ b/sources/plugins/wsc/lang/lt.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'lt', {
6 btnIgnore: 'Ignoruoti',
7 btnIgnoreAll: 'Ignoruoti visus',
8 btnReplace: 'Pakeisti',
9 btnReplaceAll: 'Pakeisti visus',
10 btnUndo: 'Atšaukti',
11 changeTo: 'Pakeisti į',
12 errorLoading: 'Klaida įkraunant servisą: %s.',
13 ieSpellDownload: 'Rašybos tikrinimas neinstaliuotas. Ar Jūs norite jį dabar atsisiųsti?',
14 manyChanges: 'Rašybos tikrinimas baigtas: Pakeista %1 žodžių',
15 noChanges: 'Rašybos tikrinimas baigtas: Nėra pakeistų žodžių',
16 noMispell: 'Rašybos tikrinimas baigtas: Nerasta rašybos klaidų',
17 noSuggestions: '- Nėra pasiūlymų -',
18 notAvailable: 'Atleiskite, šiuo metu servisas neprieinamas.',
19 notInDic: 'Žodyne nerastas',
20 oneChange: 'Rašybos tikrinimas baigtas: Vienas žodis pakeistas',
21 progress: 'Vyksta rašybos tikrinimas...',
22 title: 'Tikrinti klaidas',
23 toolbar: 'Rašybos tikrinimas'
24});
diff --git a/sources/plugins/wsc/lang/lv.js b/sources/plugins/wsc/lang/lv.js
new file mode 100644
index 00000000..4084468b
--- /dev/null
+++ b/sources/plugins/wsc/lang/lv.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'lv', {
6 btnIgnore: 'Ignorēt',
7 btnIgnoreAll: 'Ignorēt visu',
8 btnReplace: 'Aizvietot',
9 btnReplaceAll: 'Aizvietot visu',
10 btnUndo: 'Atcelt',
11 changeTo: 'Nomainīt uz',
12 errorLoading: 'Kļūda ielādējot aplikācijas servisa adresi: %s.',
13 ieSpellDownload: 'Pareizrakstības pārbaudītājs nav pievienots. Vai vēlaties to lejupielādēt tagad?',
14 manyChanges: 'Pareizrakstības pārbaude pabeigta: %1 vārdi tika mainīti',
15 noChanges: 'Pareizrakstības pārbaude pabeigta: nekas netika labots',
16 noMispell: 'Pareizrakstības pārbaude pabeigta: kļūdas netika atrastas',
17 noSuggestions: '- Nav ieteikumu -',
18 notAvailable: 'Atvainojiet, bet serviss šobrīd nav pieejams.',
19 notInDic: 'Netika atrasts vārdnīcā',
20 oneChange: 'Pareizrakstības pārbaude pabeigta: 1 vārds izmainīts',
21 progress: 'Notiek pareizrakstības pārbaude...',
22 title: 'Pārbaudīt gramatiku',
23 toolbar: 'Pareizrakstības pārbaude'
24});
diff --git a/sources/plugins/wsc/lang/mk.js b/sources/plugins/wsc/lang/mk.js
new file mode 100644
index 00000000..f2145814
--- /dev/null
+++ b/sources/plugins/wsc/lang/mk.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'mk', {
6 btnIgnore: 'Ignore',
7 btnIgnoreAll: 'Ignore All',
8 btnReplace: 'Replace',
9 btnReplaceAll: 'Replace All',
10 btnUndo: 'Undo',
11 changeTo: 'Change to',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Spell checker not installed. Do you want to download it now?',
14 manyChanges: 'Spell check complete: %1 words changed',
15 noChanges: 'Spell check complete: No words changed',
16 noMispell: 'Spell check complete: No misspellings found',
17 noSuggestions: '- No suggestions -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Not in dictionary',
20 oneChange: 'Spell check complete: One word changed',
21 progress: 'Spell check in progress...',
22 title: 'Spell Checker',
23 toolbar: 'Check Spelling'
24});
diff --git a/sources/plugins/wsc/lang/mn.js b/sources/plugins/wsc/lang/mn.js
new file mode 100644
index 00000000..f61f9e15
--- /dev/null
+++ b/sources/plugins/wsc/lang/mn.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'mn', {
6 btnIgnore: 'Зөвшөөрөх',
7 btnIgnoreAll: 'Бүгдийг зөвшөөрөх',
8 btnReplace: 'Солих',
9 btnReplaceAll: 'Бүгдийг Дарж бичих',
10 btnUndo: 'Буцаах',
11 changeTo: 'Өөрчлөх',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Дүрэм шалгагч суугаагүй байна. Татаж авахыг хүсч байна уу?',
14 manyChanges: 'Дүрэм шалгаад дууссан: %1 үг өөрчлөгдсөн',
15 noChanges: 'Дүрэм шалгаад дууссан: үг өөрчлөгдөөгүй',
16 noMispell: 'Дүрэм шалгаад дууссан: Алдаа олдсонгүй',
17 noSuggestions: '- Тайлбаргүй -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Толь бичиггүй',
20 oneChange: 'Дүрэм шалгаад дууссан: 1 үг өөрчлөгдсөн',
21 progress: 'Дүрэм шалгаж байгаа үйл явц...',
22 title: 'Spell Checker',
23 toolbar: 'Үгийн дүрэх шалгах'
24});
diff --git a/sources/plugins/wsc/lang/ms.js b/sources/plugins/wsc/lang/ms.js
new file mode 100644
index 00000000..a45a0346
--- /dev/null
+++ b/sources/plugins/wsc/lang/ms.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ms', {
6 btnIgnore: 'Biar',
7 btnIgnoreAll: 'Biarkan semua',
8 btnReplace: 'Ganti',
9 btnReplaceAll: 'Gantikan Semua',
10 btnUndo: 'Batalkan',
11 changeTo: 'Tukarkan kepada',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?',
14 manyChanges: 'Pemeriksaan ejaan siap: %1 perkataan diubah',
15 noChanges: 'Pemeriksaan ejaan siap: Tiada perkataan diubah',
16 noMispell: 'Pemeriksaan ejaan siap: Tiada salah ejaan',
17 noSuggestions: '- Tiada cadangan -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Tidak terdapat didalam kamus',
20 oneChange: 'Pemeriksaan ejaan siap: Satu perkataan telah diubah',
21 progress: 'Pemeriksaan ejaan sedang diproses...',
22 title: 'Spell Checker',
23 toolbar: 'Semak Ejaan'
24});
diff --git a/sources/plugins/wsc/lang/nb.js b/sources/plugins/wsc/lang/nb.js
new file mode 100644
index 00000000..02a070a2
--- /dev/null
+++ b/sources/plugins/wsc/lang/nb.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'nb', {
6 btnIgnore: 'Ignorer',
7 btnIgnoreAll: 'Ignorer alle',
8 btnReplace: 'Erstatt',
9 btnReplaceAll: 'Erstatt alle',
10 btnUndo: 'Angre',
11 changeTo: 'Endre til',
12 errorLoading: 'Feil under lasting av applikasjonstjenestetjener: %s.',
13 ieSpellDownload: 'Stavekontroll er ikke installert. Vil du laste den ned nå?',
14 manyChanges: 'Stavekontroll fullført: %1 ord endret',
15 noChanges: 'Stavekontroll fullført: ingen ord endret',
16 noMispell: 'Stavekontroll fullført: ingen feilstavinger funnet',
17 noSuggestions: '- Ingen forslag -',
18 notAvailable: 'Beklager, tjenesten er utilgjenglig nå.',
19 notInDic: 'Ikke i ordboken',
20 oneChange: 'Stavekontroll fullført: Ett ord endret',
21 progress: 'Stavekontroll pågår...',
22 title: 'Stavekontroll',
23 toolbar: 'Stavekontroll'
24});
diff --git a/sources/plugins/wsc/lang/nl.js b/sources/plugins/wsc/lang/nl.js
new file mode 100644
index 00000000..742027dc
--- /dev/null
+++ b/sources/plugins/wsc/lang/nl.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'nl', {
6 btnIgnore: 'Negeren',
7 btnIgnoreAll: 'Alles negeren',
8 btnReplace: 'Vervangen',
9 btnReplaceAll: 'Alles vervangen',
10 btnUndo: 'Ongedaan maken',
11 changeTo: 'Wijzig in',
12 errorLoading: 'Er is een fout opgetreden bij het laden van de dienst: %s.',
13 ieSpellDownload: 'De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?',
14 manyChanges: 'Klaar met spellingscontrole: %1 woorden aangepast',
15 noChanges: 'Klaar met spellingscontrole: geen woorden aangepast',
16 noMispell: 'Klaar met spellingscontrole: geen fouten gevonden',
17 noSuggestions: '- Geen suggesties -',
18 notAvailable: 'Excuses, deze dienst is momenteel niet beschikbaar.',
19 notInDic: 'Niet in het woordenboek',
20 oneChange: 'Klaar met spellingscontrole: één woord aangepast',
21 progress: 'Bezig met spellingscontrole...',
22 title: 'Spellingscontrole',
23 toolbar: 'Spellingscontrole'
24});
diff --git a/sources/plugins/wsc/lang/no.js b/sources/plugins/wsc/lang/no.js
new file mode 100644
index 00000000..416f67a3
--- /dev/null
+++ b/sources/plugins/wsc/lang/no.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'no', {
6 btnIgnore: 'Ignorer',
7 btnIgnoreAll: 'Ignorer alle',
8 btnReplace: 'Erstatt',
9 btnReplaceAll: 'Erstatt alle',
10 btnUndo: 'Angre',
11 changeTo: 'Endre til',
12 errorLoading: 'Feil under lasting av applikasjonstjenestetjener: %s.',
13 ieSpellDownload: 'Stavekontroll er ikke installert. Vil du laste den ned nå?',
14 manyChanges: 'Stavekontroll fullført: %1 ord endret',
15 noChanges: 'Stavekontroll fullført: ingen ord endret',
16 noMispell: 'Stavekontroll fullført: ingen feilstavinger funnet',
17 noSuggestions: '- Ingen forslag -',
18 notAvailable: 'Beklager, tjenesten er utilgjenglig nå.',
19 notInDic: 'Ikke i ordboken',
20 oneChange: 'Stavekontroll fullført: Ett ord endret',
21 progress: 'Stavekontroll pågår...',
22 title: 'Stavekontroll',
23 toolbar: 'Stavekontroll'
24});
diff --git a/sources/plugins/wsc/lang/pl.js b/sources/plugins/wsc/lang/pl.js
new file mode 100644
index 00000000..0f40934e
--- /dev/null
+++ b/sources/plugins/wsc/lang/pl.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'pl', {
6 btnIgnore: 'Ignoruj',
7 btnIgnoreAll: 'Ignoruj wszystkie',
8 btnReplace: 'Zmień',
9 btnReplaceAll: 'Zmień wszystkie',
10 btnUndo: 'Cofnij',
11 changeTo: 'Zmień na',
12 errorLoading: 'Błąd wczytywania hosta aplikacji usługi: %s.',
13 ieSpellDownload: 'Słownik nie jest zainstalowany. Czy chcesz go pobrać?',
14 manyChanges: 'Sprawdzanie zakończone: zmieniono %l słów',
15 noChanges: 'Sprawdzanie zakończone: nie zmieniono żadnego słowa',
16 noMispell: 'Sprawdzanie zakończone: nie znaleziono błędów',
17 noSuggestions: '- Brak sugestii -',
18 notAvailable: 'Przepraszamy, ale usługa jest obecnie niedostępna.',
19 notInDic: 'Słowa nie ma w słowniku',
20 oneChange: 'Sprawdzanie zakończone: zmieniono jedno słowo',
21 progress: 'Trwa sprawdzanie...',
22 title: 'Sprawdź pisownię',
23 toolbar: 'Sprawdź pisownię'
24});
diff --git a/sources/plugins/wsc/lang/pt-br.js b/sources/plugins/wsc/lang/pt-br.js
new file mode 100644
index 00000000..d0469357
--- /dev/null
+++ b/sources/plugins/wsc/lang/pt-br.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'pt-br', {
6 btnIgnore: 'Ignorar uma vez',
7 btnIgnoreAll: 'Ignorar Todas',
8 btnReplace: 'Alterar',
9 btnReplaceAll: 'Alterar Todas',
10 btnUndo: 'Desfazer',
11 changeTo: 'Alterar para',
12 errorLoading: 'Erro carregando servidor de aplicação: %s.',
13 ieSpellDownload: 'A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?',
14 manyChanges: 'Verificação ortográfica encerrada: %1 palavras foram alteradas',
15 noChanges: 'Verificação ortográfica encerrada: Não houve alterações',
16 noMispell: 'Verificação encerrada: Não foram encontrados erros de ortografia',
17 noSuggestions: '-sem sugestões de ortografia-',
18 notAvailable: 'Desculpe, o serviço não está disponível no momento.',
19 notInDic: 'Não encontrada',
20 oneChange: 'Verificação ortográfica encerrada: Uma palavra foi alterada',
21 progress: 'Verificação ortográfica em andamento...',
22 title: 'Corretor Ortográfico',
23 toolbar: 'Verificar Ortografia'
24});
diff --git a/sources/plugins/wsc/lang/pt.js b/sources/plugins/wsc/lang/pt.js
new file mode 100644
index 00000000..744fd28c
--- /dev/null
+++ b/sources/plugins/wsc/lang/pt.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'pt', {
6 btnIgnore: 'Ignorar',
7 btnIgnoreAll: 'Ignorar Tudo',
8 btnReplace: 'Substituir',
9 btnReplaceAll: 'Substituir Tudo',
10 btnUndo: 'Anular',
11 changeTo: 'Mudar para',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: ' Verificação ortográfica não instalada. Quer descarregar agora?',
14 manyChanges: 'Verificação ortográfica completa: %1 palavras alteradas',
15 noChanges: 'Verificação ortográfica completa: não houve alteração de palavras',
16 noMispell: 'Verificação ortográfica completa: não foram encontrados erros',
17 noSuggestions: '- Sem sugestões -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Não está num directório',
20 oneChange: 'Verificação ortográfica completa: uma palavra alterada',
21 progress: 'Verificação ortográfica em progresso…',
22 title: 'Spell Checker',
23 toolbar: 'Verificação Ortográfica'
24});
diff --git a/sources/plugins/wsc/lang/ro.js b/sources/plugins/wsc/lang/ro.js
new file mode 100644
index 00000000..c4b40e04
--- /dev/null
+++ b/sources/plugins/wsc/lang/ro.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ro', {
6 btnIgnore: 'Ignoră',
7 btnIgnoreAll: 'Ignoră toate',
8 btnReplace: 'Înlocuieşte',
9 btnReplaceAll: 'Înlocuieşte tot',
10 btnUndo: 'Starea anterioară (undo)',
11 changeTo: 'Schimbă în',
12 errorLoading: 'Eroare în lansarea aplicației service host %s.',
13 ieSpellDownload: 'Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?',
14 manyChanges: 'Verificarea textului terminată: 1% cuvinte modificate',
15 noChanges: 'Verificarea textului terminată: Niciun cuvânt modificat',
16 noMispell: 'Verificarea textului terminată: Nicio greşeală găsită',
17 noSuggestions: '- Fără sugestii -',
18 notAvailable: 'Scuzați, dar serviciul nu este disponibil momentan.',
19 notInDic: 'Nu e în dicţionar',
20 oneChange: 'Verificarea textului terminată: Un cuvânt modificat',
21 progress: 'Verificarea textului în desfăşurare...',
22 title: 'Spell Checker',
23 toolbar: 'Verifică scrierea textului'
24});
diff --git a/sources/plugins/wsc/lang/ru.js b/sources/plugins/wsc/lang/ru.js
new file mode 100644
index 00000000..d73f3018
--- /dev/null
+++ b/sources/plugins/wsc/lang/ru.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ru', {
6 btnIgnore: 'Пропустить',
7 btnIgnoreAll: 'Пропустить всё',
8 btnReplace: 'Заменить',
9 btnReplaceAll: 'Заменить всё',
10 btnUndo: 'Отменить',
11 changeTo: 'Изменить на',
12 errorLoading: 'Произошла ошибка при подключении к серверу проверки орфографии: %s.',
13 ieSpellDownload: 'Модуль проверки орфографии не установлен. Хотите скачать его?',
14 manyChanges: 'Проверка орфографии завершена. Изменено слов: %1',
15 noChanges: 'Проверка орфографии завершена. Не изменено ни одного слова',
16 noMispell: 'Проверка орфографии завершена. Ошибок не найдено',
17 noSuggestions: '- Варианты отсутствуют -',
18 notAvailable: 'Извините, но в данный момент сервис недоступен.',
19 notInDic: 'Отсутствует в словаре',
20 oneChange: 'Проверка орфографии завершена. Изменено одно слово',
21 progress: 'Орфография проверяется...',
22 title: 'Проверка орфографии',
23 toolbar: 'Проверить орфографию'
24});
diff --git a/sources/plugins/wsc/lang/sk.js b/sources/plugins/wsc/lang/sk.js
new file mode 100644
index 00000000..9c2ce037
--- /dev/null
+++ b/sources/plugins/wsc/lang/sk.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'sk', {
6 btnIgnore: 'Ignorovať',
7 btnIgnoreAll: 'Ignorovať všetko',
8 btnReplace: 'Prepísat',
9 btnReplaceAll: 'Prepísat všetko',
10 btnUndo: 'Späť',
11 changeTo: 'Zmeniť na',
12 errorLoading: 'Chyba pri načítaní slovníka z adresy: %s.',
13 ieSpellDownload: 'Kontrola pravopisu nie je naištalovaná. Chcete ju teraz stiahnuť?',
14 manyChanges: 'Kontrola pravopisu dokončená: Bolo zmenených %1 slov',
15 noChanges: 'Kontrola pravopisu dokončená: Neboli zmenené žiadne slová',
16 noMispell: 'Kontrola pravopisu dokončená: Neboli nájdené žiadne chyby pravopisu',
17 noSuggestions: '- Žiadny návrh -',
18 notAvailable: 'Prepáčte, ale služba je momentálne nedostupná.',
19 notInDic: 'Nie je v slovníku',
20 oneChange: 'Kontrola pravopisu dokončená: Bolo zmenené jedno slovo',
21 progress: 'Prebieha kontrola pravopisu...',
22 title: 'Skontrolovať pravopis',
23 toolbar: 'Kontrola pravopisu'
24});
diff --git a/sources/plugins/wsc/lang/sl.js b/sources/plugins/wsc/lang/sl.js
new file mode 100644
index 00000000..ba871234
--- /dev/null
+++ b/sources/plugins/wsc/lang/sl.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'sl', {
6 btnIgnore: 'Prezri',
7 btnIgnoreAll: 'Prezri vse',
8 btnReplace: 'Zamenjaj',
9 btnReplaceAll: 'Zamenjaj vse',
10 btnUndo: 'Razveljavi',
11 changeTo: 'Spremeni v',
12 errorLoading: 'Napaka pri nalaganju storitve programa na naslovu %s.',
13 ieSpellDownload: 'Črkovalnik ni nameščen. Ali ga želite prenesti sedaj?',
14 manyChanges: 'Črkovanje je končano: Spremenjenih je bilo %1 besed',
15 noChanges: 'Črkovanje je končano: Nobena beseda ni bila spremenjena',
16 noMispell: 'Črkovanje je končano: Brez napak',
17 noSuggestions: '- Ni predlogov -',
18 notAvailable: 'Oprostite, storitev trenutno ni dosegljiva.',
19 notInDic: 'Ni v slovarju',
20 oneChange: 'Črkovanje je končano: Spremenjena je bila ena beseda',
21 progress: 'Preverjanje črkovanja se izvaja...',
22 title: 'Črkovalnik',
23 toolbar: 'Preveri črkovanje'
24});
diff --git a/sources/plugins/wsc/lang/sr-latn.js b/sources/plugins/wsc/lang/sr-latn.js
new file mode 100644
index 00000000..f9585cc7
--- /dev/null
+++ b/sources/plugins/wsc/lang/sr-latn.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'sr-latn', {
6 btnIgnore: 'Ignoriši',
7 btnIgnoreAll: 'Ignoriši sve',
8 btnReplace: 'Zameni',
9 btnReplaceAll: 'Zameni sve',
10 btnUndo: 'Vrati akciju',
11 changeTo: 'Izmeni',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?',
14 manyChanges: 'Provera spelovanja završena: %1 reč(i) je izmenjeno',
15 noChanges: 'Provera spelovanja završena: Nije izmenjena nijedna rec',
16 noMispell: 'Provera spelovanja završena: greške nisu pronadene',
17 noSuggestions: '- Bez sugestija -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Nije u rečniku',
20 oneChange: 'Provera spelovanja završena: Izmenjena je jedna reč',
21 progress: 'Provera spelovanja u toku...',
22 title: 'Spell Checker',
23 toolbar: 'Proveri spelovanje'
24});
diff --git a/sources/plugins/wsc/lang/sr.js b/sources/plugins/wsc/lang/sr.js
new file mode 100644
index 00000000..9c4cb7f2
--- /dev/null
+++ b/sources/plugins/wsc/lang/sr.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'sr', {
6 btnIgnore: 'Игнориши',
7 btnIgnoreAll: 'Игнориши све',
8 btnReplace: 'Замени',
9 btnReplaceAll: 'Замени све',
10 btnUndo: 'Врати акцију',
11 changeTo: 'Измени',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'Провера спеловања није инсталирана. Да ли желите да је скинете са Интернета?',
14 manyChanges: 'Провера спеловања завршена: %1 реч(и) је измењено',
15 noChanges: 'Провера спеловања завршена: Није измењена ниједна реч',
16 noMispell: 'Провера спеловања завршена: грешке нису пронађене',
17 noSuggestions: '- Без сугестија -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'Није у речнику',
20 oneChange: 'Провера спеловања завршена: Измењена је једна реч',
21 progress: 'Провера спеловања у току...',
22 title: 'Spell Checker',
23 toolbar: 'Провери спеловање'
24});
diff --git a/sources/plugins/wsc/lang/sv.js b/sources/plugins/wsc/lang/sv.js
new file mode 100644
index 00000000..32e11e80
--- /dev/null
+++ b/sources/plugins/wsc/lang/sv.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'sv', {
6 btnIgnore: 'Ignorera',
7 btnIgnoreAll: 'Ignorera alla',
8 btnReplace: 'Ersätt',
9 btnReplaceAll: 'Ersätt alla',
10 btnUndo: 'Ångra',
11 changeTo: 'Ändra till',
12 errorLoading: 'Tjänsten är ej tillgänglig: %s.',
13 ieSpellDownload: 'Stavningskontrollen är ej installerad. Vill du göra det nu?',
14 manyChanges: 'Stavningskontroll slutförd: %1 ord rättades.',
15 noChanges: 'Stavningskontroll slutförd: Inga ord rättades.',
16 noMispell: 'Stavningskontroll slutförd: Inga stavfel påträffades.',
17 noSuggestions: '- Förslag saknas -',
18 notAvailable: 'Tyvärr är tjänsten ej tillgänglig nu',
19 notInDic: 'Saknas i ordlistan',
20 oneChange: 'Stavningskontroll slutförd: Ett ord rättades.',
21 progress: 'Stavningskontroll pågår...',
22 title: 'Kontrollera stavning',
23 toolbar: 'Stavningskontroll'
24});
diff --git a/sources/plugins/wsc/lang/th.js b/sources/plugins/wsc/lang/th.js
new file mode 100644
index 00000000..6e09e6cc
--- /dev/null
+++ b/sources/plugins/wsc/lang/th.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'th', {
6 btnIgnore: 'ยกเว้น',
7 btnIgnoreAll: 'ยกเว้นทั้งหมด',
8 btnReplace: 'แทนที่',
9 btnReplaceAll: 'แทนที่ทั้งหมด',
10 btnUndo: 'ยกเลิก',
11 changeTo: 'แก้ไขเป็น',
12 errorLoading: 'Error loading application service host: %s.',
13 ieSpellDownload: 'ไม่ได้ติดตั้งระบบตรวจสอบคำสะกด. ต้องการติดตั้งไหมครับ?',
14 manyChanges: 'ตรวจสอบคำสะกดเสร็จสิ้น:: แก้ไข %1 คำ',
15 noChanges: 'ตรวจสอบคำสะกดเสร็จสิ้น: ไม่มีการแก้คำใดๆ',
16 noMispell: 'ตรวจสอบคำสะกดเสร็จสิ้น: ไม่พบคำสะกดผิด',
17 noSuggestions: '- ไม่มีคำแนะนำใดๆ -',
18 notAvailable: 'Sorry, but service is unavailable now.',
19 notInDic: 'ไม่พบในดิกชันนารี',
20 oneChange: 'ตรวจสอบคำสะกดเสร็จสิ้น: แก้ไข1คำ',
21 progress: 'กำลังตรวจสอบคำสะกด...',
22 title: 'Spell Checker',
23 toolbar: 'ตรวจการสะกดคำ'
24});
diff --git a/sources/plugins/wsc/lang/tr.js b/sources/plugins/wsc/lang/tr.js
new file mode 100644
index 00000000..f400035c
--- /dev/null
+++ b/sources/plugins/wsc/lang/tr.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'tr', {
6 btnIgnore: 'Yoksay',
7 btnIgnoreAll: 'Tümünü Yoksay',
8 btnReplace: 'Değiştir',
9 btnReplaceAll: 'Tümünü Değiştir',
10 btnUndo: 'Geri Al',
11 changeTo: 'Şuna değiştir:',
12 errorLoading: 'Uygulamada yüklerken hata oluştu: %s.',
13 ieSpellDownload: 'Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?',
14 manyChanges: 'Yazım denetimi tamamlandı: %1 kelime değiştirildi',
15 noChanges: 'Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi',
16 noMispell: 'Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı',
17 noSuggestions: '- Öneri Yok -',
18 notAvailable: 'Üzügünüz, bu servis şuanda hizmet dışıdır.',
19 notInDic: 'Sözlükte Yok',
20 oneChange: 'Yazım denetimi tamamlandı: Bir kelime değiştirildi',
21 progress: 'Yazım denetimi işlemde...',
22 title: 'Yazımı Denetle',
23 toolbar: 'Yazım Denetimi'
24});
diff --git a/sources/plugins/wsc/lang/ug.js b/sources/plugins/wsc/lang/ug.js
new file mode 100644
index 00000000..273621e1
--- /dev/null
+++ b/sources/plugins/wsc/lang/ug.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'ug', {
6 btnIgnore: 'پەرۋا قىلما',
7 btnIgnoreAll: 'ھەممىگە پەرۋا قىلما',
8 btnReplace: 'ئالماشتۇر',
9 btnReplaceAll: 'ھەممىنى ئالماشتۇر',
10 btnUndo: 'يېنىۋال',
11 changeTo: 'ئۆزگەرت',
12 errorLoading: 'لازىملىق مۇلازىمېتىرنى يۈكلىگەندە خاتالىق كۆرۈلدى: %s.',
13 ieSpellDownload: 'ئىملا تەكشۈرۈش قىستۇرمىسى تېخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟',
14 manyChanges: 'ئىملا تەكشۈرۈش تامام: %1 سۆزنى ئۆزگەرتتى',
15 noChanges: 'ئىملا تەكشۈرۈش تامام: ھېچقانداق سۆزنى ئۆزگەرتمىدى',
16 noMispell: 'ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى',
17 noSuggestions: '-تەكلىپ يوق-',
18 notAvailable: 'كەچۈرۈڭ، مۇلازىمېتىرنى ۋاقتىنچە ئىشلەتكىلى بولمايدۇ',
19 notInDic: 'لۇغەتتە يوق',
20 oneChange: 'ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى',
21 progress: 'ئىملا تەكشۈرۈۋاتىدۇ…',
22 title: 'ئىملا تەكشۈر',
23 toolbar: 'ئىملا تەكشۈر'
24});
diff --git a/sources/plugins/wsc/lang/uk.js b/sources/plugins/wsc/lang/uk.js
new file mode 100644
index 00000000..a813bff1
--- /dev/null
+++ b/sources/plugins/wsc/lang/uk.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'uk', {
6 btnIgnore: 'Пропустити',
7 btnIgnoreAll: 'Пропустити все',
8 btnReplace: 'Замінити',
9 btnReplaceAll: 'Замінити все',
10 btnUndo: 'Назад',
11 changeTo: 'Замінити на',
12 errorLoading: 'Помилка завантаження : %s.',
13 ieSpellDownload: 'Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?',
14 manyChanges: 'Перевірку орфографії завершено: 1% слів(ова) змінено',
15 noChanges: 'Перевірку орфографії завершено: жодне слово не змінено',
16 noMispell: 'Перевірку орфографії завершено: помилок не знайдено',
17 noSuggestions: '- немає варіантів -',
18 notAvailable: 'Вибачте, але сервіс наразі недоступний.',
19 notInDic: 'Немає в словнику',
20 oneChange: 'Перевірку орфографії завершено: змінено одне слово',
21 progress: 'Виконується перевірка орфографії...',
22 title: 'Перевірка орфографії',
23 toolbar: 'Перевірити орфографію'
24});
diff --git a/sources/plugins/wsc/lang/vi.js b/sources/plugins/wsc/lang/vi.js
new file mode 100644
index 00000000..bba8969c
--- /dev/null
+++ b/sources/plugins/wsc/lang/vi.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'vi', {
6 btnIgnore: 'Bỏ qua',
7 btnIgnoreAll: 'Bỏ qua tất cả',
8 btnReplace: 'Thay thế',
9 btnReplaceAll: 'Thay thế tất cả',
10 btnUndo: 'Phục hồi lại',
11 changeTo: 'Chuyển thành',
12 errorLoading: 'Lỗi khi đang nạp dịch vụ ứng dụng: %s.',
13 ieSpellDownload: 'Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải về ngay bây giờ?',
14 manyChanges: 'Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi',
15 noChanges: 'Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi',
16 noMispell: 'Hoàn tất kiểm tra chính tả: Không có lỗi chính tả',
17 noSuggestions: '- Không đưa ra gợi ý về từ -',
18 notAvailable: 'Xin lỗi, dịch vụ này hiện tại không có.',
19 notInDic: 'Không có trong từ điển',
20 oneChange: 'Hoàn tất kiểm tra chính tả: Một từ đã được thay đổi',
21 progress: 'Đang tiến hành kiểm tra chính tả...',
22 title: 'Kiểm tra chính tả',
23 toolbar: 'Kiểm tra chính tả'
24});
diff --git a/sources/plugins/wsc/lang/zh-cn.js b/sources/plugins/wsc/lang/zh-cn.js
new file mode 100644
index 00000000..a2987b84
--- /dev/null
+++ b/sources/plugins/wsc/lang/zh-cn.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'zh-cn', {
6 btnIgnore: '忽略',
7 btnIgnoreAll: '全部忽略',
8 btnReplace: '替换',
9 btnReplaceAll: '全部替换',
10 btnUndo: '撤消',
11 changeTo: '更改为',
12 errorLoading: '加载应该服务主机时出错: %s.',
13 ieSpellDownload: '拼写检查插件还没安装, 您是否想现在就下载?',
14 manyChanges: '拼写检查完成: 更改了 %1 个单词',
15 noChanges: '拼写检查完成: 没有更改任何单词',
16 noMispell: '拼写检查完成: 没有发现拼写错误',
17 noSuggestions: '- 没有建议 -',
18 notAvailable: '抱歉, 服务目前暂不可用',
19 notInDic: '没有在字典里',
20 oneChange: '拼写检查完成: 更改了一个单词',
21 progress: '正在进行拼写检查...',
22 title: '拼写检查',
23 toolbar: '拼写检查'
24});
diff --git a/sources/plugins/wsc/lang/zh.js b/sources/plugins/wsc/lang/zh.js
new file mode 100644
index 00000000..a3aa83d7
--- /dev/null
+++ b/sources/plugins/wsc/lang/zh.js
@@ -0,0 +1,24 @@
1/*
2Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5CKEDITOR.plugins.setLang( 'wsc', 'zh', {
6 btnIgnore: '忽略',
7 btnIgnoreAll: '全部忽略',
8 btnReplace: '取代',
9 btnReplaceAll: '全部取代',
10 btnUndo: '復原',
11 changeTo: '更改為',
12 errorLoading: '無法聯系侍服器: %s.',
13 ieSpellDownload: '尚未安裝拼字檢查元件。您是否想要現在下載?',
14 manyChanges: '拼字檢查完成:更改了 %1 個單字',
15 noChanges: '拼字檢查完成:未更改任何單字',
16 noMispell: '拼字檢查完成:未發現拼字錯誤',
17 noSuggestions: '- 無建議值 -',
18 notAvailable: '抱歉,服務目前暫不可用',
19 notInDic: '不在字典中',
20 oneChange: '拼字檢查完成:更改了 1 個單字',
21 progress: '進行拼字檢查中…',
22 title: '拼字檢查',
23 toolbar: '拼字檢查'
24});
diff --git a/sources/plugins/wsc/plugin.js b/sources/plugins/wsc/plugin.js
new file mode 100644
index 00000000..ba443706
--- /dev/null
+++ b/sources/plugins/wsc/plugin.js
@@ -0,0 +1,142 @@
1// Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
2// For licensing, see LICENSE.md or http://ckeditor.com/license
3
4CKEDITOR.plugins.add( 'wsc', {
5 requires: 'dialog',
6 lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en-au,en-ca,en-gb,en,eo,es,et,eu,fa,fi,fo,fr-ca,fr,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,lt,lv,mk,mn,ms,nb,nl,no,pl,pt-br,pt,ro,ru,sk,sl,sr-latn,sr,sv,th,tr,ug,uk,vi,zh-cn,zh', // %REMOVE_LINE_CORE%
7 icons: 'spellchecker', // %REMOVE_LINE_CORE%
8 hidpi: true, // %REMOVE_LINE_CORE%
9 parseApi: function(editor) {
10 editor.config.wsc_onFinish = (typeof editor.config.wsc_onFinish === 'function') ? editor.config.wsc_onFinish : function() {};
11 editor.config.wsc_onClose = (typeof editor.config.wsc_onClose === 'function') ? editor.config.wsc_onClose : function() {};
12 },
13 parseConfig: function(editor) {
14 editor.config.wsc_customerId = editor.config.wsc_customerId || CKEDITOR.config.wsc_customerId || '1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk';
15 editor.config.wsc_customDictionaryIds = editor.config.wsc_customDictionaryIds || CKEDITOR.config.wsc_customDictionaryIds || '';
16 editor.config.wsc_userDictionaryName = editor.config.wsc_userDictionaryName || CKEDITOR.config.wsc_userDictionaryName || '';
17 editor.config.wsc_customLoaderScript = editor.config.wsc_customLoaderScript || CKEDITOR.config.wsc_customLoaderScript;
18
19 CKEDITOR.config.wsc_cmd = editor.config.wsc_cmd || CKEDITOR.config.wsc_cmd || 'spell'; // spell, thes or grammar. default tab
20 CKEDITOR.config.wsc_version="v4.3.0-master-d769233";
21 CKEDITOR.config.wsc_removeGlobalVariable = true;
22 },
23 init: function( editor ) {
24 var commandName = 'checkspell';
25
26 var strNormalDialog = 'dialogs/wsc.js',
27 strIeDialog = 'dialogs/wsc_ie.js',
28 strDialog,
29 self = this,
30 env = CKEDITOR.env;
31
32 self.parseConfig(editor);
33 self.parseApi(editor);
34 var command = editor.addCommand( commandName, new CKEDITOR.dialogCommand( commandName ) );
35
36 // SpellChecker doesn't work in Opera, with custom domain, IE Compatibility Mode and IE (8 & 9) Quirks Mode
37 command.modes = { wysiwyg: ( !CKEDITOR.env.opera && !CKEDITOR.env.air && document.domain == window.location.hostname &&
38 !( env.ie && ( env.version < 8 || env.quirks ) ) ) };
39
40 if(typeof editor.plugins.scayt == 'undefined'){
41 editor.ui.addButton && editor.ui.addButton( 'SpellChecker', {
42 label: editor.lang.wsc.toolbar,
43 click: function(editor) {
44 var inlineMode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE),
45 text = inlineMode ? editor.container.getText() : editor.document.getBody().getText();
46
47 text = text.replace(/\s/g, '');
48
49 if(text) {
50 editor.execCommand('checkspell');
51 } else {
52 alert('Nothing to check!');
53 }
54 },
55 toolbar: 'spellchecker,10'
56 });
57 }
58
59
60 if ( CKEDITOR.env.ie && CKEDITOR.env.version <= 7 ){
61 strDialog = strIeDialog;
62 } else {
63 if (!window.postMessage) {
64 strDialog = strIeDialog;
65 } else {
66 strDialog = strNormalDialog;
67 }
68 }
69 CKEDITOR.dialog.add( commandName, this.path + strDialog );
70 }
71
72});
73
74/**
75 * The parameter sets the customer ID for WSC. It is used for hosted users only. It is required for migration from free
76 * to trial or paid versions.
77 *
78 * config.wsc_customerId = 'encrypted-customer-id';
79 *
80 * @cfg {String} [wsc_customerId='1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk']
81 * @member CKEDITOR.config
82 */
83
84/**
85 * It links WSC to custom dictionaries. It should be a string with dictionary IDs
86 * separated by commas (`','`). Available only for the licensed version.
87 *
88 * Further details at [http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:customdictionaries:licensed](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:customdictionaries:licensed)
89 *
90 * config.wsc_customDictionaryIds = '1,3001';
91 *
92 * @cfg {String} [wsc_customDictionaryIds='']
93 * @member CKEDITOR.config
94 */
95
96/**
97 * It activates a user dictionary for WSC. The user dictionary name should be used. Available only for the licensed version.
98 *
99 * config.wsc_userDictionaryName = 'MyUserDictionaryName';
100 *
101 * @cfg {String} [wsc_userDictionaryName='']
102 * @member CKEDITOR.config
103 */
104
105/**
106 * The parameter sets the URL to WSC file. It is required to the licensed version of WSC application.
107 *
108 * Further details available at [http://wiki.webspellchecker.net/doku.php?id=migration:hosredfreetolicensedck](http://wiki.webspellchecker.net/doku.php?id=migration:hosredfreetolicensedck)
109 *
110 * config.wsc_customLoaderScript = "http://my-host/spellcheck/lf/22/js/wsc_fck2plugin.js";
111 *
112 * @cfg {String} [wsc_customLoaderScript='']
113 * @member CKEDITOR.config
114 */
115
116/**
117 * The parameter sets the default spellchecking language for WSC.
118 * Possible values are:
119 * `'en_US'`, `'en_GB'`, `'pt_BR'`, `'da_DK'`,
120 * `'nl_NL'`, `'en_CA'`, `'fi_FI'`, `'fr_FR'`,
121 * `'fr_CA'`, `'de_DE'`, `'el_GR'`, `'it_IT'`,
122 * `'nb_NO'`, `'pt_PT'`, `'es_ES'`, `'sv_SE'`.
123 *
124 * Further details available at [http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:supportedlanguages](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:supportedlanguages)
125 *
126 * config.wsc_lang = 'de_DE';
127 *
128 * @cfg {String} [wsc_lang='en_US']
129 * @member CKEDITOR.config
130 */
131
132/**
133 * The parameter sets the active tab, when the WSC dialog is opened.
134 * Possible values are:
135 * `'spell'`, `'thes'`, `'grammar'`.
136 *
137 * // Sets active tab thesaurus.
138 * config.wsc_cmd = 'thes';
139 *
140 * @cfg {String} [wsc_cmd='spell']
141 * @member CKEDITOR.config
142 */
diff --git a/sources/plugins/wysiwygarea/plugin.js b/sources/plugins/wysiwygarea/plugin.js
new file mode 100644
index 00000000..9b24257b
--- /dev/null
+++ b/sources/plugins/wysiwygarea/plugin.js
@@ -0,0 +1,708 @@
1/**
2 * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */
5
6/**
7 * @fileOverview The WYSIWYG Area plugin. It registers the "wysiwyg" editing
8 * mode, which handles the main editing area space.
9 */
10
11( function() {
12 CKEDITOR.plugins.add( 'wysiwygarea', {
13 init: function( editor ) {
14 if ( editor.config.fullPage ) {
15 editor.addFeature( {
16 allowedContent: 'html head title; style [media,type]; body (*)[id]; meta link [*]',
17 requiredContent: 'body'
18 } );
19 }
20
21 editor.addMode( 'wysiwyg', function( callback ) {
22 var src = 'document.open();' +
23 // In IE, the document domain must be set any time we call document.open().
24 ( CKEDITOR.env.ie ? '(' + CKEDITOR.tools.fixDomain + ')();' : '' ) +
25 'document.close();';
26
27 // With IE, the custom domain has to be taken care at first,
28 // for other browers, the 'src' attribute should be left empty to
29 // trigger iframe's 'load' event.
30 // Microsoft Edge throws "Permission Denied" if treated like an IE (#13441).
31 if ( CKEDITOR.env.air ) {
32 src = 'javascript:void(0)'; // jshint ignore:line
33 } else if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) {
34 src = 'javascript:void(function(){' + encodeURIComponent( src ) + '}())'; // jshint ignore:line
35 } else {
36 src = '';
37 }
38
39 var iframe = CKEDITOR.dom.element.createFromHtml( '<iframe src="' + src + '" frameBorder="0"></iframe>' );
40 iframe.setStyles( { width: '100%', height: '100%' } );
41 iframe.addClass( 'cke_wysiwyg_frame' ).addClass( 'cke_reset' );
42
43 var contentSpace = editor.ui.space( 'contents' );
44 contentSpace.append( iframe );
45
46
47 // Asynchronous iframe loading is only required in IE>8 and Gecko (other reasons probably).
48 // Do not use it on WebKit as it'll break the browser-back navigation.
49 var useOnloadEvent = ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) || CKEDITOR.env.gecko;
50 if ( useOnloadEvent )
51 iframe.on( 'load', onLoad );
52
53 var frameLabel = editor.title,
54 helpLabel = editor.fire( 'ariaEditorHelpLabel', {} ).label;
55
56 if ( frameLabel ) {
57 if ( CKEDITOR.env.ie && helpLabel )
58 frameLabel += ', ' + helpLabel;
59
60 iframe.setAttribute( 'title', frameLabel );
61 }
62
63 if ( helpLabel ) {
64 var labelId = CKEDITOR.tools.getNextId(),
65 desc = CKEDITOR.dom.element.createFromHtml( '<span id="' + labelId + '" class="cke_voice_label">' + helpLabel + '</span>' );
66
67 contentSpace.append( desc, 1 );
68 iframe.setAttribute( 'aria-describedby', labelId );
69 }
70
71 // Remove the ARIA description.
72 editor.on( 'beforeModeUnload', function( evt ) {
73 evt.removeListener();
74 if ( desc )
75 desc.remove();
76 } );
77
78 iframe.setAttributes( {
79 tabIndex: editor.tabIndex,
80 allowTransparency: 'true'
81 } );
82
83 // Execute onLoad manually for all non IE||Gecko browsers.
84 !useOnloadEvent && onLoad();
85
86 editor.fire( 'ariaWidget', iframe );
87
88 function onLoad( evt ) {
89 evt && evt.removeListener();
90 editor.editable( new framedWysiwyg( editor, iframe.$.contentWindow.document.body ) );
91 editor.setData( editor.getData( 1 ), callback );
92 }
93 } );
94 }
95 } );
96
97 /**
98 * Adds the path to a stylesheet file to the exisiting {@link CKEDITOR.config#contentsCss} value.
99 *
100 * **Note:** This method is available only with the `wysiwygarea` plugin and only affects
101 * classic editors based on it (so it does not affect inline editors).
102 *
103 * editor.addContentsCss( 'assets/contents.css' );
104 *
105 * @since 4.4
106 * @param {String} cssPath The path to the stylesheet file which should be added.
107 * @member CKEDITOR.editor
108 */
109 CKEDITOR.editor.prototype.addContentsCss = function( cssPath ) {
110 var cfg = this.config,
111 curContentsCss = cfg.contentsCss;
112
113 // Convert current value into array.
114 if ( !CKEDITOR.tools.isArray( curContentsCss ) )
115 cfg.contentsCss = curContentsCss ? [ curContentsCss ] : [];
116
117 cfg.contentsCss.push( cssPath );
118 };
119
120 function onDomReady( win ) {
121 var editor = this.editor,
122 doc = win.document,
123 body = doc.body;
124
125 // Remove helper scripts from the DOM.
126 var script = doc.getElementById( 'cke_actscrpt' );
127 script && script.parentNode.removeChild( script );
128 script = doc.getElementById( 'cke_shimscrpt' );
129 script && script.parentNode.removeChild( script );
130 script = doc.getElementById( 'cke_basetagscrpt' );
131 script && script.parentNode.removeChild( script );
132
133 body.contentEditable = true;
134
135 if ( CKEDITOR.env.ie ) {
136 // Don't display the focus border.
137 body.hideFocus = true;
138
139 // Disable and re-enable the body to avoid IE from
140 // taking the editing focus at startup. (#141 / #523)
141 body.disabled = true;
142 body.removeAttribute( 'disabled' );
143 }
144
145 delete this._.isLoadingData;
146
147 // Play the magic to alter element reference to the reloaded one.
148 this.$ = body;
149
150 doc = new CKEDITOR.dom.document( doc );
151
152 this.setup();
153 this.fixInitialSelection();
154
155 var editable = this;
156
157 // Without it IE8 has problem with removing selection in nested editable. (#13785)
158 if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) {
159 doc.getDocumentElement().addClass( doc.$.compatMode );
160 }
161
162 // Prevent IE/Edge from leaving a new paragraph/div after deleting all contents in body. (#6966, #13142)
163 if ( CKEDITOR.env.ie && !CKEDITOR.env.edge && editor.enterMode != CKEDITOR.ENTER_P ) {
164 removeSuperfluousElement( 'p' );
165 } else if ( CKEDITOR.env.edge && editor.enterMode != CKEDITOR.ENTER_DIV ) {
166 removeSuperfluousElement( 'div' );
167 }
168
169 // Fix problem with cursor not appearing in Webkit and IE11+ when clicking below the body (#10945, #10906).
170 // Fix for older IEs (8-10 and QM) is placed inside selection.js.
171 if ( CKEDITOR.env.webkit || ( CKEDITOR.env.ie && CKEDITOR.env.version > 10 ) ) {
172 doc.getDocumentElement().on( 'mousedown', function( evt ) {
173 if ( evt.data.getTarget().is( 'html' ) ) {
174 // IE needs this timeout. Webkit does not, but it does not cause problems too.
175 setTimeout( function() {
176 editor.editable().focus();
177 } );
178 }
179 } );
180 }
181
182 // Config props: disableObjectResizing and disableNativeTableHandles handler.
183 objectResizeDisabler( editor );
184
185 // Enable dragging of position:absolute elements in IE.
186 try {
187 editor.document.$.execCommand( '2D-position', false, true );
188 } catch ( e ) {}
189
190 if ( CKEDITOR.env.gecko || CKEDITOR.env.ie && editor.document.$.compatMode == 'CSS1Compat' ) {
191 this.attachListener( this, 'keydown', function( evt ) {
192 var keyCode = evt.data.getKeystroke();
193
194 // PageUp OR PageDown
195 if ( keyCode == 33 || keyCode == 34 ) {
196 // PageUp/PageDown scrolling is broken in document
197 // with standard doctype, manually fix it. (#4736)
198 if ( CKEDITOR.env.ie ) {
199 setTimeout( function() {
200 editor.getSelection().scrollIntoView();
201 }, 0 );
202 }
203 // Page up/down cause editor selection to leak
204 // outside of editable thus we try to intercept
205 // the behavior, while it affects only happen
206 // when editor contents are not overflowed. (#7955)
207 else if ( editor.window.$.innerHeight > this.$.offsetHeight ) {
208 var range = editor.createRange();
209 range[ keyCode == 33 ? 'moveToElementEditStart' : 'moveToElementEditEnd' ]( this );
210 range.select();
211 evt.data.preventDefault();
212 }
213 }
214 } );
215 }
216
217 if ( CKEDITOR.env.ie ) {
218 // [IE] Iframe will still keep the selection when blurred, if
219 // focus is moved onto a non-editing host, e.g. link or button, but
220 // it becomes a problem for the object type selection, since the resizer
221 // handler attached on it will mark other part of the UI, especially
222 // for the dialog. (#8157)
223 // [IE<8 & Opera] Even worse For old IEs, the cursor will not vanish even if
224 // the selection has been moved to another text input in some cases. (#4716)
225 //
226 // Now the range restore is disabled, so we simply force IE to clean
227 // up the selection before blur.
228 this.attachListener( doc, 'blur', function() {
229 // Error proof when the editor is not visible. (#6375)
230 try {
231 doc.$.selection.empty();
232 } catch ( er ) {}
233 } );
234 }
235
236 if ( CKEDITOR.env.iOS ) {
237 // [iOS] If touch is bound to any parent of the iframe blur happens on any touch
238 // event and body becomes the focused element (#10714).
239 this.attachListener( doc, 'touchend', function() {
240 win.focus();
241 } );
242 }
243
244 var title = editor.document.getElementsByTag( 'title' ).getItem( 0 );
245 // document.title is malfunctioning on Chrome, so get value from the element (#12402).
246 title.data( 'cke-title', title.getText() );
247
248 // [IE] JAWS will not recognize the aria label we used on the iframe
249 // unless the frame window title string is used as the voice label,
250 // backup the original one and restore it on output.
251 if ( CKEDITOR.env.ie )
252 editor.document.$.title = this._.docTitle;
253
254 CKEDITOR.tools.setTimeout( function() {
255 // Editable is ready after first setData.
256 if ( this.status == 'unloaded' )
257 this.status = 'ready';
258
259 editor.fire( 'contentDom' );
260
261 if ( this._.isPendingFocus ) {
262 editor.focus();
263 this._.isPendingFocus = false;
264 }
265
266 setTimeout( function() {
267 editor.fire( 'dataReady' );
268 }, 0 );
269 }, 0, this );
270
271 function removeSuperfluousElement( tagName ) {
272 var lockRetain = false;
273
274 // Superfluous elements appear after keydown
275 // and before keyup, so the procedure is as follows:
276 // 1. On first keydown mark all elements with
277 // a specified tag name as non-superfluous.
278 editable.attachListener( editable, 'keydown', function() {
279 var body = doc.getBody(),
280 retained = body.getElementsByTag( tagName );
281
282 if ( !lockRetain ) {
283 for ( var i = 0; i < retained.count(); i++ ) {
284 retained.getItem( i ).setCustomData( 'retain', true );
285 }
286 lockRetain = true;
287 }
288 }, null, null, 1 );
289
290 // 2. On keyup remove all elements that were not marked
291 // as non-superfluous (which means they must have had appeared in the meantime).
292 editable.attachListener( editable, 'keyup', function() {
293 var elements = doc.getElementsByTag( tagName );
294 if ( lockRetain ) {
295 if ( elements.count() == 1 && !elements.getItem( 0 ).getCustomData( 'retain' ) ) {
296 elements.getItem( 0 ).remove( 1 );
297 }
298 lockRetain = false;
299 }
300 } );
301 }
302 }
303
304 var framedWysiwyg = CKEDITOR.tools.createClass( {
305 $: function() {
306 this.base.apply( this, arguments );
307
308 this._.frameLoadedHandler = CKEDITOR.tools.addFunction( function( win ) {
309 // Avoid opening design mode in a frame window thread,
310 // which will cause host page scrolling.(#4397)
311 CKEDITOR.tools.setTimeout( onDomReady, 0, this, win );
312 }, this );
313
314 this._.docTitle = this.getWindow().getFrame().getAttribute( 'title' );
315 },
316
317 base: CKEDITOR.editable,
318
319 proto: {
320 setData: function( data, isSnapshot ) {
321 var editor = this.editor;
322
323 if ( isSnapshot ) {
324 this.setHtml( data );
325 this.fixInitialSelection();
326
327 // Fire dataReady for the consistency with inline editors
328 // and because it makes sense. (#10370)
329 editor.fire( 'dataReady' );
330 }
331 else {
332 this._.isLoadingData = true;
333 editor._.dataStore = { id: 1 };
334
335 var config = editor.config,
336 fullPage = config.fullPage,
337 docType = config.docType;
338
339 // Build the additional stuff to be included into <head>.
340 var headExtra = CKEDITOR.tools.buildStyleHtml( iframeCssFixes() ).replace( /<style>/, '<style data-cke-temp="1">' );
341
342 if ( !fullPage )
343 headExtra += CKEDITOR.tools.buildStyleHtml( editor.config.contentsCss );
344
345 var baseTag = config.baseHref ? '<base href="' + config.baseHref + '" data-cke-temp="1" />' : '';
346
347 if ( fullPage ) {
348 // Search and sweep out the doctype declaration.
349 data = data.replace( /<!DOCTYPE[^>]*>/i, function( match ) {
350 editor.docType = docType = match;
351 return '';
352 } ).replace( /<\?xml\s[^\?]*\?>/i, function( match ) {
353 editor.xmlDeclaration = match;
354 return '';
355 } );
356 }
357
358 // Get the HTML version of the data.
359 data = editor.dataProcessor.toHtml( data );
360
361 if ( fullPage ) {
362 // Check if the <body> tag is available.
363 if ( !( /<body[\s|>]/ ).test( data ) )
364 data = '<body>' + data;
365
366 // Check if the <html> tag is available.
367 if ( !( /<html[\s|>]/ ).test( data ) )
368 data = '<html>' + data + '</html>';
369
370 // Check if the <head> tag is available.
371 if ( !( /<head[\s|>]/ ).test( data ) )
372 data = data.replace( /<html[^>]*>/, '$&<head><title></title></head>' );
373 else if ( !( /<title[\s|>]/ ).test( data ) )
374 data = data.replace( /<head[^>]*>/, '$&<title></title>' );
375
376 // The base must be the first tag in the HEAD, e.g. to get relative
377 // links on styles.
378 baseTag && ( data = data.replace( /<head[^>]*?>/, '$&' + baseTag ) );
379
380 // Inject the extra stuff into <head>.
381 // Attention: do not change it before testing it well. (V2)
382 // This is tricky... if the head ends with <meta ... content type>,
383 // Firefox will break. But, it works if we place our extra stuff as
384 // the last elements in the HEAD.
385 data = data.replace( /<\/head\s*>/, headExtra + '$&' );
386
387 // Add the DOCTYPE back to it.
388 data = docType + data;
389 } else {
390 data = config.docType +
391 '<html dir="' + config.contentsLangDirection + '"' +
392 ' lang="' + ( config.contentsLanguage || editor.langCode ) + '">' +
393 '<head>' +
394 '<title>' + this._.docTitle + '</title>' +
395 baseTag +
396 headExtra +
397 '</head>' +
398 '<body' + ( config.bodyId ? ' id="' + config.bodyId + '"' : '' ) +
399 ( config.bodyClass ? ' class="' + config.bodyClass + '"' : '' ) +
400 '>' +
401 data +
402 '</body>' +
403 '</html>';
404 }
405
406 if ( CKEDITOR.env.gecko ) {
407 // Hack to make Fx put cursor at the start of doc on fresh focus.
408 data = data.replace( /<body/, '<body contenteditable="true" ' );
409
410 // Another hack which is used by onDomReady to remove a leading
411 // <br> which is inserted by Firefox 3.6 when document.write is called.
412 // This additional <br> is present because of contenteditable="true"
413 if ( CKEDITOR.env.version < 20000 )
414 data = data.replace( /<body[^>]*>/, '$&<!-- cke-content-start -->' );
415 }
416
417 // The script that launches the bootstrap logic on 'domReady', so the document
418 // is fully editable even before the editing iframe is fully loaded (#4455).
419 var bootstrapCode =
420 '<script id="cke_actscrpt" type="text/javascript"' + ( CKEDITOR.env.ie ? ' defer="defer" ' : '' ) + '>' +
421 'var wasLoaded=0;' + // It must be always set to 0 as it remains as a window property.
422 'function onload(){' +
423 'if(!wasLoaded)' + // FF3.6 calls onload twice when editor.setData. Stop that.
424 'window.parent.CKEDITOR.tools.callFunction(' + this._.frameLoadedHandler + ',window);' +
425 'wasLoaded=1;' +
426 '}' +
427 ( CKEDITOR.env.ie ? 'onload();' : 'document.addEventListener("DOMContentLoaded", onload, false );' ) +
428 '</script>';
429
430 // For IE<9 add support for HTML5's elements.
431 // Note: this code must not be deferred.
432 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) {
433 bootstrapCode +=
434 '<script id="cke_shimscrpt">' +
435 'window.parent.CKEDITOR.tools.enableHtml5Elements(document)' +
436 '</script>';
437 }
438
439 // IE<10 needs this hack to properly enable <base href="...">.
440 // See: http://stackoverflow.com/a/13373180/1485219 (#11910).
441 if ( baseTag && CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
442 bootstrapCode +=
443 '<script id="cke_basetagscrpt">' +
444 'var baseTag = document.querySelector( "base" );' +
445 'baseTag.href = baseTag.href;' +
446 '</script>';
447 }
448
449 data = data.replace( /(?=\s*<\/(:?head)>)/, bootstrapCode );
450
451 // Current DOM will be deconstructed by document.write, cleanup required.
452 this.clearCustomData();
453 this.clearListeners();
454
455 editor.fire( 'contentDomUnload' );
456
457 var doc = this.getDocument();
458
459 // Work around Firefox bug - error prune when called from XUL (#320),
460 // defer it thanks to the async nature of this method.
461 try {
462 doc.write( data );
463 } catch ( e ) {
464 setTimeout( function() {
465 doc.write( data );
466 }, 0 );
467 }
468 }
469 },
470
471 getData: function( isSnapshot ) {
472 if ( isSnapshot )
473 return this.getHtml();
474 else {
475 var editor = this.editor,
476 config = editor.config,
477 fullPage = config.fullPage,
478 docType = fullPage && editor.docType,
479 xmlDeclaration = fullPage && editor.xmlDeclaration,
480 doc = this.getDocument();
481
482 var data = fullPage ? doc.getDocumentElement().getOuterHtml() : doc.getBody().getHtml();
483
484 // BR at the end of document is bogus node for Mozilla. (#5293).
485 // Prevent BRs from disappearing from the end of the content
486 // while enterMode is ENTER_BR (#10146).
487 if ( CKEDITOR.env.gecko && config.enterMode != CKEDITOR.ENTER_BR )
488 data = data.replace( /<br>(?=\s*(:?$|<\/body>))/, '' );
489
490 data = editor.dataProcessor.toDataFormat( data );
491
492 if ( xmlDeclaration )
493 data = xmlDeclaration + '\n' + data;
494 if ( docType )
495 data = docType + '\n' + data;
496
497 return data;
498 }
499 },
500
501 focus: function() {
502 if ( this._.isLoadingData )
503 this._.isPendingFocus = true;
504 else
505 framedWysiwyg.baseProto.focus.call( this );
506 },
507
508 detach: function() {
509 var editor = this.editor,
510 doc = editor.document,
511 iframe,
512 onResize;
513
514 // Trying to access window's frameElement property on Edge throws an exception
515 // when frame was already removed from DOM. (#13850, #13790)
516 try {
517 iframe = editor.window.getFrame();
518 } catch ( e ) {}
519
520 framedWysiwyg.baseProto.detach.call( this );
521
522 // Memory leak proof.
523 this.clearCustomData();
524 doc.getDocumentElement().clearCustomData();
525 CKEDITOR.tools.removeFunction( this._.frameLoadedHandler );
526
527 // On IE, iframe is returned even after remove() method is called on it.
528 // Checking if parent is present fixes this issue. (#13850)
529 if ( iframe && iframe.getParent() ) {
530 iframe.clearCustomData();
531 onResize = iframe.removeCustomData( 'onResize' );
532 onResize && onResize.removeListener();
533
534 // IE BUG: When destroying editor DOM with the selection remains inside
535 // editing area would break IE7/8's selection system, we have to put the editing
536 // iframe offline first. (#3812 and #5441)
537 iframe.remove();
538 } else {
539 CKEDITOR.warn( 'editor-destroy-iframe' );
540 }
541 }
542 }
543 } );
544
545 function objectResizeDisabler( editor ) {
546 if ( CKEDITOR.env.gecko ) {
547 // FF allows to change resizing preferences by calling execCommand.
548 try {
549 var doc = editor.document.$;
550 doc.execCommand( 'enableObjectResizing', false, !editor.config.disableObjectResizing );
551 doc.execCommand( 'enableInlineTableEditing', false, !editor.config.disableNativeTableHandles );
552 } catch ( e ) {}
553 } else if ( CKEDITOR.env.ie && CKEDITOR.env.version < 11 && editor.config.disableObjectResizing ) {
554 // It's possible to prevent resizing up to IE10.
555 blockResizeStart( editor );
556 }
557
558 // Disables resizing by preventing default action on resizestart event.
559 function blockResizeStart() {
560 var lastListeningElement;
561
562 // We'll attach only one listener at a time, instead of adding it to every img, input, hr etc.
563 // Listener will be attached upon selectionChange, we'll also check if there was any element that
564 // got listener before (lastListeningElement) - if so we need to remove previous listener.
565 editor.editable().attachListener( editor, 'selectionChange', function() {
566 var selectedElement = editor.getSelection().getSelectedElement();
567
568 if ( selectedElement ) {
569 if ( lastListeningElement ) {
570 lastListeningElement.detachEvent( 'onresizestart', resizeStartListener );
571 lastListeningElement = null;
572 }
573
574 // IE requires using attachEvent, because it does not work using W3C compilant addEventListener,
575 // tested with IE10.
576 selectedElement.$.attachEvent( 'onresizestart', resizeStartListener );
577 lastListeningElement = selectedElement.$;
578 }
579 } );
580 }
581
582 function resizeStartListener( evt ) {
583 evt.returnValue = false;
584 }
585 }
586
587 function iframeCssFixes() {
588 var css = [];
589
590 // IE>=8 stricts mode doesn't have 'contentEditable' in effect
591 // on element unless it has layout. (#5562)
592 if ( CKEDITOR.document.$.documentMode >= 8 ) {
593 css.push( 'html.CSS1Compat [contenteditable=false]{min-height:0 !important}' );
594
595 var selectors = [];
596
597 for ( var tag in CKEDITOR.dtd.$removeEmpty )
598 selectors.push( 'html.CSS1Compat ' + tag + '[contenteditable=false]' );
599
600 css.push( selectors.join( ',' ) + '{display:inline-block}' );
601 }
602 // Set the HTML style to 100% to have the text cursor in affect (#6341)
603 else if ( CKEDITOR.env.gecko ) {
604 css.push( 'html{height:100% !important}' );
605 css.push( 'img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}' );
606 }
607
608 // #6341: The text cursor must be set on the editor area.
609 // #6632: Avoid having "text" shape of cursor in IE7 scrollbars.
610 css.push( 'html{cursor:text;*cursor:auto}' );
611
612 // Use correct cursor for these elements
613 css.push( 'img,input,textarea{cursor:default}' );
614
615 return css.join( '\n' );
616 }
617} )();
618
619/**
620 * Disables the ability to resize objects (images and tables) in the editing area.
621 *
622 * config.disableObjectResizing = true;
623 *
624 * **Note:** Because of incomplete implementation of editing features in browsers
625 * this option does not work for inline editors (see ticket [#10197](http://dev.ckeditor.com/ticket/10197)),
626 * does not work in Internet Explorer 11+ (see [#9317](http://dev.ckeditor.com/ticket/9317#comment:16) and
627 * [IE11+ issue](https://connect.microsoft.com/IE/feedback/details/742593/please-respect-execcommand-enableobjectresizing-in-contenteditable-elements)).
628 * In Internet Explorer 8-10 this option only blocks resizing, but it is unable to hide the resize handles.
629 *
630 * @cfg
631 * @member CKEDITOR.config
632 */
633CKEDITOR.config.disableObjectResizing = false;
634
635/**
636 * Disables the "table tools" offered natively by the browser (currently
637 * Firefox only) to perform quick table editing operations, like adding or
638 * deleting rows and columns.
639 *
640 * config.disableNativeTableHandles = false;
641 *
642 * @cfg
643 * @member CKEDITOR.config
644 */
645CKEDITOR.config.disableNativeTableHandles = true;
646
647/**
648 * Disables the built-in spell checker if the browser provides one.
649 *
650 * **Note:** Although word suggestions provided natively by the browsers will
651 * not appear in CKEditor's default context menu,
652 * users can always reach the native context menu by holding the
653 * *Ctrl* key when right-clicking if {@link #browserContextMenuOnCtrl}
654 * is enabled or you are simply not using the
655 * [context menu](http://ckeditor.com/addon/contextmenu) plugin.
656 *
657 * config.disableNativeSpellChecker = false;
658 *
659 * @cfg
660 * @member CKEDITOR.config
661 */
662CKEDITOR.config.disableNativeSpellChecker = true;
663
664/**
665 * Language code of the writing language which is used to author the editor
666 * content. This option accepts one single entry value in the format defined in the
667 * [Tags for Identifying Languages (BCP47)](http://www.ietf.org/rfc/bcp/bcp47.txt)
668 * IETF document and is used in the `lang` attribute.
669 *
670 * config.contentsLanguage = 'fr';
671 *
672 * @cfg {String} [contentsLanguage=same value with editor's UI language]
673 * @member CKEDITOR.config
674 */
675
676/**
677 * The base href URL used to resolve relative and absolute URLs in the
678 * editor content.
679 *
680 * config.baseHref = 'http://www.example.com/path/';
681 *
682 * @cfg {String} [baseHref='']
683 * @member CKEDITOR.config
684 */
685
686/**
687 * Whether to automatically create wrapping blocks around inline content inside the document body.
688 * This helps to ensure the integrity of the block *Enter* mode.
689 *
690 * **Note:** This option is deprecated. Changing the default value might introduce unpredictable usability issues and is
691 * highly unrecommended.
692 *
693 * config.autoParagraph = false;
694 *
695 * @deprecated
696 * @since 3.6
697 * @cfg {Boolean} [autoParagraph=true]
698 * @member CKEDITOR.config
699 */
700
701/**
702 * Fired when some elements are added to the document.
703 *
704 * @event ariaWidget
705 * @member CKEDITOR.editor
706 * @param {CKEDITOR.editor} editor This editor instance.
707 * @param {CKEDITOR.dom.element} data The element being added.
708 */
diff --git a/sources/plugins/wysiwygarea/samples/fullpage.html b/sources/plugins/wysiwygarea/samples/fullpage.html
new file mode 100644
index 00000000..35ae7d0b
--- /dev/null
+++ b/sources/plugins/wysiwygarea/samples/fullpage.html
@@ -0,0 +1,80 @@
1<!DOCTYPE html>
2<!--
3Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license
5-->
6<html>
7<head>
8 <meta charset="utf-8">
9 <title>Full Page Editing &mdash; CKEditor Sample</title>
10 <script src="../../../ckeditor.js"></script>
11 <script src="../../../samples/old/sample.js"></script>
12 <link rel="stylesheet" href="../../../samples/old/sample.css">
13 <meta name="ckeditor-sample-required-plugins" content="sourcearea">
14 <meta name="ckeditor-sample-name" content="Full page support">
15 <meta name="ckeditor-sample-group" content="Plugins">
16 <meta name="ckeditor-sample-description" content="CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.">
17</head>
18<body>
19 <h1 class="samples">
20 <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Full Page Editing
21 </h1>
22 <div class="warning deprecated">
23 This sample is not maintained anymore. Check out its <a href="http://sdk.ckeditor.com/samples/fullpage.html">brand new version in CKEditor SDK</a>.
24 </div>
25 <div class="description">
26 <p>
27 This sample shows how to configure CKEditor to edit entire HTML pages, from the
28 <code>&lt;html&gt;</code> tag to the <code>&lt;/html&gt;</code> tag.
29 </p>
30 <p>
31 The CKEditor instance below is inserted with a JavaScript call using the following code:
32 </p>
33<pre class="samples">
34CKEDITOR.replace( '<em>textarea_id</em>', {
35 <strong>fullPage: true</strong>,
36 <strong>allowedContent: true</strong>
37});
38</pre>
39 <p>
40 Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
41 the <code>&lt;textarea&gt;</code> element to be replaced.
42 </p>
43 <p>
44 The <code><em>allowedContent</em></code> in the code above is set to <code>true</code> to disable content filtering.
45 Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations.
46 </p>
47 </div>
48 <form action="../../../samples/sample_posteddata.php" method="post">
49 <label for="editor1">
50 CKEditor output the entire page including content outside of
51 <code>&lt;body&gt;</code> element, so content like meta and title can be changed:
52 </label>
53 <textarea cols="80" id="editor1" name="editor1" rows="10">
54 &lt;h1&gt;&lt;img align=&quot;right&quot; alt=&quot;Saturn V carrying Apollo 11&quot; src=&quot;../../../samples/old/assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, 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.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;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 &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. 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 &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
55 </textarea>
56 <script>
57
58 CKEDITOR.replace( 'editor1', {
59 fullPage: true,
60 allowedContent: true,
61 extraPlugins: 'wysiwygarea'
62 });
63
64 </script>
65 <p>
66 <input type="submit" value="Submit">
67 </p>
68 </form>
69 <div id="footer">
70 <hr>
71 <p>
72 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
73 </p>
74 <p id="copy">
75 Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
76 Knabben. All rights reserved.
77 </p>
78 </div>
79</body>
80</html>