Browse Source

Merge branch 'master' of node/npmcomment into master

narrowizard 6 years ago
parent
commit
ca54428423
53 changed files with 679 additions and 325 deletions
  1. 5
    0
      CHANGELOG.md
  2. 5
    1
      README.md
  3. 2
    0
      assets/static/js/main.f8cafc1c.js
  4. 1
    0
      assets/static/js/main.f8cafc1c.js.map
  5. 109
    57
      lib/App.js
  6. 1
    1
      lib/App.js.map
  7. 0
    12
      lib/CHANGELOG.md
  8. 1
    1
      lib/Comment.js.map
  9. 1
    1
      lib/avatar.js.map
  10. 1
    1
      lib/axios.js.map
  11. 7
    2
      lib/components/CommentBox/index.js
  12. 1
    1
      lib/components/CommentBox/index.js.map
  13. 1
    1
      lib/components/CommentInput/index.js.map
  14. 6
    4
      lib/components/CommentList/index.js
  15. 1
    1
      lib/components/CommentList/index.js.map
  16. 23
    10
      lib/components/ContentItem/index.js
  17. 1
    1
      lib/components/ContentItem/index.js.map
  18. 1
    1
      lib/components/Editor/Emoji.js.map
  19. 5
    1
      lib/components/Editor/Upload.js
  20. 1
    1
      lib/components/Editor/Upload.js.map
  21. 15
    11
      lib/components/Editor/index.js
  22. 1
    1
      lib/components/Editor/index.js.map
  23. 7
    2
      lib/components/ImagePreviewer/ImagePreviewer.js
  24. 1
    1
      lib/components/ImagePreviewer/ImagePreviewer.js.map
  25. 1
    1
      lib/components/RenderText/index.js.map
  26. 1
    1
      lib/constant.js.map
  27. 1
    1
      lib/helper.js.map
  28. 1
    1
      lib/index.example.js.map
  29. 6
    0
      lib/index.js
  30. 1
    1
      lib/index.js.map
  31. 43
    0
      lib/lang/en-US.js
  32. 1
    0
      lib/lang/en-US.js.map
  33. 37
    15
      lib/lang/index.js
  34. 1
    1
      lib/lang/index.js.map
  35. 43
    0
      lib/lang/zh-CN.js
  36. 1
    0
      lib/lang/zh-CN.js.map
  37. 0
    72
      lib/mock.js
  38. 0
    1
      lib/mock.js.map
  39. 1
    1
      lib/registerServiceWorker.js.map
  40. 2
    1
      package.json
  41. 21
    0
      public/locales/en-US.json
  42. 21
    0
      public/locales/zh-CN.json
  43. 78
    27
      src/App.js
  44. 10
    10
      src/components/CommentBox/index.js
  45. 4
    2
      src/components/CommentList/index.js
  46. 67
    53
      src/components/ContentItem/index.js
  47. 2
    1
      src/components/Editor/Upload.js
  48. 15
    7
      src/components/Editor/index.js
  49. 3
    2
      src/components/ImagePreviewer/ImagePreviewer.jsx
  50. 6
    0
      src/index.js
  51. 38
    0
      src/lang/en-US.js
  52. 40
    15
      src/lang/index.js
  53. 37
    0
      src/lang/zh-CN.js

+ 5
- 0
CHANGELOG.md View File

1
 # CHANGELOG
1
 # CHANGELOG
2
 
2
 
3
+## 1.0.0
4
+
5
+- [x] 完成通用评论国际化
6
+
3
 ## 0.6.0
7
 ## 0.6.0
4
 
8
 
5
 - [x] 添加pageType slice,用于截断评论,点击查看更多回调进行跳转
9
 - [x] 添加pageType slice,用于截断评论,点击查看更多回调进行跳转
6
 
10
 
7
 ## 0.5.14
11
 ## 0.5.14
12
+
8
 - [x] 增加onDelete回调
13
 - [x] 增加onDelete回调
9
 
14
 
10
 ## 0.5.13
15
 ## 0.5.13

+ 5
- 1
README.md View File

177
 解决办法就是使用 [`fix/classname`](https://git.links123.net/node/npmcomment/src/branch/fix/classname) 分支中的静态文件:
177
 解决办法就是使用 [`fix/classname`](https://git.links123.net/node/npmcomment/src/branch/fix/classname) 分支中的静态文件:
178
 
178
 
179
 - [https://git.links123.net/node/npmcomment/src/branch/fix/classname](https://git.links123.net/node/npmcomment/src/branch/fix/classname)
179
 - [https://git.links123.net/node/npmcomment/src/branch/fix/classname](https://git.links123.net/node/npmcomment/src/branch/fix/classname)
180
+- static: [https://git.links123.net/node/npmcomment/src/branch/fix/classname/assets/static](https://git.links123.net/node/npmcomment/src/branch/fix/classname/assets/static)
181
+
182
+
183
+> 尝试过使用 CSS Module 进行修改,不过改造量较大,改动的过程中影响了其他样式,所以暂时放弃了。
180
 
184
 
181
-尝试过使用 CSS Module 进行修改,不过改造量较大,改动的过程中影响了其他样式,所以暂时放弃了。
182
 
185
 
183
 ## Comment
186
 ## Comment
184
 
187
 
205
 | onGetMoreBtnClick      | function() |                                    | false    | 点击查看更多按钮的回调                            |
208
 | onGetMoreBtnClick      | function() |                                    | false    | 点击查看更多按钮的回调                            |
206
 | onPageChange     | function(page) |                                    | false    | 页码发生变化时的回调,注意:分页数据获取还是在组件内部处理的                            |
209
 | onPageChange     | function(page) |                                    | false    | 页码发生变化时的回调,注意:分页数据获取还是在组件内部处理的                            |
207
 | onDelete         | function(type) |                                    | false    | 评论或回复删除成功后的回调, type: "comment" \| "reply" , 用于区分删除的是评论还是回复 |
210
 | onDelete         | function(type) |                                    | false    | 评论或回复删除成功后的回调, type: "comment" \| "reply" , 用于区分删除的是评论还是回复 |
211
+| locales          | string         | 语言                                | false    | 语言,zh-CN/en-US。默认根据 url 中的 lang 参数来获取。所以一般情况可不传入       
208
 
212
 
209
 
213
 
210
 ## Editor
214
 ## Editor

+ 2
- 0
assets/static/js/main.f8cafc1c.js
File diff suppressed because it is too large
View File


+ 1
- 0
assets/static/js/main.f8cafc1c.js.map
File diff suppressed because it is too large
View File


+ 109
- 57
lib/App.js View File

27
 
27
 
28
 var _axios2 = _interopRequireDefault(_axios);
28
 var _axios2 = _interopRequireDefault(_axios);
29
 
29
 
30
+var _reactIntlUniversal = require("react-intl-universal");
31
+
32
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
33
+
30
 var _constant = require("./constant");
34
 var _constant = require("./constant");
31
 
35
 
32
 var _Comment = require("./Comment");
36
 var _Comment = require("./Comment");
51
 
55
 
52
 var _lang = require("./lang");
56
 var _lang = require("./lang");
53
 
57
 
54
-var _lang2 = _interopRequireDefault(_lang);
58
+var _enUS = require("./lang/en-US.js");
59
+
60
+var _enUS2 = _interopRequireDefault(_enUS);
61
+
62
+var _zhCN = require("./lang/zh-CN.js");
63
+
64
+var _zhCN2 = _interopRequireDefault(_zhCN);
55
 
65
 
56
 require("./App.css");
66
 require("./App.css");
57
 
67
 
58
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
68
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59
 
69
 
70
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
71
+
60
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
72
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
61
 
73
 
62
 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
74
 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
63
 
75
 
64
 function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
76
 function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
65
 
77
 
66
-// import styles from "./App.module.css";
78
+var LOCALES = {
79
+  "zh-CN": _zhCN2.default,
80
+  "en-US": _enUS2.default
81
+};
67
 
82
 
68
 var App = function (_Component) {
83
 var App = function (_Component) {
69
   _inherits(App, _Component);
84
   _inherits(App, _Component);
84
       page: 1,
99
       page: 1,
85
       total: 0,
100
       total: 0,
86
       // 是否没有更多评论了
101
       // 是否没有更多评论了
87
-      isNoMoreComment: false
102
+      isNoMoreComment: false,
103
+      initDone: false,
104
+      locale: "zh-CN"
88
     };
105
     };
89
     _this.handleChangeLoading = _this.handleChangeLoading.bind(_this);
106
     _this.handleChangeLoading = _this.handleChangeLoading.bind(_this);
90
     _this.sCreateComment = _this.sCreateComment.bind(_this);
107
     _this.sCreateComment = _this.sCreateComment.bind(_this);
111
     }
128
     }
112
   }, {
129
   }, {
113
     key: "componentDidMount",
130
     key: "componentDidMount",
114
-    value: function componentDidMount() {}
131
+    value: function componentDidMount() {
132
+      this.loadLocales();
133
+    }
134
+
135
+    /**
136
+     * 加载语言包
137
+     * 只能根据url或者传入的props来确定加载哪个语言包
138
+     * 优先级:传入的props > url
139
+     */
140
+
141
+  }, {
142
+    key: "loadLocales",
143
+    value: function loadLocales() {
144
+      var _this2 = this;
145
+
146
+      var currentLocale = this.props.locales;
147
+
148
+      if (!currentLocale) {
149
+        currentLocale = _reactIntlUniversal2.default.determineLocale({
150
+          urlLocaleKey: "lang"
151
+        });
152
+      }
153
+      currentLocale = _lang.SUPPORT_LOCALES.find(function (item) {
154
+        return item.value === currentLocale;
155
+      }) ? currentLocale : "zh-CN";
156
+      _reactIntlUniversal2.default.init({
157
+        currentLocale: currentLocale,
158
+        locales: _defineProperty({}, currentLocale, LOCALES[currentLocale])
159
+      }).then(function () {
160
+        _this2.setState({ initDone: true, locale: currentLocale });
161
+      });
162
+    }
115
   }, {
163
   }, {
116
     key: "error",
164
     key: "error",
117
     value: function error(msg) {
165
     value: function error(msg) {
127
   }, {
175
   }, {
128
     key: "errorHandler",
176
     key: "errorHandler",
129
     value: function errorHandler(error) {
177
     value: function errorHandler(error) {
178
+      var locale = this.state.locale;
179
+
180
+      var localResponse = _lang.LOCALES_RESPONSE[locale];
130
       if (error.response && error.response.data && error.response.data.msg) {
181
       if (error.response && error.response.data && error.response.data.msg) {
131
-        this.error(_lang2.default[error.response.data.msg] || _constant.ERROR_DEFAULT, {
182
+        this.error(localResponse[error.response.data.msg] || _constant.ERROR_DEFAULT, {
132
           response: error.response
183
           response: error.response
133
         });
184
         });
134
         return;
185
         return;
135
       }
186
       }
136
-      this.error(_lang2.default[error.message] || _constant.ERROR_DEFAULT, {
187
+      this.error(localResponse[error.response.data.msg] || _constant.ERROR_DEFAULT, {
137
         response: error.response
188
         response: error.response
138
       });
189
       });
139
     }
190
     }
160
   }, {
211
   }, {
161
     key: "sGetComment",
212
     key: "sGetComment",
162
     value: function sGetComment() {
213
     value: function sGetComment() {
163
-      var _this2 = this;
214
+      var _this3 = this;
164
 
215
 
165
       var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
216
       var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
166
           _ref$page = _ref.page,
217
           _ref$page = _ref.page,
183
 
234
 
184
         if (list) {
235
         if (list) {
185
           var newList = list;
236
           var newList = list;
186
-          var oldList = _this2.state.list;
237
+          var oldList = _this3.state.list;
187
 
238
 
188
           if (pageType === "more") {
239
           if (pageType === "more") {
189
             if (page > 1) {
240
             if (page > 1) {
198
             window.scrollTo(0, 0);
249
             window.scrollTo(0, 0);
199
           }
250
           }
200
 
251
 
201
-          _this2.setState({
252
+          _this3.setState({
202
             list: newList,
253
             list: newList,
203
             page: page,
254
             page: page,
204
             total: total
255
             total: total
205
           });
256
           });
206
         } else {
257
         } else {
207
-          _message3.default.info("没有更多评论了");
208
-          _this2.setState({
258
+          _message3.default.info(_reactIntlUniversal2.default.get("message.noMoreComment"));
259
+          _this3.setState({
209
             isNoMoreComment: true
260
             isNoMoreComment: true
210
           });
261
           });
211
         }
262
         }
212
       }).catch(this.errorHandler).finally(function () {
263
       }).catch(this.errorHandler).finally(function () {
213
-        _this2.handleChangeLoading("sGetComment", false);
264
+        _this3.handleChangeLoading("sGetComment", false);
214
       });
265
       });
215
     }
266
     }
216
 
267
 
221
   }, {
272
   }, {
222
     key: "sGetReply",
273
     key: "sGetReply",
223
     value: function sGetReply() {
274
     value: function sGetReply() {
224
-      var _this3 = this;
275
+      var _this4 = this;
225
 
276
 
226
       var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
277
       var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
227
           commentId = _ref2.commentId,
278
           commentId = _ref2.commentId,
235
 
286
 
236
       this.axios.get(API + "/replies?comment_id=" + commentId + "&page=" + page + "&limit=" + limit).then(function (response) {
287
       this.axios.get(API + "/replies?comment_id=" + commentId + "&page=" + page + "&limit=" + limit).then(function (response) {
237
         if (!response.data.list) {
288
         if (!response.data.list) {
238
-          _message3.default.info("没有更多数据了!");
289
+          _message3.default.info(_reactIntlUniversal2.default.get("message.noMoreData"));
239
         }
290
         }
240
-        var list = _this3.state.list.map(function (item) {
291
+        var list = _this4.state.list.map(function (item) {
241
           if (item.id === commentId) {
292
           if (item.id === commentId) {
242
             if (!item.replies) item.replies = [];
293
             if (!item.replies) item.replies = [];
243
             if (response.data.list) {
294
             if (response.data.list) {
259
           }
310
           }
260
           return item;
311
           return item;
261
         });
312
         });
262
-        _this3.setState({ list: list });
313
+        _this4.setState({ list: list });
263
       }).catch(this.errorHandler).finally(function () {
314
       }).catch(this.errorHandler).finally(function () {
264
-        _this3.handleChangeLoading("sGetReply", false);
315
+        _this4.handleChangeLoading("sGetReply", false);
265
       });
316
       });
266
     }
317
     }
267
 
318
 
273
   }, {
324
   }, {
274
     key: "sCreateComment",
325
     key: "sCreateComment",
275
     value: function sCreateComment() {
326
     value: function sCreateComment() {
276
-      var _this4 = this;
327
+      var _this5 = this;
277
 
328
 
278
       var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
329
       var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
279
           content = _ref3.content;
330
           content = _ref3.content;
280
 
331
 
281
       var cb = arguments[1];
332
       var cb = arguments[1];
282
 
333
 
283
-      if (!content) return this.error("评论内容不能为空 ");
334
+      if (!content) return this.error(_reactIntlUniversal2.default.get("message.notNull"));
284
       this.handleChangeLoading("sCreateComment", true);
335
       this.handleChangeLoading("sCreateComment", true);
285
       var _props3 = this.props,
336
       var _props3 = this.props,
286
           API = _props3.API,
337
           API = _props3.API,
296
         },
347
         },
297
         withCredentials: true
348
         withCredentials: true
298
       }).then(function (response) {
349
       }).then(function (response) {
299
-        if (_this4.props.showAlertComment) {
300
-          _message3.default.success("评论成功!");
350
+        if (_this5.props.showAlertComment) {
351
+          _message3.default.success(_reactIntlUniversal2.default.get("message.success"));
301
         }
352
         }
302
         if ((0, _helper.isFunction)(cb)) cb();
353
         if ((0, _helper.isFunction)(cb)) cb();
303
         // 将数据写入到 list 中
354
         // 将数据写入到 list 中
304
         // 临时插入
355
         // 临时插入
305
         // 等到获取数据之后,删除临时数据
356
         // 等到获取数据之后,删除临时数据
306
-        var _state = _this4.state,
357
+        var _state = _this5.state,
307
             list = _state.list,
358
             list = _state.list,
308
             total = _state.total;
359
             total = _state.total;
309
 
360
 
310
         list.unshift(_extends({}, response.data, {
361
         list.unshift(_extends({}, response.data, {
311
           isTemporary: true // 临时的数据
362
           isTemporary: true // 临时的数据
312
         }));
363
         }));
313
-        _this4.setState({ list: list, total: total + 1 });
364
+        _this5.setState({ list: list, total: total + 1 });
314
       }).catch(this.errorHandler).finally(function () {
365
       }).catch(this.errorHandler).finally(function () {
315
-        _this4.handleChangeLoading("sCreateComment", false);
366
+        _this5.handleChangeLoading("sCreateComment", false);
316
       });
367
       });
317
     }
368
     }
318
 
369
 
323
   }, {
374
   }, {
324
     key: "sDeleteComment",
375
     key: "sDeleteComment",
325
     value: function sDeleteComment(commentId) {
376
     value: function sDeleteComment(commentId) {
326
-      var _this5 = this;
377
+      var _this6 = this;
327
 
378
 
328
       this.handleChangeLoading("sDeleteComment", true);
379
       this.handleChangeLoading("sDeleteComment", true);
329
       var API = this.props.API;
380
       var API = this.props.API;
332
         method: "delete",
383
         method: "delete",
333
         withCredentials: true
384
         withCredentials: true
334
       }).then(function () {
385
       }).then(function () {
335
-        var _state2 = _this5.state,
386
+        var _state2 = _this6.state,
336
             list = _state2.list,
387
             list = _state2.list,
337
             total = _state2.total;
388
             total = _state2.total;
338
 
389
 
339
         var res = list.filter(function (item) {
390
         var res = list.filter(function (item) {
340
           return item.id !== commentId;
391
           return item.id !== commentId;
341
         });
392
         });
342
-        _this5.setState({ list: res, total: total - 1 });
343
-        _this5.props.onDelete(_constant.COMMENT_TYPE.COMMENT);
393
+        _this6.setState({ list: res, total: total - 1 });
394
+        _this6.props.onDelete(_constant.COMMENT_TYPE.COMMENT);
344
       }).catch(this.errorHandler).finally(function () {
395
       }).catch(this.errorHandler).finally(function () {
345
-        _this5.handleChangeLoading("sDeleteComment", false);
396
+        _this6.handleChangeLoading("sDeleteComment", false);
346
       });
397
       });
347
     }
398
     }
348
 
399
 
