kms 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/kms/application.js +4 -0
  3. data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee.erb +3 -1
  4. data/app/assets/javascripts/kms/application/controllers/snippets_controller.coffee.erb +2 -1
  5. data/app/assets/javascripts/kms/application/controllers/templates_controller.coffee.erb +2 -1
  6. data/app/assets/javascripts/kms/application/services/errors_service.coffee +1 -4
  7. data/app/assets/stylesheets/kms/application.css +1 -0
  8. data/app/assets/stylesheets/kms/custom.css.scss +3 -0
  9. data/app/controllers/kms/assets_controller.rb +3 -3
  10. data/app/controllers/kms/pages_controller.rb +2 -2
  11. data/app/controllers/kms/settings_controller.rb +1 -1
  12. data/app/controllers/kms/snippets_controller.rb +2 -2
  13. data/app/controllers/kms/templates_controller.rb +5 -5
  14. data/app/controllers/kms/users_controller.rb +2 -2
  15. data/app/views/layouts/kms/kms.html.erb +0 -1
  16. data/config/locales/devise.zh-CN.yml +59 -0
  17. data/config/locales/zh-CN.yml +231 -0
  18. data/lib/kms/version.rb +1 -1
  19. data/spec/controllers/kms/templates_controller_spec.rb +26 -0
  20. data/spec/internal/config/database.yml +7 -0
  21. data/spec/internal/log/test.log +131623 -0
  22. data/spec/internal/public/uploads/kms/asset/file/1/avatar.jpg +0 -0
  23. data/spec/internal/public/uploads/kms/asset/file/2/avatar.jpg +0 -0
  24. data/spec/internal/public/uploads/kms/asset/file/2/style.css +1 -0
  25. data/spec/internal/public/uploads/kms/asset/file/3/style.css +1 -0
  26. data/spec/internal/public/uploads/kms/asset/file/4/avatar.jpg +0 -0
  27. data/spec/internal/public/uploads/kms/asset/file/4/style.css +1 -0
  28. data/spec/internal/public/uploads/kms/asset/file/5/style.css +1 -0
  29. data/spec/internal/public/uploads/kms/asset/file/6/style.css +1 -0
  30. data/spec/internal/public/uploads/tmp/1500976987-41025-0002-0883/style.css +1 -0
  31. data/spec/internal/public/uploads/tmp/1500977082-41195-0002-6495/style.css +1 -0
  32. data/spec/internal/public/uploads/tmp/1500977109-41364-0002-4518/style.css +1 -0
  33. data/spec/internal/public/uploads/tmp/1500977152-41405-0002-2345/style.css +1 -0
  34. data/spec/internal/public/uploads/tmp/1500977327-41694-0002-5448/style.css +1 -0
  35. data/spec/internal/public/uploads/tmp/1500977376-41732-0002-7916/style.css +1 -0
  36. data/spec/internal/public/uploads/tmp/1500977392-41759-0002-7593/style.css +1 -0
  37. data/spec/internal/public/uploads/tmp/1500977410-42259-0002-7527/style.css +1 -0
  38. data/spec/internal/public/uploads/tmp/1500977429-42306-0002-5937/style.css +1 -0
  39. data/spec/internal/public/uploads/tmp/1500977437-42324-0002-5880/style.css +1 -0
  40. data/spec/internal/public/uploads/tmp/1500983228-53594-0002-4559/style.css +1 -0
  41. data/spec/internal/public/uploads/tmp/1500983284-53632-0002-6590/style.css +1 -0
  42. data/spec/internal/public/uploads/tmp/1500983360-53784-0002-7289/style.css +1 -0
  43. data/spec/internal/public/uploads/tmp/1500983469-54321-0002-0386/avatar.jpg +0 -0
  44. data/spec/internal/public/uploads/tmp/1500983469-54321-0004-5691/style.css +1 -0
  45. data/spec/internal/public/uploads/tmp/1500983511-54352-0002-5720/avatar.jpg +0 -0
  46. data/spec/internal/public/uploads/tmp/1500983511-54352-0004-1399/style.css +1 -0
  47. data/spec/internal/public/uploads/tmp/1500983610-54507-0002-4280/avatar.jpg +0 -0
  48. data/spec/internal/public/uploads/tmp/1500983610-54507-0004-9758/style.css +1 -0
  49. data/spec/internal/public/uploads/tmp/1500984466-57012-0002-4146/avatar.jpg +0 -0
  50. data/spec/internal/public/uploads/tmp/1500984466-57012-0004-5895/style.css +1 -0
  51. data/spec/internal/public/uploads/tmp/1500984509-57158-0002-9657/avatar.jpg +0 -0
  52. data/spec/internal/public/uploads/tmp/1500984509-57158-0004-5003/style.css +1 -0
  53. data/spec/internal/public/uploads/tmp/1500984616-57697-0002-7201/avatar.jpg +0 -0
  54. data/spec/internal/public/uploads/tmp/1500984616-57697-0004-6255/style.css +1 -0
  55. data/spec/internal/public/uploads/tmp/1500985257-58947-0002-3629/avatar.jpg +0 -0
  56. data/spec/internal/public/uploads/tmp/1500985257-58947-0004-5338/style.css +1 -0
  57. data/spec/internal/public/uploads/tmp/1500985407-58947-0006-5929/style.css +1 -0
  58. data/spec/internal/public/uploads/tmp/1500985473-59264-0002-0397/avatar.jpg +0 -0
  59. data/spec/internal/public/uploads/tmp/1500985473-59264-0004-6493/style.css +1 -0
  60. data/spec/internal/public/uploads/tmp/1500985475-59264-0007-8674/style.css +1 -0
  61. data/spec/internal/public/uploads/tmp/1500985538-59468-0002-9206/avatar.jpg +0 -0
  62. data/spec/internal/public/uploads/tmp/1500985538-59468-0004-2586/style.css +1 -0
  63. data/spec/internal/public/uploads/tmp/1500985538-59468-0007-6200/style.css +1 -0
  64. data/spec/internal/public/uploads/tmp/1500988358-65877-0002-4528/avatar.jpg +0 -0
  65. data/spec/internal/public/uploads/tmp/1500988358-65877-0004-5904/style.css +1 -0
  66. data/spec/internal/public/uploads/tmp/1500988358-65877-0007-7320/style.css +1 -0
  67. data/spec/internal/public/uploads/tmp/1500988407-65916-0002-3138/avatar.jpg +0 -0
  68. data/spec/internal/public/uploads/tmp/1500988407-65916-0004-5400/style.css +1 -0
  69. data/spec/internal/public/uploads/tmp/1500988407-65916-0007-1655/style.css +1 -0
  70. data/spec/internal/public/uploads/tmp/1500988421-65950-0002-9415/avatar.jpg +0 -0
  71. data/spec/internal/public/uploads/tmp/1500988421-65950-0004-7130/style.css +1 -0
  72. data/spec/internal/public/uploads/tmp/1500988421-65950-0007-9886/style.css +1 -0
  73. data/spec/internal/public/uploads/tmp/1500988435-65981-0002-3228/avatar.jpg +0 -0
  74. data/spec/internal/public/uploads/tmp/1500988435-65981-0004-3682/style.css +1 -0
  75. data/spec/internal/public/uploads/tmp/1500988435-65981-0007-1582/style.css +1 -0
  76. data/spec/internal/public/uploads/tmp/1500988475-66122-0002-9516/avatar.jpg +0 -0
  77. data/spec/internal/public/uploads/tmp/1500988475-66122-0004-5634/style.css +1 -0
  78. data/spec/internal/public/uploads/tmp/1500988530-66122-0007-2272/style.css +1 -0
  79. data/spec/internal/public/uploads/tmp/1500988554-66315-0002-6262/avatar.jpg +0 -0
  80. data/spec/internal/public/uploads/tmp/1500988554-66315-0004-6099/style.css +1 -0
  81. data/spec/internal/public/uploads/tmp/1500988554-66315-0007-1632/style.css +1 -0
  82. data/spec/internal/public/uploads/tmp/1500991751-73722-0002-9937/avatar.jpg +0 -0
  83. data/spec/internal/public/uploads/tmp/1500991751-73722-0004-8034/style.css +1 -0
  84. data/spec/internal/public/uploads/tmp/1500991751-73722-0007-7763/style.css +1 -0
  85. data/spec/internal/public/uploads/tmp/1501233238-34385-0002-3210/avatar.jpg +0 -0
  86. data/spec/internal/public/uploads/tmp/1501233238-34385-0004-5881/style.css +1 -0
  87. data/spec/internal/public/uploads/tmp/1501233238-34385-0007-6280/style.css +1 -0
  88. data/spec/internal/public/uploads/tmp/1508749566-27986-0002-2760/avatar.jpg +0 -0
  89. data/spec/internal/public/uploads/tmp/1508749567-27986-0004-6631/style.css +1 -0
  90. data/spec/internal/public/uploads/tmp/1508749567-27986-0007-5688/style.css +1 -0
  91. data/spec/internal/public/uploads/tmp/1508749660-28185-0002-3255/avatar.jpg +0 -0
  92. data/spec/internal/public/uploads/tmp/1508749660-28185-0004-3845/style.css +1 -0
  93. data/spec/internal/public/uploads/tmp/1508749660-28185-0007-5866/style.css +1 -0
  94. data/spec/internal/public/uploads/tmp/1508749674-28217-0002-4090/avatar.jpg +0 -0
  95. data/spec/internal/public/uploads/tmp/1508749675-28217-0004-8839/style.css +1 -0
  96. data/spec/internal/public/uploads/tmp/1508749675-28217-0007-2008/style.css +1 -0
  97. data/spec/internal/public/uploads/tmp/1508749687-28352-0002-3233/avatar.jpg +0 -0
  98. data/spec/internal/public/uploads/tmp/1508749687-28352-0004-9432/style.css +1 -0
  99. data/spec/internal/public/uploads/tmp/1508749687-28352-0007-1314/style.css +1 -0
  100. data/spec/internal/public/uploads/tmp/1509440450-18161-0002-7535/avatar.jpg +0 -0
  101. data/spec/internal/public/uploads/tmp/1509440450-18161-0004-3378/style.css +1 -0
  102. data/spec/internal/public/uploads/tmp/1509440450-18161-0007-1253/style.css +1 -0
  103. data/spec/internal/public/uploads/tmp/1509440662-18637-0002-2796/avatar.jpg +0 -0
  104. data/spec/internal/public/uploads/tmp/1509440662-18637-0004-5488/style.css +1 -0
  105. data/spec/internal/public/uploads/tmp/1509440662-18637-0007-1149/style.css +1 -0
  106. data/spec/internal/public/uploads/tmp/1509440905-19171-0002-1570/avatar.jpg +0 -0
  107. data/spec/internal/public/uploads/tmp/1509440905-19171-0004-9067/style.css +1 -0
  108. data/spec/internal/public/uploads/tmp/1509440905-19171-0007-1234/style.css +1 -0
  109. data/spec/internal/public/uploads/tmp/1509442552-23601-0002-0420/avatar.jpg +0 -0
  110. data/spec/internal/public/uploads/tmp/1509442552-23601-0004-3628/style.css +1 -0
  111. data/spec/internal/public/uploads/tmp/1509442552-23601-0007-7909/style.css +1 -0
  112. data/spec/internal/public/uploads/tmp/1509445639-31288-0002-5614/avatar.jpg +0 -0
  113. data/spec/internal/public/uploads/tmp/1509445639-31288-0004-5098/style.css +1 -0
  114. data/spec/internal/public/uploads/tmp/1509445639-31288-0007-4238/style.css +1 -0
  115. data/spec/internal/public/uploads/tmp/1511440007-18238-0002-4241/avatar.jpg +0 -0
  116. data/spec/internal/public/uploads/tmp/1511440007-18238-0004-2485/style.css +1 -0
  117. data/spec/internal/public/uploads/tmp/1511440007-18238-0007-1399/style.css +1 -0
  118. data/spec/internal/public/uploads/tmp/1511440298-19007-0002-2235/avatar.jpg +0 -0
  119. data/spec/internal/public/uploads/tmp/1511440298-19007-0004-4653/style.css +1 -0
  120. data/spec/internal/public/uploads/tmp/1511440298-19007-0006-2170/style.css +1 -0
  121. data/spec/internal/public/uploads/tmp/1511440298-19007-0009-2199/style.css +1 -0
  122. data/spec/internal/public/uploads/tmp/1511440315-19038-0002-5207/avatar.jpg +0 -0
  123. data/spec/internal/public/uploads/tmp/1511440315-19038-0004-8181/style.css +1 -0
  124. data/spec/internal/public/uploads/tmp/1511440315-19038-0006-6102/avatar.jpg +0 -0
  125. data/spec/internal/public/uploads/tmp/1511440315-19038-0008-6730/style.css +1 -0
  126. data/spec/internal/public/uploads/tmp/1511440315-19038-0010-4426/style.css +1 -0
  127. data/spec/internal/public/uploads/tmp/1511440315-19038-0013-4618/style.css +1 -0
  128. data/spec/internal/public/uploads/tmp/1511440346-19182-0002-3434/avatar.jpg +0 -0
  129. data/spec/internal/public/uploads/tmp/1511440346-19182-0004-7525/style.css +1 -0
  130. data/spec/internal/public/uploads/tmp/1511440375-19182-0006-9609/avatar.jpg +0 -0
  131. data/spec/internal/public/uploads/tmp/1511440375-19182-0008-1622/style.css +1 -0
  132. data/spec/internal/public/uploads/tmp/1511440376-19182-0010-5905/style.css +1 -0
  133. data/spec/internal/public/uploads/tmp/1511440376-19182-0013-7924/style.css +1 -0
  134. data/spec/internal/public/uploads/tmp/1511440392-19224-0002-8819/avatar.jpg +0 -0
  135. data/spec/internal/public/uploads/tmp/1511440392-19224-0004-8863/style.css +1 -0
  136. data/spec/internal/public/uploads/tmp/1511440392-19224-0006-0138/style.css +1 -0
  137. data/spec/internal/public/uploads/tmp/1511440392-19224-0007-8534/style.css +1 -0
  138. data/spec/internal/public/uploads/tmp/1511440392-19224-0008-6110/style.css +1 -0
  139. data/spec/internal/public/uploads/tmp/1511440392-19224-0009-5540/style.css +1 -0
  140. data/spec/internal/public/uploads/tmp/1511440392-19224-0012-3148/style.css +1 -0
  141. data/spec/internal/public/uploads/tmp/1511440452-19263-0002-7025/avatar.jpg +0 -0
  142. data/spec/internal/public/uploads/tmp/1511440452-19263-0004-7209/style.css +1 -0
  143. data/spec/internal/public/uploads/tmp/1511440452-19263-0006-2686/style.css +1 -0
  144. data/spec/internal/public/uploads/tmp/1511440452-19263-0007-5736/style.css +1 -0
  145. data/spec/internal/public/uploads/tmp/1511440452-19263-0008-3182/style.css +1 -0
  146. data/spec/internal/public/uploads/tmp/1511440452-19263-0009-7924/style.css +1 -0
  147. data/spec/internal/public/uploads/tmp/1511440452-19263-0012-7410/style.css +1 -0
  148. data/spec/internal/public/uploads/tmp/1511440472-19413-0002-2228/avatar.jpg +0 -0
  149. data/spec/internal/public/uploads/tmp/1511440472-19413-0004-6315/style.css +1 -0
  150. data/spec/internal/public/uploads/tmp/1511440472-19413-0006-8298/style.css +1 -0
  151. data/spec/internal/public/uploads/tmp/1511440472-19413-0007-1759/style.css +1 -0
  152. data/spec/internal/public/uploads/tmp/1511440472-19413-0008-4788/style.css +1 -0
  153. data/spec/internal/public/uploads/tmp/1511440472-19413-0009-2475/style.css +1 -0
  154. data/spec/internal/public/uploads/tmp/1511440472-19413-0012-2049/style.css +1 -0
  155. data/spec/internal/public/uploads/tmp/1516625891-88818-0002-5617/avatar.jpg +0 -0
  156. data/spec/internal/public/uploads/tmp/1516625891-88818-0004-6958/style.css +1 -0
  157. data/spec/internal/public/uploads/tmp/1516625891-88818-0006-4976/style.css +1 -0
  158. data/spec/internal/public/uploads/tmp/1516625891-88818-0007-0084/style.css +1 -0
  159. data/spec/internal/public/uploads/tmp/1516625891-88818-0008-2213/style.css +1 -0
  160. data/spec/internal/public/uploads/tmp/1516625891-88818-0009-4527/style.css +1 -0
  161. data/spec/internal/public/uploads/tmp/1516625891-88818-0012-6446/style.css +1 -0
  162. data/spec/internal/public/uploads/tmp/1516625961-88870-0002-7381/avatar.jpg +0 -0
  163. data/spec/internal/public/uploads/tmp/1516625961-88870-0004-9681/style.css +1 -0
  164. data/spec/internal/public/uploads/tmp/1516625961-88870-0006-2372/style.css +1 -0
  165. data/spec/internal/public/uploads/tmp/1516625961-88870-0007-2660/style.css +1 -0
  166. data/spec/internal/public/uploads/tmp/1516625961-88870-0008-0215/style.css +1 -0
  167. data/spec/internal/public/uploads/tmp/1516625961-88870-0009-2368/style.css +1 -0
  168. data/spec/internal/public/uploads/tmp/1516625961-88870-0012-1625/style.css +1 -0
  169. data/spec/internal/public/uploads/tmp/1516626030-88922-0002-3654/avatar.jpg +0 -0
  170. data/spec/internal/public/uploads/tmp/1516626030-88922-0004-3696/style.css +1 -0
  171. data/spec/internal/public/uploads/tmp/1516626030-88922-0006-8048/style.css +1 -0
  172. data/spec/internal/public/uploads/tmp/1516626030-88922-0007-3237/style.css +1 -0
  173. data/spec/internal/public/uploads/tmp/1516626030-88922-0008-4239/style.css +1 -0
  174. data/spec/internal/public/uploads/tmp/1516626030-88922-0009-0391/style.css +1 -0
  175. data/spec/internal/public/uploads/tmp/1516626030-88922-0012-0366/style.css +1 -0
  176. data/spec/internal/public/uploads/tmp/1516626064-88952-0002-1658/avatar.jpg +0 -0
  177. data/spec/internal/public/uploads/tmp/1516626064-88952-0004-5145/style.css +1 -0
  178. data/spec/internal/public/uploads/tmp/1516626064-88952-0006-0849/style.css +1 -0
  179. data/spec/internal/public/uploads/tmp/1516626064-88952-0007-0001/style.css +1 -0
  180. data/spec/internal/public/uploads/tmp/1516626064-88952-0008-9566/style.css +1 -0
  181. data/spec/internal/public/uploads/tmp/1516626064-88952-0009-8240/style.css +1 -0
  182. data/spec/internal/public/uploads/tmp/1516626064-88952-0012-5917/style.css +1 -0
  183. data/spec/internal/public/uploads/tmp/1516626195-89027-0002-5287/avatar.jpg +0 -0
  184. data/spec/internal/public/uploads/tmp/1516626195-89027-0004-2701/style.css +1 -0
  185. data/spec/internal/public/uploads/tmp/1516626195-89027-0006-2672/style.css +1 -0
  186. data/spec/internal/public/uploads/tmp/1516626195-89027-0007-3635/style.css +1 -0
  187. data/spec/internal/public/uploads/tmp/1516626195-89027-0008-4691/style.css +1 -0
  188. data/spec/internal/public/uploads/tmp/1516626195-89027-0009-8448/style.css +1 -0
  189. data/spec/internal/public/uploads/tmp/1516626195-89027-0012-8799/style.css +1 -0
  190. data/spec/internal/public/uploads/tmp/1516626242-89065-0002-1305/avatar.jpg +0 -0
  191. data/spec/internal/public/uploads/tmp/1516626242-89065-0004-0022/style.css +1 -0
  192. data/spec/internal/public/uploads/tmp/1516626242-89065-0006-1914/style.css +1 -0
  193. data/spec/internal/public/uploads/tmp/1516626242-89065-0007-8767/style.css +1 -0
  194. data/spec/internal/public/uploads/tmp/1516626242-89065-0008-3418/style.css +1 -0
  195. data/spec/internal/public/uploads/tmp/1516626242-89065-0009-6464/style.css +1 -0
  196. data/spec/internal/public/uploads/tmp/1516626242-89065-0012-5590/style.css +1 -0
  197. data/spec/internal/public/uploads/tmp/1516626311-89110-0002-9888/avatar.jpg +0 -0
  198. data/spec/internal/public/uploads/tmp/1516626311-89110-0004-7197/style.css +1 -0
  199. data/spec/internal/public/uploads/tmp/1516626311-89110-0006-4036/style.css +1 -0
  200. data/spec/internal/public/uploads/tmp/1516626311-89110-0007-6223/style.css +1 -0
  201. data/spec/internal/public/uploads/tmp/1516626311-89110-0008-7130/style.css +1 -0
  202. data/spec/internal/public/uploads/tmp/1516626311-89110-0009-7880/style.css +1 -0
  203. data/spec/internal/public/uploads/tmp/1516626311-89110-0012-0959/style.css +1 -0
  204. data/spec/internal/public/uploads/tmp/1516626373-89158-0002-5538/avatar.jpg +0 -0
  205. data/spec/internal/public/uploads/tmp/1516626373-89158-0004-7211/style.css +1 -0
  206. data/spec/internal/public/uploads/tmp/1516626373-89158-0006-9913/style.css +1 -0
  207. data/spec/internal/public/uploads/tmp/1516626373-89158-0007-2846/style.css +1 -0
  208. data/spec/internal/public/uploads/tmp/1516626373-89158-0008-5451/style.css +1 -0
  209. data/spec/internal/public/uploads/tmp/1516626373-89158-0009-9255/style.css +1 -0
  210. data/spec/internal/public/uploads/tmp/1516626373-89158-0012-9145/style.css +1 -0
  211. data/spec/internal/public/uploads/tmp/1516626397-89193-0002-0900/avatar.jpg +0 -0
  212. data/spec/internal/public/uploads/tmp/1516626397-89193-0004-9986/style.css +1 -0
  213. data/spec/internal/public/uploads/tmp/1516626397-89193-0006-0413/style.css +1 -0
  214. data/spec/internal/public/uploads/tmp/1516626397-89193-0007-5256/style.css +1 -0
  215. data/spec/internal/public/uploads/tmp/1516626397-89193-0008-0633/style.css +1 -0
  216. data/spec/internal/public/uploads/tmp/1516626397-89193-0009-1029/style.css +1 -0
  217. data/spec/internal/public/uploads/tmp/1516626397-89193-0012-8766/style.css +1 -0
  218. data/spec/internal/public/uploads/tmp/1516626545-89276-0002-2227/avatar.jpg +0 -0
  219. data/spec/internal/public/uploads/tmp/1516626545-89276-0004-7785/style.css +1 -0
  220. data/spec/internal/public/uploads/tmp/1516626545-89276-0006-9774/style.css +1 -0
  221. data/spec/internal/public/uploads/tmp/1516626545-89276-0007-7906/style.css +1 -0
  222. data/spec/internal/public/uploads/tmp/1516626545-89276-0008-0580/style.css +1 -0
  223. data/spec/internal/public/uploads/tmp/1516626545-89276-0009-3651/style.css +1 -0
  224. data/spec/internal/public/uploads/tmp/1516626545-89276-0012-0405/style.css +1 -0
  225. data/spec/internal/public/uploads/tmp/1516626743-89366-0002-5276/avatar.jpg +0 -0
  226. data/spec/internal/public/uploads/tmp/1516626743-89366-0004-1518/style.css +1 -0
  227. data/spec/internal/public/uploads/tmp/1516626743-89366-0006-9759/style.css +1 -0
  228. data/spec/internal/public/uploads/tmp/1516626743-89366-0007-6634/style.css +1 -0
  229. data/spec/internal/public/uploads/tmp/1516626743-89366-0008-6153/style.css +1 -0
  230. data/spec/internal/public/uploads/tmp/1516626743-89366-0009-4213/style.css +1 -0
  231. data/spec/internal/public/uploads/tmp/1516626743-89366-0012-7697/style.css +1 -0
  232. data/spec/internal/public/uploads/tmp/1516627266-89771-0002-3236/avatar.jpg +0 -0
  233. data/spec/internal/public/uploads/tmp/1516627266-89771-0004-8050/style.css +1 -0
  234. data/spec/internal/public/uploads/tmp/1516627266-89771-0006-7143/style.css +1 -0
  235. data/spec/internal/public/uploads/tmp/1516627266-89771-0007-9588/style.css +1 -0
  236. data/spec/internal/public/uploads/tmp/1516627266-89771-0008-5511/style.css +1 -0
  237. data/spec/internal/public/uploads/tmp/1516627266-89771-0009-0275/style.css +1 -0
  238. data/spec/internal/public/uploads/tmp/1516627266-89771-0012-3746/style.css +1 -0
  239. data/spec/internal/tmp/cache/assets/test/sprockets/v3.0/1XyAFYlYI0pK7WAgjR4PgXV6BgU6huJSviWmHetdCRs.cache +1 -0
  240. data/vendor/assets/bower_components/bootstrap/Gemfile.lock +43 -0
  241. data/vendor/assets/bower_components/ng-ckeditor/libs/ckeditor/ckeditor.js +1 -1
  242. data/vendor/assets/bower_components/ng-ckeditor/libs/ckeditor/lang/zh-cn.js +5 -0
  243. data/vendor/assets/javascripts/emmet-codemirror-plugin.js +4 -0
  244. data/vendor/assets/javascripts/emmet-codemirror-plugin.js.map +1 -0
  245. data/vendor/assets/javascripts/liquor.js +382 -0
  246. data/vendor/assets/stylesheets/liquor.css +79 -0
  247. metadata +478 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 706248cb2d7f607b5308dc373c44dcf914181239
