zhangfisher 13 yıl önce
ebeveyn
işleme
bef6a7f8a0
100 değiştirilmiş dosya ile 4067 ekleme ve 2186 silme
  1. 6 4
      .idea/DjangoUeditor.iml
  2. 0 9
      .idea/dictionaries/Administrator.xml
  3. 1 7
      .idea/dictionaries/wxzhang.xml
  4. 0 14
      .idea/inspectionProfiles/Project_Default.xml
  5. 0 3
      .idea/jsLibraryMappings.xml
  6. 0 22
      .idea/misc.xml
  7. 0 29
      .idea/runConfigurations/DjangoUeditor.xml
  8. 1 1
      .idea/vcs.xml
  9. 265 142
      .idea/workspace.xml
  10. 5 1
      DUSite/settings.py
  11. BIN
      DUSite/settings.pyc
  12. BIN
      DUSite/test.db
  13. 31 15
      DjangoUeditor/forms.py
  14. BIN
      DjangoUeditor/forms.pyc
  15. 6 16
      DjangoUeditor/models.py
  16. BIN
      DjangoUeditor/models.pyc
  17. 89 7
      DjangoUeditor/readme.txt
  18. 10 3
      DjangoUeditor/settings.py
  19. BIN
      DjangoUeditor/settings.pyc
  20. 0 208
      DjangoUeditor/static/UEditor/CHANGELOG.TXT
  21. 3 3
      DjangoUeditor/static/UEditor/dialogs/anchor/anchor.html
  22. 2 2
      DjangoUeditor/static/UEditor/dialogs/attachment/attachment.css
  23. 10 10
      DjangoUeditor/static/UEditor/dialogs/attachment/attachment.html
  24. 23 23
      DjangoUeditor/static/UEditor/dialogs/attachment/callbacks.js
  25. 30 0
      DjangoUeditor/static/UEditor/dialogs/background/background.css
  26. 55 0
      DjangoUeditor/static/UEditor/dialogs/background/background.html
  27. 421 0
      DjangoUeditor/static/UEditor/dialogs/background/background.js
  28. 8 8
      DjangoUeditor/static/UEditor/dialogs/emotion/emotion.html
  29. 61 57
      DjangoUeditor/static/UEditor/dialogs/gmap/gmap.html
  30. 20 20
      DjangoUeditor/static/UEditor/dialogs/help/help.html
  31. 4 4
      DjangoUeditor/static/UEditor/dialogs/highlightcode/highlightcode.html
  32. 6 4
      DjangoUeditor/static/UEditor/dialogs/image/image.css
  33. 33 49
      DjangoUeditor/static/UEditor/dialogs/image/image.html
  34. 68 49
      DjangoUeditor/static/UEditor/dialogs/image/image.js
  35. BIN
      DjangoUeditor/static/UEditor/dialogs/image/imageUploader.swf
  36. 19 19
      DjangoUeditor/static/UEditor/dialogs/insertframe/insertframe.html
  37. 48 12
      DjangoUeditor/static/UEditor/dialogs/internal.js
  38. 10 11
      DjangoUeditor/static/UEditor/dialogs/link/link.html
  39. 9 8
      DjangoUeditor/static/UEditor/dialogs/map/map.html
  40. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/addimg.png
  41. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/brush.png
  42. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/delimg.png
  43. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/delimgH.png
  44. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/empty.png
  45. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/emptyH.png
  46. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/eraser.png
  47. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/redo.png
  48. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/redoH.png
  49. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/scale.png
  50. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/scaleH.png
  51. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/size.png
  52. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/undo.png
  53. BIN
      DjangoUeditor/static/UEditor/dialogs/scrawl/images/undoH.png
  54. 72 0
      DjangoUeditor/static/UEditor/dialogs/scrawl/scrawl.css
  55. 95 0
      DjangoUeditor/static/UEditor/dialogs/scrawl/scrawl.html
  56. 656 0
      DjangoUeditor/static/UEditor/dialogs/scrawl/scrawl.js
  57. 23 26
      DjangoUeditor/static/UEditor/dialogs/searchreplace/searchreplace.html
  58. 5 5
      DjangoUeditor/static/UEditor/dialogs/snapscreen/snapscreen.html
  59. 9 9
      DjangoUeditor/static/UEditor/dialogs/spechars/spechars.html
  60. 9 7
      DjangoUeditor/static/UEditor/dialogs/table/edittd.html
  61. 35 35
      DjangoUeditor/static/UEditor/dialogs/table/table.html
  62. 11 9
      DjangoUeditor/static/UEditor/dialogs/table/table.js
  63. 26 0
      DjangoUeditor/static/UEditor/dialogs/template/config.js
  64. BIN
      DjangoUeditor/static/UEditor/dialogs/template/images/bg.gif
  65. BIN
      DjangoUeditor/static/UEditor/dialogs/template/images/pre0.png
  66. BIN
      DjangoUeditor/static/UEditor/dialogs/template/images/pre1.png
  67. BIN
      DjangoUeditor/static/UEditor/dialogs/template/images/pre2.png
  68. BIN
      DjangoUeditor/static/UEditor/dialogs/template/images/pre3.png
  69. BIN
      DjangoUeditor/static/UEditor/dialogs/template/images/pre4.png
  70. 19 0
      DjangoUeditor/static/UEditor/dialogs/template/template.css
  71. 26 0
      DjangoUeditor/static/UEditor/dialogs/template/template.html
  72. 53 0
      DjangoUeditor/static/UEditor/dialogs/template/template.js
  73. 7 4
      DjangoUeditor/static/UEditor/dialogs/video/video.css
  74. 18 18
      DjangoUeditor/static/UEditor/dialogs/video/video.html
  75. 8 8
      DjangoUeditor/static/UEditor/dialogs/video/video.js
  76. 3 3
      DjangoUeditor/static/UEditor/dialogs/webapp/webapp.html
  77. BIN
      DjangoUeditor/static/UEditor/dialogs/wordimage/imageUploader.swf
  78. 11 13
      DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.html
  79. 22 3
      DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.js
  80. 1119 1151
      DjangoUeditor/static/UEditor/editor_all.js
  81. 0 0
      DjangoUeditor/static/UEditor/editor_all_min.js
  82. 91 135
      DjangoUeditor/static/UEditor/editor_config.js
  83. 505 0
      DjangoUeditor/static/UEditor/lang/en/en.js
  84. BIN
      DjangoUeditor/static/UEditor/lang/en/images/addimage.png
  85. BIN
      DjangoUeditor/static/UEditor/lang/en/images/alldeletebtnhoverskin.png
  86. BIN
      DjangoUeditor/static/UEditor/lang/en/images/alldeletebtnupskin.png
  87. BIN
      DjangoUeditor/static/UEditor/lang/en/images/background.png
  88. BIN
      DjangoUeditor/static/UEditor/lang/en/images/button.png
  89. BIN
      DjangoUeditor/static/UEditor/lang/en/images/copy.png
  90. BIN
      DjangoUeditor/static/UEditor/lang/en/images/deletedisable.png
  91. BIN
      DjangoUeditor/static/UEditor/lang/en/images/deleteenable.png
  92. BIN
      DjangoUeditor/static/UEditor/lang/en/images/imglabel.png
  93. BIN
      DjangoUeditor/static/UEditor/lang/en/images/listbackground.png
  94. BIN
      DjangoUeditor/static/UEditor/lang/en/images/localimage.png
  95. BIN
      DjangoUeditor/static/UEditor/lang/en/images/rotateleftdisable.png
  96. BIN
      DjangoUeditor/static/UEditor/lang/en/images/rotateleftenable.png
  97. BIN
      DjangoUeditor/static/UEditor/lang/en/images/rotaterightdisable.png
  98. BIN
      DjangoUeditor/static/UEditor/lang/en/images/rotaterightenable.png
  99. BIN
      DjangoUeditor/static/UEditor/lang/en/images/upload.png
  100. 0 0
      DjangoUeditor/static/UEditor/lang/zh-cn/images/copy.png

+ 6 - 4
.idea/DjangoUeditor.iml

@@ -4,22 +4,24 @@
     <facet type="django" name="Django">
       <configuration>
         <option name="rootFolder" value="$MODULE_DIR$" />
-        <option name="settingsModule" value="DUSite/settings.py" />
+        <option name="settingsModule" value="DjangoUeditor/settings.py" />
         <option name="manageScript" value="manage.py" />
       </configuration>
     </facet>
   </component>
   <component name="NewModuleRootManager">
     <content url="file://$MODULE_DIR$" />
-    <orderEntry type="jdk" jdkName="Python 2.7.2 (D:\Python27\python.exe)" jdkType="Python SDK" />
+    <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
+  <component name="PackageRequirementsSettings">
+    <option name="requirementsPath" value="" />
+  </component>
   <component name="TemplatesService">
-    <option name="templateLanguage" value="Django" />
     <option name="TEMPLATE_CONFIGURATION" value="Django" />
     <option name="TEMPLATE_FOLDERS">
       <list>
-        <option value="$MODULE_DIR$/DUSite/templates" />
+        <option value="$MODULE_DIR$/DjangoUeditor/templates" />
       </list>
     </option>
   </component>

+ 0 - 9
.idea/dictionaries/Administrator.xml

@@ -1,9 +0,0 @@
-<component name="ProjectDictionaryState">
-  <dictionary name="Administrator">
-    <words>
-      <w>searchkey</w>
-      <w>searchtype</w>
-      <w>vaild</w>
-    </words>
-  </dictionary>
-</component>

+ 1 - 7
.idea/dictionaries/wxzhang.xml

@@ -1,9 +1,3 @@
 <component name="ProjectDictionaryState">
-  <dictionary name="wxzhang">
-    <words>
-      <w>backends</w>
-      <w>iframe</w>
-      <w>sqlite</w>
-    </words>
-  </dictionary>
+  <dictionary name="wxzhang" />
 </component>

+ 0 - 14
.idea/inspectionProfiles/Project_Default.xml

@@ -1,14 +0,0 @@
-<component name="InspectionProjectProfileManager">
-  <profile version="1.0" is_locked="false">
-    <option name="myName" value="Project Default" />
-    <option name="myLocal" value="false" />
-    <inspection_tool class="LessUnresolvedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
-    <inspection_tool class="SassUnresolvedMixin" enabled="false" level="WARNING" enabled_by_default="false" />
-    <inspection_tool class="SassUnresolvedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
-    <inspection_tool class="SpellCheckingInspection" enabled="true" level="TYPO" enabled_by_default="true">
-      <option name="processCode" value="true" />
-      <option name="processLiterals" value="true" />
-      <option name="processComments" value="false" />
-    </inspection_tool>
-  </profile>
-</component>

+ 0 - 3
.idea/jsLibraryMappings.xml

@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4" />
-

+ 0 - 22
.idea/misc.xml

@@ -1,27 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectInspectionProfilesVisibleTreeState">
-    <entry key="Project Default">
-      <profile-state>
-        <expanded-state>
-          <State>
-            <id />
-          </State>
-          <State>
-            <id>Buildout</id>
-          </State>
-          <State>
-            <id>Spelling</id>
-          </State>
-        </expanded-state>
-        <selected-state>
-          <State>
-            <id>LESS</id>
-          </State>
-        </selected-state>
-      </profile-state>
-    </entry>
-  </component>
   <component name="ProjectResources">
     <default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
   </component>

+ 0 - 29
.idea/runConfigurations/DjangoUeditor.xml

@@ -1,29 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="DjangoUeditor" type="Python.DjangoServer" factoryName="Django server">
-    <option name="INTERPRETER_OPTIONS" value="" />
-    <option name="PARENT_ENVS" value="true" />
-    <envs>
-      <env name="PYTHONUNBUFFERED" value="1" />
-    </envs>
-    <option name="SDK_HOME" value="D:/Python27/python.exe" />
-    <option name="WORKING_DIRECTORY" value="" />
-    <option name="IS_MODULE_SDK" value="false" />
-    <module name="DjangoUeditor" />
-    <option name="launchJavascriptDebuger" value="false" />
-    <option name="port" value="8000" />
-    <option name="host" value="" />
-    <option name="additionalOptions" value="" />
-    <option name="browserUrl" value="" />
-    <option name="runTestServer" value="false" />
-    <option name="runNoReload" value="false" />
-    <option name="useCustomRunCommand" value="false" />
-    <option name="customRunCommand" value="" />
-    <RunnerSettings RunnerId="PyDebugRunner" />
-    <RunnerSettings RunnerId="PythonCover" />
-    <RunnerSettings RunnerId="PythonRunner" />
-    <ConfigurationWrapper RunnerId="PyDebugRunner" />
-    <ConfigurationWrapper RunnerId="PythonCover" />
-    <ConfigurationWrapper RunnerId="PythonRunner" />
-    <method />
-  </configuration>
-</component>

+ 1 - 1
.idea/vcs.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
   </component>
 </project>
 

+ 265 - 142
.idea/workspace.xml

@@ -1,18 +1,72 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="1bcdded4-a933-47e3-aef4-259720d783c0" name="Default" comment="">
-      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\DUSite\test.db" afterPath="" />
+    <list default="true" id="a277f214-fdc3-4d56-a982-825f5989727e" name="Default" comment="">
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\.idea\dictionaries\Administrator.xml" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\.idea\inspectionProfiles\Project_Default.xml" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\.idea\jsLibraryMappings.xml" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\.idea\runConfigurations\DjangoUeditor.xml" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\DjangoUeditor\static\UEditor\CHANGELOG.TXT" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\DjangoUeditor\static\UEditor\dialogs\code\code.html" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\DjangoUeditor\static\UEditor\themes\default\images\copy.png" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\DjangoUeditor\static\UEditor\themes\default\images\imgLable.png" afterPath="" />
+      <change type="DELETED" beforePath="E:\Work\Code\Django\DjangoUeditor\DjangoUeditor\static\UEditor\themes\default\images\localimage.png" afterPath="" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DUSite/test.db" afterPath="$PROJECT_DIR$/DUSite/test.db" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/imageUploader.swf" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/imageUploader.swf" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/wordimage/imageUploader.swf" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/wordimage/imageUploader.swf" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/themes/default/images/icons.gif" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/themes/default/images/icons.gif" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/themes/default/images/icons.png" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/themes/default/images/icons.png" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/DjangoUeditor.iml" afterPath="$PROJECT_DIR$/.idea/DjangoUeditor.iml" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/dictionaries/wxzhang.xml" afterPath="$PROJECT_DIR$/.idea/dictionaries/wxzhang.xml" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/runConfigurations/DjangoUeditor.xml" afterPath="$PROJECT_DIR$/.idea/runConfigurations/DjangoUeditor.xml" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/misc.xml" afterPath="$PROJECT_DIR$/.idea/misc.xml" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/vcs.xml" afterPath="$PROJECT_DIR$/.idea/vcs.xml" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DUSite/settings.py" afterPath="$PROJECT_DIR$/DUSite/settings.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/forms.py" afterPath="$PROJECT_DIR$/DjangoUeditor/forms.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/models.py" afterPath="$PROJECT_DIR$/DjangoUeditor/models.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/readme.txt" afterPath="$PROJECT_DIR$/DjangoUeditor/readme.txt" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/settings.py" afterPath="$PROJECT_DIR$/DjangoUeditor/settings.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/anchor/anchor.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/anchor/anchor.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/attachment/attachment.css" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/attachment/attachment.css" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/attachment/attachment.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/attachment/attachment.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/attachment/callbacks.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/attachment/callbacks.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/emotion/emotion.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/emotion/emotion.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/gmap/gmap.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/gmap/gmap.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/help/help.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/help/help.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/image.css" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/image.css" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/image.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/image.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/image.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/image/image.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/insertframe/insertframe.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/insertframe/insertframe.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/internal.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/internal.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/link/link.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/link/link.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/map/map.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/map/map.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/searchreplace/searchreplace.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/searchreplace/searchreplace.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/snapscreen/snapscreen.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/snapscreen/snapscreen.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/spechars/spechars.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/spechars/spechars.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/table/edittd.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/table/edittd.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/table/table.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/table/table.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/table/table.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/table/table.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/video/video.css" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/video/video.css" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/video/video.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/video/video.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/video/video.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/video/video.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/webapp/webapp.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/webapp/webapp.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.html" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/editor_all.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/editor_all.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/editor_all_min.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/editor_all_min.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/editor_config.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/editor_config.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/themes/default/ueditor.css" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/themes/default/ueditor.css" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/third-party/SyntaxHighlighter/shCore.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/third-party/SyntaxHighlighter/shCore.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/third-party/codemirror2.15/codemirror.js" afterPath="$PROJECT_DIR$/DjangoUeditor/static/UEditor/third-party/codemirror2.15/codemirror.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/templates/ueditor.html" afterPath="$PROJECT_DIR$/DjangoUeditor/templates/ueditor.html" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/urls.py" afterPath="$PROJECT_DIR$/DjangoUeditor/urls.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/utils.py" afterPath="$PROJECT_DIR$/DjangoUeditor/utils.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/views.py" afterPath="$PROJECT_DIR$/DjangoUeditor/views.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/DjangoUeditor/widgets.py" afterPath="$PROJECT_DIR$/DjangoUeditor/widgets.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/TestApp/forms.py" afterPath="$PROJECT_DIR$/TestApp/forms.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/TestApp/models.py" afterPath="$PROJECT_DIR$/TestApp/models.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/TestApp/views.py" afterPath="$PROJECT_DIR$/TestApp/views.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/readme.txt" afterPath="$PROJECT_DIR$/readme.txt" />
     </list>
     <ignored path="DjangoUeditor.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -29,28 +83,47 @@
   <component name="DaemonCodeAnalyzer">
     <disable_hints />
   </component>
-  <component name="DatabaseView">
-    <flatten value="false" />
-    <groupTables value="false" />
-  </component>
+  <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
   <component name="FavoritesManager">
     <favorites_list name="DjangoUeditor" />
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="models.py" pinned="false" current="true" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/DjangoUeditor/models.py">
+      <file leaf-file-name="widgets.py" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/DjangoUeditor/widgets.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="24" column="18" selection-start="1013" selection-end="1013" vertical-scroll-proportion="0.35947713">
+            <state line="11" column="28" selection-start="432" selection-end="432" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="e#14#38#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="forms.py" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/DjangoUeditor/forms.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="21" column="0" selection-start="1068" selection-end="1068" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="e#16#40#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="views.py" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/TestApp/views.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="26" column="9" selection-start="893" selection-end="893" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="widgets.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/DjangoUeditor/widgets.py">
+      <file leaf-file-name="models.py" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/TestApp/models.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="35" column="0" selection-start="1334" selection-end="1334" vertical-scroll-proportion="0.0">
+            <state line="18" column="88" selection-start="591" selection-end="603" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
@@ -59,34 +132,38 @@
       <file leaf-file-name="forms.py" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/TestApp/forms.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="6" column="30" selection-start="223" selection-end="223" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="12" column="11" selection-start="477" selection-end="497" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="e#14#38#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="views.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/TestApp/views.py">
+      <file leaf-file-name="models.py" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/DjangoUeditor/models.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="28" column="52" selection-start="909" selection-end="909" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="5" column="0" selection-start="206" selection-end="206" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="e#15#43#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="test.html" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/DUSite/templates/test.html">
+      <file leaf-file-name="settings.py" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/DjangoUeditor/settings.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="10" column="0" selection-start="231" selection-end="231" vertical-scroll-proportion="0.0">
+            <state line="40" column="1" selection-start="1517" selection-end="1517" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="models.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/TestApp/models.py">
+      <file leaf-file-name="settings.py" pinned="false" current="true" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/DUSite/settings.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="10" column="37" selection-start="329" selection-end="329" vertical-scroll-proportion="0.0">
+            <state line="161" column="20" selection-start="5658" selection-end="5658" vertical-scroll-proportion="0.4128114">
               <folding />
             </state>
           </provider>
@@ -100,25 +177,25 @@
     </FindUsagesManager>
   </component>
   <component name="Git.Settings">
-    <option name="PUSH_AUTO_UPDATE" value="true" />
-    <option name="SYNC_SETTING" value="DONT" />
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
   <component name="IdeDocumentHistory">
     <option name="changedFiles">
       <list>
-        <option value="$PROJECT_DIR$/DUSite/urls.py" />
+        <option value="$PROJECT_DIR$/TestApp/forms.py" />
         <option value="$PROJECT_DIR$/DjangoUeditor/templates/ueditor.html" />
-        <option value="$PROJECT_DIR$/DjangoUeditor/settings.py" />
-        <option value="$PROJECT_DIR$/DjangoUeditor/views.py" />
-        <option value="$PROJECT_DIR$/readme.txt" />
         <option value="$PROJECT_DIR$/DjangoUeditor/urls.py" />
+        <option value="$PROJECT_DIR$/readme.txt" />
+        <option value="$PROJECT_DIR$/DjangoUeditor/readme.txt" />
+        <option value="$PROJECT_DIR$/DjangoUeditor/views.py" />
+        <option value="$PROJECT_DIR$/DjangoUeditor/settings.py" />
         <option value="$PROJECT_DIR$/DjangoUeditor/models.py" />
         <option value="$PROJECT_DIR$/DjangoUeditor/widgets.py" />
         <option value="$PROJECT_DIR$/TestApp/models.py" />
         <option value="$PROJECT_DIR$/DjangoUeditor/utils.py" />
-        <option value="$PROJECT_DIR$/DUSite/settings.py" />
         <option value="$PROJECT_DIR$/TestApp/views.py" />
+        <option value="$PROJECT_DIR$/DjangoUeditor/forms.py" />
+        <option value="$PROJECT_DIR$/DUSite/settings.py" />
       </list>
     </option>
   </component>
@@ -128,14 +205,14 @@
     <option name="width" value="1382" />
     <option name="height" value="744" />
   </component>
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
     <OptionsSetting value="true" id="Add" />
     <OptionsSetting value="true" id="Remove" />
     <OptionsSetting value="true" id="Checkout" />
     <OptionsSetting value="true" id="Update" />
     <OptionsSetting value="true" id="Status" />
     <OptionsSetting value="true" id="Edit" />
-    <ConfirmationsSetting value="1" id="Add" />
+    <ConfirmationsSetting value="0" id="Add" />
     <ConfirmationsSetting value="0" id="Remove" />
   </component>
   <component name="ProjectReloadState">
@@ -154,16 +231,6 @@
       <sortByType />
     </navigator>
     <panes>
-      <pane id="Scope">
-        <subPane subId="Project Files">
-          <PATH>
-            <PATH_ELEMENT USER_OBJECT="Root">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-          </PATH>
-        </subPane>
-      </pane>
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -192,7 +259,7 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="DjangoUeditor" />
+              <option name="myItemId" value="TestApp" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
@@ -206,7 +273,7 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="DUSite" />
+              <option name="myItemId" value="DjangoUeditor" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
@@ -220,7 +287,7 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="DUSite" />
+              <option name="myItemId" value="DjangoUeditor" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
@@ -228,6 +295,30 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="DjangoUeditor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="DjangoUeditor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="DUSite" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+      <pane id="Scope">
+        <subPane subId="Project Files">
+          <PATH>
+            <PATH_ELEMENT USER_OBJECT="Root">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+          </PATH>
         </subPane>
       </pane>
     </panes>
@@ -235,10 +326,12 @@
   <component name="PropertiesComponent">
     <property name="options.splitter.main.proportions" value="0.3" />
     <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="recentsLimit" value="5" />
     <property name="options.lastSelected" value="com.jetbrains.django.DjangoModulesConfigurable" />
-    <property name="options.searchVisible" value="true" />
+    <property name="recentsLimit" value="5" />
+    <property name="restartRequiresConfirmation" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
     <property name="options.splitter.details.proportions" value="0.2" />
+    <property name="options.searchVisible" value="true" />
   </component>
   <component name="PyConsoleOptionsProvider">
     <option name="myPythonConsoleState">
@@ -248,23 +341,15 @@
       <PyConsoleSettings />
     </option>
   </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="E:\Work\Code\Django\DjangoUeditor" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="E:\Work\Code\Django\DjangoUeditor\DjangoUeditor" />
+    </key>
+  </component>
   <component name="RunManager" selected="Django server.DjangoUeditor">
-    <configuration default="true" type="DjangoTestsConfigurationType" factoryName="Django tests">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs>
-        <env name="PYTHONUNBUFFERED" value="1" />
-      </envs>
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <module name="DjangoUeditor" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <option name="TARGET" value="" />
-      <option name="SETTINGS_FILE" value="" />
-      <option name="CUSTOM_SETTINGS" value="false" />
-      <method />
-    </configuration>
     <configuration default="true" type="PythonConfigurationType" factoryName="Python">
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
@@ -339,6 +424,36 @@
       <option name="USE_PATTERN" value="false" />
       <method />
     </configuration>
+    <configuration default="true" type="JavascriptDebugSession" factoryName="Local">
+      <JSDebuggerConfigurationSettings>
+        <option name="engineId" value="embedded" />
+        <option name="fileUrl" />
+      </JSDebuggerConfigurationSettings>
+      <method />
+    </configuration>
+    <configuration default="false" name="DjangoUeditor" type="Python.DjangoServer" factoryName="Django server">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs>
+        <env name="PYTHONUNBUFFERED" value="1" />
+      </envs>
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="" />
+      <option name="IS_MODULE_SDK" value="false" />
+      <module name="DjangoUeditor" />
+      <option name="launchJavascriptDebuger" value="false" />
+      <option name="port" value="8000" />
+      <option name="host" value="" />
+      <option name="additionalOptions" value="" />
+      <option name="browserUrl" value="" />
+      <option name="runTestServer" value="false" />
+      <option name="runNoReload" value="false" />
+      <option name="useCustomRunCommand" value="false" />
+      <option name="customRunCommand" value="" />
+      <RunnerSettings RunnerId="PyDebugRunner" />
+      <ConfigurationWrapper RunnerId="PyDebugRunner" />
+      <method />
+    </configuration>
     <list size="1">
       <item index="0" class="java.lang.String" itemvalue="Django server.DjangoUeditor" />
     </list>
@@ -364,56 +479,31 @@
   </component>
   <component name="TaskManager">
     <task active="true" id="Default" summary="Default task">
-      <changelist id="1bcdded4-a933-47e3-aef4-259720d783c0" name="Default" comment="" />
-      <created>1344652076173</created>
-      <updated>1344652076173</updated>
+      <changelist id="a277f214-fdc3-4d56-a982-825f5989727e" name="Default" comment="" />
+      <created>1346741346086</created>
+      <updated>1346741346086</updated>
     </task>
-    <task id="LOCAL-00001" summary="support django 1.3">
-      <created>1346127105141</created>
-      <updated>1346127105141</updated>
-    </task>
-    <option name="localTasksCounter" value="2" />
     <servers />
   </component>
-  <component name="TodoView" selected-index="0">
-    <todo-panel id="selected-file">
-      <are-packages-shown value="false" />
-      <are-modules-shown value="false" />
-      <flatten-packages value="false" />
-      <is-autoscroll-to-source value="false" />
-    </todo-panel>
-    <todo-panel id="all">
-      <are-packages-shown value="false" />
-      <are-modules-shown value="false" />
-      <flatten-packages value="false" />
-      <is-autoscroll-to-source value="false" />
-    </todo-panel>
-    <todo-panel id="default-changelist">
-      <are-packages-shown value="false" />
-      <are-modules-shown value="false" />
-      <flatten-packages value="false" />
-      <is-autoscroll-to-source value="false" />
-    </todo-panel>
-  </component>
   <component name="ToolWindowManager">
     <frame x="-8" y="-8" width="1382" height="744" extended-state="6" />
     <editor active="true" />
     <layout>
-      <window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32954547" sideWeight="0.7314974" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32874355" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32744783" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.21742424" sideWeight="0.19449225" order="1" side_tool="true" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.22121212" sideWeight="0.59380376" order="0" side_tool="false" content_ui="combo" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.4061962" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.30454546" sideWeight="0.22030981" order="1" side_tool="true" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.30454546" sideWeight="0.5869191" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4130809" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.24096386" order="2" side_tool="true" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.2685026" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32874355" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32874355" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32874355" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32874355" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
       <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
@@ -441,7 +531,6 @@
     <option name="PERFORM_ADD_REMOVE_IN_BACKGROUND" value="true" />
     <option name="PERFORM_ROLLBACK_IN_BACKGROUND" value="false" />
     <option name="CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND" value="false" />
-    <option name="ENABLE_BACKGROUND_PROCESSES" value="false" />
     <option name="CHANGED_ON_SERVER_INTERVAL" value="60" />
     <option name="SHOW_ONLY_CHANGED_IN_SELECTION_DIFF" value="true" />
     <option name="CHECK_COMMIT_MESSAGE_SPELLING" value="true" />