355
   }, {
406
   }, {
356
     key: "sCreateReply",
407
     key: "sCreateReply",
357
     value: function sCreateReply(data, cb) {
408
     value: function sCreateReply(data, cb) {
358
-      var _this6 = this;
409
+      var _this7 = this;
359
 
410
 
360
-      if (!data.content) return this.error("回复内容不能为空 ");
411
+      if (!data.content) return this.error(_reactIntlUniversal2.default.get("message.replyNoNull"));
361
       this.handleChangeLoading("sCreateReply", true);
412
       this.handleChangeLoading("sCreateReply", true);
362
       var API = this.props.API;
413
       var API = this.props.API;
363
 
414
 
366
         data: data,
417
         data: data,
367
         withCredentials: true
418
         withCredentials: true
368
       }).then(function (response) {
419
       }).then(function (response) {
369
-        if (_this6.props.showAlertReply) {
370
-          _message3.default.success("回复成功!");
420
+        if (_this7.props.showAlertReply) {
421
+          _message3.default.success(_reactIntlUniversal2.default.get("message.replySuccess"));
371
         }
422
         }
372
         if ((0, _helper.isFunction)(cb)) cb();
423
         if ((0, _helper.isFunction)(cb)) cb();
373
         // 将数据写入到 list 中
424
         // 将数据写入到 list 中
374
         // 临时插入
425
         // 临时插入
375
         // 等到获取数据之后,删除临时数据
426
         // 等到获取数据之后,删除临时数据
376
-        var list = _this6.state.list.map(function (item) {
427
+        var list = _this7.state.list.map(function (item) {
377
           if (item.id === data.comment_id) {
428
           if (item.id === data.comment_id) {
378
             if (!item.replies) item.replies = [];
429
             if (!item.replies) item.replies = [];
379
             item.replies.push(_extends({}, response.data, {
430
             item.replies.push(_extends({}, response.data, {
383
           }
434
           }
384
           return item;
435
           return item;
385
         });
436
         });
386
-        _this6.setState({ list: list });
437
+        _this7.setState({ list: list });
387
       }).catch(this.errorHandler).finally(function () {
438
       }).catch(this.errorHandler).finally(function () {
388
-        _this6.handleChangeLoading("sCreateReply", false);
439
+        _this7.handleChangeLoading("sCreateReply", false);
389
       });
440
       });
390
     }
441
     }
391
 
442
 
398
   }, {
449
   }, {
399
     key: "sDeleteReply",
450
     key: "sDeleteReply",
400
     value: function sDeleteReply(replyId, commentId) {
451
     value: function sDeleteReply(replyId, commentId) {
401
-      var _this7 = this;
452
+      var _this8 = this;
402
 
453
 
403
       this.handleChangeLoading("sDeleteReply", true);
454
       this.handleChangeLoading("sDeleteReply", true);
404
       var API = this.props.API;
455
       var API = this.props.API;
407
         method: "delete",
458
         method: "delete",
408
         withCredentials: true
459
         withCredentials: true
409
       }).then(function () {
460
       }).then(function () {
410
-        var list = _this7.state.list.map(function (item) {
461
+        var list = _this8.state.list.map(function (item) {
411
           if (item.id === commentId) {
462
           if (item.id === commentId) {
412
             var replies = item.replies.filter(function (item) {
463
             var replies = item.replies.filter(function (item) {
413
               return item.id !== replyId;
464
               return item.id !== replyId;
417
           }
468
           }
418
           return item;
469
           return item;
419
         });
470
         });
420
-        _this7.setState({ list: list });
421
-        _this7.props.onDelete(_constant.COMMENT_TYPE.REPLY);
471
+        _this8.setState({ list: list });
472
+        _this8.props.onDelete(_constant.COMMENT_TYPE.REPLY);
422
       }).catch(this.errorHandler).finally(function () {
473
       }).catch(this.errorHandler).finally(function () {
423
-        _this7.handleChangeLoading("sDeleteReply", false);
474
+        _this8.handleChangeLoading("sDeleteReply", false);
424
       });
475
       });
425
     }
476
     }
426
 
477
 
433
   }, {
484
   }, {
434
     key: "sCommentFavor",
485
     key: "sCommentFavor",
435
     value: function sCommentFavor(commentId, favored) {
486
     value: function sCommentFavor(commentId, favored) {
436
-      var _this8 = this;
487
+      var _this9 = this;
437
 
488
 
438
       this.handleChangeLoading("sCommentFavor", true);
489
       this.handleChangeLoading("sCommentFavor", true);
439
       var API = this.props.API;
490
       var API = this.props.API;
442
         method: favored ? "delete" : "put",
493
         method: favored ? "delete" : "put",
443
         withCredentials: true
494
         withCredentials: true
444
       }).then(function (response) {
495
       }).then(function (response) {
445
-        if (_this8.props.showAlertFavor) {
446
-          _message3.default.success(favored ? "取消点赞成功!" : "点赞成功!");
496
+        if (_this9.props.showAlertFavor) {
497
+          _message3.default.success(favored ? _reactIntlUniversal2.default.get("message.cancelLickSuccess") : _reactIntlUniversal2.default.get("message.likeSuccess"));
447
         }
498
         }
448
         // 更新 list 中的该项数据的 favored
499
         // 更新 list 中的该项数据的 favored
449
-        var list = _this8.state.list.map(function (item) {
500
+        var list = _this9.state.list.map(function (item) {
450
           if (item.id === commentId) {
501
           if (item.id === commentId) {
451
             item.favored = !favored;
502
             item.favored = !favored;
452
             item.favor_count += favored ? -1 : 1;
503
             item.favor_count += favored ? -1 : 1;
453
           }
504
           }
454
           return item;
505
           return item;
455
         });
506
         });
456
-        _this8.setState({ list: list });
507
+        _this9.setState({ list: list });
457
       }).catch(this.errorHandler).finally(function () {
508
       }).catch(this.errorHandler).finally(function () {
458
-        _this8.handleChangeLoading("sCommentFavor", false);
509
+        _this9.handleChangeLoading("sCommentFavor", false);
459
       });
510
       });
460
     }
511
     }
461
 
512
 
469
   }, {
520
   }, {
470
     key: "sReplyFavor",
521
     key: "sReplyFavor",
471
     value: function sReplyFavor(replyId, commentId, favored) {
522
     value: function sReplyFavor(replyId, commentId, favored) {
472
-      var _this9 = this;
523
+      var _this10 = this;
473
 
524
 
474
       this.handleChangeLoading("sReplyFavor", true);
525
       this.handleChangeLoading("sReplyFavor", true);
475
       var API = this.props.API;
526
       var API = this.props.API;
481
         },
532
         },
482
         withCredentials: true
533
         withCredentials: true
483
       }).then(function (response) {
534
       }).then(function (response) {
484
-        _message3.default.success(favored ? "取消点赞成功!" : "点赞成功!");
535
+        _message3.default.success(favored ? _reactIntlUniversal2.default.get("message.cancelLickSuccess") : _reactIntlUniversal2.default.get("message.likeSuccess"));
485
         // 更新 list 中的该项数据的 favored
536
         // 更新 list 中的该项数据的 favored
486
-        var list = _this9.state.list.map(function (item) {
537
+        var list = _this10.state.list.map(function (item) {
487
           if (item.id === commentId) {
538
           if (item.id === commentId) {
488
             item.replies = item.replies.map(function (r) {
539
             item.replies = item.replies.map(function (r) {
489
               if (r.id === replyId) {
540
               if (r.id === replyId) {
498
           }
549
           }
499
           return item;
550
           return item;
500
         });
551
         });
501
-        _this9.setState({ list: list });
552
+        _this10.setState({ list: list });
502
       }).catch(this.errorHandler).finally(function () {
553
       }).catch(this.errorHandler).finally(function () {
503
-        _this9.handleChangeLoading("sReplyFavor", false);
554
+        _this10.handleChangeLoading("sReplyFavor", false);
504
       });
555
       });
505
     }
556
     }
506
 
557
 
511
   }, {
562
   }, {
512
     key: "sOssSts",
563
     key: "sOssSts",
513
     value: function sOssSts() {
564
     value: function sOssSts() {
514
-      var _this10 = this;
565
+      var _this11 = this;
515
 
566
 
516
       this.handleChangeLoading("sOssSts", true);
567
       this.handleChangeLoading("sOssSts", true);
517
       var API = this.props.API;
568
       var API = this.props.API;
518
 
569
 
519
       this.axios.get(API + "/oss/sts").then(function (response) {
570
       this.axios.get(API + "/oss/sts").then(function (response) {
520
-        _this10.setState({ oss: _extends({}, response.data) });
571
+        _this11.setState({ oss: _extends({}, response.data) });
521
       }).catch(this.errorHandler).finally(function () {
572
       }).catch(this.errorHandler).finally(function () {
522
-        _this10.handleChangeLoading("sOssSts", false);
573
+        _this11.handleChangeLoading("sOssSts", false);
523
       });
574
       });
524
     }
575
     }
525
   }, {
576
   }, {
538
         sDeleteReply: this.sDeleteReply
589
         sDeleteReply: this.sDeleteReply
539
       });
590
       });
540
 
591
 
541
-      return _react2.default.createElement(
592
+      return this.state.initDone && _react2.default.createElement(
542
         _Comment.CommentContext.Provider,
593
         _Comment.CommentContext.Provider,
543
         { value: value },
594
         { value: value },
544
         _react2.default.createElement(
595
         _react2.default.createElement(
575
   limit: _propTypes2.default.number, // 一次加载评论数量
626
   limit: _propTypes2.default.number, // 一次加载评论数量
576
   onPageChange: _propTypes2.default.func, // 页码变化回调
627
   onPageChange: _propTypes2.default.func, // 页码变化回调
577
   onGetMoreBtnClick: _propTypes2.default.func, // 点击查看更多按钮回调
628
   onGetMoreBtnClick: _propTypes2.default.func, // 点击查看更多按钮回调
578
-  onDelete: _propTypes2.default.func
629
+  onDelete: _propTypes2.default.func,
630
+  locales: _propTypes2.default.string //  传入的语言环境, en-US/zh-CN
579
 };
631
 };
580
 
632
 
581
 App.defaultProps = {
633
 App.defaultProps = {

+ 1
- 1
lib/App.js.map
File diff suppressed because it is too large
View File


+ 0
- 12
lib/CHANGELOG.md View File

1
-# CHANGELOG
2
-
3
-
4
-## 0.1.0
5
-
6
-- [x] 不兼容更新。
7
-- [x] 添加了很多 `Props`
8
-- [x] 组件导出为 `Comment` 和 `Editor`
9
-
10
-
11
-
12
-

+ 1
- 1
lib/Comment.js.map View File

1
-{"version":3,"sources":["../src/Comment.js"],"names":["Comment","CommentContext","React","createContext","Component","props","app"],"mappings":";;;;;;;;;QAKgBA,O,GAAAA,O;;AALhB;;;;;;AAEA,IAAMC,iBAAiBC,gBAAMC,aAAN,EAAvB;;AAEA;AACO,SAASH,OAAT,CAAiBI,SAAjB,EAA4B;AACjC;AACA,SAAO,UAASC,KAAT,EAAgB;AACrB;AACA;AACA,WACE;AAAC,oBAAD,CAAgB,QAAhB;AAAA;AACG;AAAA,eAAO,8BAAC,SAAD,eAAeA,KAAf,IAAsB,KAAKC,GAA3B,IAAP;AAAA;AADH,KADF;AAKD,GARD;AASD;;QAEQL,c,GAAAA,c;kBAEMD,O","file":"Comment.js","sourcesContent":["import React from \"react\";\n\nconst CommentContext = React.createContext();\n\n// This function takes a component...\nexport function Comment(Component) {\n  // ...and returns another component...\n  return function(props) {\n    // ... and renders the wrapped component with the context theme!\n    // Notice that we pass through any additional props as well\n    return (\n      <CommentContext.Consumer>\n        {app => <Component {...props} app={app} />}\n      </CommentContext.Consumer>\n    );\n  };\n}\n\nexport { CommentContext };\n\nexport default Comment;\n"]}
1
+{"version":3,"sources":["../src/Comment.js"],"names":["Comment","CommentContext","React","createContext","Component","props","app"],"mappings":";;;;;;;;;QAKgBA,O,GAAAA,O;;AALhB;;;;;;AAEA,IAAMC,iBAAiBC,gBAAMC,aAAN,EAAvB;;AAEA;AACO,SAASH,OAAT,CAAiBI,SAAjB,EAA4B;AACjC;AACA,SAAO,UAASC,KAAT,EAAgB;AACrB;AACA;AACA,WACE;AAAC,oBAAD,CAAgB,QAAhB;AAAA;AACG;AAAA,eAAO,8BAAC,SAAD,eAAeA,KAAf,IAAsB,KAAKC,GAA3B,IAAP;AAAA;AADH,KADF;AAKD,GARD;AASD;;QAEQL,c,GAAAA,c;kBAEMD,O","file":"Comment.js","sourcesContent":["import React from \"react\";\r\n\r\nconst CommentContext = React.createContext();\r\n\r\n// This function takes a component...\r\nexport function Comment(Component) {\r\n  // ...and returns another component...\r\n  return function(props) {\r\n    // ... and renders the wrapped component with the context theme!\r\n    // Notice that we pass through any additional props as well\r\n    return (\r\n      <CommentContext.Consumer>\r\n        {app => <Component {...props} app={app} />}\r\n      </CommentContext.Consumer>\r\n    );\r\n  };\r\n}\r\n\r\nexport { CommentContext };\r\n\r\nexport default Comment;\r\n"]}

+ 1
- 1
lib/avatar.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
lib/axios.js.map View File

1
-{"version":3,"sources":["../src/axios.js"],"names":["axios","defaults","withCredentials","headers","common"],"mappings":";;;;;;AAAA;;;;;;AAEAA,gBAAMC,QAAN,CAAeC,eAAf,GAAiC,IAAjC;AACAF,gBAAMC,QAAN,CAAeE,OAAf,CAAuBC,MAAvB,CAA8B,eAA9B,IAAiD,SAAjD;;kBAEeJ,e","file":"axios.js","sourcesContent":["import axios from \"axios\";\n\naxios.defaults.withCredentials = true;\naxios.defaults.headers.common[\"Authorization\"] = \"Bearer \";\n\nexport default axios;\n"]}
1
+{"version":3,"sources":["../src/axios.js"],"names":["axios","defaults","withCredentials","headers","common"],"mappings":";;;;;;AAAA;;;;;;AAEAA,gBAAMC,QAAN,CAAeC,eAAf,GAAiC,IAAjC;AACAF,gBAAMC,QAAN,CAAeE,OAAf,CAAuBC,MAAvB,CAA8B,eAA9B,IAAiD,SAAjD;;kBAEeJ,e","file":"axios.js","sourcesContent":["import axios from \"axios\";\r\n\r\naxios.defaults.withCredentials = true;\r\naxios.defaults.headers.common[\"Authorization\"] = \"Bearer \";\r\n\r\nexport default axios;\r\n"]}

+ 7
- 2
lib/components/CommentBox/index.js View File

20
 
20
 
21
 var _propTypes2 = _interopRequireDefault(_propTypes);
21
 var _propTypes2 = _interopRequireDefault(_propTypes);
22
 
22
 
23
+var _reactIntlUniversal = require("react-intl-universal");
24
+
25
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
26
+
23
 var _Comment = require("../../Comment");
27
 var _Comment = require("../../Comment");
24
 
28
 
25
 var _Comment2 = _interopRequireDefault(_Comment);
29
 var _Comment2 = _interopRequireDefault(_Comment);
122
                       return _this2.handleGetMoreReply(commentId);
126
                       return _this2.handleGetMoreReply(commentId);
123
                     }
127
                     }
124
                   },
128
                   },
125
-                  "\u67E5\u770B\u66F4\u591A\u56DE\u590D"
129
+                  _reactIntlUniversal2.default.get("reply.moreReply")
126
                 ),
130
                 ),
127
                 _react2.default.createElement(
131
                 _react2.default.createElement(
128
                   "a",
132
                   "a",
131
                     onClick: _this2.handleToggleReply
135
                     onClick: _this2.handleToggleReply
132
                   },
136
                   },
133
                   _react2.default.createElement(_icon2.default, { type: "up" }),
137
                   _react2.default.createElement(_icon2.default, { type: "up" }),
134
-                  " \u6536\u8D77\u56DE\u590D"
138
+                  " ",
139
+                  _reactIntlUniversal2.default.get("reply.collapse")
135
                 )
140
                 )
136
               )];
141
               )];
137
             }
142
             }

+ 1
- 1
lib/components/CommentBox/index.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
lib/components/CommentInput/index.js.map
File diff suppressed because it is too large
View File


+ 6
- 4
lib/components/CommentList/index.js View File

22
 
22
 
23
 var _react2 = _interopRequireDefault(_react);
23
 var _react2 = _interopRequireDefault(_react);
24
 
24
 
25
+var _reactIntlUniversal = require("react-intl-universal");
26
+
27
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
28
+
25
 var _Comment = require("../../Comment");
29
 var _Comment = require("../../Comment");
26
 
30
 
27
 var _Comment2 = _interopRequireDefault(_Comment);
31
 var _Comment2 = _interopRequireDefault(_Comment);
96
             _react2.default.createElement(
100
             _react2.default.createElement(
97
               "span",
101
               "span",
98
               null,
102
               null,
99
-              "\u67E5\u770B\u66F4\u591A\u8BC4\u8BBA"
103
+              _reactIntlUniversal2.default.get("comment.moreComment")
100
             )
104
             )
101
           );
105
           );