4
- data.tar.gz: 62c92d2c79550b7c38523df37e00ac90e179871e
3
+ metadata.gz: f2370e151595baa4924adf65adfc616110adc26e
4
+ data.tar.gz: 7e8c4a99719a17acb9ebeed0824832cb20a77732
5
5
  SHA512:
6
- metadata.gz: 528337cf36325329bed39d101417d53338b6f46fe3d92d92a69528aab845ca27127a4bc08e19627cc10ed59c15f9adac9e866ac297f3fd2cba0e604ad5a92922
7
- data.tar.gz: 56be7cf89aecc717a7e300abec0f4be70dd791976f42b1968ea79607d1880300152f3386bb1cdc776af0951781d3cd98e5880143389987ccdf18b8f3f29a839c
6
+ metadata.gz: 63162083b2430c2ce41cb2fa607f52508b681d916c8a82b23d0ec8843606177d447d4eacdccca1fd2d1ebe5457e18b9cb2ccc075fe28a4fa8d00553493af86da
7
+ data.tar.gz: 2d5efb96c5d68856a88fef16f53a49c6ccbe8d6d13e4ef36a86d88ade3d4e6dfaf6b27ac75ae214d4fc977c5a5f8f5371d165f4ee42a360eb26884cfe98382b6
@@ -22,6 +22,10 @@
22
22
  //= require "codemirror/addon/edit/closebrackets"