@@ -451,13 +540,12 @@
     <option name="SOFT_WRAPS_IN_SHORT_DIFF" value="true" />
     <option name="INCLUDE_TEXT_INTO_PATCH" value="false" />
     <option name="INCLUDE_TEXT_INTO_SHELF" value="false" />
-    <option name="CREATE_PATCH_EXPAND_DETAILS_DEFAULT" value="true" />
     <option name="SHOW_FILE_HISTORY_DETAILS" value="true" />
     <option name="SHOW_VCS_ERROR_NOTIFICATIONS" value="true" />
     <option name="FORCE_NON_EMPTY_COMMENT" value="false" />
     <option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="false" />
-    <option name="LAST_COMMIT_MESSAGE" value="support django 1.3" />
-    <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
+    <option name="LAST_COMMIT_MESSAGE" />
+    <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="false" />
     <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
     <option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
     <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" />
@@ -469,96 +557,131 @@
     <option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
     <option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
     <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
-    <MESSAGE value="support django 1.3" />
   </component>
   <component name="XDebuggerManager">
-    <breakpoint-manager />
+    <breakpoint-manager>
+      <option name="time" value="11" />
+    </breakpoint-manager>
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/DjangoUeditor/urls.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/readme.txt">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="6" column="0" selection-start="173" selection-end="173" vertical-scroll-proportion="0.36263737" />
+        <state line="130" column="39" selection-start="4411" selection-end="4411" vertical-scroll-proportion="0.58064514">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DjangoUeditor/views.py">
+    <entry file="file://$PROJECT_DIR$/readme.txt">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="105" column="35" selection-start="3791" selection-end="3791" vertical-scroll-proportion="5.9095745" />
+        <state line="130" column="39" selection-start="4411" selection-end="4411" vertical-scroll-proportion="0.4516129">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/TestApp/tests.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/templates/ueditor.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
+        <state line="8" column="59" selection-start="662" selection-end="672" vertical-scroll-proportion="-4.096774">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DjangoUeditor/utils.py">
+    <entry file="file://$PROJECT_DIR$/DUSite/templates/test.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="11" column="21" selection-start="328" selection-end="328" vertical-scroll-proportion="-5.65873" />
+        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DjangoUeditor/settings.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/urls.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="49" column="7" selection-start="1880" selection-end="1880" vertical-scroll-proportion="0.0" />
+        <state line="16" column="1" selection-start="663" selection-end="663" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/debug.log">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/views.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
+        <state line="9" column="8" selection-start="222" selection-end="222" vertical-scroll-proportion="-2.2134147">
+          <folding>
+            <element signature="e#14#50#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DUSite/settings.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/models.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="123" column="12" selection-start="4504" selection-end="4511" vertical-scroll-proportion="7.0103626" />
+        <state line="5" column="0" selection-start="206" selection-end="206" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#15#43#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/readme.txt">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/utils.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="41" column="29" selection-start="1308" selection-end="1308" vertical-scroll-proportion="0.5699482" />
+        <state line="160" column="0" selection-start="5193" selection-end="5193" vertical-scroll-proportion="0.66768295">
+          <folding />
+        </state>
       </provider>
     </entry>
     <entry file="file://D:/Python27/Lib/site-packages/django/core/handlers/base.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="110" column="0" selection-start="4677" selection-end="4677" vertical-scroll-proportion="0.33333334" />
+        <state line="184" column="0" selection-start="8602" selection-end="8602" vertical-scroll-proportion="0.48230088">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://D:/Python27/Lib/site-packages/django/forms/models.py">
+    <entry file="file://$PROJECT_DIR$/TestApp/views.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="224" column="6" selection-start="8641" selection-end="8641" vertical-scroll-proportion="0.3322884" />
+        <state line="26" column="9" selection-start="893" selection-end="893" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/TestApp/forms.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/widgets.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="6" column="30" selection-start="223" selection-end="223" vertical-scroll-proportion="0.0" />
+        <state line="11" column="28" selection-start="432" selection-end="432" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#14#38#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DUSite/templates/test.html">
+    <entry file="file://$PROJECT_DIR$/TestApp/forms.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="10" column="0" selection-start="231" selection-end="231" vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="12" column="11" selection-start="477" selection-end="497" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#14#38#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/TestApp/models.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="10" column="37" selection-start="329" selection-end="329" vertical-scroll-proportion="0.0" />
+        <state line="18" column="88" selection-start="591" selection-end="603" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/TestApp/views.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/forms.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="28" column="52" selection-start="909" selection-end="909" vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="21" column="0" selection-start="1068" selection-end="1068" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#16#40#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DjangoUeditor/widgets.py">
+    <entry file="file://$PROJECT_DIR$/DjangoUeditor/settings.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="35" column="0" selection-start="1334" selection-end="1334" vertical-scroll-proportion="0.0">
+        <state line="40" column="1" selection-start="1517" selection-end="1517" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/DjangoUeditor/models.py">
+    <entry file="file://$PROJECT_DIR$/DUSite/settings.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="24" column="18" selection-start="1013" selection-end="1013" vertical-scroll-proportion="0.35947713">
+        <state line="161" column="20" selection-start="5658" selection-end="5658" vertical-scroll-proportion="0.4128114">
           <folding />
         </state>
       </provider>

+ 5 - 1
DUSite/settings.py

@@ -158,6 +158,10 @@ UEDITOR_SETTINGS = {
                 "testb":[[ 'source', '|','bold', 'italic', 'underline']]
                 },
     'images_upload':{
-        'max_size':0
+        'max_size':0,
+        'path':"asd"
+    },
+    'scrawl_upload':{
+        'path':'scrawlabc'
     }
 }

BIN
DUSite/settings.pyc


BIN
DUSite/test.db


+ 31 - 15
DjangoUeditor/forms.py

@@ -2,25 +2,41 @@
 
 from django import forms
 from widgets import UEditorWidget
-from utils import FixFilePath
+from utils import MadeUeditorOptions
 
 class UEditorField(forms.CharField):
-    def __init__(self,label,width=600,height=300,plugins=(),toolbars="normal",filePath="",imagePath="",imageManagerPath="",css="",options={}, *args, **kwargs):
-        uOptions={}
-        uOptions['filePath']=filePath
-        uOptions['css']=css
-        uOptions['imagePath']=imagePath
-        uOptions['plugins']=plugins
-        uOptions['toolbars']=toolbars
-        uOptions['options']=options
-        if len(imageManagerPath)==0:
-            uOptions['imageManagerPath']=uOptions['imagePath']
-        else:
-            uOptions['imageManagerPath']=FixFilePath(imageManagerPath)
-        uOptions['width']=width
-        uOptions['height']=height
+    def __init__(self,label,width=600,height=300,plugins=(),toolbars="normal",filePath="",imagePath="",scrawlPath="",imageManagerPath="",css="",options={}, *args, **kwargs):
+        uOptions=MadeUeditorOptions(width,height,plugins,toolbars,filePath,imagePath,scrawlPath,imageManagerPath,css,options)
         kwargs["widget"]=UEditorWidget(**uOptions)
         kwargs["label"]=label
         super(UEditorField,self).__init__( *args, **kwargs)
 
+def UpdateUploadPath(widget,model_inst=None):
+    try:
+        from DjangoUeditor.models import UEditorField as ModelUEditorField
+        for field in model_inst._meta.fields:
+            if isinstance(field, ModelUEditorField):
+                if  callable(field.ueditor_options["O_imagePath"]):
+                    newPath=field.ueditor_options["O_imagePath"](model_inst)
+                    widget.__getitem__(field.name).field.widget.ueditor_options["imagePath"] =newPath
+                    if field.ueditor_options["O_imageManagerPath"]=="":widget.__getitem__(field.name).field.widget.ueditor_options["imageManagerPath"] =newPath
+                    if field.ueditor_options["O_scrawlPath"]=="":widget.__getitem__(field.name).field.widget.ueditor_options["scrawlPath"] =newPath
+                if  callable(field.ueditor_options["O_filePath"]):
+                    widget.__getitem__(field.name).field.widget.ueditor_options["filePath"] =field.ueditor_options["O_filePath"](model_inst)
+                if  callable(field.ueditor_options["O_imageManagerPath"]):
+                    widget.__getitem__(field.name).field.widget.ueditor_options["imageManagerPath"] =field.ueditor_options["O_imageManagerPath"](model_inst)
+                if  callable(field.ueditor_options["O_scrawlPath"]):
+                    widget.__getitem__(field.name).field.widget.ueditor_options["scrawlPath"] =field.ueditor_options["O_scrawlPath"](model_inst)
+    except:
+        pass
 
+class UEditorModelForm(forms.ModelForm):
+    def __init__(self,*args,**kwargs):
+        super(UEditorModelForm,self).__init__(*args,**kwargs)
+        try:
+            if kwargs.has_key("instance"):
+                UpdateUploadPath(self,kwargs["instance"])
+            else:
+                UpdateUploadPath(self,None)
+        except Exception:
+            pass

BIN
DjangoUeditor/forms.pyc


+ 6 - 16
DjangoUeditor/models.py

@@ -2,7 +2,7 @@
 from django.db import models
 from django.contrib.admin import widgets as admin_widgets
 from DjangoUeditor.widgets import UEditorWidget,AdminUEditorWidget
-from utils import FixFilePath
+from utils import MadeUeditorOptions
 
 class UEditorField(models.TextField):
     """
@@ -17,26 +17,16 @@ class UEditorField(models.TextField):
         options:其他UEditor参数,字典类型
         css:编辑器textarea的CSS样式
     """
-    def __init__(self,verbose_name,width=600,height=300,plugins=(),toolbars="normal",filePath="",imagePath="",imageManagerPath="",css="",options={},**kwargs):
-        uOptions={}
-        uOptions['css']=css
-        uOptions['imagePath']=FixFilePath(imagePath)
-        uOptions['filePath']=FixFilePath(filePath)
-        if len(imageManagerPath)==0:
-            uOptions['imageManagerPath']=uOptions['imagePath']
-        else:
-            uOptions['imageManagerPath']=FixFilePath(imageManagerPath)
-        uOptions['plugins']=plugins
-        uOptions['toolbars']=toolbars
-        uOptions['options']=options
-        uOptions['width']=width
-        uOptions['height']=height
-        self.ueditor_options=uOptions
+    def __init__(self,verbose_name,width=600,height=300,plugins=(),toolbars="normal",filePath="",imagePath="",scrawlPath="",imageManagerPath="",css="",options={},**kwargs):
+        self.ueditor_options=MadeUeditorOptions(width,height,plugins,toolbars,filePath,imagePath,scrawlPath,imageManagerPath,css,options)
         kwargs["verbose_name"]=verbose_name
+
         super(UEditorField,self).__init__(**kwargs)
+
     def formfield(self,**kwargs):
         defaults = {'widget': UEditorWidget(**self.ueditor_options)}
         defaults.update(kwargs)
         if defaults['widget'] == admin_widgets.AdminTextareaWidget:
             defaults['widget'] = AdminUEditorWidget(**self.ueditor_options)
         return super(UEditorField, self).formfield(**defaults)
+

BIN
DjangoUeditor/models.pyc


+ 89 - 7
DjangoUeditor/readme.txt

@@ -1,4 +1,4 @@
-Ueditor HTML编辑器是百度开源的HTML编辑器,
+Ueditor HTML编辑器是百度开源的HTML编辑器,
 
 本模块帮助在Django应用中集成百度Ueditor HTML编辑器。
 安装包中已经集成Ueditor v1.2.2
@@ -22,7 +22,7 @@ Ueditor HTML编辑器是百度开源的HTML编辑器,
 
 3、在urls.py中增加:
 
-	url(r'^ueditor/',include('DjangoUeditor.urls' ),name='ueditor'),
+	url(r'^ueditor/',include('DjangoUeditor.urls' )),
 
 4、在models中这样定义:
 	
@@ -37,6 +37,7 @@ Ueditor HTML编辑器是百度开源的HTML编辑器,
         toolbars:配置你想显示的工具栏,取值为mini,normal,full,代表小,一般,全部。如果默认的工具栏不符合您的要求,您可以在settings里面配置自己的显示按钮。参见后面介绍。
         imagePath:图片上传的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹
         filePath:附件上传的路径,如"files/",实现上传到"{{MEDIA_ROOT}}/files"文件夹
+        scrawlPath:涂鸦文件上传的路径,如"scrawls/",实现上传到"{{MEDIA_ROOT}}/scrawls"文件夹,如果不指定则默认=imagepath
         imageManagerPath:图片管理器显示的路径,如"imglib/",实现上传到"{{MEDIA_ROOT}}/imglib",如果不指定则默认=imagepath。
         options:其他UEditor参数,字典类型。参见Ueditor的文档ueditor_config.js里面的说明。
         css:编辑器textarea的CSS样式
@@ -64,10 +65,91 @@ Ueditor HTML编辑器是百度开源的HTML编辑器,
 	
 	widgets.UEditorWidget和forms.UEditorField的输入参数与上述models.UEditorField一样。
 
-
-6、其他事项:
-
-    **本程序基于百度ueditor 1.2.2,安装包里面已经包括了,不需要再额外安装。
+6、Settings配置
+     
+      在Django的Settings可以配置以下参数:
+            UEDITOR_SETTINGS={
+                "toolbars":{           #定义多个工具栏显示的按钮,允行定义多个
+                    "name1":[[ 'source', '|','bold', 'italic', 'underline']],
+                    "name2",[]
+                },
+                "images_upload":{
+                    "allow_type":"jpg,png",    #定义允许的上传的图片类型
+                    "max_size":"2222kb"        #定义允许上传的图片大小,0代表不限制
+                },
+                "files_upload":{
+                     "allow_type":"zip,rar",   #定义允许的上传的文件类型
+                     "max_size":"2222kb"       #定义允许上传的文件大小,0代表不限制
+                 },,
+                "image_manager":{
+                     "location":""         #图片管理器的位置,如果没有指定,默认跟图片路径上传一样
+                },
+            }
+7、在模板里面:
+
+    <head>
+        ......
+        {{ form.media }}        #这一句会将所需要的CSS和JS加进来。
+        ......
+    </head>
+    注:运行collectstatic命令,将所依赖的css,js之类的文件复制到{{STATIC_ROOT}}文件夹里面。
+
+8、高级运用:
+
+     ****************
+     动态指定imagePath、filePath、scrawlPath、imageManagerPath
+     ****************
+     这几个路径文件用于保存上传的图片或附件,您可以直接指定路径,如:
+          UEditorField('内容',imagePath="uploadimg/")
+     则图片会被上传到"{{MEDIA_ROOT}}/uploadimg"文件夹,也可以指定为一个函数,如:
+
+      def getImagePath(model_instance=None):
+          return "abc/"
+      UEditorField('内容',imagePath=getImagePath)
+      则图片会被上传到"{{MEDIA_ROOT}}/abc"文件夹。
+     ****************
+     使上传路径(imagePath、filePath、scrawlPath、imageManagerPath)与Model实例字段值相关
+     ****************
+        在有些情况下,我们可能想让上传的文件路径是由当前Model实例字值组名而成,比如:
+        class Blog(Models.Model):
+            Name=models.CharField('姓名',max_length=100,blank=True)
+            Description=UEditorField('描述',blank=True,imagePath=getUploadPath,toolbars="full")
+
+     id  |   Name    |       Description
+     ------------------------------------
+     1   |   Tom     |       ...........
+     2   |   Jack    |       ...........
+
+      我们想让第一条记录上传的图片或附件上传到"{{MEDIA_ROOT}}/Tom"文件夹,第2条记录则上传到"{{MEDIA_ROOT}}/Jack"文件夹。
+      该怎么做呢,很简单。
+      def getUploadPath(model_instance=None):
+          return "%s/" % model_instance.Name
+      在Model里面这样定义:
+      Description=UEditorField('描述',blank=True,imagePath=getUploadPath,toolbars="full")
+      这上面model_instance就是当前model的实例对象。
+      还需要这样定义表单对象:
+      from  DjangoUeditor.forms import UEditorModelForm
+      class UEditorTestModelForm(UEditorModelForm):
+            class Meta:
+                model=Blog
+      特别注意:
+         **表单对象必须是继承自UEditorModelForm,否则您会发现model_instance总会是None。
+         **同时在Admin管理界面中,此特性无效,model_instance总会是None。
+         **在新建表单中,model_instance由于还没有保存到数据库,所以如果访问model_instance.pk可能是空的。因为您需要在getUploadPath处理这种情况
+
+
+class UEditorTestModelForm(UEditorModelForm):
+    class Meta:
+        model=Blog
+
+
+
+
+8、其他事项:
+
+    **本程序版本号采用a.b.ccc,其中a.b是本程序的号,ccc是ueditor的版本号,如1.2.122,1.2是DjangoUeditor的版本号,122指Ueditor 1.2.2.
+    **本程序安装包里面已经包括了Ueditor,不需要再额外安装。
     **目前暂时不支持ueditor的插件
+    **别忘记了运行collectstatic命令,该命令可以将ueditor的所有文件复制到{{STATIC_ROOT}}文件夹里面
     **Django默认开启了CSRF中间件,因此如果你的表单没有加入{% csrf_token %},那么当您上传文件和图片时会失败
-    **支持Django的admin界面,但是工具栏显示会有缩进,目前还不知道怎么解决,可能是django的CSS有冲突。
+   

+ 10 - 3
DjangoUeditor/settings.py

@@ -5,7 +5,6 @@ from django.conf import settings as gSettings   #全局设置
 TOOLBARS_SETTINGS={
     "mini":[['source','|','undo', 'redo', '|','bold', 'italic', 'underline','formatmatch','autotypeset', '|', 'forecolor', 'backcolor','|', 'link', 'unlink','|','insertimage','attachment']],
     "normal":[['source','|','undo', 'redo', '|','bold', 'italic', 'underline','removeformat', 'formatmatch','autotypeset', '|', 'forecolor', 'backcolor','|', 'link', 'unlink','|','insertimage', 'emotion','attachment', '|','inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols']],
-    "full":None
 }
 
 #引入的第三方插件元组
@@ -14,16 +13,23 @@ THIRD_PARTY_PLUGINS=()
 #允许上传的图片类型
 UPLOAD_IMAGES_SETTINGS={
     "allow_type":"jpg,bmp,png,gif,jpeg",         #文件允许格式
+    "path":"",
     "max_size":0                                #文件大小限制,单位KB,0不限制
 }
 #允许上传的附件类型
 UPLOAD_FILES_SETTINGS={
     "allow_type":"zip,rar,doc,docx,xls,xlsx,ppt,pptx,swf,dat,avi,rmvb,txt,pdf",         #文件允许格式
+    "path":"",
     "max_size":0                               #文件大小限制,单位KB,0不限制
 }
