From 53ec79176317242c3a4ab86f1ad3193d97a8a1e9 Mon Sep 17 00:00:00 2001 From: Tuan Vu Date: Fri, 6 Mar 2026 00:38:07 +0700 Subject: [PATCH 1/2] Add Vietnamese Localization --- src/i18n/locales/vi.json | 1492 ++++++++++++++++++++++++++++++++++++++ src/i18n/resources.ts | 2 + 2 files changed, 1494 insertions(+) create mode 100644 src/i18n/locales/vi.json diff --git a/src/i18n/locales/vi.json b/src/i18n/locales/vi.json new file mode 100644 index 00000000..708a939d --- /dev/null +++ b/src/i18n/locales/vi.json @@ -0,0 +1,1492 @@ +{ + "common": { + "loading": "Đang tải...", + "cancel": "Huỷ", + "save": "Lưu", + "delete": "Xoá", + "edit": "Chỉnh sửa", + "search": "Tìm kiếm", + "error": "Lỗi", + "success": "Thành công", + "ok": "OK", + "unknown": "Không xác định", + "retry": "Thử lại", + "try_again": "Thử lại", + "go_back": "Quay lại", + "settings": "Cài đặt", + "close": "Đóng", + "enable": "Bật", + "disable": "Tắt", + "show_more": "Xem thêm", + "show_less": "Thu gọn", + "load_more": "Tải thêm", + "unknown_date": "Ngày không xác định", + "anonymous_user": "Người dùng khách", + "time": { + "now": "Vừa xong", + "minutes_ago": "{{count}} phút trước", + "hours_ago": "{{count}} giờ trước", + "days_ago": "{{count}} ngày trước" + }, + "days_short": { + "sun": "Chủ nhật", + "mon": "Thứ 2", + "tue": "Thứ 3", + "wed": "Thứ 4", + "thu": "Thứ 5", + "fri": "Thứ 6", + "sat": "Thứ 7" + }, + "email": "Email", + "status": "Trạng thái" + }, + "home": { + "categories": { + "movies": "Phim lẻ", + "series": "Phim bộ", + "channels": "Truyền hình" + }, + "movies": "Phim lẻ", + "tv_shows": "Chương trình truyền hình", + "load_more_catalogs": "Tải thêm danh mục", + "no_content": "Không có nội dung", + "add_catalogs": "Thêm danh mục", + "sign_in_available": "Đăng nhập ngay", + "sign_in_desc": "Bạn có thể đăng nhập bất cứ lúc nào trong Cài đặt → Tài khoản", + "view_all": "Xem tất cả", + "this_week": "Tuần này", + "upcoming": "Sắp chiếu", + "recently_released": "Vừa phát hành", + "no_scheduled_episodes": "Phim bộ chưa có lịch chiếu", + "check_back_later": "Quay lại sau nhé", + "continue_watching": "Xem tiếp", + "up_next": "Tiếp theo", + "up_next_caps": "TIẾP THEO", + "released": "Đã phát hành", + "new": "Mới", + "tba": "Chưa xác định", + "new_episodes": "{{count}} tập mới", + "season_short": "P{{season}}", + "episode_short": "T{{episode}}", + "season": "Phần {{season}}", + "episode": "Tập {{episode}}", + "movie": "Phim lẻ", + "series": "Phim bộ", + "tv_show": "Chương trình truyền hình", + "percent_watched": "Đã xem {{percent}}%", + "view_details": "Xem chi tiết", + "remove": "Xoá", + "play": "Phát", + "play_now": "Xem ngay", + "resume": "Xem tiếp", + "info": "Thông tin", + "more_info": "Thêm thông tin", + "my_list": "Danh sách của tôi", + "save": "Lưu", + "saved": "Đã lưu", + "retry": "Thử lại", + "install_addons": "Cài đặt Addon", + "settings": "Cài đặt", + "no_featured_content": "Không có nội dung nổi bật", + "couldnt_load_featured": "Không thể tải nội dung nổi bật", + "no_featured_desc": "Hãy cài đặt addon có danh mục hoặc thay đổi nguồn nội dung trong phần cài đặt.", + "load_error_desc": "Đã xảy ra sự cố khi tải nội dung nổi bật. Vui lòng kiểm tra kết nối và thử lại.", + "no_featured_available": "Không có nội dung nổi bật", + "no_description": "Chưa có mô tả" + }, + "navigation": { + "home": "Trang chủ", + "library": "Thư viện", + "search": "Tìm kiếm", + "downloads": "Tải về", + "settings": "Cài đặt" + }, + "search": { + "title": "Tìm kiếm", + "recent_searches": "Tìm kiếm gần đây", + "discover": "Khám phá", + "movies": "Phim lẻ", + "tv_shows": "Phim bộ", + "select_catalog": "Chọn danh mục", + "all_genres": "Tất cả thể loại", + "discovering": "Đang tải nội dung...", + "show_more": "Xem thêm ({{count}})", + "no_content_found": "Không tìm thấy nội dung", + "try_different": "Thử thể loại hoặc danh mục khác", + "select_catalog_desc": "Chọn một danh mục để khám phá", + "tap_catalog_desc": "Nhấn vào danh mục bên trên để bắt đầu", + "placeholder": "Tìm phim, chương trình...", + "keep_typing": "Tiếp tục nhập...", + "type_characters": "Nhập ít nhất 2 ký tự để tìm kiếm", + "no_results": "Không có kết quả", + "try_keywords": "Thử từ khoá khác hoặc kiểm tra chính tả", + "select_type": "Chọn loại", + "browse_movies": "Duyệt danh mục phim lẻ", + "browse_tv": "Duyệt danh mục phim bộ", + "select_genre": "Chọn thể loại", + "show_all_content": "Hiển thị tất cả nội dung", + "genres_count": "{{count}} thể loại" + }, + "library": { + "title": "Thư viện", + "watched": "Đã xem", + "continue": "Xem tiếp", + "watchlist": "Danh sách muốn xem", + "collection": "Bộ sưu tập", + "rated": "Đã đánh giá", + "items": "mục", + "trakt_collections": "Bộ sưu tập Trakt", + "trakt_collection": "Bộ sưu tập Trakt", + "no_trakt": "Chưa có bộ sưu tập Trakt", + "no_trakt_desc": "Bộ sưu tập Trakt của bạn sẽ hiển thị ở đây khi bạn bắt đầu sử dụng Trakt", + "load_collections": "Tải bộ sưu tập", + "empty_folder": "Không có nội dung trong {{folder}}", + "empty_folder_desc": "Bộ sưu tập này đang trống", + "refresh": "Làm mới", + "no_movies": "Chưa có phim lẻ", + "no_series": "Chưa có phim bộ", + "no_content": "Chưa có nội dung", + "add_content_desc": "Thêm nội dung vào thư viện để xem ở đây", + "find_something": "Tìm gì đó để xem", + "removed_from_library": "Đã xoá khỏi thư viện", + "item_removed": "Đã xoá khỏi thư viện của bạn", + "failed_update_library": "Cập nhật thư viện thất bại", + "unable_remove": "Không thể xoá khỏi thư viện", + "marked_watched": "Đã đánh dấu đã xem", + "marked_unwatched": "Đã đánh dấu chưa xem", + "item_marked_watched": "Đã đánh dấu là đã xem", + "item_marked_unwatched": "Đã đánh dấu là chưa xem", + "failed_update_watched": "Cập nhật trạng thái xem thất bại", + "unable_update_watched": "Không thể cập nhật trạng thái xem", + "added_to_library": "Đã thêm vào thư viện", + "item_added": "Đã thêm vào thư viện của bạn", + "add_to_library": "Thêm vào thư viện", + "remove_from_library": "Xoá khỏi thư viện", + "mark_watched": "Đánh dấu đã xem", + "mark_unwatched": "Đánh dấu chưa xem", + "share": "Chia sẻ", + "add_to_watchlist": "Thêm vào danh sách Trakt", + "remove_from_watchlist": "Xoá khỏi danh sách Trakt", + "added_to_watchlist": "Đã thêm vào danh sách", + "added_to_watchlist_desc": "Đã thêm vào danh sách muốn xem trên Trakt", + "removed_from_watchlist": "Đã xoá khỏi danh sách", + "removed_from_watchlist_desc": "Đã xoá khỏi danh sách muốn xem trên Trakt", + "add_to_collection": "Thêm vào bộ sưu tập Trakt", + "remove_from_collection": "Xoá khỏi bộ sưu tập Trakt", + "added_to_collection": "Đã thêm vào bộ sưu tập", + "added_to_collection_desc": "Đã thêm vào bộ sưu tập Trakt", + "removed_from_collection": "Đã xoá khỏi bộ sưu tập", + "removed_from_collection_desc": "Đã xoá khỏi bộ sưu tập Trakt" + }, + "metadata": { + "unable_to_load": "Không thể tải nội dung", + "error_code": "Mã lỗi: {{code}}", + "content_not_found": "Không tìm thấy nội dung", + "content_not_found_desc": "Nội dung này không tồn tại hoặc đã bị xoá.", + "server_error": "Lỗi máy chủ", + "server_error_desc": "Máy chủ tạm thời không khả dụng. Vui lòng thử lại sau.", + "bad_gateway": "Cổng kết nối lỗi", + "bad_gateway_desc": "Máy chủ đang gặp sự cố. Vui lòng thử lại sau.", + "service_unavailable": "Dịch vụ không khả dụng", + "service_unavailable_desc": "Dịch vụ đang bảo trì. Vui lòng thử lại sau.", + "too_many_requests": "Quá nhiều yêu cầu", + "too_many_requests_desc": "Bạn đang gửi quá nhiều yêu cầu. Vui lòng đợi một chút rồi thử lại.", + "request_timeout": "Hết thời gian yêu cầu", + "request_timeout_desc": "Yêu cầu mất quá nhiều thời gian. Vui lòng thử lại.", + "network_error": "Lỗi mạng", + "network_error_desc": "Vui lòng kiểm tra kết nối internet và thử lại.", + "auth_error": "Lỗi xác thực", + "auth_error_desc": "Vui lòng kiểm tra cài đặt tài khoản và thử lại.", + "access_denied": "Truy cập bị từ chối", + "access_denied_desc": "Bạn không có quyền truy cập nội dung này.", + "connection_error": "Lỗi kết nối", + "streams_unavailable": "Không có luồng phát", + "streams_unavailable_desc": "Nguồn phát hiện tại không khả dụng. Vui lòng thử lại sau.", + "unknown_error": "Lỗi không xác định", + "something_went_wrong": "Đã xảy ra sự cố. Vui lòng thử lại.", + "cast": "Diễn viên", + "more_like_this": "Có thể bạn thích", + "collection": "Bộ sưu tập", + "episodes": "Tập phim", + "seasons": "Phần", + "posters": "Poster", + "banners": "Banner", + "specials": "Tập đặc biệt", + "season_number": "Phần {{number}}", + "episode_count": "{{count}} tập", + "episode_count_plural": "{{count}} tập", + "no_episodes": "Không có tập phim", + "no_episodes_for_season": "Không có tập phim cho Phần {{season}}", + "episodes_not_released": "Các tập phim có thể chưa phát hành", + "no_description": "Chưa có mô tả", + "episode_label": "TẬP {{number}}", + "watch_again": "Xem lại", + "completed": "Đã xem xong", + "play_episode": "Phát P{{season}}T{{episode}}", + "play": "Phát", + "watched": "Đã xem", + "watched_on_trakt": "Đã xem trên Trakt", + "synced_with_trakt": "Đồng bộ với Trakt", + "saved": "Đã lưu", + "director": "Đạo diễn", + "directors": "Đạo diễn", + "creator": "Người tạo", + "creators": "Những người tạo", + "production": "Sản xuất", + "network": "Kênh phát sóng", + "mark_watched": "Đánh dấu đã xem", + "mark_unwatched": "Đánh dấu chưa xem", + "marking": "Đang đánh dấu...", + "removing": "Đang xoá...", + "unmark_season": "Bỏ đánh dấu Phần {{season}}", + "mark_season": "Đánh dấu Phần {{season}}", + "resume": "Xem tiếp", + "spoiler_warning": "Cảnh báo tiết lộ nội dung", + "spoiler_warning_desc": "Bình luận này chứa nội dung tiết lộ. Bạn có muốn hiển thị không?", + "cancel": "Huỷ", + "reveal_spoilers": "Hiện nội dung tiết lộ", + "movie_details": "Thông tin phim", + "show_details": "Thông tin chương trình", + "tagline": "Khẩu hiệu", + "status": "Trạng thái", + "release_date": "Ngày phát hành", + "runtime": "Thời lượng", + "budget": "Ngân sách", + "revenue": "Doanh thu", + "origin_country": "Quốc gia sản xuất", + "original_language": "Ngôn ngữ gốc", + "first_air_date": "Ngày phát sóng đầu tiên", + "last_air_date": "Ngày phát sóng cuối cùng", + "total_episodes": "Tổng số tập", + "episode_runtime": "Thời lượng mỗi tập", + "created_by": "Tạo bởi", + "backdrop_gallery": "Thư viện ảnh nền", + "loading_episodes": "Đang tải tập phim...", + "no_episodes_available": "Không có tập phim", + "play_next": "Phát P{{season}}T{{episode}}", + "play_next_episode": "Phát tập tiếp theo", + "save": "Lưu", + "percent_watched": "Đã xem {{percent}}%", + "percent_watched_trakt": "Đã xem {{percent}}% ({{traktPercent}}% trên Trakt)", + "synced_with_trakt_progress": "Đồng bộ với Trakt", + "using_trakt_progress": "Đang dùng tiến độ Trakt", + "added_to_collection_hero": "Đã thêm vào bộ sưu tập", + "added_to_collection_desc_hero": "Đã thêm vào bộ sưu tập Trakt", + "removed_from_collection_hero": "Đã xoá khỏi bộ sưu tập", + "removed_from_collection_desc_hero": "Đã xoá khỏi bộ sưu tập Trakt", + "mark_as_watched": "Đánh dấu đã xem", + "mark_as_unwatched": "Đánh dấu chưa xem" + }, + "cast": { + "biography": "Tiểu sử", + "known_for": "Nổi tiếng với", + "personal_info": "Thông tin cá nhân", + "born_in": "Sinh tại {{place}}", + "filmography": "Sự nghiệp", + "also_known_as": "Còn được biết đến là", + "no_info_available": "Không có thông tin bổ sung", + "as_character": "vai {{character}}", + "loading_details": "Đang tải thông tin...", + "years_old": "{{age}} tuổi", + "view_filmography": "Xem sự nghiệp", + "filter": "Lọc", + "sort_by": "Sắp xếp theo", + "sort_popular": "Phổ biến", + "sort_latest": "Mới nhất", + "sort_upcoming": "Sắp tới", + "upcoming_badge": "SẮP CHIẾU", + "coming_soon": "Sắp ra mắt", + "filmography_count": "Sự nghiệp • {{count}} tác phẩm", + "loading_filmography": "Đang tải sự nghiệp...", + "load_more_remaining": "Tải thêm (còn {{count}})", + "alert_error_title": "Lỗi", + "alert_error_message": "Không thể tải \"{{title}}\". Vui lòng thử lại sau.", + "alert_ok": "OK", + "no_upcoming": "Không có tác phẩm sắp tới của diễn viên này", + "no_content": "Không có nội dung của diễn viên này", + "no_movies": "Không có phim lẻ của diễn viên này", + "no_tv": "Không có phim bộ của diễn viên này" + }, + "comments": { + "title": "Bình luận Trakt", + "spoiler_warning": "⚠️ Bình luận này chứa nội dung tiết lộ. Nhấn để hiện.", + "spoiler": "Tiết lộ nội dung", + "contains_spoilers": "Chứa nội dung tiết lộ", + "reveal": "Hiện", + "vip": "VIP", + "unavailable": "Không có bình luận", + "no_comments": "Chưa có bình luận trên Trakt", + "not_in_database": "Nội dung này có thể chưa có trong cơ sở dữ liệu Trakt", + "check_trakt": "Xem trên Trakt" + }, + "trailers": { + "title": "Trailer", + "official_trailers": "Trailer chính thức", + "official_trailer": "Trailer chính thức", + "teasers": "Teaser", + "teaser": "Teaser", + "clips_scenes": "Clip & Cảnh phim", + "clip": "Clip", + "featurettes": "Hậu trường ngắn", + "featurette": "Hậu trường ngắn", + "behind_the_scenes": "Hậu trường", + "no_trailers": "Không có trailer", + "unavailable": "Trailer không khả dụng", + "unavailable_desc": "Không thể tải trailer này lúc này. Vui lòng thử lại sau.", + "unable_to_play": "Không thể phát trailer. Vui lòng thử lại.", + "watch_on_youtube": "Xem trên YouTube" + }, + "catalog": { + "no_content_found": "Không tìm thấy nội dung", + "no_content_filters": "Không có nội dung cho bộ lọc đã chọn", + "loading_content": "Đang tải nội dung...", + "back": "Quay lại", + "in_theaters": "Đang chiếu", + "all": "Tất cả", + "failed_tmdb": "Không thể tải nội dung từ TMDB", + "movies": "Phim lẻ", + "tv_shows": "Phim bộ", + "channels": "Kênh truyền hình" + }, + "streams": { + "back_to_episodes": "Quay lại danh sách tập", + "back_to_info": "Quay lại thông tin", + "fetching_from": "Đang tải từ:", + "no_sources_available": "Không có nguồn phát", + "add_sources_desc": "Vui lòng thêm nguồn phát trong cài đặt", + "add_sources": "Thêm nguồn", + "finding_streams": "Đang tìm nguồn phát...", + "finding_best_stream": "Đang tìm nguồn phát tốt nhất...", + "still_fetching": "Vẫn đang tải...", + "no_streams_available": "Không có nguồn phát", + "starting_best_stream": "Đang khởi động nguồn tốt nhất...", + "loading_more_sources": "Đang tải thêm nguồn..." + }, + "player_ui": { + "via": "từ {{name}}", + "audio_tracks": "Rãnh âm thanh", + "no_audio_tracks": "Không có rãnh âm thanh", + "playback_speed": "Tốc độ phát", + "on_hold": "Tạm dừng", + "playback_error": "Lỗi phát", + "unknown_error": "Đã xảy ra lỗi không xác định trong quá trình phát.", + "copy_error": "Sao chép thông tin lỗi", + "copied_to_clipboard": "Đã sao chép", + "dismiss": "Bỏ qua", + "continue_watching": "Xem tiếp", + "start_over": "Xem từ đầu", + "resume": "Tiếp tục", + "change_source": "Đổi nguồn", + "switching_source": "Đang chuyển nguồn...", + "no_sources_found": "Không tìm thấy nguồn", + "sources": "Nguồn phát", + "finding_sources": "Đang tìm nguồn...", + "unknown_source": "Nguồn không xác định", + "sources_limited": "Nguồn có thể bị giới hạn do lỗi nhà cung cấp.", + "episodes": "Tập phim", + "specials": "Tập đặc biệt", + "season": "Phần {{season}}", + "stream": "Luồng {{number}}", + "subtitles": "Phụ đề", + "built_in": "Tích hợp sẵn", + "addons": "Addon", + "style": "Kiểu chữ", + "none": "Không có", + "search_online_subtitles": "Tìm phụ đề trực tuyến", + "preview": "Xem trước", + "quick_presets": "Cài đặt nhanh", + "default": "Mặc định", + "yellow": "Vàng", + "high_contrast": "Tương phản cao", + "large": "Lớn", + "core": "Cơ bản", + "font_size": "Cỡ chữ", + "show_background": "Hiện nền", + "advanced": "Nâng cao", + "position": "Vị trí", + "text_color": "Màu chữ", + "align": "Căn chỉnh", + "bottom_offset": "Khoảng cách dưới", + "background_opacity": "Độ trong suốt nền", + "text_shadow": "Đổ bóng chữ", + "on": "Bật", + "off": "Tắt", + "outline_color": "Màu viền", + "outline": "Viền", + "outline_width": "Độ dày viền", + "letter_spacing": "Khoảng cách chữ", + "line_height": "Chiều cao dòng", + "timing_offset": "Bù thời gian (s)", + "visual_sync": "Đồng bộ trực quan", + "timing_hint": "Dịch phụ đề sớm hơn (-) hoặc trễ hơn (+) nếu cần.", + "reset_defaults": "Đặt lại mặc định", + "mark_intro_start": "Đánh dấu đầu intro", + "mark_intro_end": "Đánh dấu cuối intro", + "intro_start_marked": "Đã đánh dấu đầu intro", + "intro_submitted": "Đã gửi thông tin intro thành công", + "intro_submit_failed": "Gửi thông tin intro thất bại" + }, + "downloads": { + "title": "Tải về", + "no_downloads": "Chưa có tải về", + "no_downloads_desc": "Nội dung đã tải sẽ hiển thị ở đây để xem offline", + "explore": "Khám phá nội dung", + "path_copied": "Đã sao chép đường dẫn", + "path_copied_desc": "Đường dẫn tệp cục bộ đã được sao chép", + "copied": "Đã sao chép", + "incomplete": "Tải chưa hoàn tất", + "incomplete_desc": "Quá trình tải vẫn chưa hoàn tất", + "not_available": "Không khả dụng", + "not_available_desc": "Đường dẫn tệp cục bộ chỉ có sau khi tải hoàn tất.", + "status_downloading": "Đang tải", + "status_completed": "Hoàn tất", + "status_paused": "Tạm dừng", + "status_error": "Lỗi", + "status_queued": "Đang chờ", + "status_unknown": "Không xác định", + "provider": "Nhà cung cấp", + "streaming_playlist_warning": "Có thể không phát được - danh sách phát trực tuyến", + "remaining": "còn lại", + "not_ready": "Chưa sẵn sàng", + "not_ready_desc": "Vui lòng đợi quá trình tải hoàn tất.", + "filter_all": "Tất cả", + "filter_active": "Đang tải", + "filter_done": "Hoàn tất", + "filter_paused": "Tạm dừng", + "no_filter_results": "Không có tải {{filter}}", + "try_different_filter": "Thử chọn bộ lọc khác", + "limitations_title": "Giới hạn tải về", + "limitations_msg": "• Các tệp nhỏ hơn 1MB thường là danh sách phát M3U8 và không thể tải về để xem offline. Chúng chỉ hoạt động khi phát trực tuyến và chứa liên kết đến đoạn video, không phải nội dung video thực.", + "remove_title": "Xoá tải về", + "remove_confirm": "Xoá \"{{title}}\"{{season_episode}}?", + "cancel": "Huỷ", + "remove": "Xoá" + }, + "addons": { + "title": "Addon", + "reorder_mode": "Sắp xếp lại", + "reorder_info": "Addon ở trên cùng có độ ưu tiên cao hơn khi tải nội dung", + "add_addon_placeholder": "URL Addon", + "add_button": "Thêm Addon", + "my_addons": "Addon của tôi", + "community_addons": "Addon cộng đồng", + "no_addons": "Chưa cài addon nào", + "uninstall_title": "Gỡ Addon", + "uninstall_message": "Bạn có chắc muốn gỡ {{name}}?", + "uninstall_button": "Gỡ cài đặt", + "install_success": "Cài addon thành công", + "install_error": "Cài addon thất bại", + "load_error": "Tải addon thất bại", + "fetch_error": "Không thể lấy thông tin addon", + "invalid_url": "Vui lòng nhập URL addon", + "configure": "Cấu hình", + "version": "Phiên bản: {{version}}", + "installed_addons": "ADDON ĐÃ CÀI", + "reorder_drag_title": "KÉO ĐỂ SẮP XẾP ADDON", + "install": "Cài đặt", + "config_unavailable_title": "Không có cấu hình", + "config_unavailable_msg": "Không thể xác định URL cấu hình cho addon này.", + "cannot_open_config_title": "Không thể mở cấu hình", + "cannot_open_config_msg": "URL cấu hình ({{url}}) không thể mở. Addon có thể không có trang cấu hình.", + "description": "Mô tả", + "supported_types": "Loại được hỗ trợ", + "catalogs": "Danh mục", + "no_description": "Không có mô tả", + "overview": "TỔNG QUAN", + "no_categories": "Không có danh mục", + "pre_installed": "CÀI SẴN" + }, + "trakt": { + "title": "Cài đặt Trakt", + "settings_title": "Cài đặt Trakt", + "connect_title": "Kết nối với Trakt", + "connect_desc": "Đồng bộ lịch sử xem, danh sách và bộ sưu tập với Trakt.tv", + "sign_in": "Đăng nhập Trakt", + "sign_out": "Đăng xuất", + "sign_out_confirm": "Bạn có chắc muốn đăng xuất khỏi tài khoản Trakt?", + "joined": "Tham gia {{date}}", + "sync_settings_title": "Cài đặt đồng bộ", + "sync_info": "Khi kết nối Trakt, toàn bộ lịch sử được đồng bộ trực tiếp từ API và không lưu cục bộ. Danh sách Xem tiếp phản ánh tiến độ Trakt toàn cầu của bạn.", + "auto_sync_label": "Tự động đồng bộ tiến độ", + "auto_sync_desc": "Tự động đồng bộ tiến độ xem lên Trakt", + "import_history_label": "Nhập lịch sử xem", + "import_history_desc": "Dùng \"Đồng bộ ngay\" để nhập lịch sử và tiến độ xem từ Trakt", + "sync_now_button": "Đồng bộ ngay", + "display_settings_title": "Cài đặt hiển thị", + "show_comments_label": "Hiện bình luận Trakt", + "show_comments_desc": "Hiển thị bình luận Trakt trong màn hình thông tin khi có", + "maintenance_title": "Đang bảo trì", + "maintenance_unavailable": "Trakt không khả dụng", + "maintenance_desc": "Tính năng Trakt tạm thời bị tắt để bảo trì. Mọi đồng bộ và xác thực sẽ được kích hoạt lại sau khi bảo trì xong.", + "maintenance_button": "Dịch vụ đang bảo trì", + "auth_success_title": "Kết nối thành công", + "auth_success_msg": "Tài khoản Trakt của bạn đã được kết nối.", + "auth_error_title": "Lỗi xác thực", + "auth_error_msg": "Không thể hoàn tất xác thực với Trakt.", + "auth_error_generic": "Đã xảy ra lỗi trong quá trình xác thực.", + "sign_out_error": "Đăng xuất Trakt thất bại.", + "sync_complete_title": "Đồng bộ hoàn tất", + "sync_success_msg": "Đã đồng bộ tiến độ xem với Trakt thành công.", + "sync_error_msg": "Đồng bộ thất bại. Vui lòng thử lại." + }, + "simkl": { + "title": "Cài đặt Simkl", + "settings_title": "Cài đặt Simkl", + "connect_title": "Kết nối với Simkl", + "connect_desc": "Đồng bộ lịch sử xem và theo dõi những gì bạn đang xem", + "sign_in": "Đăng nhập Simkl", + "sign_out": "Ngắt kết nối", + "sign_out_confirm": "Bạn có chắc muốn ngắt kết nối Simkl?", + "syncing_desc": "Các mục đã xem đang được đồng bộ với Simkl.", + "auth_success_title": "Kết nối thành công", + "auth_success_msg": "Tài khoản Simkl của bạn đã được kết nối.", + "auth_error_title": "Lỗi xác thực", + "auth_error_msg": "Không thể hoàn tất xác thực với Simkl.", + "auth_error_generic": "Đã xảy ra lỗi trong quá trình xác thực.", + "sign_out_error": "Ngắt kết nối Simkl thất bại.", + "config_error_title": "Lỗi cấu hình", + "config_error_msg": "Thiếu Client ID của Simkl trong biến môi trường.", + "conflict_title": "Xung đột", + "conflict_msg": "Không thể kết nối Simkl khi Trakt đang hoạt động. Vui lòng ngắt kết nối Trakt trước.", + "disclaimer": "Nuvio không có liên kết với Simkl." + }, + "tmdb_settings": { + "title": "Cài đặt TMDb", + "metadata_enrichment": "Bổ sung dữ liệu", + "metadata_enrichment_desc": "Làm phong phú thêm thông tin nội dung bằng dữ liệu TMDb.", + "enable_enrichment": "Bật bổ sung dữ liệu", + "enable_enrichment_desc": "Bổ sung thông tin diễn viên, phân loại độ tuổi, logo/poster và thông tin sản xuất từ TMDb.", + "localized_text": "Văn bản đã bản địa hoá", + "localized_text_desc": "Lấy tiêu đề và mô tả bằng ngôn ngữ ưa thích từ TMDb.", + "language": "Ngôn ngữ", + "change": "Thay đổi", + "logo_preview": "Xem trước logo", + "logo_preview_desc": "Xem trước logo đã bản địa hoá theo ngôn ngữ đã chọn.", + "example": "Ví dụ:", + "no_logo": "Không có logo", + "enrichment_options": "Tuỳ chọn bổ sung", + "enrichment_options_desc": "Chọn dữ liệu nào lấy từ TMDb. Tuỳ chọn tắt sẽ dùng dữ liệu addon nếu có.", + "cast_crew": "Diễn viên & Đoàn làm phim", + "cast_crew_desc": "Diễn viên, đạo diễn, biên kịch kèm ảnh", + "title_description": "Tiêu đề & Mô tả", + "title_description_desc": "Dùng tiêu đề và mô tả đã bản địa hoá từ TMDb", + "title_logos": "Logo tiêu đề", + "title_logos_desc": "Ảnh tiêu đề chất lượng cao", + "banners_backdrops": "Banner & Ảnh nền", + "banners_backdrops_desc": "Ảnh nền độ phân giải cao", + "certification": "Phân loại nội dung", + "certification_desc": "Phân loại độ tuổi (PG-13, R, TV-MA...)", + "recommendations": "Gợi ý", + "recommendations_desc": "Nội dung tương tự", + "episode_data": "Dữ liệu tập phim", + "episode_data_desc": "Thumbnail tập, thông tin & dự phòng cho phim bộ", + "season_posters": "Poster phần", + "season_posters_desc": "Poster riêng cho từng phần", + "production_info": "Thông tin sản xuất", + "production_info_desc": "Kênh truyền hình & công ty sản xuất kèm logo", + "movie_details": "Chi tiết phim lẻ", + "movie_details_desc": "Ngân sách, doanh thu, thời lượng, khẩu hiệu", + "tv_details": "Chi tiết phim bộ", + "tv_details_desc": "Trạng thái, số phần, kênh, người tạo", + "movie_collections": "Bộ phim series", + "movie_collections_desc": "Phim trong cùng vũ trụ (Marvel, Star Wars...)", + "api_configuration": "Cấu hình API", + "api_configuration_desc": "Cấu hình API TMDb để có chức năng nâng cao.", + "custom_api_key": "API Key riêng", + "custom_api_key_desc": "Dùng API key TMDb của bạn để có hiệu suất tốt hơn.", + "custom_key_active": "Đang dùng API key riêng", + "api_key_required": "Cần có API key", + "api_key_placeholder": "Dán API key TMDb (v3) vào đây", + "how_to_get_key": "Cách lấy API key TMDb?", + "built_in_key_msg": "Đang dùng API key tích hợp. Hãy dùng key riêng để có hiệu suất tốt hơn.", + "cache_size": "Kích thước bộ nhớ đệm", + "clear_cache": "Xoá bộ nhớ đệm", + "cache_days": "Phản hồi TMDB được lưu đệm 7 ngày để tăng hiệu suất", + "choose_language": "Chọn ngôn ngữ", + "choose_language_desc": "Chọn ngôn ngữ ưa thích cho nội dung TMDb", + "popular": "Phổ biến", + "all_languages": "Tất cả ngôn ngữ", + "search_results": "Kết quả tìm kiếm", + "no_languages_found": "Không tìm thấy ngôn ngữ cho \"{{query}}\"", + "clear_search": "Xoá tìm kiếm", + "clear_cache_title": "Xoá bộ nhớ đệm TMDB", + "clear_cache_msg": "Thao tác này sẽ xoá toàn bộ dữ liệu đệm TMDB ({{size}}). Tốc độ tải có thể chậm hơn cho đến khi bộ nhớ đệm được xây dựng lại.", + "clear_cache_success": "Đã xoá bộ nhớ đệm TMDB thành công.", + "clear_cache_error": "Xoá bộ nhớ đệm thất bại.", + "clear_api_key_title": "Xoá API Key", + "clear_api_key_msg": "Bạn có chắc muốn xoá API key riêng và dùng lại key mặc định?", + "clear_api_key_success": "Đã xoá API key thành công", + "clear_api_key_error": "Xoá API key thất bại", + "empty_api_key": "API Key không được để trống.", + "invalid_api_key": "API key không hợp lệ. Vui lòng kiểm tra và thử lại.", + "save_error": "Đã xảy ra lỗi khi lưu. Vui lòng thử lại.", + "using_builtin_key": "Đang dùng API key tích hợp của TMDb.", + "using_custom_key": "Đang dùng API key TMDb của bạn.", + "enter_custom_key": "Vui lòng nhập và lưu API key TMDb của bạn.", + "key_verified": "Đã xác minh và lưu API key thành công." + }, + "settings": { + "language": "Ngôn ngữ", + "select_language": "Chọn ngôn ngữ", + "english": "Tiếng Anh", + "portuguese": "Tiếng Bồ Đào Nha", + "portuguese_br": "Tiếng Bồ Đào Nha (Brazil)", + "portuguese_pt": "Tiếng Bồ Đào Nha (Bồ Đào Nha)", + "german": "Tiếng Đức", + "arabic": "Tiếng Ả Rập", + "spanish": "Tiếng Tây Ban Nha", + "french": "Tiếng Pháp", + "italian": "Tiếng Ý", + "croatian": "Tiếng Croatia", + "chinese": "Tiếng Trung (Giản thể)", + "hindi": "Tiếng Hindi", + "serbian": "Tiếng Serbia", + "hebrew": "Tiếng Do Thái", + "bulgarian": "Tiếng Bulgaria", + "polish": "Tiếng Ba Lan", + "czech": "Tiếng Séc", + "turkish": "Tiếng Thổ Nhĩ Kỳ", + "slovenian": "Tiếng Slovenia", + "macedonian": "Tiếng Macedonia", + "russian": "Tiếng Nga", + "filipino": "Tiếng Philippines", + "dutch_nl": "Tiếng Hà Lan (Hà Lan)", + "romanian": "Tiếng Romania", + "albanian": "Tiếng Albania", + "catalan": "Tiếng Catalan", + "account": "Tài khoản", + "content_discovery": "Nội dung & Khám phá", + "appearance": "Giao diện", + "integrations": "Tích hợp", + "playback": "Phát", + "backup_restore": "Sao lưu & Khôi phục", + "backup_restore_desc": "Tạo và khôi phục bản sao lưu ứng dụng", + "updates": "Cập nhật", + "about": "Giới thiệu", + "developer": "Nhà phát triển", + "cache": "Bộ nhớ đệm", + "title": "Cài đặt", + "settings_title": "Cài đặt", + "sign_in_sync": "Đăng nhập để đồng bộ", + "add_catalogs_sources": "Addon, danh mục và nguồn phát", + "player_trailers_downloads": "Trình phát, trailer, tải về", + "mdblist_tmdb_ai": "MDBList, TMDB, AI", + "check_updates": "Kiểm tra cập nhật", + "clear_mdblist_cache": "Xoá bộ nhớ đệm MDBList", + "cache_management": "QUẢN LÝ BỘ NHỚ ĐỆM", + "downloads_counter": "lượt tải và đang tăng", + "made_with_love": "Được tạo với ❤️ bởi Tapframe và cộng sự", + "sections": { + "information": "THÔNG TIN", + "account": "TÀI KHOẢN", + "theme": "GIAO DIỆN", + "layout": "BỐ CỤC", + "sources": "NGUỒN PHÁT", + "catalogs": "DANH MỤC", + "discovery": "KHÁM PHÁ", + "metadata": "DỮ LIỆU", + "ai_assistant": "TRỢ LÝ AI", + "video_player": "TRÌNH PHÁT VIDEO", + "audio_subtitles": "ÂM THANH & PHỤ ĐỀ", + "media": "PHƯƠNG TIỆN", + "notifications": "THÔNG BÁO", + "testing": "KIỂM TRA", + "danger_zone": "KHU VỰC NGUY HIỂM" + }, + "items": { + "legal": "Pháp lý & Tuyên bố miễn trách", + "privacy_policy": "Chính sách quyền riêng tư", + "report_issue": "Báo cáo sự cố", + "version": "Phiên bản", + "contributors": "Đóng góp viên", + "view_contributors": "Xem tất cả đóng góp viên", + "theme": "Giao diện", + "episode_layout": "Bố cục tập phim", + "streams_backdrop": "Ảnh nền nguồn phát", + "streams_backdrop_desc": "Hiện ảnh nền mờ trên màn hình nguồn phát (di động)", + "addons": "Addon", + "installed": "đã cài", + "debrid_integration": "Tích hợp Debrid", + "debrid_desc": "Kết nối Torbox", + "plugins": "Plugin", + "plugins_desc": "Quản lý plugin và kho lưu trữ", + "catalogs": "Danh mục", + "active": "đang hoạt động", + "home_screen": "Màn hình chính", + "home_screen_desc": "Bố cục và nội dung", + "continue_watching": "Xem tiếp", + "continue_watching_desc": "Bộ nhớ đệm và hành vi phát", + "show_discover": "Hiện phần Khám phá", + "show_discover_desc": "Hiển thị nội dung khám phá trong Tìm kiếm", + "mdblist": "MDBList", + "mdblist_connected": "Đã kết nối", + "mdblist_desc": "Bật để thêm xếp hạng & đánh giá", + "simkl": "Simkl", + "simkl_connected": "Đã kết nối", + "simkl_desc": "Theo dõi những gì bạn xem", + "tmdb": "TMDB", + "tmdb_desc": "Nhà cung cấp metadata & logo", + "openrouter": "OpenRouter API", + "openrouter_connected": "Đã kết nối", + "openrouter_desc": "Thêm API key để bật chat AI", + "video_player": "Trình phát video", + "built_in": "Tích hợp sẵn", + "external": "Bên ngoài", + "preferred_audio": "Ngôn ngữ âm thanh ưa thích", + "preferred_subtitle": "Ngôn ngữ phụ đề ưa thích", + "subtitle_source": "Thứ tự ưu tiên nguồn phụ đề", + "auto_select_subs": "Tự động chọn phụ đề", + "auto_select_subs_desc": "Tự động chọn phụ đề theo tuỳ chọn của bạn", + "show_trailers": "Hiện trailer", + "show_trailers_desc": "Hiển thị trailer trong phần hero", + "enable_downloads": "Bật tải về", + "enable_downloads_desc": "Hiện tab Tải về và cho phép lưu luồng phát", + "notifications": "Thông báo", + "notifications_desc": "Nhắc lịch tập mới", + "developer_tools": "Công cụ nhà phát triển", + "developer_tools_desc": "Kiểm tra và tuỳ chọn gỡ lỗi", + "test_onboarding": "Kiểm tra giới thiệu", + "reset_onboarding": "Đặt lại giới thiệu", + "test_announcement": "Kiểm tra thông báo", + "test_announcement_desc": "Hiện lớp phủ có gì mới", + "reset_campaigns": "Đặt lại chiến dịch", + "reset_campaigns_desc": "Xoá lần hiển thị chiến dịch", + "clear_all_data": "Xoá tất cả dữ liệu", + "clear_all_data_desc": "Đặt lại cài đặt và xoá dữ liệu đệm" + }, + "options": { + "horizontal": "Ngang", + "vertical": "Dọc", + "internal_first": "Ưu tiên tích hợp", + "internal_first_desc": "Ưu tiên phụ đề nhúng sẵn, rồi đến bên ngoài", + "external_first": "Ưu tiên bên ngoài", + "external_first_desc": "Ưu tiên phụ đề addon, rồi đến nhúng sẵn", + "any_available": "Tuỳ có", + "any_available_desc": "Dùng rãnh phụ đề đầu tiên có sẵn" + }, + "clear_data_desc": "Thao tác này sẽ đặt lại tất cả cài đặt và xoá dữ liệu đệm. Bạn có chắc không?", + "app_updates": "Cập nhật ứng dụng", + "about_nuvio": "Giới thiệu về Nuvio", + "cloud_sync": { + "title": "Nuvio Sync", + "description": "Đồng bộ dữ liệu giữa các thiết bị Nuvio", + "hero_title": "Đồng bộ đám mây", + "hero_subtitle": "Giữ addon, tiến độ và thư viện đồng nhất trên tất cả thiết bị.", + "auth": { + "account": "Tài khoản", + "not_configured": "Chưa cấu hình Supabase", + "not_authenticated": "Chưa xác thực", + "email_session": "Phiên email", + "signed_in_as": "Đã đăng nhập với {{email}}", + "not_signed_in": "Chưa đăng nhập", + "effective_owner": "Chủ sở hữu hiện tại: {{id}}" + }, + "stats": { + "title": "Thống kê cơ sở dữ liệu", + "plugins": "Plugin", + "addons": "Addon", + "watch_progress": "Tiến độ xem", + "library_items": "Mục thư viện", + "watched_items": "Mục đã xem", + "signin_required": "Đăng nhập để xem số lượng dữ liệu từ xa." + }, + "actions": { + "title": "Thao tác", + "description": "Kéo để cập nhật thiết bị này từ đám mây, hoặc đẩy từ thiết bị này lên đám mây.", + "pull_btn": "Kéo từ đám mây", + "push_btn": "Đẩy từ thiết bị", + "manage_account": "Quản lý tài khoản", + "sign_out": "Đăng xuất", + "sign_in_up": "Đăng nhập / Đăng ký" + }, + "alerts": { + "pull_success_title": "Đã kéo dữ liệu đám mây", + "pull_success_msg": "Dữ liệu mới nhất đã được tải xuống thiết bị này.", + "pull_failed_title": "Kéo thất bại", + "pull_failed_msg": "Không thể tải dữ liệu từ đám mây", + "push_success_title": "Đẩy hoàn tất", + "push_success_msg": "Dữ liệu thiết bị đã được đẩy lên đám mây.", + "push_failed_title": "Đẩy thất bại", + "push_failed_msg": "Không thể tải dữ liệu cục bộ", + "sign_out_failed": "Đăng xuất thất bại", + "sign_out_failed_title": "Lỗi đăng xuất" + }, + "external_sync": { + "title": "Ưu tiên đồng bộ bên ngoài", + "active_msg": "{{services}} đang hoạt động. Tiến độ xem và thư viện được quản lý bởi dịch vụ này thay vì cơ sở dữ liệu đám mây Nuvio.", + "inactive_msg": "Nếu đồng bộ Trakt hoặc Simkl được bật, tiến độ xem và thư viện sẽ dùng các dịch vụ đó thay vì cơ sở dữ liệu đám mây Nuvio." + }, + "pre_auth": { + "title": "Trước khi đồng bộ", + "description": "Đăng nhập để bắt đầu đồng bộ đám mây và giữ dữ liệu nhất quán trên các thiết bị.", + "point_1": "• Cài đặt addon và plugin", + "point_2": "• Tiến độ xem và thư viện", + "env_warning": "Đặt EXPO_PUBLIC_SUPABASE_URL và EXPO_PUBLIC_SUPABASE_ANON_KEY để bật đồng bộ." + }, + "connection": "Kết nối" + } + }, + "privacy": { + "title": "Quyền riêng tư & Dữ liệu", + "settings_desc": "Kiểm soát telemetry và thu thập dữ liệu", + "info_title": "Quyền riêng tư của bạn quan trọng", + "info_description": "Kiểm soát dữ liệu nào được thu thập và chia sẻ. Phân tích tắt theo mặc định và báo cáo lỗi ẩn danh theo mặc định.", + "analytics_enabled_title": "Đã bật phân tích", + "analytics_enabled_message": "Dữ liệu sử dụng sẽ được thu thập để cải thiện ứng dụng. Bạn có thể tắt bất cứ lúc nào.", + "disable_error_reporting_title": "Tắt báo cáo lỗi?", + "disable_error_reporting_message": "Tắt báo cáo lỗi nghĩa là chúng tôi sẽ không nhận được thông báo về sự cố bạn gặp phải. Điều này có thể ảnh hưởng đến khả năng sửa lỗi.", + "enable_session_replay_title": "Bật ghi lại phiên?", + "enable_session_replay_message": "Ghi lại phiên sẽ quay màn hình khi có lỗi để giúp chúng tôi hiểu chuyện gì xảy ra. Điều này có thể ghi lại nội dung hiển thị trên màn hình.", + "enable_pii_title": "Bật thu thập thông tin cá nhân?", + "enable_pii_message": "Cho phép thu thập thông tin nhận dạng cá nhân như địa chỉ IP và thông tin thiết bị. Dữ liệu này giúp chẩn đoán sự cố nhưng tăng mức độ lộ quyền riêng tư.", + "disable_all_title": "Tắt tất cả telemetry?", + "disable_all_message": "Thao tác này sẽ tắt tất cả phân tích, báo cáo lỗi và ghi lại phiên. Chúng tôi sẽ không nhận dữ liệu về việc sử dụng ứng dụng hoặc sự cố.", + "disable_all_button": "Tắt tất cả", + "all_disabled_title": "Đã tắt tất cả telemetry", + "all_disabled_message": "Tất cả thu thập dữ liệu đã bị tắt. Thay đổi có hiệu lực khi khởi động lại ứng dụng.", + "reset_title": "Đặt lại về mặc định được đề xuất", + "reset_message": "Cài đặt quyền riêng tư đã được đặt lại về mặc định được đề xuất (bật báo cáo lỗi, tắt phân tích).", + "section_analytics": "PHÂN TÍCH", + "analytics_title": "Phân tích sử dụng", + "analytics_description": "Thu thập mẫu sử dụng và lượt xem màn hình ẩn danh", + "section_error_reporting": "BÁO CÁO LỖI", + "error_reporting_title": "Báo cáo sự cố", + "error_reporting_description": "Gửi báo cáo sự cố ẩn danh để cải thiện độ ổn định", + "session_replay_title": "Ghi lại phiên", + "session_replay_description": "Quay màn hình khi có lỗi", + "pii_title": "Bao gồm thông tin thiết bị", + "pii_description": "Gửi địa chỉ IP và thông tin thiết bị kèm báo cáo", + "section_quick_actions": "THAO TÁC NHANH", + "disable_all": "Tắt tất cả telemetry", + "disable_all_desc": "Tắt tất cả thu thập dữ liệu", + "reset_recommended": "Đặt lại về mặc định được đề xuất", + "reset_recommended_desc": "Mặc định ưu tiên quyền riêng tư với báo cáo lỗi", + "section_learn_more": "TÌM HIỂU THÊM", + "privacy_policy": "Chính sách quyền riêng tư", + "current_settings": "Tóm tắt cài đặt hiện tại", + "summary_analytics": "Phân tích", + "summary_errors": "Báo cáo lỗi", + "summary_replay": "Ghi lại phiên", + "summary_pii": "Thông tin thiết bị", + "restart_note_detailed": "* Thay đổi phân tích và báo cáo lỗi có hiệu lực ngay. Cài đặt ghi lại phiên và thông tin cá nhân cần khởi động lại ứng dụng." + }, + "ai_settings": { + "title": "Trợ lý AI", + "info_title": "Chat hỗ trợ bởi AI", + "info_desc": "Đặt câu hỏi về bất kỳ phim hay tập phim bộ nào bằng AI. Nhận thông tin về cốt truyện, nhân vật, chủ đề, kiến thức thú vị và nhiều hơn nữa - hỗ trợ bởi dữ liệu TMDB toàn diện.", + "feature_1": "Ngữ cảnh và phân tích từng tập", + "feature_2": "Giải thích cốt truyện và nhân vật", + "feature_3": "Kiến thức hậu trường thú vị", + "feature_4": "API key OpenRouter miễn phí của bạn", + "api_key_section": "API KEY OPENROUTER", + "api_key_label": "API Key", + "api_key_desc": "Nhập API key OpenRouter để bật tính năng chat AI", + "save_api_key": "Lưu API Key", + "saving": "Đang lưu...", + "update": "Cập nhật", + "remove": "Xoá", + "get_free_key": "Lấy API Key miễn phí từ OpenRouter", + "enable_chat": "Bật chat AI", + "enable_chat_desc": "Khi bật, nút Hỏi AI sẽ xuất hiện trên trang nội dung.", + "chat_enabled": "Đã bật chat AI", + "chat_enabled_desc": "Bạn có thể đặt câu hỏi về phim và phim bộ. Tìm nút \"Hỏi AI\" trên trang nội dung!", + "how_it_works": "Cách hoạt động", + "how_it_works_desc": "• OpenRouter cung cấp quyền truy cập nhiều mô hình AI\n• API key của bạn được giữ bí mật và bảo mật\n• Gói miễn phí bao gồm giới hạn sử dụng hào phóng\n• Chat với ngữ cảnh về tập/phim cụ thể\n• Nhận phân tích và giải thích chi tiết", + "error_invalid_key": "Vui lòng nhập API key hợp lệ", + "error_key_format": "API key OpenRouter phải bắt đầu bằng \"sk-or-\"", + "success_saved": "Đã lưu API key OpenRouter thành công!", + "error_save": "Lưu API key thất bại", + "confirm_remove_title": "Xoá API Key", + "confirm_remove_msg": "Bạn có chắc muốn xoá API key OpenRouter? Thao tác này sẽ tắt tính năng chat AI.", + "success_removed": "Đã xoá API key thành công", + "error_remove": "Xoá API key thất bại" + }, + "catalog_settings": { + "title": "Danh mục", + "layout_phone": "BỐ CỤC TRANG DANH MỤC (ĐIỆN THOẠI)", + "posters_per_row": "Poster mỗi hàng", + "auto": "Tự động", + "show_titles": "Hiện tiêu đề poster", + "show_titles_desc": "Hiển thị chữ tiêu đề bên dưới mỗi poster", + "phone_only_hint": "Chỉ áp dụng cho điện thoại. Máy tính bảng giữ bố cục thích ứng.", + "catalogs_group": "Danh mục", + "enabled_count": "{{enabled}} / {{total}} đang bật", + "rename_hint": "Nhấn giữ danh mục để đổi tên", + "rename_modal_title": "Đổi tên danh mục", + "rename_placeholder": "Nhập tên mới cho danh mục", + "error_save_name": "Không thể lưu tên tuỳ chỉnh." + }, + "continue_watching_settings": { + "title": "Xem tiếp", + "playback_behavior": "HÀNH VI PHÁT", + "use_cached": "Dùng luồng đã lưu đệm", + "use_cached_desc": "Khi bật, nhấn mục Xem tiếp sẽ mở trình phát trực tiếp dùng luồng đã phát trước đó. Khi tắt, sẽ mở màn hình nội dung.", + "open_metadata": "Mở màn hình thông tin", + "open_metadata_desc": "Khi luồng đệm bị tắt, mở màn hình Thông tin thay vì màn hình Nguồn phát. Hiển thị chi tiết nội dung và cho phép chọn luồng thủ công.", + "card_appearance": "GIAO DIỆN THẺ", + "card_style": "Kiểu thẻ", + "card_style_desc": "Chọn cách hiển thị mục Xem tiếp trên màn hình chính", + "wide": "Rộng", + "poster": "Poster", + "cache_settings": "CÀI ĐẶT BỘ NHỚ ĐỆM", + "cache_duration": "Thời gian lưu đệm luồng", + "cache_duration_desc": "Thời gian lưu link luồng trước khi hết hạn", + "important_note": "Lưu ý quan trọng", + "important_note_text": "Không phải tất cả link luồng đều hoạt động trong suốt thời gian lưu đệm. Thời gian lưu dài hơn có thể dẫn đến link hết hạn. Nếu link đệm thất bại, ứng dụng sẽ tự lấy luồng mới.", + "how_it_works": "Cách hoạt động", + "how_it_works_cached": "• Luồng được lưu đệm trong khoảng thời gian bạn chọn sau khi phát\n• Luồng đệm được kiểm tra trước khi dùng\n• Nếu đệm không hợp lệ hoặc hết hạn, sẽ dùng màn hình nội dung\n• \"Dùng luồng đệm\" kiểm soát điều hướng trực tiếp vào trình phát hay màn hình\n• \"Mở màn hình thông tin\" chỉ xuất hiện khi luồng đệm bị tắt", + "how_it_works_uncached": "• Khi luồng đệm bị tắt, nhấn Xem tiếp sẽ mở màn hình nội dung\n• \"Mở màn hình thông tin\" kiểm soát màn hình nào sẽ mở\n• Màn hình thông tin hiển thị chi tiết và cho phép chọn luồng thủ công\n• Màn hình nguồn phát hiển thị các luồng có sẵn để phát ngay", + "changes_saved": "Đã lưu thay đổi", + "min": "phút", + "hour": "giờ", + "hours": "giờ" + }, + "contributors": { + "title": "Đóng góp viên", + "special_mentions": "Nhắc đến đặc biệt", + "tab_contributors": "Đóng góp viên", + "tab_special": "Nhắc đến đặc biệt", + "tab_donors": "Nhà tài trợ", + "manager_role": "Quản lý cộng đồng", + "manager_desc": "Quản lý cộng đồng Discord & Reddit cho Nuvio", + "sponsor_role": "Nhà tài trợ máy chủ", + "sponsor_desc": "Tài trợ cơ sở hạ tầng máy chủ cho Nuvio", + "mod_role": "Điều hành Discord", + "mod_desc": "Hỗ trợ điều hành cộng đồng Discord Nuvio", + "loading": "Đang tải...", + "discord_user": "Người dùng Discord", + "contributions": "đóng góp", + "gratitude_title": "Chúng tôi biết ơn mọi đóng góp", + "gratitude_desc": "Từng dòng code, báo cáo lỗi và gợi ý đều giúp Nuvio tốt hơn cho tất cả mọi người", + "special_thanks_title": "Cảm ơn đặc biệt", + "special_thanks_desc": "Những người tuyệt vời này giúp cộng đồng Nuvio hoạt động và giữ máy chủ trực tuyến", + "donors_desc": "Cảm ơn bạn đã tin tưởng vào những gì chúng tôi xây dựng. Sự ủng hộ của bạn giúp Nuvio miễn phí và không ngừng cải thiện.", + "latest_donations": "Mới nhất", + "leaderboard": "Bảng xếp hạng", + "loading_donors": "Đang tải nhà tài trợ...", + "no_donors": "Chưa có nhà tài trợ", + "error_rate_limit": "Đã vượt giới hạn tốc độ GitHub API. Vui lòng thử lại sau hoặc kéo để làm mới.", + "error_failed": "Không thể tải đóng góp viên. Vui lòng kiểm tra kết nối internet.", + "retry": "Thử lại", + "no_contributors": "Không tìm thấy đóng góp viên", + "loading_contributors": "Đang tải đóng góp viên..." + }, + "debrid": { + "title": "Tích hợp Debrid", + "description_torbox": "Kết nối Torbox để dùng tuỳ chọn nguồn theo tài khoản. Nhập API key bên dưới để cấu hình.", + "description_torrentio": "Cấu hình Torrentio như nguồn tích hợp bên ngoài. Có thể cần tài khoản debrid tương thích.", + "tab_torbox": "TorBox", + "tab_torrentio": "Torrentio", + "status_connected": "Đã kết nối", + "status_disconnected": "Chưa kết nối", + "enable_addon": "Bật Addon", + "disconnect_button": "Ngắt kết nối & Xoá", + "disconnect_loading": "Đang ngắt kết nối...", + "account_info": "Thông tin tài khoản", + "plan": "Gói", + "plan_free": "Miễn phí", + "plan_essential": "Essential ($3/tháng)", + "plan_pro": "Pro ($10/tháng)", + "plan_standard": "Standard ($5/tháng)", + "plan_unknown": "Không xác định", + "expires": "Hết hạn", + "downloaded": "Đã tải", + "status_active": "Đang hoạt động", + "connected_title": "✓ Đã kết nối TorBox", + "connected_desc": "Addon TorBox của bạn đang hoạt động và cung cấp luồng cao cấp.", + "configure_title": "Cấu hình Addon", + "configure_desc": "Tuỳ chỉnh trải nghiệm xem. Sắp xếp theo chất lượng, lọc kích thước file và quản lý cài đặt tích hợp khác.", + "open_settings": "Mở cài đặt", + "what_is_debrid": "Dịch vụ Debrid là gì?", + "enter_api_key": "Nhập API Key", + "connect_button": "Kết nối & Cài", + "connecting": "Đang kết nối...", + "unlock_speeds_title": "Gói Torbox tuỳ chọn", + "unlock_speeds_desc": "Torbox cung cấp các gói tài khoản với hiệu suất và tính năng khả dụng nâng cao.", + "get_subscription": "Đăng ký gói", + "powered_by": "Hỗ trợ bởi", + "disclaimer_torbox": "Nuvio không có liên kết với Torbox.", + "disclaimer_torrentio": "Nuvio không có liên kết với Torrentio.", + "installed_badge": "✓ ĐÃ CÀI", + "promo_title": "⚡ Cần dịch vụ Debrid?", + "promo_desc": "Dùng TorBox nếu bạn muốn tính năng hiệu suất theo tài khoản cho các tích hợp được hỗ trợ.", + "promo_button": "Đăng ký TorBox", + "service_label": "Dịch vụ Debrid *", + "api_key_label": "API Key *", + "sorting_label": "Sắp xếp", + "exclude_qualities": "Loại trừ chất lượng", + "priority_languages": "Ngôn ngữ ưu tiên", + "max_results": "Kết quả tối đa", + "additional_options": "Tuỳ chọn bổ sung", + "no_download_links": "Không hiện link tải", + "no_debrid_catalog": "Không hiện danh mục debrid", + "install_button": "Cài Torrentio", + "installing": "Đang cài...", + "update_button": "Cập nhật cấu hình", + "updating": "Đang cập nhật...", + "remove_button": "Xoá Torrentio", + "error_api_required": "Cần API Key", + "error_api_required_desc": "Vui lòng nhập API key dịch vụ debrid để cài Torrentio.", + "success_installed": "Đã cài addon Torrentio thành công!", + "success_removed": "Đã xoá addon Torrentio thành công", + "alert_disconnect_title": "Ngắt kết nối Torbox", + "alert_disconnect_msg": "Bạn có chắc muốn ngắt kết nối Torbox? Thao tác này sẽ xoá addon và API key đã lưu." + }, + "home_screen": { + "title": "Cài đặt màn hình chính", + "changes_applied": "Đã áp dụng thay đổi", + "display_options": "TUỲ CHỌN HIỂN THỊ", + "show_hero": "Hiện phần hero", + "show_hero_desc": "Nội dung nổi bật ở trên cùng", + "show_this_week": "Hiện phần Tuần này", + "show_this_week_desc": "Tập mới trong tuần hiện tại", + "select_catalogs": "Chọn danh mục", + "all_catalogs": "Tất cả danh mục", + "selected": "đã chọn", + "prefer_external_meta": "Ưu tiên Addon metadata bên ngoài", + "prefer_external_meta_desc": "Dùng metadata bên ngoài trên trang chi tiết", + "hero_layout": "Bố cục hero", + "layout_legacy": "Cổ điển", + "layout_carousel": "Băng chuyền", + "layout_appletv": "Apple TV", + "layout_desc": "Banner toàn màn hình, thẻ vuốt, hoặc kiểu Apple TV", + "featured_source": "Nguồn nổi bật", + "using_catalogs": "Dùng danh mục", + "manage_selected_catalogs": "Quản lý danh mục đã chọn", + "dynamic_bg": "Nền hero động", + "dynamic_bg_desc": "Ảnh nền mờ phía sau băng chuyền", + "performance_note": "Có thể ảnh hưởng hiệu suất trên thiết bị cấu hình thấp.", + "posters": "Poster", + "show_titles": "Hiện tiêu đề", + "poster_size": "Kích thước poster", + "poster_corners": "Góc poster", + "size_small": "Nhỏ", + "size_medium": "Vừa", + "size_large": "Lớn", + "corners_square": "Vuông", + "corners_rounded": "Bo tròn", + "corners_pill": "Viên nhộng", + "about_these_settings": "VỀ CÁC CÀI ĐẶT NÀY", + "about_desc": "Các cài đặt này kiểm soát cách hiển thị nội dung trên màn hình chính. Thay đổi được áp dụng ngay mà không cần khởi động lại ứng dụng.", + "hero_catalogs": { + "title": "Danh mục phần hero", + "select_all": "Chọn tất cả", + "clear_all": "Bỏ chọn tất cả", + "info": "Chọn danh mục hiển thị trong phần hero. Nếu không chọn, tất cả danh mục sẽ được dùng. Đừng quên nhấn Lưu khi xong.", + "settings_saved": "Đã lưu cài đặt", + "error_load": "Tải danh mục thất bại", + "movies": "Phim lẻ", + "tv_shows": "Phim bộ" + } + }, + "calendar": { + "title": "Lịch chiếu", + "loading": "Đang tải lịch chiếu...", + "no_scheduled_episodes": "Không có tập đã lên lịch", + "check_back_later": "Quay lại sau nhé", + "showing_episodes_for": "Hiển thị tập cho {{date}}", + "show_all_episodes": "Hiện tất cả tập", + "no_episodes_for": "Không có tập cho {{date}}", + "no_upcoming_found": "Không tìm thấy tập sắp tới", + "add_series_desc": "Thêm phim bộ vào thư viện để xem các tập sắp tới ở đây" + }, + "mdblist": { + "title": "Nguồn xếp hạng", + "status_disabled": "MDBList đã tắt", + "status_active": "API Key đang hoạt động", + "status_required": "Cần API Key", + "status_disabled_desc": "Tính năng MDBList hiện đang tắt.", + "status_active_desc": "Xếp hạng từ MDBList đã được bật.", + "status_required_desc": "Thêm key của bạn bên dưới để bật xếp hạng.", + "enable_toggle": "Bật MDBList", + "enable_toggle_desc": "Bật/tắt tất cả tính năng MDBList", + "api_section": "API Key", + "placeholder": "Dán API key MDBList vào đây", + "save": "Lưu", + "clear": "Xoá key", + "rating_providers": "Nhà cung cấp xếp hạng", + "rating_providers_desc": "Chọn xếp hạng nào hiển thị trong ứng dụng", + "how_to": "Cách lấy API key", + "step_1": "Đăng nhập vào", + "step_1_link": "trang web MDBList", + "step_2": "Vào", + "step_2_settings": "Cài đặt", + "step_2_api": "API", + "step_2_end": ".", + "step_3": "Tạo key mới và sao chép.", + "go_to_website": "Đến MDBList", + "alert_clear_title": "Xoá API Key", + "alert_clear_msg": "Bạn có chắc muốn xoá API key đã lưu?", + "success_saved": "Đã lưu API key thành công.", + "error_empty": "API Key không được để trống.", + "error_save": "Đã xảy ra lỗi khi lưu. Vui lòng thử lại.", + "api_key_empty_error": "API Key không được để trống.", + "success_cleared": "Đã xoá API key thành công", + "error_clear": "Xoá API key thất bại" + }, + "notification": { + "title": "Cài đặt thông báo", + "section_general": "Chung", + "enable_notifications": "Bật thông báo", + "section_types": "Loại thông báo", + "new_episodes": "Tập mới", + "upcoming_shows": "Chương trình sắp tới", + "reminders": "Nhắc nhở", + "section_timing": "Thời điểm thông báo", + "timing_desc": "Nhận thông báo trước khi tập phát sóng bao lâu?", + "hours_1": "1 giờ", + "hours_suffix": "giờ", + "section_status": "Trạng thái thông báo", + "stats_upcoming": "Sắp tới", + "stats_this_week": "Tuần này", + "stats_total": "Tổng cộng", + "sync_button": "Đồng bộ Thư viện & Trakt", + "syncing": "Đang đồng bộ...", + "sync_desc": "Tự động đồng bộ thông báo cho tất cả phim bộ trong thư viện và danh sách/bộ sưu tập Trakt.", + "section_advanced": "Nâng cao", + "reset_button": "Đặt lại tất cả thông báo", + "test_button": "Kiểm tra thông báo (5 giây)", + "test_notification_in": "Thông báo sau {{seconds}}s...", + "test_notification_text": "Thông báo sẽ xuất hiện sau {{seconds}} giây", + "alert_reset_title": "Đặt lại thông báo", + "alert_reset_msg": "Thao tác này sẽ huỷ tất cả thông báo đã lên lịch, nhưng không xoá gì khỏi thư viện. Bạn có chắc không?", + "alert_reset_success": "Đã đặt lại tất cả thông báo", + "alert_sync_complete": "Đồng bộ hoàn tất", + "alert_sync_msg": "Đã đồng bộ thông báo cho thư viện và Trakt thành công.\n\nĐã lên lịch: {{upcoming}} tập sắp tới\nTuần này: {{thisWeek}} tập", + "alert_test_scheduled": "Thông báo kiểm tra đã được lên lịch phát ngay" + }, + "backup": { + "title": "Sao lưu & Khôi phục", + "options_title": "Tuỳ chọn sao lưu", + "options_desc": "Chọn nội dung đưa vào bản sao lưu", + "section_core": "Dữ liệu cốt lõi", + "section_addons": "Addon & Tích hợp", + "section_settings": "Cài đặt & Tuỳ chọn", + "library_label": "Thư viện", + "library_desc": "Phim lẻ và phim bộ đã lưu", + "watch_progress_label": "Tiến độ xem", + "watch_progress_desc": "Vị trí xem tiếp", + "addons_label": "Addon", + "addons_desc": "Addon Stremio đã cài", + "plugins_label": "Plugin", + "plugins_desc": "Cấu hình scraper tuỳ chỉnh", + "trakt_label": "Tích hợp Trakt", + "trakt_desc": "Dữ liệu đồng bộ và token xác thực", + "app_settings_label": "Cài đặt ứng dụng", + "app_settings_desc": "Giao diện, tuỳ chọn và cấu hình", + "user_prefs_label": "Tuỳ chọn người dùng", + "user_prefs_desc": "Thứ tự addon và cài đặt giao diện", + "catalog_settings_label": "Cài đặt danh mục", + "catalog_settings_desc": "Bộ lọc và tuỳ chọn danh mục", + "api_keys_label": "API Key", + "api_keys_desc": "Khoá MDBList và OpenRouter", + "action_create": "Tạo bản sao lưu", + "action_restore": "Khôi phục từ bản sao lưu", + "section_info": "Về sao lưu", + "info_text": "• Tuỳ chỉnh nội dung sao lưu bằng các công tắc bên trên\n• File sao lưu được lưu cục bộ trên thiết bị\n• Chia sẻ bản sao lưu để chuyển dữ liệu giữa các thiết bị\n• Khôi phục sẽ ghi đè dữ liệu hiện tại", + "alert_create_title": "Tạo bản sao lưu", + "alert_no_content": "Chưa chọn nội dung để sao lưu.\n\nVui lòng bật ít nhất một tuỳ chọn trong phần Tuỳ chọn sao lưu bên trên.", + "alert_backup_created_title": "Đã tạo bản sao lưu", + "alert_backup_created_msg": "Bản sao lưu đã được tạo và sẵn sàng để chia sẻ.", + "alert_backup_failed_title": "Tạo bản sao lưu thất bại", + "alert_restore_confirm_title": "Xác nhận khôi phục", + "alert_restore_confirm_msg": "Thao tác này sẽ khôi phục dữ liệu từ bản sao lưu tạo ngày {{date}}.\n\nThao tác này sẽ ghi đè dữ liệu hiện tại. Bạn có chắc muốn tiếp tục?", + "alert_restore_complete_title": "Khôi phục hoàn tất", + "alert_restore_complete_msg": "Dữ liệu của bạn đã được khôi phục thành công. Vui lòng khởi động lại ứng dụng để thấy tất cả thay đổi.", + "alert_restore_failed_title": "Khôi phục thất bại", + "restart_app": "Khởi động lại ứng dụng", + "alert_restart_failed_title": "Khởi động lại thất bại", + "alert_restart_failed_msg": "Không thể khởi động lại ứng dụng. Vui lòng đóng và mở lại ứng dụng thủ công để xem dữ liệu đã khôi phục." + }, + "updates": { + "title": "Cập nhật ứng dụng", + "status_checking": "Đang kiểm tra cập nhật...", + "status_available": "Có bản cập nhật mới!", + "status_downloading": "Đang tải cập nhật...", + "status_installing": "Đang cài cập nhật...", + "status_success": "Đã cài cập nhật thành công!", + "status_error": "Cập nhật thất bại", + "status_ready": "Sẵn sàng kiểm tra cập nhật", + "action_check": "Kiểm tra cập nhật", + "action_install": "Cài cập nhật", + "release_notes": "Ghi chú phát hành:", + "version": "Phiên bản:", + "last_checked": "Kiểm tra lần cuối:", + "current_version": "Phiên bản hiện tại:", + "current_release_notes": "Ghi chú phát hành hiện tại:", + "github_release": "PHIÊN BẢN GITHUB", + "current": "Hiện tại:", + "latest": "Mới nhất:", + "notes": "Ghi chú:", + "view_release": "Xem phiên bản", + "notification_settings": "CÀI ĐẶT THÔNG BÁO", + "ota_alerts_label": "Thông báo cập nhật OTA", + "ota_alerts_desc": "Hiện thông báo cho cập nhật qua mạng", + "major_alerts_label": "Thông báo cập nhật lớn", + "major_alerts_desc": "Hiện thông báo cho phiên bản ứng dụng mới trên GitHub", + "alert_disable_ota_title": "Tắt thông báo cập nhật OTA?", + "alert_disable_ota_msg": "Bạn sẽ không còn nhận thông báo tự động cho cập nhật OTA.\n\n⚠️ Cảnh báo: Luôn dùng phiên bản mới nhất quan trọng vì:\n• Sửa lỗi và cải thiện độ ổn định\n• Tính năng mới và cải tiến\n• Cung cấp phản hồi và báo cáo lỗi chính xác\n\nBạn vẫn có thể kiểm tra cập nhật thủ công ở màn hình này.", + "alert_disable_major_title": "Tắt thông báo cập nhật lớn?", + "alert_disable_major_msg": "Bạn sẽ không còn nhận thông báo cho cập nhật ứng dụng lớn cần cài lại.\n\n⚠️ Cảnh báo: Cập nhật lớn thường bao gồm:\n• Bản vá bảo mật quan trọng\n• Thay đổi lớn cần cài lại ứng dụng\n• Sửa lỗi tương thích quan trọng\n\nBạn vẫn có thể kiểm tra cập nhật thủ công.", + "warning_note": "Bật thông báo đảm bảo bạn nhận được sửa lỗi và có thể cung cấp báo cáo lỗi chính xác.", + "disable": "Tắt", + "alert_no_update_to_install": "Không có bản cập nhật để cài", + "alert_install_failed": "Cài cập nhật thất bại", + "alert_no_update_title": "Không có cập nhật", + "alert_update_applied_msg": "Cập nhật sẽ được áp dụng khi khởi động lại ứng dụng" + }, + "player": { + "title": "Trình phát video", + "section_selection": "CHỌN TRÌNH PHÁT", + "internal_title": "Trình phát tích hợp", + "internal_desc": "Dùng trình phát video mặc định của ứng dụng", + "vlc_title": "VLC", + "vlc_desc": "Mở luồng trong VLC", + "infuse_title": "Infuse", + "infuse_desc": "Mở luồng trong Infuse", + "outplayer_title": "OutPlayer", + "outplayer_desc": "Mở luồng trong OutPlayer", + "vidhub_title": "VidHub", + "vidhub_desc": "Mở luồng trong VidHub", + "infuse_live_title": "Infuse LiveContainer", + "infuse_live_desc": "Mở luồng trong Infuse LiveContainer", + "external_title": "Trình phát bên ngoài", + "external_desc": "Mở luồng trong trình phát video ưa thích", + "section_playback": "TUỲ CHỌN PHÁT", + "skip_intro_settings_title": "Bỏ qua intro", + "powered_by_introdb": "Hỗ trợ bởi IntroDB", + "autoplay_title": "Tự động phát luồng đầu tiên", + "autoplay_desc": "Tự động bắt đầu luồng đầu tiên trong danh sách.", + "resume_title": "Luôn xem tiếp", + "resume_desc": "Bỏ qua hộp thoại xem tiếp và tự động tiếp tục từ vị trí đã dừng (nếu xem chưa đến 85%).", + "engine_title": "Engine trình phát", + "engine_desc": "Tự động dùng ExoPlayer với MPV dự phòng. Một số định dạng như Dolby Vision và HDR có thể không được MPV hỗ trợ, vì vậy Tự động được khuyến nghị.", + "decoder_title": "Chế độ giải mã", + "decoder_desc": "Cách giải mã video. Tự động được khuyến nghị để cân bằng tốt nhất.", + "gpu_title": "Kết xuất GPU", + "gpu_desc": "GPU-Next cung cấp quản lý HDR và màu sắc tốt hơn.", + "external_downloads_title": "Trình phát bên ngoài cho tải về", + "external_downloads_desc": "Phát nội dung đã tải trong trình phát bên ngoài ưa thích.", + "restart_required": "Cần khởi động lại", + "restart_msg_decoder": "Vui lòng khởi động lại ứng dụng để thay đổi bộ giải mã có hiệu lực.", + "restart_msg_gpu": "Vui lòng khởi động lại ứng dụng để thay đổi chế độ GPU có hiệu lực.", + "option_auto": "Tự động", + "option_auto_desc_engine": "ExoPlayer + MPV dự phòng", + "option_mpv": "MPV", + "option_mpv_desc": "Chỉ MPV", + "option_auto_desc_decoder": "Cân bằng tốt nhất", + "option_sw": "PM", + "option_sw_desc": "Phần mềm", + "option_hw": "PC", + "option_hw_desc": "Phần cứng", + "option_hw_plus": "PC+", + "option_hw_plus_desc": "Phần cứng toàn phần", + "option_gpu_desc": "Tiêu chuẩn", + "option_gpu_next_desc": "Nâng cao" + }, + "plugins": { + "title": "Plugin", + "enable_title": "Bật Plugin", + "enable_desc": "Bật engine plugin để xử lý các nguồn phương tiện bên ngoài", + "repo_config_title": "Cấu hình kho lưu trữ", + "repo_config_desc": "Quản lý kho plugin bên ngoài. Bật/tắt từng kho bên dưới.", + "your_repos": "Kho lưu trữ", + "your_repos_desc": "Cấu hình nguồn bên ngoài cho plugin.", + "add_repo_button": "Thêm kho", + "refresh": "Làm mới", + "remove": "Xoá", + "enabled": "Đã bật", + "disabled": "Đã tắt", + "updating": "Đang cập nhật...", + "success": "Thành công", + "error": "Lỗi", + "alert_repo_added": "Đã thêm kho và tải plugin thành công", + "alert_repo_saved": "Đã lưu URL kho thành công", + "alert_repo_refreshed": "Đã làm mới kho thành công", + "alert_invalid_url": "Định dạng URL không hợp lệ", + "alert_plugins_cleared": "Đã xoá tất cả plugin", + "alert_cache_cleared": "Đã xoá bộ nhớ đệm kho thành công", + "unknown": "Không xác định", + "active": "Đang hoạt động", + "available": "Khả dụng", + "platform_disabled": "Nền tảng không hỗ trợ", + "limited": "Giới hạn", + "clear_all": "Xoá tất cả plugin", + "clear_all_desc": "Bạn có chắc muốn xoá tất cả plugin đã cài? Thao tác này không thể hoàn tác.", + "clear_cache": "Xoá bộ nhớ đệm kho", + "clear_cache_desc": "Thao tác này sẽ xoá URL kho đã lưu và tất cả dữ liệu plugin đệm. Bạn sẽ cần nhập lại URL kho.", + "add_new_repo": "Thêm kho mới", + "available_plugins": "Plugin khả dụng ({{count}})", + "placeholder": "Tìm plugin...", + "all": "Tất cả", + "filter_all": "Tất cả loại", + "filter_movies": "Phim lẻ", + "filter_tv": "Phim bộ", + "enable_all": "Bật tất cả", + "disable_all": "Tắt tất cả", + "no_plugins_found": "Không tìm thấy plugin", + "no_plugins_available": "Không có plugin", + "no_match_desc": "Không có plugin nào khớp \"{{query}}\". Thử từ khoá khác.", + "configure_repo_desc": "Cấu hình kho bên trên để xem plugin khả dụng.", + "clear_search": "Xoá tìm kiếm", + "no_external_player": "Không có trình phát bên ngoài", + "showbox_token": "Token ShowBox UI", + "showbox_placeholder": "Dán token ShowBox UI vào đây", + "save": "Lưu", + "clear": "Xoá", + "additional_settings": "Cài đặt bổ sung", + "enable_url_validation": "Bật kiểm tra URL", + "url_validation_desc": "Kiểm tra URL phương tiện trước khi trả về (có thể làm chậm kết quả nhưng tăng độ tin cậy)", + "group_streams": "Nhóm nguồn plugin", + "group_streams_desc": "Khi bật, nguồn được nhóm theo kho. Khi tắt, mỗi plugin hiển thị như một nhà cung cấp riêng.", + "sort_quality": "Sắp xếp theo chất lượng trước", + "sort_quality_desc": "Khi bật, nguồn được sắp xếp theo chất lượng trước. Chỉ khả dụng khi bật nhóm.", + "show_logos": "Hiện logo plugin", + "show_logos_desc": "Hiển thị logo plugin bên cạnh link phương tiện trên màn hình nguồn.", + "quality_filtering": "Lọc chất lượng", + "quality_filtering_desc": "Loại trừ độ phân giải video cụ thể khỏi kết quả tìm kiếm. Nhấn vào chất lượng để loại trừ.", + "excluded_qualities": "Chất lượng bị loại:", + "language_filtering": "Lọc ngôn ngữ", + "language_filtering_desc": "Loại trừ ngôn ngữ cụ thể khỏi kết quả tìm kiếm. Nhấn vào ngôn ngữ để loại trừ.", + "note": "Lưu ý:", + "language_filtering_note": "Bộ lọc này chỉ áp dụng cho nhà cung cấp có thông tin ngôn ngữ. Không ảnh hưởng đến nhà cung cấp khác.", + "excluded_languages": "Ngôn ngữ bị loại:", + "about_title": "Về Plugin", + "about_desc_1": "Plugin là các thành phần modular xử lý nội dung từ nhiều giao thức bên ngoài. Chúng chạy cục bộ trên thiết bị và có thể cài từ kho tin cậy.", + "about_desc_2": "Plugin đánh dấu \"Giới hạn\" có thể cần cấu hình bên ngoài cụ thể.", + "help_title": "Thiết lập Plugin", + "help_step_1": "1. **Bật Plugin** - Bật công tắc chính", + "help_step_2": "2. **Thêm kho** - Thêm URL kho hợp lệ", + "help_step_3": "3. **Làm mới kho** - Lấy plugin khả dụng", + "help_step_4": "4. **Kích hoạt** - Bật plugin bạn muốn dùng", + "got_it": "Đã hiểu!", + "repo_format_hint": "Định dạng: https://raw.githubusercontent.com/username/repo/refs/heads/branch", + "cancel": "Huỷ", + "add": "Thêm" + }, + "theme": { + "title": "Giao diện ứng dụng", + "select_theme": "CHỌN GIAO DIỆN", + "create_custom": "Tạo giao diện tuỳ chỉnh", + "options": "TUỲ CHỌN", + "use_dominant_color": "Dùng màu chủ đạo từ ảnh", + "categories": { + "all": "Tất cả giao diện", + "dark": "Giao diện tối", + "colorful": "Màu sắc", + "custom": "Giao diện của tôi" + }, + "editor": { + "theme_name_placeholder": "Tên giao diện", + "save": "Lưu", + "primary": "Chính", + "secondary": "Phụ", + "background": "Nền", + "invalid_name_title": "Tên không hợp lệ", + "invalid_name_msg": "Vui lòng nhập tên giao diện hợp lệ" + }, + "alerts": { + "delete_title": "Xoá giao diện", + "delete_msg": "Bạn có chắc muốn xoá \"{{name}}\"?", + "ok": "OK", + "delete": "Xoá", + "cancel": "Huỷ", + "back": "Cài đặt" + } + }, + "legal": { + "title": "Pháp lý & Tuyên bố miễn trách", + "intro_title": "Bản chất ứng dụng", + "intro_text": "Nuvio là ứng dụng trình phát phương tiện và quản lý metadata. Nó chỉ hoạt động như giao diện phía máy khách để duyệt metadata công khai (phim, phim bộ...) và phát file phương tiện do người dùng hoặc tiện ích mở rộng bên thứ ba cung cấp. Nuvio không lưu trữ, phân phối hay lập chỉ mục nội dung phương tiện.", + "extensions_title": "Plugin bên thứ ba", + "extensions_text": "Nuvio sử dụng kiến trúc mở rộng cho phép người dùng cài plugin bên thứ ba. Các plugin này được phát triển và duy trì bởi các nhà phát triển độc lập không liên kết với Nuvio. Chúng tôi không kiểm soát và không chịu trách nhiệm về nội dung, tính hợp pháp hay chức năng của bất kỳ plugin bên thứ ba nào.", + "user_resp_title": "Trách nhiệm người dùng", + "user_resp_text": "Người dùng hoàn toàn chịu trách nhiệm về plugin họ cài và nội dung họ truy cập. Khi dùng ứng dụng này, bạn đồng ý đảm bảo rằng bạn có quyền hợp pháp để xem nội dung trên Nuvio. Các nhà phát triển Nuvio không ủng hộ hay khuyến khích vi phạm bản quyền.", + "dmca_title": "Bản quyền & DMCA", + "dmca_text": "Chúng tôi tôn trọng quyền sở hữu trí tuệ của người khác. Nuvio không lưu trữ nội dung phương tiện. Nếu bạn cho rằng code, tài sản hay giao diện của dự án này vi phạm quyền của bạn, hãy gửi thông báo qua kênh liên hệ chính thức của dự án trên trang web và kho lưu trữ.", + "warranty_title": "Không bảo hành", + "warranty_text": "Phần mềm này được cung cấp \"nguyên trạng\", không có bảo hành dưới bất kỳ hình thức nào, rõ ràng hay ngụ ý. Trong mọi trường hợp, tác giả hoặc chủ sở hữu bản quyền không chịu trách nhiệm về bất kỳ khiếu nại, thiệt hại hay trách nhiệm pháp lý nào phát sinh từ việc sử dụng phần mềm này." + }, + "plugin_tester": { + "title": "Kiểm tra Plugin", + "subtitle": "Chạy scraper và xem log theo thời gian thực", + "tabs": { + "individual": "Từng cái", + "repo": "Kiểm tra kho", + "code": "Code", + "logs": "Log", + "results": "Kết quả" + }, + "common": { + "error": "Lỗi", + "success": "Thành công", + "movie": "Phim lẻ", + "tv": "Phim bộ", + "tmdb_id": "TMDB ID", + "season": "Phần", + "episode": "Tập", + "running": "Đang chạy…", + "run_test": "Chạy kiểm tra", + "play": "Phát", + "done": "Xong", + "test": "Kiểm tra", + "testing": "Đang kiểm tra…" + }, + "individual": { + "load_from_url": "Tải từ URL", + "load_from_url_desc": "Dán URL GitHub thô hoặc IP cục bộ và nhấn tải.", + "enter_url_error": "Vui lòng nhập URL", + "code_loaded": "Đã tải code từ URL", + "fetch_error": "Tải thất bại: {{message}}", + "no_code_error": "Không có code để chạy", + "plugin_code": "Code Plugin", + "focus_editor": "Chọn trình soạn thảo code", + "code_placeholder": "// Dán code plugin vào đây...", + "test_parameters": "Tham số kiểm tra", + "no_logs": "Chưa có log. Chạy kiểm tra để xem đầu ra.", + "no_streams": "Chưa tìm thấy luồng nào.", + "streams_found": "Tìm thấy {{count}} luồng", + "streams_found_plural": "Tìm thấy {{count}} luồng", + "tap_play_hint": "Nhấn Phát để kiểm tra luồng trong trình phát.", + "unnamed_stream": "Luồng không tên", + "quality": "Chất lượng: {{quality}}", + "size": "Kích thước: {{size}}", + "url_label": "URL: {{url}}", + "headers_info": "Header: {{count}} header tuỳ chỉnh", + "find_placeholder": "Tìm trong code…", + "edit_code_title": "Sửa Code", + "no_url_stream_error": "Không tìm thấy URL cho luồng này" + }, + "repo": { + "title": "Kiểm tra kho", + "description": "Lấy kho (URL cục bộ hoặc GitHub thô) và kiểm tra từng nhà cung cấp.", + "enter_repo_url_error": "Vui lòng nhập URL kho", + "invalid_url_title": "URL không hợp lệ", + "invalid_url_msg": "Dùng URL GitHub thô hoặc URL http(s) cục bộ.\n\nVí dụ:\nhttps://raw.githubusercontent.com/tapframe/nuvio-providers/refs/heads/main", + "manifest_build_error": "Không thể tạo URL manifest từ đầu vào", + "manifest_fetch_error": "Tải manifest thất bại", + "repo_manifest_fetch_error": "Tải manifest kho thất bại", + "missing_filename": "Thiếu tên file trong manifest", + "scraper_build_error": "Không thể tạo URL scraper", + "download_scraper_error": "Tải scraper thất bại", + "test_failed": "Kiểm tra thất bại", + "test_parameters": "Tham số kiểm tra kho", + "test_parameters_desc": "Các tham số này chỉ dùng cho Kiểm tra kho.", + "using_info": "Đang dùng: {{mediaType}} • TMDB {{tmdbId}}", + "using_info_tv": "Đang dùng: {{mediaType}} • TMDB {{tmdbId}} • P{{season}}T{{episode}}", + "providers_title": "Nhà cung cấp", + "repository_default": "Kho lưu trữ", + "providers_count": "{{count}} nhà cung cấp", + "fetch_hint": "Lấy kho để liệt kê nhà cung cấp.", + "test_all": "Kiểm tra tất cả", + "status_running": "ĐANG CHẠY", + "status_ok": "OK ({{count}})", + "status_ok_empty": "OK (0)", + "status_failed": "THẤT BẠI", + "status_idle": "CHỜ", + "tried_url": "Đã thử: {{url}}", + "provider_logs": "Log nhà cung cấp", + "no_logs_captured": "Chưa có log nào." + } + } +} \ No newline at end of file diff --git a/src/i18n/resources.ts b/src/i18n/resources.ts index 8309d7b6..ccd4a023 100644 --- a/src/i18n/resources.ts +++ b/src/i18n/resources.ts @@ -25,6 +25,7 @@ import ro from './locales/ro.json'; import sq from './locales/sq.json'; import ca from './locales/ca.json'; import ja from './locales/ja.json'; +import vi from './locales/vi.json'; export const resources = { en: { translation: en }, @@ -53,4 +54,5 @@ export const resources = { sq: { translation: sq }, ca: { translation: ca }, ja: { translation: ja }, + vi: { translation: vi } }; From cdcbce754151df6cdbb5977dc4e5aced4d0ee1db Mon Sep 17 00:00:00 2001 From: Tuan Vu Date: Fri, 6 Mar 2026 00:41:26 +0700 Subject: [PATCH 2/2] Add vietnamese locale --- src/constants/locales.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/constants/locales.ts b/src/constants/locales.ts index 7fe86307..7c3332ac 100644 --- a/src/constants/locales.ts +++ b/src/constants/locales.ts @@ -24,4 +24,5 @@ export const LOCALES = [ { code: 'ro', key: 'romanian' }, { code: 'sq', key: 'albanian' }, { code: 'ca', key: 'catalan' }, + { code: 'vi', key: 'vietnamese' } ];