23
23
  //= require "codemirror/addon/display/fullscreen"
24
24
  //= require "codemirror/addon/selection/active-line"
25
+ //= require "codemirror/addon/mode/overlay"
26
+ //= require "codemirror/addon/mode/multiplex"
27
+ //= require "emmet-codemirror-plugin"
28
+ //= require "liquor"
25
29
  //= require "ng-ckeditor/libs/ckeditor/ckeditor"
26
30
  //= require "angular/angular.js"
27
31
  //= require "angular-i18n/angular-locale_ru-ru.js"
@@ -2,9 +2,10 @@ PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Aler
2
2
  $scope.editorOptions =
3
3
  filebrowserUploadUrl: '/kms/assets/ckeditor'
4
4
  entities: false
5
+ language: '<%= I18n.locale.to_s %>'
5
6
  $scope.codeMirrorOptions =
6
7
  lineNumbers: true
7
- mode:'htmlmixed'
8
+ mode: 'htmlmixedliquor'
8
9
  autoCloseTags: true
9
10
  matchBrackets: true
10
11
  autoCloseBrackets: true
@@ -16,6 +17,7 @@ PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Aler
16
17
  cm.setOption("fullScreen", !cm.getOption("fullScreen"))
17
18
  "Esc": (cm)->
18
19
  if cm.getOption("fullScreen") then cm.setOption("fullScreen", false)