102
         } else {
106
         } else {
137
           _react2.default.createElement(
141
           _react2.default.createElement(
138
             "div",
142
             "div",
139
             null,
143
             null,
140
-            "\u5171 ",
141
-            total,
142
-            " \u6761\u8BC4\u8BBA"
144
+            _reactIntlUniversal2.default.get("comment.totalComment", { total: total })
143
           ),
145
           ),
144
           list.map(function (item) {
146
           list.map(function (item) {
145
             return _react2.default.createElement(_CommentBox2.default, { content: item, key: item.id, commentId: item.id });
147
             return _react2.default.createElement(_CommentBox2.default, { content: item, key: item.id, commentId: item.id });

+ 1
- 1
lib/components/CommentList/index.js.map View File

1
-{"version":3,"sources":["../../../src/components/CommentList/index.js"],"names":["CommentList","props","state","app","sGetComment","page","list","total","pageType","limit","isNoMoreComment","onPageChange","onGetMoreBtnClick","length","p","loading","spinning","Boolean","sCommentFavor","sReplyFavor","map","item","id","renderPagination","Component","propTypes"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;;;AAEA;;;;AACA;;;;AACA;;;;;;;;;;IAEMA,W;;;AACJ,uBAAYC,KAAZ,EAAmB;AAAA;;AAAA,0HACXA,KADW;;AAEjB,UAAKC,KAAL,GAAa,EAAb;AAFiB;AAGlB;;;;yCAEoB;AACnB,WAAKD,KAAL,CAAWE,GAAX,CAAeC,WAAf,CAA2B,EAAEC,MAAM,KAAKJ,KAAL,CAAWE,GAAX,CAAeE,IAAvB,EAA3B;AACD;;;uCAEkB;AAAA,uBAWb,KAAKJ,KAAL,CAAWE,GAXE;AAAA,UAEfG,IAFe,cAEfA,IAFe;AAAA,UAGfC,KAHe,cAGfA,KAHe;AAAA,UAIfF,IAJe,cAIfA,IAJe;AAAA,UAKfG,QALe,cAKfA,QALe;AAAA,UAMfC,KANe,cAMfA,KANe;AAAA,UAOfC,eAPe,cAOfA,eAPe;AAAA,UAQfN,WARe,cAQfA,WARe;AAAA,UASfO,YATe,cASfA,YATe;AAAA,UAUfC,iBAVe,cAUfA,iBAVe;;AAYjB,UAAIJ,aAAa,OAAjB,EAA0B;AACxB;AACA,eACE;AAAA;AAAA,YAAK,WAAU,wBAAf,EAAwC,SAASI,iBAAjD;AACE;AAAA;AAAA;AAAA;AAAA;AADF,SADF;AAKD,OAPD,MAOO,IAAIJ,aAAa,MAAjB,EAAyB;AAC9B,YAAI,CAACE,eAAD,IAAoBJ,KAAKO,MAAL,KAAgBN,KAAxC,EAA+C;AAC7C,iBACE;AAAA;AAAA;AACE,yBAAU,wBADZ;AAEE,uBAAS,mBAAM;AACbH,4BAAY,EAAEC,MAAMA,OAAO,CAAf,EAAZ;AACAM,6BAAaN,OAAO,CAApB;AACD;AALH;AAOE;AAAA;AAAA;AAAA;AAAA;AAPF,WADF;AAWD,SAZD,MAYO;AACL,iBAAO,IAAP;AACD;AACF,OAhBM,MAgBA,IAAIG,aAAa,YAAjB,EAA+B;AACpC,eACE;AAAA;AAAA,YAAK,WAAU,yBAAf;AACE;AACE,sBAAUC,KADZ;AAEE,qBAASJ,IAFX;AAGE,mBAAOE,KAHT;AAIE,sBAAU,qBAAK;AACbH,0BAAY,EAAEC,MAAMS,CAAR,EAAZ;AACAH,2BAAaG,CAAb;AACD;AAPH;AADF,SADF;AAaD;AACF;;;6BAEQ;AAAA,wBAC0B,KAAKb,KAAL,CAAWE,GADrC;AAAA,UACCG,IADD,eACCA,IADD;AAAA,UACOC,KADP,eACOA,KADP;AAAA,UACcQ,OADd,eACcA,OADd;;;AAGP,UAAMC,WAAWC,QACfF,QAAQX,WAAR,IAAuBW,QAAQG,aAA/B,IAAgDH,QAAQI,WADzC,CAAjB;AAGA,aACE;AAAA;AAAA;AACE;AAAA;AAAA,YAAM,UAAUH,QAAhB;AACE;AAAA;AAAA;AAAA;AAAQT,iBAAR;AAAA;AAAA,WADF;AAEGD,eAAKc,GAAL,CAAS;AAAA,mBACR,8BAAC,oBAAD,IAAY,SAASC,IAArB,EAA2B,KAAKA,KAAKC,EAArC,EAAyC,WAAWD,KAAKC,EAAzD,GADQ;AAAA,WAAT,CAFH;AAKG,eAAKC,gBAAL;AALH;AADF,OADF;AAWD;;;;EA/EuBC,gB;;AAkF1BxB,YAAYyB,SAAZ,GAAwB,EAAxB;;kBAEe,uBAAQzB,WAAR,C","file":"index.js","sourcesContent":["import React, { Component } from \"react\";\nimport { Spin, Pagination } from \"antd\";\nimport Comment from \"../../Comment\";\nimport CommentBox from \"../CommentBox\";\nimport \"./index.css\";\n\nclass CommentList extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {};\n  }\n\n  componentWillMount() {\n    this.props.app.sGetComment({ page: this.props.app.page });\n  }\n\n  renderPagination() {\n    const {\n      list,\n      total,\n      page,\n      pageType,\n      limit,\n      isNoMoreComment,\n      sGetComment,\n      onPageChange,\n      onGetMoreBtnClick\n    } = this.props.app;\n    if (pageType === \"slice\") {\n      // 截断多余评论,通过点击查看更多跳转\n      return (\n        <div className=\"comment-list-show-more\" onClick={onGetMoreBtnClick}>\n          <span>查看更多</span>\n        </div>\n      );\n    } else if (pageType === \"more\") {\n      if (!isNoMoreComment && list.length !== total) {\n        return (\n          <div\n            className=\"comment-list-show-more\"\n            onClick={() => {\n              sGetComment({ page: page + 1 });\n              onPageChange(page + 1);\n            }}\n          >\n            <span>查看更多评论</span>\n          </div>\n        );\n      } else {\n        return null;\n      }\n    } else if (pageType === \"pagination\") {\n      return (\n        <div className=\"comment-list-pagination\">\n          <Pagination\n            pageSize={limit}\n            current={page}\n            total={total}\n            onChange={p => {\n              sGetComment({ page: p });\n              onPageChange(p);\n            }}\n          />\n        </div>\n      );\n    }\n  }\n\n  render() {\n    const { list, total, loading } = this.props.app;\n\n    const spinning = Boolean(\n      loading.sGetComment || loading.sCommentFavor || loading.sReplyFavor\n    );\n    return (\n      <div>\n        <Spin spinning={spinning}>\n          <div>共 {total} 条评论</div>\n          {list.map(item => (\n            <CommentBox content={item} key={item.id} commentId={item.id} />\n          ))}\n          {this.renderPagination()}\n        </Spin>\n      </div>\n    );\n  }\n}\n\nCommentList.propTypes = {};\n\nexport default Comment(CommentList);\n"]}
1
+{"version":3,"sources":["../../../src/components/CommentList/index.js"],"names":["CommentList","props","state","app","sGetComment","page","list","total","pageType","limit","isNoMoreComment","onPageChange","onGetMoreBtnClick","length","intl","get","p","loading","spinning","Boolean","sCommentFavor","sReplyFavor","map","item","id","renderPagination","Component","propTypes"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;IAEMA,W;;;AACJ,uBAAYC,KAAZ,EAAmB;AAAA;;AAAA,0HACXA,KADW;;AAEjB,UAAKC,KAAL,GAAa,EAAb;AAFiB;AAGlB;;;;yCAEoB;AACnB,WAAKD,KAAL,CAAWE,GAAX,CAAeC,WAAf,CAA2B,EAAEC,MAAM,KAAKJ,KAAL,CAAWE,GAAX,CAAeE,IAAvB,EAA3B;AACD;;;uCAEkB;AAAA,uBAWb,KAAKJ,KAAL,CAAWE,GAXE;AAAA,UAEfG,IAFe,cAEfA,IAFe;AAAA,UAGfC,KAHe,cAGfA,KAHe;AAAA,UAIfF,IAJe,cAIfA,IAJe;AAAA,UAKfG,QALe,cAKfA,QALe;AAAA,UAMfC,KANe,cAMfA,KANe;AAAA,UAOfC,eAPe,cAOfA,eAPe;AAAA,UAQfN,WARe,cAQfA,WARe;AAAA,UASfO,YATe,cASfA,YATe;AAAA,UAUfC,iBAVe,cAUfA,iBAVe;;AAYjB,UAAIJ,aAAa,OAAjB,EAA0B;AACxB;AACA,eACE;AAAA;AAAA,YAAK,WAAU,wBAAf,EAAwC,SAASI,iBAAjD;AACE;AAAA;AAAA;AAAA;AAAA;AADF,SADF;AAKD,OAPD,MAOO,IAAIJ,aAAa,MAAjB,EAAyB;AAC9B,YAAI,CAACE,eAAD,IAAoBJ,KAAKO,MAAL,KAAgBN,KAAxC,EAA+C;AAC7C,iBACE;AAAA;AAAA;AACE,yBAAU,wBADZ;AAEE,uBAAS,mBAAM;AACbH,4BAAY,EAAEC,MAAMA,OAAO,CAAf,EAAZ;AACAM,6BAAaN,OAAO,CAApB;AACD;AALH;AAOE;AAAA;AAAA;AAAOS,2CAAKC,GAAL,CAAS,qBAAT;AAAP;AAPF,WADF;AAWD,SAZD,MAYO;AACL,iBAAO,IAAP;AACD;AACF,OAhBM,MAgBA,IAAIP,aAAa,YAAjB,EAA+B;AACpC,eACE;AAAA;AAAA,YAAK,WAAU,yBAAf;AACE;AACE,sBAAUC,KADZ;AAEE,qBAASJ,IAFX;AAGE,mBAAOE,KAHT;AAIE,sBAAU,qBAAK;AACbH,0BAAY,EAAEC,MAAMW,CAAR,EAAZ;AACAL,2BAAaK,CAAb;AACD;AAPH;AADF,SADF;AAaD;AACF;;;6BAEQ;AAAA,wBAC0B,KAAKf,KAAL,CAAWE,GADrC;AAAA,UACCG,IADD,eACCA,IADD;AAAA,UACOC,KADP,eACOA,KADP;AAAA,UACcU,OADd,eACcA,OADd;;;AAGP,UAAMC,WAAWC,QACfF,QAAQb,WAAR,IAAuBa,QAAQG,aAA/B,IAAgDH,QAAQI,WADzC,CAAjB;AAGA,aACE;AAAA;AAAA;AACE;AAAA;AAAA,YAAM,UAAUH,QAAhB;AAEE;AAAA;AAAA;AAAMJ,yCAAKC,GAAL,CAAS,sBAAT,EAAiC,EAAER,YAAF,EAAjC;AAAN,WAFF;AAGGD,eAAKgB,GAAL,CAAS;AAAA,mBACR,8BAAC,oBAAD,IAAY,SAASC,IAArB,EAA2B,KAAKA,KAAKC,EAArC,EAAyC,WAAWD,KAAKC,EAAzD,GADQ;AAAA,WAAT,CAHH;AAMG,eAAKC,gBAAL;AANH;AADF,OADF;AAYD;;;;EAhFuBC,gB;;AAmF1B1B,YAAY2B,SAAZ,GAAwB,EAAxB;;kBAEe,uBAAQ3B,WAAR,C","file":"index.js","sourcesContent":["import React, { Component } from \"react\";\r\nimport { Spin, Pagination } from \"antd\";\r\nimport intl from \"react-intl-universal\";\r\nimport Comment from \"../../Comment\";\r\nimport CommentBox from \"../CommentBox\";\r\nimport \"./index.css\";\r\n\r\nclass CommentList extends Component {\r\n  constructor(props) {\r\n    super(props);\r\n    this.state = {};\r\n  }\r\n\r\n  componentWillMount() {\r\n    this.props.app.sGetComment({ page: this.props.app.page });\r\n  }\r\n\r\n  renderPagination() {\r\n    const {\r\n      list,\r\n      total,\r\n      page,\r\n      pageType,\r\n      limit,\r\n      isNoMoreComment,\r\n      sGetComment,\r\n      onPageChange,\r\n      onGetMoreBtnClick\r\n    } = this.props.app;\r\n    if (pageType === \"slice\") {\r\n      // 截断多余评论,通过点击查看更多跳转\r\n      return (\r\n        <div className=\"comment-list-show-more\" onClick={onGetMoreBtnClick}>\r\n          <span>查看更多</span>\r\n        </div>\r\n      );\r\n    } else if (pageType === \"more\") {\r\n      if (!isNoMoreComment && list.length !== total) {\r\n        return (\r\n          <div\r\n            className=\"comment-list-show-more\"\r\n            onClick={() => {\r\n              sGetComment({ page: page + 1 });\r\n              onPageChange(page + 1);\r\n            }}\r\n          >\r\n            <span>{intl.get(\"comment.moreComment\")}</span>\r\n          </div>\r\n        );\r\n      } else {\r\n        return null;\r\n      }\r\n    } else if (pageType === \"pagination\") {\r\n      return (\r\n        <div className=\"comment-list-pagination\">\r\n          <Pagination\r\n            pageSize={limit}\r\n            current={page}\r\n            total={total}\r\n            onChange={p => {\r\n              sGetComment({ page: p });\r\n              onPageChange(p);\r\n            }}\r\n          />\r\n        </div>\r\n      );\r\n    }\r\n  }\r\n\r\n  render() {\r\n    const { list, total, loading } = this.props.app;\r\n\r\n    const spinning = Boolean(\r\n      loading.sGetComment || loading.sCommentFavor || loading.sReplyFavor\r\n    );\r\n    return (\r\n      <div>\r\n        <Spin spinning={spinning}>\r\n          {/* <div>共 {total} 条评论</div> */}\r\n          <div>{intl.get(\"comment.totalComment\", { total })}</div>\r\n          {list.map(item => (\r\n            <CommentBox content={item} key={item.id} commentId={item.id} />\r\n          ))}\r\n          {this.renderPagination()}\r\n        </Spin>\r\n      </div>\r\n    );\r\n  }\r\n}\r\n\r\nCommentList.propTypes = {};\r\n\r\nexport default Comment(CommentList);\r\n"]}

+ 23
- 10
lib/components/ContentItem/index.js View File

48
 
48
 
49
 var _relativeTime2 = _interopRequireDefault(_relativeTime);
49
 var _relativeTime2 = _interopRequireDefault(_relativeTime);
50
 
50
 
51
+var _reactIntlUniversal = require("react-intl-universal");
52
+
53
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
54
+
51
 var _Comment = require("../../Comment");
55
 var _Comment = require("../../Comment");
52
 
56
 
53
 var _Comment2 = _interopRequireDefault(_Comment);
57
 var _Comment2 = _interopRequireDefault(_Comment);
79
 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
83
 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
80
 
84
 
81
 function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
85
 function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
86
+// import 'dayjs/locale/es';
87
+
82
 
88
 
83
-_dayjs2.default.locale("zh-cn");
89
+// dayjs.locale("zh-cn");
84
 _dayjs2.default.extend(_relativeTime2.default);
90
 _dayjs2.default.extend(_relativeTime2.default);
85
 
91
 
92
+var LOCALES = {
93
+  "zh-CN": "zh-cn"
94
+};
95
+
86
 var CommentItem = function (_Component) {
96
 var CommentItem = function (_Component) {
87
   _inherits(CommentItem, _Component);
97
   _inherits(CommentItem, _Component);
88
 
98
 
159
           showReply = _props.showReply,
169
           showReply = _props.showReply,
160
           onShowReply = _props.onShowReply,
170
           onShowReply = _props.onShowReply,
161
           app = _props.app;
171
           app = _props.app;
172
+      var locale = this.props.app.locale;
162
       var showInput = this.state.showInput;
173
       var showInput = this.state.showInput;
163
 
174
 
164
 
175
 
201
             _react2.default.createElement(
212
             _react2.default.createElement(
202
               "strong",
213
               "strong",
203
               null,
214
               null,
204
-              content.user_name || "游客"
215
+              content.user_name || _reactIntlUniversal2.default.get("comment.tourist")
205
             ),
216
             ),
206
             _react2.default.createElement(
217
             _react2.default.createElement(
207
               "span",
218
               "span",
212
                   placement: "top",
223
                   placement: "top",
213
                   title: (0, _dayjs2.default)(content.created * 1000).format("YYYY-MM-DD HH:mm:ss")
224
                   title: (0, _dayjs2.default)(content.created * 1000).format("YYYY-MM-DD HH:mm:ss")
214
                 },
225
                 },
215
-                (0, _dayjs2.default)(content.created * 1000).fromNow()
226
+                LOCALES[locale] ? (0, _dayjs2.default)(content.created * 1000).locale(LOCALES[locale]).fromNow() : (0, _dayjs2.default)(content.created * 1000).fromNow()
216
               )
227
               )
217
             )
228
             )
218
           ),
229
           ),
274
               _react2.default.createElement(
285
               _react2.default.createElement(
275
                 "a",
286
                 "a",
276
                 { className: "comment-item-bottom-left", onClick: onShowReply },
287
                 { className: "comment-item-bottom-left", onClick: onShowReply },
277
-                content.reply_count,
278
-                " \u6761\u56DE\u590D",
288
+                _reactIntlUniversal2.default.get("reply.totalReply", { total: content.reply_count }),
279
                 showReply ? _react2.default.createElement(_icon2.default, { type: "up" }) : _react2.default.createElement(_icon2.default, { type: "down" })
289
                 showReply ? _react2.default.createElement(_icon2.default, { type: "up" }) : _react2.default.createElement(_icon2.default, { type: "down" })
280
               )
290
               )
281
             ) : null,
291
             ) : null,
282
             app.userId === content.user_id && _react2.default.createElement(
292
             app.userId === content.user_id && _react2.default.createElement(
283
               _popconfirm2.default,
293
               _popconfirm2.default,
284
               {
294
               {
285
-                title: "\u786E\u5B9A\u8981\u5220\u9664\u5417?",
295
+                // title="确定要删除吗?"
296
+                title: _reactIntlUniversal2.default.get("popConfirm.title"),
286
                 onConfirm: function onConfirm() {
297
                 onConfirm: function onConfirm() {
287
                   if (replyId) {
298
                   if (replyId) {
288
                     app.sDeleteReply(content.id, commentId);
299
                     app.sDeleteReply(content.id, commentId);
290
                   }
301
                   }
291
                   app.sDeleteComment(content.id);
302
                   app.sDeleteComment(content.id);
292
                 },
303
                 },
293
-                okText: "\u786E\u5B9A",
294
-                cancelText: "\u53D6\u6D88"
304
+                okText: _reactIntlUniversal2.default.get("popConfirm.ok"),
305
+                cancelText: _reactIntlUniversal2.default.get("popConfirm.cancel")
295
               },
306
               },
296
               _react2.default.createElement(
307
               _react2.default.createElement(
297
                 "a",
308
                 "a",
298
                 { className: "comment-item-bottom-right" },
309
                 { className: "comment-item-bottom-right" },
299
-                "\xA0 \u5220\u9664"
310
+                "\xA0 ",
311
+                _reactIntlUniversal2.default.get("popConfirm.delete")
300
               )
312
               )
301
             ),
313
             ),
302
             _react2.default.createElement(
314
             _react2.default.createElement(
305
                 onClick: this.handleToggleInput,
317
                 onClick: this.handleToggleInput,
306
                 className: "comment-item-bottom-right"
318
                 className: "comment-item-bottom-right"
307
               },
319
               },
308
-              "\xA0 \u56DE\u590D"
320
+              "\xA0 ",
321
+              _reactIntlUniversal2.default.get("comment.reply")
309
             ),
322
             ),
