diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 66677a6c1..3e5c73e3a 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -168,7 +168,8 @@ module LanguagesHelper "zh-CN", # Chinese (Simplified) "zh-TW", # Chinese (Traditional) "nl", # Dutch - "hu" # Hungarian + "hu", # Hungarian + "vi" # Vietnamese ].freeze COUNTRY_MAPPING = { diff --git a/config/locales/breadcrumbs/vi.yml b/config/locales/breadcrumbs/vi.yml new file mode 100644 index 000000000..4da248872 --- /dev/null +++ b/config/locales/breadcrumbs/vi.yml @@ -0,0 +1,87 @@ +--- +vi: + breadcrumbs: + account_sharings: Chia sẻ tài khoản + account_statements: Kho sao kê + accounts: Tài khoản + ai_prompts: Câu lệnh AI + api_key: Khóa API + api_keys: Khóa API + appearance: Giao diện + appearances: Giao diện + bank_sync: Đồng bộ ngân hàng + binance_items: Binance + brex_items: Brex + budget_categories: Danh mục ngân sách + budgets: Ngân sách + categories: Danh mục + categorize: Phân loại + chats: Trò chuyện + coinbase_items: Coinbase + coinstats_items: CoinStats + credit_cards: Thẻ tín dụng + cryptos: Tiền mã hóa + dashboard: Bảng điều khiển + debug: Gỡ lỗi + debugs: Gỡ lỗi + depositories: Tài khoản tiền mặt + enable_banking_items: Enable Banking + exports: Xuất dữ liệu + family_exports: Xuất dữ liệu + family_merchants: Nhà cung cấp + guides: Hướng dẫn + holdings: Danh mục nắm giữ + home: Trang chủ + hostings: Tự lưu trữ + ibkr_items: Interactive Brokers + impersonation_sessions: Mạo danh + imports: Nhập dữ liệu + indexa_capital_items: Indexa Capital + intro: Giới thiệu + investments: Đầu tư + invitations: Lời mời + invite_codes: Mã mời + kraken_items: Kraken + llm_usage: Sử dụng LLM + llm_usages: Sử dụng LLM + loans: Khoản vay + lunchflow_items: Lunch Flow + merchants: Nhà cung cấp + mercury_items: Mercury + messages: Tin nhắn + mfa: Xác thực hai yếu tố + oidc_accounts: Tài khoản SSO + onboardings: Khởi đầu + other_assets: Tài sản khác + other_liabilities: Nợ khác + payments: Thanh toán + pending_duplicate_merges: Xem xét trùng lặp + plaid_items: Plaid + preferences: Tùy chọn + profile: Thông tin hồ sơ + profiles: Thông tin hồ sơ + properties: Bất động sản + providers: Nhà cung cấp dịch vụ + recurring_transactions: Định kỳ + registrations: Đăng ký + reports: Báo cáo + rules: Quy tắc + securities: Chứng khoán + security: Bảo mật + self_hosting: Tự lưu trữ + sessions: Đăng nhập + simplefin_items: SimpleFIN + snaptrade_items: SnapTrade + sophtron_items: Sophtron + splits: Phân chia + sso_identities: Kết nối SSO + sso_providers: Nhà cung cấp SSO + subscriptions: Gói đăng ký + tags: Nhãn + trades: Giao dịch chứng khoán + transactions: Giao dịch + transfer_matches: Khớp chuyển khoản + transfers: Chuyển khoản + users: Người dùng + valuations: Định giá + vehicles: Phương tiện diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml new file mode 100644 index 000000000..c1f00ce30 --- /dev/null +++ b/config/locales/doorkeeper.vi.yml @@ -0,0 +1,149 @@ +vi: + activerecord: + attributes: + doorkeeper/application: + name: 'Tên' + redirect_uri: 'URI chuyển hướng' + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: 'không được chứa fragment.' + invalid_uri: 'phải là URI hợp lệ.' + unspecified_scheme: 'phải chỉ định scheme.' + relative_uri: 'phải là URI tuyệt đối.' + secured_uri: 'phải là URI HTTPS/SSL.' + forbidden_uri: 'bị cấm bởi máy chủ.' + scopes: + not_match_configured: "không khớp với cấu hình trên máy chủ." + + doorkeeper: + applications: + confirmations: + destroy: 'Bạn có chắc không?' + buttons: + edit: 'Chỉnh sửa' + destroy: 'Xóa' + submit: 'Gửi' + cancel: 'Hủy' + authorize: 'Ủy quyền' + form: + error: 'Ối! Kiểm tra biểu mẫu để phát hiện lỗi' + help: + confidential: 'Ứng dụng sẽ được sử dụng khi client secret có thể được giữ bí mật. Ứng dụng di động native và SPA được coi là không bảo mật.' + redirect_uri: 'Dùng một dòng cho mỗi URI' + blank_redirect_uri: "Để trống nếu bạn đã cấu hình nhà cung cấp sử dụng Client Credentials, Resource Owner Password Credentials hoặc loại cấp khác không yêu cầu redirect URI." + scopes: 'Phân tách phạm vi bằng khoảng trắng. Để trống để dùng phạm vi mặc định.' + edit: + title: 'Chỉnh sửa ứng dụng' + index: + title: 'Ứng dụng của bạn' + new: 'Ứng dụng mới' + name: 'Tên' + callback_url: 'URL callback' + confidential: 'Bảo mật?' + actions: 'Hành động' + confidentiality: + 'yes': 'Có' + 'no': 'Không' + new: + title: 'Ứng dụng mới' + show: + title: 'Ứng dụng: %{name}' + application_id: 'UID' + secret: 'Bí mật' + secret_hashed: 'Bí mật đã mã hóa' + scopes: 'Phạm vi' + confidential: 'Bảo mật' + callback_urls: 'URL callback' + actions: 'Hành động' + not_defined: 'Chưa xác định' + + authorizations: + buttons: + authorize: 'Ủy quyền' + deny: 'Từ chối' + error: + title: 'Đã xảy ra lỗi' + go_back: 'Quay lại' + new: + title: 'Yêu cầu ủy quyền' + prompt: 'Ủy quyền cho %{client_name} sử dụng tài khoản của bạn?' + able_to: 'Ứng dụng này sẽ có thể' + show: + title: 'Mã ủy quyền' + authorization_code_label: 'Mã ủy quyền:' + copy_instructions: 'Sao chép mã này và dán vào ứng dụng.' + form_post: + title: 'Gửi biểu mẫu này' + + authorized_applications: + confirmations: + revoke: 'Bạn có chắc không?' + buttons: + revoke: 'Thu hồi' + index: + title: 'Ứng dụng đã được ủy quyền' + application: 'Ứng dụng' + created_at: 'Ngày tạo' + date_format: '%d-%m-%Y %H:%M:%S' + + pre_authorization: + status: 'Tiền ủy quyền' + + errors: + messages: + invalid_request: + unknown: 'Yêu cầu thiếu tham số bắt buộc, bao gồm giá trị tham số không được hỗ trợ, hoặc có định dạng sai.' + missing_param: 'Thiếu tham số bắt buộc: %{value}.' + request_not_authorized: 'Yêu cầu cần được ủy quyền. Tham số bắt buộc để ủy quyền yêu cầu bị thiếu hoặc không hợp lệ.' + invalid_code_challenge: 'Cần có code challenge.' + invalid_redirect_uri: "URI chuyển hướng được yêu cầu không hợp lệ hoặc không khớp với URI chuyển hướng của client." + unauthorized_client: 'Client không được phép thực hiện yêu cầu này bằng phương thức này.' + access_denied: 'Chủ sở hữu tài nguyên hoặc máy chủ ủy quyền đã từ chối yêu cầu.' + invalid_scope: 'Phạm vi được yêu cầu không hợp lệ, không xác định, hoặc có định dạng sai.' + invalid_code_challenge_method: + zero: 'Máy chủ ủy quyền không hỗ trợ PKCE vì không có giá trị code_challenge_method được chấp nhận.' + one: 'code_challenge_method phải là %{challenge_methods}.' + other: 'code_challenge_method phải là một trong %{challenge_methods}.' + server_error: 'Máy chủ ủy quyền gặp điều kiện không mong muốn ngăn không thể thực hiện yêu cầu.' + temporarily_unavailable: 'Máy chủ ủy quyền hiện không thể xử lý yêu cầu do quá tải tạm thời hoặc bảo trì.' + credential_flow_not_configured: 'Luồng Resource Owner Password Credentials thất bại do Doorkeeper.configure.resource_owner_from_credentials chưa được cấu hình.' + resource_owner_authenticator_not_configured: 'Tìm Resource Owner thất bại do Doorkeeper.configure.resource_owner_authenticator chưa được cấu hình.' + admin_authenticator_not_configured: 'Truy cập bảng quản trị bị cấm do Doorkeeper.configure.admin_authenticator chưa được cấu hình.' + unsupported_response_type: 'Máy chủ ủy quyền không hỗ trợ loại phản hồi này.' + unsupported_response_mode: 'Máy chủ ủy quyền không hỗ trợ chế độ phản hồi này.' + invalid_client: 'Xác thực client thất bại do client không xác định, không có xác thực client, hoặc phương thức xác thực không được hỗ trợ.' + invalid_grant: 'Authorization grant được cung cấp không hợp lệ, đã hết hạn, bị thu hồi, không khớp với URI chuyển hướng được dùng trong yêu cầu ủy quyền, hoặc được cấp cho client khác.' + unsupported_grant_type: 'Loại authorization grant không được máy chủ ủy quyền hỗ trợ.' + invalid_token: + revoked: "Access token đã bị thu hồi" + expired: "Access token đã hết hạn" + unknown: "Access token không hợp lệ" + revoke: + unauthorized: "Bạn không được phép thu hồi token này" + forbidden_token: + missing_scope: 'Truy cập tài nguyên này yêu cầu phạm vi "%{oauth_scopes}".' + + flash: + applications: + create: + notice: 'Đã tạo ứng dụng.' + destroy: + notice: 'Đã xóa ứng dụng.' + update: + notice: 'Đã cập nhật ứng dụng.' + authorized_applications: + destroy: + notice: 'Đã thu hồi ứng dụng.' + + layouts: + admin: + title: 'Doorkeeper' + nav: + oauth2_provider: 'Nhà cung cấp OAuth2' + applications: 'Ứng dụng' + home: 'Trang chủ' + application: + title: 'Yêu cầu ủy quyền OAuth' diff --git a/config/locales/mailers/invitation_mailer/vi.yml b/config/locales/mailers/invitation_mailer/vi.yml new file mode 100644 index 000000000..dd3ab75fa --- /dev/null +++ b/config/locales/mailers/invitation_mailer/vi.yml @@ -0,0 +1,5 @@ +--- +vi: + invitation_mailer: + invite_email: + subject: "%{inviter} đã mời bạn tham gia hộ gia đình của họ trên %{product_name}!" diff --git a/config/locales/mailers/pdf_import_mailer/vi.yml b/config/locales/mailers/pdf_import_mailer/vi.yml new file mode 100644 index 000000000..ac844818a --- /dev/null +++ b/config/locales/mailers/pdf_import_mailer/vi.yml @@ -0,0 +1,5 @@ +--- +vi: + pdf_import_mailer: + next_steps: + subject: "Tài liệu PDF của bạn đã được phân tích - %{product_name}" diff --git a/config/locales/models/account/vi.yml b/config/locales/models/account/vi.yml new file mode 100644 index 000000000..6aa8c1b93 --- /dev/null +++ b/config/locales/models/account/vi.yml @@ -0,0 +1,34 @@ +--- +vi: + account_order: + balance_asc: + label: Số dư (Thấp đến Cao) + label_short: Số dư ↑ + balance_desc: + label: Số dư (Cao đến Thấp) + label_short: Số dư ↓ + name_asc: + label: Tên (A-Z) + label_short: Tên ↑ + name_desc: + label: Tên (Z-A) + label_short: Tên ↓ + activerecord: + attributes: + account: + balance: Số dư + currency: Tiền tệ + family: "%{moniker}" + family_id: "%{moniker}" + name: Tên + subtype: Loại phụ + models: + account: Tài khoản + account/credit: Thẻ tín dụng + account/depository: Tài khoản ngân hàng + account/investment: Đầu tư + account/loan: Khoản vay + account/other_asset: Tài sản khác + account/other_liability: Nợ khác + account/property: Bất động sản + account/vehicle: Phương tiện diff --git a/config/locales/models/account_statement/vi.yml b/config/locales/models/account_statement/vi.yml new file mode 100644 index 000000000..b6631b0eb --- /dev/null +++ b/config/locales/models/account_statement/vi.yml @@ -0,0 +1,30 @@ +--- +vi: + activerecord: + attributes: + account_statement: + account: Tài khoản + account_last4_hint: Bốn số cuối tài khoản + account_name_hint: Gợi ý tên tài khoản + closing_balance: Số dư đóng kỳ + content_sha256: Mã kiểm tra nội dung + currency: Tiền tệ + filename: Tên tệp + institution_name_hint: Gợi ý tổ chức + opening_balance: Số dư mở kỳ + original_file: Tệp sao kê + period_end_on: Ngày kết thúc kỳ + period_start_on: Ngày bắt đầu kỳ + errors: + models: + account_statement: + attributes: + checksum: + duplicate_statement_file: đã được tải lên cho hộ gia đình này + content_sha256: + duplicate_statement_file: đã được tải lên cho hộ gia đình này + original_file: + invalid_format: phải là tệp PDF, CSV hoặc XLSX + too_large: quá lớn. Kích thước tối đa là %{max_mb}MB + period_end_on: + on_or_after_start: phải từ ngày bắt đầu kỳ trở đi diff --git a/config/locales/models/address/vi.yml b/config/locales/models/address/vi.yml new file mode 100644 index 000000000..d59892690 --- /dev/null +++ b/config/locales/models/address/vi.yml @@ -0,0 +1,11 @@ +--- +vi: + address: + attributes: + country: Quốc gia + line1: Địa chỉ dòng 1 + line2: Địa chỉ dòng 2 + locality: Địa phương + postal_code: Mã bưu chính + region: Vùng + format: "%{line1} %{line2}, %{locality}, %{region} %{postal_code} %{country}" diff --git a/config/locales/models/api_key/vi.yml b/config/locales/models/api_key/vi.yml new file mode 100644 index 000000000..f1d58b309 --- /dev/null +++ b/config/locales/models/api_key/vi.yml @@ -0,0 +1,7 @@ +--- +vi: + activerecord: + errors: + models: + api_key: + cannot_destroy_demo_key: "Không thể xóa khóa API theo dõi demo" diff --git a/config/locales/models/brex_item/vi.yml b/config/locales/models/brex_item/vi.yml new file mode 100644 index 000000000..6d5234255 --- /dev/null +++ b/config/locales/models/brex_item/vi.yml @@ -0,0 +1,14 @@ +--- +vi: + activerecord: + attributes: + brex_item: + base_url: URL cơ sở + name: Tên kết nối + token: Token + errors: + models: + brex_item: + attributes: + base_url: + official_hosts_only: phải để trống, https://api.brex.com, hoặc https://api-staging.brex.com diff --git a/config/locales/models/category/vi.yml b/config/locales/models/category/vi.yml new file mode 100644 index 000000000..6d407dde4 --- /dev/null +++ b/config/locales/models/category/vi.yml @@ -0,0 +1,29 @@ +--- +vi: + models: + category: + uncategorized: Chưa phân loại + other_investments: Đầu tư khác + investment_contributions: Đóng góp đầu tư + defaults: + income: Thu nhập + food_and_drink: Ăn uống + groceries: Thực phẩm + shopping: Mua sắm + transportation: Giao thông + travel: Du lịch + entertainment: Giải trí + healthcare: Chăm sóc sức khỏe + personal_care: Chăm sóc cá nhân + home_improvement: Cải thiện nhà ở + mortgage_rent: Thế chấp / Thuê nhà + utilities: Tiện ích + subscriptions: Đăng ký dịch vụ + insurance: Bảo hiểm + sports_and_fitness: Thể thao & Thể hình + gifts_and_donations: Quà tặng & Từ thiện + taxes: Thuế + loan_payments: Thanh toán khoản vay + services: Dịch vụ + fees: Phí + savings_and_investments: Tiết kiệm & Đầu tư diff --git a/config/locales/models/category_import/vi.yml b/config/locales/models/category_import/vi.yml new file mode 100644 index 000000000..5eb55c925 --- /dev/null +++ b/config/locales/models/category_import/vi.yml @@ -0,0 +1,8 @@ +--- +vi: + activerecord: + errors: + models: + category_import: + own_parent: "Danh mục '%{name}' không thể là danh mục cha của chính nó" + missing_columns: "Thiếu các cột bắt buộc: %{columns}" diff --git a/config/locales/models/chat/vi.yml b/config/locales/models/chat/vi.yml new file mode 100644 index 000000000..44c5c063f --- /dev/null +++ b/config/locales/models/chat/vi.yml @@ -0,0 +1,8 @@ +--- +vi: + chat: + errors: + rate_limited: "Nhà cung cấp AI đang bị giới hạn tốc độ. Vui lòng thử lại sau vài phút." + temporarily_unavailable: "Nhà cung cấp AI tạm thời không khả dụng. Vui lòng thử lại sau vài phút." + misconfigured: "Nhà cung cấp AI chưa được cấu hình đúng. Vui lòng liên hệ quản trị viên." + default: "Không thể tạo phản hồi. Vui lòng thử lại." diff --git a/config/locales/models/coinbase_account/vi.yml b/config/locales/models/coinbase_account/vi.yml new file mode 100644 index 000000000..a26ef6aaf --- /dev/null +++ b/config/locales/models/coinbase_account/vi.yml @@ -0,0 +1,5 @@ +--- +vi: + coinbase: + processor: + paid_via: "Thanh toán qua %{method}" diff --git a/config/locales/models/coinstats_item/vi.yml b/config/locales/models/coinstats_item/vi.yml new file mode 100644 index 000000000..df5809cfe --- /dev/null +++ b/config/locales/models/coinstats_item/vi.yml @@ -0,0 +1,10 @@ +--- +vi: + models: + coinstats_item: + syncer: + importing_wallets: Đang nhập tài khoản tiền mã hóa từ CoinStats... + checking_configuration: Đang kiểm tra cấu hình tài khoản CoinStats... + wallets_need_setup: "%{count} tài khoản tiền mã hóa cần thiết lập..." + processing_holdings: Đang xử lý danh mục nắm giữ... + calculating_balances: Đang tính số dư... diff --git a/config/locales/models/entry/vi.yml b/config/locales/models/entry/vi.yml new file mode 100644 index 000000000..8bef250e6 --- /dev/null +++ b/config/locales/models/entry/vi.yml @@ -0,0 +1,9 @@ +--- +vi: + activerecord: + errors: + models: + entry: + attributes: + base: + invalid_sell_quantity: không thể bán %{sell_qty} cổ phiếu %{ticker} vì bạn chỉ đang nắm giữ %{current_qty} cổ phiếu diff --git a/config/locales/models/import/vi.yml b/config/locales/models/import/vi.yml new file mode 100644 index 000000000..eddc4afd7 --- /dev/null +++ b/config/locales/models/import/vi.yml @@ -0,0 +1,18 @@ +--- +vi: + activerecord: + attributes: + import: + col_sep: Dấu phân cách cột + col_seps: + comma: Dấu phẩy (,) + semicolon: Dấu chấm phẩy (;) + currency: Tiền tệ + number_format: Định dạng số + errors: + models: + import: + duplicate_headers: "Tiêu đề CSV chuẩn hóa thành các cột trùng lặp: %{columns}" + attributes: + raw_file_str: + invalid_csv_format: không phải định dạng CSV hợp lệ diff --git a/config/locales/models/indexa_capital_item/vi.yml b/config/locales/models/indexa_capital_item/vi.yml new file mode 100644 index 000000000..fe05fbfed --- /dev/null +++ b/config/locales/models/indexa_capital_item/vi.yml @@ -0,0 +1,7 @@ +--- +vi: + activerecord: + errors: + models: + indexa_capital_item: + credentials_required: "Cần có biến môi trường INDEXA_API_TOKEN hoặc thông tin đăng nhập username/document/password" diff --git a/config/locales/models/period/vi.yml b/config/locales/models/period/vi.yml new file mode 100644 index 000000000..740d4f850 --- /dev/null +++ b/config/locales/models/period/vi.yml @@ -0,0 +1,54 @@ +--- +vi: + period: + last_day: + label_short: "1N" + label: "Hôm qua" + comparison_label: "so với hôm qua" + current_week: + label_short: "TNN" + label: "Tuần này" + comparison_label: "so với đầu tuần" + last_7_days: + label_short: "7N" + label: "7 Ngày Qua" + comparison_label: "so với tuần trước" + current_month: + label_short: "TTN" + label: "Tháng này" + comparison_label: "so với đầu tháng" + last_month: + label_short: "TT" + label: "Tháng Trước" + comparison_label: "so với tháng trước" + last_30_days: + label_short: "30N" + label: "30 Ngày Qua" + comparison_label: "so với 30 ngày trước" + last_90_days: + label_short: "90N" + label: "90 Ngày Qua" + comparison_label: "so với quý trước" + current_year: + label_short: "NĐN" + label: "Năm này" + comparison_label: "so với đầu năm" + last_365_days: + label_short: "365N" + label: "365 Ngày Qua" + comparison_label: "so với 1 năm trước" + last_5_years: + label_short: "5Năm" + label: "5 Năm Qua" + comparison_label: "so với 5 năm trước" + last_10_years: + label_short: "10Năm" + label: "10 Năm Qua" + comparison_label: "so với 10 năm trước" + all_time: + label_short: "Tất cả" + label: "Toàn thời gian" + comparison_label: "so với ban đầu" + custom: + label_short: "Tùy chỉnh" + label: "Khoảng thời gian tùy chỉnh" diff --git a/config/locales/models/plaid_account/vi.yml b/config/locales/models/plaid_account/vi.yml new file mode 100644 index 000000000..67cbbfb44 --- /dev/null +++ b/config/locales/models/plaid_account/vi.yml @@ -0,0 +1,7 @@ +--- +vi: + activerecord: + errors: + models: + plaid_account: + no_balance: "Tài khoản Plaid phải có số dư hiện tại hoặc số dư khả dụng" diff --git a/config/locales/models/provider_warnings/vi.yml b/config/locales/models/provider_warnings/vi.yml new file mode 100644 index 000000000..a088d1657 --- /dev/null +++ b/config/locales/models/provider_warnings/vi.yml @@ -0,0 +1,4 @@ +--- +vi: + provider_warnings: + limited_investment_data: "Dữ liệu đầu tư từ nhà cung cấp này còn hạn chế. Nhãn hoạt động (Mua, Bán, Cổ tức) không khả dụng, có thể ảnh hưởng đến độ chính xác của ngân sách. Hãy cân nhắc tạo quy tắc để loại trừ hoặc phân loại các giao dịch đầu tư." diff --git a/config/locales/models/recurring_transaction/vi.yml b/config/locales/models/recurring_transaction/vi.yml new file mode 100644 index 000000000..cb5c5652f --- /dev/null +++ b/config/locales/models/recurring_transaction/vi.yml @@ -0,0 +1,7 @@ +--- +vi: + activerecord: + errors: + models: + recurring_transaction: + merchant_or_name_required: "Phải có nhà cung cấp hoặc tên" diff --git a/config/locales/models/rule/vi.yml b/config/locales/models/rule/vi.yml new file mode 100644 index 000000000..9509ed811 --- /dev/null +++ b/config/locales/models/rule/vi.yml @@ -0,0 +1,9 @@ +--- +vi: + activerecord: + errors: + models: + rule: + min_actions: "phải có ít nhất một hành động" + duplicate_actions: "Quy tắc không được có các hành động trùng lặp %{types}" + nested_conditions: "Điều kiện phức hợp không thể lồng nhau" diff --git a/config/locales/models/rule_import/vi.yml b/config/locales/models/rule_import/vi.yml new file mode 100644 index 000000000..2dc419d82 --- /dev/null +++ b/config/locales/models/rule_import/vi.yml @@ -0,0 +1,9 @@ +--- +vi: + activerecord: + errors: + models: + rule_import: + unsupported_resource_type: "Loại tài nguyên không được hỗ trợ: %{resource_type}" + invalid_json: "JSON không hợp lệ trong điều kiện hoặc hành động: %{message}" + min_actions: "Quy tắc phải có ít nhất một hành động" diff --git a/config/locales/models/simplefin_account/vi.yml b/config/locales/models/simplefin_account/vi.yml new file mode 100644 index 000000000..31d864bda --- /dev/null +++ b/config/locales/models/simplefin_account/vi.yml @@ -0,0 +1,7 @@ +--- +vi: + activerecord: + errors: + models: + simplefin_account: + no_balance: "Tài khoản SimpleFin phải có số dư hiện tại hoặc số dư khả dụng" diff --git a/config/locales/models/sophtron_account/vi.yml b/config/locales/models/sophtron_account/vi.yml new file mode 100644 index 000000000..fbf30265e --- /dev/null +++ b/config/locales/models/sophtron_account/vi.yml @@ -0,0 +1,7 @@ +--- +vi: + activerecord: + errors: + models: + sophtron_account: + no_balance: "Tài khoản Sophtron phải có số dư hiện tại hoặc số dư khả dụng" diff --git a/config/locales/models/sso_provider/vi.yml b/config/locales/models/sso_provider/vi.yml new file mode 100644 index 000000000..04be849cc --- /dev/null +++ b/config/locales/models/sso_provider/vi.yml @@ -0,0 +1,12 @@ +--- +vi: + activerecord: + errors: + models: + sso_provider: + attributes: + settings: + saml_url_required: "Cần có URL Metadata IdP hoặc URL SSO IdP cho nhà cung cấp SAML" + saml_cert_required: "Cần có Chứng chỉ IdP hoặc Certificate Fingerprint khi không dùng metadata URL" + metadata_url_invalid: "URL Metadata IdP phải là URL hợp lệ" + sso_url_invalid: "URL SSO IdP phải là URL hợp lệ" diff --git a/config/locales/models/time_series/value/vi.yml b/config/locales/models/time_series/value/vi.yml new file mode 100644 index 000000000..2fd849ac0 --- /dev/null +++ b/config/locales/models/time_series/value/vi.yml @@ -0,0 +1,9 @@ +--- +vi: + activemodel: + errors: + models: + time_series/value: + attributes: + value: + must_be_a_money_or_numeric: phải là kiểu Money hoặc Numeric diff --git a/config/locales/models/transaction/vi.yml b/config/locales/models/transaction/vi.yml new file mode 100644 index 000000000..02a2b0a0c --- /dev/null +++ b/config/locales/models/transaction/vi.yml @@ -0,0 +1,11 @@ +--- +vi: + activerecord: + errors: + models: + transaction: + attributes: + attachments: + too_many: "không được vượt quá %{max} tệp mỗi giao dịch" + too_large: "tệp %{index} quá lớn (tối đa %{max_mb}MB)" + invalid_format: "tệp %{index} có định dạng không được hỗ trợ (%{file_format})" diff --git a/config/locales/models/transfer/vi.yml b/config/locales/models/transfer/vi.yml new file mode 100644 index 000000000..63ad1e531 --- /dev/null +++ b/config/locales/models/transfer/vi.yml @@ -0,0 +1,22 @@ +--- +vi: + activerecord: + errors: + models: + transfer: + attributes: + base: + inflow_cannot_be_in_multiple_transfers: Giao dịch nhận tiền không thể thuộc nhiều lần chuyển khoản + must_be_from_different_accounts: Chuyển khoản phải giữa hai tài khoản khác nhau + must_be_from_same_family: Chuyển khoản phải trong cùng một hộ gia đình + must_be_within_date_range: Ngày giao dịch chuyển khoản phải trong vòng 4 ngày nhau + must_have_opposite_amounts: Các giao dịch chuyển khoản phải có số tiền đối nghịch nhau + must_have_single_currency: Chuyển khoản phải sử dụng một loại tiền tệ duy nhất + outflow_cannot_be_in_multiple_transfers: Giao dịch gửi tiền không thể thuộc nhiều lần chuyển khoản + different_accounts: "Phải từ hai tài khoản khác nhau" + same_family: "Phải trong cùng một hộ gia đình" + opposite_amounts: "Phải có số tiền đối nghịch nhau" + within_days: "Phải trong vòng %{count} ngày" + transfer: + name: Chuyển khoản đến %{to_account} + payment_name: Thanh toán đến %{to_account} diff --git a/config/locales/models/trend/vi.yml b/config/locales/models/trend/vi.yml new file mode 100644 index 000000000..ae6e16be5 --- /dev/null +++ b/config/locales/models/trend/vi.yml @@ -0,0 +1,13 @@ +--- +vi: + activemodel: + errors: + models: + trend: + attributes: + current: + must_be_of_the_same_type_as_previous: phải cùng kiểu với giá trị trước + must_be_of_type_money_numeric_or_nil: phải là kiểu Money, Numeric, hoặc nil + previous: + must_be_of_the_same_type_as_current: phải cùng kiểu với giá trị hiện tại + must_be_of_type_money_numeric_or_nil: phải là kiểu Money, Numeric, hoặc nil diff --git a/config/locales/models/user/vi.yml b/config/locales/models/user/vi.yml new file mode 100644 index 000000000..a868a4892 --- /dev/null +++ b/config/locales/models/user/vi.yml @@ -0,0 +1,20 @@ +--- +vi: + activerecord: + attributes: + user: + email: Email + family: "%{moniker}" + family_id: "%{moniker}" + first_name: Tên + last_name: Họ + password: Mật khẩu + password_confirmation: Xác nhận mật khẩu + errors: + models: + user: + attributes: + base: + cannot_deactivate_admin_with_other_users: Quản trị viên không thể xóa tài khoản khi còn người dùng khác. Vui lòng xóa tất cả thành viên trước. + profile_image: + invalid_file_size: kích thước tệp phải nhỏ hơn %{max_megabytes}MB diff --git a/config/locales/views/account_sharings/vi.yml b/config/locales/views/account_sharings/vi.yml new file mode 100644 index 000000000..b8257c4d8 --- /dev/null +++ b/config/locales/views/account_sharings/vi.yml @@ -0,0 +1,29 @@ +--- +vi: + account_sharings: + show: + title: Chia sẻ tài khoản + subtitle: Kiểm soát ai có thể xem và tương tác với tài khoản này + member: Thành viên + permission: Quyền + shared: Đã chia sẻ + no_members: Không có thành viên nào khác trong %{moniker} để chia sẻ + permissions: + full_control: Toàn quyền kiểm soát + full_control_description: Có thể xem, chỉnh sửa và quản lý giao dịch + read_write: Có thể chú thích + read_write_description: Có thể phân loại, gắn nhãn và thêm ghi chú + read_only: Chỉ xem + read_only_description: Chỉ có thể xem dữ liệu tài khoản + save: Lưu cài đặt chia sẻ + owner_label: "Chủ sở hữu: %{name}" + shared_with_count: + one: Đã chia sẻ với 1 thành viên + other: "Đã chia sẻ với %{count} thành viên" + include_in_finances: Tính vào ngân sách & báo cáo của tôi + exclude_from_finances: Loại khỏi ngân sách & báo cáo của tôi + finance_toggle_description: Tính tài khoản này vào tài sản ròng, ngân sách và báo cáo của bạn + update: + success: Cài đặt chia sẻ đã được cập nhật + not_owner: Chỉ chủ sở hữu tài khoản mới có thể quản lý chia sẻ + finance_toggle_success: Tùy chọn bao gồm tài chính đã được cập nhật diff --git a/config/locales/views/account_statements/vi.yml b/config/locales/views/account_statements/vi.yml new file mode 100644 index 000000000..709ca0c45 --- /dev/null +++ b/config/locales/views/account_statements/vi.yml @@ -0,0 +1,116 @@ +--- +vi: + account_statements: + account_tab: + coverage_title: Phạm vi sao kê + coverage_description: Các tháng lịch sử được hỗ trợ bởi sao kê đã tải lên và kiểm tra số dư. + coverage_range: "%{start} - %{end}" + empty: Chưa có sao kê nào được liên kết với tài khoản này. + open_inbox: Hộp thư đến + statements_title: Sao kê + year_label: Năm phạm vi + balance: + unknown: Không xác định + coverage: + status: + ambiguous: Không rõ ràng + covered: Đã phủ + duplicate: Trùng lặp + mismatched: Không khớp + missing: Thiếu + not_expected: Không mong đợi + create: + duplicates: + one: 1 sao kê trùng lặp đã bị bỏ qua. + other: "%{count} sao kê trùng lặp đã bị bỏ qua." + invalid_file_type: Tải lên sao kê dạng PDF, CSV hoặc XLSX dưới giới hạn kích thước. + no_files: Chọn ít nhất một tệp sao kê. + success: + one: 1 sao kê đã được tải lên. + other: "%{count} sao kê đã được tải lên." + destroy: + failure: Không thể xóa sao kê. + success: Sao kê đã được xóa. + form: + account_upload: Tải lên sao kê + files_hint: PDF, CSV hoặc XLSX. Tối đa %{max_size}MB mỗi tệp. + files_label: Tệp sao kê + inbox_upload: Tải lên + index: + account_label: Tài khoản + confidence: "Khớp %{confidence}" + empty_linked: Chưa có sao kê nào được liên kết. + empty_unmatched: Hộp thư sao kê đang trống. + leave_unmatched: Để không khớp + linked_title: Sao kê đã liên kết + no_suggestion: Không có gợi ý + storage_used: Dung lượng đã sử dụng + title: Kho lưu trữ sao kê + unmatched_title: Hộp thư chưa khớp + upload_description: Tải lên sao kê vào hộp thư, hoặc chọn tài khoản để liên kết ngay. + upload_title: Tải lên sao kê + link: + no_account: Chọn một tài khoản trước khi liên kết sao kê này. + success: Đã liên kết sao kê với %{account}. + period: + unknown: Kỳ không xác định + reconciliation: + checks: + closing_balance: Số dư cuối kỳ + opening_balance: Số dư đầu kỳ + period_movement: Biến động trong kỳ + unknown_check: Kiểm tra không xác định + matched: Khớp + mismatched: Không khớp + unavailable: Chưa kiểm tra + reject: + success: Gợi ý khớp sao kê đã bị từ chối. + show: + account_label: Tài khoản + account_last4_hint: Bốn số cuối tài khoản + account_name_hint: Gợi ý tên tài khoản + closing_balance: Số dư cuối kỳ + currency: Tiền tệ + delete: Xóa + difference: Chênh lệch + download: Tải xuống + institution_name_hint: Gợi ý tổ chức + ledger_amount: Sổ cái Sure + linked_to: Đã liên kết với %{account}. + linking_title: Liên kết tài khoản + link_suggestion: Gợi ý liên kết + metadata_title: Siêu dữ liệu sao kê + no_suggestion: Chưa có gợi ý tài khoản nào. + opening_balance: Số dư đầu kỳ + period_end_on: Kết thúc kỳ + period_start_on: Bắt đầu kỳ + reconciliation_title: Đối soát + reconciliation_unavailable: Thêm kỳ sao kê và số dư đầu hoặc cuối kỳ, sau đó đảm bảo Sure có lịch sử số dư cho các ngày đó. + reject: Từ chối + save: Lưu sao kê + statement_amount: Sao kê + suggested_account: Tài khoản được gợi ý là %{account} (độ tin cậy %{confidence}). + title: Sao kê + unlink: Hủy liên kết + unmatched_account: Hộp thư chưa khớp + unknown_value: Không xác định + status: + linked: Đã liên kết + rejected: Đã từ chối + unmatched: Chưa khớp + table: + account: Tài khoản + actions: Hành động + download: Tải xuống + file: Tệp + link_suggestion: Gợi ý liên kết + period: Kỳ + reconciliation: Đối soát + reject: Từ chối gợi ý + suggestion: Gợi ý + unlink: Hủy liên kết + view: Xem + unlink: + success: Sao kê đã được chuyển lại hộp thư chưa khớp. + update: + success: Sao kê đã được cập nhật. diff --git a/config/locales/views/accounts/vi.yml b/config/locales/views/accounts/vi.yml new file mode 100644 index 000000000..a8257c502 --- /dev/null +++ b/config/locales/views/accounts/vi.yml @@ -0,0 +1,192 @@ +--- +vi: + account: + entries: + destroy: + success: "Mục nhập đã được xóa thành công." + accounts: + not_authorized: "Bạn không có quyền quản lý tài khoản này" + account: + complete_setup: Hoàn thành thiết lập + edit: Chỉnh sửa + link_lunchflow: Liên kết với Lunch Flow + link_provider: Liên kết với nhà cung cấp + unlink_provider: Hủy liên kết với nhà cung cấp + change_simplefin_account: Thay đổi tài khoản SimpleFIN + troubleshoot: Khắc phục sự cố + enable: Bật tài khoản + disable: Tắt tài khoản + set_default: Đặt làm mặc định + remove_default: Bỏ mặc định + default_label: Mặc định + delete: Xóa tài khoản + sharing: Chia sẻ + chart: + data_not_available: Dữ liệu không khả dụng cho khoảng thời gian đã chọn + create: + success: "Đã tạo tài khoản %{type}" + set_default: + depository_only: "Chỉ tài khoản tiền mặt và thẻ tín dụng mới có thể đặt làm mặc định." + destroy: + success: "Tài khoản %{type} đã được lên lịch xóa" + cannot_delete_linked: "Không thể xóa tài khoản đã liên kết. Vui lòng hủy liên kết trước." + failed: "Xóa tài nguyên thất bại. Vui lòng thử lại sau." + empty: + empty_message: Thêm tài khoản qua kết nối, nhập dữ liệu hoặc nhập thủ công. + new_account: Tài khoản mới + no_accounts: Chưa có tài khoản nào + form: + balance: "Số dư ngày:" + opening_balance_date_label: Ngày số dư mở đầu + name_label: Tên tài khoản + name_placeholder: Ví dụ tên tài khoản + additional_details: Thông tin bổ sung + institution_name_label: Tên tổ chức + institution_name_placeholder: "ví dụ: Ngân hàng Vietcombank" + institution_domain_label: Tên miền tổ chức + institution_domain_placeholder: "ví dụ: vietcombank.com.vn" + notes_label: Ghi chú + notes_placeholder: Lưu thêm thông tin như số tài khoản, mã định tuyến, IBAN, v.v. + index: + accounts: Tài khoản + manual_accounts: + other_accounts: Tài khoản khác + new_account: Tài khoản mới + sync: Đồng bộ tất cả + sync_all: + syncing: "Đang đồng bộ tài khoản..." + new: + import_accounts: Nhập tài khoản + container: + select: Chọn + navigate: Điều hướng + close: Đóng + method_selector: + connected_entry: Liên kết tài khoản + connected_entry_eu: Liên kết tài khoản EU + link_with_provider: "Liên kết với %{provider}" + lunchflow_entry: Liên kết tài khoản Lunch Flow + manual_entry: Nhập số dư tài khoản + title: Bạn muốn thêm bằng cách nào? + title: Bạn muốn thêm gì? + show: + limited_fx_history_warning: "Lịch sử tỷ giá hối đoái chỉ khả dụng từ %{date} trở đi. Các giao dịch trước ngày này sử dụng chuyển đổi tiền tệ xấp xỉ." + tabs: + activity: Hoạt động + holdings: Danh mục nắm giữ + overview: Tổng quan + statements: Sao kê + activity: + amount: Số tiền + balance: Số dư + confirmed: Đã xác nhận + date: Ngày + entries: mục nhập + entry: mục nhập + filter: Lọc + new: Mới + new_activity: Hoạt động mới + new_balance: Số dư mới + new_trade: Giao dịch mới + new_transaction: Giao dịch mới + new_transfer: Chuyển khoản mới + no_entries: Không tìm thấy mục nhập + pending: Đang chờ + search: + placeholder: Tìm kiếm mục nhập theo tên + search_placeholder: Tìm kiếm mục nhập theo tên + status: Trạng thái + title: Hoạt động + chart: + balance: Số dư + owed: Số tiền nợ + header: + complete_setup: Hoàn thành thiết lập + menu: + confirm_accept: Xóa "%{name}" + confirm_body_html: "
Bằng cách xóa tài khoản này, bạn sẽ xóa lịch sử giá trị của nó, ảnh hưởng đến nhiều khía cạnh tài khoản tổng thể. Hành động này sẽ ảnh hưởng trực tiếp đến tính toán tài sản ròng và biểu đồ tài khoản.
Sau khi xóa, bạn không thể khôi phục thông tin tài khoản và cần thêm lại như tài khoản mới.
" + confirm_title: Xóa tài khoản? + delete_account: Xóa tài khoản + edit: Chỉnh sửa + import: Nhập giao dịch + import_trades: Nhập giao dịch chứng khoán + import_transactions: Nhập giao dịch + manage: Quản lý tài khoản + sharing: Chia sẻ + statements: Sao kê + update: + success: "Đã cập nhật tài khoản %{type}" + sidebar: + missing_data: Thiếu dữ liệu lịch sử + missing_data_description: "%{product} sử dụng nhà cung cấp bên thứ ba để lấy tỷ giá hối đoái lịch sử, giá chứng khoán và nhiều hơn nữa. Dữ liệu này cần thiết để tính số dư tài khoản lịch sử chính xác." + configure_providers: Cấu hình nhà cung cấp của bạn tại đây. + tabs: + all: Tất cả + assets: Tài sản + debts: Nợ + new_asset: Tài sản mới + new_debt: Nợ mới + new_account: Tài khoản mới + new_account_group: "Nhóm %{account_group} mới" + types: + depository: Tiền mặt + investment: Đầu tư + crypto: Tiền mã hóa + property: Bất động sản + vehicle: Phương tiện + other_asset: Tài sản khác + credit_card: Thẻ tín dụng + loan: Khoản vay + other_liability: Nợ khác + types_plural: + depository: Tiền mặt + investment: Đầu tư + crypto: Tiền mã hóa + property: Bất động sản + vehicle: Phương tiện + other_asset: Tài sản khác + credit_card: Thẻ tín dụng + loan: Khoản vay + other_liability: Nợ khác + tax_treatments: + taxable: Chịu thuế + tax_deferred: Hoãn thuế + tax_exempt: Miễn thuế + tax_advantaged: Ưu đãi thuế + tax_treatment_descriptions: + taxable: Lợi nhuận bị đánh thuế khi thực hiện + tax_deferred: Đóng góp được khấu trừ, đánh thuế khi rút + tax_exempt: Đóng góp sau thuế, lợi nhuận không bị đánh thuế + tax_advantaged: Lợi ích thuế đặc biệt có điều kiện + subtype_regions: + us: Hoa Kỳ + uk: Vương quốc Anh + ca: Canada + au: Úc + eu: Châu Âu + in: Ấn Độ + generic: Chung + confirm_unlink: + title: Hủy liên kết tài khoản với nhà cung cấp? + description_html: "Bạn đang hủy liên kết %{account_name} khỏi %{provider_name}. Tài khoản này sẽ được chuyển thành tài khoản thủ công." + warning_title: Điều này có nghĩa là gì + warning_no_sync: Tài khoản sẽ không còn tự động đồng bộ với nhà cung cấp + warning_manual_updates: Bạn cần thêm giao dịch và cập nhật số dư thủ công + warning_transactions_kept: Tất cả giao dịch và số dư hiện có sẽ được giữ nguyên + warning_can_delete: Sau khi hủy liên kết, bạn có thể xóa tài khoản nếu cần + confirm_button: Xác nhận và hủy liên kết + unlink: + success: "Tài khoản đã được hủy liên kết thành công. Bây giờ là tài khoản thủ công." + not_linked: "Tài khoản chưa được liên kết với nhà cung cấp" + error: "Hủy liên kết tài khoản thất bại: %{error}" + generic_error: "Đã xảy ra lỗi không mong muốn. Vui lòng thử lại." + select_provider: + title: Chọn nhà cung cấp để liên kết + description: "Chọn nhà cung cấp bạn muốn dùng để liên kết %{account_name}" + already_linked: "Tài khoản đã được liên kết với nhà cung cấp" + no_providers: "Hiện không có nhà cung cấp nào được cấu hình" + + email_confirmations: + new: + invalid_token: Liên kết xác nhận không hợp lệ hoặc đã hết hạn. + success_login: Email của bạn đã được xác nhận. Vui lòng đăng nhập bằng địa chỉ email mới. diff --git a/config/locales/views/admin/invitations/vi.yml b/config/locales/views/admin/invitations/vi.yml new file mode 100644 index 000000000..f7c81bb5e --- /dev/null +++ b/config/locales/views/admin/invitations/vi.yml @@ -0,0 +1,8 @@ +--- +vi: + admin: + invitations: + destroy: + success: "Lời mời đã được xóa." + destroy_all: + success: "Tất cả lời mời của gia đình này đã được xóa." diff --git a/config/locales/views/admin/sso_providers/vi.yml b/config/locales/views/admin/sso_providers/vi.yml new file mode 100644 index 000000000..906455c11 --- /dev/null +++ b/config/locales/views/admin/sso_providers/vi.yml @@ -0,0 +1,138 @@ +--- +vi: + admin: + unauthorized: "Bạn không được phép truy cập khu vực này." + sso_providers: + index: + page_title: "Nhà cung cấp SSO" + title: "Nhà cung cấp SSO" + description: "Quản lý các nhà cung cấp xác thực đăng nhập một lần cho phiên bản của bạn." + restart_required: "Các thay đổi yêu cầu khởi động lại máy chủ để có hiệu lực." + configured_providers: "Nhà cung cấp đã cấu hình" + add_provider: "Thêm nhà cung cấp" + no_providers_title: "Không có nhà cung cấp SSO" + no_providers_message: "Chưa có nhà cung cấp SSO nào được cấu hình." + note: "Các thay đổi đối với nhà cung cấp SSO yêu cầu khởi động lại máy chủ để có hiệu lực. Ngoài ra, hãy bật cờ tính năng AUTH_PROVIDERS_SOURCE=db để tải nhà cung cấp từ cơ sở dữ liệu một cách động." + enabled: "Đã bật" + disabled: "Đã tắt" + edit: "Chỉnh sửa" + enable: "Bật" + disable: "Tắt" + delete: "Xóa" + configuration_mode: "Chế độ cấu hình" + db_backed_providers: "Nhà cung cấp dựa trên cơ sở dữ liệu" + db_backed_providers_description: "Tải nhà cung cấp từ cơ sở dữ liệu thay vì cấu hình YAML" + db_backed_providers_help_html: "ĐặtAUTH_PROVIDERS_SOURCE=db để bật nhà cung cấp dựa trên cơ sở dữ liệu. Điều này cho phép thay đổi mà không cần khởi động lại máy chủ."
+ table:
+ name: "Tên"
+ strategy: "Chiến lược"
+ status: "Trạng thái"
+ issuer: "Nhà phát hành"
+ actions: "Hành động"
+ enabled: "Đã bật"
+ disabled: "Đã tắt"
+ legacy_providers_title: "Nhà cung cấp được cấu hình qua môi trường"
+ legacy_providers_notice: "Các nhà cung cấp này được cấu hình qua biến môi trường hoặc YAML và không thể quản lý thông qua giao diện này. Để quản lý ở đây, hãy di chuyển chúng sang nhà cung cấp dựa trên cơ sở dữ liệu bằng cách bật AUTH_PROVIDERS_SOURCE=db và tạo lại chúng trong giao diện."
+ env_configured: "Môi trường/YAML"
+ new:
+ title: "Thêm nhà cung cấp SSO"
+ description: "Cấu hình nhà cung cấp xác thực đăng nhập một lần mới"
+ edit:
+ title: "Chỉnh sửa nhà cung cấp SSO"
+ description: "Cập nhật cấu hình cho %{label}"
+ create:
+ success: "Nhà cung cấp SSO đã được tạo thành công."
+ update:
+ success: "Nhà cung cấp SSO đã được cập nhật thành công."
+ destroy:
+ success: "Nhà cung cấp SSO đã được xóa thành công."
+ confirm: "Bạn có chắc chắn muốn xóa nhà cung cấp này không? Hành động này không thể hoàn tác."
+ toggle:
+ success_enabled: "Nhà cung cấp SSO đã được bật thành công."
+ success_disabled: "Nhà cung cấp SSO đã được tắt thành công."
+ confirm_enable: "Bạn có chắc chắn muốn bật nhà cung cấp này không?"
+ confirm_disable: "Bạn có chắc chắn muốn tắt nhà cung cấp này không?"
+ form:
+ basic_information: "Thông tin cơ bản"
+ oauth_configuration: "Cấu hình OAuth/OIDC"
+ strategy_label: "Chiến lược"
+ strategy_help: "Chiến lược xác thực cần sử dụng"
+ strategy_openid_connect: "OpenID Connect"
+ strategy_saml: "SAML 2.0"
+ strategy_google_oauth2: "Google OAuth2"
+ strategy_github: "GitHub"
+ name_label: "Tên"
+ name_placeholder: "ví dụ: keycloak, authentik"
+ name_help: "Mã định danh duy nhất (chỉ chữ thường, số, dấu gạch dưới)"
+ label_label: "Nhãn nút"
+ label_placeholder: "ví dụ: Đăng nhập với Keycloak"
+ label_help: "Văn bản nút hiển thị cho người dùng"
+ icon_label: "Biểu tượng (tùy chọn)"
+ icon_placeholder: "ví dụ: key, shield"
+ icon_help: "Tên biểu tượng Lucide cho nút đăng nhập"
+ enabled_label: "Bật nhà cung cấp này"
+ enabled_help: "Người dùng có thể đăng nhập với nhà cung cấp này khi được bật"
+ issuer_label: "URL nhà phát hành"
+ issuer_placeholder: "https://your-idp.example.com/realms/your-realm"
+ issuer_help: "URL nhà phát hành OIDC (xác thực .well-known/openid-configuration)"
+ client_id_label: "Client ID"
+ client_id_placeholder: "your-client-id"
+ client_id_help: "OAuth client ID từ nhà cung cấp danh tính của bạn"
+ client_secret_label: "Client Secret"
+ client_secret_placeholder_new: "your-client-secret"
+ client_secret_placeholder_existing: "••••••••"
+ client_secret_help: "OAuth client secret (được mã hóa trong cơ sở dữ liệu)"
+ client_secret_help_existing: "Để trống để giữ nguyên secret hiện tại"
+ redirect_uri_label: "URL Callback"
+ redirect_uri_placeholder: "https://yourdomain.com/auth/openid_connect/callback"
+ redirect_uri_help: "Cấu hình URL này trong nhà cung cấp danh tính của bạn"
+ saml_sp_callback_url_label: "URL Callback SP (ACS URL)"
+ saml_sp_callback_url_help: "Cấu hình URL này là URL Assertion Consumer Service trong IdP của bạn"
+ copy_button: "Sao chép"
+ cancel: "Hủy"
+ submit: "Lưu nhà cung cấp"
+ create_provider: "Tạo nhà cung cấp"
+ update_provider: "Cập nhật nhà cung cấp"
+ errors_title:
+ one: "Một lỗi đã ngăn không thể lưu nhà cung cấp này:"
+ other: "%{count} lỗi đã ngăn không thể lưu nhà cung cấp này:"
+ provisioning_title: "Cấp phát người dùng"
+ default_role_label: "Vai trò mặc định cho người dùng mới"
+ default_role_help: "Vai trò được gán cho người dùng được tạo qua cấp phát tài khoản SSO tức thời (JIT). Mặc định là Thành viên."
+ role_guest: "Khách"
+ role_member: "Thành viên"
+ role_admin: "Quản trị viên"
+ role_super_admin: "Quản trị viên cấp cao"
+ role_mapping_title: "Ánh xạ nhóm sang vai trò (tùy chọn)"
+ role_mapping_help: "Ánh xạ các nhóm/claims của IdP sang vai trò ứng dụng. Người dùng được gán vai trò khớp cao nhất. Để trống để sử dụng vai trò mặc định ở trên."
+ super_admin_groups: "Nhóm quản trị viên cấp cao"
+ admin_groups: "Nhóm quản trị viên"
+ guest_groups: "Nhóm khách"
+ member_groups: "Nhóm thành viên"
+ groups_help: "Danh sách tên nhóm IdP phân cách bằng dấu phẩy. Dùng * để khớp tất cả các nhóm."
+ advanced_title: "Cài đặt OIDC nâng cao"
+ scopes_label: "Phạm vi tùy chỉnh"
+ scopes_help: "Danh sách phạm vi OIDC phân cách bằng dấu cách. Để trống cho mặc định (openid email profile). Thêm 'groups' để lấy claims nhóm."
+ prompt_label: "Lệnh nhắc xác thực"
+ prompt_default: "Mặc định (IdP quyết định)"
+ prompt_login: "Buộc đăng nhập (xác thực lại)"
+ prompt_consent: "Buộc đồng ý (ủy quyền lại)"
+ prompt_select_account: "Chọn tài khoản (chọn tài khoản)"
+ prompt_none: "Không nhắc (xác thực im lặng)"
+ prompt_help: "Kiểm soát cách IdP nhắc người dùng trong quá trình xác thực."
+ test_connection: "Kiểm tra kết nối"
+ saml_configuration: "Cấu hình SAML"
+ idp_metadata_url: "URL siêu dữ liệu IdP"
+ idp_metadata_url_help: "URL đến siêu dữ liệu SAML của IdP. Nếu được cung cấp, các cài đặt SAML khác sẽ được cấu hình tự động."
+ manual_saml_config: "Cấu hình thủ công (nếu không sử dụng URL siêu dữ liệu)"
+ manual_saml_help: "Chỉ sử dụng các cài đặt này nếu IdP của bạn không cung cấp URL siêu dữ liệu."
+ idp_sso_url: "URL SSO của IdP"
+ idp_slo_url: "URL SLO của IdP (tùy chọn)"
+ idp_certificate: "Chứng chỉ IdP"
+ idp_certificate_help: "Chứng chỉ X.509 ở định dạng PEM. Bắt buộc nếu không sử dụng URL siêu dữ liệu."
+ idp_cert_fingerprint: "Dấu vân tay chứng chỉ (thay thế)"
+ name_id_format: "Định dạng NameID"
+ name_id_email: "Địa chỉ email (mặc định)"
+ name_id_persistent: "Liên tục"
+ name_id_transient: "Tạm thời"
+ name_id_unspecified: "Không xác định"
diff --git a/config/locales/views/admin/users/vi.yml b/config/locales/views/admin/users/vi.yml
new file mode 100644
index 000000000..0e1c2a2c0
--- /dev/null
+++ b/config/locales/views/admin/users/vi.yml
@@ -0,0 +1,53 @@
+---
+vi:
+ admin:
+ users:
+ index:
+ title: "Quản lý người dùng"
+ description: "Quản lý vai trò người dùng cho phiên bản của bạn. Quản trị viên cấp cao có thể truy cập cài đặt nhà cung cấp SSO và quản lý người dùng."
+ section_title: "Gia đình / Nhóm"
+ you: "(Bạn)"
+ trial_ends_at: "Kết thúc dùng thử"
+ not_available: "n/a"
+ no_users: "Không tìm thấy người dùng nào."
+ unnamed_family: "Gia đình/Nhóm chưa đặt tên"
+ no_subscription: "Không có gói đăng ký"
+ family_summary: "%{members} thành viên · %{accounts} tài khoản · %{transactions} giao dịch"
+ filters:
+ role: "Vai trò"
+ role_all: "Tất cả vai trò"
+ trial_status: "Trạng thái dùng thử"
+ trial_all: "Tất cả"
+ trial_expiring_soon: "Hết hạn trong 7 ngày"
+ trial_trialing: "Đang dùng thử"
+ submit: "Lọc"
+ summary:
+ trials_expiring_7_days: "Các bản dùng thử hết hạn trong 7 ngày tới"
+ table:
+ user: "Người dùng"
+ trial_ends_at: "Kết thúc dùng thử"
+ family_accounts: "Tài khoản gia đình"
+ family_transactions: "Giao dịch gia đình"
+ last_login: "Đăng nhập lần cuối"
+ session_count: "Số phiên"
+ never: "Chưa bao giờ"
+ role: "Vai trò"
+ role_descriptions_title: "Mô tả vai trò"
+ roles:
+ guest: "Khách"
+ member: "Thành viên"
+ admin: "Quản trị viên"
+ super_admin: "Quản trị viên cấp cao"
+ role_descriptions:
+ guest: "Trải nghiệm ưu tiên trợ lý với quyền hạn bị hạn chế có chủ ý cho quy trình giới thiệu."
+ member: "Quyền truy cập người dùng cơ bản. Có thể quản lý tài khoản, giao dịch và cài đặt của riêng họ."
+ admin: "Quản trị viên gia đình. Có thể truy cập các cài đặt nâng cao như khóa API, nhập dữ liệu và lệnh AI."
+ super_admin: "Quản trị viên phiên bản. Có thể quản lý nhà cung cấp SSO, vai trò người dùng và mạo danh người dùng để hỗ trợ."
+ invitations:
+ pending_label: "Đã mời (đang chờ)"
+ expires: "Hết hạn %{date}"
+ delete: "Xóa"
+ delete_all: "Xóa tất cả"
+ update:
+ success: "Vai trò người dùng đã được cập nhật thành công."
+ failure: "Không thể cập nhật vai trò người dùng."
diff --git a/config/locales/views/application/vi.yml b/config/locales/views/application/vi.yml
new file mode 100644
index 000000000..c7f0c3c6e
--- /dev/null
+++ b/config/locales/views/application/vi.yml
@@ -0,0 +1,10 @@
+---
+vi:
+ number:
+ currency:
+ format:
+ delimiter: ","
+ format: "%u%n"
+ precision: 2
+ separator: "."
+ unit: "$"
diff --git a/config/locales/views/binance_items/vi.yml b/config/locales/views/binance_items/vi.yml
new file mode 100644
index 000000000..2066870ef
--- /dev/null
+++ b/config/locales/views/binance_items/vi.yml
@@ -0,0 +1,75 @@
+---
+vi:
+ binance_items:
+ create:
+ default_name: Binance
+ success: Đã kết nối thành công với Binance! Tài khoản của bạn đang được đồng bộ.
+ update:
+ success: Đã cập nhật cấu hình Binance thành công.
+ destroy:
+ success: Đã lên lịch xóa kết nối Binance.
+ setup_accounts:
+ title: Nhập tài khoản Binance
+ subtitle: Chọn danh mục đầu tư muốn theo dõi
+ instructions: Chọn các danh mục đầu tư Binance bạn muốn nhập. Chỉ hiển thị các danh mục có số dư.
+ no_accounts: Tất cả tài khoản đã được nhập.
+ accounts_count:
+ one: "%{count} tài khoản có sẵn"
+ other: "%{count} tài khoản có sẵn"
+ select_all: Chọn tất cả
+ import_selected: Nhập đã chọn
+ cancel: Hủy
+ creating: Đang nhập...
+ complete_account_setup:
+ success:
+ one: "Đã nhập %{count} tài khoản"
+ other: "Đã nhập %{count} tài khoản"
+ none_selected: Chưa chọn tài khoản nào
+ no_accounts: Không có tài khoản nào để nhập
+ binance_item:
+ provider_name: Binance
+ syncing: Đang đồng bộ...
+ reconnect: Thông tin xác thực cần cập nhật
+ deletion_in_progress: Đang xóa...
+ sync_status:
+ no_accounts: Không tìm thấy tài khoản
+ all_synced:
+ one: "%{count} tài khoản đã đồng bộ"
+ other: "%{count} tài khoản đã đồng bộ"
+ partial_sync: "%{linked_count} đã đồng bộ, %{unlinked_count} cần thiết lập"
+ status: "Đồng bộ lần cuối %{timestamp} trước"
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước - %{summary}"
+ status_never: Chưa bao giờ đồng bộ
+ update_credentials: Cập nhật thông tin xác thực
+ delete: Xóa
+ no_accounts_title: Không tìm thấy tài khoản
+ no_accounts_message: Danh mục đầu tư Binance của bạn sẽ xuất hiện ở đây sau khi đồng bộ.
+ setup_needed: Tài khoản sẵn sàng để nhập
+ setup_description: Chọn danh mục đầu tư Binance bạn muốn theo dõi.
+ setup_action: Nhập tài khoản
+ import_accounts_menu: Nhập tài khoản
+ stale_rate_warning: "Số dư là xấp xỉ — tỷ giá hối đoái chính xác cho ngày %{date} không có sẵn. Sẽ cập nhật lần đồng bộ tiếp theo."
+ select_existing_account:
+ title: Liên kết tài khoản Binance
+ no_accounts_found: Không tìm thấy tài khoản Binance nào.
+ wait_for_sync: Chờ Binance hoàn tất đồng bộ
+ check_provider_health: Kiểm tra xem thông tin API Binance của bạn có hợp lệ không
+ currently_linked_to: "Hiện đang liên kết với: %{account_name}"
+ link: Liên kết
+ cancel: Hủy
+ link_existing_account:
+ success: Đã liên kết thành công với tài khoản Binance
+ errors:
+ only_manual: Chỉ tài khoản thủ công mới có thể liên kết với Binance
+ invalid_binance_account: Tài khoản Binance không hợp lệ
+ binance_item:
+ syncer:
+ checking_credentials: Đang kiểm tra thông tin xác thực...
+ credentials_invalid: Thông tin API không hợp lệ. Vui lòng kiểm tra khóa API và bí mật của bạn.
+ importing_accounts: Đang nhập tài khoản từ Binance...
+ checking_configuration: Đang kiểm tra cấu hình tài khoản...
+ accounts_need_setup:
+ one: "%{count} tài khoản cần thiết lập"
+ other: "%{count} tài khoản cần thiết lập"
+ processing_accounts: Đang xử lý dữ liệu tài khoản...
+ calculating_balances: Đang tính toán số dư...
diff --git a/config/locales/views/brex_items/vi.yml b/config/locales/views/brex_items/vi.yml
new file mode 100644
index 000000000..5e44d02ec
--- /dev/null
+++ b/config/locales/views/brex_items/vi.yml
@@ -0,0 +1,277 @@
+---
+vi:
+ brex_items:
+ default_connection_name: Kết nối Brex
+ account_metadata:
+ provider: Brex
+ separator: " • "
+ kinds:
+ cash: Tiền mặt
+ card: Thẻ
+ statuses:
+ ACTIVE: Hoạt động
+ active: Hoạt động
+ CLOSED: Đã đóng
+ closed: Đã đóng
+ frozen: Bị đóng băng
+ FROZEN: Bị đóng băng
+ create:
+ success: Kết nối Brex đã được tạo thành công
+ default_card_name: Thẻ Brex
+ default_cash_name: "Tiền mặt Brex %{id}"
+ destroy:
+ success: Kết nối Brex đã được xóa
+ index:
+ title: Kết nối Brex
+ institution_summary:
+ none: Chưa kết nối tổ chức nào
+ one: "%{name}"
+ count:
+ one: "%{count} tổ chức"
+ other: "%{count} tổ chức"
+ sync_status:
+ no_accounts: Không tìm thấy tài khoản
+ all_synced:
+ one: "%{count} tài khoản đã đồng bộ"
+ other: "%{count} tài khoản đã đồng bộ"
+ partial_setup: "%{synced} đã đồng bộ, %{pending} cần thiết lập"
+ api_error:
+ common_issues: "Các vấn đề thường gặp:"
+ expired_credentials: Tạo mã thông báo API mới từ Brex.
+ expired_credentials_label: "Thông tin xác thực hết hạn:"
+ heading: Không thể kết nối với Brex
+ invalid_token: Kiểm tra mã thông báo API của bạn trong Cài đặt nhà cung cấp.
+ invalid_token_label: "Mã thông báo API không hợp lệ:"
+ network: Kiểm tra kết nối internet của bạn.
+ network_label: "Sự cố mạng:"
+ permissions: Đảm bảo mã thông báo có quyền đọc tài khoản và giao dịch cần thiết.
+ permissions_label: "Quyền không đủ:"
+ service: API Brex có thể tạm thời không khả dụng.
+ service_label: "Dịch vụ gián đoạn:"
+ settings_link: Kiểm tra Cài đặt nhà cung cấp
+ title: Lỗi kết nối Brex
+ errors:
+ unexpected_error: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại sau.
+ entries:
+ default_name: Giao dịch Brex
+ loading:
+ loading_message: Đang tải tài khoản Brex...
+ loading_title: Đang tải
+ link_accounts:
+ all_already_linked:
+ one: "Tài khoản đã chọn (%{names}) đã được liên kết"
+ other: "Tất cả %{count} tài khoản đã chọn đã được liên kết: %{names}"
+ api_error: "Lỗi API: %{message}"
+ invalid_account_names:
+ one: "Không thể liên kết tài khoản không có tên"
+ other: "Không thể liên kết %{count} tài khoản không có tên"
+ invalid_account_type: Loại tài khoản Brex không được hỗ trợ
+ link_failed: Liên kết tài khoản thất bại
+ no_accounts_selected: Vui lòng chọn ít nhất một tài khoản
+ no_api_token: Không tìm thấy mã thông báo API Brex. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ partial_invalid: "Đã liên kết thành công %{created_count} tài khoản, %{already_linked_count} tài khoản đã được liên kết, %{invalid_count} tài khoản có tên không hợp lệ"
+ partial_success: "Đã liên kết thành công %{created_count} tài khoản. %{already_linked_count} tài khoản đã được liên kết: %{already_linked_names}"
+ select_connection: Chọn kết nối Brex trước khi liên kết tài khoản.
+ success:
+ one: "Đã liên kết thành công %{count} tài khoản"
+ other: "Đã liên kết thành công %{count} tài khoản"
+ brex_item:
+ accounts_need_setup: Tài khoản cần thiết lập
+ delete: Xóa kết nối
+ deletion_in_progress: đang xóa...
+ error: Lỗi
+ no_accounts_description: Kết nối này chưa có tài khoản nào được liên kết.
+ no_accounts_title: Không có tài khoản
+ setup_action: Thiết lập tài khoản mới
+ setup_description: "%{linked} trong số %{total} tài khoản đã liên kết. Chọn loại tài khoản cho các tài khoản Brex mới được nhập."
+ setup_needed: Tài khoản mới sẵn sàng để thiết lập
+ status: "Đồng bộ %{timestamp} trước"
+ status_never: Chưa bao giờ đồng bộ
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước - %{summary}"
+ syncing: Đang đồng bộ...
+ total: Tổng cộng
+ unlinked: Chưa liên kết
+ provider_panel:
+ accounts_link: Tài khoản
+ add_connection: Thêm kết nối Brex
+ base_url_label: URL cơ sở (tùy chọn)
+ base_url_placeholder: https://api.brex.com
+ configured_html: "Đã cấu hình và sẵn sàng sử dụng. Truy cập tab %{accounts_link} để quản lý và thiết lập tài khoản."
+ connection_name_label: Tên kết nối
+ connection_name_placeholder: Tài khoản kinh doanh
+ default_connection_name: Kết nối Brex
+ disconnect_label: "Ngắt kết nối %{name}"
+ disconnect_confirm: "Ngắt kết nối %{name}?"
+ encryption_warning:
+ title: Mã hóa cơ sở dữ liệu chưa được cấu hình
+ message: Cấu hình khóa mã hóa Active Record trước khi thêm mã thông báo Brex trong môi trường sản xuất. Không có khóa mã hóa, Sure lưu trữ thông tin xác thực nhà cung cấp Brex và ảnh chụp dưới dạng văn bản thuần túy như các bản ghi nhà cung cấp khác.
+ instructions:
+ copy_token_html: "Sao chép mã thông báo và thêm làm kết nối có tên bên dưới. Sure chỉ lưu mã thông báo để đồng bộ gia đình này."
+ create_token: "Tạo mã thông báo API với các phạm vi chỉ đọc sau: accounts.cash.readonly, accounts.card.readonly, transactions.cash.readonly, transactions.card.readonly"
+ open_tokens: Đi đến cài đặt nhà phát triển/mã thông báo API Brex cho công ty bạn muốn kết nối
+ sign_in_html: "Truy cập %{link} và đăng nhập vào tài khoản bạn muốn kết nối"
+ keep_token_placeholder: Để trống để giữ mã thông báo hiện tại
+ not_configured: Chưa được cấu hình
+ sandbox_note_html: "Sử dụng kết nối có tên riêng cho mỗi công ty Brex/mã thông báo API bạn muốn đồng bộ. Để trống URL cơ sở cho môi trường sản xuất. Môi trường staging chỉ dành cho kiểm thử được Brex phê duyệt và không hoạt động với mã thông báo khách hàng."
+ setup_accounts: Thiết lập tài khoản
+ setup_title: "Hướng dẫn thiết lập:"
+ sync: Đồng bộ
+ token_label: Mã thông báo
+ token_placeholder: Dán mã thông báo vào đây
+ update_connection: Cập nhật kết nối
+ provider_connection:
+ default_description: Kết nối với tài khoản Brex của bạn
+ default_name: Brex
+ description: "Kết nối bằng %{name}"
+ name: "Brex - %{name}"
+ select_accounts:
+ accounts_selected: tài khoản đã chọn
+ api_error: "Lỗi API: %{message}"
+ cancel: Hủy
+ configure_name_in_brex: Không thể nhập - vui lòng cấu hình tên tài khoản trong Brex
+ description: Chọn tài khoản bạn muốn liên kết với tài khoản %{product_name} của bạn.
+ link_accounts: Liên kết tài khoản đã chọn
+ no_accounts_found: Không tìm thấy tài khoản. Vui lòng kiểm tra cấu hình mã thông báo API.
+ no_api_token: Không tìm thấy mã thông báo API Brex. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ no_credentials_configured: Vui lòng cấu hình mã thông báo API Brex trước trong Cài đặt nhà cung cấp.
+ no_name_placeholder: "(Không có tên)"
+ select_connection: Chọn kết nối Brex trong Cài đặt nhà cung cấp.
+ title: Chọn tài khoản Brex
+ unexpected_error: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại sau.
+ select_existing_account:
+ account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp
+ all_accounts_already_linked: Tất cả tài khoản Brex đã được liên kết
+ api_error: "Lỗi API: %{message}"
+ cancel: Hủy
+ configure_name_in_brex: Không thể nhập - vui lòng cấu hình tên tài khoản trong Brex
+ description: Chọn tài khoản Brex để liên kết với tài khoản này. Giao dịch sẽ được đồng bộ và loại bỏ trùng lặp tự động.
+ link_account: Liên kết tài khoản
+ no_account_specified: Chưa chỉ định tài khoản
+ no_accounts_found: Không tìm thấy tài khoản Brex. Vui lòng kiểm tra cấu hình mã thông báo API.
+ no_api_token: Không tìm thấy mã thông báo API Brex. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ no_credentials_configured: Vui lòng cấu hình mã thông báo API Brex trước trong Cài đặt nhà cung cấp.
+ no_name_placeholder: "(Không có tên)"
+ select_connection: Chọn kết nối Brex trong Cài đặt nhà cung cấp.
+ title: "Liên kết %{account_name} với Brex"
+ unexpected_error: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại sau.
+ setup_required:
+ description: Trước khi liên kết tài khoản Brex, bạn cần cấu hình mã thông báo API Brex.
+ heading: Mã thông báo API chưa được cấu hình
+ settings_link: Đi đến Cài đặt nhà cung cấp
+ setup_steps: "Các bước thiết lập:"
+ steps:
+ enter_token: Nhập mã thông báo API Brex của bạn
+ find_section_html: "Tìm phần Brex"
+ open_settings_html: "Đi đến Cài đặt > Nhà cung cấp"
+ return_to_link: Quay lại đây để liên kết tài khoản
+ title: Cần thiết lập Brex
+ subtype_select:
+ placeholder:
+ subtype: Chọn loại phụ
+ type: Chọn loại
+ link_existing_account:
+ account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp
+ api_error: "Lỗi API: %{message}"
+ invalid_account_name: Không thể liên kết tài khoản không có tên
+ missing_parameters: Thiếu tham số bắt buộc
+ no_account_specified: Chưa chỉ định tài khoản
+ no_api_token: Không tìm thấy mã thông báo API Brex. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ provider_account_already_linked: Tài khoản Brex này đã được liên kết với tài khoản khác
+ provider_account_not_found: Không tìm thấy tài khoản Brex
+ select_connection: Chọn kết nối Brex trước khi liên kết tài khoản.
+ success: "Đã liên kết thành công %{account_name} với Brex"
+ setup_accounts:
+ account_type_label: "Loại tài khoản:"
+ all_accounts_linked: "Tất cả tài khoản Brex của bạn đã được thiết lập."
+ api_error: "Lỗi API: %{message}"
+ fetch_failed: "Tải tài khoản thất bại"
+ no_accounts_to_setup: "Không có tài khoản nào để thiết lập"
+ no_api_token: Không tìm thấy mã thông báo API Brex. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ account_types:
+ skip: Bỏ qua tài khoản này
+ depository: Tài khoản thanh toán hoặc tiết kiệm
+ credit_card: Thẻ tín dụng
+ investment: Tài khoản đầu tư
+ loan: Vay hoặc thế chấp
+ other_asset: Tài sản khác
+ subtype_labels:
+ depository: "Loại phụ tài khoản:"
+ credit_card: ""
+ investment: "Loại đầu tư:"
+ loan: "Loại vay:"
+ other_asset: ""
+ subtype_messages:
+ credit_card: "Thẻ tín dụng sẽ được tự động thiết lập dưới dạng tài khoản thẻ tín dụng."
+ other_asset: "Không cần tùy chọn bổ sung cho Tài sản khác."
+ subtypes:
+ depository:
+ checking: Tài khoản thanh toán
+ savings: Tài khoản tiết kiệm
+ hsa: Tài khoản tiết kiệm y tế
+ cd: Chứng chỉ tiền gửi
+ money_market: Thị trường tiền tệ
+ investment:
+ brokerage: Brokerage
+ pension: Lương hưu
+ retirement: Hưu trí
+ "401k": "401(k)"
+ roth_401k: "Roth 401(k)"
+ "403b": "403(b)"
+ tsp: Thrift Savings Plan
+ "529_plan": "529 Plan"
+ hsa: Tài khoản tiết kiệm y tế
+ mutual_fund: Quỹ tương hỗ
+ ira: Traditional IRA
+ roth_ira: Roth IRA
+ angel: Angel
+ loan:
+ mortgage: Thế chấp
+ student: Vay sinh viên
+ auto: Vay mua xe
+ other: Vay khác
+ balance: Số dư
+ cancel: Hủy
+ choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản Brex:"
+ create_accounts: Tạo tài khoản
+ creating_accounts: Đang tạo tài khoản...
+ historical_data_range: "Phạm vi dữ liệu lịch sử:"
+ subtitle: Chọn đúng loại tài khoản cho các tài khoản đã nhập
+ sync_start_date_help: Chọn khoảng thời gian lịch sử giao dịch bạn muốn đồng bộ. Tối đa 3 năm lịch sử có sẵn.
+ sync_start_date_label: "Bắt đầu đồng bộ giao dịch từ:"
+ title: Thiết lập tài khoản Brex của bạn
+ complete_account_setup:
+ all_skipped: "Tất cả tài khoản đã bị bỏ qua. Không có tài khoản nào được tạo."
+ creation_failed: "Tạo tài khoản thất bại: %{error}"
+ creation_failed_count: "Tạo %{count} tài khoản thất bại."
+ no_accounts: "Không có tài khoản nào để thiết lập."
+ partial_skipped: "Đã tạo thành công %{created_count} tài khoản; %{skipped_count} tài khoản đã bị bỏ qua."
+ partial_success: "Đã tạo thành công %{created_count} tài khoản, nhưng %{failed_count} tài khoản thất bại."
+ success: "Đã tạo thành công %{count} tài khoản."
+ unexpected_error: Đã xảy ra lỗi không mong muốn.
+ sync:
+ success: Đã bắt đầu đồng bộ
+ syncer:
+ account_processing_failed:
+ one: "%{count} tài khoản Brex gặp lỗi khi xử lý."
+ other: "%{count} tài khoản Brex gặp lỗi khi xử lý."
+ account_sync_failed:
+ one: "%{count} đồng bộ tài khoản Brex không thể được lên lịch."
+ other: "%{count} đồng bộ tài khoản Brex không thể được lên lịch."
+ accounts_need_setup:
+ one: "%{count} tài khoản cần thiết lập..."
+ other: "%{count} tài khoản cần thiết lập..."
+ accounts_failed:
+ one: "%{count} tài khoản Brex nhập thất bại."
+ other: "%{count} tài khoản Brex nhập thất bại."
+ calculating_balances: Đang tính toán số dư...
+ checking_account_configuration: Đang kiểm tra cấu hình tài khoản...
+ credentials_invalid: Mã thông báo API Brex hoặc quyền tài khoản không hợp lệ
+ failed: Đồng bộ thất bại. Vui lòng thử lại hoặc liên hệ hỗ trợ.
+ import_failed: Nhập Brex thất bại.
+ importing_accounts: Đang nhập tài khoản từ Brex...
+ processing_transactions: Đang xử lý giao dịch...
+ transactions_failed:
+ one: "%{count} tài khoản Brex gặp lỗi nhập giao dịch."
+ other: "%{count} tài khoản Brex gặp lỗi nhập giao dịch."
+ update:
+ success: Kết nối Brex đã được cập nhật
diff --git a/config/locales/views/budgets/vi.yml b/config/locales/views/budgets/vi.yml
new file mode 100644
index 000000000..f2f8e59cb
--- /dev/null
+++ b/config/locales/views/budgets/vi.yml
@@ -0,0 +1,97 @@
+---
+vi:
+ budgets:
+ budget_donut:
+ spent: "Đã chi"
+ new_budget: "Ngân sách mới"
+ of_budget: "trong %{amount}"
+ unused: "Chưa dùng"
+ budget_header:
+ today: "Hôm nay"
+ budget_nav:
+ categories: Danh mục
+ setup: Thiết lập
+ over_allocation_warning:
+ over_allocated_message: "Bạn đã phân bổ vượt ngân sách. Vui lòng điều chỉnh lại."
+ fix_allocations: "Sửa phân bổ"
+ actuals_summary:
+ income: "Thu nhập"
+ expenses: "Chi tiêu"
+ budgeted_summary:
+ expected_income: "Thu nhập dự kiến"
+ budgeted: "Đã lập ngân sách"
+ earned: "%{amount} đã kiếm được"
+ over: "%{amount} vượt"
+ left: "%{amount} còn lại"
+ spent: "%{amount} đã chi"
+ edit:
+ setup_title: "Thiết lập ngân sách"
+ setup_description: "Nhập thu nhập hàng tháng và chi tiêu kế hoạch bên dưới để thiết lập ngân sách."
+ budgeted_spending: "Chi tiêu theo ngân sách"
+ expected_income: "Thu nhập dự kiến"
+ autosuggest_title: "Tự động đề xuất ngân sách thu nhập & chi tiêu"
+ autosuggest_description: "Dựa trên lịch sử giao dịch. AI có thể mắc lỗi, hãy xác minh trước khi tiếp tục."
+ continue: "Tiếp tục"
+ name:
+ custom_range: "%{start} - %{end_date}"
+ month_year: "%{month}"
+ show:
+ categories:
+ amount: Số tiền
+ edit: Chỉnh sửa
+ title: Danh mục
+ on_track_categories:
+ short_title: Đúng kế hoạch
+ title: Đúng kế hoạch
+ over_budget_categories:
+ short_title: Vượt ngân sách
+ title: Vượt ngân sách
+ filter:
+ all: Tất cả
+ on_track: Đúng kế hoạch
+ over_budget: Vượt ngân sách
+ tabs:
+ actual: Thực tế
+ budgeted: Ngân sách
+ copy_previous_prompt:
+ title: "Thiết lập ngân sách"
+ description: "Bạn có thể sao chép ngân sách từ %{source_name} hoặc bắt đầu mới."
+ copy_button: "Sao chép từ %{source_name}"
+ fresh_button: "Bắt đầu mới"
+ copy_previous:
+ success: "Đã sao chép ngân sách từ %{source_name}"
+ no_source: "Không tìm thấy ngân sách trước để sao chép"
+ already_initialized: "Ngân sách này đã được thiết lập"
+ budget_categories:
+ allocation_progress:
+ budget_exceeded_html: 'Vượt ngân sách %{amount}'
+ left_to_allocate: còn lại để phân bổ
+ over_set: "> 100% đã đặt"
+ percent_set: "%{percent} đã đặt"
+ budget_category_form:
+ monthly_average: "%{amount}/tháng tb"
+ shared_placeholder: Chia sẻ
+ shared_title: Để trống để dùng chung ngân sách của danh mục cha
+ confirm_button:
+ confirm: "Xác nhận"
+ no_categories:
+ oops: "Ối!"
+ no_categories_message: "Bạn chưa tạo hoặc gán danh mục chi tiêu nào cho giao dịch."
+ use_defaults: "Dùng mặc định (khuyến nghị)"
+ new_category: "Danh mục mới"
+ index:
+ title: "Chỉnh sửa ngân sách danh mục"
+ description: "Điều chỉnh ngân sách danh mục để đặt giới hạn chi tiêu. Số tiền chưa phân bổ sẽ tự động gán là chưa phân loại."
+ show:
+ category: "Danh mục"
+ overview: "Tổng quan"
+ spending: "Chi tiêu %{date}"
+ status: "Trạng thái"
+ overspent: "chi quá"
+ left: "còn lại"
+ budgeted: "Ngân sách"
+ monthly_average_spending: "Chi tiêu trung bình hàng tháng"
+ monthly_median_spending: "Chi tiêu trung vị hàng tháng"
+ recent_transactions: "Giao dịch gần đây"
+ view_all_transactions: "Xem tất cả giao dịch trong danh mục"
+ no_transactions: "Không tìm thấy giao dịch trong kỳ ngân sách này."
diff --git a/config/locales/views/categories/vi.yml b/config/locales/views/categories/vi.yml
new file mode 100644
index 000000000..596f848d8
--- /dev/null
+++ b/config/locales/views/categories/vi.yml
@@ -0,0 +1,52 @@
+---
+vi:
+ categories:
+ bootstrap:
+ success: Đã tạo danh mục mặc định thành công
+ category:
+ delete: Xóa danh mục
+ edit: Chỉnh sửa danh mục
+ create:
+ success: Đã tạo danh mục thành công
+ destroy:
+ success: Đã xóa danh mục thành công
+ edit:
+ edit: Chỉnh sửa danh mục
+ form:
+ placeholder: Tên danh mục
+ name_label: Tên
+ unassigned: "(chưa gán)"
+ parent_category_label: "Danh mục cha (tùy chọn)"
+ color: Màu sắc
+ icon: Biểu tượng
+ auto_adjust: tự động điều chỉnh.
+ poor_contrast: "Độ tương phản kém, chọn màu tối hơn hoặc"
+ destroy_all:
+ success: Đã xóa tất cả danh mục
+ index:
+ bootstrap: Dùng mặc định (khuyến nghị)
+ categories: Danh mục
+ categories_expenses: Danh mục chi tiêu
+ categories_incomes: Danh mục thu nhập
+ delete_all: Xóa tất cả
+ empty: Không tìm thấy danh mục
+ new: Danh mục mới
+ menu:
+ loading: Đang tải...
+ new:
+ new_category: Danh mục mới
+ update:
+ success: Đã cập nhật danh mục thành công
+ virtual:
+ transfer: Chuyển khoản
+ payment: Thanh toán
+ trade: Giao dịch chứng khoán
+ category:
+ dropdowns:
+ show:
+ bootstrap: Tạo danh mục mặc định
+ empty: Không tìm thấy danh mục
+ match_transfer: "Khớp chuyển khoản/thanh toán"
+ one_time: "Một lần %{type}"
+ income: "thu nhập"
+ expense: "chi tiêu"
diff --git a/config/locales/views/category/deletions/vi.yml b/config/locales/views/category/deletions/vi.yml
new file mode 100644
index 000000000..3f22eae69
--- /dev/null
+++ b/config/locales/views/category/deletions/vi.yml
@@ -0,0 +1,13 @@
+---
+vi:
+ category:
+ deletions:
+ create:
+ success: Danh mục giao dịch đã được xóa thành công
+ new:
+ category: Danh mục
+ delete_and_leave_uncategorized: Xóa "%{category_name}" và để chưa phân loại
+ delete_and_recategorize: Xóa "%{category_name}" và gán danh mục mới
+ delete_category: Xóa danh mục?
+ explanation: Bằng cách xóa danh mục này, mọi giao dịch có danh mục "%{category_name}" sẽ trở thành chưa phân loại. Thay vì để chúng không được phân loại, bạn cũng có thể gán một danh mục mới bên dưới.
+ replacement_category_prompt: Chọn danh mục
diff --git a/config/locales/views/category/dropdowns/vi.yml b/config/locales/views/category/dropdowns/vi.yml
new file mode 100644
index 000000000..04cf03947
--- /dev/null
+++ b/config/locales/views/category/dropdowns/vi.yml
@@ -0,0 +1,11 @@
+---
+vi:
+ category:
+ dropdowns:
+ row:
+ delete: Xóa danh mục
+ edit: Chỉnh sửa danh mục
+ show:
+ clear: Xóa danh mục
+ no_categories: Không tìm thấy danh mục nào
+ search_placeholder: Tìm kiếm
diff --git a/config/locales/views/chats/vi.yml b/config/locales/views/chats/vi.yml
new file mode 100644
index 000000000..654b0fbbb
--- /dev/null
+++ b/config/locales/views/chats/vi.yml
@@ -0,0 +1,44 @@
+---
+vi:
+ chats:
+ demo_banner_title: "Chế độ Demo đang hoạt động"
+ demo_banner_message: "Bạn đang sử dụng LLM thông qua tín dụng do Cloudflare Workers AI cung cấp. Kết quả có thể thay đổi vì codebase được thử nghiệm trên `gpt-4.1` nhưng token của bạn không được sử dụng để đào tạo mô hình! 🤖"
+ thinking: "Đang xử lý ..."
+ ai_greeting:
+ greeting: "Xin chào %{name}! Tôi là một AI/mô hình ngôn ngữ lớn có thể hỗ trợ bạn về tài chính. Tôi có quyền truy cập internet và dữ liệu tài khoản của bạn."
+ there: "bạn"
+ commands_hint_html: "Bạn có thể sử dụng / để truy cập các lệnh"
+ questions_intro: "Dưới đây là một số câu hỏi bạn có thể đặt:"
+ evaluate_portfolio: "Đánh giá danh mục đầu tư"
+ spending_insights: "Xem thông tin chi tiêu"
+ unusual_patterns: "Tìm các giao dịch bất thường"
+ chat:
+ edit_chat_title: "Chỉnh sửa tiêu đề cuộc trò chuyện"
+ delete_chat: "Xóa cuộc trò chuyện"
+ chat_nav:
+ all_chats: "Tất cả cuộc trò chuyện"
+ start_new_chat: "Bắt đầu cuộc trò chuyện mới"
+ edit_chat_title: "Chỉnh sửa tiêu đề cuộc trò chuyện"
+ delete_chat: "Xóa cuộc trò chuyện"
+ error:
+ retry: "Thử lại"
+ destroy:
+ notice: "Cuộc trò chuyện đã được xóa thành công"
+ index:
+ chats: "Cuộc trò chuyện"
+ new_chat: "Cuộc trò chuyện mới"
+ update:
+ success: "Cuộc trò chuyện đã được cập nhật"
+ ai_consent:
+ title: "Bật tính năng Trò chuyện AI"
+ available_description: "Trò chuyện AI có thể trả lời các câu hỏi tài chính và cung cấp thông tin dựa trên dữ liệu của bạn. Để sử dụng tính năng này, bạn cần bật nó một cách rõ ràng."
+ unavailable_description_html: "Để sử dụng trợ lý AI, bạn cần đặt biến môi trường OPENAI_ACCESS_TOKEN hoặc cấu hình nó trong phần Cài đặt Self-Hosting của phiên bản của bạn."
+ enable_button: "Bật Trò chuyện AI"
+ disable_note: "Tắt bất kỳ lúc nào. Tất cả dữ liệu gửi đến các nhà cung cấp LLM của chúng tôi đều được ẩn danh hóa."
+ assistant_messages:
+ assistant_message:
+ assistant_reasoning: "Lý luận của trợ lý"
+ tool_calls:
+ tool_calls: "Lệnh gọi công cụ"
+ function: "Hàm:"
+ arguments: "Đối số:"
diff --git a/config/locales/views/coinbase_items/vi.yml b/config/locales/views/coinbase_items/vi.yml
new file mode 100644
index 000000000..342631fd0
--- /dev/null
+++ b/config/locales/views/coinbase_items/vi.yml
@@ -0,0 +1,78 @@
+---
+vi:
+ coinbase_items:
+ create:
+ default_name: Coinbase
+ success: Đã kết nối thành công với Coinbase! Các tài khoản của bạn đang được đồng bộ.
+ update:
+ success: Đã cập nhật cấu hình Coinbase thành công.
+ destroy:
+ success: Đã lên lịch xóa kết nối Coinbase.
+ setup_accounts:
+ title: Nhập ví Coinbase
+ subtitle: Chọn ví muốn theo dõi
+ instructions: Chọn các ví bạn muốn nhập. Các ví chưa chọn vẫn có sẵn nếu bạn muốn thêm sau.
+ no_accounts: Tất cả ví đã được nhập.
+ accounts_count:
+ one: "%{count} ví có sẵn"
+ other: "%{count} ví có sẵn"
+ select_all: Chọn tất cả
+ import_selected: Nhập đã chọn
+ cancel: Hủy
+ creating: Đang nhập...
+ complete_account_setup:
+ success:
+ one: "Đã nhập %{count} ví"
+ other: "Đã nhập %{count} ví"
+ none_selected: Chưa chọn ví nào
+ no_accounts: Không có ví nào để nhập
+ coinbase_item:
+ provider_name: Coinbase
+ syncing: Đang đồng bộ...
+ reconnect: Thông tin xác thực cần cập nhật
+ deletion_in_progress: Đang xóa...
+ sync_status:
+ no_accounts: Không tìm thấy tài khoản
+ all_synced:
+ one: "%{count} tài khoản đã đồng bộ"
+ other: "%{count} tài khoản đã đồng bộ"
+ partial_sync: "%{linked_count} đã đồng bộ, %{unlinked_count} cần thiết lập"
+ status: "Đồng bộ lần cuối %{timestamp} trước"
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước - %{summary}"
+ status_never: Chưa bao giờ đồng bộ
+ update_credentials: Cập nhật thông tin xác thực
+ delete: Xóa
+ no_accounts_title: Không tìm thấy tài khoản
+ no_accounts_message: Các ví Coinbase của bạn sẽ xuất hiện ở đây sau khi đồng bộ.
+ setup_needed: Ví sẵn sàng để nhập
+ setup_description: Chọn ví Coinbase bạn muốn theo dõi.
+ setup_action: Nhập ví
+ import_wallets_menu: Nhập ví
+ more_wallets_available:
+ one: "%{count} ví khác có sẵn để nhập"
+ other: "%{count} ví khác có sẵn để nhập"
+ select_existing_account:
+ title: Liên kết tài khoản Coinbase
+ no_accounts_found: Không tìm thấy tài khoản Coinbase nào.
+ wait_for_sync: Chờ Coinbase hoàn tất đồng bộ
+ check_provider_health: Kiểm tra xem thông tin API Coinbase của bạn có hợp lệ không
+ balance: Số dư
+ currently_linked_to: "Hiện đang liên kết với: %{account_name}"
+ link: Liên kết
+ cancel: Hủy
+ link_existing_account:
+ success: Đã liên kết thành công với tài khoản Coinbase
+ errors:
+ only_manual: Chỉ tài khoản thủ công mới có thể liên kết với Coinbase
+ invalid_coinbase_account: Tài khoản Coinbase không hợp lệ
+ coinbase_item:
+ syncer:
+ checking_credentials: Đang kiểm tra thông tin xác thực...
+ credentials_invalid: Thông tin API không hợp lệ. Vui lòng kiểm tra khóa API và bí mật của bạn.
+ importing_accounts: Đang nhập tài khoản từ Coinbase...
+ checking_configuration: Đang kiểm tra cấu hình tài khoản...
+ accounts_need_setup:
+ one: "%{count} tài khoản cần thiết lập"
+ other: "%{count} tài khoản cần thiết lập"
+ processing_accounts: Đang xử lý dữ liệu tài khoản...
+ calculating_balances: Đang tính toán số dư...
diff --git a/config/locales/views/coinstats_items/vi.yml b/config/locales/views/coinstats_items/vi.yml
new file mode 100644
index 000000000..5ec0b638e
--- /dev/null
+++ b/config/locales/views/coinstats_items/vi.yml
@@ -0,0 +1,75 @@
+---
+vi:
+ coinstats_items:
+ create:
+ success: Kết nối nhà cung cấp CoinStats đã được cấu hình thành công.
+ default_name: Kết nối CoinStats
+ errors:
+ validation_failed: "Xác thực thất bại: %{message}."
+ update:
+ success: Kết nối nhà cung cấp CoinStats đã được cập nhật thành công.
+ errors:
+ validation_failed: "Xác thực thất bại: %{message}."
+ destroy:
+ success: Kết nối nhà cung cấp CoinStats đã được lên lịch xóa.
+ link_wallet:
+ success: "%{count} ví tiền điện tử đã được liên kết thành công."
+ missing_params: "Thiếu tham số bắt buộc: địa chỉ và blockchain."
+ failed: Liên kết ví tiền điện tử thất bại.
+ error: "Liên kết ví tiền điện tử thất bại: %{message}."
+ link_exchange:
+ success: "%{name} sàn giao dịch đã được liên kết."
+ missing_params: Sàn giao dịch và thông tin xác thực là bắt buộc.
+ invalid_exchange: Sàn giao dịch đã chọn không còn được hỗ trợ.
+ failed: Liên kết sàn giao dịch thất bại.
+ error: "Liên kết sàn giao dịch thất bại: %{message}."
+ new:
+ title: Liên kết tiền điện tử với CoinStats
+ blockchain_fetch_error: Tải blockchain thất bại. Vui lòng thử lại sau.
+ link_wallet_title: Liên kết địa chỉ ví
+ link_wallet_description: Theo dõi ví tự quản hoặc địa chỉ on-chain đơn lẻ qua CoinStats.
+ address_label: Địa chỉ
+ address_placeholder: Bắt buộc
+ blockchain_label: Blockchain
+ blockchain_placeholder: Bắt buộc
+ blockchain_select_blank: Chọn một Blockchain
+ link_wallet_submit: Liên kết ví tiền điện tử
+ link_exchange_title: Liên kết API sàn giao dịch
+ link_exchange_description: Sử dụng khóa API chỉ đọc của sàn giao dịch để CoinStats có thể đồng bộ số dư và giao dịch từ Bitvavo, Binance và các sàn được hỗ trợ khác.
+ link_exchange_note: Nếu sàn giao dịch của bạn yêu cầu kích hoạt khóa API hoặc xác nhận qua email, hãy hoàn tất bước đó trước khi liên kết ở đây.
+ exchange_select_blank: Chọn một sàn giao dịch
+ exchange_label: Sàn giao dịch
+ link_exchange_submit: Liên kết sàn giao dịch
+ not_configured_title: Kết nối nhà cung cấp CoinStats chưa được cấu hình
+ not_configured_message: Để liên kết ví tiền điện tử hoặc sàn giao dịch, bạn phải cấu hình kết nối nhà cung cấp CoinStats trước.
+ not_configured_step1_html: Đi đến Cài đặt → Nhà cung cấp
+ not_configured_step2_html: Tìm nhà cung cấp CoinStats
+ not_configured_step3_html: Làm theo hướng dẫn thiết lập được cung cấp để hoàn tất cấu hình nhà cung cấp
+ go_to_settings: Đi đến Cài đặt nhà cung cấp
+ setup_instructions: "Hướng dẫn thiết lập:"
+ step1_html: Truy cập CoinStats Public API Dashboard để lấy khóa API.
+ step2: Nhập khóa API của bạn bên dưới và nhấn Cấu hình.
+ step3_html: Sau khi kết nối thành công, truy cập tab Tài khoản để thiết lập tài khoản tiền điện tử.
+ api_key_label: Khóa API
+ api_key_placeholder: Bắt buộc
+ configure: Cấu hình
+ update_configuration: Cấu hình lại
+ default_name: Kết nối CoinStats
+ coinstats_item:
+ deletion_in_progress: Dữ liệu ví tiền điện tử đang được xóa…
+ provider_name: CoinStats
+ syncing: Đang đồng bộ…
+ sync_status:
+ no_accounts: Không tìm thấy ví tiền điện tử
+ all_synced:
+ one: "%{count} ví tiền điện tử đã đồng bộ"
+ other: "%{count} ví tiền điện tử đã đồng bộ"
+ partial_sync: "%{linked_count} ví tiền điện tử đã đồng bộ, %{unlinked_count} cần thiết lập"
+ reconnect: Kết nối lại
+ status: Đồng bộ lần cuối %{timestamp} trước
+ status_never: Chưa bao giờ đồng bộ
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước • %{summary}"
+ update_api_key: Cập nhật khóa API
+ delete: Xóa
+ no_wallets_title: Không có ví tiền điện tử nào được kết nối
+ no_wallets_message: Hiện không có ví tiền điện tử nào được kết nối với CoinStats.
diff --git a/config/locales/views/components/vi.yml b/config/locales/views/components/vi.yml
new file mode 100644
index 000000000..fc8f5ea88
--- /dev/null
+++ b/config/locales/views/components/vi.yml
@@ -0,0 +1,162 @@
+---
+vi:
+ UI:
+ account:
+ activity_feed:
+ toggle_selection_checkboxes: Bật/tắt chọn
+ balance_reconciliation:
+ labels:
+ adjustments: Điều chỉnh
+ buys: Mua vào
+ change_in_brokerage_cash: Thay đổi tiền mặt môi giới
+ change_in_holdings_market: Thay đổi danh mục (giá thị trường)
+ change_in_holdings_trades: Thay đổi danh mục (mua/bán)
+ charges: Phí phát sinh
+ end_balance: Số dư cuối
+ end_principal: Gốc cuối
+ end_value: Giá trị cuối
+ final_balance: Số dư cuối cùng
+ final_principal: Gốc cuối cùng
+ final_value: Giá trị cuối cùng
+ market_changes: Biến động thị trường
+ net_cash_flow: Dòng tiền thuần
+ net_principal_change: Thay đổi gốc thuần
+ net_value_change: Thay đổi giá trị thuần
+ payments: Thanh toán
+ sells: Bán ra
+ start_balance: Số dư đầu
+ start_principal: Gốc đầu
+ start_value: Giá trị đầu
+ tooltips:
+ adjustments: Điều chỉnh thủ công hoặc điều chỉnh khác
+ adjustments_asset: Điều chỉnh giá trị thủ công hoặc thẩm định
+ buys: Mua tiền mã hóa trong ngày
+ change_in_brokerage_cash: Thay đổi tiền mặt thuần từ nạp/rút và giao dịch
+ change_in_holdings_market: Thay đổi giá trị danh mục do biến động giá thị trường
+ change_in_holdings_trades: Tác động đến danh mục từ mua bán chứng khoán
+ charges: Phí phát sinh mới trong ngày
+ end_balance: Số dư tính toán sau tất cả giao dịch
+ end_balance_investment: Số dư tính toán sau tất cả hoạt động
+ end_principal: Gốc tính toán sau tất cả giao dịch
+ end_value: Giá trị tính toán sau tất cả thay đổi
+ final_balance: Số dư tài khoản cuối cùng trong ngày
+ final_balance_credit: Số dư nợ cuối cùng trong ngày
+ final_balance_crypto: Giá trị danh mục tiền mã hóa cuối cùng trong ngày
+ final_balance_investment: Giá trị danh mục đầu tư cuối cùng trong ngày
+ final_principal: Số dư gốc cuối cùng trong ngày
+ final_value: Giá trị tài sản cuối cùng trong ngày
+ market_changes: Thay đổi giá trị do biến động giá thị trường
+ net_cash_flow: Thay đổi số dư thuần từ tất cả giao dịch trong ngày
+ net_principal_change: Thanh toán gốc và khoản vay mới trong ngày
+ net_value_change: Tất cả thay đổi giá trị bao gồm cải thiện và khấu hao
+ payments: Thanh toán thẻ trong ngày
+ sells: Bán tiền mã hóa trong ngày
+ start_balance: Số dư tài khoản đầu ngày
+ start_balance_credit: Số dư nợ đầu ngày
+ start_balance_crypto: Giá trị danh mục tiền mã hóa đầu ngày
+ start_balance_investment: Tổng giá trị danh mục đầu tư đầu ngày
+ start_principal: Số dư gốc đầu ngày
+ start_value: Giá trị tài sản đầu ngày
+ chart:
+ no_data_available: "Không có dữ liệu"
+ title:
+ balance: Số dư
+ cash_value: Giá trị tiền mặt
+ debt_balance: Số dư nợ
+ estimated_property_value: Giá trị bất động sản ước tính
+ estimated_vehicle_value: Giá trị phương tiện ước tính
+ holdings_value: Giá trị danh mục
+ remaining_principal_balance: Số dư gốc còn lại
+ total_account_value: Tổng giá trị tài khoản
+ views:
+ cash: Tiền mặt
+ holdings: Danh mục
+ total_value: Tổng giá trị
+ vs_available_history: so với lịch sử hiện có
+ activity_date:
+ balance_tooltip: "Số dư cuối ngày, sau tất cả giao dịch và điều chỉnh"
+ no_balance_data: "Không có dữ liệu số dư cho ngày này"
+ ds:
+ alert:
+ variants:
+ info: Thông tin
+ success: Thành công
+ warning: Cảnh báo
+ error: Lỗi
+ destructive: Lỗi
+ pill:
+ aria_label: "%{label}"
+ default_label: Xem trước
+ dialog:
+ close: Đóng
+ popover:
+ avatar_default_label: Mở menu
+ tooltip:
+ trigger_label: Thêm thông tin
+ link:
+ opens_in_new_tab: (mở trong tab mới)
+ provider_sync_summary:
+ title: Tóm tắt đồng bộ
+ last_sync: "Đồng bộ lần cuối: %{time_ago} trước"
+ accounts:
+ title: Tài khoản
+ total: "Tổng: %{count}"
+ linked: "Đã liên kết: %{count}"
+ unlinked: "Chưa liên kết: %{count}"
+ institutions: "Tổ chức: %{count}"
+ transactions:
+ title: Giao dịch
+ seen: "Đã thấy: %{count}"
+ imported: "Đã nhập: %{count}"
+ updated: "Đã cập nhật: %{count}"
+ skipped: "Đã bỏ qua: %{count}"
+ fetching: "Đang tải từ sàn giao dịch..."
+ protected:
+ one: "%{count} mục được bảo vệ (không ghi đè)"
+ other: "%{count} mục được bảo vệ (không ghi đè)"
+ view_protected: Xem các mục được bảo vệ
+ skip_reasons:
+ excluded: Đã loại trừ
+ user_modified: Người dùng đã sửa
+ import_locked: Nhập CSV
+ protected: Được bảo vệ
+ holdings:
+ title: Danh mục nắm giữ
+ found: "Tìm thấy: %{count}"
+ processed: "Đã xử lý: %{count}"
+ trades:
+ title: Giao dịch chứng khoán
+ imported: "Đã nhập: %{count}"
+ skipped: "Đã bỏ qua: %{count}"
+ fetching: "Đang tải hoạt động từ sàn giao dịch..."
+ health:
+ title: Tình trạng
+ view_error_details: Xem chi tiết lỗi
+ rate_limited: "Bị giới hạn tốc độ %{time_ago}"
+ recently: gần đây
+ errors: "Lỗi: %{count}"
+ pending_reconciled:
+ one: "%{count} giao dịch chờ trùng lặp đã được đối chiếu"
+ other: "%{count} giao dịch chờ trùng lặp đã được đối chiếu"
+ view_reconciled: Xem giao dịch đã đối chiếu
+ duplicate_suggestions:
+ one: "%{count} giao dịch có thể trùng lặp cần xem xét"
+ other: "%{count} giao dịch có thể trùng lặp cần xem xét"
+ view_duplicate_suggestions: Xem các giao dịch trùng lặp được đề xuất
+ stale_pending:
+ one: "%{count} giao dịch chờ cũ (không tính vào ngân sách)"
+ other: "%{count} giao dịch chờ cũ (không tính vào ngân sách)"
+ view_stale_pending: Xem các tài khoản bị ảnh hưởng
+ stale_pending_count:
+ one: "%{count} giao dịch"
+ other: "%{count} giao dịch"
+ stale_unmatched:
+ one: "%{count} giao dịch chờ cần xem xét thủ công"
+ other: "%{count} giao dịch chờ cần xem xét thủ công"
+ view_stale_unmatched: Xem giao dịch cần xem xét
+ stale_unmatched_count:
+ one: "%{count} giao dịch"
+ other: "%{count} giao dịch"
+ data_warnings: "Cảnh báo dữ liệu: %{count}"
+ notices: "Thông báo: %{count}"
+ view_data_quality: Xem chi tiết chất lượng dữ liệu
diff --git a/config/locales/views/credit_cards/vi.yml b/config/locales/views/credit_cards/vi.yml
new file mode 100644
index 000000000..96fd56c1e
--- /dev/null
+++ b/config/locales/views/credit_cards/vi.yml
@@ -0,0 +1,26 @@
+---
+vi:
+ credit_cards:
+ edit:
+ edit: Chỉnh sửa %{account}
+ form:
+ annual_fee: Phí thường niên
+ annual_fee_placeholder: '99'
+ apr: Lãi suất APR
+ apr_placeholder: '15.99'
+ available_credit: Hạn mức tín dụng còn lại
+ available_credit_placeholder: '10000'
+ expiration_date: Ngày hết hạn
+ minimum_payment: Thanh toán tối thiểu
+ minimum_payment_placeholder: '100'
+ new:
+ title: Nhập thông tin thẻ tín dụng
+ overview:
+ amount_owed: Số tiền nợ
+ annual_fee: Phí thường niên
+ apr: Lãi suất APR
+ available_credit: Hạn mức tín dụng còn lại
+ edit_account_details: Chỉnh sửa thông tin tài khoản
+ expiration_date: Ngày hết hạn
+ minimum_payment: Thanh toán tối thiểu
+ unknown: Không xác định
diff --git a/config/locales/views/cryptos/vi.yml b/config/locales/views/cryptos/vi.yml
new file mode 100644
index 000000000..ddc345939
--- /dev/null
+++ b/config/locales/views/cryptos/vi.yml
@@ -0,0 +1,20 @@
+---
+vi:
+ cryptos:
+ edit:
+ edit: Chỉnh sửa %{account}
+ form:
+ subtype_label: Loại tài khoản
+ subtype_prompt: Chọn loại tài khoản
+ subtype_none: Không có
+ tax_treatment_label: Chế độ thuế
+ tax_treatment_hint: Hầu hết tiền mã hóa được nắm giữ trong các tài khoản chịu thuế. Chọn một tùy chọn khác nếu được nắm giữ trong tài khoản có lợi thế về thuế.
+ new:
+ title: Nhập số dư tài khoản
+ subtypes:
+ wallet:
+ short: Ví
+ long: Ví tiền mã hóa
+ exchange:
+ short: Sàn giao dịch
+ long: Sàn giao dịch tiền mã hóa
diff --git a/config/locales/views/depositories/vi.yml b/config/locales/views/depositories/vi.yml
new file mode 100644
index 000000000..ef89650a2
--- /dev/null
+++ b/config/locales/views/depositories/vi.yml
@@ -0,0 +1,26 @@
+---
+vi:
+ depositories:
+ edit:
+ edit: Chỉnh sửa %{account}
+ form:
+ none: Không có
+ subtype_prompt: Chọn loại tài khoản
+ new:
+ title: Nhập số dư tài khoản
+ subtypes:
+ cd:
+ long: Chứng chỉ tiền gửi
+ short: CD
+ checking:
+ long: Tài khoản thanh toán
+ short: Thanh toán
+ hsa:
+ long: Tài khoản tiết kiệm y tế
+ short: HSA
+ money_market:
+ long: Thị trường tiền tệ
+ short: MM
+ savings:
+ long: Tài khoản tiết kiệm
+ short: Tiết kiệm
diff --git a/config/locales/views/email_confirmation_mailer/vi.yml b/config/locales/views/email_confirmation_mailer/vi.yml
new file mode 100644
index 000000000..e7c042401
--- /dev/null
+++ b/config/locales/views/email_confirmation_mailer/vi.yml
@@ -0,0 +1,9 @@
+---
+vi:
+ email_confirmation_mailer:
+ confirmation_email:
+ body: Bạn vừa yêu cầu thay đổi địa chỉ email. Nhấp vào nút bên dưới để xác nhận thay đổi này.
+ cta: Xác nhận thay đổi email
+ expiry_notice: Liên kết này sẽ hết hạn sau %{hours} giờ.
+ greeting: Xin chào!
+ subject: '%{product_name}: Xác nhận thay đổi email của bạn'
diff --git a/config/locales/views/enable_banking_items/vi.yml b/config/locales/views/enable_banking_items/vi.yml
new file mode 100644
index 000000000..138ba872d
--- /dev/null
+++ b/config/locales/views/enable_banking_items/vi.yml
@@ -0,0 +1,116 @@
+---
+vi:
+ enable_banking_items:
+ errors:
+ api_error: "Đã xảy ra lỗi giao tiếp với ngân hàng."
+ network_unreachable: "Dịch vụ ngân hàng tạm thời không khả dụng. Vui lòng thử lại sau."
+ session_invalid: "Phiên đã hết hạn. Vui lòng kết nối lại ngân hàng của bạn."
+ unexpected: "Đã xảy ra lỗi không mong muốn trong quá trình đồng bộ."
+ authorize:
+ authorization_failed: "Không thể khởi tạo ủy quyền: %{message}"
+ bank_required: Vui lòng chọn ngân hàng.
+ decoupled_not_supported: Ngân hàng này sử dụng phương thức xác thực thiết bị riêng biệt chưa được hỗ trợ. Vui lòng thêm tài khoản này thủ công.
+ invalid_redirect: URL ủy quyền nhận được không hợp lệ. Vui lòng thử lại.
+ redirect_uri_not_allowed: Chuyển hướng không được phép. Vui lòng cấu hình `%{callback_url}` trong cài đặt ứng dụng Enable Banking của bạn.
+ unexpected_error: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại.
+ callback:
+ authorization_error: Ủy quyền thất bại
+ invalid_callback: Tham số callback không hợp lệ.
+ item_not_found: Không tìm thấy kết nối.
+ session_failed: Không thể hoàn tất ủy quyền
+ success: Đã kết nối thành công với ngân hàng của bạn. Các tài khoản đang được đồng bộ.
+ unexpected_error: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại.
+ complete_account_setup:
+ all_skipped: Tất cả tài khoản đã bị bỏ qua. Bạn có thể thiết lập sau trên trang tài khoản.
+ no_accounts: Không có tài khoản nào để thiết lập.
+ success: Đã tạo thành công %{count} tài khoản!
+ create:
+ success: Cấu hình Enable Banking thành công.
+ destroy:
+ success: Kết nối Enable Banking đã được đưa vào hàng đợi xóa.
+ link_accounts:
+ already_linked: Các tài khoản đã chọn đã được liên kết.
+ link_failed: Liên kết tài khoản thất bại
+ no_accounts_selected: Chưa chọn tài khoản nào.
+ no_session: Không có kết nối Enable Banking nào đang hoạt động. Vui lòng kết nối với ngân hàng trước.
+ success: Đã liên kết thành công %{count} tài khoản.
+ link_existing_account:
+ success: Tài khoản đã được liên kết thành công với Enable Banking
+ errors:
+ only_manual: Chỉ tài khoản thủ công mới có thể được liên kết
+ invalid_enable_banking_account: Tài khoản Enable Banking được chọn không hợp lệ
+ enable_banking_item:
+ deletion_in_progress: Đang xóa
+ provider_name: Enable Banking
+ syncing: Đang đồng bộ...
+ reconnect: Kết nối lại
+ last_synced: Đồng bộ lần cuối %{time} trước
+ never_synced: Chưa bao giờ đồng bộ
+ update: Cập nhật
+ delete: Xóa
+ setup_needed: Cần thiết lập
+ setup_needed_description:
+ one: 1 tài khoản được nhập từ Enable Banking cần thiết lập
+ other: "%{count} tài khoản được nhập từ Enable Banking cần thiết lập"
+ set_up_accounts: Thiết lập tài khoản
+ no_accounts_found: Không tìm thấy tài khoản
+ no_accounts_found_description: Không tìm thấy tài khoản từ Enable Banking. Hãy thử đồng bộ lại.
+ select_existing_account:
+ title: Liên kết tài khoản Enable Banking
+ all_linked: Tất cả tài khoản Enable Banking có vẻ đã được liên kết.
+ try_after_sync: Nếu bạn vừa kết nối hoặc đồng bộ, hãy thử lại sau khi hoàn tất.
+ unlink_to_move: Để liên kết tài khoản khác, trước tiên hãy hủy liên kết từ menu thao tác của tài khoản.
+ balance: Số dư
+ link: Liên kết
+ cancel: Hủy
+ setup_accounts:
+ title: Thiết lập tài khoản Enable Banking của bạn
+ header_subtitle: Chọn đúng loại tài khoản cho các tài khoản đã nhập
+ choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản Enable Banking:"
+ historical_data_range: "Phạm vi dữ liệu lịch sử:"
+ sync_start_date_label: "Bắt đầu đồng bộ giao dịch từ:"
+ sync_start_date_help: Chọn khoảng thời gian lịch sử giao dịch bạn muốn đồng bộ. Tối đa 2 năm lịch sử có sẵn.
+ account_type_label: "Loại tài khoản:"
+ balance: Số dư
+ create_accounts: Tạo tài khoản
+ creating_accounts: Đang tạo tài khoản...
+ cancel: Hủy
+ new:
+ link_enable_banking_title: Liên kết Enable Banking
+ session_expired: Phiên hết hạn - cần ủy quyền lại
+ connected_bank: Ngân hàng đã kết nối
+ session_expires: "Phiên hết hạn"
+ unknown: Không rõ
+ connection: Kết nối
+ configured: Đã cấu hình
+ ready_to_connect: Sẵn sàng kết nối ngân hàng
+ sync: Đồng bộ
+ reconnect: Kết nối lại
+ connect_bank: Kết nối ngân hàng
+ remove_confirm: Bạn có chắc chắn muốn xóa kết nối này không?
+ remove: Xóa
+ add_connection: Thêm kết nối
+ not_configured: Kết nối Enable Banking chưa được cấu hình
+ not_configured_description: Trước khi liên kết tài khoản Enable Banking, bạn cần cấu hình kết nối Enable Banking.
+ setup_steps_title: "Các bước thiết lập:"
+ setup_step_1_html: "Đi đến Cài đặt → Nhà cung cấp"
+ setup_step_2_html: "Tìm phần Enable Banking"
+ setup_step_3: Nhập thông tin xác thực Enable Banking của bạn
+ setup_step_4: Quay lại đây để liên kết tài khoản
+ go_to_provider_settings: Đi đến Cài đặt nhà cung cấp
+ reauthorize:
+ invalid_redirect: URL ủy quyền nhận được không hợp lệ. Vui lòng thử lại.
+ reauthorization_failed: Ủy quyền lại thất bại
+ select_bank:
+ beta_label: Beta
+ cancel: Hủy
+ check_country: Vui lòng kiểm tra cài đặt mã quốc gia của bạn.
+ credentials_required: Vui lòng cấu hình thông tin xác thực Enable Banking trước.
+ description: Chọn ngân hàng bạn muốn kết nối với tài khoản của mình.
+ no_banks: Không có ngân hàng nào cho quốc gia/khu vực này.
+ no_search_results: Không có ngân hàng nào khớp với tìm kiếm của bạn.
+ search_label: Tìm kiếm ngân hàng của bạn
+ search_placeholder: Tìm kiếm ngân hàng của bạn...
+ title: Chọn ngân hàng của bạn
+ update:
+ success: Đã cập nhật cấu hình Enable Banking.
diff --git a/config/locales/views/entries/vi.yml b/config/locales/views/entries/vi.yml
new file mode 100644
index 000000000..6f8194302
--- /dev/null
+++ b/config/locales/views/entries/vi.yml
@@ -0,0 +1,23 @@
+---
+vi:
+ entries:
+ create:
+ success: Đã tạo mục nhập
+ destroy:
+ success: Đã xóa mục nhập
+ empty:
+ description: Thử thêm mục nhập, chỉnh bộ lọc hoặc tinh chỉnh tìm kiếm
+ title: Không tìm thấy mục nhập
+ loading:
+ loading: Đang tải mục nhập...
+ update:
+ success: Đã cập nhật mục nhập
+ unlock:
+ success: Đã mở khóa mục nhập. Có thể được cập nhật lần đồng bộ tiếp theo.
+ protection:
+ tooltip: Được bảo vệ khỏi đồng bộ
+ title: Được bảo vệ khỏi đồng bộ
+ description: Các chỉnh sửa của bạn với mục nhập này sẽ không bị ghi đè khi đồng bộ từ nhà cung cấp.
+ locked_fields_label: "Các trường bị khóa:"
+ unlock_button: Cho phép đồng bộ cập nhật
+ unlock_confirm: Cho phép đồng bộ cập nhật mục nhập này? Các thay đổi của bạn có thể bị ghi đè lần đồng bộ tiếp theo.
diff --git a/config/locales/views/family_exports/vi.yml b/config/locales/views/family_exports/vi.yml
new file mode 100644
index 000000000..e2102acf1
--- /dev/null
+++ b/config/locales/views/family_exports/vi.yml
@@ -0,0 +1,43 @@
+---
+vi:
+ family_exports:
+ access_denied: Truy cập bị từ chối
+ create:
+ success: Xuất dữ liệu đã bắt đầu. Bạn sẽ có thể tải xuống trong thời gian ngắn.
+ delete_confirmation: Bạn có chắc chắn muốn xóa bản xuất này không? Hành động này không thể hoàn tác.
+ delete_failed_confirmation: Bạn có chắc chắn muốn xóa bản xuất thất bại này không?
+ destroy:
+ success: Bản xuất đã được xóa thành công
+ export_not_ready: Bản xuất chưa sẵn sàng để tải xuống
+ exporting: Đang xuất dữ liệu...
+ new:
+ dialog_title: Xuất dữ liệu của bạn
+ dialog_subtitle: Tải xuống tất cả dữ liệu tài chính của bạn
+ whats_included: "Bao gồm:"
+ accounts_and_balances: Tất cả tài khoản và số dư
+ transaction_history: Lịch sử giao dịch
+ investment_trades: Giao dịch đầu tư
+ categories_tags_rules: Danh mục, nhãn và quy tắc
+ note_label: Lưu ý
+ note_description: Bản xuất này bao gồm tất cả dữ liệu của bạn, nhưng chỉ một phần dữ liệu có thể được nhập lại thông qua tính năng nhập CSV. Chúng tôi hỗ trợ nhập tài khoản, giao dịch (với danh mục và nhãn) và giao dịch mua bán. Dữ liệu tài khoản khác không thể nhập và chỉ dùng để lưu trữ hồ sơ của bạn.
+ cancel: Hủy
+ export_data: Xuất dữ liệu
+ index:
+ title: Xuất dữ liệu
+ new: Xuất mới
+ table:
+ title: Xuất dữ liệu
+ header:
+ date: Ngày
+ filename: Tên tệp
+ status: Trạng thái
+ actions: Hành động
+ row:
+ status:
+ in_progress: Đang xử lý
+ complete: Hoàn tất
+ failed: Thất bại
+ actions:
+ delete: Xóa
+ download: Tải xuống
+ empty: Chưa có bản xuất nào.
diff --git a/config/locales/views/holdings/vi.yml b/config/locales/views/holdings/vi.yml
new file mode 100644
index 000000000..216836479
--- /dev/null
+++ b/config/locales/views/holdings/vi.yml
@@ -0,0 +1,101 @@
+---
+vi:
+ holdings:
+ cash:
+ brokerage_cash: Tiền mặt môi giới
+ destroy:
+ success: Đã xóa danh mục nắm giữ
+ cannot_delete: Bạn không thể xóa danh mục nắm giữ này
+ update:
+ success: Đã lưu giá vốn.
+ error: Giá trị giá vốn không hợp lệ.
+ unlock_cost_basis:
+ success: Đã mở khóa giá vốn. Có thể được cập nhật lần đồng bộ tiếp theo.
+ remap_security:
+ success: Đã cập nhật chứng khoán thành công.
+ security_not_found: Không tìm thấy chứng khoán đã chọn.
+ reset_security:
+ success: Chứng khoán đã được đặt lại về giá trị từ nhà cung cấp.
+ sync_prices:
+ success: Đã đồng bộ dữ liệu thị trường thành công.
+ unavailable: Đồng bộ dữ liệu thị trường không khả dụng cho chứng khoán ngoại tuyến.
+ provider_error: Không thể tải giá mới nhất. Vui lòng thử lại sau vài phút.
+ errors:
+ security_collision: "Không thể ánh xạ lại: bạn đã có danh mục nắm giữ cho %{ticker} vào ngày %{date}."
+ cost_basis_sources:
+ manual: Người dùng đặt
+ calculated: Từ giao dịch
+ provider: Từ nhà cung cấp
+ cost_basis_cell:
+ unknown: "--"
+ set: Đặt
+ set_cost_basis_header: "Đặt giá vốn cho %{ticker} (%{qty} cổ phiếu)"
+ total_cost_basis_label: Tổng giá vốn
+ or_per_share_label: "Hoặc nhập mỗi cổ phiếu:"
+ per_share: mỗi cổ phiếu
+ cancel: Hủy
+ save: Lưu
+ overwrite_confirm_title: Ghi đè giá vốn?
+ overwrite_confirm_body: "Thao tác này sẽ thay thế giá vốn hiện tại là %{current}."
+ holding:
+ per_share: mỗi cổ phiếu
+ shares: "%{qty} cổ phiếu"
+ unknown: "--"
+ no_cost_basis: Không có giá vốn
+ index:
+ average_cost: Giá trung bình
+ holdings: Danh mục nắm giữ
+ name: Tên
+ new_holding: Hoạt động mới
+ no_holdings: Không có danh mục nắm giữ.
+ return: Tổng lợi nhuận
+ weight: Tỷ trọng
+ missing_price_tooltip:
+ description: Khoản đầu tư này có giá trị bị thiếu và chúng tôi không thể tính lợi nhuận hoặc giá trị.
+ missing_data: Thiếu dữ liệu
+ show:
+ avg_cost_label: Giá trung bình
+ current_market_price_label: Giá thị trường hiện tại
+ delete: Xóa
+ delete_subtitle: Thao tác này sẽ xóa danh mục nắm giữ và tất cả giao dịch liên quan trong tài khoản này. Không thể hoàn tác.
+ delete_title: Xóa danh mục nắm giữ
+ edit_security: Chỉnh sửa chứng khoán
+ history: Lịch sử
+ no_trade_history: Không có lịch sử giao dịch cho danh mục nắm giữ này.
+ overview: Tổng quan
+ portfolio_weight_label: Tỷ trọng danh mục
+ settings: Cài đặt
+ security_label: Chứng khoán
+ originally: "là %{ticker}"
+ search_security: Tìm kiếm chứng khoán
+ search_security_placeholder: Tìm theo mã ticker hoặc tên
+ cancel: Hủy
+ remap_security: Lưu
+ provider_disabled_warning: "Cập nhật giá tạm dừng — nhà cung cấp %{provider} đã bị tắt. Chuyển sang nhà cung cấp khác bên dưới hoặc bật lại trong Cài đặt."
+ truncated_history_warning: "Lịch sử giá chỉ khả dụng từ %{date} trở đi. Các ngày trước đó không có dữ liệu từ nhà cung cấp đã chọn."
+ switch_provider_label: Chuyển nhà cung cấp
+ switch_provider_description: "%{provider} đã bị tắt. Tìm kiếm chứng khoán này từ nhà cung cấp khác đã bật."
+ switch_provider_button: Chuyển
+ no_security_provider: Chưa cấu hình nhà cung cấp chứng khoán. Không thể tìm kiếm chứng khoán.
+ security_remapped_label: Chứng khoán đã được ánh xạ lại
+ provider_sent: "Nhà cung cấp gửi: %{ticker}"
+ reset_to_provider: Đặt lại về nhà cung cấp
+ reset_confirm_title: Đặt lại chứng khoán về nhà cung cấp?
+ reset_confirm_body: "Thao tác này sẽ thay đổi chứng khoán từ %{current} về %{original} và chuyển tất cả giao dịch liên quan."
+ ticker_label: Mã ticker
+ trade_history_entry: "%{qty} cổ phiếu %{security} ở mức %{price}"
+ total_return_label: Tổng lợi nhuận
+ unknown: Không xác định
+ cost_basis_locked_label: Giá vốn đã bị khóa
+ cost_basis_locked_description: Giá vốn bạn đặt thủ công sẽ không bị thay đổi khi đồng bộ.
+ unlock_cost_basis: Mở khóa
+ unlock_confirm_title: Mở khóa giá vốn?
+ unlock_confirm_body: Thao tác này sẽ cho phép giá vốn được cập nhật bởi đồng bộ nhà cung cấp hoặc tính toán giao dịch.
+ shares_label: Cổ phiếu
+ book_value_label: Giá trị sổ sách
+ market_value_label: Giá trị thị trường
+ market_data_label: Dữ liệu thị trường
+ market_data_sync_button: Làm mới
+ last_price_update: Cập nhật giá lần cuối
+ syncing: Đang đồng bộ...
+ never: Chưa bao giờ
diff --git a/config/locales/views/ibkr_items/vi.yml b/config/locales/views/ibkr_items/vi.yml
new file mode 100644
index 000000000..2bb59f9a5
--- /dev/null
+++ b/config/locales/views/ibkr_items/vi.yml
@@ -0,0 +1,92 @@
+---
+vi:
+ providers:
+ ibkr:
+ name: Interactive Brokers
+ connection_description: Kết nối báo cáo Flex Web Service của Interactive Brokers
+ institution_name: Interactive Brokers
+ ibkr_items:
+ defaults:
+ name: Interactive Brokers
+ ibkr_item:
+ deletion_in_progress: Đang xóa
+ flex_web_service: Flex Web Service
+ syncing: Đang đồng bộ
+ requires_update: Thông tin xác thực cần chú ý
+ error: Lỗi
+ synced: Đã đồng bộ %{time} trước. %{summary}.
+ never_synced: Chưa bao giờ đồng bộ.
+ setup_accounts: Thiết lập tài khoản
+ delete: Xóa
+ accounts_need_setup: Tài khoản cần thiết lập
+ accounts_need_setup_description: Một số tài khoản từ IBKR cần được liên kết với tài khoản Sure.
+ no_accounts_discovered: Chưa phát hiện tài khoản IBKR nào.
+ no_accounts_discovered_description: Chạy đồng bộ sau khi cấu hình truy vấn Flex để phát hiện tài khoản.
+ setup_accounts:
+ page_title: Thiết lập tài khoản Interactive Brokers
+ dialog_title: Thiết lập tài khoản Interactive Brokers của bạn
+ subtitle: Chọn tài khoản brokerage IBKR để liên kết.
+ info_box:
+ title: Nhập Flex Query IBKR
+ items:
+ item_1: Tài sản nắm giữ với giá hiện tại và số lượng
+ item_2: Cơ sở chi phí theo vị thế
+ item_3: Giao dịch, cổ tức, hoa hồng và tiền gửi hoặc rút tiền
+ warning: Hoạt động lịch sử bị giới hạn trong khoảng thời gian báo cáo của Flex Query
+ status:
+ fetching_accounts: Đang lấy tài khoản từ Interactive Brokers...
+ no_accounts_found_title: Không tìm thấy tài khoản.
+ no_accounts_found_description: Sure không thể tìm thấy tài khoản IBKR nào trong báo cáo Flex mới nhất.
+ available_accounts:
+ title: Tài khoản có sẵn
+ account_type_investment: Đầu tư
+ account_summary: "%{account_type} • Số dư: %{balance}"
+ account_id: "Mã tài khoản: %{account_id}"
+ link_existing:
+ description: Hoặc liên kết tài khoản IBKR đã phát hiện với tài khoản đầu tư thủ công hiện có.
+ manual_account_option: "%{name} (%{balance})"
+ select_prompt: Chọn một tài khoản...
+ linked_accounts:
+ title: Đã liên kết
+ linked_to_html: "Liên kết với: %{account}"
+ buttons:
+ refresh: Làm mới
+ cancel: Hủy
+ back_to_settings: Quay lại Cài đặt
+ create_selected_accounts: Tạo tài khoản đã chọn
+ link: Liên kết
+ done: Xong
+ sync_status:
+ no_accounts: Chưa phát hiện tài khoản IBKR nào
+ all_linked:
+ one: 1 tài khoản đã liên kết
+ other: "%{count} tài khoản đã liên kết"
+ partial: "%{linked} đã liên kết, %{unlinked} cần thiết lập"
+ select_existing_account:
+ title: Liên kết tài khoản Interactive Brokers
+ no_accounts_available: Chưa có tài khoản Interactive Brokers chưa được liên kết.
+ run_sync_hint: "Chạy đồng bộ từ Cài đặt > Nhà cung cấp sau khi cập nhật truy vấn Flex."
+ wait_for_sync: Chờ quá trình đồng bộ phát hiện tài khoản hoàn tất.
+ balance: Số dư
+ link: Liên kết
+ cancel: Hủy
+ create:
+ success: Đã cấu hình Interactive Brokers thành công.
+ update:
+ success: Đã cập nhật cấu hình Interactive Brokers thành công.
+ destroy:
+ success: Đã lên lịch xóa kết nối Interactive Brokers.
+ select_accounts:
+ not_configured: Interactive Brokers chưa được cấu hình.
+ link_existing_account:
+ not_found: Không tìm thấy tài khoản hoặc cấu hình Interactive Brokers.
+ only_manual_investment: Chỉ tài khoản đầu tư thủ công mới có thể liên kết với Interactive Brokers.
+ already_linked: Tài khoản Interactive Brokers này đã được liên kết.
+ success: Đã liên kết thành công với tài khoản Interactive Brokers.
+ failed: Liên kết tài khoản Interactive Brokers thất bại.
+ complete_account_setup:
+ success:
+ one: Đã tạo thành công %{count} tài khoản Interactive Brokers.
+ other: Đã tạo thành công %{count} tài khoản Interactive Brokers.
+ none_selected: Không có tài khoản nào được chọn.
+ none_created: Không có tài khoản nào được tạo.
diff --git a/config/locales/views/impersonation_sessions/vi.yml b/config/locales/views/impersonation_sessions/vi.yml
new file mode 100644
index 000000000..a47890da8
--- /dev/null
+++ b/config/locales/views/impersonation_sessions/vi.yml
@@ -0,0 +1,25 @@
+---
+vi:
+ impersonation_sessions:
+ approve:
+ success: Yêu cầu đã được chấp thuận
+ complete:
+ success: Phiên đã hoàn tất
+ create:
+ success: Yêu cầu đã được gửi đến người dùng. Đang chờ chấp thuận.
+ join:
+ success: Đã tham gia phiên
+ leave:
+ success: Đã rời phiên
+ reject:
+ success: Yêu cầu đã bị từ chối
+ super_admin_bar:
+ super_admin: Quản trị viên cấp cao
+ jobs: Công việc
+ impersonating: Đang mạo danh
+ leave: Rời
+ terminate: Kết thúc
+ join_a_session: Tham gia phiên
+ join: Tham gia
+ uuid_placeholder: UUID
+ request_impersonation: Yêu cầu mạo danh
diff --git a/config/locales/views/imports/vi.yml b/config/locales/views/imports/vi.yml
new file mode 100644
index 000000000..1943a9334
--- /dev/null
+++ b/config/locales/views/imports/vi.yml
@@ -0,0 +1,436 @@
+---
+vi:
+ import:
+ qif_category_selections:
+ update:
+ success: "Đã lưu danh mục và nhãn."
+ show:
+ title: "Cấu hình & chọn"
+ description: "Xem lại định dạng ngày được phát hiện, sau đó chọn danh mục và nhãn từ tệp QIF để đưa vào %{product_name}."
+ categories_heading: Danh mục
+ categories_found:
+ one: "Tìm thấy 1 danh mục"
+ other: "Tìm thấy %{count} danh mục"
+ category_name_col: Tên danh mục
+ transactions_col: Giao dịch
+ tags_heading: Nhãn
+ tags_found:
+ one: "Tìm thấy 1 nhãn"
+ other: "Tìm thấy %{count} nhãn"
+ tag_name_col: Tên nhãn
+ txn_count:
+ one: "1 giao dịch"
+ other: "%{count} giao dịch"
+ split_warning_title: Phát hiện giao dịch phân chia
+ split_warning_description: "Tệp QIF này chứa giao dịch phân chia. Phân chia chưa được hỗ trợ, mỗi giao dịch phân chia sẽ được nhập như một giao dịch đơn với toàn bộ số tiền và không có danh mục."
+ split_badge: phân chia
+ empty_state_primary: Không tìm thấy danh mục hoặc nhãn nào trong tệp QIF này.
+ empty_state_secondary: Tất cả giao dịch sẽ được nhập mà không có danh mục hoặc nhãn.
+ submit: Tiếp tục xem xét
+ cleans:
+ show:
+ not_configured: "Vui lòng cấu hình nhập dữ liệu trước khi tiếp tục."
+ description: Chỉnh sửa dữ liệu trong bảng bên dưới. Ô đỏ là không hợp lệ.
+ errors_notice: Dữ liệu của bạn có lỗi. Di chuột qua lỗi để xem chi tiết.
+ errors_notice_mobile: Dữ liệu của bạn có lỗi. Nhấn vào tooltip lỗi để xem chi tiết.
+ title: Làm sạch dữ liệu
+ data_cleaned: Dữ liệu của bạn đã được làm sạch
+ next_step: Bước tiếp theo
+ all_rows: Tất cả hàng
+ error_rows: Hàng lỗi
+ configurations:
+ update:
+ success: Đã cấu hình nhập dữ liệu thành công.
+ account_import:
+ leave_empty: Để trống
+ default: Mặc định
+ entity_type: Loại thực thể
+ name: Tên
+ balance: Số dư
+ currency: Tiền tệ
+ balance_date: Ngày số dư
+ date_format: Định dạng ngày
+ select_format: Chọn định dạng
+ apply_configuration: Áp dụng cấu hình
+ transaction_import:
+ date_label: Ngày
+ select_column: Chọn cột
+ select_format: Chọn định dạng
+ amount_label: Số tiền
+ default: Mặc định
+ currency_label: Tiền tệ
+ format_label: Định dạng
+ amount_type_strategy_label: Chiến lược loại số tiền
+ select_strategy: Chọn chiến lược
+ set: Đặt
+ as_amount_type_column: là cột loại số tiền
+ select_value: Chọn giá trị
+ as_identifier_value: là giá trị định danh
+ treat_as_html: "Xem \"%{value}\" là"
+ income_inflow: Thu nhập (dòng vào)
+ expense_outflow: Chi tiêu (dòng ra)
+ select_type: Chọn loại
+ leave_empty: Để trống
+ account_label: Tài khoản
+ name_label: Tên
+ category_label: Danh mục
+ tags_label: Nhãn
+ notes_label: Ghi chú
+ apply_configuration: Áp dụng cấu hình
+ incomes_are_positive: Thu nhập là số dương
+ incomes_are_negative: Thu nhập là số âm
+ amount_type_label: Loại số tiền
+ select_convention: Chọn quy ước
+ date_format_label: Định dạng ngày
+ rows_to_skip_label: Bỏ qua n hàng đầu
+ trade_import:
+ select_column: Chọn cột
+ date_label: Ngày
+ quantity_label: Số lượng
+ buys_are_positive: Mua là số lượng dương
+ buys_are_negative: Mua là số lượng âm
+ default: Mặc định
+ currency_label: Tiền tệ
+ format_label: Định dạng
+ select_format: Chọn định dạng
+ ticker_label: Mã ticker
+ leave_empty: Để trống
+ stock_exchange_code_label: Mã sàn giao dịch
+ price_label: Giá
+ account_label: Tài khoản
+ name_label: Tên
+ note_label: Ghi chú
+ no_security_provider_warning: Nhà cung cấp giá chứng khoán chưa được cấu hình. Nhập giao dịch sẽ hoạt động, nhưng Sure sẽ không bổ sung lịch sử giá. Vui lòng vào cài đặt để cấu hình.
+ date_format_label: Định dạng ngày
+ apply_configuration: Áp dụng cấu hình
+ category_import:
+ button_label: Tiếp tục
+ description: Tải lên tệp CSV đơn giản (như tệp chúng tôi tạo khi bạn xuất dữ liệu). Chúng tôi sẽ tự động ánh xạ các cột cho bạn.
+ instructions: Chọn tiếp tục để phân tích CSV và chuyển sang bước làm sạch.
+ mint_import:
+ date_format_label: Định dạng ngày
+ actual_import:
+ preconfigured_notice: Chúng tôi đã cấu hình sẵn nhập Actual Budget cho bạn. Vui lòng tiến hành bước tiếp theo.
+ leave_empty: Để trống
+ date_label: Ngày
+ date_format_label: Định dạng ngày
+ amount_label: Số tiền
+ signage_convention_label: Quy ước dấu
+ incomes_are_negative: Thu nhập là số âm
+ incomes_are_positive: Thu nhập là số dương
+ account_label: Tài khoản (tùy chọn)
+ name_label: Người trả (tùy chọn)
+ category_label: Danh mục (tùy chọn)
+ notes_label: Ghi chú (tùy chọn)
+ apply_configuration: Áp dụng cấu hình
+ rule_import:
+ description: Cấu hình nhập quy tắc. Các quy tắc sẽ được tạo hoặc cập nhật dựa trên dữ liệu CSV.
+ process_button: Xử lý quy tắc
+ process_help: Nhấn nút bên dưới để xử lý CSV và tạo các hàng quy tắc.
+ show:
+ description: Chọn các cột tương ứng với từng trường trong CSV.
+ title: Cấu hình nhập dữ liệu
+ confirms:
+ sure_import:
+ title: Xác nhận nhập dữ liệu
+ description: Xem lại dữ liệu sẽ được nhập từ tệp xuất.
+ summary: Tóm tắt nhập dữ liệu
+ empty_summary: Chúng tôi không tìm thấy bản ghi nào có thể nhập trong tệp này. Tệp có thể trống hoặc các dòng không khớp định dạng xuất mong đợi.
+ publish_button: Bắt đầu nhập
+ cancel: Hủy
+ mappings:
+ create_account: Tạo tài khoản
+ csv_mapping_label: "%{mapping} trong CSV"
+ sure_mapping_label: "%{mapping} trong %{product_name}"
+ no_accounts: Bạn chưa có tài khoản nào. Vui lòng tạo tài khoản để sử dụng cho các hàng (chưa gán) trong CSV hoặc quay lại bước Làm sạch và cung cấp tên tài khoản.
+ rows_label: Hàng
+ unassigned_account: Cần tạo tài khoản mới cho các hàng chưa gán?
+ next: Tiếp theo
+ show:
+ invalid_data: "Dữ liệu không hợp lệ, vui lòng chỉnh sửa cho đến khi tất cả lỗi được giải quyết"
+ account_mapping_description: Gán tất cả tài khoản từ tệp nhập vào các tài khoản hiện có của %{product_name}. Bạn cũng có thể thêm tài khoản mới hoặc để chưa phân loại.
+ account_mapping_title: Gán tài khoản
+ account_type_mapping_description: Gán tất cả loại tài khoản từ tệp nhập vào %{product_name}
+ account_type_mapping_title: Gán loại tài khoản
+ category_mapping_description: Gán tất cả danh mục từ tệp nhập vào các danh mục hiện có của %{product_name}. Bạn cũng có thể thêm danh mục mới hoặc để chưa phân loại.
+ category_mapping_title: Gán danh mục
+ tag_mapping_description: Gán tất cả nhãn từ tệp nhập vào các nhãn hiện có của %{product_name}. Bạn cũng có thể thêm nhãn mới hoặc để chưa phân loại.
+ tag_mapping_title: Gán nhãn
+ uploads:
+ update:
+ qif_uploaded: "Tệp QIF đã được tải lên thành công."
+ show:
+ csv_invalid: "Phải là CSV hợp lệ có tiêu đề và ít nhất một hàng dữ liệu"
+ drop_csv_title: Thả CSV để tải lên
+ drop_csv_subtitle: Tệp của bạn sẽ được tải lên tự động
+ upload_csv_tab: Tải CSV lên
+ copy_paste_tab: Sao chép & Dán
+ account_optional_label: Tài khoản (tùy chọn)
+ multi_account_import: Nhập nhiều tài khoản
+ upload_csv_button: Tải CSV lên
+ paste_csv_placeholder: Dán nội dung tệp CSV của bạn tại đây
+ download_sample_csv: Tải xuống CSV mẫu
+ to_see_format: để xem định dạng CSV yêu cầu
+ qif_title: Tải tệp QIF lên
+ qif_description: Chọn tài khoản mà tệp QIF này thuộc về, rồi tải lên tệp xuất .qif từ Quicken.
+ qif_account_label: Tài khoản
+ qif_account_placeholder: Chọn tài khoản…
+ qif_file_prompt: để thêm tệp QIF tại đây
+ qif_file_hint: Chỉ tệp .qif
+ qif_submit: Tải QIF lên
+ browse: Duyệt
+ csv_file_prompt: để thêm tệp CSV tại đây
+ description: Dán hoặc tải lên tệp CSV bên dưới. Vui lòng xem hướng dẫn trong bảng bên dưới trước khi bắt đầu.
+ instructions_1: Bên dưới là CSV mẫu với các cột có thể nhập.
+ instructions_2: CSV của bạn phải có hàng tiêu đề
+ instructions_3: Bạn có thể đặt tên cột tùy ý. Bạn sẽ ánh xạ chúng ở bước sau.
+ instructions_4: Các cột được đánh dấu dấu hoa thị (*) là dữ liệu bắt buộc.
+ instructions_5: Không có dấu phẩy, ký hiệu tiền tệ và dấu ngoặc đơn trong số.
+ title: Nhập dữ liệu
+ sure_import:
+ title: Nhập từ xuất
+ description: Tải lên tệp all.ndjson từ xuất dữ liệu để khôi phục tài khoản, giao dịch, danh mục và nhiều hơn nữa.
+ drop_title: Thả NDJSON để tải lên
+ drop_subtitle: Tệp của bạn sẽ được tải lên tự động
+ browse: Duyệt
+ browse_hint: để thêm tệp all.ndjson tại đây
+ upload_button: Tải NDJSON lên
+ hint_html: Tải lên tệp all.ndjson từ tệp ZIP xuất dữ liệu
+ ndjson_invalid: Phải là NDJSON hợp lệ với ít nhất một bản ghi
+ imports:
+ mapping_labels:
+ account_type: "Loại tài khoản"
+ account: "Tài khoản"
+ category: "Danh mục"
+ tag: "Nhãn"
+ dry_run_resources:
+ transactions: "Giao dịch"
+ balances: "Số dư"
+ accounts: "Tài khoản"
+ categories: "Danh mục"
+ tags: "Nhãn"
+ rules: "Quy tắc"
+ merchants: "Nhà cung cấp"
+ recurring_transactions: "Giao dịch định kỳ"
+ transfers: "Chuyển khoản"
+ rejected_transfers: "Chuyển khoản bị từ chối"
+ trades: "Giao dịch chứng khoán"
+ holdings: "Danh mục nắm giữ"
+ valuations: "Định giá"
+ budgets: "Ngân sách"
+ budget_categories: "Danh mục ngân sách"
+ column_labels:
+ date: "Ngày"
+ amount: "Số tiền"
+ name: "Tên"
+ currency: "Tiền tệ"
+ category: "Danh mục"
+ tags: "Nhãn"
+ account: "Tài khoản"
+ notes: "Ghi chú"
+ qty: "Số lượng"
+ ticker: "Mã ticker"
+ exchange: "Sàn giao dịch"
+ price: "Giá"
+ entity_type: "Loại"
+ category_parent: "Danh mục cha"
+ category_color: "Màu sắc"
+ category_icon: "Biểu tượng Lucide"
+ update:
+ account_saved: "Đã lưu tài khoản."
+ invalid_account: "Không tìm thấy tài khoản."
+ publish:
+ started: "Quá trình nhập đã bắt đầu trong nền."
+ max_rows_exceeded: "Tệp nhập vượt quá số hàng tối đa là %{max}."
+ revert:
+ started: "Đang hoàn tác nhập dữ liệu trong nền."
+ apply_template:
+ template_applied: "Đã áp dụng mẫu."
+ no_template_found: "Không tìm thấy mẫu, vui lòng cấu hình nhập thủ công."
+ destroy:
+ deleted: "Đã xóa nhập dữ liệu."
+ failure:
+ title: Nhập thất bại
+ description: Vui lòng kiểm tra định dạng tệp, các lỗi và đảm bảo tất cả trường bắt buộc được điền, rồi thử lại.
+ try_again: Thử lại
+ success:
+ title: Nhập thành công
+ description: Dữ liệu đã được thêm thành công vào ứng dụng và sẵn sàng sử dụng.
+ back_to_dashboard: Quay lại bảng điều khiển
+ verification:
+ title: Xác minh đọc lại
+ checked: Đã kiểm tra
+ mismatches: Không khớp
+ status:
+ not_verified: Chưa xác minh
+ matched: Khớp
+ mismatch: Không khớp
+ failed: Thất bại
+ reverted: Đã hoàn tác
+ importing:
+ title: Đang nhập dữ liệu
+ description: "Nhập dữ liệu đang được thực hiện. Kiểm tra menu nhập để biết cập nhật hoặc nhấn 'Kiểm tra trạng thái' để làm mới. Bạn có thể tiếp tục sử dụng ứng dụng."
+ check_status: Kiểm tra trạng thái
+ back_to_dashboard: Quay lại bảng điều khiển
+ revert_failure:
+ title: Hoàn tác nhập thất bại
+ description: Vui lòng thử lại
+ try_again: Thử lại
+ date_format:
+ heading: Định dạng ngày
+ description: "Định dạng ngày đã được tự động phát hiện từ tệp. Thay đổi nếu ngày hiển thị không đúng."
+ preview: "Ngày được phân tích đầu tiên"
+ error_title: "Không thể phát hiện định dạng ngày"
+ error_description: "Không có định dạng ngày được hỗ trợ nào có thể phân tích các ngày trong tệp này. Vui lòng kiểm tra tệp có chứa ngày hợp lệ."
+ type_labels:
+ transaction_import: "Nhập giao dịch"
+ trade_import: "Nhập giao dịch chứng khoán"
+ account_import: "Nhập tài khoản"
+ mint_import: "Nhập từ Mint"
+ actual_import: "Nhập từ Actual"
+ qif_import: "Nhập từ QIF"
+ category_import: "Nhập danh mục"
+ rule_import: "Nhập quy tắc"
+ pdf_import: "Nhập PDF"
+ document_import: "Nhập tài liệu"
+ sure_import: "Nhập từ Sure"
+ steps:
+ upload: Tải lên
+ configure: Cấu hình
+ clean: Làm sạch
+ map: Ánh xạ
+ confirm: Xác nhận
+ select: Chọn
+ progress: "Bước %{step} trong %{total}"
+ empty:
+ message: Không tìm thấy nhập dữ liệu.
+ index:
+ title: Nhập dữ liệu
+ new: Nhập mới
+ table:
+ title: Nhập dữ liệu
+ header:
+ date: Ngày
+ operation: Thao tác
+ status: Trạng thái
+ actions: Hành động
+ row:
+ type_labels:
+ transaction_import: "Giao dịch"
+ trade_import: "Giao dịch CK"
+ account_import: "Tài khoản"
+ mint_import: "Mint"
+ actual_import: "Actual"
+ qif_import: "QIF"
+ category_import: "Danh mục"
+ rule_import: "Quy tắc"
+ pdf_import: "PDF"
+ document_import: "Tài liệu"
+ sure_import: "Sure"
+ status:
+ in_progress: Đang xử lý
+ uploading: Đang xử lý hàng
+ reverting: Đang hoàn tác
+ revert_failed: Hoàn tác thất bại
+ complete: Hoàn thành
+ failed: Thất bại
+ actions:
+ revert: Hoàn tác
+ confirm_revert: Thao tác này sẽ xóa các giao dịch đã nhập, nhưng bạn vẫn có thể xem lại và nhập lại dữ liệu bất cứ lúc nào.
+ delete: Xóa
+ view: Xem
+ empty: Chưa có nhập dữ liệu.
+ new:
+ description: Nhập từ công cụ tài chính hoặc tải lên tệp dữ liệu thô.
+ tab_financial_tools: Công cụ tài chính & Tệp
+ tab_raw_data: Dữ liệu thô
+ coming_soon: Sắp ra mắt
+ import_ynab: Nhập từ YNAB
+ import_accounts: Nhập tài khoản
+ import_categories: Nhập danh mục
+ import_mint: Nhập từ Mint
+ import_actual: Nhập từ Actual Budget
+ import_portfolio: Nhập đầu tư
+ import_rules: Nhập quy tắc
+ import_transactions: Nhập giao dịch
+ import_qif: Nhập từ Quicken (QIF)
+ import_sure: Nhập từ Sure
+ import_sure_description: Tệp xuất .ndjson đầy đủ
+ import_file: Nhập tài liệu
+ import_file_description: Phân tích bằng AI cho PDF và tải lên tệp tìm kiếm được
+ requires_account: Nhập tài khoản trước để mở khóa tùy chọn này.
+ resume: Tiếp tục nhập %{type}
+ sources: Nguồn
+ title: Nhập mới
+ create:
+ file_too_large: Tệp quá lớn. Kích thước tối đa là %{max_size}MB.
+ invalid_file_type: Loại tệp không hợp lệ. Vui lòng tải lên tệp CSV.
+ csv_uploaded: Đã tải lên CSV thành công.
+ ndjson_uploaded: Đã tải lên tệp NDJSON thành công.
+ pdf_too_large: Tệp PDF quá lớn. Kích thước tối đa là %{max_size}MB.
+ pdf_processing: PDF của bạn đang được xử lý. Bạn sẽ nhận email khi phân tích hoàn tất.
+ invalid_pdf: Tệp đã tải lên không phải PDF hợp lệ.
+ document_too_large: Tệp tài liệu quá lớn. Kích thước tối đa là %{max_size}MB.
+ invalid_document_file_type: Loại tệp tài liệu không hợp lệ cho kho vector hiện tại.
+ document_uploaded: Đã tải lên tài liệu thành công.
+ document_upload_failed: Không thể tải tài liệu lên kho vector. Vui lòng thử lại.
+ invalid_ndjson_file_type: Loại hoặc định dạng tệp không hợp lệ. Vui lòng tải lên tệp xuất .ndjson hoặc .json hợp lệ.
+ document_provider_not_configured: Chưa cấu hình kho vector để tải tài liệu lên.
+ show:
+ finalize_upload: Vui lòng hoàn tất tải lên tệp.
+ finalize_mappings: Vui lòng hoàn tất ánh xạ trước khi tiếp tục.
+ ready:
+ description: Dưới đây là tóm tắt các mục mới sẽ được thêm vào tài khoản sau khi bạn xuất bản nhập này.
+ title: Xác nhận dữ liệu nhập
+ summary_item_label: Mục
+ summary_count_label: Số lượng
+ empty_summary: Chúng tôi không tìm thấy bản ghi nào có thể nhập trong tệp này.
+ publish_import: Xuất bản nhập
+ back_to_imports: Quay lại nhập dữ liệu
+ errors:
+ custom_column_requires_inflow: "Nhập cột tùy chỉnh yêu cầu phải chọn cột dòng vào"
+ document_types:
+ bank_statement: Sao kê ngân hàng
+ credit_card_statement: Sao kê thẻ tín dụng
+ investment_statement: Sao kê đầu tư
+ financial_document: Tài liệu tài chính
+ contract: Hợp đồng
+ other: Tài liệu khác
+ unknown: Tài liệu không xác định
+ pdf_import:
+ processing_title: Đang xử lý PDF
+ processing_description: Chúng tôi đang phân tích tài liệu bằng AI. Quá trình này có thể mất chút thời gian. Bạn sẽ nhận email khi phân tích hoàn tất.
+ check_status: Kiểm tra trạng thái
+ back_to_dashboard: Quay lại bảng điều khiển
+ failed_title: Xử lý thất bại
+ failed_description: Chúng tôi không thể xử lý tài liệu PDF. Vui lòng thử lại hoặc liên hệ hỗ trợ.
+ try_again: Thử lại
+ delete_import: Xóa nhập
+ complete_title: Tài liệu đã được phân tích
+ complete_description: Chúng tôi đã phân tích PDF và đây là kết quả.
+ document_type_label: Loại tài liệu
+ summary_label: Tóm tắt
+ email_sent_notice: Email đã được gửi đến bạn với các bước tiếp theo.
+ back_to_imports: Quay lại nhập dữ liệu
+ unknown_state_title: Trạng thái không xác định
+ unknown_state_description: Nhập này ở trạng thái không mong đợi. Vui lòng quay lại nhập dữ liệu.
+ processing_failed_with_message: "%{message}"
+ processing_failed_generic: "Xử lý thất bại: %{error}"
+ ready_for_review_title: Sẵn sàng xem xét
+ ready_for_review_description: "Chúng tôi đã trích xuất %{count} giao dịch từ sao kê. Xem xét và xuất bản để thêm vào tài khoản."
+ transactions_extracted: Giao dịch đã trích xuất
+ transactions_extracted_count:
+ one: "%{count} giao dịch"
+ other: "%{count} giao dịch"
+ select_account: Nhập vào tài khoản
+ select_account_placeholder: Chọn tài khoản...
+ select_account_hint: Chọn tài khoản để nhập các giao dịch này vào.
+ no_accounts: Chưa có tài khoản. Vui lòng tạo tài khoản trước.
+ create_account: Tạo tài khoản
+ save_account: Lưu
+ publish_transactions:
+ one: "Xuất bản %{count} giao dịch"
+ other: "Xuất bản %{count} giao dịch"
+ review_transactions: Xem xét giao dịch
+ select_account_to_continue: Vui lòng chọn tài khoản ở trên để tiếp tục.
+ unknown_document_type: Không xác định
diff --git a/config/locales/views/indexa_capital_items/vi.yml b/config/locales/views/indexa_capital_items/vi.yml
new file mode 100644
index 000000000..2e0ab47bb
--- /dev/null
+++ b/config/locales/views/indexa_capital_items/vi.yml
@@ -0,0 +1,239 @@
+---
+vi:
+ indexa_capital_items:
+ sync_status:
+ no_accounts: "Không tìm thấy tài khoản"
+ synced:
+ one: "%{count} tài khoản đã đồng bộ"
+ other: "%{count} tài khoản đã đồng bộ"
+ synced_with_setup: "%{linked} đã đồng bộ, %{unlinked} cần thiết lập"
+ institution_summary:
+ none: "Chưa kết nối tổ chức nào"
+ count:
+ one: "%{count} tổ chức"
+ other: "%{count} tổ chức"
+ errors:
+ provider_not_configured: "Nhà cung cấp Indexa Capital chưa được cấu hình"
+
+ sync:
+ status:
+ importing: "Đang nhập tài khoản từ Indexa Capital..."
+ processing: "Đang xử lý tài sản nắm giữ và hoạt động..."
+ calculating: "Đang tính toán số dư..."
+ importing_data: "Đang nhập dữ liệu tài khoản..."
+ checking_setup: "Đang kiểm tra cấu hình tài khoản..."
+ needs_setup: "%{count} tài khoản cần thiết lập..."
+ success: "Đã bắt đầu đồng bộ"
+
+ panel:
+ setup_instructions: "Hướng dẫn thiết lập:"
+ step_1: "Truy cập bảng điều khiển Indexa Capital để tạo mã thông báo API chỉ đọc"
+ step_2: "Dán mã thông báo API của bạn bên dưới và nhấn Lưu"
+ step_3: "Sau khi kết nối thành công, đi đến tab Tài khoản để thiết lập tài khoản mới"
+ field_descriptions: "Mô tả các trường:"
+ optional: "(Tùy chọn)"
+ required: "(bắt buộc)"
+ optional_with_default: "(tùy chọn, mặc định là %{default_value})"
+ alternative_auth: "Hoặc sử dụng xác thực tên đăng nhập/mật khẩu thay thế..."
+ save_button: "Lưu cấu hình"
+ update_button: "Cập nhật cấu hình"
+ fields:
+ api_token:
+ label: "Mã thông báo API"
+ description: "Mã thông báo API chỉ đọc từ bảng điều khiển Indexa Capital"
+ placeholder_new: "Dán mã thông báo API vào đây"
+ placeholder_update: "Nhập mã thông báo API mới để cập nhật"
+ username:
+ label: "Tên đăng nhập"
+ description: "Tên đăng nhập/email Indexa Capital của bạn"
+ placeholder_new: "Dán tên đăng nhập vào đây"
+ placeholder_update: "Nhập tên đăng nhập mới để cập nhật"
+ document:
+ label: "Mã tài liệu"
+ description: "Mã tài liệu/ID Indexa Capital của bạn"
+ placeholder_new: "Dán mã tài liệu vào đây"
+ placeholder_update: "Nhập mã tài liệu mới để cập nhật"
+ password:
+ label: "Mật khẩu"
+ description: "Mật khẩu Indexa Capital của bạn"
+ placeholder_new: "Dán mật khẩu vào đây"
+ placeholder_update: "Nhập mật khẩu mới để cập nhật"
+
+ create:
+ success: "Kết nối Indexa Capital đã được tạo thành công"
+ update:
+ success: "Kết nối Indexa Capital đã được cập nhật"
+ destroy:
+ success: "Kết nối Indexa Capital đã được xóa"
+ index:
+ title: "Kết nối Indexa Capital"
+
+ loading:
+ loading_message: "Đang tải tài khoản Indexa Capital..."
+ loading_title: "Đang tải"
+
+ link_accounts:
+ all_already_linked:
+ one: "Tài khoản đã chọn (%{names}) đã được liên kết"
+ other: "Tất cả %{count} tài khoản đã chọn đã được liên kết: %{names}"
+ api_error: "Lỗi API: %{message}"
+ invalid_account_names:
+ one: "Không thể liên kết tài khoản không có tên"
+ other: "Không thể liên kết %{count} tài khoản không có tên"
+ link_failed: "Liên kết tài khoản thất bại"
+ no_accounts_selected: "Vui lòng chọn ít nhất một tài khoản"
+ no_api_key: "Không tìm thấy thông tin xác thực Indexa Capital. Vui lòng cấu hình trong Cài đặt nhà cung cấp."
+ partial_invalid: "Đã liên kết thành công %{created_count} tài khoản, %{already_linked_count} đã được liên kết, %{invalid_count} tài khoản có tên không hợp lệ"
+ partial_success: "Đã liên kết thành công %{created_count} tài khoản. %{already_linked_count} tài khoản đã được liên kết: %{already_linked_names}"
+ success:
+ one: "Đã liên kết thành công %{count} tài khoản"
+ other: "Đã liên kết thành công %{count} tài khoản"
+
+ indexa_capital_item:
+ accounts_need_setup: "Tài khoản cần thiết lập"
+ delete: "Xóa kết nối"
+ deletion_in_progress: "đang xóa..."
+ error: "Lỗi"
+ more_accounts_available:
+ one: "%{count} tài khoản khác có sẵn"
+ other: "%{count} tài khoản khác có sẵn"
+ no_accounts_description: "Kết nối này chưa có tài khoản nào được liên kết."
+ no_accounts_title: "Không có tài khoản"
+ provider_name: "Indexa Capital"
+ requires_update: "Kết nối cần cập nhật"
+ setup_action: "Thiết lập tài khoản mới"
+ setup_description: "%{linked} trong số %{total} tài khoản đã liên kết. Chọn loại tài khoản cho các tài khoản Indexa Capital mới được nhập."
+ setup_needed: "Tài khoản mới sẵn sàng để thiết lập"
+ status: "Đồng bộ %{timestamp} trước — %{summary}"
+ status_never: "Chưa bao giờ đồng bộ"
+ syncing: "Đang đồng bộ..."
+ total: "Tổng cộng"
+ unlinked: "Chưa liên kết"
+ update_credentials: "Cập nhật thông tin xác thực"
+
+ select_accounts:
+ accounts_selected: "tài khoản đã chọn"
+ api_error: "Lỗi API: %{message}"
+ cancel: "Hủy"
+ configure_name_in_provider: "Không thể nhập - vui lòng cấu hình tên tài khoản trong Indexa Capital"
+ description: "Chọn tài khoản bạn muốn liên kết với tài khoản %{product_name} của bạn."
+ link_accounts: "Liên kết tài khoản đã chọn"
+ no_accounts_found: "Không tìm thấy tài khoản. Vui lòng kiểm tra thông tin xác thực Indexa Capital."
+ no_api_key: "Thông tin xác thực Indexa Capital chưa được cấu hình. Vui lòng cấu hình trong Cài đặt."
+ no_credentials_configured: "Vui lòng cấu hình thông tin xác thực Indexa Capital trước trong Cài đặt nhà cung cấp."
+ no_name_placeholder: "(Không có tên)"
+ title: "Chọn tài khoản Indexa Capital"
+
+ select_existing_account:
+ account_already_linked: "Tài khoản này đã được liên kết với nhà cung cấp"
+ all_accounts_already_linked: "Tất cả tài khoản Indexa Capital đã được liên kết"
+ api_error: "Lỗi API: %{message}"
+ balance_label: "Số dư:"
+ cancel: "Hủy"
+ cancel_button: "Hủy"
+ configure_name_in_provider: "Không thể nhập - vui lòng cấu hình tên tài khoản trong Indexa Capital"
+ connect_hint: "Kết nối tài khoản Indexa Capital để bật đồng bộ tự động."
+ description: "Chọn tài khoản Indexa Capital để liên kết với tài khoản này. Giao dịch sẽ được đồng bộ và loại bỏ trùng lặp tự động."
+ header: "Liên kết với Indexa Capital"
+ link_account: "Liên kết tài khoản"
+ link_button: "Liên kết tài khoản này"
+ linking_to: "Đang liên kết với:"
+ no_account_specified: "Chưa chỉ định tài khoản"
+ no_accounts: "Không tìm thấy tài khoản Indexa Capital chưa liên kết."
+ no_accounts_found: "Không tìm thấy tài khoản Indexa Capital. Vui lòng kiểm tra thông tin xác thực."
+ no_api_key: "Thông tin xác thực Indexa Capital chưa được cấu hình. Vui lòng cấu hình trong Cài đặt."
+ no_credentials_configured: "Vui lòng cấu hình thông tin xác thực Indexa Capital trước trong Cài đặt nhà cung cấp."
+ no_name_placeholder: "(Không có tên)"
+ settings_link: "Đi đến Cài đặt nhà cung cấp"
+ subtitle: "Chọn tài khoản Indexa Capital"
+ title: "Liên kết %{account_name} với Indexa Capital"
+
+ link_existing_account:
+ account_already_linked: "Tài khoản này đã được liên kết với nhà cung cấp"
+ api_error: "Lỗi API: %{message}"
+ invalid_account_name: "Không thể liên kết tài khoản không có tên"
+ provider_account_already_linked: "Tài khoản Indexa Capital này đã được liên kết với tài khoản khác"
+ provider_account_not_found: "Không tìm thấy tài khoản Indexa Capital"
+ missing_parameters: "Thiếu tham số bắt buộc"
+ no_api_key: "Không tìm thấy thông tin xác thực Indexa Capital. Vui lòng cấu hình trong Cài đặt nhà cung cấp."
+ success: "Đã liên kết thành công %{account_name} với Indexa Capital"
+
+ setup_accounts:
+ account_type_label: "Loại tài khoản:"
+ accounts_count:
+ one: "%{count} tài khoản có sẵn"
+ other: "%{count} tài khoản có sẵn"
+ all_accounts_linked: "Tất cả tài khoản Indexa Capital của bạn đã được thiết lập."
+ api_error: "Lỗi API: %{message}"
+ creating: "Đang tạo tài khoản..."
+ fetch_failed: "Tải tài khoản thất bại"
+ import_selected: "Nhập tài khoản đã chọn"
+ instructions: "Chọn tài khoản bạn muốn nhập từ Indexa Capital. Bạn có thể chọn nhiều tài khoản."
+ no_accounts: "Không tìm thấy tài khoản chưa liên kết từ kết nối Indexa Capital này."
+ no_accounts_to_setup: "Không có tài khoản nào để thiết lập"
+ no_api_key: "Thông tin xác thực Indexa Capital chưa được cấu hình. Vui lòng kiểm tra cài đặt kết nối."
+ select_all: "Chọn tất cả"
+ account_types:
+ skip: "Bỏ qua tài khoản này"
+ depository: "Tài khoản thanh toán hoặc tiết kiệm"
+ credit_card: "Thẻ tín dụng"
+ investment: "Tài khoản đầu tư"
+ crypto: "Tài khoản tiền điện tử"
+ loan: "Vay hoặc thế chấp"
+ other_asset: "Tài sản khác"
+ subtype_labels:
+ depository: "Loại phụ tài khoản:"
+ credit_card: ""
+ investment: "Loại đầu tư:"
+ crypto: ""
+ loan: "Loại vay:"
+ other_asset: ""
+ subtype_messages:
+ credit_card: "Thẻ tín dụng sẽ được tự động thiết lập dưới dạng tài khoản thẻ tín dụng."
+ other_asset: "Không cần tùy chọn bổ sung cho Tài sản khác."
+ crypto: "Tài khoản tiền điện tử sẽ được thiết lập để theo dõi tài sản nắm giữ và giao dịch."
+ subtypes:
+ depository:
+ checking: "Tài khoản thanh toán"
+ savings: "Tài khoản tiết kiệm"
+ hsa: "Tài khoản tiết kiệm y tế"
+ cd: "Chứng chỉ tiền gửi"
+ money_market: "Thị trường tiền tệ"
+ investment:
+ brokerage: "Brokerage"
+ pension: "Lương hưu"
+ retirement: "Hưu trí"
+ "401k": "401(k)"
+ roth_401k: "Roth 401(k)"
+ "403b": "403(b)"
+ tsp: "Thrift Savings Plan"
+ "529_plan": "529 Plan"
+ hsa: "Tài khoản tiết kiệm y tế"
+ mutual_fund: "Quỹ tương hỗ"
+ ira: "Traditional IRA"
+ roth_ira: "Roth IRA"
+ angel: "Angel"
+ loan:
+ mortgage: "Thế chấp"
+ student: "Vay sinh viên"
+ auto: "Vay mua xe"
+ other: "Vay khác"
+ balance: "Số dư"
+ cancel: "Hủy"
+ choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản Indexa Capital:"
+ create_accounts: "Tạo tài khoản"
+ creating_accounts: "Đang tạo tài khoản..."
+ historical_data_range: "Phạm vi dữ liệu lịch sử:"
+ subtitle: "Chọn đúng loại tài khoản cho các tài khoản đã nhập"
+ sync_start_date_help: "Chọn khoảng thời gian lịch sử giao dịch bạn muốn đồng bộ."
+ sync_start_date_label: "Bắt đầu đồng bộ giao dịch từ:"
+ title: "Thiết lập tài khoản Indexa Capital của bạn"
+
+ complete_account_setup:
+ all_skipped: "Tất cả tài khoản đã bị bỏ qua. Không có tài khoản nào được tạo."
+ creation_failed: "Tạo tài khoản thất bại: %{error}"
+ no_accounts: "Không có tài khoản nào để thiết lập."
+ success: "Đã tạo thành công %{count} tài khoản."
+
+ preload_accounts:
+ no_credentials_configured: "Vui lòng cấu hình thông tin xác thực Indexa Capital trước trong Cài đặt nhà cung cấp."
diff --git a/config/locales/views/investments/vi.yml b/config/locales/views/investments/vi.yml
new file mode 100644
index 000000000..7b3a504cd
--- /dev/null
+++ b/config/locales/views/investments/vi.yml
@@ -0,0 +1,196 @@
+---
+vi:
+ investments:
+ edit:
+ edit: Chỉnh sửa %{account}
+ form:
+ none: Không có
+ subtype_prompt: Chọn loại đầu tư
+ new:
+ title: Nhập số dư tài khoản
+ show:
+ chart_title: Tổng giá trị
+ subtypes:
+ # United States
+ brokerage:
+ short: Brokerage
+ long: Brokerage
+ 401k:
+ short: 401(k)
+ long: 401(k)
+ roth_401k:
+ short: Roth 401(k)
+ long: Roth 401(k)
+ 403b:
+ short: 403(b)
+ long: 403(b)
+ 457b:
+ short: 457(b)
+ long: 457(b)
+ tsp:
+ short: TSP
+ long: Thrift Savings Plan
+ ira:
+ short: IRA
+ long: Traditional IRA
+ roth_ira:
+ short: Roth IRA
+ long: Roth IRA
+ sep_ira:
+ short: SEP IRA
+ long: SEP IRA
+ simple_ira:
+ short: SIMPLE IRA
+ long: SIMPLE IRA
+ 529_plan:
+ short: 529 Plan
+ long: 529 Education Savings Plan
+ hsa:
+ short: HSA
+ long: Tài khoản tiết kiệm y tế
+ ugma:
+ short: UGMA
+ long: Tài khoản ủy thác UGMA
+ utma:
+ short: UTMA
+ long: Tài khoản ủy thác UTMA
+ # United Kingdom
+ isa:
+ short: ISA
+ long: Tài khoản tiết kiệm cá nhân
+ lisa:
+ short: LISA
+ long: Lifetime ISA
+ sipp:
+ short: SIPP
+ long: Quỹ hưu trí cá nhân tự quản
+ workplace_pension_uk:
+ short: Lương hưu
+ long: Lương hưu doanh nghiệp
+ # Canada
+ rrsp:
+ short: RRSP
+ long: Kế hoạch tiết kiệm hưu trí đăng ký
+ tfsa:
+ short: TFSA
+ long: Tài khoản tiết kiệm miễn thuế
+ resp:
+ short: RESP
+ long: Kế hoạch tiết kiệm giáo dục đăng ký
+ lira:
+ short: LIRA
+ long: Tài khoản hưu trí bị phong tỏa
+ rrif:
+ short: RRIF
+ long: Quỹ thu nhập hưu trí đăng ký
+ # Australia
+ super:
+ short: Super
+ long: Siêu quỹ hưu trí
+ smsf:
+ short: SMSF
+ long: Quỹ siêu hưu trí tự quản
+ # Europe
+ pea:
+ short: PEA
+ long: Plan d'Épargne en Actions
+ pillar_3a:
+ short: Pillar 3a
+ long: Lương hưu tư nhân (Pillar 3a)
+ riester:
+ short: Riester
+ long: Riester-Rente
+ # India
+ nps:
+ short: NPS
+ long: Hệ thống lương hưu quốc gia
+ apy:
+ short: APY
+ long: Atal Pension Yojana
+ indian_stocks:
+ short: Cổ phiếu Ấn Độ
+ long: Cổ phiếu Ấn Độ (Demat)
+ indian_equity:
+ short: Cổ phần Ấn Độ
+ long: Cổ phần Ấn Độ
+ indian_etf:
+ short: ETF Ấn Độ
+ long: ETF Ấn Độ
+ life_insurance:
+ short: Bảo hiểm nhân thọ
+ long: Bảo hiểm nhân thọ
+ ppf:
+ short: PPF
+ long: Quỹ tiết kiệm công cộng
+ ssy:
+ short: SSY
+ long: Sukanya Samriddhi Yojana
+ nsc:
+ short: NSC
+ long: Chứng chỉ tiết kiệm quốc gia
+ scss:
+ short: SCSS
+ long: Kế hoạch tiết kiệm người cao tuổi
+ fd:
+ short: FD
+ long: Tiền gửi cố định
+ rd:
+ short: RD
+ long: Tiền gửi định kỳ
+ pomis:
+ short: POMIS
+ long: Kế hoạch thu nhập hàng tháng bưu điện
+ kvp:
+ short: KVP
+ long: Kisan Vikas Patra
+ gold_etf:
+ short: ETF Vàng
+ long: ETF Vàng
+ gold_mf:
+ short: Quỹ tương hỗ Vàng
+ long: Quỹ tương hỗ Vàng
+ sgb:
+ short: SGB
+ long: Trái phiếu vàng có bảo đảm
+ g_sec:
+ short: G-Sec
+ long: Chứng khoán chính phủ (G-Secs)
+ sdl:
+ short: SDL
+ long: Khoản vay phát triển tiểu bang (SDLs)
+ corporate_bond:
+ short: Trái phiếu doanh nghiệp
+ long: Trái phiếu doanh nghiệp
+ infrastructure_bond:
+ short: Trái phiếu cơ sở hạ tầng
+ long: Trái phiếu cơ sở hạ tầng
+ tax_free_bond:
+ short: Trái phiếu miễn thuế
+ long: Trái phiếu miễn thuế
+ # Generic
+ pension:
+ short: Lương hưu
+ long: Lương hưu
+ retirement:
+ short: Hưu trí
+ long: Tài khoản hưu trí
+ mutual_fund:
+ short: Quỹ tương hỗ
+ long: Quỹ tương hỗ
+ gold:
+ short: Vàng
+ long: Vàng (vật chất hoặc kỹ thuật số)
+ angel:
+ short: Angel
+ long: Đầu tư thiên thần
+ trust:
+ short: Quỹ tín thác
+ long: Quỹ tín thác
+ other:
+ short: Khác
+ long: Đầu tư khác
+ value_tooltip:
+ cash: Tiền mặt
+ holdings: Danh mục nắm giữ
+ total: Số dư danh mục
+ total_value_tooltip: Tổng số dư danh mục là tổng tiền mặt tại sàn giao dịch (có sẵn để giao dịch) và giá trị thị trường hiện tại của các tài sản nắm giữ.
diff --git a/config/locales/views/invitation_mailer/vi.yml b/config/locales/views/invitation_mailer/vi.yml
new file mode 100644
index 000000000..6e57ba19f
--- /dev/null
+++ b/config/locales/views/invitation_mailer/vi.yml
@@ -0,0 +1,8 @@
+---
+vi:
+ invitation_mailer:
+ invite_email:
+ accept_button: Chấp nhận lời mời
+ body: "%{inviter} đã mời bạn tham gia %{family} %{moniker} trên %{product_name}!"
+ expiry_notice: Lời mời này sẽ hết hạn sau %{days} ngày
+ greeting: Chào mừng đến với %{product_name}!
diff --git a/config/locales/views/invitations/vi.yml b/config/locales/views/invitations/vi.yml
new file mode 100644
index 000000000..68df7ddce
--- /dev/null
+++ b/config/locales/views/invitations/vi.yml
@@ -0,0 +1,28 @@
+---
+vi:
+ invitations:
+ accept_choice:
+ create_account: Tạo tài khoản mới
+ joined_household: Bạn đã tham gia hộ gia đình.
+ message: "%{inviter} đã mời bạn tham gia với tư cách %{role}."
+ sign_in_existing: Tôi đã có tài khoản
+ title: Tham gia %{family}
+ create:
+ existing_user_added: Người dùng đã được thêm vào hộ gia đình của bạn.
+ existing_user_has_family_data: Người dùng đó đã sở hữu một hộ gia đình có tài khoản. Họ cần xóa hoặc chuyển những tài khoản đó trước khi tham gia vào hộ gia đình của bạn.
+ failure: Không thể gửi lời mời
+ success: Lời mời đã được gửi thành công
+ destroy:
+ failure: Đã xảy ra sự cố khi xóa lời mời.
+ not_authorized: Bạn không được phép quản lý lời mời.
+ success: Lời mời đã được xóa thành công.
+ new:
+ email_label: Địa chỉ email
+ email_placeholder: Nhập địa chỉ email
+ role_admin: Quản trị viên
+ role_guest: Khách
+ role_label: Vai trò
+ role_member: Thành viên
+ submit: Gửi lời mời
+ subtitle: Gửi lời mời để tham gia tài khoản %{moniker} của bạn trên %{product_name}
+ title: Mời ai đó
diff --git a/config/locales/views/invite_codes/vi.yml b/config/locales/views/invite_codes/vi.yml
new file mode 100644
index 000000000..339fa8d58
--- /dev/null
+++ b/config/locales/views/invite_codes/vi.yml
@@ -0,0 +1,10 @@
+---
+vi:
+ invite_codes:
+ create:
+ success: "Mã đã được tạo"
+ destroy:
+ success: "Mã đã được xóa"
+ index:
+ invite_code_description: Tạo mã mới để xem nó được hiển thị ở đây. Các mã đã được tạo và sử dụng sẽ không còn được hiển thị nữa.
+ no_invite_codes: Không có mã nào để hiển thị
diff --git a/config/locales/views/kraken_items/vi.yml b/config/locales/views/kraken_items/vi.yml
new file mode 100644
index 000000000..4878281ec
--- /dev/null
+++ b/config/locales/views/kraken_items/vi.yml
@@ -0,0 +1,85 @@
+---
+vi:
+ kraken_items:
+ provider_connection:
+ default_name: Kraken
+ default_description: Liên kết với tài khoản sàn giao dịch Kraken
+ name: "Kraken - %{name}"
+ description: "Liên kết với %{name}"
+ create:
+ default_name: Kraken
+ success: Đã kết nối thành công với Kraken. Tài khoản sàn giao dịch của bạn đang được đồng bộ.
+ update:
+ success: Đã cập nhật kết nối Kraken thành công.
+ destroy:
+ success: Đã lên lịch xóa kết nối Kraken.
+ select_accounts:
+ select_connection: Chọn kết nối Kraken trong Cài đặt nhà cung cấp.
+ no_credentials_configured: Thêm thông tin API Kraken trước khi thiết lập tài khoản.
+ link_accounts:
+ select_connection: Chọn kết nối Kraken trước khi liên kết tài khoản.
+ select_existing_account:
+ title: Liên kết tài khoản Kraken
+ no_accounts_found: Không tìm thấy tài khoản Kraken nào.
+ wait_for_sync: Chờ Kraken hoàn tất đồng bộ.
+ check_provider_health: Kiểm tra xem thông tin API Kraken của bạn có hợp lệ không.
+ link: Liên kết
+ cancel: Hủy
+ link_existing_account:
+ success: Đã liên kết thành công với tài khoản Kraken
+ select_connection: Chọn kết nối Kraken trước khi liên kết tài khoản.
+ errors:
+ only_manual: Chỉ tài khoản tiền điện tử thủ công chưa có liên kết nhà cung cấp mới có thể liên kết với Kraken
+ invalid_kraken_account: Tài khoản Kraken không hợp lệ
+ kraken_account_already_linked: Tài khoản Kraken này đã được liên kết
+ setup_accounts:
+ title: Nhập tài khoản Kraken
+ subtitle: Chọn tài khoản sàn giao dịch để theo dõi
+ instructions: Kraken nhập một tài khoản sàn giao dịch tiền điện tử kết hợp cho kết nối này, chỉ với các tài sản nắm giữ và lệnh giao ngay.
+ no_accounts: Tất cả tài khoản Kraken đã được nhập.
+ accounts_count:
+ one: "%{count} tài khoản có sẵn"
+ other: "%{count} tài khoản có sẵn"
+ select_all: Chọn tất cả
+ import_selected: Nhập đã chọn
+ cancel: Hủy
+ creating: Đang nhập...
+ complete_account_setup:
+ success:
+ one: "Đã nhập %{count} tài khoản"
+ other: "Đã nhập %{count} tài khoản"
+ none_selected: Chưa chọn tài khoản nào
+ no_accounts: Không có tài khoản nào để nhập
+ kraken_item:
+ provider_name: Kraken
+ syncing: Đang đồng bộ...
+ reconnect: Thông tin xác thực cần cập nhật
+ deletion_in_progress: Đang xóa...
+ sync_status:
+ no_accounts: Không tìm thấy tài khoản
+ all_synced:
+ one: "%{count} tài khoản đã đồng bộ"
+ other: "%{count} tài khoản đã đồng bộ"
+ partial_sync: "%{linked_count} đã đồng bộ, %{unlinked_count} cần thiết lập"
+ status: "Đồng bộ lần cuối %{timestamp} trước"
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước - %{summary}"
+ status_never: Chưa bao giờ đồng bộ
+ delete: Xóa
+ no_accounts_title: Không tìm thấy tài khoản
+ no_accounts_message: Tài khoản sàn giao dịch Kraken của bạn sẽ xuất hiện ở đây sau khi đồng bộ.
+ setup_needed: Tài khoản sẵn sàng để nhập
+ setup_description: Nhập kết nối Kraken này dưới dạng tài khoản sàn giao dịch tiền điện tử.
+ setup_action: Nhập tài khoản
+ import_accounts_menu: Nhập tài khoản
+ stale_rate_warning: "Số dư là xấp xỉ vì tỷ giá hối đoái chính xác cho ngày %{date} không có sẵn. Sẽ cập nhật lần đồng bộ tiếp theo."
+ kraken_item:
+ syncer:
+ checking_credentials: Đang kiểm tra thông tin xác thực...
+ credentials_invalid: Thông tin API Kraken không hợp lệ. Vui lòng kiểm tra khóa API và bí mật của bạn.
+ importing_accounts: Đang nhập tài khoản từ Kraken...
+ checking_configuration: Đang kiểm tra cấu hình tài khoản...
+ accounts_need_setup:
+ one: "%{count} tài khoản cần thiết lập"
+ other: "%{count} tài khoản cần thiết lập"
+ processing_accounts: Đang xử lý dữ liệu tài khoản...
+ calculating_balances: Đang tính toán số dư...
diff --git a/config/locales/views/layout/vi.yml b/config/locales/views/layout/vi.yml
new file mode 100644
index 000000000..87d2f4ded
--- /dev/null
+++ b/config/locales/views/layout/vi.yml
@@ -0,0 +1,29 @@
+---
+vi:
+ layouts:
+ application:
+ privacy_mode: Bật/tắt chế độ riêng tư
+ skip_to_main: Chuyển đến nội dung chính
+ nav:
+ assistant: Trợ lý
+ budgets: Ngân sách
+ home: Trang chủ
+ reports: Báo cáo
+ transactions: Giao dịch
+ auth:
+ existing_account: Đã có tài khoản?
+ no_account: Mới dùng %{product_name}?
+ sign_in: Đăng nhập
+ sign_up: Tạo tài khoản
+ shared:
+ footer:
+ privacy_policy: Chính sách bảo mật
+ terms_of_service: Điều khoản dịch vụ
+ confirm_dialog:
+ are_you_sure: Bạn có chắc không?
+ cannot_be_undone: Hành động này không thể hoàn tác.
+ confirm: Xác nhận
+ trial:
+ open_demo: Mở bản demo
+ data_deleted_in_days: Dữ liệu sẽ bị xóa sau %{days} ngày
+ contribute: Đóng góp
diff --git a/config/locales/views/loans/vi.yml b/config/locales/views/loans/vi.yml
new file mode 100644
index 000000000..14de162ec
--- /dev/null
+++ b/config/locales/views/loans/vi.yml
@@ -0,0 +1,37 @@
+---
+vi:
+ loans:
+ edit:
+ edit: Chỉnh sửa %{account}
+ form:
+ interest_rate: Lãi suất
+ interest_rate_placeholder: '5.25'
+ initial_balance: Số dư khoản vay ban đầu
+ rate_type: Loại lãi suất
+ term_months: Kỳ hạn (tháng)
+ term_months_placeholder: '360'
+ none: Không có
+ subtype_prompt: Chọn loại khoản vay
+ subtype_none: Không có
+ new:
+ title: Nhập thông tin khoản vay
+ overview:
+ interest_rate: Lãi suất
+ monthly_payment: Thanh toán hàng tháng
+ not_applicable: N/A
+ original_principal: Vốn gốc ban đầu
+ remaining_principal: Vốn gốc còn lại
+ term: Kỳ hạn
+ type: Loại
+ unknown: Không xác định
+ tabs:
+ overview:
+ interest_rate: Lãi suất
+ monthly_payment: Thanh toán hàng tháng
+ not_applicable: N/A
+ original_principal: Vốn gốc ban đầu
+ remaining_principal: Vốn gốc còn lại
+ term: Kỳ hạn
+ type: Loại
+ unknown: Không xác định
+ edit_loan_details: "Chỉnh sửa thông tin khoản vay"
diff --git a/config/locales/views/lunchflow_items/vi.yml b/config/locales/views/lunchflow_items/vi.yml
new file mode 100644
index 000000000..fa02ef27c
--- /dev/null
+++ b/config/locales/views/lunchflow_items/vi.yml
@@ -0,0 +1,166 @@
+---
+vi:
+ lunchflow_items:
+ api_error:
+ title: Lỗi kết nối Lunchflow
+ unable_to_connect: Không thể kết nối với Lunchflow
+ common_issues: "Các vấn đề thường gặp:"
+ invalid_api_key_label: Khóa API không hợp lệ
+ invalid_api_key_desc: Kiểm tra khóa API của bạn trong Cài đặt nhà cung cấp
+ expired_credentials_label: Thông tin xác thực hết hạn
+ expired_credentials_desc: Tạo khóa API mới từ Lunchflow
+ network_issue_label: Sự cố mạng
+ network_issue_desc: Kiểm tra kết nối internet của bạn
+ service_down_label: Dịch vụ gián đoạn
+ service_down_desc: API Lunchflow có thể tạm thời không khả dụng
+ check_provider_settings: Kiểm tra Cài đặt nhà cung cấp
+ setup_required:
+ title: Cần thiết lập Lunchflow
+ api_key_not_configured: Khóa API chưa được cấu hình
+ api_key_description: Trước khi liên kết tài khoản Lunchflow, bạn cần cấu hình khóa API Lunchflow.
+ setup_steps_title: "Các bước thiết lập:"
+ setup_step_1_html: "Đi đến Cài đặt → Nhà cung cấp"
+ setup_step_2_html: "Tìm phần Lunchflow"
+ setup_step_3: Nhập khóa API Lunchflow của bạn
+ setup_step_4: Quay lại đây để liên kết tài khoản
+ go_to_provider_settings: Đi đến Cài đặt nhà cung cấp
+ create:
+ success: Kết nối Lunchflow đã được tạo thành công
+ destroy:
+ success: Kết nối Lunchflow đã được xóa
+ index:
+ title: Kết nối Lunchflow
+ loading:
+ loading_message: Đang tải tài khoản Lunchflow...
+ loading_title: Đang tải
+ link_accounts:
+ all_already_linked:
+ one: "Tài khoản đã chọn (%{names}) đã được liên kết"
+ other: "Tất cả %{count} tài khoản đã chọn đã được liên kết: %{names}"
+ api_error: "Lỗi API: %{message}"
+ invalid_account_names:
+ one: "Không thể liên kết tài khoản không có tên"
+ other: "Không thể liên kết %{count} tài khoản không có tên"
+ link_failed: Liên kết tài khoản thất bại
+ no_accounts_selected: Vui lòng chọn ít nhất một tài khoản
+ partial_invalid: "Đã liên kết thành công %{created_count} tài khoản, %{already_linked_count} đã được liên kết, %{invalid_count} tài khoản có tên không hợp lệ"
+ partial_success: "Đã liên kết thành công %{created_count} tài khoản. %{already_linked_count} tài khoản đã được liên kết: %{already_linked_names}"
+ success:
+ one: "Đã liên kết thành công %{count} tài khoản"
+ other: "Đã liên kết thành công %{count} tài khoản"
+ lunchflow_item:
+ accounts_need_setup: Tài khoản cần thiết lập
+ delete: Xóa kết nối
+ deletion_in_progress: đang xóa...
+ error: Lỗi
+ no_accounts_description: Kết nối này chưa có tài khoản nào được liên kết.
+ no_accounts_title: Không có tài khoản
+ setup_action: Thiết lập tài khoản mới
+ setup_description: "%{linked} trong số %{total} tài khoản đã liên kết. Chọn loại tài khoản cho các tài khoản Lunchflow mới được nhập."
+ setup_needed: Tài khoản mới sẵn sàng để thiết lập
+ status: "Đồng bộ %{timestamp} trước"
+ status_never: Chưa bao giờ đồng bộ
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước • %{summary}"
+ syncing: Đang đồng bộ...
+ total: Tổng cộng
+ unlinked: Chưa liên kết
+ select_accounts:
+ accounts_selected: tài khoản đã chọn
+ api_error: "Lỗi API: %{message}"
+ cancel: Hủy
+ configure_name_in_lunchflow: Không thể nhập - vui lòng cấu hình tên tài khoản trong Lunchflow
+ description: Chọn tài khoản bạn muốn liên kết với tài khoản %{product_name} của bạn.
+ link_accounts: Liên kết tài khoản đã chọn
+ no_accounts_found: Không tìm thấy tài khoản. Vui lòng kiểm tra cấu hình khóa API.
+ no_api_key: Khóa API Lunchflow chưa được cấu hình. Vui lòng cấu hình trong Cài đặt.
+ no_name_placeholder: "(Không có tên)"
+ title: Chọn tài khoản Lunchflow
+ select_existing_account:
+ account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp
+ all_accounts_already_linked: Tất cả tài khoản Lunchflow đã được liên kết
+ api_error: "Lỗi API: %{message}"
+ cancel: Hủy
+ configure_name_in_lunchflow: Không thể nhập - vui lòng cấu hình tên tài khoản trong Lunchflow
+ description: Chọn tài khoản Lunchflow để liên kết với tài khoản này. Giao dịch sẽ được đồng bộ và loại bỏ trùng lặp tự động.
+ link_account: Liên kết tài khoản
+ no_account_specified: Chưa chỉ định tài khoản
+ no_accounts_found: Không tìm thấy tài khoản Lunchflow. Vui lòng kiểm tra cấu hình khóa API.
+ no_api_key: Khóa API Lunchflow chưa được cấu hình. Vui lòng cấu hình trong Cài đặt.
+ no_name_placeholder: "(Không có tên)"
+ title: "Liên kết %{account_name} với Lunchflow"
+ link_existing_account:
+ account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp
+ api_error: "Lỗi API: %{message}"
+ invalid_account_name: Không thể liên kết tài khoản không có tên
+ lunchflow_account_already_linked: Tài khoản Lunchflow này đã được liên kết với tài khoản khác
+ lunchflow_account_not_found: Không tìm thấy tài khoản Lunchflow
+ missing_parameters: Thiếu tham số bắt buộc
+ success: "Đã liên kết thành công %{account_name} với Lunchflow"
+ setup_accounts:
+ account_type_label: "Loại tài khoản:"
+ all_accounts_linked: "Tất cả tài khoản Lunchflow của bạn đã được thiết lập."
+ api_error: "Lỗi API: %{message}"
+ fetch_failed: "Tải tài khoản thất bại"
+ no_accounts_to_setup: "Không có tài khoản nào để thiết lập"
+ no_api_key: "Khóa API Lunchflow chưa được cấu hình. Vui lòng kiểm tra cài đặt kết nối."
+ account_types:
+ skip: Bỏ qua tài khoản này
+ depository: Tài khoản thanh toán hoặc tiết kiệm
+ credit_card: Thẻ tín dụng
+ investment: Tài khoản đầu tư
+ loan: Vay hoặc thế chấp
+ other_asset: Tài sản khác
+ subtype_labels:
+ depository: "Loại phụ tài khoản:"
+ credit_card: ""
+ investment: "Loại đầu tư:"
+ loan: "Loại vay:"
+ other_asset: ""
+ subtype_messages:
+ credit_card: "Thẻ tín dụng sẽ được tự động thiết lập dưới dạng tài khoản thẻ tín dụng."
+ other_asset: "Không cần tùy chọn bổ sung cho Tài sản khác."
+ subtypes:
+ depository:
+ checking: Tài khoản thanh toán
+ savings: Tài khoản tiết kiệm
+ hsa: Tài khoản tiết kiệm y tế
+ cd: Chứng chỉ tiền gửi
+ money_market: Thị trường tiền tệ
+ investment:
+ brokerage: Brokerage
+ pension: Lương hưu
+ retirement: Hưu trí
+ "401k": "401(k)"
+ roth_401k: "Roth 401(k)"
+ "403b": "403(b)"
+ tsp: Thrift Savings Plan
+ "529_plan": "529 Plan"
+ hsa: Tài khoản tiết kiệm y tế
+ mutual_fund: Quỹ tương hỗ
+ ira: Traditional IRA
+ roth_ira: Roth IRA
+ angel: Angel
+ loan:
+ mortgage: Thế chấp
+ student: Vay sinh viên
+ auto: Vay mua xe
+ other: Vay khác
+ balance: Số dư
+ cancel: Hủy
+ choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản Lunchflow:"
+ create_accounts: Tạo tài khoản
+ creating_accounts: Đang tạo tài khoản...
+ historical_data_range: "Phạm vi dữ liệu lịch sử:"
+ subtitle: Chọn đúng loại tài khoản cho các tài khoản đã nhập
+ sync_start_date_help: Chọn khoảng thời gian lịch sử giao dịch bạn muốn đồng bộ. Tối đa 3 năm lịch sử có sẵn.
+ sync_start_date_label: "Bắt đầu đồng bộ giao dịch từ:"
+ title: Thiết lập tài khoản Lunchflow của bạn
+ complete_account_setup:
+ all_skipped: "Tất cả tài khoản đã bị bỏ qua. Không có tài khoản nào được tạo."
+ creation_failed: "Tạo tài khoản thất bại: %{error}"
+ no_accounts: "Không có tài khoản nào để thiết lập."
+ success: "Đã tạo thành công %{count} tài khoản."
+ sync:
+ success: Đã bắt đầu đồng bộ
+ update:
+ success: Kết nối Lunchflow đã được cập nhật
diff --git a/config/locales/views/merchants/vi.yml b/config/locales/views/merchants/vi.yml
new file mode 100644
index 000000000..6ed4d6765
--- /dev/null
+++ b/config/locales/views/merchants/vi.yml
@@ -0,0 +1,73 @@
+---
+vi:
+ family_merchants:
+ create:
+ error: 'Lỗi khi tạo nhà cung cấp: %{error}'
+ success: Nhà cung cấp mới đã được tạo thành công
+ destroy:
+ success: Nhà cung cấp đã được xóa thành công
+ unlinked_success: Nhà cung cấp đã được xóa khỏi giao dịch của bạn
+ edit:
+ title: Chỉnh sửa nhà cung cấp
+ form:
+ name_placeholder: Tên nhà cung cấp
+ website_placeholder: "Trang web (ví dụ: starbucks.com)"
+ website_hint: Nhập trang web của nhà cung cấp để tự động hiển thị logo của họ
+ index:
+ empty: Chưa có nhà cung cấp nào
+ new: Nhà cung cấp mới
+ merge: Hợp nhất nhà cung cấp
+ title: Nhà cung cấp
+ family_title: "Nhà cung cấp của %{moniker}"
+ family_empty: "Chưa có nhà cung cấp nào của %{moniker}"
+ provider_title: Nhà cung cấp từ dịch vụ
+ provider_empty: "Chưa có nhà cung cấp dịch vụ nào được liên kết với %{moniker} này"
+ provider_read_only: Nhà cung cấp từ dịch vụ được đồng bộ từ các tổ chức tài chính đã kết nối. Không thể chỉnh sửa ở đây.
+ provider_info: Các nhà cung cấp này được phát hiện tự động bởi kết nối ngân hàng hoặc AI của bạn. Bạn có thể chỉnh sửa chúng để tạo bản sao riêng hoặc xóa chúng để hủy liên kết khỏi giao dịch của bạn.
+ enhance_info:
+ one: "%{count} nhà cung cấp dịch vụ đang thiếu thông tin trang web. Cải thiện với AI để phát hiện trang web, hiển thị logo và hợp nhất các nhà cung cấp trùng lặp."
+ other: "%{count} nhà cung cấp dịch vụ đang thiếu thông tin trang web. Cải thiện với AI để phát hiện trang web, hiển thị logo và hợp nhất các nhà cung cấp trùng lặp."
+ enhance_button: Cải thiện với AI
+ unlinked_title: Vừa hủy liên kết
+ unlinked_info: Các nhà cung cấp này vừa được xóa khỏi giao dịch của bạn. Họ sẽ biến mất khỏi danh sách này sau 30 ngày trừ khi được gán lại cho một giao dịch.
+ table:
+ merchant: Nhà cung cấp
+ actions: Hành động
+ source: Nguồn
+ family_merchant:
+ edit: Chỉnh sửa
+ delete: Xóa
+ merchant:
+ confirm_accept: Xóa nhà cung cấp
+ confirm_body: Bạn có chắc chắn muốn xóa nhà cung cấp này không? Xóa nhà cung cấp này sẽ hủy liên kết tất cả giao dịch liên quan và có thể ảnh hưởng đến báo cáo của bạn.
+ confirm_title: Xóa nhà cung cấp?
+ delete: Xóa nhà cung cấp
+ edit: Chỉnh sửa nhà cung cấp
+ merge:
+ title: Hợp nhất nhà cung cấp
+ description: Chọn nhà cung cấp đích và các nhà cung cấp cần hợp nhất vào đó. Tất cả giao dịch từ các nhà cung cấp được hợp nhất sẽ được chuyển sang nhà cung cấp đích.
+ target_label: Hợp nhất vào (đích)
+ select_target: Chọn nhà cung cấp đích...
+ sources_label: Nhà cung cấp cần hợp nhất
+ sources_hint: Các nhà cung cấp được chọn sẽ được hợp nhất vào đích. Nhà cung cấp gia đình sẽ bị xóa, nhà cung cấp dịch vụ sẽ bị hủy liên kết.
+ submit: Hợp nhất đã chọn
+ new:
+ title: Nhà cung cấp mới
+ perform_merge:
+ success:
+ one: Đã hợp nhất thành công %{count} nhà cung cấp
+ other: Đã hợp nhất thành công %{count} nhà cung cấp
+ no_merchants_selected: Không có nhà cung cấp nào được chọn để hợp nhất
+ target_not_found: Không tìm thấy nhà cung cấp đích
+ invalid_merchants: Nhà cung cấp được chọn không hợp lệ
+ provider_merchant:
+ edit: Chỉnh sửa
+ remove: Xóa
+ remove_confirm_title: Xóa nhà cung cấp?
+ remove_confirm_body: Bạn có chắc chắn muốn xóa %{name} không? Thao tác này sẽ hủy liên kết tất cả giao dịch liên quan khỏi nhà cung cấp này nhưng sẽ không xóa nhà cung cấp.
+ enhance:
+ success: Quá trình cải thiện nhà cung cấp dịch vụ đã bắt đầu. Các nhà cung cấp sẽ được cải thiện và các bản trùng lặp sẽ được hợp nhất trong thời gian ngắn.
+ already_running: Quá trình cải thiện đang diễn ra. Vui lòng chờ cho đến khi hoàn tất.
+ update:
+ success: Nhà cung cấp đã được cập nhật thành công
+ converted_success: Nhà cung cấp đã được chuyển đổi và cập nhật thành công
diff --git a/config/locales/views/mercury_items/vi.yml b/config/locales/views/mercury_items/vi.yml
new file mode 100644
index 000000000..01c2c3ea1
--- /dev/null
+++ b/config/locales/views/mercury_items/vi.yml
@@ -0,0 +1,208 @@
+---
+vi:
+ mercury_items:
+ api_error:
+ title: Lỗi kết nối Mercury
+ unable_to_connect: Không thể kết nối với Mercury
+ common_issues: "Các vấn đề thường gặp:"
+ invalid_api_token_label: Mã thông báo API không hợp lệ
+ invalid_api_token_desc: Kiểm tra mã thông báo API của bạn trong Cài đặt nhà cung cấp
+ expired_credentials_label: Thông tin xác thực hết hạn
+ expired_credentials_desc: Tạo mã thông báo API mới từ Mercury
+ insufficient_permissions_label: Quyền không đủ
+ insufficient_permissions_desc: Đảm bảo mã thông báo có quyền chỉ đọc
+ network_issue_label: Sự cố mạng
+ network_issue_desc: Kiểm tra kết nối internet của bạn
+ service_down_label: Dịch vụ gián đoạn
+ service_down_desc: API Mercury có thể tạm thời không khả dụng
+ check_provider_settings: Kiểm tra Cài đặt nhà cung cấp
+ setup_required:
+ title: Cần thiết lập Mercury
+ api_token_not_configured: Mã thông báo API chưa được cấu hình
+ api_token_description: Trước khi liên kết tài khoản Mercury, bạn cần cấu hình mã thông báo API Mercury.
+ setup_steps_title: "Các bước thiết lập:"
+ setup_step_1_html: "Đi đến Cài đặt > Nhà cung cấp"
+ setup_step_2_html: "Tìm phần Mercury"
+ setup_step_3: Nhập mã thông báo API Mercury của bạn
+ setup_step_4: Quay lại đây để liên kết tài khoản
+ go_to_provider_settings: Đi đến Cài đặt nhà cung cấp
+ create:
+ success: Kết nối Mercury đã được tạo thành công
+ destroy:
+ success: Kết nối Mercury đã được xóa
+ index:
+ title: Kết nối Mercury
+ loading:
+ loading_message: Đang tải tài khoản Mercury...
+ loading_title: Đang tải
+ link_accounts:
+ all_already_linked:
+ one: "Tài khoản đã chọn (%{names}) đã được liên kết"
+ other: "Tất cả %{count} tài khoản đã chọn đã được liên kết: %{names}"
+ api_error: "Lỗi API: %{message}"
+ invalid_account_names:
+ one: "Không thể liên kết tài khoản không có tên"
+ other: "Không thể liên kết %{count} tài khoản không có tên"
+ link_failed: Liên kết tài khoản thất bại
+ no_accounts_selected: Vui lòng chọn ít nhất một tài khoản
+ no_api_token: Không tìm thấy mã thông báo API Mercury. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ partial_invalid: "Đã liên kết thành công %{created_count} tài khoản, %{already_linked_count} đã được liên kết, %{invalid_count} tài khoản có tên không hợp lệ"
+ partial_success: "Đã liên kết thành công %{created_count} tài khoản. %{already_linked_count} tài khoản đã được liên kết: %{already_linked_names}"
+ select_connection: Chọn kết nối Mercury trước khi liên kết tài khoản.
+ success:
+ one: "Đã liên kết thành công %{count} tài khoản"
+ other: "Đã liên kết thành công %{count} tài khoản"
+ mercury_item:
+ accounts_need_setup: Tài khoản cần thiết lập
+ delete: Xóa kết nối
+ deletion_in_progress: đang xóa...
+ error: Lỗi
+ no_accounts_description: Kết nối này chưa có tài khoản nào được liên kết.
+ no_accounts_title: Không có tài khoản
+ setup_action: Thiết lập tài khoản mới
+ setup_description: "%{linked} trong số %{total} tài khoản đã liên kết. Chọn loại tài khoản cho các tài khoản Mercury mới được nhập."
+ setup_needed: Tài khoản mới sẵn sàng để thiết lập
+ status: "Đồng bộ %{timestamp} trước"
+ status_never: Chưa bao giờ đồng bộ
+ status_with_summary: "Đồng bộ lần cuối %{timestamp} trước - %{summary}"
+ syncing: Đang đồng bộ...
+ total: Tổng cộng
+ unlinked: Chưa liên kết
+ provider_panel:
+ add_connection: Thêm kết nối Mercury
+ base_url_label: URL cơ sở (tùy chọn)
+ base_url_placeholder: https://api.mercury.com/api/v1 (mặc định)
+ connection_name_label: Tên kết nối
+ connection_name_placeholder: Tài khoản kinh doanh
+ default_connection_name: Kết nối Mercury
+ disconnect_confirm: "Ngắt kết nối %{name}?"
+ instructions:
+ copy_token_html: "Sao chép toàn bộ mã thông báo (bao gồm tiền tố secret-token:) và thêm làm kết nối có tên bên dưới"
+ create_token: Tạo mã thông báo API mới với quyền truy cập "Chỉ đọc"
+ open_tokens: Đi đến Cài đặt > Nhà phát triển > Mã thông báo API
+ sign_in_html: "Truy cập %{link} và đăng nhập vào tài khoản bạn muốn kết nối"
+ whitelist_ip_html: "Quan trọng: Thêm địa chỉ IP máy chủ của bạn vào danh sách trắng của mã thông báo"
+ keep_token_placeholder: Để trống để giữ mã thông báo hiện tại
+ sandbox_note_html: "Sử dụng kết nối có tên riêng cho mỗi đăng nhập Mercury/mã thông báo API bạn muốn đồng bộ. Để kiểm thử sandbox, dùng https://api-sandbox.mercury.com/api/v1 làm URL cơ sở. Mercury yêu cầu đưa vào danh sách trắng IP - đảm bảo thêm IP của bạn trong bảng điều khiển Mercury."
+ setup_accounts: Thiết lập tài khoản
+ setup_title: "Hướng dẫn thiết lập:"
+ sync: Đồng bộ
+ token_label: Mã thông báo
+ token_placeholder: Dán mã thông báo vào đây
+ update_connection: Cập nhật kết nối
+ provider_connection:
+ default_description: Kết nối với ngân hàng của bạn qua Mercury
+ default_name: Mercury
+ description: "Kết nối bằng %{name}"
+ name: "Mercury - %{name}"
+ select_accounts:
+ accounts_selected: tài khoản đã chọn
+ api_error: "Lỗi API: %{message}"
+ cancel: Hủy
+ configure_name_in_mercury: Không thể nhập - vui lòng cấu hình tên tài khoản trong Mercury
+ description: Chọn tài khoản bạn muốn liên kết với tài khoản %{product_name} của bạn.
+ link_accounts: Liên kết tài khoản đã chọn
+ no_accounts_found: Không tìm thấy tài khoản. Vui lòng kiểm tra cấu hình mã thông báo API.
+ no_api_token: Mã thông báo API Mercury chưa được cấu hình. Vui lòng cấu hình trong Cài đặt.
+ no_credentials_configured: Vui lòng cấu hình mã thông báo API Mercury trước trong Cài đặt nhà cung cấp.
+ no_name_placeholder: "(Không có tên)"
+ select_connection: Chọn kết nối Mercury trong Cài đặt nhà cung cấp.
+ title: Chọn tài khoản Mercury
+ select_existing_account:
+ account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp
+ all_accounts_already_linked: Tất cả tài khoản Mercury đã được liên kết
+ api_error: "Lỗi API: %{message}"
+ cancel: Hủy
+ configure_name_in_mercury: Không thể nhập - vui lòng cấu hình tên tài khoản trong Mercury
+ description: Chọn tài khoản Mercury để liên kết với tài khoản này. Giao dịch sẽ được đồng bộ và loại bỏ trùng lặp tự động.
+ link_account: Liên kết tài khoản
+ no_account_specified: Chưa chỉ định tài khoản
+ no_accounts_found: Không tìm thấy tài khoản Mercury. Vui lòng kiểm tra cấu hình mã thông báo API.
+ no_api_token: Mã thông báo API Mercury chưa được cấu hình. Vui lòng cấu hình trong Cài đặt.
+ no_credentials_configured: Vui lòng cấu hình mã thông báo API Mercury trước trong Cài đặt nhà cung cấp.
+ no_name_placeholder: "(Không có tên)"
+ select_connection: Chọn kết nối Mercury trong Cài đặt nhà cung cấp.
+ title: "Liên kết %{account_name} với Mercury"
+ link_existing_account:
+ account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp
+ api_error: "Lỗi API: %{message}"
+ invalid_account_name: Không thể liên kết tài khoản không có tên
+ mercury_account_already_linked: Tài khoản Mercury này đã được liên kết với tài khoản khác
+ mercury_account_not_found: Không tìm thấy tài khoản Mercury
+ missing_parameters: Thiếu tham số bắt buộc
+ no_api_token: Không tìm thấy mã thông báo API Mercury. Vui lòng cấu hình trong Cài đặt nhà cung cấp.
+ select_connection: Chọn kết nối Mercury trước khi liên kết tài khoản.
+ success: "Đã liên kết thành công %{account_name} với Mercury"
+ setup_accounts:
+ account_type_label: "Loại tài khoản:"
+ all_accounts_linked: "Tất cả tài khoản Mercury của bạn đã được thiết lập."
+ api_error: "Lỗi API: %{message}"
+ fetch_failed: "Tải tài khoản thất bại"
+ no_accounts_to_setup: "Không có tài khoản nào để thiết lập"
+ no_api_token: "Mã thông báo API Mercury chưa được cấu hình. Vui lòng kiểm tra cài đặt kết nối."
+ account_types:
+ skip: Bỏ qua tài khoản này
+ depository: Tài khoản thanh toán hoặc tiết kiệm
+ credit_card: Thẻ tín dụng
+ investment: Tài khoản đầu tư
+ loan: Vay hoặc thế chấp
+ other_asset: Tài sản khác
+ subtype_labels:
+ depository: "Loại phụ tài khoản:"
+ credit_card: ""
+ investment: "Loại đầu tư:"
+ loan: "Loại vay:"
+ other_asset: ""
+ subtype_messages:
+ credit_card: "Thẻ tín dụng sẽ được tự động thiết lập dưới dạng tài khoản thẻ tín dụng."
+ other_asset: "Không cần tùy chọn bổ sung cho Tài sản khác."
+ subtypes:
+ depository:
+ checking: Tài khoản thanh toán
+ savings: Tài khoản tiết kiệm
+ hsa: Tài khoản tiết kiệm y tế
+ cd: Chứng chỉ tiền gửi
+ money_market: Thị trường tiền tệ
+ investment:
+ brokerage: Brokerage
+ pension: Lương hưu
+ retirement: Hưu trí
+ "401k": "401(k)"
+ roth_401k: "Roth 401(k)"
+ "403b": "403(b)"
+ tsp: Thrift Savings Plan
+ "529_plan": "529 Plan"
+ hsa: Tài khoản tiết kiệm y tế
+ mutual_fund: Quỹ tương hỗ
+ ira: Traditional IRA
+ roth_ira: Roth IRA
+ angel: Angel
+ loan:
+ mortgage: Thế chấp
+ student: Vay sinh viên
+ auto: Vay mua xe
+ other: Vay khác
+ balance: Số dư
+ cancel: Hủy
+ choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản Mercury:"
+ create_accounts: Tạo tài khoản
+ creating_accounts: Đang tạo tài khoản...
+ historical_data_range: "Phạm vi dữ liệu lịch sử:"
+ subtitle: Chọn đúng loại tài khoản cho các tài khoản đã nhập
+ sync_start_date_help: Chọn khoảng thời gian lịch sử giao dịch bạn muốn đồng bộ. Tối đa 3 năm lịch sử có sẵn.
+ sync_start_date_label: "Bắt đầu đồng bộ giao dịch từ:"
+ title: Thiết lập tài khoản Mercury của bạn
+ complete_account_setup:
+ all_skipped: "Tất cả tài khoản đã bị bỏ qua. Không có tài khoản nào được tạo."
+ creation_failed: "Tạo tài khoản thất bại: %{error}"
+ no_accounts: "Không có tài khoản nào để thiết lập."
+ success: "Đã tạo thành công %{count} tài khoản."
+ sync:
+ success: Đã bắt đầu đồng bộ
+ update:
+ success: Kết nối Mercury đã được cập nhật
+ mercury_item_selection_error_payload:
+ select_connection: Chọn kết nối Mercury trước khi tải tài khoản.
+ render_mercury_item_selection_failure:
+ select_connection: Chọn kết nối Mercury trong Cài đặt nhà cung cấp.
+ no_credentials_configured: Vui lòng cấu hình mã thông báo API Mercury trước trong Cài đặt nhà cung cấp.
diff --git a/config/locales/views/messages/vi.yml b/config/locales/views/messages/vi.yml
new file mode 100644
index 000000000..aeb02e98c
--- /dev/null
+++ b/config/locales/views/messages/vi.yml
@@ -0,0 +1,6 @@
+---
+vi:
+ messages:
+ chat_form:
+ placeholder: "Hỏi bất cứ điều gì ..."
+ disclaimer: "Phản hồi của AI chỉ mang tính thông tin. Không phải tư vấn tài chính!"
diff --git a/config/locales/views/mfa/vi.yml b/config/locales/views/mfa/vi.yml
new file mode 100644
index 000000000..7b3afae37
--- /dev/null
+++ b/config/locales/views/mfa/vi.yml
@@ -0,0 +1,41 @@
+---
+vi:
+ mfa:
+ backup_codes:
+ backup_codes_description: Mỗi mã chỉ có thể được sử dụng một lần. Hãy giữ các mã này an toàn và bảo mật.
+ backup_codes_title: Mã dự phòng của bạn
+ continue: Tiếp tục đến Cài đặt bảo mật
+ description: Lưu trữ các mã dự phòng này ở nơi an toàn - bạn sẽ cần chúng nếu mất quyền truy cập vào ứng dụng xác thực
+ page_title: Mã dự phòng
+ title: Lưu mã dự phòng của bạn
+ create:
+ invalid_code: Mã xác minh không hợp lệ. Vui lòng thử lại.
+ disable:
+ success: Xác thực hai yếu tố đã bị tắt
+ new:
+ code_label: Mã xác minh
+ code_placeholder: Nhập mã 6 chữ số
+ description: Tăng cường bảo mật tài khoản của bạn bằng cách thiết lập xác thực hai yếu tố
+ page_title: Thiết lập xác thực hai yếu tố
+ scan_description: Sử dụng ứng dụng xác thực như Google Authenticator hoặc 1Password để quét mã QR này
+ scan_title: 1. Quét mã QR
+ secret_description: Nếu bạn không thể quét mã QR, hãy nhập mã bí mật này theo cách thủ công vào ứng dụng xác thực của bạn
+ secret_title: Mã nhập thủ công
+ title: Thiết lập xác thực hai yếu tố
+ verify_button: Xác minh và bật 2FA
+ verify_description: Nhập mã 6 chữ số từ ứng dụng xác thực của bạn
+ verify_title: 2. Nhập mã xác minh
+ verify:
+ description: Nhập mã từ ứng dụng xác thực của bạn để tiếp tục
+ or: hoặc
+ page_title: Xác minh xác thực hai yếu tố
+ title: Xác thực hai yếu tố
+ verify_button: Xác minh
+ webauthn_button: Sử dụng khóa passkey hoặc khóa bảo mật
+ webauthn_unsupported: Trình duyệt này không hỗ trợ passkey hoặc khóa bảo mật.
+ verify_code:
+ invalid_code: Mã xác thực không hợp lệ. Vui lòng thử lại.
+ verify_webauthn:
+ invalid_credential: Không thể xác minh passkey hoặc khóa bảo mật đó. Vui lòng thử lại.
+ webauthn_options:
+ unavailable: Không có passkey hoặc khóa bảo mật nào cho tài khoản này.
diff --git a/config/locales/views/oidc_accounts/vi.yml b/config/locales/views/oidc_accounts/vi.yml
new file mode 100644
index 000000000..16fd6f008
--- /dev/null
+++ b/config/locales/views/oidc_accounts/vi.yml
@@ -0,0 +1,42 @@
+---
+vi:
+ oidc_accounts:
+ link:
+ no_pending_oidc: Không tìm thấy xác thực OIDC đang chờ xử lý
+ title_link: Liên kết tài khoản OIDC
+ title_create: Tạo tài khoản
+ verify_heading: Xác minh danh tính của bạn
+ verify_description_html: "Để liên kết tài khoản %{provider} của bạn%{email_suffix}, vui lòng xác minh danh tính bằng cách nhập mật khẩu."
+ email_suffix_html: " (%{email})"
+ email_label: Email
+ email_placeholder: Nhập email của bạn
+ password_label: Mật khẩu
+ password_placeholder: Nhập mật khẩu của bạn
+ verify_hint: Điều này giúp đảm bảo chỉ bạn mới có thể liên kết các tài khoản bên ngoài với hồ sơ của mình.
+ submit_link: Liên kết tài khoản
+ create_heading: Tạo tài khoản mới
+ create_description_html: "Không tìm thấy tài khoản nào với email %{email}. Nhấp bên dưới để tạo tài khoản mới bằng danh tính %{provider} của bạn."
+ info_email: "Email:"
+ info_name: "Tên:"
+ submit_create: Tạo tài khoản
+ submit_accept_invitation: Chấp nhận lời mời
+ account_creation_disabled: Tạo tài khoản mới qua đăng nhập một lần đã bị tắt. Vui lòng liên hệ với quản trị viên để tạo tài khoản của bạn.
+ cancel: Hủy
+ create_link:
+ no_pending_oidc: Không tìm thấy xác thực OIDC đang chờ xử lý
+ new_user:
+ no_pending_oidc: Không tìm thấy xác thực OIDC đang chờ xử lý
+ title: Hoàn tất tài khoản của bạn
+ heading: Tạo tài khoản của bạn
+ description: Vui lòng xác nhận thông tin của bạn để hoàn tất tạo tài khoản với danh tính %{provider}.
+ email_label: Email (từ nhà cung cấp SSO)
+ first_name_label: Tên
+ first_name_placeholder: Nhập tên của bạn
+ last_name_label: Họ
+ last_name_placeholder: Nhập họ của bạn
+ submit: Tạo tài khoản
+ cancel: Hủy
+ create_user:
+ no_pending_oidc: Không tìm thấy xác thực OIDC đang chờ xử lý
+ account_creation_disabled: Tạo tài khoản SSO đã bị tắt. Vui lòng liên hệ với quản trị viên.
+ account_created: "Chào mừng! Tài khoản của bạn đã được tạo."
diff --git a/config/locales/views/onboardings/vi.yml b/config/locales/views/onboardings/vi.yml
new file mode 100644
index 000000000..b11bd6a43
--- /dev/null
+++ b/config/locales/views/onboardings/vi.yml
@@ -0,0 +1,66 @@
+---
+vi:
+ onboardings:
+ header:
+ sign_out: Đăng xuất
+ setup: Thiết lập
+ preferences: Tùy chọn
+ goals: Mục tiêu
+ start: Bắt đầu
+ logout:
+ sign_out: Đăng xuất
+ show:
+ title: Hãy thiết lập tài khoản của bạn
+ subtitle: Trước tiên, hãy thiết lập hồ sơ của bạn.
+ first_name: Tên
+ first_name_placeholder: Tên
+ last_name: Họ
+ last_name_placeholder: Họ
+ group_name: Tên nhóm
+ group_name_placeholder: Tên nhóm
+ household_name: Tên hộ gia đình
+ household_name_placeholder: Tên hộ gia đình
+ moniker_prompt: "Sẽ sử dụng %{product_name} cùng với..."
+ moniker_family: Thành viên gia đình (chỉ bạn hoặc cùng vợ/chồng, con cái, v.v.)
+ moniker_group: Nhóm người (công ty, câu lạc bộ, hiệp hội, loại khác)
+ country: Quốc gia
+ submit: Tiếp tục
+ preferences:
+ title: Cấu hình tùy chọn của bạn
+ subtitle: Hãy cấu hình tùy chọn của bạn.
+ example: Tài khoản mẫu
+ preview: Xem trước cách hiển thị dữ liệu theo tùy chọn.
+ color_theme: Giao diện màu sắc
+ theme_system: Hệ thống
+ theme_light: Sáng
+ theme_dark: Tối
+ locale: Ngôn ngữ
+ currency: Tiền tệ
+ date_format: Định dạng ngày
+ submit: Hoàn tất
+ goals:
+ title: Điều gì đưa bạn đến đây?
+ subtitle: Chọn một hoặc nhiều mục tiêu bạn muốn đạt được khi sử dụng %{product_name} làm công cụ tài chính cá nhân.
+ unified_accounts: Xem tất cả tài khoản ở một nơi
+ cashflow: Hiểu dòng tiền và chi tiêu
+ budgeting: Quản lý kế hoạch tài chính và ngân sách
+ partner: Quản lý tài chính cùng người thân
+ investments: Theo dõi đầu tư
+ ai_insights: Để AI giúp tôi hiểu tài chính
+ optimization: Phân tích và tối ưu hóa tài khoản
+ reduce_stress: Giảm căng thẳng hoặc lo lắng về tài chính
+ submit: Tiếp theo
+ trial:
+ title: Dùng thử Sure trong 45 ngày
+ data_deletion: Dữ liệu sẽ bị xóa sau đó
+ description_html: Bắt đầu từ hôm nay bạn có thể trải nghiệm sản phẩm.Bạn sẽ không thể hoàn tác quyết định này
" + cancel: Hủy + title: Bạn có chắc không? + money_field: + label: Số tiền + exchange_rate_tabs: + calculate_rate_tab: Tính tỷ giá ngoại tệ + convert_tab: Chuyển đổi với tỷ giá + destination_amount: Số tiền đích + exchange_rate: Tỷ giá + exchange_rate_help: Chọn cách nhập số tiền. + syncing_notice: + syncing: Đang đồng bộ dữ liệu tài khoản... + require_admin: "Chỉ quản trị viên mới có thể thực hiện hành động này" + custom_confirm: + default_title: "Bạn có chắc không?" + default_body: "Thao tác này không thể hoàn tác." + default_btn_text: "Xác nhận" + family_moniker: + group_plural: Nhóm + group_singular: Nhóm + plural: Hộ gia đình + singular: Hộ gia đình + trend_change: + no_change: "không thay đổi" + cancel: Hủy + transaction_tabs: + expense: Chi tiêu + income: Thu nhập + transfer: Chuyển khoản diff --git a/config/locales/views/simplefin_items/vi.yml b/config/locales/views/simplefin_items/vi.yml new file mode 100644 index 000000000..11445ed09 --- /dev/null +++ b/config/locales/views/simplefin_items/vi.yml @@ -0,0 +1,159 @@ +--- +vi: + simplefin_items: + new: + title: Kết nối SimpleFIN + setup_token: Mã thiết lập + setup_token_placeholder: dán mã thiết lập SimpleFIN của bạn vào đây + connect: Kết nối + cancel: Hủy + create: + success: Kết nối SimpleFIN đã được thêm thành công! Các tài khoản của bạn sẽ xuất hiện sau khi đồng bộ trong nền. + errors: + blank_token: Vui lòng nhập mã thiết lập SimpleFIN. + invalid_token: Mã thiết lập không hợp lệ. Vui lòng kiểm tra rằng bạn đã sao chép toàn bộ mã từ SimpleFIN Bridge. + token_compromised: Mã thiết lập có thể đã bị xâm phạm, hết hạn hoặc đã được sử dụng. Vui lòng tạo mã mới. + create_failed: "Kết nối thất bại: %{message}" + unexpected: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại. + destroy: + success: Kết nối SimpleFIN sẽ được gỡ bỏ + update: + success: Kết nối SimpleFIN đã được cập nhật thành công! Các tài khoản của bạn đang được kết nối lại. + errors: + blank_token: Vui lòng nhập mã thiết lập SimpleFIN. + invalid_token: Mã thiết lập không hợp lệ. Vui lòng kiểm tra rằng bạn đã sao chép toàn bộ mã từ SimpleFIN Bridge. + token_compromised: Mã thiết lập có thể đã bị xâm phạm, hết hạn hoặc đã được sử dụng. Vui lòng tạo mã mới. + update_failed: "Cập nhật kết nối thất bại: %{message}" + unexpected: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại. + edit: + setup_token: + label: "Mã thiết lập SimpleFIN:" + placeholder: "Dán mã thiết lập SimpleFIN của bạn vào đây..." + help_text: "Mã phải là một chuỗi dài bắt đầu bằng chữ cái và số" + title: Cập nhật kết nối SimpleFIN + header_subtitle: Lấy mã thiết lập mới để kết nối lại tài khoản SimpleFIN của bạn + connection_needs_update: "Kết nối SimpleFIN của bạn cần được cập nhật:" + step_1_html: "Truy cập SimpleFIN Bridge để tạo mã thiết lập mới" + step_2: Sao chép mã và dán vào bên dưới + step_3: "Nhấn \"Cập nhật\" để khôi phục quyền truy cập" + update: Cập nhật + cancel: Hủy + setup_accounts: + title: Thiết lập tài khoản SimpleFIN của bạn + header_subtitle: Chọn đúng loại tài khoản cho các tài khoản đã nhập + choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản SimpleFIN:" + account_type_checking_savings: Tài khoản thanh toán hoặc tiết kiệm + account_type_checking_savings_desc: Tài khoản ngân hàng thông thường + account_type_credit_card: Thẻ tín dụng + account_type_credit_card_desc: Tài khoản thẻ tín dụng + account_type_investment: Đầu tư + account_type_investment_desc: "Tài khoản Brokerage, 401(k), IRA" + account_type_loan: Vay hoặc thế chấp + account_type_loan_desc: Tài khoản nợ + account_type_other_asset: Tài sản khác + account_type_other_asset_desc: Tất cả các loại khác + transaction_history_title: "Lịch sử giao dịch:" + transaction_history_description_html: "SimpleFIN thường cung cấp 60-90 ngày lịch sử giao dịch, tùy thuộc vào ngân hàng của bạn. Sau khi thiết lập ban đầu, các giao dịch mới sẽ tự động đồng bộ. Dữ liệu lịch sử có sẵn tùy theo tổ chức và loại tài khoản." + account_type_label: "Loại tài khoản:" + create_accounts: Tạo tài khoản + creating_accounts: Đang tạo tài khoản... + cancel: Hủy + account_card: + balance: "Số dư" + activity: + recent: + one: "1 giao dịch • mới nhất %{when}" + other: "%{count} giao dịch • mới nhất %{when}" + dormant: "Không có hoạt động trong %{days} ngày" + empty: "Chưa nhập giao dịch nào" + likely_closed: "Không có hoạt động gần đây và số dư bằng không — thẻ này có thể đã đóng hoặc bị thay thế" + today: "hôm nay" + yesterday: "hôm qua" + days_ago: + one: "1 ngày trước" + other: "%{count} ngày trước" + stale_accounts: + title: "Tài khoản không còn trong SimpleFIN" + description: "Các tài khoản này tồn tại trong cơ sở dữ liệu của bạn nhưng không còn được SimpleFIN cung cấp. Điều này có thể xảy ra khi cấu hình tài khoản thay đổi ở phía trên." + action_prompt: "Bạn muốn làm gì?" + action_delete: "Xóa tài khoản và tất cả giao dịch" + action_move: "Chuyển giao dịch sang:" + action_skip: "Bỏ qua lúc này" + transaction_count: + one: "%{count} giao dịch" + other: "%{count} giao dịch" + complete_account_setup: + all_skipped: "Tất cả tài khoản đã bị bỏ qua. Không có tài khoản nào được tạo." + no_accounts: "Không có tài khoản nào để thiết lập." + success: + one: "Đã tạo thành công %{count} tài khoản SimpleFIN! Các giao dịch và tài sản của bạn đang được nhập trong nền." + other: "Đã tạo thành công %{count} tài khoản SimpleFIN! Các giao dịch và tài sản của bạn đang được nhập trong nền." + stale_accounts_processed: "Tài khoản cũ: %{deleted} đã xóa, %{moved} đã chuyển." + stale_accounts_errors: + one: "%{count} thao tác tài khoản cũ thất bại. Kiểm tra nhật ký để biết chi tiết." + other: "%{count} thao tác tài khoản cũ thất bại. Kiểm tra nhật ký để biết chi tiết." + simplefin_item: + add_new: Thêm kết nối mới + confirm_accept: Xóa kết nối + confirm_body: Thao tác này sẽ xóa vĩnh viễn tất cả tài khoản trong nhóm này và tất cả dữ liệu liên quan. + confirm_title: Xóa kết nối SimpleFIN? + delete: Xóa + deletion_in_progress: "(đang xóa...)" + error: Đã xảy ra lỗi khi đồng bộ dữ liệu + no_accounts_description: Kết nối này chưa có tài khoản nào được đồng bộ. + no_accounts_title: Không tìm thấy tài khoản + requires_update: Kết nối lại + setup_needed: Tài khoản mới sẵn sàng để thiết lập + setup_description: Chọn loại tài khoản cho các tài khoản SimpleFIN mới được nhập. + setup_action: Thiết lập tài khoản mới + setup_accounts_menu: Thiết lập tài khoản + more_accounts_available: + one: "%{count} tài khoản khác có sẵn để thiết lập" + other: "%{count} tài khoản khác có sẵn để thiết lập" + accounts_skipped_tooltip: "Một số tài khoản đã bị bỏ qua do lỗi trong quá trình đồng bộ" + accounts_skipped_label: "Đã bỏ qua: %{count}" + rate_limited_ago: "Bị giới hạn tốc độ (%{time} trước)" + rate_limited_recently: "Bị giới hạn tốc độ gần đây" + status: Đồng bộ lần cuối %{timestamp} trước + status_never: Chưa bao giờ đồng bộ + status_with_summary: "Đồng bộ lần cuối %{timestamp} trước • %{summary}" + syncing: Đang đồng bộ... + update: Cập nhật + stale_pending_note: "(loại trừ khỏi ngân sách)" + stale_pending_accounts: "trong: %{accounts}" + reconciled_details_note: "(xem tóm tắt đồng bộ để biết chi tiết)" + duplicate_accounts_skipped: "Một số tài khoản đã bị bỏ qua vì trùng lặp — dùng 'Liên kết tài khoản hiện có' để hợp nhất." + select_existing_account: + title: "Liên kết %{account_name} với SimpleFIN" + description: Chọn tài khoản SimpleFIN để liên kết với tài khoản hiện có của bạn + cancel: Hủy + link_account: Liên kết tài khoản + no_accounts_found: "Không tìm thấy tài khoản SimpleFIN nào cho %{moniker} này." + wait_for_sync: Nếu bạn vừa kết nối hoặc đồng bộ, hãy thử lại sau khi quá trình đồng bộ hoàn tất. + unlink_to_move: Để chuyển liên kết, trước tiên hãy hủy liên kết từ menu thao tác của tài khoản. + all_accounts_already_linked: Tất cả tài khoản SimpleFIN có vẻ đã được liên kết. + currently_linked_to: "Hiện đang liên kết với: %{account_name}" + + link_existing_account: + success: Tài khoản đã được liên kết thành công với SimpleFIN + errors: + only_manual: Chỉ tài khoản thủ công mới có thể được liên kết + different_provider: Tài khoản này đang liên kết với nhà cung cấp khác. Hãy hủy liên kết từ nhà cung cấp đó trước, sau đó liên kết với SimpleFIN. + invalid_simplefin_account: Tài khoản SimpleFIN được chọn không hợp lệ + dismiss_replacement_suggestion: + dismissed: Đề xuất thay thế đã bị bỏ qua + replacement_prompt: + title: "Thẻ %{institution} của bạn có thể đã được thay thế" + description: '"%{account_name}" được liên kết với "%{old_name}", vốn không có hoạt động gần đây và số dư bằng không. Một thẻ mới, "%{new_name}", hiện đang hoạt động tại cùng tổ chức. Liên kết lại để giữ nguyên lịch sử của bạn.' + relink: Liên kết lại với thẻ mới + confirm_title: Liên kết lại với thẻ mới? + confirm_body: '"%{account_name}" sẽ được liên kết với "%{new_name}". Lịch sử giao dịch vẫn được giữ; các giao dịch tương lai sẽ đến từ thẻ mới.' + dismiss_aria: Bỏ qua đề xuất thay thế + reconciled_status: + message: + one: "%{count} giao dịch đang chờ trùng lặp đã được đối soát" + other: "%{count} giao dịch đang chờ trùng lặp đã được đối soát" + stale_pending_status: + message: + one: "%{count} giao dịch đang chờ cũ hơn %{days} ngày" + other: "%{count} giao dịch đang chờ cũ hơn %{days} ngày" diff --git a/config/locales/views/snaptrade_items/vi.yml b/config/locales/views/snaptrade_items/vi.yml new file mode 100644 index 000000000..61a95981d --- /dev/null +++ b/config/locales/views/snaptrade_items/vi.yml @@ -0,0 +1,191 @@ +vi: + snaptrade_items: + default_name: "Kết nối SnapTrade" + link_accounts: + use_setup_flow: Sử dụng luồng thiết lập tài khoản + create: + success: "Đã cấu hình SnapTrade thành công." + update: + success: "Đã cập nhật cấu hình SnapTrade thành công." + destroy: + success: "Đã lên lịch xóa kết nối SnapTrade." + connect: + decryption_failed: "Không thể đọc thông tin xác thực SnapTrade. Vui lòng xóa và tạo lại kết nối này." + connection_failed: "Kết nối SnapTrade thất bại: %{message}" + callback: + success: "Đã kết nối brokerage! Vui lòng chọn tài khoản muốn liên kết." + no_item: "Không tìm thấy cấu hình SnapTrade." + complete_account_setup: + success: + one: "Đã liên kết thành công %{count} tài khoản." + other: "Đã liên kết thành công %{count} tài khoản." + partial_success: + one: "Đã liên kết %{count} tài khoản. %{failed_count} liên kết thất bại." + other: "Đã liên kết %{count} tài khoản. %{failed_count} liên kết thất bại." + link_failed: "Liên kết tài khoản thất bại: %{errors}" + no_accounts: "Không có tài khoản nào được chọn để liên kết." + preload_accounts: + not_configured: "SnapTrade chưa được cấu hình." + select_accounts: + not_configured: "SnapTrade chưa được cấu hình." + select_existing_account: + not_found: "Không tìm thấy tài khoản hoặc cấu hình SnapTrade." + title: "Liên kết với tài khoản SnapTrade" + header: "Liên kết tài khoản hiện có" + subtitle: "Chọn tài khoản SnapTrade để liên kết" + no_accounts: "Không có tài khoản SnapTrade chưa liên kết." + connect_hint: "Bạn có thể cần kết nối brokerage trước." + settings_link: "Đi đến Cài đặt nhà cung cấp" + linking_to: "Đang liên kết với tài khoản:" + balance_label: "Số dư:" + link_button: "Liên kết" + cancel_button: "Hủy" + link_existing_account: + success: "Đã liên kết thành công với tài khoản SnapTrade." + failed: "Liên kết tài khoản thất bại: %{message}" + not_found: "Không tìm thấy tài khoản." + connections: + unknown_brokerage: "Brokerage không xác định" + delete_connection: + success: "Đã xóa kết nối thành công. Một slot đã được giải phóng." + failed: "Xóa kết nối thất bại: %{message}" + missing_authorization_id: "Thiếu ID ủy quyền" + api_deletion_failed: "Không thể xóa kết nối khỏi SnapTrade - thiếu thông tin xác thực. Kết nối có thể vẫn tồn tại trong tài khoản SnapTrade của bạn." + delete_orphaned_user: + success: "Đã xóa đăng ký mồ côi thành công." + failed: "Xóa đăng ký mồ côi thất bại." + setup_accounts: + title: "Thiết lập tài khoản SnapTrade" + header: "Thiết lập tài khoản SnapTrade của bạn" + subtitle: "Chọn tài khoản brokerage muốn liên kết" + syncing: "Đang lấy tài khoản của bạn..." + loading: "Đang tải tài khoản từ SnapTrade..." + loading_hint: "Nhấn Làm mới để kiểm tra tài khoản." + refresh: "Làm mới" + info_title: "Dữ liệu đầu tư SnapTrade" + info_holdings: "Tài sản nắm giữ với giá hiện tại và số lượng" + info_cost_basis: "Cơ sở chi phí theo vị thế (nếu có)" + info_activities: "Lịch sử giao dịch với nhãn hoạt động (Mua, Bán, Cổ tức, v.v.)" + info_history: "Lịch sử giao dịch tối đa 3 năm" + free_tier_note: "Gói miễn phí SnapTrade cho phép 5 kết nối brokerage. Kiểm tra bảng điều khiển SnapTrade để xem mức sử dụng hiện tại." + no_accounts_title: "Không tìm thấy tài khoản" + no_accounts_message: "Không tìm thấy tài khoản brokerage nào. Điều này có thể xảy ra nếu bạn đã hủy kết nối hoặc brokerage không được hỗ trợ." + try_again: "Kết nối Brokerage" + back_to_settings: "Quay lại Cài đặt" + available_accounts: "Tài khoản có sẵn" + balance_label: "Số dư:" + account_number: "Tài khoản:" + sync_start_date_label: "Nhập giao dịch từ:" + sync_start_date_help: "Để trống để lấy toàn bộ lịch sử có sẵn" + create_button: "Tạo tài khoản đã chọn" + cancel_button: "Hủy" + creating: "Đang tạo tài khoản..." + done_button: "Xong" + or_link_existing: "Hoặc liên kết với tài khoản hiện có thay vì tạo mới:" + select_account: "Chọn một tài khoản..." + link_button: "Liên kết" + linked_accounts: "Đã liên kết" + linked_to: "Liên kết với:" + snaptrade_item: + accounts_need_setup: + one: "%{count} tài khoản cần thiết lập" + other: "%{count} tài khoản cần thiết lập" + deletion_in_progress: "Đang xóa..." + syncing: "Đang đồng bộ..." + requires_update: "Kết nối cần cập nhật" + error: "Lỗi đồng bộ" + status: "Đồng bộ lần cuối %{timestamp} trước - %{summary}" + status_never: "Chưa bao giờ đồng bộ" + reconnect: "Kết nối lại" + connect_brokerage: "Kết nối Brokerage" + add_another_brokerage: "Kết nối thêm brokerage" + delete: "Xóa" + setup_needed: "Tài khoản cần thiết lập" + setup_description: "Một số tài khoản từ SnapTrade cần được liên kết với tài khoản Sure." + setup_action: "Thiết lập tài khoản" + setup_accounts_menu: "Thiết lập tài khoản" + manage_connections: "Quản lý kết nối" + more_accounts_available: + one: "%{count} tài khoản khác có sẵn để thiết lập" + other: "%{count} tài khoản khác có sẵn để thiết lập" + no_accounts_title: "Chưa phát hiện tài khoản nào" + no_accounts_description: "Kết nối brokerage để nhập tài khoản đầu tư của bạn." + + providers: + snaptrade: + name: "SnapTrade" + connection_description: "Kết nối với brokerage qua SnapTrade (hỗ trợ 25+ sàn)" + description: "SnapTrade kết nối với 25+ brokerage lớn (Fidelity, Vanguard, Schwab, Robinhood, v.v.) và cung cấp lịch sử giao dịch đầy đủ với nhãn hoạt động và cơ sở chi phí." + setup_title: "Hướng dẫn thiết lập:" + step_1_html: "Tạo tài khoản tại dashboard.snaptrade.com" + step_2: "Sao chép Client ID và Consumer Key từ bảng điều khiển" + step_3: "Nhập thông tin xác thực bên dưới và nhấn Lưu" + step_4: "Đi đến trang Tài khoản và dùng 'Kết nối thêm brokerage' để liên kết tài khoản đầu tư" + free_tier_warning: "Gói miễn phí SnapTrade hỗ trợ 5 kết nối brokerage. Nâng cấp trên SnapTrade để có thêm." + client_id_label: "Client ID" + client_id_placeholder: "Nhập Client ID SnapTrade của bạn" + client_id_update_placeholder: "Nhập Client ID mới để cập nhật" + consumer_key_label: "Consumer Key" + consumer_key_placeholder: "Nhập Consumer Key SnapTrade của bạn" + consumer_key_update_placeholder: "Nhập Consumer Key mới để cập nhật" + save_button: "Lưu cấu hình" + update_button: "Cập nhật cấu hình" + status_connected: + one: "%{count} tài khoản từ SnapTrade" + other: "%{count} tài khoản từ SnapTrade" + status_needs_registration: "Đã lưu thông tin xác thực. Hoàn tất thiết lập để kết nối brokerage." + needs_setup: + one: "%{count} cần thiết lập" + other: "%{count} cần thiết lập" + status_ready: "Sẵn sàng kết nối brokerage" + setup_accounts_button: "Thiết lập tài khoản" + connect_button: "Kết nối Brokerage" + connected_brokerages: "Đã kết nối:" + manage_connections: "Quản lý kết nối" + loading_connections: "Đang tải kết nối..." + connections_error: "Tải kết nối thất bại: %{message}" + accounts_count: + one: "%{count} tài khoản" + other: "%{count} tài khoản" + orphaned_connection: "Kết nối mồ côi (không đồng bộ cục bộ)" + needs_linking: "cần liên kết" + no_connections: "Không tìm thấy kết nối brokerage nào." + delete_connection: "Xóa" + delete_connection_title: "Xóa kết nối Brokerage?" + delete_connection_body: "Thao tác này sẽ xóa vĩnh viễn kết nối %{brokerage} khỏi SnapTrade. Tất cả tài khoản từ brokerage này sẽ bị hủy liên kết. Bạn cần kết nối lại để đồng bộ các tài khoản này." + delete_connection_confirm: "Xóa kết nối" + orphaned_users_title: + one: "%{count} đăng ký mồ côi" + other: "%{count} đăng ký mồ côi" + orphaned_users_description: "Đây là các đăng ký người dùng SnapTrade cũ đang sử dụng slot kết nối của bạn. Xóa chúng để giải phóng slot." + orphaned_user: "Đăng ký mồ côi" + delete_orphaned_user: "Xóa" + delete_orphaned_user_title: "Xóa đăng ký mồ côi?" + delete_orphaned_user_body: "Thao tác này sẽ xóa vĩnh viễn người dùng SnapTrade mồ côi này và tất cả kết nối brokerage của họ, giải phóng slot kết nối." + delete_orphaned_user_confirm: "Xóa đăng ký" + + snaptrade_item: + sync_status: + no_accounts: "Không tìm thấy tài khoản" + synced: + one: "%{count} tài khoản đã đồng bộ" + other: "%{count} tài khoản đã đồng bộ" + synced_with_setup: "%{linked} đã đồng bộ, %{unlinked} cần thiết lập" + institution_summary: + none: "Chưa kết nối tổ chức nào" + count: + one: "%{count} tổ chức" + other: "%{count} tổ chức" + brokerage_summary: + none: "Chưa kết nối brokerage nào" + count: + one: "%{count} brokerage" + other: "%{count} brokerage" + syncer: + discovering: "Đang phát hiện tài khoản..." + importing: "Đang nhập tài khoản từ SnapTrade..." + processing: "Đang xử lý tài sản nắm giữ và hoạt động..." + calculating: "Đang tính toán số dư..." + checking_config: "Đang kiểm tra cấu hình tài khoản..." + needs_setup: "%{count} tài khoản cần thiết lập..." + activities_fetching_async: "Các hoạt động đang được lấy trong nền. Quá trình này có thể mất đến một phút đối với kết nối brokerage mới." diff --git a/config/locales/views/sophtron_items/vi.yml b/config/locales/views/sophtron_items/vi.yml new file mode 100644 index 000000000..e6a7ba75c --- /dev/null +++ b/config/locales/views/sophtron_items/vi.yml @@ -0,0 +1,313 @@ +--- +vi: + sophtron_items: + defaults: + name: Kết nối Sophtron + new: + title: Kết nối Sophtron + user_id: ID người dùng + user_id_placeholder: dán ID người dùng Sophtron của bạn vào đây + access_key: Khóa truy cập + access_key_placeholder: dán Khóa truy cập Sophtron của bạn vào đây + connect: Kết nối + cancel: Hủy + create: + success: Kết nối Sophtron đã được tạo thành công + destroy: + success: Kết nối Sophtron đã được xóa + update: + success: Kết nối Sophtron đã được cập nhật thành công! Các tài khoản của bạn đang được kết nối lại. + errors: + blank_user_id: Vui lòng nhập ID người dùng Sophtron. + invalid_user_id: ID người dùng không hợp lệ. Vui lòng kiểm tra rằng bạn đã sao chép toàn bộ ID người dùng từ Sophtron. + user_id_compromised: ID người dùng có thể đã bị xâm phạm, hết hạn hoặc đã được sử dụng. Vui lòng tạo mới. + blank_access_key: Vui lòng nhập Khóa truy cập Sophtron. + invalid_access_key: Khóa truy cập không hợp lệ. Vui lòng kiểm tra rằng bạn đã sao chép toàn bộ Khóa truy cập từ Sophtron. + access_key_compromised: Khóa truy cập có thể đã bị xâm phạm, hết hạn hoặc đã được sử dụng. Vui lòng tạo mới. + update_failed: "Cập nhật kết nối thất bại: %{message}" + unexpected: Đã xảy ra lỗi không mong muốn. Vui lòng thử lại hoặc liên hệ hỗ trợ. + edit: + user_id: + label: "ID người dùng Sophtron:" + placeholder: "Dán ID người dùng Sophtron của bạn vào đây..." + help_text: "ID người dùng phải là một chuỗi dài bắt đầu bằng chữ cái và số" + access_key: + label: "Khóa truy cập Sophtron:" + placeholder: "Dán Khóa truy cập Sophtron của bạn vào đây..." + help_text: "Khóa truy cập phải là một chuỗi dài bắt đầu bằng chữ cái và số" + index: + title: Kết nối Sophtron + loading: + loading_message: Đang tải tài khoản Sophtron... + loading_title: Đang tải + link_accounts: + all_already_linked: + one: "Tài khoản đã chọn (%{names}) đã được liên kết" + other: "Tất cả %{count} tài khoản đã chọn đã được liên kết: %{names}" + api_error: "Lỗi kết nối API" + invalid_account_names: + one: "Không thể liên kết tài khoản không có tên" + other: "Không thể liên kết %{count} tài khoản không có tên" + link_failed: Liên kết tài khoản thất bại + no_accounts_selected: Vui lòng chọn ít nhất một tài khoản + partial_invalid: "Đã liên kết thành công %{created_count} tài khoản, %{already_linked_count} đã được liên kết, %{invalid_count} tài khoản có tên không hợp lệ" + partial_success: "Đã liên kết thành công %{created_count} tài khoản. %{already_linked_count} tài khoản đã được liên kết: %{already_linked_names}" + success: + one: "Đã liên kết thành công %{count} tài khoản" + other: "Đã liên kết thành công %{count} tài khoản" + no_credentials_configured: "Vui lòng cấu hình ID người dùng và Khóa truy cập API Sophtron trước trong Cài đặt nhà cung cấp." + no_accounts_found: Không tìm thấy tài khoản. Vui lòng kiểm tra cấu hình khóa API. + no_access_key: Khóa truy cập Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_user_id: ID người dùng Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_institution_connected: Vui lòng kết nối tổ chức ngân hàng với Sophtron trước. + connect: + cancel: Hủy + captcha: Captcha + connect: Kết nối + institution_search_label: Tổ chức + institution_search_placeholder: Tìm theo tên ngân hàng + no_institutions: Không tìm thấy tổ chức phù hợp. + password: Mật khẩu + search: Tìm kiếm + search_too_short: Nhập ít nhất hai ký tự để tìm kiếm. + title: Kết nối tổ chức Sophtron + username: Tên đăng nhập + connect_institution: + api_error: "Kết nối Sophtron thất bại: %{message}" + missing_parameters: Chọn tổ chức và nhập thông tin đăng nhập ngân hàng của bạn. + connection_status: + api_error: "Lỗi kết nối API: %{message}" + attempt: "Lần thử %{attempt} trong %{max}" + check_again: Kiểm tra lại + failed: Sophtron không thể hoàn tất kết nối tổ chức này. + failed_timeout: Sophtron hết thời gian chờ trong khi tổ chức đang hoàn tất đăng nhập. + timeout: Sophtron không hoàn tất kết nối trong thời gian dự kiến. Bạn có thể kiểm tra lại hoặc thử kết nối lại sau. + title: Đang kết nối Sophtron + waiting: Sophtron vẫn đang kết nối với tổ chức của bạn. + mfa: + captcha: Văn bản Captcha + captcha_alt: Sophtron captcha + phone_confirmed: Tôi đã xác nhận qua điện thoại + submit: Gửi + title: Xác minh Sophtron + token: Mã xác minh + submit_mfa: + api_error: "Xác minh thất bại: %{message}" + invalid_security_answers: Câu trả lời bảo mật bị thiếu hoặc quá dài. + unknown_challenge: Bước xác minh Sophtron không xác định. + sophtron_item: + accounts_need_setup: Tài khoản cần thiết lập + automatic_sync: Sử dụng đồng bộ tự động + delete: Xóa kết nối + deletion_in_progress: đang xóa... + error: Lỗi + no_accounts_description: Kết nối này chưa có tài khoản nào được liên kết. + no_accounts_title: Không có tài khoản + manual_sync: Đồng bộ thủ công + manual_sync_action: Yêu cầu đồng bộ thủ công + manual_sync_action_for: "Yêu cầu đồng bộ thủ công cho %{institution}" + automatic_sync_for: "Sử dụng đồng bộ tự động cho %{institution}" + setup_action: Thiết lập tài khoản mới + setup_description: "%{linked} trong số %{total} tài khoản đã liên kết. Chọn loại tài khoản cho các tài khoản Sophtron mới được nhập." + setup_needed: Tài khoản mới sẵn sàng để thiết lập + status: "Đồng bộ %{timestamp} trước" + status_never: Chưa bao giờ đồng bộ + status_with_summary: "Đồng bộ lần cuối %{timestamp} trước • %{summary}" + sync_now: Đồng bộ ngay + syncing: Đang đồng bộ... + total: Tổng cộng + unlinked: Chưa liên kết + preload_accounts: + preload_accounts: tải trước tài khoản + api_error: "Lỗi kết nối API" + unexpected_error: "Đã xảy ra lỗi không mong muốn" + no_credentials_configured: "Vui lòng cấu hình ID người dùng và Khóa truy cập API Sophtron trước trong Cài đặt nhà cung cấp." + no_accounts_found: Không tìm thấy tài khoản. Vui lòng kiểm tra cấu hình khóa API. + no_access_key: Khóa truy cập Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_user_id: ID người dùng Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + select_accounts: + accounts_selected: tài khoản đã chọn + api_error: "Lỗi kết nối API" + unexpected_error: "Đã xảy ra lỗi không mong muốn" + cancel: Hủy + configure_name_in_sophtron: Không thể nhập - vui lòng cấu hình tên tài khoản trong Sophtron + description: Chọn tài khoản bạn muốn liên kết với tài khoản %{product_name} của bạn. + link_accounts: Liên kết tài khoản đã chọn + no_accounts_found: Không tìm thấy tài khoản. Vui lòng kiểm tra cấu hình khóa API. + no_access_key: Khóa truy cập Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_user_id: ID người dùng Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_credentials_configured: "Vui lòng cấu hình ID người dùng và Khóa truy cập API Sophtron trước trong Cài đặt nhà cung cấp." + no_institution_connected: Vui lòng kết nối tổ chức ngân hàng với Sophtron trước. + no_name_placeholder: "(Không có tên)" + title: Chọn tài khoản Sophtron + select_existing_account: + account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp + all_accounts_already_linked: Tất cả tài khoản Sophtron đã được liên kết + api_error: "Lỗi kết nối API" + cancel: Hủy + configure_name_in_sophtron: Không thể nhập - vui lòng cấu hình tên tài khoản trong Sophtron + description: Chọn tài khoản Sophtron để liên kết với tài khoản này. Giao dịch sẽ được đồng bộ và loại bỏ trùng lặp tự động. + link_account: Liên kết tài khoản + no_account_specified: Chưa chỉ định tài khoản + no_accounts_found: Không tìm thấy tài khoản Sophtron. Vui lòng kiểm tra cấu hình khóa API. + no_access_key: Khóa truy cập Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_user_id: ID người dùng Sophtron chưa được cấu hình. Vui lòng cấu hình trong Cài đặt. + no_institution_connected: Vui lòng kết nối tổ chức ngân hàng với Sophtron trước. + no_name_placeholder: "(Không có tên)" + title: "Liên kết %{account_name} với Sophtron" + unexpected_error: "Đã xảy ra lỗi không mong muốn" + link_existing_account: + account_already_linked: Tài khoản này đã được liên kết với nhà cung cấp + api_error: "Lỗi kết nối API" + unexpected_error: "Đã xảy ra lỗi không mong muốn" + invalid_account_name: Không thể liên kết tài khoản không có tên + sophtron_account_already_linked: Tài khoản Sophtron này đã được liên kết với tài khoản khác + sophtron_account_not_found: Không tìm thấy tài khoản Sophtron + missing_parameters: Thiếu tham số bắt buộc + no_institution_connected: Vui lòng kết nối tổ chức ngân hàng với Sophtron trước. + success: "Đã liên kết thành công %{account_name} với Sophtron" + setup_accounts: + account_type_label: "Loại tài khoản:" + all_accounts_linked: "Tất cả tài khoản Sophtron của bạn đã được thiết lập." + api_error: "Lỗi kết nối API" + unexpected_error: "Đã xảy ra lỗi không mong muốn" + fetch_failed: "Tải tài khoản thất bại" + no_accounts_to_setup: "Không có tài khoản nào để thiết lập" + no_access_key: "Khóa truy cập Sophtron chưa được cấu hình. Vui lòng kiểm tra cài đặt kết nối." + no_user_id: "ID người dùng Sophtron chưa được cấu hình. Vui lòng kiểm tra cài đặt kết nối." + no_institution_connected: "Tổ chức Sophtron chưa được kết nối." + account_types: + skip: Bỏ qua tài khoản này + depository: Tài khoản thanh toán hoặc tiết kiệm + credit_card: Thẻ tín dụng + investment: Tài khoản đầu tư + loan: Vay hoặc thế chấp + other_asset: Tài sản khác + subtype_labels: + depository: "Loại phụ tài khoản:" + credit_card: "" + investment: "Loại đầu tư:" + loan: "Loại vay:" + other_asset: "" + subtype_messages: + credit_card: "Thẻ tín dụng sẽ được tự động thiết lập dưới dạng tài khoản thẻ tín dụng." + other_asset: "Không cần tùy chọn bổ sung cho Tài sản khác." + balance: Số dư + cancel: Hủy + choose_account_type: "Chọn đúng loại tài khoản cho mỗi tài khoản Sophtron:" + create_accounts: Tạo tài khoản + creating_accounts: Đang tạo tài khoản... + historical_data_range: "Phạm vi dữ liệu lịch sử:" + subtitle: Chọn đúng loại tài khoản cho các tài khoản đã nhập + sync_start_date_help: Chọn khoảng thời gian lịch sử giao dịch bạn muốn đồng bộ. Tối đa 3 năm lịch sử có sẵn. + sync_start_date_label: "Bắt đầu đồng bộ giao dịch từ:" + title: Thiết lập tài khoản Sophtron của bạn + complete_account_setup: + all_skipped: "Tất cả tài khoản đã bị bỏ qua. Không có tài khoản nào được tạo." + creation_failed: "Tạo tài khoản thất bại" + api_error: "Lỗi kết nối API" + unexpected_error: "Đã xảy ra lỗi không mong muốn" + no_accounts: "Không có tài khoản nào để thiết lập." + success: "Đã tạo thành công %{count} tài khoản." + sync: + already_running: Đồng bộ thủ công Sophtron đang chạy. + api_error: "Đồng bộ thủ công Sophtron thất bại: %{message}" + failed: Đồng bộ thủ công Sophtron thất bại + no_linked_accounts: Tổ chức Sophtron này không có tài khoản nào được liên kết để đồng bộ. + processing_failed: Đồng bộ thủ công Sophtron không thể xử lý các giao dịch đã làm mới. + success: Đã bắt đầu đồng bộ + toggle_manual_sync: + success_disabled: Tổ chức Sophtron sẽ đồng bộ tự động. + success_enabled: Tổ chức Sophtron hiện yêu cầu đồng bộ thủ công. + manual_sync_complete: + close: Đóng + description: Số dư tài khoản sẽ được cập nhật xong trong nền. + message: Các giao dịch đã được tải xuống sau khi xác minh Sophtron. + title: Đã bắt đầu đồng bộ Sophtron + sophtron_setup_required: + title: Cần thiết lập Sophtron + message: > + Để hoàn tất thiết lập kết nối Sophtron của bạn, vui lòng đến trang Cài đặt nhà cung cấp và làm theo hướng dẫn để ủy quyền và cấu hình kết nối Sophtron. + go_to_provider_settings: Đi đến Cài đặt nhà cung cấp + heading: "ID người dùng và Khóa truy cập chưa được cấu hình" + description: "Trước khi liên kết tài khoản Sophtron, bạn cần cấu hình ID người dùng và Khóa truy cập Sophtron." + setup_steps_title: "Các bước thiết lập:" + step_1_html: "Đi đến Cài đặt → Nhà cung cấp đồng bộ ngân hàng" + step_2_html: "Tìm phần Sophtron" + step_3_html: "Nhập ID người dùng và Khóa truy cập Sophtron của bạn" + step_4: "Quay lại đây để liên kết tài khoản" + api_error: + title: "Lỗi kết nối Sophtron" + unable_to_connect: "Không thể kết nối với Sophtron" + institution_unable_to_connect: "Không thể kết nối với tổ chức" + common_issues_title: "Các vấn đề thường gặp:" + incorrect_user_id: "ID người dùng không chính xác: Xác minh ID người dùng trong Cài đặt nhà cung cấp" + invalid_access_key: "Khóa truy cập không hợp lệ: Kiểm tra Khóa truy cập trong Cài đặt nhà cung cấp" + expired_credentials: "Thông tin xác thực hết hạn: Tạo ID người dùng và Khóa truy cập mới từ Sophtron" + network_issue: "Sự cố mạng: Kiểm tra kết nối internet của bạn" + service_down: "Dịch vụ gián đoạn: API Sophtron có thể tạm thời không khả dụng" + bad_credentials: "Thông tin ngân hàng: Kiểm tra tên đăng nhập và mật khẩu có chính xác không" + verification_code: "Mã xác minh: Đảm bảo đã nhập mã mới nhất trước khi hết hạn" + institution_timeout: "Hết thời gian tổ chức: Trang đăng nhập ngân hàng không hoàn tất kịp thời" + unsupported_mfa: "Hỗ trợ MFA: Sophtron có thể không hỗ trợ quy trình xác minh hiện tại của tổ chức này" + check_provider_settings: "Kiểm tra Cài đặt nhà cung cấp" + try_again: "Thử kết nối lại" + select_option: "Chọn %{type}" + subtype: "loại phụ" + type: "loại" + sophtron_panel: + setup_instructions_title: "Hướng dẫn thiết lập:" + setup_instructions: + step_1_html: 'Truy cập Sophtron để lấy thông tin xác thực API' + step_2: "Sao chép ID người dùng và Khóa truy cập từ cài đặt tài khoản Sophtron" + step_3: "Dán thông tin xác thực bên dưới và nhấn Lưu; Sure sẽ tự động tạo hoặc tái sử dụng ID khách hàng Sophtron" + field_descriptions_title: "Mô tả các trường:" + field_descriptions: + user_id_html: "ID người dùng: Thông tin xác thực ID người dùng Sophtron của bạn" + access_key_html: "Khóa truy cập: Thông tin xác thực Khóa truy cập Sophtron của bạn" + base_url_html: "URL cơ sở: URL endpoint API Sophtron, thường là https://api.sophtron.com/api" + fields: + user_id: + label: "ID người dùng" + placeholder_new: "Dán ID người dùng Sophtron của bạn" + placeholder_edit: "••••••••" + access_key: + label: "Khóa truy cập" + placeholder_new: "Dán Khóa truy cập Sophtron của bạn" + placeholder_edit: "••••••••" + base_url: + label: "URL cơ sở" + placeholder: "https://api.sophtron.com/api" + save: "Lưu cấu hình" + update: "Cập nhật cấu hình" + syncer: + manual_sync_required: "Cần đồng bộ thủ công Sophtron cho tổ chức này; bỏ qua các tài khoản đó trong quá trình đồng bộ tự động." + importing_accounts: "Đang nhập tài khoản từ Sophtron..." + checking_account_configuration: "Đang kiểm tra cấu hình tài khoản..." + accounts_need_setup: "%{count} tài khoản cần thiết lập" + processing_transactions: "Đang xử lý giao dịch cho các tài khoản đã liên kết..." + calculating_balances: "Đang tính toán số dư cho các tài khoản đã liên kết..." + sophtron_entry: + processor: + unknown_transaction: "Giao dịch không xác định" + render_connection_timeout: + timeout: "Kết nối hết thời gian chờ. Vui lòng thử lại." + redirect_after_account_link: + invalid_account_names: + one: "Không thể liên kết %{count} tài khoản không có tên" + other: "Không thể liên kết %{count} tài khoản không có tên" + partial_invalid: "Đã liên kết %{created_count} tài khoản. %{already_linked_count} đã liên kết, %{invalid_count} có tên không hợp lệ." + partial_success: "Đã liên kết %{created_count} tài khoản. %{already_linked_count} tài khoản đã được liên kết." + success: + one: "Đã liên kết thành công %{count} tài khoản." + other: "Đã liên kết thành công %{count} tài khoản." + all_already_linked: + one: "Tài khoản đã chọn đã được liên kết" + other: "Tất cả %{count} tài khoản đã chọn đã được liên kết" + link_failed: "Liên kết tài khoản thất bại" + start_manual_sync: + already_running: "Đồng bộ đang chạy." + no_linked_accounts: "Không có tài khoản nào được liên kết để đồng bộ." + api_error: "Lỗi API: %{message}" + start_manual_sync_for_account: + failed: "Đồng bộ tài khoản thất bại" diff --git a/config/locales/views/splits/vi.yml b/config/locales/views/splits/vi.yml new file mode 100644 index 000000000..cbd5fad7b --- /dev/null +++ b/config/locales/views/splits/vi.yml @@ -0,0 +1,47 @@ +--- +vi: + splits: + new: + title: Chia nhỏ giao dịch + description: Chia giao dịch này thành nhiều mục với các danh mục và số tiền khác nhau. + submit: Chia nhỏ giao dịch + cancel: Hủy + add_row: Thêm phần chia + remove_row: Xóa + remaining: Còn lại + amounts_must_match: Tổng số tiền chia phải bằng số tiền giao dịch ban đầu. + name_label: Tên + name_placeholder: Tên phần chia + amount_label: Số tiền + category_label: Danh mục + uncategorized: "(chưa phân loại)" + original_name: "Tên:" + original_date: "Ngày:" + original_amount: "Số tiền" + split_number: "Phần #%{number}" + create: + success: Giao dịch đã được chia nhỏ thành công + not_splittable: Giao dịch này không thể chia nhỏ. + destroy: + success: Giao dịch đã được khôi phục thành công + show: + title: Các mục đã chia + description: Giao dịch này đã được chia thành các mục sau. + button_title: Chia nhỏ giao dịch + button_description: Chia giao dịch này thành nhiều mục với các danh mục và số tiền khác nhau. + button: Chia nhỏ + unsplit_title: Hủy chia nhỏ giao dịch + unsplit_button: Hủy chia nhỏ + unsplit_confirm: Thao tác này sẽ xóa tất cả các mục đã chia và khôi phục giao dịch ban đầu. + edit: + title: Chỉnh sửa phần chia + description: Chỉnh sửa các mục đã chia cho giao dịch này. + submit: Cập nhật phần chia + not_split: Giao dịch này chưa được chia nhỏ. + update: + success: Phần chia đã được cập nhật thành công + child: + title: Một phần của giao dịch chia nhỏ + description: Mục này là một phần của giao dịch đã chia nhỏ. + edit_split: Chỉnh sửa phần chia + unsplit: Hủy chia nhỏ diff --git a/config/locales/views/subscriptions/vi.yml b/config/locales/views/subscriptions/vi.yml new file mode 100644 index 000000000..06c136c0f --- /dev/null +++ b/config/locales/views/subscriptions/vi.yml @@ -0,0 +1,24 @@ +--- +vi: + subscriptions: + self_hosted_alert: "%{product_name} không khả dụng ở chế độ tự lưu trữ." + upgrade: + already_contributing: Bạn đã đang đóng góp. Cảm ơn bạn! + page_title: "Nâng cấp" + account_settings: "Cài đặt tài khoản" + sign_out: "Đăng xuất" + contribute_and_support_sure: "Đóng góp và hỗ trợ Sure" + cta: "Tiếp tục hỗ trợ sự phát triển của codebase này!" + header: + support: "Hỗ trợ" + sure: "Sure" + today: "hôm nay" + redirect_to_stripe: "Ở bước tiếp theo, bạn sẽ được chuyển hướng đến Stripe để xử lý thẻ tín dụng." + trialing: "Dữ liệu của bạn sẽ bị xóa trong %{days} ngày" + trial_over: "Thời gian dùng thử của bạn đã kết thúc" + create: + welcome: "Chào mừng đến với Sure!" + trial_already_used: "Bạn đã bắt đầu hoặc hoàn thành một lần dùng thử. Vui lòng nâng cấp để tiếp tục." + success: + welcome_with_contribution: "Chào mừng đến với Sure! Sự đóng góp của bạn được đánh giá cao." + contribution_failed: "Đã xảy ra sự cố khi xử lý đóng góp của bạn. Vui lòng thử lại." diff --git a/config/locales/views/tag/deletions/vi.yml b/config/locales/views/tag/deletions/vi.yml new file mode 100644 index 000000000..0a63ca01e --- /dev/null +++ b/config/locales/views/tag/deletions/vi.yml @@ -0,0 +1,14 @@ +--- +vi: + tag: + deletions: + create: + deleted: Nhãn đã được xóa + new: + delete_and_leave_uncategorized: Xóa "%{tag_name}" + delete_and_recategorize: Xóa "%{tag_name}" và gán nhãn mới + delete_and_reassign: Xóa và gán lại + delete_tag: Xóa nhãn? + explanation: "%{tag_name} sẽ bị xóa khỏi các giao dịch và các thực thể có thể gắn nhãn khác. Thay vì để chúng không có nhãn, bạn cũng có thể gán một nhãn mới bên dưới." + replacement_tag_prompt: Chọn nhãn + tag: Nhãn diff --git a/config/locales/views/tags/vi.yml b/config/locales/views/tags/vi.yml new file mode 100644 index 000000000..5c4952c48 --- /dev/null +++ b/config/locales/views/tags/vi.yml @@ -0,0 +1,26 @@ +--- +vi: + tags: + create: + created: Nhãn đã được tạo + error: 'Lỗi khi tạo nhãn: %{error}' + destroy: + deleted: Nhãn đã được xóa + destroy_all: + all_deleted: Tất cả nhãn đã được xóa + edit: + edit: Chỉnh sửa nhãn + form: + placeholder: Tên nhãn + index: + empty: Chưa có nhãn nào + new: Nhãn mới + tags: Nhãn + delete_all: Xóa tất cả + new: + new: Nhãn mới + tag: + delete: Xóa + edit: Chỉnh sửa + update: + updated: Nhãn đã được cập nhật diff --git a/config/locales/views/trades/vi.yml b/config/locales/views/trades/vi.yml new file mode 100644 index 000000000..3bd370c16 --- /dev/null +++ b/config/locales/views/trades/vi.yml @@ -0,0 +1,57 @@ +--- +vi: + trades: + form: + account: Tài khoản chuyển (tùy chọn) + account_prompt: Tìm kiếm tài khoản + amount: Số tiền + fee: Phí giao dịch + holding: Mã ticker + holding_optional: Mã ticker (tùy chọn) + price: Giá mỗi cổ phiếu + qty: Số lượng + submit: Thêm giao dịch + ticker_placeholder: AAPL + type: Loại + type_buy: Mua + type_sell: Bán + type_deposit: Nạp tiền + type_withdrawal: Rút tiền + type_dividend: Cổ tức + type_interest: Lãi + dividend_requires_security: Cổ tức yêu cầu phải có chứng khoán + header: + buy: Mua + sell: Bán + dividend: Cổ tức + interest: Lãi + current_market_price_label: Giá thị trường hiện tại + overview: Tổng quan + purchase_price_label: Giá mua + purchase_qty_label: Số lượng mua + symbol_label: Mã chứng khoán + total_return_label: Lãi/lỗ chưa thực hiện + new: + title: Giao dịch mới + show: + additional: Bổ sung + amount_label: Số tiền + buy: Mua + category_label: Danh mục + cost_per_share_label: Giá mỗi cổ phiếu + date_label: Ngày + delete: Xóa + fee_label: Phí giao dịch + delete_subtitle: Hành động này không thể hoàn tác + delete_title: Xóa giao dịch chứng khoán + details: Chi tiết + provider_disabled_warning: "Cập nhật giá tạm dừng — nhà cung cấp %{provider} đã bị tắt. Bật lại trong Cài đặt hoặc ánh xạ lại danh mục nắm giữ sang nhà cung cấp khác." + exclude_subtitle: Giao dịch này sẽ không được đưa vào báo cáo và tính toán + exclude_title: Loại trừ khỏi phân tích + no_category: Không có danh mục + note_label: Ghi chú + note_placeholder: Thêm ghi chú bổ sung tại đây... + quantity_label: Số lượng + sell: Bán + settings: Cài đặt + type_label: Loại diff --git a/config/locales/views/transactions/vi.yml b/config/locales/views/transactions/vi.yml new file mode 100644 index 000000000..0be994d36 --- /dev/null +++ b/config/locales/views/transactions/vi.yml @@ -0,0 +1,340 @@ +--- +vi: + transactions: + bulk_updates: + new: + cancel: Hủy + category_label: Danh mục + category_prompt: Chọn danh mục + date_label: Ngày + header_title: Chỉnh sửa giao dịch + merchant_label: Nhà cung cấp + merchant_prompt: Chọn nhà cung cấp + name_label: Tên + name_placeholder: Nhập tên sẽ được áp dụng cho các giao dịch đã chọn + none: "(không có)" + notes_label: Ghi chú + notes_placeholder: Nhập ghi chú sẽ được áp dụng cho các giao dịch đã chọn + overview: Tổng quan + save: Lưu + tags_label: Nhãn + transactions_section: Giao dịch + unknown_name: Giao dịch không xác định + selection_bar: + duplicate: Nhân đôi + edit: Chỉnh sửa + selected: đã chọn + form: + details: Chi tiết + account: Tài khoản + account_prompt: Chọn tài khoản + amount: Số tiền + category: Danh mục + category_label: Danh mục + category_prompt: Chọn danh mục + date: Ngày + description: Mô tả + description_placeholder: Mô tả giao dịch + expense: Chi tiêu + income: Thu nhập + merchant_label: Nhà cung cấp + none: (không có) + note_label: Ghi chú + note_placeholder: Nhập ghi chú + submit: Thêm giao dịch + tags_label: Nhãn + transfer: Chuyển khoản + create: + created: Đã tạo giao dịch + update: + updated: Đã cập nhật giao dịch + new: + new_transaction: Giao dịch mới + show: + keep_both: Không, giữ cả hai + loan_payment: Thanh toán khoản vay + mark_recurring: Đánh dấu là định kỳ + mark_recurring_subtitle: Theo dõi giao dịch định kỳ này. Mức biến động được tự động tính từ 6 tháng giao dịch tương tự. + mark_recurring_title: Giao dịch định kỳ + merge_duplicate: Có, gộp lại + potential_duplicate_description: Giao dịch đang chờ này có thể giống với giao dịch đã đăng bên dưới. Nếu vậy, hãy gộp lại để tránh tính hai lần. + potential_duplicate_title: Phát hiện trùng lặp có thể + transfer: Chuyển khoản + account_label: Tài khoản + amount: Số tiền + category_label: Danh mục + date_label: Ngày + delete: Xóa + delete_subtitle: Thao tác này xóa vĩnh viễn giao dịch, ảnh hưởng số dư lịch sử và không thể hoàn tác. + delete_title: Xóa giao dịch + details: Chi tiết + attachments: Tệp đính kèm + exclude: Loại trừ + exclude_description: Giao dịch bị loại trừ sẽ bị xóa khỏi tính toán ngân sách và báo cáo. + activity_type: Loại hoạt động + activity_type_description: Loại hoạt động đầu tư (Mua, Bán, Cổ tức, v.v.). Tự động phát hiện hoặc đặt thủ công. + one_time_title: "%{type} một lần" + one_time_description: Giao dịch một lần sẽ bị loại trừ khỏi một số tính toán ngân sách và báo cáo. + convert_to_trade_title: Chuyển đổi thành giao dịch chứng khoán + convert_to_trade_description: Chuyển giao dịch này thành giao dịch Mua hoặc Bán với thông tin chứng khoán để theo dõi danh mục. + convert_to_trade_button: Chuyển đổi thành giao dịch + transfer_matcher_description: Kết nối giao dịch này với giao dịch đối ứng trong tài khoản khác. + pending_duplicate_merger_title: Trùng lặp với giao dịch đã đăng? + pending_duplicate_merger_description: Gộp thủ công giao dịch đang chờ này với phiên bản đã đăng. + pending_duplicate_merger_button: Mở công cụ gộp + merchant_label: Nhà cung cấp + name_label: Tên + nature: Loại + none: "(không có)" + note_label: Ghi chú + note_placeholder: Nhập ghi chú + overview: Tổng quan + settings: Cài đặt + tags_label: Nhãn + tab_transactions: Giao dịch + tab_upcoming: Sắp tới + uncategorized: "(chưa phân loại)" + additional_details: "Thông tin bổ sung" + payee: "Người nhận" + description: "Mô tả" + memo: "Ghi nhớ" + provider_extras: "Thông tin nhà cung cấp" + transfer_or_debt_payment: "Chuyển khoản hay Thanh toán nợ?" + open_matcher: "Mở công cụ khớp" + convert: "Chuyển đổi" + activity_labels: + buy: Mua + sell: Bán + sweep_in: Chuyển vào + sweep_out: Chuyển ra + dividend: Cổ tức + reinvestment: Tái đầu tư + interest: Lãi + fee: Phí + transfer: Chuyển khoản + contribution: Đóng góp + withdrawal: Rút tiền + exchange: Trao đổi + other: Khác + mark_recurring: Đánh dấu là định kỳ + mark_recurring_subtitle: Theo dõi giao dịch định kỳ này. Mức biến động được tự động tính từ 6 tháng giao dịch tương tự. + mark_recurring_title: Giao dịch định kỳ + potential_duplicate_title: Phát hiện trùng lặp có thể + potential_duplicate_description: Giao dịch đang chờ này có thể giống với giao dịch đã đăng bên dưới. Nếu vậy, hãy gộp lại để tránh tính hai lần. + merge_duplicate_button: Có, gộp lại + keep_both: Không, giữ cả hai + split_parent_row: + split_label: "Phân chia" + transfer_match: + auto_matched: Tự động khớp + auto_matched_short: T/K + confirm_match: Xác nhận khớp + payment_confirmed: Thanh toán đã được xác nhận + reject_match: Từ chối khớp + transfer_confirmed: Chuyển khoản đã được xác nhận + transaction: + pending: Đang chờ + pending_tooltip: Giao dịch đang chờ — có thể thay đổi khi được đăng + linked_with_provider: Liên kết với %{provider} + activity_type_tooltip: Loại hoạt động đầu tư + possible_duplicate: Trùng lặp? + potential_duplicate_tooltip: Đây có thể là giao dịch trùng lặp + review_recommended: Xem xét + review_recommended_tooltip: Chênh lệch số tiền lớn — nên xem xét để kiểm tra trùng lặp + split: Phân chia + split_tooltip: Giao dịch này đã được phân chia thành nhiều mục + split_child_tooltip: Một phần của giao dịch phân chia + merge_duplicate: + success: Đã gộp giao dịch thành công + failure: Không thể gộp giao dịch + dismiss_duplicate: + success: Giữ nguyên là các giao dịch riêng biệt + failure: Không thể bỏ qua đề xuất trùng lặp + pending_duplicate_merge: + possible_duplicate: Trùng lặp? + possible_duplicate_short: Trùng? + review_recommended: Xem xét + review_recommended_short: Xem + confirm_title: "Gộp với giao dịch đã đăng (%{posted_amount})" + reject_title: Giữ nguyên là các giao dịch riêng biệt + summary: + total_transactions: Tổng giao dịch + income: Thu nhập + expenses: Chi tiêu + inflow: Dòng tiền vào + outflow: Dòng tiền ra + header: + edit_categories: Chỉnh sửa danh mục + edit_imports: Chỉnh sửa nhập dữ liệu + edit_merchants: Chỉnh sửa nhà cung cấp + edit_tags: Chỉnh sửa nhãn + import: Nhập + index: + title: "Giao dịch" + transaction: giao dịch + transactions: giao dịch + import: Nhập + new_rule: "Quy tắc mới" + edit_rules: "Chỉnh sửa quy tắc" + edit_categories: "Chỉnh sửa danh mục" + edit_tags: "Chỉnh sửa nhãn" + edit_merchants: "Chỉnh sửa nhà cung cấp" + edit_imports: "Chỉnh sửa nhập dữ liệu" + new_transaction: "Giao dịch mới" + categorize_button: + one: "Phân loại (1)" + other: "Phân loại (%{count})" + categorizes: + show: + exit: "Thoát" + skip: "Bỏ qua" + remaining: + one: "Còn 1 giao dịch chưa phân loại" + other: "Còn %{count} giao dịch chưa phân loại" + transaction_count: + one: "1 giao dịch" + other: "%{count} giao dịch" + transactions_hint: "Bỏ chọn để loại trừ giao dịch, hoặc gán danh mục khác trực tiếp trong hàng." + assign_category: "Gán danh mục" + assign_category_prompt: "→ gán" + filter_placeholder: "Tìm kiếm danh mục..." + col_transaction: "Giao dịch" + col_date: "Ngày" + col_amount: "Số tiền" + col_category: "Danh mục" + type_income: "Thu nhập" + type_expense: "Chi tiêu" + create_rule_label: "Tạo quy tắc phân loại" + rule_description_prefix: "Các giao dịch %{type} trong tương lai có tên chứa" + rule_description_suffix: "cũng nên được gán danh mục này." + no_categories: "Không có danh mục phù hợp" + all_done: "Tất cả giao dịch đã được phân loại" + create: + categorized: + one: "1 giao dịch đã được phân loại" + other: "%{count} giao dịch đã được phân loại" + rule_creation_failed: "Giao dịch đã được phân loại, nhưng không thể tạo quy tắc (có thể đã tồn tại)." + entry_row: + include_checkbox: "Bao gồm %{name}" + assign_category_select: "Gán danh mục cho %{name}" + list: + drag_drop_title: Thả CSV để nhập + drag_drop_subtitle: Tải lên giao dịch trực tiếp + transaction: giao dịch + transactions: giao dịch + toggle_recurring_section: Bật/tắt giao dịch định kỳ sắp tới + search: + filters: + account: Tài khoản + date: Ngày + type: Loại + status: Trạng thái + amount: Số tiền + category: Danh mục + tag: Nhãn + merchant: Nhà cung cấp + convert_to_trade: + title: Chuyển đổi thành giao dịch chứng khoán + description: Chuyển giao dịch này thành giao dịch với thông tin chứng khoán + date_label: "Ngày:" + account_label: "Tài khoản:" + amount_label: "Số tiền:" + security_label: Chứng khoán + security_prompt: Chọn chứng khoán... + security_custom: "+ Nhập mã ticker tùy chỉnh" + security_not_listed_hint: Không thấy chứng khoán? Chọn "Nhập mã ticker tùy chỉnh" ở cuối danh sách. + ticker_placeholder: AAPL + ticker_hint: "Nhập mã cổ phiếu/ETF (ví dụ: AAPL, MSFT)" + ticker_search_placeholder: Tìm kiếm mã ticker... + ticker_search_hint: Tìm theo mã ticker hoặc tên công ty, hoặc nhập mã ticker tùy chỉnh + price_mismatch_title: Giá có thể không khớp + price_mismatch_message: "Giá của bạn (%{entered_price}/cổ phiếu) khác đáng kể so với giá thị trường hiện tại của %{ticker} (%{market_price}). Nếu có vẻ sai, bạn có thể đã chọn nhầm chứng khoán — thử \"Nhập mã ticker tùy chỉnh\"." + quantity_label: Số lượng (Cổ phiếu) + quantity_placeholder: ví dụ 20 + quantity_hint: Số cổ phiếu giao dịch + price_label: Giá mỗi cổ phiếu + price_placeholder: ví dụ 52.15 + price_hint: Giá mỗi cổ phiếu (%{currency}) + qty_or_price_hint: Nhập ít nhất số lượng HOẶC giá. Giá trị còn lại sẽ được tính từ số tiền giao dịch (%{amount}). + trade_type_label: Loại giao dịch + trade_type_hint: Mua hoặc Bán cổ phiếu của một chứng khoán + exchange_label: Sàn giao dịch (Tùy chọn) + exchange_placeholder: XNAS + exchange_hint: Để trống để tự động phát hiện + cancel: Hủy + submit: Chuyển đổi thành giao dịch + success: Giao dịch đã được chuyển đổi thành giao dịch chứng khoán + conversion_note: "Chuyển đổi từ giao dịch: %{original_name} (%{original_date})" + errors: + not_investment_account: Chỉ giao dịch trong tài khoản đầu tư mới có thể chuyển đổi + already_converted: Giao dịch này đã được chuyển đổi hoặc loại trừ + enter_ticker: Vui lòng nhập mã ticker + security_not_found: Chứng khoán đã chọn không còn tồn tại. Vui lòng chọn chứng khoán khác. + select_security: Vui lòng chọn hoặc nhập chứng khoán + enter_qty_or_price: Vui lòng nhập số lượng hoặc giá mỗi cổ phiếu. Giá trị còn lại sẽ được tính từ số tiền giao dịch. + invalid_qty_or_price: Số lượng hoặc giá không hợp lệ. Vui lòng nhập giá trị dương hợp lệ. + conversion_failed: "Chuyển đổi giao dịch thất bại: %{error}" + unexpected_error: "Lỗi không mong muốn trong quá trình chuyển đổi: %{error}" + searches: + filters: + date_filter: + start_date: "Ngày bắt đầu" + end_date: "Ngày kết thúc" + amount_filter: + equal_to: Bằng + greater_than: Lớn hơn + less_than: Nhỏ hơn + placeholder: '0' + badge: + expense: Chi tiêu + income: Thu nhập + on_or_after: từ ngày %{date} trở đi + on_or_before: đến ngày %{date} + transfer: Chuyển khoản + confirmed: Đã xác nhận + pending: Đang chờ + type_filter: + expense: Chi tiêu + income: Thu nhập + transfer: Chuyển khoản + status_filter: + confirmed: Đã xác nhận + pending: Đang chờ + menu: + account_filter: Tài khoản + amount_filter: Số tiền + apply: Áp dụng + cancel: Hủy + category_filter: Danh mục + clear_filters: Xóa bộ lọc + date_filter: Ngày + merchant_filter: Nhà cung cấp + status_filter: Trạng thái + tag_filter: Nhãn + type_filter: Loại + search: + equal_to: bằng + greater_than: lớn hơn + less_than: nhỏ hơn + form: + toggle_selection_checkboxes: Bật/tắt tất cả ô chọn + search_placeholder: "Tìm kiếm giao dịch ..." + filter: "Lọc" + attachments: + cannot_exceed: "Không được vượt quá %{count} tệp đính kèm mỗi giao dịch" + uploaded_one: "Đã tải lên tệp đính kèm thành công" + uploaded_many: "Đã tải lên %{count} tệp đính kèm thành công" + failed_upload: "Tải lên tệp đính kèm thất bại: %{error}" + no_files_selected: "Chưa chọn tệp để tải lên" + attachment_deleted: "Đã xóa tệp đính kèm thành công" + failed_delete: "Xóa tệp đính kèm thất bại: %{error}" + upload_failed: "Tải lên tệp đính kèm thất bại. Vui lòng thử lại hoặc liên hệ hỗ trợ." + delete_failed: "Xóa tệp đính kèm thất bại. Vui lòng thử lại hoặc liên hệ hỗ trợ." + upload: "Tải lên" + no_attachments: "Chưa có tệp đính kèm" + select_up_to: "Chọn tối đa %{count} tệp (ảnh hoặc PDF, tối đa %{size}MB mỗi tệp) • %{used}/%{count} đã dùng" + files: + one: "Tệp (1)" + other: "Tệp (%{count})" + browse_to_add: "Duyệt để thêm tệp" + max_reached: "Đã đạt giới hạn tệp tối đa (%{count}/%{max}). Xóa tệp hiện có để tải lên tệp khác." diff --git a/config/locales/views/transfer_matches/vi.yml b/config/locales/views/transfer_matches/vi.yml new file mode 100644 index 000000000..f63ecd84d --- /dev/null +++ b/config/locales/views/transfer_matches/vi.yml @@ -0,0 +1,24 @@ +--- +vi: + transfer_matches: + create: + success: Chuyển khoản đã được tạo + new: + header: + title: Khớp chuyển khoản hoặc thanh toán + subtitle: Khớp giao dịch tương ứng trong tài khoản khác hoặc tạo mới nếu chưa tồn tại. + from_account: Tài khoản nguồn + from_account_named: "Tài khoản nguồn: %{name}" + to_account: Tài khoản đích + to_account_named: "Tài khoản đích: %{name}" + outflow_transaction: Giao dịch chi ra + inflow_transaction: Giao dịch thu vào + create_transfer_match: Tạo khớp chuyển khoản + matching_fields: + select_method: Chọn phương thức khớp giao dịch của bạn. + match_existing_recommended: Khớp giao dịch hiện có (khuyến nghị) + create_new_transaction: Tạo giao dịch mới + matching_method: Phương thức khớp + matching_transaction: Giao dịch khớp + target_account: Tài khoản đích + no_matching_transactions: Chúng tôi không tìm thấy giao dịch nào để khớp từ các tài khoản khác của bạn. Vui lòng chọn một tài khoản và chúng tôi sẽ tạo giao dịch thu vào mới cho bạn. diff --git a/config/locales/views/transfers/vi.yml b/config/locales/views/transfers/vi.yml new file mode 100644 index 000000000..05c23cf04 --- /dev/null +++ b/config/locales/views/transfers/vi.yml @@ -0,0 +1,47 @@ +--- +vi: + transfers: + create: + success: Chuyển khoản đã được tạo + destroy: + success: Chuyển khoản đã được xóa + form: + amount: Số tiền + calculate_rate_tab: Tính tỷ giá ngoại hối + convert_tab: Chuyển đổi với tỷ giá ngoại hối + date: Ngày + destination_amount: Số tiền đích + destination_amount_display: "Số tiền đích: %{amount}" + exchange_rate: Tỷ giá + exchange_rate_display: "Tỷ giá: %{rate}" + exchange_rate_help: Chọn cách nhập số tiền chuyển khoản. + expense: Chi tiêu + from: Từ + income: Thu nhập + select_account: Chọn tài khoản + source_amount: Số tiền nguồn + submit: Tạo chuyển khoản + to: Đến + transfer: Chuyển khoản + new: + title: Chuyển khoản mới + show: + delete: Xóa chuyển khoản + delete_subtitle: Thao tác này sẽ xóa chuyển khoản. Các giao dịch liên quan sẽ không bị xóa. + delete_title: Xóa chuyển khoản? + details: Chi tiết + mark_recurring: Đánh dấu là định kỳ + mark_recurring_subtitle: Theo dõi chuyển khoản này như một mẫu định kỳ trong nguồn cấp sắp tới và trang định kỳ. + mark_recurring_title: Đánh dấu chuyển khoản là định kỳ + note_label: Ghi chú + note_placeholder: Thêm ghi chú cho chuyển khoản này + overview: Tổng quan + settings: Cài đặt + from: Từ + to: Đến + date: Ngày + amount: Số tiền + category: Danh mục + uncategorized: Chưa phân loại + update: + success: Chuyển khoản đã được cập nhật diff --git a/config/locales/views/users/vi.yml b/config/locales/views/users/vi.yml new file mode 100644 index 000000000..805405f6d --- /dev/null +++ b/config/locales/views/users/vi.yml @@ -0,0 +1,29 @@ +--- +vi: + users: + destroy: + success: Tài khoản của bạn đã được xóa. + update: + email_change_failed: Không thể thay đổi địa chỉ email. + email_change_initiated: Vui lòng kiểm tra địa chỉ email mới của bạn để xác nhận thay đổi. + success: Hồ sơ của bạn đã được cập nhật. + resend_confirmation_email: + success: Email xác nhận mới đã được xếp vào hàng chờ gửi. + no_pending_change: Hiện không có thay đổi email nào đang chờ xử lý! + reset: + success: Tài khoản của bạn đã được đặt lại. Dữ liệu sẽ được xóa trong nền sau một thời gian. + unauthorized: Bạn không được phép thực hiện hành động này + reset_with_sample_data: + success: Tài khoản của bạn đã được đặt lại và dữ liệu mẫu đang được chuẩn bị. Bạn sẽ thấy dữ liệu demo trong giây lát. + roles: + admin: Quản trị viên + member: Thành viên + super_admin: Quản trị viên cấp cao + user_menu: + aria_label: Mở menu tài khoản + version: Phiên bản + settings: Cài đặt + changelog: Nhật ký thay đổi + feedback: Phản hồi + contact: Liên hệ + log_out: Đăng xuất diff --git a/config/locales/views/valuations/vi.yml b/config/locales/views/valuations/vi.yml new file mode 100644 index 000000000..e5635bf4a --- /dev/null +++ b/config/locales/views/valuations/vi.yml @@ -0,0 +1,60 @@ +--- +vi: + valuations: + confirmation_contents: + this_will: "Thao tác này sẽ %{action_verb} giá trị tài khoản vào" + to_colon: "thành:" + total_account_value: Tổng giá trị tài khoản + holdings_value: Giá trị danh mục nắm giữ + brokerage_cash: Tiền mặt môi giới + account_balance: số dư tài khoản + credit_card_balance: số dư thẻ tín dụng + loan_balance: số dư khoản vay + property_value: giá trị bất động sản + vehicle_value: giá trị xe + crypto_balance: số dư tiền mã hóa + asset_value: giá trị tài sản + liability_balance: số dư nợ phải trả + balance: số dư + "on": "vào" + to: "thành" + recalculate_notice: "Tất cả giao dịch và số dư trong tương lai sẽ được tính lại dựa trên %{change_or_update} này." + change: thay đổi + update: cập nhật + create: + account_updated: Tài khoản đã được cập nhật + update: + account_updated: Tài khoản đã được cập nhật + entry_updated: Mục nhập đã được cập nhật + errors: + amount_required: Số tiền là bắt buộc + form: + amount: Số tiền + submit: Thêm cập nhật số dư + header: + balance: Số dư + index: + change: thay đổi + date: ngày + new_entry: Mục nhập mới + no_valuations: Chưa có định giá nào cho tài khoản này + valuations: Giá trị + value: giá trị + new: + title: Số dư mới + show: + amount: Số tiền + amount_label: Giá trị tài khoản vào ngày + date_label: Ngày + delete: Xóa + delete_subtitle: Hành động này không thể hoàn tác + delete_title: Xóa mục nhập + details: Chi tiết + name_label: Tên + name_placeholder: Nhập tên cho mục nhập này + note_label: Ghi chú + note_placeholder: Thêm bất kỳ thông tin chi tiết nào về mục nhập này + overview: Tổng quan + settings: Cài đặt + opening_balance: "Số dư đầu kỳ" + update_value: Cập nhật giá trị diff --git a/config/locales/views/vehicles/vi.yml b/config/locales/views/vehicles/vi.yml new file mode 100644 index 000000000..44d5a0522 --- /dev/null +++ b/config/locales/views/vehicles/vi.yml @@ -0,0 +1,35 @@ +--- +vi: + vehicles: + edit: + edit: Chỉnh sửa %{account} + form: + make: Hãng xe + make_placeholder: Toyota + mileage: Số dặm + mileage_placeholder: '15000' + mileage_unit: Đơn vị + model: Mẫu xe + model_placeholder: Camry + year: Năm sản xuất + year_placeholder: '2023' + new: + title: Nhập thông tin xe + overview: + current_price: Giá hiện tại + make_model: Hãng & Mẫu xe + mileage: Số dặm + purchase_price: Giá mua + trend: Xu hướng + unknown: Không xác định + year: Năm sản xuất + tabs: + overview: + current_price: Giá hiện tại + make_model: Hãng & Mẫu xe + mileage: Số dặm + purchase_price: Giá mua + trend: Xu hướng + unknown: Không xác định + year: Năm sản xuất + edit_account_details: "Chỉnh sửa thông tin tài khoản"