diff --git a/src/Blogifier.Shared/Resources/Resource.vi-VN.resx b/src/Blogifier.Shared/Resources/Resource.vi-VN.resx new file mode 100644 index 000000000..e96da286d --- /dev/null +++ b/src/Blogifier.Shared/Resources/Resource.vi-VN.resx @@ -0,0 +1,792 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Chung + + + Hồ sơ + + + Mật khẩu + + + Chủ đề + + + Người dùng + + + Người dùng mới + + + Nhập dữ liệu + + + Bài viết mới + + + Bài viết + + + Cài đặt + + + Thông báo + + + Truy cập blog + + + Tiêu đề + + + Mô tả + + + Số mục trên mỗi trang + + + Ảnh đại diện + + + Ảnh bìa + + + Ngôn ngữ + + + Lưu + + + Chọn + + + Đã chọn + + + Tìm kiếm + + + Tất cả + + + Đã xuất bản + + + Bản nháp + + + Trạng thái + + + Không tìm thấy + + + Xuất bản + + + Thu hồi xuất bản + + + Nổi bật + + + Thêm vào danh sách nổi bật + + + Hủy + + + Xóa + + + Danh mục + + + Xem + + + Tên người dùng + + + Email + + + Giới thiệu bản thân + + + Ảnh đại diện + + + Xóa + + + Đã xóa + + + Mật khẩu mới + + + Xác nhận mật khẩu + + + Đóng + + + Đặt làm quản trị viên + + + Chọn tệp RSS (.xml) để nhập bài viết + + + Hình ảnh + + + Tệp đính kèm + + + Tải lên + + + Bộ lọc + + + Đổi mật khẩu + + + Chủ đề + + + Đọc + + + Đã cập nhật + + + Đã tạo + + + Về chúng tôi + + + Thư thông báo + + + Danh sách người đăng ký thư thông báo + + + Liên hệ + + + Bảng điều khiển + + + Phổ biến + + + Trống + + + Chỉnh sửa + + + Chi tiết + + + Trường tùy chỉnh + + + Xin lỗi, đã xảy ra lỗi hoặc không có gì tại địa chỉ này. + + + Gửi + + + Gửi tới + + + Chủ đề + + + Nội dung + + + Hoàn thành + + + Ở đây, bạn có thể kiểm tra cài đặt thư thông báo bằng cách gửi thư thử nghiệm + + + Ở đây, bạn có thể nhập hoặc cập nhật thông tin trang web và mã để thêm ý kiến Disqus + + + Vô hiệu hóa trong chế độ demo + + + Gửi thư thành công + + + Gửi thư bị lỗi, vui lòng kiểm tra nhật ký để biết chi tiết + + + Đã gửi {0} thư thông báo + + + Tài khoản mạng xã hội + + + Tên + + + Tiêu đề bài viết + + + Nhập ở đây... + + + Cảm ơn bạn! + + + Nhập email + + + Đăng ký + + + Tham gia danh sách người đăng ký của chúng tôi để nhận tin tức và cập nhật mới nhất trực tiếp trong hộp thư của bạn. + + + Đăng nhập + + + Trang chủ + + + Blog + + + Quản trị + + + Thẻ + + + Liên kết nhanh + + + Điều hướng + + + Trước + + + Tiếp theo + + + Xóa bài viết? + + + Bao gồm vào danh sách nổi bật + + + Mã để bao gồm trong phần đầu trang và cuối trang (Disqus, Analytics, vv.) + + + Người đăng ký + + + Tuần trước + + + Tháng trước + + + Nhà cung cấp email + + + Khóa Sendgrid + + + Máy chủ + + + Cổng + + + Email SMTP + + + Gửi thư thử nghiệm + + + Hủy đăng ký + + + Đăng nhập thất bại, vui lòng thử lại + + + Chào mừng + + + Bạn có thể đăng nhập hoặc quay lại blog + + + Đăng ký + + + Bạn có thể đăng ký hoặc quay lại blog + + + Đăng ký + + + Đã xảy ra lỗi, vui lòng thử lại. + + + Tiêu đề và Nội dung bắt buộc. + + + Lượt xem + + + Trang + + + Nâng cao + + + Bình luận + + + Tùy chỉnh + + + Thông tin + + + Đoạn mã + + + Tiêu đề trang + + + Về Blogifier + + + Hành động + + + Cài đặt nâng cao + + + Cơ bản + + + Cài đặt cơ bản + + + Blogifier là một nền tảng xuất bản mã nguồn mở được xây dựng bằng .NET Core 5.0 và các công nghệ mới nhất. + + + Cài đặt bình luận + + + Chỉnh sửa hồ sơ + + + Trang chủ + + + Tải + + + Đăng xuất + + + Menu + + + Trang mới + + + Hệ điều hành + + + Ảnh đại diện + + + URL dòng tin RSS + + + Chân trang đoạn mã + + + Đầu trang đoạn mã + + + Cài đặt đoạn mã + + + Đặc tả + + + Không có gì để hiển thị - danh sách này đang trống + + + Người dùng + + + Cài đặt người dùng + + + Phiên bản + + + URL trang web + + + Widget + + + Phân tích + + + Biểu đồ + + + Danh sách + + + Lượt truy cập + + + Ngày + + + Ngày + + + 7 Ngày + + + 30 Ngày + + + 90 Ngày + + + Hôm nay + + + Hôm qua + + + Lưu trữ + + + Chọn tất cả + + + Không nổi bật + + + Thay đổi + + + Thiết lập lại + + + Thêm danh mục + + + Danh mục mới + + + Chỉnh sửa danh mục + + + Tin tức + + + Gửi lại + + + Cài đặt tin tức + + + Máy chủ + + + Người nhận + + + Người gửi + + + Email người gửi + + + Đã kích hoạt + + + Đã vô hiệu hóa + + + Ảnh bìa mặc định + + + Đang trong quá trình phát triển + + + Tìm hiểu thêm + + + Đọc thêm + + + Thông tin thêm + + + Thêm người dùng + + + Hiện tại + + + Nhà phát triển + + + Bởi + + + Bài viết đã được tìm thấy và sẵn sàng được nhập + + + Nhập tất cả + + + Trang lỗi + + + Trang web + + + Nhà cung cấp cơ sở dữ liệu + + + Quay lại trang web + + + Microsoft + + + Twitter + + + GitHub + + + Facebook + + + Instagram + + + LinkedIn + + + Google + + + YouTube + + + Pinterest + + + WhatsApp + + + Telegram + + + Được cung cấp bởi Blogifier + + + Bản quyền + + + Trang tiếp theo + + + Trang trước + + + Không tìm thấy trang + + + Chia sẻ + + + Tác giả + + + Tùy chỉnh + + + Mỗi chủ đề có các tính năng khác nhau. Bạn đang tùy chỉnh chủ đề hiện tại của mình, và những thay đổi này chỉ áp dụng cho chủ đề hiện tại. + + + Cài đặt blog + + + Đặt làm chủ đề hiện tại + + + Tạo tài khoản quản trị + + + Chào mừng bạn đến IT-Blog HUTECH + + + Lưu trữ là một nơi lưu trữ tệp mà bạn có thể tải lên và quản lý các tệp của mình và sử dụng trên toàn trang web. + + + Tên biệt danh + + + Trang bạn đang tìm kiếm không tồn tại, hoặc đã xảy ra lỗi. + + + Bài viết kế tiếp + + + Bài viết trước + + + Các bài viết liên quan + + + Xem tất cả + + + Hồ sơ tài khoản + + \ No newline at end of file diff --git a/src/Blogifier.Themes.Standard/assets/js/main.js b/src/Blogifier.Themes.Standard/assets/js/main.js index b602c41dc..0c8afa0bc 100644 --- a/src/Blogifier.Themes.Standard/assets/js/main.js +++ b/src/Blogifier.Themes.Standard/assets/js/main.js @@ -4,17 +4,21 @@ const form_email = document.getElementById("newsletter_email"); const form_status = document.getElementById("newsletter_status"); // Success, Loading and Error functions -function successNewsletter() { - const newsletterSucessMsg = form_status.dataset.success, newsletterErrorMsg = form_status.dataset.error; - form_status.innerHTML = `
${newsletterSucessMsg}
`; - setTimeout(resetNewsletter, 2000); +function successNewsletter(message) { + form_status.innerHTML = `
${message}
`; + setTimeout(() => { + resetNewsletter(); + }, 2000); } + function loadingNewsletter() { - form_status.innerHTML = '
' + form_status.innerHTML = '
'; } -function errorNewsletter(msg) { - form_status.innerHTML = `
${newsletterErrorMsg}
${msg}
`; + +function errorNewsletter(message) { + form_status.innerHTML = `
${message}
`; } + function resetNewsletter() { form.reset(); form_status.innerHTML = ""; @@ -25,20 +29,20 @@ function subscribeNewsletter(url, data) { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) - } + }; + fetch(url, options) .then((response) => { - if (response.status == 200) { - return response.json(); + if (response.status === 200) { + successNewsletter('Đăng ký nhận thông báo mới cho email này thành công!'); + } else if (response.status === 400) { + errorNewsletter('Email này đã tồn tại trong danh sách đăng ký.'); } else { - throw new Error('The Newsletter is not working!'); + errorNewsletter('Lỗi không xác định.'); } }) - .then(() => { - successNewsletter(); - }) .catch((err) => { - errorNewsletter(err); + errorNewsletter(err.message); }); } @@ -51,23 +55,8 @@ form.addEventListener("submit", function (e) { Country: "unknown", Region: "unknown" }; - fetch('https://ipapi.co/json/') - .then((response) => { - if (response.status == 200) { - return response.json(); - } else { - throw new Error('Not sure where you are!'); - } - }) - .then((loc) => { - subscriber_data.Ip = loc.ip; - subscriber_data.Country = loc.country_name; - subscriber_data.Region = loc.region; - subscribeNewsletter(form.action, subscriber_data); - }) - .catch((err) => { - subscribeNewsletter(form.action, subscriber_data); - }); + + subscribeNewsletter(form.action, subscriber_data); }); // search modal auto focus @@ -76,4 +65,4 @@ if (myModal) { myModal.addEventListener('shown.bs.modal', function () { document.getElementById('searchFormInput').focus() }) -} +} \ No newline at end of file diff --git a/src/Blogifier/Interfaces/SubscriberController.cs b/src/Blogifier/Interfaces/SubscriberController.cs index 921218722..52665447a 100644 --- a/src/Blogifier/Interfaces/SubscriberController.cs +++ b/src/Blogifier/Interfaces/SubscriberController.cs @@ -2,6 +2,7 @@ using Blogifier.Shared; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -33,8 +34,15 @@ public async Task DeleteAsync([FromRoute] int id) } [HttpPost("apply")] - public async Task Apply([FromForm] SubscriberApplyDto subscriber) + public async Task ApplyAsync([FromBody] SubscriberApplyDto input) { - await _subscriberProvider.ApplyAsync(subscriber); + var res = await _subscriberProvider.ApplyAsync(input); + + if(res == 1) + { + return Ok(); + } + + return BadRequest(); } } diff --git a/src/Blogifier/Newsletters/SubscriberProvider.cs b/src/Blogifier/Newsletters/SubscriberProvider.cs index eb720590d..5922b0c82 100644 --- a/src/Blogifier/Newsletters/SubscriberProvider.cs +++ b/src/Blogifier/Newsletters/SubscriberProvider.cs @@ -2,6 +2,7 @@ using Blogifier.Data; using Blogifier.Shared; using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -24,14 +25,17 @@ public async Task> GetItemsAsync() return await _mapper.ProjectTo(query).ToListAsync(); } - public async Task ApplyAsync(SubscriberApplyDto input) + public async Task ApplyAsync(SubscriberApplyDto input) { + if (await _dbContext.Subscribers.AnyAsync(m => m.Email == input.Email)) + return 0; + else { var data = _mapper.Map(input); _dbContext.Subscribers.Add(data); await _dbContext.SaveChangesAsync(); + return 1; } } - -} +} \ No newline at end of file