20
+ "Tab": 'emmetExpandAbbreviation'
19
21
 
20
22
  $scope.$watch 'page.title', (newValue, oldValue) ->
21
23
  if newValue? and $scope.page.slug != 'index' and !$scope.page.id
@@ -1,7 +1,7 @@
1
1
  SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsService, hotkeys) ->
2
2
  $scope.editorOptions =
3
3
  lineNumbers: true
4
- mode:'htmlmixed'
4
+ mode: 'htmlmixedliquor'
5
5
  autoCloseTags: true
6
6
  matchBrackets: true
7
7
  autoCloseBrackets: true
@@ -13,6 +13,7 @@ SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, Error
13
13
  cm.setOption("fullScreen", !cm.getOption("fullScreen"))
14
14
  "Esc": (cm)->
15
15
  if cm.getOption("fullScreen") then cm.setOption("fullScreen", false)
16
+ "Tab": 'emmetExpandAbbreviation'
16
17
 
17
18
  $scope.store = Restangular.all('snippets')
18
19
  $scope.store.getList().then (snippets)->
@@ -1,7 +1,7 @@
1
1
  TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Alertify, ErrorsService, hotkeys) ->
2
2
  $scope.editorOptions =
3
3
  lineNumbers: true
4
- mode:'htmlmixed'
4
+ mode: 'htmlmixedliquor'
5
5
  autoCloseTags: true
