From 64966da58ae26fc38bf9c03695d569ca2f4d5261 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Wed, 29 Jul 2015 09:29:57 +0200 Subject: [PATCH] Switch language of CKEditor automatically --- scripts/ckeditor/config.js | 4 +- .../plugins/image2/dev/assets/image1.jpg | Bin 0 -> 34316 bytes .../plugins/image2/dev/assets/image2.jpg | Bin 0 -> 27711 bytes .../ckeditor/plugins/image2/dev/contents.css | 35 + .../ckeditor/plugins/image2/dev/image2.html | 339 ++++ .../ckeditor/plugins/image2/dialogs/image2.js | 657 +++++++ .../plugins/image2/icons/hidpi/image.png | Bin 0 -> 1745 bytes .../ckeditor/plugins/image2/icons/image.png | Bin 0 -> 756 bytes scripts/ckeditor/plugins/image2/lang/af.js | 20 + scripts/ckeditor/plugins/image2/lang/ar.js | 20 + scripts/ckeditor/plugins/image2/lang/bg.js | 20 + scripts/ckeditor/plugins/image2/lang/bn.js | 20 + scripts/ckeditor/plugins/image2/lang/bs.js | 20 + scripts/ckeditor/plugins/image2/lang/ca.js | 20 + scripts/ckeditor/plugins/image2/lang/cs.js | 20 + scripts/ckeditor/plugins/image2/lang/cy.js | 20 + scripts/ckeditor/plugins/image2/lang/da.js | 20 + scripts/ckeditor/plugins/image2/lang/de.js | 20 + scripts/ckeditor/plugins/image2/lang/el.js | 20 + scripts/ckeditor/plugins/image2/lang/en-au.js | 20 + scripts/ckeditor/plugins/image2/lang/en-ca.js | 20 + scripts/ckeditor/plugins/image2/lang/en-gb.js | 20 + scripts/ckeditor/plugins/image2/lang/en.js | 20 + scripts/ckeditor/plugins/image2/lang/eo.js | 20 + scripts/ckeditor/plugins/image2/lang/es.js | 20 + scripts/ckeditor/plugins/image2/lang/et.js | 20 + scripts/ckeditor/plugins/image2/lang/eu.js | 20 + scripts/ckeditor/plugins/image2/lang/fa.js | 20 + scripts/ckeditor/plugins/image2/lang/fi.js | 20 + scripts/ckeditor/plugins/image2/lang/fo.js | 20 + scripts/ckeditor/plugins/image2/lang/fr-ca.js | 20 + scripts/ckeditor/plugins/image2/lang/fr.js | 20 + scripts/ckeditor/plugins/image2/lang/gl.js | 20 + scripts/ckeditor/plugins/image2/lang/gu.js | 20 + scripts/ckeditor/plugins/image2/lang/he.js | 20 + scripts/ckeditor/plugins/image2/lang/hi.js | 20 + scripts/ckeditor/plugins/image2/lang/hr.js | 20 + scripts/ckeditor/plugins/image2/lang/hu.js | 20 + scripts/ckeditor/plugins/image2/lang/id.js | 20 + scripts/ckeditor/plugins/image2/lang/is.js | 20 + scripts/ckeditor/plugins/image2/lang/it.js | 20 + scripts/ckeditor/plugins/image2/lang/ja.js | 20 + scripts/ckeditor/plugins/image2/lang/ka.js | 20 + scripts/ckeditor/plugins/image2/lang/km.js | 20 + scripts/ckeditor/plugins/image2/lang/ko.js | 20 + scripts/ckeditor/plugins/image2/lang/ku.js | 20 + scripts/ckeditor/plugins/image2/lang/lt.js | 20 + scripts/ckeditor/plugins/image2/lang/lv.js | 20 + scripts/ckeditor/plugins/image2/lang/mk.js | 20 + scripts/ckeditor/plugins/image2/lang/mn.js | 20 + scripts/ckeditor/plugins/image2/lang/ms.js | 20 + scripts/ckeditor/plugins/image2/lang/nb.js | 20 + scripts/ckeditor/plugins/image2/lang/nl.js | 20 + scripts/ckeditor/plugins/image2/lang/no.js | 20 + scripts/ckeditor/plugins/image2/lang/pl.js | 20 + scripts/ckeditor/plugins/image2/lang/pt-br.js | 20 + scripts/ckeditor/plugins/image2/lang/pt.js | 20 + scripts/ckeditor/plugins/image2/lang/ro.js | 20 + scripts/ckeditor/plugins/image2/lang/ru.js | 20 + scripts/ckeditor/plugins/image2/lang/si.js | 20 + scripts/ckeditor/plugins/image2/lang/sk.js | 20 + scripts/ckeditor/plugins/image2/lang/sl.js | 20 + scripts/ckeditor/plugins/image2/lang/sq.js | 20 + .../ckeditor/plugins/image2/lang/sr-latn.js | 20 + scripts/ckeditor/plugins/image2/lang/sr.js | 20 + scripts/ckeditor/plugins/image2/lang/sv.js | 20 + scripts/ckeditor/plugins/image2/lang/th.js | 20 + scripts/ckeditor/plugins/image2/lang/tr.js | 20 + scripts/ckeditor/plugins/image2/lang/tt.js | 20 + scripts/ckeditor/plugins/image2/lang/ug.js | 20 + scripts/ckeditor/plugins/image2/lang/uk.js | 20 + scripts/ckeditor/plugins/image2/lang/vi.js | 20 + scripts/ckeditor/plugins/image2/lang/zh-cn.js | 20 + scripts/ckeditor/plugins/image2/lang/zh.js | 20 + scripts/ckeditor/plugins/image2/plugin.js | 1580 +++++++++++++++++ .../plugins/image2/samples/assets/image1.jpg | Bin 0 -> 34316 bytes .../plugins/image2/samples/assets/image2.jpg | Bin 0 -> 27711 bytes .../plugins/image2/samples/image2.html | 65 + scripts/load-ckeditor.js | 2 +- src/elogd.c | 50 +- 80 files changed, 4041 insertions(+), 11 deletions(-) create mode 100755 scripts/ckeditor/plugins/image2/dev/assets/image1.jpg create mode 100755 scripts/ckeditor/plugins/image2/dev/assets/image2.jpg create mode 100755 scripts/ckeditor/plugins/image2/dev/contents.css create mode 100755 scripts/ckeditor/plugins/image2/dev/image2.html create mode 100755 scripts/ckeditor/plugins/image2/dialogs/image2.js create mode 100755 scripts/ckeditor/plugins/image2/icons/hidpi/image.png create mode 100755 scripts/ckeditor/plugins/image2/icons/image.png create mode 100755 scripts/ckeditor/plugins/image2/lang/af.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ar.js create mode 100755 scripts/ckeditor/plugins/image2/lang/bg.js create mode 100755 scripts/ckeditor/plugins/image2/lang/bn.js create mode 100755 scripts/ckeditor/plugins/image2/lang/bs.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ca.js create mode 100755 scripts/ckeditor/plugins/image2/lang/cs.js create mode 100755 scripts/ckeditor/plugins/image2/lang/cy.js create mode 100755 scripts/ckeditor/plugins/image2/lang/da.js create mode 100755 scripts/ckeditor/plugins/image2/lang/de.js create mode 100755 scripts/ckeditor/plugins/image2/lang/el.js create mode 100755 scripts/ckeditor/plugins/image2/lang/en-au.js create mode 100755 scripts/ckeditor/plugins/image2/lang/en-ca.js create mode 100755 scripts/ckeditor/plugins/image2/lang/en-gb.js create mode 100755 scripts/ckeditor/plugins/image2/lang/en.js create mode 100755 scripts/ckeditor/plugins/image2/lang/eo.js create mode 100755 scripts/ckeditor/plugins/image2/lang/es.js create mode 100755 scripts/ckeditor/plugins/image2/lang/et.js create mode 100755 scripts/ckeditor/plugins/image2/lang/eu.js create mode 100755 scripts/ckeditor/plugins/image2/lang/fa.js create mode 100755 scripts/ckeditor/plugins/image2/lang/fi.js create mode 100755 scripts/ckeditor/plugins/image2/lang/fo.js create mode 100755 scripts/ckeditor/plugins/image2/lang/fr-ca.js create mode 100755 scripts/ckeditor/plugins/image2/lang/fr.js create mode 100755 scripts/ckeditor/plugins/image2/lang/gl.js create mode 100755 scripts/ckeditor/plugins/image2/lang/gu.js create mode 100755 scripts/ckeditor/plugins/image2/lang/he.js create mode 100755 scripts/ckeditor/plugins/image2/lang/hi.js create mode 100755 scripts/ckeditor/plugins/image2/lang/hr.js create mode 100755 scripts/ckeditor/plugins/image2/lang/hu.js create mode 100755 scripts/ckeditor/plugins/image2/lang/id.js create mode 100755 scripts/ckeditor/plugins/image2/lang/is.js create mode 100755 scripts/ckeditor/plugins/image2/lang/it.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ja.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ka.js create mode 100755 scripts/ckeditor/plugins/image2/lang/km.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ko.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ku.js create mode 100755 scripts/ckeditor/plugins/image2/lang/lt.js create mode 100755 scripts/ckeditor/plugins/image2/lang/lv.js create mode 100755 scripts/ckeditor/plugins/image2/lang/mk.js create mode 100755 scripts/ckeditor/plugins/image2/lang/mn.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ms.js create mode 100755 scripts/ckeditor/plugins/image2/lang/nb.js create mode 100755 scripts/ckeditor/plugins/image2/lang/nl.js create mode 100755 scripts/ckeditor/plugins/image2/lang/no.js create mode 100755 scripts/ckeditor/plugins/image2/lang/pl.js create mode 100755 scripts/ckeditor/plugins/image2/lang/pt-br.js create mode 100755 scripts/ckeditor/plugins/image2/lang/pt.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ro.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ru.js create mode 100755 scripts/ckeditor/plugins/image2/lang/si.js create mode 100755 scripts/ckeditor/plugins/image2/lang/sk.js create mode 100755 scripts/ckeditor/plugins/image2/lang/sl.js create mode 100755 scripts/ckeditor/plugins/image2/lang/sq.js create mode 100755 scripts/ckeditor/plugins/image2/lang/sr-latn.js create mode 100755 scripts/ckeditor/plugins/image2/lang/sr.js create mode 100755 scripts/ckeditor/plugins/image2/lang/sv.js create mode 100755 scripts/ckeditor/plugins/image2/lang/th.js create mode 100755 scripts/ckeditor/plugins/image2/lang/tr.js create mode 100755 scripts/ckeditor/plugins/image2/lang/tt.js create mode 100755 scripts/ckeditor/plugins/image2/lang/ug.js create mode 100755 scripts/ckeditor/plugins/image2/lang/uk.js create mode 100755 scripts/ckeditor/plugins/image2/lang/vi.js create mode 100755 scripts/ckeditor/plugins/image2/lang/zh-cn.js create mode 100755 scripts/ckeditor/plugins/image2/lang/zh.js create mode 100755 scripts/ckeditor/plugins/image2/plugin.js create mode 100755 scripts/ckeditor/plugins/image2/samples/assets/image1.jpg create mode 100755 scripts/ckeditor/plugins/image2/samples/assets/image2.jpg create mode 100755 scripts/ckeditor/plugins/image2/samples/image2.html diff --git a/scripts/ckeditor/config.js b/scripts/ckeditor/config.js index 401cb288..119432e4 100755 --- a/scripts/ckeditor/config.js +++ b/scripts/ckeditor/config.js @@ -7,12 +7,12 @@ CKEDITOR.editorConfig = function( config ) { // %REMOVE_START% // The configuration options below are needed when running CKEditor from source files. - config.plugins = 'dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,bidi,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,div,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,fakeobjects,flash,floatingspace,listblock,richcombo,font,forms,format,horizontalrule,htmlwriter,iframe,wysiwygarea,image,indent,indentblock,indentlist,smiley,justify,menubutton,language,link,list,liststyle,magicline,maximize,newpage,pagebreak,pastetext,pastefromword,preview,print,removeformat,save,selectall,showblocks,showborders,sourcearea,specialchar,scayt,stylescombo,tab,table,tabletools,undo,wsc,lineutils,widget,imagepaste'; + config.plugins = 'dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,bidi,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,div,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,fakeobjects,flash,floatingspace,listblock,richcombo,font,forms,format,horizontalrule,htmlwriter,iframe,wysiwygarea,image,indent,indentblock,indentlist,smiley,justify,menubutton,language,link,list,liststyle,magicline,maximize,newpage,pagebreak,pastetext,pastefromword,preview,print,removeformat,save,selectall,showblocks,showborders,sourcearea,specialchar,scayt,stylescombo,tab,table,tabletools,undo,wsc,lineutils,widget,image2,imagepaste'; config.skin = 'moono'; // %REMOVE_END% // Define changes to default configuration here. For example: - // config.language = 'fr'; + // config.language = 'de'; // config.uiColor = '#AADC6E'; config.customConfig = '../ckeditor-config.js' }; diff --git a/scripts/ckeditor/plugins/image2/dev/assets/image1.jpg b/scripts/ckeditor/plugins/image2/dev/assets/image1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2fe79eb2ccee3ff01afd83dc9e1d29c856889462 GIT binary patch literal 34316 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 NeOJVPhR5E2|Jl`NQLz93 literal 0 HcmV?d00001 diff --git a/scripts/ckeditor/plugins/image2/dev/assets/image2.jpg b/scripts/ckeditor/plugins/image2/dev/assets/image2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..453ece5d339a4c12bce722c06a81d1db587a7f8b GIT binary patch literal 27711 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 Y7L@bq(U<>r?0=p0|F>ji>HnGkUp@y1T>t<8 literal 0 HcmV?d00001 diff --git a/scripts/ckeditor/plugins/image2/dev/contents.css b/scripts/ckeditor/plugins/image2/dev/contents.css new file mode 100755 index 00000000..b0bc8f59 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/dev/contents.css @@ -0,0 +1,35 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ + +.cke_widget_wrapper:hover:after { + content: "id: " attr(data-cke-widget-id); + position: absolute; + top: 0; + right: 0; + padding: 2px 4px; + background: #EEE; + border: solid 1px #DDD; + border-radius: 2px; + color: #BBB; + font: bold 10px sans-serif; +} + +.align-left { + float: left; + margin-right: 20px; +} + +.align-right { + float: right; + margin-left: 20px; +} + +.align-center { + text-align: center; +} + +.align-center > figure { + display: inline-block; +} diff --git a/scripts/ckeditor/plugins/image2/dev/image2.html b/scripts/ckeditor/plugins/image2/dev/image2.html new file mode 100755 index 00000000..b4bd71fe --- /dev/null +++ b/scripts/ckeditor/plugins/image2/dev/image2.html @@ -0,0 +1,339 @@ + + + + + + Widget Image — CKEditor Sample + + + + + + + + + + + + + + +

Classic (iframe-based) Sample

+ + + +

Inline Sample

+ +
+

Apollo 11

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

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

+ +

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

+ +

Broadcasting and quotes

+ +

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

+ +
+

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

+
+ +

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

+ +
+

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

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

Technical details

+ +

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

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

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

+ +

+ Saturn V +

+ +
+

Source: Wikipedia.org

+
+ +

Div Editing Area Sample

+ + + +

alignClasses samples

+ + + +

+ + +

+ + + + + + diff --git a/scripts/ckeditor/plugins/image2/dialogs/image2.js b/scripts/ckeditor/plugins/image2/dialogs/image2.js new file mode 100755 index 00000000..3c36a001 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/dialogs/image2.js @@ -0,0 +1,657 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Image plugin based on Widgets API + */ + +'use strict'; + + +CKEDITOR.dialog.add( 'image2', function( editor ) { + + // RegExp: 123, 123px, empty string "" + var regexGetSizeOrEmpty = /(^\s*(\d+)(px)?\s*$)|^$/i, + + lockButtonId = CKEDITOR.tools.getNextId(), + resetButtonId = CKEDITOR.tools.getNextId(), + + lang = editor.lang.image2, + commonLang = editor.lang.common, + + lockResetStyle = 'margin-top:18px;width:40px;height:20px;', + lockResetHtml = new CKEDITOR.template( + '' ).output( { + lockButtonId: lockButtonId, + resetButtonId: resetButtonId + } ), + + helpers = CKEDITOR.plugins.image2, + + // Editor instance configuration. + config = editor.config, + + // Content restrictions defined by the widget which + // impact on dialog structure and presence of fields. + features = editor.widgets.registered.image.features, + + // Functions inherited from image2 plugin. + checkHasNaturalRatio = helpers.checkHasNaturalRatio, + getNatural = helpers.getNatural, + + // Global variables referring to the dialog's context. + doc, widget, image, + + // Global variable referring to this dialog's image pre-loader. + preLoader, + + // Global variables holding the original size of the image. + domWidth, domHeight, + + // Global variables related to image pre-loading. + preLoadedWidth, preLoadedHeight, srcChanged, + + // Global variables related to size locking. + lockRatio, userDefinedLock, + + // Global variables referring to dialog fields and elements. + lockButton, resetButton, widthField, heightField, + + natural; + + // Validates dimension. Allowed values are: + // "123px", "123", "" (empty string) + function validateDimension() { + var match = this.getValue().match( regexGetSizeOrEmpty ), + isValid = !!( match && parseInt( match[ 1 ], 10 ) !== 0 ); + + if ( !isValid ) + alert( commonLang[ 'invalid' + CKEDITOR.tools.capitalize( this.id ) ] ); + + return isValid; + } + + // Creates a function that pre-loads images. The callback function passes + // [image, width, height] or null if loading failed. + // + // @returns {Function} + function createPreLoader() { + var image = doc.createElement( 'img' ), + listeners = []; + + function addListener( event, callback ) { + listeners.push( image.once( event, function( evt ) { + removeListeners(); + callback( evt ); + } ) ); + } + + function removeListeners() { + var l; + + while ( ( l = listeners.pop() ) ) + l.removeListener(); + } + + // @param {String} src. + // @param {Function} callback. + return function( src, callback, scope ) { + addListener( 'load', function() { + // Don't use image.$.(width|height) since it's buggy in IE9-10 (#11159) + var dimensions = getNatural( image ); + + callback.call( scope, image, dimensions.width, dimensions.height ); + } ); + + addListener( 'error', function() { + callback( null ); + } ); + + addListener( 'abort', function() { + callback( null ); + } ); + + image.setAttribute( 'src', + ( config.baseHref || '' ) + src + '?' + Math.random().toString( 16 ).substring( 2 ) ); + }; + } + + // This function updates width and height fields once the + // "src" field is altered. Along with dimensions, also the + // dimensions lock is adjusted. + function onChangeSrc() { + var value = this.getValue(); + + toggleDimensions( false ); + + // Remember that src is different than default. + if ( value !== widget.data.src ) { + // Update dimensions of the image once it's preloaded. + preLoader( value, function( image, width, height ) { + // Re-enable width and height fields. + toggleDimensions( true ); + + // There was problem loading the image. Unlock ratio. + if ( !image ) + return toggleLockRatio( false ); + + // Fill width field with the width of the new image. + widthField.setValue( width ); + + // Fill height field with the height of the new image. + heightField.setValue( height ); + + // Cache the new width. + preLoadedWidth = width; + + // Cache the new height. + preLoadedHeight = height; + + // Check for new lock value if image exist. + toggleLockRatio( helpers.checkHasNaturalRatio( image ) ); + } ); + + srcChanged = true; + } + + // Value is the same as in widget data but is was + // modified back in time. Roll back dimensions when restoring + // default src. + else if ( srcChanged ) { + // Re-enable width and height fields. + toggleDimensions( true ); + + // Restore width field with cached width. + widthField.setValue( domWidth ); + + // Restore height field with cached height. + heightField.setValue( domHeight ); + + // Src equals default one back again. + srcChanged = false; + } + + // Value is the same as in widget data and it hadn't + // been modified. + else { + // Re-enable width and height fields. + toggleDimensions( true ); + } + } + + function onChangeDimension() { + // If ratio is un-locked, then we don't care what's next. + if ( !lockRatio ) + return; + + var value = this.getValue(); + + // No reason to auto-scale or unlock if the field is empty. + if ( !value ) + return; + + // If the value of the field is invalid (e.g. with %), unlock ratio. + if ( !value.match( regexGetSizeOrEmpty ) ) + toggleLockRatio( false ); + + // No automatic re-scale when dimension is '0'. + if ( value === '0' ) + return; + + var isWidth = this.id == 'width', + // If dialog opened for the new image, domWidth and domHeight + // will be empty. Use dimensions from pre-loader in such case instead. + width = domWidth || preLoadedWidth, + height = domHeight || preLoadedHeight; + + // If changing width, then auto-scale height. + if ( isWidth ) + value = Math.round( height * ( value / width ) ); + + // If changing height, then auto-scale width. + else + value = Math.round( width * ( value / height ) ); + + // If the value is a number, apply it to the other field. + if ( !isNaN( value ) ) + ( isWidth ? heightField : widthField ).setValue( value ); + } + + // Set-up function for lock and reset buttons: + // * Adds lock and reset buttons to focusables. Check if button exist first + // because it may be disabled e.g. due to ACF restrictions. + // * Register mouseover and mouseout event listeners for UI manipulations. + // * Register click event listeners for buttons. + function onLoadLockReset() { + var dialog = this.getDialog(); + + function setupMouseClasses( el ) { + el.on( 'mouseover', function() { + this.addClass( 'cke_btn_over' ); + }, el ); + + el.on( 'mouseout', function() { + this.removeClass( 'cke_btn_over' ); + }, el ); + } + + // Create references to lock and reset buttons for this dialog instance. + lockButton = doc.getById( lockButtonId ); + resetButton = doc.getById( resetButtonId ); + + // Activate (Un)LockRatio button + if ( lockButton ) { + // Consider that there's an additional focusable field + // in the dialog when the "browse" button is visible. + dialog.addFocusable( lockButton, 4 + hasFileBrowser ); + + lockButton.on( 'click', function( evt ) { + toggleLockRatio(); + evt.data && evt.data.preventDefault(); + }, this.getDialog() ); + + setupMouseClasses( lockButton ); + } + + // Activate the reset size button. + if ( resetButton ) { + // Consider that there's an additional focusable field + // in the dialog when the "browse" button is visible. + dialog.addFocusable( resetButton, 5 + hasFileBrowser ); + + // Fills width and height fields with the original dimensions of the + // image (stored in widget#data since widget#init). + resetButton.on( 'click', function( evt ) { + // If there's a new image loaded, reset button should revert + // cached dimensions of pre-loaded DOM element. + if ( srcChanged ) { + widthField.setValue( preLoadedWidth ); + heightField.setValue( preLoadedHeight ); + } + + // If the old image remains, reset button should revert + // dimensions as loaded when the dialog was first shown. + else { + widthField.setValue( domWidth ); + heightField.setValue( domHeight ); + } + + evt.data && evt.data.preventDefault(); + }, this ); + + setupMouseClasses( resetButton ); + } + } + + function toggleLockRatio( enable ) { + // No locking if there's no radio (i.e. due to ACF). + if ( !lockButton ) + return; + + if ( typeof enable == 'boolean' ) { + // If user explicitly wants to decide whether + // to lock or not, don't do anything. + if ( userDefinedLock ) + return; + + lockRatio = enable; + } + + // Undefined. User changed lock value. + else { + var width = widthField.getValue(), + height; + + userDefinedLock = true; + lockRatio = !lockRatio; + + // Automatically adjust height to width to match + // the original ratio (based on dom- dimensions). + if ( lockRatio && width ) { + height = domHeight / domWidth * width; + + if ( !isNaN( height ) ) + heightField.setValue( Math.round( height ) ); + } + } + + lockButton[ lockRatio ? 'removeClass' : 'addClass' ]( 'cke_btn_unlocked' ); + lockButton.setAttribute( 'aria-checked', lockRatio ); + + // Ratio button hc presentation - WHITE SQUARE / BLACK SQUARE + if ( CKEDITOR.env.hc ) { + var icon = lockButton.getChild( 0 ); + icon.setHtml( lockRatio ? CKEDITOR.env.ie ? '\u25A0' : '\u25A3' : CKEDITOR.env.ie ? '\u25A1' : '\u25A2' ); + } + } + + function toggleDimensions( enable ) { + var method = enable ? 'enable' : 'disable'; + + widthField[ method ](); + heightField[ method ](); + } + + var hasFileBrowser = !!( config.filebrowserImageBrowseUrl || config.filebrowserBrowseUrl ), + srcBoxChildren = [ + { + id: 'src', + type: 'text', + label: commonLang.url, + onKeyup: onChangeSrc, + onChange: onChangeSrc, + setup: function( widget ) { + this.setValue( widget.data.src ); + }, + commit: function( widget ) { + widget.setData( 'src', this.getValue() ); + }, + validate: CKEDITOR.dialog.validate.notEmpty( lang.urlMissing ) + } + ]; + + // Render the "Browse" button on demand to avoid an "empty" (hidden child) + // space in dialog layout that distorts the UI. + if ( hasFileBrowser ) { + srcBoxChildren.push( { + 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:src' + } ); + } + + return { + title: lang.title, + minWidth: 250, + minHeight: 100, + onLoad: function() { + // Create a "global" reference to the document for this dialog instance. + doc = this._.element.getDocument(); + + // Create a pre-loader used for determining dimensions of new images. + preLoader = createPreLoader(); + }, + onShow: function() { + // Create a "global" reference to edited widget. + widget = this.widget; + + // Create a "global" reference to widget's image. + image = widget.parts.image; + + // Reset global variables. + srcChanged = userDefinedLock = lockRatio = false; + + // Natural dimensions of the image. + natural = getNatural( image ); + + // Get the natural width of the image. + preLoadedWidth = domWidth = natural.width; + + // Get the natural height of the image. + preLoadedHeight = domHeight = natural.height; + }, + contents: [ + { + id: 'info', + label: lang.infoTab, + elements: [ + { + type: 'vbox', + padding: 0, + children: [ + { + type: 'hbox', + widths: [ '100%' ], + children: srcBoxChildren + } + ] + }, + { + id: 'alt', + type: 'text', + label: lang.alt, + setup: function( widget ) { + this.setValue( widget.data.alt ); + }, + commit: function( widget ) { + widget.setData( 'alt', this.getValue() ); + } + }, + { + type: 'hbox', + widths: [ '25%', '25%', '50%' ], + requiredContent: features.dimension.requiredContent, + children: [ + { + type: 'text', + width: '45px', + id: 'width', + label: commonLang.width, + validate: validateDimension, + onKeyUp: onChangeDimension, + onLoad: function() { + widthField = this; + }, + setup: function( widget ) { + this.setValue( widget.data.width ); + }, + commit: function( widget ) { + widget.setData( 'width', this.getValue() ); + } + }, + { + type: 'text', + id: 'height', + width: '45px', + label: commonLang.height, + validate: validateDimension, + onKeyUp: onChangeDimension, + onLoad: function() { + heightField = this; + }, + setup: function( widget ) { + this.setValue( widget.data.height ); + }, + commit: function( widget ) { + widget.setData( 'height', this.getValue() ); + } + }, + { + id: 'lock', + type: 'html', + style: lockResetStyle, + onLoad: onLoadLockReset, + setup: function( widget ) { + toggleLockRatio( widget.data.lock ); + }, + commit: function( widget ) { + widget.setData( 'lock', lockRatio ); + }, + html: lockResetHtml + } + ] + }, + { + type: 'hbox', + id: 'alignment', + requiredContent: features.align.requiredContent, + children: [ + { + id: 'align', + type: 'radio', + items: [ + [ commonLang.alignNone, 'none' ], + [ commonLang.alignLeft, 'left' ], + [ commonLang.alignCenter, 'center' ], + [ commonLang.alignRight, 'right' ] ], + label: commonLang.align, + setup: function( widget ) { + this.setValue( widget.data.align ); + }, + commit: function( widget ) { + widget.setData( 'align', this.getValue() ); + } + } + ] + }, + { + id: 'hasCaption', + type: 'checkbox', + label: lang.captioned, + requiredContent: features.caption.requiredContent, + setup: function( widget ) { + this.setValue( widget.data.hasCaption ); + }, + commit: function( widget ) { + widget.setData( 'hasCaption', this.getValue() ); + } + } + ] + }, + { + id: 'Upload', + filebrowser: 'uploadButton', + label: lang.uploadTab, + elements: [ + { + type: 'file', + id: 'upload', + label: lang.btnUpload, + style: 'height:40px' + }, + { + type: 'fileButton', + id: 'uploadButton', + onLoad: function( a ) { + CKEDITOR.document.getById( this.domId ).on( 'click', function() { + + // grab the file(s) from the file input tag and upload it using AJAX + var dialog = this.getDialog(); + var files = dialog.getContentElement("Upload", "upload").getInputElement().$.files; + + var file_missing_msg = localize("Please select a file!"); + + // no files were selected + if(files.length == 0) { + alert(file_missing_msg); + return false; + } + + // Create the form data object for uploading with POST + var formData = new FormData(); + + // add all the other attachments that were previously added + $( "input[name^='attachment']" ).each(function(idx, el) { + formData.append($(el).attr('name'), $(el).attr('value')); + }); + + formData.append('drop-count', files.length); // number of files being uploaded + for (var i = 0; i < files.length; i++) { + formData.append('next_attachment', parent.next_attachment); + formData.append('encoding', "HTML"); + formData.append('attfile', files[i]); + + parent.next_attachment += 1; + } + formData.append('cmd', "Upload"); // Command for server to recognize this as an file upload + + var URL = 'upload.html?next_attachment=' + parent.next_attachment; + + $.ajax({ + xhr: function() + { + var xhr = new window.XMLHttpRequest(); + + // Start the progress bar + progressJs().start(); + + //Upload progress + xhr.upload.addEventListener("progress", function(evt){ + if (evt.lengthComputable) { + var percentComplete = evt.loaded / evt.total; + //Update the progress bar + progressJs().set(percentComplete); + } + }, false); + + return xhr; + }, + contentType: false, + processData: false, + type: 'POST', + url: URL, + data: formData, + success: function(data) { + + // Extract the last attachment section of the returned page + var attch = $(".attachment", $(data)).last(); + + // Create a new attachment section that will replace the current one + var attch_upload = $("#attachment_upload", $(data)); + + // The last img tag in this html snippet contains the source of the image which we need + // We first split the html based on img tags + var arr = attch.html().split("=+%fuOndSR^T$B28eVjfJ3x z98w@iuRX>I=(=!&_7J2{S|R#JTG}OdXQl@(8PbWJIDp!B87!7F-+SNt-Zx9}*BdwZ ze})=-5CB5#FQT>B!2|>#rNnU@q!8>gJQgt4qP4~tgOXC>r&5gO^Z2P0Qp$Zzz!<|` zyUkXs#a_GJO`zcW6qc6sJ{La}TkpT`gi+LOfs&G^u3TXxm13{eA_xMEG54kLiwFDl zNQtJTl=ztpem>7mw{irD2(2;f-Mve=xyhg3dv9NRaQ@;&V>}O=6xdC`T4JqC7 zhutv5bsTKMo`UZ9X=6YscHVhM7_Aw5`e_$<23Se<{u=oGzi-@#KHJ&ddC#_}^t@V8{1dfz=O5rJmBPHSGKyZyxV9rZZ{f@+vhJ_c=yGtSEsjkcD^zJAq2{CC}gu#N+l|# z5`}CQZ_57qSpnyt{ev` zB|<4uz7O|Q?frs^@uZe*XEd#Qgl-E*#(o(rn zsW6t$llDAPu1hhOqckyrIDY)8nG+|jjuwlAVMwRlCXOPO>-7oO_x~tnXVZ*~Aceqa z-4~%8^Z{!vB%_q~eI^bbL@X@KR3Clxr88&GUUo8>TVj6xa%pOc?@UZ^s8pg{sUS|C zoGw=?*S~x0n24jOOLH<&%5nHnz5adRHx!HbsZ?K(2!ZUWu{WPm2t1`YFfxLu)%;AM zu=;~q&7T|}=f{^Wm8*vjuZo$ORdwoAIep{^;>3w`I-h_0)Z$_>iX!4T?w=LMF`Z6_ zobR)+xcCz>KK{J#d0njyS#iRE0F+V`vRT~GQGl1vJn_T~#?Xmlgb*w)EbvIRdikS9 z6%PN?B4H)9vhETt2DQ_f9ZB7Y0(-o|-~y-PearsOzoAj~(mY9Z~d!h8~cBwYI+w8&Trd`Ah~eIq8p< zN~^WmSwBwhhWo`=8OwvBC(J=B?=yh4cuJ8k6keX6o15vi?dF? z+8BZ$;BKo$_0XYbqd2DBZa=W6-!|HDOb`Tp=T+Jmc6WFA?9)%#OYCxeeZBkD@@?+@ zuZh?gnnA$s?k?IGl-8P!jSXxV?(aX6d*bicucJK=X^bK0bpDsv00f;5#u&t{x8A~Z zI>cd!?sWEr_Ms30$MaC>G}7}>LI|Yi;VOl@-{1pDh~#tazoZSVS5)iOH~;_uC3Hnt zbYx+4WjbSWWnpw>05UK!Gc7PSEiy1vF)=zYH##shD=;!TFfjJwrbz$*03~!qSaf7z zbY(hiZ)9m^c>ppnF*7YNHZ3wRR539+FgH3dG%GMNIxsMYzaI4f000?uMObuGZ)S9N nVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs00000NkvXXu0mjf#s^6C literal 0 HcmV?d00001 diff --git a/scripts/ckeditor/plugins/image2/icons/image.png b/scripts/ckeditor/plugins/image2/icons/image.png new file mode 100755 index 0000000000000000000000000000000000000000..fcf61b5f2b3a81f75b39d204faad07b05145b5e0 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_D|i6R)R>V~EA+xswh3Zx;w0t^dB=S4y4LTZKvAL7dH7QcGotjs|mb zyPl5EPd1%1H4W!-?H!JL$?iJbcV(wj5|f~!prV(K`i*n<|G#z!+PJ03?q%-#cO~EN zojiJ!b>8#D9!Hl7z7WypGNGXl+Y>!RTv;4Hta)U)?6T(f@82gpw`};w|JmlaMDmLg zs})%vh15Ko4A~yfNw$$=c2O!)Q7Ts|VsZJOG;3MEIm3o)OivCReD^M|1_%PCJ#AmT zTKm+dBNENeD?2#mJ-?W>b%x*a4vu{t0V1pnf9w8#dGch*?*04gqeNI81q4_a&!$b* z=whg-s8|rUK6!0z$yyDrY15{Kga%%94wYT?>S2M!lV87P>6{J-Z74r*(Z_xD)k~Xn z7V3DP#jtUihmRWJgz{Ta4(x*_DTMSB{ zR)wvuef_oS;!C8<`)MX5lF!N|bSSl7T@*T5vi(A>(v7>KkDjI0a{e3$G7rX(Z{ zx%nxXX_dG&*!*NZ0@NT0vLQG>t)x7$D3zhSyj(9cFS|H7u^?41zbJk7I~ysWA_h-a KKbLh*2~7a{_eSsl literal 0 HcmV?d00001 diff --git a/scripts/ckeditor/plugins/image2/lang/af.js b/scripts/ckeditor/plugins/image2/lang/af.js new file mode 100755 index 00000000..508a6dbd --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/af.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'af', { + alt: 'Alternatiewe teks', + btnUpload: 'Stuur na bediener', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Afbeelding informasie', + lockRatio: 'Vaste proporsie', + menu: 'Afbeelding eienskappe', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Herstel grootte', + resizer: 'Click and drag to resize', // MISSING + title: 'Afbeelding eienskappe', + uploadTab: 'Oplaai', + urlMissing: 'Die URL na die afbeelding ontbreek.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ar.js b/scripts/ckeditor/plugins/image2/lang/ar.js new file mode 100755 index 00000000..ba03dcde --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ar.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ar', { + alt: 'عنوان الصورة', + btnUpload: 'أرسلها للخادم', + captioned: 'صورة ذات اسم', + captionPlaceholder: 'تسمية', + infoTab: 'معلومات الصورة', + lockRatio: 'تناسق الحجم', + menu: 'خصائص الصورة', + pathName: 'صورة', + pathNameCaption: 'تسمية', + resetSize: 'إستعادة الحجم الأصلي', + resizer: 'انقر ثم اسحب للتحجيم', + title: 'خصائص الصورة', + uploadTab: 'رفع', + urlMissing: 'عنوان مصدر الصورة مفقود' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/bg.js b/scripts/ckeditor/plugins/image2/lang/bg.js new file mode 100755 index 00000000..c36695c4 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/bg.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'bg', { + alt: 'Алтернативен текст', + btnUpload: 'Изпрати я на сървъра', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Инфо за снимка', + lockRatio: 'Заключване на съотношението', + menu: 'Настройки за снимка', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Нулиране на размер', + resizer: 'Click and drag to resize', // MISSING + title: 'Настройки за снимка', + uploadTab: 'Качване', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/bn.js b/scripts/ckeditor/plugins/image2/lang/bn.js new file mode 100755 index 00000000..d9751e02 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/bn.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'bn', { + alt: 'বিকল্প টেক্সট', + btnUpload: 'ইহাকে সার্ভারে প্রেরন কর', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'ছবির তথ্য', + lockRatio: 'অনুপাত লক কর', + menu: 'ছবির প্রোপার্টি', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'সাইজ পূর্বাবস্থায় ফিরিয়ে দাও', + resizer: 'Click and drag to resize', // MISSING + title: 'ছবির প্রোপার্টি', + uploadTab: 'আপলোড', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/bs.js b/scripts/ckeditor/plugins/image2/lang/bs.js new file mode 100755 index 00000000..e8c23a8b --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/bs.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'bs', { + alt: 'Tekst na slici', + btnUpload: 'Šalji na server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Info slike', + lockRatio: 'Zakljuèaj odnos', + menu: 'Svojstva slike', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Resetuj dimenzije', + resizer: 'Click and drag to resize', // MISSING + title: 'Svojstva slike', + uploadTab: 'Šalji', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ca.js b/scripts/ckeditor/plugins/image2/lang/ca.js new file mode 100755 index 00000000..73aae032 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ca.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ca', { + alt: 'Text alternatiu', + btnUpload: 'Envia-la al servidor', + captioned: 'Imatge amb subtítol', + captionPlaceholder: 'Títol', + infoTab: 'Informació de la imatge', + lockRatio: 'Bloqueja les proporcions', + menu: 'Propietats de la imatge', + pathName: 'imatge', + pathNameCaption: 'subtítol', + resetSize: 'Restaura la mida', + resizer: 'Clicar i arrossegar per redimensionar', + title: 'Propietats de la imatge', + uploadTab: 'Puja', + urlMissing: 'Falta la URL de la imatge.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/cs.js b/scripts/ckeditor/plugins/image2/lang/cs.js new file mode 100755 index 00000000..93cdbea2 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/cs.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'cs', { + alt: 'Alternativní text', + btnUpload: 'Odeslat na server', + captioned: 'Obrázek s popisem', + captionPlaceholder: 'Popis', + infoTab: 'Informace o obrázku', + lockRatio: 'Zámek', + menu: 'Vlastnosti obrázku', + pathName: 'Obrázek', + pathNameCaption: 'Popis', + resetSize: 'Původní velikost', + resizer: 'Klepněte a táhněte pro změnu velikosti', + title: 'Vlastnosti obrázku', + uploadTab: 'Odeslat', + urlMissing: 'Zadané URL zdroje obrázku nebylo nalezeno.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/cy.js b/scripts/ckeditor/plugins/image2/lang/cy.js new file mode 100755 index 00000000..c4ec6667 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/cy.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'cy', { + alt: 'Testun Amgen', + btnUpload: 'Anfon i\'r Gweinydd', + captioned: 'Delwedd â phennawd', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Gwyb Delwedd', + lockRatio: 'Cloi Cymhareb', + menu: 'Priodweddau Delwedd', + pathName: 'delwedd', + pathNameCaption: 'pennawd', + resetSize: 'Ailosod Maint', + resizer: 'Clicio a llusgo i ail-meintio', + title: 'Priodweddau Delwedd', + uploadTab: 'Lanlwytho', + urlMissing: 'URL gwreiddiol y ddelwedd ar goll.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/da.js b/scripts/ckeditor/plugins/image2/lang/da.js new file mode 100755 index 00000000..6b33f7fb --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/da.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'da', { + alt: 'Alternativ tekst', + btnUpload: 'Upload fil til serveren', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Generelt', + lockRatio: 'Lås størrelsesforhold', + menu: 'Egenskaber for billede', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Nulstil størrelse', + resizer: 'Click and drag to resize', // MISSING + title: 'Egenskaber for billede', + uploadTab: 'Upload', + urlMissing: 'Kilde på billed-URL mangler' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/de.js b/scripts/ckeditor/plugins/image2/lang/de.js new file mode 100755 index 00000000..44efc429 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/de.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'de', { + alt: 'Alternativer Text', + btnUpload: 'Zum Server senden', + captioned: 'Bild mit Überschrift', + captionPlaceholder: 'Überschrift', + infoTab: 'Bild-Info', + lockRatio: 'Größenverhältnis beibehalten', + menu: 'Bild-Eigenschaften', + pathName: 'Bild', + pathNameCaption: 'Überschrift', + resetSize: 'Größe zurücksetzen', + resizer: 'Zum vergrößern anwählen und ziehen', + title: 'Bild-Eigenschaften', + uploadTab: 'Hochladen', + urlMissing: 'Imagequelle URL fehlt.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/el.js b/scripts/ckeditor/plugins/image2/lang/el.js new file mode 100755 index 00000000..e32dea22 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/el.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'el', { + alt: 'Εναλλακτικό Κείμενο', + btnUpload: 'Αποστολή στον Διακομιστή', + captioned: 'Εικόνα με λεζάντα', + captionPlaceholder: 'Λεζάντα', + infoTab: 'Πληροφορίες Εικόνας', + lockRatio: 'Κλείδωμα Αναλογίας', + menu: 'Ιδιότητες Εικόνας', + pathName: 'εικόνα', + pathNameCaption: 'λεζάντα', + resetSize: 'Επαναφορά Αρχικού Μεγέθους', + resizer: 'Κάνετε κλικ και σύρετε το ποντίκι για να αλλάξετε το μέγεθος', + title: 'Ιδιότητες Εικόνας', + uploadTab: 'Αποστολή', + urlMissing: 'Λείπει το πηγαίο URL της εικόνας.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/en-au.js b/scripts/ckeditor/plugins/image2/lang/en-au.js new file mode 100755 index 00000000..b99d9f86 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/en-au.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'en-au', { + alt: 'Alternative Text', + btnUpload: 'Send it to the Server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Image Info', + lockRatio: 'Lock Ratio', + menu: 'Image Properties', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Reset Size', + resizer: 'Click and drag to resize', // MISSING + title: 'Image Properties', + uploadTab: 'Upload', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/en-ca.js b/scripts/ckeditor/plugins/image2/lang/en-ca.js new file mode 100755 index 00000000..a97ff9aa --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/en-ca.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'en-ca', { + alt: 'Alternative Text', + btnUpload: 'Send it to the Server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Image Info', + lockRatio: 'Lock Ratio', + menu: 'Image Properties', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Reset Size', + resizer: 'Click and drag to resize', // MISSING + title: 'Image Properties', + uploadTab: 'Upload', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/en-gb.js b/scripts/ckeditor/plugins/image2/lang/en-gb.js new file mode 100755 index 00000000..eb1d09e9 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/en-gb.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'en-gb', { + alt: 'Alternative Text', + btnUpload: 'Send it to the Server', + captioned: 'Captioned image', + captionPlaceholder: 'Caption', + infoTab: 'Image Info', + lockRatio: 'Lock Ratio', + menu: 'Image Properties', + pathName: 'image', + pathNameCaption: 'caption', + resetSize: 'Reset Size', + resizer: 'Click and drag to resize', + title: 'Image Properties', + uploadTab: 'Upload', + urlMissing: 'Image source URL is missing.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/en.js b/scripts/ckeditor/plugins/image2/lang/en.js new file mode 100755 index 00000000..e5eacca0 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/en.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'en', { + alt: 'Alternative Text', + btnUpload: 'Send it to the Server', + captioned: 'Captioned image', + captionPlaceholder: 'Caption', + infoTab: 'Image Info', + lockRatio: 'Lock Ratio', + menu: 'Image Properties', + pathName: 'image', + pathNameCaption: 'caption', + resetSize: 'Reset Size', + resizer: 'Click and drag to resize', + title: 'Image Properties', + uploadTab: 'Upload', + urlMissing: 'Image source URL is missing.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/eo.js b/scripts/ckeditor/plugins/image2/lang/eo.js new file mode 100755 index 00000000..85fe03e9 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/eo.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'eo', { + alt: 'Anstataŭiga Teksto', + btnUpload: 'Sendu al Servilo', + captioned: 'Bildo kun apudskribo', + captionPlaceholder: 'Apudskribo', + infoTab: 'Informoj pri Bildo', + lockRatio: 'Konservi Proporcion', + menu: 'Atributoj de Bildo', + pathName: 'bildo', + pathNameCaption: 'apudskribo', + resetSize: 'Origina Grando', + resizer: 'Kliki kaj treni por ŝanĝi la grandon', + title: 'Atributoj de Bildo', + uploadTab: 'Alŝuti', + urlMissing: 'La fontretadreso de la bildo mankas.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/es.js b/scripts/ckeditor/plugins/image2/lang/es.js new file mode 100755 index 00000000..39f54f95 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/es.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'es', { + alt: 'Texto Alternativo', + btnUpload: 'Enviar al Servidor', + captioned: 'Imagen subtitulada', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Información de Imagen', + lockRatio: 'Proporcional', + menu: 'Propiedades de Imagen', + pathName: 'image', + pathNameCaption: 'subtítulo', + resetSize: 'Tamaño Original', + resizer: 'Dar clic y arrastrar para cambiar tamaño', + title: 'Propiedades de Imagen', + uploadTab: 'Cargar', + urlMissing: 'Debe indicar la URL de la imagen.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/et.js b/scripts/ckeditor/plugins/image2/lang/et.js new file mode 100755 index 00000000..ae42afcb --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/et.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'et', { + alt: 'Alternatiivne tekst', + btnUpload: 'Saada serverisse', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Pildi info', + lockRatio: 'Lukusta kuvasuhe', + menu: 'Pildi omadused', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Lähtesta suurus', + resizer: 'Click and drag to resize', // MISSING + title: 'Pildi omadused', + uploadTab: 'Lae üles', + urlMissing: 'Pildi lähte-URL on puudu.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/eu.js b/scripts/ckeditor/plugins/image2/lang/eu.js new file mode 100755 index 00000000..38113d18 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/eu.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'eu', { + alt: 'Ordezko Testua', + btnUpload: 'Zerbitzarira bidalia', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Irudi informazioa', + lockRatio: 'Erlazioa Blokeatu', + menu: 'Irudi Ezaugarriak', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Tamaina Berrezarri', + resizer: 'Click and drag to resize', // MISSING + title: 'Irudi Ezaugarriak', + uploadTab: 'Gora kargatu', + urlMissing: 'Irudiaren iturburu URL-a falta da.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/fa.js b/scripts/ckeditor/plugins/image2/lang/fa.js new file mode 100755 index 00000000..f7a2162e --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/fa.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'fa', { + alt: 'متن جایگزین', + btnUpload: 'به سرور بفرست', + captioned: 'تصویر زیرنویس شده', + captionPlaceholder: 'عنوان', + infoTab: 'اطلاعات تصویر', + lockRatio: 'قفل کردن نسبت', + menu: 'ویژگی​های تصویر', + pathName: 'تصویر', + pathNameCaption: 'عنوان', + resetSize: 'بازنشانی اندازه', + resizer: 'کلیک و کشیدن برای تغییر اندازه', + title: 'ویژگی​های تصویر', + uploadTab: 'بالاگذاری', + urlMissing: 'آدرس URL اصلی تصویر یافت نشد.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/fi.js b/scripts/ckeditor/plugins/image2/lang/fi.js new file mode 100755 index 00000000..d4235793 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/fi.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'fi', { + alt: 'Vaihtoehtoinen teksti', + btnUpload: 'Lähetä palvelimelle', + captioned: 'Kuva kuvatekstillä', + captionPlaceholder: 'Kuvateksti', + infoTab: 'Kuvan tiedot', + lockRatio: 'Lukitse suhteet', + menu: 'Kuvan ominaisuudet', + pathName: 'kuva', + pathNameCaption: 'kuvateksti', + resetSize: 'Alkuperäinen koko', + resizer: 'Klikkaa ja raahaa muuttaaksesi kokoa', + title: 'Kuvan ominaisuudet', + uploadTab: 'Lisää tiedosto', + urlMissing: 'Kuvan lähdeosoite puuttuu.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/fo.js b/scripts/ckeditor/plugins/image2/lang/fo.js new file mode 100755 index 00000000..642e073b --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/fo.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'fo', { + alt: 'Alternativur tekstur', + btnUpload: 'Send til ambætaran', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Myndaupplýsingar', + lockRatio: 'Læs lutfallið', + menu: 'Myndaeginleikar', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Upprunastødd', + resizer: 'Click and drag to resize', // MISSING + title: 'Myndaeginleikar', + uploadTab: 'Send til ambætaran', + urlMissing: 'URL til mynd manglar.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/fr-ca.js b/scripts/ckeditor/plugins/image2/lang/fr-ca.js new file mode 100755 index 00000000..859db2c7 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/fr-ca.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'fr-ca', { + alt: 'Texte alternatif', + btnUpload: 'Envoyer sur le serveur', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Informations sur l\'image2', + lockRatio: 'Verrouiller les proportions', + menu: 'Propriétés de l\'image2', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Taille originale', + resizer: 'Click and drag to resize', // MISSING + title: 'Propriétés de l\'image2', + uploadTab: 'Téléverser', + urlMissing: 'L\'URL de la source de l\'image est manquant.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/fr.js b/scripts/ckeditor/plugins/image2/lang/fr.js new file mode 100755 index 00000000..6ca1d59f --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/fr.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'fr', { + alt: 'Texte de remplacement', + btnUpload: 'Envoyer sur le serveur', + captioned: 'Image légendée', + captionPlaceholder: 'Légende', + infoTab: 'Informations sur l\'image2', + lockRatio: 'Conserver les proportions', + menu: 'Propriétés de l\'image2', + pathName: 'image', + pathNameCaption: 'légende', + resetSize: 'Taille d\'origine', + resizer: 'Cliquer et glisser pour redimensionner', + title: 'Propriétés de l\'image2', + uploadTab: 'Envoyer', + urlMissing: 'L\'adresse source de l\'image est manquante.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/gl.js b/scripts/ckeditor/plugins/image2/lang/gl.js new file mode 100755 index 00000000..d70f1cb8 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/gl.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'gl', { + alt: 'Texto alternativo', + btnUpload: 'Enviar ao servidor', + captioned: 'Imaxe subtitulada ', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Información da imaxe', + lockRatio: 'Proporcional', + menu: 'Propiedades da imaxe', + pathName: 'Imaxe', + pathNameCaption: 'subtítulo', + resetSize: 'Tamaño orixinal', + resizer: 'Prema e arrastre para axustar o tamaño', + title: 'Propiedades da imaxe', + uploadTab: 'Cargar', + urlMissing: 'Non se atopa o URL da imaxe.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/gu.js b/scripts/ckeditor/plugins/image2/lang/gu.js new file mode 100755 index 00000000..2f070605 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/gu.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'gu', { + alt: 'ઑલ્ટર્નટ ટેક્સ્ટ', + btnUpload: 'આ સર્વરને મોકલવું', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'ચિત્ર ની જાણકારી', + lockRatio: 'લૉક ગુણોત્તર', + menu: 'ચિત્રના ગુણ', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'રીસેટ સાઇઝ', + resizer: 'Click and drag to resize', // MISSING + title: 'ચિત્રના ગુણ', + uploadTab: 'અપલોડ', + urlMissing: 'ઈમેજની મૂળ URL છે નહી.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/he.js b/scripts/ckeditor/plugins/image2/lang/he.js new file mode 100755 index 00000000..86350ae3 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/he.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'he', { + alt: 'טקסט חלופי', + btnUpload: 'שליחה לשרת', + captioned: 'כותרת תמונה', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'מידע על התמונה', + lockRatio: 'נעילת היחס', + menu: 'תכונות התמונה', + pathName: 'תמונה', + pathNameCaption: 'כותרת', + resetSize: 'איפוס הגודל', + resizer: 'לחץ וגרור לשינוי הגודל', + title: 'מאפייני התמונה', + uploadTab: 'העלאה', + urlMissing: 'כתובת התמונה חסרה.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/hi.js b/scripts/ckeditor/plugins/image2/lang/hi.js new file mode 100755 index 00000000..02b85434 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/hi.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'hi', { + alt: 'वैकल्पिक टेक्स्ट', + btnUpload: 'इसे सर्वर को भेजें', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'तस्वीर की जानकारी', + lockRatio: 'लॉक अनुपात', + menu: 'तस्वीर प्रॉपर्टीज़', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'रीसॅट साइज़', + resizer: 'Click and drag to resize', // MISSING + title: 'तस्वीर प्रॉपर्टीज़', + uploadTab: 'अपलोड', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/hr.js b/scripts/ckeditor/plugins/image2/lang/hr.js new file mode 100755 index 00000000..41ec7e77 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/hr.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'hr', { + alt: 'Alternativni tekst', + btnUpload: 'Pošalji na server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Info slike', + lockRatio: 'Zaključaj odnos', + menu: 'Svojstva slika', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Obriši veličinu', + resizer: 'Click and drag to resize', // MISSING + title: 'Svojstva slika', + uploadTab: 'Pošalji', + urlMissing: 'Nedostaje URL slike.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/hu.js b/scripts/ckeditor/plugins/image2/lang/hu.js new file mode 100755 index 00000000..8c6b2fee --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/hu.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'hu', { + alt: 'Buborék szöveg', + btnUpload: 'Küldés a szerverre', + captioned: 'Feliratozott kép', + captionPlaceholder: 'Képfelirat', + infoTab: 'Alaptulajdonságok', + lockRatio: 'Arány megtartása', + menu: 'Kép tulajdonságai', + pathName: 'kép', + pathNameCaption: 'felirat', + resetSize: 'Eredeti méret', + resizer: 'Kattints és húzz az átméretezéshez', + title: 'Kép tulajdonságai', + uploadTab: 'Feltöltés', + urlMissing: 'Hiányzik a kép URL-je' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/id.js b/scripts/ckeditor/plugins/image2/lang/id.js new file mode 100755 index 00000000..15bd8191 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/id.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'id', { + alt: 'Teks alternatif', + btnUpload: 'Kirim ke Server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Info Gambar', + lockRatio: 'Lock Ratio', // MISSING + menu: 'Image Properties', // MISSING + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Reset Size', // MISSING + resizer: 'Click and drag to resize', // MISSING + title: 'Image Properties', // MISSING + uploadTab: 'Unggah', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/is.js b/scripts/ckeditor/plugins/image2/lang/is.js new file mode 100755 index 00000000..cb3eb9d4 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/is.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'is', { + alt: 'Baklægur texti', + btnUpload: 'Hlaða upp', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Almennt', + lockRatio: 'Festa stærðarhlutfall', + menu: 'Eigindi myndar', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Reikna stærð', + resizer: 'Click and drag to resize', // MISSING + title: 'Eigindi myndar', + uploadTab: 'Senda upp', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/it.js b/scripts/ckeditor/plugins/image2/lang/it.js new file mode 100755 index 00000000..b704ccf7 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/it.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'it', { + alt: 'Testo alternativo', + btnUpload: 'Invia al server', + captioned: 'Immagine con didascalia', + captionPlaceholder: 'Didascalia', + infoTab: 'Informazioni immagine', + lockRatio: 'Blocca rapporto', + menu: 'Proprietà immagine', + pathName: 'immagine', + pathNameCaption: 'didascalia', + resetSize: 'Reimposta dimensione', + resizer: 'Fare clic e trascinare per ridimensionare', + title: 'Proprietà immagine', + uploadTab: 'Carica', + urlMissing: 'Manca l\'URL dell\'immagine.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ja.js b/scripts/ckeditor/plugins/image2/lang/ja.js new file mode 100755 index 00000000..862f0a1f --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ja.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ja', { + alt: '代替テキスト', + btnUpload: 'サーバーに送信', + captioned: 'キャプションを付ける', + captionPlaceholder: 'キャプション', + infoTab: '画像情報', + lockRatio: '比率を固定', + menu: '画像のプロパティ', + pathName: 'image', + pathNameCaption: 'caption', + resetSize: 'サイズをリセット', + resizer: 'ドラッグしてリサイズ', + title: '画像のプロパティ', + uploadTab: 'アップロード', + urlMissing: '画像のURLを入力してください。' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ka.js b/scripts/ckeditor/plugins/image2/lang/ka.js new file mode 100755 index 00000000..22b54502 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ka.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ka', { + alt: 'სანაცვლო ტექსტი', + btnUpload: 'სერვერისთვის გაგზავნა', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'სურათის ინფორმცია', + lockRatio: 'პროპორციის შენარჩუნება', + menu: 'სურათის პარამეტრები', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'ზომის დაბრუნება', + resizer: 'Click and drag to resize', // MISSING + title: 'სურათის პარამეტრები', + uploadTab: 'აქაჩვა', + urlMissing: 'სურათის URL არაა შევსებული.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/km.js b/scripts/ckeditor/plugins/image2/lang/km.js new file mode 100755 index 00000000..fb5818bb --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/km.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'km', { + alt: 'អត្ថបទជំនួស', + btnUpload: 'បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា', + captioned: 'រូប​ដែល​មាន​ចំណង​ជើង', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'ពត៌មានអំពីរូបភាព', + lockRatio: 'ចាក់​សោ​ផល​ធៀប', + menu: 'លក្ខណៈ​សម្បត្តិ​រូប​ភាព', + pathName: 'រូបភាព', + pathNameCaption: 'ចំណងជើង', + resetSize: 'កំណត់ទំហំឡើងវិញ', + resizer: 'ចុច​ហើយ​ទាញ​ដើម្បី​ប្ដូរ​ទំហំ', + title: 'លក្ខណៈ​សម្បត្តិ​រូប​ភាប', + uploadTab: 'ផ្ទុក​ឡើង', + urlMissing: 'ខ្វះ URL ប្រភព​រូប​ភាព។' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ko.js b/scripts/ckeditor/plugins/image2/lang/ko.js new file mode 100755 index 00000000..4e423027 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ko.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ko', { + alt: '이미지 설명', + btnUpload: '서버로 전송', + captioned: '이미지 설명 넣기', + captionPlaceholder: 'Caption', // MISSING + infoTab: '이미지 정보', + lockRatio: '비율 유지', + menu: '이미지 설정', + pathName: '이미지', + pathNameCaption: '이미지 설명', + resetSize: '원래 크기로', + resizer: '크기를 조절하려면 클릭 후 드래그 하세요', + title: '이미지 설정', + uploadTab: '업로드', + urlMissing: '이미지 소스 URL이 없습니다.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ku.js b/scripts/ckeditor/plugins/image2/lang/ku.js new file mode 100755 index 00000000..52c566cd --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ku.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ku', { + alt: 'جێگرەوەی دەق', + btnUpload: 'ناردنی بۆ ڕاژه', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'زانیاری وێنه', + lockRatio: 'داخستنی ڕێژه', + menu: 'خاسیەتی وێنه', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'ڕێکخستنەوەی قەباره', + resizer: 'Click and drag to resize', // MISSING + title: 'خاسیەتی وێنه', + uploadTab: 'بارکردن', + urlMissing: 'سەرچاوەی بەستەری وێنه بزره' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/lt.js b/scripts/ckeditor/plugins/image2/lang/lt.js new file mode 100755 index 00000000..369f60a4 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/lt.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'lt', { + alt: 'Alternatyvus Tekstas', + btnUpload: 'Siųsti į serverį', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Vaizdo informacija', + lockRatio: 'Išlaikyti proporciją', + menu: 'Vaizdo savybės', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Atstatyti dydį', + resizer: 'Click and drag to resize', // MISSING + title: 'Vaizdo savybės', + uploadTab: 'Siųsti', + urlMissing: 'Paveiksliuko nuorodos nėra.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/lv.js b/scripts/ckeditor/plugins/image2/lang/lv.js new file mode 100755 index 00000000..2ba6851c --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/lv.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'lv', { + alt: 'Alternatīvais teksts', + btnUpload: 'Nosūtīt serverim', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Informācija par attēlu', + lockRatio: 'Nemainīga Augstuma/Platuma attiecība', + menu: 'Attēla īpašības', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Atjaunot sākotnējo izmēru', + resizer: 'Click and drag to resize', // MISSING + title: 'Attēla īpašības', + uploadTab: 'Augšupielādēt', + urlMissing: 'Trūkst attēla atrašanās adrese.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/mk.js b/scripts/ckeditor/plugins/image2/lang/mk.js new file mode 100755 index 00000000..4e81a85b --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/mk.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'mk', { + alt: 'Alternative Text', // MISSING + btnUpload: 'Send it to the Server', // MISSING + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Image Info', // MISSING + lockRatio: 'Lock Ratio', // MISSING + menu: 'Image Properties', // MISSING + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Reset Size', // MISSING + resizer: 'Click and drag to resize', // MISSING + title: 'Image Properties', // MISSING + uploadTab: 'Upload', // MISSING + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/mn.js b/scripts/ckeditor/plugins/image2/lang/mn.js new file mode 100755 index 00000000..f67e4056 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/mn.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'mn', { + alt: 'Зургийг орлох бичвэр', + btnUpload: 'Үүнийг сервэррүү илгээ', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Зурагны мэдээлэл', + lockRatio: 'Радио түгжих', + menu: 'Зураг', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'хэмжээ дахин оноох', + resizer: 'Click and drag to resize', // MISSING + title: 'Зураг', + uploadTab: 'Илгээж ачаалах', + urlMissing: 'Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ms.js b/scripts/ckeditor/plugins/image2/lang/ms.js new file mode 100755 index 00000000..f6596260 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ms.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ms', { + alt: 'Text Alternatif', + btnUpload: 'Hantar ke Server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Info Imej', + lockRatio: 'Tetapkan Nisbah', + menu: 'Ciri-ciri Imej', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Saiz Set Semula', + resizer: 'Click and drag to resize', // MISSING + title: 'Ciri-ciri Imej', + uploadTab: 'Muat Naik', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/nb.js b/scripts/ckeditor/plugins/image2/lang/nb.js new file mode 100755 index 00000000..aef66100 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/nb.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'nb', { + alt: 'Alternativ tekst', + btnUpload: 'Send det til serveren', + captioned: 'Bilde med bildetekst', + captionPlaceholder: 'Bildetekst', + infoTab: 'Bildeinformasjon', + lockRatio: 'Lås forhold', + menu: 'Bildeegenskaper', + pathName: 'bilde', + pathNameCaption: 'bildetekst', + resetSize: 'Tilbakestill størrelse', + resizer: 'Klikk og dra for å endre størrelse', + title: 'Bildeegenskaper', + uploadTab: 'Last opp', + urlMissing: 'Bildets adresse mangler.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/nl.js b/scripts/ckeditor/plugins/image2/lang/nl.js new file mode 100755 index 00000000..39667ace --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/nl.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'nl', { + alt: 'Alternatieve tekst', + btnUpload: 'Naar server verzenden', + captioned: 'Afbeelding met onderschrift', + captionPlaceholder: 'Onderschrift', + infoTab: 'Afbeeldingsinformatie', + lockRatio: 'Verhouding vergrendelen', + menu: 'Eigenschappen afbeelding', + pathName: 'afbeelding', + pathNameCaption: 'onderschrift', + resetSize: 'Afmetingen herstellen', + resizer: 'Klik en sleep om te herschalen', + title: 'Afbeeldingseigenschappen', + uploadTab: 'Uploaden', + urlMissing: 'De URL naar de afbeelding ontbreekt.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/no.js b/scripts/ckeditor/plugins/image2/lang/no.js new file mode 100755 index 00000000..8f823ae5 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/no.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'no', { + alt: 'Alternativ tekst', + btnUpload: 'Send det til serveren', + captioned: 'Bilde med bildetekst', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Bildeinformasjon', + lockRatio: 'Lås forhold', + menu: 'Bildeegenskaper', + pathName: 'bilde', + pathNameCaption: 'bildetekst', + resetSize: 'Tilbakestill størrelse', + resizer: 'Klikk og dra for å endre størrelse', + title: 'Bildeegenskaper', + uploadTab: 'Last opp', + urlMissing: 'Bildets adresse mangler.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/pl.js b/scripts/ckeditor/plugins/image2/lang/pl.js new file mode 100755 index 00000000..aa38b4d6 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/pl.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'pl', { + alt: 'Tekst zastępczy', + btnUpload: 'Wyślij', + captioned: 'Obrazek z podpisem', + captionPlaceholder: 'Podpis', + infoTab: 'Informacje o obrazku', + lockRatio: 'Zablokuj proporcje', + menu: 'Właściwości obrazka', + pathName: 'obrazek', + pathNameCaption: 'podpis', + resetSize: 'Przywróć rozmiar', + resizer: 'Kliknij i przeciągnij, by zmienić rozmiar.', + title: 'Właściwości obrazka', + uploadTab: 'Wyślij', + urlMissing: 'Podaj adres URL obrazka.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/pt-br.js b/scripts/ckeditor/plugins/image2/lang/pt-br.js new file mode 100755 index 00000000..d3cd5a5b --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/pt-br.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'pt-br', { + alt: 'Texto Alternativo', + btnUpload: 'Enviar para o Servidor', + captioned: 'Legenda da Imagem', + captionPlaceholder: 'Legenda', + infoTab: 'Informações da Imagem', + lockRatio: 'Travar Proporções', + menu: 'Formatar Imagem', + pathName: 'Imagem', + pathNameCaption: 'Legenda', + resetSize: 'Redefinir para o Tamanho Original', + resizer: 'Click e arraste para redimensionar', + title: 'Formatar Imagem', + uploadTab: 'Enviar ao Servidor', + urlMissing: 'URL da imagem está faltando.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/pt.js b/scripts/ckeditor/plugins/image2/lang/pt.js new file mode 100755 index 00000000..5052750a --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/pt.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'pt', { + alt: 'Texto Alternativo', + btnUpload: 'Enviar para o Servidor', + captioned: 'Imagem Legendada', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Informação da Imagem', + lockRatio: 'Proporcional', + menu: 'Propriedades da Imagem', + pathName: 'imagem', + pathNameCaption: 'legenda', + resetSize: 'Tamanho Original', + resizer: 'Clique e arraste para redimensionar', + title: 'Propriedades da Imagem', + uploadTab: 'Enviar', + urlMissing: 'O URL da fonte da imagem está em falta.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ro.js b/scripts/ckeditor/plugins/image2/lang/ro.js new file mode 100755 index 00000000..29657226 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ro.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ro', { + alt: 'Text alternativ', + btnUpload: 'Trimite la server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Informaţii despre imagine', + lockRatio: 'Păstrează proporţiile', + menu: 'Proprietăţile imaginii', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Resetează mărimea', + resizer: 'Click and drag to resize', // MISSING + title: 'Proprietăţile imaginii', + uploadTab: 'Încarcă', + urlMissing: 'Sursa URL a imaginii lipsește.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ru.js b/scripts/ckeditor/plugins/image2/lang/ru.js new file mode 100755 index 00000000..517381fc --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ru.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ru', { + alt: 'Альтернативный текст', + btnUpload: 'Загрузить на сервер', + captioned: 'Захваченное изображение', + captionPlaceholder: 'Название', + infoTab: 'Данные об изображении', + lockRatio: 'Сохранять пропорции', + menu: 'Свойства изображения', + pathName: 'изображение', + pathNameCaption: 'захват', + resetSize: 'Вернуть обычные размеры', + resizer: 'Нажмите и растяните', + title: 'Свойства изображения', + uploadTab: 'Загрузка файла', + urlMissing: 'Не указана ссылка на изображение.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/si.js b/scripts/ckeditor/plugins/image2/lang/si.js new file mode 100755 index 00000000..090b123b --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/si.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'si', { + alt: 'විකල්ප ', + btnUpload: 'සේවාදායකය වෙත යොමුකිරිම', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'රුපයේ තොරතුරු', + lockRatio: 'නවතන අනුපාතය ', + menu: 'රුපයේ ගුණ', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'නැවතත් විශාලත්වය වෙනස් කිරීම', + resizer: 'Click and drag to resize', // MISSING + title: 'රුපයේ ', + uploadTab: 'උඩුගතකිරීම', + urlMissing: 'රුප මුලාශ්‍ර URL නැත.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/sk.js b/scripts/ckeditor/plugins/image2/lang/sk.js new file mode 100755 index 00000000..c57f8aba --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/sk.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'sk', { + alt: 'Alternatívny text', + btnUpload: 'Odoslať to na server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Informácie o obrázku', + lockRatio: 'Pomer zámky', + menu: 'Vlastnosti obrázka', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Pôvodná veľkosť', + resizer: 'Click and drag to resize', // MISSING + title: 'Vlastnosti obrázka', + uploadTab: 'Nahrať', + urlMissing: 'Chýba URL zdroja obrázka.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/sl.js b/scripts/ckeditor/plugins/image2/lang/sl.js new file mode 100755 index 00000000..6ae65654 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/sl.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'sl', { + alt: 'Nadomestno besedilo', + btnUpload: 'Pošlji na strežnik', + captioned: 'Podnaslovljena slika', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Podatki o sliki', + lockRatio: 'Zakleni razmerje', + menu: 'Lastnosti slike', + pathName: 'slika', + pathNameCaption: 'napis', + resetSize: 'Ponastavi velikost', + resizer: 'Kliknite in povlecite, da spremeniti velikost', + title: 'Lastnosti slike', + uploadTab: 'Naloži', + urlMissing: 'Manjka vir (URL) slike.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/sq.js b/scripts/ckeditor/plugins/image2/lang/sq.js new file mode 100755 index 00000000..b74f95b8 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/sq.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'sq', { + alt: 'Tekst Alternativ', + btnUpload: 'Dërgo në server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Informacione mbi Fotografinë', + lockRatio: 'Mbyll Racionin', + menu: 'Karakteristikat e Fotografisë', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Rikthe Madhësinë', + resizer: 'Click and drag to resize', // MISSING + title: 'Karakteristikat e Fotografisë', + uploadTab: 'Ngarko', + urlMissing: 'Mungon URL e burimit të fotografisë.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/sr-latn.js b/scripts/ckeditor/plugins/image2/lang/sr-latn.js new file mode 100755 index 00000000..672bc52d --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/sr-latn.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'sr-latn', { + alt: 'Alternativni tekst', + btnUpload: 'Pošalji na server', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Info slike', + lockRatio: 'Zaključaj odnos', + menu: 'Osobine slika', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Resetuj veličinu', + resizer: 'Click and drag to resize', // MISSING + title: 'Osobine slika', + uploadTab: 'Pošalji', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/sr.js b/scripts/ckeditor/plugins/image2/lang/sr.js new file mode 100755 index 00000000..d8abaf1a --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/sr.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'sr', { + alt: 'Алтернативни текст', + btnUpload: 'Пошаљи на сервер', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Инфо слике', + lockRatio: 'Закључај однос', + menu: 'Особине слика', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Ресетуј величину', + resizer: 'Click and drag to resize', // MISSING + title: 'Особине слика', + uploadTab: 'Пошаљи', + urlMissing: 'Недостаје УРЛ слике.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/sv.js b/scripts/ckeditor/plugins/image2/lang/sv.js new file mode 100755 index 00000000..824a319e --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/sv.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'sv', { + alt: 'Alternativ text', + btnUpload: 'Skicka till server', + captioned: 'Rubricerad bild', + captionPlaceholder: 'Bildtext', + infoTab: 'Bildinformation', + lockRatio: 'Lås höjd/bredd förhållanden', + menu: 'Bildegenskaper', + pathName: 'bild', + pathNameCaption: 'rubrik', + resetSize: 'Återställ storlek', + resizer: 'Klicka och drag för att ändra storlek', + title: 'Bildegenskaper', + uploadTab: 'Ladda upp', + urlMissing: 'Bildkällans URL saknas.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/th.js b/scripts/ckeditor/plugins/image2/lang/th.js new file mode 100755 index 00000000..e2a8ed82 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/th.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'th', { + alt: 'คำประกอบรูปภาพ', + btnUpload: 'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'ข้อมูลของรูปภาพ', + lockRatio: 'กำหนดอัตราส่วน กว้าง-สูง แบบคงที่', + menu: 'คุณสมบัติของ รูปภาพ', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'กำหนดรูปเท่าขนาดจริง', + resizer: 'Click and drag to resize', // MISSING + title: 'คุณสมบัติของ รูปภาพ', + uploadTab: 'อัพโหลดไฟล์', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/tr.js b/scripts/ckeditor/plugins/image2/lang/tr.js new file mode 100755 index 00000000..47126262 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/tr.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'tr', { + alt: 'Alternatif Yazı', + btnUpload: 'Sunucuya Yolla', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Resim Bilgisi', + lockRatio: 'Oranı Kilitle', + menu: 'Resim Özellikleri', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'Boyutu Başa Döndür', + resizer: 'Click and drag to resize', // MISSING + title: 'Resim Özellikleri', + uploadTab: 'Karşıya Yükle', + urlMissing: 'Resmin URL kaynağı eksiktir.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/tt.js b/scripts/ckeditor/plugins/image2/lang/tt.js new file mode 100755 index 00000000..9e4ee902 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/tt.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'tt', { + alt: 'Альтернатив текст', + btnUpload: 'Серверга җибәрү', + captioned: 'Исеме куелган рәсем', + captionPlaceholder: 'Исем', + infoTab: 'Рәсем тасвирламасы', + lockRatio: 'Lock Ratio', // MISSING + menu: 'Рәсем үзлекләре', + pathName: 'рәсем', + pathNameCaption: 'исем', + resetSize: 'Баштагы зурлык', + resizer: 'Күчереп куер өчен басып шудырыгыз', + title: 'Рәсем үзлекләре', + uploadTab: 'Йөкләү', + urlMissing: 'Image source URL is missing.' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/ug.js b/scripts/ckeditor/plugins/image2/lang/ug.js new file mode 100755 index 00000000..227ccbd2 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/ug.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'ug', { + alt: 'تېكىست ئالماشتۇر', + btnUpload: 'مۇلازىمېتىرغا يۈكلە', + captioned: 'Captioned image', // MISSING + captionPlaceholder: 'Caption', // MISSING + infoTab: 'سۈرەت', + lockRatio: 'نىسبەتنى قۇلۇپلا', + menu: 'سۈرەت خاسلىقى', + pathName: 'image', // MISSING + pathNameCaption: 'caption', // MISSING + resetSize: 'ئەسلى چوڭلۇق', + resizer: 'Click and drag to resize', // MISSING + title: 'سۈرەت خاسلىقى', + uploadTab: 'يۈكلە', + urlMissing: 'سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/uk.js b/scripts/ckeditor/plugins/image2/lang/uk.js new file mode 100755 index 00000000..22690a0c --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/uk.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'uk', { + alt: 'Альтернативний текст', + btnUpload: 'Надіслати на сервер', + captioned: 'Підписане зображення', + captionPlaceholder: 'Caption', // MISSING + infoTab: 'Інформація про зображення', + lockRatio: 'Зберегти пропорції', + menu: 'Властивості зображення', + pathName: 'Зображення', + pathNameCaption: 'заголовок', + resetSize: 'Очистити поля розмірів', + resizer: 'Клікніть та потягніть для зміни розмірів', + title: 'Властивості зображення', + uploadTab: 'Надіслати', + urlMissing: 'Вкажіть URL зображення.' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/vi.js b/scripts/ckeditor/plugins/image2/lang/vi.js new file mode 100755 index 00000000..17da3f5e --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/vi.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'vi', { + alt: 'Chú thích ảnh', + btnUpload: 'Tải lên máy chủ', + captioned: 'Ảnh có chú thích', + captionPlaceholder: 'Nhãn', + infoTab: 'Thông tin của ảnh', + lockRatio: 'Giữ nguyên tỷ lệ', + menu: 'Thuộc tính của ảnh', + pathName: 'ảnh', + pathNameCaption: 'chú thích', + resetSize: 'Kích thước gốc', + resizer: 'Kéo rê để thay đổi kích cỡ', + title: 'Thuộc tính của ảnh', + uploadTab: 'Tải lên', + urlMissing: 'Thiếu đường dẫn hình ảnh' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/zh-cn.js b/scripts/ckeditor/plugins/image2/lang/zh-cn.js new file mode 100755 index 00000000..cf92ff25 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/zh-cn.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'zh-cn', { + alt: '替换文本', + btnUpload: '上传到服务器', + captioned: '带标题图像', + captionPlaceholder: '标题', + infoTab: '图像信息', + lockRatio: '锁定比例', + menu: '图像属性', + pathName: '图像', + pathNameCaption: '标题', + resetSize: '原始尺寸', + resizer: '点击并拖拽以改变尺寸', + title: '图像属性', + uploadTab: '上传', + urlMissing: '缺少图像源文件地址' +} ); diff --git a/scripts/ckeditor/plugins/image2/lang/zh.js b/scripts/ckeditor/plugins/image2/lang/zh.js new file mode 100755 index 00000000..159d38b6 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/lang/zh.js @@ -0,0 +1,20 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'image2', 'zh', { + alt: '替代文字', + btnUpload: '傳送至伺服器', + captioned: '已加標題之圖片', + captionPlaceholder: 'Caption', // MISSING + infoTab: '影像資訊', + lockRatio: '固定比例', + menu: '影像屬性', + pathName: '圖片', + pathNameCaption: '標題', + resetSize: '重設大小', + resizer: '拖曳以改變大小', + title: '影像屬性', + uploadTab: '上傳', + urlMissing: '遺失圖片來源之 URL ' +} ); diff --git a/scripts/ckeditor/plugins/image2/plugin.js b/scripts/ckeditor/plugins/image2/plugin.js new file mode 100755 index 00000000..fa462405 --- /dev/null +++ b/scripts/ckeditor/plugins/image2/plugin.js @@ -0,0 +1,1580 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +'use strict'; + +( function() { + + var template = '', + templateBlock = new CKEDITOR.template( + '
' + + template + + '
{captionPlaceholder}
' + + '
' ), + alignmentsArr = [ 'left', 'center', 'right' ], + alignmentsObj = { left: 0, center: 1, right: 2 }, + regexPercent = /^\s*(\d+\%)\s*$/i; + + CKEDITOR.plugins.add( 'image2', { + lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + requires: 'widget,dialog', + icons: 'image', + hidpi: true, + + onLoad: function() { + CKEDITOR.addCss( + '.cke_image_nocaption{' + + // This is to remove unwanted space so resize + // wrapper is displayed property. + 'line-height:0' + + '}' + + '.cke_editable.cke_image_sw, .cke_editable.cke_image_sw *{cursor:sw-resize !important}' + + '.cke_editable.cke_image_se, .cke_editable.cke_image_se *{cursor:se-resize !important}' + + '.cke_image_resizer{' + + 'display:none;' + + 'position:absolute;' + + 'width:10px;' + + 'height:10px;' + + 'bottom:-5px;' + + 'right:-5px;' + + 'background:#000;' + + 'outline:1px solid #fff;' + + // Prevent drag handler from being misplaced (#11207). + 'line-height:0;' + + 'cursor:se-resize;' + + '}' + + '.cke_image_resizer_wrapper{' + + 'position:relative;' + + 'display:inline-block;' + + 'line-height:0;' + + '}' + + // Bottom-left corner style of the resizer. + '.cke_image_resizer.cke_image_resizer_left{' + + 'right:auto;' + + 'left:-5px;' + + 'cursor:sw-resize;' + + '}' + + '.cke_widget_wrapper:hover .cke_image_resizer,' + + '.cke_image_resizer.cke_image_resizing{' + + 'display:block' + + '}' + + // Expand widget wrapper when linked inline image. + '.cke_widget_wrapper>a{' + + 'display:inline-block' + + '}' ); + }, + + init: function( editor ) { + // Adapts configuration from original image plugin. Should be removed + // when we'll rename image2 to image. + var config = editor.config, + lang = editor.lang.image2, + image = widgetDef( editor ); + + // Since filebrowser plugin discovers config properties by dialog (plugin?) + // names (sic!), this hack will be necessary as long as Image2 is not named + // Image. And since Image2 will never be Image, for sure some filebrowser logic + // got to be refined. + config.filebrowserImage2BrowseUrl = config.filebrowserImageBrowseUrl; + config.filebrowserImage2UploadUrl = config.filebrowserImageUploadUrl; + + // Add custom elementspath names to widget definition. + image.pathName = lang.pathName; + image.editables.caption.pathName = lang.pathNameCaption; + + // Register the widget. + editor.widgets.add( 'image', image ); + + // Add toolbar button for this plugin. + editor.ui.addButton && editor.ui.addButton( 'Image', { + label: editor.lang.common.image, + command: 'image', + toolbar: 'insert,10' + } ); + + // Register context menu option for editing widget. + if ( editor.contextMenu ) { + editor.addMenuGroup( 'image', 10 ); + + editor.addMenuItem( 'image', { + label: lang.menu, + command: 'image', + group: 'image' + } ); + } + + CKEDITOR.dialog.add( 'image2', this.path + 'dialogs/image2.js' ); + }, + + afterInit: function( editor ) { + // Integrate with align commands (justify plugin). + var align = { left: 1, right: 1, center: 1, block: 1 }, + integrate = alignCommandIntegrator( editor ); + + for ( var value in align ) + integrate( value ); + + // Integrate with link commands (link plugin). + linkCommandIntegrator( editor ); + } + } ); + + // Wiget states (forms) depending on alignment and configuration. + // + // Non-captioned widget (inline styles) + // ┌──────┬───────────────────────────────┬─────────────────────────────┐ + // │Align │Internal form │Data │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │none │ │ + // │ │ │ │ + // │ │ │ │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │left │ │ + // │ │ │ │ + // │ │ │ │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │center│

│ + // │ │

│ + // │ │

│ + // │ │

│ │ + // │ │
│ │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │right │ │ + // │ │ │ │ + // │ │ │ │ + // └──────┴───────────────────────────────┴─────────────────────────────┘ + // + // Non-captioned widget (config.image2_alignClasses defined) + // ┌──────┬───────────────────────────────┬─────────────────────────────┐ + // │Align │Internal form │Data │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │none │ │ + // │ │ │ │ + // │ │ │ │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │left │ │ + // │ │ │ │ + // │ │ │ │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │center│

│ + // │ │

│ + // │ │

│ + // │ │

│ │ + // │ │
│ │ + // ├──────┼───────────────────────────────┼─────────────────────────────┤ + // │right │ │ + // │ │ │ │ + // │ │ │ │ + // └──────┴───────────────────────────────┴─────────────────────────────┘ + // + // Captioned widget (inline styles) + // ┌──────┬────────────────────────────────────────┬────────────────────────────────────────┐ + // │Align │Internal form │Data │ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │none │
│ + // │ │
│ │ + // │ │ │ │ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │left │
│ + // │ │
│ │ + // │ │ │ │ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │center│
│ + // │ │
│ + // │ │ │

│ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │right │
│ + // │ │
│ │ + // │ │ │ │ + // └──────┴────────────────────────────────────────┴────────────────────────────────────────┘ + // + // Captioned widget (config.image2_alignClasses defined) + // ┌──────┬────────────────────────────────────────┬────────────────────────────────────────┐ + // │Align │Internal form │Data │ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │none │
│ + // │ │
│ │ + // │ │ │ │ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │left │
│ + // │ │
│ │ + // │ │ │ │ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │center│
│ + // │ │
│ + // │ │ │

│ + // ├──────┼────────────────────────────────────────┼────────────────────────────────────────┤ + // │right │
│ + // │ │
│ │ + // │ │ │ │ + // └──────┴────────────────────────────────────────┴────────────────────────────────────────┘ + // + // @param {CKEDITOR.editor} + // @returns {Object} + function widgetDef( editor ) { + var alignClasses = editor.config.image2_alignClasses, + captionedClass = editor.config.image2_captionedClass; + + function deflate() { + if ( this.deflated ) + return; + + // Remember whether widget was focused before destroyed. + if ( editor.widgets.focused == this.widget ) + this.focused = true; + + editor.widgets.destroy( this.widget ); + + // Mark widget was destroyed. + this.deflated = true; + } + + function inflate() { + var editable = editor.editable(), + doc = editor.document; + + // Create a new widget. This widget will be either captioned + // non-captioned, block or inline according to what is the + // new state of the widget. + if ( this.deflated ) { + this.widget = editor.widgets.initOn( this.element, 'image', this.widget.data ); + + // Once widget was re-created, it may become an inline element without + // block wrapper (i.e. when unaligned, end not captioned). Let's do some + // sort of autoparagraphing here (#10853). + if ( this.widget.inline && !( new CKEDITOR.dom.elementPath( this.widget.wrapper, editable ).block ) ) { + var block = doc.createElement( editor.activeEnterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ); + block.replace( this.widget.wrapper ); + this.widget.wrapper.move( block ); + } + + // The focus must be transferred from the old one (destroyed) + // to the new one (just created). + if ( this.focused ) { + this.widget.focus(); + delete this.focused; + } + + delete this.deflated; + } + + // If now widget was destroyed just update wrapper's alignment. + // According to the new state. + else + setWrapperAlign( this.widget, alignClasses ); + } + + return { + allowedContent: getWidgetAllowedContent( editor ), + + requiredContent: 'img[src,alt]', + + features: getWidgetFeatures( editor ), + + styleableElements: 'img figure', + + // This widget converts style-driven dimensions to attributes. + contentTransformations: [ + [ 'img[width]: sizeToAttribute' ] + ], + + // This widget has an editable caption. + editables: { + caption: { + selector: 'figcaption', + allowedContent: 'br em strong sub sup u s; a[!href]' + } + }, + + parts: { + image: 'img', + caption: 'figcaption' + // parts#link defined in widget#init + }, + + // The name of this widget's dialog. + dialog: 'image2', + + // Template of the widget: plain image. + template: template, + + data: function() { + var features = this.features; + + // Image can't be captioned when figcaption is disallowed (#11004). + if ( this.data.hasCaption && !editor.filter.checkFeature( features.caption ) ) + this.data.hasCaption = false; + + // Image can't be aligned when floating is disallowed (#11004). + if ( this.data.align != 'none' && !editor.filter.checkFeature( features.align ) ) + this.data.align = 'none'; + + // Convert the internal form of the widget from the old state to the new one. + this.shiftState( { + widget: this, + element: this.element, + oldData: this.oldData, + newData: this.data, + deflate: deflate, + inflate: inflate + } ); + + // Update widget.parts.link since it will not auto-update unless widget + // is destroyed and re-inited. + if ( !this.data.link ) { + if ( this.parts.link ) + delete this.parts.link; + } else { + if ( !this.parts.link ) + this.parts.link = this.parts.image.getParent(); + } + + this.parts.image.setAttributes( { + src: this.data.src, + + // This internal is required by the editor. + 'data-cke-saved-src': this.data.src, + + alt: this.data.alt + } ); + + // If shifting non-captioned -> captioned, remove classes + // related to styles from . + if ( this.oldData && !this.oldData.hasCaption && this.data.hasCaption ) { + for ( var c in this.data.classes ) + this.parts.image.removeClass( c ); + } + + // Set dimensions of the image according to gathered data. + // Do it only when the attributes are allowed (#11004). + if ( editor.filter.checkFeature( features.dimension ) ) + setDimensions( this ); + + // Cache current data. + this.oldData = CKEDITOR.tools.extend( {}, this.data ); + }, + + init: function() { + var helpers = CKEDITOR.plugins.image2, + image = this.parts.image, + data = { + hasCaption: !!this.parts.caption, + src: image.getAttribute( 'src' ), + alt: image.getAttribute( 'alt' ) || '', + width: image.getAttribute( 'width' ) || '', + height: image.getAttribute( 'height' ) || '', + + // Lock ratio is on by default (#10833). + lock: this.ready ? helpers.checkHasNaturalRatio( image ) : true + }; + + // If we used 'a' in widget#parts definition, it could happen that + // selected element is a child of widget.parts#caption. Since there's no clever + // way to solve it with CSS selectors, it's done like that. (#11783). + var link = image.getAscendant( 'a' ); + + if ( link && this.wrapper.contains( link ) ) + this.parts.link = link; + + // Depending on configuration, read style/class from element and + // then remove it. Removed style/class will be set on wrapper in #data listener. + // Note: Center alignment is detected during upcast, so only left/right cases + // are checked below. + if ( !data.align ) { + // Read the initial left/right alignment from the class set on element. + if ( alignClasses ) { + if ( this.element.hasClass( alignClasses[ 0 ] ) ) + data.align = 'left'; + else if ( this.element.hasClass( alignClasses[ 2 ] ) ) + data.align = 'right'; + + if ( data.align ) + this.element.removeClass( alignClasses[ alignmentsObj[ data.align ] ] ); + else + data.align = 'none'; + } + // Read initial float style from figure/image and then remove it. + else { + data.align = this.element.getStyle( 'float' ) || image.getStyle( 'float' ) || 'none'; + this.element.removeStyle( 'float' ); + image.removeStyle( 'float' ); + } + } + + // Update data.link object with attributes if the link has been discovered. + if ( editor.plugins.link && this.parts.link ) { + data.link = CKEDITOR.plugins.link.parseLinkAttributes( editor, this.parts.link ); + + // Get rid of cke_widget_* classes in data. Otherwise + // they might appear in link dialog. + var advanced = data.link.advanced; + if ( advanced && advanced.advCSSClasses ) + advanced.advCSSClasses = CKEDITOR.tools.trim( advanced.advCSSClasses.replace( /cke_\S+/, '' ) ); + } + + // Get rid of extra vertical space when there's no caption. + // It will improve the look of the resizer. + this.wrapper[ ( data.hasCaption ? 'remove' : 'add' ) + 'Class' ]( 'cke_image_nocaption' ); + + this.setData( data ); + + // Setup dynamic image resizing with mouse. + // Don't initialize resizer when dimensions are disallowed (#11004). + if ( editor.filter.checkFeature( this.features.dimension ) ) + setupResizer( this ); + + this.shiftState = helpers.stateShifter( this.editor ); + + // Add widget editing option to its context menu. + this.on( 'contextMenu', function( evt ) { + evt.data.image = CKEDITOR.TRISTATE_OFF; + + // Integrate context menu items for link. + // Note that widget may be wrapped in a link, which + // does not belong to that widget (#11814). + if ( this.parts.link || this.wrapper.getAscendant( 'a' ) ) + evt.data.link = evt.data.unlink = CKEDITOR.TRISTATE_OFF; + } ); + + // Pass the reference to this widget to the dialog. + this.on( 'dialog', function( evt ) { + evt.data.widget = this; + }, this ); + }, + + // Overrides default method to handle internal mutability of Image2. + // @see CKEDITOR.plugins.widget#addClass + addClass: function( className ) { + getStyleableElement( this ).addClass( className ); + }, + + // Overrides default method to handle internal mutability of Image2. + // @see CKEDITOR.plugins.widget#hasClass + hasClass: function( className ) { + return getStyleableElement( this ).hasClass( className ); + }, + + // Overrides default method to handle internal mutability of Image2. + // @see CKEDITOR.plugins.widget#removeClass + removeClass: function( className ) { + getStyleableElement( this ).removeClass( className ); + }, + + // Overrides default method to handle internal mutability of Image2. + // @see CKEDITOR.plugins.widget#getClasses + getClasses: ( function() { + var classRegex = new RegExp( '^(' + [].concat( captionedClass, alignClasses ).join( '|' ) + ')$' ); + + return function() { + var classes = this.repository.parseElementClasses( getStyleableElement( this ).getAttribute( 'class' ) ); + + // Neither config.image2_captionedClass nor config.image2_alignClasses + // do not belong to style classes. + for ( var c in classes ) { + if ( classRegex.test( c ) ) + delete classes[ c ]; + } + + return classes; + }; + } )(), + + upcast: upcastWidgetElement( editor ), + downcast: downcastWidgetElement( editor ) + }; + } + + CKEDITOR.plugins.image2 = { + stateShifter: function( editor ) { + // Tag name used for centering non-captioned widgets. + var doc = editor.document, + alignClasses = editor.config.image2_alignClasses, + captionedClass = editor.config.image2_captionedClass, + editable = editor.editable(), + + // The order that stateActions get executed. It matters! + shiftables = [ 'hasCaption', 'align', 'link' ]; + + // Atomic procedures, one per state variable. + var stateActions = { + align: function( shift, oldValue, newValue ) { + var el = shift.element; + + // Alignment changed. + if ( shift.changed.align ) { + // No caption in the new state. + if ( !shift.newData.hasCaption ) { + // Changed to "center" (non-captioned). + if ( newValue == 'center' ) { + shift.deflate(); + shift.element = wrapInCentering( editor, el ); + } + + // Changed to "non-center" from "center" while caption removed. + if ( !shift.changed.hasCaption && oldValue == 'center' && newValue != 'center' ) { + shift.deflate(); + shift.element = unwrapFromCentering( el ); + } + } + } + + // Alignment remains and "center" removed caption. + else if ( newValue == 'center' && shift.changed.hasCaption && !shift.newData.hasCaption ) { + shift.deflate(); + shift.element = wrapInCentering( editor, el ); + } + + // Finally set display for figure. + if ( !alignClasses && el.is( 'figure' ) ) { + if ( newValue == 'center' ) + el.setStyle( 'display', 'inline-block' ); + else + el.removeStyle( 'display' ); + } + }, + + hasCaption: function( shift, oldValue, newValue ) { + // This action is for real state change only. + if ( !shift.changed.hasCaption ) + return; + + // Get or from widget. Note that widget element might itself + // be what we're looking for. Also element can be

...

. + var imageOrLink; + if ( shift.element.is( { img: 1, a: 1 } ) ) + imageOrLink = shift.element; + else + imageOrLink = shift.element.findOne( 'a,img' ); + + // Switching hasCaption always destroys the widget. + shift.deflate(); + + // There was no caption, but the caption is to be added. + if ( newValue ) { + // Create new
from widget template. + var figure = CKEDITOR.dom.element.createFromHtml( templateBlock.output( { + captionedClass: captionedClass, + captionPlaceholder: editor.lang.image2.captionPlaceholder + } ), doc ); + + // Replace element with
. + replaceSafely( figure, shift.element ); + + // Use old or instead of the one from the template, + // so we won't lose additional attributes. + imageOrLink.replace( figure.findOne( 'img' ) ); + + // Update widget's element. + shift.element = figure; + } + + // The caption was present, but now it's to be removed. + else { + // Unwrap or from figure. + imageOrLink.replace( shift.element ); + + // Update widget's element. + shift.element = imageOrLink; + } + }, + + link: function( shift, oldValue, newValue ) { + if ( shift.changed.link ) { + var img = shift.element.is( 'img' ) ? + shift.element : shift.element.findOne( 'img' ), + link = shift.element.is( 'a' ) ? + shift.element : shift.element.findOne( 'a' ), + // Why deflate: + // If element is , it will be wrapped into , + // which becomes a new widget.element. + // If element is , it will be unlinked + // so becomes a new widget.element. + needsDeflate = ( shift.element.is( 'a' ) && !newValue ) || ( shift.element.is( 'img' ) && newValue ), + newEl; + + if ( needsDeflate ) + shift.deflate(); + + // If unlinked the image, returned element is . + if ( !newValue ) + newEl = unwrapFromLink( link ); + else { + // If linked the image, returned element is . + if ( !oldValue ) + newEl = wrapInLink( img, shift.newData.link ); + + // Set and remove all attributes associated with this state. + var attributes = CKEDITOR.plugins.link.getLinkAttributes( editor, newValue ); + + if ( !CKEDITOR.tools.isEmpty( attributes.set ) ) + ( newEl || link ).setAttributes( attributes.set ); + + if ( attributes.removed.length ) + ( newEl || link ).removeAttributes( attributes.removed ); + } + + if ( needsDeflate ) + shift.element = newEl; + } + } + }; + + function wrapInCentering( editor, element ) { + var attribsAndStyles = {}; + + if ( alignClasses ) + attribsAndStyles.attributes = { 'class': alignClasses[ 1 ] }; + else + attribsAndStyles.styles = { 'text-align': 'center' }; + + // There's no gentle way to center inline element with CSS, so create p/div + // that wraps widget contents and does the trick either with style or class. + var center = doc.createElement( + editor.activeEnterMode == CKEDITOR.ENTER_P ? 'p' : 'div', attribsAndStyles ); + + // Replace element with centering wrapper. + replaceSafely( center, element ); + element.move( center ); + + return center; + } + + function unwrapFromCentering( element ) { + var imageOrLink = element.findOne( 'a,img' ); + + imageOrLink.replace( element ); + + return imageOrLink; + } + + // Wraps -> . + // Returns reference to . + // + // @param {CKEDITOR.dom.element} img + // @param {Object} linkData + // @returns {CKEDITOR.dom.element} + function wrapInLink( img, linkData ) { + var link = doc.createElement( 'a', { + attributes: { + href: linkData.url + } + } ); + + link.replace( img ); + img.move( link ); + + return link; + } + + // De-wraps -> . + // Returns the reference to + // + // @param {CKEDITOR.dom.element} link + // @returns {CKEDITOR.dom.element} + function unwrapFromLink( link ) { + var img = link.findOne( 'img' ); + + img.replace( link ); + + return img; + } + + function replaceSafely( replacing, replaced ) { + if ( replaced.getParent() ) { + var range = editor.createRange(); + + range.moveToPosition( replaced, CKEDITOR.POSITION_BEFORE_START ); + + // Remove old element. Do it before insertion to avoid a case when + // element is moved from 'replaced' element before it, what creates + // a tricky case which insertElementIntorRange does not handle. + replaced.remove(); + + editable.insertElementIntoRange( replacing, range ); + } + else + replacing.replace( replaced ); + } + + return function( shift ) { + var name, i; + + shift.changed = {}; + + for ( i = 0; i < shiftables.length; i++ ) { + name = shiftables[ i ]; + + shift.changed[ name ] = shift.oldData ? + shift.oldData[ name ] !== shift.newData[ name ] : false; + } + + // Iterate over possible state variables. + for ( i = 0; i < shiftables.length; i++ ) { + name = shiftables[ i ]; + + stateActions[ name ]( shift, + shift.oldData ? shift.oldData[ name ] : null, + shift.newData[ name ] ); + } + + shift.inflate(); + }; + }, + + // Checks whether current ratio of the image match the natural one. + // by comparing dimensions. + // @param {CKEDITOR.dom.element} image + // @returns {Boolean} + checkHasNaturalRatio: function( image ) { + var $ = image.$, + natural = this.getNatural( image ); + + // The reason for two alternative comparisons is that the rounding can come from + // both dimensions, e.g. there are two cases: + // 1. height is computed as a rounded relation of the real height and the value of width, + // 2. width is computed as a rounded relation of the real width and the value of heigh. + return Math.round( $.clientWidth / natural.width * natural.height ) == $.clientHeight || + Math.round( $.clientHeight / natural.height * natural.width ) == $.clientWidth; + }, + + // Returns natural dimensions of the image. For modern browsers + // it uses natural(Width|Height) for old ones (IE8), creates + // a new image and reads dimensions. + // @param {CKEDITOR.dom.element} image + // @returns {Object} + getNatural: function( image ) { + var dimensions; + + if ( image.$.naturalWidth ) { + dimensions = { + width: image.$.naturalWidth, + height: image.$.naturalHeight + }; + } else { + var img = new Image(); + img.src = image.getAttribute( 'src' ); + + dimensions = { + width: img.width, + height: img.height + }; + } + + return dimensions; + } + }; + + function setWrapperAlign( widget, alignClasses ) { + var wrapper = widget.wrapper, + align = widget.data.align, + hasCaption = widget.data.hasCaption; + + if ( alignClasses ) { + // Remove all align classes first. + for ( var i = 3; i--; ) + wrapper.removeClass( alignClasses[ i ] ); + + if ( align == 'center' ) { + // Avoid touching non-captioned, centered widgets because + // they have the class set on the element instead of wrapper: + // + //
+ //

+ // + //

+ //
+ if ( hasCaption ) + wrapper.addClass( alignClasses[ 1 ] ); + } else if ( align != 'none' ) + wrapper.addClass( alignClasses[ alignmentsObj[ align ] ] ); + } else { + if ( align == 'center' ) { + if ( hasCaption ) + wrapper.setStyle( 'text-align', 'center' ); + else + wrapper.removeStyle( 'text-align' ); + + wrapper.removeStyle( 'float' ); + } + else { + if ( align == 'none' ) + wrapper.removeStyle( 'float' ); + else + wrapper.setStyle( 'float', align ); + + wrapper.removeStyle( 'text-align' ); + } + } + } + + // Returns a function that creates widgets from all and + //
elements. + // + // @param {CKEDITOR.editor} editor + // @returns {Function} + function upcastWidgetElement( editor ) { + var isCenterWrapper = centerWrapperChecker( editor ), + captionedClass = editor.config.image2_captionedClass; + + // @param {CKEDITOR.htmlParser.element} el + // @param {Object} data + return function( el, data ) { + var dimensions = { width: 1, height: 1 }, + name = el.name, + image; + + // #11110 Don't initialize on pasted fake objects. + if ( el.attributes[ 'data-cke-realelement' ] ) + return; + + // If a center wrapper is found, there are 3 possible cases: + // + // 1.
...
. + // In this case centering is done with a class set on widget.wrapper. + // Simply replace centering wrapper with figure (it's no longer necessary). + // + // 2.

. + // Nothing to do here:

remains for styling purposes. + // + // 3.

. + // Nothing to do here (2.) but that case is only possible in enterMode different + // than ENTER_P. + if ( isCenterWrapper( el ) ) { + if ( name == 'div' ) { + var figure = el.getFirst( 'figure' ); + + // Case #1. + if ( figure ) { + el.replaceWith( figure ); + el = figure; + } + } + // Cases #2 and #3 (handled transparently) + + // If there's a centering wrapper, save it in data. + data.align = 'center'; + + // Image can be wrapped in link . + image = el.getFirst( 'img' ) || el.getFirst( 'a' ).getFirst( 'img' ); + } + + // No center wrapper has been found. + else if ( name == 'figure' && el.hasClass( captionedClass ) ) + image = el.getFirst( 'img' ) || el.getFirst( 'a' ).getFirst( 'img' ); + + // Upcast linked image like . + else if ( isLinkedOrStandaloneImage( el ) ) + image = el.name == 'a' ? el.children[ 0 ] : el; + + if ( !image ) + return; + + // If there's an image, then cool, we got a widget. + // Now just remove dimension attributes expressed with %. + for ( var d in dimensions ) { + var dimension = image.attributes[ d ]; + + if ( dimension && dimension.match( regexPercent ) ) + delete image.attributes[ d ]; + } + + return el; + }; + } + + // Returns a function which transforms the widget to the external format + // according to the current configuration. + // + // @param {CKEDITOR.editor} + function downcastWidgetElement( editor ) { + var alignClasses = editor.config.image2_alignClasses; + + // @param {CKEDITOR.htmlParser.element} el + return function( el ) { + // In case of , is the element to hold + // inline styles or classes (image2_alignClasses). + var attrsHolder = el.name == 'a' ? el.getFirst() : el, + attrs = attrsHolder.attributes, + align = this.data.align; + + // De-wrap the image from resize handle wrapper. + // Only block widgets have one. + if ( !this.inline ) { + var resizeWrapper = el.getFirst( 'span' ); + + if ( resizeWrapper ) + resizeWrapper.replaceWith( resizeWrapper.getFirst( { img: 1, a: 1 } ) ); + } + + if ( align && align != 'none' ) { + var styles = CKEDITOR.tools.parseCssText( attrs.style || '' ); + + // When the widget is captioned (
) and internally centering is done + // with widget's wrapper style/class, in the external data representation, + //
must be wrapped with an element holding an style/class: + // + //
+ //
...
+ //
+ // or + //
+ //
...
+ //
+ // + if ( align == 'center' && el.name == 'figure' ) { + el = el.wrapWith( new CKEDITOR.htmlParser.element( 'div', + alignClasses ? { 'class': alignClasses[ 1 ] } : { style: 'text-align:center' } ) ); + } + + // If left/right, add float style to the downcasted element. + else if ( align in { left: 1, right: 1 } ) { + if ( alignClasses ) + attrsHolder.addClass( alignClasses[ alignmentsObj[ align ] ] ); + else + styles[ 'float' ] = align; + } + + // Update element styles. + if ( !alignClasses && !CKEDITOR.tools.isEmpty( styles ) ) + attrs.style = CKEDITOR.tools.writeCssText( styles ); + } + + return el; + }; + } + + // Returns a function that checks if an element is a centering wrapper. + // + // @param {CKEDITOR.editor} editor + // @returns {Function} + function centerWrapperChecker( editor ) { + var captionedClass = editor.config.image2_captionedClass, + alignClasses = editor.config.image2_alignClasses, + validChildren = { figure: 1, a: 1, img: 1 }; + + return function( el ) { + // Wrapper must be either
or

