'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ id : 'about',
+ label : scayt_instance.getLocal('tab_about'),
+ elements : [
+ {
+ type : 'html',
+ id : 'about',
+ style : 'margin: 5px 5px;',
+ html : '
' +
+ aboutTabDefinition +
+ '
'
+ }
+ ]
+ }];
+
+ editor.on("scaytUserDictionaryAction", function(event) {
+ var UILib = SCAYT.prototype.UILib,
+ dialog = event.data.dialog,
+ dictionaryNote = dialog.getContentElement("dictionaries", "dictionaryNote").getElement(),
+ scayt_instance = event.editor.scayt,
+ messageTemplate;
+
+ if(event.data.error === undefined) {
+
+ // success message
+ messageTemplate = scayt_instance.getLocal("message_success_" + event.data.command + "Dic");
+ messageTemplate = messageTemplate.replace('%s', event.data.name);
+ dictionaryNote.setText(messageTemplate);
+ UILib.css(dictionaryNote.$, {color: 'blue'});
+ } else {
+
+ // error message
+ if(event.data.name === '') {
+
+ // empty dictionary name
+ dictionaryNote.setText(scayt_instance.getLocal('message_info_emptyDic'));
+ } else {
+ messageTemplate = scayt_instance.getLocal("message_error_" + event.data.command + "Dic");
+ messageTemplate = messageTemplate.replace('%s', event.data.name);
+ dictionaryNote.setText(messageTemplate);
+ }
+ UILib.css(dictionaryNote.$, {color: 'red'});
+
+ if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+ dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+ } else {
+ dialog.getContentElement("dictionaries", "dictionaryName").setValue("");
+ }
+ }
+ });
+
+ editor.on("scaytUserDictionaryActionError", function(event) {
+ var UILib = SCAYT.prototype.UILib,
+ dialog = event.data.dialog,
+ dictionaryNote = dialog.getContentElement("dictionaries", "dictionaryNote").getElement(),
+ scayt_instance = event.editor.scayt,
+ messageTemplate;
+
+ if(event.data.name === '') {
+
+ // empty dictionary name
+ dictionaryNote.setText(scayt_instance.getLocal('message_info_emptyDic'));
+ } else {
+ messageTemplate = scayt_instance.getLocal("message_error_" + event.data.command + "Dic");
+ messageTemplate = messageTemplate.replace('%s', event.data.name);
+ dictionaryNote.setText(messageTemplate);
+ }
+ UILib.css(dictionaryNote.$, {color: 'red'});
+
+
+ if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+ dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+ } else {
+ dialog.getContentElement("dictionaries", "dictionaryName").setValue("");
+ }
+
+ });
+
+ var plugin = CKEDITOR.plugins.scayt;
+
+ var dialogDefinition = {
+ title: scayt_instance.getLocal('text_title'),
+ resizable: CKEDITOR.DIALOG_RESIZE_BOTH,
+ minWidth: 340,
+ minHeight: 260,
+ onLoad: function() {
+ if(editor.config.scayt_uiTabs[1] == 0) {
+ return;
+ }
+
+ var dialog = this,
+ self = dialogDefinition,
+ langBoxes = self.getLangBoxes.call(dialog);
+
+ langBoxes.getParent().setStyle("white-space", "normal");
+
+ //dialog.data = editor.fire( 'scaytDialog', {} );
+ self.renderLangList(langBoxes);
+
+ var scayt_instance = editor.scayt;
+
+ this.definition.minWidth = this.getSize().width;
+ this.resize(this.definition.minWidth, this.definition.minHeight);
+ },
+ onCancel: function() {
+ languageModelState.reset();
+ },
+ onHide: function() {
+ editor.unlockSelection();
+ },
+ onShow: function() {
+ editor.fire("scaytDialogShown", this);
+
+ if(editor.config.scayt_uiTabs[2] == 0) {
+ return;
+ }
+
+ var scayt_instance = editor.scayt,
+ self = dialogDefinition,
+ dialog = this,
+ dictionaryNameField = dialog.getContentElement("dictionaries", "dictionaryName"),
+ existance = dialog.getContentElement("dictionaries", "existDic").getElement().getParent(),
+ notExistance = dialog.getContentElement("dictionaries", "notExistDic").getElement().getParent();
+
+ existance.hide();
+ notExistance.hide();
+
+ if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+ dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+ existance.show();
+ } else {
+ dictionaryNameField.setValue("");
+ notExistance.show();
+ }
+ },
+ onOk: function() {
+ var dialog = this,
+ self = dialogDefinition,
+ scayt_instance = editor.scayt,
+ scaytOptions = dialog.getContentElement("options", "scaytOptions"),
+ changedOptions = self.getChangedOption.call(dialog);
+
+ scayt_instance.commitOption({ changedOptions: changedOptions });
+ },
+ toggleDictionaryButtons: function(exist) {
+ var existance = this.getContentElement("dictionaries", "existDic").getElement().getParent(),
+ notExistance = this.getContentElement("dictionaries", "notExistDic").getElement().getParent();
+
+ if(exist) {
+ existance.show();
+ notExistance.hide();
+ } else {
+ existance.hide();
+ notExistance.show();
+ }
+
+ },
+ getChangedOption: function() {
+ var changedOption = {};
+
+ if(editor.config.scayt_uiTabs[0] == 1) {
+ var dialog = this,
+ scaytOptions = dialog.getContentElement("options", "scaytOptions").getChild();
+
+ for(var i = 0; i < scaytOptions.length; i++) {
+ if(scaytOptions[i].isChanged()) {
+ changedOption[scaytOptions[i].id] = scaytOptions[i].getValue();
+ }
+ }
+ }
+
+ if(languageModelState.isChanged()) {
+ changedOption[languageModelState.id] = editor.config.scayt_sLang = languageModelState.currentLang = languageModelState.newLang;
+ }
+
+ return changedOption;
+ },
+ buildRadioInputs: function(key, value, isSupportedByGrayt) {
+ var divContainer = new CKEDITOR.dom.element( 'div' ),
+ doc = CKEDITOR.document,
+ id = "scaytLang_" + editor.name + '_' + value,
+ radio = CKEDITOR.dom.element.createFromHtml( '' ),
+
+ radioLabel = new CKEDITOR.dom.element( 'label' ),
+ scayt_instance = editor.scayt;
+
+ divContainer.setStyles({
+ "white-space": "normal",
+ 'position': 'relative',
+ 'padding-bottom': '2px'
+ });
+
+ radio.on( 'click', function(data) {
+ languageModelState.newLang = data.sender.getValue();
+ });
+
+ radioLabel.appendText(key);
+ radioLabel.setAttribute("for", id);
+
+ if(isSupportedByGrayt && editor.config.grayt_autoStartup) {
+ radioLabel.setStyles({
+ 'color': '#02b620'
+ });
+ }
+
+ divContainer.append(radio);
+ divContainer.append(radioLabel);
+
+ if(value === scayt_instance.getLang()) {
+ radio.setAttribute("checked", true);
+ radio.setAttribute('defaultChecked', 'defaultChecked');
+ }
+
+ return divContainer;
+ },
+ renderLangList: function(langBoxes) {
+ var dialog = this,
+ leftCol = langBoxes.find('#left-col-' + editor.name).getItem(0),
+ rightCol = langBoxes.find('#right-col-' + editor.name).getItem(0),
+ scaytLangList = scayt_instance.getScaytLangList(),
+ graytLangList = scayt_instance.getGraytLangList(),
+ mergedLangList = {},
+ sortable = [],
+ counter = 0,
+ isSupportedByGrayt = false,
+ half, lang;
+
+ for(lang in scaytLangList.ltr) {
+ mergedLangList[lang] = scaytLangList.ltr[lang];
+ }
+
+ for(lang in scaytLangList.rtl) {
+ mergedLangList[lang] = scaytLangList.rtl[lang];
+ }
+
+ // sort alphabetically lang list
+ for(lang in mergedLangList) {
+ sortable.push([lang, mergedLangList[lang]]);
+ }
+ sortable.sort(function(a, b) {
+ var result = 0;
+ if(a[1] > b[1]) {
+ result = 1;
+ } else if(a[1] < b[1]) {
+ result = -1;
+ }
+ return result;
+ });
+ mergedLangList = {};
+ for(var i = 0; i < sortable.length; i++) {
+ mergedLangList[sortable[i][0]] = sortable[i][1];
+ }
+
+ half = Math.round(sortable.length / 2);
+
+ for(lang in mergedLangList) {
+ counter++;
+ isSupportedByGrayt = (lang in graytLangList.ltr) || (lang in graytLangList.rtl);
+ dialog.buildRadioInputs(mergedLangList[lang], lang, isSupportedByGrayt).appendTo(counter <= half ? leftCol : rightCol);
+ }
+ },
+ getLangBoxes: function() {
+ var dialog = this,
+ langboxes = dialog.getContentElement("langs", "langBox").getElement();
+
+ return langboxes;
+ },
+ contents: generateDialogTabs(dialogTabs, editor)
+ };
+
+ return dialogDefinition;
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/dialogs/toolbar.css b/app/Resources/public/assets/ckeditor/plugins/scayt/dialogs/toolbar.css
index ecabdac9d2..861f43e3b4 100644
--- a/app/Resources/public/assets/ckeditor/plugins/scayt/dialogs/toolbar.css
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/dialogs/toolbar.css
@@ -1,71 +1,71 @@
-a
-{
- text-decoration:none;
- padding: 2px 4px 4px 6px;
- display : block;
- border-width: 1px;
- border-style: solid;
- margin : 0px;
-}
-
-a.cke_scayt_toogle:hover,
-a.cke_scayt_toogle:focus,
-a.cke_scayt_toogle:active
-{
- border-color: #316ac5;
- background-color: #dff1ff;
- color : #000;
- cursor: pointer;
- margin : 0px;
-}
-a.cke_scayt_toogle {
- color : #316ac5;
- border-color: #fff;
-}
-.scayt_enabled a.cke_scayt_item {
- color : #316ac5;
- border-color: #fff;
- margin : 0px;
-}
-.scayt_disabled a.cke_scayt_item {
- color : gray;
- border-color : #fff;
-}
-.scayt_enabled a.cke_scayt_item:hover,
-.scayt_enabled a.cke_scayt_item:focus,
-.scayt_enabled a.cke_scayt_item:active
-{
- border-color: #316ac5;
- background-color: #dff1ff;
- color : #000;
- cursor: pointer;
-}
-.scayt_disabled a.cke_scayt_item:hover,
-.scayt_disabled a.cke_scayt_item:focus,
-.scayt_disabled a.cke_scayt_item:active
-{
- border-color: gray;
- background-color: #dff1ff;
- color : gray;
- cursor: no-drop;
-}
-.cke_scayt_set_on, .cke_scayt_set_off
-{
- display: none;
-}
-.scayt_enabled .cke_scayt_set_on
-{
- display: none;
-}
-.scayt_disabled .cke_scayt_set_on
-{
- display: inline;
-}
-.scayt_disabled .cke_scayt_set_off
-{
- display: none;
-}
-.scayt_enabled .cke_scayt_set_off
-{
- display: inline;
-}
+a
+{
+ text-decoration:none;
+ padding: 2px 4px 4px 6px;
+ display : block;
+ border-width: 1px;
+ border-style: solid;
+ margin : 0px;
+}
+
+a.cke_scayt_toogle:hover,
+a.cke_scayt_toogle:focus,
+a.cke_scayt_toogle:active
+{
+ border-color: #316ac5;
+ background-color: #dff1ff;
+ color : #000;
+ cursor: pointer;
+ margin : 0px;
+}
+a.cke_scayt_toogle {
+ color : #316ac5;
+ border-color: #fff;
+}
+.scayt_enabled a.cke_scayt_item {
+ color : #316ac5;
+ border-color: #fff;
+ margin : 0px;
+}
+.scayt_disabled a.cke_scayt_item {
+ color : gray;
+ border-color : #fff;
+}
+.scayt_enabled a.cke_scayt_item:hover,
+.scayt_enabled a.cke_scayt_item:focus,
+.scayt_enabled a.cke_scayt_item:active
+{
+ border-color: #316ac5;
+ background-color: #dff1ff;
+ color : #000;
+ cursor: pointer;
+}
+.scayt_disabled a.cke_scayt_item:hover,
+.scayt_disabled a.cke_scayt_item:focus,
+.scayt_disabled a.cke_scayt_item:active
+{
+ border-color: gray;
+ background-color: #dff1ff;
+ color : gray;
+ cursor: no-drop;
+}
+.cke_scayt_set_on, .cke_scayt_set_off
+{
+ display: none;
+}
+.scayt_enabled .cke_scayt_set_on
+{
+ display: none;
+}
+.scayt_disabled .cke_scayt_set_on
+{
+ display: inline;
+}
+.scayt_disabled .cke_scayt_set_off
+{
+ display: none;
+}
+.scayt_enabled .cke_scayt_set_off
+{
+ display: inline;
+}
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/icons/hidpi/scayt.png b/app/Resources/public/assets/ckeditor/plugins/scayt/icons/hidpi/scayt.png
new file mode 100644
index 0000000000..58a9f4c132
Binary files /dev/null and b/app/Resources/public/assets/ckeditor/plugins/scayt/icons/hidpi/scayt.png differ
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/icons/scayt.png b/app/Resources/public/assets/ckeditor/plugins/scayt/icons/scayt.png
new file mode 100644
index 0000000000..701ceee69f
Binary files /dev/null and b/app/Resources/public/assets/ckeditor/plugins/scayt/icons/scayt.png differ
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/af.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/af.js
new file mode 100644
index 0000000000..38135977f0
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/af.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'af', {
+ btn_about: 'SCAYT info',
+ btn_dictionaries: 'Woordeboeke',
+ btn_disable: 'SCAYT af',
+ btn_enable: 'SCAYT aan',
+ btn_langs:'Tale',
+ btn_options: 'Opsies',
+ text_title: 'Speltoets terwyl u tik'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ar.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ar.js
new file mode 100644
index 0000000000..d6aee64861
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ar.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ar', {
+ btn_about: 'عن SCAYT',
+ btn_dictionaries: 'قواميس',
+ btn_disable: 'تعطيل SCAYT',
+ btn_enable: 'تفعيل SCAYT',
+ btn_langs:'لغات',
+ btn_options: 'خيارات',
+ text_title: 'تدقيق إملائي أثناء الكتابة'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bg.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bg.js
new file mode 100644
index 0000000000..38acdd1a3e
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bg.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'bg', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Речници',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bn.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bn.js
new file mode 100644
index 0000000000..f1c9c58f2d
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bn.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'bn', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bs.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bs.js
new file mode 100644
index 0000000000..a96b4cc924
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/bs.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'bs', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ca.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ca.js
new file mode 100644
index 0000000000..4955b65a47
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ca.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ca', {
+ btn_about: 'Quant a l\'SCAYT',
+ btn_dictionaries: 'Diccionaris',
+ btn_disable: 'Deshabilita SCAYT',
+ btn_enable: 'Habilitat l\'SCAYT',
+ btn_langs:'Idiomes',
+ btn_options: 'Opcions',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/cs.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/cs.js
new file mode 100644
index 0000000000..1d3fb68fd8
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/cs.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'cs', {
+ btn_about: 'O aplikaci SCAYT',
+ btn_dictionaries: 'Slovníky',
+ btn_disable: 'Vypnout SCAYT',
+ btn_enable: 'Zapnout SCAYT',
+ btn_langs:'Jazyky',
+ btn_options: 'Nastavení',
+ text_title: 'Kontrola pravopisu během psaní (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/cy.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/cy.js
new file mode 100644
index 0000000000..23f16e0fa7
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/cy.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'cy', {
+ btn_about: 'Ynghylch SCAYT',
+ btn_dictionaries: 'Geiriaduron',
+ btn_disable: 'Analluogi SCAYT',
+ btn_enable: 'Galluogi SCAYT',
+ btn_langs:'Ieithoedd',
+ btn_options: 'Opsiynau',
+ text_title: 'Gwirio\'r Sillafu Wrth Deipio'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/da.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/da.js
new file mode 100644
index 0000000000..a6eb642704
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/da.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'da', {
+ btn_about: 'Om SCAYT',
+ btn_dictionaries: 'Ordbøger',
+ btn_disable: 'Deaktivér SCAYT',
+ btn_enable: 'Aktivér SCAYT',
+ btn_langs:'Sprog',
+ btn_options: 'Indstillinger',
+ text_title: 'Stavekontrol mens du skriver'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/de.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/de.js
new file mode 100644
index 0000000000..293326f5c3
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/de.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'de', {
+ btn_about: 'Über SCAYT',
+ btn_dictionaries: 'Wörterbücher',
+ btn_disable: 'SCAYT ausschalten',
+ btn_enable: 'SCAYT einschalten',
+ btn_langs:'Sprachen',
+ btn_options: 'Optionen',
+ text_title: 'Rechtschreibprüfung während der Texteingabe (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/el.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/el.js
new file mode 100644
index 0000000000..ad6d53c8ed
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/el.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'el', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Λεξικά',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Γλώσσες',
+ btn_options: 'Επιλογές',
+ text_title: 'Spell Check As You Type'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-au.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-au.js
new file mode 100644
index 0000000000..9be05862d4
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-au.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en-au', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-ca.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-ca.js
new file mode 100644
index 0000000000..bf9e89a1ba
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-ca.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en-ca', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-gb.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-gb.js
new file mode 100644
index 0000000000..f2d159d1ba
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-gb.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en-gb', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en.js
new file mode 100644
index 0000000000..5e32b23fe4
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/en.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/eo.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/eo.js
new file mode 100644
index 0000000000..582fabcbe1
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/eo.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'eo', {
+ btn_about: 'Pri OKDVT',
+ btn_dictionaries: 'Vortaroj',
+ btn_disable: 'Malebligi OKDVT',
+ btn_enable: 'Ebligi OKDVT',
+ btn_langs:'Lingvoj',
+ btn_options: 'Opcioj',
+ text_title: 'OrtografiKontrolado Dum Vi Tajpas (OKDVT)'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/es.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/es.js
new file mode 100644
index 0000000000..9ca5d8610c
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/es.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'es', {
+ btn_about: 'Acerca de Corrector',
+ btn_dictionaries: 'Diccionarios',
+ btn_disable: 'Desactivar Corrector',
+ btn_enable: 'Activar Corrector',
+ btn_langs:'Idiomas',
+ btn_options: 'Opciones',
+ text_title: 'Comprobar Ortografía Mientras Escribe'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/et.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/et.js
new file mode 100644
index 0000000000..1c888de531
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/et.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'et', {
+ btn_about: 'SCAYT-ist lähemalt',
+ btn_dictionaries: 'Sõnaraamatud',
+ btn_disable: 'SCAYT keelatud',
+ btn_enable: 'SCAYT lubatud',
+ btn_langs:'Keeled',
+ btn_options: 'Valikud',
+ text_title: 'Õigekirjakontroll kirjutamise ajal'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/eu.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/eu.js
new file mode 100644
index 0000000000..217be7a83e
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/eu.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'eu', {
+ btn_about: 'SCAYTi buruz',
+ btn_dictionaries: 'Hiztegiak',
+ btn_disable: 'Desgaitu SCAYT',
+ btn_enable: 'Gaitu SCAYT',
+ btn_langs:'Hizkuntzak',
+ btn_options: 'Aukerak',
+ text_title: 'Ortografia Zuzenketa Idatzi Ahala (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fa.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fa.js
new file mode 100644
index 0000000000..b78e9f3801
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fa.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fa', {
+ btn_about: 'درباره SCAYT',
+ btn_dictionaries: 'دیکشنریها',
+ btn_disable: 'غیرفعالسازی SCAYT',
+ btn_enable: 'فعالسازی SCAYT',
+ btn_langs:'زبانها',
+ btn_options: 'گزینهها',
+ text_title: 'بررسی املای تایپ شما'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fi.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fi.js
new file mode 100644
index 0000000000..a34bfd4468
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fi.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fi', {
+ btn_about: 'Tietoja oikoluvusta kirjoitetaessa',
+ btn_dictionaries: 'Sanakirjat',
+ btn_disable: 'Poista käytöstä oikoluku kirjoitetaessa',
+ btn_enable: 'Ota käyttöön oikoluku kirjoitettaessa',
+ btn_langs:'Kielet',
+ btn_options: 'Asetukset',
+ text_title: 'Oikolue kirjoitettaessa'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fo.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fo.js
new file mode 100644
index 0000000000..0e1fbe8561
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fo.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fo', {
+ btn_about: 'Um SCAYT',
+ btn_dictionaries: 'Orðabøkur',
+ btn_disable: 'Nokta SCAYT',
+ btn_enable: 'Loyv SCAYT',
+ btn_langs:'Tungumál',
+ btn_options: 'Uppseting',
+ text_title: 'Kanna stavseting, meðan tú skrivar'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr-ca.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr-ca.js
new file mode 100644
index 0000000000..7b1ddf3b1e
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr-ca.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fr-ca', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr.js
new file mode 100644
index 0000000000..719312b9b9
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fr', {
+ btn_about: 'A propos de SCAYT',
+ btn_dictionaries: 'Dictionnaires',
+ btn_disable: 'Désactiver SCAYT',
+ btn_enable: 'Activer SCAYT',
+ btn_langs:'Langues',
+ btn_options: 'Options',
+ text_title: 'Vérification de l\'Orthographe en Cours de Frappe (SCAYT)'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/gl.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/gl.js
new file mode 100644
index 0000000000..5e7b30d132
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/gl.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'gl', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/gu.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/gu.js
new file mode 100644
index 0000000000..b29bf1ebee
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/gu.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'gu', {
+ btn_about: 'SCAYT વિષે',
+ btn_dictionaries: 'શબ્દકોશ',
+ btn_disable: 'SCAYT ડિસેબલ કરવું',
+ btn_enable: 'SCAYT એનેબલ કરવું',
+ btn_langs:'ભાષાઓ',
+ btn_options: 'વિકલ્પો',
+ text_title: 'ટાઈપ કરતા સ્પેલ તપાસો'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/he.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/he.js
new file mode 100644
index 0000000000..da89f474bd
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/he.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'he', {
+ btn_about: 'אודות SCAYT',
+ btn_dictionaries: 'מילון',
+ btn_disable: 'בטל SCAYT',
+ btn_enable: 'אפשר SCAYT',
+ btn_langs:'שפות',
+ btn_options: 'אפשרויות',
+ text_title: 'בדיקת איות בזמן כתיבה (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hi.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hi.js
new file mode 100644
index 0000000000..6a08c00b4c
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hi.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'hi', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hr.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hr.js
new file mode 100644
index 0000000000..6cc9e5a28e
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hr.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'hr', {
+ btn_about: 'O SCAYT',
+ btn_dictionaries: 'Rječnici',
+ btn_disable: 'Onemogući SCAYT',
+ btn_enable: 'Omogući SCAYT',
+ btn_langs:'Jezici',
+ btn_options: 'Opcije',
+ text_title: 'Provjeri pravopis tijekom tipkanja (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hu.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hu.js
new file mode 100644
index 0000000000..b5b8ff5348
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/hu.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'hu', {
+ btn_about: 'SCAYT névjegy',
+ btn_dictionaries: 'Szótár',
+ btn_disable: 'SCAYT letiltása',
+ btn_enable: 'SCAYT engedélyezése',
+ btn_langs:'Nyelvek',
+ btn_options: 'Beállítások',
+ text_title: 'Helyesírás ellenőrzés gépelés közben'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/is.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/is.js
new file mode 100644
index 0000000000..3b0b75942f
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/is.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'is', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/it.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/it.js
new file mode 100644
index 0000000000..15e0af8b54
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/it.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'it', {
+ btn_about: 'About COMS',
+ btn_dictionaries: 'Dizionari',
+ btn_disable: 'Disabilita COMS',
+ btn_enable: 'Abilita COMS',
+ btn_langs:'Lingue',
+ btn_options: 'Opzioni',
+ text_title: 'Controllo Ortografico Mentre Scrivi'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ja.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ja.js
new file mode 100644
index 0000000000..9097f9cda1
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ja.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ja', {
+ btn_about: 'SCAYTバージョン',
+ btn_dictionaries: '辞書',
+ btn_disable: 'SCAYT無効',
+ btn_enable: 'SCAYT有効',
+ btn_langs:'言語',
+ btn_options: 'オプション',
+ text_title: 'スペルチェック設定(SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ka.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ka.js
new file mode 100644
index 0000000000..6f3d3ba371
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ka.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ka', {
+ btn_about: 'SCAYT-ის შესახებ',
+ btn_dictionaries: 'ლექსიკონები',
+ btn_disable: 'SCAYT-ის გამორთვა',
+ btn_enable: 'SCAYT-ის ჩართვა',
+ btn_langs:'ენები',
+ btn_options: 'პარამეტრები',
+ text_title: 'მართლწერის შემოწმება კრეფისას'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/km.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/km.js
new file mode 100644
index 0000000000..5e21114582
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/km.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'km', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ko.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ko.js
new file mode 100644
index 0000000000..9bce7a42be
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ko.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ko', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ku.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ku.js
new file mode 100644
index 0000000000..09d82b0fc0
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ku.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ku', {
+ btn_about: 'دهربارهی SCAYT',
+ btn_dictionaries: 'فهرههنگهکان',
+ btn_disable: 'ناچالاککردنی SCAYT',
+ btn_enable: 'چالاککردنی SCAYT',
+ btn_langs:'زمانهکان',
+ btn_options: 'ههڵبژارده',
+ text_title: 'پشکنینی نووسه لهکاتی نووسین'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/lt.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/lt.js
new file mode 100644
index 0000000000..2da3b320aa
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/lt.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'lt', {
+ btn_about: 'Apie SCAYT',
+ btn_dictionaries: 'Žodynai',
+ btn_disable: 'Išjungti SCAYT',
+ btn_enable: 'Įjungti SCAYT',
+ btn_langs:'Kalbos',
+ btn_options: 'Parametrai',
+ text_title: 'Tikrinti klaidas kai rašoma'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/lv.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/lv.js
new file mode 100644
index 0000000000..809855af54
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/lv.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'lv', {
+ btn_about: 'Par SCAYT',
+ btn_dictionaries: 'Vārdnīcas',
+ btn_disable: 'Atslēgt SCAYT',
+ btn_enable: 'Ieslēgt SCAYT',
+ btn_langs:'Valodas',
+ btn_options: 'Uzstādījumi',
+ text_title: 'Pārbaudīt gramatiku rakstot'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/mk.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/mk.js
new file mode 100644
index 0000000000..49ab39bfc5
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/mk.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'mk', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/mn.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/mn.js
new file mode 100644
index 0000000000..a932def9fe
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/mn.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'mn', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Толь бичгүүд',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Хэлүүд',
+ btn_options: 'Сонголт',
+ text_title: 'Spell Check As You Type'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ms.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ms.js
new file mode 100644
index 0000000000..98fd51f62d
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ms.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ms', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type' // MISSING
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/nb.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/nb.js
new file mode 100644
index 0000000000..e82fab357b
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/nb.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'nb', {
+ btn_about: 'Om SCAYT',
+ btn_dictionaries: 'Ordbøker',
+ btn_disable: 'Slå av SCAYT',
+ btn_enable: 'Slå på SCAYT',
+ btn_langs:'Språk',
+ btn_options: 'Valg',
+ text_title: 'Stavekontroll mens du skriver'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/nl.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/nl.js
new file mode 100644
index 0000000000..3a3078680c
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/nl.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'nl', {
+ btn_about: 'Over SCAYT',
+ btn_dictionaries: 'Woordenboeken',
+ btn_disable: 'SCAYT uitschakelen',
+ btn_enable: 'SCAYT inschakelen',
+ btn_langs:'Talen',
+ btn_options: 'Opties',
+ text_title: 'Controleer de spelling tijdens het typen'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/no.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/no.js
new file mode 100644
index 0000000000..a955c1f080
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/no.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'no', {
+ btn_about: 'Om SCAYT',
+ btn_dictionaries: 'Ordbøker',
+ btn_disable: 'Slå av SCAYT',
+ btn_enable: 'Slå på SCAYT',
+ btn_langs:'Språk',
+ btn_options: 'Valg',
+ text_title: 'Stavekontroll mens du skriver'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pl.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pl.js
new file mode 100644
index 0000000000..18a600512c
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pl.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'pl', {
+ btn_about: 'Informacje o SCAYT',
+ btn_dictionaries: 'Słowniki',
+ btn_disable: 'Wyłącz SCAYT',
+ btn_enable: 'Włącz SCAYT',
+ btn_langs:'Języki',
+ btn_options: 'Opcje',
+ text_title: 'Sprawdź pisownię podczas pisania (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt-br.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt-br.js
new file mode 100644
index 0000000000..b0a81944c0
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt-br.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'pt-br', {
+ btn_about: 'Sobre a correção ortográfica durante a digitação',
+ btn_dictionaries: 'Dicionários',
+ btn_disable: 'Desabilitar correção ortográfica durante a digitação',
+ btn_enable: 'Habilitar correção ortográfica durante a digitação',
+ btn_langs:'Idiomas',
+ btn_options: 'Opções',
+ text_title: 'Correção ortográfica durante a digitação'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt.js
new file mode 100644
index 0000000000..58a8e4924d
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'pt', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type' // MISSING
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ro.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ro.js
new file mode 100644
index 0000000000..706ea7948a
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ro.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ro', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type' // MISSING
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ru.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ru.js
new file mode 100644
index 0000000000..11e6a14d44
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ru.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ru', {
+ btn_about: 'О SCAYT',
+ btn_dictionaries: 'Словари',
+ btn_disable: 'Отключить SCAYT',
+ btn_enable: 'Включить SCAYT',
+ btn_langs:'Языки',
+ btn_options: 'Настройки',
+ text_title: 'Проверка орфографии по мере ввода (SCAYT)'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sk.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sk.js
new file mode 100644
index 0000000000..0a09b53da3
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sk.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sk', {
+ btn_about: 'O KPPP (Kontrola pravopisu počas písania)',
+ btn_dictionaries: 'Slovníky',
+ btn_disable: 'Zakázať KPPP (Kontrola pravopisu počas písania)',
+ btn_enable: 'Povoliť KPPP (Kontrola pravopisu počas písania)',
+ btn_langs:'Jazyky',
+ btn_options: 'Možnosti',
+ text_title: 'Kontrola pravopisu počas písania'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sl.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sl.js
new file mode 100644
index 0000000000..301f72a51d
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sl.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sl', {
+ btn_about: 'O storitvi SCAYT',
+ btn_dictionaries: 'Slovarji',
+ btn_disable: 'Onemogoči SCAYT',
+ btn_enable: 'Omogoči SCAYT',
+ btn_langs:'Jeziki',
+ btn_options: 'Možnosti',
+ text_title: 'Črkovanje med tipkanjem'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr-latn.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr-latn.js
new file mode 100644
index 0000000000..02a6554458
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr-latn.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sr-latn', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type' // MISSING
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr.js
new file mode 100644
index 0000000000..067e401c28
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sr', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type' // MISSING
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sv.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sv.js
new file mode 100644
index 0000000000..e9da617d2a
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/sv.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sv', {
+ btn_about: 'Om SCAYT',
+ btn_dictionaries: 'Ordlistor',
+ btn_disable: 'Inaktivera SCAYT',
+ btn_enable: 'Aktivera SCAYT',
+ btn_langs:'Språk',
+ btn_options: 'Inställningar',
+ text_title: 'Stavningskontroll medan du skriver'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/th.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/th.js
new file mode 100644
index 0000000000..4842cdf18d
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/th.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'th', {
+ btn_about: 'About SCAYT',
+ btn_dictionaries: 'Dictionaries',
+ btn_disable: 'Disable SCAYT',
+ btn_enable: 'Enable SCAYT',
+ btn_langs:'Languages',
+ btn_options: 'Options',
+ text_title: 'Spell Check As You Type' // MISSING
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/tr.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/tr.js
new file mode 100644
index 0000000000..fb574c165d
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/tr.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'tr', {
+ btn_about: 'SCAYT\'ı hakkında',
+ btn_dictionaries: 'Sözlükler',
+ btn_disable: 'SCAYT\'ı pasifleştir',
+ btn_enable: 'SCAYT\'ı etkinleştir',
+ btn_langs:'Diller',
+ btn_options: 'Seçenekler',
+ text_title: 'Girmiş olduğunuz kelime denetimi'
+});
\ No newline at end of file
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ug.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ug.js
new file mode 100644
index 0000000000..a03b535e49
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/ug.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ug', {
+ btn_about: 'شۇئان ئىملا تەكشۈرۈش ھەققىدە',
+ btn_dictionaries: 'لۇغەت',
+ btn_disable: 'شۇئان ئىملا تەكشۈرۈشنى چەكلە',
+ btn_enable: 'شۇئان ئىملا تەكشۈرۈشنى قوزغات',
+ btn_langs:'تىل',
+ btn_options: 'تاللانما',
+ text_title: 'شۇئان ئىملا تەكشۈر'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/uk.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/uk.js
new file mode 100644
index 0000000000..18cfdc4aad
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/uk.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'uk', {
+ btn_about: 'Про SCAYT',
+ btn_dictionaries: 'Словники',
+ btn_disable: 'Вимкнути SCAYT',
+ btn_enable: 'Ввімкнути SCAYT',
+ btn_langs:'Мови',
+ btn_options: 'Опції',
+ text_title: 'Перефірка орфографії по мірі набору'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/vi.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/vi.js
new file mode 100644
index 0000000000..efd1fda22e
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/vi.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'vi', {
+ btn_about: 'Thông tin về SCAYT',
+ btn_dictionaries: 'Từ điển',
+ btn_disable: 'Tắt SCAYT',
+ btn_enable: 'Bật SCAYT',
+ btn_langs:'Ngôn ngữ',
+ btn_options: 'Tùy chọn',
+ text_title: 'Kiểm tra chính tả ngay khi gõ chữ (SCAYT)'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh-cn.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh-cn.js
new file mode 100644
index 0000000000..46efa2fa94
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh-cn.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'zh-cn', {
+ btn_about: '关于即时拼写检查',
+ btn_dictionaries: '字典',
+ btn_disable: '禁用即时拼写检查',
+ btn_enable: '启用即时拼写检查',
+ btn_langs:'语言',
+ btn_options: '选项',
+ text_title: '即时拼写检查'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh.js b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh.js
new file mode 100644
index 0000000000..05524e5285
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh.js
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'zh', {
+ btn_about: '關於即時拼寫檢查',
+ btn_dictionaries: '字典',
+ btn_disable: '關閉即時拼寫檢查',
+ btn_enable: '啟用即時拼寫檢查',
+ btn_langs: '語言',
+ btn_options: '選項',
+ text_title: '即時拼寫檢查'
+});
diff --git a/app/Resources/public/assets/ckeditor/plugins/scayt/plugin.js b/app/Resources/public/assets/ckeditor/plugins/scayt/plugin.js
new file mode 100644
index 0000000000..eba747e3d2
--- /dev/null
+++ b/app/Resources/public/assets/ckeditor/plugins/scayt/plugin.js
@@ -0,0 +1,1877 @@
+'use strict';
+CKEDITOR.plugins.add('scayt', {
+
+ //requires : ['menubutton', 'dialog'],
+ requires: 'menubutton,dialog',
+ 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%
+ icons: 'scayt', // %REMOVE_LINE_CORE%
+ hidpi: true, // %REMOVE_LINE_CORE%
+ tabToOpen : null,
+ dialogName: 'scaytDialog',
+ init: function(editor) {
+ var self = this,
+ plugin = CKEDITOR.plugins.scayt;
+
+ this.bindEvents(editor);
+ this.parseConfig(editor);
+ this.addRule(editor);
+
+ // source mode
+ CKEDITOR.dialog.add(this.dialogName, CKEDITOR.getUrl(this.path + 'dialogs/options.js'));
+ // end source mode
+
+ this.addMenuItems(editor);
+ var config = editor.config,
+ lang = editor.lang.scayt,
+ env = CKEDITOR.env;
+
+ editor.ui.add('Scayt', CKEDITOR.UI_MENUBUTTON, {
+ label : lang.text_title,
+ title : ( editor.plugins.wsc ? editor.lang.wsc.title : lang.text_title ),
+ // SCAYT doesn't work in IE Compatibility Mode and IE (8 & 9) Quirks Mode
+ modes : {wysiwyg: !(env.ie && ( env.version < 8 || env.quirks ) ) },
+ toolbar: 'spellchecker,20',
+ refresh: function() {
+ var buttonState = editor.ui.instances.Scayt.getState();
+
+ // check if scayt is created
+ if(editor.scayt) {
+ // check if scayt is enabled
+ if(plugin.state.scayt[editor.name]) {
+ buttonState = CKEDITOR.TRISTATE_ON;
+ } else {
+ buttonState = CKEDITOR.TRISTATE_OFF;
+ }
+ }
+
+ editor.fire('scaytButtonState', buttonState);
+ },
+ onRender: function() {
+ var that = this;
+
+ editor.on('scaytButtonState', function(ev) {
+ if(typeof ev.data !== undefined) {
+ that.setState(ev.data);
+ }
+ });
+ },
+ onMenu : function() {
+ var scaytInstance = editor.scayt;
+
+ editor.getMenuItem('scaytToggle').label = editor.lang.scayt[(scaytInstance ? plugin.state.scayt[editor.name] : false) ? 'btn_disable' : 'btn_enable'];
+
+ // If UI tab is disabled we shouldn't show menu item
+ var menuDefinition = {
+ scaytToggle : CKEDITOR.TRISTATE_OFF,
+ scaytOptions : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+ scaytLangs : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+ scaytDict : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+ scaytAbout : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+ WSC : editor.plugins.wsc ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
+ };
+
+ if(!editor.config.scayt_uiTabs[0]) {
+ delete menuDefinition.scaytOptions;
+ }
+
+ if(!editor.config.scayt_uiTabs[1]) {
+ delete menuDefinition.scaytLangs;
+ }
+
+ if(!editor.config.scayt_uiTabs[2]) {
+ delete menuDefinition.scaytDict;
+ }
+
+ return menuDefinition;
+ }
+ });
+
+ // If the 'contextmenu' plugin is loaded, register the listeners.
+ if(editor.contextMenu && editor.addMenuItems) {
+ editor.contextMenu.addListener(function(element, selection) {
+ var scaytInstance = editor.scayt,
+ result, selectionNode;
+
+ if(scaytInstance) {
+ selectionNode = scaytInstance.getSelectionNode();
+
+ // SCAYT shouldn't build context menu if instance isnot created or word is without misspelling or grammar problem
+ if(selectionNode) {
+ var items = self.menuGenerator(editor, selectionNode);
+
+ scaytInstance.showBanner('.' + editor.contextMenu._.definition.panel.className.split(' ').join(' .'));
+ result = items;
+ }
+ }
+
+ return result;
+ });
+
+ editor.contextMenu._.onHide = CKEDITOR.tools.override(editor.contextMenu._.onHide, function(org) {
+ return function() {
+ var scaytInstance = editor.scayt;
+
+ if(scaytInstance) {
+ scaytInstance.hideBanner();
+ }
+
+ return org.apply(this);
+ };
+ });
+ }
+ },
+ addMenuItems: function(editor) {
+ var self = this,
+ plugin = CKEDITOR.plugins.scayt,
+ graytGroups = ['grayt_description', 'grayt_suggest', 'grayt_control'],
+ menuGroup = 'scaytButton';
+
+ editor.addMenuGroup(menuGroup);
+
+ var items_order = editor.config.scayt_contextMenuItemsOrder.split('|');
+
+ for(var pos = 0 ; pos < items_order.length ; pos++) {
+ items_order[pos] = 'scayt_' + items_order[pos];
+ }
+ items_order = graytGroups.concat(items_order);
+
+ if(items_order && items_order.length) {
+ for(var pos = 0 ; pos < items_order.length ; pos++) {
+ editor.addMenuGroup(items_order[pos], pos - 10);
+ }
+ }
+
+ editor.addCommand( 'scaytToggle', {
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ plugin.state.scayt[editor.name] = !plugin.state.scayt[editor.name];
+
+ if(plugin.state.scayt[editor.name] === true) {
+ if(!scaytInstance) {
+ plugin.createScayt(editor);
+ }
+ } else {
+ if(scaytInstance) {
+ plugin.destroy(editor);
+ }
+ }
+ }
+ } );
+
+ editor.addCommand( 'scaytAbout', {
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'about';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ }
+ } );
+
+ editor.addCommand( 'scaytOptions', {
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'options';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ }
+ } );
+
+ editor.addCommand( 'scaytLangs', {
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'langs';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ }
+ } );
+
+ editor.addCommand( 'scaytDict', {
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'dictionaries';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ }
+ } );
+
+ var uiMenuItems = {
+ scaytToggle: {
+ label : editor.lang.scayt.btn_enable,
+ group : menuGroup,
+ command: 'scaytToggle'
+ },
+ scaytAbout: {
+ label : editor.lang.scayt.btn_about,
+ group : menuGroup,
+ command: 'scaytAbout'
+ },
+ scaytOptions: {
+ label : editor.lang.scayt.btn_options,
+ group : menuGroup,
+ command: 'scaytOptions'
+ },
+ scaytLangs: {
+ label : editor.lang.scayt.btn_langs,
+ group : menuGroup,
+ command: 'scaytLangs'
+ },
+ scaytDict: {
+ label : editor.lang.scayt.btn_dictionaries,
+ group : menuGroup,
+ command: 'scaytDict'
+ }
+ };
+
+ if(editor.plugins.wsc) {
+ uiMenuItems.WSC = {
+ label : editor.lang.wsc.toolbar,
+ group : menuGroup,
+ onClick: function() {
+ var inlineMode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE),
+ plugin = CKEDITOR.plugins.scayt,
+ scaytInstance = editor.scayt,
+ text = inlineMode ? editor.container.getText() : editor.document.getBody().getText();
+
+ text = text.replace(/\s/g, '');
+
+ if(text) {
+ if(scaytInstance && plugin.state.scayt[editor.name] && scaytInstance.setMarkupPaused) {
+ scaytInstance.setMarkupPaused(true);
+ }
+
+ editor.lockSelection();
+ editor.execCommand('checkspell');
+ } else {
+ alert('Nothing to check!');
+ }
+ }
+ }
+ }
+
+ editor.addMenuItems(uiMenuItems);
+ },
+ bindEvents: function(editor) {
+ var self = this,
+ plugin = CKEDITOR.plugins.scayt,
+ inline_mode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE);
+
+ var scaytDestroy = function() {
+ plugin.destroy(editor);
+ };
+
+ /*
+ * Dirty fix for placeholder drag&drop
+ * Should be fixed with next release
+ */
+ /*
+ editor.on('drop', function(evt) {
+ var dropRange = evt.data.dropRange;
+ var b = dropRange.createBookmark(true);
+ editor.scayt.removeMarkupInSelectionNode({ selectionNode: evt.data.target.$, forceBookmark: false });
+ dropRange.moveToBookmark(b);
+
+ evt.data.dropRange = dropRange;
+ return evt;
+ }, this, null, 0); // We should be sure that we modify dropRange before CKEDITOR.plugins.clipboard calls
+ */
+
+ var contentDomReady = function() {
+ // The event is fired when editable iframe node was reinited so we should restart our service
+ if (plugin.state.scayt[editor.name] && !editor.readOnly && !editor.scayt) {
+ plugin.createScayt(editor);
+ }
+ };
+
+ var addMarkupStateHandlers = function() {
+ var editable = editor.editable();
+
+ editable.attachListener( editable, 'focus', function( evt ) {
+ if( CKEDITOR.plugins.scayt && !editor.scayt ) {
+ setTimeout(contentDomReady, 0); // we need small timeout in order to correctly set initial 'focused' option value in SCAYT core
+ }
+
+ var pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[editor.name] && editor.scayt,
+ selectedElement, ranges, textLength, range;
+
+ if((inline_mode ? true : pluginStatus) && editor._.savedSelection) {
+ selectedElement = editor._.savedSelection.getSelectedElement();
+ ranges = !selectedElement && editor._.savedSelection.getRanges();
+
+ for(var i = 0; i < ranges.length; i++) {
+ range = ranges[i];
+ // we need to check type of node value in order to avoid error in IE when accessing 'nodeValue' property
+ if(typeof range.startContainer.$.nodeValue === 'string') {
+ textLength = range.startContainer.getText().length;
+ if(textLength < range.startOffset || textLength < range.endOffset) {
+ editor.unlockSelection(false);
+ }
+ }
+ }
+ }
+ }, this, null, -10 ); // priority "-10" is set to call SCAYT CKEDITOR.editor#unlockSelection before CKEDITOR.editor#unlockSelection call
+ };
+
+ var contentDomHandler = function() {
+ if(inline_mode) {
+
+ if (!editor.config.scayt_inlineModeImmediateMarkup) {
+ /*
+ * Give an opportunity to CKEditor to perform all needed updates
+ * and only after that call 'scaytDestroy' method (#72725)
+ */
+ editor.on('blur', function () { setTimeout( scaytDestroy, 0 ); } );
+ editor.on('focus', contentDomReady);
+
+ // We need to check if editor has focus(created) right now.
+ // If editor is active - make attempt to create scayt
+ if(editor.focusManager.hasFocus) {
+ contentDomReady();
+ }
+
+ } else {
+ contentDomReady();
+ }
+
+ } else {
+ contentDomReady();
+ }
+
+ addMarkupStateHandlers();
+
+ /*
+ * 'mousedown' handler handle widget selection (click on widget). To
+ * fix the issue when widget#wrapper referenced to element which can
+ * be broken after markup.
+ */
+ var editable = editor.editable();
+ editable.attachListener(editable, 'mousedown', function( evt ) {
+ var target = evt.data.getTarget();
+ var widget = editor.widgets && editor.widgets.getByElement( target );
+ if ( widget ) {
+ widget.wrapper = target.getAscendant( function( el ) {
+ return el.hasAttribute( 'data-cke-widget-wrapper' )
+ }, true );
+ }
+ }, this, null, -10); // '-10': we need to be shure that widget#wrapper updated before any other calls
+ };
+
+ editor.on('contentDom', contentDomHandler);
+
+ editor.on('beforeCommandExec', function(ev) {
+ var scaytInstance = editor.scayt,
+ selectedLangElement = null,
+ forceBookmark = false,
+ removeMarkupInsideSelection = true;
+
+ // TODO: after switching in source mode not recreate SCAYT instance, try to just rerun markuping to don't make requests to server
+ if(ev.data.name in plugin.options.disablingCommandExec && editor.mode == 'wysiwyg') {
+ if(scaytInstance) {
+ plugin.destroy(editor);
+ editor.fire('scaytButtonState', CKEDITOR.TRISTATE_DISABLED);
+ }
+ } else if( ev.data.name === 'bold' || ev.data.name === 'italic' || ev.data.name === 'underline' ||
+ ev.data.name === 'strike' || ev.data.name === 'subscript' || ev.data.name === 'superscript' ||
+ ev.data.name === 'enter' || ev.data.name === 'cut' || ev.data.name === 'language') {
+ if(scaytInstance) {
+ if(ev.data.name === 'cut') {
+ removeMarkupInsideSelection = false;
+ // We need to force bookmark before we remove our markup.
+ // Otherwise we will get issues with cutting text via context menu.
+ forceBookmark = true;
+ }
+
+ // We need to remove all SCAYT markup from 'lang' node before it will be deleted.
+ // We need to remove SCAYT markup from selected text before creating 'lang' node as well.
+ if(ev.data.name === 'language') {
+ selectedLangElement = editor.plugins.language.getCurrentLangElement(editor);
+ selectedLangElement = selectedLangElement && selectedLangElement.$;
+ // We need to force bookmark before we remove our markup.
+ // Otherwise we will get issues with cutting text via language plugin menu.
+ forceBookmark = true;
+ }
+
+ editor.fire('reloadMarkupScayt', {
+ removeOptions: {
+ removeInside: removeMarkupInsideSelection,
+ forceBookmark: forceBookmark,
+ selectionNode: selectedLangElement
+ },
+ timeout: 0
+ });
+ }
+ }
+ });
+
+ editor.on('beforeSetMode', function(ev) {
+ var scaytInstance;
+ // needed when we use:
+ // CKEDITOR.instances.editor_ID.setMode("source")
+ // CKEDITOR.instances.editor_ID.setMode("wysiwyg")
+ // can't be implemented in editor.on('mode', function(ev) {});
+ if (ev.data == 'source') {
+ scaytInstance = editor.scayt;
+ if(scaytInstance) {
+ plugin.destroy(editor);
+ editor.fire('scaytButtonState', CKEDITOR.TRISTATE_DISABLED);
+ }
+
+ // remove custom data from body, to prevent waste properties showing in IE8
+ if(editor.document) { //GitHub #84 : make sure that document exists(e.g. when startup mode set to 'source')
+ editor.document.getBody().removeAttribute('_jquid');
+ }
+ }
+ });
+
+ editor.on('afterCommandExec', function(ev) {
+ if(editor.mode == 'wysiwyg' && (ev.data.name == 'undo' || ev.data.name == 'redo')) {
+ setTimeout(function() {
+ var scaytInstance = editor.scayt,
+ scaytLangList = scaytInstance && scaytInstance.getScaytLangList();
+
+ /*
+ * Checks SCAYT initialization of LangList. To prevent immediate
+ * markup which is triggered by 'startSpellCheck' event.
+ * E.g.: Drop into inline CKEDITOR with scayt_autoStartup = true;
+ */
+ if (!scaytLangList || !(scaytLangList.ltr && scaytLangList.rtl)) return;
+
+ scaytInstance.fire('startSpellCheck, startGrammarCheck');
+ }, 250);
+ }
+ });
+
+ // handle readonly changes
+ editor.on('readOnly', function(ev) {
+ var scaytInstance;
+
+ if(ev) {
+ scaytInstance = editor.scayt;
+
+ if(ev.editor.readOnly === true) {
+ if(scaytInstance) {
+ scaytInstance.fire('removeMarkupInDocument', {});
+ }
+ } else {
+ if(scaytInstance) {
+ scaytInstance.fire('startSpellCheck, startGrammarCheck');
+ } else if(ev.editor.mode == 'wysiwyg' && plugin.state.scayt[ev.editor.name] === true) {
+ plugin.createScayt(editor);
+ ev.editor.fire('scaytButtonState', CKEDITOR.TRISTATE_ON);
+ }
+ }
+ }
+ });
+
+ // we need to destroy SCAYT before CK editor will be completely destroyed
+ editor.on('beforeDestroy', scaytDestroy);
+
+ //#9439 after SetData method fires contentDom event and SCAYT create additional instanse
+ // This way we should destroy SCAYT on setData event when contenteditable Iframe was re-created
+ editor.on('setData', function() {
+ scaytDestroy();
+
+ // in inline mode SetData does not fire contentDom event
+ if(editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE || editor.plugins.divarea) {
+ contentDomHandler();
+ }
+ }, this, null, 50);
+
+ /*
+ * Main entry point to react on changes in document
+ */
+ editor.on('reloadMarkupScayt', function(ev) {
+ var removeOptions = ev.data && ev.data.removeOptions,
+ timeout = ev.data && ev.data.timeout;
+
+ /*
+ * Perform removeMarkupInSelectionNode and 'startSpellCheck' fire
+ * asynchroniosly and keep CKEDITOR flow as expected
+ */
+ setTimeout(function() {
+ var scaytInstance = editor.scayt,
+ scaytLangList = scaytInstance && scaytInstance.getScaytLangList();
+
+ /*
+ * Checks SCAYT initialization of LangList. To prevent immediate
+ * markup which is triggered by 'startSpellCheck' event.
+ * E.g.: Drop into inline CKEDITOR with scayt_autoStartup = true;
+ */
+ if (!scaytLangList || !(scaytLangList.ltr && scaytLangList.rtl)) return;
+
+ /*
+ * CKEditor can keep \u200B character in document (with selection#selectRanges)
+ * we need to take care about that. For this case we fire
+ * 'keydown' [left arrow], what will trigger 'removeFillingChar' on Webkit
+ * to cleanup the document
+ */
+ editor.document.fire( 'keydown', new CKEDITOR.dom.event( { keyCode: 37 } ) );
+
+ /* trigger remove markup with 'startSpellCheck' */
+ scaytInstance.removeMarkupInSelectionNode(removeOptions);
+ scaytInstance.fire('startSpellCheck, startGrammarCheck');
+ }, timeout || 0 );
+ });
+
+ // Reload spell-checking for current word after insertion completed.
+ editor.on('insertElement', function() {
+ // 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
+ editor.fire('reloadMarkupScayt', {removeOptions: {forceBookmark: true}});
+ }, this, null, 50);
+
+ editor.on('insertHtml', function() {
+ editor.fire('reloadMarkupScayt');
+ }, this, null, 50);
+
+ editor.on('insertText', function() {
+ editor.fire('reloadMarkupScayt');
+ }, this, null, 50);
+
+ // The event is listening to open necessary dialog tab
+ editor.on('scaytDialogShown', function(ev) {
+ var dialog = ev.data,
+ scaytInstance = editor.scayt;
+
+ dialog.selectPage(scaytInstance.tabToOpen);
+ });
+ },
+ parseConfig: function(editor) {
+ var plugin = CKEDITOR.plugins.scayt;
+
+ // preprocess config for backward compatibility
+ plugin.replaceOldOptionsNames(editor.config);
+
+ // Checking editor's config after initialization
+ if(typeof editor.config.scayt_autoStartup !== 'boolean') {
+ editor.config.scayt_autoStartup = false;
+ }
+ plugin.state.scayt[editor.name] = editor.config.scayt_autoStartup;
+
+ if(typeof editor.config.grayt_autoStartup !== 'boolean') {
+ editor.config.grayt_autoStartup = false;
+ }
+ if(typeof editor.config.scayt_inlineModeImmediateMarkup !== 'boolean') {
+ editor.config.scayt_inlineModeImmediateMarkup = false;
+ }
+ plugin.state.grayt[editor.name] = editor.config.grayt_autoStartup;
+
+ if(!editor.config.scayt_contextCommands) {
+ editor.config.scayt_contextCommands = 'ignore|ignoreall|add';
+ }
+
+ if(!editor.config.scayt_contextMenuItemsOrder) {
+ editor.config.scayt_contextMenuItemsOrder = 'suggest|moresuggest|control';
+ }
+
+ if(!editor.config.scayt_sLang) {
+ editor.config.scayt_sLang = 'en_US';
+ }
+
+ if(editor.config.scayt_maxSuggestions === undefined || typeof editor.config.scayt_maxSuggestions != 'number' || editor.config.scayt_maxSuggestions < 0) {
+ editor.config.scayt_maxSuggestions = 5;
+ }
+
+ if(editor.config.scayt_minWordLength === undefined || typeof editor.config.scayt_minWordLength != 'number' || editor.config.scayt_minWordLength < 1) {
+ editor.config.scayt_minWordLength = 4;
+ }
+
+ if(editor.config.scayt_customDictionaryIds === undefined || typeof editor.config.scayt_customDictionaryIds !== 'string') {
+ editor.config.scayt_customDictionaryIds = '';
+ }
+
+ if(editor.config.scayt_userDictionaryName === undefined || typeof editor.config.scayt_userDictionaryName !== 'string') {
+ editor.config.scayt_userDictionaryName = null;
+ }
+
+ if(typeof editor.config.scayt_uiTabs === 'string' && editor.config.scayt_uiTabs.split(',').length === 3) {
+ var scayt_uiTabs = [], _tempUITabs = [];
+ editor.config.scayt_uiTabs = editor.config.scayt_uiTabs.split(',');
+
+ CKEDITOR.tools.search(editor.config.scayt_uiTabs, function(value) {
+ if (Number(value) === 1 || Number(value) === 0) {
+ _tempUITabs.push(true);
+ scayt_uiTabs.push(Number(value));
+ } else {
+ _tempUITabs.push(false);
+ }
+ });
+
+ if (CKEDITOR.tools.search(_tempUITabs, false) === null) {
+ editor.config.scayt_uiTabs = scayt_uiTabs;
+ } else {
+ editor.config.scayt_uiTabs = [1,1,1];
+ }
+
+ } else {
+ editor.config.scayt_uiTabs = [1,1,1];
+ }
+
+ if(typeof editor.config.scayt_serviceProtocol != 'string') {
+ editor.config.scayt_serviceProtocol = null;
+ }
+
+ if(typeof editor.config.scayt_serviceHost != 'string') {
+ editor.config.scayt_serviceHost = null;
+ }
+
+ if(typeof editor.config.scayt_servicePort != 'string') {
+ editor.config.scayt_servicePort = null;
+ }
+
+ if(typeof editor.config.scayt_servicePath != 'string') {
+ editor.config.scayt_servicePath = null;
+ }
+
+ if(!editor.config.scayt_moreSuggestions) {
+ editor.config.scayt_moreSuggestions = 'on';
+ }
+
+ if(typeof editor.config.scayt_customerId !== 'string') {
+ editor.config.scayt_customerId = '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';
+ }
+
+ if(typeof editor.config.scayt_srcUrl !== 'string') {
+ var protocol = document.location.protocol;
+ protocol = protocol.search(/https?:/) != -1 ? protocol : 'http:';
+
+ editor.config.scayt_srcUrl = protocol + '//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js';
+ }
+
+ if(typeof CKEDITOR.config.scayt_handleCheckDirty !== 'boolean') {
+ CKEDITOR.config.scayt_handleCheckDirty = true;
+ }
+
+ if(typeof CKEDITOR.config.scayt_handleUndoRedo !== 'boolean') {
+ /* set default as 'true' */
+ CKEDITOR.config.scayt_handleUndoRedo = true;
+ }
+ /* checking 'undo' plugin, if no disable SCAYT handler */
+ CKEDITOR.config.scayt_handleUndoRedo = CKEDITOR.plugins.undo ? CKEDITOR.config.scayt_handleUndoRedo : false;
+
+ if(typeof editor.config.scayt_multiLanguageMode !== 'boolean') {
+ editor.config.scayt_multiLanguageMode = false;
+ }
+
+ if(typeof editor.config.scayt_multiLanguageStyles !== 'object') {
+ editor.config.scayt_multiLanguageStyles = {};
+ }
+
+ if(editor.config.scayt_ignoreAllCapsWords && typeof editor.config.scayt_ignoreAllCapsWords !== 'boolean') {
+ editor.config.scayt_ignoreAllCapsWords = false;
+ }
+
+ if(editor.config.scayt_ignoreDomainNames && typeof editor.config.scayt_ignoreDomainNames !== 'boolean') {
+ editor.config.scayt_ignoreDomainNames = false;
+ }
+
+ if(editor.config.scayt_ignoreWordsWithMixedCases && typeof editor.config.scayt_ignoreWordsWithMixedCases !== 'boolean') {
+ editor.config.scayt_ignoreWordsWithMixedCases = false;
+ }
+
+ if(editor.config.scayt_ignoreWordsWithNumbers && typeof editor.config.scayt_ignoreWordsWithNumbers !== 'boolean') {
+ editor.config.scayt_ignoreWordsWithNumbers = false;
+ }
+
+ if( editor.config.scayt_disableOptionsStorage ) {
+ var userOptions = CKEDITOR.tools.isArray( editor.config.scayt_disableOptionsStorage ) ? editor.config.scayt_disableOptionsStorage : ( typeof editor.config.scayt_disableOptionsStorage === 'string' ) ? [ editor.config.scayt_disableOptionsStorage ] : undefined,
+ availableValue = [ 'all', 'options', 'lang', 'ignore-all-caps-words', 'ignore-domain-names', 'ignore-words-with-mixed-cases', 'ignore-words-with-numbers'],
+ valuesOption = ['lang', 'ignore-all-caps-words', 'ignore-domain-names', 'ignore-words-with-mixed-cases', 'ignore-words-with-numbers'],
+ search = CKEDITOR.tools.search,
+ indexOf = CKEDITOR.tools.indexOf;
+
+ var isValidOption = function( option ) {
+ return !!search( availableValue, option );
+ };
+
+ var makeOptionsToStorage = function( options ) {
+ var retval = [];
+
+ for (var i = 0; i < options.length; i++) {
+ var value = options[i],
+ isGroupOptionInUserOptions = !!search( options, 'options' );
+
+ if( !isValidOption( value ) || isGroupOptionInUserOptions && !!search( valuesOption, function( val ) { if( val === 'lang' ) { return false; } } ) ) {
+ return;
+ }
+
+ if( !!search( valuesOption, value ) ) {
+ valuesOption.splice( indexOf( valuesOption, value ), 1 );
+ }
+
+ if( value === 'all' || isGroupOptionInUserOptions && !!search( options, 'lang' )) {
+ return [];
+ }
+
+ if( value === 'options' ) {
+ valuesOption = [ 'lang' ];
+ }
+ }
+
+ retval = retval.concat( valuesOption );
+
+ return retval;
+ };
+
+ editor.config.scayt_disableOptionsStorage = makeOptionsToStorage( userOptions );
+ }
+ },
+ addRule: function(editor) {
+ var plugin = CKEDITOR.plugins.scayt,
+ dataProcessor = editor.dataProcessor,
+ htmlFilter = dataProcessor && dataProcessor.htmlFilter,
+ pathFilters = editor._.elementsPath && editor._.elementsPath.filters,
+ dataFilter = dataProcessor && dataProcessor.dataFilter,
+ removeFormatFilter = editor.addRemoveFormatFilter,
+ pathFilter = function(element) {
+ var scaytInstance = editor.scayt;
+
+ if( scaytInstance && (element.hasAttribute(plugin.options.data_attribute_name) || element.hasAttribute(plugin.options.problem_grammar_data_attribute)) ) {
+ return false;
+ }
+ },
+ removeFormatFilterTemplate = function(element) {
+ var scaytInstance = editor.scayt,
+ result = true;
+
+ if( scaytInstance && (element.hasAttribute(plugin.options.data_attribute_name) || element.hasAttribute(plugin.options.problem_grammar_data_attribute)) ) {
+ result = false;
+ }
+
+ return result;
+ };
+
+ if(pathFilters) {
+ pathFilters.push(pathFilter);
+ }
+
+ if(dataFilter) {
+ var dataFilterRules = {
+ elements: {
+ span: function(element) {
+
+ var scaytState = element.hasClass(plugin.options.misspelled_word_class) && element.attributes[plugin.options.data_attribute_name],
+ graytState = element.hasClass(plugin.options.problem_grammar_class) && element.attributes[plugin.options.problem_grammar_data_attribute];
+
+ if(plugin && (scaytState || graytState)) {
+ delete element.name;
+ }
+
+ return element;
+ }
+ }
+ };
+
+ dataFilter.addRules(dataFilterRules);
+ }
+
+ if (htmlFilter) {
+ var htmlFilterRules = {
+ elements: {
+ span: function(element) {
+
+ var scaytState = element.hasClass(plugin.options.misspelled_word_class) && element.attributes[plugin.options.data_attribute_name],
+ graytState = element.hasClass(plugin.options.problem_grammar_class) && element.attributes[plugin.options.problem_grammar_data_attribute];
+
+ if(plugin && (scaytState || graytState)) {
+ delete element.name;
+ }
+
+ return element;
+ }
+ }
+ };
+
+ htmlFilter.addRules(htmlFilterRules);
+ }
+
+ if(removeFormatFilter) {
+ removeFormatFilter.call(editor, removeFormatFilterTemplate);
+ }
+ },
+ scaytMenuDefinition: function(editor) {
+ var self = this,
+ plugin = CKEDITOR.plugins.scayt,
+ scayt_instance = editor.scayt;
+
+ return {
+ scayt: {
+ scayt_ignore: {
+ label: scayt_instance.getLocal('btn_ignore'),
+ group : 'scayt_control',
+ order : 1,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+ scaytInstance.ignoreWord();
+ }
+ },
+ scayt_ignoreall: {
+ label : scayt_instance.getLocal('btn_ignoreAll'),
+ group : 'scayt_control',
+ order : 2,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+ scaytInstance.ignoreAllWords();
+ }
+ },
+ scayt_add: {
+ label : scayt_instance.getLocal('btn_addWord'),
+ group : 'scayt_control',
+ order : 3,
+ exec : function(editor) {
+ var scaytInstance = editor.scayt;
+
+ // @TODO: We need to add set/restore bookmark logic to 'addWordToUserDictionary' method inside dictionarymanager.
+ // Timeout is used as tmp fix for IE9, when after hitting 'Add word' menu item, document container was blurred.
+ setTimeout(function() {
+ scaytInstance.addWordToUserDictionary();
+ }, 10);
+ }
+ },
+ scayt_option: {
+ label : scayt_instance.getLocal('btn_options'),
+ group : 'scayt_control',
+ order : 4,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'options';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ },
+ verification: function(editor) {
+ return (editor.config.scayt_uiTabs[0] == 1) ? true : false;
+ }
+ },
+ scayt_language: {
+ label : scayt_instance.getLocal('btn_langs'),
+ group : 'scayt_control',
+ order : 5,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'langs';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ },
+ verification: function(editor) {
+ return (editor.config.scayt_uiTabs[1] == 1) ? true : false;
+ }
+ },
+ scayt_dictionary: {
+ label : scayt_instance.getLocal('btn_dictionaries'),
+ group : 'scayt_control',
+ order : 6,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'dictionaries';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ },
+ verification: function(editor) {
+ return (editor.config.scayt_uiTabs[2] == 1) ? true : false;
+ }
+ },
+ scayt_about: {
+ label : scayt_instance.getLocal('btn_about'),
+ group : 'scayt_control',
+ order : 7,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.tabToOpen = 'about';
+ editor.lockSelection();
+ editor.openDialog(self.dialogName);
+ }
+ }
+ },
+ grayt: {
+ grayt_problemdescription: {
+ label : 'Grammar problem description',
+ group : 'grayt_description', // look at addMenuItems method for further info
+ order : 1,
+ state : CKEDITOR.TRISTATE_DISABLED,
+ exec: function(editor) {}
+ },
+ grayt_ignore: {
+ label : scayt_instance.getLocal('btn_ignore'),
+ group : 'grayt_control',
+ order : 2,
+ exec: function(editor) {
+ var scaytInstance = editor.scayt;
+
+ scaytInstance.ignorePhrase();
+ }
+ }
+ }
+ };
+ },
+ buildSuggestionMenuItems: function(editor, suggestions, isScaytNode) {
+ var self = this,
+ itemList = {},
+ subItemList = {},
+ replaceKeyName = isScaytNode ? 'word' : 'phrase',
+ updateEventName = isScaytNode ? 'startGrammarCheck' : 'startSpellCheck',
+ plugin = CKEDITOR.plugins.scayt,
+ scayt_instance = editor.scayt;
+
+ if(suggestions.length > 0 && suggestions[0] !== 'no_any_suggestions') {
+
+ if(isScaytNode) {
+ // build SCAYT suggestions
+ for(var i = 0; i < suggestions.length; i++) {
+
+ var commandName = 'scayt_suggest_' + CKEDITOR.plugins.scayt.suggestions[i].replace(' ', '_');
+
+ editor.addCommand(commandName, self.createCommand(CKEDITOR.plugins.scayt.suggestions[i], replaceKeyName, updateEventName));
+
+ if(i < editor.config.scayt_maxSuggestions) {
+
+ // mainSuggestions
+ editor.addMenuItem(commandName, {
+ label: suggestions[i],
+ command: commandName,
+ group: 'scayt_suggest',
+ order: i + 1
+ });
+
+ itemList[commandName] = CKEDITOR.TRISTATE_OFF;
+
+ } else {
+
+ // moreSuggestions
+ editor.addMenuItem(commandName, {
+ label: suggestions[i],
+ command: commandName,
+ group: 'scayt_moresuggest',
+ order: i + 1
+ });
+
+ subItemList[commandName] = CKEDITOR.TRISTATE_OFF;
+
+ if(editor.config.scayt_moreSuggestions === 'on') {
+
+ editor.addMenuItem('scayt_moresuggest', {
+ label : scayt_instance.getLocal('btn_moreSuggestions'),
+ group : 'scayt_moresuggest',
+ order : 10,
+ getItems : function() {
+ return subItemList;
+ }
+ });
+
+ itemList['scayt_moresuggest'] = CKEDITOR.TRISTATE_OFF;
+ }
+ }
+ }
+ } else {
+ // build GRAYT suggestions
+ for(var i = 0; i < suggestions.length; i++) {
+ var commandName = 'grayt_suggest_' + CKEDITOR.plugins.scayt.suggestions[i].replace(' ', '_');
+
+ editor.addCommand(commandName, self.createCommand(CKEDITOR.plugins.scayt.suggestions[i], replaceKeyName, updateEventName));
+
+ // mainSuggestions
+ editor.addMenuItem(commandName, {
+ label: suggestions[i],
+ command: commandName,
+ group: 'grayt_suggest',
+ order: i + 1
+ });
+
+ itemList[commandName] = CKEDITOR.TRISTATE_OFF;
+ }
+ }
+ } else {
+ var noSuggestionsCommand = 'no_scayt_suggest';
+ itemList[noSuggestionsCommand] = CKEDITOR.TRISTATE_DISABLED;
+
+ editor.addCommand(noSuggestionsCommand, {
+ exec: function() {
+
+ }
+ });
+
+ editor.addMenuItem(noSuggestionsCommand, {
+ label : scayt_instance.getLocal('btn_noSuggestions') || noSuggestionsCommand,
+ command: noSuggestionsCommand,
+ group : 'scayt_suggest',
+ order : 0
+ });
+ }
+
+ return itemList;
+ },
+ menuGenerator: function(editor, selectionNode) {
+ var self = this,
+ scaytInstance = editor.scayt,
+ menuItems = this.scaytMenuDefinition(editor),
+ itemList = {},
+ allowedOption = editor.config.scayt_contextCommands.split('|'),
+ lang = selectionNode.getAttribute(scaytInstance.getLangAttribute()) || scaytInstance.getLang(),
+ word, grammarPhrase, isScaytNode, isGrammarNode, problemDescriptionText;
+
+
+ isScaytNode = scaytInstance.isScaytNode(selectionNode);
+ isGrammarNode = scaytInstance.isGraytNode(selectionNode);
+
+ if(isScaytNode) {
+ // we clicked scayt misspelling
+ // get suggestions
+ menuItems = menuItems.scayt;
+
+ word = selectionNode.getAttribute(scaytInstance.getScaytNodeAttributeName());
+
+ scaytInstance.fire('getSuggestionsList', {
+ lang: lang,
+ word: word
+ });
+
+ itemList = this.buildSuggestionMenuItems(editor, CKEDITOR.plugins.scayt.suggestions, isScaytNode);
+ } else if(isGrammarNode) {
+ // we clicked grammar problem
+ // get suggestions
+ menuItems = menuItems.grayt;
+ grammarPhrase = selectionNode.getAttribute(scaytInstance.getGraytNodeAttributeName());
+
+ // setup grammar problem description
+ problemDescriptionText = scaytInstance.getProblemDescriptionText(grammarPhrase, lang);
+ if(menuItems.grayt_problemdescription && problemDescriptionText) {
+ menuItems.grayt_problemdescription.label = problemDescriptionText;
+ }
+
+ scaytInstance.fire('getGrammarSuggestionsList', {
+ lang: lang,
+ phrase: grammarPhrase
+ });
+
+ itemList = this.buildSuggestionMenuItems(editor, CKEDITOR.plugins.scayt.suggestions, isScaytNode);
+ }
+
+ if(isScaytNode && editor.config.scayt_contextCommands == 'off') {
+ return itemList;
+ }
+
+ for(var key in menuItems) {
+ if(isScaytNode && CKEDITOR.tools.indexOf(allowedOption, key.replace('scayt_', '')) == -1 && editor.config.scayt_contextCommands != 'all') {
+ continue;
+ }
+
+ if(typeof menuItems[key].state != 'undefined') {
+ itemList[key] = menuItems[key].state;
+ } else {
+ itemList[key] = CKEDITOR.TRISTATE_OFF;
+ }
+
+ // delete item from context menu if its state isn't verified as allowed
+ if(typeof menuItems[key].verification === 'function' && !menuItems[key].verification(editor)) {
+ // itemList[key] = (menuItems[key].verification(editor)) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
+ delete itemList[key];
+ }
+
+ editor.addCommand(key, {
+ exec: menuItems[key].exec
+ });
+
+ editor.addMenuItem(key, {
+ label : editor.lang.scayt[menuItems[key].label] || menuItems[key].label,
+ command: key,
+ group : menuItems[key].group,
+ order : menuItems[key].order
+ });
+ }
+
+ return itemList;
+ },
+ createCommand: function(suggestion, replaceKeyName, updateEventName) {
+ return {
+ exec: function(editor) {
+ var scaytInstance = editor.scayt,
+ eventObject = {};
+
+ eventObject[replaceKeyName] = suggestion;
+ scaytInstance.replaceSelectionNode(eventObject);
+
+ // we need to remove grammar markup from selection node if we just performed replace action for misspelling
+ if(updateEventName === 'startGrammarCheck') {
+ scaytInstance.removeMarkupInSelectionNode({grammarOnly: true});
+ }
+ // for grayt problem replacement we need to fire 'startSpellCheck'
+ // for scayt misspelling replacement we need to fire 'startGrammarCheck'
+ scaytInstance.fire(updateEventName);
+ }
+ };
+ }
+});
+
+CKEDITOR.plugins.scayt = {
+ state: {
+ scayt: {},
+ grayt: {}
+ },
+ suggestions: [],
+ loadingHelper: {
+ loadOrder: []
+ },
+ isLoading: false,
+ options: {
+ disablingCommandExec: {
+ source: true,
+ newpage: true,
+ templates: true
+ },
+ data_attribute_name: 'data-scayt-word',
+ misspelled_word_class: 'scayt-misspell-word',
+ problem_grammar_data_attribute: 'data-grayt-phrase',
+ problem_grammar_class: 'gramm-problem'
+ },
+ backCompatibilityMap: {
+ 'scayt_service_protocol': 'scayt_serviceProtocol',
+ 'scayt_service_host' : 'scayt_serviceHost',
+ 'scayt_service_port' : 'scayt_servicePort',
+ 'scayt_service_path' : 'scayt_servicePath',
+ 'scayt_customerid' : 'scayt_customerId'
+ },
+ replaceOldOptionsNames: function(config) {
+ for(var key in config) {
+ if(key in this.backCompatibilityMap) {
+ config[this.backCompatibilityMap[key]] = config[key];
+ delete config[key];
+ }
+ }
+ },
+ createScayt : function(editor) {
+ var self = this,
+ plugin = CKEDITOR.plugins.scayt;
+
+ this.loadScaytLibrary(editor, function(_editor) {
+ var textContainer = _editor.window && _editor.window.getFrame() || _editor.editable();
+
+ // Do not create SCAYT if there is no text container for usage
+ if(!textContainer) {
+ plugin.state.scayt[_editor.name] = false;
+ return;
+ }
+
+ var scaytInstanceOptions = {
+ lang : _editor.config.scayt_sLang,
+ container : textContainer.$,
+ customDictionary : _editor.config.scayt_customDictionaryIds,
+ userDictionaryName : _editor.config.scayt_userDictionaryName,
+ localization : _editor.langCode,
+ customer_id : _editor.config.scayt_customerId,
+ debug : _editor.config.scayt_debug,
+ data_attribute_name : self.options.data_attribute_name,
+ misspelled_word_class: self.options.misspelled_word_class,
+ problem_grammar_data_attribute: self.options.problem_grammar_data_attribute,
+ problem_grammar_class: self.options.problem_grammar_class,
+ 'options-to-restore': _editor.config.scayt_disableOptionsStorage,
+ focused : _editor.editable().hasFocus, // #30260 we need to set focused=true if CKEditor is focused before SCAYT initialization
+ ignoreElementsRegex : _editor.config.scayt_elementsToIgnore,
+ minWordLength : _editor.config.scayt_minWordLength,
+ multiLanguageMode : _editor.config.scayt_multiLanguageMode,
+ multiLanguageStyles : _editor.config.scayt_multiLanguageStyles,
+ graytAutoStartup : plugin.state.grayt[_editor.name]
+ };
+
+ if(_editor.config.scayt_serviceProtocol) {
+ scaytInstanceOptions['service_protocol'] = _editor.config.scayt_serviceProtocol;
+ }
+
+ if(_editor.config.scayt_serviceHost) {
+ scaytInstanceOptions['service_host'] = _editor.config.scayt_serviceHost;
+ }
+
+ if(_editor.config.scayt_servicePort) {
+ scaytInstanceOptions['service_port'] = _editor.config.scayt_servicePort;
+ }
+
+ if(_editor.config.scayt_servicePath) {
+ scaytInstanceOptions['service_path'] = _editor.config.scayt_servicePath;
+ }
+
+ //predefined options
+ if(typeof _editor.config.scayt_ignoreAllCapsWords === 'boolean') {
+ scaytInstanceOptions['ignore-all-caps-words'] = _editor.config.scayt_ignoreAllCapsWords;
+ }
+
+ if(typeof _editor.config.scayt_ignoreDomainNames === 'boolean') {
+ scaytInstanceOptions['ignore-domain-names'] = _editor.config.scayt_ignoreDomainNames;
+ }
+
+ if(typeof _editor.config.scayt_ignoreWordsWithMixedCases === 'boolean') {
+ scaytInstanceOptions['ignore-words-with-mixed-cases'] = _editor.config.scayt_ignoreWordsWithMixedCases;
+ }
+
+ if(typeof _editor.config.scayt_ignoreWordsWithNumbers === 'boolean') {
+ scaytInstanceOptions['ignore-words-with-numbers'] = _editor.config.scayt_ignoreWordsWithNumbers;
+ }
+
+ var scaytInstance = new SCAYT.CKSCAYT(scaytInstanceOptions, function() {
+ // success callback
+ }, function() {
+ // error callback
+ }),
+ wordsPrefix = 'word_';
+
+ scaytInstance.subscribe('suggestionListSend', function(data) {
+ // TODO: 1. Maybe store suggestions for specific editor
+ // TODO: 2. Fix issue with suggestion duplicates on on server
+ //CKEDITOR.plugins.scayt.suggestions = data.suggestionList;
+ var _wordsCollection = {},
+ _suggestionList =[];
+
+ for (var i = 0; i < data.suggestionList.length; i++) {
+ if (!_wordsCollection[wordsPrefix + data.suggestionList[i]]) {
+ _wordsCollection[wordsPrefix + data.suggestionList[i]] = data.suggestionList[i];
+ _suggestionList.push(data.suggestionList[i]);
+ }
+ }
+
+ CKEDITOR.plugins.scayt.suggestions = _suggestionList;
+ });
+
+ // if selection has changed programmatically by SCAYT we need to react appropriately
+ scaytInstance.subscribe('selectionIsChanged', function(data) {
+ var selection = _editor.getSelection();
+
+ if(selection.isLocked) {
+ _editor.lockSelection();
+ }
+ });
+
+ scaytInstance.subscribe('graytStateChanged', function(data) {
+ plugin.state.grayt[_editor.name] = data.state;
+ });
+
+ _editor.scayt = scaytInstance;
+
+ _editor.fire('scaytButtonState', _editor.readOnly ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_ON);
+ });
+ },
+ destroy: function(editor) {
+ if(editor.scayt) {
+ editor.scayt.destroy();
+ }
+
+ delete editor.scayt;
+ editor.fire('scaytButtonState', CKEDITOR.TRISTATE_OFF);
+ },
+ loadScaytLibrary: function(editor, callback) {
+ var self = this,
+ date,
+ timestamp,
+ scaytUrl;
+
+ // no need to process load requests from same editor as it can cause bugs with
+ // loading ckscayt app due to subsequent calls of some events
+ // need to be before 'if' statement, because of timing issue in CKEDITOR.scriptLoader
+ // when callback executing is delayed for a few milliseconds, and scayt can be created twise
+ // on one instance
+ if(this.loadingHelper[editor.name]) return;
+
+ if(typeof window.SCAYT === 'undefined' || typeof window.SCAYT.CKSCAYT !== 'function') {
+
+ // add onLoad callbacks for editors while SCAYT is loading
+ this.loadingHelper[editor.name] = callback;
+ this.loadingHelper.loadOrder.push(editor.name);
+
+ //creating unique timestamp for SCAYT URL
+ date = new Date();
+ timestamp = date.getTime();
+ scaytUrl = editor.config.scayt_srcUrl;
+
+ //if there already implemented timstamp for scayr_srcURL use it, if not use our timestamp
+ scaytUrl = scaytUrl + (scaytUrl.indexOf('?') >= 0 ? '' : '?' + timestamp);
+
+ if (!this.loadingHelper.ckscaytLoading) {
+ CKEDITOR.scriptLoader.load(scaytUrl, function(success) {
+ var editorName;
+
+ if ( success ) {
+ CKEDITOR.fireOnce('scaytReady');
+
+ for(var i = 0; i < self.loadingHelper.loadOrder.length; i++) {
+ editorName = self.loadingHelper.loadOrder[i];
+
+ if(typeof self.loadingHelper[editorName] === 'function') {
+ self.loadingHelper[editorName](CKEDITOR.instances[editorName]);
+ }
+
+ delete self.loadingHelper[editorName];
+ }
+ self.loadingHelper.loadOrder = [];
+ }
+ });
+ this.loadingHelper.ckscaytLoading = true;
+ }
+
+
+ } else if(window.SCAYT && typeof window.SCAYT.CKSCAYT === 'function') {
+ CKEDITOR.fireOnce('scaytReady');
+
+ if(!editor.scayt) {
+ if(typeof callback === 'function') {
+ callback(editor);
+ }
+ }
+ }
+ }
+};
+
+CKEDITOR.on('dialogDefinition', function(dialogDefinitionEvent) {
+ var dialogName = dialogDefinitionEvent.data.name,
+ dialogDefinition = dialogDefinitionEvent.data.definition,
+ dialog = dialogDefinition.dialog;
+
+ if (dialogName === 'scaytDialog') {
+ dialog.on('cancel', function(cancelEvent) {
+ return false;
+ }, this, null, -1);
+ }
+
+ if ( dialogName === 'checkspell' ) {
+ dialog.on( 'cancel', function( cancelEvent ) {
+ var editor = cancelEvent.sender && cancelEvent.sender.getParentEditor(),
+ plugin = CKEDITOR.plugins.scayt,
+ scaytInstance = editor.scayt;
+
+ if ( scaytInstance && plugin.state.scayt[ editor.name ] && scaytInstance.setMarkupPaused ) {
+ scaytInstance.setMarkupPaused( false );
+ }
+
+ editor.unlockSelection();
+ }, this, null, -2 ); // we need to call cancel callback before WSC plugin
+ }
+
+ if (dialogName === 'link') {
+ dialog.on('ok', function(okEvent) {
+ var editor = okEvent.sender && okEvent.sender.getParentEditor();
+
+ if(editor) {
+ setTimeout(function() {
+ editor.fire('reloadMarkupScayt', {
+ removeOptions: {
+ removeInside: true,
+ forceBookmark: true
+ },
+ timeout: 0
+ });
+ }, 0);
+ }
+ });
+ }
+});
+
+CKEDITOR.on('scaytReady', function() {
+
+ // Override editor.checkDirty method avoid CK checkDirty functionality to fix SCAYT issues with incorrect checkDirty behavior.
+ if(CKEDITOR.config.scayt_handleCheckDirty === true) {
+ var editorCheckDirty = CKEDITOR.editor.prototype;
+
+ editorCheckDirty.checkDirty = CKEDITOR.tools.override(editorCheckDirty.checkDirty, function(org) {
+
+ return function() {
+ var retval = null,
+ pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[this.name] && this.scayt,
+ scaytInstance = this.scayt;
+
+ if(!pluginStatus) {
+ retval = org.call(this);
+ } else {
+ retval = (this.status == 'ready');
+
+ if (retval) {
+ var currentData = scaytInstance.removeMarkupFromString(this.getSnapshot()),
+ prevData = scaytInstance.removeMarkupFromString(this._.previousValue);
+
+ retval = (retval && (prevData !== currentData))
+ }
+ }
+
+ return retval;
+ };
+ });
+
+ editorCheckDirty.resetDirty = CKEDITOR.tools.override(editorCheckDirty.resetDirty, function(org) {
+ return function() {
+ var pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[this.name] && this.scayt,
+ scaytInstance = this.scayt;//CKEDITOR.plugins.scayt.getScayt(this);
+
+ if(!pluginStatus) {
+ org.call(this);
+ } else {
+ this._.previousValue = scaytInstance.removeMarkupFromString(this.getSnapshot());
+ }
+ };
+ });
+ }
+
+ if (CKEDITOR.config.scayt_handleUndoRedo === true) {
+ var undoImagePrototype = CKEDITOR.plugins.undo.Image.prototype;
+
+ // add backword compatibility for CKEDITOR 4.2. method equals was repleced on other method
+ var equalsContentMethodName = (typeof undoImagePrototype.equalsContent == "function") ? 'equalsContent' : 'equals';
+
+ undoImagePrototype[equalsContentMethodName] = CKEDITOR.tools.override(undoImagePrototype[equalsContentMethodName], function(org) {
+ return function(otherImage) {
+ var pluginState = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[otherImage.editor.name] && otherImage.editor.scayt,
+ scaytInstance = otherImage.editor.scayt,
+ thisContents = this.contents,
+ otherContents = otherImage.contents,
+ retval = null;
+
+ // Making the comparison based on content without SCAYT word markers.
+ if(pluginState) {
+ this.contents = scaytInstance.removeMarkupFromString(thisContents) || '';
+ otherImage.contents = scaytInstance.removeMarkupFromString(otherContents) || '';
+ }
+
+ var retval = org.apply(this, arguments);
+
+ this.contents = thisContents;
+ otherImage.contents = otherContents;
+
+ return retval;
+ };
+ });
+ }
+});
+
+/**
+ * Automatically enables SCAYT on editor startup. When set to `true`, this option turns on SCAYT automatically
+ * after loading the editor.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_autoStartup = true;
+ *
+ * @cfg {Boolean} [scayt_autoStartup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables Grammar As You Type (GRAYT) on SCAYT startup. When set to `true`, this option turns on GRAYT automatically
+ * after SCAYT started.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.grayt_autoStartup = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [grayt_autoStartup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables SCAYT initialization when inline CKEditor is not focused. When set to `true`, SCAYT markup is
+ * displayed in both inline editor states, focused and unfocused, so the SCAYT instance is not destroyed.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_inlineModeImmediateMarkup = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_inlineModeImmediateMarkup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines the number of SCAYT suggestions to show in the main context menu.
+ * Possible values are:
+ *
+ * * `0` (zero) – No suggestions are shown in the main context menu. All
+ * entries will be listed in the "More Suggestions" sub-menu.
+ * * Positive number – The maximum number of suggestions to show in the context
+ * menu. Other entries will be shown in the "More Suggestions" sub-menu.
+ * * Negative number – Five suggestions are shown in the main context menu. All other
+ * entries will be listed in the "More Suggestions" sub-menu.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Examples:
+ *
+ * // Display only three suggestions in the main context menu.
+ * config.scayt_maxSuggestions = 3;
+ *
+ * // Do not show the suggestions directly.
+ * config.scayt_maxSuggestions = 0;
+ *
+ * @cfg {Number} [scayt_maxSuggestions=5]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines the minimum length of words that will be collected from the editor content for spell checking.
+ * Possible value is any positive number.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Examples:
+ *
+ * // Set the minimum length of words that will be collected from editor text.
+ * config.scayt_minWordLength = 5;
+ *
+ * @cfg {Number} [scayt_minWordLength=4]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the customer ID for SCAYT. Used for hosted users only. Required for migration from free
+ * to trial or paid versions.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Load SCAYT using my customer ID.
+ * config.scayt_customerId = 'your-encrypted-customer-id';
+ *
+ * @cfg {String} [scayt_customerId='1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables and disables the "More Suggestions" sub-menu in the context menu.
+ * Possible values are `'on'` and `'off'`.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Disables the "More Suggestions" sub-menu.
+ * config.scayt_moreSuggestions = 'off';
+ *
+ * @cfg {String} [scayt_moreSuggestions='on']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Customizes the display of SCAYT context menu commands ("Add Word", "Ignore",
+ * "Ignore All", "Options", "Languages", "Dictionaries" and "About").
+ * This must be a string with one or more of the following
+ * words separated by a pipe character (`'|'`):
+ *
+ * * `off` – Disables all options.
+ * * `all` – Enables all options.
+ * * `ignore` – Enables the "Ignore" option.
+ * * `ignoreall` – Enables the "Ignore All" option.
+ * * `add` – Enables the "Add Word" option.
+ * * `option` – Enables the "Options" menu item.
+ * * `language` – Enables the "Languages" menu item.
+ * * `dictionary` – Enables the "Dictionaries" menu item.
+ * * `about` – Enables the "About" menu item.
+ *
+ * Please note that availability of the "Options", "Languages" and "Dictionaries" items
+ * also depends on the {@link CKEDITOR.config#scayt_uiTabs} option.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ * // Show only "Add Word" and "Ignore All" in the context menu.
+ * config.scayt_contextCommands = 'add|ignoreall';
+ *
+ * @cfg {String} [scayt_contextCommands='ignore|ignoreall|add']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the default spell checking language for SCAYT. Possible values are:
+ * `'en_US'`, `'en_GB'`, `'pt_BR'`, `'da_DK'`,
+ * `'nl_NL'`, `'en_CA'`, `'fi_FI'`, `'fr_FR'`,
+ * `'fr_CA'`, `'de_DE'`, `'el_GR'`, `'it_IT'`,
+ * `'nb_NO'`, `'pt_PT'`, `'es_ES'`, `'sv_SE'`.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Sets SCAYT to German.
+ * config.scayt_sLang = 'de_DE';
+ *
+ * @cfg {String} [scayt_sLang='en_US']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Customizes the SCAYT dialog and SCAYT toolbar menu to show particular tabs and items.
+ * This setting must contain a `1` (enabled) or `0`
+ * (disabled) value for each of the following entries, in this precise order,
+ * separated by a comma (`','`): `'Options'`, `'Languages'`, and `'Dictionary'`.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Hides the "Languages" tab.
+ * config.scayt_uiTabs = '1,0,1';
+ *
+ * @cfg {String} [scayt_uiTabs='1,1,1']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the protocol for the WebSpellChecker service (`ssrv.cgi`) full path.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Defines the protocol for the WebSpellChecker service (ssrv.cgi) path.
+ * config.scayt_serviceProtocol = 'https';
+ *
+ * @cfg {String} [scayt_serviceProtocol='http']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the host for the WebSpellChecker service (`ssrv.cgi`) full path.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Defines the host for the WebSpellChecker service (ssrv.cgi) path.
+ * config.scayt_serviceHost = 'my-host';
+ *
+ * @cfg {String} [scayt_serviceHost='svc.webspellchecker.net']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the port for the WebSpellChecker service (`ssrv.cgi`) full path.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Defines the port for the WebSpellChecker service (ssrv.cgi) path.
+ * config.scayt_servicePort = '2330';
+ *
+ * @cfg {String} [scayt_servicePort='80']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the path to the WebSpellChecker service (`ssrv.cgi`).
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * // Defines the path to the WebSpellChecker service (ssrv.cgi).
+ * config.scayt_servicePath = 'my-path/ssrv.cgi';
+ *
+ * @cfg {String} [scayt_servicePath='spellcheck31/script/ssrv.cgi']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the URL to SCAYT core. Required to switch to the licensed version of SCAYT.
+ *
+ * Refer to [SCAYT documentation](http://wiki.webspellchecker.net/doku.php?id=migration:hosredfreetolicensedck)
+ * for more details.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_srcUrl = "http://my-host/spellcheck/lf/scayt/scayt.js";
+ *
+ * @cfg {String} [scayt_srcUrl='//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Links SCAYT to custom dictionaries. This is a string containing the dictionary IDs
+ * separated by commas (`','`). Available only for the licensed version.
+ *
+ * Refer to [SCAYT documentation](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:customdictionaries:licensed)
+ * for more details.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_customDictionaryIds = '3021,3456,3478';
+ *
+ * @cfg {String} [scayt_customDictionaryIds='']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Activates a User Dictionary in SCAYT. The user
+ * dictionary name must be used. Available only for the licensed version.
+ *
+ * Refer to [SCAYT documentation](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:userdictionaries)
+ * for more details.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_userDictionaryName = 'MyDictionary';
+ *
+ * @cfg {String} [scayt_userDictionaryName='']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines the order of SCAYT context menu items by groups.
+ * This must be a string with one or more of the following
+ * words separated by a pipe character (`'|'`):
+ *
+ * * `suggest` – The main suggestion word list.
+ * * `moresuggest` – The "More suggestions" word list.
+ * * `control` – SCAYT commands, such as "Ignore" and "Add Word".
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ * config.scayt_contextMenuItemsOrder = 'moresuggest|control|suggest';
+ *
+ * @cfg {String} [scayt_contextMenuItemsOrder='suggest|moresuggest|control']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * If set to `true`, it overrides the {@link CKEDITOR.editor#checkDirty checkDirty} functionality of CKEditor
+ * to fix SCAYT issues with incorrect `checkDirty` behavior. If set to `false`,
+ * it provides better performance on big preloaded text.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_handleCheckDirty = 'false';
+ *
+ * @cfg {String} [scayt_handleCheckDirty='true']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Configures undo/redo behavior of SCAYT in CKEditor.
+ * If set to `true`, it overrides the undo/redo functionality of CKEditor
+ * to fix SCAYT issues with incorrect undo/redo behavior. If set to `false`,
+ * it provides better performance on text undo/redo.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_handleUndoRedo = 'false';
+ *
+ * @cfg {String} [scayt_handleUndoRedo='true']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore All-Caps Words" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_ignoreAllCapsWords = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreAllCapsWords=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore Domain Names" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_ignoreDomainNames = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreDomainNames=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore Words with Mixed Case" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_ignoreWordsWithMixedCases = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreWordsWithMixedCases=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore Words with Numbers" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_ignoreWordsWithNumbers = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreWordsWithNumbers=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Disables storing of SCAYT options between sessions. Option storing will be turned off after a page refresh.
+ * The following settings can be used:
+ *
+ * * `'options'` – Disables storing of all SCAYT Ignore options.
+ * * `'ignore-all-caps-words'` – Disables storing of the "Ignore All-Caps Words" option.
+ * * `'ignore-domain-names'` – Disables storing of the "Ignore Domain Names" option.
+ * * `'ignore-words-with-mixed-cases'` – Disables storing of the "Ignore Words with Mixed Case" option.
+ * * `'ignore-words-with-numbers'` – Disables storing of the "Ignore Words with Numbers" option.
+ * * `'lang'` – Disables storing of the SCAYT spell check language.
+ * * `'all'` – Disables storing of all SCAYT options.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ * // Disabling one option.
+ * config.scayt_disableOptionsStorage = 'all';
+ *
+ * // Disabling several options.
+ * config.scayt_disableOptionsStorage = ['lang', 'ignore-domain-names', 'ignore-words-with-numbers'];
+ *
+ *
+ * @cfg {String|Array} [scayt_disableOptionsStorage = '']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Specifies the names of tags that will be skipped while spell checking. This is a string containing tag names
+ * separated by commas (`','`). Please note that the `'style'` tag would be added to specified tags list.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_elementsToIgnore = 'del,pre';
+ *
+ * @cfg {String} [scayt_elementsToIgnore='style']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables multi-language support in SCAYT. If set to `true`, turns on SCAYT multi-language support after loading the editor.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * config.scayt_multiLanguageMode = true;
+ *
+ * @cfg {Boolean} [scayt_multiLanguageMode=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines additional styles for misspellings for specified languages. Styles will be applied only if
+ * the {@link CKEDITOR.config#scayt_multiLanguageMode} option is set to `true` and the [Language](http://ckeditor.com/addon/language)
+ * plugin is included and loaded in the editor. By default, all misspellings will still be underlined with the red waveline.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ * // Display misspellings in French language with green color and underlined with red waveline.
+ * config.scayt_multiLanguageStyles = {
+ * 'fr': 'color: green'
+ * };
+ *
+ * // Display misspellings in Italian language with green color and underlined with red waveline
+ * // and German misspellings with red color only.
+ * config.scayt_multiLanguageStyles = {
+ * 'it': 'color: green',
+ * 'de': 'background-image: none; color: red'
+ * };
+ *
+ * @cfg {Object} [scayt_multiLanguageStyles = {}]
+ * @member CKEDITOR.config
+ */
diff --git a/app/Resources/public/css/base.css b/app/Resources/public/css/base.css
index 82ccb6af59..3394e57e08 100644
--- a/app/Resources/public/css/base.css
+++ b/app/Resources/public/css/base.css
@@ -71,7 +71,7 @@ a.thumbnail:hover{
display: block;
padding-bottom: 100%;
overflow: hidden;
-
+
}
.gallery .frame{
background-color: #eeeeee;
@@ -128,6 +128,14 @@ a.thumbnail:hover{
padding-top: 10px;
margin-top: 5px;
}
+#toolbar-admin.navbar{
+ margin-bottom: 0;
+ border-radius: 0;
+ border: none;
+}
+header{
+ padding-top: 20px;
+}
.blackboard_show {
float:left;
position:absolute;
@@ -5786,7 +5794,7 @@ a.sessionView {
}
/* Landscape phones and down */
@media only screen and (min-device-width : 320px) and (max-device-width : 480px) {
-
+
#learning_path_breadcrumb_zone {
}
#learning_path_main{
@@ -5861,7 +5869,7 @@ a.sessionView {
#show_graph{
text-align: center;
}
-
+
}
@media (min-width : 480px) and (max-width: 767px) {
#touch-button{
@@ -5972,3 +5980,7 @@ a.sessionView {
font-size: 120%;
margin-bottom: 0;
}
+
+#upload_form .fa-plus-square-o, #upload_form .fa-minus-square-o {
+ cursor:pointer;
+}
\ No newline at end of file
diff --git a/app/Resources/public/css/chat.css b/app/Resources/public/css/chat.css
index 6f9d2a9e1d..8578b287e3 100644
--- a/app/Resources/public/css/chat.css
+++ b/app/Resources/public/css/chat.css
@@ -1,13 +1,5 @@
-body{
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- line-height: 18px;
- color: #333333;
- margin: 0;
- padding: 0;
-}
.page-chat{
- padding: 10px;
+ padding: 10px 0;
background:#ffffff;
}
.message-form-chat .nav{
@@ -16,48 +8,7 @@ body{
.message-form-chat .nav-tabs .active a{
background-color: #f6f6f6;
}
-#clear-chat{
- width:140px;
- padding: 13px;
- font-size: 14px;
- float:right;
-}
-#clear-chat img{
- width: 20px;
- float: left;
- margin-right: 5px;
-}
-#clear-chat a{
- text-decoration: none;
-}
-#clear-chat a:hover{
- opacity: 0.7;
-}
-#content-chat{
- background:#ffffff;
- padding: 30px;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
-}
-
-textarea {
- width: 52%;
- padding: 3%;
- height: 100px;
- float: left;
- border: 0;
- background-color: #ffffff;
-
- font-family: Helvetica, arial, sans-serif;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
- border: 1px solid #EEEEEE;
- color: #666;
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35) inset;
-}
.message-student .chat-image, .message-teacher .chat-image{
width: 80px;
height: auto;
@@ -85,7 +36,7 @@ textarea {
font-size: 13px;
padding: 15px;
vertical-align: top;
- width: 310px;
+ width: calc(100% - 100px);
}
.message-teacher .icon-message{
display: inline-block;
@@ -121,7 +72,7 @@ textarea {
font-size: 13px;
padding: 15px;
vertical-align: top;
- width: 360px;
+ width: calc(100% - 100px);
}
.message-teacher .message-date{
color: #666;
@@ -138,121 +89,30 @@ textarea {
text-align: right;
margin-top: 10px;
}
-.user-online .profile{
- list-style: none;
- padding: 0;
- margin:0;
-}
-.chat-message-block-name {
- font-style: italic;
- color: #666;
-}
-.user-online .profile li{
- margin-bottom: 5px;
-}
-.user-online .profile li a{
- color: #0088AA;
- text-decoration: none;
-}
-.user-online .title{
- background: url(chat.png) no-repeat 0 center;
- color: #0088AA;
- padding-top: 5px;
- padding-left: 30px;
- font-weight: bold;
- font-size: 16px;
- margin-bottom: 15px;
- width: 90%;
-}
-.delete-chat{
- background: #F8F8F8;
- padding-bottom: 15px;
-}
-.list-group {
- margin-bottom: 20px;
- padding-left: 0;
-}
-.list-group-item {
- position: relative;
- display: block;
- padding-top: 5px;
- padding-bottom: 10px;
- padding-left: 10px;
- padding-right: 10px;
- margin-bottom: -1px;
- background-color: #EEEEEE;
- border: 1px solid #E2E2E2;
- -webkit-border-radius: 10px;
+
+.chat-user {
+ background-color: #EEEEEE;
+ border: 1px solid #E2E2E2;
+ -webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
color: #666;
+ margin-bottom: -1px;
+ padding: 10px;
}
-.user-connected{
- border-right: 1px dashed #cccccc;
- margin-right: 5px;
-}
-li.list-group-item:hover, li.list-group-item:focus {
- text-decoration: none;
- background-color: #E2E2E2;
- cursor: pointer;
- border: 1px solid #EEEEEE;
-}
-li.list-group-item:hover a{
- color: #000;
-}
-.user-image-chat{
- width: 40px;
- height: auto;
- max-height: 40px;
- display: inline-block;
- vertical-align: top;
- -webkit-border-radius: 10px;
+.chat-user .user-image-chat {
+ -webkit-border-radius: 10px;
-moz-border-radius: 10px;
+ border: 2px solid #FFF;
border-radius: 10px;
- border:2px solid #ffffff;
+ display: inline-block;
+ height: auto;
+ margin-right: 10px;
+ max-height: 40px;
float: left;
- margin-right: 5px;
-}
-.noSelect {
- user-select: none;
- -o-user-select: none;
- -moz-user-select: none;
- -khtml-user-select: none;
- -webkit-user-select: none;
-}
-.btn-send {
- background: #87e0fd; /* Old browsers */
- background: -moz-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); /* FF3.6+ */
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#87e0fd), color-stop(40%,#53cbf1), color-stop(100%,#05abe0)); /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); /* Chrome10+,Safari5.1+ */
- background: -o-linear-gradient(top, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); /* Opera 11.10+ */
- background: -ms-linear-gradient(top, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); /* IE10+ */
- background: linear-gradient(to bottom, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); /* W3C */
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#87e0fd', endColorstr='#05abe0',GradientType=0 ); /* IE6-9 */
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
- border:1px solid #53cbf1;
- display:inline-block;
- color:#ffffff;
- font-family:Arial;
- font-size:22px;
- font-weight:bold;
- font-style:normal;
- height:80px;
- line-height:80px;
- width:131px;
- text-decoration:none;
- text-align:center;
- cursor: pointer;
-}
-.btn-send:hover {
- opacity: 0.8;
-}
-.btn-send:active {
- position:relative;
- top:1px;
+ width: 40px;
}
+
.emoticons-chat img{
width: 24px;
border: none;
@@ -267,21 +127,17 @@ li.list-group-item:hover a{
}
.emoji-menu {
- margin-left: 0px;
- width:468px;
- left: 11px !important;
+ margin-left: -234px;
+ margin-top: -224px;
+ width: 468px;
}
.emoji-wysiwyg-editor-preview,
.emoji-wysiwyg-editor {
- width: 454px;
padding: 3%;
height: 50px;
- float: left;
border: 0;
background-color: #ffffff;
-
- font-family: Helvetica, arial, sans-serif;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
@@ -289,3 +145,19 @@ li.list-group-item:hover a{
color: #666;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35) inset;
}
+
+#chat-tabs .tab-content{
+ margin-top: 15px;
+}
+
+.chat-history {
+ height: 400px;
+ overflow: auto;
+}
+
+#chat-users {
+ margin-left: 0;
+}
+#chat-users div.chat-user > div {
+ padding: 5px;
+}
diff --git a/app/Resources/public/css/scorm.css b/app/Resources/public/css/scorm.css
index c51b04bc75..15ee7332f9 100644
--- a/app/Resources/public/css/scorm.css
+++ b/app/Resources/public/css/scorm.css
@@ -109,7 +109,7 @@ See https://support.chamilo.org/issues/6976
}
.inner_lp_toc .scorm_item_section .scorm_item:before {
- content : url('../../main/img/lp_section.png'); /* path from main/newscorm/lp_controller.php file */
+ content : url('../../main/img/lp_section.png'); /* path from main/lp/lp_controller.php file */
vertical-align: text-top;
margin-right : 5px;
}
diff --git a/app/Resources/public/css/themes/chamilo/default.css b/app/Resources/public/css/themes/chamilo/default.css
index 7866ee62c1..d6a0c16b48 100644
--- a/app/Resources/public/css/themes/chamilo/default.css
+++ b/app/Resources/public/css/themes/chamilo/default.css
@@ -56,7 +56,7 @@ a:focus {
overflow: hidden !important;
}
.navbar-default {
- background: #3C8DBC;
+ background: #337AB7;
-webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
}
@@ -68,7 +68,7 @@ a:focus {
.navbar-default .navbar-nav > .active > a:hover,
.navbar-default .navbar-nav > .active > a:focus{
color: #fff;
- background-color:#367FA9;
+ background-color:#2C5B8E;
}
.navbar-default .navbar-nav > li > a{
color: #ffffff;
@@ -76,7 +76,7 @@ a:focus {
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .open > a:hover,
.navbar-default .navbar-nav > .open > a:focus{
- background: #367FA9;
+ background: #18477A;
color: #ffffff;
}
.navbar-nav > li > .dropdown-menu{
@@ -140,13 +140,8 @@ a:focus {
}
/* End Jquery UI */
footer{
- background-color:#2C3E50;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb', endColorstr='#ff1d9ce5', GradientType=0);
- border-bottom: 1px solid #2C3E50;
- -webkit-filter: none;
- filter: none;
- -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+ background-color:#1A2226;
+ border-top: 2px solid #D2D6DE;
}
footer{
color: #ffffff;
diff --git a/app/bootstrap.php.cache b/app/bootstrap.php.cache
index ae5ff197bb..35212edfb3 100644
--- a/app/bootstrap.php.cache
+++ b/app/bootstrap.php.cache
@@ -1358,7 +1358,7 @@ const HTTP_REQUEST_URI_TOO_LONG = 414;
const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
const HTTP_EXPECTATION_FAILED = 417;
-const HTTP_I_AM_A_TEAPOT = 418; const HTTP_MISDIRECTED_REQUEST = 421; const HTTP_UNPROCESSABLE_ENTITY = 422; const HTTP_LOCKED = 423; const HTTP_FAILED_DEPENDENCY = 424; const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425; const HTTP_UPGRADE_REQUIRED = 426; const HTTP_PRECONDITION_REQUIRED = 428; const HTTP_TOO_MANY_REQUESTS = 429; const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;
+const HTTP_I_AM_A_TEAPOT = 418; const HTTP_UNPROCESSABLE_ENTITY = 422; const HTTP_LOCKED = 423; const HTTP_FAILED_DEPENDENCY = 424; const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425; const HTTP_UPGRADE_REQUIRED = 426; const HTTP_PRECONDITION_REQUIRED = 428; const HTTP_TOO_MANY_REQUESTS = 429; const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;
const HTTP_INTERNAL_SERVER_ERROR = 500;
const HTTP_NOT_IMPLEMENTED = 501;
const HTTP_BAD_GATEWAY = 502;
@@ -1407,7 +1407,7 @@ public static $statusTexts = array(
415 =>'Unsupported Media Type',
416 =>'Range Not Satisfiable',
417 =>'Expectation Failed',
-418 =>'I\'m a teapot', 421 =>'Misdirected Request', 422 =>'Unprocessable Entity', 423 =>'Locked', 424 =>'Failed Dependency', 425 =>'Reserved for WebDAV advanced collections expired proposal', 426 =>'Upgrade Required', 428 =>'Precondition Required', 429 =>'Too Many Requests', 431 =>'Request Header Fields Too Large', 451 =>'Unavailable For Legal Reasons', 500 =>'Internal Server Error',
+418 =>'I\'m a teapot', 422 =>'Unprocessable Entity', 423 =>'Locked', 424 =>'Failed Dependency', 425 =>'Reserved for WebDAV advanced collections expired proposal', 426 =>'Upgrade Required', 428 =>'Precondition Required', 429 =>'Too Many Requests', 431 =>'Request Header Fields Too Large', 451 =>'Unavailable For Legal Reasons', 500 =>'Internal Server Error',
501 =>'Not Implemented',
502 =>'Bad Gateway',
503 =>'Service Unavailable',
@@ -2204,10 +2204,6 @@ if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE
return;
}
throw $e;
-} catch (\Throwable $e) {
-unset($this->loading[$id]);
-unset($this->services[$id]);
-throw $e;
}
unset($this->loading[$id]);
return $service;
@@ -2432,11 +2428,11 @@ protected $booted = false;
protected $name;
protected $startTime;
protected $loadClassCache;
-const VERSION ='2.8.7';
-const VERSION_ID = 20807;
+const VERSION ='2.8.6';
+const VERSION_ID = 20806;
const MAJOR_VERSION = 2;
const MINOR_VERSION = 8;
-const RELEASE_VERSION = 7;
+const RELEASE_VERSION = 6;
const EXTRA_VERSION ='';
const END_OF_MAINTENANCE ='11/2018';
const END_OF_LIFE ='11/2019';
@@ -3325,10 +3321,6 @@ $response = parent::handle($request, $type, $catch);
$this->container->set('request', null,'request');
$this->container->leaveScope('request');
throw $e;
-} catch (\Throwable $e) {
-$this->container->set('request', null,'request');
-$this->container->leaveScope('request');
-throw $e;
}
$this->container->set('request', null,'request');
$this->container->leaveScope('request');
diff --git a/app/check.php b/app/check.php
index bd56279f3c..cf1e6b0609 100644
--- a/app/check.php
+++ b/app/check.php
@@ -12,7 +12,7 @@ echo '> PHP is using the following php.ini file:'.PHP_EOL;
if ($iniPath) {
echo_style('green', ' '.$iniPath);
} else {
- echo_style('warning', ' WARNING: No configuration file (php.ini) used by PHP!');
+ echo_style('yellow', ' WARNING: No configuration file (php.ini) used by PHP!');
}
echo PHP_EOL.PHP_EOL;
diff --git a/app/config/config.yml b/app/config/config.yml
index 7b9288985c..c5ac2b86c8 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -74,9 +74,8 @@ framework:
http_method_override: true
theodo_evolution_session:
- bag_manager:
- class: Theodo\Evolution\Bundle\SessionBundle\Manager\Symfony1\BagManager
- configuration_class: Theodo\Evolution\Bundle\SessionBundle\Manager\Symfony1\BagConfiguration
+ bag_manager_service: theodo_evolution.session.symfony1.bag_manager
+ bag_configuration_service: theodo_evolution.session.symfony1.bag_manager_configuration
# Twig Configuration
twig:
diff --git a/cli-config.php b/cli-config.php
index 33fc98bc60..d3744e4650 100644
--- a/cli-config.php
+++ b/cli-config.php
@@ -35,10 +35,10 @@ $dbParams = array(
);
$database->connect($dbParams, realpath(__DIR__).'/', realpath(__DIR__).'/');
-$entityManager = $database->getManager();
+$entityManager = $database::getManager();
$helperSet = ConsoleRunner::createHelperSet($entityManager);
-$dialogHelper = new Symfony\Component\Console\Helper\DialogHelper();
+$dialogHelper = new Symfony\Component\Console\Helper\QuestionHelper();
$helperSet->set($dialogHelper);
return $helperSet;
diff --git a/composer.json b/composer.json
index 8cf644dfc9..a08177d8ba 100755
--- a/composer.json
+++ b/composer.json
@@ -22,9 +22,9 @@
"main/cron/lang",
"main/course_description",
"main/dropbox",
- "main/exercice",
+ "main/exercise",
"main/gradebook/lib",
- "main/newscorm",
+ "main/lp",
"main/inc/lib",
"plugin",
"main/install",
@@ -119,7 +119,7 @@
"ezyang/htmlpurifier": "4.6.0",
"szymach/c-pchart": "1.*",
"aferrandini/phpqrcode": "1.0.1",
- "mpdf/mpdf": "5.7.4",
+ "mpdf/mpdf": "6.1.*",
"barryvdh/elfinder-builds": "2.1.0.3",
"jbroadway/urlify": "1.0.3-stable",
"monolog/monolog": "~1.0",
diff --git a/documentation/changelog.html b/documentation/changelog.html
index 3438b6985d..478fd6d068 100755
--- a/documentation/changelog.html
+++ b/documentation/changelog.html
@@ -47,6 +47,48 @@
Note: most #wxyz references are issue numbers you can find in our public bug tracking system. Some references marked BT#xyz are developments made externally for BeezNest customers and integrated into Chamilo. The details of these tasks cannot be seen for confidentiality reasons, but the code change is public and can be reviewed by anyone.
+
+
+
Chamilo 1.11.0 - tobenamed, xxth of July 2016
+
Release notes - summary
+
Chamilo 1.11.0 is a major release of the 1.11.x branch. It is meant as a transition between 1.10 and 2.0 versions.
+
Release name
+
+
Security fixes
+
None in this version.
+
Possibly breaking changes
+
None in this version.
+
Notable new Features
+
For end-users, teachers and Chamilo admins
+
+
+
For developers and sysadmins
+
+
+
Stylesheets and theming
+
+
+
Files structure
+
+
The main/exercice/ folder has been renamed main/exercise/
+
The main/newscorm/ folder has been renamed main/lp/ (for Learning Path)
+
+
Web services
+
+
+
Removals
+
+
+
Known issues
+
+
IMS/QTI import/export has issues
+
In Internet Explorer 9, learning paths might not show other pages than the first to be opened. We lacked computers with IE9 at the time of release of 1.10.4. Guaranteeing IE9 support will likely require additional services. See the corresponding bug report
+
The text-to-speech converter based on Google now requires an API key
+
The Xapian search module is broken. We'll fix that soon, but not a lot of people use it
+
Encoding issues when importing accentuated characters from MS-Office-generated .xlsx files (for example when importing exercises). This isn't really a Chamilo issue, but since some users might have issues with that, we've decided to report it to avoid any surprise.
+
+
+
Chamilo 1.10.6 - Zacatecas, 24th of May 2016
diff --git a/documentation/installation_guide.html b/documentation/installation_guide.html
index 50e5b106cb..d9e2838145 100755
--- a/documentation/installation_guide.html
+++ b/documentation/installation_guide.html
@@ -680,6 +680,8 @@ If you have issues with files taking a long time to download, make sure you reco
RewriteRule ^courses/([^/]+)/course-pic.png$ app/courses/$1/course-pic.png [QSA,L]
RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
RewriteRule ^badge/(\d{1,})/user/(\d{1,}) main/badge/issued.php?skill=$1&user=$2 [L]
+ RewriteRule ^main/exercice/(.+)$ main/exercise/$1 [QSA,L]
+ RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
</Directory>
Nginx
@@ -718,6 +720,8 @@ If you have issues with files taking a long time to download, make sure you reco
rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last;
+ rewrite ^/main/exercice/(.+)$ /main/exercise/$1 last;
+ rewrite ^/main/newscorm/(.+)$ /main/lp/$1 last;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
diff --git a/documentation/installation_guide_es_ES.html b/documentation/installation_guide_es_ES.html
index 96ba9d2732..c9b0a024a2 100755
--- a/documentation/installation_guide_es_ES.html
+++ b/documentation/installation_guide_es_ES.html
@@ -711,6 +711,8 @@ por ejemplo. El efecto debería ser inmediato.
rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last;
+ rewrite ^/main/exercice/(.+)$ /main/exercise/$1 last;
+ rewrite ^/main/newscorm/(.+)$ /main/lp/$1 last;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
@@ -777,6 +779,8 @@ Apache2: La configuración para nuestro sitio de ejemplo my.chamilo10.net sería
RewriteRule ^courses/([^/]+)/course-pic.png$ app/courses/$1/course-pic.png [QSA,L]
RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
RewriteRule ^badge/(\d{1,})/user/(\d{1,}) main/badge/issued.php?skill=$1&user=$2 [L]
+ RewriteRule ^main/exercice/(.+)$ main/exercise/$1 [QSA,L]
+ RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
</Directory>
php_value display_errors Off
diff --git a/documentation/installation_guide_fr_FR.html b/documentation/installation_guide_fr_FR.html
index 7e32ea1953..b9fda6ff36 100644
--- a/documentation/installation_guide_fr_FR.html
+++ b/documentation/installation_guide_fr_FR.html
@@ -739,6 +739,8 @@ ou, si vous travaillez avec Apache 2.4, la syntaxe est légèrement différente
RewriteRule ^courses/([^/]+)/course-pic.png$ app/courses/$1/course-pic.png [QSA,L]
RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
RewriteRule "^badge/(\d{1,})/user/(\d{1,})$" main/badge/issued.php?skill=$1&user=$2 [L]
+ RewriteRule ^main/exercice/(.+)$ main/exercise/$1 [QSA,L]
+ RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
</Directory>
Nginx
@@ -777,6 +779,8 @@ Ce sont uniquement les redirections à placer dans un bloc server{}, comme les a
rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last;
+ rewrite ^/main/exercice/(.+)$ /main/exercise/$1 last;
+ rewrite ^/main/newscorm/(.+)$ /main/lp/$1 last;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
diff --git a/documentation/optimization.html b/documentation/optimization.html
index b9cfbc9a77..c4fab30f43 100755
--- a/documentation/optimization.html
+++ b/documentation/optimization.html
@@ -171,9 +171,9 @@ An optional additional caching mechanism you may use is the realpath_cache_size
See the PHP documentation
for more details.
-
+
APC
-If you prefer using APC,
+ If you prefer using APC,
you can use the same kind of trick as above, just changing the code a little:
$xc = function_exists('apc_exists');
@@ -209,6 +209,77 @@ If you prefer using APC,
}
...
+
+
+
APCu
+In PHP 5.5 and above, APC is rendered practically obsolete by the presence of ZendOPCache by default.
+ However, APC does not cover the "user cache", like the caching of specific variables in memory.
+ Considering this, you can APCu to add the same level of variable caching as described above, just changing the code a little:
+ On a local computer, this lead to an increase of RAM consumption and a decrease of 20% of CPU time (for just one user). This has been included in 1.11.x, so this section is only there for historical purposes.
+