6
6
  matchBrackets: true
7
7
  autoCloseBrackets: true
@@ -13,6 +13,7 @@ TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams,
13
13
  cm.setOption("fullScreen", !cm.getOption("fullScreen"))
14
14
  "Esc": (cm)->
15
15
  if cm.getOption("fullScreen") then cm.setOption("fullScreen", false)
16
+ "Tab": 'emmetExpandAbbreviation'
16
17
 
17
18
  $scope.store = Restangular.all('templates')
18
19
  $scope.store.getList().then (templates)->
@@ -1,8 +1,5 @@
1
1
  angular.module('KMS').factory 'ErrorsService', ->
2
2
  {
3
3
  prepareErrorsString: (errorsData)->
4
- result = []
5
- for field, errors of errorsData
6
- result.push "#{field}: #{errors.join(',')}"
7
- result.join('\n')
4
+ errorsData.join('\n')
8
5
  }
@@ -15,6 +15,7 @@
15
15
  *= require angular-ui-tree/dist/angular-ui-tree.min
16
16
  *= require codemirror/lib/codemirror
17
17
  *= require codemirror/addon/display/fullscreen
18
+ *= require liquor
18
19
  *= require angular-ui-select/dist/select
19
20
  *= require angular-toggle-switch/angular-toggle-switch
20
21
  *= require angular-toggle-switch/angular-toggle-switch-bootstrap
@@ -133,4 +133,7 @@ ul.sidebar .sidebar-list.active a {
133
133
  border-left: 3px solid #ff5274;
134
134
  text-indent: 22px;
135
135
  background: #2d3e63;
136
+ .menu-icon {
137
+ text-indent: 25px;
138
+ }
136
139
  }
@@ -12,9 +12,9 @@ module Kms
12
12
  @asset = Asset.new(asset_params)
13
13
  if @asset.save
14
14
  # special json for ng-flow
15
- render json: {success: true, files: [@asset]}.to_json
15
+ render json: { success: true, files: [@asset] }.to_json
16
16
  else
17
- render json: {errors: @asset.errors}.to_json, status: :unprocessable_entity
17
+ render json: { errors: @asset.errors.full_messages }.to_json, status: :unprocessable_entity
18
18
  end
19
19
  end
20
20
 