310
             _react2.default.createElement(
323
             _react2.default.createElement(
311
               "div",
324
               "div",

+ 1
- 1
lib/components/ContentItem/index.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
lib/components/Editor/Emoji.js.map View File

1
-{"version":3,"sources":["../../../src/components/Editor/Emoji.js"],"names":["Emoji","carousel","next","prev","onClick","props","content","curPage","i","length","push","emoji","node","map","page","index","item","value","prefixUrl","ext","title","display","React","Component"],"mappings":";;;;;;;;;;;;;;AAAA;;;;AAEA;;;;AACA;;;;;;;;;;AACA;AACA;;AAEA;;IAEMA,K;;;;;;;;;;;2BACG;AACL,UAAI,KAAKC,QAAT,EAAmB;AACjB,aAAKA,QAAL,CAAcC,IAAd;AACD;AACF;;;2BAEM;AACL,UAAI,KAAKD,QAAT,EAAmB;AACjB,aAAKA,QAAL,CAAcE,IAAd;AACD;AACF;;;6BAEQ;AAAA;;AAAA,UACCC,QADD,GACa,KAAKC,KADlB,CACCD,OADD;;AAEP,UAAME,UAAU,EAAhB;AACA,UAAIC,UAAU,EAAd;AACA,WAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAI,GAApB,EAAyBA,GAAzB,EAA8B;AAC5B,YAAID,QAAQE,MAAR,GAAiB,EAArB,EAAyB;AACvBF,kBAAQG,IAAR,CAAaC,gBAAMH,CAAN,CAAb;AACD,SAFD,MAEO;AACLF,kBAAQI,IAAR,CAAaH,OAAb;AACAA,oBAAU,EAAV;AACD;AACF;AACD,UAAIA,QAAQE,MAAR,GAAiB,CAArB,EAAwB;AACtBH,gBAAQI,IAAR,CAAaH,OAAb;AACD;AACD,aACE;AAAA;AAAA;AACE,eAAK,mBAAQ;AACX,mBAAKN,QAAL,GAAgBW,IAAhB;AACD;AAHH;AAKGN,gBAAQO,GAAR,CAAY,UAACC,IAAD,EAAOC,KAAP;AAAA,iBACX;AAAA;AAAA,cAAK,KAAKA,KAAV,EAAiB,WAAU,OAA3B;AACGD,iBAAKD,GAAL,CAAS,UAACG,IAAD,EAAOD,KAAP;AAAA,qBACR;AAAA;AAAA,kBAAK,WAAU,MAAf,EAAsB,KAAKC,KAAKC,KAAhC;AACE,wDAAM,WAAU,QAAhB,GADF;AAEE;AACE,4BAAQC,gBAAR,GAAoBF,KAAKC,KAAzB,SAAkCD,KAAKG,GADzC;AAEE,uBAAKH,KAAKI,KAFZ;AAGE,yBAAO,EAAEC,SAAS,cAAX,EAHT;AAIE,2BAAS;AAAA,2BAAMjB,SAAQY,KAAKI,KAAb,CAAN;AAAA;AAJX;AAFF,eADQ;AAAA,aAAT;AADH,WADW;AAAA,SAAZ;AALH,OADF;AAuBD;;;;EAnDiBE,gBAAMC,S;;kBAsDXvB,K","file":"Emoji.js","sourcesContent":["import React from \"react\";\nimport { Carousel } from \"antd\";\nimport emoji, { prefixUrl } from \"../../emoji\";\nimport \"./Emoji.css\";\n// 每页 20  5*4\n// 共 20 * 3 = 60 (实际是 54)\n\n// class Emoji\n\nclass Emoji extends React.Component {\n  next() {\n    if (this.carousel) {\n      this.carousel.next();\n    }\n  }\n\n  prev() {\n    if (this.carousel) {\n      this.carousel.prev();\n    }\n  }\n\n  render() {\n    const { onClick } = this.props;\n    const content = [];\n    let curPage = [];\n    for (let i = 0; i < 115; i++) {\n      if (curPage.length < 30) {\n        curPage.push(emoji[i]);\n      } else {\n        content.push(curPage);\n        curPage = [];\n      }\n    }\n    if (curPage.length > 0) {\n      content.push(curPage);\n    }\n    return (\n      <Carousel\n        ref={node => {\n          this.carousel = node;\n        }}\n      >\n        {content.map((page, index) => (\n          <div key={index} className=\"emoji\">\n            {page.map((item, index) => (\n              <div className=\"item\" key={item.value}>\n                <span className=\"helper\" />\n                <img\n                  src={`${prefixUrl}${item.value}.${item.ext}`}\n                  alt={item.title}\n                  style={{ display: \"inline-block\" }}\n                  onClick={() => onClick(item.title)}\n                />\n              </div>\n            ))}\n          </div>\n        ))}\n      </Carousel>\n    );\n  }\n}\n\nexport default Emoji;\n"]}
1
+{"version":3,"sources":["../../../src/components/Editor/Emoji.js"],"names":["Emoji","carousel","next","prev","onClick","props","content","curPage","i","length","push","emoji","node","map","page","index","item","value","prefixUrl","ext","title","display","React","Component"],"mappings":";;;;;;;;;;;;;;AAAA;;;;AAEA;;;;AACA;;;;;;;;;;AACA;AACA;;AAEA;;IAEMA,K;;;;;;;;;;;2BACG;AACL,UAAI,KAAKC,QAAT,EAAmB;AACjB,aAAKA,QAAL,CAAcC,IAAd;AACD;AACF;;;2BAEM;AACL,UAAI,KAAKD,QAAT,EAAmB;AACjB,aAAKA,QAAL,CAAcE,IAAd;AACD;AACF;;;6BAEQ;AAAA;;AAAA,UACCC,QADD,GACa,KAAKC,KADlB,CACCD,OADD;;AAEP,UAAME,UAAU,EAAhB;AACA,UAAIC,UAAU,EAAd;AACA,WAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAI,GAApB,EAAyBA,GAAzB,EAA8B;AAC5B,YAAID,QAAQE,MAAR,GAAiB,EAArB,EAAyB;AACvBF,kBAAQG,IAAR,CAAaC,gBAAMH,CAAN,CAAb;AACD,SAFD,MAEO;AACLF,kBAAQI,IAAR,CAAaH,OAAb;AACAA,oBAAU,EAAV;AACD;AACF;AACD,UAAIA,QAAQE,MAAR,GAAiB,CAArB,EAAwB;AACtBH,gBAAQI,IAAR,CAAaH,OAAb;AACD;AACD,aACE;AAAA;AAAA;AACE,eAAK,mBAAQ;AACX,mBAAKN,QAAL,GAAgBW,IAAhB;AACD;AAHH;AAKGN,gBAAQO,GAAR,CAAY,UAACC,IAAD,EAAOC,KAAP;AAAA,iBACX;AAAA;AAAA,cAAK,KAAKA,KAAV,EAAiB,WAAU,OAA3B;AACGD,iBAAKD,GAAL,CAAS,UAACG,IAAD,EAAOD,KAAP;AAAA,qBACR;AAAA;AAAA,kBAAK,WAAU,MAAf,EAAsB,KAAKC,KAAKC,KAAhC;AACE,wDAAM,WAAU,QAAhB,GADF;AAEE;AACE,4BAAQC,gBAAR,GAAoBF,KAAKC,KAAzB,SAAkCD,KAAKG,GADzC;AAEE,uBAAKH,KAAKI,KAFZ;AAGE,yBAAO,EAAEC,SAAS,cAAX,EAHT;AAIE,2BAAS;AAAA,2BAAMjB,SAAQY,KAAKI,KAAb,CAAN;AAAA;AAJX;AAFF,eADQ;AAAA,aAAT;AADH,WADW;AAAA,SAAZ;AALH,OADF;AAuBD;;;;EAnDiBE,gBAAMC,S;;kBAsDXvB,K","file":"Emoji.js","sourcesContent":["import React from \"react\";\r\nimport { Carousel } from \"antd\";\r\nimport emoji, { prefixUrl } from \"../../emoji\";\r\nimport \"./Emoji.css\";\r\n// 每页 20  5*4\r\n// 共 20 * 3 = 60 (实际是 54)\r\n\r\n// class Emoji\r\n\r\nclass Emoji extends React.Component {\r\n  next() {\r\n    if (this.carousel) {\r\n      this.carousel.next();\r\n    }\r\n  }\r\n\r\n  prev() {\r\n    if (this.carousel) {\r\n      this.carousel.prev();\r\n    }\r\n  }\r\n\r\n  render() {\r\n    const { onClick } = this.props;\r\n    const content = [];\r\n    let curPage = [];\r\n    for (let i = 0; i < 115; i++) {\r\n      if (curPage.length < 30) {\r\n        curPage.push(emoji[i]);\r\n      } else {\r\n        content.push(curPage);\r\n        curPage = [];\r\n      }\r\n    }\r\n    if (curPage.length > 0) {\r\n      content.push(curPage);\r\n    }\r\n    return (\r\n      <Carousel\r\n        ref={node => {\r\n          this.carousel = node;\r\n        }}\r\n      >\r\n        {content.map((page, index) => (\r\n          <div key={index} className=\"emoji\">\r\n            {page.map((item, index) => (\r\n              <div className=\"item\" key={item.value}>\r\n                <span className=\"helper\" />\r\n                <img\r\n                  src={`${prefixUrl}${item.value}.${item.ext}`}\r\n                  alt={item.title}\r\n                  style={{ display: \"inline-block\" }}\r\n                  onClick={() => onClick(item.title)}\r\n                />\r\n              </div>\r\n            ))}\r\n          </div>\r\n        ))}\r\n      </Carousel>\r\n    );\r\n  }\r\n}\r\n\r\nexport default Emoji;\r\n"]}

+ 5
- 1
lib/components/Editor/Upload.js View File

42
 
42
 
43
 var _shortid2 = _interopRequireDefault(_shortid);
43
 var _shortid2 = _interopRequireDefault(_shortid);
44
 
44
 
45
+var _reactIntlUniversal = require("react-intl-universal");
46
+
47
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
48
+
45
 var _constant = require("../../constant");
49
 var _constant = require("../../constant");
46
 
50
 
47
 var _Comment = require("../../Comment");
51
 var _Comment = require("../../Comment");
173
         _react2.default.createElement(
177
         _react2.default.createElement(
174
           "div",
178
           "div",
175
           { className: "ant-upload-text" },
179
           { className: "ant-upload-text" },
176
-          "\u4E0A\u4F20"
180
+          _reactIntlUniversal2.default.get("editor.uploadBtn")
177
         )
181
         )
178
       );
182
       );
179
       return _react2.default.createElement(
183
       return _react2.default.createElement(

+ 1
- 1
lib/components/Editor/Upload.js.map
File diff suppressed because it is too large
View File


+ 15
- 11
lib/components/Editor/index.js View File

48
 
48
 
49
 var _classnames2 = _interopRequireDefault(_classnames);
49
 var _classnames2 = _interopRequireDefault(_classnames);
50
 
50
 
51
+var _reactIntlUniversal = require("react-intl-universal");
52
+
53
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
54
+
51
 var _constant = require("../../constant");
55
 var _constant = require("../../constant");
52
 
56
 
53
 var _helper = require("../../helper");
57
 var _helper = require("../../helper");
218
           fileList = _state.fileList;
222
           fileList = _state.fileList;
219
 
223
 
220
       if (value.length > maxLength) {
224
       if (value.length > maxLength) {
221
-        _message3.default.error("\u5B57\u6570\u4E0D\u5F97\u8D85\u8FC7" + maxLength + "\u5B57");
225
+        // message.error(`字数不得超过${maxLength}字`);
226
+        _message3.default.error(_reactIntlUniversal2.default.get("editor.maxLength", { maxLength: maxLength }));
222
         return;
227
         return;
223
       }
228
       }
224
       var files = [];
229
       var files = [];
267
 
272
 
268
       var _props = this.props,
273
       var _props = this.props,
269
           value = _props.value,
274
           value = _props.value,
270
-          placeholder = _props.placeholder,
271
           rows = _props.rows,
275
           rows = _props.rows,
272
           showEmoji = _props.showEmoji,
276
           showEmoji = _props.showEmoji,
273
           showUpload = _props.showUpload,
277
           showUpload = _props.showUpload,
274
           closeUploadWhenBlur = _props.closeUploadWhenBlur,
278
           closeUploadWhenBlur = _props.closeUploadWhenBlur,
275
           maxUpload = _props.maxUpload,
279
           maxUpload = _props.maxUpload,
276
-          btnSubmitText = _props.btnSubmitText,
277
           btnLoading = _props.btnLoading,
280
           btnLoading = _props.btnLoading,
278
           btnDisabled = _props.btnDisabled,
281
           btnDisabled = _props.btnDisabled,
279
           button = _props.button,
282
           button = _props.button,
282
           maxLength = _props.maxLength,
285
           maxLength = _props.maxLength,
283
           autoFocus = _props.autoFocus;
286
           autoFocus = _props.autoFocus;
284
 
287
 
288
+      var placeholder = this.props.placeholder || _reactIntlUniversal2.default.get("editor.placeholder");
289
+      var btnSubmitText = this.props.placeholder || _reactIntlUniversal2.default.get("editor.SubmitBtn");
285
       var handleSubmit = this.handleSubmit;
290
       var handleSubmit = this.handleSubmit;
286
       var disabledSubmit = btnDisabled || !this.props.value && !this.state.value && !this.state.fileList.length;
291
       var disabledSubmit = btnDisabled || !this.props.value && !this.state.value && !this.state.fileList.length;
287
       var inputValue = value || this.state.value;
292
       var inputValue = value || this.state.value;
296
               "comment-editor-toolbar-error": inputValue.length > maxLength
301
               "comment-editor-toolbar-error": inputValue.length > maxLength
297
             })
302
             })
298
           },
303
           },
299
-          "\u5DF2\u8F93\u5165 ",
300
-          inputValue.length,
301
-          " / ",
302
-          maxLength,
303
-          " \u5B57"
304
+          _reactIntlUniversal2.default.get("editor.alreadyEntered", {
305
+            count: inputValue.length,
306
+            maxLength: maxLength
307
+          })
304
         ),
308
         ),
