diff --git a/CHANGELOG.md b/CHANGELOG.md
index bb4883ab..47f02e75 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,8 @@ v3.4.2 (27/03/2019)
- Fix lỗi không cài đặt được ở 1 số máy ✓
- Fix lỗi không hiện công thức toán khi làm bài ✓
- Rewrite URL ✓
- - Tối ưu lại một số code ✗
+ - Thêm upload ảnh trong nội dung câu hỏi ✓
+ - Tối ưu lại một số code ✓
- Thêm comment cho các hàm phục vụ cho việc bảo trì, nâng cấp ✗
v3.4.1 (17/03/2019)
diff --git a/GUIDE.md b/GUIDE.md
index 34423b6a..4e6d96bb 100755
--- a/GUIDE.md
+++ b/GUIDE.md
@@ -9,6 +9,7 @@
Nếu đã kiểm tra lại và vẫn lỗi, bạn có thể mở file config/connect.php sửa trực tiếp kết nối trong đó,
hoặc liên hệ báo lỗi tới email: dzu6996@gmail.com
+- Sửa URL trang web trong config/config.php
- Sửa tài khoản gửi email quên mật khẩu tại /controllers/controller_login.php dòng 127, 128
- Tài khoản mặc định:
diff --git a/resource/config/config.php b/resource/config/config.php
index 7ec20549..2c7b894a 100755
--- a/resource/config/config.php
+++ b/resource/config/config.php
@@ -16,4 +16,5 @@ class Config
const EMAIL = "dzu6996@gmail.com";
const RELEASE = "27/03/2019";
const TIMEZONE = "Asia/Bangkok";
+ const APP_URL = "http://localhost/";
}
diff --git a/resource/controllers/controller_admin.php b/resource/controllers/controller_admin.php
index 9dda62fc..76d2a818 100755
--- a/resource/controllers/controller_admin.php
+++ b/resource/controllers/controller_admin.php
@@ -6,6 +6,8 @@
* Mail: dzu6996@gmail.com
**/
+require_once('core/Base.php');
+require_once('config/config.php');
require_once('models/model_admin.php');
require_once('views/view_admin.php');
//load thư viện PhpSpreadSheet
@@ -1001,13 +1003,29 @@ public function submit_update_avatar()
$duoi = explode('.', $_FILES['file']['name']);
$duoi = $duoi[(count($duoi)-1)];
if ($duoi === 'jpg' || $duoi === 'png') {
- if (move_uploaded_file($_FILES['file']['tmp_name'], 'res/img/avatar/'.$this->info['username'].'_' . $_FILES['file']['name'])) {
+ if (move_uploaded_file($_FILES['file']['tmp_name'], 'upload/avatar/'.$this->info['username'].'_' . $_FILES['file']['name'])) {
$avatar = $this->info['username'] .'_' . $_FILES['file']['name'];
$update = $this->update_avatar($avatar, $this->info['username']);
}
}
}
}
+ public function uploadImage()
+ {
+ if (isset($_FILES['file'])) {
+ $base = new Base();
+ $res = array();
+ $path = 'upload/question_images/';
+ $upload = $base->uploadImage($_FILES['file'],$path);
+ if($upload != false) {
+ $res['url'] = Config::APP_URL . $path . $upload;
+ $res['stt'] = true;
+ }
+ else
+ $res['stt'] = false;
+ echo json_encode($res);
+ }
+ }
public function delete_check_students()
{
$result = array();
diff --git a/resource/controllers/controller_student.php b/resource/controllers/controller_student.php
index c764212d..0b85f131 100755
--- a/resource/controllers/controller_student.php
+++ b/resource/controllers/controller_student.php
@@ -119,7 +119,7 @@ public function submit_update_avatar()
$duoi = explode('.', $_FILES['file']['name']);
$duoi = $duoi[(count($duoi)-1)];
if ($duoi === 'jpg' || $duoi === 'png') {
- if (move_uploaded_file($_FILES['file']['tmp_name'], 'res/img/avatar/'.$this->info['username'].'_' . $_FILES['file']['name'])) {
+ if (move_uploaded_file($_FILES['file']['tmp_name'], 'upload/avatar/'.$this->info['username'].'_' . $_FILES['file']['name'])) {
$avatar = $this->info['username'] .'_' . $_FILES['file']['name'];
$update = $this->update_avatar($avatar, $this->info['username']);
}
diff --git a/resource/controllers/controller_teacher.php b/resource/controllers/controller_teacher.php
index c477602a..0e181bbf 100755
--- a/resource/controllers/controller_teacher.php
+++ b/resource/controllers/controller_teacher.php
@@ -68,7 +68,7 @@ public function submit_update_avatar()
$duoi = explode('.', $_FILES['file']['name']);
$duoi = $duoi[(count($duoi)-1)];
if ($duoi === 'jpg' || $duoi === 'png') {
- if (move_uploaded_file($_FILES['file']['tmp_name'], 'res/img/avatar/'.$this->info['username'].'_' . $_FILES['file']['name'])) {
+ if (move_uploaded_file($_FILES['file']['tmp_name'], 'upload/avatar/'.$this->info['username'].'_' . $_FILES['file']['name'])) {
$avatar = $this->info['username'] .'_' . $_FILES['file']['name'];
$update = $this->update_avatar($avatar, $this->info['username']);
}
diff --git a/resource/core/Base.php b/resource/core/Base.php
new file mode 100644
index 00000000..5663eef2
--- /dev/null
+++ b/resource/core/Base.php
@@ -0,0 +1,46 @@
+convertString($expl[0]);
+ $hash = md5(time());
+ if ($ext === 'jpg' || $ext === 'png' || $ext === 'jpeg') {
+ $new_name = $hash .'_' . $name . '.' . $ext;
+ if (move_uploaded_file($file['tmp_name'], $path . $new_name)) {
+ return $new_name;
+ } else {
+ return false;
+ }
+ }
+
+ }
+ public function convertString($str) {
+ $str = trim(mb_strtolower($str));
+ $str = preg_replace('/(à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ)/', 'a', $str);
+ $str = preg_replace('/(è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ)/', 'e', $str);
+ $str = preg_replace('/(ì|í|ị|ỉ|ĩ)/', 'i', $str);
+ $str = preg_replace('/(ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ)/', 'o', $str);
+ $str = preg_replace('/(ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ)/', 'u', $str);
+ $str = preg_replace('/(ỳ|ý|ỵ|ỷ|ỹ)/', 'y', $str);
+ $str = preg_replace('/(đ)/', 'd', $str);
+ $str = preg_replace('/[^a-z0-9-\s]/', '', $str);
+ $str = preg_replace('/([\s]+)/', '-', $str);
+ return $str;
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/resource/install.php b/resource/install.php
index 89432c68..691cee83 100755
--- a/resource/install.php
+++ b/resource/install.php
@@ -161,6 +161,7 @@ function step_error()
echo "Tài khoản mặc định: admin
";
echo "Mật khẩu: 123456
";
echo "Vui lòng đăng nhập và đổi mật khẩu ngay sau khi đăng nhập.
";
+ echo "Sửa URL trang web trong config/config.php
";
echo 'Mọi thông tin chi tiết, hỗ trợ, góp ý, báo lỗi,
';
echo"vui lòng liên hệ dzu6996@gmail.com hoặc trực tiếp trang chính thức sản phẩm TẠI ĐÂY
";
diff --git a/resource/res/img/image_btn.png b/resource/res/img/image_btn.png
new file mode 100644
index 00000000..8ea97259
Binary files /dev/null and b/resource/res/img/image_btn.png differ
diff --git a/resource/res/js/add_question.js b/resource/res/js/add_question.js
index 38439205..c0ccf0de 100644
--- a/resource/res/js/add_question.js
+++ b/resource/res/js/add_question.js
@@ -30,6 +30,47 @@ $(function() {
});
});
+function upload_image() {
+ $('#uploading').removeClass('hidden');
+ var file_data = $('#file').prop('files')[0];
+ var type = file_data.type;
+ var size = file_data.size;
+ var match = ["image/png", "image/jpg", "image/jpeg"];
+ if ((type == match[0] && size < 2048000) || (type == match[1] && size < 2048000) || (type == match[2] && size < 2048000)) {
+ var form_data = new FormData();
+ form_data.append('file', file_data);
+ $.ajax({
+ url: 'index.php?action=uploadImage',
+ dataType: 'text',
+ cache: false,
+ contentType: false,
+ processData: false,
+ data: form_data,
+ type: 'post',
+ success: function(result) {
+ var json_data = jQuery.parseJSON(result);
+ if(json_data.stt) {
+ $('#div-url').removeClass('hidden');
+ $('.help').css('color', 'green').text("Thành công");
+ $('#file').val('');
+ $('#url').val(json_data.url);
+ $('#uploading').addClass('hidden');
+ } else {
+ $('#div-url').addClass('hidden');
+ $('.help').css('color', 'red').text("Thất bại");
+ $('#file').val('');
+ $('#url').val('');
+ $('#uploading').addClass('hidden');
+ }
+ }
+ });
+ } else {
+ $('.help').css('color', 'red').text('Chỉ được upload file JPG, PNG nhỏ hơn 2mb');
+ $('#file').val('');
+ $('#uploading').addClass('hidden');
+ }
+}
+
function submit_add_question(data) {
data[0]['value'] = CKEDITOR.instances.question_detail.getData();
data[1]['value'] = CKEDITOR.instances.answer_a.getData();
diff --git a/resource/res/js/admins_panel.js b/resource/res/js/admins_panel.js
index a7d621c3..0e47b354 100755
--- a/resource/res/js/admins_panel.js
+++ b/resource/res/js/admins_panel.js
@@ -89,7 +89,7 @@ function show_list_admins(data) {
var tr = $('
');
tr.append(' | ');
tr.append('' + data[i].admin_id + ' | ');
- tr.append(' | ');
+ tr.append(' | ');
tr.append('' + data[i].name + ' | ');
tr.append('' + data[i].username + ' | ');
tr.append('' + data[i].email + ' | ');
diff --git a/resource/res/js/edit_question.js b/resource/res/js/edit_question.js
index 8fbbcf11..5240647c 100755
--- a/resource/res/js/edit_question.js
+++ b/resource/res/js/edit_question.js
@@ -24,4 +24,45 @@ function submit_edit_question(data) {
$('#preload').addClass('hidden');
};
$.post(url, data, success);
+}
+
+function upload_image() {
+ $('#uploading').removeClass('hidden');
+ var file_data = $('#file').prop('files')[0];
+ var type = file_data.type;
+ var size = file_data.size;
+ var match = ["image/png", "image/jpg", "image/jpeg"];
+ if ((type == match[0] && size < 2048000) || (type == match[1] && size < 2048000) || (type == match[2] && size < 2048000)) {
+ var form_data = new FormData();
+ form_data.append('file', file_data);
+ $.ajax({
+ url: 'index.php?action=uploadImage',
+ dataType: 'text',
+ cache: false,
+ contentType: false,
+ processData: false,
+ data: form_data,
+ type: 'post',
+ success: function(result) {
+ var json_data = jQuery.parseJSON(result);
+ if(json_data.stt) {
+ $('#div-url').removeClass('hidden');
+ $('.help').css('color', 'green').text("Thành công");
+ $('#file').val('');
+ $('#url').val(json_data.url);
+ $('#uploading').addClass('hidden');
+ } else {
+ $('#div-url').addClass('hidden');
+ $('.help').css('color', 'red').text("Thất bại");
+ $('#file').val('');
+ $('#url').val('');
+ $('#uploading').addClass('hidden');
+ }
+ }
+ });
+ } else {
+ $('.help').css('color', 'red').text('Chỉ được upload file JPG, PNG nhỏ hơn 2mb');
+ $('#file').val('');
+ $('#uploading').addClass('hidden');
+ }
}
\ No newline at end of file
diff --git a/resource/res/js/questions_panel.js b/resource/res/js/questions_panel.js
index 61c0f2fb..d2a9f4b8 100644
--- a/resource/res/js/questions_panel.js
+++ b/resource/res/js/questions_panel.js
@@ -20,6 +20,9 @@ $(function() {
var instance = M.Modal.getInstance(elem);
instance.open();
});
+ $("form").on('submit', function(event) {
+ event.preventDefault();
+ });
});
function check_box() {
@@ -167,6 +170,9 @@ function get_list_questions() {
$('.modal').modal();
$('select').select();
$('body').attr('style', 'overflow: auto;');
+ $("form").on('submit', function(event) {
+ event.preventDefault();
+ });
}
function question_edit_button(data) {
@@ -196,4 +202,4 @@ function submit_del_question(data) {
$('#preload').addClass('hidden');
};
$.post(url, data, success);
-}
\ No newline at end of file
+}
diff --git a/resource/res/js/students_panel.js b/resource/res/js/students_panel.js
index 555ab1a4..9c878ca2 100755
--- a/resource/res/js/students_panel.js
+++ b/resource/res/js/students_panel.js
@@ -36,6 +36,9 @@ $(function() {
var instance = M.Modal.getInstance(elem);
instance.open();
});
+ $("form").on('submit', function(event) {
+ event.preventDefault();
+ });
});
function check_box() {
@@ -142,7 +145,7 @@ function get_list_students() {
"targets":2,
"render": function(data)
{
- return '';
+ return '';
}
},
{
@@ -204,6 +207,9 @@ function get_list_students() {
$('.modal').modal();
$('select').select();
$('body').attr('style', 'overflow: auto;');
+ $("form").on('submit', function(event) {
+ event.preventDefault();
+ });
}
function student_edit_button(data) {
diff --git a/resource/res/js/teachers_panel.js b/resource/res/js/teachers_panel.js
index e7a8e310..1e0d8912 100755
--- a/resource/res/js/teachers_panel.js
+++ b/resource/res/js/teachers_panel.js
@@ -89,7 +89,7 @@ function show_list_teachers(data) {
var tr = $('
');
tr.append(' | ');
tr.append('' + data[i].teacher_id + ' | ');
- tr.append(' | ');
+ tr.append(' | ');
tr.append('' + data[i].name + ' | ');
tr.append('' + data[i].username + ' | ');
tr.append('' + data[i].email + ' | ');
diff --git a/resource/res/libs/ckeditor/config.js b/resource/res/libs/ckeditor/config.js
index 89db121a..929bcb37 100644
--- a/resource/res/libs/ckeditor/config.js
+++ b/resource/res/libs/ckeditor/config.js
@@ -57,7 +57,7 @@ CKEDITOR.editorConfig = function(config) {
// The default plugins included in the basic setup define some buttons that
// are not needed in a basic editor. They are removed here.
- config.removeButtons = 'Cut,Copy,Paste,Undo,Redo,Anchor,Underline,Strike,Subscript,Superscript';
+ config.removeButtons = 'Anchor,Link,Unlink';
// Dialog windows are also simplified.
config.removeDialogTabs = 'link:advanced';
@@ -74,6 +74,7 @@ CKEDITOR.editorConfig = function(config) {
config.extraPlugins = 'floatpanel';
config.extraPlugins = 'panel';
config.extraPlugins = 'listblock';
+ config.extraPlugins = 'image';
config.entities_latin = false;
config.basicEntities = false;
config.entities = false;
diff --git a/resource/res/libs/ckeditor/plugins/image/dialogs/image.js b/resource/res/libs/ckeditor/plugins/image/dialogs/image.js
new file mode 100644
index 00000000..8ee58c6c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/dialogs/image.js
@@ -0,0 +1,1257 @@
+/**
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+( function() {
+ var imageDialog = function( editor, dialogType ) {
+ // Load image preview.
+ var IMAGE = 1,
+ LINK = 2,
+ PREVIEW = 4,
+ CLEANUP = 8,
+ regexGetSize = /^\s*(\d+)((px)|\%)?\s*$/i,
+ regexGetSizeOrEmpty = /(^\s*(\d+)((px)|\%)?\s*$)|^$/i,
+ pxLengthRegex = /^\d+px$/;
+
+ var onSizeChange = function() {
+ var value = this.getValue(),
+ // This = input element.
+ dialog = this.getDialog(),
+ aMatch = value.match( regexGetSize ); // Check value
+ if ( aMatch ) {
+ if ( aMatch[ 2 ] == '%' ) // % is allowed - > unlock ratio.
+ switchLockRatio( dialog, false ); // Unlock.
+ value = aMatch[ 1 ];
+ }
+
+ // Only if ratio is locked
+ if ( dialog.lockRatio ) {
+ var oImageOriginal = dialog.originalElement;
+ if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' ) {
+ if ( this.id == 'txtHeight' ) {
+ if ( value && value != '0' )
+ value = Math.round( oImageOriginal.$.width * ( value / oImageOriginal.$.height ) );
+ if ( !isNaN( value ) )
+ dialog.setValueOf( 'info', 'txtWidth', value );
+ }
+ // this.id = txtWidth.
+ else {
+ if ( value && value != '0' )
+ value = Math.round( oImageOriginal.$.height * ( value / oImageOriginal.$.width ) );
+ if ( !isNaN( value ) )
+ dialog.setValueOf( 'info', 'txtHeight', value );
+ }
+ }
+ }
+ updatePreview( dialog );
+ };
+
+ var updatePreview = function( dialog ) {
+ //Don't load before onShow.
+ if ( !dialog.originalElement || !dialog.preview )
+ return 1;
+
+ // Read attributes and update imagePreview;
+ dialog.commitContent( PREVIEW, dialog.preview );
+ return 0;
+ };
+
+ // Custom commit dialog logic, where we're intended to give inline style
+ // field (txtdlgGenStyle) higher priority to avoid overwriting styles contribute
+ // by other fields.
+ function commitContent() {
+ var args = arguments;
+ var inlineStyleField = this.getContentElement( 'advanced', 'txtdlgGenStyle' );
+ inlineStyleField && inlineStyleField.commit.apply( inlineStyleField, args );
+
+ this.foreach( function( widget ) {
+ if ( widget.commit && widget.id != 'txtdlgGenStyle' )
+ widget.commit.apply( widget, args );
+ } );
+ }
+
+ // Avoid recursions.
+ var incommit;
+
+ // Synchronous field values to other impacted fields is required, e.g. border
+ // size change should alter inline-style text as well.
+ function commitInternally( targetFields ) {
+ if ( incommit )
+ return;
+
+ incommit = 1;
+
+ var dialog = this.getDialog(),
+ element = dialog.imageElement;
+ if ( element ) {
+ // Commit this field and broadcast to target fields.
+ this.commit( IMAGE, element );
+
+ targetFields = [].concat( targetFields );
+ var length = targetFields.length,
+ field;
+ for ( var i = 0; i < length; i++ ) {
+ field = dialog.getContentElement.apply( dialog, targetFields[ i ].split( ':' ) );
+ // May cause recursion.
+ field && field.setup( IMAGE, element );
+ }
+ }
+
+ incommit = 0;
+ }
+
+ var switchLockRatio = function( dialog, value ) {
+ if ( !dialog.getContentElement( 'info', 'ratioLock' ) )
+ return null;
+
+ var oImageOriginal = dialog.originalElement;
+
+ // Dialog may already closed. (https://dev.ckeditor.com/ticket/5505)
+ if ( !oImageOriginal )
+ return null;
+
+ // Check image ratio and original image ratio, but respecting user's preference.
+ if ( value == 'check' ) {
+ if ( !dialog.userlockRatio && oImageOriginal.getCustomData( 'isReady' ) == 'true' ) {
+ var width = dialog.getValueOf( 'info', 'txtWidth' ),
+ height = dialog.getValueOf( 'info', 'txtHeight' ),
+ originalRatio = oImageOriginal.$.width / oImageOriginal.$.height,
+ thisRatio = width / height;
+
+ dialog.lockRatio = false; // Default: unlock ratio
+
+ if ( !width && !height ) {
+ dialog.lockRatio = true;
+ } else {
+ // Round ratio to two decimal places so ratio locking will be less precise (#2254).
+ var ratioComparison = Math.round( ( originalRatio / thisRatio ) * 100 ) / 100;
+
+ if ( ratioComparison == 1 ) {
+ dialog.lockRatio = true;
+ }
+ }
+ }
+ } else if ( value !== undefined ) {
+ dialog.lockRatio = value;
+ } else {
+ dialog.userlockRatio = 1;
+ dialog.lockRatio = !dialog.lockRatio;
+ }
+
+ var ratioButton = CKEDITOR.document.getById( btnLockSizesId );
+ if ( dialog.lockRatio )
+ ratioButton.removeClass( 'cke_btn_unlocked' );
+ else
+ ratioButton.addClass( 'cke_btn_unlocked' );
+
+ ratioButton.setAttribute( 'aria-checked', dialog.lockRatio );
+
+ // Ratio button hc presentation - WHITE SQUARE / BLACK SQUARE
+ if ( CKEDITOR.env.hc ) {
+ var icon = ratioButton.getChild( 0 );
+ icon.setHtml( dialog.lockRatio ? CKEDITOR.env.ie ? '\u25A0' : '\u25A3' : CKEDITOR.env.ie ? '\u25A1' : '\u25A2' );
+ }
+
+ return dialog.lockRatio;
+ };
+
+ var resetSize = function( dialog, emptyValues ) {
+ var oImageOriginal = dialog.originalElement,
+ ready = oImageOriginal.getCustomData( 'isReady' ) == 'true';
+
+ if ( ready ) {
+ var widthField = dialog.getContentElement( 'info', 'txtWidth' ),
+ heightField = dialog.getContentElement( 'info', 'txtHeight' ),
+ widthValue, heightValue;
+
+ if ( emptyValues ) {
+ widthValue = 0;
+ heightValue = 0;
+ } else {
+ widthValue = oImageOriginal.$.width;
+ heightValue = oImageOriginal.$.height;
+ }
+
+ widthField && widthField.setValue( widthValue );
+ heightField && heightField.setValue( heightValue );
+ }
+ updatePreview( dialog );
+ };
+
+ var setupDimension = function( type, element ) {
+ if ( type != IMAGE )
+ return;
+
+ function checkDimension( size, defaultValue ) {
+ var aMatch = size.match( regexGetSize );
+ if ( aMatch ) {
+ // % is allowed.
+ if ( aMatch[ 2 ] == '%' ) {
+ aMatch[ 1 ] += '%';
+ switchLockRatio( dialog, false ); // Unlock ratio
+ }
+ return aMatch[ 1 ];
+ }
+ return defaultValue;
+ }
+
+ var dialog = this.getDialog(),
+ value = '',
+ dimension = this.id == 'txtWidth' ? 'width' : 'height',
+ size = element.getAttribute( dimension );
+
+ if ( size )
+ value = checkDimension( size, value );
+ value = checkDimension( element.getStyle( dimension ), value );
+
+ this.setValue( value );
+ };
+
+ var previewPreloader;
+
+ var onImgLoadEvent = function() {
+ // Image is ready.
+ var original = this.originalElement,
+ loader = CKEDITOR.document.getById( imagePreviewLoaderId );
+
+ original.setCustomData( 'isReady', 'true' );
+ original.removeListener( 'load', onImgLoadEvent );
+ original.removeListener( 'error', onImgLoadErrorEvent );
+ original.removeListener( 'abort', onImgLoadErrorEvent );
+
+ // Hide loader.
+ if ( loader )
+ loader.setStyle( 'display', 'none' );
+
+ // New image -> new dimensions
+ if ( !this.dontResetSize ) {
+ resetSize( this, editor.config.image_prefillDimensions === false );
+ }
+
+ if ( this.firstLoad ) {
+ CKEDITOR.tools.setTimeout( function() {
+ switchLockRatio( this, 'check' );
+ }, 0, this );
+ }
+
+ this.firstLoad = false;
+ this.dontResetSize = false;
+
+ // Possible fix for https://dev.ckeditor.com/ticket/12818.
+ updatePreview( this );
+ };
+
+ var onImgLoadErrorEvent = function() {
+ // Error. Image is not loaded.
+ var original = this.originalElement,
+ loader = CKEDITOR.document.getById( imagePreviewLoaderId );
+
+ original.removeListener( 'load', onImgLoadEvent );
+ original.removeListener( 'error', onImgLoadErrorEvent );
+ original.removeListener( 'abort', onImgLoadErrorEvent );
+
+ // Set Error image.
+ var noimage = CKEDITOR.getUrl( CKEDITOR.plugins.get( 'image' ).path + 'images/noimage.png' );
+
+ if ( this.preview )
+ this.preview.setAttribute( 'src', noimage );
+
+ // Hide loader.
+ if ( loader )
+ loader.setStyle( 'display', 'none' );
+
+ switchLockRatio( this, false ); // Unlock.
+ };
+
+ var numbering = function( id ) {
+ return CKEDITOR.tools.getNextId() + '_' + id;
+ },
+ btnLockSizesId = numbering( 'btnLockSizes' ),
+ btnResetSizeId = numbering( 'btnResetSize' ),
+ imagePreviewLoaderId = numbering( 'ImagePreviewLoader' ),
+ previewLinkId = numbering( 'previewLink' ),
+ previewImageId = numbering( 'previewImage' );
+
+ return {
+ title: editor.lang.image[ dialogType == 'image' ? 'title' : 'titleButton' ],
+ minWidth: ( CKEDITOR.skinName || editor.config.skin ) == 'moono-lisa' ? 500 : 420,
+ minHeight: 360,
+ onShow: function() {
+ this.imageElement = false;
+ this.linkElement = false;
+
+ // Default: create a new element.
+ this.imageEditMode = false;
+ this.linkEditMode = false;
+
+ this.lockRatio = true;
+ this.userlockRatio = 0;
+ this.dontResetSize = false;
+ this.firstLoad = true;
+ this.addLink = false;
+
+ var editor = this.getParentEditor(),
+ sel = editor.getSelection(),
+ element = sel && sel.getSelectedElement(),
+ link = element && editor.elementPath( element ).contains( 'a', 1 ),
+ loader = CKEDITOR.document.getById( imagePreviewLoaderId );
+
+ // Hide loader.
+ if ( loader )
+ loader.setStyle( 'display', 'none' );
+
+ // Create the preview before setup the dialog contents.
+ previewPreloader = new CKEDITOR.dom.element( 'img', editor.document );
+ this.preview = CKEDITOR.document.getById( previewImageId );
+
+ // Copy of the image
+ this.originalElement = editor.document.createElement( 'img' );
+ this.originalElement.setAttribute( 'alt', '' );
+ this.originalElement.setCustomData( 'isReady', 'false' );
+
+ if ( link ) {
+ this.linkElement = link;
+ this.linkEditMode = true;
+
+ // If there is an existing link, by default keep it (true).
+ // It will be removed if certain conditions are met and Link tab is enabled. (https://dev.ckeditor.com/ticket/13351)
+ this.addLink = true;
+
+ // Look for Image element.
+ var linkChildren = link.getChildren();
+ if ( linkChildren.count() == 1 ) {
+ var childTag = linkChildren.getItem( 0 );
+
+ if ( childTag.type == CKEDITOR.NODE_ELEMENT ) {
+ if ( childTag.is( 'img' ) || childTag.is( 'input' ) ) {
+ this.imageElement = linkChildren.getItem( 0 );
+ if ( this.imageElement.is( 'img' ) )
+ this.imageEditMode = 'img';
+ else if ( this.imageElement.is( 'input' ) )
+ this.imageEditMode = 'input';
+ }
+ }
+ }
+ // Fill out all fields.
+ if ( dialogType == 'image' )
+ this.setupContent( LINK, link );
+ }
+
+ // Edit given image element instead the one from selection.
+ if ( this.customImageElement ) {
+ this.imageEditMode = 'img';
+ this.imageElement = this.customImageElement;
+ delete this.customImageElement;
+ }
+ else if ( element && element.getName() == 'img' && !element.data( 'cke-realelement' ) ||
+ element && element.getName() == 'input' && element.getAttribute( 'type' ) == 'image' ) {
+ this.imageEditMode = element.getName();
+ this.imageElement = element;
+ }
+
+ if ( this.imageEditMode ) {
+ // Use the original element as a buffer from since we don't want
+ // temporary changes to be committed, e.g. if the dialog is canceled.
+ this.cleanImageElement = this.imageElement;
+ this.imageElement = this.cleanImageElement.clone( true, true );
+
+ // Fill out all fields.
+ this.setupContent( IMAGE, this.imageElement );
+ }
+
+ // Refresh LockRatio button
+ switchLockRatio( this, true );
+
+ // Dont show preview if no URL given.
+ if ( !CKEDITOR.tools.trim( this.getValueOf( 'info', 'txtUrl' ) ) ) {
+ this.preview.removeAttribute( 'src' );
+ this.preview.setStyle( 'display', 'none' );
+ }
+ },
+ onOk: function() {
+ // Edit existing Image.
+ if ( this.imageEditMode ) {
+ var imgTagName = this.imageEditMode;
+
+ // Image dialog and Input element.
+ if ( dialogType == 'image' && imgTagName == 'input' && confirm( editor.lang.image.button2Img ) ) { // jshint ignore:line
+ // Replace INPUT-> IMG
+ imgTagName = 'img';
+ this.imageElement = editor.document.createElement( 'img' );
+ this.imageElement.setAttribute( 'alt', '' );
+ editor.insertElement( this.imageElement );
+ }
+ // ImageButton dialog and Image element.
+ else if ( dialogType != 'image' && imgTagName == 'img' && confirm( editor.lang.image.img2Button ) ) { // jshint ignore:line
+ // Replace IMG -> INPUT
+ imgTagName = 'input';
+ this.imageElement = editor.document.createElement( 'input' );
+ this.imageElement.setAttributes( {
+ type: 'image',
+ alt: ''
+ } );
+ editor.insertElement( this.imageElement );
+ } else {
+ // Restore the original element before all commits.
+ this.imageElement = this.cleanImageElement;
+ delete this.cleanImageElement;
+ }
+ }
+ // Create a new image.
+ else {
+ // Image dialog -> create IMG element.
+ if ( dialogType == 'image' )
+ this.imageElement = editor.document.createElement( 'img' );
+ else {
+ this.imageElement = editor.document.createElement( 'input' );
+ this.imageElement.setAttribute( 'type', 'image' );
+ }
+ this.imageElement.setAttribute( 'alt', '' );
+ }
+
+ // Create a new link.
+ if ( !this.linkEditMode )
+ this.linkElement = editor.document.createElement( 'a' );
+
+ // Set attributes.
+ this.commitContent( IMAGE, this.imageElement );
+ this.commitContent( LINK, this.linkElement );
+
+ // Remove empty style attribute.
+ if ( !this.imageElement.getAttribute( 'style' ) )
+ this.imageElement.removeAttribute( 'style' );
+
+ // Insert a new Image.
+ if ( !this.imageEditMode ) {
+ if ( this.addLink ) {
+ if ( !this.linkEditMode ) {
+ // Insert a new link.
+ editor.insertElement( this.linkElement );
+ this.linkElement.append( this.imageElement, false );
+ } else {
+ // We already have a link in editor.
+ if ( this.linkElement.equals( editor.getSelection().getSelectedElement() ) ) {
+ // If the link is selected outside, replace it's content rather than the link itself. ([foo])
+ this.linkElement.setHtml( '' );
+ this.linkElement.append( this.imageElement, false );
+ } else {
+ // Only inside of the link is selected, so replace it with image. ([foo], [f]oo)
+ editor.insertElement( this.imageElement );
+ }
+ }
+ } else {
+ editor.insertElement( this.imageElement );
+ }
+ }
+ // Image already exists.
+ else {
+ // Add a new link element.
+ if ( !this.linkEditMode && this.addLink ) {
+ editor.insertElement( this.linkElement );
+ this.imageElement.appendTo( this.linkElement );
+ }
+ // Remove Link, Image exists.
+ else if ( this.linkEditMode && !this.addLink ) {
+ editor.getSelection().selectElement( this.linkElement );
+ editor.insertElement( this.imageElement );
+ }
+ }
+ },
+ onLoad: function() {
+ if ( dialogType != 'image' )
+ this.hidePage( 'Link' ); //Hide Link tab.
+ var doc = this._.element.getDocument();
+
+ if ( this.getContentElement( 'info', 'ratioLock' ) ) {
+ this.addFocusable( doc.getById( btnResetSizeId ), 5 );
+ this.addFocusable( doc.getById( btnLockSizesId ), 5 );
+ }
+
+ this.commitContent = commitContent;
+ },
+ onHide: function() {
+ if ( this.preview )
+ this.commitContent( CLEANUP, this.preview );
+
+ if ( this.originalElement ) {
+ this.originalElement.removeListener( 'load', onImgLoadEvent );
+ this.originalElement.removeListener( 'error', onImgLoadErrorEvent );
+ this.originalElement.removeListener( 'abort', onImgLoadErrorEvent );
+ this.originalElement.remove();
+ this.originalElement = false; // Dialog is closed.
+ }
+
+ delete this.imageElement;
+ },
+ contents: [ {
+ id: 'info',
+ label: editor.lang.image.infoTab,
+ accessKey: 'I',
+ elements: [ {
+ type: 'vbox',
+ padding: 0,
+ children: [ {
+ type: 'hbox',
+ widths: [ '280px', '110px' ],
+ align: 'right',
+ className: 'cke_dialog_image_url',
+ children: [ {
+ id: 'txtUrl',
+ type: 'text',
+ label: editor.lang.common.url,
+ required: true,
+ onChange: function() {
+ var dialog = this.getDialog(),
+ newUrl = this.getValue();
+
+ // Update original image.
+ // Prevent from load before onShow.
+ if ( newUrl.length > 0 ) {
+ dialog = this.getDialog();
+ var original = dialog.originalElement;
+
+ if ( dialog.preview ) {
+ dialog.preview.removeStyle( 'display' );
+ }
+
+ original.setCustomData( 'isReady', 'false' );
+ // Show loader.
+ var loader = CKEDITOR.document.getById( imagePreviewLoaderId );
+ if ( loader )
+ loader.setStyle( 'display', '' );
+
+ original.on( 'load', onImgLoadEvent, dialog );
+ original.on( 'error', onImgLoadErrorEvent, dialog );
+ original.on( 'abort', onImgLoadErrorEvent, dialog );
+ original.setAttribute( 'src', newUrl );
+
+ if ( dialog.preview ) {
+ // Query the preloader to figure out the url impacted by based href.
+ previewPreloader.setAttribute( 'src', newUrl );
+ dialog.preview.setAttribute( 'src', previewPreloader.$.src );
+ updatePreview( dialog );
+ }
+ }
+ // Dont show preview if no URL given.
+ else if ( dialog.preview ) {
+ dialog.preview.removeAttribute( 'src' );
+ dialog.preview.setStyle( 'display', 'none' );
+ }
+ },
+ setup: function( type, element ) {
+ if ( type == IMAGE ) {
+ var url = element.data( 'cke-saved-src' ) || element.getAttribute( 'src' );
+ var field = this;
+
+ this.getDialog().dontResetSize = true;
+
+ field.setValue( url ); // And call this.onChange()
+ // Manually set the initial value.(https://dev.ckeditor.com/ticket/4191)
+ field.setInitValue();
+ }
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE && ( this.getValue() || this.isChanged() ) ) {
+ element.data( 'cke-saved-src', this.getValue() );
+ element.setAttribute( 'src', this.getValue() );
+ } else if ( type == CLEANUP ) {
+ element.setAttribute( 'src', '' ); // If removeAttribute doesn't work.
+ element.removeAttribute( 'src' );
+ }
+ },
+ validate: CKEDITOR.dialog.validate.notEmpty( editor.lang.image.urlMissing )
+ },
+ {
+ type: 'button',
+ id: 'browse',
+ // v-align with the 'txtUrl' field.
+ // TODO: We need something better than a fixed size here.
+ style: 'display:inline-block;margin-top:14px;',
+ align: 'center',
+ label: editor.lang.common.browseServer,
+ hidden: true,
+ filebrowser: 'info:txtUrl'
+ } ]
+ } ]
+ },
+ {
+ id: 'txtAlt',
+ type: 'text',
+ label: editor.lang.image.alt,
+ accessKey: 'T',
+ 'default': '',
+ onChange: function() {
+ updatePreview( this.getDialog() );
+ },
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'alt' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'alt', this.getValue() );
+ } else if ( type == PREVIEW )
+ element.setAttribute( 'alt', this.getValue() );
+ else if ( type == CLEANUP ) {
+ element.removeAttribute( 'alt' );
+ }
+
+ }
+ },
+ {
+ type: 'hbox',
+ children: [ {
+ id: 'basic',
+ type: 'vbox',
+ children: [ {
+ type: 'hbox',
+ requiredContent: 'img{width,height}',
+ widths: [ '50%', '50%' ],
+ children: [ {
+ type: 'vbox',
+ padding: 1,
+ children: [ {
+ type: 'text',
+ width: '45px',
+ id: 'txtWidth',
+ label: editor.lang.common.width,
+ onKeyUp: onSizeChange,
+ onChange: function() {
+ commitInternally.call( this, 'advanced:txtdlgGenStyle' );
+ },
+ validate: function() {
+ var aMatch = this.getValue().match( regexGetSizeOrEmpty ),
+ isValid = !!( aMatch && parseInt( aMatch[ 1 ], 10 ) !== 0 );
+ if ( !isValid )
+ alert( editor.lang.common.invalidLength.replace( '%1', editor.lang.common.width ).replace( '%2', 'px, %' ) ); // jshint ignore:line
+ return isValid;
+ },
+ setup: setupDimension,
+ commit: function( type, element ) {
+ var value = this.getValue();
+ if ( type == IMAGE ) {
+ if ( value && editor.activeFilter.check( 'img{width,height}' ) )
+ element.setStyle( 'width', CKEDITOR.tools.cssLength( value ) );
+ else
+ element.removeStyle( 'width' );
+
+ element.removeAttribute( 'width' );
+ } else if ( type == PREVIEW ) {
+ var aMatch = value.match( regexGetSize );
+ if ( !aMatch ) {
+ var oImageOriginal = this.getDialog().originalElement;
+ if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+ element.setStyle( 'width', oImageOriginal.$.width + 'px' );
+ } else {
+ element.setStyle( 'width', CKEDITOR.tools.cssLength( value ) );
+ }
+ } else if ( type == CLEANUP ) {
+ element.removeAttribute( 'width' );
+ element.removeStyle( 'width' );
+ }
+ }
+ },
+ {
+ type: 'text',
+ id: 'txtHeight',
+ width: '45px',
+ label: editor.lang.common.height,
+ onKeyUp: onSizeChange,
+ onChange: function() {
+ commitInternally.call( this, 'advanced:txtdlgGenStyle' );
+ },
+ validate: function() {
+ var aMatch = this.getValue().match( regexGetSizeOrEmpty ),
+ isValid = !!( aMatch && parseInt( aMatch[ 1 ], 10 ) !== 0 );
+ if ( !isValid )
+ alert( editor.lang.common.invalidLength.replace( '%1', editor.lang.common.height ).replace( '%2', 'px, %' ) ); // jshint ignore:line
+ return isValid;
+ },
+ setup: setupDimension,
+ commit: function( type, element ) {
+ var value = this.getValue();
+ if ( type == IMAGE ) {
+ if ( value && editor.activeFilter.check( 'img{width,height}' ) )
+ element.setStyle( 'height', CKEDITOR.tools.cssLength( value ) );
+ else
+ element.removeStyle( 'height' );
+
+ element.removeAttribute( 'height' );
+ } else if ( type == PREVIEW ) {
+ var aMatch = value.match( regexGetSize );
+ if ( !aMatch ) {
+ var oImageOriginal = this.getDialog().originalElement;
+ if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+ element.setStyle( 'height', oImageOriginal.$.height + 'px' );
+ } else {
+ element.setStyle( 'height', CKEDITOR.tools.cssLength( value ) );
+ }
+ } else if ( type == CLEANUP ) {
+ element.removeAttribute( 'height' );
+ element.removeStyle( 'height' );
+ }
+ }
+ } ]
+ },
+ {
+ id: 'ratioLock',
+ type: 'html',
+ className: 'cke_dialog_image_ratiolock',
+ style: 'margin-top:30px;width:40px;height:40px;',
+ onLoad: function() {
+ // Activate Reset button
+ var resetButton = CKEDITOR.document.getById( btnResetSizeId ),
+ ratioButton = CKEDITOR.document.getById( btnLockSizesId );
+ if ( resetButton ) {
+ resetButton.on( 'click', function( evt ) {
+ resetSize( this );
+ evt.data && evt.data.preventDefault();
+ }, this.getDialog() );
+ resetButton.on( 'mouseover', function() {
+ this.addClass( 'cke_btn_over' );
+ }, resetButton );
+ resetButton.on( 'mouseout', function() {
+ this.removeClass( 'cke_btn_over' );
+ }, resetButton );
+ }
+ // Activate (Un)LockRatio button
+ if ( ratioButton ) {
+ ratioButton.on( 'click', function( evt ) {
+ switchLockRatio( this );
+
+ var oImageOriginal = this.originalElement,
+ width = this.getValueOf( 'info', 'txtWidth' );
+
+ if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' && width ) {
+ var height = oImageOriginal.$.height / oImageOriginal.$.width * width;
+ if ( !isNaN( height ) ) {
+ this.setValueOf( 'info', 'txtHeight', Math.round( height ) );
+ updatePreview( this );
+ }
+ }
+ evt.data && evt.data.preventDefault();
+ }, this.getDialog() );
+ ratioButton.on( 'mouseover', function() {
+ this.addClass( 'cke_btn_over' );
+ }, ratioButton );
+ ratioButton.on( 'mouseout', function() {
+ this.removeClass( 'cke_btn_over' );
+ }, ratioButton );
+ }
+ },
+ html: ''
+ } ]
+ },
+ {
+ type: 'vbox',
+ padding: 1,
+ children: [ {
+ type: 'text',
+ id: 'txtBorder',
+ requiredContent: 'img{border-width}',
+ width: '60px',
+ label: editor.lang.image.border,
+ 'default': '',
+ onKeyUp: function() {
+ updatePreview( this.getDialog() );
+ },
+ onChange: function() {
+ commitInternally.call( this, 'advanced:txtdlgGenStyle' );
+ },
+ validate: CKEDITOR.dialog.validate.integer( editor.lang.image.validateBorder ),
+ setup: function( type, element ) {
+ if ( type == IMAGE ) {
+ var value,
+ borderStyle = element.getStyle( 'border-width' );
+ borderStyle = borderStyle && borderStyle.match( /^(\d+px)(?: \1 \1 \1)?$/ );
+ value = borderStyle && parseInt( borderStyle[ 1 ], 10 );
+ isNaN( parseInt( value, 10 ) ) && ( value = element.getAttribute( 'border' ) );
+ this.setValue( value );
+ }
+ },
+ commit: function( type, element ) {
+ var value = parseInt( this.getValue(), 10 );
+ if ( type == IMAGE || type == PREVIEW ) {
+ if ( !isNaN( value ) ) {
+ element.setStyle( 'border-width', CKEDITOR.tools.cssLength( value ) );
+ element.setStyle( 'border-style', 'solid' );
+ } else if ( !value && this.isChanged() ) {
+ element.removeStyle( 'border' );
+ }
+
+ if ( type == IMAGE )
+ element.removeAttribute( 'border' );
+ } else if ( type == CLEANUP ) {
+ element.removeAttribute( 'border' );
+ element.removeStyle( 'border-width' );
+ element.removeStyle( 'border-style' );
+ element.removeStyle( 'border-color' );
+ }
+ }
+ },
+ {
+ type: 'text',
+ id: 'txtHSpace',
+ requiredContent: 'img{margin-left,margin-right}',
+ width: '60px',
+ label: editor.lang.image.hSpace,
+ 'default': '',
+ onKeyUp: function() {
+ updatePreview( this.getDialog() );
+ },
+ onChange: function() {
+ commitInternally.call( this, 'advanced:txtdlgGenStyle' );
+ },
+ validate: CKEDITOR.dialog.validate.integer( editor.lang.image.validateHSpace ),
+ setup: function( type, element ) {
+ if ( type == IMAGE ) {
+ var value, marginLeftPx, marginRightPx,
+ marginLeftStyle = element.getStyle( 'margin-left' ),
+ marginRightStyle = element.getStyle( 'margin-right' );
+
+ marginLeftStyle = marginLeftStyle && marginLeftStyle.match( pxLengthRegex );
+ marginRightStyle = marginRightStyle && marginRightStyle.match( pxLengthRegex );
+ marginLeftPx = parseInt( marginLeftStyle, 10 );
+ marginRightPx = parseInt( marginRightStyle, 10 );
+
+ value = ( marginLeftPx == marginRightPx ) && marginLeftPx;
+ isNaN( parseInt( value, 10 ) ) && ( value = element.getAttribute( 'hspace' ) );
+
+ this.setValue( value );
+ }
+ },
+ commit: function( type, element ) {
+ var value = parseInt( this.getValue(), 10 );
+ if ( type == IMAGE || type == PREVIEW ) {
+ if ( !isNaN( value ) ) {
+ element.setStyle( 'margin-left', CKEDITOR.tools.cssLength( value ) );
+ element.setStyle( 'margin-right', CKEDITOR.tools.cssLength( value ) );
+ } else if ( !value && this.isChanged() ) {
+ element.removeStyle( 'margin-left' );
+ element.removeStyle( 'margin-right' );
+ }
+
+ if ( type == IMAGE )
+ element.removeAttribute( 'hspace' );
+ } else if ( type == CLEANUP ) {
+ element.removeAttribute( 'hspace' );
+ element.removeStyle( 'margin-left' );
+ element.removeStyle( 'margin-right' );
+ }
+ }
+ },
+ {
+ type: 'text',
+ id: 'txtVSpace',
+ requiredContent: 'img{margin-top,margin-bottom}',
+ width: '60px',
+ label: editor.lang.image.vSpace,
+ 'default': '',
+ onKeyUp: function() {
+ updatePreview( this.getDialog() );
+ },
+ onChange: function() {
+ commitInternally.call( this, 'advanced:txtdlgGenStyle' );
+ },
+ validate: CKEDITOR.dialog.validate.integer( editor.lang.image.validateVSpace ),
+ setup: function( type, element ) {
+ if ( type == IMAGE ) {
+ var value, marginTopPx, marginBottomPx,
+ marginTopStyle = element.getStyle( 'margin-top' ),
+ marginBottomStyle = element.getStyle( 'margin-bottom' );
+
+ marginTopStyle = marginTopStyle && marginTopStyle.match( pxLengthRegex );
+ marginBottomStyle = marginBottomStyle && marginBottomStyle.match( pxLengthRegex );
+ marginTopPx = parseInt( marginTopStyle, 10 );
+ marginBottomPx = parseInt( marginBottomStyle, 10 );
+
+ value = ( marginTopPx == marginBottomPx ) && marginTopPx;
+ isNaN( parseInt( value, 10 ) ) && ( value = element.getAttribute( 'vspace' ) );
+ this.setValue( value );
+ }
+ },
+ commit: function( type, element ) {
+ var value = parseInt( this.getValue(), 10 );
+ if ( type == IMAGE || type == PREVIEW ) {
+ if ( !isNaN( value ) ) {
+ element.setStyle( 'margin-top', CKEDITOR.tools.cssLength( value ) );
+ element.setStyle( 'margin-bottom', CKEDITOR.tools.cssLength( value ) );
+ } else if ( !value && this.isChanged() ) {
+ element.removeStyle( 'margin-top' );
+ element.removeStyle( 'margin-bottom' );
+ }
+
+ if ( type == IMAGE )
+ element.removeAttribute( 'vspace' );
+ } else if ( type == CLEANUP ) {
+ element.removeAttribute( 'vspace' );
+ element.removeStyle( 'margin-top' );
+ element.removeStyle( 'margin-bottom' );
+ }
+ }
+ },
+ {
+ id: 'cmbAlign',
+ requiredContent: 'img{float}',
+ type: 'select',
+ widths: [ '35%', '65%' ],
+ style: 'width:90px',
+ label: editor.lang.common.align,
+ 'default': '',
+ items: [
+ [ editor.lang.common.notSet, '' ],
+ [ editor.lang.common.left, 'left' ],
+ [ editor.lang.common.right, 'right' ]
+ // Backward compatible with v2 on setup when specified as attribute value,
+ // while these values are no more available as select options.
+ // [ editor.lang.image.alignAbsBottom , 'absBottom'],
+ // [ editor.lang.image.alignAbsMiddle , 'absMiddle'],
+ // [ editor.lang.image.alignBaseline , 'baseline'],
+ // [ editor.lang.image.alignTextTop , 'text-top'],
+ // [ editor.lang.image.alignBottom , 'bottom'],
+ // [ editor.lang.image.alignMiddle , 'middle'],
+ // [ editor.lang.image.alignTop , 'top']
+ ],
+ onChange: function() {
+ updatePreview( this.getDialog() );
+ commitInternally.call( this, 'advanced:txtdlgGenStyle' );
+ },
+ setup: function( type, element ) {
+ if ( type == IMAGE ) {
+ var value = element.getStyle( 'float' );
+ switch ( value ) {
+ // Ignore those unrelated values.
+ case 'inherit':
+ case 'none':
+ value = '';
+ }
+
+ !value && ( value = ( element.getAttribute( 'align' ) || '' ).toLowerCase() );
+ this.setValue( value );
+ }
+ },
+ commit: function( type, element ) {
+ var value = this.getValue();
+ if ( type == IMAGE || type == PREVIEW ) {
+ if ( value )
+ element.setStyle( 'float', value );
+ else
+ element.removeStyle( 'float' );
+
+ if ( type == IMAGE ) {
+ value = ( element.getAttribute( 'align' ) || '' ).toLowerCase();
+ switch ( value ) {
+ // we should remove it only if it matches "left" or "right",
+ // otherwise leave it intact.
+ case 'left':
+ case 'right':
+ element.removeAttribute( 'align' );
+ }
+ }
+ } else if ( type == CLEANUP ) {
+ element.removeStyle( 'float' );
+ }
+ }
+ } ]
+ } ]
+ },
+ {
+ type: 'vbox',
+ height: '250px',
+ children: [ {
+ type: 'html',
+ id: 'htmlPreview',
+ style: 'width:95%;',
+ html: '' + CKEDITOR.tools.htmlEncode( editor.lang.common.preview ) + '
' +
+ '
' +
+ '
' +
+ '' +
+ '' +
+ // jscs:disable maximumLineLength
+ ( editor.config.image_previewText || '' ) +
+ // jscs:enable maximumLineLength
+ ' |
'
+ } ]
+ } ]
+ } ]
+ },
+ {
+ id: 'Link',
+ requiredContent: 'a[href]',
+ label: editor.lang.image.linkTab,
+ padding: 0,
+ elements: [ {
+ id: 'txtUrl',
+ type: 'text',
+ label: editor.lang.common.url,
+ style: 'width: 100%',
+ 'default': '',
+ setup: function( type, element ) {
+ if ( type == LINK ) {
+ var href = element.data( 'cke-saved-href' );
+ if ( !href )
+ href = element.getAttribute( 'href' );
+ this.setValue( href );
+ }
+ },
+ commit: function( type, element ) {
+ if ( type == LINK ) {
+ if ( this.getValue() || this.isChanged() ) {
+ var url = this.getValue();
+ element.data( 'cke-saved-href', url );
+ element.setAttribute( 'href', url );
+
+ if ( this.getValue() || !editor.config.image_removeLinkByEmptyURL )
+ this.getDialog().addLink = true;
+ else
+ this.getDialog().addLink = false;
+ }
+ }
+ }
+ },
+ {
+ type: 'button',
+ id: 'browse',
+ className: 'cke_dialog_image_browse',
+ filebrowser: {
+ action: 'Browse',
+ target: 'Link:txtUrl',
+ url: editor.config.filebrowserImageBrowseLinkUrl
+ },
+ style: 'float:right',
+ hidden: true,
+ label: editor.lang.common.browseServer
+ },
+ {
+ id: 'cmbTarget',
+ type: 'select',
+ requiredContent: 'a[target]',
+ label: editor.lang.common.target,
+ 'default': '',
+ items: [
+ [ editor.lang.common.notSet, '' ],
+ [ editor.lang.common.targetNew, '_blank' ],
+ [ editor.lang.common.targetTop, '_top' ],
+ [ editor.lang.common.targetSelf, '_self' ],
+ [ editor.lang.common.targetParent, '_parent' ]
+ ],
+ setup: function( type, element ) {
+ if ( type == LINK )
+ this.setValue( element.getAttribute( 'target' ) || '' );
+ },
+ commit: function( type, element ) {
+ if ( type == LINK ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'target', this.getValue() );
+ }
+ }
+ } ]
+ },
+ {
+ id: 'Upload',
+ hidden: true,
+ filebrowser: 'uploadButton',
+ label: editor.lang.image.upload,
+ elements: [ {
+ type: 'file',
+ id: 'upload',
+ label: editor.lang.image.btnUpload,
+ style: 'height:40px',
+ size: 38
+ },
+ {
+ type: 'fileButton',
+ id: 'uploadButton',
+ filebrowser: 'info:txtUrl',
+ label: editor.lang.image.btnUpload,
+ 'for': [ 'Upload', 'upload' ]
+ } ]
+ },
+ {
+ id: 'advanced',
+ label: editor.lang.common.advancedTab,
+ elements: [ {
+ type: 'hbox',
+ widths: [ '50%', '25%', '25%' ],
+ children: [ {
+ type: 'text',
+ id: 'linkId',
+ requiredContent: 'img[id]',
+ label: editor.lang.common.id,
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'id' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'id', this.getValue() );
+ }
+ }
+ },
+ {
+ id: 'cmbLangDir',
+ type: 'select',
+ requiredContent: 'img[dir]',
+ style: 'width : 100px;',
+ label: editor.lang.common.langDir,
+ 'default': '',
+ items: [
+ [ editor.lang.common.notSet, '' ],
+ [ editor.lang.common.langDirLtr, 'ltr' ],
+ [ editor.lang.common.langDirRtl, 'rtl' ]
+ ],
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'dir' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'dir', this.getValue() );
+ }
+ }
+ },
+ {
+ type: 'text',
+ id: 'txtLangCode',
+ requiredContent: 'img[lang]',
+ label: editor.lang.common.langCode,
+ 'default': '',
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'lang' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'lang', this.getValue() );
+ }
+ }
+ } ]
+ },
+ {
+ type: 'text',
+ id: 'txtGenLongDescr',
+ requiredContent: 'img[longdesc]',
+ label: editor.lang.common.longDescr,
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'longDesc' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'longDesc', this.getValue() );
+ }
+ }
+ },
+ {
+ type: 'hbox',
+ widths: [ '50%', '50%' ],
+ children: [ {
+ type: 'text',
+ id: 'txtGenClass',
+ requiredContent: 'img(cke-xyz)', // Random text like 'xyz' will check if all are allowed.
+ label: editor.lang.common.cssClass,
+ 'default': '',
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'class' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'class', this.getValue() );
+ }
+ }
+ },
+ {
+ type: 'text',
+ id: 'txtGenTitle',
+ requiredContent: 'img[title]',
+ label: editor.lang.common.advisoryTitle,
+ 'default': '',
+ onChange: function() {
+ updatePreview( this.getDialog() );
+ },
+ setup: function( type, element ) {
+ if ( type == IMAGE )
+ this.setValue( element.getAttribute( 'title' ) );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE ) {
+ if ( this.getValue() || this.isChanged() )
+ element.setAttribute( 'title', this.getValue() );
+ } else if ( type == PREVIEW )
+ element.setAttribute( 'title', this.getValue() );
+ else if ( type == CLEANUP ) {
+ element.removeAttribute( 'title' );
+ }
+ }
+ } ]
+ },
+ {
+ type: 'text',
+ id: 'txtdlgGenStyle',
+ requiredContent: 'img{cke-xyz}', // Random text like 'xyz' will check if all are allowed.
+ label: editor.lang.common.cssStyle,
+ validate: CKEDITOR.dialog.validate.inlineStyle( editor.lang.common.invalidInlineStyle ),
+ 'default': '',
+ setup: function( type, element ) {
+ if ( type == IMAGE ) {
+ var genStyle = element.getAttribute( 'style' );
+ if ( !genStyle && element.$.style.cssText )
+ genStyle = element.$.style.cssText;
+ this.setValue( genStyle );
+
+ var height = element.$.style.height,
+ width = element.$.style.width,
+ aMatchH = ( height ? height : '' ).match( regexGetSize ),
+ aMatchW = ( width ? width : '' ).match( regexGetSize );
+
+ this.attributesInStyle = {
+ height: !!aMatchH,
+ width: !!aMatchW
+ };
+ }
+ },
+ onChange: function() {
+ commitInternally.call(
+ this, [
+ 'info:cmbFloat',
+ 'info:cmbAlign',
+ 'info:txtVSpace',
+ 'info:txtHSpace',
+ 'info:txtBorder',
+ 'info:txtWidth',
+ 'info:txtHeight'
+ ]
+ );
+ updatePreview( this );
+ },
+ commit: function( type, element ) {
+ if ( type == IMAGE && ( this.getValue() || this.isChanged() ) )
+ element.setAttribute( 'style', this.getValue() );
+
+ }
+ } ]
+ } ]
+ };
+ };
+
+ CKEDITOR.dialog.add( 'image', function( editor ) {
+ return imageDialog( editor, 'image' );
+ } );
+
+ CKEDITOR.dialog.add( 'imagebutton', function( editor ) {
+ return imageDialog( editor, 'imagebutton' );
+ } );
+} )();
diff --git a/resource/res/libs/ckeditor/plugins/image/icons/hidpi/image.png b/resource/res/libs/ckeditor/plugins/image/icons/hidpi/image.png
new file mode 100644
index 00000000..d0f21aee
Binary files /dev/null and b/resource/res/libs/ckeditor/plugins/image/icons/hidpi/image.png differ
diff --git a/resource/res/libs/ckeditor/plugins/image/icons/image.png b/resource/res/libs/ckeditor/plugins/image/icons/image.png
new file mode 100644
index 00000000..8ea97259
Binary files /dev/null and b/resource/res/libs/ckeditor/plugins/image/icons/image.png differ
diff --git a/resource/res/libs/ckeditor/plugins/image/images/noimage.png b/resource/res/libs/ckeditor/plugins/image/images/noimage.png
new file mode 100644
index 00000000..74c6ee92
Binary files /dev/null and b/resource/res/libs/ckeditor/plugins/image/images/noimage.png differ
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/af.js b/resource/res/libs/ckeditor/plugins/image/lang/af.js
new file mode 100644
index 00000000..9fcef752
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/af.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'af', {
+ alt: 'Alternatiewe teks',
+ border: 'Rand',
+ btnUpload: 'Stuur na bediener',
+ button2Img: 'Wil u die geselekteerde afbeeldingsknop vervang met \'n eenvoudige afbeelding?',
+ hSpace: 'HSpasie',
+ img2Button: 'Wil u die geselekteerde afbeelding vervang met \'n afbeeldingsknop?',
+ infoTab: 'Afbeelding informasie',
+ linkTab: 'Skakel',
+ lockRatio: 'Vaste proporsie',
+ menu: 'Afbeelding eienskappe',
+ resetSize: 'Herstel grootte',
+ title: 'Afbeelding eienskappe',
+ titleButton: 'Afbeeldingsknop eienskappe',
+ upload: 'Oplaai',
+ urlMissing: 'Die URL na die afbeelding ontbreek.',
+ vSpace: 'VSpasie',
+ validateBorder: 'Rand moet \'n heelgetal wees.',
+ validateHSpace: 'HSpasie moet \'n heelgetal wees.',
+ validateVSpace: 'VSpasie moet \'n heelgetal wees.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ar.js b/resource/res/libs/ckeditor/plugins/image/lang/ar.js
new file mode 100644
index 00000000..4fd571cf
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ar.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ar', {
+ alt: 'عنوان الصورة',
+ border: 'سمك الحدود',
+ btnUpload: 'أرسلها للخادم',
+ button2Img: 'هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟',
+ hSpace: 'تباعد أفقي',
+ img2Button: 'هل تريد تحويل الصورة المختارة إلى زر صورة؟',
+ infoTab: 'معلومات الصورة',
+ linkTab: 'الرابط',
+ lockRatio: 'تناسق الحجم',
+ menu: 'خصائص الصورة',
+ resetSize: 'إستعادة الحجم الأصلي',
+ title: 'خصائص الصورة',
+ titleButton: 'خصائص زر الصورة',
+ upload: 'رفع',
+ urlMissing: 'عنوان مصدر الصورة مفقود',
+ vSpace: 'تباعد عمودي',
+ validateBorder: 'الإطار يجب أن يكون عددا',
+ validateHSpace: 'HSpace يجب أن يكون عدداً.',
+ validateVSpace: 'VSpace يجب أن يكون عدداً.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/az.js b/resource/res/libs/ckeditor/plugins/image/lang/az.js
new file mode 100644
index 00000000..adea9d81
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/az.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'az', {
+ alt: 'Alternativ mətn',
+ border: 'Sərhəd',
+ btnUpload: 'Serverə yüklə',
+ button2Img: 'Şəkil tipli düyməni şəklə çevirmək istədiyinizə əminsinizmi?',
+ hSpace: 'Üfüqi boşluq',
+ img2Button: 'Şəkli şəkil tipli düyməyə çevirmək istədiyinizə əminsinizmi?',
+ infoTab: 'Şəkil haqqında məlumat',
+ linkTab: 'Link',
+ lockRatio: 'Ölçülərin uyğunluğu saxla',
+ menu: 'Şəklin seçimləri',
+ resetSize: 'Ölçüləri qaytar',
+ title: 'Şəklin seçimləri',
+ titleButton: 'Şəkil tipli düyməsinin seçimləri',
+ upload: 'Serverə yüklə',
+ urlMissing: 'Şəklin ünvanı yanlışdır.',
+ vSpace: 'Şaquli boşluq',
+ validateBorder: 'Sərhədin eni rəqəm olmalıdır.',
+ validateHSpace: 'Üfüqi boşluq rəqəm olmalıdır.',
+ validateVSpace: 'Şaquli boşluq rəqəm olmalıdır.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/bg.js b/resource/res/libs/ckeditor/plugins/image/lang/bg.js
new file mode 100644
index 00000000..59160d4f
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/bg.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'bg', {
+ alt: 'Алтернативен текст',
+ border: 'Рамка',
+ btnUpload: 'Изпрати на сървъра',
+ button2Img: 'Искате ли да превърнете избрания бутон за изображение в просто изображение?',
+ hSpace: 'Хоризонтален отстъп',
+ img2Button: 'Искате ли да превърнете избраното изображение в бутон за изображение?',
+ infoTab: 'Изображение',
+ linkTab: 'Връзка',
+ lockRatio: 'Заключване на съотношението',
+ menu: 'Настройки на изображение',
+ resetSize: 'Нулиране на размер',
+ title: 'Настройки на изображение',
+ titleButton: 'Настройки на бутон за изображение',
+ upload: 'Качване',
+ urlMissing: 'URL адресът на изображението липсва.',
+ vSpace: 'Вертикален отстъп',
+ validateBorder: 'Рамката трябва да е цяло число.',
+ validateHSpace: 'Хоризонтален отстъп трябва да е цяло число.',
+ validateVSpace: 'Вертикален отстъп трябва да е цяло число.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/bn.js b/resource/res/libs/ckeditor/plugins/image/lang/bn.js
new file mode 100644
index 00000000..6be47a4e
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/bn.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'bn', {
+ alt: 'বিকল্প টেক্সট',
+ border: 'বর্ডার',
+ btnUpload: 'ইহাকে সার্ভারে প্রেরন কর',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'হরাইজন্টাল স্পেস',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'ছবির তথ্য',
+ linkTab: 'লিংক',
+ lockRatio: 'অনুপাত লক কর',
+ menu: 'ছবির প্রোপার্টি',
+ resetSize: 'সাইজ পূর্বাবস্থায় ফিরিয়ে দাও',
+ title: 'ছবির প্রোপার্টি',
+ titleButton: 'ছবির বাটন সম্বন্ধীয়',
+ upload: 'আপলোড',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'ভার্টিকেল স্পেস',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/bs.js b/resource/res/libs/ckeditor/plugins/image/lang/bs.js
new file mode 100644
index 00000000..2cc32d02
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/bs.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'bs', {
+ alt: 'Tekst na slici',
+ border: 'Okvir',
+ btnUpload: 'Šalji na server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'HSpace',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'Info slike',
+ linkTab: 'Link',
+ lockRatio: 'Zakljuèaj odnos',
+ menu: 'Svojstva slike',
+ resetSize: 'Resetuj dimenzije',
+ title: 'Svojstva slike',
+ titleButton: 'Image Button Properties', // MISSING
+ upload: 'Šalji',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'VSpace',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ca.js b/resource/res/libs/ckeditor/plugins/image/lang/ca.js
new file mode 100644
index 00000000..9ba0df29
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ca.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ca', {
+ alt: 'Text alternatiu',
+ border: 'Vora',
+ btnUpload: 'Envia-la al servidor',
+ button2Img: 'Voleu transformar el botó d\'imatge seleccionat en una simple imatge?',
+ hSpace: 'Espaiat horit.',
+ img2Button: 'Voleu transformar la imatge seleccionada en un botó d\'imatge?',
+ infoTab: 'Informació de la imatge',
+ linkTab: 'Enllaç',
+ lockRatio: 'Bloqueja les proporcions',
+ menu: 'Propietats de la imatge',
+ resetSize: 'Restaura la mida',
+ title: 'Propietats de la imatge',
+ titleButton: 'Propietats del botó d\'imatge',
+ upload: 'Puja',
+ urlMissing: 'Falta la URL de la imatge.',
+ vSpace: 'Espaiat vert.',
+ validateBorder: 'La vora ha de ser un nombre enter.',
+ validateHSpace: 'HSpace ha de ser un nombre enter.',
+ validateVSpace: 'VSpace ha de ser un nombre enter.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/cs.js b/resource/res/libs/ckeditor/plugins/image/lang/cs.js
new file mode 100644
index 00000000..f4215b11
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/cs.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'cs', {
+ alt: 'Alternativní text',
+ border: 'Okraje',
+ btnUpload: 'Odeslat na server',
+ button2Img: 'Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?',
+ hSpace: 'Horizontální mezera',
+ img2Button: 'Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?',
+ infoTab: 'Informace o obrázku',
+ linkTab: 'Odkaz',
+ lockRatio: 'Zámek',
+ menu: 'Vlastnosti obrázku',
+ resetSize: 'Původní velikost',
+ title: 'Vlastnosti obrázku',
+ titleButton: 'Vlastností obrázkového tlačítka',
+ upload: 'Odeslat',
+ urlMissing: 'Zadané URL zdroje obrázku nebylo nalezeno.',
+ vSpace: 'Vertikální mezera',
+ validateBorder: 'Okraj musí být nastaven v celých číslech.',
+ validateHSpace: 'Horizontální mezera musí být nastavena v celých číslech.',
+ validateVSpace: 'Vertikální mezera musí být nastavena v celých číslech.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/cy.js b/resource/res/libs/ckeditor/plugins/image/lang/cy.js
new file mode 100644
index 00000000..84f0a49c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/cy.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'cy', {
+ alt: 'Testun Amgen',
+ border: 'Ymyl',
+ btnUpload: 'Anfon i\'r Gweinydd',
+ button2Img: 'Ydych am drawsffurfio\'r botwm ddelwedd hwn ar ddelwedd syml?',
+ hSpace: 'BwlchLl',
+ img2Button: 'Ydych am drawsffurfio\'r ddelwedd hon ar fotwm delwedd?',
+ infoTab: 'Gwyb Delwedd',
+ linkTab: 'Dolen',
+ lockRatio: 'Cloi Cymhareb',
+ menu: 'Priodweddau Delwedd',
+ resetSize: 'Ailosod Maint',
+ title: 'Priodweddau Delwedd',
+ titleButton: 'Priodweddau Botwm Delwedd',
+ upload: 'Lanlwytho',
+ urlMissing: 'URL gwreiddiol y ddelwedd ar goll.',
+ vSpace: 'BwlchF',
+ validateBorder: 'Rhaid i\'r ymyl fod yn gyfanrif.',
+ validateHSpace: 'Rhaid i\'r HSpace fod yn gyfanrif.',
+ validateVSpace: 'Rhaid i\'r VSpace fod yn gyfanrif.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/da.js b/resource/res/libs/ckeditor/plugins/image/lang/da.js
new file mode 100644
index 00000000..2e8193e5
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/da.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'da', {
+ alt: 'Alternativ tekst',
+ border: 'Ramme',
+ btnUpload: 'Upload fil til serveren',
+ button2Img: 'Vil du lave billedknappen om til et almindeligt billede?',
+ hSpace: 'Vandret margen',
+ img2Button: 'Vil du lave billedet om til en billedknap?',
+ infoTab: 'Generelt',
+ linkTab: 'Hyperlink',
+ lockRatio: 'Lås størrelsesforhold',
+ menu: 'Egenskaber for billede',
+ resetSize: 'Nulstil størrelse',
+ title: 'Egenskaber for billede',
+ titleButton: 'Egenskaber for billedknap',
+ upload: 'Upload',
+ urlMissing: 'Kilde på billed-URL mangler',
+ vSpace: 'Lodret margen',
+ validateBorder: 'Kant skal være et helt nummer.',
+ validateHSpace: 'HSpace skal være et helt nummer.',
+ validateVSpace: 'VSpace skal være et helt nummer.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/de-ch.js b/resource/res/libs/ckeditor/plugins/image/lang/de-ch.js
new file mode 100644
index 00000000..34bfd99c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/de-ch.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'de-ch', {
+ alt: 'Alternativer Text',
+ border: 'Rahmen',
+ btnUpload: 'Zum Server senden',
+ button2Img: 'Möchten Sie die ausgewählte Bildschaltfläche in ein einfaches Bild umwandeln?',
+ hSpace: 'Horizontal-Abstand',
+ img2Button: 'Möchten Sie das ausgewählte Bild in eine Bildschaltfläche umwandeln?',
+ infoTab: 'Bildinfo',
+ linkTab: 'Link',
+ lockRatio: 'Grössenverhältnis beibehalten',
+ menu: 'Bildeigenschaften',
+ resetSize: 'Grösse zurücksetzen',
+ title: 'Bildeigenschaften',
+ titleButton: 'Bildschaltflächeneigenschaften',
+ upload: 'Hochladen',
+ urlMissing: 'Bildquellen-URL fehlt.',
+ vSpace: 'Vertikal-Abstand',
+ validateBorder: 'Rahmen muss eine ganze Zahl sein.',
+ validateHSpace: 'Horizontal-Abstand muss eine ganze Zahl sein.',
+ validateVSpace: 'Vertikal-Abstand muss eine ganze Zahl sein.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/de.js b/resource/res/libs/ckeditor/plugins/image/lang/de.js
new file mode 100644
index 00000000..16596757
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/de.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'de', {
+ alt: 'Alternativer Text',
+ border: 'Rahmen',
+ btnUpload: 'Zum Server senden',
+ button2Img: 'Möchten Sie die ausgewählte Bildschaltfläche in ein einfaches Bild umwandeln?',
+ hSpace: 'Horizontal-Abstand',
+ img2Button: 'Möchten Sie das ausgewählte Bild in eine Bildschaltfläche umwandeln?',
+ infoTab: 'Bildinfo',
+ linkTab: 'Link',
+ lockRatio: 'Größenverhältnis beibehalten',
+ menu: 'Bildeigenschaften',
+ resetSize: 'Größe zurücksetzen',
+ title: 'Bildeigenschaften',
+ titleButton: 'Bildschaltflächeneigenschaften',
+ upload: 'Hochladen',
+ urlMissing: 'Bildquellen-URL fehlt.',
+ vSpace: 'Vertikal-Abstand',
+ validateBorder: 'Rahmen muss eine ganze Zahl sein.',
+ validateHSpace: 'Horizontal-Abstand muss eine ganze Zahl sein.',
+ validateVSpace: 'Vertikal-Abstand muss eine ganze Zahl sein.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/el.js b/resource/res/libs/ckeditor/plugins/image/lang/el.js
new file mode 100644
index 00000000..be2e8e97
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/el.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'el', {
+ alt: 'Εναλλακτικό Κείμενο',
+ border: 'Περίγραμμα',
+ btnUpload: 'Αποστολή στον Διακομιστή',
+ button2Img: 'Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;',
+ hSpace: 'HSpace',
+ img2Button: 'Θέλετε να μεταμορφώσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;',
+ infoTab: 'Πληροφορίες Εικόνας',
+ linkTab: 'Σύνδεσμος',
+ lockRatio: 'Κλείδωμα Αναλογίας',
+ menu: 'Ιδιότητες Εικόνας',
+ resetSize: 'Επαναφορά Αρχικού Μεγέθους',
+ title: 'Ιδιότητες Εικόνας',
+ titleButton: 'Ιδιότητες Κουμπιού Εικόνας',
+ upload: 'Αποστολή',
+ urlMissing: 'Το URL πηγής για την εικόνα λείπει.',
+ vSpace: 'VSpace',
+ validateBorder: 'Το περίγραμμα πρέπει να είναι ένας ακέραιος αριθμός.',
+ validateHSpace: 'Το HSpace πρέπει να είναι ένας ακέραιος αριθμός.',
+ validateVSpace: 'Το VSpace πρέπει να είναι ένας ακέραιος αριθμός.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/en-au.js b/resource/res/libs/ckeditor/plugins/image/lang/en-au.js
new file mode 100644
index 00000000..3b66f6b4
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/en-au.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'en-au', {
+ alt: 'Alternative Text',
+ border: 'Border',
+ btnUpload: 'Send it to the Server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?',
+ hSpace: 'HSpace',
+ img2Button: 'Do you want to transform the selected image on a image button?',
+ infoTab: 'Image Info',
+ linkTab: 'Link',
+ lockRatio: 'Lock Ratio',
+ menu: 'Image Properties',
+ resetSize: 'Reset Size',
+ title: 'Image Properties',
+ titleButton: 'Image Button Properties',
+ upload: 'Upload',
+ urlMissing: 'Image source URL is missing.',
+ vSpace: 'VSpace',
+ validateBorder: 'Border must be a whole number.',
+ validateHSpace: 'HSpace must be a whole number.',
+ validateVSpace: 'VSpace must be a whole number.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/en-ca.js b/resource/res/libs/ckeditor/plugins/image/lang/en-ca.js
new file mode 100644
index 00000000..468431e5
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/en-ca.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'en-ca', {
+ alt: 'Alternative Text',
+ border: 'Border',
+ btnUpload: 'Send it to the Server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?',
+ hSpace: 'HSpace',
+ img2Button: 'Do you want to transform the selected image on a image button?',
+ infoTab: 'Image Info',
+ linkTab: 'Link',
+ lockRatio: 'Lock Ratio',
+ menu: 'Image Properties',
+ resetSize: 'Reset Size',
+ title: 'Image Properties',
+ titleButton: 'Image Button Properties',
+ upload: 'Upload',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'VSpace',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/en-gb.js b/resource/res/libs/ckeditor/plugins/image/lang/en-gb.js
new file mode 100644
index 00000000..1a7ce70a
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/en-gb.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'en-gb', {
+ alt: 'Alternative Text',
+ border: 'Border',
+ btnUpload: 'Send it to the Server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?',
+ hSpace: 'HSpace',
+ img2Button: 'Do you want to transform the selected image on a image button?',
+ infoTab: 'Image Info',
+ linkTab: 'Link',
+ lockRatio: 'Lock Ratio',
+ menu: 'Image Properties',
+ resetSize: 'Reset Size',
+ title: 'Image Properties',
+ titleButton: 'Image Button Properties',
+ upload: 'Upload',
+ urlMissing: 'Image source URL is missing.',
+ vSpace: 'VSpace',
+ validateBorder: 'Border must be a whole number.',
+ validateHSpace: 'HSpace must be a whole number.',
+ validateVSpace: 'VSpace must be a whole number.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/en.js b/resource/res/libs/ckeditor/plugins/image/lang/en.js
new file mode 100644
index 00000000..05720556
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/en.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'en', {
+ alt: 'Alternative Text',
+ border: 'Border',
+ btnUpload: 'Send it to the Server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?',
+ hSpace: 'HSpace',
+ img2Button: 'Do you want to transform the selected image on a image button?',
+ infoTab: 'Image Info',
+ linkTab: 'Link',
+ lockRatio: 'Lock Ratio',
+ menu: 'Image Properties',
+ resetSize: 'Reset Size',
+ title: 'Image Properties',
+ titleButton: 'Image Button Properties',
+ upload: 'Upload',
+ urlMissing: 'Image source URL is missing.',
+ vSpace: 'VSpace',
+ validateBorder: 'Border must be a whole number.',
+ validateHSpace: 'HSpace must be a whole number.',
+ validateVSpace: 'VSpace must be a whole number.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/eo.js b/resource/res/libs/ckeditor/plugins/image/lang/eo.js
new file mode 100644
index 00000000..184507c6
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/eo.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'eo', {
+ alt: 'Anstataŭiga Teksto',
+ border: 'Bordero',
+ btnUpload: 'Sendu al Servilo',
+ button2Img: 'Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?',
+ hSpace: 'Horizontala Spaco',
+ img2Button: 'Ĉu vi volas transformi la selektitan bildon en bildbutonon?',
+ infoTab: 'Informoj pri Bildo',
+ linkTab: 'Ligilo',
+ lockRatio: 'Konservi Proporcion',
+ menu: 'Atributoj de Bildo',
+ resetSize: 'Origina Grando',
+ title: 'Atributoj de Bildo',
+ titleButton: 'Bildbutonaj Atributoj',
+ upload: 'Alŝuti',
+ urlMissing: 'La fontretadreso de la bildo mankas.',
+ vSpace: 'Vertikala Spaco',
+ validateBorder: 'La bordero devas esti entjera nombro.',
+ validateHSpace: 'La horizontala spaco devas esti entjera nombro.',
+ validateVSpace: 'La vertikala spaco devas esti entjera nombro.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/es-mx.js b/resource/res/libs/ckeditor/plugins/image/lang/es-mx.js
new file mode 100644
index 00000000..5348fb48
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/es-mx.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'es-mx', {
+ alt: 'Texto alternativo',
+ border: 'Borde',
+ btnUpload: 'Enviar al servidor',
+ button2Img: '¿Desea transformar el botón de imagen seleccionado en una imagen simple?',
+ hSpace: 'Espacio horizontal',
+ img2Button: '¿Desea transformar la imagen seleccionada en un botón de imagen?',
+ infoTab: 'Información de imagen',
+ linkTab: 'Enlace',
+ lockRatio: 'Bloquear aspecto',
+ menu: 'Propiedades de la imagen',
+ resetSize: 'Reiniciar tamaño',
+ title: 'Propiedades de la imagen',
+ titleButton: 'Propiedades del botón de imagen',
+ upload: 'Cargar',
+ urlMissing: 'Falta la URL de origen de la imagen.',
+ vSpace: 'Espacio vertical',
+ validateBorder: 'El borde debe ser un número entero.',
+ validateHSpace: 'El espacio horizontal debe ser un número entero.',
+ validateVSpace: 'El espacio vertical debe ser un número entero.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/es.js b/resource/res/libs/ckeditor/plugins/image/lang/es.js
new file mode 100644
index 00000000..85a15e21
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/es.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'es', {
+ alt: 'Texto Alternativo',
+ border: 'Borde',
+ btnUpload: 'Enviar al Servidor',
+ button2Img: '¿Desea convertir el botón de imagen en una simple imagen?',
+ hSpace: 'Esp.Horiz',
+ img2Button: '¿Desea convertir la imagen en un botón de imagen?',
+ infoTab: 'Información de Imagen',
+ linkTab: 'Vínculo',
+ lockRatio: 'Proporcional',
+ menu: 'Propiedades de Imagen',
+ resetSize: 'Tamaño Original',
+ title: 'Propiedades de Imagen',
+ titleButton: 'Propiedades de Botón de Imagen',
+ upload: 'Cargar',
+ urlMissing: 'Debe indicar la URL de la imagen.',
+ vSpace: 'Esp.Vert',
+ validateBorder: 'El borde debe ser un número.',
+ validateHSpace: 'El espaciado horizontal debe ser un número.',
+ validateVSpace: 'El espaciado vertical debe ser un número.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/et.js b/resource/res/libs/ckeditor/plugins/image/lang/et.js
new file mode 100644
index 00000000..e234cf8d
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/et.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'et', {
+ alt: 'Alternatiivne tekst',
+ border: 'Joon',
+ btnUpload: 'Saada serverisse',
+ button2Img: 'Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?',
+ hSpace: 'H. vaheruum',
+ img2Button: 'Kas tahad teisendada valitud tavalise pildi pildiga nupuks?',
+ infoTab: 'Pildi info',
+ linkTab: 'Link',
+ lockRatio: 'Lukusta kuvasuhe',
+ menu: 'Pildi omadused',
+ resetSize: 'Lähtesta suurus',
+ title: 'Pildi omadused',
+ titleButton: 'Piltnupu omadused',
+ upload: 'Lae üles',
+ urlMissing: 'Pildi lähte-URL on puudu.',
+ vSpace: 'V. vaheruum',
+ validateBorder: 'Äärise laius peab olema täisarv.',
+ validateHSpace: 'Horisontaalne vaheruum peab olema täisarv.',
+ validateVSpace: 'Vertikaalne vaheruum peab olema täisarv.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/eu.js b/resource/res/libs/ckeditor/plugins/image/lang/eu.js
new file mode 100644
index 00000000..99c5130c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/eu.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'eu', {
+ alt: 'Ordezko testua',
+ border: 'Ertza',
+ btnUpload: 'Bidali zerbitzarira',
+ button2Img: 'Hautatutako irudi-botoia irudi arrunt bihurtu nahi duzu?',
+ hSpace: 'HSpace',
+ img2Button: 'Hautatutako irudia irudi-botoi bihurtu nahi duzu?',
+ infoTab: 'Irudiaren informazioa',
+ linkTab: 'Esteka',
+ lockRatio: 'Blokeatu erlazioa',
+ menu: 'Irudiaren propietateak',
+ resetSize: 'Berrezarri tamaina',
+ title: 'Irudiaren propietateak',
+ titleButton: 'Irudi-botoiaren propietateak',
+ upload: 'Kargatu',
+ urlMissing: 'Irudiaren iturburuaren URLa falta da.',
+ vSpace: 'VSpace',
+ validateBorder: 'Ertza zenbaki oso bat izan behar da.',
+ validateHSpace: 'HSpace zenbaki oso bat izan behar da.',
+ validateVSpace: 'VSpace zenbaki oso bat izan behar da.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/fa.js b/resource/res/libs/ckeditor/plugins/image/lang/fa.js
new file mode 100644
index 00000000..53b60dfc
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/fa.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'fa', {
+ alt: 'متن جایگزین',
+ border: 'لبه',
+ btnUpload: 'به سرور بفرست',
+ button2Img: 'آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟',
+ hSpace: 'فاصلهٴ افقی',
+ img2Button: 'آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟',
+ infoTab: 'اطلاعات تصویر',
+ linkTab: 'پیوند',
+ lockRatio: 'قفل کردن نسبت',
+ menu: 'ویژگیهای تصویر',
+ resetSize: 'بازنشانی اندازه',
+ title: 'ویژگیهای تصویر',
+ titleButton: 'ویژگیهای دکمهٴ تصویری',
+ upload: 'انتقال به سرور',
+ urlMissing: 'آدرس URL اصلی تصویر یافت نشد.',
+ vSpace: 'فاصلهٴ عمودی',
+ validateBorder: 'مقدار خطوط باید یک عدد باشد.',
+ validateHSpace: 'مقدار فاصله گذاری افقی باید یک عدد باشد.',
+ validateVSpace: 'مقدار فاصله گذاری عمودی باید یک عدد باشد.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/fi.js b/resource/res/libs/ckeditor/plugins/image/lang/fi.js
new file mode 100644
index 00000000..09a4a824
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/fi.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'fi', {
+ alt: 'Vaihtoehtoinen teksti',
+ border: 'Kehys',
+ btnUpload: 'Lähetä palvelimelle',
+ button2Img: 'Haluatko muuntaa valitun kuvanäppäimen kuvaksi?',
+ hSpace: 'Vaakatila',
+ img2Button: 'Haluatko muuntaa valitun kuvan kuvanäppäimeksi?',
+ infoTab: 'Kuvan tiedot',
+ linkTab: 'Linkki',
+ lockRatio: 'Lukitse suhteet',
+ menu: 'Kuvan ominaisuudet',
+ resetSize: 'Alkuperäinen koko',
+ title: 'Kuvan ominaisuudet',
+ titleButton: 'Kuvapainikkeen ominaisuudet',
+ upload: 'Lisää kuva',
+ urlMissing: 'Kuvan lähdeosoite puuttuu.',
+ vSpace: 'Pystytila',
+ validateBorder: 'Kehyksen täytyy olla kokonaisluku.',
+ validateHSpace: 'HSpace-määrityksen täytyy olla kokonaisluku.',
+ validateVSpace: 'VSpace-määrityksen täytyy olla kokonaisluku.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/fo.js b/resource/res/libs/ckeditor/plugins/image/lang/fo.js
new file mode 100644
index 00000000..68cf7771
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/fo.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'fo', {
+ alt: 'Alternativur tekstur',
+ border: 'Bordi',
+ btnUpload: 'Send til ambætaran',
+ button2Img: 'Skal valdi myndaknøttur gerast til vanliga mynd?',
+ hSpace: 'Høgri breddi',
+ img2Button: 'Skal valda mynd gerast til myndaknøtt?',
+ infoTab: 'Myndaupplýsingar',
+ linkTab: 'Tilknýti',
+ lockRatio: 'Læs lutfallið',
+ menu: 'Myndaeginleikar',
+ resetSize: 'Upprunastødd',
+ title: 'Myndaeginleikar',
+ titleButton: 'Eginleikar fyri myndaknøtt',
+ upload: 'Send',
+ urlMissing: 'URL til mynd manglar.',
+ vSpace: 'Vinstri breddi',
+ validateBorder: 'Bordi má vera eitt heiltal.',
+ validateHSpace: 'HSpace má vera eitt heiltal.',
+ validateVSpace: 'VSpace má vera eitt heiltal.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/fr-ca.js b/resource/res/libs/ckeditor/plugins/image/lang/fr-ca.js
new file mode 100644
index 00000000..a6968962
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/fr-ca.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'fr-ca', {
+ alt: 'Texte alternatif',
+ border: 'Bordure',
+ btnUpload: 'Envoyer sur le serveur',
+ button2Img: 'Désirez-vous transformer l\'image sélectionnée en image simple?',
+ hSpace: 'Espacement horizontal',
+ img2Button: 'Désirez-vous transformer l\'image sélectionnée en bouton image?',
+ infoTab: 'Informations sur l\'image',
+ linkTab: 'Lien',
+ lockRatio: 'Verrouiller les proportions',
+ menu: 'Propriétés de l\'image',
+ resetSize: 'Taille originale',
+ title: 'Propriétés de l\'image',
+ titleButton: 'Propriétés du bouton image',
+ upload: 'Téléverser',
+ urlMissing: 'L\'URL de la source de l\'image est manquant.',
+ vSpace: 'Espacement vertical',
+ validateBorder: 'La bordure doit être un entier.',
+ validateHSpace: 'L\'espacement horizontal doit être un entier.',
+ validateVSpace: 'L\'espacement vertical doit être un entier.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/fr.js b/resource/res/libs/ckeditor/plugins/image/lang/fr.js
new file mode 100644
index 00000000..028cb1f7
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/fr.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'fr', {
+ alt: 'Texte alternatif',
+ border: 'Bordure',
+ btnUpload: 'Envoyer sur le serveur',
+ button2Img: 'Voulez-vous transformer le bouton avec image sélectionné en simple image ?',
+ hSpace: 'Espacement horizontal',
+ img2Button: 'Voulez-vous transformer l\'image sélectionnée en bouton avec image ?',
+ infoTab: 'Informations sur l\'image',
+ linkTab: 'Lien',
+ lockRatio: 'Conserver les proportions',
+ menu: 'Propriétés de l\'image',
+ resetSize: 'Réinitialiser la taille',
+ title: 'Propriétés de l\'image',
+ titleButton: 'Propriétés du bouton avec image',
+ upload: 'Téléverser',
+ urlMissing: 'L\'URL source de l\'image est manquante.',
+ vSpace: 'Espacement vertical',
+ validateBorder: 'La bordure doit être un nombre entier.',
+ validateHSpace: 'L\'espacement horizontal doit être un nombre entier.',
+ validateVSpace: 'L\'espacement vertical doit être un nombre entier.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/gl.js b/resource/res/libs/ckeditor/plugins/image/lang/gl.js
new file mode 100644
index 00000000..1c1e20e9
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/gl.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'gl', {
+ alt: 'Texto alternativo',
+ border: 'Bordo',
+ btnUpload: 'Enviar ao servidor',
+ button2Img: 'Quere converter o botón da imaxe seleccionada nunha imaxe sinxela?',
+ hSpace: 'Esp.Horiz.',
+ img2Button: 'Quere converter a imaxe seleccionada nun botón de imaxe?',
+ infoTab: 'Información da imaxe',
+ linkTab: 'Ligazón',
+ lockRatio: 'Proporcional',
+ menu: 'Propiedades da imaxe',
+ resetSize: 'Tamaño orixinal',
+ title: 'Propiedades da imaxe',
+ titleButton: 'Propiedades do botón de imaxe',
+ upload: 'Cargar',
+ urlMissing: 'Non se atopa o URL da imaxe.',
+ vSpace: 'Esp.Vert.',
+ validateBorder: 'O bordo debe ser un número.',
+ validateHSpace: 'O espazado horizontal debe ser un número.',
+ validateVSpace: 'O espazado vertical debe ser un número.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/gu.js b/resource/res/libs/ckeditor/plugins/image/lang/gu.js
new file mode 100644
index 00000000..f5561939
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/gu.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'gu', {
+ alt: 'ઑલ્ટર્નટ ટેક્સ્ટ',
+ border: 'બોર્ડર',
+ btnUpload: 'આ સર્વરને મોકલવું',
+ button2Img: 'તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.',
+ hSpace: 'સમસ્તરીય જગ્યા',
+ img2Button: 'તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.',
+ infoTab: 'ચિત્ર ની જાણકારી',
+ linkTab: 'લિંક',
+ lockRatio: 'લૉક ગુણોત્તર',
+ menu: 'ચિત્રના ગુણ',
+ resetSize: 'રીસેટ સાઇઝ',
+ title: 'ચિત્રના ગુણ',
+ titleButton: 'ચિત્ર બટનના ગુણ',
+ upload: 'અપલોડ',
+ urlMissing: 'ઈમેજની મૂળ URL છે નહી.',
+ vSpace: 'લંબરૂપ જગ્યા',
+ validateBorder: 'બોર્ડેર આંકડો હોવો જોઈએ.',
+ validateHSpace: 'HSpaceઆંકડો હોવો જોઈએ.',
+ validateVSpace: 'VSpace આંકડો હોવો જોઈએ. '
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/he.js b/resource/res/libs/ckeditor/plugins/image/lang/he.js
new file mode 100644
index 00000000..ec3fbcab
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/he.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'he', {
+ alt: 'טקסט חלופי',
+ border: 'מסגרת',
+ btnUpload: 'שליחה לשרת',
+ button2Img: 'האם להפוך את תמונת הכפתור לתמונה פשוטה?',
+ hSpace: 'מרווח אופקי',
+ img2Button: 'האם להפוך את התמונה לכפתור תמונה?',
+ infoTab: 'מידע על התמונה',
+ linkTab: 'קישור',
+ lockRatio: 'נעילת היחס',
+ menu: 'תכונות התמונה',
+ resetSize: 'איפוס הגודל',
+ title: 'מאפייני התמונה',
+ titleButton: 'מאפיני כפתור תמונה',
+ upload: 'העלאה',
+ urlMissing: 'כתובת התמונה חסרה.',
+ vSpace: 'מרווח אנכי',
+ validateBorder: 'שדה המסגרת חייב להיות מספר שלם.',
+ validateHSpace: 'שדה המרווח האופקי חייב להיות מספר שלם.',
+ validateVSpace: 'שדה המרווח האנכי חייב להיות מספר שלם.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/hi.js b/resource/res/libs/ckeditor/plugins/image/lang/hi.js
new file mode 100644
index 00000000..de28d392
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/hi.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'hi', {
+ alt: 'वैकल्पिक टेक्स्ट',
+ border: 'बॉर्डर',
+ btnUpload: 'इसे सर्वर को भेजें',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'हॉरिज़ॉन्टल स्पेस',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'तस्वीर की जानकारी',
+ linkTab: 'लिंक',
+ lockRatio: 'लॉक अनुपात',
+ menu: 'तस्वीर प्रॉपर्टीज़',
+ resetSize: 'रीसॅट साइज़',
+ title: 'तस्वीर प्रॉपर्टीज़',
+ titleButton: 'तस्वीर बटन प्रॉपर्टीज़',
+ upload: 'अपलोड',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'वर्टिकल स्पेस',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/hr.js b/resource/res/libs/ckeditor/plugins/image/lang/hr.js
new file mode 100644
index 00000000..03f6c949
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/hr.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'hr', {
+ alt: 'Alternativni tekst',
+ border: 'Okvir',
+ btnUpload: 'Pošalji na server',
+ button2Img: 'Želite li promijeniti odabrani gumb u jednostavnu sliku?',
+ hSpace: 'HSpace',
+ img2Button: 'Želite li promijeniti odabranu sliku u gumb?',
+ infoTab: 'Info slike',
+ linkTab: 'Veza',
+ lockRatio: 'Zaključaj odnos',
+ menu: 'Svojstva slika',
+ resetSize: 'Obriši veličinu',
+ title: 'Svojstva slika',
+ titleButton: 'Image Button svojstva',
+ upload: 'Pošalji',
+ urlMissing: 'Nedostaje URL slike.',
+ vSpace: 'VSpace',
+ validateBorder: 'Okvir mora biti cijeli broj.',
+ validateHSpace: 'HSpace mora biti cijeli broj',
+ validateVSpace: 'VSpace mora biti cijeli broj.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/hu.js b/resource/res/libs/ckeditor/plugins/image/lang/hu.js
new file mode 100644
index 00000000..a5da03c3
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/hu.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'hu', {
+ alt: 'Alternatív szöveg',
+ border: 'Keret',
+ btnUpload: 'Küldés a szerverre',
+ button2Img: 'Szeretne a kiválasztott képgombból sima képet csinálni?',
+ hSpace: 'Vízsz. táv',
+ img2Button: 'Szeretne a kiválasztott képből képgombot csinálni?',
+ infoTab: 'Alaptulajdonságok',
+ linkTab: 'Hivatkozás',
+ lockRatio: 'Arány megtartása',
+ menu: 'Kép tulajdonságai',
+ resetSize: 'Eredeti méret',
+ title: 'Kép tulajdonságai',
+ titleButton: 'Képgomb tulajdonságai',
+ upload: 'Feltöltés',
+ urlMissing: 'Hiányzik a kép URL-je.',
+ vSpace: 'Függ. táv',
+ validateBorder: 'A keret méretének egész számot kell beírni!',
+ validateHSpace: 'Vízszintes távolságnak egész számot kell beírni!',
+ validateVSpace: 'Függőleges távolságnak egész számot kell beírni!'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/id.js b/resource/res/libs/ckeditor/plugins/image/lang/id.js
new file mode 100644
index 00000000..fa0d2a8c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/id.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'id', {
+ alt: 'Teks alternatif',
+ border: 'Batas',
+ btnUpload: 'Kirim ke Server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'HSpace', // MISSING
+ img2Button: 'Apakah anda ingin mengubah gambar yang dipilih pada tombol gambar?',
+ infoTab: 'Info Gambar',
+ linkTab: 'Tautan',
+ lockRatio: 'Lock Ratio', // MISSING
+ menu: 'Image Properties', // MISSING
+ resetSize: 'Atur Ulang Ukuran',
+ title: 'Image Properties', // MISSING
+ titleButton: 'Image Button Properties', // MISSING
+ upload: 'Unggah',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'VSpace',
+ validateBorder: 'Border harus berupa angka',
+ validateHSpace: 'HSpace harus berupa angka',
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/is.js b/resource/res/libs/ckeditor/plugins/image/lang/is.js
new file mode 100644
index 00000000..508fafbc
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/is.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'is', {
+ alt: 'Baklægur texti',
+ border: 'Rammi',
+ btnUpload: 'Hlaða upp',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'Vinstri bil',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'Almennt',
+ linkTab: 'Stikla',
+ lockRatio: 'Festa stærðarhlutfall',
+ menu: 'Eigindi myndar',
+ resetSize: 'Reikna stærð',
+ title: 'Eigindi myndar',
+ titleButton: 'Eigindi myndahnapps',
+ upload: 'Hlaða upp',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'Hægri bil',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/it.js b/resource/res/libs/ckeditor/plugins/image/lang/it.js
new file mode 100644
index 00000000..86e3b494
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/it.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'it', {
+ alt: 'Testo alternativo',
+ border: 'Bordo',
+ btnUpload: 'Invia al server',
+ button2Img: 'Vuoi trasformare il bottone immagine selezionato in un\'immagine semplice?',
+ hSpace: 'HSpace',
+ img2Button: 'Vuoi trasferomare l\'immagine selezionata in un bottone immagine?',
+ infoTab: 'Informazioni immagine',
+ linkTab: 'Collegamento',
+ lockRatio: 'Blocca rapporto',
+ menu: 'Proprietà immagine',
+ resetSize: 'Reimposta dimensione',
+ title: 'Proprietà immagine',
+ titleButton: 'Proprietà bottone immagine',
+ upload: 'Carica',
+ urlMissing: 'Manca l\'URL dell\'immagine.',
+ vSpace: 'VSpace',
+ validateBorder: 'Il campo Bordo deve essere un numero intero.',
+ validateHSpace: 'Il campo HSpace deve essere un numero intero.',
+ validateVSpace: 'Il campo VSpace deve essere un numero intero.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ja.js b/resource/res/libs/ckeditor/plugins/image/lang/ja.js
new file mode 100644
index 00000000..7cfbf66e
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ja.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ja', {
+ alt: '代替テキスト',
+ border: '枠線の幅',
+ btnUpload: 'サーバーに送信',
+ button2Img: '選択した画像ボタンを画像に変換しますか?',
+ hSpace: '水平間隔',
+ img2Button: '選択した画像を画像ボタンに変換しますか?',
+ infoTab: '画像情報',
+ linkTab: 'リンク',
+ lockRatio: '比率を固定',
+ menu: '画像のプロパティ',
+ resetSize: 'サイズをリセット',
+ title: '画像のプロパティ',
+ titleButton: '画像ボタンのプロパティ',
+ upload: 'アップロード',
+ urlMissing: '画像のURLを入力してください。',
+ vSpace: '垂直間隔',
+ validateBorder: '枠線の幅は数値で入力してください。',
+ validateHSpace: '水平間隔は数値で入力してください。',
+ validateVSpace: '垂直間隔は数値で入力してください。'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ka.js b/resource/res/libs/ckeditor/plugins/image/lang/ka.js
new file mode 100644
index 00000000..a19b47b4
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ka.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ka', {
+ alt: 'სანაცვლო ტექსტი',
+ border: 'ჩარჩო',
+ btnUpload: 'სერვერისთვის გაგზავნა',
+ button2Img: 'გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?',
+ hSpace: 'ჰორიზონტალური სივრცე',
+ img2Button: 'გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?',
+ infoTab: 'სურათის ინფორმცია',
+ linkTab: 'ბმული',
+ lockRatio: 'პროპორციის შენარჩუნება',
+ menu: 'სურათის პარამეტრები',
+ resetSize: 'ზომის დაბრუნება',
+ title: 'სურათის პარამეტრები',
+ titleButton: 'სურათიანი ღილაკის პარამეტრები',
+ upload: 'ატვირთვა',
+ urlMissing: 'სურათის URL არაა შევსებული.',
+ vSpace: 'ვერტიკალური სივრცე',
+ validateBorder: 'ჩარჩო მთელი რიცხვი უნდა იყოს.',
+ validateHSpace: 'ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.',
+ validateVSpace: 'ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/km.js b/resource/res/libs/ckeditor/plugins/image/lang/km.js
new file mode 100644
index 00000000..42036817
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/km.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'km', {
+ alt: 'អត្ថបទជំនួស',
+ border: 'ស៊ុម',
+ btnUpload: 'ផ្ញើទៅម៉ាស៊ីនបម្រើ',
+ button2Img: 'តើអ្នកចង់ផ្លាស់ប្ដូរប៊ូតុងរូបភាពដែលបានជ្រើស នៅលើរូបភាពធម្មតាមួយមែនទេ?',
+ hSpace: 'គម្លាតផ្ដេក',
+ img2Button: 'តើអ្នកចង់ផ្លាស់ប្ដូររូបភាពដែលបានជ្រើស នៅលើប៊ូតុងរូបភាពមែនទេ?',
+ infoTab: 'ពត៌មានអំពីរូបភាព',
+ linkTab: 'តំណ',
+ lockRatio: 'ចាក់សោផលធៀប',
+ menu: 'លក្ខណៈរូបភាព',
+ resetSize: 'កំណត់ទំហំឡើងវិញ',
+ title: 'លក្ខណៈរូបភាព',
+ titleButton: 'លក្ខណៈប៊ូតុងរូបភាព',
+ upload: 'ផ្ទុកឡើង',
+ urlMissing: 'ខ្វះ URL ប្រភពរូបភាព។',
+ vSpace: 'គម្លាតបញ្ឈរ',
+ validateBorder: 'ស៊ុមត្រូវតែជាលេខ។',
+ validateHSpace: 'គម្លាតផ្ដេកត្រូវតែជាលេខ។',
+ validateVSpace: 'គម្លាតបញ្ឈរត្រូវតែជាលេខ។'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ko.js b/resource/res/libs/ckeditor/plugins/image/lang/ko.js
new file mode 100644
index 00000000..5f937c2e
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ko.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ko', {
+ alt: '대체 문자열',
+ border: '테두리',
+ btnUpload: '서버로 전송',
+ button2Img: '단순 이미지에서 선택한 이미지 버튼을 변환하시겠습니까?',
+ hSpace: '가로 여백',
+ img2Button: '이미지 버튼에 선택한 이미지를 변환하시겠습니까?',
+ infoTab: '이미지 정보',
+ linkTab: '링크',
+ lockRatio: '비율 유지',
+ menu: '이미지 속성',
+ resetSize: '원래 크기로',
+ title: '이미지 속성',
+ titleButton: '이미지 버튼 속성',
+ upload: '업로드',
+ urlMissing: '이미지 원본 주소(URL)가 없습니다.',
+ vSpace: '세로 여백',
+ validateBorder: '테두리 두께는 정수여야 합니다.',
+ validateHSpace: '가로 길이는 정수여야 합니다.',
+ validateVSpace: '세로 길이는 정수여야 합니다.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ku.js b/resource/res/libs/ckeditor/plugins/image/lang/ku.js
new file mode 100644
index 00000000..1d2c099d
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ku.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ku', {
+ alt: 'جێگرەوەی دەق',
+ border: 'پەراوێز',
+ btnUpload: 'ناردنی بۆ ڕاژه',
+ button2Img: 'تۆ دەتەوێت دوگمەی وێنەی دیاریکراو بگۆڕیت بۆ وێنەیەکی ئاسایی؟',
+ hSpace: 'بۆشایی ئاسۆیی',
+ img2Button: 'تۆ دەتەوێت وێنەی دیاریکراو بگۆڕیت بۆ دوگمەی وێنه؟',
+ infoTab: 'زانیاری وێنه',
+ linkTab: 'بەستەر',
+ lockRatio: 'داخستنی ڕێژه',
+ menu: 'خاسیەتی وێنه',
+ resetSize: 'ڕێکخستنەوەی قەباره',
+ title: 'خاسیەتی وێنه',
+ titleButton: 'خاسیەتی دوگمەی وێنه',
+ upload: 'بارکردن',
+ urlMissing: 'سەرچاوەی بەستەری وێنه بزره',
+ vSpace: 'بۆشایی ئەستونی',
+ validateBorder: 'پەراوێز دەبێت بەتەواوی تەنها ژماره بێت.',
+ validateHSpace: 'بۆشایی ئاسۆیی دەبێت بەتەواوی تەنها ژمارە بێت.',
+ validateVSpace: 'بۆشایی ئەستونی دەبێت بەتەواوی تەنها ژماره بێت.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/lt.js b/resource/res/libs/ckeditor/plugins/image/lang/lt.js
new file mode 100644
index 00000000..d7d8f304
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/lt.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'lt', {
+ alt: 'Alternatyvus Tekstas',
+ border: 'Rėmelis',
+ btnUpload: 'Siųsti į serverį',
+ button2Img: 'Ar norite mygtuką paversti paprastu paveiksliuku?',
+ hSpace: 'Hor.Erdvė',
+ img2Button: 'Ar norite paveiksliuką paversti mygtuku?',
+ infoTab: 'Vaizdo informacija',
+ linkTab: 'Nuoroda',
+ lockRatio: 'Išlaikyti proporciją',
+ menu: 'Vaizdo savybės',
+ resetSize: 'Atstatyti dydį',
+ title: 'Vaizdo savybės',
+ titleButton: 'Vaizdinio mygtuko savybės',
+ upload: 'Nusiųsti',
+ urlMissing: 'Paveiksliuko nuorodos nėra.',
+ vSpace: 'Vert.Erdvė',
+ validateBorder: 'Reikšmė turi būti sveikas skaičius.',
+ validateHSpace: 'Reikšmė turi būti sveikas skaičius.',
+ validateVSpace: 'Reikšmė turi būti sveikas skaičius.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/lv.js b/resource/res/libs/ckeditor/plugins/image/lang/lv.js
new file mode 100644
index 00000000..77fd6f5a
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/lv.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'lv', {
+ alt: 'Alternatīvais teksts',
+ border: 'Rāmis',
+ btnUpload: 'Nosūtīt serverim',
+ button2Img: 'Vai vēlaties pārveidot izvēlēto attēla pogu uz attēla?',
+ hSpace: 'Horizontālā telpa',
+ img2Button: 'Vai vēlaties pārveidot izvēlēto attēlu uz attēla pogas?',
+ infoTab: 'Informācija par attēlu',
+ linkTab: 'Hipersaite',
+ lockRatio: 'Nemainīga Augstuma/Platuma attiecība',
+ menu: 'Attēla īpašības',
+ resetSize: 'Atjaunot sākotnējo izmēru',
+ title: 'Attēla īpašības',
+ titleButton: 'Attēlpogas īpašības',
+ upload: 'Augšupielādēt',
+ urlMissing: 'Trūkst attēla atrašanās adrese.',
+ vSpace: 'Vertikālā telpa',
+ validateBorder: 'Apmalei jābūt veselam skaitlim',
+ validateHSpace: 'HSpace jābūt veselam skaitlim',
+ validateVSpace: 'VSpace jābūt veselam skaitlim'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/mk.js b/resource/res/libs/ckeditor/plugins/image/lang/mk.js
new file mode 100644
index 00000000..ebafb5bd
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/mk.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'mk', {
+ alt: 'Алтернативен текст',
+ border: 'Раб',
+ btnUpload: 'Прикачи на сервер',
+ button2Img: 'Дали сакате да направите сликата-копче да биде само слика?',
+ hSpace: 'Хоризонтален простор',
+ img2Button: 'Дали сакате да ја претворите сликата во слика-копче?',
+ infoTab: 'Информации за сликата',
+ linkTab: 'Врска',
+ lockRatio: 'Зачувај пропорција',
+ menu: 'Својства на сликата',
+ resetSize: 'Ресетирај големина',
+ title: 'Својства на сликата',
+ titleButton: 'Својства на копче-сликата',
+ upload: 'Прикачи',
+ urlMissing: 'Недостасува URL-то на сликата.',
+ vSpace: 'Вертикален простор',
+ validateBorder: 'Работ мора да биде цел број.',
+ validateHSpace: 'Хор. простор мора да биде цел број.',
+ validateVSpace: 'Верт. простор мора да биде цел број.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/mn.js b/resource/res/libs/ckeditor/plugins/image/lang/mn.js
new file mode 100644
index 00000000..6122b1f6
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/mn.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'mn', {
+ alt: 'Зургийг орлох бичвэр',
+ border: 'Хүрээ',
+ btnUpload: 'Үүнийг сервэррүү илгээ',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'Хөндлөн зай',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'Зурагны мэдээлэл',
+ linkTab: 'Холбоос',
+ lockRatio: 'Радио түгжих',
+ menu: 'Зураг',
+ resetSize: 'хэмжээ дахин оноох',
+ title: 'Зураг',
+ titleButton: 'Зурган товчны шинж чанар',
+ upload: 'Хуулах',
+ urlMissing: 'Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.',
+ vSpace: 'Босоо зай',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ms.js b/resource/res/libs/ckeditor/plugins/image/lang/ms.js
new file mode 100644
index 00000000..fcf3e29e
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ms.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ms', {
+ alt: 'Text Alternatif',
+ border: 'Border',
+ btnUpload: 'Hantar ke Server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'Ruang Melintang',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'Info Imej',
+ linkTab: 'Sambungan',
+ lockRatio: 'Tetapkan Nisbah',
+ menu: 'Ciri-ciri Imej',
+ resetSize: 'Saiz Set Semula',
+ title: 'Ciri-ciri Imej',
+ titleButton: 'Ciri-ciri Butang Bergambar',
+ upload: 'Muat Naik',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'Ruang Menegak',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/nb.js b/resource/res/libs/ckeditor/plugins/image/lang/nb.js
new file mode 100644
index 00000000..48b0d26c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/nb.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'nb', {
+ alt: 'Alternativ tekst',
+ border: 'Ramme',
+ btnUpload: 'Send det til serveren',
+ button2Img: 'Vil du endre den valgte bildeknappen til et vanlig bilde?',
+ hSpace: 'HMarg',
+ img2Button: 'Vil du endre det valgte bildet til en bildeknapp?',
+ infoTab: 'Bildeinformasjon',
+ linkTab: 'Lenke',
+ lockRatio: 'Lås forhold',
+ menu: 'Bildeegenskaper',
+ resetSize: 'Tilbakestill størrelse',
+ title: 'Bildeegenskaper',
+ titleButton: 'Egenskaper for bildeknapp',
+ upload: 'Last opp',
+ urlMissing: 'Bildets adresse mangler.',
+ vSpace: 'VMarg',
+ validateBorder: 'Ramme må være et heltall.',
+ validateHSpace: 'HMarg må være et heltall.',
+ validateVSpace: 'VMarg må være et heltall.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/nl.js b/resource/res/libs/ckeditor/plugins/image/lang/nl.js
new file mode 100644
index 00000000..734f7c9d
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/nl.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'nl', {
+ alt: 'Alternatieve tekst',
+ border: 'Rand',
+ btnUpload: 'Naar server verzenden',
+ button2Img: 'Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?',
+ hSpace: 'HSpace',
+ img2Button: 'Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?',
+ infoTab: 'Informatie afbeelding',
+ linkTab: 'Link',
+ lockRatio: 'Afmetingen vergrendelen',
+ menu: 'Eigenschappen afbeelding',
+ resetSize: 'Afmetingen resetten',
+ title: 'Eigenschappen afbeelding',
+ titleButton: 'Eigenschappen afbeeldingsknop',
+ upload: 'Upload',
+ urlMissing: 'De URL naar de afbeelding ontbreekt.',
+ vSpace: 'VSpace',
+ validateBorder: 'Rand moet een heel nummer zijn.',
+ validateHSpace: 'HSpace moet een heel nummer zijn.',
+ validateVSpace: 'VSpace moet een heel nummer zijn.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/no.js b/resource/res/libs/ckeditor/plugins/image/lang/no.js
new file mode 100644
index 00000000..637d7bcb
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/no.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'no', {
+ alt: 'Alternativ tekst',
+ border: 'Ramme',
+ btnUpload: 'Send det til serveren',
+ button2Img: 'Vil du endre den valgte bildeknappen til et vanlig bilde?',
+ hSpace: 'HMarg',
+ img2Button: 'Vil du endre det valgte bildet til en bildeknapp?',
+ infoTab: 'Bildeinformasjon',
+ linkTab: 'Lenke',
+ lockRatio: 'Lås forhold',
+ menu: 'Bildeegenskaper',
+ resetSize: 'Tilbakestill størrelse',
+ title: 'Bildeegenskaper',
+ titleButton: 'Egenskaper for bildeknapp',
+ upload: 'Last opp',
+ urlMissing: 'Bildets adresse mangler.',
+ vSpace: 'VMarg',
+ validateBorder: 'Ramme må være et heltall.',
+ validateHSpace: 'HMarg må være et heltall.',
+ validateVSpace: 'VMarg må være et heltall.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/oc.js b/resource/res/libs/ckeditor/plugins/image/lang/oc.js
new file mode 100644
index 00000000..1eca232c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/oc.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'oc', {
+ alt: 'Tèxte alternatiu',
+ border: 'Bordadura',
+ btnUpload: 'Mandar sul servidor',
+ button2Img: 'Volètz transformar lo boton amb imatge seleccionat en imatge simple ?',
+ hSpace: 'Espaçament orizontal',
+ img2Button: 'Volètz transformar l\'imatge seleccionat en boton amb imatge ?',
+ infoTab: 'Informacions sus l\'imatge',
+ linkTab: 'Ligam',
+ lockRatio: 'Conservar las proporcions',
+ menu: 'Proprietats de l\'imatge',
+ resetSize: 'Reïnicializar la talha',
+ title: 'Proprietats de l\'imatge',
+ titleButton: 'Proprietats del boton amb imatge',
+ upload: 'Mandar',
+ urlMissing: 'L\'URL font de l\'imatge es mancanta.',
+ vSpace: 'Espaçament vertical',
+ validateBorder: 'La bordadura deu èsser un nombre entièr.',
+ validateHSpace: 'L\'espaçament orizontal deu èsser un nombre entièr.',
+ validateVSpace: 'L\'espaçament vertical deu èsser un nombre entièr.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/pl.js b/resource/res/libs/ckeditor/plugins/image/lang/pl.js
new file mode 100644
index 00000000..4fbaaef4
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/pl.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'pl', {
+ alt: 'Tekst zastępczy',
+ border: 'Obramowanie',
+ btnUpload: 'Wyślij',
+ button2Img: 'Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?',
+ hSpace: 'Odstęp poziomy',
+ img2Button: 'Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?',
+ infoTab: 'Informacje o obrazku',
+ linkTab: 'Hiperłącze',
+ lockRatio: 'Zablokuj proporcje',
+ menu: 'Właściwości obrazka',
+ resetSize: 'Przywróć rozmiar',
+ title: 'Właściwości obrazka',
+ titleButton: 'Właściwości przycisku graficznego',
+ upload: 'Wyślij',
+ urlMissing: 'Podaj adres URL obrazka.',
+ vSpace: 'Odstęp pionowy',
+ validateBorder: 'Wartość obramowania musi być liczbą całkowitą.',
+ validateHSpace: 'Wartość odstępu poziomego musi być liczbą całkowitą.',
+ validateVSpace: 'Wartość odstępu pionowego musi być liczbą całkowitą.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/pt-br.js b/resource/res/libs/ckeditor/plugins/image/lang/pt-br.js
new file mode 100644
index 00000000..021d8c9c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/pt-br.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'pt-br', {
+ alt: 'Texto Alternativo',
+ border: 'Borda',
+ btnUpload: 'Enviar para o Servidor',
+ button2Img: 'Deseja transformar o botão de imagem em uma imagem comum?',
+ hSpace: 'HSpace',
+ img2Button: 'Deseja transformar a imagem em um botão de imagem?',
+ infoTab: 'Informações da Imagem',
+ linkTab: 'Link',
+ lockRatio: 'Travar Proporções',
+ menu: 'Formatar Imagem',
+ resetSize: 'Redefinir para o Tamanho Original',
+ title: 'Formatar Imagem',
+ titleButton: 'Formatar Botão de Imagem',
+ upload: 'Enviar',
+ urlMissing: 'URL da imagem está faltando.',
+ vSpace: 'VSpace',
+ validateBorder: 'A borda deve ser um número inteiro.',
+ validateHSpace: 'O HSpace deve ser um número inteiro.',
+ validateVSpace: 'O VSpace deve ser um número inteiro.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/pt.js b/resource/res/libs/ckeditor/plugins/image/lang/pt.js
new file mode 100644
index 00000000..d564ccf0
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/pt.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'pt', {
+ alt: 'Texto alternativo',
+ border: 'Limite',
+ btnUpload: 'Enviar para o servidor',
+ button2Img: 'Deseja transformar o botão com imagem selecionado numa imagem simples?',
+ hSpace: 'Esp. Horiz',
+ img2Button: 'Deseja transformar a imagem selecionada num botão com imagem?',
+ infoTab: 'Informação da imagem',
+ linkTab: 'Hiperligação',
+ lockRatio: 'Proporcional',
+ menu: 'Propriedades da Imagem',
+ resetSize: 'Tamanho original',
+ title: 'Propriedades da imagem',
+ titleButton: 'Propriedades do botão de imagem',
+ upload: 'Carregar',
+ urlMissing: 'O URL de origem da imagem está em falta.',
+ vSpace: 'Esp. Vert',
+ validateBorder: 'A borda tem de ser um número inteiro.',
+ validateHSpace: 'HSpace tem de ser um numero.',
+ validateVSpace: 'VSpace tem de ser um numero.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ro.js b/resource/res/libs/ckeditor/plugins/image/lang/ro.js
new file mode 100644
index 00000000..72e569b2
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ro.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ro', {
+ alt: 'Text alternativ',
+ border: 'Margine',
+ btnUpload: 'Trimite la server',
+ button2Img: 'Buton imagine în imagine normală',
+ hSpace: 'HSpace',
+ img2Button: 'Imagine în buton imagine',
+ infoTab: 'Informaţii despre imagine',
+ linkTab: 'Link (Legătură web)',
+ lockRatio: 'Păstrează proporţiile',
+ menu: 'Proprietăţile imaginii',
+ resetSize: 'Resetează mărimea',
+ title: 'Proprietăţile imaginii',
+ titleButton: 'Proprietăţi buton imagine (Image Button)',
+ upload: 'Încarcă',
+ urlMissing: 'Sursa URL a imaginii lipsește.',
+ vSpace: 'VSpace',
+ validateBorder: 'Bordura trebuie să fie număr întreg.',
+ validateHSpace: 'Hspace trebuie să fie număr întreg.',
+ validateVSpace: 'Vspace trebuie să fie număr întreg.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ru.js b/resource/res/libs/ckeditor/plugins/image/lang/ru.js
new file mode 100644
index 00000000..5904b882
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ru.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ru', {
+ alt: 'Альтернативный текст',
+ border: 'Граница',
+ btnUpload: 'Загрузить на сервер',
+ button2Img: 'Вы желаете преобразовать это изображение-кнопку в обычное изображение?',
+ hSpace: 'Гориз. отступ',
+ img2Button: 'Вы желаете преобразовать это обычное изображение в изображение-кнопку?',
+ infoTab: 'Данные об изображении',
+ linkTab: 'Ссылка',
+ lockRatio: 'Сохранять пропорции',
+ menu: 'Свойства изображения',
+ resetSize: 'Вернуть обычные размеры',
+ title: 'Свойства изображения',
+ titleButton: 'Свойства изображения-кнопки',
+ upload: 'Загрузить',
+ urlMissing: 'Не указана ссылка на изображение.',
+ vSpace: 'Вертик. отступ',
+ validateBorder: 'Размер границ должен быть задан числом.',
+ validateHSpace: 'Горизонтальный отступ должен быть задан числом.',
+ validateVSpace: 'Вертикальный отступ должен быть задан числом.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/si.js b/resource/res/libs/ckeditor/plugins/image/lang/si.js
new file mode 100644
index 00000000..9763fb95
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/si.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'si', {
+ alt: 'විකල්ප ',
+ border: 'සීමාවවල ',
+ btnUpload: 'සේවාදායකය වෙත යොමුකිරිම',
+ button2Img: 'ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්යද?',
+ hSpace: 'HSpace',
+ img2Button: 'ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්යද?',
+ infoTab: 'රුපයේ තොරතුරු',
+ linkTab: 'සබැඳිය',
+ lockRatio: 'නවතන අනුපාතය ',
+ menu: 'රුපයේ ගුණ',
+ resetSize: 'නැවතත් විශාලත්වය වෙනස් කිරීම',
+ title: 'රුපයේ ',
+ titleButton: 'රුප බොත්තමේ ගුණ',
+ upload: 'උඩුගතකිරීම',
+ urlMissing: 'රුප මුලාශ්ර URL නැත.',
+ vSpace: 'VSpace',
+ validateBorder: 'මාඉම් සම්පුර්ණ සංක්යාවක් විය යුතුය.',
+ validateHSpace: 'HSpace සම්පුර්ණ සංක්යාවක් විය යුතුය',
+ validateVSpace: 'VSpace සම්පුර්ණ සංක්යාවක් විය යුතුය.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/sk.js b/resource/res/libs/ckeditor/plugins/image/lang/sk.js
new file mode 100644
index 00000000..62bdada9
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/sk.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'sk', {
+ alt: 'Alternatívny text',
+ border: 'Rám (border)',
+ btnUpload: 'Odoslať to na server',
+ button2Img: 'Chcete zmeniť vybrané obrázkové tlačidlo na jednoduchý obrázok?',
+ hSpace: 'H-medzera',
+ img2Button: 'Chcete zmeniť vybraný obrázok na obrázkové tlačidlo?',
+ infoTab: 'Informácie o obrázku',
+ linkTab: 'Odkaz',
+ lockRatio: 'Pomer zámky',
+ menu: 'Vlastnosti obrázka',
+ resetSize: 'Pôvodná veľkosť',
+ title: 'Vlastnosti obrázka',
+ titleButton: 'Vlastnosti obrázkového tlačidla',
+ upload: 'Nahrať',
+ urlMissing: 'Chýba URL zdroja obrázka.',
+ vSpace: 'V-medzera',
+ validateBorder: 'Rám (border) musí byť celé číslo.',
+ validateHSpace: 'H-medzera musí byť celé číslo.',
+ validateVSpace: 'V-medzera musí byť celé číslo.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/sl.js b/resource/res/libs/ckeditor/plugins/image/lang/sl.js
new file mode 100644
index 00000000..98800334
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/sl.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'sl', {
+ alt: 'Nadomestno besedilo',
+ border: 'Obroba',
+ btnUpload: 'Pošlji na strežnik',
+ button2Img: 'Želite pretvoriti izbrani gumb s sliko v preprosto sliko?',
+ hSpace: 'Vodoravni odmik',
+ img2Button: 'Želite pretvoriti izbrano sliko v gumb s sliko?',
+ infoTab: 'Podatki o sliki',
+ linkTab: 'Povezava',
+ lockRatio: 'Zakleni razmerje',
+ menu: 'Lastnosti slike',
+ resetSize: 'Ponastavi velikost',
+ title: 'Lastnosti slike',
+ titleButton: 'Lastnosti gumba s sliko',
+ upload: 'Naloži',
+ urlMissing: 'Manjka URL vira slike.',
+ vSpace: 'Navpični odmik',
+ validateBorder: 'Meja mora biti celo število.',
+ validateHSpace: 'Vodoravni odmik mora biti celo število.',
+ validateVSpace: 'VSpace mora biti celo število.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/sq.js b/resource/res/libs/ckeditor/plugins/image/lang/sq.js
new file mode 100644
index 00000000..c15757b6
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/sq.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'sq', {
+ alt: 'Tekst Alternativ',
+ border: 'Korniza',
+ btnUpload: 'Dërgo në server',
+ button2Img: 'Dëshironi të e ndërroni pullën e fotos së selektuar në një foto të thjeshtë?',
+ hSpace: 'HSpace',
+ img2Button: 'Dëshironi të ndryshoni foton e përzgjedhur në pullë?',
+ infoTab: 'Informacione mbi Fotografinë',
+ linkTab: 'Nyja',
+ lockRatio: 'Mbyll Racionin',
+ menu: 'Karakteristikat e Fotografisë',
+ resetSize: 'Rikthe Madhësinë',
+ title: 'Karakteristikat e Fotografisë',
+ titleButton: 'Karakteristikat e Pullës së Fotografisë',
+ upload: 'Ngarko',
+ urlMissing: 'Mungon URL e burimit të fotografisë.',
+ vSpace: 'Hapësira Vertikale',
+ validateBorder: 'Korniza duhet të jetë numër i plotë.',
+ validateHSpace: 'Hapësira horizontale duhet të jetë numër i plotë.',
+ validateVSpace: 'Hapësira vertikale duhet të jetë numër i plotë.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/sr-latn.js b/resource/res/libs/ckeditor/plugins/image/lang/sr-latn.js
new file mode 100644
index 00000000..d0fad85e
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/sr-latn.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'sr-latn', {
+ alt: 'Alternativni tekst',
+ border: 'Okvir',
+ btnUpload: 'Pošalji na server',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'HSpace',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'Info slike',
+ linkTab: 'Link',
+ lockRatio: 'Zaključaj odnos',
+ menu: 'Osobine slika',
+ resetSize: 'Resetuj veličinu',
+ title: 'Osobine slika',
+ titleButton: 'Osobine dugmeta sa slikom',
+ upload: 'Pošalji',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'VSpace',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/sr.js b/resource/res/libs/ckeditor/plugins/image/lang/sr.js
new file mode 100644
index 00000000..defda932
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/sr.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'sr', {
+ alt: 'Алтернативни текст',
+ border: 'Оквир',
+ btnUpload: 'Пошаљи на сервер',
+ button2Img: 'Да ли желите да промените одабрану слику дугмета као једноставну слику?',
+ hSpace: 'HSpace',
+ img2Button: 'Да ли желите да промените одабрану слику у слику дугмета?',
+ infoTab: 'Инфо слике',
+ linkTab: 'Линк',
+ lockRatio: 'Закључај однос',
+ menu: 'Особине слика',
+ resetSize: 'Ресетуј величину',
+ title: 'Особине слика',
+ titleButton: 'Особине дугмета са сликом',
+ upload: 'Пошаљи',
+ urlMissing: 'Недостаје УРЛ слике.',
+ vSpace: 'VSpace',
+ validateBorder: 'Ивица треба да буде цифра.',
+ validateHSpace: 'HSpace треба да буде цифра.',
+ validateVSpace: 'VSpace треба да буде цифра.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/sv.js b/resource/res/libs/ckeditor/plugins/image/lang/sv.js
new file mode 100644
index 00000000..83f20447
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/sv.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'sv', {
+ alt: 'Alternativ text',
+ border: 'Kant',
+ btnUpload: 'Skicka till server',
+ button2Img: 'Vill du omvandla den valda bildknappen på en enkel bild?',
+ hSpace: 'Horis. marginal',
+ img2Button: 'Vill du omvandla den valda bildknappen på en enkel bild?',
+ infoTab: 'Bildinformation',
+ linkTab: 'Länk',
+ lockRatio: 'Lås höjd/bredd förhållanden',
+ menu: 'Bildegenskaper',
+ resetSize: 'Återställ storlek',
+ title: 'Bildegenskaper',
+ titleButton: 'Egenskaper för bildknapp',
+ upload: 'Ladda upp',
+ urlMissing: 'Bildkällans URL saknas.',
+ vSpace: 'Vert. marginal',
+ validateBorder: 'Kantlinje måste vara ett heltal.',
+ validateHSpace: 'HSpace måste vara ett heltal.',
+ validateVSpace: 'VSpace måste vara ett heltal.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/th.js b/resource/res/libs/ckeditor/plugins/image/lang/th.js
new file mode 100644
index 00000000..542912d4
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/th.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'th', {
+ alt: 'คำประกอบรูปภาพ',
+ border: 'ขนาดขอบรูป',
+ btnUpload: 'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'ระยะแนวนอน',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'ข้อมูลของรูปภาพ',
+ linkTab: 'ลิ้งค์',
+ lockRatio: 'กำหนดอัตราส่วน กว้าง-สูง แบบคงที่',
+ menu: 'คุณสมบัติของ รูปภาพ',
+ resetSize: 'กำหนดรูปเท่าขนาดจริง',
+ title: 'คุณสมบัติของ รูปภาพ',
+ titleButton: 'คุณสมบัติของ ปุ่มแบบรูปภาพ',
+ upload: 'อัพโหลดไฟล์',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'ระยะแนวตั้ง',
+ validateBorder: 'Border must be a whole number.', // MISSING
+ validateHSpace: 'HSpace must be a whole number.', // MISSING
+ validateVSpace: 'VSpace must be a whole number.' // MISSING
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/tr.js b/resource/res/libs/ckeditor/plugins/image/lang/tr.js
new file mode 100644
index 00000000..062c027e
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/tr.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'tr', {
+ alt: 'Alternatif Yazı',
+ border: 'Kenar',
+ btnUpload: 'Sunucuya Yolla',
+ button2Img: 'Seçili resim butonunu basit resime çevirmek istermisiniz?',
+ hSpace: 'Yatay Boşluk',
+ img2Button: 'Seçili olan resimi, resimli butona çevirmek istermisiniz?',
+ infoTab: 'Resim Bilgisi',
+ linkTab: 'Köprü',
+ lockRatio: 'Oranı Kilitle',
+ menu: 'Resim Özellikleri',
+ resetSize: 'Boyutu Başa Döndür',
+ title: 'Resim Özellikleri',
+ titleButton: 'Resimli Düğme Özellikleri',
+ upload: 'Karşıya Yükle',
+ urlMissing: 'Resmin URL kaynağı eksiktir.',
+ vSpace: 'Dikey Boşluk',
+ validateBorder: 'Çerçeve tam sayı olmalıdır.',
+ validateHSpace: 'HSpace tam sayı olmalıdır.',
+ validateVSpace: 'VSpace tam sayı olmalıdır.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/tt.js b/resource/res/libs/ckeditor/plugins/image/lang/tt.js
new file mode 100644
index 00000000..e934f8c7
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/tt.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'tt', {
+ alt: 'Альтернатив текст',
+ border: 'Чик',
+ btnUpload: 'Серверга җибәрү',
+ button2Img: 'Do you want to transform the selected image button on a simple image?', // MISSING
+ hSpace: 'Горизонталь ара',
+ img2Button: 'Do you want to transform the selected image on a image button?', // MISSING
+ infoTab: 'Рәсем тасвирламасы',
+ linkTab: 'Сылталама',
+ lockRatio: 'Lock Ratio', // MISSING
+ menu: 'Рәсем үзлекләре',
+ resetSize: 'Баштагы зурлык',
+ title: 'Рәсем үзлекләре',
+ titleButton: 'Рәсемле төймə үзлекләре',
+ upload: 'Йөкләү',
+ urlMissing: 'Image source URL is missing.', // MISSING
+ vSpace: 'Вертикаль ара',
+ validateBorder: 'Чик киңлеге сан булырга тиеш.',
+ validateHSpace: 'Горизонталь ара бөтен сан булырга тиеш.',
+ validateVSpace: 'Вертикаль ара бөтен сан булырга тиеш.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/ug.js b/resource/res/libs/ckeditor/plugins/image/lang/ug.js
new file mode 100644
index 00000000..23d90f35
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/ug.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'ug', {
+ alt: 'تېكىست ئالماشتۇر',
+ border: 'گىرۋەك چوڭلۇقى',
+ btnUpload: 'مۇلازىمېتىرغا يۈكلە',
+ button2Img: 'نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟',
+ hSpace: 'توغرىسىغا ئارىلىقى',
+ img2Button: 'نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟',
+ infoTab: 'سۈرەت',
+ linkTab: 'ئۇلانما',
+ lockRatio: 'نىسبەتنى قۇلۇپلا',
+ menu: 'سۈرەت خاسلىقى',
+ resetSize: 'ئەسلى چوڭلۇق',
+ title: 'سۈرەت خاسلىقى',
+ titleButton: 'سۈرەت دائىرە خاسلىقى',
+ upload: 'يۈكلە',
+ urlMissing: 'سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم',
+ vSpace: 'بويىغا ئارىلىقى',
+ validateBorder: 'گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ',
+ validateHSpace: 'توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ',
+ validateVSpace: 'بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/uk.js b/resource/res/libs/ckeditor/plugins/image/lang/uk.js
new file mode 100644
index 00000000..0c4649d7
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/uk.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'uk', {
+ alt: 'Альтернативний текст',
+ border: 'Рамка',
+ btnUpload: 'Надіслати на сервер',
+ button2Img: 'Бажаєте перетворити обрану кнопку-зображення на просте зображення?',
+ hSpace: 'Гориз. відступ',
+ img2Button: 'Бажаєте перетворити обране зображення на кнопку-зображення?',
+ infoTab: 'Інформація про зображення',
+ linkTab: 'Посилання',
+ lockRatio: 'Зберегти пропорції',
+ menu: 'Властивості зображення',
+ resetSize: 'Очистити поля розмірів',
+ title: 'Властивості зображення',
+ titleButton: 'Властивості кнопки із зображенням',
+ upload: 'Надіслати',
+ urlMissing: 'Вкажіть URL зображення.',
+ vSpace: 'Верт. відступ',
+ validateBorder: 'Ширина рамки повинна бути цілим числом.',
+ validateHSpace: 'Гориз. відступ повинен бути цілим числом.',
+ validateVSpace: 'Верт. відступ повинен бути цілим числом.'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/vi.js b/resource/res/libs/ckeditor/plugins/image/lang/vi.js
new file mode 100644
index 00000000..57f8c6fa
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/vi.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'vi', {
+ alt: 'Chú thích ảnh',
+ border: 'Đường viền',
+ btnUpload: 'Tải lên máy chủ',
+ button2Img: 'Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?',
+ hSpace: 'Khoảng đệm ngang',
+ img2Button: 'Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?',
+ infoTab: 'Thông tin của ảnh',
+ linkTab: 'Tab liên kết',
+ lockRatio: 'Giữ nguyên tỷ lệ',
+ menu: 'Thuộc tính của ảnh',
+ resetSize: 'Kích thước gốc',
+ title: 'Thuộc tính của ảnh',
+ titleButton: 'Thuộc tính nút của ảnh',
+ upload: 'Tải lên',
+ urlMissing: 'Thiếu đường dẫn hình ảnh',
+ vSpace: 'Khoảng đệm dọc',
+ validateBorder: 'Chiều rộng của đường viền phải là một số nguyên dương',
+ validateHSpace: 'Khoảng đệm ngang phải là một số nguyên dương',
+ validateVSpace: 'Khoảng đệm dọc phải là một số nguyên dương'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/zh-cn.js b/resource/res/libs/ckeditor/plugins/image/lang/zh-cn.js
new file mode 100644
index 00000000..88878e3c
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/zh-cn.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'zh-cn', {
+ alt: '替换文本',
+ border: '边框大小',
+ btnUpload: '上传到服务器',
+ button2Img: '确定要把当前图像按钮转换为普通图像吗?',
+ hSpace: '水平间距',
+ img2Button: '确定要把当前图像改变为图像按钮吗?',
+ infoTab: '图像信息',
+ linkTab: '链接',
+ lockRatio: '锁定比例',
+ menu: '图像属性',
+ resetSize: '原始尺寸',
+ title: '图像属性',
+ titleButton: '图像域属性',
+ upload: '上传',
+ urlMissing: '缺少图像源文件地址',
+ vSpace: '垂直间距',
+ validateBorder: '边框大小必须为整数格式',
+ validateHSpace: '水平间距必须为整数格式',
+ validateVSpace: '垂直间距必须为整数格式'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/lang/zh.js b/resource/res/libs/ckeditor/plugins/image/lang/zh.js
new file mode 100644
index 00000000..08d5e6ad
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/lang/zh.js
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang( 'image', 'zh', {
+ alt: '替代文字',
+ border: '框線',
+ btnUpload: '傳送到伺服器',
+ button2Img: '請問您確定要將「圖片按鈕」轉換成「圖片」嗎?',
+ hSpace: 'HSpace',
+ img2Button: '請問您確定要將「圖片」轉換成「圖片按鈕」嗎?',
+ infoTab: '影像資訊',
+ linkTab: '連結',
+ lockRatio: '固定比例',
+ menu: '影像屬性',
+ resetSize: '重設大小',
+ title: '影像屬性',
+ titleButton: '影像按鈕屬性',
+ upload: '上傳',
+ urlMissing: '遺失圖片來源之 URL ',
+ vSpace: 'VSpace',
+ validateBorder: '框線必須是整數。',
+ validateHSpace: 'HSpace 必須是整數。',
+ validateVSpace: 'VSpace 必須是整數。'
+} );
diff --git a/resource/res/libs/ckeditor/plugins/image/plugin.js b/resource/res/libs/ckeditor/plugins/image/plugin.js
new file mode 100644
index 00000000..8766e4d6
--- /dev/null
+++ b/resource/res/libs/ckeditor/plugins/image/plugin.js
@@ -0,0 +1,184 @@
+/**
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+/**
+ * @fileOverview The Image plugin.
+ */
+
+( function() {
+
+ CKEDITOR.plugins.add( 'image', {
+ requires: 'dialog',
+ // jscs:disable maximumLineLength
+ lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
+ // jscs:enable maximumLineLength
+ icons: 'image', // %REMOVE_LINE_CORE%
+ hidpi: true, // %REMOVE_LINE_CORE%
+ init: function( editor ) {
+ var pluginName = 'image';
+
+ // Abort when Easyimage or Image2 are to be loaded since this plugins
+ // share the same functionality (#1791).
+ if ( editor.plugins.detectConflict( pluginName, [ 'easyimage', 'image2' ] ) ) {
+ return;
+ }
+
+ // Register the dialog.
+ CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/image.js' );
+
+ var allowed = 'img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}',
+ required = 'img[alt,src]';
+
+ if ( CKEDITOR.dialog.isTabEnabled( editor, pluginName, 'advanced' ) )
+ allowed = 'img[alt,dir,id,lang,longdesc,!src,title]{*}(*)';
+
+ // Register the command.
+ editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName, {
+ allowedContent: allowed,
+ requiredContent: required,
+ contentTransformations: [
+ [ 'img{width}: sizeToStyle', 'img[width]: sizeToAttribute' ],
+ [ 'img{float}: alignmentToStyle', 'img[align]: alignmentToAttribute' ]
+ ]
+ } ) );
+
+ // Register the toolbar button.
+ editor.ui.addButton && editor.ui.addButton( 'Image', {
+ label: editor.lang.common.image,
+ command: pluginName,
+ toolbar: 'insert,10'
+ } );
+
+ editor.on( 'doubleclick', function( evt ) {
+ var element = evt.data.element;
+
+ if ( element.is( 'img' ) && !element.data( 'cke-realelement' ) && !element.isReadOnly() )
+ evt.data.dialog = 'image';
+ } );
+
+ // If the "menu" plugin is loaded, register the menu items.
+ if ( editor.addMenuItems ) {
+ editor.addMenuItems( {
+ image: {
+ label: editor.lang.image.menu,
+ command: 'image',
+ group: 'image'
+ }
+ } );
+ }
+
+ // If the "contextmenu" plugin is loaded, register the listeners.
+ if ( editor.contextMenu ) {
+ editor.contextMenu.addListener( function( element ) {
+ if ( getSelectedImage( editor, element ) )
+ return { image: CKEDITOR.TRISTATE_OFF };
+ } );
+ }
+ },
+ afterInit: function( editor ) {
+ // Abort when Image2 is to be loaded since both plugins
+ // share the same button, command, etc. names (https://dev.ckeditor.com/ticket/11222).
+ if ( editor.plugins.image2 )
+ return;
+
+ // Customize the behavior of the alignment commands. (https://dev.ckeditor.com/ticket/7430)
+ setupAlignCommand( 'left' );
+ setupAlignCommand( 'right' );
+ setupAlignCommand( 'center' );
+ setupAlignCommand( 'block' );
+
+ function setupAlignCommand( value ) {
+ var command = editor.getCommand( 'justify' + value );
+ if ( command ) {
+ if ( value == 'left' || value == 'right' ) {
+ command.on( 'exec', function( evt ) {
+ var img = getSelectedImage( editor ),
+ align;
+ if ( img ) {
+ align = getImageAlignment( img );
+ if ( align == value ) {
+ img.removeStyle( 'float' );
+
+ // Remove "align" attribute when necessary.
+ if ( value == getImageAlignment( img ) )
+ img.removeAttribute( 'align' );
+ } else {
+ img.setStyle( 'float', value );
+ }
+
+ evt.cancel();
+ }
+ } );
+ }
+
+ command.on( 'refresh', function( evt ) {
+ var img = getSelectedImage( editor ),
+ align;
+ if ( img ) {
+ align = getImageAlignment( img );
+
+ this.setState(
+ ( align == value ) ? CKEDITOR.TRISTATE_ON : ( value == 'right' || value == 'left' ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
+
+ evt.cancel();
+ }
+ } );
+ }
+ }
+ }
+ } );
+
+ function getSelectedImage( editor, element ) {
+ if ( !element ) {
+ var sel = editor.getSelection();
+ element = sel.getSelectedElement();
+ }
+
+ if ( element && element.is( 'img' ) && !element.data( 'cke-realelement' ) && !element.isReadOnly() )
+ return element;
+ }
+
+ function getImageAlignment( element ) {
+ var align = element.getStyle( 'float' );
+
+ if ( align == 'inherit' || align == 'none' )
+ align = 0;
+
+ if ( !align )
+ align = element.getAttribute( 'align' );
+
+ return align;
+ }
+
+} )();
+
+/**
+ * Determines whether dimension inputs should be automatically filled when the image URL changes in the Image plugin dialog window.
+ *
+ * config.image_prefillDimensions = false;
+ *
+ * @since 4.5
+ * @cfg {Boolean} [image_prefillDimensions=true]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Whether to remove links when emptying the link URL field in the Image dialog window.
+ *
+ * config.image_removeLinkByEmptyURL = false;
+ *
+ * @cfg {Boolean} [image_removeLinkByEmptyURL=true]
+ * @member CKEDITOR.config
+ */
+CKEDITOR.config.image_removeLinkByEmptyURL = true;
+
+/**
+ * Padding text to set off the image in the preview area.
+ *
+ * config.image_previewText = CKEDITOR.tools.repeat( '___ ', 100 );
+ *
+ * @cfg {String} [image_previewText='Lorem ipsum dolor...' (placeholder text)]
+ * @member CKEDITOR.config
+ */
diff --git a/resource/res/templates/admin/add_question.html b/resource/res/templates/admin/add_question.html
index 817b0dba..28a47c8d 100644
--- a/resource/res/templates/admin/add_question.html
+++ b/resource/res/templates/admin/add_question.html
@@ -13,27 +13,44 @@