diff --git a/Gemfile b/Gemfile index 53cac15c41..c71a816429 100644 --- a/Gemfile +++ b/Gemfile @@ -169,7 +169,7 @@ gem 'unicorn' gem 'puma', '~> 5.1.0' # used for development and optionally for production -gem 'nokogiri', '~> 1.10.8' +gem 'nokogiri', '~> 1.11.0' gem 'carrierwave', '~> 1.3.1' gem 'carrierwave_direct', '~> 2.1.0' @@ -310,7 +310,7 @@ gem 'openproject-translations', git: 'https://github.com/opf/openproject-translations.git', branch: 'dev' -gem 'newrelic_rpm' +gem 'newrelic_rpm', require: ENV.has_key?('NEW_RELIC_LICENSE_KEY') # Load Gemfile.local, Gemfile.plugins, plugins', and custom Gemfiles gemfiles = Dir.glob File.expand_path('../{Gemfile.plugins,Gemfile.modules,Gemfile.local,lib/plugins/*/Gemfile}', diff --git a/Gemfile.lock b/Gemfile.lock index f9055187fb..06c68660dd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -574,7 +574,7 @@ GEM mimemagic (0.3.5) mini_magick (4.11.0) mini_mime (1.0.2) - mini_portile2 (2.4.0) + mini_portile2 (2.5.0) minisyntax (0.2.5) minitest (5.14.2) mixlib-shellout (2.1.0) @@ -591,8 +591,9 @@ GEM newrelic_rpm (6.14.0) nio4r (2.5.4) no_proxy_fix (0.1.2) - nokogiri (1.10.10) - mini_portile2 (~> 2.4.0) + nokogiri (1.11.0) + mini_portile2 (~> 2.5.0) + racc (~> 1.4) nokogumbo (2.0.4) nokogiri (~> 1.8, >= 1.8.4) octokit (4.19.0) @@ -670,6 +671,7 @@ GEM multi_json puma (5.1.0) nio4r (~> 2.0) + racc (1.5.2) rack (2.2.3) rack-accept (0.4.5) rack (>= 0.4) @@ -984,7 +986,7 @@ DEPENDENCIES my_page! net-ldap (~> 0.17.0) newrelic_rpm - nokogiri (~> 1.10.8) + nokogiri (~> 1.11.0) oj (~> 3.10.2) okcomputer (~> 1.18.1) omniauth! diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 75b7fd8486..badea28fc5 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -137,4 +137,8 @@ module UsersHelper def user_mail_notification_options(user) user.valid_notification_options.map { |o| [I18n.t(o.last), o.first] } end + + def user_name(user) + user ? user.name : I18n.t('user.deleted') + end end diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index 0ddd8af6fa..a440574f3f 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -362,7 +362,7 @@ de: label_next: "Weiter" label_no_color: "Keine Farbe" label_no_data: "Es sind keine Daten vorhanden" - label_no_due_date: "no finish date" + label_no_due_date: "kein Endtermin" label_no_start_date: "kein Startdatum" label_no_value: "Kein Wert" label_none: "keine" diff --git a/config/locales/crowdin/js-el.yml b/config/locales/crowdin/js-el.yml index 2f00193daa..0834323d1c 100644 --- a/config/locales/crowdin/js-el.yml +++ b/config/locales/crowdin/js-el.yml @@ -362,7 +362,7 @@ el: label_next: "Επόμενο" label_no_color: "Χωρίς χρώμα" label_no_data: "Δεν υπάρχουν δεδομένα για εμφάνιση" - label_no_due_date: "no finish date" + label_no_due_date: "ημερομηνία μη ολοκλήρωσης" label_no_start_date: "δεν υπάρχει ημερομηνία έναρξης" label_no_value: "Καμία τιμή" label_none: "κανένα" diff --git a/config/locales/crowdin/js-lt.yml b/config/locales/crowdin/js-lt.yml index ef0963c680..028661bee4 100644 --- a/config/locales/crowdin/js-lt.yml +++ b/config/locales/crowdin/js-lt.yml @@ -273,11 +273,11 @@ lt: standard: learn_about_link: https://www.openproject.org/openproject-11-1-release current_new_feature_html: > - The release contains various new features and improvements:
+ Ši laida turi įvairias naujas galimybes ir patobulinimus:
bim: learn_about_link: https://www.openproject.org/openproject-11-0-release current_new_feature_html: > - The release contains various new features and improvements:
+ Ši laida turi įvairias naujas galimybes ir patobulinimus:
label_activate: "Aktyvuoti" label_add_column_after: "Pridėti stulpelį po" label_add_column_before: "Pridėti stulpelį prieš" @@ -363,7 +363,7 @@ lt: label_next: "Kitas" label_no_color: "Be spalvų" label_no_data: "Nėra rodytinų duomenų" - label_no_due_date: "no finish date" + label_no_due_date: "be pabaigos datos" label_no_start_date: "nėra pradžios datos" label_no_value: "Nenurodytas dydis" label_none: "joks" diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index d58f232212..114f9b9797 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -362,7 +362,7 @@ ru: label_next: "Следующие" label_no_color: "Нет цвета" label_no_data: "Нет данных для отображения" - label_no_due_date: "no finish date" + label_no_due_date: "нет даты окончания" label_no_start_date: "без даты начала" label_no_value: "Значение отсутствует" label_none: "Ничего" diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml index 5e08bb0076..592e00c8f9 100644 --- a/config/locales/crowdin/js-tr.yml +++ b/config/locales/crowdin/js-tr.yml @@ -271,13 +271,13 @@ tr: text_new_features: "Yeni özellikler ve ürün güncellemeleri hakkında bilgi edinin." learn_about: "Yeni özellikler hakkında daha fazla bilgi edinin" standard: - learn_about_link: https://www.openproject.org/openproject-11-1-release + learn_about_link: https://www.openproject.org/openproject-11-0-release current_new_feature_html: > - The release contains various new features and improvements:
+ Sürüm, çeşitli yeni özellikler ve iyileştirmeler içerir:
bim: learn_about_link: https://www.openproject.org/openproject-11-0-release current_new_feature_html: > - The release contains various new features and improvements:
+ Sürüm, çeşitli yeni özellikler ve iyileştirmeler içerir:
label_activate: "Etkinleştir" label_add_column_after: "Sonrasına sütun ekle" label_add_column_before: "Öncesine sütun ekle" @@ -363,7 +363,7 @@ tr: label_next: "Sonraki" label_no_color: "Renk yok" label_no_data: "Görüntülenecek veri yok" - label_no_due_date: "no finish date" + label_no_due_date: "bitiş tarihi yok" label_no_start_date: "başlangıç tarihi yok" label_no_value: "Değer yok" label_none: "hiçbiri" diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index 1b1f32753c..1a90769197 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -35,18 +35,18 @@ vi: active: "Kích hoạt %{label} %{name}" close_popup_title: "Đóng" close_filter_title: "Đóng bộ lọc" - close_form_title: "Close form" + close_form_title: "Đóng biểu mẫu" button_add_watcher: "Thêm người theo dõi" button_add: "Thêm" button_back: "Quay lại" button_back_to_list_view: "Quay lại danh sách" button_cancel: "Hủy" button_close: "Đóng" - button_change_project: "Change project" + button_change_project: "Đổi dự án" button_check_all: "Đánh dấu tất cả" - button_configure-form: "Configure form" + button_configure-form: "Cấu hình biểu mẫu" button_confirm: "Xác nhận" - button_continue: "Continue" + button_continue: "Tiếp tục" button_copy: "Sao chép" button_custom-fields: "Tùy chỉnh mục" button_delete: "Xoá" @@ -65,47 +65,47 @@ vi: button_open_details: "Mở thông tin chi tiết xem" button_close_details: "Đóng xem chi tiết" button_open_fullscreen: "Mở chế độ toàn màn hình" - button_show_cards: "Show card view" - button_show_list: "Show list view" + button_show_cards: "Hiển thị duới dạng thẻ" + button_show_list: "Hiển thị dưới dạng danh sách" button_quote: "Trích dẫn" button_save: "Lưu" - button_settings: "Settings" + button_settings: "Cài đặt" button_uncheck_all: "Bỏ chọn tất cả" button_update: "Cập Nhật" button_export-pdf: "Tải PDF" button_export-atom: "Tải về Atom" calendar: title: 'Lịch' - too_many: 'There are %{count} work packages in total, but only %{max} can be shown.' + too_many: 'Tổng cộng có %{count} công việc, nhưng chỉ %{max} có thể được hiển thị.' card: - add_new: 'Add new card' + add_new: 'Thêm thẻ mới' highlighting: - inline: 'Highlight inline:' - entire_card_by: 'Entire card by' - remove_from_list: 'Remove card from list' + inline: 'Đánh dấu nội tuyến:' + entire_card_by: 'Toàn bộ thẻ của' + remove_from_list: 'Xóa thẻ khỏi danh sách' caption_rate_history: "Rate history" clipboard: browser_error: "Trình duyệt không hỗ trợ copy vào clipboard. Vui lòng copy văn bản đã chọn theo cách thủ công." copied_successful: "Sao chép thành công vào clipboard!" chart: - type: 'Chart type' - axis_criteria: 'Axis criteria' - modal_title: 'Work package graph configuration' + type: 'Kiểu đồ thị' + axis_criteria: 'Tiêu chí trục' + modal_title: 'Bảng cấu hình công việc' types: - line: 'Line' - horizontal_bar: 'Horizontal bar' - bar: 'Bar' - pie: 'Pie' - doughnut: 'Doughnut' - radar: 'Radar' - polar_area: 'Polar area' + line: 'Dòng' + horizontal_bar: 'Cột ngang' + bar: 'Thanh' + pie: 'Biểu đồ tròn' + doughnut: 'Bánh vòng' + radar: 'Ra đa' + polar_area: 'Vùng cực' tabs: graph_settings: 'Tổng quan' dataset: 'Dataset %{number}' errors: could_not_load: 'The data to display the graph could not be loaded. The necessary permissions may be lacking.' description_available_columns: "Cột có sẵn" - description_current_position: "You are here: " + description_current_position: "Bạn đang ở đây:" description_select_work_package: "Chọn work package #%{id}" description_selected_columns: "Các cột được lựa chọn" description_subwork_package: "Con của work package #%{id}" @@ -163,13 +163,13 @@ vi: admin: type_form: custom_field: 'Tùy chỉnh mục' - inactive: 'Inactive' + inactive: 'Không hoạt động' drag_to_activate: "Drag fields from here to activate them" add_group: "Thêm 1 nhóm thuộc tính" add_table: "Add table of related work packages" - edit_query: 'Edit query' + edit_query: 'Chỉnh sửa truy vấn' new_group: 'Nhóm mới' - reset_to_defaults: 'Reset to defaults' + reset_to_defaults: 'Đặt lại về mặc định' enterprise: trial: confirmation: "Confirmation of email address" @@ -184,10 +184,10 @@ vi: label_last_name: "Họ" label_email: "Thư điện tử" label_domain: "Domain" - label_subscriber: "Subscriber" + label_subscriber: "Người đăng ký" label_maximum_users: "Số người dùng hoạt động tối đa" label_starts_at: "Starts at" - label_expires_at: "Expires at" + label_expires_at: "Hết hạn lúc" receive_newsletter: I want to receive the OpenProject newsletter. taken_domain: There can only be one active trial per domain. taken_email: Each user can only create one trial. @@ -213,7 +213,7 @@ vi: installation_text: "Experienced software engineers guide you through the complete installation and setup process in your own infrastructure." premium_features: "Premium features" premium_features_text: "Agile boards, custom theme and logo, graphs, intelligent workflows with custom actions, full text search for work package attachments and multi-select custom fields." - professional_support: "Professional support" + professional_support: "Hỗ trợ chuyên nghiệp" professional_support_text: "Get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments." button_start_trial: "Bắt đầu dùng thử miễn phí" button_book_now: "Đặt chỗ ngay" @@ -227,7 +227,7 @@ vi: custom_actions: date: specific: 'lúc' - current_date: 'Current date' + current_date: 'Ngày hiện tại' error: internal: "Lỗi nội bộ đã xảy ra." cannot_save_changes_with_message: "Không thể lưu thay đổi của bạn do lỗi sau: %{error}" @@ -240,7 +240,7 @@ vi: description: text_open_filter: "Mở bộ lọc này với 'ALT' và phím mũi tên." text_close_filter: "Để nhập thôi ô đang kích hoạt nội dung Vd ấn enter. Nếu không muốn lọc lựa chọn mục rỗng đầu tiên." - noneElement: "(none)" + noneElement: "(trống)" time_zone_converted: two_values: "%{from} - %{to} in your local time." only_start: "From %{from} in your local time." @@ -295,10 +295,10 @@ vi: label_ascending: "Tăng dần" label_author: "Tác giả: %{user}" label_avatar: "Hình đại diện" - label_between: "between" - label_board: "Board" + label_between: "giữa" + label_board: "Bảng" label_board_locked: "Đã khóa" - label_board_plural: "Boards" + label_board_plural: "Bảng" label_board_sticky: "Chú ý" label_create: "Tạo mới" label_create_work_package: "Create new work package" @@ -322,7 +322,7 @@ vi: label_created_on: "tạo ngày" label_edit_comment: "Chỉnh sửa chú thích này" label_edit_status: "Trạng thái chỉnh sửa của nhóm công việc" - label_equals: "is" + label_equals: "là" label_expand: "Mở rộng" label_expanded: "đã mở rộng" label_expand_all: "Mở rộng tất cả" @@ -345,7 +345,7 @@ vi: label_in_more_than: "nhiều hơn" label_incoming_emails: "Các thư đến" label_information_plural: "Thông tin" - label_import: "Import" + label_import: "Nhập" label_latest_activity: "Hoạt động mới nhất" label_last_updated_on: "Cập nhật lần cuối lúc" label_learn_more_link: "Learn more" @@ -364,7 +364,7 @@ vi: label_no_data: "Không có dữ liệu để hiển thị" label_no_due_date: "no finish date" label_no_start_date: "không có ngày bắt đầu" - label_no_value: "No value" + label_no_value: "Không có giá trị" label_none: "không" label_not_contains: "không chứa" label_not_equals: "không là" @@ -385,7 +385,7 @@ vi: label_remove_columns: "Loại bỏ cột được chọn" label_remove_row: "Xóa hàng" label_report: "Báo cáo" - label_repository_plural: "Repositories" + label_repository_plural: "Kho lưu trữ" label_save_as: "Lưu thành" label_select_watcher: "Chọn một người theo dõi..." label_selected_filter_list: "Các bộ lọc đã chọn: %s" @@ -393,14 +393,14 @@ vi: label_show_in_menu: "Hiển thị chế độ xem trong menu" label_sort_by: "Sort by" label_sorted_by: "sắp xếp theo" - label_sort_higher: "Move up" + label_sort_higher: "Chuyển lên" label_sort_lower: "Dịch xuống" label_sorting: "Sắp xếp" label_spent_time: "Thời gian" label_star_query: "Ưa thích" label_press_enter_to_save: "Nhấn enter để lưu." label_public_query: "Công cộng" - label_sum: "Sum" + label_sum: "Tổng" label_sum_for: "Tổng cho" label_subject: "Chủ đề" label_this_week: "tuần này" @@ -522,7 +522,7 @@ vi: edit: form_configuration: "Cấu hình biểu mẫu" projects: "Các dự án" - settings: "Settings" + settings: "Cài đặt" time_entry: project: 'Dự án' work_package: 'Work Package' @@ -609,7 +609,7 @@ vi: text_attachment_destroy_confirmation: "Bạn có chắc bạn muốn xóa tập tin đính kèm?" timelines: quarter_label: 'Q%{quarter_number}' - gantt_chart: 'Gantt chart' + gantt_chart: 'Biểu đồ Gantt' labels: title: 'Cấu hình nhãn' bar: 'Bar labels' @@ -623,7 +623,7 @@ vi: button_deactivate: 'Ân biểu đồ sự kiện' cancel: Hủy change: "Change in planning" - due_date: "Finish date" + due_date: "Ngày hoàn thành" empty: "(empty)" error: "Lỗi đã xảy ra." errors: @@ -633,7 +633,7 @@ vi: report_timeout: "The timeline could not be loaded in a reasonable amount of time." filter: grouping_other: "Khác" - noneSelection: "(none)" + noneSelection: "(trống)" name: "Tên" outline: "Reset Outline" outlines: @@ -653,8 +653,8 @@ vi: selection_mode: notification: 'Click on any highlighted work package to create the relation. Press escape to cancel.' zoom: - in: "Zoom in" - out: "Zoom out" + in: "Phóng to" + out: "Thu nhỏ" auto: "Auto zoom" days: "Days" weeks: "Weeks" @@ -750,7 +750,7 @@ vi: createdAt: "Tạo ngày" description: "Mô tả" date: "Ngày" - dueDate: "Finish date" + dueDate: "Ngày hoàn thành" estimatedTime: "Thời gian dự kiến" spentTime: "Thời gian" category: "Thể loại" @@ -863,16 +863,16 @@ vi: toolbar: settings: configure_view: "Định cấu hình chế độ xem..." - columns: "Columns ..." - sort_by: "Sort by ..." - group_by: "Group by ..." - display_sums: "Display sums" - display_hierarchy: "Display hierarchy" - hide_hierarchy: "Hide hierarchy" - hide_sums: "Hide sums" + columns: "Cột..." + sort_by: "Sắp xếp theo..." + group_by: "Nhóm theo..." + display_sums: "Hiển thị tổng" + display_hierarchy: "Hiển thị phân cấp" + hide_hierarchy: "Ẩn phân cấp" + hide_sums: "Ẩn tổng" save: "Lưu" - save_as: "Save as ..." - export: "Export ..." + save_as: "Lưu duới dạng..." + export: "Xuất..." visibility_settings: "Cài đặt hiển thị..." page_settings: "Đổi tên chế độ hiển thị..." delete: "Xoá" @@ -884,16 +884,16 @@ vi: modals: label_settings: "Đổi tên trang" label_name: "Tên" - label_delete_page: "Delete current page" + label_delete_page: "Xóa trang hiện tại" button_apply: "Áp dụng" button_save: "Lưu" button_submit: "Gửi" button_cancel: "Hủy" form_submit: - title: 'Confirm to continue' - text: 'Are you sure you want to perform this action?' + title: 'Xác nhận để tiếp tục' + text: 'Bạn có thực sự muốn thực hiện thao tác này?' destroy_work_package: - title: "Confirm deletion of %{label}" + title: "Xác nhận xóa %{label}" text: "Are you sure you want to delete the following %{label} ?" has_children: "The work package has %{childUnits}:" confirm_deletion_children: "I acknowledge that ALL descendants of the listed work packages will be recursively removed." @@ -901,49 +901,49 @@ vi: destroy_time_entry: title: "Confirm deletion of time entry" text: "Are you sure you want to delete the following time entry?" - notice_no_results_to_display: "No visible results to display." + notice_no_results_to_display: "Không có kết quả để hiển thị." notice_successful_create: "Successful creation." notice_successful_delete: "Successful deletion." notice_successful_update: "Successful update." notice_bad_request: "Bad Request." relations: - empty: No relation exists + empty: Không tồn tại mối quan hệ remove: Loại bỏ các mối quan hệ inplace: - button_edit: "%{attribute}: Edit" - button_save: "%{attribute}: Save" - button_cancel: "%{attribute}: Cancel" + button_edit: "%{attribute}: Sửa" + button_save: "%{attribute}: Lưu" + button_cancel: "%{attribute}: Hủy" button_save_all: "Lưu" button_cancel_all: "Hủy" link_formatting_help: "Định dạng văn bản trợ giúp" btn_preview_enable: "Xem trước" - btn_preview_disable: "Disable preview" - null_value_label: "No value" + btn_preview_disable: "Tắt xem trước" + null_value_label: "Không có giá trị" clear_value_label: "-" errors: - required: '%{field} cannot be empty' - number: '%{field} is not a valid number' + required: '%{field} không thể để trống' + number: '%{field} không phải là số hợp lệ' maxlength: '%{field} không thể chứa hơn %{maxLength} digit(s)' minlength: '%{field} không thể chứa ít hơn %{minLength} digit(s)' messages_on_field: 'Mục này không hợp lệ: %{messages}' - error_could_not_resolve_version_name: "Couldn't resolve version name" - error_could_not_resolve_user_name: "Couldn't resolve user name" + error_could_not_resolve_version_name: "Không thể phân giải tên phiên bản" + error_could_not_resolve_user_name: "Không thể phân giải tên người dùng" error_attachment_upload: "Tập tin tải lên thất bại.%{error}" error_attachment_upload_permission: "Bạn không có quyền tải lên tập tin vào tài nguyên này." units: workPackage: - other: "work packages" + other: "công việc" child_work_packages: other: "%{count} tác phẩm gói phần mềm trẻ em" hour: - zero: "0 h" - other: "%{count} h" + zero: "0 giờ" + other: "%{count} giờ" zen_mode: - button_activate: 'Activate zen mode' - button_deactivate: 'Deactivate zen mode' + button_activate: 'Kích hoạt chế độ zen' + button_deactivate: 'Tắt chế độ zen' global_search: all_projects: "Cho tất cả các dự án" - search: "Search" + search: "Tìm kiếm" close_search: "Đóng tìm kiếm" current_project: "Trong dự án này" current_project_and_all_descendants: "Trong dự án này + các dự án con" @@ -952,6 +952,6 @@ vi: project_and_subprojects: "và tất cả các dự án con" search_for: "Tìm kiếm" views: - card: 'Cards' - list: 'Table' + card: 'Thẻ' + list: 'Bảng' timeline: 'Biểu đồ sự kiện' diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 6c7793425f..9210a4158b 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -1198,7 +1198,7 @@ tr: forums: "Topluluk forumu" newsletter: "Güvenlik uyarıları / haber bülteni" image_conversion: - imagemagick: 'Imagemagick' + imagemagick: 'Resim büyüsü' journals: changes_retracted: "Değişiklikler geri çekildi." links: diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 1323085199..b6b072b3be 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -172,7 +172,7 @@ vi: text_add_new_custom_field: > To add new custom fields to a project you first need to create them before you can add them to this project. is_enabled_globally: 'Is enabled globally' - enabled_in_project: 'Enabled in project' + enabled_in_project: 'Đã bật trong dự án' contained_in_type: 'Contained in type' confirm_destroy_option: "Xóa một tùy chọn sẽ xóa tất cả các sự kiện của nó (ví dụ như trong các gói công việc). Bạn có chắc bạn muốn xóa bỏ nó?" tab: @@ -214,7 +214,7 @@ vi: no_results_title_text: Không có hoạt động nào hiện tại. forums: no_results_title_text: There are currently no forums for the project. - no_results_content_text: Create a new forum + no_results_content_text: Tạo diễn đàn mới categories: no_results_title_text: Hiện có không có nhóm gói công việc. no_results_content_text: Tạo ra một loại gói công việc mới @@ -270,15 +270,15 @@ vi: types: index: no_results_title_text: There are currently no types. - no_results_content_text: Create a new type + no_results_content_text: Tạo loại mới edit: - settings: "Settings" + settings: "Cài đặt" form_configuration: "Mẫu cấu hình" projects: "Các dự án" - enabled_projects: "Enabled projects" - edit_query: "Edit table" - query_group_placeholder: "Give the table a name" - reset: "Reset to defaults" + enabled_projects: "Các dự án đã bật" + edit_query: "Chỉnh sửa bảng" + query_group_placeholder: "Đặt tên cho bảng" + reset: "Đặt lại về mặc định" type_color_text: | Click to assign or change the color of this type. The selected color distinguishes work packages in Gantt charts. It is therefore recommended to use a strong color. @@ -289,7 +289,7 @@ vi: page_not_editable_index: The requested page does not (yet) exist. You have been redirected to the index of all wiki pages. no_results_title_text: There are currently no wiki pages. index: - no_results_content_text: Add a new wiki page + no_results_content_text: Thêm một trang wiki mới work_flows: index: no_results_title_text: There are currently no workflows. @@ -317,7 +317,7 @@ vi: no_results_title_text: Không có phân loại. version: no_results_title_text: There are currently no versions available. - label_invitation: Invitation + label_invitation: Thư mời account: delete: "Xoá tài khoản" delete_confirmation: "Bạn có chắc chắn muốn xoá tài khoản chứ?" @@ -343,7 +343,7 @@ vi: error_self_registration_disabled: > Đăng ký người dùng bị vô hiệu hóa trên hệ thống này. Xin vui lòng hỏi người quản trị để tạo ra một tài khoản cho bạn. login_with_auth_provider: "hoặc đăng nhập bằng tài khoản hiện tại" - signup_with_auth_provider: "or sign up using" + signup_with_auth_provider: "hoặc sử dụng đăng ký" auth_source_login: Please login as %{login} to activate your account. omniauth_login: Please login to activate your account. actionview_instancetag_blank_option: "Vui lòng chọn" @@ -365,14 +365,14 @@ vi: account: "Tài khoản" attr_firstname: "Thuộc tính tên" attr_lastname: "Thuộc tính Họ" - attr_login: "Username attribute" + attr_login: "Thuộc tính tên người dùng" attr_mail: "Thuộc tính Email" base_dn: "DN căn bản" host: "Máy chủ" - onthefly: "Automatic user creation" + onthefly: "Tự động tạo người dùng" port: "Cổng" changeset: - repository: "Repository" + repository: "Kho lưu trữ" comment: commented: "Nhận xét" #an object that this comment belongs to custom_action: @@ -385,7 +385,7 @@ vi: is_required: "Bắt buộc" max_length: "Chiều dài tối đa" min_length: "Chiều dài tối thiểu" - multi_value: "Allow multi-select" + multi_value: "Cho phép nhiều lựa chọn" possible_values: "Giá trị có thể" regexp: "Biểu thức chính quy" searchable: "Có thể tìm kiếm được" @@ -393,10 +393,10 @@ vi: custom_value: value: "Giá trị" enterprise_token: - starts_at: "Valid since" - expires_at: "Expires at" - subscriber: "Subscriber" - encoded_token: "Enterprise support token" + starts_at: "Có hiệu lực kể từ" + expires_at: "Hết hạn lúc" + subscriber: "Người đăng ký" + encoded_token: "Mã thông báo hỗ trợ doanh nghiệp" active_user_count_restriction: "Số người dùng hoạt động tối đa" grids/grid: page: "Trang" @@ -409,7 +409,7 @@ vi: to: "Work package liên quan" status: is_closed: "Work package đã đóng" - is_readonly: "Work package read-only" + is_readonly: "Work package chỉ đọc" journal: notes: "Ghi chú" member: @@ -436,7 +436,7 @@ vi: relations_of_type_column: "%{type} quan hệ" group_by: "Nhóm kết quả bởi" filters: "Bộ lọc" - timeline_labels: "Timeline labels" + timeline_labels: "Nhãn dòng thời gian" repository: url: "Đường dẫn (URL)" role: @@ -447,7 +447,7 @@ vi: spent_on: "Ngày" type: "Kiểu" type: - description: "Default text for description" + description: "Văn bản mặc định cho mô tả" attribute_groups: '' is_in_roadmap: "Hiển thị trong lộ trình mặc định" is_default: "Kích hoạt cho các dự án mới theo mặc định" @@ -456,14 +456,14 @@ vi: user: admin: "Người Quản lý" auth_source: "Chế độ xác thực" - current_password: "Current password" + current_password: "Mật khẩu hiện tại" force_password_change: "Buộc thay đổi mật khẩu trong lần đăng nhập tiếp theo" language: "Ngôn ngữ" last_login_on: "Lần đăng nhập trước" mail_notification: "Thông báo qua email" new_password: "Mật khẩu mới" password_confirmation: "Xác nhận lại mật khẩu" - consented_at: "Consented at" + consented_at: "Đồng ý tại" user_preference: comments_sorting: "Hiện bình luận" hide_mail: "Ẩn địa chỉ email của tôi" @@ -472,7 +472,7 @@ vi: auto_hide_popups: "Auto-hide success notifications" warn_on_leaving_unsaved: "Warn me when leaving a work package with unsaved changes" version: - effective_date: "Finish date" + effective_date: "Ngày hoàn thành" sharing: "Chia sẻ" wiki_content: text: "Văn bản" @@ -482,18 +482,18 @@ vi: planning_element_type_color: hexcode: Mã Hex work_package: - begin_insertion: "Begin of the insertion" - begin_deletion: "Begin of the deletion" + begin_insertion: "Bắt đầu chèn" + begin_deletion: "Bắt đầu xóa" children: "Subelements" - done_ratio: "Progress (%)" - end_insertion: "End of the insertion" - end_deletion: "End of the deletion" + done_ratio: "Phát triển (%)" + end_insertion: "Kết thúc chèn" + end_deletion: "Kết thúc quá trình xóa" version: "Phiên bản" parent: "Cha" parent_issue: "Cha" parent_work_package: "Cha" priority: "Độ ưu tiên" - progress: "Progress (%)" + progress: "Phát triển (%)" schedule_manually: "Manual scheduling" spent_hours: "Thời gian" spent_time: "Thời gian" @@ -502,8 +502,8 @@ vi: type: "Kiểu" watcher: "Người quan sát" 'doorkeeper/application': - uid: "Client ID" - secret: "Client secret" + uid: "ID Khách hàng" + secret: "Bí mật khách hàng" owner: "Người sở hữu" redirect_uri: "URI đổi hướng" client_credentials_user_id: "Client Credentials User ID" @@ -511,49 +511,49 @@ vi: confidential: "Bí mật" errors: messages: - accepted: "must be accepted." - after: "must be after %{date}." - after_or_equal_to: "must be after or equal to %{date}." - before: "must be before %{date}." - before_or_equal_to: "must be before or equal to %{date}." - blank: "can't be blank." + accepted: "phải được đồng ý" + after: "phải sau %{date}" + after_or_equal_to: "phải sau hoặc tương đương với %{date}" + before: "phải trước khi %{date}" + before_or_equal_to: "phải có trước hay tương đương với %{date}" + blank: "không được để trống" cant_link_a_work_package_with_a_descendant: "A work package cannot be linked to one of its subtasks." circular_dependency: "This relation would create a circular dependency." - confirmation: "doesn't match %{attribute}." + confirmation: "không khớp %{attribute}." could_not_be_copied: "%{dependency} could not be (fully) copied." - does_not_exist: "does not exist." + does_not_exist: "không tồn tại" error_unauthorized: "Có thể không được truy cập." error_readonly: "was attempted to be written but is not writable." - empty: "can't be empty." + empty: "không thể để trống" even: "must be even." - exclusion: "is reserved." - file_too_large: "is too large (maximum size is %{count} Bytes)." - greater_than: "must be greater than %{count}." - greater_than_or_equal_to: "must be greater than or equal to %{count}." + exclusion: "được bảo lưu." + file_too_large: "quá lớn (kích thước tối đa là %{count} bytes)" + greater_than: "phải lớn hơn %{count}" + greater_than_or_equal_to: "phải lớn hơn hoặc bằng %{count}" greater_than_or_equal_to_start_date: "phải lớn hơn hoặc bằng ngày bắt đầu." greater_than_start_date: "phải lớn hơn ngày bắt đầu." - inclusion: "is not set to one of the allowed values." - invalid: "is invalid." - invalid_url: 'is not a valid URL.' - invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' - less_than_or_equal_to: "must be less than or equal to %{count}." + inclusion: "không nằm trong các giá trị cho phép" + invalid: "không hợp lệ" + invalid_url: 'không phải là một URL hợp lệ.' + invalid_url_scheme: 'không phải là giao thức được hỗ trợ (được phép: %{allowed_schemes}).' + less_than_or_equal_to: "phải nhỏ hơn hoặc bằng %{count}" not_current_user: "is not the current user." - not_a_date: "is not a valid date." - not_a_datetime: "is not a valid date time." - not_a_number: "is not a number." + not_a_date: "không phải là ngày hợp lệ" + not_a_datetime: "không phải là thời gian hợp lệ" + not_a_number: "không phải là số" not_allowed: "không hợp lệ vì thiếu quyền." - not_an_integer: "is not an integer." + not_an_integer: "không phải là một số nguyên" not_an_iso_date: "không phải là một ngày hợp lệ. Yêu cầu định dạng: YYYY-MM-DD." - not_same_project: "doesn't belong to the same project." - odd: "must be odd." + not_same_project: "không thuộc cùng dự án." + odd: "phải là số lẻ" regex_invalid: "có thể không được xác nhận với các biểu hiện thường xuyên liên kết." - smaller_than_or_equal_to_max_length: "must be smaller than or equal to maximum length." - taken: "has already been taken." - too_long: "is too long (maximum is %{count} characters)." - too_short: "is too short (minimum is %{count} characters)." + smaller_than_or_equal_to_max_length: "phải nhỏ hơn hoặc bằng với chiều dài tối đa" + taken: "đã bị dùng rồi." + too_long: "quá dài (tối đa %{count} ký tự)." + too_short: "quá ngắn (tối thiểu %{count} ký tự)." unchangeable: "không thể thay đổi." - unremovable: "cannot be removed." - wrong_length: "is the wrong length (should be %{count} characters)." + unremovable: "không thể gỡ bỏ." + wrong_length: "độ dài không đúng (phải là %{count} ký tự)." models: custom_field: at_least_one_custom_option: "Ít nhất một lựa chọn cần phải được cung cấp." @@ -561,7 +561,7 @@ vi: only_one_allowed: "(%{name}) chỉ có một giá trị được cho phép." empty: "giá trị (%{name}) không thể để trống." inclusion: "giá trị (%{name}) không được đặt vào một trong các giá trị được cho phép." - not_logged_in: "(%{name}) value cannot be set because you are not logged in." + not_logged_in: "Không thể đặt giá trị (%{name}) vì bạn chưa đăng nhập." not_an_integer: "(%{name}) không phải là một số nguyên." smaller_than_or_equal_to: "(%{name}) phải nhỏ hơn hoặc bằng %{count}." greater_than_or_equal_to: "(%{name}) phải nhỏ hơn hoặc bằng %{count}." @@ -569,7 +569,7 @@ vi: doorkeeper/application: attributes: redirect_uri: - fragment_present: 'cannot contain a fragment.' + fragment_present: 'không thể chứa một đoạn.' invalid_uri: 'phải là một URI hợp lệ.' relative_uri: 'phải là một URI tuyệt đối.' secured_uri: 'phải là một HTTPS/SSL URI.' @@ -577,7 +577,7 @@ vi: scopes: not_match_configured: "không phù hợp bất cứ phạm vi nào." enterprise_token: - unreadable: "can't be read. Are you sure it is a support token?" + unreadable: "không thể đọc được. Bạn có chắc đó là mã thông báo hỗ trợ không?" grids/grid: overlaps: 'chồng lấn.' outside: 'nằm ngoài bảng dữ liệu.' @@ -585,35 +585,35 @@ vi: parse_schema_filter_params_service: attributes: base: - unsupported_operator: "The operator is not supported." - invalid_values: "A value is invalid." - id_filter_required: "An 'id' filter is required." + unsupported_operator: "Nhà điều hành không được hỗ trợ." + invalid_values: "Giá trị không hợp lệ" + id_filter_required: "Bộ lọc 'id' là bắt buộc." project: archived_ancestor: 'Dự án có một khu vực lưu trữ' foreign_wps_reference_version: 'Các gói công việc trong các phiên bản tham chiếu không kế thừa của dự án hoặc kế thừa nó.' attributes: types: - in_use_by_work_packages: "still in use by work packages: %{types}" + in_use_by_work_packages: "gói công việc vẫn được sử dụng: %{types}" query: attributes: project: - error_not_found: "not found" + error_not_found: "không tìm thấy" public: error_unauthorized: "-Người dùng không có quyền tạo ra khu vực xem công cộng." group_by: - invalid: "Can't group by: %{value}" + invalid: "Không thể nhóm theo: %{value}" format: "%{message}" column_names: - invalid: "Invalid query column: %{value}" + invalid: "Cột truy vấn không hợp lệ: %{value}" format: "%{message}" sort_criteria: - invalid: "Can't sort by column: %{value}" + invalid: "Không thể sắp xếp theo cột: %{value}" format: "%{message}" group_by_hierarchies_exclusive: "is mutually exclusive with group by '%{group_by}'. You cannot activate both." filters: custom_fields: - inexistent: "There is no custom field for the filter." - invalid: "The custom field is not valid in the given context." + inexistent: "Không có trường tùy chỉnh cho bộ lọc." + invalid: "Trường tùy chỉnh không hợp lệ trong ngữ cảnh nhất định." queries/filters/base: attributes: values: @@ -621,24 +621,24 @@ vi: format: "%{message}" relation: typed_dag: - circular_dependency: "The relationship creates a circle of relationships." + circular_dependency: "Mối quan hệ tạo ra một vòng tròn các mối quan hệ." attributes: to: - error_not_found: "work package in `to` position not found or not visible" + error_not_found: "work package ở vị trí `đến` không tìm thấy hoặc không hiển thị" error_readonly: "an existing relation's `to` link is immutable" from: - error_not_found: "work package in `from` position not found or not visible" + error_not_found: "work package ở vị trí `từ` không tìm thấy hoặc không hiển thị" error_readonly: "an existing relation's `from` link is immutable" repository: - not_available: "SCM vendor is not available" - not_whitelisted: "is not allowed by the configuration." - invalid_url: "is not a valid repository URL or path." - must_not_be_ssh: "must not be an SSH url." - no_directory: "is not a directory." + not_available: "Nhà cung cấp SCM không có sẵn" + not_whitelisted: "không được cấu hình cho phép." + invalid_url: "không phải là đường dẫn hoặc URL kho lưu trữ hợp lệ." + must_not_be_ssh: "không được là đường dẫn SSH." + no_directory: "không phải là một thư mục." role: attributes: permissions: - dependency_missing: "need to also include '%{dependency}' as '%{permission}' is selected." + dependency_missing: "cần bao gồm '%{dependency}' vì '%{permission}' được chọn." time_entry: attributes: hours: @@ -647,20 +647,20 @@ vi: is_not_a_valid_target_for_time_entries: "Work package #%{id} không phải là một mục tiêu hợp lệ để gán lại các mục thời gian." attributes: due_date: - not_start_date: "is not on start date, although this is required for milestones." + not_start_date: "không phải ngày bắt đầu, mặc dù điều này là cần thiết cho các mốc quan trọng." parent: - cannot_be_milestone: "cannot be a milestone." - cannot_be_in_another_project: "cannot be in another project." - not_a_valid_parent: "is invalid." + cannot_be_milestone: "không thể là một cột mốc." + cannot_be_in_another_project: "không thể có trong một dự án khác." + not_a_valid_parent: "không hợp lệ" start_date: violates_relationships: "chỉ có thể được thiếp lập sang %{soonest_start} hoặc mới hơn để không làm vi phạm các mối quan hệ của work package." status_id: - status_transition_invalid: "is invalid because no valid transition exists from old to new status for the current user's roles." + status_transition_invalid: "không hợp lệ vì không tồn tại chuyển đổi hợp lệ từ trạng thái cũ sang trạng thái mới cho vai trò của người dùng hiện tại." status_invalid_in_type: "không hợp lệ vì tình trạng hiện tại không tồn tại loại này." type: - cannot_be_milestone_due_to_children: "cannot be a milestone because this work package has children." + cannot_be_milestone_due_to_children: "không thể là một mốc quan trọng vì work package này có trẻ em." priority_id: - only_active_priorities_allowed: "needs to be active." + only_active_priorities_allowed: "cần phải hoạt động." category: only_same_project_categories_allowed: "Các thể loại của một work package phải trong dự án tương tự như work package." does_not_exist: "Thể loại đã chỉ định không tồn tại." @@ -690,13 +690,13 @@ vi: status: invalid_on_create: "is not a valid status for new users." auth_source: - error_not_found: "not found" + error_not_found: "không tìm thấy" member: principal_blank: "Vui lòng chọn ít nhất một người dùng hoặc nhóm." - role_blank: "need to be assigned." + role_blank: "cần được chỉ định." attributes: roles: - ungrantable: "has an unassignable role." + ungrantable: "có một vai trò không thể chuyển nhượng." principal: unassignable: "cannot be assigned to a project." version: @@ -761,7 +761,7 @@ vi: derived_estimated_time: "Derived estimated time" derived_start_date: "Derived start date" display_sums: "Hiển thị tổng" - due_date: "Finish date" + due_date: "Ngày hoàn thành" estimated_hours: "Thời gian dự kiến" estimated_time: "Thời gian dự kiến" firstname: "Tên" @@ -775,7 +775,7 @@ vi: #kept for backwards compatibility issue: "Work Package" lastname: "Họ" - login: "Username" + login: "Tên người dùng" mail: "Thư điện tử" name: "Tên" password: "Mật khẩu" @@ -799,7 +799,7 @@ vi: work_package: "Work Package" button_add: "Thêm" button_add_comment: "Thêm bình luận" - button_add_member: Add member + button_add_member: Thêm thành viên button_add_watcher: "Thêm người theo dõi" button_annotate: "Chú giải" button_apply: "Áp dụng" @@ -815,13 +815,13 @@ vi: button_close: 'Đóng' button_collapse_all: "Thu gọn tất cả" button_configure: "Thiết lập" - button_continue: "Continue" + button_continue: "Tiếp tục" button_copy: "Sao chép" button_copy_and_follow: "Sao chép và làm theo" button_create: "Tạo mới" button_create_and_continue: "Tạo và tiếp tục" button_delete: "Xoá" - button_decline: "Decline" + button_decline: "Từ chối" button_delete_watcher: "Xóa watcher %{name}" button_download: "Tải" button_duplicate: "Nhân đôi" @@ -829,23 +829,23 @@ vi: button_edit_associated_wikipage: "Chỉnh sửa trang Wiki liên quan: %{page_title}" button_expand_all: "Mở rộng tất cả" button_filter: "Bộ lọc" - button_generate: "Generate" + button_generate: "Tạo" button_list: "Danh sách" button_lock: "Khóa" button_login: "Đăng nhập" button_move: "Di chuyển" button_move_and_follow: "Di chuyển và thực hiện theo" - button_print: "Print" + button_print: "In" button_quote: "Trích dẫn" - button_remove: Remove + button_remove: Xoá button_rename: "Đổi tên" - button_replace: "Replace" + button_replace: "Thay thế" button_revoke: "Thu hồi" button_reply: "Trả lời" button_reset: "Reset" button_rollback: "Quay trở lại phiên bản này" button_save: "Lưu" - button_save_back: "Save and back" + button_save_back: "Lưu và trở lại" button_show: "Hiện" button_sort: "Sắp xếp" button_submit: "Gửi" @@ -855,8 +855,8 @@ vi: button_unlock: "Mở khoá" button_unwatch: "Ngừng theo dõi" button_update: "Cập Nhật" - button_upgrade: "Upgrade" - button_upload: "Upload" + button_upgrade: "Nâng cấp" + button_upload: "Tải lên" button_view: "Khung nhìn" button_watch: "Theo dõi" button_manage_menu_entry: "Cấu hình các mục trình đơn" @@ -864,11 +864,11 @@ vi: button_configure_menu_entry: "Cấu hình các mục trình đơn" button_delete_menu_entry: "Xóa mục trình đơn" consent: - checkbox_label: I have noted and do consent to the above. - failure_message: Consent failed, cannot proceed. - title: User Consent - decline_warning_message: You have declined to consent and have been logged out. - user_has_consented: User has consented to your configured statement at the given time. + checkbox_label: Tôi đã ghi nhận và đồng ý với những điều trên. + failure_message: Sự đồng ý không thành công, không thể tiếp tục. + title: Sự đồng ý của người dùng + decline_warning_message: Bạn đã từ chối đồng ý và đã đăng xuất. + user_has_consented: Người dùng đã đồng ý với tuyên bố được định cấu hình của bạn tại thời điểm nhất định. not_yet_consented: User has not consented yet, will be requested upon next login. contact_mail_instructions: Define the mail address that users can reach a data controller to perform data change or removal requests. contact_your_administrator: Please contact your administrator if you want to have your account deleted. @@ -1034,9 +1034,9 @@ vi: This field uses autocomplete. While typing the title of a work package you will receive a list of possible candidates. Choose one using the arrow up and arrow down key and select it with tab or enter. Alternatively you can enter the work package number directly. description_available_columns: "Cột có sẵn" description_choose_project: "Các dự án" - description_compare_from: "Compare from" - description_compare_to: "Compare to" - description_current_position: "You are here: " + description_compare_from: "So sánh từ" + description_compare_to: "So sánh đến" + description_current_position: "Bạn đang ở đây:" description_date_from: "Nhập ngày bắt đầu" description_date_to: "Nhập ngày kết thúc" description_enter_number: "Nhập số" @@ -1063,8 +1063,8 @@ vi: upsale: form_configuration: description: "Customize the form configuration with these additional features:" - add_groups: "Add new attribute groups" - rename_groups: "Rename attributes groups" + add_groups: "Thêm 1 nhóm thuộc tính" + rename_groups: "Đổi tên nhóm thuộc tính" project_filters: description_html: "Lọc và sắp xếp trên các trường tùy chỉnh là một tính năng phiên bản doanh nghiệp." enumeration_activities: "Theo dõi hoạt động" @@ -1076,19 +1076,19 @@ vi: error_can_not_delete_custom_field: "Không thể xóa mục tùy biến" error_can_not_delete_type: "Kiểu này chứa các work package và không thể bị xóa." error_can_not_delete_standard_type: "Kiểu chuẩn không thể bị xóa." - error_can_not_invite_user: "Failed to send invitation to user." + error_can_not_invite_user: "Gửi lời mời không thành công." error_can_not_remove_role: "Vai trò này đang được sử dụng và không thể bị xóa." error_can_not_reopen_work_package_on_closed_version: "Không thể mở lại cho một work package đã được gán cho một phiên bản đã đóng" - error_can_not_find_all_resources: "Could not find all related resources to this request." + error_can_not_find_all_resources: "Không thể tìm thấy tất cả các tài nguyên liên quan đến yêu cầu này." error_can_not_unarchive_project: "Dự án này không thể lưu trữ: %{errors}" error_check_user_and_role: "Hãy chọn người dùng và một vai trò." - error_code: "Error %{code}" + error_code: "Lỗi %{code}" error_cookie_missing: 'The OpenProject cookie is missing. Please ensure that cookies are enabled, as this application will not properly function without.' - error_custom_option_not_found: "Option does not exist." - error_enterprise_activation_user_limit: "Your account could not be activated (user limit reached). Please contact your administrator to gain access." + error_custom_option_not_found: "Tùy chọn không tồn tại." + error_enterprise_activation_user_limit: "Không thể kích hoạt tài khoản của bạn (đã đạt đến giới hạn người dùng). Vui lòng liên hệ với quản trị viên của bạn để có quyền truy cập." error_enterprise_token_invalid_domain: "The Enterprise Edition is not active. Your Enterprise token's domain (%{actual}) does not match the system's host name (%{expected})." - error_failed_to_delete_entry: 'Failed to delete this entry.' - error_in_dependent: "Error attempting to alter dependent object: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" + error_failed_to_delete_entry: 'Không xóa được mục này.' + error_in_dependent: "Lỗi khi cố gắng thay đổi đối tượng phụ thuộc: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" error_invalid_selected_value: "Giá trị đã chọn không hợp lệ." error_journal_attribute_not_present: "Journal does not contain attribute %{attribute}." error_pdf_export_too_many_columns: "Too many columns selected for the PDF export. Please reduce the number of columns." @@ -1200,13 +1200,13 @@ vi: description: "All of them have been disabled. They can be re-enabled in the administration menu." access_token: "Access token" headers: - action: "Action" - expiration: "Expires" - indefinite_expiration: "Never" - label_accessibility: "Accessibility" + action: "Hành động" + expiration: "Hết hạn" + indefinite_expiration: "Không bao giờ" + label_accessibility: "Trợ năng" label_account: "Tài khoản" label_active: "Đang hoạt động" - label_activate_user: 'Activate user' + label_activate_user: 'Người dùng kích họat' label_active_in_new_projects: "Active in new projects" label_activity: "Hoạt động" label_add_edit_translations: "Add and edit translations" @@ -1249,44 +1249,44 @@ vi: label_available_project_work_package_categories: 'Available work package categories' label_available_project_work_package_types: 'Available work package types' label_available_project_forums: 'Available forums' - label_available_project_versions: 'Available versions' - label_available_project_repositories: 'Available repositories' - label_api_documentation: "API documentation" - label_between: "between" + label_available_project_versions: 'Phiên bản sẵn có' + label_available_project_repositories: 'Kho có sẵn' + label_api_documentation: "Tài liệu API" + label_between: "giữa" label_blocked_by: "bị chặn bởi" label_blocks: "các khối" - label_blog: "Blog" + label_blog: "Nhật ký" label_forums_locked: "Đã khóa" label_forum_new: "Diễn đàn mới" label_forum_plural: "Diễn đàn" label_forum_sticky: "Chú ý" label_boolean: "Boolean" label_branch: "Nhánh" - label_browse: "Browse" + label_browse: "Duyệt" label_bulk_edit_selected_work_packages: "Chỉnh sửa các work package đã chọn" - label_bundled: '(Bundled)' + label_bundled: '(Tích hợp sẵn)' label_calendar: "Lịch" label_calendar_show: "Hiển thị Lịch" label_category: "Thể loại" - label_consent_settings: "User Consent" + label_consent_settings: "Sự đồng ý của người dùng" label_wiki_menu_item: Khoản mục menu wiki label_select_main_menu_item: Chọn mục trình đơn chính mới - label_select_project: "Select a project" - label_required_disk_storage: "Required disk storage" - label_send_invitation: Send invitation + label_select_project: "Chọn dự án" + label_required_disk_storage: "Ổ đĩa lưu trữ bắt buộc" + label_send_invitation: Gửi lời mời label_change_plural: "Thay đổi" label_change_properties: "Thay đổi những thuộc tính" label_change_status: "Đổi trạng thái" - label_change_status_of_user: "Change status of #{username}" + label_change_status_of_user: "Thay đổi trạng thái cho #{username}" label_change_view_all: "Xem mọi thay đổi" label_changes_details: "Các chi tiết của tất cả thay đổi" - label_changeset: "Changeset" - label_changeset_id: "Changeset ID" + label_changeset: "Bộ thay đổi" + label_changeset_id: "ID bộ thay đổi" label_changeset_plural: "Nhóm thay đổi" label_checked: "Đã check" - label_check_uncheck_all_in_column: "Check/Uncheck all in column" - label_check_uncheck_all_in_row: "Check/Uncheck all in row" - label_child_element: "Child element" + label_check_uncheck_all_in_column: "Chọn/Bỏ chọn tất cả trong cột" + label_check_uncheck_all_in_row: "Chọn/Bỏ chọn tất cả trong hàng" + label_child_element: "Phần tử con" label_chronological_order: "Theo thứ tự thời gian" label_close_versions: "Đóng các phiên bản đã hoàn thành" label_closed_work_packages: "đã đóng" @@ -1303,7 +1303,7 @@ vi: label_contains: "bao gồm" label_content: "Nội dung" label_copied: "đã sao chép" - label_copy_to_clipboard: "Copy to clipboard" + label_copy_to_clipboard: "Sao chép vào clipboard" label_copy_same_as_target: "Giống như mục tiêu" label_copy_source: "Nguồn" label_copy_target: "Mục tiêu" @@ -1312,29 +1312,29 @@ vi: label_core_version: "Phiên bản lõi" label_current_status: "Tình trạng hiện tại" label_current_version: "Phiên bản hiện tại" - label_custom_field_add_no_type: "Add this field to a work package type" + label_custom_field_add_no_type: "Thêm trường này vào một loại work package" label_custom_field_new: "Thêm mục tùy biến" label_custom_field_plural: "Tùy chỉnh mục" label_custom_field_default_type: "Kiểu rỗng" - label_custom_style: "Design" + label_custom_style: "Thiết kế" label_date: "Ngày" - label_date_and_time: "Date and time" + label_date_and_time: "Ngày và giờ" label_date_from: "Từ" label_date_from_to: "Từ %{start} tới %{end}" label_date_to: "Đến" label_day_plural: "ngày" label_default: "Mặc định" - label_delete_user: "Delete user" - label_delete_project: "Delete project" + label_delete_user: "Xóa người dùng" + label_delete_project: "Xóa dự án" label_deleted: "đã xóa" label_deleted_custom_field: "(đã xóa các mục tùy chỉnh)" - label_deleted_custom_option: "(deleted option)" + label_deleted_custom_option: "(tùy chọn đã xóa)" label_descending: "Giảm dần" label_details: "Chi tiết" - label_development_roadmap: "Development roadmap" + label_development_roadmap: "Lộ trình phát triển" label_diff: "sự khác nhau" - label_diff_inline: "inline" - label_diff_side_by_side: "side by side" + label_diff_inline: "nội tuyến" + label_diff_side_by_side: "bên cạnh nhau" label_disabled: "vô hiệu hoá" label_display: "Hiển thị" label_display_per_page: "Mỗi trang: %{value}" @@ -1343,33 +1343,33 @@ vi: label_download_plural: "%{count} tải về" label_downloads_abbr: "D/L" label_duplicated_by: "bị trùng bởi" - label_duplicate: "duplicate" - label_duplicates: "duplicates" + label_duplicate: "Nhân đôi" + label_duplicates: "Nhân đôi" label_edit: "Chỉnh sửa" - label_edit_x: "Edit: %{x}" + label_edit_x: "Chỉnh sửa: %{x}" label_enable_multi_select: "Bật/tắt đa lựa chọn" - label_enabled_project_custom_fields: 'Enabled custom fields' - label_enabled_project_modules: 'Enabled modules' + label_enabled_project_custom_fields: 'Các trường tùy chỉnh đã bật' + label_enabled_project_modules: 'Các mô-đun đã bật' label_enabled_project_activities: 'Enabled time tracking activities' label_end_to_end: "kết thúc đến kết thúc" label_end_to_start: "kết thúc đến bắt đầu" - label_enumeration_new: "New enumeration value" - label_enumeration_value: "Enumeration value" - label_enumerations: "Enumerations" - label_enterprise: "Enterprise" + label_enumeration_new: "Giá trị liệt kê mới" + label_enumeration_value: "Giá trị liệt kê" + label_enumerations: "Liệt kê" + label_enterprise: "Doanh nghiệp" label_enterprise_active_users: "%{current}/%{limit} booked active users" - label_enterprise_edition: "Enterprise Edition" - label_environment: "Environment" - label_estimates_and_time: "Estimates and time" - label_equals: "is" + label_enterprise_edition: "Phiên bản doanh nghiệp." + label_environment: "Môi trường" + label_estimates_and_time: "Ước tính và thời gian" + label_equals: "là" label_everywhere: "mọi nơi" label_example: "Ví dụ" - label_import: "Import" + label_import: "Nhập" label_export_to: "Cũng có sẵn tại:" label_expanded_click_to_collapse: "Mở rộng. Bấm vào để thu gọn" label_f_hour: "%{value} giờ" label_f_hour_plural: "%{value} giờ" - label_feed_plural: "Feeds" + label_feed_plural: "Nguồn cấp dữ liệu" label_feeds_access_key: "Khóa truy cập RSS" label_feeds_access_key_created_on: "Khoá truy cập API đựơc tạo cách đây %{value}" label_feeds_access_key_type: "RSS" @@ -1377,14 +1377,14 @@ vi: label_file_plural: "Tập tin" label_filter_add: "Thêm bộ lọc" label_filter_plural: "Bộ lọc" - label_filters_toggle: "Show/hide filters" - label_float: "Float" + label_filters_toggle: "Hiển thị/ẩn bộ lọc" + label_float: "Số thực" label_folder: "Thư mục" - label_follows: "follows" + label_follows: "theo dõi" label_force_user_language_to_default: "Có một ngôn ngữ không được cho phép để mặc định trong thiết lập ngôn ngữ cho người sử dụng" label_form_configuration: "Mẫu cấu hình" label_gantt: "Biểu đồ sự kiện" - label_gantt_chart: "Gantt chart" + label_gantt_chart: "Biểu đồ Gantt" label_general: "Tổng quan" label_generate_key: "Tạo khóa" label_git_path: "Đường dẫn đến thư mục .git" @@ -1392,20 +1392,20 @@ vi: label_group_by: "Nhóm theo" label_group_new: "Nhóm mới" label_group: "Nhóm" - label_group_named: "Group %{name}" + label_group_named: "Nhóm %{name}" label_group_plural: "Các Nhóm" label_help: "Trợ giúp" label_here: đây label_hide: "Ẩn" label_history: "Lịch sử" label_hierarchy_leaf: "Hệ thống phân cấp lá" - label_home: "Home" + label_home: "Trang chủ" label_subject_or_id: "Chủ đề hoặc Mã" - label_impressum: "Legal notice" + label_impressum: "Thông báo pháp lý" label_in: "trong" label_in_less_than: "ít hơn" label_in_more_than: "nhiều hơn" - label_inactive: "Inactive" + label_inactive: "Không hoạt động" label_incoming_emails: "Các thư đến" label_includes: 'includes' label_index_by_date: "Chỉ mục theo ngày" @@ -1457,16 +1457,16 @@ vi: label_message: "Message" label_message_last: "Last message" label_message_new: "New message" - label_message_plural: "Messages" - label_message_posted: "Message added" - label_min_max_length: "Min - Max length" - label_minute_plural: "minutes" - label_missing_api_access_key: "Missing API access key" - label_missing_feeds_access_key: "Missing RSS access key" + label_message_plural: "Tin nhắn" + label_message_posted: "Đã thêm tin nhắn" + label_min_max_length: "Độ dài nhỏ nhất - lớn nhất" + label_minute_plural: "phút" + label_missing_api_access_key: "Thiếu khóa truy cập API" + label_missing_feeds_access_key: "Thiếu khóa truy cập RSS" label_modification: "thay đổi %{count}" label_modified: "đã sửa đổi" - label_module_plural: "Modules" - label_modules: "Modules" + label_module_plural: "Các Mô-Đun" + label_modules: "Các Mô-Đun" label_months_from: "tháng từ" label_more: "Xem thêm" label_more_than_ago: "nhiều hơn mấy ngày trước" @@ -1475,9 +1475,9 @@ vi: label_my_account_data: "Dữ liệu tài khoản của tôi" label_my_projects: "Dự án của tôi" label_my_queries: "Các truy vấn tùy biến của tôi" - label_never: "Never" + label_never: "Không bao giờ" label_new: "Mới" - label_new_features: "New features" + label_new_features: "Tính năng mới" label_new_statuses_allowed: "Trạng thái mới được phép" label_news_singular: "Tin tức" label_news_added: "Đã thêm tin" @@ -1492,11 +1492,11 @@ vi: label_no_change_option: "(không đổi)" label_no_data: "Không có dữ liệu để hiển thị" label_no_parent_page: "Không có trang quan hệ" - label_nothing_display: "Nothing to display" + label_nothing_display: "Không có gì để hiển thị" label_nobody: "không ai" - label_not_found: 'not found' + label_not_found: 'không tìm thấy' label_none: "không" - label_none_parentheses: "(none)" + label_none_parentheses: "(trống)" label_not_contains: "không chứa" label_not_equals: "không là" label_notify_member_plural: "Cập nhật thư" @@ -1511,7 +1511,7 @@ vi: label_overall_activity: "Tổng thể hoạt động" label_overview: "Tổng quan" label_page_title: "Tiêu đề trang" - label_part_of: "part of" + label_part_of: "một phần của" label_password_lost: "Quên Mật Khẩu?" label_password_rule_lowercase: "Chữ thường" label_password_rule_numeric: "Kiểu số" @@ -1527,28 +1527,28 @@ vi: label_planning: "Lập kế hoạch" label_please_login: "Vui lòng đăng nhập" label_plugins: "Plugins" - label_modules_and_plugins: "Modules and Plugins" + label_modules_and_plugins: "Mô-đun và Plugin" label_precedes: "trước" label_preferences: "Tùy chỉnh" label_preview: "Xem trước" label_previous: "Trước đó" label_previous_week: "Tuần trước" - label_principal_invite_via_email: " or invite new users via email" - label_principal_search: "Add existing users or groups" + label_principal_invite_via_email: "hoặc mời người dùng mới qua email" + label_principal_search: "Thêm người dùng hoặc nhóm hiện có" label_privacy_policy: "Chính sách bảo mật và quyền riêng tư dữ liệu" label_product_version: "Phiên bản sản phẩm" - label_professional_support: "Professional support" + label_professional_support: "Hỗ trợ chuyên nghiệp" label_profile: "Hồ sơ" label_project_all: "Tất cả các dự án" - label_project_count: "Total number of projects" + label_project_count: "Tổng số dự án" label_project_copy_notifications: "Gửi email thông báo trong quá trình sao chép dự án" label_project_latest: "Dự án mới nhất" label_project_default_type: "Cho phép kiểu rỗng" - label_project_hierarchy: "Project hierarchy" + label_project_hierarchy: "Phân cấp dự án" label_project_new: "Dự án mới" label_project_plural: "Các dự án" label_project_settings: "Thiết lập dự án" - label_projects_storage_information: "%{count} projects using %{storage} disk storage" + label_projects_storage_information: "%{count} dự án sử dụng %{storage} ổ lưu trữ" label_project_view_all: "Xem tất cả các dự án" label_project_show_details: "Hiển thị chi tiết dự án" label_project_hide_details: "Ẩn chi tiết Dự án" @@ -1568,46 +1568,46 @@ vi: label_relates_to: "liên quan đến" label_relation_delete: "Xóa quan hệ" label_relation_new: "Quan hệ mới" - label_release_notes: "Release notes" + label_release_notes: "Ghi chú phát hành" label_remove_columns: "Loại bỏ cột được chọn" label_renamed: "đổi tên" label_reply_plural: "Trả lời" label_report: "Báo cáo" - label_report_bug: "Report a bug" + label_report_bug: "Báo lỗi" label_report_plural: "Báo cáo" - label_reported_work_packages: "Reported work packages" - label_reporting: "Reporting" - label_reporting_plural: "Reportings" - label_repository: "Repository" + label_reported_work_packages: "Các gói công việc đã báo cáo" + label_reporting: "Đang báo cáo" + label_reporting_plural: "Đang báo cáo" + label_repository: "Kho lưu trữ" label_repository_root: "Repository root" - label_repository_plural: "Repositories" - label_required: 'required' - label_requires: 'requires' - label_result_plural: "Results" + label_repository_plural: "Kho lưu trữ" + label_required: 'bắt buộc' + label_requires: 'bắt buộc' + label_result_plural: "Các kết quả" label_reverse_chronological_order: "In reverse chronological order" - label_revision: "Revision" - label_revision_id: "Revision %{value}" - label_revision_plural: "Revisions" - label_roadmap: "Roadmap" - label_roadmap_edit: "Edit roadmap %{name}" - label_roadmap_due_in: "Due in %{value}" - label_roadmap_no_work_packages: "No work packages for this version" + label_revision: "Sửa đổi" + label_revision_id: "Sửa đổi %{value}" + label_revision_plural: "Sửa đổi" + label_roadmap: "Lộ trình" + label_roadmap_edit: "Sửa lộ trình %{name}" + label_roadmap_due_in: "Hết hạn trong %{value}" + label_roadmap_no_work_packages: "Không có công việc nào cho phiên bản này" label_roadmap_overdue: "%{value} late" - label_role_and_permissions: "Roles and permissions" - label_role_new: "New role" + label_role_and_permissions: "Vai trò và Quyền hạn" + label_role_new: "Vai trò mới" label_role_plural: "Vai trò" - label_role_search: "Assign role to new members" + label_role_search: "Chỉ định vai trò cho các thành viên mới" label_scm: "SCM" - label_search: "Search" + label_search: "Tìm kiếm" label_send_information: "Send account information to the user" - label_send_test_email: "Send a test email" - label_setting_plural: "Settings" - label_system_settings: "System settings" - label_show_completed_versions: "Show completed versions" + label_send_test_email: "Gửi email thử nghiệm" + label_setting_plural: "Cài đặt" + label_system_settings: "Cài đặt hệ thống" + label_show_completed_versions: "Xem phiên bản đã hoàn thành" label_sort: "Sắp xếp" - label_sort_by: "Sort by %{value}" - label_sorted_by: "sorted by %{value}" - label_sort_higher: "Move up" + label_sort_by: "Sắp xếp theo %{value}" + label_sorted_by: "sắp xếp theo %{value}" + label_sort_higher: "Chuyển lên" label_sort_highest: "Lên trên cùng" label_sort_lower: "Dịch xuống" label_sort_lowest: "Chuyển đến dưới cùng" @@ -1618,8 +1618,8 @@ vi: label_status: "Trạng thái" label_status_updated: "Tình trạng Work package đã cập nhật" label_stay_logged_in: "Duy trì đăng nhập" - label_storage_free_space: "Remaining disk space" - label_storage_used_space: "Used disk space" + label_storage_free_space: "Dung lượng đĩa còn lại" + label_storage_used_space: "Dung lượng đĩa đã sử dụng" label_storage_group: "Storage filesystem %{identifier}" label_storage_for: "Encompasses storage for" label_string: "Văn bản" @@ -1649,13 +1649,13 @@ vi: label_updated_time: "Cập nhật cách đây %{value}" label_updated_time_at: "%{author} %{age}" label_updated_time_by: "Cập nhật bởi %{author} cách đây %{age}" - label_upgrade_guides: 'Upgrade guides' + label_upgrade_guides: 'Hướng dẫn nâng cấp' label_used_by: "Được dùng bởi" - label_used_by_types: "Used by types" - label_used_in_projects: "Used in projects" + label_used_by_types: "Được sử dụng bởi các loại" + label_used_in_projects: "Được sử dụng trong các dự án" label_user: "Người dùng" - label_user_and_permission: "Users & Permissions" - label_user_named: "User %{name}" + label_user_and_permission: "Người dùng & Quyền" + label_user_named: "Người dùng %{name}" label_user_activity: "%{value} hoạt động" label_user_anonymous: "Ẩn danh" label_user_mail_option_all: "Bất kỳ sự kiện trên tất cả dự án của tôi" @@ -1667,44 +1667,44 @@ vi: label_user_new: "Người dùng mới" label_user_plural: "Người dùng" label_user_search: "Tìm kiếm người dùng" - label_user_settings: "User settings" + label_user_settings: "Cài đặt người dùng" label_version_new: "Phiên bản mới" label_version_plural: "Các phiên bản" label_version_sharing_descendants: "Với các dự án con" - label_version_sharing_hierarchy: "With project hierarchy" + label_version_sharing_hierarchy: "Với phân cấp dự án" label_version_sharing_none: "Không được chia sẻ" label_version_sharing_system: "Với tất cả dự án" label_version_sharing_tree: "Với cây dự án" label_videos: "Các đoạn phim" label_view_all_revisions: "Xem tất cả các phiên bản" label_view_diff: "View differences" - label_view_revisions: "View revisions" - label_watched_work_packages: "Watched work packages" + label_view_revisions: "Xem các bản điều chỉnh" + label_watched_work_packages: "Các công việc đã xem" label_what_is_this: "Đây là gì?" - label_week: "Week" - label_wiki_content_added: "Wiki page added" - label_wiki_content_updated: "Wiki page updated" + label_week: "Tuần" + label_wiki_content_added: "Đã thêm trang Wiki" + label_wiki_content_updated: "Trang Wiki đã được cập nhật" label_wiki_toc: "Bảng mục lục" - label_wiki_toc_empty: "Table of Contents is empty as no headings are present." - label_wiki_dont_show_menu_item: "Do not show this wikipage in project navigation" - label_wiki_edit: "Wiki edit" - label_wiki_edit_plural: "Wiki edits" - label_wiki_page_attachments: "Wiki page attachments" - label_wiki_page_id: "Wiki page ID" - label_wiki_navigation: "Wiki navigation" + label_wiki_toc_empty: "Mục lục trống vì không có tiêu đề nào." + label_wiki_dont_show_menu_item: "Không hiển thị wikipage này trong điều hướng dự án" + label_wiki_edit: "Sửa Wiki" + label_wiki_edit_plural: "Sửa Wiki" + label_wiki_page_attachments: "Tệp đính kèm trang Wiki" + label_wiki_page_id: "ID trang Wiki" + label_wiki_navigation: "Điều hướng Wiki" label_wiki_page: "Trang wiki" - label_wiki_page_plural: "Wiki pages" - label_wiki_show_index_page_link: "Show submenu item 'Table of Contents'" - label_wiki_show_menu_item: "Show as menu item in project navigation" - label_wiki_show_new_page_link: "Show submenu item 'Create new child page'" - label_wiki_show_submenu_item: "Show as submenu item of " + label_wiki_page_plural: "Trang wiki" + label_wiki_show_index_page_link: "Hiển thị mục menu con 'Mục lục'" + label_wiki_show_menu_item: "Hiển thị dưới dạng mục menu trong điều hướng dự án" + label_wiki_show_new_page_link: "Hiển thị mục menu con 'Tạo trang con mới'" + label_wiki_show_submenu_item: "Hiển thị dưới dạng mục menu con của" label_wiki_start: "Trang bắt đầu" label_work_package: "Work Package" label_work_package_added: "Đã thêm work package" - label_work_package_attachments: "Work package attachments" + label_work_package_attachments: "Phần đính kèm công việc" label_work_package_category_new: "Danh mục mới" label_work_package_category_plural: "Các thể loại work package" - label_work_package_hierarchy: "Work package hierarchy" + label_work_package_hierarchy: "Phân cấp công việc" label_work_package_new: "Work package mới" label_work_package_note_added: "Đã thêm ghi chú của work package" label_work_package_edit: "Chỉnh sửa work package %{name}" @@ -1713,19 +1713,19 @@ vi: label_work_package_status: "Tình trạng work package" label_work_package_status_new: "Trạng thái mới" label_work_package_status_plural: "Tình trạng work package" - label_work_package_types: "Work package types" + label_work_package_types: "Kiểu công việc" label_work_package_updated: "đã cập nhật work package" label_work_package_tracking: "Theo dõi work package" label_work_package_view_all: "Xem tất cả các work package" label_workflow: "Quy trình làm việc" - label_workflow_plural: "Workflows" + label_workflow_plural: "Quy trình làm việc" label_workflow_summary: "Tóm tắt" label_x_closed_work_packages_abbr: zero: "0 đóng" - other: "%{count} closed" + other: "%{count} đóng" label_x_comments: zero: "Không có bình luận" - other: "%{count} comments" + other: "%{count} bình luận" label_x_open_work_packages_abbr: zero: "0 mở" other: "%{count} open" @@ -1930,7 +1930,7 @@ vi: permission_manage_project_activities: "Manage project activities" permission_manage_public_queries: "Quản lý truy vấn công cộng" permission_manage_repository: "Manage repository" - permission_manage_subtasks: "Manage work package hierarchies" + permission_manage_subtasks: "Quản lý phân cấp gói công việc" permission_manage_versions: "Manage versions" permission_manage_wiki: "Manage wiki" permission_manage_wiki_menu: "Manage wiki menu" @@ -1979,7 +1979,7 @@ vi: project_module_calendar: "Lịch" project_module_work_package_tracking: "Theo dõi work package" project_module_news: "Tin tức" - project_module_repository: "Repository" + project_module_repository: "Kho lưu trữ" project_module_wiki: "Wiki" query: attribute_and_direction: "%{attribute} (%{direction})" @@ -2343,34 +2343,34 @@ vi: text_wiki_page_nullify_children: "Keep child pages as root pages" text_wiki_page_reassign_children: "Reassign child pages to this parent page" text_workflow_edit: "Select a role and a type to edit the workflow" - text_zoom_in: "Zoom in" - text_zoom_out: "Zoom out" + text_zoom_in: "Phóng to" + text_zoom_out: "Thu nhỏ" text_setup_mail_configuration: "Cấu hình nhà cung cấp email của bạn" time: - am: "am" + am: "sáng" formats: default: "%m/%d/%Y %I:%M %p" long: "%B %d, %Y %H:%M" short: "%d %b %H:%M" time: "%I:%M %p" - pm: "pm" + pm: "chiều" timeframe: - show: "Show timeframe" - end: "to" - start: "from" + show: "Hiển thị khung thời gian" + end: "đến" + start: "từ" timelines: admin_menu: color: "Màu sắc" - colors: "Colors" - associations: "Dependencies" - button_delete_all: "Delete all" + colors: "Màu sắc" + associations: "Phụ thuộc" + button_delete_all: "Xóa tất cả" change: "Change in planning" children: "Child elements" color_could_not_be_saved: "Color could not be saved" current_planning: "Current planning" dates: "Dates" dates_are_calculated_based_on_sub_elements: "Dates are calculated based on sub elements." - delete_all: "Delete all" + delete_all: "Xóa tất cả" delete_thing: "Xoá" duration: "Duration" duration_days: @@ -2433,8 +2433,8 @@ vi: grouping_one_phrase: "Is a subproject of" grouping_other: "Khác" hide_chart: "Hide chart" - noneElement: "(none)" - noneSelection: "(none)" + noneElement: "(trống)" + noneSelection: "(trống)" outline: "Initial outline expansion" parent: "Show subprojects of" work_package_filters: "Filter work packages" @@ -2444,16 +2444,16 @@ vi: status: "Show status" project_time_filter: "Projects with a work package of a certain type in a certain timeframe" project_time_filter_timeframe: "Timeframe" - project_time_filter_historical_from: "from" - project_time_filter_historical_to: "to" + project_time_filter_historical_from: "từ" + project_time_filter_historical_to: "đến" project_time_filter_historical: "%{start_label} %{startdate} %{end_label} %{enddate}" project_time_filter_relative: "%{start_label} %{startspan}%{startspanunit} ago, %{end_label} %{endspan}%{endspanunit} from now" project_filters: "Filter projects" project_responsible: "Hiện gói công việc" project_status: "Show project status" - timeframe: "Show timeframe" - timeframe_end: "to" - timeframe_start: "from" + timeframe: "Hiển thị khung thời gian" + timeframe_end: "đến" + timeframe_start: "từ" timeline: "General Settings" zoom: "Zoom factor" history: "Lịch sử" @@ -2498,8 +2498,8 @@ vi: vertical_work_package: "Vertical work packages" you_are_viewing_the_selected_timeline: "You are viewing the selected timeline report" zoom: - in: "Zoom in" - out: "Zoom out" + in: "Phóng to" + out: "Thu nhỏ" days: "Days" weeks: "Weeks" months: "Months" @@ -2689,7 +2689,7 @@ vi: client_credential_user_id: "ID người dùng tùy chọn để mạo danh khi khách hàng sử dụng ứng dụng này. Để trống để chỉ cho phép truy cập công cộng" register_intro: "If you are developing an OAuth API client application for OpenProject, you can register it using this form for all users to use." default_scopes: "" - client_id: "Client ID" + client_id: "ID Khách hàng" client_secret_notice: > This is the only time we can print the client secret, please note it down and keep it secure. It should be treated as a password and cannot be retrieved by OpenProject at a later time. authorization_dialog: diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 0625d7f8fe..6d3d85e2c0 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,8 +1,3 @@ -FROM ruby:2.7.1-buster AS pgloader -RUN apt-get update -qq && apt-get install -y libsqlite3-dev make curl gawk freetds-dev libzip-dev -COPY docker/prod/mysql-to-postgres/bin/build /tmp/build-pgloader -RUN /tmp/build-pgloader && rm /tmp/build-pgloader - FROM ruby:2.7.1-buster MAINTAINER operations@openproject.com @@ -12,6 +7,8 @@ ARG PLATFORM=on-prem ARG GITHUB_OAUTH_TOKEN ARG DEBIAN_FRONTEND=noninteractive +ARG PGLOADER_BINARY_DOWNLOAD_URL=https://openproject-docker-public.s3-eu-west-1.amazonaws.com/pgloader/bin/pgloader-ccl + ENV NODE_VERSION="12.18.3" ENV BUNDLER_VERSION="2.1.4" ENV BUNDLE_PATH__SYSTEM=false @@ -36,7 +33,7 @@ ENV ATTACHMENTS_STORAGE_PATH=$APP_DATA_PATH/files # Set a default key base, ensure to provide a secure value in production environments! ENV SECRET_KEY_BASE=OVERWRITE_ME -COPY --from=pgloader /usr/local/bin/pgloader-ccl /usr/local/bin/ +RUN curl ${PGLOADER_BINARY_DOWNLOAD_URL} > /usr/local/bin/pgloader-ccl && chmod +x /usr/local/bin/pgloader-ccl WORKDIR $APP_PATH diff --git a/docker/prod/migration_status b/docker/prod/migration_status new file mode 100755 index 0000000000..04a413aa42 --- /dev/null +++ b/docker/prod/migration_status @@ -0,0 +1,4 @@ +#!/bin/bash -e + +echo "Checking migration status..." +bundle exec rails runner 'ActiveRecord::Migration.check_pending!' diff --git a/docker/prod/seeder b/docker/prod/seeder index 215c5434c4..f8e78f91fb 100755 --- a/docker/prod/seeder +++ b/docker/prod/seeder @@ -1,7 +1,15 @@ #!/bin/bash -e -echo "Executing database migration and database seed..." -bundle exec rake db:migrate db:seed +OUTPUT=$(echo "\dt" | psql `echo $DATABASE_URL | cut -d? -f1` 2>&1) + +if [[ "$OUTPUT" = "No relations found." ]]; then + echo "Initialising database and running seed..." + DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:structure:load db:seed +else + echo "Executing database migration and database seed..." + bundle exec rake db:migrate db:seed +fi + if [ "$1" = "--set" ]; then shift echo "Update application settings..." diff --git a/docker/prod/setup/postinstall-common.sh b/docker/prod/setup/postinstall-common.sh index 495639307c..a877eae6f9 100755 --- a/docker/prod/setup/postinstall-common.sh +++ b/docker/prod/setup/postinstall-common.sh @@ -21,7 +21,7 @@ echo "create database assets; create user assets with encrypted password 'p4ssw0 sleep 5 # dump schema -DATABASE_URL=postgres://assets:p4ssw0rd@127.0.0.1/assets RAILS_ENV=production bundle exec rake db:migrate db:schema:dump db:schema:cache:dump +DATABASE_URL=postgres://assets:p4ssw0rd@127.0.0.1/assets RAILS_ENV=production bundle exec rake db:migrate db:schema:dump db:schema:cache:dump db:structure:dump # precompile assets DATABASE_URL=postgres://assets:p4ssw0rd@127.0.0.1/assets RAILS_ENV=production bundle exec rake assets:precompile diff --git a/docker/prod/web b/docker/prod/web index 92d70da017..802f29a629 100755 --- a/docker/prod/web +++ b/docker/prod/web @@ -15,6 +15,8 @@ fi if [ "$MIGRATE" = "true" ]; then echo "Migrating database..." bundle exec rake db:migrate +else + $APP_PATH/docker/prod/migration_status # abort if there are pending migrations fi # see `config/puma.rb` for configuration diff --git a/docker/prod/worker b/docker/prod/worker index a86cafd057..38a3674163 100755 --- a/docker/prod/worker +++ b/docker/prod/worker @@ -4,4 +4,7 @@ if [ "$1" = "--seed" ]; then shift $APP_PATH/docker/prod/seeder "$@" fi + +$APP_PATH/docker/prod/migration_status # abort if there are pending migrations + exec bundle exec rake jobs:work diff --git a/docs/cloud-edition-guide/GDPR/DPA.png b/docs/cloud-edition-guide/GDPR/DPA.png new file mode 100644 index 0000000000..fb78c5e864 Binary files /dev/null and b/docs/cloud-edition-guide/GDPR/DPA.png differ diff --git a/docs/cloud-edition-guide/GDPR/README.md b/docs/cloud-edition-guide/GDPR/README.md new file mode 100644 index 0000000000..c24ca2d1c8 --- /dev/null +++ b/docs/cloud-edition-guide/GDPR/README.md @@ -0,0 +1,24 @@ +--- +sidebar_navigation: + title: GDPR + priority: 600 +description: GDPR +robots: index, follow +keywords: GDPR +--- + +# GDPR + +The General Data Protection Regulation (GDPR) is a European regulation to harmonize the rules within the EU for handling personal data of private companies or public organizations. The GDPR also extends this EU data protection regulation law to all foreign companies processing data of EU residents. The GDPR compliance is self-evident for OpenProject. + +As a firm believer in open-source, OpenProject is invested heavily in the freedom of users. This encompasses the software freedoms granted by the [GPLv3](https://www.gnu.org/licenses/quick-guide-gplv3.en.html) and employed by OpenProject and naturally extends to the rights and freedoms granted by the General Data Protection Regulation (GDPR). In the same transparent fashion that we develop our software, we are committed to transparency regarding data privacy protection of our users. + +## Signing a Data Processing Agreement (DPA) for the Enterprise cloud + +For EU customers it is required by the GDPR to sign a data processing agreement (sometimes called data processing addendum) before using our Cloud edition. + +With OpenProject 11.1, we have automated this process in order to reduce manual effort on both sides. This way, it is even easier to comply with GDPR. + +Please navigate to -> Administration -> GDPR and you can now online review and sign your DPA document directly within the application. + +![OpenProject DPA](DPA.png) \ No newline at end of file diff --git a/docs/cloud-edition-guide/README.md b/docs/cloud-edition-guide/README.md index 3f6a61601b..0b106b36ed 100644 --- a/docs/cloud-edition-guide/README.md +++ b/docs/cloud-edition-guide/README.md @@ -21,11 +21,12 @@ Welcome to the OpenProject **Enterprise cloud edition guide**. | Popular Topics | Description | | ------------------------------------------------------------ | :----------------------------------------------------------- | | [Create a free trial](./create-trial-installation) | Learn more about how to create a free trial for the Enterprise cloud instance. | -| [Sign in](./sign-in/) | Sign in to your OpenProject Enterprise cloud edition. | +| [Sign in](./sign-in/) | Sign in to your OpenProject Enterprise cloud edition. | | [View payment history or download invoices](./invoices-and-billing-history) | How to see your payment history and download invoices? | | [Upgrade, downgrade or cancel subscription](./manage-subscription/#update-existing-subscriptions) | How to upgrade your plan, downgrade or cancel your subscription for the Enterprise cloud edition? | -| [Manage your subscription](./manage-subscription) | How to change billing address, add or edit credit card details? | -| [Backups](./backups) | How do backups work in the cloud? | +| [Manage your subscription](./manage-subscription) | How to change billing address, add or edit credit card details? | +| [Backups](./backups) | How do backups work in the cloud? | +| [GDPR](./GDPR) | Review and sign a Data Processing Agreement (DPA) | The OpenProject Enterprise cloud edition contains all OpenProject Community features plus the additional OpenProject premium features, as well as professional support. diff --git a/docs/installation-and-operations/installation/docker/README.md b/docs/installation-and-operations/installation/docker/README.md index b7cc753ce1..bde5495db8 100644 --- a/docs/installation-and-operations/installation/docker/README.md +++ b/docs/installation-and-operations/installation/docker/README.md @@ -90,7 +90,7 @@ docker run -d -p 8080:80 -e SECRET_KEY_BASE=secret openproject/community:11 **Note**: We've had reports of people being unable to start OpenProject this way because of an [issue regarding pseudo-TTY allocations](https://github.com/moby/moby/issues/31243#issuecomment-406825071) and permissions to write to `/dev/stdout`. If you run into this, a workaround -seems to be to add `-t` to your run command, even if you run in detached mode. +seems to be to add `-t` to your run command, even if you run in detached mode. ### Recommended usage @@ -286,10 +286,18 @@ end ``` FROM openproject/community:11 +# If installing a local plugin (using `path:` in the `Gemfile.plugins` above), +# you will have to copy the plugin code into the container here and use the +# path inside of the container. Say for `/app/vendor/plugins/openproject-slack`: +# COPY /path/to/my/local/openproject-slack /app/vendor/plugins/openproject-slack + COPY Gemfile.plugins /app/ +# If the plugin uses any external NPM dependencies you have to install them here. +# RUN npm add npm * + RUN bundle config unset deployment && bundle install && bundle config set deployment 'true' -RUN bash docker/precompile-assets.sh +RUN ./docker/prod/setup/postinstall.sh ``` The file is based on the normal OpenProject docker image. diff --git a/docs/release-notes/11-1-0/DPA-OpenProject.png b/docs/release-notes/11-1-0/DPA-OpenProject.png new file mode 100644 index 0000000000..fb78c5e864 Binary files /dev/null and b/docs/release-notes/11-1-0/DPA-OpenProject.png differ diff --git a/docs/release-notes/11-1-0/README.md b/docs/release-notes/11-1-0/README.md index f0c0eccac6..cc1c21888b 100644 --- a/docs/release-notes/11-1-0/README.md +++ b/docs/release-notes/11-1-0/README.md @@ -40,11 +40,13 @@ In the work package list it is possible to group by any attribute, e.g. assigne ## Signing Data Processing Agreement (DPA) documents in Enterprise cloud -For EU customers it is required by the GDPR to sign a data processing agreement (also called data processing addendum) before using our [Cloud Edition](https://start.openproject.com/). Until now, we processed these contracts manually. Users had to print the document, enter their information and send it to us. We then had to sign it too, and send it back to the customer. +For EU customers it is required by the GDPR to sign a data processing agreement (sometimes called data processing addendum) before using our Cloud edition. Until now, we processed these contracts manually. Users had to print the document, enter their information and send it to us. We then had to sign it too, and send it back to the customer. + +Luckily, we now automated this process in order to reduce manual effort on both sides. This way, it is even easier to comply with GDPR. Within -> Administration -> GDPR you can now online review and sign your DPA document with us. + +![DPA-OpenProject](DPA-OpenProject.png) -Luckily, we now automated this process in order to reduce manual effort on both sides. This way, it is even easier to comply with GDPR. With -> Administration -> GDPR you can now online review and sign your DPA document with us. -![GDPR-OpenProject](GDPR-OpenProject.png) ## Various improvements and bug fixes diff --git a/docs/release-notes/11-1-1/README.md b/docs/release-notes/11-1-1/README.md new file mode 100644 index 0000000000..235a2198aa --- /dev/null +++ b/docs/release-notes/11-1-1/README.md @@ -0,0 +1,27 @@ +--- +title: OpenProject 11.1.1 +sidebar_navigation: + title: 11.1.1 +release_version: 11.1.1 +release_date: 2021-01-06 +--- + +# OpenProject 11.1.1 + +We released [OpenProject 11.1.1](https://community.openproject.com/versions/1463). +The release contains several bug fixes and we recommend updating to the newest version. + + +#### Bug fixes and changes + +- Fixed: Week number is wrong after November \[[#35095](https://community.openproject.com/wp/35095)\] +- Fixed: Deleted user associated to planned labor costs lead to 500 on Budget \[[#35670](https://community.openproject.com/wp/35670)\] +- Fixed: Renamed column updated_on is still referenced for settings \[[#35673](https://community.openproject.com/wp/35673)\] +- Fixed: Newrelic gem incorrectly loaded on installations resulting in unnecessary logs \[[#35776](https://community.openproject.com/wp/35776)\] + +#### Contributions +A big thanks to community members for reporting bugs and helping us identifying and providing fixes. + +Special thanks for reporting and finding bugs go to + +Frank Long, Benjamin Bädorf diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index b0c8b583cd..99742573a7 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -12,6 +12,13 @@ Stay up to date and get an overview of the new features included in the releases +## 11.1.1 + +Release date: 2021-01-06 + +[Release Notes](11-1-1/) + + ## 11.1.0 Release date: 2020-12-17 @@ -25,12 +32,11 @@ Release date: 2020-12-17 - Display project milestones aggregated for projects in a single row in Gantt chart - Collapse all button for groups in the work packages list - -- Extended the authentication profile with an OpenID Connect provider +- Extended authentication profile with an OpenID Connect provider - Improvements for printing, e.g. for wiki pages, via the browser print function -#### Enterprise cloud: +#### Enterprise cloud: - Signing Data Processing Agreement (DPA) documents in Enterprise cloud diff --git a/docs/system-admin-guide/users-permissions/users/README.md b/docs/system-admin-guide/users-permissions/users/README.md index 93b8d40cb8..dbaacf7bf7 100644 --- a/docs/system-admin-guide/users-permissions/users/README.md +++ b/docs/system-admin-guide/users-permissions/users/README.md @@ -16,15 +16,14 @@ The users list provides an overview of all users in OpenProject. You can create -| Feature | Documentation for | -| ------------------------------------------------------------ | ------------------------------------------------------------ | -| [User list](#user-list) | Manage all users in OpenProject. | -| [Lock users](#lock-users) | Block a user permanently in the system. | -| [Filter users](#filter-users) | Filter users in the list. | -| [Invite new users](#invite-new-users) | Add new users to your OpenProject and invite them via email. | -| [Send user invitation via email](#resend-user-invitation-via-email) | Send user invitation via email. | -| [Manage user settings](#manage-user-settings) | Manage user settings, e.g. language, projects, groups, global roles, rate history, avatar, two-factor authentication. | -| [Delete users](#delete-users) | Delete a user from the system. | +| Topic | Content | +| --------------------------------------------- | ------------------------------------------------------------ | +| [User list](#user-list) | Manage all users in OpenProject. | +| [Lock users](#lock-users) | Block a user permanently in the system. | +| [Filter users](#filter-users) | Filter users in the list. | +| [Invite new users](#invite-new-users) | Add new users to your OpenProject and invite them via email. Resend and delete user invitations. | +| [Manage user settings](#manage-user-settings) | Manage user settings, e.g. language, projects, groups, global roles, rate history, avatar, two-factor authentication. | +| [Delete users](#delete-users) | Delete a user from the system. | ## User list @@ -71,7 +70,7 @@ Click the blue **Create** button in order to invite the new user via email. The **Create and continue** button will bring you to the form to add another new user. -## Resend user invitation via email +### Resend user invitation via email If a user did not receive the email invitation, you can send the invitation to the user again if needed. In the user list, click on the user name to whom you want to resend the email with the invitation link to the system. @@ -79,6 +78,10 @@ In the top right, click the **Send invitation** button in order to send the emai ![Sys-admin-resend-invitation](Sys-admin-resend-invitation.png) +### Delete user invitations +To invalidate or revoke a user's invitation click on the user name and then on **Delete** in the upper right corner. This will prevent the invited user from logging in. +Please note: This only works for users who haven't logged in yet. If the user is already active this will delete his/her whole profile and account. Deleting users can't be easily revoked. + ## View user profile If you want to see the user profile, click on the user name in the user list to display the activities across all projects from a certain user. Click the **Profile** button on the top right of a user. diff --git a/docs/user-guide/projects/README.md b/docs/user-guide/projects/README.md index 3e893bea8c..d432d4b4a7 100644 --- a/docs/user-guide/projects/README.md +++ b/docs/user-guide/projects/README.md @@ -238,7 +238,7 @@ Click on the **Modules** icon with the dots in the header navigation. These are Select **Work packages** from the drop down menu. Now, you will see all work packages in the projects for which you have the required [permissions](../..//system-admin-guide/users-permissions/roles-permissions/). -In this project overarching list, you can search, filter, group by, sort, highlight and save views the same way as in the [work package list](../../work-packages/work-package-table-configuration) in each project. +In this project overarching list, you can search, filter, group by, sort, highlight and save views the same way as in the [work package list](../work-packages/work-package-table-configuration) in each project. You can group by projects by clicking in the header of the work package list next to PROJECT and select **Group by**. Collapsing the groups will allow you an **overview of the projects' aggregated milestones** as described [here](../../user-guide/work-packages/work-package-table-configuration/#aggregation-by-project). diff --git a/frontend/src/app/modules/common/op-date-picker/datepicker.ts b/frontend/src/app/modules/common/op-date-picker/datepicker.ts index ff16cfb210..a7a5daecf1 100644 --- a/frontend/src/app/modules/common/op-date-picker/datepicker.ts +++ b/frontend/src/app/modules/common/op-date-picker/datepicker.ts @@ -26,10 +26,11 @@ // See docs/COPYRIGHT.rdoc for more details. //++ -import flatpickr from "flatpickr"; -import {Instance} from "flatpickr/dist/types/instance"; -import {ConfigurationService} from "core-app/modules/common/config/configuration.service"; -import {I18nService} from "core-app/modules/common/i18n/i18n.service"; +import * as moment from 'moment'; +import flatpickr from 'flatpickr'; +import {Instance} from 'flatpickr/dist/types/instance'; +import {ConfigurationService} from 'core-app/modules/common/config/configuration.service'; +import {I18nService} from 'core-app/modules/common/i18n/i18n.service'; import DateOption = flatpickr.Options.DateOption; export class DatePicker { @@ -54,6 +55,9 @@ export class DatePicker { const mergedOptions = _.extend({}, options, { weekNumbers: true, + getWeek(dateObj:Date) { + return moment(dateObj).week(); + }, dateFormat: this.datepickerFormat, defaultDate: this.date, locale: { @@ -139,7 +143,7 @@ export class DatePicker { return this.isInViewport(this.datepickerCont) && document.activeElement === this.datepickerCont; } catch (e) { - console.error("Failed to test visibleAndActive " + e); + console.error('Failed to test visibleAndActive ' + e); return false; } } diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index c9cddb14ad..1efff59c19 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -34,7 +34,7 @@ module OpenProject module VERSION #:nodoc: MAJOR = 11 MINOR = 1 - PATCH = 0 + PATCH = 1 TINY = PATCH # Redmine compat class << self diff --git a/modules/avatars/config/locales/crowdin/vi.yml b/modules/avatars/config/locales/crowdin/vi.yml index 0831829764..f34fb4f95d 100644 --- a/modules/avatars/config/locales/crowdin/vi.yml +++ b/modules/avatars/config/locales/crowdin/vi.yml @@ -19,20 +19,20 @@ vi: label_current_avatar: 'Hình đại diện hiện tại' label_local_avatar: 'Tùy chỉnh hình đại diện' text_current_avatar: | - The following image shows the current avatar. + Hình ảnh sau đây hiển thị hình đại diện hiện tại. text_upload_instructions: | Tải lên hình đại diện tùy chỉnh của bạn, kích thước 128x128 điểm ảnh. Kích thước lớn hơn sẽ bị giảm chất lượng và thu nhỏ để phù hợp. Ảnh xem trước của hình đại diện sẽ hiện lên trước khi tải lên khi mà bạn chọn ảnh. text_change_gravatar_html: 'Để thay đổi hoặc thêm Gravatar cho địa chỉ thư điện tử, đi đến %{gravatar_url}.' text_your_local_avatar: | OpenProject chấp thuận hình đại diện được tùy chỉnh. text_local_avatar_over_gravatar: | - If you set one, this custom avatar is used in precedence over the gravatar above. + Nếu bạn đặt một, hình đại diện tùy chỉnh này sẽ được ưu tiên hơn so với gravatar ở trên. text_your_current_gravatar: | - OpenProject uses your gravatar if you registered one, or a default image or icon if one exists. - The current gravatar is as follows: + OpenProject sử dụng gravatar của bạn nếu bạn đã đăng ký hoặc một hình ảnh hoặc biểu tượng mặc định nếu có. + Gravatar hiện tại như sau: settings: - enable_gravatars: 'Enable user gravatars' - gravatar_default: "Default Gravatar image" + enable_gravatars: 'Bật gravatars của người dùng' + gravatar_default: "Hình ảnh Gravatar mặc định" enable_local_avatars: 'Cho phép người dùng tùy chỉnh hình đại diện' diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index 69b0f621af..c9bffea6be 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -43,19 +43,19 @@ vi: sprint: cannot_end_before_it_starts: "Sprint cannot end before it starts." backlogs: - add_new_story: "New Story" + add_new_story: "Câu chuyện mới" any: "any" backlog_settings: "Lịch sử cài đặt" burndown_graph: "Burndown Graph" card_paper_size: "Paper size for card printing" - chart_options: "Chart options" + chart_options: "Tùy chọn biểu đồ" close: "Đóng" - column_width: "Column width:" - date: "Day" - definition_of_done: "Definition of Done" - generating_chart: "Generating Graph..." + column_width: "Chiều rộng cột:" + date: "Ngày" + definition_of_done: "Định nghĩa về Hoàn thành" + generating_chart: "Tạo đồ thị..." hours: "Giờ" - impediment: "Impediment" + impediment: "Trở ngại" label_versions_default_fold_state: "Show versions folded" work_package_is_closed: "Work package is done, when" label_is_done_status: "Status %{status_name} means done" @@ -64,18 +64,18 @@ vi: positions_could_not_be_rebuilt: "Positions could not be rebuilt." positions_rebuilt_successfully: "Positions rebuilt successfully." properties: "Properties" - rebuild: "Rebuild" - rebuild_positions: "Rebuild positions" + rebuild: "Dựng lại" + rebuild_positions: "Xây dựng lại vị trí" remaining_hours: "Số giờ còn lại" remaining_hours_ideal: "Remaining hours (ideal)" show_burndown_chart: "Burndown Chart" - story: "Story" + story: "Câu chuyện" story_points: "Story Points" story_points_ideal: "Story Points (ideal)" task: "Nhiệm vụ" task_color: "Task color" unassigned: "Unassigned" - x_more: "%{count} more..." + x_more: "%{count} thêm..." backlogs_active: "active" backlogs_any: "any" backlogs_card_specification: "Label types for card printing" @@ -89,7 +89,7 @@ vi: backlogs_sprint_unestimated: "Closed or active sprints with unestimated stories" backlogs_sprint_unsized: "Project has stories on active or recently closed sprints that were not sized" backlogs_sprints: "Sprints" - backlogs_story: "Story" + backlogs_story: "Câu chuyện" backlogs_story_type: "Loại câu truyện tóm tắt" backlogs_task: "Nhiệm vụ" backlogs_task_type: "Loại công việc" @@ -98,8 +98,8 @@ vi: backlogs_wiki_template: "Template for sprint wiki page" backlogs_empty_title: "No versions are defined to be used in backlogs" backlogs_empty_action_text: "To get started with backlogs, create a new version and assign it to a backlogs column." - button_edit_wiki: "Edit wiki page" - error_intro_plural: "The following errors were encountered:" + button_edit_wiki: "Sửa trang wiki" + error_intro_plural: "Các lỗi đã gặp phải:" error_intro_singular: "The following error was encountered:" error_outro: "Please correct the above errors before submitting again." event_sprint_description: "%{summary}: %{url}\n%{description}" @@ -116,44 +116,44 @@ vi: label_hours: "hours" label_work_package_hierarchy: "Work package Hierarchy" label_master_backlog: "Master Backlog" - label_not_prioritized: "not prioritized" - label_points: "points" - label_points_burn_down: "Down" + label_not_prioritized: "không được ưu tiên" + label_points: "điểm" + label_points_burn_down: "Xuống" label_points_burn_up: "Lên" - label_product_backlog: "product backlog" - label_select_all: "Select all" + label_product_backlog: "tồn đọng sản phẩm" + label_select_all: "Chọn tất cả" label_sprint_backlog: "sprint backlog" - label_sprint_cards: "Export cards" + label_sprint_cards: "Xuất thẻ" label_sprint_impediments: "Sprint Impediments" label_sprint_name: "Sprint \"%{name}\"" label_sprint_velocity: "Velocity %{velocity}, based on %{sprints} sprints with an average %{days} days" - label_stories: "Stories" - label_stories_tasks: "Stories/Tasks" - label_task_board: "Task board" + label_stories: "Những câu chuyện" + label_stories_tasks: "Câu chuyện/Nhiệm vụ" + label_task_board: "Bảng nhiệm vụ" label_version_setting: "Các phiên bản" label_version: 'Phiên bản' label_webcal: "Webcal Feed" label_wiki: "Wiki" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" + permission_view_master_backlog: "Xem tồn đọng chính" + permission_view_taskboards: "Xem bảng tác vụ" permission_update_sprints: "Update sprints" points_accepted: "points accepted" points_committed: "points committed" points_resolved: "points resolved" - points_to_accept: "points not accepted" - points_to_resolve: "points not resolved" + points_to_accept: "điểm không được chấp nhận" + points_to_resolve: "điểm chưa được giải quyết" project_module_backlogs: "Backlogs" - rb_label_copy_tasks: "Copy work packages" - rb_label_copy_tasks_all: "All" + rb_label_copy_tasks: "Sao chép work packages" + rb_label_copy_tasks_all: "Toàn bộ" rb_label_copy_tasks_none: "None" - rb_label_copy_tasks_open: "Open" - rb_label_link_to_original: "Include link to original story" - remaining_hours: "remaining hours" - required_burn_rate_hours: "required burn rate (hours)" - required_burn_rate_points: "required burn rate (points)" + rb_label_copy_tasks_open: "Mở" + rb_label_link_to_original: "Bao gồm liên kết đến câu chuyện gốc" + remaining_hours: "giờ còn lại" + required_burn_rate_hours: "tốc độ ghi yêu cầu (giờ)" + required_burn_rate_points: "tốc độ ghi yêu cầu (điểm)" todo_work_package_description: "%{summary}: %{url}\n%{description}" todo_work_package_summary: "%{type}: %{summary}" version_settings_display_label: "Column in backlog" - version_settings_display_option_left: "left" + version_settings_display_option_left: "trái" version_settings_display_option_none: "không" - version_settings_display_option_right: "right" + version_settings_display_option_right: "phải" diff --git a/modules/bim/config/locales/crowdin/js-vi.yml b/modules/bim/config/locales/crowdin/js-vi.yml index 2a9b5f645b..74cd0e9648 100644 --- a/modules/bim/config/locales/crowdin/js-vi.yml +++ b/modules/bim/config/locales/crowdin/js-vi.yml @@ -3,7 +3,7 @@ vi: js: bcf: label_bcf: 'BCF' - import: 'Import' + import: 'Nhập' import_bcf_xml_file: 'Import BCF XML file (BCF version 2.1)' export: 'Xuất' export_bcf_xml_file: 'Export BCF XML file (BCF version 2.1)' diff --git a/modules/bim/config/locales/crowdin/vi.yml b/modules/bim/config/locales/crowdin/vi.yml index c27b3b44df..94129c3407 100644 --- a/modules/bim/config/locales/crowdin/vi.yml +++ b/modules/bim/config/locales/crowdin/vi.yml @@ -18,7 +18,7 @@ vi: other: '%{count} vấn đề trong BCF' bcf_xml: xml_file: 'Tệp BCF XML' - import_title: 'Import' + import_title: 'Nhập' export: 'Xuất' import_update_comment: '(Cập nhật từ file BCF)' import_failed: 'Không thể nhập file BCF: %{error}' diff --git a/modules/boards/config/locales/crowdin/js-el.yml b/modules/boards/config/locales/crowdin/js-el.yml index d480874d5f..2ff046ccdf 100644 --- a/modules/boards/config/locales/crowdin/js-el.yml +++ b/modules/boards/config/locales/crowdin/js-el.yml @@ -52,7 +52,7 @@ el: action_text_version: > Board with automated columns based on the version attribute. Ideal for planning product development. action_type: - assignee: Αναθέτης + assignee: Εντολοδόχος status: κατάσταση version: έκδοση subproject: subproject diff --git a/modules/boards/config/locales/crowdin/js-vi.yml b/modules/boards/config/locales/crowdin/js-vi.yml index b15bc0e86f..1da5a632ac 100644 --- a/modules/boards/config/locales/crowdin/js-vi.yml +++ b/modules/boards/config/locales/crowdin/js-vi.yml @@ -2,16 +2,16 @@ vi: js: boards: - label_unnamed_board: 'Unnamed board' - label_unnamed_list: 'Unnamed list' - label_board_type: 'Board type' + label_unnamed_board: 'Bảng không tên' + label_unnamed_list: 'Danh sách không tên' + label_board_type: 'Kiểu bảng' upsale: teaser_text: 'Improve your agile project management with this flexible Boards view. Create as many boards as you like for anything you would like to keep track of.' upgrade_to_ee_text: 'Boards is an Enterprise feature. Please upgrade to a paid plan.' - upgrade: 'Upgrade now' + upgrade: 'Nâng cấp ngay' personal_demo: 'Get a personal demo' lists: - delete: 'Delete list' + delete: 'Xoá danh sách' version: is_locked: 'Version is locked. No items can be added to this version.' is_closed: 'Version is closed. No items can be added to this version.' @@ -23,16 +23,16 @@ vi: show_version: 'Show version' locked: 'Đã khóa' closed: 'Đã đóng' - new_board: 'New board' + new_board: 'Bảng mới' add_list: 'Add list to board' - add_card: 'Add card' + add_card: 'Thêm thẻ' error_attribute_not_writable: "Cannot move the work package, %{attribute} is not writable." error_loading_the_list: "Error loading the list: %{error_message}" error_permission_missing: "The permission to create public queries is missing" error_cannot_move_into_self: "You can not move a work package into its own column." - click_to_remove_list: "Click to remove this list" + click_to_remove_list: "Nhấp để xóa danh sách" board_type: - text: 'Board type' + text: 'Kiểu bảng' free: 'basic' select_board_type: 'Please choose the type of board you need.' free_text: > @@ -80,7 +80,7 @@ vi: no_member: This project currently does not have any members that can be added.
add_members: Add a new member to this project to select users again. configuration_modal: - title: 'Configure this board' + title: 'Cấu hình bảng này' display_settings: - card_mode: "Display as cards" - table_mode: "Display as table" + card_mode: "Hiển thị dưới dạng thẻ" + table_mode: "Hiển thị dưới dạng bảng" diff --git a/modules/boards/config/locales/crowdin/vi.yml b/modules/boards/config/locales/crowdin/vi.yml index 8f1ccf90ec..664d06deb6 100644 --- a/modules/boards/config/locales/crowdin/vi.yml +++ b/modules/boards/config/locales/crowdin/vi.yml @@ -1,8 +1,8 @@ #English strings go here vi: - permission_show_board_views: "View boards" - permission_manage_board_views: "Manage boards" - project_module_board_view: "Boards" + permission_show_board_views: "Xem bảng" + permission_manage_board_views: "Quản lý bảng" + project_module_board_view: "Bảng" boards: - label_board: "Board" - label_boards: "Boards" + label_board: "Bảng" + label_boards: "Bảng" diff --git a/modules/budgets/app/views/budgets/_show.html.erb b/modules/budgets/app/views/budgets/_show.html.erb index 874027569a..733b1816d1 100644 --- a/modules/budgets/app/views/budgets/_show.html.erb +++ b/modules/budgets/app/views/budgets/_show.html.erb @@ -281,7 +281,7 @@ See docs/COPYRIGHT.rdoc for more details. <% @budget.labor_budget_items.each do |labor_budget_item| %> <%= l_hours(labor_budget_item.hours) %> - <%=h labor_budget_item.principal.name %> + <%=h user_name(labor_budget_item.principal) %> <%=h labor_budget_item.comments %> <% if labor_budget_item.costs_visible_by?(User.current) %> diff --git a/modules/budgets/config/locales/crowdin/js-vi.yml b/modules/budgets/config/locales/crowdin/js-vi.yml index d02f64b011..0800f4a192 100644 --- a/modules/budgets/config/locales/crowdin/js-vi.yml +++ b/modules/budgets/config/locales/crowdin/js-vi.yml @@ -23,4 +23,4 @@ vi: js: work_packages: properties: - costObject: "Budget" + costObject: "Ngân sách" diff --git a/modules/budgets/config/locales/crowdin/vi.yml b/modules/budgets/config/locales/crowdin/vi.yml index 4d21689340..3965cdfd99 100644 --- a/modules/budgets/config/locales/crowdin/vi.yml +++ b/modules/budgets/config/locales/crowdin/vi.yml @@ -24,26 +24,26 @@ vi: attributes: budget: author: "Tác giả" - available: "Available" - budget: "Planned" - budget_ratio: "Spent (ratio)" + available: "Khả dụng" + budget: "Có kế hoạch" + budget_ratio: "Đã chi (tỷ lệ)" description: "Mô tả" - spent: "Spent" + spent: "Đã chi" status: "Trạng thái" subject: "Chủ đề" - type: "Cost type" - labor_budget: "Planned labor costs" - material_budget: "Planned unit costs" + type: "Loại chi phí" + labor_budget: "Chi phí lao động dự kiến" + material_budget: "Chi phí đơn vị dự kiến" work_package: - budget_subject: "Budget title" + budget_subject: "Tiêu đề ngân sách" models: - budget: "Budget" - material_budget_item: "Unit" + budget: "Ngân sách" + material_budget_item: "Đơn vị" attributes: - budget: "Budget" - button_add_budget_item: "Add planned costs" - button_add_budget: "Add budget" - button_add_cost_type: "Add cost type" + budget: "Ngân sách" + button_add_budget_item: "Thêm chi phí đã lên kế hoạch" + button_add_budget: "Thêm ngân sách" + button_add_cost_type: "Thêm kiểu chi phí" button_cancel_edit_budget: "Cancel editing budget" button_cancel_edit_costs: "Cancel editing costs" caption_labor: "Labor" @@ -55,11 +55,11 @@ vi: help_click_to_edit: "Click here to edit." help_currency_format: "Format of displayed currency values. %n is replaced with the currency value, %u ist replaced with the currency unit." help_override_rate: "Enter a value here to override the default rate." - label_budget: "Budget" + label_budget: "Ngân sách" label_budget_new: "New budget" label_budget_plural: "Budgets" label_budget_id: "Budget #%{id}" - label_deliverable: "Budget" + label_deliverable: "Ngân sách" label_example_placeholder: 'e.g., %{decimal}' label_view_all_budgets: "View all budgets" label_yes: "Có" diff --git a/modules/costs/config/locales/crowdin/js-vi.yml b/modules/costs/config/locales/crowdin/js-vi.yml index 9a1da97b31..499553bcfe 100644 --- a/modules/costs/config/locales/crowdin/js-vi.yml +++ b/modules/costs/config/locales/crowdin/js-vi.yml @@ -23,10 +23,10 @@ vi: js: work_packages: property_groups: - costs: "Costs" + costs: "Chi phí" properties: - overallCosts: "Overall costs" + overallCosts: "Tổng chi phí" spentUnits: "Spent units" button_log_costs: "Log unit costs" - label_hour: "hour" + label_hour: "giờ" label_hours: "hours" diff --git a/modules/costs/config/locales/crowdin/vi.yml b/modules/costs/config/locales/crowdin/vi.yml index d043f01b7f..ec2aa52fe9 100644 --- a/modules/costs/config/locales/crowdin/vi.yml +++ b/modules/costs/config/locales/crowdin/vi.yml @@ -24,27 +24,27 @@ vi: attributes: cost_entry: work_package: "Work Package" - overridden_costs: "Overridden costs" - spent: "Spent" + overridden_costs: "Chi phí ghi đè" + spent: "Đã chi" spent_on: "Ngày" cost_type: - unit: "Unit name" - unit_plural: "Pluralized unit name" + unit: "Tên đơn vị" + unit_plural: "Tên đơn vị đa năng" work_package: costs_by_type: "Spent units" - labor_costs: "Labor costs" - material_costs: "Unit costs" - overall_costs: "Overall costs" - spent_costs: "Spent costs" + labor_costs: "Chi phí nhân công" + material_costs: "Chi phí đơn vị" + overall_costs: "Tổng chi phí" + spent_costs: "Chi phí" spent_units: "Spent units" rate: - rate: "Rate" + rate: "Tỷ giá" user: - default_rates: "Default rates" + default_rates: "Tỷ lệ mặc định" models: cost_type: - other: "Cost types" - rate: "Rate" + other: "Loại chi phí" + rate: "Tỷ giá" errors: models: work_package: @@ -52,13 +52,13 @@ vi: nullify_is_not_valid_for_cost_entries: "Cost entries can not be assigned to a project." attributes: comment: "Nhận xét" - cost_type: "Cost type" - costs: "Costs" - current_rate: "Current rate" + cost_type: "Loại chi phí" + costs: "Chi phí" + current_rate: "Tỷ giá hiện tại" hours: "Giờ" units: "Units" - valid_from: "Valid from" - fixed_date: "Fixed date" + valid_from: "Có hiệu lực từ" + fixed_date: "Ngày cố định" button_add_rate: "Add rate" button_log_costs: "Log unit costs" caption_booked_on_project: "Booked on project" @@ -74,10 +74,10 @@ vi: caption_show_locked: "Show locked types" description_date_for_new_rate: "Date for new rate" group_by_others: "not in any group" - label_between: "between" + label_between: "giữa" label_cost_filter_add: "Add cost entry filter" label_costlog: "Logged unit costs" - label_cost_plural: "Costs" + label_cost_plural: "Chi phí" label_cost_type_plural: "Cost types" label_cost_type_specific: "Cost type #%{id}: %{name}" label_costs_per_page: "Costs per page" @@ -103,14 +103,14 @@ vi: label_log_costs: "Log unit costs" label_no: "Không" label_option_plural: "Tuỳ chọn" - label_overall_costs: "Overall costs" - label_rate: "Rate" + label_overall_costs: "Tổng chi phí" + label_rate: "Tỷ giá" label_rate_plural: "Rates" label_status_finished: "Finished" label_units: "Cost units" label_user: "Người dùng" label_until: "until" - label_valid_from: "Valid from" + label_valid_from: "Có hiệu lực từ" label_yes: "Có" notice_something_wrong: "Something went wrong. Please try again." notice_successful_restore: "Successful restore." diff --git a/modules/dashboards/config/locales/crowdin/js-vi.yml b/modules/dashboards/config/locales/crowdin/js-vi.yml index 4539152985..2dca7c6ac6 100644 --- a/modules/dashboards/config/locales/crowdin/js-vi.yml +++ b/modules/dashboards/config/locales/crowdin/js-vi.yml @@ -1,4 +1,4 @@ vi: js: dashboards: - label: 'Dashboard' + label: 'Bảng điều khiển' diff --git a/modules/job_status/config/locales/crowdin/js-vi.yml b/modules/job_status/config/locales/crowdin/js-vi.yml index 3a53ba0726..9bc11d5f13 100644 --- a/modules/job_status/config/locales/crowdin/js-vi.yml +++ b/modules/job_status/config/locales/crowdin/js-vi.yml @@ -1,17 +1,17 @@ vi: js: job_status: - download_starts: 'The download should start automatically.' - click_to_download: 'Or click here to download.' - title: 'Background job status' - redirect: 'You are being redirected.' + download_starts: 'Quá trình tải xuống sẽ tự động bắt đầu.' + click_to_download: 'Hoặc bấm vào đây để tải về.' + title: 'Trạng thái công việc nền' + redirect: 'Bạn đang bị chuyển hướng.' redirect_link: 'Please click here to continue.' redirect_errors: 'Due to these errors, you will not be redirected automatically.' errors: 'Some errors have occurred' generic_messages: - not_found: 'This job could not be found.' - in_queue: 'The job has been queued and will be processed shortly.' - in_process: 'The job is currently being processed.' - error: 'The job has failed to complete.' - cancelled: 'The job has been cancelled due to an error.' - success: 'The job completed successfully.' + not_found: 'Không thể tìm thấy công việc này.' + in_queue: 'Công việc đã được xếp hàng đợi và sẽ sớm được xử lý.' + in_process: 'Công việc hiện đang được xử lý.' + error: 'Không thể hoàn thành công việc.' + cancelled: 'Công việc đã bị hủy do lỗi' + success: 'Công việc đã hoàn thành thành công.' diff --git a/modules/ldap_groups/config/locales/crowdin/vi.yml b/modules/ldap_groups/config/locales/crowdin/vi.yml index 5daecc8fbc..53a448fc91 100644 --- a/modules/ldap_groups/config/locales/crowdin/vi.yml +++ b/modules/ldap_groups/config/locales/crowdin/vi.yml @@ -14,7 +14,7 @@ vi: ldap_groups: label_menu_item: 'LDAP group synchronization' label_group_key: 'LDAP group filter key' - label_synchronize: 'Synchronize' + label_synchronize: 'Đồng bộ' settings: name_attribute: 'LDAP groups name attribute' name_attribute_text: 'The LDAP attribute used for naming the OpenProject group when created by a filter' diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 2cd13328cf..79b86bea78 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -83,6 +83,6 @@ de: text_meeting_closing_are_you_sure: "Möchten Sie dieses Meeting wirklich schließen?" text_meeting_agenda_open_are_you_sure: "Es werden alle Änderungen im Protokoll überschrieben! Wollen Sie fortfahren?" text_meeting_minutes_for_meeting: 'Protokoll für die Besprechung "%{meeting}"' - text_review_meeting_agenda: "%{author} hat das %{link} zur Einsicht freigegeben." - text_review_meeting_minutes: "%{author} hat das %{link} zur Einsicht freigegeben." + text_review_meeting_agenda: "%{author} hat die %{link} zur Einsicht freigegeben." + text_review_meeting_minutes: "%{author} hat die %{link} zur Einsicht freigegeben." text_notificiation_invited: "Diese Email enthält einen ics Eintrag für die untenstehende Besprechung:" diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml index f3c17e5b5d..38d0bca266 100644 --- a/modules/meeting/config/locales/crowdin/vi.yml +++ b/modules/meeting/config/locales/crowdin/vi.yml @@ -54,7 +54,7 @@ vi: label_meeting_agenda: "Các ý chính" label_meeting_minutes: "Phút" label_meeting_close: "Đóng" - label_meeting_open: "Open" + label_meeting_open: "Mở" label_meeting_agenda_close: "Close the agenda to begin the Minutes" label_meeting_date_time: "Ngày/Giờ" label_meeting_diff: "Diff" diff --git a/modules/reporting/config/locales/crowdin/vi.yml b/modules/reporting/config/locales/crowdin/vi.yml index 8e3bd8b6a5..2abbdf8638 100644 --- a/modules/reporting/config/locales/crowdin/vi.yml +++ b/modules/reporting/config/locales/crowdin/vi.yml @@ -56,7 +56,7 @@ vi: label_rows: "Rows" label_saving: "Saving ..." label_spent_on_reporting: "Date (Spent)" - label_sum: "Sum" + label_sum: "Tổng" label_units: "Units" label_week_reporting: "Week (Spent)" label_year_reporting: "Year (Spent)" diff --git a/modules/two_factor_authentication/config/locales/crowdin/vi.yml b/modules/two_factor_authentication/config/locales/crowdin/vi.yml index 970a351de8..310a12f468 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/vi.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/vi.yml @@ -164,7 +164,7 @@ vi: label_expiration_hint: "%{date} or on logout" label_actions: 'Hành động' label_confirmed: 'Đã xác nhận' - button_continue: 'Continue' + button_continue: 'Tiếp tục' button_make_default: 'Mark as default' label_unverified_phone: "Cell phone not yet verified" notice_phone_number_format: "Please enter the number in the following format: +XX XXXXXXXX." diff --git a/modules/webhooks/config/locales/crowdin/vi.yml b/modules/webhooks/config/locales/crowdin/vi.yml index bbf69d10a1..e922325c0c 100644 --- a/modules/webhooks/config/locales/crowdin/vi.yml +++ b/modules/webhooks/config/locales/crowdin/vi.yml @@ -5,7 +5,7 @@ vi: url: 'Payload URL' secret: 'Chữ ký bí mật' events: 'Sự kiện' - projects: 'Enabled projects' + projects: 'Các dự án đã bật' webhooks/log: event_name: 'Tên sự kiện' url: 'Payload URL' @@ -48,7 +48,7 @@ vi: events: title: 'Enabled events' project_ids: - title: 'Enabled projects' + title: 'Các dự án đã bật' description: 'Select for which projects this webhook should be executed for.' all: 'All projects' selected: 'Selected projects only'