305
         _react2.default.createElement(
309
         _react2.default.createElement(
306
           "div",
310
           "div",
379
                     _react2.default.createElement(
383
                     _react2.default.createElement(
380
                       "span",
384
                       "span",
381
                       null,
385
                       null,
382
-                      "\u4E0A\u4F20\u56FE\u7247",
386
+                      _reactIntlUniversal2.default.get("editor.uploadTip"),
383
                       maxUpload >= 2 ? _react2.default.createElement(
387
                       maxUpload >= 2 ? _react2.default.createElement(
384
                         "span",
388
                         "span",
385
                         { style: { color: "#666", fontWeight: 400 } },
389
                         { style: { color: "#666", fontWeight: 400 } },
455
 
459
 
456
 Editor.defaultProps = {
460
 Editor.defaultProps = {
457
   rows: 5,
461
   rows: 5,
458
-  placeholder: "说点什么吧...",
462
+  // placeholder: "说点什么吧",
459
   showEmoji: true,
463
   showEmoji: true,
460
   showUpload: true,
464
   showUpload: true,
461
   closeUploadWhenBlur: false,
465
   closeUploadWhenBlur: false,
462
   maxUpload: 1,
466
   maxUpload: 1,
463
-  btnSubmitText: "发表",
467
+  // btnSubmitText: "发表",
464
   btnLoading: false,
468
   btnLoading: false,
465
   btnDisabled: false,
469
   btnDisabled: false,
466
   showError: true,
470
   showError: true,

+ 1
- 1
lib/components/Editor/index.js.map
File diff suppressed because it is too large
View File


+ 7
- 2
lib/components/ImagePreviewer/ImagePreviewer.js View File

26
 
26
 
27
 var _classnames2 = _interopRequireDefault(_classnames);
27
 var _classnames2 = _interopRequireDefault(_classnames);
28
 
28
 
29
+var _reactIntlUniversal = require("react-intl-universal");
30
+
31
+var _reactIntlUniversal2 = _interopRequireDefault(_reactIntlUniversal);
32
+
29
 require("./ImagePreviewer.less");
33
 require("./ImagePreviewer.less");
30
 
34
 
31
 var _helper = require("../../helper");
35
 var _helper = require("../../helper");
161
             "span",
165
             "span",
162
             { className: "button", onClick: onFold },
166
             { className: "button", onClick: onFold },
163
             _react2.default.createElement(_icon2.default, { type: "to-top" }),
167
             _react2.default.createElement(_icon2.default, { type: "to-top" }),
164
-            "\u6536\u8D77"
168
+            _reactIntlUniversal2.default.get("picture.collapse")
165
           ),
169
           ),
166
           _react2.default.createElement(
170
           _react2.default.createElement(
167
             "span",
171
             "span",
168
             { className: "button", onClick: this.onOrigin },
172
             { className: "button", onClick: this.onOrigin },
169
             _react2.default.createElement(_icon2.default, { type: "search" }),
173
             _react2.default.createElement(_icon2.default, { type: "search" }),
170
-            " \u67E5\u770B\u539F\u56FE"
174
+            " ",
175
+            _reactIntlUniversal2.default.get("picture.viewOriginal")
171
           )
176
           )
172
         ),
177
         ),
173
         _react2.default.createElement(
178
         _react2.default.createElement(

+ 1
- 1
lib/components/ImagePreviewer/ImagePreviewer.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
lib/components/RenderText/index.js.map View File

1
-{"version":3,"sources":["../../../src/components/RenderText/index.js"],"names":["App","__html","text"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,MAAM,SAANA,GAAM;AAAA,SACV;AACE,eAAU,sBADZ;AAEE,6BAAyB;AACvBC,cAAQ,2BAAcC,IAAd;AADe;AAF3B,IADU;AAAA,CAAZ;;kBASeF,G","file":"index.js","sourcesContent":["import React from \"react\";\nimport { renderContent } from \"../../helper\";\n\nconst App = text => (\n  <div\n    className=\"comment-item-content\"\n    dangerouslySetInnerHTML={{\n      __html: renderContent(text)\n    }}\n  />\n);\n\nexport default App;\n"]}
1
+{"version":3,"sources":["../../../src/components/RenderText/index.js"],"names":["App","__html","text"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,MAAM,SAANA,GAAM;AAAA,SACV;AACE,eAAU,sBADZ;AAEE,6BAAyB;AACvBC,cAAQ,2BAAcC,IAAd;AADe;AAF3B,IADU;AAAA,CAAZ;;kBASeF,G","file":"index.js","sourcesContent":["import React from \"react\";\r\nimport { renderContent } from \"../../helper\";\r\n\r\nconst App = text => (\r\n  <div\r\n    className=\"comment-item-content\"\r\n    dangerouslySetInnerHTML={{\r\n      __html: renderContent(text)\r\n    }}\r\n  />\r\n);\r\n\r\nexport default App;\r\n"]}

+ 1
- 1
lib/constant.js.map View File

1
-{"version":3,"sources":["../src/constant.js"],"names":["ERROR_DEFAULT","LIMIT","OSS_ENDPOINT","OSS_BUCKET","DRIVER_LICENSE_PATH","OSS_LINK","MAX_UPLOAD_NUMBER","URL_REGEXP","REGEXP","AVATAR","IMAGE_SPLIT","IMAGE_PROCESS","IMAGE_PROCESS_SMALL","IMAGE_PROCESS_LARGE","COMMENT_TYPE","COMMENT","REPLY"],"mappings":";;;;;AAAO,IAAMA,wCAAgB,MAAtB;;AAEA,IAAMC,wBAAQ,EAAd,C,CAAkB;;AAElB,IAAMC,sCAAe,6BAArB;AACA,IAAMC,kCAAa,eAAnB;AACA,IAAMC,oDAAsB,UAA5B;;AAEA,IAAMC,8BAAW,6CAAjB;;AAEA,IAAMC,gDAAoB,CAA1B;;AAEA,IAAMC,kCAAa,oGAAnB;;AAEA,IAAMC,0BAAS,eAAf;;AAEA,IAAMC,0BAAS,EAAf;;AAEA,IAAMC,oCAAc,aAApB;;AAEA,IAAMC,wCAAgB,mCAAtB;AACA,IAAMC,oDAAsB,mCAA5B;AACA,IAAMC,oDAAsB,mCAA5B;;AAEA,IAAMC,sCAAe;AAC1BC,WAAS,SADiB;AAE1BC,SAAO;AAFmB,CAArB","file":"constant.js","sourcesContent":["export const ERROR_DEFAULT = \"出错了!\";\n\nexport const LIMIT = 10; // 默认 limit\n\nexport const OSS_ENDPOINT = \"oss-cn-beijing.aliyuncs.com\";\nexport const OSS_BUCKET = \"links-comment\";\nexport const DRIVER_LICENSE_PATH = \"/comment\";\n\nexport const OSS_LINK = \"//links-comment.oss-cn-beijing.aliyuncs.com\";\n\nexport const MAX_UPLOAD_NUMBER = 4;\n\nexport const URL_REGEXP = /((http(s)?:)?\\/\\/)?(www\\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/g;\n\nexport const REGEXP = /\\[[^[\\]]+?\\]/g;\n\nexport const AVATAR = \"\";\n\nexport const IMAGE_SPLIT = \"IMAGE_SPLIT\";\n\nexport const IMAGE_PROCESS = \"?x-oss-process=image/resize,h_350\";\nexport const IMAGE_PROCESS_SMALL = \"?x-oss-process=image/resize,h_100\";\nexport const IMAGE_PROCESS_LARGE = \"?x-oss-process=image/resize,h_500\";\n\nexport const COMMENT_TYPE = {\n  COMMENT: \"comment\",\n  REPLY: \"reply\"\n};\n"]}
1
+{"version":3,"sources":["../src/constant.js"],"names":["ERROR_DEFAULT","LIMIT","OSS_ENDPOINT","OSS_BUCKET","DRIVER_LICENSE_PATH","OSS_LINK","MAX_UPLOAD_NUMBER","URL_REGEXP","REGEXP","AVATAR","IMAGE_SPLIT","IMAGE_PROCESS","IMAGE_PROCESS_SMALL","IMAGE_PROCESS_LARGE","COMMENT_TYPE","COMMENT","REPLY"],"mappings":";;;;;AAAO,IAAMA,wCAAgB,MAAtB;;AAEA,IAAMC,wBAAQ,EAAd,C,CAAkB;;AAElB,IAAMC,sCAAe,6BAArB;AACA,IAAMC,kCAAa,eAAnB;AACA,IAAMC,oDAAsB,UAA5B;;AAEA,IAAMC,8BAAW,6CAAjB;;AAEA,IAAMC,gDAAoB,CAA1B;;AAEA,IAAMC,kCAAa,oGAAnB;;AAEA,IAAMC,0BAAS,eAAf;;AAEA,IAAMC,0BAAS,EAAf;;AAEA,IAAMC,oCAAc,aAApB;;AAEA,IAAMC,wCAAgB,mCAAtB;AACA,IAAMC,oDAAsB,mCAA5B;AACA,IAAMC,oDAAsB,mCAA5B;;AAEA,IAAMC,sCAAe;AAC1BC,WAAS,SADiB;AAE1BC,SAAO;AAFmB,CAArB","file":"constant.js","sourcesContent":["export const ERROR_DEFAULT = \"出错了!\";\r\n\r\nexport const LIMIT = 10; // 默认 limit\r\n\r\nexport const OSS_ENDPOINT = \"oss-cn-beijing.aliyuncs.com\";\r\nexport const OSS_BUCKET = \"links-comment\";\r\nexport const DRIVER_LICENSE_PATH = \"/comment\";\r\n\r\nexport const OSS_LINK = \"//links-comment.oss-cn-beijing.aliyuncs.com\";\r\n\r\nexport const MAX_UPLOAD_NUMBER = 4;\r\n\r\nexport const URL_REGEXP = /((http(s)?:)?\\/\\/)?(www\\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/g;\r\n\r\nexport const REGEXP = /\\[[^[\\]]+?\\]/g;\r\n\r\nexport const AVATAR = \"\";\r\n\r\nexport const IMAGE_SPLIT = \"IMAGE_SPLIT\";\r\n\r\nexport const IMAGE_PROCESS = \"?x-oss-process=image/resize,h_350\";\r\nexport const IMAGE_PROCESS_SMALL = \"?x-oss-process=image/resize,h_100\";\r\nexport const IMAGE_PROCESS_LARGE = \"?x-oss-process=image/resize,h_500\";\r\n\r\nexport const COMMENT_TYPE = {\r\n  COMMENT: \"comment\",\r\n  REPLY: \"reply\"\r\n};\r\n"]}

+ 1
- 1
lib/helper.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
lib/index.example.js.map
File diff suppressed because it is too large
View File


+ 6
- 0
lib/index.js View File

65
 
65
 
66
 window.renderComment = renderComment;
66
 window.renderComment = renderComment;
67
 
67
 
68
+renderComment({
69
+  id: "root-comment",
70
+  type: 1,
71
+  businessId: "test"
72
+});
73
+
68
 // renderComment({
74
 // renderComment({
69
 //   id: "root-comment",
75
 //   id: "root-comment",
70
 //   type: 1,
76
 //   type: 1,

+ 1
- 1
lib/index.js.map View File

1
-{"version":3,"sources":["../src/index.js"],"names":["Index","props","renderComment","config","id","Error","type","businessId","console","warn","API","userId","ReactDOM","render","document","getElementById","window"],"mappings":";;;;AAAA;;;;AACA;;;;AACA;;;;;;AACA;;AAEA,IAAMA,QAAQ,SAARA,KAAQ;AAAA,SACZ;AAAC,iBAAD;AAAA,eAAK,sBAAL,EAAsB,oBAAtB,EAAqC,oBAArC,EAAoD,eAApD,IAAkEC,KAAlE;AACE,kCAAC,WAAD,IAAQ,WAAW,CAAnB,EAAsB,eAAtB;AADF,GADY;AAAA,CAAd;;AAMA;;;;;;;;AAQA,SAASC,aAAT,CAAuBC,MAAvB,EAA+B;AAC7B,MAAI,CAACA,OAAOC,EAAZ,EAAgB;AACd,UAAM,IAAIC,KAAJ,CAAU,gBAAV,CAAN;AACD;AACD,MAAI,CAACF,OAAOG,IAAZ,EAAkB;AAChB,UAAM,IAAID,KAAJ,CAAU,kBAAV,CAAN;AACD;AACD,MAAI,CAACF,OAAOI,UAAZ,EAAwB;AACtB;AACAC,YAAQC,IAAR,CAAa,+BAAb;AACD;AACD,MAAI,CAACN,OAAOO,GAAZ,EAAiB;AACf;AACAF,YAAQC,IAAR,CACE,sDADF;AAGD;AAhB4B,MAkB3BL,EAlB2B,GAuBzBD,MAvByB,CAkB3BC,EAlB2B;AAAA,qBAuBzBD,MAvByB,CAmB3BG,IAnB2B;AAAA,MAmB3BA,IAnB2B,gCAmBpB,CAnBoB;AAAA,2BAuBzBH,MAvByB,CAoB3BI,UApB2B;AAAA,MAoB3BA,UApB2B,sCAoBd,MApBc;AAAA,oBAuBzBJ,MAvByB,CAqB3BO,GArB2B;AAAA,MAqB3BA,GArB2B,+BAqBrB,oCArBqB;AAAA,MAsB3BC,MAtB2B,GAuBzBR,MAvByB,CAsB3BQ,MAtB2B;;;AAyB7BC,qBAASC,MAAT,CACE,8BAAC,KAAD,IAAO,MAAMP,IAAb,EAAmB,YAAYC,UAA/B,EAA2C,KAAKG,GAAhD,EAAqD,QAAQC,MAA7D,GADF,EAEEG,SAASC,cAAT,CAAwBX,EAAxB,CAFF;AAIA;AACD;;AAEDY,OAAOd,aAAP,GAAuBA,aAAvB;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":["import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App, { Editor } from \"./App\";\n// import registerServiceWorker from \"./registerServiceWorker\";\n\nconst Index = props => (\n  <App showAlertComment showAlertReply showAlertFavor showError {...props}>\n    <Editor maxUpload={9} autoFocus />\n  </App>\n);\n\n/**\n * 渲染评论组件\n * @param {object} config 编辑器配置\n *  - {string} id 渲染评论的DOM的 ID\n *  - {number} type 评论的 type\n *  - {string} businessId 评论的 businessId\n *  - {string} API, API 前缀, 默认 http://api.links123.net/comment/v1\n */\nfunction renderComment(config) {\n  if (!config.id) {\n    throw new Error(\"id is required\");\n  }\n  if (!config.type) {\n    throw new Error(\"type is required\");\n  }\n  if (!config.businessId) {\n    // throw new Error(\"businessId is required\");\n    console.warn(\"没有传入 businessId 参数,默认使用: test\");\n  }\n  if (!config.API) {\n    // throw new Error(\"API is required\");\n    console.warn(\n      \"没有传入 API 参数,默认使用: http://api.links123.net/comment/v1\"\n    );\n  }\n  const {\n    id,\n    type = 1,\n    businessId = \"test\",\n    API = \"http://api.links123.net/comment/v1\",\n    userId\n  } = config;\n\n  ReactDOM.render(\n    <Index type={type} businessId={businessId} API={API} userId={userId} />,\n    document.getElementById(id)\n  );\n  // registerServiceWorker();\n}\n\nwindow.renderComment = renderComment;\n\n// renderComment({\n//   id: \"root-comment\",\n//   type: 1,\n//   businessId: \"test\",\n//   API: 'http://api.links123.net/comment/v1',\n// });\n"]}
1
+{"version":3,"sources":["../src/index.js"],"names":["Index","props","renderComment","config","id","Error","type","businessId","console","warn","API","userId","ReactDOM","render","document","getElementById","window"],"mappings":";;;;AAAA;;;;AACA;;;;AACA;;;;;;AACA;;AAEA,IAAMA,QAAQ,SAARA,KAAQ;AAAA,SACZ;AAAC,iBAAD;AAAA,eAAK,sBAAL,EAAsB,oBAAtB,EAAqC,oBAArC,EAAoD,eAApD,IAAkEC,KAAlE;AACE,kCAAC,WAAD,IAAQ,WAAW,CAAnB,EAAsB,eAAtB;AADF,GADY;AAAA,CAAd;;AAMA;;;;;;;;AAQA,SAASC,aAAT,CAAuBC,MAAvB,EAA+B;AAC7B,MAAI,CAACA,OAAOC,EAAZ,EAAgB;AACd,UAAM,IAAIC,KAAJ,CAAU,gBAAV,CAAN;AACD;AACD,MAAI,CAACF,OAAOG,IAAZ,EAAkB;AAChB,UAAM,IAAID,KAAJ,CAAU,kBAAV,CAAN;AACD;AACD,MAAI,CAACF,OAAOI,UAAZ,EAAwB;AACtB;AACAC,YAAQC,IAAR,CAAa,+BAAb;AACD;AACD,MAAI,CAACN,OAAOO,GAAZ,EAAiB;AACf;AACAF,YAAQC,IAAR,CACE,sDADF;AAGD;AAhB4B,MAkB3BL,EAlB2B,GAuBzBD,MAvByB,CAkB3BC,EAlB2B;AAAA,qBAuBzBD,MAvByB,CAmB3BG,IAnB2B;AAAA,MAmB3BA,IAnB2B,gCAmBpB,CAnBoB;AAAA,2BAuBzBH,MAvByB,CAoB3BI,UApB2B;AAAA,MAoB3BA,UApB2B,sCAoBd,MApBc;AAAA,oBAuBzBJ,MAvByB,CAqB3BO,GArB2B;AAAA,MAqB3BA,GArB2B,+BAqBrB,oCArBqB;AAAA,MAsB3BC,MAtB2B,GAuBzBR,MAvByB,CAsB3BQ,MAtB2B;;;AAyB7BC,qBAASC,MAAT,CACE,8BAAC,KAAD,IAAO,MAAMP,IAAb,EAAmB,YAAYC,UAA/B,EAA2C,KAAKG,GAAhD,EAAqD,QAAQC,MAA7D,GADF,EAEEG,SAASC,cAAT,CAAwBX,EAAxB,CAFF;AAIA;AACD;;AAEDY,OAAOd,aAAP,GAAuBA,aAAvB;;AAEAA,cAAc;AACZE,MAAI,cADQ;AAEZE,QAAM,CAFM;AAGZC,cAAY;AAHA,CAAd;;AAMA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":["import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App, { Editor } from \"./App\";\r\n// import registerServiceWorker from \"./registerServiceWorker\";\r\n\r\nconst Index = props => (\r\n  <App showAlertComment showAlertReply showAlertFavor showError {...props}>\r\n    <Editor maxUpload={9} autoFocus />\r\n  </App>\r\n);\r\n\r\n/**\r\n * 渲染评论组件\r\n * @param {object} config 编辑器配置\r\n *  - {string} id 渲染评论的DOM的 ID\r\n *  - {number} type 评论的 type\r\n *  - {string} businessId 评论的 businessId\r\n *  - {string} API, API 前缀, 默认 http://api.links123.net/comment/v1\r\n */\r\nfunction renderComment(config) {\r\n  if (!config.id) {\r\n    throw new Error(\"id is required\");\r\n  }\r\n  if (!config.type) {\r\n    throw new Error(\"type is required\");\r\n  }\r\n  if (!config.businessId) {\r\n    // throw new Error(\"businessId is required\");\r\n    console.warn(\"没有传入 businessId 参数,默认使用: test\");\r\n  }\r\n  if (!config.API) {\r\n    // throw new Error(\"API is required\");\r\n    console.warn(\r\n      \"没有传入 API 参数,默认使用: http://api.links123.net/comment/v1\"\r\n    );\r\n  }\r\n  const {\r\n    id,\r\n    type = 1,\r\n    businessId = \"test\",\r\n    API = \"http://api.links123.net/comment/v1\",\r\n    userId\r\n  } = config;\r\n\r\n  ReactDOM.render(\r\n    <Index type={type} businessId={businessId} API={API} userId={userId} />,\r\n    document.getElementById(id)\r\n  );\r\n  // registerServiceWorker();\r\n}\r\n\r\nwindow.renderComment = renderComment;\r\n\r\nrenderComment({\r\n  id: \"root-comment\",\r\n  type: 1,\r\n  businessId: \"test\"\r\n});\r\n\r\n// renderComment({\r\n//   id: \"root-comment\",\r\n//   type: 1,\r\n//   businessId: \"test\",\r\n//   API: 'http://api.links123.net/comment/v1',\r\n// });\r\n"]}

+ 43
- 0
lib/lang/en-US.js View File

1
+"use strict";
2
+
3
+Object.defineProperty(exports, "__esModule", {
4
+  value: true
5
+});
6
+var USdata = {
7
+  "editor.alreadyEntered": "{count} words entered",
8
+  "editor.placeholder": "Say something",
9
+  "editor.maxLength": "Maximum {maxLength} words",
10
+  "editor.SubmitBtn": "Send",
11
+  "editor.uploadTip": "Upload pictures",
12
+  "editor.uploadCount": "(You could upload {count} more)",
13
+  "editor.uploadBtn": "Upload",
14
+
15
+  "comment.tourist": "Visitor",
16
+  "comment.totalComment": "Total {total, plural, =1 {one comment} other {# comments}}",
17
+  "comment.reply": "Reply",
18
+  "comment.moreComment": "More comments",
19
+
20
+  "reply.totalReply": "Total {total, plural, =1 {one reply} other {# replies}}",
21
+  "reply.moreReply": "More replies",
22
+  "reply.collapse": "Fold replies",
23
+
24
+  "picture.collapse": "Fold",
25
+  "picture.viewOriginal": "See the original",
26
+
27
+  "popConfirm.title": "Delete?",
28
+  "popConfirm.ok": "Confirm",
29
+  "popConfirm.cancel": "Cancel",
30
+  "popConfirm.delete": "Delete",
31
+
32
+  "message.noMoreComment": "No more comments",
33
+  "message.noMoreData": "No more data",
34
+  "message.notNull": "It's still empty",
35
+  "message.success": "Comments sent",
36
+  "message.replyNoNull": "It's still empty",
37
+  "message.replySuccess": "Reply sent",
38
+  "message.cancelLickSuccess": "Unliked",
39
+  "message.likeSuccess": "Liked"
40
+};
41
+
42
+exports.default = USdata;
43
+//# sourceMappingURL=en-US.js.map

+ 1
- 0
lib/lang/en-US.js.map View File

1
+{"version":3,"sources":["../../src/lang/en-US.js"],"names":["USdata"],"mappings":";;;;;AAAA,IAAMA,SAAS;AACb,2BAAyB,uBADZ;AAEb,wBAAsB,eAFT;AAGb,sBAAoB,2BAHP;AAIb,sBAAoB,MAJP;AAKb,sBAAoB,iBALP;AAMb,wBAAsB,iCANT;AAOb,sBAAoB,QAPP;;AASb,qBAAmB,SATN;AAUb,0BAAwB,4DAVX;AAWb,mBAAiB,OAXJ;AAYb,yBAAuB,eAZV;;AAcb,sBAAoB,yDAdP;AAeb,qBAAmB,cAfN;AAgBb,oBAAkB,cAhBL;;AAkBb,sBAAoB,MAlBP;AAmBb,0BAAwB,kBAnBX;;AAqBb,sBAAoB,SArBP;AAsBb,mBAAiB,SAtBJ;AAuBb,uBAAqB,QAvBR;AAwBb,uBAAqB,QAxBR;;AA0Bb,2BAAyB,kBA1BZ;AA2Bb,wBAAsB,cA3BT;AA4Bb,qBAAmB,kBA5BN;AA6Bb,qBAAmB,eA7BN;AA8Bb,yBAAuB,kBA9BV;AA+Bb,0BAAwB,YA/BX;AAgCb,+BAA6B,SAhChB;AAiCb,yBAAuB;AAjCV,CAAf;;kBAoCeA,M","file":"en-US.js","sourcesContent":["const USdata = {\r\n  \"editor.alreadyEntered\": \"{count} words entered\",\r\n  \"editor.placeholder\": \"Say something\",\r\n  \"editor.maxLength\": \"Maximum {maxLength} words\",\r\n  \"editor.SubmitBtn\": \"Send\",\r\n  \"editor.uploadTip\": \"Upload pictures\",\r\n  \"editor.uploadCount\": \"(You could upload {count} more)\",\r\n  \"editor.uploadBtn\": \"Upload\",\r\n\r\n  \"comment.tourist\": \"Visitor\",\r\n  \"comment.totalComment\": \"Total {total, plural, =1 {one comment} other {# comments}}\",\r\n  \"comment.reply\": \"Reply\",\r\n  \"comment.moreComment\": \"More comments\",\r\n\r\n  \"reply.totalReply\": \"Total {total, plural, =1 {one reply} other {# replies}}\",\r\n  \"reply.moreReply\": \"More replies\",\r\n  \"reply.collapse\": \"Fold replies\",\r\n\r\n  \"picture.collapse\": \"Fold\",\r\n  \"picture.viewOriginal\": \"See the original\",\r\n\r\n  \"popConfirm.title\": \"Delete?\",\r\n  \"popConfirm.ok\": \"Confirm\",\r\n  \"popConfirm.cancel\": \"Cancel\",\r\n  \"popConfirm.delete\": \"Delete\",\r\n\r\n  \"message.noMoreComment\": \"No more comments\",\r\n  \"message.noMoreData\": \"No more data\",\r\n  \"message.notNull\": \"It's still empty\",\r\n  \"message.success\": \"Comments sent\",\r\n  \"message.replyNoNull\": \"It's still empty\",\r\n  \"message.replySuccess\": \"Reply sent\",\r\n  \"message.cancelLickSuccess\": \"Unliked\",\r\n  \"message.likeSuccess\": \"Liked\"\r\n};\r\n\r\nexport default USdata;\r\n"]}

+ 37
- 15
lib/lang/index.js View File

3
 Object.defineProperty(exports, "__esModule", {
3
 Object.defineProperty(exports, "__esModule", {
4
   value: true
4
   value: true
5
 });
5
 });
6
-// 语言包
7
-// 英文短语和中文提示的对应
8
-var data = {
9
-  "not found": "没有数据",
10
-  "auth failed": "请先登录",
11
-  "create comment failed": "创建评论失败",
12
-  "comment favor failed": "评论点赞失败",
13
-  "delete comment favor failed": "评论取消点赞失败",
14
-  "get comments failed": "获取评论列表失败",
15
-  "create reply failed": "创建回复失败",
16
-  "reply favor failed": "回复点赞失败",
17
-  "delete reply favor failed": "删除回复点赞失败",
18
-  "get replies failed": "获取回复列表失败"
19
-};
6
+/**
7
+ * 当前支持的语言
8
+ */
9
+var SUPPORT_LOCALES = exports.SUPPORT_LOCALES = [{
10
+  name: "English",
11
+  value: "en-US"
12
+}, {
13
+  name: "简体中文",
14
+  value: "zh-CN"
15
+}];
20
 
16
 
21
-exports.default = data;
17
+// 服务端返回的英文短语和中文提示的对应
18
+var LOCALES_RESPONSE = exports.LOCALES_RESPONSE = {
19
+  "zh-CN": {
20
+    "not found": "没有数据",
21
+    "auth failed": "请先登录",
22
+    "create comment failed": "评论未发送",
23
+    "comment favor failed": "点赞失败",
24
+    "delete comment favor failed": "取消点赞失败",
25
+    "get comments failed": "评论加载失败",
26
+    "create reply failed": "回复失败",
27
+    "reply favor failed": "点赞失败",
28
+    "delete reply favor failed": "取消点赞失败",
29
+    "get replies failed": "回复加载失败"
30
+  },
31
+  "en-US": {
32
+    "not found": "No data",
33
+    "auth failed": "Please Login",
34
+    "create comment failed": "Comments not sent",
35
+    "comment favor failed": "Liking failed",
36
+    "delete comment favor failed": "Unliking failed",
37
+    "get comments failed": "Comments loading failed",
38
+    "create reply failed": "Replying failed",
39
+    "reply favor failed": "Liking failed",
40
+    "delete reply favor failed": "Unliking failed",
41
+    "get replies failed": "Loading of replies failed"
42
+  }
43
+};
22
 //# sourceMappingURL=index.js.map
44
 //# sourceMappingURL=index.js.map

+ 1
- 1
lib/lang/index.js.map View File

1
-{"version":3,"sources":["../../src/lang/index.js"],"names":["data"],"mappings":";;;;;AAAA;AACA;AACA,IAAMA,OAAO;AACX,eAAa,MADF;AAEX,iBAAe,MAFJ;AAGX,2BAAyB,QAHd;AAIX,0BAAwB,QAJb;AAKX,iCAA+B,UALpB;AAMX,yBAAuB,UANZ;AAOX,yBAAuB,QAPZ;AAQX,wBAAsB,QARX;AASX,+BAA6B,UATlB;AAUX,wBAAsB;AAVX,CAAb;;kBAaeA,I","file":"index.js","sourcesContent":["// 语言包\n// 英文短语和中文提示的对应\nconst data = {\n  \"not found\": \"没有数据\",\n  \"auth failed\": \"请先登录\",\n  \"create comment failed\": \"创建评论失败\",\n  \"comment favor failed\": \"评论点赞失败\",\n  \"delete comment favor failed\": \"评论取消点赞失败\",\n  \"get comments failed\": \"获取评论列表失败\",\n  \"create reply failed\": \"创建回复失败\",\n  \"reply favor failed\": \"回复点赞失败\",\n  \"delete reply favor failed\": \"删除回复点赞失败\",\n  \"get replies failed\": \"获取回复列表失败\"\n};\n\nexport default data;\n"]}
1
+{"version":3,"sources":["../../src/lang/index.js"],"names":["SUPPORT_LOCALES","name","value","LOCALES_RESPONSE"],"mappings":";;;;;AAAA;;;AAGO,IAAMA,4CAAkB,CAC7B;AACEC,QAAM,SADR;AAEEC,SAAO;AAFT,CAD6B,EAK7B;AACED,QAAM,MADR;AAEEC,SAAO;AAFT,CAL6B,CAAxB;;AAWP;AACO,IAAMC,8CAAmB;AAC9B,WAAS;AACP,iBAAa,MADN;AAEP,mBAAe,MAFR;AAGP,6BAAyB,OAHlB;AAIP,4BAAwB,MAJjB;AAKP,mCAA+B,QALxB;AAMP,2BAAuB,QANhB;AAOP,2BAAuB,MAPhB;AAQP,0BAAsB,MARf;AASP,iCAA6B,QATtB;AAUP,0BAAsB;AAVf,GADqB;AAa9B,WAAS;AACP,iBAAa,SADN;AAEP,mBAAe,cAFR;AAGP,6BAAyB,mBAHlB;AAIP,4BAAwB,eAJjB;AAKP,mCAA+B,iBALxB;AAMP,2BAAuB,yBANhB;AAOP,2BAAuB,iBAPhB;AAQP,0BAAsB,eARf;AASP,iCAA6B,iBATtB;AAUP,0BAAsB;AAVf;AAbqB,CAAzB","file":"index.js","sourcesContent":["/**\r\n * 当前支持的语言\r\n */\r\nexport const SUPPORT_LOCALES = [\r\n  {\r\n    name: \"English\",\r\n    value: \"en-US\"\r\n  },\r\n  {\r\n    name: \"简体中文\",\r\n    value: \"zh-CN\"\r\n  }\r\n];\r\n\r\n// 服务端返回的英文短语和中文提示的对应\r\nexport const LOCALES_RESPONSE = {\r\n  \"zh-CN\": {\r\n    \"not found\": \"没有数据\",\r\n    \"auth failed\": \"请先登录\",\r\n    \"create comment failed\": \"评论未发送\",\r\n    \"comment favor failed\": \"点赞失败\",\r\n    \"delete comment favor failed\": \"取消点赞失败\",\r\n    \"get comments failed\": \"评论加载失败\",\r\n    \"create reply failed\": \"回复失败\",\r\n    \"reply favor failed\": \"点赞失败\",\r\n    \"delete reply favor failed\": \"取消点赞失败\",\r\n    \"get replies failed\": \"回复加载失败\"\r\n  },\r\n  \"en-US\": {\r\n    \"not found\": \"No data\",\r\n    \"auth failed\": \"Please Login\",\r\n    \"create comment failed\": \"Comments not sent\",\r\n    \"comment favor failed\": \"Liking failed\",\r\n    \"delete comment favor failed\": \"Unliking failed\",\r\n    \"get comments failed\": \"Comments loading failed\",\r\n    \"create reply failed\": \"Replying failed\",\r\n    \"reply favor failed\": \"Liking failed\",\r\n    \"delete reply favor failed\": \"Unliking failed\",\r\n    \"get replies failed\": \"Loading of replies failed\"\r\n  }\r\n};\r\n"]}

+ 43
- 0
lib/lang/zh-CN.js View File

1
+"use strict";
2
+
3
+Object.defineProperty(exports, "__esModule", {
4
+  value: true
5
+});
6
+var CNdata = {
7
+  "editor.alreadyEntered": "已输入{count}/140字",
8
+  "editor.placeholder": "说点什么吧...",
9
+  "editor.maxLength": "字数上限{maxLength}",
10
+  "editor.SubmitBtn": "发送",
11
+  "editor.uploadTip": "上传图片",
12
+  "editor.uploadCount": "(您还能上传{count}张图片)",
13
+  "editor.uploadBtn": "上传",
14
+
15
+  "comment.tourist": "游客",
16
+  "comment.totalComment": "共{total}条评论",
17
+  "comment.reply": "回复",
18
+  "comment.moreComment": "更多评论",
19
+
20
+  "reply.totalReply": "共{total}条回复",
21
+  "reply.moreReply": "更多回复",
22
+  "reply.collapse": "收起回复",
23
+
24
+  "picture.collapse": "收起",
25
+  "picture.viewOriginal": "查看原图",
26
+
27
+  "popConfirm.title": "确定要删除吗",
28
+  "popConfirm.ok": "确定",
29
+  "popConfirm.cancel": "取消",
30
+  "popConfirm.delete": "删除",
31
+
32
+  "message.noMoreComment": "没有更多评论了",
33
+  "message.noMoreData": "没有更多数据了!",
34
+  "message.notNull": "没写内容呢",
35
+  "message.success": "评论已发送!",
36
+  "message.replyNoNull": "没写内容呢",
37
+  "message.replySuccess": "回复已发送!",
38
+  "message.cancelLickSuccess": "已取消点赞!",
39
+  "message.likeSuccess": "已赞!"
40
+};
41
+
42
+exports.default = CNdata;
43
+//# sourceMappingURL=zh-CN.js.map

+ 1
- 0
lib/lang/zh-CN.js.map View File

1
+{"version":3,"sources":["../../src/lang/zh-CN.js"],"names":["CNdata"],"mappings":";;;;;AAAA,IAAMA,SAAS;AACb,2BAAyB,iBADZ;AAEb,wBAAsB,UAFT;AAGb,sBAAoB,iBAHP;AAIb,sBAAoB,IAJP;AAKb,sBAAoB,MALP;AAMb,wBAAsB,mBANT;AAOb,sBAAoB,IAPP;;AASb,qBAAmB,IATN;AAUb,0BAAwB,aAVX;AAWb,mBAAiB,IAXJ;AAYb,yBAAuB,MAZV;;AAcb,sBAAoB,aAdP;AAeb,qBAAmB,MAfN;AAgBb,oBAAkB,MAhBL;;AAkBb,sBAAoB,IAlBP;AAmBb,0BAAwB,MAnBX;;AAqBb,sBAAoB,QArBP;AAsBb,mBAAiB,IAtBJ;AAuBb,uBAAqB,IAvBR;AAwBb,uBAAqB,IAxBR;;AA0Bb,2BAAyB,SA1BZ;AA2Bb,wBAAsB,UA3BT;AA4Bb,qBAAmB,OA5BN;AA6Bb,qBAAmB,QA7BN;AA8Bb,yBAAuB,OA9BV;AA+Bb,0BAAwB,QA/BX;AAgCb,+BAA6B,QAhChB;AAiCb,yBAAuB;AAjCV,CAAf;;kBAoCeA,M","file":"zh-CN.js","sourcesContent":["const CNdata = {\r\n  \"editor.alreadyEntered\": \"已输入{count}/140字\",\r\n  \"editor.placeholder\": \"说点什么吧...\",\r\n  \"editor.maxLength\": \"字数上限{maxLength}\",\r\n  \"editor.SubmitBtn\": \"发送\",\r\n  \"editor.uploadTip\": \"上传图片\",\r\n  \"editor.uploadCount\": \"(您还能上传{count}张图片)\",\r\n  \"editor.uploadBtn\": \"上传\",\r\n\r\n  \"comment.tourist\": \"游客\",\r\n  \"comment.totalComment\": \"共{total}条评论\",\r\n  \"comment.reply\": \"回复\",\r\n  \"comment.moreComment\": \"更多评论\",\r\n\r\n  \"reply.totalReply\": \"共{total}条回复\",\r\n  \"reply.moreReply\": \"更多回复\",\r\n  \"reply.collapse\": \"收起回复\",\r\n\r\n  \"picture.collapse\": \"收起\",\r\n  \"picture.viewOriginal\": \"查看原图\",\r\n\r\n  \"popConfirm.title\": \"确定要删除吗\",\r\n  \"popConfirm.ok\": \"确定\",\r\n  \"popConfirm.cancel\": \"取消\",\r\n  \"popConfirm.delete\": \"删除\",\r\n\r\n  \"message.noMoreComment\": \"没有更多评论了\",\r\n  \"message.noMoreData\": \"没有更多数据了!\",\r\n  \"message.notNull\": \"没写内容呢\",\r\n  \"message.success\": \"评论已发送!\",\r\n  \"message.replyNoNull\": \"没写内容呢\",\r\n  \"message.replySuccess\": \"回复已发送!\",\r\n  \"message.cancelLickSuccess\": \"已取消点赞!\",\r\n  \"message.likeSuccess\": \"已赞!\"\r\n};\r\n\r\nexport default CNdata;\r\n"]}

+ 0
- 72
lib/mock.js View File

1
-'use strict';
2
-
3
-Object.defineProperty(exports, "__esModule", {
4
-  value: true
5
-});
6
-var comments = exports.comments = {
7
-  list: [{
8
-    id: '5b3a4f0973df3e6a32b0a9d2',
9
-    user_id: 0,
10
-    user_name: '',
11
-    user_avatar: '',
12
-    content: 'test[微笑]',
13
-    replies: [{
14
-      id: '5b3c58c473df3e64d8d53afb',
15
-      user_id: 0,
16
-      user_name: '',
17
-      user_avatar: '',
18
-      reply: null,
19
-      content: 'test',
20
-      favor_count: 1,
21
-      favored: false,
22
-      created: 1530681540
23
-    }, {
24
-      id: '5b3c58c473df3e64d8d53afa',
25
-      user_id: 0,
26
-      user_name: '',
27
-      user_avatar: '',
28
-      reply: {
29
-        id: '5b3c58c473df3e64d8d53afb',
30
-        user_id: 0,
31
-        user_name: '',
32
-        user_avatar: '',
33
-        reply: null,
34
-        content: 'test',
35
-        favor_count: 1,
36
-        favored: false,
37
-        created: 1530681540
38
-      },
39
-      content: 'test',
40
-      favor_count: 2,
41
-      favored: false,
42
-      created: 1530681540
43
-    }, {
44
-      id: '5b3c6e4873df3e53f870d912',
45
-      user_id: 0,
46
-      user_name: '',
47
-      user_avatar: '',
48
-      reply: {
49
-        id: '5b3c58c473df3e64d8d53afb',
50
-        user_id: 0,
51
-        user_name: '',
52
-        user_avatar: '',
53
-        reply: null,
54
-        content: 'test',
55
-        favor_count: 1,
56
-        favored: false,
57
-        created: 1530681540
58
-      },
59
-      content: 'test',
60
-      favor_count: 0,
61
-      favored: false,
62
-      created: 1530687048
63
-    }],
64
-    reply_count: 4,
65
-    favor_count: 0,
66
-    favored: false,
67
-    created: 1530547977
68
-  }],
69
-  total: 1,
70
-  page: 1
71
-};
72
-//# sourceMappingURL=mock.js.map

+ 0
- 1
lib/mock.js.map View File

1
-{"version":3,"sources":["../src/mock.js"],"names":["comments","list","id","user_id","user_name","user_avatar","content","replies","reply","favor_count","favored","created","reply_count","total","page"],"mappings":";;;;;AAAO,IAAMA,8BAAW;AACtBC,QAAM,CACJ;AACEC,QAAI,0BADN;AAEEC,aAAS,CAFX;AAGEC,eAAW,EAHb;AAIEC,iBAAa,EAJf;AAKEC,aAAS,UALX;AAMEC,aAAS,CACP;AACEL,UAAI,0BADN;AAEEC,eAAS,CAFX;AAGEC,iBAAW,EAHb;AAIEC,mBAAa,EAJf;AAKEG,aAAO,IALT;AAMEF,eAAS,MANX;AAOEG,mBAAa,CAPf;AAQEC,eAAS,KARX;AASEC,eAAS;AATX,KADO,EAYP;AACET,UAAI,0BADN;AAEEC,eAAS,CAFX;AAGEC,iBAAW,EAHb;AAIEC,mBAAa,EAJf;AAKEG,aAAO;AACLN,YAAI,0BADC;AAELC,iBAAS,CAFJ;AAGLC,mBAAW,EAHN;AAILC,qBAAa,EAJR;AAKLG,eAAO,IALF;AAMLF,iBAAS,MANJ;AAOLG,qBAAa,CAPR;AAQLC,iBAAS,KARJ;AASLC,iBAAS;AATJ,OALT;AAgBEL,eAAS,MAhBX;AAiBEG,mBAAa,CAjBf;AAkBEC,eAAS,KAlBX;AAmBEC,eAAS;AAnBX,KAZO,EAiCP;AACET,UAAI,0BADN;AAEEC,eAAS,CAFX;AAGEC,iBAAW,EAHb;AAIEC,mBAAa,EAJf;AAKEG,aAAO;AACLN,YAAI,0BADC;AAELC,iBAAS,CAFJ;AAGLC,mBAAW,EAHN;AAILC,qBAAa,EAJR;AAKLG,eAAO,IALF;AAMLF,iBAAS,MANJ;AAOLG,qBAAa,CAPR;AAQLC,iBAAS,KARJ;AASLC,iBAAS;AATJ,OALT;AAgBEL,eAAS,MAhBX;AAiBEG,mBAAa,CAjBf;AAkBEC,eAAS,KAlBX;AAmBEC,eAAS;AAnBX,KAjCO,CANX;AA6DEC,iBAAa,CA7Df;AA8DEH,iBAAa,CA9Df;AA+DEC,aAAS,KA/DX;AAgEEC,aAAS;AAhEX,GADI,CADgB;AAqEtBE,SAAO,CArEe;AAsEtBC,QAAM;AAtEgB,CAAjB","file":"mock.js","sourcesContent":["export const comments = {\n  list: [\n    {\n      id: '5b3a4f0973df3e6a32b0a9d2',\n      user_id: 0,\n      user_name: '',\n      user_avatar: '',\n      content: 'test[微笑]',\n      replies: [\n        {\n          id: '5b3c58c473df3e64d8d53afb',\n          user_id: 0,\n          user_name: '',\n          user_avatar: '',\n          reply: null,\n          content: 'test',\n          favor_count: 1,\n          favored: false,\n          created: 1530681540,\n        },\n        {\n          id: '5b3c58c473df3e64d8d53afa',\n          user_id: 0,\n          user_name: '',\n          user_avatar: '',\n          reply: {\n            id: '5b3c58c473df3e64d8d53afb',\n            user_id: 0,\n            user_name: '',\n            user_avatar: '',\n            reply: null,\n            content: 'test',\n            favor_count: 1,\n            favored: false,\n            created: 1530681540,\n          },\n          content: 'test',\n          favor_count: 2,\n          favored: false,\n          created: 1530681540,\n        },\n        {\n          id: '5b3c6e4873df3e53f870d912',\n          user_id: 0,\n          user_name: '',\n          user_avatar: '',\n          reply: {\n            id: '5b3c58c473df3e64d8d53afb',\n            user_id: 0,\n            user_name: '',\n            user_avatar: '',\n            reply: null,\n            content: 'test',\n            favor_count: 1,\n            favored: false,\n            created: 1530681540,\n          },\n          content: 'test',\n          favor_count: 0,\n          favored: false,\n          created: 1530687048,\n        },\n      ],\n      reply_count: 4,\n      favor_count: 0,\n      favored: false,\n      created: 1530547977,\n    },\n  ],\n  total: 1,\n  page: 1,\n};\n"]}

+ 1
- 1
lib/registerServiceWorker.js.map
File diff suppressed because it is too large
View File


+ 2
- 1
package.json View File

1
 {
1
 {
2
   "name": "comment",
2
   "name": "comment",
3
-  "version": "0.5.14",
3
+  "version": "1.0.0",
4
   "main": "lib/App.js",
4
   "main": "lib/App.js",
5
   "description": "通用评论",
5
   "description": "通用评论",
6
   "keywords": [
6
   "keywords": [
20
     "prop-types": "^15.6.2",
20
     "prop-types": "^15.6.2",
21
     "react": "^16.4.1",
21
     "react": "^16.4.1",
22
     "react-dom": "^16.4.1",
22
     "react-dom": "^16.4.1",
23
+    "react-intl-universal": "^1.15.2",
23
     "react-scripts": "1.1.4",
24
     "react-scripts": "1.1.4",
24
     "shortid": "^2.2.11"
25
     "shortid": "^2.2.11"
25
   },
26
   },

+ 21
- 0
public/locales/en-US.json View File

1
+{
2
+  "editor.alreadyEntered": "已输入{count}/140字",
3
+  "editor.placeholder": "say...",
4
+  "editor.SubmitBtn": "Submit",
5
+  "editor.uploadTip": "上传图片",
6
+  "editor.uploadCount": "(您还能上传{count}张图片)",
7
+  "editor.uploadBtn": "upload",
8
+
9
+  "comment.totalComment": "共{total}条评论",
10
+  "comment.reply": "reply",
11
+  "comment.moreComment": "More",
12
+
13
+  "reply.totalReply": "{total}条回复",
14
+  "reply.moreReply": "More",
15
+  "reply.collapse": "收起回复",
16
+
17
+  "popConfirm.title": "Sure?",
18
+  "popConfirm.ok": "Ok",
19
+  "popConfirm.cancel": "Cancel",
20
+  "popConfirm.delete": "Delete"
21
+}

+ 21
- 0
public/locales/zh-CN.json View File

1
+{
2
+  "editor.alreadyEntered": "已输入{count}/140字",
3
+  "editor.placeholder": "说点什么吧...",
4
+  "editor.SubmitBtn": "发表",
5
+  "editor.uploadTip": "上传图片",
6
+  "editor.uploadCount": "(您还能上传{count}张图片)",
7
+  "editor.uploadBtn": "上传",
8
+
9
+  "comment.totalComment": "共{total}条评论",
10
+  "comment.reply": "回复",
11
+  "comment.moreComment": "查看更多评论",
12
+
13
+  "reply.totalReply": "{total}条回复",
14
+  "reply.moreReply": "查看更多回复",
15
+  "reply.collapse": "收起回复",
16
+
17
+  "popConfirm.title": "确定要删除吗",
18
+  "popConfirm.ok": "确定",
19
+  "popConfirm.cancel": "取消",
20
+  "popConfirm.delete": "删除"
21
+}

+ 78
- 27
src/App.js View File

2
 import PropTypes from "prop-types";
2
 import PropTypes from "prop-types";
3
 import { message } from "antd";
3
 import { message } from "antd";
4
 import axios from "axios";
4
 import axios from "axios";
5
+import intl from "react-intl-universal";
5
 import { ERROR_DEFAULT, LIMIT, COMMENT_TYPE } from "./constant";
6
 import { ERROR_DEFAULT, LIMIT, COMMENT_TYPE } from "./constant";
6
 import { CommentContext } from "./Comment";
7
 import { CommentContext } from "./Comment";
7
 import { isFunction } from "./helper";
8
 import { isFunction } from "./helper";
9
 import CommentList from "./components/CommentList";
10
 import CommentList from "./components/CommentList";
10
 import Editor from "./components/Editor";
11
 import Editor from "./components/Editor";
11
 import RenderText from "./components/RenderText";
12
 import RenderText from "./components/RenderText";
12
-import lang from "./lang";
13
+import { SUPPORT_LOCALES, LOCALES_RESPONSE } from "./lang";
14
+import USdata from "./lang/en-US.js";
15
+import CNdata from "./lang/zh-CN.js";
13
 import "./App.css";
16
 import "./App.css";
14
-// import styles from "./App.module.css";
17
+
18
+const LOCALES = {
19
+  "zh-CN": CNdata,
20
+  "en-US": USdata
21
+};
15
 
22
 
16
 class App extends Component {
23
 class App extends Component {
17
   constructor(props) {
24
   constructor(props) {
27
       page: 1,
34
       page: 1,
28
       total: 0,
35
       total: 0,
29
       // 是否没有更多评论了
36
       // 是否没有更多评论了
30
-      isNoMoreComment: false
37
+      isNoMoreComment: false,
38
+      initDone: false,
39
+      locale: "zh-CN"
31
     };
40
     };
32
     this.handleChangeLoading = this.handleChangeLoading.bind(this);
41
     this.handleChangeLoading = this.handleChangeLoading.bind(this);
33
     this.sCreateComment = this.sCreateComment.bind(this);
42
     this.sCreateComment = this.sCreateComment.bind(this);
52
     }
61
     }
53
   }
62
   }
54
 
63
 
55
-  componentDidMount() {}
64
+  componentDidMount() {
65
+    this.loadLocales();
66
+  }
67
+
68
+  /**
69
+   * 加载语言包
70
+   * 只能根据url或者传入的props来确定加载哪个语言包
71
+   * 优先级:传入的props > url
72
+   */
73
+  loadLocales() {
74
+    let { locales: currentLocale } = this.props;
75
+    if (!currentLocale) {
76
+      currentLocale = intl.determineLocale({
77
+        urlLocaleKey: "lang"
78
+      });
79
+    }
80
+    currentLocale = SUPPORT_LOCALES.find(item => item.value === currentLocale)
81
+      ? currentLocale
82
+      : "zh-CN";
83
+    intl
84
+      .init({
85
+        currentLocale,
86
+        locales: {
87
+          [currentLocale]: LOCALES[currentLocale]
88
+        }
89
+      })
90
+      .then(() => {
91
+        this.setState({ initDone: true, locale: currentLocale });
92
+      });
93
+  }
56
 
94
 
57
   error(msg, info = {}) {
95
   error(msg, info = {}) {
58
     if (this.props.showError) {
96
     if (this.props.showError) {
64
   }
102
   }
65
 
103
 
66
   errorHandler(error) {
104
   errorHandler(error) {
105
+    const { locale } = this.state;
106
+    const localResponse = LOCALES_RESPONSE[locale];
67
     if (error.response && error.response.data && error.response.data.msg) {
107
     if (error.response && error.response.data && error.response.data.msg) {
68
-      this.error(lang[error.response.data.msg] || ERROR_DEFAULT, {
108
+      this.error(localResponse[error.response.data.msg] || ERROR_DEFAULT, {
69
         response: error.response
109
         response: error.response
70
       });
110
       });
71
       return;
111
       return;
72
     }
112
     }
73
-    this.error(lang[error.message] || ERROR_DEFAULT, {
113
+    this.error(localResponse[error.response.data.msg] || ERROR_DEFAULT, {
74
       response: error.response
114
       response: error.response
75
     });
115
     });
76
   }
116
   }
119
             total
159
             total
120
           });
160
           });
121
         } else {
161
         } else {
122
-          message.info("没有更多评论了");
162
+          message.info(intl.get("message.noMoreComment"));
123
           this.setState({
163
           this.setState({
124
             isNoMoreComment: true
164
             isNoMoreComment: true
125
           });
165
           });
141
       .get(`${API}/replies?comment_id=${commentId}&page=${page}&limit=${limit}`)
181
       .get(`${API}/replies?comment_id=${commentId}&page=${page}&limit=${limit}`)
142
       .then(response => {
182
       .then(response => {
143
         if (!response.data.list) {
183
         if (!response.data.list) {
144
-          message.info("没有更多数据了!");
184
+          message.info(intl.get("message.noMoreData"));
145
         }
185
         }
146
         const list = this.state.list.map(item => {
186
         const list = this.state.list.map(item => {
147
           if (item.id === commentId) {
187
           if (item.id === commentId) {
178
    * @param {object} {content} comment content
218
    * @param {object} {content} comment content
179
    */
219
    */
180
   sCreateComment({ content } = {}, cb) {
220
   sCreateComment({ content } = {}, cb) {
181
-    if (!content) return this.error("评论内容不能为空 ");
221
+    if (!content) return this.error(intl.get("message.notNull"));
182
     this.handleChangeLoading("sCreateComment", true);
222
     this.handleChangeLoading("sCreateComment", true);
183
     const { API, type, businessId } = this.props;
223
     const { API, type, businessId } = this.props;
184
     this.axios(`${API}/comments`, {
224
     this.axios(`${API}/comments`, {
192
     })
232
     })
193
       .then(response => {
233
       .then(response => {
194
         if (this.props.showAlertComment) {
234
         if (this.props.showAlertComment) {
195
-          message.success("评论成功!");
235
+          message.success(intl.get("message.success"));
196
         }
236
         }
197
         if (isFunction(cb)) cb();
237
         if (isFunction(cb)) cb();
198
         // 将数据写入到 list 中
238
         // 将数据写入到 list 中
239
    * @param {object} data { comment_id, content, [reply_id] }
279
    * @param {object} data { comment_id, content, [reply_id] }
240
    */
280
    */
241
   sCreateReply(data, cb) {
281
   sCreateReply(data, cb) {
242
-    if (!data.content) return this.error("回复内容不能为空 ");
282
+    if (!data.content) return this.error(intl.get("message.replyNoNull"));
243
     this.handleChangeLoading("sCreateReply", true);
283
     this.handleChangeLoading("sCreateReply", true);
244
     const { API } = this.props;
284
     const { API } = this.props;
245
     this.axios(`${API}/replies`, {
285
     this.axios(`${API}/replies`, {
249
     })
289
     })
250
       .then(response => {
290
       .then(response => {
251
         if (this.props.showAlertReply) {
291
         if (this.props.showAlertReply) {
252
-          message.success("回复成功!");
292
+          message.success(intl.get("message.replySuccess"));
253
         }
293
         }
254
         if (isFunction(cb)) cb();
294
         if (isFunction(cb)) cb();
255
         // 将数据写入到 list 中
295
         // 将数据写入到 list 中
318
     })
358
     })
319
       .then(response => {
359
       .then(response => {
320
         if (this.props.showAlertFavor) {
360
         if (this.props.showAlertFavor) {
321
-          message.success(favored ? "取消点赞成功!" : "点赞成功!");
361
+          message.success(
362
+            favored
363
+              ? intl.get("message.cancelLickSuccess")
364
+              : intl.get("message.likeSuccess")
365
+          );
322
         }
366
         }
323
         // 更新 list 中的该项数据的 favored
367
         // 更新 list 中的该项数据的 favored
324
         const list = this.state.list.map(item => {
368
         const list = this.state.list.map(item => {
353
       withCredentials: true
397
       withCredentials: true
354
     })
398
     })
355
       .then(response => {
399
       .then(response => {
356
-        message.success(favored ? "取消点赞成功!" : "点赞成功!");
400
+        message.success(
401
+          favored
402
+            ? intl.get("message.cancelLickSuccess")
403
+            : intl.get("message.likeSuccess")
404
+        );
357
         // 更新 list 中的该项数据的 favored
405
         // 更新 list 中的该项数据的 favored
358
         const list = this.state.list.map(item => {
406
         const list = this.state.list.map(item => {
359
           if (item.id === commentId) {
407
           if (item.id === commentId) {
412
     };
460
     };
413
 
461
 
414
     return (
462
     return (
415
-      <CommentContext.Provider value={value}>
416
-        <div className="comment">
417
-          {this.props.showEditor && (
418
-            <CommentInput content={this.props.children} />
419
-          )}
420
-          {this.props.showList && (
421
-            <div style={{ marginTop: 20 }}>
422
-              <CommentList />
423
-            </div>
424
-          )}
425
-        </div>
426
-      </CommentContext.Provider>
463
+      this.state.initDone && (
464
+        <CommentContext.Provider value={value}>
465
+          <div className="comment">
466
+            {this.props.showEditor && (
467
+              <CommentInput content={this.props.children} />
468
+            )}
469
+            {this.props.showList && (
470
+              <div style={{ marginTop: 20 }}>
471
+                <CommentList />
472
+              </div>
473
+            )}
474
+          </div>
475
+        </CommentContext.Provider>
476
+      )
427
     );
477
     );
428
   }
478
   }
429
 }
479
 }
445
   limit: PropTypes.number, // 一次加载评论数量
495
   limit: PropTypes.number, // 一次加载评论数量
446
   onPageChange: PropTypes.func, // 页码变化回调
496
   onPageChange: PropTypes.func, // 页码变化回调
447
   onGetMoreBtnClick: PropTypes.func, // 点击查看更多按钮回调
497
   onGetMoreBtnClick: PropTypes.func, // 点击查看更多按钮回调
448
-  onDelete: PropTypes.func
498
+  onDelete: PropTypes.func,
499
+  locales: PropTypes.string //  传入的语言环境, en-US/zh-CN
449
 };
500
 };
450
 
501
 
451
 App.defaultProps = {
502
 App.defaultProps = {

+ 10
- 10
src/components/CommentBox/index.js View File

1
 import React, { Component } from "react";
1
 import React, { Component } from "react";
2
 import PropTypes from "prop-types";
2
 import PropTypes from "prop-types";
3
 import { Icon } from "antd";
3
 import { Icon } from "antd";
4
+import intl from "react-intl-universal";
4
 import Comment from "../../Comment";
5
 import Comment from "../../Comment";
5
 import ContentItem from "./../ContentItem";
6
 import ContentItem from "./../ContentItem";
6
 import "./index.css";
7
 import "./index.css";
60
                   action="replyToReply" // 回复的回复
61
                   action="replyToReply" // 回复的回复
61
                 />,
62
                 />,
62
                 <div className="comment-more-box" key="show_more_button">
63
                 <div className="comment-more-box" key="show_more_button">
63
-                  {!isNoMoreReply &&
64
-                    replyCount !== len && (
65
-                      <span
66
-                        className="comment-show-more"
67
-                        onClick={() => this.handleGetMoreReply(commentId)}
68
-                      >
69
-                        查看更多回复
70
-                      </span>
71
-                    )}
64
+                  {!isNoMoreReply && replyCount !== len && (
65
+                    <span
66
+                      className="comment-show-more"
67
+                      onClick={() => this.handleGetMoreReply(commentId)}
68
+                    >
69
+                      {intl.get("reply.moreReply")}
70
+                    </span>
71
+                  )}
72
 
72
 
73
                   <a
73
                   <a
74
                     style={{ float: "right" }}
74
                     style={{ float: "right" }}
75
                     onClick={this.handleToggleReply}
75
                     onClick={this.handleToggleReply}
76
                   >
76
                   >
77
-                    <Icon type="up" /> 收起回复
77
+                    <Icon type="up" /> {intl.get("reply.collapse")}
78
                   </a>
78
                   </a>
79
                 </div>
79
                 </div>
80
               ];
80
               ];

+ 4
- 2
src/components/CommentList/index.js View File

1
 import React, { Component } from "react";
1
 import React, { Component } from "react";
2
 import { Spin, Pagination } from "antd";
2
 import { Spin, Pagination } from "antd";
3
+import intl from "react-intl-universal";
3
 import Comment from "../../Comment";
4
 import Comment from "../../Comment";
4
 import CommentBox from "../CommentBox";
5
 import CommentBox from "../CommentBox";
5
 import "./index.css";
6
 import "./index.css";
43
               onPageChange(page + 1);
44
               onPageChange(page + 1);
44
             }}
45
             }}
45
           >
46
           >
46
-            <span>查看更多评论</span>
47
+            <span>{intl.get("comment.moreComment")}</span>
47
           </div>
48
           </div>
48
         );
49
         );
49
       } else {
50
       } else {
75
     return (
76
     return (
76
       <div>
77
       <div>
77
         <Spin spinning={spinning}>
78
         <Spin spinning={spinning}>
78
-          <div>共 {total} 条评论</div>
79
+          {/* <div>共 {total} 条评论</div> */}
80
+          <div>{intl.get("comment.totalComment", { total })}</div>
79
           {list.map(item => (
81
           {list.map(item => (
80
             <CommentBox content={item} key={item.id} commentId={item.id} />
82
             <CommentBox content={item} key={item.id} commentId={item.id} />
81
           ))}
83
           ))}

+ 67
- 53
src/components/ContentItem/index.js View File

3
 import { Avatar, Icon, Tooltip, Popconfirm } from "antd";
3
 import { Avatar, Icon, Tooltip, Popconfirm } from "antd";
4
 import dayjs from "dayjs";
4
 import dayjs from "dayjs";
5
 import "dayjs/locale/zh-cn";
5
 import "dayjs/locale/zh-cn";
6
+// import 'dayjs/locale/es';
6
 import relativeTime from "dayjs/plugin/relativeTime";
7
 import relativeTime from "dayjs/plugin/relativeTime";
8
+import intl from "react-intl-universal";
7
 import Comment from "../../Comment";
9
 import Comment from "../../Comment";
8
 import CommentInput from "../CommentInput";
10
 import CommentInput from "../CommentInput";
9
 import avatar from "../../avatar";
11
 import avatar from "../../avatar";
12
 import "./index.css";
14
 import "./index.css";
13
 import ImagePreviewer from "../ImagePreviewer/ImagePreviewer";
15
 import ImagePreviewer from "../ImagePreviewer/ImagePreviewer";
14
 
16
 
15
-dayjs.locale("zh-cn");
17
+// dayjs.locale("zh-cn");
16
 dayjs.extend(relativeTime);
18
 dayjs.extend(relativeTime);
17
 
19
 
20
+const LOCALES = {
21
+  "zh-CN": "zh-cn"
22
+};
23
+
18
 class CommentItem extends Component {
24
 class CommentItem extends Component {
19
   constructor(props) {
25
   constructor(props) {
20
     super(props);
26
     super(props);
78
       app
84
       app
79
     } = this.props;
85
     } = this.props;
80
 
86
 
87
+    const { locale } = this.props.app;
81
     const { showInput } = this.state;
88
     const { showInput } = this.state;
82
 
89
 
83
     let newContent = content.content;
90
     let newContent = content.content;
115
             {/* <a href={`/${content.user_id}`}>
122
             {/* <a href={`/${content.user_id}`}>
116
               {content.user_name || "暂无昵称"}
123
               {content.user_name || "暂无昵称"}
117
             </a> */}
124
             </a> */}
118
-            <strong>{content.user_name || "游客"}</strong>
125
+            <strong>{content.user_name || intl.get("comment.tourist")}</strong>
119
             <span style={{ marginLeft: 10 }}>
126
             <span style={{ marginLeft: 10 }}>
120
               <Tooltip
127
               <Tooltip
121
                 placement="top"
128
                 placement="top"
123
                   "YYYY-MM-DD HH:mm:ss"
130
                   "YYYY-MM-DD HH:mm:ss"
124
                 )}
131
                 )}
125
               >
132
               >
126
-                {dayjs(content.created * 1000).fromNow()}
133
+                {LOCALES[locale]
134
+                  ? dayjs(content.created * 1000)
135
+                      .locale(LOCALES[locale])
136
+                      .fromNow()
137
+                  : dayjs(content.created * 1000).fromNow()}
127
               </Tooltip>
138
               </Tooltip>
128
             </span>
139
             </span>
129
           </div>
140
           </div>
136
             }}
147
             }}
137
           />
148
           />
138
           {// image为空时不渲染comment-item-image
149
           {// image为空时不渲染comment-item-image
139
-          imageList.length > 0 &&
140
-            imageList[0] !== "" && (
141
-              <div className="comment-item-image">
142
-                {!this.state.showPreviewer &&
143
-                  imgs.map((item, index) => {
144
-                    if (item.type === "divider") {
145
-                      return (
146
-                        <div className="comment-item-image-wrapper" key={index}>
147
-                          <div className="comment-img-divider" />
148
-                          {/* <img src={item} alt={item} className="comment-img" /> */}
149
-                        </div>
150
-                      );
151
-                    }
150
+          imageList.length > 0 && imageList[0] !== "" && (
151
+            <div className="comment-item-image">
152
+              {!this.state.showPreviewer &&
153
+                imgs.map((item, index) => {
154
+                  if (item.type === "divider") {
152
                     return (
155
                     return (
153
-                      <div
154
-                        className="comment-item-image-wrapper"
155
-                        key={index}
156
-                        onClick={() => {
157
-                          let i = index;
158
-                          if (needClear) {
159
-                            if (index > 3) {
160
-                              i -= 1;
161
-                            }
162
-                            if (index > 7) {
163
-                              i -= 1;
164
-                            }
165
-                          }
166
-                          this.showPreviewer(i);
167
-                        }}
168
-                      >
169
-                        <div
170
-                          style={{ backgroundImage: `url(${item})` }}
171
-                          className="comment-img-thumbnail"
172
-                        />
156
+                      <div className="comment-item-image-wrapper" key={index}>
157
+                        <div className="comment-img-divider" />
173
                         {/* <img src={item} alt={item} className="comment-img" /> */}
158
                         {/* <img src={item} alt={item} className="comment-img" /> */}
174
                       </div>
159
                       </div>
175
                     );
160
                     );
176
-                  })}
177
-                {this.state.showPreviewer && (
178
-                  <ImagePreviewer
179
-                    list={imageList}
180
-                    index={this.state.previewerIndex}
181
-                    onFold={this.hidePreviewer}
182
-                  />
183
-                )}
184
-                <div className="clearfix" />
185
-              </div>
186
-            )}
161
+                  }
162
+                  return (
163
+                    <div
164
+                      className="comment-item-image-wrapper"
165
+                      key={index}
166
+                      onClick={() => {
167
+                        let i = index;
168
+                        if (needClear) {
169
+                          if (index > 3) {
170
+                            i -= 1;
171
+                          }
172
+                          if (index > 7) {
173
+                            i -= 1;
174
+                          }
175
+                        }
176
+                        this.showPreviewer(i);
177
+                      }}
178
+                    >
179
+                      <div
180
+                        style={{ backgroundImage: `url(${item})` }}
181
+                        className="comment-img-thumbnail"
182
+                      />
183
+                      {/* <img src={item} alt={item} className="comment-img" /> */}
184
+                    </div>
185
+                  );
186
+                })}
187
+              {this.state.showPreviewer && (
188
+                <ImagePreviewer
189
+                  list={imageList}
190
+                  index={this.state.previewerIndex}
191
+                  onFold={this.hidePreviewer}
192
+                />
193
+              )}
194
+              <div className="clearfix" />
195
+            </div>
196
+          )}
187
           <div className="comment-item-bottom">
197
           <div className="comment-item-bottom">
188
             {content.reply_count ? (
198
             {content.reply_count ? (
189
               <div>
199
               <div>
190
                 <a className="comment-item-bottom-left" onClick={onShowReply}>
200
                 <a className="comment-item-bottom-left" onClick={onShowReply}>
191
-                  {content.reply_count} 条回复
201
+                  {/* {content.reply_count} 条回复 */}
202
+                  {intl.get("reply.totalReply", { total: content.reply_count })}
192
                   {showReply ? <Icon type="up" /> : <Icon type="down" />}
203
                   {showReply ? <Icon type="up" /> : <Icon type="down" />}
193
                 </a>
204
                 </a>
194
               </div>
205
               </div>
195
             ) : null}
206
             ) : null}
196
             {app.userId === content.user_id && (
207
             {app.userId === content.user_id && (
197
               <Popconfirm
208
               <Popconfirm
198
-                title="确定要删除吗?"
209
+                // title="确定要删除吗?"
210
+                title={intl.get("popConfirm.title")}
199
                 onConfirm={() => {
211
                 onConfirm={() => {
200
                   if (replyId) {
212
                   if (replyId) {
201
                     app.sDeleteReply(content.id, commentId);
213
                     app.sDeleteReply(content.id, commentId);
203
                   }
215
                   }
204
                   app.sDeleteComment(content.id);
216
                   app.sDeleteComment(content.id);
205
                 }}
217
                 }}
206
-                okText="确定"
207
-                cancelText="取消"
218
+                okText={intl.get("popConfirm.ok")}
219
+                cancelText={intl.get("popConfirm.cancel")}
208
               >
220
               >
209
-                <a className="comment-item-bottom-right">&nbsp; 删除</a>
221
+                <a className="comment-item-bottom-right">
222
+                  &nbsp; {intl.get("popConfirm.delete")}
223
+                </a>
210
               </Popconfirm>
224
               </Popconfirm>
211
             )}
225
             )}
212
             <a
226
             <a
213
               onClick={this.handleToggleInput}
227
               onClick={this.handleToggleInput}
214
               className="comment-item-bottom-right"
228
               className="comment-item-bottom-right"
215
             >
229
             >
216
-              &nbsp; 回复
230
+              &nbsp; {intl.get("comment.reply")}
217
             </a>
231
             </a>
218
             <div
232
             <div
219
               className="comment-item-bottom-right"
233
               className="comment-item-bottom-right"

+ 2
- 1
src/components/Editor/Upload.js View File

2
 import { Upload, Icon, Modal, message } from "antd";
2
 import { Upload, Icon, Modal, message } from "antd";
3
 import dayjs from "dayjs";
3
 import dayjs from "dayjs";
4
 import shortid from "shortid";
4
 import shortid from "shortid";
5
+import intl from "react-intl-universal";
5
 import {
6
 import {
6
   OSS_ENDPOINT,
7
   OSS_ENDPOINT,
7
   OSS_BUCKET,
8
   OSS_BUCKET,
106
     const uploadButton = (
107
     const uploadButton = (
107
       <div>
108
       <div>
108
         <Icon type="plus" />
109
         <Icon type="plus" />
109
-        <div className="ant-upload-text">上传</div>
110
+        <div className="ant-upload-text">{intl.get("editor.uploadBtn")}</div>
110
       </div>
111
       </div>
111
     );
112
     );
112
     return (
113
     return (

+ 15
- 7
src/components/Editor/index.js View File

2
 import PropTypes from "prop-types";
2
 import PropTypes from "prop-types";
3
 import { Icon, Button, Popover, Input, message } from "antd";
3
 import { Icon, Button, Popover, Input, message } from "antd";
4
 import classnames from "classnames";
4
 import classnames from "classnames";
5
+import intl from "react-intl-universal";
5
 import { OSS_LINK } from "../../constant";
6
 import { OSS_LINK } from "../../constant";
6
 import { isFunction } from "../../helper";
7
 import { isFunction } from "../../helper";
7
 import Upload from "./Upload";
8
 import Upload from "./Upload";
119
     const { maxLength } = this.props;
120
     const { maxLength } = this.props;
120
     let { value, fileMap, fileList } = this.state;
121
     let { value, fileMap, fileList } = this.state;
121
     if (value.length > maxLength) {
122
     if (value.length > maxLength) {
122
-      message.error(`字数不得超过${maxLength}字`);
123
+      // message.error(`字数不得超过${maxLength}字`);
124
+      message.error(intl.get("editor.maxLength", { maxLength }));
123
       return;
125
       return;
124
     }
126
     }
125
     const files = [];
127
     const files = [];
166
   render() {
168
   render() {
167
     const {
169
     const {
168
       value,
170
       value,
169
-      placeholder,
171
+      // placeholder,
170
       rows,
172
       rows,
171
       showEmoji,
173
       showEmoji,
172
       showUpload,
174
       showUpload,
173
       closeUploadWhenBlur,
175
       closeUploadWhenBlur,
174
       maxUpload,
176
       maxUpload,
175
-      btnSubmitText,
177
+      // btnSubmitText,
176
       btnLoading,
178
       btnLoading,
177
       btnDisabled,
179
       btnDisabled,
178
       button,
180
       button,
181
       maxLength,
183
       maxLength,
182
       autoFocus
184
       autoFocus
183
     } = this.props;
185
     } = this.props;
186
+    let placeholder = this.props.placeholder || intl.get("editor.placeholder");
187
+    let btnSubmitText = this.props.placeholder || intl.get("editor.SubmitBtn");
184
     const handleSubmit = this.handleSubmit;
188
     const handleSubmit = this.handleSubmit;
185
     const disabledSubmit =
189
     const disabledSubmit =
186
       btnDisabled ||
190
       btnDisabled ||
194
             "comment-editor-toolbar-error": inputValue.length > maxLength
198
             "comment-editor-toolbar-error": inputValue.length > maxLength
195
           })}
199
           })}
196
         >
200
         >
197
-          已输入 {inputValue.length} / {maxLength} 字
201
+          {intl.get("editor.alreadyEntered", {
202
+            count: inputValue.length,
203
+            maxLength
204
+          })}
205
+          {/* 已输入 {inputValue.length} / {maxLength} 字 */}
198
         </div>
206
         </div>
199
         <div className="comment-editor">
207
         <div className="comment-editor">
200
           <TextArea
208
           <TextArea
269
                   title={
277
                   title={
270
                     <div style={{ margin: "5px auto" }}>
278
                     <div style={{ margin: "5px auto" }}>
271
                       <span>
279
                       <span>
272
-                        上传图片
280
+                        {intl.get("editor.uploadTip")}
273
                         {maxUpload >= 2 ? (
281
                         {maxUpload >= 2 ? (
274
                           <span style={{ color: "#666", fontWeight: 400 }}>
282
                           <span style={{ color: "#666", fontWeight: 400 }}>
275
                             (您还能上传
283
                             (您还能上传
354
 
362
 
355
 Editor.defaultProps = {
363
 Editor.defaultProps = {
356
   rows: 5,
364
   rows: 5,
357
-  placeholder: "说点什么吧...",
365
+  // placeholder: "说点什么吧",
358
   showEmoji: true,
366
   showEmoji: true,
359
   showUpload: true,
367
   showUpload: true,
360
   closeUploadWhenBlur: false,
368
   closeUploadWhenBlur: false,
361
   maxUpload: 1,
369
   maxUpload: 1,
362
-  btnSubmitText: "发表",
370
+  // btnSubmitText: "发表",
363
   btnLoading: false,
371
   btnLoading: false,
364
   btnDisabled: false,
372
   btnDisabled: false,
365
   showError: true,
373
   showError: true,

+ 3
- 2
src/components/ImagePreviewer/ImagePreviewer.jsx View File

1
 import React from "react";
1
 import React from "react";
2
 import classnames from "classnames";
2
 import classnames from "classnames";
3
 import { Icon, Spin } from "antd";
3
 import { Icon, Spin } from "antd";
4
+import intl from "react-intl-universal";
4
 
5
 
5
 import "./ImagePreviewer.less";
6
 import "./ImagePreviewer.less";
6
 // import "./ImagePreviewer.css";
7
 // import "./ImagePreviewer.css";
104
         <div className="toolbar">
105
         <div className="toolbar">
105
           <span className="button" onClick={onFold}>
106
           <span className="button" onClick={onFold}>
106
             <Icon type="to-top" />
107
             <Icon type="to-top" />
107
-            收起
108
+            {intl.get("picture.collapse")}
108
           </span>
109
           </span>
109
           <span className="button" onClick={this.onOrigin}>
110
           <span className="button" onClick={this.onOrigin}>
110
-            <Icon type="search" /> 查看原图
111
+            <Icon type="search" /> {intl.get("picture.viewOriginal")}
111
           </span>
112
           </span>
112
           {/* <span className="button" onClick={this.rotateRight}>
113
           {/* <span className="button" onClick={this.rotateRight}>
113
                         <Icon type="reload" /> 向右旋转
114
                         <Icon type="reload" /> 向右旋转

+ 6
- 0
src/index.js View File

43
 
43
 
44
 window.renderComment = renderComment;
44
 window.renderComment = renderComment;
45
 
45
 
46
+renderComment({
47
+  id: "root-comment",
48
+  type: 1,
49
+  businessId: "test"
50
+});
51
+
46
 // renderComment({
52
 // renderComment({
47
 //   id: "root-comment",
53
 //   id: "root-comment",
48
 //   type: 1,
54
 //   type: 1,

+ 38
- 0
src/lang/en-US.js View File

1
+const USdata = {
2
+  "editor.alreadyEntered": "{count} words entered",
3
+  "editor.placeholder": "Say something",
4
+  "editor.maxLength": "Maximum {maxLength} words",
5
+  "editor.SubmitBtn": "Send",
6
+  "editor.uploadTip": "Upload pictures",
7
+  "editor.uploadCount": "(You could upload {count} more)",
8
+  "editor.uploadBtn": "Upload",
9
+
10
+  "comment.tourist": "Visitor",
11
+  "comment.totalComment":
12
+    "Total {total, plural, =1 {one comment} other {# comments}}",
13
+  "comment.reply": "Reply",
14
+  "comment.moreComment": "More comments",
15
+
16
+  "reply.totalReply": "Total {total, plural, =1 {one reply} other {# replies}}",
17
+  "reply.moreReply": "More replies",
18
+  "reply.collapse": "Fold replies",
19
+
20
+  "picture.collapse": "Fold",
21
+  "picture.viewOriginal": "See the original",
22
+
23
+  "popConfirm.title": "Delete?",
24
+  "popConfirm.ok": "Confirm",
25
+  "popConfirm.cancel": "Cancel",
26
+  "popConfirm.delete": "Delete",
27
+
28
+  "message.noMoreComment": "No more comments",
29
+  "message.noMoreData": "No more data",
30
+  "message.notNull": "It's still empty",
31
+  "message.success": "Comments sent",
32
+  "message.replyNoNull": "It's still empty",
33
+  "message.replySuccess": "Reply sent",
34
+  "message.cancelLickSuccess": "Unliked",
35
+  "message.likeSuccess": "Liked"
36
+};
37
+
38
+export default USdata;

+ 40
- 15
src/lang/index.js View File

1
-// 语言包
2
-// 英文短语和中文提示的对应
3
-const data = {
4
-  "not found": "没有数据",
5
-  "auth failed": "请先登录",
6
-  "create comment failed": "创建评论失败",
7
-  "comment favor failed": "评论点赞失败",
8
-  "delete comment favor failed": "评论取消点赞失败",
9
-  "get comments failed": "获取评论列表失败",
10
-  "create reply failed": "创建回复失败",
11
-  "reply favor failed": "回复点赞失败",
12
-  "delete reply favor failed": "删除回复点赞失败",
13
-  "get replies failed": "获取回复列表失败"
14
-};
1
+/**
2
+ * 当前支持的语言
3
+ */
4
+export const SUPPORT_LOCALES = [
5
+  {
6
+    name: "English",
7
+    value: "en-US"
8
+  },
9
+  {
10
+    name: "简体中文",
11
+    value: "zh-CN"
12
+  }
13
+];
15
 
14
 
16
-export default data;
15
+// 服务端返回的英文短语和中文提示的对应
16
+export const LOCALES_RESPONSE = {
17
+  "zh-CN": {
18
+    "not found": "没有数据",
19
+    "auth failed": "请先登录",
20
+    "create comment failed": "评论未发送",
21
+    "comment favor failed": "点赞失败",
22
+    "delete comment favor failed": "取消点赞失败",
23
+    "get comments failed": "评论加载失败",
24
+    "create reply failed": "回复失败",
25
+    "reply favor failed": "点赞失败",
26
+    "delete reply favor failed": "取消点赞失败",
27
+    "get replies failed": "回复加载失败"
28
+  },
29
+  "en-US": {
30
+    "not found": "No data",
31
+    "auth failed": "Please Login",
32
+    "create comment failed": "Comments not sent",
33
+    "comment favor failed": "Liking failed",
34
+    "delete comment favor failed": "Unliking failed",
35
+    "get comments failed": "Comments loading failed",
36
+    "create reply failed": "Replying failed",
37
+    "reply favor failed": "Liking failed",
38
+    "delete reply favor failed": "Unliking failed",
39
+    "get replies failed": "Loading of replies failed"
40
+  }
41
+};

+ 37
- 0
src/lang/zh-CN.js View File

1
+const CNdata = {
2
+  "editor.alreadyEntered": "已输入{count}/140字",
3
+  "editor.placeholder": "说点什么吧...",
4
+  "editor.maxLength": "字数上限{maxLength}",
5
+  "editor.SubmitBtn": "发送",
6
+  "editor.uploadTip": "上传图片",
7
+  "editor.uploadCount": "(您还能上传{count}张图片)",
8
+  "editor.uploadBtn": "上传",
9
+
10
+  "comment.tourist": "游客",
11
+  "comment.totalComment": "共{total}条评论",
12
+  "comment.reply": "回复",
13
+  "comment.moreComment": "更多评论",
14
+
15
+  "reply.totalReply": "共{total}条回复",
16
+  "reply.moreReply": "更多回复",
17
+  "reply.collapse": "收起回复",
18
+
19
+  "picture.collapse": "收起",
20
+  "picture.viewOriginal": "查看原图",
21
+
22
+  "popConfirm.title": "确定要删除吗",
23
+  "popConfirm.ok": "确定",
24
+  "popConfirm.cancel": "取消",
25
+  "popConfirm.delete": "删除",
26
+
27
+  "message.noMoreComment": "没有更多评论了",
28
+  "message.noMoreData": "没有更多数据了!",
29
+  "message.notNull": "没写内容呢",
30
+  "message.success": "评论已发送!",
31
+  "message.replyNoNull": "没写内容呢",
32
+  "message.replySuccess": "回复已发送!",
33
+  "message.cancelLickSuccess": "已取消点赞!",
34
+  "message.likeSuccess": "已赞!"
35
+};
36
+
37
+export default CNdata;