. + if ( !( el.name in { div: 1, p: 1 } ) ) + return false; + + var children = el.children; + + // Centering wrapper can have only one child. + if ( children.length !== 1 ) + return false; + + var child = children[ 0 ]; + + // Only

or can be first (only) child of centering wrapper, + // regardless of its type. + if ( !( child.name in validChildren ) ) + return false; + + // If centering wrapper is

, only can be the child. + //

+ if ( el.name == 'p' ) { + if ( !isLinkedOrStandaloneImage( child ) ) + return false; + } + // Centering
can hold or
, depending on enterMode. + else { + // If a
is the first (only) child, it must have a class. + //
...
+ if ( child.name == 'figure' ) { + if ( !child.hasClass( captionedClass ) ) + return false; + } else { + // Centering
can hold or only when enterMode + // is ENTER_(BR|DIV). + //
+ //
+ if ( editor.enterMode == CKEDITOR.ENTER_P ) + return false; + + // Regardless of enterMode, a child which is not
must be + // either or . + if ( !isLinkedOrStandaloneImage( child ) ) + return false; + } + } + + // Centering wrapper got to be... centering. If image2_alignClasses are defined, + // check for centering class. Otherwise, check the style. + if ( alignClasses ? el.hasClass( alignClasses[ 1 ] ) : + CKEDITOR.tools.parseCssText( el.attributes.style || '', true )[ 'text-align' ] == 'center' ) + return true; + + return false; + }; + } + + // Checks whether element is or . + // + // @param {CKEDITOR.htmlParser.element} + function isLinkedOrStandaloneImage( el ) { + if ( el.name == 'img' ) + return true; + else if ( el.name == 'a' ) + return el.children.length == 1 && el.getFirst( 'img' ); + + return false; + } + + // Sets width and height of the widget image according to current widget data. + // + // @param {CKEDITOR.plugins.widget} widget + function setDimensions( widget ) { + var data = widget.data, + dimensions = { width: data.width, height: data.height }, + image = widget.parts.image; + + for ( var d in dimensions ) { + if ( dimensions[ d ] ) + image.setAttribute( d, dimensions[ d ] ); + else + image.removeAttribute( d ); + } + } + + // Defines all features related to drag-driven image resizing. + // + // @param {CKEDITOR.plugins.widget} widget + function setupResizer( widget ) { + var editor = widget.editor, + editable = editor.editable(), + doc = editor.document, + + // Store the resizer in a widget for testing (#11004). + resizer = widget.resizer = doc.createElement( 'span' ); + + resizer.addClass( 'cke_image_resizer' ); + resizer.setAttribute( 'title', editor.lang.image2.resizer ); + resizer.append( new CKEDITOR.dom.text( '\u200b', doc ) ); + + // Inline widgets don't need a resizer wrapper as an image spans the entire widget. + if ( !widget.inline ) { + var imageOrLink = widget.parts.link || widget.parts.image, + oldResizeWrapper = imageOrLink.getParent(), + resizeWrapper = doc.createElement( 'span' ); + + resizeWrapper.addClass( 'cke_image_resizer_wrapper' ); + resizeWrapper.append( imageOrLink ); + resizeWrapper.append( resizer ); + widget.element.append( resizeWrapper, true ); + + // Remove the old wrapper which could came from e.g. pasted HTML + // and which could be corrupted (e.g. resizer span has been lost). + if ( oldResizeWrapper.is( 'span' ) ) + oldResizeWrapper.remove(); + } else + widget.wrapper.append( resizer ); + + // Calculate values of size variables and mouse offsets. + resizer.on( 'mousedown', function( evt ) { + var image = widget.parts.image, + + // "factor" can be either 1 or -1. I.e.: For right-aligned images, we need to + // subtract the difference to get proper width, etc. Without "factor", + // resizer starts working the opposite way. + factor = widget.data.align == 'right' ? -1 : 1, + + // The x-coordinate of the mouse relative to the screen + // when button gets pressed. + startX = evt.data.$.screenX, + startY = evt.data.$.screenY, + + // The initial dimensions and aspect ratio of the image. + startWidth = image.$.clientWidth, + startHeight = image.$.clientHeight, + ratio = startWidth / startHeight, + + listeners = [], + + // A class applied to editable during resizing. + cursorClass = 'cke_image_s' + ( !~factor ? 'w' : 'e' ), + + nativeEvt, newWidth, newHeight, updateData, + moveDiffX, moveDiffY, moveRatio; + + // Save the undo snapshot first: before resizing. + editor.fire( 'saveSnapshot' ); + + // Mousemove listeners are removed on mouseup. + attachToDocuments( 'mousemove', onMouseMove, listeners ); + + // Clean up the mousemove listener. Update widget data if valid. + attachToDocuments( 'mouseup', onMouseUp, listeners ); + + // The entire editable will have the special cursor while resizing goes on. + editable.addClass( cursorClass ); + + // This is to always keep the resizer element visible while resizing. + resizer.addClass( 'cke_image_resizing' ); + + // Attaches an event to a global document if inline editor. + // Additionally, if classic (`iframe`-based) editor, also attaches the same event to `iframe`'s document. + function attachToDocuments( name, callback, collection ) { + var globalDoc = CKEDITOR.document, + listeners = []; + + if ( !doc.equals( globalDoc ) ) + listeners.push( globalDoc.on( name, callback ) ); + + listeners.push( doc.on( name, callback ) ); + + if ( collection ) { + for ( var i = listeners.length; i--; ) + collection.push( listeners.pop() ); + } + } + + // Calculate with first, and then adjust height, preserving ratio. + function adjustToX() { + newWidth = startWidth + factor * moveDiffX; + newHeight = Math.round( newWidth / ratio ); + } + + // Calculate height first, and then adjust width, preserving ratio. + function adjustToY() { + newHeight = startHeight - moveDiffY; + newWidth = Math.round( newHeight * ratio ); + } + + // This is how variables refer to the geometry. + // Note: x corresponds to moveOffset, this is the position of mouse + // Note: o corresponds to [startX, startY]. + // + // +--------------+--------------+ + // | | | + // | I | II | + // | | | + // +------------- o -------------+ _ _ _ + // | | | ^ + // | VI | III | | moveDiffY + // | | x _ _ _ _ _ v + // +--------------+---------|----+ + // | | + // <-------> + // moveDiffX + function onMouseMove( evt ) { + nativeEvt = evt.data.$; + + // This is how far the mouse is from the point the button was pressed. + moveDiffX = nativeEvt.screenX - startX; + moveDiffY = startY - nativeEvt.screenY; + + // This is the aspect ratio of the move difference. + moveRatio = Math.abs( moveDiffX / moveDiffY ); + + // Left, center or none-aligned widget. + if ( factor == 1 ) { + if ( moveDiffX <= 0 ) { + // Case: IV. + if ( moveDiffY <= 0 ) + adjustToX(); + + // Case: I. + else { + if ( moveRatio >= ratio ) + adjustToX(); + else + adjustToY(); + } + } else { + // Case: III. + if ( moveDiffY <= 0 ) { + if ( moveRatio >= ratio ) + adjustToY(); + else + adjustToX(); + } + + // Case: II. + else + adjustToY(); + } + } + + // Right-aligned widget. It mirrors behaviours, so I becomes II, + // IV becomes III and vice-versa. + else { + if ( moveDiffX <= 0 ) { + // Case: IV. + if ( moveDiffY <= 0 ) { + if ( moveRatio >= ratio ) + adjustToY(); + else + adjustToX(); + } + + // Case: I. + else + adjustToY(); + } else { + // Case: III. + if ( moveDiffY <= 0 ) + adjustToX(); + + // Case: II. + else { + if ( moveRatio >= ratio ) + adjustToX(); + else + adjustToY(); + } + } + } + + // Don't update attributes if less than 10. + // This is to prevent images to visually disappear. + if ( newWidth >= 15 && newHeight >= 15 ) { + image.setAttributes( { width: newWidth, height: newHeight } ); + updateData = true; + } else + updateData = false; + } + + function onMouseUp( evt ) { + var l; + + while ( ( l = listeners.pop() ) ) + l.removeListener(); + + // Restore default cursor by removing special class. + editable.removeClass( cursorClass ); + + // This is to bring back the regular behaviour of the resizer. + resizer.removeClass( 'cke_image_resizing' ); + + if ( updateData ) { + widget.setData( { width: newWidth, height: newHeight } ); + + // Save another undo snapshot: after resizing. + editor.fire( 'saveSnapshot' ); + } + + // Don't update data twice or more. + updateData = false; + } + } ); + + // Change the position of the widget resizer when data changes. + widget.on( 'data', function() { + resizer[ widget.data.align == 'right' ? 'addClass' : 'removeClass' ]( 'cke_image_resizer_left' ); + } ); + } + + // Integrates widget alignment setting with justify + // plugin's commands (execution and refreshment). + // @param {CKEDITOR.editor} editor + // @param {String} value 'left', 'right', 'center' or 'block' + function alignCommandIntegrator( editor ) { + var execCallbacks = [], + enabled; + + return function( value ) { + var command = editor.getCommand( 'justify' + value ); + + // Most likely, the justify plugin isn't loaded. + if ( !command ) + return; + + // This command will be manually refreshed along with + // other commands after exec. + execCallbacks.push( function() { + command.refresh( editor, editor.elementPath() ); + } ); + + if ( value in { right: 1, left: 1, center: 1 } ) { + command.on( 'exec', function( evt ) { + var widget = getFocusedWidget( editor ); + + if ( widget ) { + widget.setData( 'align', value ); + + // Once the widget changed its align, all the align commands + // must be refreshed: the event is to be cancelled. + for ( var i = execCallbacks.length; i--; ) + execCallbacks[ i ](); + + evt.cancel(); + } + } ); + } + + command.on( 'refresh', function( evt ) { + var widget = getFocusedWidget( editor ), + allowed = { right: 1, left: 1, center: 1 }; + + if ( !widget ) + return; + + // Cache "enabled" on first use. This is because filter#checkFeature may + // not be available during plugin's afterInit in the future — a moment when + // alignCommandIntegrator is called. + if ( enabled == undefined ) + enabled = editor.filter.checkFeature( editor.widgets.registered.image.features.align ); + + // Don't allow justify commands when widget alignment is disabled (#11004). + if ( !enabled ) + this.setState( CKEDITOR.TRISTATE_DISABLED ); + else { + this.setState( + ( widget.data.align == value ) ? + CKEDITOR.TRISTATE_ON + : + ( value in allowed ) ? + CKEDITOR.TRISTATE_OFF + : + CKEDITOR.TRISTATE_DISABLED ); + } + + evt.cancel(); + } ); + }; + } + + function linkCommandIntegrator( editor ) { + // Nothing to integrate with if link is not loaded. + if ( !editor.plugins.link ) + return; + + CKEDITOR.on( 'dialogDefinition', function( evt ) { + var dialog = evt.data; + + if ( dialog.name == 'link' ) { + var def = dialog.definition; + + var onShow = def.onShow, + onOk = def.onOk; + + def.onShow = function() { + var widget = getFocusedWidget( editor ); + + // Widget cannot be enclosed in a link, i.e. + // foobar + if ( widget && ( widget.inline ? !widget.wrapper.getAscendant( 'a' ) : 1 ) ) + this.setupContent( widget.data.link || {} ); + else + onShow.apply( this, arguments ); + }; + + // Set widget data if linking the widget using + // link dialog (instead of default action). + // State shifter handles data change and takes + // care of internal DOM structure of linked widget. + def.onOk = function() { + var widget = getFocusedWidget( editor ); + + // Widget cannot be enclosed in a link, i.e. + // foobar + if ( widget && ( widget.inline ? !widget.wrapper.getAscendant( 'a' ) : 1 ) ) { + var data = {}; + + // Collect data from fields. + this.commitContent( data ); + + // Set collected data to widget. + widget.setData( 'link', data ); + } else + onOk.apply( this, arguments ); + }; + } + } ); + + // Overwrite default behaviour of unlink command. + editor.getCommand( 'unlink' ).on( 'exec', function( evt ) { + var widget = getFocusedWidget( editor ); + + // Override unlink only when link truly belongs to the widget. + // If wrapped inline widget in a link, let default unlink work (#11814). + if ( !widget || !widget.parts.link ) + return; + + widget.setData( 'link', null ); + + // Selection (which is fake) may not change if unlinked image in focused widget, + // i.e. if captioned image. Let's refresh command state manually here. + this.refresh( editor, editor.elementPath() ); + + evt.cancel(); + } ); + + // Overwrite default refresh of unlink command. + editor.getCommand( 'unlink' ).on( 'refresh', function( evt ) { + var widget = getFocusedWidget( editor ); + + if ( !widget ) + return; + + // Note that widget may be wrapped in a link, which + // does not belong to that widget (#11814). + this.setState( widget.data.link || widget.wrapper.getAscendant( 'a' ) ? + CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); + + evt.cancel(); + } ); + } + + // Returns the focused widget, if of the type specific for this plugin. + // If no widget is focused, `null` is returned. + // + // @param {CKEDITOR.editor} + // @returns {CKEDITOR.plugins.widget} + function getFocusedWidget( editor ) { + var widget = editor.widgets.focused; + + if ( widget && widget.name == 'image' ) + return widget; + + return null; + } + + // Returns a set of widget allowedContent rules, depending + // on configurations like config#image2_alignClasses or + // config#image2_captionedClass. + // + // @param {CKEDITOR.editor} + // @returns {Object} + function getWidgetAllowedContent( editor ) { + var alignClasses = editor.config.image2_alignClasses, + rules = { + // Widget may need
or

centering wrapper. + div: { + match: centerWrapperChecker( editor ) + }, + p: { + match: centerWrapperChecker( editor ) + }, + img: { + attributes: '!src,alt,width,height' + }, + figure: { + classes: '!' + editor.config.image2_captionedClass + }, + figcaption: true + }; + + if ( alignClasses ) { + // Centering class from the config. + rules.div.classes = alignClasses[ 1 ]; + rules.p.classes = rules.div.classes; + + // Left/right classes from the config. + rules.img.classes = alignClasses[ 0 ] + ',' + alignClasses[ 2 ]; + rules.figure.classes += ',' + rules.img.classes; + } else { + // Centering with text-align. + rules.div.styles = 'text-align'; + rules.p.styles = 'text-align'; + + rules.img.styles = 'float'; + rules.figure.styles = 'float,display'; + } + + return rules; + } + + // Returns a set of widget feature rules, depending + // on editor configuration. Note that the following may not cover + // all the possible cases since requiredContent supports a single + // tag only. + // + // @param {CKEDITOR.editor} + // @returns {Object} + function getWidgetFeatures( editor ) { + var alignClasses = editor.config.image2_alignClasses, + features = { + dimension: { + requiredContent: 'img[width,height]' + }, + align: { + requiredContent: 'img' + + ( alignClasses ? '(' + alignClasses[ 0 ] + ')' : '{float}' ) + }, + caption: { + requiredContent: 'figcaption' + } + }; + + return features; + } + + // Returns element which is styled, considering current + // state of the widget. + // + // @see CKEDITOR.plugins.widget#applyStyle + // @param {CKEDITOR.plugins.widget} widget + // @returns {CKEDITOR.dom.element} + function getStyleableElement( widget ) { + return widget.data.hasCaption ? widget.element : widget.parts.image; + } +} )(); + +/** + * A CSS class applied to the `

` element of a captioned image. + * + * // Changes the class to "captionedImage". + * CKEDITOR.config.image2_captionedClass = 'captionedImage'; + * + * @cfg {String} [image2_captionedClass='image'] + * @member CKEDITOR.config + */ +CKEDITOR.config.image2_captionedClass = 'image'; + +/** + * CSS classes applied to aligned images. Useful to take control over the way + * the images are aligned, i.e. to customize output HTML and integrate external stylesheets. + * + * Classes should be defined in an array of three elements, containing left, center, and right + * alignment classes, respectively. For example: + * + * config.image2_alignClasses = [ 'align-left', 'align-center', 'align-right' ]; + * + * **Note**: Once this configuration option is set, the plugin will no longer produce inline + * styles for alignment. It means that e.g. the following HTML will be produced: + * + * My image + * + * instead of: + * + * My image + * + * **Note**: Once this configuration option is set, corresponding style definitions + * must be supplied to the editor: + * + * * For [classic editor](#!/guide/dev_framed) it can be done by defining additional + * styles in the {@link CKEDITOR.config#contentsCss stylesheets loaded by the editor}. The same + * styles must be provided on the target page where the content will be loaded. + * * For [inline editor](#!/guide/dev_inline) the styles can be defined directly + * with `

+ CKEditor Samples » Widget Image +