Fizzy doesn’t let stale cards stick around forever. Cards automatically move to “Not Now” if there is no activity for specific period of time. This is the default, global setting — you can override it on each board.
Turn on the Public link to share this board with anyone in the world. They won’t need to log in and they won’t be able to see anything else in Fizzy.
+
<%= t("boards.publication.title") %>
+
<%= t("boards.publication.description") %>
<% if board.published? %>
@@ -12,7 +12,7 @@
<%= form_with url: board_publication_path(board), method: :delete, data: { controller: "form" } do |form| %>
<%= form.check_box :published, class: "switch__input", checked: true, data: { action: "change->form#submit" }, disabled: !Current.user.can_administer_board?(@board) %>
- Turn off the public link
+ <%= t("boards.publication.turn_off") %>
<% end %>
<%= icon_tag "world" %>
@@ -23,18 +23,18 @@
<%= button_to_copy_to_clipboard(published_board_url(board)) do %>
<%= icon_tag "copy-paste" %>
- Copy public link
+ <%= t("boards.publication.copy_link") %>
<% end %>
- Add an optional description to the public page
+ <%= t("boards.publication.description_label") %>
Thanks, <%= @user.first_name %>! Fizzy won’t send you any more email notifications. If you change your mind you can turn them back on in <%= link_to "Notifications Settings", notifications_settings_path %>.
- Your Fizzy accounts
+ <%= t("sessions.menus.your_accounts") %>
<% else %>
-
Hmm...
-
You don’t have any Fizzy accounts.
+
<%= t("sessions.menus.no_accounts_title") %>
+
<%= t("sessions.menus.no_accounts_message") %>
<% end %>
<%= link_to new_signup_path, class: "btn btn--plain txt-link center txt-small", data: { turbo_prefetch: false } do %>
- Sign up for a new Fizzy account
+ <%= t("sessions.menus.signup_link") %>
<% end %>
- That email confirmation link is no longer valid—they expire after 30 minues. You’ll have to try again.
+ <%= t("users.email_change.link_expired_message") %>
- If you get stuck, <%= mail_to "support@fizzy.do", "send us an email" %> and we’ll get you back on track.
+ <%= t("users.email_change.stuck_message_html", email_link: mail_to("support@fizzy.do", t("users.email_change.send_email"))).html_safe %>
Webhooks can notify another application when something happens in this Fizzy board. You’ll choose which events to subscribe to and provide a URL to receive the data.
-
For example, you could create a webhook that posts to a Campfire chat in Basecamp when new cards are added to Fizzy.
+
<%= t("webhooks.index.description_1") %>
+
<%= t("webhooks.index.description_2") %>
<% end %>
<%= link_to new_board_webhook_path, class: "btn btn--link" do %>
<%= icon_tag "add" %>
- Set up a new webhook
+ <%= t("webhooks.index.setup_new") %>
<% end %>
<% end %>
diff --git a/app/views/webhooks/new.html.erb b/app/views/webhooks/new.html.erb
index 02522aedb5..461bd7ee25 100644
--- a/app/views/webhooks/new.html.erb
+++ b/app/views/webhooks/new.html.erb
@@ -1,8 +1,8 @@
-<% @page_title = "Set up a Webhook" %>
+<% @page_title = t("webhooks.new.title") %>
<% content_for :header do %>
This is the URL for the app that will receive payloads from Fizzy.
+ <%= t("webhooks.form.payload_url") %>
+
<%= t("webhooks.form.payload_url_description") %>
<% end %>
<%= form.url_field :url,
required: true,
pattern: "https?://.*",
- title: "Must be an http:// or https:// URL",
+ title: t("webhooks.form.url_validation"),
class: "input",
placeholder: "https://example.com",
data: { action: "keydown.esc@document->form#cancel" } %>
@@ -30,16 +30,16 @@
<%= form.label :actions do %>
- Events
-
Trigger a call to the Payload URL when these things occur:
+ <%= t("webhooks.form.events") %>
+
<%= t("webhooks.form.events_description") %>
<% end %>
<%= render "webhooks/form/actions", form: form %>
<%= form.button type: :submit, class: "btn btn--link center txt-medium" do %>
- Create Webhook
+ <%= t("webhooks.new.create_button") %>
<% end %>
- <%= link_to "Go back", board_webhooks_path, data: { form_target: "cancel" }, hidden: true %>
+ <%= link_to t("common.buttons.go_back"), board_webhooks_path, data: { form_target: "cancel" }, hidden: true %>
<% end %>
diff --git a/config/application.rb b/config/application.rb
index ced9d93054..a60a7a3dc6 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -26,5 +26,10 @@ class Application < Rails::Application
end
config.mission_control.jobs.http_basic_auth_enabled = false
+
+ # Internationalization (i18n) configuration
+ config.i18n.default_locale = :vi
+ config.i18n.available_locales = [:vi, :en]
+ config.i18n.fallbacks = true
end
end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 7b29a00d1e..644c855d61 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -4,19 +4,15 @@
# Settings specified here will take precedence over those in config/application.rb.
# Email provider Settings
- #
- # Configure these according to whichever email provider you use. An example setup
- # using SMTP looks like the following:
- #
- # config.action_mailer.smtp_settings = {
- # address: 'smtp.example.com', # The address of your email provider's SMTP server
- # port: 2525,
- # domain: 'example.com', # Your domain, which Fizzy will send email from
- # user_name: ENV["SMTP_USERNAME"],
- # password: ENV["SMTP_PASSWORD"],
- # authentication: :plain,
- # enable_starttls_auto: true
- # }
+ config.action_mailer.delivery_method = :smtp
+ config.action_mailer.smtp_settings = {
+ address: ENV["SMTP_ADDRESS"],
+ port: ENV.fetch("SMTP_PORT", 587).to_i,
+ user_name: ENV["SMTP_USERNAME"],
+ password: ENV["SMTP_PASSWORD"],
+ authentication: ENV.fetch("SMTP_AUTHENTICATION", "plain").to_sym,
+ enable_starttls_auto: ENV.fetch("SMTP_ENABLE_STARTTLS", "true") == "true"
+ }
# Code is not reloaded between requests.
config.enable_reloading = false
@@ -73,6 +69,9 @@
# Use a different cache store in production.
config.cache_store = :solid_cache_store
+ # Store uploaded files on the local file system.
+ config.active_storage.service = :production
+
# Use a real queuing backend for Active Job (and separate queues per environment).
config.active_job.queue_adapter = :solid_queue
config.solid_queue.connects_to = { database: { writing: :queue, reading: :queue } }
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
new file mode 100644
index 0000000000..d4beb4d578
--- /dev/null
+++ b/config/locales/vi.yml
@@ -0,0 +1,549 @@
+# Vietnamese translations for Fizzy
+# File: config/locales/vi.yml
+#
+# Hướng dẫn:
+# - Các key bằng tiếng Anh được giữ nguyên
+# - Giá trị bằng tiếng Việt cần được review và chỉnh sửa
+# - %{variable} là biến động, không dịch
+# - Dấu nháy đơn hoặc kép cần thiết cho các string có ký tự đặc biệt
+
+vi:
+ # ============================================================================
+ # LAYOUTS & NAVIGATION
+ # ============================================================================
+ layouts:
+ skip_to_content: "Chuyển đến nội dung chính"
+ branding:
+ product_name: "Fizzy™"
+ designed_by: "được thiết kế, xây dựng và hỗ trợ bởi"
+ company_name: "37signals™"
+
+ navigation:
+ home: "Trang chủ"
+ boards: "Bảng"
+ tags: "Nhãn"
+ shortcuts: "Lối tắt"
+ notifications: "Thông báo"
+ settings: "Cài đặt"
+ account_settings: "Cài đặt tài khoản"
+ my_profile: "Hồ sơ của tôi"
+ all_notifications: "Tất cả thông báo"
+ notification_settings: "Cài đặt thông báo"
+ sign_out: "Đăng xuất"
+ add_a_board: "Thêm bảng"
+ all_tags: "Tất cả nhãn"
+ close_menu: "Đóng menu"
+ assigned_to_me: "Được giao cho tôi"
+ added_by_me: "Tôi đã thêm"
+
+ # ============================================================================
+ # SESSIONS (Login/Authentication)
+ # ============================================================================
+ sessions:
+ new:
+ title: "Nhập email của bạn"
+ heading: "Đăng nhập Fizzy"
+ email_placeholder: "Nhập địa chỉ email…"
+ new_user: "Người dùng mới?"
+ sign_up: "Đăng ký"
+ existing_user: "Đã có tài khoản?"
+ continue: "Tiếp tục"
+ rate_limit_error: "Vui lòng thử lại sau."
+
+ magic_links:
+ title: "Kiểm tra email"
+ instructions: "Nhập mã xác thực từ email:"
+ code_placeholder: "••••••"
+ code_expires_in: "Mã có hiệu lực trong"
+ your_code: "Mã của bạn:"
+ rate_limit_error: "Chờ 15 phút rồi thử lại"
+
+ starts:
+ signing_in: "Đang đăng nhập..."
+ please_wait: "Vui lòng chờ, đang đăng nhập với"
+
+ menus:
+ title: "Chọn tài khoản"
+ your_accounts: "Tài khoản Fizzy của bạn"
+ no_accounts_title: "Hmm..."
+ no_accounts_message: "Bạn chưa có tài khoản Fizzy nào."
+ signup_link: "Đăng ký tài khoản Fizzy mới"
+
+ footer:
+ product_name: "CHIPVN"
+ description: "Hệ thống quản lý công việc nội bộ."
+ need_help: "Cần hỗ trợ?"
+ email_us: "Gửi email cho chúng tôi"
+
+ # ============================================================================
+ # SIGNUPS
+ # ============================================================================
+ signups:
+ new:
+ title: "Đăng ký Fizzy"
+ heading: "Đăng ký"
+ email_placeholder: "Nhập địa chỉ email…"
+ helper_text: "Nhập email để tạo tài khoản."
+ submit: "Bắt đầu"
+ rate_limit_error: "Vui lòng thử lại sau."
+
+ completions:
+ title: "Hoàn tất đăng ký"
+ name_placeholder: "Nhập họ tên đầy đủ…"
+ helper_text: "Chỉ còn một bước nữa. Nhập tên để có tài khoản Fizzy của riêng bạn."
+ submit: "Tiếp tục"
+
+ join_codes:
+ join_title: "Tham gia %{account_name}"
+ email_placeholder: "Địa chỉ email"
+ code_inactive:
+ title: "Mã này đã hết hiệu lực"
+ message_1: "Hãy liên hệ với ai đó từ"
+ message_2: "để gửi cho bạn link mới hoặc tăng giới hạn."
+
+ # ============================================================================
+ # BOARDS
+ # ============================================================================
+ boards:
+ new:
+ title: "Tạo bảng mới"
+ name_placeholder: "Đặt tên…"
+ validation_blank: "Tên bảng không được để trống"
+ submit: "Tạo bảng"
+ cancel: "Hủy và quay lại"
+
+ edit:
+ title: "Cài đặt bảng"
+ subtitle: "Chỉ quản trị viên mới có thể thay đổi cài đặt này"
+ name_placeholder: "Tên bảng…"
+ submit: "Lưu thay đổi"
+ saved: "Đã lưu"
+ saved_removed: "Đã lưu (bạn đã bị xóa khỏi bảng)"
+
+ access:
+ title: "Ai có thể truy cập bảng này?"
+ everyone: "Tất cả mọi người"
+ everyone_access: "Cho phép tất cả mọi người truy cập bảng này"
+ filter_placeholder: "Lọc…"
+ select_all: "Chọn tất cả"
+ select_none: "Bỏ chọn tất cả"
+ self_removal_warning: "Bạn có chắc muốn xóa bản thân khỏi bảng này? Bạn sẽ không thể quay lại trừ khi ai đó mời bạn."
+
+ publication:
+ title: "Liên kết công khai"
+ description: "Bật liên kết công khai để chia sẻ bảng này với bất kỳ ai trên thế giới. Họ không cần đăng nhập và không thể xem bất kỳ thứ gì khác trong Fizzy."
+ turn_off: "Tắt liên kết công khai"
+ turn_on: "Bật liên kết công khai"
+ copy_link: "Sao chép liên kết công khai"
+ description_label: "Thêm mô tả tùy chọn cho trang công khai"
+ description_placeholder: "Thêm ghi chú công khai về bảng này…"
+
+ auto_close:
+ title: "Tự động đóng"
+ description: "Fizzy không để các thẻ cũ nằm mãi. Thẻ sẽ tự động chuyển sang \"Tạm hoãn\" nếu không ai cập nhật, bình luận hoặc di chuyển trong…"
+ days_label: "Số ngày trước khi tự động đóng"
+
+ delete:
+ button: "Xóa bảng này"
+ confirm_title: "Xóa bảng này?"
+ confirm_message: "Bạn có chắc muốn xóa vĩnh viễn bảng này và tất cả các thẻ trong đó không? Hành động này không thể hoàn tác."
+ confirm_button: "Xóa bảng"
+
+ # ============================================================================
+ # CARDS
+ # ============================================================================
+ cards:
+ operations:
+ deleted: "Đã xóa thẻ"
+ added: "Đã thêm thẻ"
+
+ edit:
+ title_placeholder: "Đặt tên…"
+ description_placeholder: "Thêm ghi chú, ngữ cảnh, hình ảnh hoặc video về thẻ này…"
+ cancel: "Đóng trình soạn thảo và hủy thay đổi"
+ edit_button: "Chỉnh sửa"
+ mark_done: "Đánh dấu hoàn thành"
+ save_changes: "Lưu thay đổi"
+
+ status:
+ not_now: "Tạm hoãn"
+ maybe: "Có thể?"
+ done: "Hoàn thành"
+ choose_column: "Chọn cột cho thẻ này"
+
+ delete:
+ button: "Xóa thẻ này"
+ confirm_title: "Xóa thẻ này?"
+ confirm_message: "Bạn có chắc muốn xóa vĩnh viễn thẻ này không?"
+ confirm_button: "Xóa thẻ"
+ cancel: "Hủy"
+
+ steps:
+ add_placeholder: "Thêm bước…"
+ edit_placeholder: "Đặt tên cho bước này…"
+ delete: "Xóa bước này"
+
+ default_title: "Chưa đặt tên"
+ no_cards_match_filter: "Không có thẻ nào khớp với bộ lọc này"
+
+ assignments:
+ title: "Giao cho…"
+ me: "Tôi"
+
+ move_to_board:
+ title: "Chuyển thẻ này đến…"
+
+ # ============================================================================
+ # COLUMNS
+ # ============================================================================
+ columns:
+ add_button: "Thêm cột"
+ add_dialog_label: "Thêm cột"
+ name_placeholder: "Đặt tên cột"
+ validation_blank: "Tên cột không được để trống"
+ delete_confirm: "Bạn có chắc muốn xóa cột này? Các thẻ sẽ được chuyển về Có thể."
+ options: "Tùy chọn cột"
+ edit: "Chỉnh sửa cột"
+ move_left: "Di chuyển sang trái"
+ move_right: "Di chuyển sang phải"
+ delete: "Xóa cột"
+ not_now_title: "Cột: Tạm hoãn"
+ done_title: "Cột: Hoàn thành"
+ drag_cards_here: "Kéo thẻ vào đây"
+ no_cards_here: "Không có thẻ nào"
+ maximize: "Phóng to cột"
+ expand: "Mở rộng cột"
+
+ # ============================================================================
+ # USERS
+ # ============================================================================
+ users:
+ profile:
+ edit_button: "Chỉnh sửa hồ sơ"
+ edit_title: "Chỉnh sửa hồ sơ của bạn"
+ name_placeholder: "Tên"
+ email_placeholder: "Địa chỉ email"
+ change_email: "Đổi email"
+ delete_avatar: "Xóa ảnh đại diện"
+ delete_avatar_confirm: "Bạn có chắc muốn xóa ảnh đại diện? Hành động này không thể hoàn tác."
+ my_profile: "Hồ sơ của tôi"
+
+ status:
+ inactive: "không còn trong tài khoản này"
+ unverified: "Chưa xác thực"
+ unverified_explanation: "Mã đăng nhập đã được gửi đến địa chỉ email này, nhưng người dùng chưa đăng nhập để xác nhận danh tính."
+
+ queries:
+ me: "tôi"
+ assigned_to: "Thẻ nào được giao cho"
+ added_by: "Thẻ nào được thêm bởi"
+
+ email_change:
+ new_email_placeholder: "Địa chỉ email mới"
+ already_exists: "Bạn đã có người dùng trong tài khoản này với địa chỉ email đó"
+ title: "Đổi địa chỉ email"
+ instructions: "Nhập địa chỉ email mới, sau đó kiểm tra hộp thư để xác nhận thay đổi."
+ confirm_title: "Xác nhận địa chỉ email mới"
+ check_email: "Kiểm tra hộp thư"
+ email_sent_to_html: "Chúng tôi vừa gửi email đến %{email}"
+ confirm_instructions: "Nhấp vào link trong email để xác nhận đây là địa chỉ email bạn muốn sử dụng với Fizzy."
+ confirming_title: "Xác nhận thay đổi email"
+ confirming_message: "Chờ một chút trong khi chúng tôi xác nhận địa chỉ email mới của bạn."
+ link_expired_title: "Link đã hết hạn"
+ link_expired_message: "Link xác nhận email không còn hiệu lực—chúng hết hạn sau 30 phút. Bạn cần thử lại."
+ change_email_button: "Đổi địa chỉ email của tôi"
+ stuck_message_html: "Nếu bạn gặp vấn đề, %{email_link} và chúng tôi sẽ giúp bạn."
+ send_email: "gửi email cho chúng tôi"
+
+ logout: "Đăng xuất"
+
+ joins:
+ title: "Tuyệt vời! Bây giờ nhập tên của bạn"
+ name_placeholder: "Họ và tên"
+
+ # ============================================================================
+ # ACCOUNT
+ # ============================================================================
+ account:
+ settings:
+ title: "Cài đặt tài khoản"
+ subtitle: "Chỉ quản trị viên mới có thể thay đổi cài đặt này"
+ name_placeholder: "Tên tài khoản…"
+ updated: "Đã cập nhật tài khoản"
+
+ people:
+ title: "Người trong tài khoản này"
+ invite: "Mời người"
+ remove_confirm: "Bạn có chắc muốn xóa vĩnh viễn người này khỏi tài khoản?"
+ role_label: "Vai trò: %{role}"
+ remove_user: "Xóa %{name} khỏi tài khoản"
+
+ entropy:
+ title: "Tự động đóng"
+ description: "Fizzy không để các thẻ cũ nằm mãi. Thẻ tự động chuyển sang \"Tạm hoãn\" nếu không có hoạt động trong một khoảng thời gian. Đây là cài đặt mặc định toàn cục — bạn có thể ghi đè trên từng bảng."
+
+ export:
+ title: "Xuất dữ liệu"
+ description: "Tải về bản lưu trữ dữ liệu Fizzy của bạn."
+ button: "Bắt đầu xuất..."
+ dialog_title: "Xuất dữ liệu tài khoản"
+ dialog_body_1: "Điều này sẽ tạo một file ZIP chứa tất cả dữ liệu trong các bảng bạn có quyền truy cập."
+ dialog_body_2: "Khi file sẵn sàng, chúng tôi sẽ gửi email cho bạn với link tải về. Link sẽ hết hạn sau 24 giờ."
+ start_button: "Bắt đầu xuất"
+ cancel: "Hủy"
+ started: "Đã bắt đầu xuất. Bạn sẽ nhận được email khi sẵn sàng."
+ download_title: "Tải xuống dữ liệu"
+ expired_title: "Link tải đã hết hạn"
+ ready_message: "Dữ liệu xuất của bạn đã sẵn sàng. Tải xuống sẽ tự động bắt đầu."
+ download_data: "Tải về dữ liệu"
+ expired_message_html: "Link tải đã hết hạn. Bạn cần %{link}."
+ request_new: "yêu cầu xuất mới"
+
+ join_codes:
+ title: "Thêm người"
+ description: "Chia sẻ link bên dưới để mời người vào tài khoản này"
+ invite_link: "Link mời"
+ generate_new: "Tạo mã mới"
+ generate_confirm: "Bạn có chắc muốn tạo link mới? Mã cũ sẽ ngừng hoạt động."
+ copy_link: "Sao chép link mời"
+ get_qr: "Lấy mã QR"
+ qr_instruction: "Quét mã này bằng camera trên thiết bị di động"
+ done: "Xong"
+ used_times: "Mã này đã được sử dụng"
+ times: "lần"
+ remaining: "còn lại"
+ none: "hết"
+ change_limit: "Đổi giới hạn"
+ change_limit_title: "Đổi giới hạn sử dụng"
+ change_limit_label: "Link này có thể được sử dụng bao nhiêu lần để tham gia tài khoản?"
+ go_back: "Quay lại"
+
+ # ============================================================================
+ # NOTIFICATIONS
+ # ============================================================================
+ notifications:
+ index:
+ title: "Thông báo"
+ home: "Trang chủ"
+ settings_button: "Cài đặt thông báo"
+ mark_all_read: "Đánh dấu tất cả đã đọc"
+ previously_seen: "Đã xem trước đó"
+ new_for_you: "Mới cho bạn"
+ nothing_new: "Không có gì mới cho bạn."
+ showing_recent: "Đang hiển thị %{count} thông báo gần nhất (%{hidden} đang ẩn)"
+
+ settings:
+ title: "Cài đặt thông báo"
+ boards_section: "Bảng"
+ updated: "Đã cập nhật cài đặt"
+
+ email:
+ title: "Thông báo email"
+ description: "Nhận một email duy nhất với tất cả thông báo của bạn mỗi vài giờ, hàng ngày hoặc hàng tuần."
+ frequency_label: "Gửi email về thông báo mới..."
+
+ push:
+ status_on: "Thông báo đẩy đang BẬT"
+ status_off: "Thông báo đẩy đang TẮT"
+ turn_on: "Bật thông báo đẩy trên thiết bị này"
+ help_toggle: "Giúp tôi sửa lỗi"
+ not_receiving: "Không nhận được thông báo?"
+ help_text: "Khi thông báo đẩy không hoạt động, thường có thể khắc phục bằng cách kiểm tra cài đặt thông báo để đảm bảo chúng được cho phép."
+ install_message_1: "Để nhận thông báo đẩy trong"
+ install_message_2: "cho"
+ install_message_3: "bạn phải cài đặt Fizzy như một ứng dụng web trước."
+ apple_menu_instruction: "Nhấp vào menu Apple ở góc trên bên trái."
+
+ unsubscribe:
+ message: "Hủy đăng ký tất cả thông báo email với tư cách"
+ button: "Hủy đăng ký ngay"
+ thanks: "Cảm ơn,"
+ success_message: "Fizzy sẽ không gửi thêm thông báo email cho bạn nữa. Nếu bạn đổi ý, bạn có thể bật lại trong"
+ settings_link: "Cài đặt thông báo"
+ invalid_link: "Link hủy đăng ký không hợp lệ"
+
+ # ============================================================================
+ # MAILERS
+ # ============================================================================
+ mailers:
+ magic_link:
+ subject: "Mã Fizzy của bạn là %{code}"
+ heading_signin: "Mã xác thực Fizzy"
+ heading_signup: "Chào mừng đến với Fizzy!"
+ body_signin: "Vui lòng nhập mã xác thực 6 ký tự này trên trang đăng nhập Fizzy:"
+ body_signup: "Vui lòng nhập mã xác thực 6 ký tự này trên trang đăng ký Fizzy để tạo tài khoản mới:"
+ expires_in: "Mã này có hiệu lực trong"
+ support_link: "Gửi email cho chúng tôi"
+
+ export:
+ subject: "Dữ liệu xuất Fizzy của bạn đã sẵn sàng để tải về"
+ heading: "Tải về dữ liệu Fizzy của bạn"
+ body: "Việc xuất dữ liệu Fizzy của bạn đã hoàn tất và sẵn sàng để tải về."
+ download_link: "Tải về dữ liệu"
+ need_help: "Cần trợ giúp?"
+ support_link: "Gửi email cho chúng tôi"
+
+ notification_bundle:
+ subject: "Fizzy: Thông báo mới"
+ you_have: "Bạn có"
+ new_notification: "thông báo mới"
+ new_notifications: "thông báo mới"
+ in_account: "trong"
+ change_frequency: "Thay đổi tần suất nhận"
+ or: "hoặc"
+ unsubscribe: "hủy đăng ký tất cả thông báo email"
+
+ email_change:
+ subject: "Xác nhận địa chỉ email mới của bạn"
+ body: "Nhấp vào link bên dưới để sử dụng địa chỉ email này trong Fizzy:"
+ disclaimer: "Nếu bạn không yêu cầu thay đổi này, bạn có thể bỏ qua email này. Địa chỉ email của bạn SẼ KHÔNG được thay đổi trừ khi bạn nhấp vào nút."
+
+ # ============================================================================
+ # SEARCH
+ # ============================================================================
+ search:
+ placeholder: "Tìm kiếm…"
+ label: "Tìm kiếm Fizzy"
+ close: "Đóng tìm kiếm"
+ find_placeholder: "Tìm gì đó…"
+
+ # ============================================================================
+ # SHORTCUTS / FILTERS
+ # ============================================================================
+ shortcuts:
+ golden_cards: "Thẻ vàng"
+ stalled_cards: "Thẻ bị trì hoãn"
+ closing_soon: "Thẻ sắp đóng"
+ added_today: "Thêm hôm nay"
+ done_today: "Hoàn thành hôm nay"
+
+ # ============================================================================
+ # EVENTS / ACTIVITY
+ # ============================================================================
+ events:
+ index:
+ home: "Trang chủ"
+ activity: "Hoạt động"
+ latest_activity: "Hoạt động gần đây"
+ in: "trong"
+ across: "trên"
+
+ # ============================================================================
+ # TAGS
+ # ============================================================================
+ tags:
+ all_tags: "Tất cả nhãn"
+
+ # ============================================================================
+ # WEBHOOKS
+ # ============================================================================
+ webhooks:
+ delete_confirm: "Bạn có chắc muốn xóa vĩnh viễn webhook này?"
+ index:
+ title: "Webhooks"
+ description_1: "Webhooks có thể thông báo cho ứng dụng khác khi có điều gì đó xảy ra trong bảng Fizzy này. Bạn sẽ chọn những sự kiện để đăng ký và cung cấp URL để nhận dữ liệu."
+ description_2: "Ví dụ, bạn có thể tạo webhook gửi thông báo đến chat Campfire trong Basecamp khi có thẻ mới được thêm vào Fizzy."
+ setup_new: "Thiết lập webhook mới"
+ new:
+ title: "Thiết lập Webhook"
+ create_button: "Tạo Webhook"
+ form:
+ name_placeholder: "Đặt tên Webhook này…"
+ payload_url: "URL nhận dữ liệu"
+ payload_url_description: "Đây là URL của ứng dụng sẽ nhận dữ liệu từ Fizzy."
+ url_validation: "Phải là URL http:// hoặc https://"
+ events: "Sự kiện"
+ events_description: "Gọi URL nhận dữ liệu khi những sự kiện này xảy ra:"
+
+ # ============================================================================
+ # COMMENTS
+ # ============================================================================
+ comments:
+ delete_confirm: "Bạn có chắc muốn xóa bình luận này?"
+ edit: "Chỉnh sửa bình luận"
+ post: "Đăng"
+ post_title: "Đăng bình luận này"
+
+ # ============================================================================
+ # REACTIONS
+ # ============================================================================
+ reactions:
+ new_reaction: "Biểu cảm mới"
+ add_reaction: "Thêm biểu cảm"
+
+ # ============================================================================
+ # COMMON / SHARED
+ # ============================================================================
+ common:
+ buttons:
+ save: "Lưu"
+ save_changes: "Lưu thay đổi"
+ cancel: "Hủy"
+ continue: "Tiếp tục"
+ done: "Xong"
+ delete: "Xóa"
+ edit: "Chỉnh sửa"
+ add: "Thêm"
+ close: "Đóng"
+ go_back: "Quay lại"
+ submit: "Gửi"
+
+ confirmations:
+ are_you_sure: "Bạn có chắc không?"
+
+ forms:
+ filter_placeholder: "Lọc…"
+
+ errors:
+ changes_not_saved: "Các thay đổi của bạn không thể được lưu:"
+ try_again_later: "Vui lòng thử lại sau."
+
+ time:
+ minutes: "phút"
+ hours: "giờ"
+ days: "ngày"
+ weeks: "tuần"
+
+ # ============================================================================
+ # ACTIVERECORD ERRORS & VALIDATIONS
+ # ============================================================================
+ activerecord:
+ errors:
+ models:
+ board:
+ attributes:
+ name:
+ blank: "Tên bảng không được để trống"
+ column:
+ attributes:
+ name:
+ blank: "Tên cột không được để trống"
+ user:
+ attributes:
+ name:
+ blank: "Tên không được để trống"
+ avatar:
+ content_type_invalid: "phải là ảnh JPEG, PNG, GIF hoặc WebP"
+ webhook:
+ attributes:
+ endpoint:
+ invalid_url: "không phải là URL hợp lệ"
+ must_use_https: "phải sử dụng HTTPS"
+ identity:
+ attributes:
+ email:
+ invalid: "không phải là địa chỉ email hợp lệ"
+ taken: "đã được sử dụng"
+
+ attributes:
+ user:
+ name: "Tên"
+ email: "Email"
+ avatar: "Ảnh đại diện"
+ board:
+ name: "Tên"
+ card:
+ title: "Tiêu đề"
+ description: "Mô tả"
+ column:
+ name: "Tên"
diff --git a/config/storage.oss.yml b/config/storage.oss.yml
index e50debd344..04c1ba0e45 100644
--- a/config/storage.oss.yml
+++ b/config/storage.oss.yml
@@ -16,3 +16,7 @@ devminio:
region: us-east-1 # default region required for signer
access_key_id: minioadmin
secret_access_key: minioadmin
+
+production:
+ service: Disk
+ root: <%= Rails.root.join("storage", "production", "files") %>