diff --git a/frontend/app/locales/vi.json b/frontend/app/locales/vi.json
new file mode 100644
index 00000000..46a061d6
--- /dev/null
+++ b/frontend/app/locales/vi.json
@@ -0,0 +1,171 @@
+{
+ "anonymousLoginForm.length-limit": "Tên người dùng phải có ít nhất 3 ký tự",
+ "anonymousLoginForm.log-in": "Đăng nhập",
+ "anonymousLoginForm.symbol-limit": "Tên người dùng chỉ được chứa các chữ cái, số, dấu gạch dưới hoặc dấu cách",
+ "anonymousLoginForm.user-name": "Tên người dùng",
+ "authPanel.anonymous-provider": "Ẩn danh",
+ "authPanel.disable-comments": "Tắt bình luận",
+ "authPanel.disabled-cookies": "Tắt tính năng chặn cookies của bên thứ ba để đăng nhập hoặc mở nhận xét trong",
+ "authPanel.enable-comments": "Mở bình luận",
+ "authPanel.enable-cookies": "Cho phép cookies đăng nhập và bình luận",
+ "authPanel.hide-settings": "Ẩn cài đặt",
+ "authPanel.logged-as": "Bạn đã đăng nhập bằng",
+ "authPanel.login": "Đăng nhập:",
+ "authPanel.logout": "Thoát?",
+ "authPanel.new-page": "trang mới",
+ "authPanel.or-provider": "hoặc",
+ "authPanel.other-provider": "Khác",
+ "authPanel.read-only": "Chỉ đọc",
+ "authPanel.request-to-delete-data": "Yêu cầu xóa dữ liệu của tôi",
+ "authPanel.show-settings": "Hiện cài đặt",
+ "blockingDuration.day": "Trong một ngày",
+ "blockingDuration.month": "Trong một tháng",
+ "blockingDuration.permanently": "Vĩnh viễn",
+ "blockingDuration.week": "Trong một tuần",
+ "comment.block": "Chặn",
+ "comment.block-user": "Bạn có muốn chặn {userName} {duration}?",
+ "comment.blocked-user": "Đã chặn",
+ "comment.blocking-period": "Thời gian chặn",
+ "comment.cancel": "Huỷ",
+ "comment.controversy": "Tranh luận: {value}",
+ "comment.copied": "Đã sao chép!",
+ "comment.copy": "Sao chép",
+ "comment.delete": "Xoá",
+ "comment.delete-message": "Bạn có muốn xoá bình luận này?",
+ "comment.deleted-comment": "Bình luận này đã bị xoá",
+ "comment.deleted-user": "Đã xoá",
+ "comment.edit": "Sửa",
+ "comment.expired-time": "Thời gian chỉnh sửa đã hết.",
+ "comment.go-to-parent": "Đi tới bình luận chính",
+ "comment.hide": "Ẩn",
+ "comment.hide-user-comment": "Bạn có muốn ẩn bình luận của {userName}?",
+ "comment.pin": "Ghim",
+ "comment.pin-comment": "Bạn có muốn ghim bình luận này?",
+ "comment.reply": "Trả lời",
+ "comment.time": "{day} lúc {time}",
+ "comment.toggle-verification": "Chuyển đổi xác thực",
+ "comment.unblock": "Bỏ chặn",
+ "comment.unblock-user": "Bạn có muốn bỏ chặn người dùng này?",
+ "comment.unpin": "Bỏ ghim",
+ "comment.unpin-comment": "Bạn có muốn bỏ ghim bình luận này?",
+ "comment.unverified-user": "Người dùng chưa được xác thực",
+ "comment.unverify-user": "Bạn có muốn bỏ xác thực {userName}?",
+ "comment.verified-user": "Người dùng đã xác thực",
+ "comment.verify-user": "Bạn có muốn xác thực {userName}?",
+ "comment.vote-error": "Vote bị lỗi: {voteErrorMessage}",
+ "commentForm.anonymous-uploading-disabled": "Upload ảnh bị tắt đối với người dùng ẩn danh. Vui lòng đăng nhập không phải ẩn danh để có thể đính kèm hình ảnh.",
+ "commentForm.exceeded-size": "{fileName} vượt kích thước giới hạn {maxImageSize}",
+ "commentForm.input-placeholder": "Bình luận của bạn ở đây",
+ "commentForm.new-comment": "Bình luận mới",
+ "commentForm.notice-about-styling": "Hỗ trợ định dạng Markdown",
+ "commentForm.preview": "Xem trước",
+ "commentForm.reply": "Trả lời",
+ "commentForm.save": "Lưu",
+ "commentForm.send": "Gửi",
+ "commentForm.subscribe-by": "Đăng kí bằng",
+ "commentForm.subscribe-or": "hoặc",
+ "commentForm.unauthorized-uploading-disabled": "Upload ảnh bị tắt đối với người dùng chưa đăng nhập. Hãy đăng nhập trước khi Upload.",
+ "commentForm.unexpected-error": "Có gì đó sai sai. Vui lòng thử lại sau",
+ "commentForm.upload-file-fail": "{fileName} upload thất bại với \"{errorMessage}\"",
+ "commentForm.uploading": "Đang tải lên...",
+ "commentForm.uploading-file": "đang tải lên {fileName}...",
+ "commentSort.sort-by": "Sắp xếp theo",
+ "commentsSort.best": "Tốt nhất",
+ "commentsSort.least-controversial": "Ít gây tranh cãi nhất",
+ "commentsSort.least-recently-updated": "Gần đây nhất",
+ "commentsSort.most-controversial": "Gây tranh cãi nhất",
+ "commentsSort.newest": "Mới nhất",
+ "commentsSort.oldest": "Cũ nhất",
+ "commentsSort.recently-updated": "Mới được cập nhật",
+ "commentsSort.worst": "Tệ nhất",
+ "emailLoginForm.back": "Quay lại",
+ "emailLoginForm.confirm": "Xác nhận",
+ "emailLoginForm.email-address": "Địa chỉ Email",
+ "emailLoginForm.empty-token": "Token không được bỏ trống",
+ "emailLoginForm.expired-token": "Token đã hết hạn",
+ "emailLoginForm.invalid-email": "Địa chỉ phải là địa chỉ Email chính xác",
+ "emailLoginForm.loading": "Đang tải...",
+ "emailLoginForm.send-verification": "Gửi xác thực",
+ "emailLoginForm.token": "Token",
+ "emailLoginForm.user-not-found": "Không tìm thấy người dùng nào",
+ "errors.0": "Có gì đó sai sai. Vui lòng thử lại sau.",
+ "errors.1": "Bình luận không được tìm thấy, xin hãy làm mới trang và thử lại.",
+ "errors.10": "Đã quá muộn để sửa bình luận.",
+ "errors.11": "Nhận xét đã có trả lời, không thể chỉnh sửa.",
+ "errors.12": "Không thể lưu kết quả vote. Một chút nữa rồi thử lại nhé.",
+ "errors.13": "Bạn không thể vote bình luận của bạn.",
+ "errors.14": "Bạn đã vote bình luận này rồi.",
+ "errors.15": "Có quá nhiều vote cho bình luận.",
+ "errors.16": "Bình luận đã đạt số điểm thấp nhất.",
+ "errors.17": "Thao tác bị từ chối. Một chút nữa rồi thử lại nhé.",
+ "errors.18": "Không tìm thấy file được yêu cầu.",
+ "errors.2": "Yêu cầu đến không quản lý được.",
+ "errors.3": "Bạn không có quyền thực hiện thao tác này.",
+ "errors.4": "Dữ liệu bình luận không hợp lệ.",
+ "errors.5": "Bình luận không được tìm thấy, xin hãy làm mới trang và thử lại.",
+ "errors.6": "Trang không được tìm thấy, xin hãy làm mới trang và thử lại.",
+ "errors.7": "Người dùng đã bị chặn.",
+ "errors.8": "Người dùng đã bị chặn.",
+ "errors.9": "Thay đổi bình luận không thành công. Một chút sau rồi thử lại nhé.",
+ "errors.failed-fetch": "Nhận dữ liệu thất bại. Vui lòng kiểm tra lại đường truyền hoặc thử lại sau.",
+ "errors.forbidden": "Bị cấm.",
+ "errors.not-authorized": "Không được phép.",
+ "errors.to-many-request": "Bạn đã đạt đến giới hạn yêu cầu tối đa.",
+ "errors.unexpected-error": "Có gì đó sai sai.",
+ "root.pinned-comments": "Bình buận đã ghim",
+ "root.powered-by": "Powered by Remark42",
+ "root.show-more": "Xem thêm",
+ "settings.block": "chặn",
+ "settings.block-time": "cho đến {day} lúc {time}",
+ "settings.block-user": "Bạn có muốn chặn {userName}?",
+ "settings.blocked-users-header": "Người dùng bị chặn:",
+ "settings.blocked-users-title": "Người dùng bị chặn",
+ "settings.hidden-user-header": "Người dùng đã ẩn:",
+ "settings.hidden-users-title": "Người dùng đã ẩn",
+ "settings.hide": "ẩn",
+ "settings.no-blocked-users": "Không có người dùng bị chặn.",
+ "settings.no-hidden-users": "Không có người dùng bị chặn.",
+ "settings.permanently": "vĩnh viễn",
+ "settings.show": "hiện",
+ "settings.unblock": "bỏ chặn",
+ "settings.unblock-user": "Bạn có muốn bỏ chặn {userName}?",
+ "settings.unknown": "không rõ",
+ "subscribeByEmail.back": "Quay lại",
+ "subscribeByEmail.close": "Đóng",
+ "subscribeByEmail.email": "Email",
+ "subscribeByEmail.expired-token": "token đã hết hạn",
+ "subscribeByEmail.have-been-subscribed": "Bạn đã đăng kí nhận thông báo qua email",
+ "subscribeByEmail.have-been-unsubscribed": "Bằng đã huỷ đăng kí nhận thông báo qua email",
+ "subscribeByEmail.only-registered-users": "Chỉ có sẵn cho người dùng đã đăng ký",
+ "subscribeByEmail.submit": "Gửi đi",
+ "subscribeByEmail.subscribe": "Đăng kí",
+ "subscribeByEmail.subscribe-by-email": "Đăng kí qua Email",
+ "subscribeByEmail.subscribe-to-replies": "Đăng kí trả lời",
+ "subscribeByEmail.subscribed": "Bạn đã đăng kí cập nhật qua email",
+ "subscribeByEmail.token": "Token",
+ "subscribeByEmail.unsubscribe": "Bỏ đăng kí",
+ "subscribeByRSS.button-title": "Đăng kí qua RSS",
+ "subscribeByRSS.replies": "Trả lời",
+ "subscribeByRSS.site": "Trang",
+ "subscribeByRSS.thread": "Chủ đề",
+ "subscribeByRSS.title": "RSS",
+ "toolbar.attach-image": "Đính kèm hình ảnh, kéo và thả hoặc dán từ khay nhớ tạm",
+ "toolbar.bold": "Thêm chử đậm {shortcut}",
+ "toolbar.code": "Chèn một đoạn code",
+ "toolbar.header": "Thêm tiêu đề",
+ "toolbar.italic": "Thêm chử nghiêng {shortcut}",
+ "toolbar.link": "Thêm đường link {shortcut}",
+ "toolbar.ordered-list": "Thêm danh sách số",
+ "toolbar.quote": "Thêm trích dẫn",
+ "toolbar.unordered-list": "Thêm danh sách",
+ "user-info.last-comments": "Bình luận cuối cùng của {userName}",
+ "user-info.unexpected-error": "Có gì đó sai sai",
+ "vote.anonymous": "Người dùng ẩn danh không thể vote",
+ "vote.deleted": "Không thể vote bình luận đã xoá",
+ "vote.guest": "Đăng nhập để vote",
+ "vote.only-positive": "Chỉ cho phép điểm số dương",
+ "vote.only-post-page": "Chỉ được phép vote trên trang của bài đăng",
+ "vote.own-comment": "Bạn không thể vote bình luận của bạn",
+ "vote.readonly": "Không thể Vote chủ đề chỉ đọc"
+ }
+
\ No newline at end of file
diff --git a/frontend/tasks/supportedLocales.json b/frontend/tasks/supportedLocales.json
index ebfb3ae2..28a7a68a 100644
--- a/frontend/tasks/supportedLocales.json
+++ b/frontend/tasks/supportedLocales.json
@@ -1 +1 @@
-["en", "ru", "de", "fi", "es", "zh", "tr", "bg", "ua", "pl"]
+["en", "ru", "de", "fi", "es", "zh", "tr", "bg", "ua", "pl", "vi"]