@@ -36,7 +36,7 @@ module Kms
36
36
  if @asset.update(asset_params)
37
37
  render json: @asset
38
38
  else
39
- render json: {errors: @asset.errors}.to_json, status: :unprocessable_entity
39
+ render json: { errors: @asset.errors.full_messages }.to_json, status: :unprocessable_entity
40
40
  end
41
41
  end
42
42
 
@@ -12,7 +12,7 @@ module Kms
12
12
  if @page.save
13
13
  head :no_content
14
14
  else
15
- render json: {errors: @page.errors}.to_json, status: :unprocessable_entity
15
+ render json: { errors: @page.errors.full_messages }.to_json, status: :unprocessable_entity
16
16
  end
17
17
  end
18
18
 
@@ -21,7 +21,7 @@ module Kms
21
21
  if @page.update(page_params)
22
22
  head :no_content
23
23
  else
24
- render json: {errors: @page.errors}.to_json, status: :unprocessable_entity
24
+ render json: { errors: @page.errors.full_messages }.to_json, status: :unprocessable_entity
25
25
  end
26
26
  end
27
27
 
@@ -11,7 +11,7 @@ module Kms
11
11
  if @settings.update(settings_params)
12
12
  render json: @settings
13
13
  else
14
- render json: @settings.to_json(methods: :errors), status: :unprocessable_entity
14
+ render json: { errors: @settings.errors.full_messages }.to_json, status: :unprocessable_entity
15
15
  end
16
16
  end
17
17
 
@@ -12,7 +12,7 @@ module Kms
12
12
  if @snippet.save
13
13
  head :no_content
14
14
  else
15
- render json: {errors: @snippet.errors}.to_json, status: :unprocessable_entity
15
+ render json: { errors: @snippet.errors.full_messages }.to_json, status: :unprocessable_entity
16
16
  end
17
17
  end
18
18
 
@@ -21,7 +21,7 @@ module Kms
21
21
  if @snippet.update(snippet_params)
22
22
  head :no_content
23
23
  else
24
- render json: {errors: @snippet.errors}.to_json, status: :unprocessable_entity
24
+ render json: { errors: @snippet.errors.full_messages }.to_json, status: :unprocessable_entity
25
25
  end
26
26
  end
27
27
 
@@ -11,28 +11,28 @@ module Kms
11
11
  if @template.save
12
12
  head :no_content
13
13
  else
14
- render json: {errors: @template.errors}.to_json, status: :unprocessable_entity
14
+ render json: { errors: @template.errors.full_messages }.to_json, status: :unprocessable_entity
15
15
  end
16
16
  end
17
17
 
18
18
  def update
19
19
  @template = Template.find(params[:id])
20
20
  if @template.update(template_params)
21
- render json: @template.to_json
21
+ head :no_content
22
22
  else
23
- render json: @template.to_json(methods: :errors), status: :unprocessable_entity
23
+ render json: { errors: @template.errors.full_messages }.to_json, status: :unprocessable_entity
24
24
  end
25
25
  end
26
26
 
27
27
  def show
28
28
  @template = Template.find(params[:id])
29
- render json: @template.to_json
29
+ render json: @template
30
30
  end
31
31
 
32
32
  def destroy
33
33
  @template = Template.find(params[:id])
34
34
  @template.destroy
35
- render json: @template.to_json
35
+ head :no_content
36
36
  end
37
37
 
38
38
  protected
@@ -14,7 +14,7 @@ module Kms
14
14
  if @user.save
15
15
  head :no_content
16
16
  else
17
- render json: {errors: @user.errors}.to_json, status: :unprocessable_entity
17
+ render json: { errors: @user.errors.full_messages }.to_json, status: :unprocessable_entity
18
18
  end
19
19
  end
20
20
 
@@ -23,7 +23,7 @@ module Kms
23
23
  if @user.update(user_params)
24
24
  head :no_content
25
25
  else
26
- render json: {errors: @user.errors}.to_json, status: :unprocessable_entity
26
+ render json: { errors: @user.errors.full_messages }.to_json, status: :unprocessable_entity
27
27
  end
28
28
  end
29
29
 
@@ -144,7 +144,6 @@
144
144
  </div>
145
145
  <div class="meta">
146
146
  <div class="page" ui-view="header">
147
- Dashboard
148
147
  </div>
149
148
  <!--
150
149
  <div class="breadcrumb-links">