+#涂鸦上传
+SCRAWL_FILES_SETTINGS={
+    "path":"",
+}
+
 #图片管理器地址
 IMAGE_MANGER_SETTINGS={
-    "location":""                  #图片管理器的位置,如果没有指定,默认跟图片路径上传一样
+    "path":""                  #图片管理器的位置,如果没有指定,默认跟图片路径上传一样
 }
 
 UEditorSettings={
@@ -31,6 +37,7 @@ UEditorSettings={
     "images_upload":UPLOAD_IMAGES_SETTINGS,
     "files_upload":UPLOAD_FILES_SETTINGS,
     "image_manager":IMAGE_MANGER_SETTINGS,
+    "scrawl_upload":SCRAWL_FILES_SETTINGS
 }
 
 #更新配置:从用户配置文件settings.py重新读入配置UEDITOR_SETTINGS,
@@ -39,7 +46,7 @@ def UpdateUserSettings():
     for k in UEditorSettings.iterkeys():
         try:
             UEditorSettings[k].update(UserSettings.pop(k,{}))
-        except:
+        except Exception:
             pass
     UEditorSettings.update(UserSettings)
 

BIN
DjangoUeditor/settings.pyc


+ 0 - 208
DjangoUeditor/static/UEditor/CHANGELOG.TXT

@@ -1,208 +0,0 @@
-Ueditor Change List
-
-Version 1.2.2
-1.编辑器不可编辑时,可以配置哪些功能可以使用,例如全屏
-2.table的边框为0时,采用虚线显示
-3.修复firefox下插入大量代码时,代码格式显示不正确的问题
-4.附件上传成功后显示初始文件名
-5.自定制下载优化
-6.当图片上传超时时,增加提示信息
-7.修复自动排版对H1不生效的问题
-8.修复插入超链接,超链接地址包含script标签,预览时会执行script语句的问题
-
-
-Version 1.2.1
-1.插入表情时,按住CTRL键可连续插入多个表情
-2.按住CTRL+Enter提交表单
-3.增加readonly属性在editor_config.js,编辑器实例上增加setEnabled,setDisabled方法,设置编辑区域是否可以编辑
-4.Editor上添加了getPlainTxt方法,得到编辑器的纯文本内容,但会保留段落格式
-5.修正了initialContent赋值失效的问题,赋值顺序以标签内容为先,如果没有再看initialContent内容。
-6.为insertHtml命令添加了过滤机制
-7.getContent将“&nbsp;”转成空格,连续2个空格则以“ &nbsp;”表示
-8.当选区在一个超链接中,就可以在弹出层中直接修改这个超链接中的文本
-9.与后台交互的路径整体进行了调整
-10.超链接窗口可以修改超链接显示的文字
-11.增加插入百度应用的功能
-12.为每个plugin的在代码中添加了配置项的容错代码,若配置项不存在,不会报错
-13.提供后台的jsp版本
-14.重写了ui和和编辑器的交互层,dialog改为显示时创建,整体代码减少22k
-15.修正了代码高亮跟jquery冲突的问题
-16.改进了多个编辑器实例,使用一个name做为form提交,后台都可以取到
-17.添加是否删除空的inlineElement节点(包括嵌套的情况)的配置项:autoClearEmptyNode
-18.修正了chrome下粘贴文本带有white-space样式, 导致编辑器内容不能折行的问题
-19.在配置项中增加isShow设置初始化时是否显示编辑器,在编辑器实例上增加setShow,setHide方法设置编辑器的显示/隐藏
-20.修正在jquery中实例化编辑器时与UE自带的domready冲突的问题
-21.修正代码高亮中的行号与代码内容不能对齐的问题
-22.新增了图片上传对话框中可自定义配置默认Tab的功能
-23.修正.net源码包中gbk版本的乱码以及demo中使用了php路径的问题
-
-Version 1.2.0
-1.远程图片抓取
-3.源码模式下css进行了简写
-4.增加了baidu图片搜索功能,搜索图片然后直接插入到编辑器中
-5.重写了浮动工具栏,支持混乱模式下的工具栏滚动
-6.服务器图片在线管理
-7.word的本地图片取得寛高
-8.附件上传
-9.自动排版
-10.优化了状态反射的方式,改为编辑器获得焦点才会触发,失去焦点不在触发状态查询
-11.添加了上来就可以全屏的配置项哦去焦点之前的选区
-13.优化了查询状态反射的性能
-14.添加了contentchagne事件
-15.重写了autoheight插件,去掉setInterval的方式,并且长高时不在跳动
-16.插入视频,可以预览,并且界面加入了视屏搜索功能,并且可以插入视屏预览图到编辑器中
-17.单元格属性编辑
-18.ie下的截屏功能
-19.加强了table的dialog功能
-20.改进了autolink的效果,例如: dddhttp://www.baidu.com 回车,http://www.baidu.com也可以被匹配到了
-21.文件上传提供flash源码
-22.修改了行间距的展示方式
-23.段间距变为段前距和段后距
-24.提供了.net的事例代码
-25.首页提供了功能选择生成下载的新功能
-26.首页文档进行了改进
-27.分页符可以删除
-28.增强了表格的编辑功能
-
-Version 1.1.8
-1.避免了重复加载源码高亮的核心代码
-2.修复了word粘贴table过滤出错问题
-3.修复插入地图会出现style="undefined"的问题
-4.优化了list,多个相邻的属性一直的list会合并
-5.可以在列表中的一行里产生多行的效果(通过回车再回退操作),类似office的效果
-6.添加自定义样式功能
-7.修了在chrome下右键删除td里的图片会把整个td删除的问题
-8.改进了不同的页面调用一个editor,URL问题
-9.增加了颜色选择器的颜色
-10.改进了提供的后台程序的安全性
-11.代码高亮支持折行
-12.改进了源码编辑模式下的性能(ie下),并且支持自动换行
-13.修改了在destroy之后会在ie下报错的问题
-14.给初始化容器name值,那么在后台取值的键值就是name给定的值,方便多实例在一个form下提交
-15.支持插入script/style这样的标签
-16.修复了列表里插入浮动图片,图片不占位问题
-17.源码模式下,去掉了pre中的&nbsp;
-18.完善了_example下的demo例子
-19.base64的图片被过滤掉了
-
-Version 1.1.7.3
-1.支持图片相对路径模式
-2.word粘贴首行缩进问题
-3.添加了图片边距
-4.提供了图片等比压缩时基准边选择配置的功能
-5.dialog在某些页面不显示问题
-6.添加了行内间距的调整
-7.在editor实例下添加了destroy方法
-8.全屏按钮位置不对的问题
-9.iframe.css支持相对和绝对路径
-10.修正了focus方法在ff下失效的问题
-11.提供了对FF3.6的支持
-12.添加了Shift+Enter软回车功能
-10.统一了颜色rgb转成#
-
-
-version 1.1.7.2
-1.去掉了iframe.css 改为在editor_config.js中配置,避免css文件找不到的问题
-2.给下拉菜单添加了默认的文字说明
-3.Ueditor.css去掉了对外部页面css的影响
-4.修正了ie9下,编辑器的高度不随着内容缩短的问题
-5.修正了粘贴有时会出现粘贴失败的情况
-6.修正了在ie下点击图片会出现js错误的问题
-7.修正了在ie下选全部替换,回退,再替换会出现替换失败的问题
-8.增加表情本地化模式,可在config中配置是否开启本地化
-9.flash的多图片上传
-10.支持了源码模式的下的代码高亮
-11.增加插入代码支持的语言,改进了插入代码的展示效果
-12.增加了字数统计
-13.增加了对图片的排版操作
-14.解决ie6和ie7下工具栏浮动时cpu占用过高的bug
-15.优化了文本模式粘贴的效果
-16.优化了word粘贴的效果
-17.在word粘贴本地图片时添加引导上传功能
-18.更好的ie9支持
-19.优化首行缩进效果
-20.使用script标签代替textarea标签作为编辑器容器,简化前后端转码的配置。
-21.优化了路径配置,修正了1.1.7.1中需要修改多处路径的问题
-22.增加了图片操作浮层的开关配置
-23.同时支持网络图片和本地图片的等比缩放
-24.优化了源码模式下的代码格式
-
-version 1.1.6.1
-1.去掉了iframe.css 改为在editor_config.js中配置,避免css文件找不到的问题
-2.给下拉菜单添加了默认的文字说明
-3.Ueditor.css去掉了对外部页面css的影响
-4.修正了ie9下,编辑器的高度不随着内容缩短的问题
-5.修正了粘贴有时会出现粘贴失败的情况
-6.修正了在ie下点击图片会出现js错误的问题
-7.修正了在ie下选全部替换,回退,再替换会出现替换失败的问题
-
-
-
-
-
-version 1.1.6
-1. 插入日期按钮现在使用tangram日历控件
-2. table可再编辑
-3. 粘贴excel表格的问题
-4. ff下最大化和切换源码出现光标不能跟着键盘改变和不能切出输入法的问题
-5. tab按键功能
-6. 支持多级列表
-7. 超链接可以在非ie下去除下划线
-8. 字体,字号,在editor-config.js中可配置
-
-
-
-version 1.1.5
-1.右键的策略,只显示选区内可操作的条目
-2.禁止elementpath还会留下边框问题
-3.字体改为了px
-4.插入分页符
-5.整合浮动toolbar为autofloat插件
-6.初始化的值会在第一次操作前清除,而且不在有延迟感
-7.配置项都放到了editor-config.js中
-8.修正了多实例的问题
-9.插入iframe功能
-10.粘贴过滤掉内容会有提示,没过滤任何内容不会出现提示
-11.修正代码高亮的显示效果
-12.list放弃原生改为手动实现,修正一系列原生的bug
-13.初始给个textarea会把内容取出作为初始值
-14.去掉了源码状态下冗余的table/td/pre的style属性
-15.fixed剪切出去会带start/end
-16.fixex源码模式下getContent内容不是新的
-17.table加入了设置背景颜色和边框颜色
-
-
-
-Version 1.1.4
-1.  锚点
-2.  首行缩进
-3.  行间距
-4.  右键菜单
-5.  插入代码
-6.  文件上传(php版本)
-7.  修复一些bug
-
-Version 1.1.3
-1.  修复chrome下粘贴的bug
-2.  自动转换office粘入的有序列表和无序列表
-3.  插入图片不再等比缩放,显示原始大小
-
-Version 1.1.2
-1.  修正IE9下autoHeight插件会一直长高的问题
-2.  增加对IE6下大写style属性的转换处理(现统一转换成小写)
-3.  格式刷
-4.  上下标互斥
-5.  form提交的支持
-6.  增加了focus属性,可以初始化时,设置是否编辑器获得焦点
-7.  增加了下滑线,删除线按钮,去掉了原来的下拉框
-8.  autolink支持,使非ie在输入链接时能自动加上a标签
-9.  google地图支持
-10. 修正了一些bug
-
-Version 1.1
-1.	修改了删除链接的机制,允许一次性删除多个超链接
-2.	改变了目录结构,方便部署(大大减少了开发代码过程中需要引入的js数量)
-3.	修正部分bug
-
-Version 1.0 (2011-7-8)
-1.	完成功能的开发

+ 3 - 3
DjangoUeditor/static/UEditor/dialogs/anchor/anchor.html

@@ -3,8 +3,7 @@
 <html>
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-        <title>插入锚点</title>
-        <script type="text/javascript" src="../internal.js"></script>
+        <title></title>
         <style type="text/css">
             *{color: #838383;margin: 0;padding: 0}
             html,body {font-size: 12px;overflow: hidden; }
@@ -14,8 +13,9 @@
     </head>
     <body>
         <div class="content">
-            <span>锚点名字:</span><input id="anchorName"  value="" />
+            <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
         </div>
+        <script type="text/javascript" src="../internal.js"></script>
         <script type="text/javascript">
             var anchorInput = $G('anchorName'),
                 node = editor.selection.getRange().getClosedNode();

+ 2 - 2
DjangoUeditor/static/UEditor/dialogs/attachment/attachment.css

@@ -8,7 +8,7 @@
     padding-left: 6px;
 }
 #divStatus {display:inline-block; width:336px;color: #aaa;font-size: 12px; }
-#startUpload{cursor: pointer;margin-right: 10px; float: right; display: inline-block; background: url(../../themes/default/images/upload.png) no-repeat ; width: 100px;height: 30px}
+#startUpload{cursor: pointer;margin-right: 10px; float: right; display: inline-block; width: 100px;height: 30px}
 div.fieldset {
 	border:  1px solid #afe14c;
 	padding: 10px 10px;
@@ -32,7 +32,7 @@ div.flash {
 }
 
 .progressWrapper {
-	width: 420px;
+	width: 412px;
 	overflow: hidden;
 }
 

+ 10 - 10
DjangoUeditor/static/UEditor/dialogs/attachment/attachment.html

@@ -2,14 +2,14 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>附件上传</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
     <link rel="stylesheet" type="text/css" href="attachment.css"/>
 </head>
 <body>
 <div class="wrapper">
     <div class="controller">
-        <span id="divStatus">本次共成功上传 0 个文件</span>
+        <!--<span id="divStatus"></span>-->
         <span id="spanButtonPlaceHolder"></span>
     </div>
     <div class="fieldset flash" id="fsUploadProgress"></div>
@@ -48,11 +48,11 @@
             debug:false,
 
             // 按钮设置
-            button_image_url:"../../themes/default/images/fileScan.png",
+            button_image_url:"../../themes/default/images/filescan.png",
             button_width:"100",
             button_height:"25",
             button_placeholder_id:"spanButtonPlaceHolder",
-            button_text:'<span class="theFont">文件浏览…</span>',
+            button_text:'<span class="theFont">'+lang.browseFiles+'</span>',
             button_text_style:".theFont { font-size:14px;}",
             button_text_left_padding:10,
             button_text_top_padding:4,
@@ -85,13 +85,13 @@
                 var progress = new FileProgress(file, this.customSettings.progressTarget);
                 if(info.state=="SUCCESS"){
                     progress.setComplete();
-                    progress.setStatus("<span style='color: #0b0;font-weight: bold'>上传成功!</span>");
+                    progress.setStatus("<span style='color: #0b0;font-weight: bold'>"+lang.uploadSuccess+"</span>");
                     filesList.push({url:info.url,type:info.fileType,original:info.original});
-                    progress.toggleCancel(true,this,"从成功队列中移除");
+                    progress.toggleCancel(true,this,lang.delSuccessFile);
                 }else{
                     progress.setError();
                     progress.setStatus(info.state);
-                    progress.toggleCancel(true,this,"移除保存失败文件");
+                    progress.toggleCancel(true,this,lang.delFailSaveFile);
                 }
 
             },
@@ -100,9 +100,9 @@
             //队列完成回调
             queue_complete_handler:function(numFilesUploaded){
                 dialog.buttons[0].setDisabled(false);
-                var status = $G("divStatus");
-                var num = status.innerHTML.match(/\d+/g);
-                status.innerHTML = "本次共成功上传 "+((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +" 个文件" ;
+//                var status = $G("divStatus");
+//                var num = status.innerHTML.match(/\d+/g);
+//                status.innerHTML = ((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +lang.statusPrompt;
             }
         };
         swfupload = new SWFUpload( settings );

+ 23 - 23
DjangoUeditor/static/UEditor/dialogs/attachment/callbacks.js

@@ -13,20 +13,20 @@ The FileProgress class is not part of SWFUpload.
    ********************** */
 function preLoad() {
 	if (!this.support.loading) {
-		alert("当前Flash版本过低,请更新FlashPlayer后重试!");
+		alert(lang.flashVersionError);
 		return false;
 	}
     return true;
 }
 function loadFailed() {
-	alert("SWFUpload加载失败!请检查路径或网络状态");
+	alert(lang.flashLoadingError);
 }
 
 function fileQueued(file) {
 	try {
 		var progress = new FileProgress(file, this.customSettings.progressTarget);
-		progress.setStatus("等待上传……");
-		progress.toggleCancel(true, this,"从上传队列中移除");
+		progress.setStatus(lang.fileUploadReady);
+		progress.toggleCancel(true, this,lang.delUploadQueue);
 	} catch (ex) {
 		this.debug(ex);
 	}
@@ -36,30 +36,30 @@ function fileQueued(file) {
 function fileQueueError(file, errorCode, message) {
 	try {
 		if (errorCode === SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
-			alert("单次不能选择超过"+ message +  "个文件!请重新选择!");
+			alert(lang.limitPrompt1+ message +  lang.limitPrompt2);
 			return;
 		}
 
 		var progress = new FileProgress(file, this.customSettings.progressTarget);
 		progress.setError();
-        progress.toggleCancel(true, this,"移除失败文件");
+        progress.toggleCancel(true, this,lang.delFailFile);
 
 		switch (errorCode) {
 		case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
-			progress.setStatus("文件大小超出限制!");
+			progress.setStatus(lang.fileSizeLimit);
 			this.debug("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
-			progress.setStatus("空文件无法上传!");
+			progress.setStatus(lang.emptyFile);
 			this.debug("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
-			progress.setStatus("文件类型错误!");
+			progress.setStatus(lang.fileTypeError);
 			this.debug("Error Code: Invalid File Type, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		default:
 			if (file !== null) {
-				progress.setStatus("未知错误!");
+				progress.setStatus(lang.unknownError);
 			}
 			this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
@@ -79,8 +79,8 @@ function uploadStart(file) {
 		we can do is say we are uploading.
 		 */
 		var progress = new FileProgress(file, this.customSettings.progressTarget);
-		progress.setStatus("上传中,请等待……");
-		progress.toggleCancel(true, this,"取消上传");
+		progress.setStatus(lang.fileUploading);
+		progress.toggleCancel(true, this,lang.cancelUpload);
 	}catch (ex) {}
 
 	return true;
@@ -92,7 +92,7 @@ function uploadProgress(file, bytesLoaded, bytesTotal) {
 
 		var progress = new FileProgress(file, this.customSettings.progressTarget);
 		progress.setProgress(percent);
-		progress.setStatus("上传中,请等待……");
+		progress.setStatus(lang.fileUploading);
 	} catch (ex) {
 		this.debug(ex);
 	}
@@ -107,27 +107,27 @@ function uploadError(file, errorCode, message) {
 
 		switch (errorCode) {
 		case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
-			progress.setStatus("网络错误: " + message);
+			progress.setStatus(lang.netError + message);
 			this.debug("Error Code: HTTP Error, File name: " + file.name + ", Message: " + message);
 			break;
 		case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
-			progress.setStatus("上传失败!");
+			progress.setStatus(lang.failUpload);
 			this.debug("Error Code: Upload Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		case SWFUpload.UPLOAD_ERROR.IO_ERROR:
-			progress.setStatus("服务器IO错误!");
+			progress.setStatus(lang.serverIOError);
 			this.debug("Error Code: IO Error, File name: " + file.name + ", Message: " + message);
 			break;
 		case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
-			progress.setStatus("无权限!");
+			progress.setStatus(lang.noAuthority);
 			this.debug("Error Code: Security Error, File name: " + file.name + ", Message: " + message);
 			break;
 		case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
-			progress.setStatus("上传个数限制");
+			progress.setStatus(lang.fileNumLimit);
 			this.debug("Error Code: Upload Limit Exceeded, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
-			progress.setStatus("验证失败,本次上传被跳过!");
+			progress.setStatus(lang.failCheck);
 			this.debug("Error Code: File Validation Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
@@ -135,14 +135,14 @@ function uploadError(file, errorCode, message) {
 //			if (this.getStats().files_queued === 0) {
 //				document.getElementById(this.customSettings.cancelButtonId).disabled = true;
 //			}
-			progress.setStatus("取消中,请等待……");
+			progress.setStatus(lang.fileCanceling);
 			progress.setCancelled();
 			break;
 		case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
-			progress.setStatus("上传已停止……");
+			progress.setStatus(lang.stopUploading);
 			break;
 		default:
-			progress.setStatus("未知错误!" + errorCode);
+			progress.setStatus(lang.unknownError + errorCode);
 			this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
 			break;
 		}
@@ -162,5 +162,5 @@ function uploadComplete(file) {
 function queueComplete(numFilesUploaded) {
 	var status = document.getElementById("divStatus");
     var num = status.innerHTML.match(/\d+/g);
-	status.innerHTML = "本次共成功上传 "+((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +" 个文件" ;
+	status.innerHTML = ((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +lang.statusPrompt;
 }

+ 30 - 0
DjangoUeditor/static/UEditor/dialogs/background/background.css

@@ -0,0 +1,30 @@
+*{margin:0;padding:0;}
+.wrap{ padding: 5px;}
+body{font-size: 12px;color: #888;overflow: hidden;}
+input,label{vertical-align:middle}
+.clear{clear: both;}
+.pl{padding-left: 23px;padding-left: 28px\9;}
+
+
+.tabheade {position: relative;width: 410px;z-index: 10;}
+.tabheade span{display: inline-block;width: 82px;height: 30px;text-align: center;cursor: pointer;line-height: 30px;border: 1px solid #CCC;background: url("../../themes/default/images/dialog-title-bg.png") repeat-x;}
+.tabheade span.focus{border-bottom: none;height: 31px;background-color: white;}
+
+.tabbody{border: 1px solid #CCC;width: 428px;height: 225px;_height: 228px;margin: 0 auto;position: relative;top: -1px;}
+.tabbody .panel{position: absolute;width: 420px;height: 225px;background: white;}
+
+#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
+#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
+#imageList img {cursor: pointer;border: 2px solid white;}
+
+.bgarea{margin: 10px;padding: 5px;height: 84%;}
+.content div{margin: 10px 0 10px 5px;}
+.content .iptradio{margin-right: 10px;}
+.txt{width:280px;}
+
+.wrapcolor{height: 19px;}
+div.color{float: left;margin: 0;}
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
+div.alignment,#custom{margin-left: 30px;margin-left: 35px\9;}
+#custom input{height: 15px;min-height: 15px;width:20px;}
+#repeatType{width:100px;}

+ 55 - 0
DjangoUeditor/static/UEditor/dialogs/background/background.html

@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <link rel="stylesheet" type="text/css" href="background.css">
+</head>
+<body>
+    <div id="bg_container" class="wrap">
+        <div id="tabhead" class="tabheade">
+            <span class="focus" tabsrc="normal"><var id="lang_background_normal"></var></span>
+            <span class="" tabsrc="imgManager"><var id="lang_background_local"></var></span>
+        </div>
+        <div id="tabbody" class="tabbody">
+            <div id="normal" class="panel">
+                <fieldset  class="bgarea">
+                    <legend><var id="lang_background_set"></var></legend>
+                    <div class="content">
+                        <div>
+                            <input class="iptradio" type="radio" name="t" value="none" checked="checked" onclick="net(this)"><label><var id="lang_background_none"></var></label>
+                        </div>
+                        <div class="wrapcolor">
+                            <div class="color">
+                                <input class="iptradio" type="radio" name="t" value="color" onclick="net(this)"><label><var id="lang_background_color"></var>:</label>
+                            </div>
+                            <div id="colorPicker"></div>
+                            <div class="clear"></div>
+                        </div>
+                        <div class="wrapcolor pl">
+                            <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
+                        </div>
+                        <div id="alignment" class="alignment">
+                            <var id="lang_background_align"></var>:<select id="repeatType" onchange="selectAlign(this)">
+                                <option value="center"></option>
+                                <option value="repeat-x"></option>
+                                <option value="repeat-y"></option>
+                                <option value="repeat"></option>
+                                <option value="self"></option>
+                            </select>
+                        </div>
+                        <div id="custom" >
+                            <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
+                        </div>
+                    </div>
+                </fieldset>
+
+            </div>
+            <div id="imgManager" class="panel">
+                <div id="imageList" style=""></div>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="background.js"></script>
+</body>
+</html>

+ 421 - 0
DjangoUeditor/static/UEditor/dialogs/background/background.js

@@ -0,0 +1,421 @@
+var me = editor,
+    doc = me.document,
+    bodyStyle,
+    cp = $G( "colorPicker" ),
+    bkbodyStyle = "",
+    bkcolor = "";
+    var popup = new UE.ui.Popup( {
+        content:new UE.ui.ColorPicker( {
+            noColorText:me.getLang( "clearColor" ),
+            editor:me,
+            onpickcolor:function ( t, color ) {
+                domUtils.setStyle( cp, "background-color", color );
+                bkcolor = color;
+                UE.ui.Popup.postHide();
+            },
+            onpicknocolor:function ( t, color ) {
+                domUtils.setStyle( cp, "background-color", "transparent" );
+                bkcolor = "";
+                UE.ui.Popup.postHide();
+            }
+        } ),
+        editor:me,
+        onhide:function(){
+            setBody();
+        }
+    } );
+    domUtils.on( cp, "click", function () {
+        popup.showAnchor( this );
+    } );
+    domUtils.on( document, 'mousedown', function ( evt ) {
+        var el = evt.target || evt.srcElement;
+        UE.ui.Popup.postHide( el );
+    } );
+    domUtils.on( window, 'scroll', function () {
+        UE.ui.Popup.postHide();
+    } );
+    //获得head
+    var getHead = function(){
+        return domUtils.getElementsByTagName($G("tabhead"),"span");
+    };
+    //给head绑定事件
+    var bindClick = function(){
+        var heads = getHead();
+        for(var i=0,head;head=heads[i++];){
+            head.onclick = function(){
+                var bodyid = this.getAttribute("tabsrc");
+                toggleHead(this);
+                toggleBody(bodyid);
+                if(bodyid == "imgManager"){
+                    ajax.request( editor.options.imageManagerUrl, {
+                        timeout:100000,
+                        action:"get",
+                        onsuccess:function ( xhr ) {
+                            var tmp = utils.trim(xhr.responseText),
+                                    imageUrls = !tmp ? [] : tmp.split( "ue_separate_ue" ),
+                                    length = imageUrls.length,
+                                    imgList = $G( "imageList" );
+                            imgList.innerHTML = !length ? "&nbsp;&nbsp;"+lang.noUploadImage : "";
+                            for ( var k = 0, ci; ci = imageUrls[k++]; ) {
+                                var img = document.createElement( "img" );
+                                var div = document.createElement( "div" );
+                                div.appendChild( img );
+                                div.style.display = "none";
+                                imgList.appendChild( div );
+                                img.onclick = function () {
+                                    var nodes = imgList.childNodes;
+                                    for(var i=0,node;node=nodes[i++];){
+                                        node.firstChild.removeAttribute( "selected" );
+                                        node.firstChild.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
+                                    }
+                                    changeSelected( this );
+                                };
+                                img.onload = function () {
+                                    this.parentNode.style.display = "";
+                                    var w = this.width, h = this.height;
+                                    scale( this, 95, 120, 80 );
+                                    this.title = lang.toggleSelect + w + "X" + h;
+                                };
+                                img.setAttribute( k < 35 ? "src" : "lazy_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig,"") );
+                                img.setAttribute( "data_ue_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig,"") );
+
+                            }
+                        },
+                        onerror:function () {
+                            $G( "imageList" ).innerHTML = lang.imageLoadError;
+                        }
+                    } );
+                }else{
+                    var radios = document.getElementsByName("t");
+                    for(var i=0,r;r=radios[i++];){
+                        if(r.checked&&r.value!="none"){
+                            $G("repeatType").style.display="";
+                        }
+                    }
+                }
+            }
+        }
+    };
+    /**
+     * 改变o的选中状态
+     * @param o
+     */
+    function changeSelected( o ) {
+        if ( o.getAttribute( "selected" ) ) {
+            o.removeAttribute( "selected" );
+            o.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
+        } else {
+            o.setAttribute( "selected", "true" );
+            o.style.cssText = "filter:alpha(Opacity=50);-moz-opacity:0.5;opacity: 0.5;border:2px solid blue;";
+        }
+        $G("url").value = o.getAttribute("src")
+    }
+    /**
+     * 图片缩放
+     * @param img
+     * @param max
+     */
+    function scale( img, max, oWidth, oHeight ) {
+        var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
+        if ( ow > max || oh > max ) {
+            if ( ow >= oh ) {
+                if ( width = ow - max ) {
+                    percent = (width / ow).toFixed( 2 );
+                    img.height = oh - oh * percent;
+                    img.width = max;
+                }
+            } else {
+                if ( height = oh - max ) {
+                    percent = (height / oh).toFixed( 2 );
+                    img.width = ow - ow * percent;
+                    img.height = max;
+                }
+            }
+        }
+    }
+    //切换body
+    var toggleBody = function(id){
+        var bodys = ["normal","imgManager"];
+        for(var i=0,body;body=bodys[i++];){
+            $G(body).style.zIndex = body == id?200:1;
+        }
+    };
+    //切换head
+    var toggleHead = function(obj){
+        var heads = getHead();
+        for(var i=0,head;head=heads[i++];){
+            domUtils.removeClasses(head,["focus"]);
+            $G("repeatType").style.display = "none";
+        }
+        domUtils.addClass(obj,"focus");
+    };
+    //获得当前选中的tab
+    var getCheckedTab = function(){
+        var heads = getHead();
+        for(var i=0,head;head=heads[i++];){
+            if(domUtils.hasClass(head,"focus")){
+                return head;
+            }
+        }
+    };
+
+
+    var init = function(){
+        bindClick();
+        getHead()[0].click();
+        $G("alignment").style.display = "none";
+        $G("custom").style.display = "none";
+        //初始化颜色
+        domUtils.setStyle(cp,"background-color",domUtils.getComputedStyle(doc.body,"background-color"));
+        var color = domUtils.getComputedStyle(doc.body,"background-color");
+        if((color && color!="#ffffff" && color!="transparent")||domUtils.getComputedStyle(doc.body,"background-image")!="none"){
+            setTimeout(function(){
+                document.getElementsByName("t")[1].click();
+            },200);
+        }
+        initImgUrl();
+		initSelfPos();
+        initAlign();
+    };
+    //初始化自定义位置
+    function initSelfPos(){
+		var x,y;
+		if(browser.ie){
+			x = domUtils.getComputedStyle(doc.body,"background-position-x").replace(/50%|%|px|center/ig,"");
+			y = domUtils.getComputedStyle(doc.body,"background-position-y").replace(/50%|%|px|center/ig,"");
+		}else{
+		    var arr = domUtils.getComputedStyle(doc.body,"background-position").match(/\s?(\d*)px/ig);
+			if(arr&&arr.length){
+				x = arr[0].replace("px","");
+				y = arr[1].replace("px","");
+			}
+		}
+		$G("x").value = x || 0;
+		$G("y").value = y || 0;
+    }
+    //初始化图片地址
+    function initImgUrl(){
+        var su = domUtils.getComputedStyle(doc.body,"background-image"),
+            url="";
+        if(su.indexOf(me.options.imagePath)>0){
+            url = su.match(/url\("?(.*[^\)"])"?/i);
+            if(url && url.length){
+                url =  url[1].substring(url[1].indexOf(me.options.imagePath),url[1].length);
+            }
+        }else{
+            url =  su!="none" ? su.replace(/url\("?|"?\)/ig,""):"";
+        }
+        $G("url").value = url;
+    }
+    //初始化定位
+    function initAlign(){
+        var align = domUtils.getComputedStyle(doc.body,"background-repeat"),
+            alignType = $G("repeatType");
+        if(align == "no-repeat"){
+            var pos = domUtils.getComputedStyle(doc.body,browser.ie?"background-position-x":"background-position");
+            alignType.value = pos&&pos.match(/\s?(\d*)px/ig) ? "self":"center";
+            if(pos == "center"){
+                alignType.value = "center";
+            }
+            $G("custom").style.display = alignType.value=="self" ? "" : "none";
+        }else{
+            alignType.value = align;
+        }
+    }
+    init();
+//样式表工具
+function Stylesheet(ss){
+    if(typeof ss == "number")
+    ss = doc.styleSheets[ss];
+    this.ss = ss;
+}
+Stylesheet.prototype.getRules = function(){
+    return this.ss.cssRules?this.ss.cssRules:this.ss.rules;
+};
+Stylesheet.prototype.getRule = function(s){
+    var rules = this.getRules();
+    if(!rules)return null;
+    if(typeof s == 'number')return rules[s];
+    s = s.toLowerCase();
+    for(var i=rules.length-1;i>=0;i--){
+        if(rules[i].selectorText.toLowerCase() == s)return rules[i];
+    }
+    return null;
+};
+Stylesheet.prototype.getStyleText = function(s){
+    var rule = this.getRule(s);
+    if(rule&&rule.style&&rule.style.cssText) return rule.style.cssText;
+    else return "";
+};
+Stylesheet.prototype.insertRule = function(selector,styles,n){
+    if(!n){
+        var rules = this.getRules();
+        rules.length&&this.deleteRule(rules.length-1);
+    }
+    if(this.ss.insertRule)
+        this.ss.insertRule(selector+"{"+styles+"}",0);
+    else if(this.ss.addRule)
+        this.ss.addRule(selector,styles,0);
+};
+Stylesheet.prototype.deleteRule = function(s){
+    if(!s){
+        var rules = this.getRules();
+        s = rules.length-1;
+    }
+    if(typeof s!="number"){
+        s = s.toLowerCase();
+        var rules = this.getRules();
+        for(var i=rules.length-1;i>=0;i--){
+            if(rules[i].selectorText.toLowerCase()==s){
+                s = i;
+                break;
+            }
+        }
+        if(i==-1)return;
+    }
+    if(this.ss.deleteRule)this.ss.deleteRule(s);
+    else if(this.ss.removeRule)this.ss.removeRule(s);
+};
+
+
+//获得选中的类型
+function getCheckIpt(){
+    var ipts = document.getElementsByName("t");
+    for(var i=0,ipt;ipt=ipts[i++];){
+        if(ipt.checked){
+            return ipt.value;
+        }
+    }
+}
+var net = function(obj){
+    var align = $G("alignment"),
+        url = $G("url"),
+        custom = $G("custom");
+    if(obj.value == "none"){
+        align.style.display = "none";
+        custom.style.display = "none";
+        if ( browser.ie ) {
+            url.onpropertychange = null;
+        }else{
+            url.removeEventListener("input",setBody);
+        }
+    }else{
+        bindSelfPos();
+        $G("repeatType").style.display="";
+        align.style.display = "";
+        if ( browser.ie ) {
+            url.onpropertychange = setBody;
+        } else {
+            url.addEventListener( "input", setBody, false );
+        }
+    }
+    setBody();
+};
+//给自定义位置绑定事件
+var bindSelfPos = function(){
+    var x = $G("x"),
+        y = $G("y");
+    domUtils.on(x,["propertychange","input","keydown"],function(evt){
+        bindkeydown(evt,this);
+    });
+    domUtils.on(y,["propertychange","input","keydown"],function(evt){
+        bindkeydown(evt,this);
+    });
+    function bindkeydown(evt,obj){
+        evt = evt || event;
+        if(evt.keyCode==38||evt.keyCode==40){
+            obj.value = evt.keyCode == 38 ? parseInt(obj.value)+1 : parseInt(obj.value)-1;
+            if(obj.value<0){
+                obj.value = 0;
+            }
+        }else{
+            if(evt.keyCode<48&&evt.keyCode>57){
+                domUtils.preventDefault(evt);
+            }
+        }
+        setBody();
+    }
+};
+var showAlign = function(){
+    $G("alignment").style.display = "";
+};
+var selectAlign = function(obj){
+    $G("custom").style.display = obj.value == "self" ? "" : "none";
+    setBody();
+};
+//给body增加样式和背景图片
+var setBody=function(){
+    var color = domUtils.getStyle(cp,"background-color"),
+        bgimg = $G("url").value,
+        align = $G("repeatType").value,
+        alignObj = {
+            "background-repeat":"no-repeat",
+            "background-position":"center center"
+        },
+        outstr = [];
+        if(color)
+        alignObj["background-color"] = color;
+        if(bgimg)
+        alignObj["background-image"] = 'url("'+bgimg+'")';
+        switch(align){
+            case "repeat-x":
+                alignObj["background-repeat"] = "repeat-x;";
+                break;
+            case "repeat-y":
+                alignObj["background-repeat"] = "repeat-y;";
+                break;
+            case "repeat":
+                alignObj["background-repeat"] = "repeat;";
+                break;
+            case "self":
+                alignObj["background-position"] = $G("x").value+"px "+$G("y").value+"px";
+                break;
+        }
+    for ( var name in alignObj ) {
+        if ( alignObj.hasOwnProperty( name ) ) {
+            outstr.push(name+":"+alignObj[name]);
+        }
+    }
+    if(getCheckIpt()!="none"){
+        setStyleSheet(outstr.join(";"));
+    }else{
+        setStyleSheet(" ");
+    }
+};
+function getStyleSheet(){
+    bodyStyle = doc.getElementsByTagName("head")[0].lastChild;
+    if(/style/ig.test(bodyStyle.tagName)){
+        var len = doc.styleSheets.length-1;
+        var ss = new Stylesheet(len);
+        bkbodyStyle = ss.getStyleText(0);
+    }else{
+        bodyStyle = null;
+    }
+}
+
+var setStyleSheet = function(stylestr){
+    if(bodyStyle){
+        var len = doc.styleSheets.length-1;
+        var ss = new Stylesheet(len);
+        ss.insertRule("body",stylestr);
+    }else{
+        if(browser.ie){
+            bodyStyle = doc.createStyleSheet();
+            bodyStyle.cssText = stylestr;
+        }else{
+            bodyStyle = domUtils.creElm(doc,"style",{"type":"text/css"});
+            bodyStyle.innerHTML = stylestr;
+            doc.head.appendChild(bodyStyle);
+        }
+    }
+    bkbodyStyle = bkbodyStyle||stylestr;
+};
+dialog.onok = function(){
+    setBody();
+};
+dialog.oncancel = function(){
+        var len = doc.styleSheets.length-1;
+        var ss = new Stylesheet(len);
+        ss.insertRule("body",bkbodyStyle||" ");
+};
+getStyleSheet();

+ 8 - 8
DjangoUeditor/static/UEditor/dialogs/emotion/emotion.html

@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-    <title>插入表情</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="robots" content="noindex, nofollow"/>
     <link rel="stylesheet" type="text/css" href="emotion.css">
@@ -9,13 +9,13 @@
 <body>
 <div id="tabPanel" class="neweditor-tab">
     <div id="tabMenu" class="neweditor-tab-h">
-        <div>精选</div>
-        <div>兔斯基</div>
-        <div>绿豆蛙</div>
-        <div>BOBO</div>
-        <div>baby猫</div>
-        <div>泡泡</div>
-        <div>有啊</div>
+        <div><var id="lang_input_choice"></var></div>
+        <div><var id="lang_input_Tuzki"></var></div>
+        <div><var id="lang_input_lvdouwa"></var></div>
+        <div><var id="lang_input_BOBO"></var></div>
+        <div><var id="lang_input_babyCat"></var></div>
+        <div><var id="lang_input_bubble"></var></div>
+        <div><var id="lang_input_youa"></var></div>
     </div>
     <div id="tabContent" class="neweditor-tab-b">
         <div id="tab0"></div>

+ 61 - 57
DjangoUeditor/static/UEditor/dialogs/gmap/gmap.html

@@ -3,9 +3,8 @@
 <html>
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <title>Google地图</title>
+    <title></title>
     <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
-    <script type="text/javascript" src="../internal.js"></script>
     <style type="text/css">
         *{color: #838383}
         body {
@@ -27,67 +26,72 @@
 <div class="content">
     <table>
         <tr>
-            <td><label for="address">地址:</label></td>
-            <td><input id="address" type="text" value="北京市" /></td>
-            <td><a href="javascript:doSearch()" class="doSearch">搜索</a></td>
+            <td><label for="address"><var id="lang_input_address"></var></label></td>
+            <td><input id="address" type="text" /></td>
+            <td><a id="doSearch" href="javascript:void(0)" class="doSearch"><var id="lang_input_search"></var></a></td>
         </tr>
     </table>
     <div id="container" style="width: 520px; height: 340px; border: 1px solid gray;"></div>
 </div>
+<script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
-    var map = new google.maps.Map(document.getElementById('container'), {
-        zoom: 3,
-        streetViewControl: false,
-        scaleControl: true,
-        mapTypeId: google.maps.MapTypeId.ROADMAP
-    });
-    var imgcss;
-    var marker = new google.maps.Marker({
-        map: map,
-        draggable: true
+    utils.domReady(function(){
+        var map = new google.maps.Map(document.getElementById('container'), {
+                zoom: 3,
+                streetViewControl: false,
+                scaleControl: true,
+                mapTypeId: google.maps.MapTypeId.ROADMAP
+            });
+            var imgcss;
+            var marker = new google.maps.Marker({
+                map: map,
+                draggable: true
+            });
+            function doSearch(){
+                var address = document.getElementById('address').value;
+                var geocoder = new google.maps.Geocoder();
+                geocoder.geocode( { 'address': address}, function (results, status) {
+                    if (status == google.maps.GeocoderStatus.OK) {
+                        var bounds = results[0].geometry.viewport;
+                        map.fitBounds(bounds);
+                        marker.setPosition(results[0].geometry.location);
+                        marker.setTitle(address);
+                    } else alert(lang.searchError);
+                });
+            }
+            $G('address').onkeydown = function (evt){
+                evt = evt || event;
+                if (evt.keyCode == 13) {
+                    doSearch();
+                }
+            };
+            $G("doSearch").onclick = doSearch;
+            dialog.onok = function (){
+                var center = map.getCenter();
+                var point = marker.getPosition();
+                var url = "http://maps.google.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
+                editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
+            };
+
+            function getPars(str,par){
+                var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+                return reg.exec(str)[1];
+            }
+            var img = editor.selection.getRange().getClosedNode();
+            if(img && img.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1){
+                var url = img.getAttribute("src");
+                var centers = getPars(url,"center").split(",");
+                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
+                map.setCenter(point);
+                map.setZoom(Number(getPars(url,"zoom")));
+                centers = getPars(url,"markers").split(",");
+                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
+                imgcss = img.style.cssText;
+            }else{
+                doSearch();
+            }
     });
-    function doSearch(){
-        var address = document.getElementById('address').value;
-        var geocoder = new google.maps.Geocoder();
-        geocoder.geocode( { 'address': address}, function (results, status) {
-            if (status == google.maps.GeocoderStatus.OK) {
-                var bounds = results[0].geometry.viewport;
-                map.fitBounds(bounds);
-                marker.setPosition(results[0].geometry.location);
-                marker.setTitle(address);
-            } else alert('无法定位到该地址!');
-        });
-    }
-    document.getElementById('address').onkeydown = function (evt){
-        evt = evt || event;
-        if (evt.keyCode == 13) {
-            doSearch();
-        }
-    };
-    dialog.onok = function (){
-        var center = map.getCenter();
-        var point = marker.getPosition();
-        var url = "http://maps.google.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
-        editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
-    };
-    
-    function getPars(str,par){
-        var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
-        return reg.exec(str)[1];
-    }
-    var img = editor.selection.getRange().getClosedNode();
-    if(img && img.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1){
-        var url = img.getAttribute("src");
-        var centers = getPars(url,"center").split(",");
-        point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
-        map.setCenter(point);
-        map.setZoom(Number(getPars(url,"zoom")));
-        centers = getPars(url,"markers").split(",");
-        marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
-        imgcss = img.style.cssText;
-    }else{
-        doSearch();
-    }
+
 </script>
 </body>
 </html>

+ 20 - 20
DjangoUeditor/static/UEditor/dialogs/help/help.html

@@ -4,7 +4,6 @@
 <head>
     <title>帮助</title>
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
-    <script type="text/javascript" src="../internal.js"></script>
     <style type="text/css">
         .head .tab-current{
             background-color:#7DEBFF;
@@ -40,83 +39,84 @@
 <body>
 <div class="warp">
     <div id="head" class="head">
-        <span class="act" onclick="toggle(0)">关于UEditor</span>
-        <span class="def" onclick="toggle(1)">快捷键</span>
+        <span class="act" onclick="toggle(0)"><var id="lang_input_about"></var></span>
+        <span class="def" onclick="toggle(1)"><var id="lang_input_shortcuts"></var></span>
     </div>
     <div class="content">
         <div id="cont0">
 
 <h1>UEditor</h1>
-<p>版本:1.2.2</p>
-<p>Ueditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于BSD协议,允许自由使用和使用代码</p>
+<p><var id="lang_input_version"></var></p>
+<p><var id="lang_input_introduction"></var></p>
 
         </div>
         <div id="cont1" class="hide">
             <table>
                 <thead>
                 <tr>
-                    <td>快捷键</td>
-                    <td>功能</td>
+                    <td><var id="lang_Txt_shortcuts"></var></td>
+                    <td><var id="lang_Txt_func"></var></td>
                 </tr>
                 </thead>
                 <tbody>
                 <tr>
                     <td>ctrl+b</td>
-                    <td>给选中字设置为加粗</td>
+                    <td><var id="lang_Txt_bold"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+c</td>
-                    <td>复制选中内容</td>
+                    <td><var id="lang_Txt_copy"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+x</td>
-                    <td>剪切选中内容</td>
+                    <td><var id="lang_Txt_cut"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+v</td>
-                    <td>粘贴</td>
+                    <td><var id="lang_Txt_Paste"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+y</td>
-                    <td>重新执行上次操作</td>
+                    <td><var id="lang_Txt_undo"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+z</td>
-                    <td>撤销上一次操作</td>
+                    <td><var id="lang_Txt_redo"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+i</td>
-                    <td>给选中字设置为斜体</td>
+                    <td><var id="lang_Txt_italic"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+u</td>
-                    <td>给选中字加下划线</td>
+                    <td><var id="lang_Txt_underline"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+a</td>
-                    <td>全部选中</td>
+                    <td><var id="lang_Txt_selectAll"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+shift+c</td>
-                    <td>清除页面文字格式</td>
+                    <td><var id="lang_Txt_removeFormat"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+shift+l</td>
-                    <td>页面文字居左显示</td>
+                    <td><var id="lang_Txt_leftJustification"></var></td>
                 </tr>
                 <tr>
                     <td>ctrl+shift+r</td>
-                    <td>页面文字居右显示</td>
+                    <td><var id="lang_Txt_rightJustification"></var></td>
                 </tr>
                 <tr>
                     <td>shift+enter</td>
-                    <td>软回车</td>
+                    <td><var id="lang_Txt_visualEnter"></var></td>
                 </tr>
                 </tbody>
             </table>
         </div>
     </div>
 </div>
+<script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
     function getChildrenByClassName (parentClass,childtag){
         var divs = document.getElementsByTagName("div"),

+ 4 - 4
DjangoUeditor/static/UEditor/dialogs/code/code.html → DjangoUeditor/static/UEditor/dialogs/highlightcode/highlightcode.html

@@ -3,8 +3,7 @@
 <html>
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-        <title>插入代码</title>
-        <script type="text/javascript" src="../internal.js"></script>
+        <title></title>
         <style type="text/css">
             html,body{
                 _overflow:hidden;
@@ -17,7 +16,7 @@
     <body>
     <div class="wrapper">
         <p>
-            <label for="language">选择语言</label>
+            <label for="language"><var id="lang_input_selectLang"></var></label>
             <select id="language">
                 <option value="as3">ActionScript3</option>
                 <option value="bash">Bash/Shell</option>
@@ -47,6 +46,7 @@
         </p>
         <label for="code"></label><textarea id="code" cols="" rows=""></textarea>
     </div>
+    <script type="text/javascript" src="../internal.js"></script>
         <script type="text/javascript">
             var sels = $G("language"),
                 code = $G('code');
@@ -100,7 +100,7 @@
                     editor.execCommand("highlightcode",code.value,language);
                     dialog.close();
                 }else{
-                    alert("请输入代码");
+                    alert(lang.importCode);
                 }
             };
             $focus(code);

+ 6 - 4
DjangoUeditor/static/UEditor/dialogs/image/image.css

@@ -10,6 +10,7 @@ body{font-size: 12px;color: #888;overflow: hidden;}
     text-align: center;
     cursor: pointer;
     line-height: 30px;
+    *margin-right: 5px;
     border: 1px solid #ccc;
     background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;
 }
@@ -39,12 +40,12 @@ td input {
     line-height: 40px;
     padding-top:13px;
 }
-.duiqi{background: url("../../themes/default/images/imgLable.png") -12px 2px no-repeat; width: 62px; height: 38px;float: left}
+#duiqi{ width: 62px; height: 38px;float: left}
 #remoteFloat div,#localFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin-left:1px;width:38px;height:36px;float:left;}
 #remoteFloat .focus,#localFloat .focus{opacity: 1;filter: alpha(opacity = 100)}
 #maskIframe{ width: 620px; height: 325px; position: absolute;z-index: 100; }
-#flashContainer { margin: 6px;}
-#upload{width: 100px;height: 30px;float: right; background: url("../../themes/default/images/upload.png");margin:3px 6px 0 0;cursor: pointer;}
+#flashContainer { margin: 6px;position: relative;}
+#upload{width: 100px;height: 30px;float: right; margin:3px 6px 0 0;cursor: pointer;}
 #imageList{width: 620px;height: 315px; margin-top: 10px;overflow:hidden;overflow-y: auto;}
 #imageList img{cursor: pointer ;border: 2px solid #fff}
 #imgManager #imageList div{float: left;width: 100px;height: 100px;margin: 5px 10px;}
@@ -60,8 +61,9 @@ td input {
     border: 1px solid #d7d7d7;
 }
 #imgSearchBtn,#imgSearchReset{
-    width: 80px;
+    width: 100%;
     height: 25px;
+    margin: 0 3px;
     line-height: 25px;
     background: #eee;
     border: 1px solid #d7d7d7;

+ 33 - 49
DjangoUeditor/static/UEditor/dialogs/image/image.html

@@ -2,7 +2,7 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>图片上传</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
     <link rel="stylesheet" href="image.css" type="text/css" />
 </head>
@@ -10,70 +10,69 @@
     <div class="wrapper">
         <div id="imageTab">
             <div id="tabHeads">
-                <span tabSrc="remote">网络图片</span>
-                <span tabSrc="local"  class="focus">本地上传</span>
-                <span tabSrc="imgManager">在线管理</span>
-                <span tabSrc="imgSearch">图片搜索</span>
+                <span tabSrc="remote"><var id="lang_tab_remote"></var></span>
+                <span tabSrc="local" class="focus"><var id="lang_tab_local"></var></span>
+                <span tabSrc="imgManager"><var id="lang_tab_imgManager"></var></span>
+                <span tabSrc="imgSearch"><var id="lang_tab_imgSearch"></var></span>
             </div>
             <div id="tabBodys">
                 <div id="remote" class="panel">
                     <table cellpadding="0" cellspacing="0">
                         <tr>
-                            <td class="label"><label for="url">地 址:</label></td>
+                            <td class="label"><label for="url"><var id="lang_input_url"></var></label></td>
                             <td><input id="url" type="text"/></td>
                         </tr>
                         <tr>
-                            <td class="label"><label for="width">宽 度:</label></td>
+                            <td class="label"><label for="width"><var id="lang_input_width"></var></label></td>
                             <td><input type="text" id="width"/> px</td>
                         </tr>
                         <tr>
-                            <td class="label"><label for="height">高 度:</label></td>
+                            <td class="label"><label for="height"><var id="lang_input_height"></var></label></td>
                             <td><input type="text" id="height"/> px</td>
                         </tr>
                         <tr>
-                            <td class="label"><label for="border">边 框:</label></td>
+                            <td class="label"><label for="border"><var id="lang_input_border"></var></label></td>
                             <td><input type="text" id="border"/> px</td>
                         </tr>
                         <tr>
-                            <td class="label"><label for="vhSpace">边 距:</label></td>
+                            <td class="label"><label for="vhSpace"><var id="lang_input_vhspace"></var></label></td>
                             <td><input type="text" id="vhSpace"/> px</td>
                         </tr>
                         <tr>
-                            <td class="label"><label for="title">描 述:</label></td>
+                            <td class="label"><label for="title"><var id="lang_input_title"></var></label></td>
                             <td><input type="text" id="title"/></td>
                         </tr>
                         <tr>
-                            <td class="label">对 齐:</td>
+                            <td class="label"><var id="lang_input_remoteAlign"></var></td>
                             <td id="remoteFloat"></td>
                         </tr>
                     </table>
 
                     <div id="preview"></div>
-                    <div class="lock"><input id="lock" type="checkbox" title="锁定宽高比例" checked="checked"></div>
+                    <div class="lock"><input id="lock" type="checkbox" checked="checked"></div>
                 </div>
                 <div id="local" class="panel">
                     <div id="flashContainer"></div>
-                    <div><div id="upload" style="display: none" ></div><div class="duiqi"></div><div id="localFloat"></div></div>
+                    <div><div id="upload" style="display: none" ></div><div id="duiqi"></div><div id="localFloat"></div></div>
                 </div>
                 <div id="imgManager" class="panel">
-                    <div id="imageList">&nbsp;&nbsp;图片加载中……</div>
-                    <!--<p id="pageControler">分页控制器</p>-->
+                    <div id="imageList"><var id="lang_imgLoading"></var></div>
                 </div>
                 <div id="imgSearch" class="panel">
                     <table style="margin-top: 5px;">
                         <tr>
-                            <td width="200"><input id="imgSearchTxt" value="请输入搜索关键词" type="text" /></td>
+                            <td width="200"><input id="imgSearchTxt" type="text" /></td>
                             <td width="65">
                                 <select id="imgType">
-                                    <!--<option value="&s=0&z=0">全部</option>-->
-                                    <option value="&s=4&z=0">新闻</option>
-                                    <option value="&s=1&z=19">壁纸</option>
-                                    <option value="&s=2&z=0">表情</option>
-                                    <option value="&s=3&z=0">头像</option>
+                                    <!--具体内容值将由国际化组件动态填充-->
+                                    <option value="&s=4&z=0"></option>
+                                    <option value="&s=1&z=19"></option>
+                                    <option value="&s=2&z=0"></option>
+                                    <option value="&s=3&z=0"></option>
                                 </select>
                             </td>
-                            <td width="80"><input id="imgSearchBtn" type="button" value="百度一下" /></td>
-                            <td width="80"><input id="imgSearchReset" type="button" value="清空搜索" /></td>
+                            <td width="80"><input id="imgSearchBtn" type="button"  /></td>
+                            <td width="80"><input id="imgSearchReset" type="button" /></td>
                         </tr>
                     </table>
                     <div id="searchList"></div>
@@ -91,20 +90,17 @@
         var imageUrls = [],          //用于保存从服务器返回的图片信息数组
             selectedImageCount = 0;  //当前已选择的但未上传的图片数量
 
-
         editor.setOpt({
             imageFieldName:"upfile",
             compressSide:0,
             maxImageSideLength:900
         });
-        window.onload = function(){
-            var timeout;
-            //创建Flash相关的参数集合
+        utils.domReady(function(){
             var flashOptions = {
                 container:"flashContainer",                                                    //flash容器id
                 url:editor.options.imageUrl,                                           // 上传处理页面的url地址
-                ext:'{"param1":"参数值1", "param2":"参数值2"}',                                 //可向服务器提交的自定义参数列表
-                fileType:'{"description":"图片", "extension":"*.gif;*.jpeg;*.png;*.jpg"}',     //上传文件格式限制
+                ext:'{"param1":"value1", "param2":"value2"}',                                 //可向服务器提交的自定义参数列表
+                fileType:'{"description":"'+lang.fileType+'", "extension":"*.gif;*.jpeg;*.png;*.jpg"}',     //上传文件格式限制
                 flashUrl:'imageUploader.swf',                                                  //上传用的flash组件地址
                 width:608,          //flash的宽度
                 height:272,         //flash的高度
@@ -114,17 +110,14 @@
                 picHeight:100,     // 单张预览图片的高度
                 uploadDataFieldName:editor.options.imageFieldName,    // POST请求中图片数据的key
                 picDescFieldName:'pictitle',      // POST请求中图片描述的key
-                maxSize:2,                         // 文件的最大体积,单位M
-                compressSize:1,                   // 上传前如果图片体积超过该值,会先压缩,单位M
+                maxSize:4,                         // 文件的最大体积,单位M
+                compressSize:2,                   // 上传前如果图片体积超过该值,会先压缩,单位M
                 maxNum:32,                         // 单次最大可上传多少个文件
-                backgroundUrl:'',                 // flash界面的背景图片,留空默认
-                listBackgroundUrl:'',            // 单个预览框背景,留空默认
-                buttonUrl:'',                     // 上传按钮背景,留空默认
                 compressSide:editor.options.compressSide,                 //等比压缩的基准,0为按照最长边,1为按照宽度,2为按照高度
                 compressLength:editor.options.maxImageSideLength        //能接受的最大边长,超过该值Flash会自动等比压缩
             };
             //回调函数集合,支持传递函数名的字符串、函数句柄以及函数本身三种类型
-            var callbacks={
+            var callbacks = {
                 // 选择文件的回调
                 selectFileCallback: function(selectFiles){
                     selectedImageCount += selectFiles.length;
@@ -142,7 +135,6 @@
 
                 // 单个文件上传完成的回调
                 uploadCompleteCallback: function(data){
-                    clearTimeout(timeout);
                     try{
                         var info = eval("(" + data.info + ")");
                         info && imageUrls.push(info);
@@ -152,31 +144,23 @@
                 },
                 // 单个文件上传失败的回调,
                 uploadErrorCallback: function (data){
-                    clearTimeout(timeout);
                     if(!data.info){
-                        alert("网络连接失败!请检查网络或者提交页面地址是否正确!")
+                        alert(lang.netError)
                     }
                     //console && console.log(data);
                 },
                 // 全部上传完成时的回调
                 allCompleteCallback: function(){
                     dialog.buttons[0].setDisabled(false);    //上传完毕后点亮按钮
-                },
-                // 开始上传某个文件时的回调
-                startUploadCallback: function(){
-                    timeout = setTimeout(function(){
-                        clearTimeout(timeout);
-                        if(!confirm("后台响应超时,点击确定继续等待,点击取消关闭上传框!")){
-                            dialog.close();
-                        }
-                    },10000 );
                 }
                 // 文件超出限制的最大体积时的回调
                 //exceedFileCallback: 'exceedFileCallback',
+                // 开始上传某个文件时的回调
+                //startUploadCallback: startUploadCallback
             };
             imageUploader.init(flashOptions,callbacks);
             
-        };
+        });
     </script>
 </body>
 </html>

+ 68 - 49
DjangoUeditor/static/UEditor/dialogs/image/image.js

@@ -12,12 +12,11 @@ var imageUploader = {};
             maskIframe = g( "maskIframe" ), //tab遮罩层,用来解决flash和其他dom元素的z-index层级不一致问题
             flashObj;               //flash上传对象
 
-    var flagImg = null;
+    var flagImg = null,flashContainer;
     imageUploader.init = function ( opt, callbacks ) {
         switchTab( "imageTab" );
         createAlignButton( ["remoteFloat", "localFloat"] );
         createFlash( opt, callbacks );
-
         var srcImg = editor.selection.getRange().getClosedNode();
         if ( srcImg ) {
             showImageInfo( srcImg );
@@ -40,13 +39,17 @@ var imageUploader = {};
         $focus( g( "url" ) );
     };
 
+    function insertImage(imgObjs){
+        editor.fireEvent('beforeInsertImage',imgObjs);
+        editor.execCommand( "insertImage", imgObjs );
+    }
     function searchImage() {
         var imgSearchInput = $G( "imgSearchTxt" );
         if ( !imgSearchInput.getAttribute( "hasClick" ) || !imgSearchInput.value ) {
             selectTxt( imgSearchInput );
             return;
         }
-        g( "searchList" ).innerHTML = "<p class='msg'>图片加载中,请稍后……</p>";
+        g( "searchList" ).innerHTML = "<p class='msg'>" + lang.imageLoading + "</p>";
         var key = imgSearchInput.value,
                 type = $G( "imgType" ).value,
                 url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + encodeToGb2312( key ) + type + "&" + +new Date;
@@ -58,7 +61,7 @@ var imageUploader = {};
             }
             var frg = document.createDocumentFragment();
             if ( imgObjs.length < 2 ) {
-                g( "searchList" ).innerHTML = "<p class='msg'> :( ,抱歉,没有找到图片!请重试一次!</p>";
+                g( "searchList" ).innerHTML = "<p class='msg'>"+lang.tryAgain+"</p>";
                 return;
             }
             for ( var i = 0, len = imgObjs.length; i < len - 1; i++ ) {
@@ -66,7 +69,7 @@ var imageUploader = {};
                 img.src = obj.objURL; //obj.thumbURL 为缩略图,只能针对百度内部使用
                 img.setAttribute( "sourceUrl", obj.objURL );
                 var title = obj.fromPageTitleEnc.replace( /^\.\.\./i, "" );
-                img.setAttribute( "title", "单击可切换选中状态\n原图尺寸: " + obj.width + "X" + obj.height );
+                img.setAttribute( "title", lang.toggleSelect + obj.width + "X" + obj.height );
                 img.onclick = function () {
                     changeSelected( this );
                 };
@@ -99,7 +102,7 @@ var imageUploader = {};
         g( "imgSearchTxt" ).onclick = function () {
             selectTxt( this );
             this.setAttribute( "hasClick", true );
-            if ( this.value == "请输入搜索关键词" ) {
+            if ( this.value == lang.searchInitInfo ) {
                 this.value = "";
             }
         };
@@ -167,12 +170,18 @@ var imageUploader = {};
                 case "imgSearch":
                     return insertSearch( "searchList", true );
                     break;
-                default:
-                    return;
             }
+        };
+        dialog.oncancel = function(){
+            hideFlash();
         }
     }
 
+    function hideFlash(){
+        flashObj = null;
+        flashContainer.innerHTML = "";
+    }
+
     /**
      * 将元素id下的所有图片文件插入到编辑器中。
      * @param id
@@ -188,8 +197,9 @@ var imageUploader = {};
                 imgObjs.push( img );
             }
         }
-        editor.execCommand( "insertImage", imgObjs );
+        insertImage(imgObjs);
         catchRemote && editor.fireEvent( "catchRemoteImage" );
+        hideFlash();
     }
 
     /**
@@ -216,8 +226,9 @@ var imageUploader = {};
         imgObj.vspace = imgObj.hspace = vhSpace.value;
         imgObj.title = title.value;
         imgObj.style = "width:" + width.value + "px;height:" + height.value + "px;";
-        editor.execCommand( "insertImage", imgObj );
+        insertImage(imgObj);
         editor.fireEvent( "catchRemoteImage" );
+        hideFlash();
     }
 
     /**
@@ -227,7 +238,7 @@ var imageUploader = {};
     function checkNum( nodes ) {
         for ( var i = 0, ci; ci = nodes[i++]; ) {
             if ( !isNumber( ci.value ) || ci.value < 0 ) {
-                alert( "请输入正确的长度或者宽度值!例如:123,400" );
+                alert(lang.numError);
                 ci.value = "";
                 ci.focus();
                 return false;
@@ -260,7 +271,8 @@ var imageUploader = {};
             tmpObj.data_ue_src = tmpObj.src = editor.options.imagePath + ci.url;
             imgObjs.push( tmpObj );
         }
-        editor.execCommand( "insertImage", imgObjs );
+        insertImage(imgObjs);
+        hideFlash();
     }
 
     /**
@@ -355,11 +367,11 @@ var imageUploader = {};
         var imgTypeReg = /\.(png|gif|jpg|jpeg)$/gi, //格式过滤
                 urlFilter = "";                                     //地址过滤
         if ( !imgTypeReg.test( url ) || url.indexOf( urlFilter ) == -1 ) {
-            preview.innerHTML = "<span style='color: red'>不允许的图片格式或者图片域!</span>";
+            preview.innerHTML = "<span style='color: red'>"+lang.imageUrlError+"</span>";
             flagImg = null;
             return;
         }
-        preview.innerHTML = "图片加载中……";
+        preview.innerHTML = lang.imageLoading;
         img.onload = function () {
             flagImg = this;
             showImageInfo( this );
@@ -367,7 +379,7 @@ var imageUploader = {};
             this.onload = null;
         };
         img.onerror = function () {
-            preview.innerHTML = "<span style='color: red'>图片加载失败!请检查链接地址或网络状态!</span>";
+            preview.innerHTML = "<span style='color: red'>"+lang.imageLoadError+"</span>";
             flagImg = null;
             this.onerror = null;
         };
@@ -451,19 +463,28 @@ var imageUploader = {};
      * @param callbacks
      */
     function createFlash( opt, callbacks ) {
+        var i18n = utils.extend({},lang.flashI18n);
+        //处理图片资源地址的编码,补全等问题
+        for(var i in i18n){
+            if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){
+                i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]);
+            }
+        }
+        opt = utils.extend(opt,i18n,false);
         var option = {
             createOptions:{
                 id:'flash',
                 url:opt.flashUrl,
                 width:opt.width,
                 height:opt.height,
-                errorMessage:'Flash插件初始化失败,请更新您的FlashPlayer版本之后重试!',
+                errorMessage:lang.flashError,
                 wmode:browser.safari ? 'transparent' : 'window',
                 ver:'10.0.0',
                 vars:opt,
                 container:opt.container
             }
         };
+        flashContainer = $G(opt.container);
         option = utils.extend( option, callbacks, false );
         flashObj = new baidu.flash.imageUploader( option );
     }
@@ -494,7 +515,7 @@ var imageUploader = {};
     function createAlignButton( ids ) {
         for ( var i = 0, ci; ci = ids[i++]; ) {
             var floatContainer = g( ci ),
-                    nameMaps = {"none":"默认", "left":"左浮动", "right":"右浮动", "center":"居中"};
+                    nameMaps = {"none":lang.floatDefault, "left":lang.floatLeft, "right":lang.floatRight, "center":lang.floatCenter};
             for ( var j in nameMaps ) {
                 var div = document.createElement( "div" );
                 div.setAttribute( "name", j );
@@ -507,6 +528,12 @@ var imageUploader = {};
         }
     }
 
+    function toggleFlash(show){
+        if(flashContainer && browser.webkit){
+            flashContainer.style.left = show ? "0":"-10000px";
+        }
+    }
+
     /**
      * tab点击处理事件
      * @param tabHeads
@@ -524,18 +551,23 @@ var imageUploader = {};
         for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
             var body = tabBodys[j],
                     id = body.getAttribute( "id" );
+            body.onclick = function(){
+                this.style.zoom = 1;
+            };
             if ( id != tabSrc ) {
                 body.style.zIndex = 1;
             } else {
                 body.style.zIndex = 200;
                 //当切换到本地图片上传时,隐藏遮罩用的iframe
                 if ( id == "local" ) {
+                    toggleFlash(true);
                     maskIframe.style.display = "none";
                     //处理确定按钮的状态
                     if ( selectedImageCount ) {
                         dialog.buttons[0].setDisabled( true );
                     }
                 } else {
+                    toggleFlash(false);
                     maskIframe.style.display = "";
                     dialog.buttons[0].setDisabled( false );
                 }
@@ -550,10 +582,11 @@ var imageUploader = {};
                             timeout:100000,
                             action:"get",
                             onsuccess:function ( xhr ) {
-                                var tmp = xhr.responseText,
+                                //去除空格
+                                var tmp = utils.trim(xhr.responseText),
                                         imageUrls = !tmp ? [] : tmp.split( "ue_separate_ue" ),
                                         length = imageUrls.length;
-                                g( "imageList" ).innerHTML = !length ? "&nbsp;&nbsp;当前未上传过任何图片!" : "";
+                                g( "imageList" ).innerHTML = !length ? "&nbsp;&nbsp;"+lang.noUploadImage : "";
                                 for ( var k = 0, ci; ci = imageUrls[k++]; ) {
                                     var img = document.createElement( "img" );
 
@@ -564,35 +597,19 @@ var imageUploader = {};
                                     img.onclick = function () {
                                         changeSelected( this );
                                     };
-                                    //                                        img.ondblclick = function(){
-                                    //                                            var me = this,src = me.getAttribute("src",2);
-                                    //                                            if(!confirm("删除操作不可恢复,您确认要删除本图片么?")) return;
-                                    //                                            ajax.request(editor.options.imageManagerPath,{
-                                    //                                                action:"del",
-                                    //                                                fileName:src.substr(src.lastIndexOf("/")+1),
-                                    //                                                onsuccess:function(xhr){
-                                    //
-                                    //                                                    if(xhr.responseText=="success") {
-                                    //                                                        me.parentNode.removeChild(me);
-                                    //                                                    }else{
-                                    //                                                        alert("服务器删除图片失败,请重试!");
-                                    //                                                    }
-                                    //                                                }
-                                    //                                            });
-                                    //                                        };
                                     img.onload = function () {
                                         this.parentNode.style.display = "";
                                         var w = this.width, h = this.height;
                                         scale( this, 100, 120, 80 );
-                                        this.title = "点击切换选择状态\n原图尺寸:" + w + "X" + h;
+                                        this.title = lang.toggleSelect + w + "X" + h;
                                     };
-                                    img.setAttribute( k < 35 ? "src" : "lazy_src", editor.options.imageManagerPath + ci );
-                                    img.setAttribute( "data_ue_src", editor.options.imageManagerPath + ci );
+                                    img.setAttribute( k < 35 ? "src" : "lazy_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig,"") );
+                                    img.setAttribute( "data_ue_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig,"") );
 
                                 }
                             },
                             onerror:function () {
-                                g( "imageList" ).innerHTML = "糟糕,图片读取失败了!";
+                                g( "imageList" ).innerHTML = lang.imageLoadError;
                             }
                         } );
                     }
@@ -605,6 +622,7 @@ var imageUploader = {};
                 }
             }
         }
+
     }
 
     /**
@@ -644,16 +662,17 @@ var imageUploader = {};
      * @param selectParentId
      */
     function switchSelect( selectParentId ) {
-        var selects = g( selectParentId ).children;
-        for ( var i = 0, ci; ci = selects[i++]; ) {
-            domUtils.on( ci, "click", function () {
-                for ( var j = 0, cj; cj = selects[j++]; ) {
-                    cj.className = "";
-                    cj.removeAttribute && cj.removeAttribute( "class" );
-                }
-                this.className = "focus";
-            } )
-        }
+        var select = g(selectParentId ),
+                children = select.children;
+        domUtils.on(select,"click",function(evt){
+            var tar = evt.srcElement || evt.target;
+            for ( var j = 0, cj; cj = children[j++]; ) {
+                cj.className = "";
+                cj.removeAttribute && cj.removeAttribute( "class" );
+            }
+            tar.className = "focus";
+
+        });
     }
 
     /**

BIN
DjangoUeditor/static/UEditor/dialogs/image/imageUploader.swf


+ 19 - 19
DjangoUeditor/static/UEditor/dialogs/insertframe/insertframe.html

@@ -2,51 +2,51 @@
 <html>
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-    <title>插入框架</title>
-    <script type="text/javascript" src="../internal.js"></script>
+    <title></title>
     <style type="text/css">
         * {color: #838383}
         body {font-size: 12px;width: 320px;height: 153px;overflow: hidden; margin: 0;padding: 0; }
-        .warp {padding: 20px 0 0 15px;height: 100%;position: relative;}
-        #url {width: 290px; margin-bottom: 2px}
+        .warp {margin-left:5px;padding: 20px 0 0 15px;height: 100%;position: relative;}
+        #url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\9;*margin-left:0;_margin-left:0; }
+        .format span{display: inline-block; width: 58px;text-align: center; zoom:1;}
         table td{padding:5px 0;}
-
+        #align{width: 65px;height: 23px;line-height: 22px;}
     </style>
 </head>
 <body>
 <div class="warp">
         <table width="300" cellpadding="0" cellspacing="0">
-
             <tr>
-                <td colspan="2">
-                    <span>地址:</span><input style="width:200px" id="url" type="text" value=""/>
+                <td colspan="2" class="format">
+                    <span><var id="lang_input_address"></var></span>
+                    <input style="width:200px" id="url" type="text" value=""/>
                 </td>
             </tr>
             <tr>
-                <td colspan="2"><span>宽度:</span><input style="width:200px" type="text" id="width"/> px</td>
+                <td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px" type="text" id="width"/> px</td>
 
             </tr>
             <tr>
-                <td colspan="2"><span>高度:</span><input style="width:200px" type="text" id="height"/> px</td>
+                <td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px" type="text" id="height"/> px</td>
             </tr>
             <tr>
-                <td><span>允许滚动条:</span><input type="checkbox" id="scroll"/> </td>
-                <td><span>显示框架边框:</span><input type="checkbox" id="frameborder"/> </td>
+                <td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/> </td>
+                <td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/> </td>
             </tr>
 
             <tr>
-                <td colspan="2"><span>对齐方式:</span>
+                <td colspan="2"><span><var id="lang_input_alignMode"></var></span>
                     <select id="align">
-                        <option value="">默认</option>
-                        <option value="left">左对齐</option>
-                        <option value="right">右对齐</option>
-                        <option value="middle">居中</option>
+                        <option value=""></option>
+                        <option value="left"></option>
+                        <option value="right"></option>
+                        <option value="middle"></option>
                     </select>
                 </td>
             </tr>
         </table>
 </div>
-
+<script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
     var iframe = editor._iframe;
     if(iframe){
@@ -67,7 +67,7 @@
                 newIframe = editor.document.createElement("iframe"),
                 div;
         if(!url){
-            alert("请输入地址!");
+            alert(lang.enterAddress);
             return false;
         }
         newIframe.setAttribute("src",/http:\/\/|https:\/\//ig.test(url) ? url : "http://"+url);

+ 48 - 12
DjangoUeditor/static/UEditor/dialogs/internal.js

@@ -1,9 +1,7 @@
-
-
-(function(){
+(function () {
     var parent = window.parent;
     //dialog对象
-    dialog = parent.$EDITORUI[window.frameElement.id.replace(/_iframe$/, '')];
+    dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
     //当前打开dialog的编辑器实例
     editor = dialog.editor;
 
@@ -17,19 +15,57 @@
 
     ajax = UE.ajax;
 
-    $G = function(id){return document.getElementById(id)};
+    $G = function ( id ) {
+        return document.getElementById( id )
+    };
     //focus元素
-    $focus = function(node){
-        setTimeout(function(){
-            if(browser.ie){
+    $focus = function ( node ) {
+        setTimeout( function () {
+            if ( browser.ie ) {
                 var r = node.createTextRange();
-                r.collapse(false);
+                r.collapse( false );
                 r.select();
-            }else{
+            } else {
                 node.focus()
             }
-        },0)
-    }
+        }, 0 )
+    };
+    lang = UE.I18N[editor.options.lang][dialog.className.split( "-" )[2]];
+    utils.domReady( function () {
+        var langImgPath = editor.options.langPath + editor.options.lang + "/images/";
+        //针对静态资源
+        for ( var i in lang.static ) {
+            var dom = $G( i );
+            if(!dom) continue;
+            var tagName = dom.tagName,
+                    content = lang.static[i];
+            if(content.src){
+                //clone
+                content = utils.extend({},content,false);
+                content.src = langImgPath + content.src;
+            }
+            if(content.style){
+                content = utils.extend({},content,false);
+                content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath)
+            }
+            switch ( tagName.toLowerCase() ) {
+                case "var":
+                    dom.parentNode.replaceChild( document.createTextNode( content ), dom );
+                    break;
+                case "select":
+                    var ops = dom.options;
+                    for ( var j = 0, oj; oj = ops[j]; ) {
+                        oj.innerHTML = content.options[j++];
+                    }
+                    for ( var p in content ) {
+                        p != "options" && dom.setAttribute( p, content[p] );
+                    }
+                    break;
+                default :
+                    domUtils.setAttributes( dom, content);
+            }
+        }
+    } );
 
 })();
 

+ 10 - 11
DjangoUeditor/static/UEditor/dialogs/link/link.html

@@ -2,9 +2,8 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>插入链接</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
-    <script type="text/javascript" src="../internal.js"></script>
     <style type="text/css">
         *{margin:0;padding:0;color: #838383;}
         table{font-size: 12px;margin: 10px;line-height: 30px}
@@ -14,20 +13,20 @@
 <body>
     <table>
         <tr>
-            <td><label for="text"> 文本内容:</label></td>
-            <td><input class="txt" id="text" type="text" disabled="true" value="只支持选中一个链接时生效"/></td>
+            <td><label for="text"> <var id="lang_input_text"></var></label></td>
+            <td><input class="txt" id="text" type="text" disabled="true"/></td>
         </tr>
         <tr>
-            <td><label for="href"> 链接地址:</label></td>
+            <td><label for="href"> <var id="lang_input_url"></var></label></td>
             <td><input class="txt" id="href" type="text" /></td>
         </tr>
         <tr>
-            <td><label for="title"> 标题:</label></td>
+            <td><label for="title"> <var id="lang_input_title"></var></label></td>
             <td><input class="txt" id="title" type="text"/></td>
         </tr>
         <tr>
              <td colspan="2">
-                 <label for="target">是否在新窗口打开:</label>
+                 <label for="target"><var id="lang_input_target"></var></label>
                  <input id="target" type="checkbox"/>
              </td>
         </tr>
@@ -35,6 +34,7 @@
             <td colspan="2" id="msg"></td>
         </tr>
     </table>
+    <script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
     var range = editor.selection.getRange(),
         link = range.collapsed ? editor.queryCommandValue( "link" ) : editor.selection.getStart(),
@@ -51,7 +51,7 @@
             orgText = text.value = link[browser.ie ? 'innerText':'textContent'];
         }else{
             text.setAttribute('disabled','true');
-            text.value = '只支持选中一个链接时生效';
+            text.value = lang.validLink;
         }
 
     }else{
@@ -60,7 +60,7 @@
             text.value = '';
         }else{
             text.setAttribute('disabled','true');
-            text.value = '只支持选中一个链接时生效';
+            text.value = lang.validLink;
         }
 
     }
@@ -84,7 +84,6 @@
             //修改链接内容的情况太特殊了,所以先做到这里了
             //todo:情况多的时候,做到command里
             if(orgText && text.value != orgText){
-
                 link[browser.ie ? 'innerText' : 'textContent'] =  obj.textValue = text.value;
                 range.selectNode(link).select()
             }
@@ -105,7 +104,7 @@
     };
     $G('href').onblur = function(){
         if(!hrefStartWith(this.value,["http","/","ftp://"])){
-            $G("msg").innerHTML = "<span style='color: red'>您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀</span>";
+            $G("msg").innerHTML = "<span style='color: red'>"+lang.httpPrompt+"</span>";
         }else{
             $G("msg").innerHTML = "";
         }

+ 9 - 8
DjangoUeditor/static/UEditor/dialogs/map/map.html

@@ -2,9 +2,9 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>插入地图</title>
+<title></title>
 <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
-<script type="text/javascript" src="../internal.js"></script>
+
     <style type="text/css">
         *{color: #838383}
         body {
@@ -29,23 +29,24 @@
 <div class="content">
     <table>
         <tr>
-            <td>城市:</td>
-            <td><input id="city" type="text" value="北京市" /></td>
-            <td>地址:</td>
+            <td><var id="lang_city"></var>:</td>
+            <td><input id="city" type="text" /></td>
+            <td><var id="lang_address"></var>:</td>
             <td><input id="address" type="text" value="" /></td>
-            <td><a href="javascript:doSearch()" class="doSearch">搜索</a></td>
+            <td><a href="javascript:doSearch()" class="doSearch"><var id="lang_search"></var></a></td>
         </tr>
     </table>
     <div style="width:520px;height:340px;border:1px solid gray" id="container"></div>
 
 </div>
+<script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
     var map = new BMap.Map("container"),marker,point,imgcss;
     map.enableScrollWheelZoom();
     map.enableContinuousZoom();
     function doSearch(){
         if (!document.getElementById('city').value) {
-            alert('请输入城市!');
+            alert(lang.cityMsg);
             return;
         }
         var search = new BMap.LocalSearch(document.getElementById('city').value, {
@@ -63,7 +64,7 @@
                     point = map.getCenter();
                     marker.setPoint(point);
                 } else {
-                    alert('无法定位到该地址!');
+                    alert(lang.errorMsg);
                 }
             }
         });

BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/addimg.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/brush.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/delimg.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/delimgH.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/empty.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/emptyH.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/eraser.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/redo.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/redoH.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/scale.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/scaleH.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/size.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/undo.png


BIN
DjangoUeditor/static/UEditor/dialogs/scrawl/images/undoH.png


+ 72 - 0
DjangoUeditor/static/UEditor/dialogs/scrawl/scrawl.css

@@ -0,0 +1,72 @@
+/*common
+*/
+body{margin: 0;}
+table{width:100%;}
+td{padding:2px 4px;vertical-align: middle;}
+a{text-decoration: none;}
+em{font-style: normal;}
+.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;}
+/*module
+*/
+.main{margin: 8px;overflow: hidden;}
+
+.hot{float:left;height:335px;}
+.drawBoard{position: relative; cursor: crosshair;}
+.brushBorad{position: absolute;left:0;top:0;z-index: 998;}
+.picBoard{display:table-cell;border: none;text-align: center;vertical-align: middle;cursor: default;}
+.operateBar{margin-top:10px;font-size:12px;text-align: center;}
+.operateBar span{margin-left: 10px;}
+
+.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;}
+.colorBar{margin-top:10px;font-size: 12px;text-align: center;}
+.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3}
+.sectionBar{margin-top:15px;font-size: 12px;text-align: center;}
+.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3}
+.size1{background: url('images/size.png') 1px center no-repeat ;}
+.size2{background: url('images/size.png') -10px center no-repeat;}
+.size3{background: url('images/size.png') -22px center no-repeat;}
+.size4{background: url('images/size.png') -35px center no-repeat;}
+
+.addImgH{position: relative;}
+.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;}
+.addImgH_form input{width: 100%;}
+/*scrawl遮罩层
+*/
+.maskLayerNull{display: none;}
+.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7;
+    background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;}
+/*btn state
+*/
+.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;}
+.previousStepH .text{color:#888;cursor:pointer;}
+.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;}
+.previousStep .text{color:#ccc;cursor:default;}
+
+.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;}
+.nextStepH .text{color:#888;cursor:pointer;}
+.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;}
+.nextStep .text{color:#ccc;cursor:default;}
+
+.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;}
+.clearBoardH .text{color:#888;cursor:pointer;}
+.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;}
+.clearBoard .text{color:#ccc;cursor:default;}
+
+.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;}
+.scaleBoardH .text{color:#888;cursor:pointer;}
+.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;}
+.scaleBoard .text{color:#ccc;cursor:default;}
+
+.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;}
+.removeImgH .text{color:#888;cursor:pointer;}
+.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;}
+.removeImg .text{color:#ccc;cursor:default;}
+
+.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')}
+.addImgH .text{color:#888;cursor:pointer;}
+/*icon
+*/
+.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')}
+.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')}
+
+

+ 95 - 0
DjangoUeditor/static/UEditor/dialogs/scrawl/scrawl.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <link rel="stylesheet" type="text/css" href="scrawl.css">
+</head>
+<body>
+<div class="main" id="J_wrap">
+    <div class="hot">
+        <div class="drawBoard border_style1">
+            <canvas id="J_brushBoard" class="brushBorad" width="360" height="300"></canvas>
+            <div id="J_picBoard" class="picBoard" style="width: 360px;height: 300px"></div>
+        </div>
+        <div id="J_operateBar" class="operateBar">
+            <span id="J_previousStep" class="previousStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_previousStep"></var></em>
+            </span>
+            <span id="J_nextStep" class="nextStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_nextsStep"></var></em>
+            </span>
+            <span id="J_clearBoard" class="clearBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_clear"></var></em>
+            </span>
+            <span id="J_sacleBoard" class="scaleBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_ScalePic"></var></em>
+            </span>
+        </div>
+    </div>
+    <div class="drawToolbar border_style1">
+        <div id="J_colorBar" class="colorBar"></div>
+        <div id="J_brushBar" class="sectionBar">
+            <em class="brushIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div id="J_eraserBar" class="sectionBar">
+            <em class="eraserIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div class="sectionBar">
+            <div class="addImgH">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_addPic"></var></em>
+                <form method="post" id="fileForm" enctype="multipart/form-data" class="addImgH_form" target="up">
+                    <input type="file" name="upfile" id="J_imgTxt"
+                           accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
+                </form>
+                <iframe name="up" style="display: none"></iframe>
+            </div>
+        </div>
+        <div class="sectionBar">
+            <span id="J_removeImg" class="removeImg">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_removePic"></var></em>
+            </span>
+        </div>
+    </div>
+</div>
+<div id="J_maskLayer" class="maskLayerNull"></div>
+
+<script type="text/javascript" src="../internal.js"></script>
+<script type="text/javascript" src="scrawl.js"></script>
+<script type="text/javascript">
+    var settings = {
+        drawBrushSize:3, //画笔初始大小
+        drawBrushColor:"#4bacc6", //画笔初始颜色
+        colorList:['c00000', 'ff0000', 'ffc000', 'ffff00', '92d050', '00b050', '00b0f0', '0070c0', '002060', '7030a0', 'ffffff',
+            '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646'], //画笔选择颜色
+        saveNum:10  //撤销次数
+    };
+
+    var scrawlObj = new scrawl( settings );
+    scrawlObj.isCancelScrawl = false;
+
+    dialog.onok = function () {
+        exec( scrawlObj );
+        return false;
+    };
+    dialog.oncancel = function () {
+        scrawlObj.isCancelScrawl = true;
+    };
+</script>
+</body>
+</html>

+ 656 - 0
DjangoUeditor/static/UEditor/dialogs/scrawl/scrawl.js

@@ -0,0 +1,656 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-5-22
+ * Time: 上午11:38
+ * To change this template use File | Settings | File Templates.
+ */
+var scrawl = function (options) {
+    options && this.initOptions(options);
+};
+(function () {
+    var canvas = $G("J_brushBoard"),
+        context = canvas.getContext('2d'),
+        drawStep = [], //undo redo存储
+        drawStepIndex = -1; //undo redo指针
+
+    scrawl.prototype = {
+        isScrawl:false, //是否涂鸦
+        brushWidth:-1, //画笔粗细
+        brushColor:"", //画笔颜色
+
+        initOptions:function (options) {
+            var me = this;
+            me.originalState(options);//初始页面状态
+            me._buildToolbarColor(options.colorList);//动态生成颜色选择集合
+
+            me._addBoardListener(options.saveNum);//添加画板处理
+            me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理
+            me._addColorBarListener();//添加颜色选择处理
+            me._addBrushBarListener();//添加画笔大小处理
+            me._addEraserBarListener();//添加橡皮大小处理
+            me._addAddImgListener();//添加增添背景图片处理
+            me._addRemoveImgListenter();//删除背景图片处理
+            me._addScalePicListenter();//添加缩放处理
+            me._addClearSelectionListenter();//添加清楚选中状态处理
+
+            me._originalColorSelect(options.drawBrushColor);//初始化颜色选中
+            me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中
+            me._clearSelection();//清楚选中状态
+        },
+
+        originalState:function (options) {
+            var me = this;
+
+            me.brushWidth = options.drawBrushSize;//同步画笔粗细
+            me.brushColor = options.drawBrushColor;//同步画笔颜色
+
+            $G("fileForm").action = editor.options.scrawlUrl + "?action=tmpImg";//初始form提交地址
+            //$G("fileForm").action = url + (url.indexOf("?") == -1 ? "?" : "&") + "action=tmpImg";
+
+            context.lineWidth = me.brushWidth;//初始画笔大小
+            context.strokeStyle = me.brushColor;//初始画笔颜色
+            context.fillStyle = "transparent";//初始画布背景颜色
+            context.lineCap = "round";//去除锯齿
+            context.fill();
+        },
+        _buildToolbarColor:function (colorList) {
+            var tmp = null, arr = [];
+            arr.push("<table id='J_colorList'>");
+            for (var i = 0, color; color = colorList[i++];) {
+                if ((i - 1) % 5 == 0) {
+                    if (i != 1) {
+                        arr.push("</tr>");
+                    }
+                    arr.push("<tr>");
+                }
+                tmp = '#' + color;
+                arr.push("<td><a title='" + tmp + "' href='javascript:void(0)' style='background-color:" + tmp + "'></a></td>");
+            }
+            arr.push("</tr></table>");
+            $G("J_colorBar").innerHTML = arr.join("");
+        },
+
+        _addBoardListener:function (saveNum) {
+            var me = this,
+                margin = 0,
+                startX = -1,
+                startY = -1,
+                isMouseDown = false,
+                isMouseMove = false,
+                isMouseUp = false,
+                buttonPress= 0,button, flag = '';
+
+            margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left"));
+            drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
+            drawStepIndex += 1;
+
+            domUtils.on(canvas, ["mousedown","mousemove", "mouseup", "mouseout"], function(e){
+                button = browser.webkit ? e.which : buttonPress;
+                switch (e.type) {
+                    case 'mousedown':
+                        buttonPress = 1;
+                        flag = 1;
+                        isMouseDown = true;
+                        isMouseUp = false;
+                        isMouseMove=false;
+                        me.isScrawl = true;
+                        startX = e.clientX - margin;//10为外边距总和
+                        startY = e.clientY - margin;
+                        context.beginPath();
+                        break;
+                    case 'mousemove' :
+                        if(!flag && button == 0){
+                            return;
+                        }
+                        if(!flag && button){
+                            startX = e.clientX - margin;//10为外边距总和
+                            startY = e.clientY - margin;
+                            context.beginPath();
+                            flag = 1;
+                        }
+                        if(isMouseUp || !isMouseDown){
+                            return;
+                        }
+                        var endX = e.clientX - margin,
+                            endY = e.clientY - margin;
+
+                        context.moveTo(startX, startY);
+                        context.lineTo(endX, endY);
+                        context.stroke();
+                        startX = endX;
+                        startY = endY;
+                        isMouseMove = true;
+                        break;
+                    case 'mouseup':
+                        buttonPress = 0;
+                        if(!isMouseDown)return;
+                        if (!isMouseMove) {
+                            context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false);
+                            context.fillStyle = context.strokeStyle;
+                            context.fill();
+                        }
+                        context.closePath();
+                        me._saveOPerate(saveNum);
+                        isMouseDown = false;
+                        isMouseMove = false;
+                        isMouseUp = true;
+                        startX = -1;
+                        startY = -1;
+                        break;
+                    case 'mouseout':
+                        flag = '';
+                        buttonPress = 0;
+                        if( button == 1) return;
+                        context.closePath();
+                        break;
+                }
+            });
+        },
+        _addOPerateListener:function (saveNum) {
+            var me = this;
+            domUtils.on($G("J_previousStep"), "click", function () {
+                if (drawStepIndex > 1) {
+                    drawStepIndex -= 1;
+                    context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+                    context.putImageData(drawStep[drawStepIndex - 1], 0, 0);
+                    me.btn2Highlight("J_nextStep");
+                    drawStepIndex == 1 && me.btn2disable("J_previousStep");
+                }
+            });
+            domUtils.on($G("J_nextStep"), "click", function () {
+                if (drawStepIndex > 0 && drawStepIndex < drawStep.length) {
+                    context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+                    context.putImageData(drawStep[drawStepIndex], 0, 0);
+                    drawStepIndex += 1;
+                    me.btn2Highlight("J_previousStep");
+                    drawStepIndex == drawStep.length && me.btn2disable("J_nextStep");
+                }
+            });
+            domUtils.on($G("J_clearBoard"), "click", function () {
+                context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+                drawStep = [];
+                me._saveOPerate(saveNum);
+                drawStepIndex = 0;
+                me.isScrawl = false;
+                me.btn2disable("J_previousStep");
+                me.btn2disable("J_nextStep");
+                me.btn2disable("J_clearBoard");
+            });
+        },
+        _addColorBarListener:function () {
+            var me = this;
+            domUtils.on($G("J_colorBar"), "click", function (e) {
+                var target = me.getTarget(e),
+                    color = target.title;
+                if (!!color) {
+                    me._addColorSelect(target);
+
+                    me.brushColor = color;
+                    context.globalCompositeOperation = "source-over";
+                    context.lineWidth = me.brushWidth;
+                    context.strokeStyle = color;
+                }
+            });
+        },
+        _addBrushBarListener:function () {
+            var me = this;
+            domUtils.on($G("J_brushBar"), "click", function (e) {
+                var target = me.getTarget(e),
+                    size = browser.ie ? target.innerText : target.text;
+                if (!!size) {
+                    me._addBESelect(target);
+
+                    context.globalCompositeOperation = "source-over";
+                    context.lineWidth = parseInt(size);
+                    context.strokeStyle = me.brushColor;
+                    me.brushWidth = context.lineWidth;
+                }
+            });
+        },
+        _addEraserBarListener:function () {
+            var me = this;
+            domUtils.on($G("J_eraserBar"), "click", function (e) {
+                var target = me.getTarget(e),
+                    size = browser.ie ? target.innerText : target.text;
+                if (!!size) {
+                    me._addBESelect(target);
+
+                    context.lineWidth = parseInt(size);
+                    context.globalCompositeOperation = "destination-out";
+                    context.strokeStyle = "#FFF";
+                }
+            });
+        },
+        _addAddImgListener:function () {
+            var doc = document,
+                file = $G("J_imgTxt");
+            domUtils.on(file, "change", function () {
+                var frm = file.parentNode;
+                addMaskLayer(lang.backgroundUploading);
+                frm.submit();
+                frm.reset();
+            });
+        },
+        _addRemoveImgListenter:function () {
+            var me = this;
+            domUtils.on($G("J_removeImg"), "click", function () {
+                $G("J_picBoard").innerHTML = "";
+                me.btn2disable("J_removeImg");
+                me.btn2disable("J_sacleBoard");
+            });
+        },
+        _addScalePicListenter:function () {
+            //trace 2457
+            if(browser.opera) return;
+            domUtils.on($G("J_sacleBoard"), "click", function () {
+                var picBoard = $G("J_picBoard"),
+                    scaleCon = $G("J_scaleCon"),
+                    img = picBoard.children[0];
+
+                if (img) {
+                    if (!scaleCon) {
+                        img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;";
+                        picBoard.style.cssText += "position:relative;z-index:999";
+                        var scale = new ScaleBoy();
+                        picBoard.appendChild(scale.init());
+                        scale.startScale(img);
+                    } else {
+                        if (scaleCon.style.visibility == "visible") {
+                            scaleCon.style.visibility = "hidden";
+                            picBoard.style.position = "";
+                            picBoard.style.zIndex = "";
+                        } else {
+                            scaleCon.style.visibility = "visible";
+                            picBoard.style.cssText += "position:relative;z-index:999";
+                        }
+                    }
+                }
+            });
+        },
+        _addClearSelectionListenter:function(){
+            var doc=document;
+            domUtils.on(doc,'mousemove',function(e){
+                if(browser.ie)
+                    doc.selection.clear();
+                else
+                    window.getSelection().removeAllRanges();
+            });
+        },
+        _clearSelection:function () {
+            var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"];
+            for (var i = 0, group; group = list[i++];) {
+                domUtils.unselectable($G(group));
+            }
+        },
+
+        _saveOPerate:function (saveNum) {
+            var me = this;
+            if (drawStep.length <= saveNum) {
+                drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
+                drawStepIndex = drawStep.length;
+            } else {
+                drawStep.shift();
+                drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
+                drawStepIndex = drawStep.length;
+            }
+            me.btn2Highlight("J_previousStep");
+            me.btn2Highlight("J_clearBoard");
+        },
+
+        _originalColorSelect:function (title) {
+            var colorList = $G("J_colorList").getElementsByTagName("td");
+            for (var j = 0, cell; cell = colorList[j++];) {
+                if (cell.children[0].title.toLowerCase() == title) {
+                    cell.children[0].style.opacity = 1;
+                }
+            }
+        },
+        _originalBrushSelect:function (text) {
+            var brushList = $G("J_brushBar").children;
+            for (var i = 0, ele; ele = brushList[i++];) {
+                if (ele.tagName.toLowerCase() == "a") {
+                    var size = browser.ie ? ele.innerText : ele.text;
+                    if (size.toLowerCase() == text) {
+                        ele.style.opacity = 1;
+                    }
+                }
+            }
+        },
+        _addColorSelect:function (target) {
+            var me = this,
+                colorList = $G("J_colorList").getElementsByTagName("td"),
+                eraserList = $G("J_eraserBar").children,
+                brushList = $G("J_brushBar").children;
+
+            for (var i = 0, cell; cell = colorList[i++];) {
+                cell.children[0].style.opacity = 0.3;
+            }
+            for (var k = 0, ele; ele = brushList[k++];) {
+                if (ele.tagName.toLowerCase() == "a") {
+                    ele.style.opacity = 0.3;
+                    var size = browser.ie ? ele.innerText : ele.text;
+                    if (size.toLowerCase() == this.brushWidth) {
+                        ele.style.opacity = 1;
+                    }
+                }
+            }
+            for (var j = 0, node; node = eraserList[j++];) {
+                if (node.tagName.toLowerCase() == "a") {
+                    node.style.opacity = 0.3;
+                }
+            }
+
+            target.style.opacity = 1;
+            target.blur();
+        },
+        _addBESelect:function (target) {
+            var brushList = $G("J_brushBar").children;
+            var eraserList = $G("J_eraserBar").children;
+
+            for (var i = 0, ele; ele = brushList[i++];) {
+                if (ele.tagName.toLowerCase() == "a") {
+                    ele.style.opacity = 0.3;
+                }
+            }
+            for (var j = 0, node; node = eraserList[j++];) {
+                if (node.tagName.toLowerCase() == "a") {
+                    node.style.opacity = 0.3;
+                }
+            }
+
+            target.style.opacity = 1;
+            target.blur();
+        },
+        getCanvasData:function () {
+            var picContainer = $G("J_picBoard"),
+                img = picContainer.children[0];
+            if (img) {
+                var x, y;
+                if (img.style.position == "absolute") {
+                    x = parseInt(img.style.left);
+                    y = parseInt(img.style.top);
+                } else {
+                    x = (picContainer.offsetWidth - img.width) / 2;
+                    y = (picContainer.offsetHeight - img.height) / 2;
+                }
+                context.globalCompositeOperation = "destination-over";
+                context.drawImage(img, x, y, img.width, img.height);
+            } else {
+                context.globalCompositeOperation = "destination-atop";
+                context.fillStyle = "#fff";//重置画布背景白色
+                context.fillRect(0, 0, canvas.width, canvas.height);
+            }
+            try{
+                return canvas.toDataURL("image/png").substring(22);
+            }catch(e){
+                return "";
+            }
+        },
+        btn2Highlight:function (id) {
+            var cur = $G(id);
+            cur.className.indexOf("H") == -1 && (cur.className += "H");
+        },
+        btn2disable:function (id) {
+            var cur = $G(id);
+            cur.className.indexOf("H") != -1 && (cur.className = cur.className.replace("H", ""));
+        },
+        getTarget:function (evt) {
+            return evt.target || evt.srcElement;
+        }
+    };
+})();
+
+var ScaleBoy = function () {
+    this.dom = null;
+    this.scalingElement = null;
+};
+(function () {
+    function _appendStyle() {
+        var doc = document,
+            head = doc.getElementsByTagName('head')[0],
+            style = doc.createElement('style'),
+            cssText = '.scale{visibility:hidden;cursor:move;position:absolute;left:0;top:0;width:100px;height:50px;background-color:#fff;font-size:0;line-height:0;overflow:hidden;opacity:.4;filter:Alpha(opacity=40);}'
+                + '.scale span{position:absolute;left:0;top:0;width:6px;height:6px;background-color:#006DAE;}'
+                + '.scale .hand0, .scale .hand7{cursor:nw-resize;}'
+                + '.scale .hand1, .scale .hand6{left:50%;margin-left:-3px;cursor:n-resize;}'
+                + '.scale .hand2, .scale .hand4, .scale .hand7{left:100%;margin-left:-6px;}'
+                + '.scale .hand3, .scale .hand4{top:50%;margin-top:-3px;cursor:w-resize;}'
+                + '.scale .hand5, .scale .hand6, .scale .hand7{margin-top:-6px;top:100%;}'
+                + '.scale .hand2, .scale .hand5{cursor:ne-resize;}';
+        style.type = 'text/css';
+
+        try {
+            style.appendChild(doc.createTextNode(cssText));
+        } catch (e) {
+            style.styleSheet.cssText = cssText;
+        }
+        head.appendChild(style);
+    }
+
+    function _getDom() {
+        var doc = document,
+            hand,
+            arr = [],
+            scale = doc.createElement('div');
+
+        scale.id = 'J_scaleCon';
+        scale.className = 'scale';
+        for (var i = 0; i < 8; i++) {
+            arr.push("<span class='hand" + i + "'></span>");
+        }
+        scale.innerHTML = arr.join("");
+        return scale;
+    }
+
+    var rect = [
+        //[left, top, width, height]
+        [1, 1, -1, -1],
+        [0, 1, 0, -1],
+        [0, 1, 1, -1],
+        [1, 0, -1, 0],
+        [0, 0, 1, 0],
+        [1, 0, -1, 1],
+        [0, 0, 0, 1],
+        [0, 0, 1, 1]
+    ];
+    ScaleBoy.prototype = {
+        init:function () {
+            _appendStyle();
+            var me = this,
+                scale = me.dom = _getDom();
+
+            me.scaleMousemove.fp = me;
+            domUtils.on(scale, 'mousedown', function (e) {
+                var target = e.target || e.srcElement;
+                me.start = {x:e.clientX, y:e.clientY};
+                if (target.className.indexOf('hand') != -1) {
+                    me.dir = target.className.replace('hand', '');
+                }
+                domUtils.on(document.body, 'mousemove', me.scaleMousemove);
+                e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
+            });
+            domUtils.on(document.body, 'mouseup', function (e) {
+                if (me.start) {
+                    domUtils.un(document.body, 'mousemove', me.scaleMousemove);
+                    if (me.moved) {
+                        me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}});
+                    }
+                    delete me.start;
+                    delete me.moved;
+                    delete me.dir;
+                }
+            });
+            return scale;
+        },
+        startScale:function (objElement) {
+            var me = this, Idom = me.dom;
+
+            Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;';
+            me.scalingElement = objElement;
+        },
+        updateScaledElement:function (objStyle) {
+            var cur = this.scalingElement,
+                pos = objStyle.position,
+                size = objStyle.size;
+            if (pos) {
+                typeof pos.x != 'undefined' && (cur.style.left = pos.x);
+                typeof pos.y != 'undefined' && (cur.style.top = pos.y);
+            }
+            if (size) {
+                size.w && (cur.style.width = size.w);
+                size.h && (cur.style.height = size.h);
+            }
+        },
+        updateStyleByDir:function (dir, offset) {
+            var me = this,
+                dom = me.dom, tmp;
+
+            rect['def'] = [1, 1, 0, 0];
+            if (rect[dir][0] != 0) {
+                tmp = parseInt(dom.style.left) + offset.x;
+                dom.style.left = me._validScaledProp('left', tmp) + 'px';
+            }
+            if (rect[dir][1] != 0) {
+                tmp = parseInt(dom.style.top) + offset.y;
+                dom.style.top = me._validScaledProp('top', tmp) + 'px';
+            }
+            if (rect[dir][2] != 0) {
+                tmp = dom.clientWidth + rect[dir][2] * offset.x;
+                dom.style.width = me._validScaledProp('width', tmp) + 'px';
+            }
+            if (rect[dir][3] != 0) {
+                tmp = dom.clientHeight + rect[dir][3] * offset.y;
+                dom.style.height = me._validScaledProp('height', tmp) + 'px';
+            }
+            if (dir === 'def') {
+                me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}});
+            }
+        },
+        scaleMousemove:function (e) {
+            var me = arguments.callee.fp,
+                start = me.start,
+                dir = me.dir || 'def',
+                offset = {x:e.clientX - start.x, y:e.clientY - start.y};
+
+            me.updateStyleByDir(dir, offset);
+            arguments.callee.fp.start = {x:e.clientX, y:e.clientY};
+            arguments.callee.fp.moved = 1;
+        },
+        _validScaledProp:function (prop, value) {
+            var ele = this.dom,
+                wrap = $G("J_picBoard");
+
+            value = isNaN(value) ? 0 : value;
+            switch (prop) {
+                case 'left':
+                    return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;
+                case 'top':
+                    return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;
+                case 'width':
+                    return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;
+                case 'height':
+                    return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;
+            }
+        }
+    };
+})();
+
+//后台回调
+function ue_callback(url, state) {
+    var doc = document,
+        picBorard = $G("J_picBoard"),
+        img = doc.createElement("img");
+
+    //图片缩放
+    function scale(img, max, oWidth, oHeight) {
+        var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
+        if (ow > max || oh > max) {
+            if (ow >= oh) {
+                if (width = ow - max) {
+                    percent = (width / ow).toFixed(2);
+                    img.height = oh - oh * percent;
+                    img.width = max;
+                }
+            } else {
+                if (height = oh - max) {
+                    percent = (height / oh).toFixed(2);
+                    img.width = ow - ow * percent;
+                    img.height = max;
+                }
+            }
+        }
+    }
+
+    //移除遮罩层
+    removeMaskLayer();
+    //状态响应
+    if (state == "SUCCESS") {
+        picBorard.innerHTML = "";
+        img.onload = function () {
+            scale(this, 300);
+            picBorard.appendChild(img);
+
+            var obj = new scrawl();
+            obj.btn2Highlight("J_removeImg");
+            //trace 2457
+            if(!browser.opera){
+                obj.btn2Highlight("J_sacleBoard");
+            }
+        };
+        img.src = editor.options.scrawlPath + url;
+    } else {
+        alert(state);
+    }
+}
+//去掉遮罩层
+function removeMaskLayer() {
+    var maskLayer = $G("J_maskLayer");
+    maskLayer.className = "maskLayerNull";
+    maskLayer.innerHTML = "";
+    dialog.buttons[0].setDisabled(false);
+}
+//添加遮罩层
+function addMaskLayer(html) {
+    var maskLayer = $G("J_maskLayer");
+    dialog.buttons[0].setDisabled(true);
+    maskLayer.className = "maskLayer";
+    maskLayer.innerHTML = html;
+}
+//执行确认按钮方法
+function exec(scrawlObj) {
+    if (scrawlObj.isScrawl) {
+        addMaskLayer(lang.scrawlUpLoading);
+        var base64=scrawlObj.getCanvasData();
+        if(!!base64){
+            ajax.request(editor.options.scrawlUrl, {
+                timeout:100000,
+                content:base64,
+                onsuccess:function (xhr) {
+                    if (!scrawlObj.isCancelScrawl) {
+                        var responseObj;
+                        responseObj = eval("(" + xhr.responseText + ")");
+                        if (responseObj.state == "SUCCESS") {
+                            var imgObj = {},
+                                url = editor.options.scrawlPath + responseObj.url;
+                            imgObj.src = url;
+                            imgObj.data_ue_src = url;
+                            editor.execCommand("insertImage", imgObj);
+                            dialog.close();
+                        } else {
+                            alert(responseObj.state);
+                        }
+
+                    }
+                },
+                onerror:function () {
+                    alert(lang.imageError);
+                    dialog.close();
+                }
+            });
+        }
+    } else {
+        addMaskLayer(lang.noScarwl + "&nbsp;&nbsp;&nbsp;<input type='button' value='" + lang.continueBtn + "'  onclick='removeMaskLayer()'/>");
+    }
+}
+

+ 23 - 26
DjangoUeditor/static/UEditor/dialogs/searchreplace/searchreplace.html

@@ -2,9 +2,8 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>查找替换</title>
+    <title></title>
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
-    <script type="text/javascript" src="../internal.js"></script>
     <style type="text/css">
         *{color: #838383}
         body {
@@ -12,12 +11,9 @@
             width:380px;
             height: 170px;
             overflow: hidden;
-            margin:0px;padding:0px;
-        }
-        .warp{
-            padding: 39px 0px 0px 15px;
-            height:88%;position:relative;
+            margin:0;padding:0;
         }
+        .warp{ padding: 39px 0 0 15px;height:88%;position:relative;}
         * +html .warp{height:80%}
         .head{position:absolute;height:31px;top:9px;}
         .content{height:110px;border: 1px solid #ddd;padding:5px}
@@ -25,31 +21,31 @@
         .head span.def{background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc;}
         .head span.act{background:#FFF;border:1px solid #ccc;border-bottom: 1px solid #FFF}
         .content table{width:100%;}
-        .content input.int{ width:190px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0px; margin: 0px;line-height:21px;}
-        .content input.btn{width:60px; text-align:center;line-height:24px; text-decoration: none;height:24px;border: 0px;margin:0px;padding:0px;background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc; }
+        .content input.int{ width:190px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0; margin: 0;line-height:21px;}
+        .content input.btn{padding: 0 5px; text-align:center;line-height:24px; text-decoration: none;height:24px;border: 0;margin:0;background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc; }
     </style>
 </head>
 <body>
 <div class="warp">
     <div id="head" class="head">
-        <span name="find" class="act">查找</span> <span name="replace" class="def">替换</span>
+        <span name="find" class="act"><var id="lang_tab_search"></var></span> <span name="replace" class="def"><var id="lang_tab_replace"></var></span>
     </div>
     <div class="content" id="find">
         <table>
             <tr>
-                <td width="80">查找:</td>
+                <td width="80"><var id="lang_search1"></var>: </td>
                 <td><input id="findtxt" type="text" class="int" /></td>
             </tr>
             <tr>
-                <td>区分大小写:</td>
+                <td><var id="lang_case_sensitive1"></var></td>
                 <td>
                     <input id="matchCase" type="checkbox" />
                 </td>
             </tr>
             <tr>
                 <td colspan="2">
-                    <input id="nextFindBtn" type="button" value="下一个" class="btn" />
-                    <input id="preFindBtn" type="button" value="上一个"class="btn" />
+                    <input id="nextFindBtn" type="button" class="btn" />
+                    <input id="preFindBtn" type="button" class="btn" />
                 </td>
             </tr>
         </table>
@@ -58,30 +54,31 @@
     <div class="content" id="replace">
         <table>
             <tr>
-                <td width="80">查找:</td>
+                <td width="80"><var id="lang_search2"></var>: </td>
                 <td><input id="findtxt1" type="text" class="int"  /></td>
             </tr>
             <tr>
-                <td>替换:</td>
+                <td><var id="lang_replace"></var>: </td>
                 <td><input id="replacetxt" type="text" class="int" /></td>
             </tr>
             <tr>
-                <td>区分大小写:</td>
+                <td><var id="lang_case_sensitive2"></var></td>
                 <td>
                     <input id="matchCase1" type="checkbox" />
                 </td>
             </tr>
             <tr>
                 <td colspan="2">
-                    <input id="nextReplaceBtn" type="button" value="下一个" class="btn" />
-                    <input id="preReplaceBtn" type="button" value="上一个" class="btn" />
-                    <input id="repalceBtn" type="button" value="替换" class="btn" />
-                    <input id="allrepalceBtn" type="button" value="全部替换" class="btn" />
+                    <input id="nextReplaceBtn" type="button" class="btn" />
+                    <input id="preReplaceBtn" type="button" class="btn" />
+                    <input id="repalceBtn" type="button" class="btn" />
+                    <input id="repalceAllBtn" type="button" class="btn" />
                 </td>
             </tr>
         </table>
     </div>
 </div>
+<script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
         //清空上次查选的痕迹
         editor.firstForSR = 0;
@@ -128,9 +125,9 @@
                 casesensitive : getMatchCase("matchCase")
             };
             if(!frCommond(obj)){
-                alert("已经搜索到文章底部!");
+                alert(lang.getEnd);
             }
-        }
+        };
         $G("nextReplaceBtn").onclick = function(txt,dir,mcase){
             var findtxt = $G("findtxt1").value,obj;
             if(!findtxt){
@@ -154,7 +151,7 @@
                 casesensitive : getMatchCase("matchCase")
             };
             if(!frCommond(obj)){
-                alert("已经搜索到文章顶部!");
+                alert(lang.getStart);
             }
         }
         $G("preReplaceBtn").onclick = function(txt,dir,mcase){
@@ -188,7 +185,7 @@
             frCommond(obj);
         }
         //全部替换
-        $G("allrepalceBtn").onclick = function(){
+        $G("repalceAllBtn").onclick = function(){
             var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g,""),obj,
                 replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g,"");
             if(!findtxt){
@@ -205,7 +202,7 @@
             };
             var num = frCommond(obj);
             if(num){
-                alert("总共替换了"+num+"个内容!");
+                alert(lang.countMsg.replace("{#count}",num));
             }
         }
         //执行

+ 5 - 5
DjangoUeditor/static/UEditor/dialogs/snapscreen/snapscreen.html

@@ -3,7 +3,7 @@
 <html>
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-        <title>安装截屏插件</title>
+        <title></title>
         <script type="text/javascript" src="../internal.js"></script>
         <style type="text/css">
             *{color: #838383}
@@ -48,11 +48,11 @@
     </head>
     <body>
         <div class="content">
-            <h2>使用截屏功能,您需要安装UEditor截屏程序</h2>
+            <h2><var id="lang_showMsg"></var></h2>
             <dl>
-                <dt><a href="../../third-party/snapscreen/UEditorSnapscreen.exe" target="_blank" id="downlink">下载安装</a></dt>
-                <dd>1. 点击下载安装程序到您的计算机,运行这个程序进行安装</dd>
-                <dd>2. 安装完成后,您可以点击“确认”关闭此弹出层,然后重新点击截屏按钮,就可以进行截屏了!</dd>
+                <dt><a href="../../third-party/snapscreen/UEditorSnapscreen.exe" target="_blank" id="downlink"><var id="lang_download"></var></a></dt>
+                <dd><var id="lang_step1"></var></dd>
+                <dd><var id="lang_step2"></var></dd>
             </dl>
         </div>
     </body>

+ 9 - 9
DjangoUeditor/static/UEditor/dialogs/spechars/spechars.html

@@ -2,7 +2,7 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>插入特殊字符</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
     <style type="text/css">
         html,body{overflow:hidden;}
@@ -21,14 +21,14 @@
 <script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
         var charsContent = [
-            { name:"tsfh",title:"特殊符号", content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")},
-            { name:"lmsz",title:"罗马数字", content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")},
-            { name:"szfh",title:"数字符号", content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")},
-            { name:"rwfh",title:"日文符号", content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")},
-            { name:"xlzm",title:"希腊字母", content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")},
-            { name:"ewzm",title:"俄文字母", content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")},
-            { name:"pyzm",title:"拼音字母", content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")},
-            { name:"zyzf",title:"注音及其他", content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")}
+            { name:"tsfh",title:lang.tsfh, content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")},
+            { name:"lmsz",title:lang.lmsz, content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")},
+            { name:"szfh",title:lang.szfh, content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")},
+            { name:"rwfh",title:lang.rwfh, content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")},
+            { name:"xlzm",title:lang.xlzm, content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")},
+            { name:"ewzm",title:lang.ewzm, content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")},
+            { name:"pyzm",title:lang.pyzm, content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")},
+            { name:"zyzf",title:lang.zyzf, content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")}
         ];
         (function createTab(content){
             for(var i =0,ci;ci = content[i++];){

+ 9 - 7
DjangoUeditor/static/UEditor/dialogs/table/edittd.html

@@ -2,9 +2,9 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>标题</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
-    <script type="text/javascript" src="../internal.js"></script>
+
     <style type="text/css">
         * {margin: 0; padding: 0}
         table { margin: 10px;font-size: 12px}
@@ -17,12 +17,12 @@
 <body>
 <table>
     <tr>
-        <td width="70"><span class="strong">背景颜色</span></td>
+        <td width="70"><span class="strong"><var id="lang_background"></var></span></td>
         <td><input id="bgColor" type="text" value="#FFFFFF"></td>
     </tr>
     <tr>
-        <td rowspan="2"><span class="strong">对齐方式</span></td>
-        <td>水平:&nbsp;<select id="align">
+        <td rowspan="2"><span class="strong"><var id="lang_alignment"></var></span></td>
+        <td><var id="lang_horizontal"></var>:&nbsp;<select id="align">
                 <option value="">默认</option>
                 <option value="center">居中</option>
                 <option value="left">居左</option>
@@ -31,7 +31,7 @@
         </td>
     </tr>
     <tr>
-        <td>垂直:&nbsp;<select id="vAlign">
+        <td><var id="lang_vertical"></var>:&nbsp;<select id="vAlign">
                 <option value="">默认</option>
                 <option value="middle">居中</option>
                 <option value="top">顶端对齐</option>
@@ -41,6 +41,7 @@
     </tr>
 
 </table>
+<script type="text/javascript" src="../internal.js"></script>
 <script type="text/javascript">
     addColorPickListener();
     dialog.onok = function () {
@@ -96,7 +97,8 @@
     function getColorPicker() {
         return new UE.ui.Popup( {
             content:new UE.ui.ColorPicker( {
-                noColorText:'清除颜色'
+                noColorText:lang.noColor,
+                editor:editor
             } )
         } );
     }

+ 35 - 35
DjangoUeditor/static/UEditor/dialogs/table/table.html

@@ -2,7 +2,7 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>标题</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
     <style type="text/css">
         *{margin: 0;padding: 0;font-size: 12px;}
@@ -29,13 +29,13 @@
 <body>
     <div class="wrapper">
         <fieldset  class="base">
-            <legend>基本信息</legend>
+            <legend><var id="lang_baseInfo"></var></legend>
             <table>
                 <tr>
-                    <td width="120"><label for="numRows">行数: </label><input id="numRows" type="text"  /> 行</td>
+                    <td width="120"><label for="numRows"><var id="lang_rows"></var>: </label><input id="numRows" type="text"  /> <var id="lang_rowUnit"></var></td>
                     <td>
-                        <label for="width">宽度: </label><input id="width" type="text"  />
-                        <label for="widthUnit">度量单位: </label>
+                        <label for="width"><var id="lang_width"></var>: </label><input id="width" type="text"  />
+                        <label for="widthUnit"><var id="lang_widthUnit"></var>: </label>
                         <select id="widthUnit">
                             <option value="%">%</option>
                             <option value="px">px</option>
@@ -43,10 +43,10 @@
                     </td>
                 </tr>
                 <tr>
-                    <td><label for="numCols">列数: </label><input id="numCols" type="text"  /> 列</td>
+                    <td><label for="numCols"><var id="lang_cols"></var>: </label><input id="numCols" type="text"  /> <var id="lang_colUnit"></var></td>
                     <td>
-                        <label for="height">高度: </label><input id="height" type="text"  />
-                        <label for="heightUnit">度量单位: </label>
+                        <label for="height"><var id="lang_height"></var>: </label><input id="height" type="text"  />
+                        <label for="heightUnit"><var id="lang_heightUnit"></var>: </label>
                         <select id="heightUnit">
                             <option value="%">%</option>
                             <option value="px">px</option>
@@ -55,45 +55,45 @@
                 </tr>
             </table>
             <div id="message" style="display: none">
-                <p>温馨提示:</p>
-                <p id="messageContent">边距最大值不能超过13px!</p>
+                <p><var id="lang_warmPrompt"></var>:</p>
+                <p id="messageContent"><var id="lang_maxPadding"></var></p>
             </div>
         </fieldset>
         <div>
             <fieldset  class="extend">
-                <legend>扩展信息<span style="font-weight: normal;">(可预览)</span></legend>
+                <legend><var id="lang_extendInfo"></var><span style="font-weight: normal;">(<var id="lang_preview"></var>)</span></legend>
                 <table>
                     <tr>
-                        <td width="60"><span class="bold">表格边框</span>:</td>
-                        <td><label for="border">大小: </label><input id="border" type="text"  /> px&nbsp;</td>
-                        <td><label for="borderColor">颜色: </label><input id="borderColor" type="text"  /></td>
+                        <td width="60"><span class="bold"><var id="lang_tableBorder"></var></span>:</td>
+                        <td><label for="border"><var id="lang_borderSize"></var>: </label><input id="border" type="text"  /> px&nbsp;</td>
+                        <td><label for="borderColor"><var id="lang_borderColor"></var>: </label><input id="borderColor" type="text"  /></td>
                     </tr>
                     <tr style="border-bottom: 1px solid #ddd">
-                        <td><span class="bold">边距间距</span>:</td>
-                        <td><label for="cellPadding">边距: </label><input id="cellPadding" type="text"  /> px&nbsp;</td>
-                        <td><label for="cellSpacing">间距: </label><input id="cellSpacing" type="text"  /> px </td>
+                        <td><span class="bold"><var id="lang_mar_pad"></var></span>:</td>
+                        <td><label for="cellPadding"><var id="lang_margin"></var>: </label><input id="cellPadding" type="text"  /> px&nbsp;</td>
+                        <td><label for="cellSpacing"><var id="lang_padding"></var>: </label><input id="cellSpacing" type="text"  /> px </td>
                     </tr>
                     <tr>
-                        <td colspan="3"><span class="bold">表格的背景颜色</span>:
+                        <td colspan="3"><span class="bold"><var id="lang_table_background"></var></span>:
                             <input id="bgColor" type="text"  />
                         </td>
                     </tr>
                     <tr>
-                        <td colspan="3"><span class="bold">表格的对齐方式</span>:
+                        <td colspan="3"><span class="bold"><var id="lang_table_alignment"></var></span>:
                             <select id="align">
-                                <option value="">默认</option>
-                                <option value="center">居中</option>
-                                <option value="left">居左</option>
-                                <option value="right">居右</option>
+                                <option value=""></option>
+                                <option value="center"></option>
+                                <option value="left"></option>
+                                <option value="right"></option>
                             </select>
                         </td>
                     </tr>
                     <tr>
                        <td colspan="3">
-                           <span class="bold">边框设置作用于</span>:
+                           <span class="bold"><var id="lang_borderFor"></var></span>:
                            <select id="borderType">
-                               <option value="0">仅表格</option>
-                               <option value="1">所有单元格</option>
+                               <option value="0"></option>
+                               <option value="1"></option>
                            </select>
                        </td>
                     </tr>
@@ -103,9 +103,9 @@
 
             <div id="preview">
                 <table border="1" borderColor="#000" cellpadding="0" cellspacing="0" style="border-collapse: collapse;">
-                    <tr><td>这</td><td>是</td><td>用</td></tr>
-                    <tr><td></td><td></td><td></td></tr>
-                    <tr><td></td><td></td><td></td></tr>
+                    <tr><td colspan="3"><var id="lang_forPreview"></var></td></tr>
+                    <tr><td></td><td></td><td></td></tr>
+                    <tr><td></td><td></td><td></td></tr>
                 </table>
             </div>
         </div>
@@ -123,7 +123,7 @@
                     ci.value = 5;
                     break;
                 case 'bgColor':
-                    ci.value = '#FFFFFF';
+                    ci.value = '';
                     break;
                 case 'borderColor':
                     ci.value = '#000000';
@@ -180,13 +180,13 @@
                 $G('borderColor').value = (table.getAttribute('borderColor')||"#000000").toUpperCase();
                 $G("border").value = table.getAttribute("border");
                 for(var i=0,ip,opts= $G("align").options;ip=opts[i++];){
-                    if(ip.value == table.getAttribute('align')){
+                    if(ip.value == (table.getAttribute('align' )||"").toLowerCase()){
                         ip.selected = true;
                         break;
                     }
                 }
                 $G("borderType").options[table.getAttribute('borderType') == '1' ? 1: 0].selected = true;
-                $G("bgColor").value = (table.getAttribute("bgColor")||"#FFFFFF").toUpperCase();
+                $G("bgColor").value = (table.getAttribute("bgColor")||"").toUpperCase();
                 createTable();
             }
         }else{
@@ -215,7 +215,7 @@
                     case 'height':
                     case 'width':
                         if(ci.value && !/^[1-9]+[0-9]*$/.test(ci.value)){
-                            alert("请输入正确的数值!");
+                            alert(lang.errorNum);
                             $focus(ci);
                             return false;
                         }
@@ -224,7 +224,7 @@
                     case 'cellpadding':
                     case 'border':
                         if(ci.value && !/^[0-9]*$/.test(ci.value)){
-                            alert("请输入正确的数值!");
+                            alert(lang.errorNum);
                             $focus(ci);
                             return false;
                         }
@@ -232,7 +232,7 @@
                     case 'bgColor':
                     case 'borderColor':
                         if(ci.value && !/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(ci.value)){
-                            alert("请输入正确的颜色值");
+                            alert(lang.errorColor);
                             $focus(ci);
                             return false;
                         }

+ 11 - 9
DjangoUeditor/static/UEditor/dialogs/table/table.js

@@ -51,13 +51,13 @@
                 $G("message").style.display="none";
                 switch(this.id){
                     case "border":
-                        $G("border").value = filter(this.value,"border","边框");
+                        $G("border").value = filter(this.value,"border");
                         break;
                     case "cellPadding":
-                        $G("cellPadding").value = filter(this.value,"cellPadding","边距");
+                        $G("cellPadding").value = filter(this.value,"cellPadding");
                         break;
                     case "cellSpacing":
-                        $G("cellSpacing").value = filter(this.value,"cellSpacing","间距");
+                        $G("cellSpacing").value = filter(this.value,"cellSpacing");
                         break;
                     default:
 
@@ -97,7 +97,7 @@
         cellSpacing>0 && html.push(' cellSpacing="' + cellSpacing + '" ');
         html.push(' border="' + (border||1) +'" borderColor="' + (borderColor||'#000000') +'"');
         bgColor && html.push(' bgColor="' + bgColor + '"');
-        html.push(' ><tr><td>这</td><td>是</td><td>用</td></tr><tr><td>来</td><td>预</td><td>览</td></tr><tr><td>的</td><td></td><td></td></tr></table>');
+        html.push(' ><tr><td colspan="3"><var id="lang_forPreview">'+lang.static.lang_forPreview+'</var></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></table>');
         var preview = $G("preview");
         preview.innerHTML = html.join("");
         //如果针对每个单元格
@@ -110,24 +110,25 @@
         for(var i =0,td,tds = domUtils.getElementsByTagName(table,"td");td = tds[i++];){
             td.style.padding = cellPadding + "px";
         }
+        setTablePosition(align.toLowerCase());
     }
     function setMax(value,max){
         return value>max? max:value;
     }
-    function filter(value,property,des){
+    function filter(value,property){
         var maxPreviewValue = 5,
                 maxValue = 10;
         if(!isNum(value) && value!=""){
             $G(property).value = "";
             $G("message").style.display ="";
-            $G("messageContent").innerHTML= "请输入正确的数值!";
+            $G("messageContent").innerHTML= lang.errorNum;
             return property=="border"?1:0;
         }
         if(value > maxPreviewValue){
             $G("message").style.display ="";
-            $G("messageContent").innerHTML= des+"超过" + maxPreviewValue+"px时不再提供实时预览!";
+            $G("messageContent").innerHTML= lang.overflowPreviewMsg.replace("{#value}",maxPreviewValue);
             if(value>maxValue){
-                $G("messageContent").innerHTML = des+"最大值不能超过"+maxValue+"px!";
+                $G("messageContent").innerHTML = lang.overflowMsg.replace("{#value}",maxValue);
                 $G(property).value = maxValue;
                 return maxValue;
             }
@@ -171,7 +172,8 @@
     function getColorPicker(){
         return new UE.ui.Popup({
             content: new UE.ui.ColorPicker({
-                noColorText: '清除颜色'
+                noColorText: lang.noColor,
+                editor:editor
             })
         });
     }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 26 - 0
DjangoUeditor/static/UEditor/dialogs/template/config.js


BIN
DjangoUeditor/static/UEditor/dialogs/template/images/bg.gif


BIN
DjangoUeditor/static/UEditor/dialogs/template/images/pre0.png


BIN
DjangoUeditor/static/UEditor/dialogs/template/images/pre1.png


BIN
DjangoUeditor/static/UEditor/dialogs/template/images/pre2.png


BIN
DjangoUeditor/static/UEditor/dialogs/template/images/pre3.png


BIN
DjangoUeditor/static/UEditor/dialogs/template/images/pre4.png


+ 19 - 0
DjangoUeditor/static/UEditor/dialogs/template/template.css

@@ -0,0 +1,19 @@
+*{margin:0;padding:0;}
+.wrap{ padding: 5px;}
+.left{width:425px;float: left;}
+.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;}
+.right .pre{height: 332px;overflow-y: auto;}
+.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;}
+.right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;}
+.right .preitem img{display: block;margin: 0 auto;width:100px;}
+.clear{clear: both;}
+.top{height:26px;line-height: 26px;padding: 5px;}
+.bottom{height:320px;width:100%;margin: 0 auto;}
+.transparent{ background: url("images/bg.gif") repeat;}
+.bottom table tr td{border:1px dashed #ccc;}
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;}
+.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;}
+p{margin: 5px 0}
+table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;}
+li{clear:both}
+ol{padding-left:40px; }

+ 26 - 0
DjangoUeditor/static/UEditor/dialogs/template/template.html

@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <link rel="stylesheet" type="text/css" href="template.css">
+</head>
+<body>
+    <div class="wrap">
+        <div class="left">
+            <div class="top">
+                <label><var id="lang_template_clear"></var>:<input id="issave" type="checkbox"></label>
+            </div>
+            <div class="bottom border_style1" id="preview"></div>
+        </div>
+        <fieldset  class="right border_style1">
+            <legend><var id="lang_template_select"></var></legend>
+            <div class="pre" id="preitem"></div>
+        </fieldset>
+        <div class="clear"></div>
+    </div>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="config.js"></script>
+    <script type="text/javascript" src="template.js"></script>
+</body>
+</html>

+ 53 - 0
DjangoUeditor/static/UEditor/dialogs/template/template.js

@@ -0,0 +1,53 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-8-8
+ * Time: 下午2:09
+ * To change this template use File | Settings | File Templates.
+ */
+(function () {
+    var me = editor,
+            preview = $G( "preview" ),
+            preitem = $G( "preitem" ),
+            tmps = templates,
+            currentTmp;
+    var initPre = function () {
+        var str = "";
+        for ( var i = 0, tmp; tmp = tmps[i++]; ) {
+            str += '<div class="preitem" onclick="pre(' + i + ')"><img src="' + "images/" + tmp.pre + '" ' + (tmp.title ? "alt=" + tmp.title + " title=" + tmp.title + "" : "") + '></div>';
+        }
+        preitem.innerHTML = str;
+    };
+    var pre = function ( n ) {
+        var tmp = tmps[n - 1];
+        currentTmp = tmp;
+        clearItem();
+        domUtils.setStyles( preitem.childNodes[n - 1], {
+            "background-color":"lemonChiffon",
+            "border":"#ccc 1px solid"
+        } );
+        preview.innerHTML = tmp.preHtml ? tmp.preHtml : "";
+    };
+    var clearItem = function () {
+        var items = preitem.children;
+        for ( var i = 0, item; item = items[i++]; ) {
+            domUtils.setStyles( item, {
+                "background-color":"",
+                "border":"white 1px solid"
+            } );
+        }
+    };
+    dialog.onok = function () {
+        if ( !$G( "issave" ).checked ){
+            me.execCommand( "cleardoc" );
+        }
+        var obj = {
+            html:currentTmp && currentTmp.html
+        };
+        me.execCommand( "template", obj );
+    };
+    initPre();
+    window.pre = pre;
+    preitem.children[1].click();
+
+})();

+ 7 - 4
DjangoUeditor/static/UEditor/dialogs/video/video.css

@@ -5,7 +5,8 @@ body{font-size: 12px;color: #888}
 #tabHeads{position: relative; width:560px;padding-left:9px;z-index: 10;}
 #tabHeads span{
     display:inline-block;
-    width: 82px;
+    /*width: 82px;*/
+    padding: 0 5px;
     height:30px;
     text-align: center;
     cursor: pointer;
@@ -36,12 +37,13 @@ body{font-size: 12px;color: #888}
     border: 1px solid #d7d7d7;
 }
 #videoSearchBtn,#videoSearchReset{
-    width: 80px;
+    /*width: 80px;*/
     height: 25px;
     line-height: 25px;
     background: #eee;
     border: 1px solid #d7d7d7;
-    cursor: pointer
+    cursor: pointer;
+    padding: 0 5px;
 }
 
 
@@ -53,11 +55,12 @@ fieldset{
     padding-left: 5px;
     margin-bottom: 20px;
     padding-bottom: 5px;
+    width: 115px;
 }
 fieldset legend{font-weight: bold;}
 fieldset p{line-height: 30px;}
 fieldset input.txt{
-    width: 70px;
+    width: 65px;
     height: 21px;
     line-height: 21px;
     margin: 8px 5px;

+ 18 - 18
DjangoUeditor/static/UEditor/dialogs/video/video.html

@@ -2,7 +2,7 @@
         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-    <title>视频</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
     <link rel="stylesheet" type="text/css" href="video.css" />
 </head>
@@ -10,23 +10,23 @@
 <div class="wrapper">
     <div id="videoTab">
         <div id="tabHeads">
-            <span tabSrc="video" class="focus">插入视频</span>
-            <span tabSrc="videoSearch">视频搜索</span>
+            <span tabSrc="video" class="focus"><var id="lang_tab_insertV"></var></span>
+            <span tabSrc="videoSearch"><var id="lang_tab_searchV"></var></span>
         </div>
         <div id="tabBodys">
             <div id="video" class="panel">
-               <table><tr><td><label for="videoUrl" class="url">视频地址</label></td><td><input id="videoUrl" type="text"></td></tr></table>
+               <table><tr><td><label for="videoUrl" class="url"><var id="lang_video_url"></var></label></td><td><input id="videoUrl" type="text"></td></tr></table>
                <div id="preview"></div>
                <div id="videoInfo">
                    <fieldset>
-                       <legend>视频尺寸</legend>
+                       <legend><var id="lang_video_size"></var></legend>
                        <table>
-                           <tr><td><label for="videoWidth">宽度</label></td><td><input class="txt" id="videoWidth" type="text"/></td></tr>
-                           <tr><td><label for="videoHeight">高度</label></td><td><input class="txt" id="videoHeight" type="text"/></td></tr>
+                           <tr><td><label for="videoWidth"><var id="lang_videoW"></var></label></td><td><input class="txt" id="videoWidth" type="text"/></td></tr>
+                           <tr><td><label for="videoHeight"><var id="lang_videoH"></var></label></td><td><input class="txt" id="videoHeight" type="text"/></td></tr>
                        </table>
                    </fieldset>
                    <fieldset>
-                      <legend>对齐方式</legend>
+                      <legend><var id="lang_alignment"></var></legend>
                       <div id="videoFloat"></div>
                   </fieldset>
                </div>
@@ -34,20 +34,20 @@
             <div id="videoSearch" class="panel" style="display: none">
                 <table style="margin-top: 5px;">
                     <tr>
-                        <td><input id="videoSearchTxt" value="请输入搜索关键词" type="text" /></td>
+                        <td><input id="videoSearchTxt"  type="text" /></td>
                         <td>
                             <select id="videoType">
-                                <option value="0">全部</option>
-                                <option value="29">热点</option>
-                                <option value="1">娱乐</option>
-                                <option value="5">搞笑</option>
-                                <option value="15">体育</option>
-                                <option value="21">科技</option>
-                                <option value="31">综艺</option>
+                                <option value="0"></option>
+                                <option value="29"></option>
+                                <option value="1"></option>
+                                <option value="5"></option>
+                                <option value="15"></option>
+                                <option value="21"></option>
+                                <option value="31"></option>
                             </select>
                         </td>
-                        <td><input id="videoSearchBtn" type="button" value="百度一下" /></td>
-                        <td><input id="videoSearchReset" type="button" value="清空搜索" /></td>
+                        <td><input id="videoSearchBtn" type="button"/></td>
+                        <td><input id="videoSearchReset" type="button" /></td>
                     </tr>
                 </table>
                 <div id="searchList"></div>

+ 8 - 8
DjangoUeditor/static/UEditor/dialogs/video/video.js

@@ -147,7 +147,7 @@ var video = {};
          for ( var i = 0, ci; ci = nodes[i++]; ) {
              var value = ci.value;
              if ( !isNumber( value ) && value) {
-                 alert( "请输入正确的长度或者宽度值!例如:123,400" );
+                 alert( lang.numError );
                  ci.value = "";
                  ci.focus();
                  return false;
@@ -210,7 +210,7 @@ var video = {};
      function createAlignButton( ids ) {
          for ( var i = 0, ci; ci = ids[i++]; ) {
              var floatContainer = $G( ci ),
-                     nameMaps = {"none":"默认", "left":"左浮动", "right":"右浮动", "center":"独占一行"};
+                     nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight, "center":lang.block};
              for ( var j in nameMaps ) {
                  var div = document.createElement( "div" );
                  div.setAttribute( "name", j );
@@ -270,7 +270,7 @@ var video = {};
 		}else if(youku){
             url = "http://player.youku.com/player.php/sid/"+youku[1]+"/v.swf"
         }else if(!endWith(url,[".swf",".flv",".wmv"])){
-            $G("preview").innerHTML = "您输入的视频地址有误,请检查后确认!";
+            $G("preview").innerHTML = lang.urlError;
             return;
         }
         $G("preview").innerHTML = '<embed type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
@@ -306,7 +306,7 @@ var video = {};
             selectTxt(keywordInput);
             return;
         }
-        $G( "searchList" ).innerHTML = " &nbsp;视频加载中,请稍后……";
+        $G( "searchList" ).innerHTML = lang.loading;
         var keyword = keywordInput.value,
                 type = $G("videoType").value,
             str="";
@@ -325,16 +325,16 @@ var video = {};
                 for(var i=0,ci;ci = videos[i++];){
                     html.push(
                         "<tr>" +
-                            "<td><img title='单击选中视频' ue_video_url='"+ci.outerPlayerUrl+"' alt='"+ci.tags+"' width='106' height='80' src='"+ci.picUrl+"' /> </td>" +
+                            "<td><img title='"+lang.clickToSelect+"' ue_video_url='"+ci.outerPlayerUrl+"' alt='"+ci.tags+"' width='106' height='80' src='"+ci.picUrl+"' /> </td>" +
                             "<td>" +
-                                "<p><a target='_blank' title='访问源视频' href='"+ci.itemUrl+"'>"+ci.title.substr(0,30)+"</a></p>" +
+                                "<p><a target='_blank' title='"+lang.goToSource+"' href='"+ci.itemUrl+"'>"+ci.title.substr(0,30)+"</a></p>" +
                                 "<p style='height: 62px;line-height: 20px' title='"+ci.description+"'> "+ ci.description.substr(0,95) +" </p>" +
                             "</td>" +
                        "</tr>"
                     );
                 }
                 html.push("</table>");
-                $G("searchList").innerHTML = str = html.length ==2 ?" &nbsp; &nbsp;抱歉,未搜到任何相关视频!" : html.join("");
+                $G("searchList").innerHTML = str = html.length ==2 ?lang.noVideo : html.join("");
                 var imgs = domUtils.getElementsByTagName($G("searchList"),"img");
                 if(!imgs)return;
                 for(var i=0,img;img = imgs[i++];){
@@ -366,7 +366,7 @@ var video = {};
     function addSearchListener(){
         domUtils.on($G("videoSearchBtn"),"click",getMovie);
         domUtils.on($G( "videoSearchTxt" ),"click",function () {
-            if ( this.value == "请输入搜索关键词" ) {
+            if ( this.value == lang.static.videoSearchTxt.value ) {
                 this.value = "";
             }
             this.setAttribute("hasClick","true");

+ 3 - 3
DjangoUeditor/static/UEditor/dialogs/webapp/webapp.html

@@ -1,7 +1,7 @@
 <!DOCTYPE>
 <html>
 <head>
-    <title>标题</title>
+    <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
     <script type="text/javascript" src="../internal.js"></script>
 
@@ -28,7 +28,7 @@
         if ( apikey && apikey.length == 24 ) {
             var searchConfig = {
                 container:'appShow', //容器ID
-                tips:"搜索应用", //该值用于自动清空
+                tips:"", //该值用于自动清空
                 search:1, //是否显示搜索框
                 ps:12, //每页显示的条数
                 suggest:1, //是否开启搜索自动完成
@@ -53,7 +53,7 @@
             script.src = "http://app.baidu.com/appweb/api/search?auto=yes&container=container&apikey=" + apikey + "&instanceName=baiduApp&callback=clickCallback&config=searchConfig";
             document.body.appendChild( script );
         } else {
-            $G( "appShow" ).innerHTML = "<p class='errorMsg'>本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey! <a title='百度开放接口' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>点此申请</a></p><p class='errorMsg'>申请完成之后请至editor_config.js中配置获得的appkey!</p>" ;
+            $G( "appShow" ).innerHTML = "<p class='errorMsg'>"+lang.tip1+"<a title='"+lang.anthorApi+"' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>"+lang.applyFor+"</a></p><p class='errorMsg'>"+lang.tip2+"</p>" ;
         }
 
     </script>

BIN
DjangoUeditor/static/UEditor/dialogs/wordimage/imageUploader.swf


+ 11 - 13
DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.html

@@ -5,16 +5,15 @@
     <title></title>
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
 
-    <script type="text/javascript" src="../internal.js"></script>
-    <script type="text/javascript" src="../tangram.js"></script>
+
     <style type="text/css">
         *{padding: 0;margin: 0}
         body {font-size: 12px;overflow: hidden;padding: 10px;margin: 0;color: #838383;}
         .wrapper{width: 600px;height: 352px;overflow: hidden;position: relative;border-bottom: 1px solid #d7d7d7}
         .localPath input{float: left;width: 350px;line-height: 20px;height: 20px;}
-        #clipboard{float:left;width: 70px;height: 30px; background: url(../../themes/default/images/copy.png) -153px -1px no-repeat;}
+        #clipboard{float:left;width: 70px;height: 30px; }
         .description{ color: #0066cc; margin-top: 2px; width: 450px; height: 45px;float: left;line-height: 22px}
-        #upload{width: 100px;height: 30px;float: right; background: url("../../themes/default/images/upload.png");margin:10px 2px 0 0;cursor: pointer;}
+        #upload{width: 100px;height: 30px;float: right; margin:10px 2px 0 0;cursor: pointer;}
         #msg{ width: 140px; height: 30px; line-height:25px;float: left;color: red}
     </style>
 </head>
@@ -27,12 +26,14 @@
         </div>
         <div id="flashContainer"></div>
         <div>
-            <div id="upload" style="display: none" ></div>
+            <div id="upload" style="display: none" ><img id="uploadBtn"></div>
             <div class="description">
-                <span style="color: red">图片转存步骤:</span>1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。
+                <span style="color: red"><var id="lang_resave"></var>: </span><var id="lang_step"></var>
             </div>
           </div>
     </div>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="../tangram.js"></script>
     <script type="text/javascript" src="wordimage.js"></script>
     <script type="text/javascript">
             //全局变量
@@ -43,13 +44,13 @@
             compressSide:0,
             maxImageSideLength:900
         });
-        window.onload = function(){
+        utils.domReady(function(){
             //创建Flash相关的参数集合
             var flashOptions = {
                 container:"flashContainer",                                                    //flash容器id
                 url:editor.options.wordImageUrl,                                           // 上传处理页面的url地址
-                ext:'{"param1":"参数值1", "param2":"参数值2"}',                                 //可向服务器提交的自定义参数列表
-                fileType:'{"description":"图片", "extension":"*.gif;*.jpeg;*.png;*.jpg"}',     //上传文件格式限制
+                ext:'{"param1":"value1", "param2":"value2"}',                                 //可向服务器提交的自定义参数列表
+                fileType:'{"description":"'+lang.fileType+'", "extension":"*.gif;*.jpeg;*.png;*.jpg"}',     //上传文件格式限制
                 flashUrl:'imageUploader.swf',                                                  //上传用的flash组件地址
                 width:600,          //flash的宽度
                 height:272,         //flash的高度
@@ -62,9 +63,6 @@
                 maxSize:2,                         // 文件的最大体积,单位M
                 compressSize:1,                   // 上传前如果图片体积超过该值,会先压缩,单位M
                 maxNum:32,                         // 单次最大可上传多少个文件
-                backgroundUrl:'',                 // flash界面的背景图片,留空默认
-                listBackgroundUrl:'',            // 单个预览框背景,留空默认
-                buttonUrl:'',                     // 上传按钮背景,留空默认
                 compressSide:editor.options.compressSide,                 //等比压缩的基准,0为按照最长边,1为按照宽度,2为按照高度
                 compressLength:editor.options.maxImageSideLength        //能接受的最大边长,超过该值Flash会自动等比压缩
             };
@@ -98,7 +96,7 @@
                 //startUploadCallback: startUploadCallback    // 开始上传某个文件时的回调
             };
             wordImage.init(flashOptions,callbacks);
-        }
+        });
 
     </script>
 

+ 22 - 3
DjangoUeditor/static/UEditor/dialogs/wordimage/wordimage.js

@@ -12,7 +12,7 @@
 var wordImage = {};
 //(function(){
 var g = baidu.g,
-	flashObj;
+	flashObj,flashContainer;
 wordImage.init = function(opt, callbacks) {
 	showLocalPath("localPath");
 	//createCopyButton("clipboard","localPath");
@@ -21,6 +21,10 @@ wordImage.init = function(opt, callbacks) {
 	addOkListener();
 };
 
+function hideFlash(){
+    flashObj = null;
+    flashContainer.innerHTML = "";
+}
 function addOkListener() {
 	dialog.onok = function() {
 		if (!imageUrls.length) return;
@@ -39,7 +43,11 @@ function addOkListener() {
 				}
 			}
 		}
+        hideFlash();
 	};
+    dialog.oncancel = function(){
+        hideFlash();
+    }
 }
 
 /**
@@ -68,21 +76,32 @@ function showLocalPath(id) {
 }
 
 function createFlashUploader(opt, callbacks) {
+    //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容
+    var i18n = utils.extend({},lang.flashI18n);
+    //处理图片资源地址的编码,补全等问题
+    for(var i in i18n){
+        if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){
+            i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]);
+        }
+    }
+    opt = utils.extend(opt,i18n,false);
 	var option = {
 		createOptions:{
 			id:'flash',
 			url:opt.flashUrl,
 			width:opt.width,
 			height:opt.height,
-			errorMessage:'Flash插件初始化失败,请更新您的FlashPlayer版本之后重试!',
+			errorMessage:lang.flashError,
 			wmode:browser.safari ? 'transparent' : 'window',
 			ver:'10.0.0',
 			vars:opt,
 			container:opt.container
 		}
 	};
+
 	option = extendProperty(callbacks, option);
 	flashObj = new baidu.flash.imageUploader(option);
+    flashContainer = $G(opt.container);
 }
 
 function extendProperty(fromObj, toObj) {
@@ -97,7 +116,7 @@ function extendProperty(fromObj, toObj) {
 //})();
 
 function getPasteData(id) {
-	baidu.g("msg").innerHTML = " 图片地址已复制成功!</br>";
+	baidu.g("msg").innerHTML = lang.copySuccess + "</br>";
 	setTimeout(function() {
 		baidu.g("msg").innerHTML = "";
 	}, 5000);

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1119 - 1151
DjangoUeditor/static/UEditor/editor_all.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
DjangoUeditor/static/UEditor/editor_all_min.js


+ 91 - 135
DjangoUeditor/static/UEditor/editor_config.js

@@ -20,6 +20,7 @@
      * window.UEDITOR_HOME_URL = "/xxxx/xxxx/";
      */
     var URL;
+
     /**
      * 此处配置写法适用于UEditor小组成员开发使用,外部部署用户请按照上述说明方式配置即可,建议保留下面两行,以兼容可在具体每个页面配置window.UEDITOR_HOME_URL的功能。
      */
@@ -34,13 +35,22 @@
         //为编辑器实例添加一个路径,这个不能被注释
         UEDITOR_HOME_URL : URL
 
+        //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件:
+        //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase()
+        //,lang:"zh-cn"
+        //,langPath:URL +"lang/"
+
         //图片上传配置区
         ,imageUrl:URL+"php/imageUp.php"             //图片上传提交地址
         ,imagePath:URL + "php/"                     //图片修正地址,引用了fixedImagePath,如有特殊需求,可自行配置
-        //,imageFieldName:"upfile"                   //图片数据的key,若此处修改,需要在后台对应文件修改对应参数
+       //,imageFieldName:"upfile"                   //图片数据的key,若此处修改,需要在后台对应文件修改对应参数
         //,compressSide:0                            //等比压缩的基准,确定maxImageSideLength参数的参照对象。0为按照最长边,1为按照宽度,2为按照高度
         //,maxImageSideLength:900                    //上传图片最大允许的边长,超过会自动等比缩放,不缩放就设置一个比较大的值,更多设置在image.html中
 
+        //涂鸦图片配置区
+        ,scrawlUrl:URL+"php/scrawlUp.php"               //涂鸦上传地址
+        ,scrawlPath:URL+"php/"                          //图片修正地址,同imagePath
+
         //附件上传配置区
         ,fileUrl:URL+"php/fileUp.php"               //附件上传提交地址
         ,filePath:URL + "php/"                   //附件修正地址,同imagePath
@@ -52,7 +62,7 @@
         ,catcherPath:URL + "php/"                  //图片修正地址,同imagePath
         //,catchFieldName:"upfile"                   //提交到后台远程图片uri合集,若此处修改,需要在后台对应文件修改对应参数
         //,separater:'ue_separate_ue'               //提交至后台的远程图片地址字符串分隔符
-        //,localDomain:[]                            //本地顶级域名,当开启远程图片抓取时,除此之外的所有其它域名下的图片都将被抓取到本地
+        //,localDomain:[]                            //本地顶级域名,当开启远程图片抓取时,除此之外的所有其它域名下的图片都将被抓取到本地,默认不抓取127.0.0.1和localhost
 
         //图片在线管理配置区
         ,imageManagerUrl:URL + "php/imageManager.php"       //图片在线管理的处理地址
@@ -65,18 +75,14 @@
         //,snapscreenServerPort: 80                                    //屏幕截图的server端端口
         //,snapscreenImgAlign: 'center'                                //截图的图片默认的排版方式
 
-
         //word转存配置区
         ,wordImageUrl:URL + "php/imageUp.php"             //word转存提交地址
         ,wordImagePath:URL + "php/"                       //
         //,wordImageFieldName:"upfile"                     //word转存表单名若此处修改,需要在后台对应文件修改对应参数
 
-
         //获取视频数据的地址
         ,getMovieUrl:URL+"php/getMovie.php"                   //视频数据获取地址
 
-
-
         //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的从新定义
         ,toolbars:[
             ['fullscreen', 'source', '|', 'undo', 'redo', '|',
@@ -84,158 +90,122 @@
                 'blockquote', '|', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist','selectall', 'cleardoc', '|', 'customstyle',
                 'paragraph', '|','rowspacingtop', 'rowspacingbottom','lineheight', '|','fontfamily', 'fontsize', '|',
                 'directionalityltr', 'directionalityrtl', '|', '', 'indent', '|',
-                'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|',
+                'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|','touppercase','tolowercase','|',
                 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright',
-                'imagecenter', '|', 'insertimage', 'emotion', 'insertvideo', 'attachment', 'map', 'gmap', 'insertframe','highlightcode','webapp','pagebreak', '|',
+                'imagecenter', '|', 'insertimage', 'emotion','scrawl', 'insertvideo', 'attachment', 'map', 'gmap', 'insertframe','highlightcode','webapp','pagebreak','template','background', '|',
                 'horizontal', 'date', 'time', 'spechars','snapscreen', 'wordimage', '|',
                 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', '|',
                 'print', 'preview', 'searchreplace','help']
         ]
-        //当鼠标放在工具栏上时显示的tooltip提示
+        //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准
         ,labelMap:{
-            'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进','snapscreen': '截图',
-            'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标',
-            'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
-            'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
-            'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
-            'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
-            'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格',
-            'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'insertparagraphbeforetable':'表格前插行', 'cleardoc':'清空文档',
-            'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'insertimage':'图片', 'inserttable':'表格', 'link':'超链接',
-            'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',
-            'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
-            'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
-            'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
-            'RowSpacingTop':'段前距', 'RowSpacingBottom':'段后距','highlightcode':'插入代码', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
-            'imageleft':'左浮动', 'imageright':'右浮动','attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
-            'lineheight':'行间距', 'customstyle':'自定义标题','autotypeset': '自动排版','webapp':'百度应用'
+            'anchor':'', 'undo':''
         }
-
         //webAppKey
-        //百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能
+        //百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能  盛怒安乐死卡解决
         ,webAppKey:""
 
 
+        //若实例化编辑器的页面手动修改的domain,此处需要设置为true
+        //,customDomain:false
+
+        //针对getAllHtml方法,会在对应的head标签中增加该编码设置。
+        //,charset:"utf-8"
+
         //常用配置项目
         //,isShow : true    //默认显示编辑器
 
-
         //,initialContent:'欢迎使用ueditor!'    //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子
 
-
-        //,autoClearinitialContent:false //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了
-
+        //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了
 
         //,iframeCssUrl: URL + '/themes/default/iframe.css' //给编辑器内部引入一个css文件
 
-
         //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值
 
-
         //,focus:false //初始化时,是否让编辑器获得焦点true或false
 
-
         ,minFrameHeight:80  // 最小高度,默认320
 
-
-
         //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况)
 
         //,fullscreen : false //是否开启初始化时即全屏,默认关闭
 
-
         //,readonly : false /编辑器初始化结束后,编辑区域是否是只读的,默认是false
 
-
         //,zIndex : 900     //编辑器层级的基数,默认是900
 
-
         //,imagePopup:true      //图片操作的浮层开关,默认打开
 
-
         //,initialStyle:'body{font-size:18px}'   //编辑器内部样式,可以用来改变字体等
 
-
         //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹
 
+        //,pasteplain:true  //是否纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴
 
-         //,enterTag:'p' //编辑器回车标签。p或br
-
-
-
-        //,pasteplain:false  //是否纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴
-
-
+        //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串
         //iframeUrlMap
         //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径
         //,iframeUrlMap:{
         // 'anchor':'~/dialogs/anchor/anchor.html',
         // }
 
-
         //insertorderedlist
-        //有序列表的下拉配置
-        //,insertorderedlist : [
-        //['1,2,3...','decimal'],
-        //['a,b,c...','lower-alpha'],
-        //['i,ii,iii...','lower-roman'],
-        //['A,B,C','upper-alpha'],
-        //['I,II,III...','upper-roman']
-        // ]
-
+        //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准
+//        ,'insertorderedlist':{
+//             'decimal' : '' ,         //'1,2,3...'
+//             'lower-alpha' : '' ,    // 'a,b,c...'
+//             'lower-roman' : '' ,    //'i,ii,iii...'
+//             'upper-alpha' : '' ,    //'A,B,C'
+//             'upper-roman' : ''      //'I,II,III...'
+//        }
 
         //insertunorderedlist
-        //无序列表的下拉配置
-        //,insertunorderedlist : [
-        //['○ 小圆圈','circle'],
-        //['● 小圆点','disc'],
-        //['■ 小方块','square']
-        //]
-
+        //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准
+        //,insertunorderedlist : {
+        //    'circle' : '',  // '○ 小圆圈'
+        //    'disc' : '',    // '● 小圆点'
+        //    'square' : ''   //'■ 小方块'
+        //}
 
         //fontfamily
-        //字体
-        //,'fontfamily':[
-        //   ['宋体',['宋体', 'SimSun']],
-        //   ['楷体',['楷体', '楷体_GB2312', 'SimKai']],
-        //   ['黑体',['黑体', 'SimHei']],
-        //   ['隶书',['隶书', 'SimLi']],
-        //   ['andale mono',['andale mono']],
-        //   ['arial',['arial', 'helvetica', 'sans-serif']],
-        //   ['arial black',['arial black', 'avant garde']],
-        //   ['comic sans ms',['comic sans ms']],
-        //   ['impact',['impact', 'chicago']],
-        //   ['times new roman',['times new roman']]
-        //  ]
-
+        //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准
+//        ,'fontfamily':[
+//            { label:'',name:'songti',val:'宋体,SimSun'},
+//            { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'},
+//            { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'},
+//            { label:'',name:'heiti',val:'黑体, SimHei'},
+//            { label:'',name:'lishu',val:'隶书, SimLi'},
+//            { label:'',name:'andaleMono',val:'andale mono'},
+//            { label:'',name:'arial',val:'arial, helvetica,sans-serif'},
+//            { label:'',name:'arialBlack',val:'arial black,avant garde'},
+//            { label:'',name:'comicSansMs',val:'comic sans ms'},
+//            { label:'',name:'impact',val:'impact,chicago'},
+//            { label:'',name:'timesNewRoman',val:'times new roman'}
+//          ]
 
         //fontsize
         //字号
         //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36]
 
-
         //paragraph
-        //段落格式 值:显示的名字
-        //,'paragraph':['p:段落', 'h1:标题 1', 'h2:标题 2', 'h3:标题 3', 'h4:标题 4', 'h5:标题 5', 'h6:标题 6']
-
+        //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准
+        //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}
 
         //rowspacingtop
         //段间距 值和显示的名字相同
         //,'rowspacingtop':['5', '10', '15', '20', '25']
 
-
         //rowspacingBottom
         //段间距 值和显示的名字相同
-        //,'rowspacingtop':['5', '10', '15', '20', '25']
-
+        //,'rowspacingbottom':['5', '10', '15', '20', '25']
 
         //lineheight
         //行内间距 值和显示的名字相同
         //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5']
 
-
         //customstyle
-        //自定义样式
+        //自定义样式,不支持国际化,此处配置值即可最后显示值
         //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置
         //尽量使用一些常用的标签
         //参数说明
@@ -244,51 +214,46 @@
         //style 添加的样式
         //每一个对象就是一个自定义的样式
         //,'customstyle':[
-        //      {tag:'h1', label:'居中标题', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'},
-        //      {tag:'h1', label:'居左标题', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'},
-        //      {tag:'span', label:'强调', style:'font-style:italic;font-weight:bold;color:#000'},
-        //      {tag:'span', label:'明显强调', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'}
+        //      {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'},
+        //      {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'},
+        //      {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold;color:#000'},
+        //      {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'}
         //  ]
 
-
-        //contextMenu //定义了右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子
-        //,contextMenu:[
-        //    {
-        //        label:'显示的名字',
-        //        cmdName:'执行的command命令,当点击这个右键菜单时',
-        //        //exec可选,有了exec就会在点击时执行这个function,
-        //        exec:function () {
-        //            //this是当前编辑器的实例
-        //            //this.ui._dialogs['inserttableDialog'].open();
-        //        }
-        //    }
-        //   ]
-
-
+        //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准
+//        ,contextMenu:[
+//            {
+//                label:'',       //显示的名称
+//                cmdName:'selectall',//执行的command命令,当点击这个右键菜单时
+//                //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName
+//                exec:function () {
+//                    //this是当前编辑器的实例
+//                    //this.ui._dialogs['inserttableDialog'].open();
+//                }
+//            }
+//           ]
 
         //wordCount
-        //,wordCount:true          //是否开启字数统计
+        //,wordCount:false          //是否开启字数统计
         //,maximumWords:10000       //允许的最大字符数
-        //,wordCountMsg:'当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 '   //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数
-        //,wordOverFlowMsg:'<span style="color:red;">你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存!</span>'    //超出字数限制提示
-
-
+        //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示
+        //,wordCountMsg:''   //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符
+        //超出字数限制提示  留空支持多语言自动切换,否则按此配置显示
+        //,wordOverFlowMsg:''    //<span style="color:red;">你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存!</span>
 
         //highlightcode
         // 代码高亮时需要加载的第三方插件的路径
         // ,highlightJsUrl:URL + "third-party/SyntaxHighlighter/shCore.js"
         // ,highlightCssUrl:URL + "third-party/SyntaxHighlighter/shCoreDefault.css"
 
-
         //tab
         //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位
         //,tabSize:4
         //,tabNode:'&nbsp;'
 
-
         //elementPathEnabled
         //是否启用元素路径,默认是显示
-        //,elementPathEnabled : true
+        //,elementPathEnabled : false
 
         //removeFormat
         //清除格式时可以删除的标签和属性
@@ -297,37 +262,30 @@
         //removeFormatAttributes属性
         //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign'
 
-
-
          //undo
          //可以最多回退的次数,默认20
          //,maxUndoCount:20
          //当输入的字符数超过该值时,保存一次现场
-         //,maxInputCount:20
-
-
+//         ,maxInputCount:1
 
         //autoHeightEnabled
         // 是否自动长高,默认true
-        ,autoHeightEnabled:true
-
+        //,autoHeightEnabled:false
 
         //autoFloatEnabled
         //是否保持toolbar的位置不动,默认true
-        //,autoFloatEnabled:true
-
+        ,autoFloatEnabled:false,
+        //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面
+        //,topOffset:30
 
         //indentValue
         //首行缩进距离,默认是2em
         //,indentValue:'2em'
 
-
         //pageBreakTag
         //分页标识符,默认是_baidu_page_break_tag_
         //,pageBreakTag:'_baidu_page_break_tag_'
 
-
-
         //sourceEditor
         //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror
         //,sourceEditor:"codemirror"
@@ -336,18 +294,17 @@
         //,codeMirrorJsUrl:URL + "third-party/codemirror2.15/codemirror.js"
         //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror2.15/codemirror.css"
         //,codeMirrorCssUrl:URL + "third-party/codemirror2.15/codemirror.css"
-
-
-
+        //编辑器初始化完成后是否进入源码模式,默认为否。
+        //,sourceEditorFirst:false
 
         //serialize
         // 配置编辑器的过滤规则
         // serialize是个object,可以有属性blackList,whiteList属性,默认是{}
         // 例子:
-        //, serialize : {
-        //      //黑名单,编辑器会过滤掉一下标签
-        //      blackList:{style:1, link:1,object:1, applet:1, input:1, meta:1, base:1, button:1, select:1, textarea:1, '#comment':1, 'map':1, 'area':1}
-        // }
+//        , serialize : {
+//              //黑名单,编辑器会过滤掉一下标签
+//              blackList:{object:1, applet:1, input:1, meta:1, base:1, button:1, select:1, textarea:1, '#comment':1, 'map':1, 'area':1}
+//        }
 
 
         //autotypeset
@@ -367,6 +324,5 @@
         //      indent : false,                 // 行首缩进
         //      indentValue : '2em'             //行首缩进的大小
         //  }
-
     };
 })();

+ 505 - 0
DjangoUeditor/static/UEditor/lang/en/en.js

@@ -0,0 +1,505 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午6:57
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['en'] = {
+    'labelMap':{
+        'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen',
+        'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript',
+        'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote',
+        'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',
+        'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date',
+        'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',
+        'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows', 'splittocols':'SplitToCols', 'splittocells':'SplitToCells',
+        'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'insertparagraphbeforetable':'ParagraphBeforeTable', 'cleardoc':'Clear',
+        'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph', 'insertimage':'Image', 'inserttable':'Table', 'link':'Link',
+        'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
+        'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',
+        'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',
+        'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',
+        'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'highlightcode':'Code', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',
+        'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',
+        'lineheight':'LineHeight','edittd':'EditTD', 'customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background'
+    },
+    'insertorderedlist':{
+        'decimal':'1,2,3...',
+        'lower-alpha':'a,b,c...',
+        'lower-roman':'i,ii,iii...',
+        'upper-alpha':'A,B,C...',
+        'upper-roman':'I,II,III...'
+    },
+    'insertunorderedlist':{
+        'circle':'○ Circle',
+        'disc':'● Circle dot',
+        'square':'■ Rectangle '
+    },
+    'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},
+    'fontfamily':{
+        'songti':'Sim sun',
+        'kaiti':'Sim kai',
+        'heiti':'Sim hei',
+        'lishu':'Sim li',
+        'yahei': 'Microsoft yahei',
+        'andaleMono':'Andale mono',
+        'arial': 'Arial',
+        'arialBlack':'Arial black',
+        'comicSansMs':'Comic sans ms',
+        'impact':'Impact',
+        'timesNewRoman':'Times new roman'
+    },
+    'customstyle':{
+        'tc':'Title center',
+        'tl':'Title left',
+        'im':'Important',
+        'hi':'Highlight'
+    },
+    'elementPathTip':"Path",
+    'wordCountTip':"Word Count",
+    'wordCountMsg':'{#count} characters entered,{#leave} left. ',
+    'wordOverFlowMsg':'<span style="color:red;">The number of characters has exceeded allowable maximum values, the server may refuse to save!</span>',
+    'ok':"OK",
+    'cancel':"Cancel",
+    'closeDialog':"closeDialog",
+    'tableDrag':"You must import the file uiUtils.js before drag! ",
+    'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
+    'snapScreen_plugin':{
+        'browserMsg':"Only IE supported!",
+        'callBackErrorMsg':"The callback data is wrong,please check the config!",
+        'uploadErrorMsg':"Upload error,please check your server environment! "
+    },
+    'confirmClear':"Do you confirm to clear the Document?",
+    'contextMenu':{
+        'delete':"Delete",
+        'selectall':"Select all",
+        'deletecode':"Delete Code",
+        'cleardoc':"Clear Document",
+        'confirmclear':"Do you confirm to clear the Document?",
+        'unlink':"Unlink",
+        'paragraph':"Paragraph",
+        'edittable':"Table property",
+        'edittd':"Cell property",
+        'table':"Table",
+        'justifyleft':'Justify Left',
+            'justifyright':'Justify Right',
+            'justifycenter':'Justify Center',
+            'justifyj':'Default',
+        'deletetable':"Delete table",
+        'insertparagraphbeforetable':"Insert paragraph",
+        'deleterow':"Delete row",
+        'deletecol':"Delete col",
+        'insertrow':"Insert row",
+        'insertcol':"Insert col",
+        'mergeright':"Merge right",
+        'mergeleft':"Merge left",
+        'mergedown':"Merge down",
+        'mergecells':"Merge cells",
+        'splittocells':"Split to cells",
+        'splittocols':"Split to Cols",
+        'splittorows':"Split to Rows",
+        'copy':"Copy(Ctrl + c)",
+        'copymsg':"Please use 'Ctrl + c' instead!",
+        'paste':"Paste(Ctrl + v)",
+        'pastemsg':"Please use 'Ctrl + v' instead!"
+    },
+
+    'anthorMsg':"Link",
+    'clearColor':'Clear',
+    'standardColor':'Standard color',
+    'themeColor':'Theme color',
+    'property':'Property',
+    'default':'Default',
+    'modify':'Modify',
+    'justifyleft':'Justify Left',
+    'justifyright':'Justify Right',
+    'justifycenter':'Justify Center',
+    'justifyj':'Default',
+    'clear':'Clear',
+    'anchorMsg':'Anchor',
+    'delete':'Delete',
+    'clickToUpload':"Click to upload",
+    'unset':'Language hasn\'t been set!',
+    't_row':'row',
+    't_col':'col',
+    'more':'More',
+    'autoTypeSet':{
+        mergeLine:"Merge empty line",
+        delLine:"Del empty line",
+        removeFormat:"Remove format",
+        indent:"Indent",
+        alignment:"Alignment",
+        imageFloat:"Image float",
+        removeFontsize:"Remove font size",
+        removeFontFamily:"Remove fontFamily",
+        removeHtml:"Remove redundant HTML code",
+        pasteFilter:"Paste filter",
+        run:"Done"
+    },
+
+    'background':{
+        'static':{
+            'lang_background_normal':'Normal',
+            'lang_background_local':'Local',
+            'lang_background_set':'Background Set',
+            'lang_background_none':'None',
+            'lang_background_color':'Color Set',
+            'lang_background_netimg':'Net-Image',
+            'lang_background_align':'Align Type',
+            'lang_background_position':'Position',
+            'repeatType':{options:["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]}
+        },
+        'noUploadImage':"No pictures has been uploaded!",
+        'toggleSelect':'Change the active state by click!\n Image Size: '
+    },
+    //===============dialog i18N=======================
+    insertimage:{
+        'static':{
+            'lang_tab_remote':"Remote", //节点
+            'lang_tab_local':"Local",
+            'lang_tab_imgManager':"Manager",
+            'lang_tab_imgSearch':"Search",
+            'lang_input_url':"Address",
+            'lang_input_width':"Width",
+            'lang_input_height':"Height",
+            'lang_input_border':"Border",
+            'lang_input_vhspace':"Margins",
+            'lang_input_title':"Title",
+            'lang_input_remoteAlign':'Align',
+            'lang_imgLoading':"Loading...",
+            'lock':{title:"Lock rate"}, //属性
+            'imgType':{title:"ImageType", options:["News", "Wallpaper", "emotions", "photo"]}, //select的option
+            'imgSearchTxt':{value:"Enter the search keyword!"},
+            'imgSearchBtn':{value:"Search"},
+            'imgSearchReset':{value:"Clear"},
+            'upload':{style:'background: url(upload.png);'},
+            'duiqi':{style:'background: url(imglabel.png) -12px 2px no-repeat;'}
+
+        },
+        'netError':"Network error,please check the config!",
+        'noUploadImage':"No pictures has been uploaded!",
+        'imageLoading':"Image is loading,please wait...",
+        'tryAgain':" Sorry,can't find the image,please try again!",
+        'toggleSelect':"Chang the active state by click!\n Image Size: ",
+        'searchInitInfo':"Enter the search keyword!",
+        'numError':"Please enter the correct Num. e.g 123,400",
+        'imageUrlError':"The image format may be wrong!",
+        'imageLoadError':"Error,please check the network or URL!",
+        'flashError':'Flash Initialization failed,please update and try again!',
+        'floatDefault':"Default",
+        'floatLeft':"Float left",
+        'floatRight':"Float right",
+        'floatCenter':"Center",
+        'fileType':"Image",
+        'flashI18n':{
+            lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
+            uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
+            imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
+            textEncoding:"utf-8",
+            addImageSkinURL:"addimage.png",
+            allDeleteBtnUpSkinURL:"alldeletebtnupskin.png",
+            allDeleteBtnHoverSkinURL:"alldeletebtnhoverskin.png",
+            rotateLeftBtnEnableSkinURL:"rotateleftenable.png",
+            rotateLeftBtnDisableSkinURL:"rotateleftdisable.png",
+            rotateRightBtnEnableSkinURL:"rotaterightenable.png",
+            rotateRightBtnDisableSkinURL:"rotaterightdisable.png",
+            deleteBtnEnableSkinURL:"deleteenable.png",
+            deleteBtnDisableSkinURL:"deletedisable.png",
+            backgroundURL:'',
+            listBackgroundURL:'',
+            buttonURL:'button.png'
+        }
+    },
+    webapp:{
+        tip1:"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!",
+        tip2:"And then open the file editor_config.js to set it! ",
+        applyFor:"APPLY FOR",
+        anthorApi:"Baidu API"
+    },
+    template:{
+        'static':{
+            'lang_template_bkcolor':'Background Color',
+            'lang_template_clear' : 'Keep Content',
+            'lang_template_select':'Select Template'
+        },
+        'blank':"Blank",
+        'blog':"Blog",
+        'resume':"Resume",
+        'richText':"Rich Text",
+        'scrPapers':"Scientific Papers"
+    },
+    scrawl:{
+        'static':{
+            'lang_input_previousStep':"Previous",
+            'lang_input_nextsStep':"Next",
+            'lang_input_clear':'Clear',
+            'lang_input_addPic':'AddImage',
+            'lang_input_ScalePic':'ScaleImage',
+            'lang_input_removePic':'RemoveImage',
+            'J_imgTxt':{title:'Add background image'}
+        },
+        'noScarwl':"No paint, a white paper...",
+        'scrawlUpLoading':"Image is uploading, please wait...",
+        'continueBtn':"Try again",
+        'imageError':"Image failed to load!",
+        'backgroundUploading':'Image is uploading,please wait...'
+    },
+    anchor:{
+        'static':{
+            'lang_input_anchorName':'Anchor Name:'
+        }
+    },
+    attachment:{
+        'static':{
+            'lang_input_fileStatus':' No file uploaded!',
+            'startUpload':{style:"background:url(upload.png) no-repeat;"}
+        },
+        'browseFiles':'Open files',
+        'uploadSuccess':'Upload Successful!',
+        'delSuccessFile':'Remove from the success of the queue',
+        'delFailSaveFile':'Remove the save failed file',
+        'statusPrompt':' file(s) uploaded! ',
+        'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',
+        'flashLoadingError':'The Flash failed loading! Please check the path or network state',
+        'fileUploadReady':'Wait for uploading...',
+        'delUploadQueue':'Remove from the uploading queue ',
+        'limitPrompt1':'Can not choose more than single',
+        'limitPrompt2':'file(s)!Please choose again!',
+        'delFailFile':'Remove failure file',
+        'fileSizeLimit':'File size exceeds the limit!',
+        'emptyFile':'Can not upload an empty file!',
+        'fileTypeError':'File type error!',
+        'unknownError':'Unknown error!',
+        'fileUploading':'Uploading,please wait...',
+        'cancelUpload':'Cancel upload',
+        'netError':'Network error',
+        'failUpload':'Upload failed',
+        'serverIOError':'Server IO error!',
+        'noAuthority':'No Permission!',
+        'fileNumLimit':'Upload limit to the number',
+        'failCheck':'Authentication fails, the upload is skipped!',
+        'fileCanceling':'Cancel, please wait...',
+        'stopUploading':'Upload has stopped...'
+    },
+    highlightcode:{
+        'static':{
+            'lang_input_selectLang':'Select Language'
+        },
+        importCode:'Please enter the code!'
+    },
+    emotion:{
+        'static':{
+            'lang_input_choice':'Choice',
+            'lang_input_Tuzki':'Tuzki',
+            'lang_input_lvdouwa':'LvDouWa',
+            'lang_input_BOBO':'BOBO',
+            'lang_input_babyCat':'BabyCat',
+            'lang_input_bubble':'Bubble',
+            'lang_input_youa':'YouA'
+        }
+    },
+    gmap:{
+        'static':{
+            'lang_input_address':'Address:',
+            'lang_input_search':'Search',
+            'address':{value:"Beijing"}
+        },
+        searchError:'Unable to locate the address!'
+    },
+    help:{
+        'static':{
+            'lang_input_about':'About UEditor',
+            'lang_input_shortcuts':'Shortcuts',
+            'lang_input_version':'Version:1.2.3',
+            'lang_input_introduction':"UEditor is developed by Baidu Co.ltd.  It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.",
+            'lang_Txt_shortcuts':'Shortcuts',
+            'lang_Txt_func':'Function',
+            'lang_Txt_bold':'Bold',
+            'lang_Txt_copy':'Copy',
+            'lang_Txt_cut':'Cut',
+            'lang_Txt_Paste':'Paste',
+            'lang_Txt_undo':'Undo',
+            'lang_Txt_redo':'Redo',
+            'lang_Txt_italic':'Italic',
+            'lang_Txt_underline':'Underline',
+            'lang_Txt_selectAll':'Select All',
+            'lang_Txt_removeFormat':'Remove Format',
+            'lang_Txt_leftJustification':'Justify Left',
+            'lang_Txt_rightJustification':'Justify Right',
+            'lang_Txt_visualEnter':'Submit'
+        }
+    },
+    insertframe:{
+        'static':{
+            'lang_input_address':'Address:',
+            'lang_input_width':'Width:',
+            'lang_input_height':'height:',
+            'lang_input_isScroll':'Enable scrollbars:',
+            'lang_input_frameborder':'Show frame border:',
+            'lang_input_alignMode':'Alignment:',
+            'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]}
+        },
+        'enterAddress':'Please enter an address!'
+    },
+    link:{
+        'static':{
+            'lang_input_text':'Text:',
+            'lang_input_url':'URL:',
+            'lang_input_title':'Title:',
+            'lang_input_target':'open in new window:'
+        },
+        'validLink':'Supports only effective when a link is selected',
+        'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!'
+    },
+    map:{
+        'static':{
+            lang_city:"City",
+            lang_address:"Address",
+            city:{value:"Beijing"},
+            lang_search:"Search"
+        },
+        cityMsg:"Please enter the city name!",
+        errorMsg:"Can't find the place!"
+    },
+    searchreplace:{
+        'static':{
+            lang_tab_search:"Search",
+            lang_tab_replace:"Replace",
+            lang_search1:"Search",
+            lang_search2:"Search",
+            lang_replace:"Replace",
+            lang_case_sensitive1:"Case sense",
+            lang_case_sensitive2:"Case sense",
+            nextFindBtn:{value:"Next"},
+            preFindBtn:{value:"Preview"},
+            nextReplaceBtn:{value:"Next"},
+            preReplaceBtn:{value:"Preview"},
+            repalceBtn:{value:"Replace"},
+            repalceAllBtn:{value:"Replace all"}
+        },
+        getEnd:"Has the search to the bottom!",
+        getStart:"Has the search to the top!",
+        countMsg:"Altogether replaced {#count} character(s)!"
+    },
+    snapscreen:{
+        'static':{
+            lang_showMsg:"You should install the UEditor screenshots program first!",
+            lang_download:"Download!",
+            lang_step1:"Step1:Download the program and then run it",
+            lang_step2:"Step2:After complete install,try to click the button again"
+        }
+    },
+    insertvideo:{
+        'static':{
+            lang_tab_insertV:"Insert Video",
+            lang_tab_searchV:"Search Video",
+            lang_video_url:" URL ",
+            lang_video_size:"Video Size",
+            lang_videoW:"Width",
+            lang_videoH:"Height",
+            lang_alignment:"Alignment",
+            videoSearchTxt:{value:"Enter the search keyword!"},
+            videoType:{options:["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]},
+            videoSearchBtn:{value:"Search in Baidu"},
+            videoSearchReset:{value:"Clear result"}
+        },
+        numError:"Please enter the correct Num. e.g 123,400",
+        floatLeft:"Float left",
+        floatRight:"Float right",
+        "default":"Default",
+        block:"Display in block",
+        urlError:"The video url format may be wrong!",
+        loading:" &nbsp;The video is loading, please wait…",
+        clickToSelect:"Click to select",
+        goToSource:'Visit source video ',
+        noVideo:" &nbsp; &nbsp;Sorry,can't find the video,please try again!"
+    },
+    spechars:{
+        'static':{},
+        tsfh:"Special",
+        lmsz:"Roman",
+        szfh:"Numeral",
+        rwfh:"Japanese",
+        xlzm:"The Greek",
+        ewzm:"Russian",
+        pyzm:"Phonetic",
+        zyzf:"Others"
+    },
+    inserttable:{
+        'static':{
+            lang_baseInfo:"Base info",
+            lang_rows:"Rows",
+            lang_rowUnit:"row",
+            lang_width:"Width",
+            lang_widthUnit:"Unit",
+            lang_height:"Height",
+            lang_heightUnit:"Unit",
+            lang_cols:"Cols",
+            lang_colUnit:"col",
+            lang_warmPrompt:"Warm prompt",
+            lang_maxPadding:"Margins maximum can't more than 13 px! ",
+            lang_extendInfo:"Extend info",
+            lang_preview:"Can preview",
+            lang_tableBorder:"Border",
+            lang_borderSize:"Size",
+            lang_borderColor:"Color",
+            lang_mar_pad:"MarginPad",
+            lang_margin:"Mar",
+            lang_padding:"Pad",
+            lang_table_background:"Table background",
+            lang_table_alignment:"Table alignment",
+            lang_borderFor:"Border for",
+            align:{options:["Default", "Justify", "Justify Left", "Justify Right"]},
+            borderType:{options:["Only table", "All cells"]},
+            lang_forPreview:"This is used for preview"
+        },
+        errorNum:"Please enter the right number!",
+        errorColor:"Please enter the right color!",
+        clearColor:"Clear",
+        overflowMsg:"Maximum can't more than {#value} px!",
+        overflowPreviewMsg:"More than {#value} px no longer provide real-time preview!"
+    },
+    edittd:{
+        'static':{
+            lang_background:"Back Color",
+            lang_alignment:"Alignment",
+            lang_horizontal:"H",
+            lang_vertical:"V",
+            vAlign:{options:["Default", "Justify", "Justify Top", "Justify Bottom"]},
+            align:{options:["Default", "Justify", "Justify Left", "Justify Right"]}
+        },
+        clearColor:"Clear"
+    },
+    wordimage:{
+        'static':{
+            lang_resave:"The re-save step",
+            uploadBtn:{src:"upload.png", alt:"Upload"},
+            clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
+            lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
+        },
+        fileType:"Image",
+        flashError:"Flash initialization failed!",
+        netError:"Network error! Please try again!",
+        copySuccess:"URL has been copied!",
+
+        'flashI18n':{
+            lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
+            uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
+            imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
+            textEncoding:"utf-8",
+            addImageSkinURL:"addImage.png",
+            allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png",
+            allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png",
+            rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png",
+            rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png",
+            rotateRightBtnEnableSkinURL:"rotateRightEnable.png",
+            rotateRightBtnDisableSkinURL:"rotateRightDisable.png",
+            deleteBtnEnableSkinURL:"deleteEnable.png",
+            deleteBtnDisableSkinURL:"deleteDisable.png",
+            backgroundURL:'',
+            listBackgroundURL:'',
+            buttonURL:'button.png'
+        }
+    }
+};

BIN
DjangoUeditor/static/UEditor/lang/en/images/addimage.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/alldeletebtnhoverskin.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/alldeletebtnupskin.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/background.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/button.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/copy.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/deletedisable.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/deleteenable.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/imglabel.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/listbackground.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/localimage.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/rotateleftdisable.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/rotateleftenable.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/rotaterightdisable.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/rotaterightenable.png


BIN
DjangoUeditor/static/UEditor/lang/en/images/upload.png


+ 0 - 0
DjangoUeditor/static/UEditor/themes/default/images/copy.png → DjangoUeditor/static/UEditor/lang/zh-cn/images/copy.png


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor