summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app.js2
-rw-r--r--docs/configuration-config-file.md1
-rw-r--r--docs/configuration-env-vars.md1
-rw-r--r--lib/config/default.js2
-rw-r--r--lib/config/environment.js1
-rw-r--r--lib/models/user.js3
-rw-r--r--lib/web/middleware/tooBusy.js4
-rw-r--r--locales/vi.json121
-rw-r--r--public/css/extra.css8
-rw-r--r--public/views/index/body.ejs1
10 files changed, 143 insertions, 1 deletions
diff --git a/app.js b/app.js
index ceb22596..fdaa4eb1 100644
--- a/app.js
+++ b/app.js
@@ -113,7 +113,7 @@ if (config.csp.enable) {
}
i18n.configure({
- locales: ['en', 'zh-CN', 'zh-TW', 'fr', 'de', 'ja', 'es', 'ca', 'el', 'pt', 'it', 'tr', 'ru', 'nl', 'hr', 'pl', 'uk', 'hi', 'sv', 'eo', 'da', 'ko', 'id', 'sr'],
+ locales: ['en', 'zh-CN', 'zh-TW', 'fr', 'de', 'ja', 'es', 'ca', 'el', 'pt', 'it', 'tr', 'ru', 'nl', 'hr', 'pl', 'uk', 'hi', 'sv', 'eo', 'da', 'ko', 'id', 'sr', 'vi'],
cookie: 'locale',
indent: ' ', // this is the style poeditor.com exports it, this creates less churn
directory: path.join(__dirname, '/locales'),
diff --git a/docs/configuration-config-file.md b/docs/configuration-config-file.md
index cbc6534d..b233cebe 100644
--- a/docs/configuration-config-file.md
+++ b/docs/configuration-config-file.md
@@ -32,6 +32,7 @@ to `config.json` before filling in your own details.
| `imageUploadType` | `imgur`, `s3`, `minio`, `azure`, `lutim` or `filesystem`(default) | Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) or [Minio](guides/minio-image-upload.md)|
| `sourceURL` | `https://github.com/codimd/server/tree/<current commit>` | Provides the link to the source code of CodiMD on the entry page (Please, make sure you change this when you run a modified version) |
| `staticCacheTime` | `1 * 24 * 60 * 60 * 1000` | static file cache time |
+| `tooBusyLag` | `70` | CPU time for one eventloop tick until node throttles connections. (milliseconds) |
| `heartbeatInterval` | `5000` | socket.io heartbeat interval |
| `heartbeatTimeout` | `10000` | socket.io heartbeat timeout |
| `documentMaxLength` | `100000` | note max length |
diff --git a/docs/configuration-env-vars.md b/docs/configuration-env-vars.md
index ba635cde..bc0eac99 100644
--- a/docs/configuration-env-vars.md
+++ b/docs/configuration-env-vars.md
@@ -35,6 +35,7 @@ defaultNotePath can't be set from env-vars
| `CMD_FORBIDDEN_NOTE_IDS` | `'robots.txt'` | disallow creation of notes, even if `CMD_ALLOW_FREEURL` is `true` |
| `CMD_IMAGE_UPLOAD_TYPE` | `imgur`, `s3`, `minio`, `lutim` or `filesystem` | Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) or [Minio](guides/minio-image-upload.md), also there's a whole section on their respective env vars below. |
| `CMD_SOURCE_URL` | `https://github.com/codimd/server/tree/<current commit>` | Provides the link to the source code of CodiMD on the entry page (Please, make sure you change this when you run a modified version) |
+| `CMD_TOOBUSY_LAG` | `70` | CPU time for one eventloop tick until node throttles connections. (milliseconds) |
## CodiMD Location
diff --git a/lib/config/default.js b/lib/config/default.js
index c87beda3..12254d47 100644
--- a/lib/config/default.js
+++ b/lib/config/default.js
@@ -56,6 +56,8 @@ module.exports = {
// socket.io
heartbeatInterval: 5000,
heartbeatTimeout: 10000,
+ // too busy timeout
+ tooBusyLag: 70,
// document
documentMaxLength: 100000,
// image upload setting, available options are imgur/s3/filesystem/azure/lutim
diff --git a/lib/config/environment.js b/lib/config/environment.js
index 508c1ba6..0a709745 100644
--- a/lib/config/environment.js
+++ b/lib/config/environment.js
@@ -33,6 +33,7 @@ module.exports = {
dbURL: process.env.CMD_DB_URL,
sessionSecret: process.env.CMD_SESSION_SECRET,
sessionLife: toIntegerConfig(process.env.CMD_SESSION_LIFE),
+ tooBusyLag: toIntegerConfig(process.env.CMD_TOOBUSY_LAG),
imageUploadType: process.env.CMD_IMAGE_UPLOAD_TYPE,
imgur: {
clientID: process.env.CMD_IMGUR_CLIENTID
diff --git a/lib/models/user.js b/lib/models/user.js
index 76e20a32..3daae45b 100644
--- a/lib/models/user.js
+++ b/lib/models/user.js
@@ -141,6 +141,9 @@ module.exports = function (sequelize, DataTypes) {
case 'saml':
photo = generateAvatarURL(profile.username, profile.emails[0], bigger)
break
+ default:
+ photo = generateAvatarURL(profile.username)
+ break
}
return photo
},
diff --git a/lib/web/middleware/tooBusy.js b/lib/web/middleware/tooBusy.js
index f1b72330..128a5679 100644
--- a/lib/web/middleware/tooBusy.js
+++ b/lib/web/middleware/tooBusy.js
@@ -2,7 +2,11 @@
const toobusy = require('toobusy-js')
+
const response = require('../../response')
+const config = require('../../config')
+
+toobusy.maxLag(config.tooBusyLag)
module.exports = function (req, res, next) {
if (toobusy()) {
diff --git a/locales/vi.json b/locales/vi.json
new file mode 100644
index 00000000..40c9257a
--- /dev/null
+++ b/locales/vi.json
@@ -0,0 +1,121 @@
+{
+ "Collaborative markdown notes": "Cộng tác ghi chú markdown",
+ "Realtime collaborative markdown notes on all platforms.": "Cộng tác ghi chú markdown đa nền tảng thời gian thực",
+ "Best way to write and share your knowledge in markdown.": "Nền tảng tốt nhất để viết và chia sẻ markdown",
+ "Intro": "Giới thiệu",
+ "History": "Lịch sử",
+ "New guest note": "Khách mới",
+ "Collaborate with URL": "Cộng tác thời gian thực",
+ "Support charts and MathJax": "Làm việc với biểu đồ và MathJax",
+ "Support slide mode": "Hỗ trợ chế độ slide",
+ "Sign In": "Đăng nhập",
+ "Below is the history from browser": "Dưới đây là lịch sử của trình duyệt",
+ "Welcome!": "Chào mừng bạn!",
+ "New note": "Tạo mới ghi chú",
+ "or": "hoặc",
+ "Sign Out": "Đăng xuất",
+ "Explore all features": "Khám phá tất cả tính năng",
+ "Select tags...": "Chọn tag",
+ "Search keyword...": "Tìm kiếm",
+ "Sort by title": "Sắp xếp theo tiêu đề",
+ "Title": "Tiêu đề",
+ "Sort by time": "Sắp xếp theo thời gian",
+ "Time": "Thời gian",
+ "Export history": "Xuất lịch sử",
+ "Import history": "Nhập lịch sử",
+ "Clear history": "Xóa lịch sử",
+ "Refresh history": "Làm mới lịch sử",
+ "No history": "Không có lịch sử",
+ "Import from browser": "Nhập từ trình duyệt",
+ "Releases": "Xuất bản",
+ "Are you sure?": "Bạn có chắc chắn không ?",
+ "Do you really want to delete this note?": "Bạn có thực sự muốn xóa ghi chú này ?",
+ "All users will lose their connection.": "Tất cả người dùng sẽ mất liên kết này.",
+ "Cancel": "Hủy",
+ "Yes, do it!": "Đồng ý",
+ "Choose method": "Chọn phương thức",
+ "Sign in via %s": "Đăng nhấp với %s",
+ "New": "Mới",
+ "Publish": "Xuất bản",
+ "Extra": "Extra",
+ "Revision": "Sửa đổi",
+ "Slide Mode": "Chế độ slide",
+ "Export": "Xuất",
+ "Import": "Nhập",
+ "Clipboard": "Clipboard",
+ "Download": "Tải xuống",
+ "Raw HTML": "Raw HTML",
+ "Edit": "Sửa",
+ "View": "Hiện",
+ "Both": "Cả hai",
+ "Help": "Trợ giúp",
+ "Upload Image": "Tải ảnh lên",
+ "Menu": "Menu",
+ "This page need refresh": "Trang này cần được làm mới",
+ "You have an incompatible client version.": "Phiên bản của client không tương thích.",
+ "Refresh to update.": "Làm mới để cập nhập.",
+ "New version available!": "Phiên bản mới đã có sẵn.",
+ "See releases notes here": "Xem ghi chú xuất bản ở đây.",
+ "Refresh to enjoy new features.": "Làm mới để trải nghiệm tính năng mới.",
+ "Your user state has changed.": "Trạng thái người dùng bị thay đổi.",
+ "Refresh to load new user state.": "Làm mới để cập nhập trạng thái người dùng mới.",
+ "Refresh": "Làm mới",
+ "Contacts": "Liên Lạc",
+ "Report an issue": "Báo cáo vấn đề",
+ "Meet us on %s": "Gặp chúng tôi ở %s",
+ "Send us email": "Gửi email cho chúng tôi",
+ "Documents": "Tài liệu",
+ "Features": "Tính năng",
+ "YAML Metadata": "YAML Metadata",
+ "Slide Example": "Slide ví dụ",
+ "Cheatsheet": "Cheetsheet",
+ "Example": "Ví dụ",
+ "Syntax": "Cú pháp",
+ "Header": "Đầu đề",
+ "Unordered List": "Danh sách chưa sắp xếp",
+ "Ordered List": "Danh sách đã sắp xếp",
+ "Todo List": "Checklist",
+ "Blockquote": "Blockquote",
+ "Bold font": "Bôi đậm",
+ "Italics font": "In nghiêng",
+ "Strikethrough": "Gạch ngang",
+ "Inserted text": "Gạch chân",
+ "Marked text": "Hightlight",
+ "Link": "Liên kết",
+ "Image": "Ảnh",
+ "Code": "Code",
+ "Externals": "Externals",
+ "This is a alert area.": "Đây là khu vực cảnh báo",
+ "Revert": "Trở lại như cũ",
+ "Import from clipboard": "Thêm từ clipboard",
+ "Paste your markdown or webpage here...": "Dán markdown hoặc webpage ở đây ...",
+ "Clear": "Xóa",
+ "This note is locked": "Ghi chú này bị khóa.",
+ "Sorry, only owner can edit this note.": "Xin lỗi, chỉ chủ sở hữu có thể xóa note.",
+ "OK": "Đồng ý",
+ "Reach the limit": "Đạt giới hạn",
+ "Sorry, you've reached the max length this note can be.": "Rất tiếc, bạn đã đạt tới độ dài tối đa ",
+ "Please reduce the content or divide it to more notes, thank you!": "Vui lòng rút ngắn ghi chú",
+ "Import from Gist": "Nhập từ Gist",
+ "Paste your gist url here...": "Dán liên kết gist vào đây ...",
+ "Import from Snippet": "Thêm từ Snippet",
+ "Select From Available Projects": "Chọn từ Project có sẵn",
+ "Select From Available Snippets": "Chọn từ Snippets có sẵn",
+ "OR": "HOẶC",
+ "Export to Snippet": "Xuất ra Snippet",
+ "Select Visibility Level": "Chọn cấp độ hiển thị",
+ "Night Theme": "Giao diện tối",
+ "Follow us on %s and %s.": "Cho phép chúng tôi %s, và %s.",
+ "Privacy": "Quyền riêng tư.",
+ "Terms of Use": "Điều khoản sử dụng.",
+ "Do you really want to delete your user account?": "Bạn có thực sự muốn xóa tài khoản ?",
+ "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Điều này sẽ xóa tài khoản của bạn, tất cả các ghi chú thuộc sở hữu của bạn và xóa tất cả các liên kết đến tài khoản của bạn khỏi các ghi chú khác.",
+ "Delete user": "Xóa người dùng",
+ "Export user data": "Xuất dữ liệu người dùng",
+ "Help us translating on %s": "Giúp chúng tôi dịch trên %s",
+ "Source Code": "Mã nguồn",
+ "Register": "Đăng ký",
+ "Powered by %s": "Cung cấp bởi %s",
+ "Help us translating": "Giúp chúng tôi dịch",
+ "Join the community": "Tham gia vào cộng đồng"
+} \ No newline at end of file
diff --git a/public/css/extra.css b/public/css/extra.css
index 3954c046..b36a69fe 100644
--- a/public/css/extra.css
+++ b/public/css/extra.css
@@ -384,6 +384,14 @@ small .dropdown a:focus, small .dropdown a:hover {
color: #eee;
}
+*[id]:before {
+ display: block;
+ content: " ";
+ margin-top: -55px;
+ height: 55px;
+ visibility: hidden;
+}
+
@media print {
div, table, img, pre, blockquote {
page-break-inside: avoid !important;
diff --git a/public/views/index/body.ejs b/public/views/index/body.ejs
index 83b2ebe9..f1181fce 100644
--- a/public/views/index/body.ejs
+++ b/public/views/index/body.ejs
@@ -149,6 +149,7 @@
<option value="ko">한국어</option>
<option value="id">Bahasa Indonesia</option>
<option value="sr">Cрпски</option>
+ <option value="vi">Tiếng Việt</option>
</select>
<p>
<%- __('Powered by %s', '<a href="https://codimd.org">CodiMD</a>') %> | <a href="<%- serverURL %>/s/release-notes" target="_blank" rel="noopener"><%= __('Releases') %></a> | <a href="<%- sourceURL %>" target="_blank" rel="noopener"><%= __('Source Code') %></a><% if(privacyStatement) { %> | <a href="<%- serverURL %>/s/privacy" target="_blank" rel="noopener"><%= __('Privacy') %></a><% } %><% if(termsOfUse) { %> | <a href="<%- serverURL %>/s/terms-of-use" target="_blank" rel="noopener"><%= __('Terms of Use') %></a><% } %>