@@ -0,0 +1,59 @@
1
+ # Additional translations at https://github.com/plataformatec/devise/wiki/I18n
2
+
3
+ zh-CN:
4
+ devise:
5
+ confirmations:
6
+ confirmed: "你的电子邮件地址以被成功确认。"
7
+ send_instructions: "你在几分钟后会收到一封电子邮件告诉你如何确认你的电子邮件地址。"
8
+ send_paranoid_instructions: "如果我们的数据库中保存有你的电子邮件地址,你会在几分钟内收到一封邮件告诉你如何确认的电子邮件。"
9
+ failure:
10
+ already_authenticated: "你已经登录。"
11
+ inactive: "你的帐户还未激活。"
12
+ invalid: "非法的 %{authentication_keys} 或密码。"
13
+ locked: "你的帐号已被锁定。"
14
+ last_attempt: "你还有最后一次尝试机会,如果再次失败你的帐号将被锁定。"
15
+ not_found_in_database: "非法的 %{authentication_keys} 或密码。"
16
+ timeout: "你的登录超时,请重新登录。"
17
+ unauthenticated: "你需要登录或注册才能继续操作。"
18
+ unconfirmed: "你需要确认你的电子邮件地址才能继续。"
19
+ mailer:
20
+ confirmation_instructions:
21
+ subject: "Pivorak: 帐户确认指南"
22
+ reset_password_instructions:
23
+ subject: "Pivorak: 重置密码指南"
24
+ unlock_instructions:
25
+ subject: "Pivorak: 解锁指南"
26
+ omniauth_callbacks:
27
+ failure: "由于%{reason},无法从%{kind} 认证。"
28
+ success: "成功从 %{kind} 认证帐户。"
29
+ passwords:
30
+ no_token: "如果没有密码重置邮件无法访问这个页面。如果你是从密码重置邮件访问过来的,请确认输入的网址完整。"
31
+ send_instructions: "在几分钟内你会收到一封密码重置邮件。"
32
+ send_paranoid_instructions: "如果我们的数据库中保存有你的电子邮件地址,你会在几分钟内收到一封如何恢复密码的邮件。"
33
+ updated: "你的密码已被成功更改,你现在已经登录。"
34
+ updated_not_active: "你的密码已被成功更改。"
35
+ registrations:
36
+ destroyed: "再见!你的帐户已被成功取消。希望能再次见到你。"
37
+ signed_up: "欢迎!你已经成功注册。"
38
+ signed_up_but_inactive: "你已经成功注册。但是由于你的帐户未激活,你仍无法登录。"
39
+ signed_up_but_locked: "你已经成功注册。但是由于你的帐户被锁定,你仍无法登录。"
40
+ signed_up_but_unconfirmed: "我们已向你的邮箱发送了一封确认邮件。请单击邮件中的链接激活你的帐户。"
41
+ update_needs_confirmation: "你已经成功更新帐户,但我们需要验证你的电子邮件地址。请检查你的邮件并确认你的子邮件地址。"
42
+ updated: "你的帐户已被成功更新。"
43
+ sessions:
44
+ signed_in: "成功登录。"
45
+ signed_out: "成功注销。"
46
+ unlocks:
47
+ send_instructions: "在几分钟内你会收到一封如何解锁帐户的邮件。"
48
+ send_paranoid_instructions: "如果你的帐户存在,在几分钟内你会收到一封如何解锁帐户的邮件。"
49
+ unlocked: "你的帐户已被成功解锁,请重新登录。"
50
+ errors:
51
+ messages:
52
+ already_confirmed: "已确认,请尝试登录"
53
+ confirmation_period_expired: "需要在 %{period} 内确认,请重新注册"
54
+ expired: "已过期,请重新注册"
55
+ not_found: "未找到"
56
+ not_locked: "未被锁定"
57
+ not_saved:
58
+ one: "出现一个错误导致 %{resource} 不能被保存:"
59
+ other: "出现 %{count} 个错误导致 %{resource} 不能被保存:"
@@ -0,0 +1,231 @@
1
+ zh-CN:
2
+ login: "登录"
3
+ sign_up: "注册"
4
+ sign_out: "注销"
5
+ forgot_your_password: "忘记你的密码?"
6
+ remember_me: "记住我"
7
+ content_management: "内容管理"
8
+ add_template: "添加模板"
9
+ create_first_template: "创建第一个模板"
10
+ new_template: "新建模板"
11
+ edit_template: "编辑模板"
12
+ update_template: "更新模板"
13
+ template_successfully_created: "成功创建模板"
14
+ template_successfully_updated: "成功更新模板"
15
+ add_page: "添加页面"
16
+ create_first_page: "创建一个页面"
17
+ new_page: "新页面"
18
+ edit_page: "编辑页面"
19
+ update_page: "更新页面"
20
+ page_successfully_created: "成功创建页面"
21
+ page_successfully_updated: "成功更新页面"
22
+ update_page_and_continue: "更新页面并继续"
23
+ update_template_and_continue: "更新模板并继续"
24
+ update_asset_and_continue: "更新资源并继续"
25
+ update_snippet_and_continue: "更新片段并继续"
26
+ add_asset: "添加资源"
27
+ new_asset: "新资源"
28
+ edit_asset: "编辑资源"
29
+ update_asset: "更新资源"
30
+ asset_successfully_updated: "成功更新资源"
31
+ upload_assets: "上传资源"
32
+ add_user: "添加用户"
33
+ new_user: "新用户"
34
+ edit_user: "编辑用户"
35
+ update_user: "更新用户"
36
+ toggle_fullscreen_mode_instruction: "当光标在编辑器时按下F11键切换到全屏模式。按下ESC键退出全屏编辑。"
37
+ add_snippet: "添加片段"
38
+ create_first_snippet: "创建第一个片段"
39
+ new_snippet: "新片段"
40
+ edit_snippet: "比较片段"
41
+ update_snippet: "更新片段"
42
+ snippet_successfully_created: "成功创建片段"
43
+ snippet_successfully_updated: "成功更新片段"
44
+ documentation: "文档"
45
+ need_help: "需要帮助?"
46
+ settings: "设置"
47
+ update_settings: "更新设置"
48
+ no_settings: "未选定设置"
49
+ yes_word: "是"
50
+ no_word: "否"
51
+ or: "或"
52
+ are_you_sure: "你确定?"
53
+ images: "图片"
54
+ stylesheets: "样式表"
55
+ javascripts: "Javascript"
56
+ fonts: "字体"
57
+ other_assets: "其他"
58
+ templates_description: "模板就是你的通用HTML代码放置的地方"
59
+ pages_description: "页面表现了你网站的组织结构并且他们的内容嵌入在模板中"
60
+ no_templates_yet: "貌似你目前没有模板"
61
+ snippets_description: "片段是你可以包含在模板或页面中的一小段HTML代码"
62
+ assets_description: "在这里上传样式表,javascripts, 图片或者其他文件(可以选择多个文件)"
63
+ assets_drop_description: "或者拖拽文件"
64
+ roles_description: "管理员可以管理任何内容。内容管理员只能在\"内容管理\"部分访问 \"页面\" 和 \"资源\" (但可以访问其他部分)。第二项区别就是管理员可以在HTML编辑器中查看页面,而内容管理员在所见即所得编辑器中查看"
65
+ or_hit: "或按下 "
66
+ while_your_cursor_in_input: " 当你的光标在输入状态"
67
+ roles:
68
+ admin: "管理员"
69
+ content_manager: "内容管理员"
70
+ liquor_help:
71
+ header: "Liquor帮助"
72
+ tags_title: "标签"
73
+ filters_title: "过滤器"
74
+ variables_title: "变量"
75
+ scopes_title: "范围"
76
+ endpoints_title: "接入点"
77
+ property: "属性"
78
+ parameter: "参数"
79
+ description: "描述"
80
+ specification: "详细Liquor 描述"
81
+ tags:
82
+ declare:
83
+ main_description: "标签声明可以用于变量声明和表单中的初始值:"
84
+ additional_description: "declare和assign标签的区别 - 使用declare你能在不同的作用域内创建同名变量。"
85
+ assign:
86
+ main_description: "标签赋值可以在变量声明时使用并且它的Tag初始值会在这个表单中被设置:"
87
+ if:
88
+ main_description: "if 标签是一个标准的条件表达式,它有如下的形式:"
89
+ unless:
90
+ main_description: 'unless 标签在条件表达式的值为假或空的时候执行它的执行体:'
91
+ for:
92
+ main_description: "for 标签是一个标准的循环表达式,它有如下的形式:"
93
+ capture:
94
+ main_description: "capture 标签运行代码并把结果保存到变量中。如果变量中已经有值,capture 会改变它:"
95
+ content_for:
96
+ main_description: "content_for 标签运行代码并把结果保存:"
97
+ yield:
98
+ main_description: "yield 标签有三种形式。如果没有任何参数,它会把内容插入到内部模板。如果包含句柄的字符串和 {% content_for %}进行了设置,yield会返回该字串。如果没有包含句柄的字符串,yield返回if_none执行结果,如果没有这样的语句,则返回空字符串:"
99
+ include:
100
+ main_description: 'include 标签包含片段内容到模板里。唯一的参数就是Snippet ID,在创建片段的时候需要使用。'
101
+ scopes:
102
+ find_by:
103
+ main_description: 'find_by 能让你在一个集合中按照条件查找一个元素'
104
+ find_all_by:
105
+ main_description: 'find_all_by 能够找到所有符合条件的集合元素'
106
+ except:
107
+ main_description: 'except 返回除了参数中提供元素以外的所有集合元素'
108
+ find_except_by:
109
+ main_description: 'find_except_by 找到所有不匹配查找条件的集合元素'
110
+ limit:
111
+ main_description: 'limit 方法集合SQL中的limit一样,用来限定集合中元素的数量'
112
+ offset:
113
+ main_description: 'offset 方法和SQL中的类似方法相同,用来按照偏移量查找记录'
114
+ first:
115
+ main_description: '返回集合中的首元素'
116
+ last:
117
+ main_description: '返回集合中的末元素'
118
+ by_index:
119
+ main_description: '按索引返回元素'
120
+ pluck:
121
+ main_description: '返回集合中元素的某个域值(非整个对象)'
122
+ variables:
123
+ var_loop:
124
+ main_description: '变量提供一种访问当前循环状态的方式。只能在for循环中使用。var_loop - 通用名,用来在你需要组合循环变量名和_loop时访问循环变量。例如:'
125
+ properties:
126
+ length: "循环计数 (集合大小)"
127
+ index: "当前循环索引 - 元素索引"
128
+ page:
129
+ main_description: '变量 "page" 可以在任何模板中被访问并作为当前页面的引用:'
130
+ properties:
131
+ slug: '"别名"域的值'
132
+ fullpath: '页面的全路径'
133
+ title: '"标题"域的值'
134
+ published: '"已发表" 域的值'
135
+ hidden: '"隐藏 (从导航)"域的值'
136
+ templatable: ' "作为模板使用"域的值'
137
+ children: '返回 "子" 集合 - 在"父页面"域中将这个页面作为父页面的所有页面。'
138
+ parent: '父页面引用'
139
+ index:
140
+ main_description: '"index"变量可以在根页面的模板和引用中访问(使用"index"别名)。 对象属性和"页面"变量一样。'
141
+ request:
142
+ main_description: '"request"变量给出访问当前请求一些属性的方法:'
143
+ properties:
144
+ path: '返回要求的相对路径'
145
+ url: '返回请求地址'
146
+ host: '返回主机名 - 域名或IP地址'
147
+ base_url: '返回请求根地址 - 协议 + 域名或IP,例如: "http://example.com"'
148
+ referer: '返回初始化现在请求的页面地址'
149
+ form_authenticity_token: '返回现在请求的认证令牌 - 用于保护表单免受 CSRF 攻击'
150
+ param: "返回地址参数。例如: request.param('page')"
151
+ item:
152
+ main_description: '"item"变量让你能够在"templatable"页面那个访问对应的对象。"Templatable" - 包含有激活"作为对象模板使用"域的页面。"item"属性依赖于具体对象。'
153
+ search:
154
+ main_description: "'search'变量让你能够访问搜索结果。支持请求中包含'query'参数,例如:/some_path?query=text。Object 'search'对象 - 搜索结果数组 (SearchItem 对象)。SearchItem 的属性显示如下。"
155
+ search_item:
156
+ main_description: 'search_item是搜索结果元素 ("search"集合元素)。'
157
+ properties:
158
+ title: '页面标题'
159
+ content: '搜索内容'
160
+ link: '到页面的链接,包含查询'
161
+ filters:
162
+ asset_path:
163
+ main_description: '"asset_path"过滤器能让你在"资源"模块通过文件名获取文件相对路径:'
164
+ asset_tag:
165
+ main_description: '"asset_tag"过滤器能让你包含上传到"区段"的javascript 和 css 文件:'
166
+ resize:
167
+ main_description: '这个功能/过滤器帮助动态改变图片尺寸。要想使用这个过滤器,你需要使用绝对图片地址并提供"format"参数。返回的也是地址。要想得到绝对地址(在"Assets"区段的任何资源只有相对地址),你需要使用"request.base_url":'
168
+ add_watermark:
169
+ main_description: '它允许你给图片添加水印。你需要图片地址和三个参数:"image" - 水印图片, "dissolve" - 透明度和 "position" - 位置。返回值也是地址:'
170
+ ends_with:
171
+ main_description: '允许检查字符串是否允许以特定模式结尾:'
172
+ currency:
173
+ main_description: '设定货币格式。接受的格式:precision, delimiter, separator, format, unit:'
174
+ activerecord:
175
+ errors:
176
+ models:
177
+ kms/page:
178
+ attributes:
179
+ template:
180
+ required: "不能为空"
181
+ models:
182
+ kms/template:
183
+ one: "模板"
184
+ few: "模板"
185
+ many: "模板"
186
+ other: "模板"
187
+ kms/page:
188
+ one: "页面"
189
+ few: "页面"
190
+ many: "页面"
191
+ other: "页面"
192
+ kms/asset:
193
+ one: "资源"
194
+ few: "资源"
195
+ many: "资源"
196
+ other: "资源"
197
+ kms/user:
198
+ one: "用户"
199
+ few: "用户"
200
+ many: "用户"
201
+ other: "用户"
202
+ kms/snippet:
203
+ one: "片段"
204
+ few: "片段"
205
+ many: "片段"
206
+ other: "片段"
207
+ attributes:
208
+ kms/template:
209
+ name: "名字"
210
+ content: "内容"
211
+ kms/page:
212
+ title: "标题"
213
+ content: "内容"
214
+ slug: "别名"
215
+ published: "已发表"
216
+ template: "模板"
217
+ parent: "父页面"
218
+ templatable: "作为对象模板使用"
219
+ templatable_type: "对象"
220
+ hidden: '隐藏 (从导航中)'
221
+ kms/asset:
222
+ file: "文件"
223
+ kms/user:
224
+ email: "电子邮件"
225
+ password: "密码"
226
+ password_confirmation: "密码确认"
227
+ role: "角色"
228
+ kms/snippet:
229
+ name: "姓名"
230
+ slug: "别名/ID"
231
+ content: "内容"